diff --git a/.github/ISSUE_TEMPLATE/issue-report.md b/.github/ISSUE_TEMPLATE/issue-report.md new file mode 100644 index 00000000000..ea0f0aa4093 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-report.md @@ -0,0 +1,62 @@ +--- +name: Issue report +about: Create a report about a bug or other issue +title: '' +labels: '' +assignees: '' + +--- + + + +#### Description of issue + + + +#### Difference between expected and actual behavior + + + +#### Steps to reproduce + + + +#### Specific information for locating + + + + +#### Length of time in which bug has been known to occur + + + + +#### Client version, Server revision & Game ID + + + + +#### Issue bingo + + +- [ ] Issue could be reproduced at least once +- [ ] Issue could be reproduced by different players +- [ ] Issue could be reproduced in multiple rounds +- [ ] Issue happened in a recent (less than 7 days ago) round +- [ ] [Couldn't find an existing issue about this](https://github.com/NebulaSS13/Nebula/issues) diff --git a/.gitignore b/.gitignore index 9d2b3ae5aa1..b7e92fbae53 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ # ignore misc BYOND files -Thumbs.db *.log *.int *.rsc @@ -21,6 +20,11 @@ atupdate config/* sql/test_db +# misc OS garbage +Thumbs.db +Thumbs.db:encryptable +.DS_Store + # vscode .vscode/* *.code-workspace diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c858b868b2..3940d892dd0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,3 +30,14 @@ This is a quick and dirty set of agreed-upon standards for contributions to the - If there's a personal dislike of the PR, post about it for discussion. Maybe have an 'on hold for discussion' label. Try to reach a consensus/compromise. Failing a compromise, a majority maintainer vote will decide. - First person to review approves the PR, second person to review can merge it. If 24 hours pass with no objections, first person can merge the PR themselves. - PRs can have a 24 hour grace period applied by maintainers if it seems important for discussion and responses to be involved. Don't merge for the grace period if applied (reviews are fine). + +### Footguns +A footgun is a pattern, function, assumption etc. that stands a strong chance to shoot you in the foot. They are documented here for ease of reference by new contributors. + +#### List footguns +- Adding lists to lists will actually perform a merge, rather than inserting the list as a new record. If you want to insert a list into a list, you need to either: + - double-wrap it, ex. `my_list += list(list("some_new_data" = 25))` + - set the index directly, ex. `my_list[my_list.len] = list("some_new_data" = 25)` +- Using variables and macros as associative list keys have some notable behavior. + - If declaring an associative list using a macro as a key, in a case where the macro does not exist (due to misspelling, etc.), that macro name will be treated as a string value for the associative list. You can guard against this by wrapping the macro in parens, ex. `list( (MY_MACRO_NAME) = "some_value" )`, which will fail to compile instead in cases where the macro doesn't exist. + - If a variable is used as the associative key, it *must* be wrapped in parens, or it will be used as a string key. \ No newline at end of file diff --git a/code/___compile_options.dm b/code/___compile_options.dm new file mode 100644 index 00000000000..a4f54bc99b9 --- /dev/null +++ b/code/___compile_options.dm @@ -0,0 +1,12 @@ +// If REFTRACK_IN_CI is defined, the reftracker will run in CI. +#define REFTRACK_IN_CI +#if defined(REFTRACK_IN_CI) && defined(UNIT_TEST) && !defined(SPACEMAN_DMM) +#define REFTRACKING_ENABLED +#define GC_FAILURE_HARD_LOOKUP +#define FIND_REF_NO_CHECK_TICK +#endif + +// parity with previous behavior where TESTING enabled reftracking +#ifdef TESTING +#define REFTRACKING_ENABLED +#endif \ No newline at end of file diff --git a/code/__defines/ZAS.dm b/code/__defines/ZAS.dm index 59466d88b53..6734ee68ffb 100644 --- a/code/__defines/ZAS.dm +++ b/code/__defines/ZAS.dm @@ -57,29 +57,25 @@ } #ifdef MULTIZAS - -var/global/list/csrfz_check = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST, NORTHUP, EASTUP, WESTUP, SOUTHUP, NORTHDOWN, EASTDOWN, WESTDOWN, SOUTHDOWN) -var/global/list/gzn_check = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) +#define ZAS_CSRFZ_CHECK global.cornerdirsz +#define ZAS_GZN_CHECK global.cardinalz #define ATMOS_CANPASS_TURF(ret, A, B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ ret = BLOCKED; \ } \ - else if (B.z != A.z) { \ - if (B.z < A.z) { \ - ret = (A.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ - } \ - else { \ - ret = (B.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ - } \ + else if (B.z < A.z) { \ + ret = (A.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ } \ - else if (A.blocks_air & ZONE_BLOCKED || B.blocks_air & ZONE_BLOCKED) { \ - ret = (A.z == B.z) ? ZONE_BLOCKED : AIR_BLOCKED; \ + else if(B.z > A.z) { \ + ret = (B.z_flags & ZM_ALLOW_ATMOS) ? ZONE_BLOCKED : BLOCKED; \ } \ - else if (A.contents.len) { \ + else if ((A.blocks_air & ZONE_BLOCKED) || (B.blocks_air & ZONE_BLOCKED)) { \ + ret = ZONE_BLOCKED; \ + } \ + else if (length(A.contents)) { \ ret = 0;\ - for (var/thing in A) { \ - var/atom/movable/AM = thing; \ + for (var/atom/movable/AM as anything in A) { \ ATMOS_CANPASS_MOVABLE(ret, AM, B); \ if (ret == BLOCKED) { \ break;\ @@ -88,8 +84,8 @@ var/global/list/gzn_check = list(NORTH, SOUTH, EAST, WEST, UP, DOWN) } #else -var/global/list/csrfz_check = list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST) -var/global/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) +#define ZAS_CSRFZ_CHECK global.cornerdirs +#define ZAS_GZN_CHECK global.cardinal #define ATMOS_CANPASS_TURF(ret, A, B) \ if (A.blocks_air & AIR_BLOCKED || B.blocks_air & AIR_BLOCKED) { \ @@ -98,7 +94,7 @@ var/global/list/gzn_check = list(NORTH, SOUTH, EAST, WEST) else if (A.blocks_air & ZONE_BLOCKED || B.blocks_air & ZONE_BLOCKED) { \ ret = ZONE_BLOCKED; \ } \ - else if (A.contents.len) { \ + else if (length(A.contents)) { \ ret = 0;\ for (var/thing in A) { \ var/atom/movable/AM = thing; \ diff --git a/code/__defines/_compile_options.dm b/code/__defines/_compile_options.dm deleted file mode 100644 index d2f61e13dca..00000000000 --- a/code/__defines/_compile_options.dm +++ /dev/null @@ -1,3 +0,0 @@ -// 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 diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 335eb97ec2a..7e207ad9f5e 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -178,7 +178,7 @@ What is the naming convention for planes or layers? #define ABOVE_LIGHTING_PLANE 4 // laser beams, etc. that shouldn't be affected by darkness #define ABOVE_LIGHTING_LAYER 1 #define BEAM_PROJECTILE_LAYER 2 - #define SUPERMATTER_WALL_LAYER 3 + #define SUBSPACE_WALL_LAYER 3 #define OBFUSCATION_LAYER 4 #define FULLSCREEN_PLANE 5 // for fullscreen overlays that do not cover the hud. diff --git a/code/__defines/ai.dm b/code/__defines/ai.dm index 2123e2e8839..03fa03fa9e8 100644 --- a/code/__defines/ai.dm +++ b/code/__defines/ai.dm @@ -6,6 +6,8 @@ #define STANCE_ATTACKING /decl/mob_controller_stance/attacking #define STANCE_TIRED /decl/mob_controller_stance/tired #define STANCE_CONTAINED /decl/mob_controller_stance/contained +#define STANCE_BUSY /decl/mob_controller_stance/busy + //basically 'do nothing' #define STANCE_COMMANDED_STOP /decl/mob_controller_stance/commanded/stop //follows a target diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm index 87bf26d7fbb..bcd23383451 100644 --- a/code/__defines/flags.dm +++ b/code/__defines/flags.dm @@ -84,7 +84,7 @@ The latter will result in a linter warning and will not work correctly. #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_CAN_TAPE BITFLAG(14) // Whether the item can 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) diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 9493ae7aa12..b14c47d5768 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -3,7 +3,7 @@ #define CHOOSE_GAMEMODE_RETRY 2 // The gamemode could not be chosen; we will use the next most popular option voted in, or the default. #define CHOOSE_GAMEMODE_REVOTE 3 // The gamemode could not be chosen; we need to have a revote. #define CHOOSE_GAMEMODE_RESTART 4 // The gamemode could not be chosen; we will restart the server. -#define CHOOSE_GAMEMODE_SILENT_REDO 5 // The gamemode could not be chosen; we request to have the the proc rerun on the next tick. +#define CHOOSE_GAMEMODE_SILENT_REDO 5 // The gamemode could not be chosen; we request to have the proc rerun on the next tick. //End game state, to manage round end. #define END_GAME_NOT_OVER 1 @@ -33,46 +33,6 @@ #define DEFAULT_TELECRYSTAL_AMOUNT 130 #define IMPLANT_TELECRYSTAL_AMOUNT(x) (round(x * 0.49)) // If this cost is ever greater than half of DEFAULT_TELECRYSTAL_AMOUNT then it is possible to buy more TC than you spend -///////////////// -////WIZARD ////// -///////////////// - -/* WIZARD SPELL FLAGS */ -#define GHOSTCAST BITFLAG(0) //can a ghost cast it? -#define NEEDSCLOTHES BITFLAG(1) //does it need the wizard garb to cast? Nonwizard spells should not have this -#define NEEDSHUMAN BITFLAG(2) //does it require the caster to be human? -#define Z2NOCAST BITFLAG(3) //if this is added, the spell can't be cast at centcomm -#define NO_SOMATIC BITFLAG(4) //spell will go off if the person is incapacitated or stunned -#define IGNOREPREV BITFLAG(5) //if set, each new target does not overlap with the previous one -//The following flags only affect different types of spell, and therefore overlap -//Targeted spells -#define INCLUDEUSER BITFLAG(6) //does the spell include the caster in its target selection? -#define SELECTABLE BITFLAG(7) //can you select each target for the spell? -#define NOFACTION BITFLAG(8) //Don't do the same as our faction -#define NONONFACTION BITFLAG(9) //Don't do people other than our faction -//AOE spells -#define IGNOREDENSE BITFLAG(10) //are dense turfs ignored in selection? -#define IGNORESPACE BITFLAG(11) //are space turfs ignored in selection? -//End split flags -#define CONSTRUCT_CHECK BITFLAG(12) //used by construct spells - checks for nullrods -#define NO_BUTTON BITFLAG(13) //spell won't show up in the HUD with this - -//invocation -#define SpI_SHOUT "shout" -#define SpI_WHISPER "whisper" -#define SpI_EMOTE "emote" -#define SpI_NONE "none" - -//upgrading -#define Sp_SPEED "speed" -#define Sp_POWER "power" -#define Sp_TOTAL "total" - -//casting costs -#define Sp_RECHARGE "recharge" -#define Sp_CHARGES "charges" -#define Sp_HOLDVAR "holdervar" - //Voting-related #define VOTE_PROCESS_ABORT 1 #define VOTE_PROCESS_COMPLETE 2 diff --git a/code/__defines/hud.dm b/code/__defines/hud.dm index 24e3be0d394..7cb67e0fd28 100644 --- a/code/__defines/hud.dm +++ b/code/__defines/hud.dm @@ -11,7 +11,6 @@ #define UI_ICON_NUTRITION "icon_nutrition" #define UI_ICON_HYDRATION "icon_hydration" #define UI_ICON_FIRE_INTENT "icon_fire_intent" -#define UI_ICON_INTENT "icon_intent" #define UI_ICON_UP_HINT "icon_uphint" #define UI_ICON_STATUS "icon_status" #define UI_ICON_STATUS_FIRE "icon_status_fire" diff --git a/code/__defines/intent.dm b/code/__defines/intent.dm new file mode 100644 index 00000000000..2fa914a8b4c --- /dev/null +++ b/code/__defines/intent.dm @@ -0,0 +1,11 @@ +// Intent bitflags for use in check_intent() +#define I_FLAG_HELP BITFLAG(0) +#define I_FLAG_DISARM BITFLAG(1) +#define I_FLAG_GRAB BITFLAG(2) +#define I_FLAG_HARM BITFLAG(3) +#define I_FLAG_ALL (I_FLAG_HELP|I_FLAG_DISARM|I_FLAG_GRAB|I_FLAG_HARM) + +//NOTE: INTENT_HOTKEY_* defines are not actual intents! +//they are here to support hotkeys +#define INTENT_HOTKEY_LEFT "left" +#define INTENT_HOTKEY_RIGHT "right" diff --git a/code/__defines/inventory_sizes.dm b/code/__defines/inventory_sizes.dm index 39842fd9099..0432f304bd8 100644 --- a/code/__defines/inventory_sizes.dm +++ b/code/__defines/inventory_sizes.dm @@ -16,16 +16,17 @@ 20 - things that take up an entire turf, like wall girders or door assemblies */ -#define ITEM_SIZE_TINY 1 -#define ITEM_SIZE_SMALL 2 -#define ITEM_SIZE_NORMAL 3 -#define ITEM_SIZE_LARGE 4 -#define ITEM_SIZE_HUGE 5 -#define ITEM_SIZE_GARGANTUAN 6 -#define ITEM_SIZE_STRUCTURE 20 +#define ITEM_SIZE_TINY 1 +#define ITEM_SIZE_SMALL 2 +#define ITEM_SIZE_NORMAL 3 +#define ITEM_SIZE_LARGE 4 +#define ITEM_SIZE_HUGE 5 +#define ITEM_SIZE_GARGANTUAN 6 +#define ITEM_SIZE_STRUCTURE 20 +#define ITEM_SIZE_LARGE_STRUCTURE 30 -#define ITEM_SIZE_MIN ITEM_SIZE_TINY -#define ITEM_SIZE_MAX ITEM_SIZE_STRUCTURE +#define ITEM_SIZE_MIN ITEM_SIZE_TINY +#define ITEM_SIZE_MAX ITEM_SIZE_LARGE_STRUCTURE #define BASE_STORAGE_COST(w_class) (2**(w_class-1)) //1,2,4,8,16,... diff --git a/code/__defines/item_effects.dm b/code/__defines/item_effects.dm new file mode 100644 index 00000000000..d5c79b402f9 --- /dev/null +++ b/code/__defines/item_effects.dm @@ -0,0 +1,15 @@ +// Identifiers for various categories of item effects. +#define IE_CAT_DAMAGE "weff_damage" +#define IE_CAT_STRIKE "weff_strike" +#define IE_CAT_PARRY "weff_parry" +#define IE_CAT_USED "weff_used" +#define IE_CAT_WIELDED "weff_wield" +#define IE_CAT_VISUAL "weff_visual" +#define IE_CAT_LISTENER "weff_listener" +#define IE_CAT_EXAMINE "weff_visible" +#define IE_CAT_RANGED "weff_ranged" +#define IE_CAT_PROCESS "weff_process" + +// Identifiers for parameters for item effects. +#define IE_PAR_USES "uses" +#define IE_PAR_MAX_USES "max_uses" diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index 25f2ed8c213..d6591b17acf 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -72,7 +72,6 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define STAGE_THREE 5 #define STAGE_FOUR 7 #define STAGE_FIVE 9 -#define STAGE_SUPER 11 // NanoUI flags #define STATUS_INTERACTIVE 2 // GREEN Visability @@ -103,21 +102,6 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define ATMOS_DEFAULT_VOLUME_MIXER 500 // L. #define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. -// These are used by supermatter and supermatter monitor program, mostly for UI updating purposes. Higher should always be worse! -#define SUPERMATTER_ERROR -1 // Unknown status, shouldn't happen but just in case. -#define SUPERMATTER_INACTIVE 0 // No or minimal energy -#define SUPERMATTER_NORMAL 1 // Normal operation -#define SUPERMATTER_NOTIFY 2 // Ambient temp > 80% of CRITICAL_TEMPERATURE -#define SUPERMATTER_WARNING 3 // Ambient temp > CRITICAL_TEMPERATURE OR integrity damaged -#define SUPERMATTER_DANGER 4 // Integrity < 50% -#define SUPERMATTER_EMERGENCY 5 // Integrity < 25% -#define SUPERMATTER_DELAMINATING 6 // Pretty obvious. - -#define SUPERMATTER_DATA_EER "Relative EER" -#define SUPERMATTER_DATA_TEMPERATURE "Temperature" -#define SUPERMATTER_DATA_PRESSURE "Pressure" -#define SUPERMATTER_DATA_EPR "Chamber EPR" - // Scrubber modes #define SCRUBBER_SIPHON "siphon" #define SCRUBBER_SCRUB "scrub" diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index c6fd3d2e466..55fbbecd14d 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -270,11 +270,6 @@ /// Returns the hex value of a number given a value assumed to be a base-ten value, padded to a supplied minimum length. #define num2hex_padded(num, len) num2text(num, len, 16) -//NOTE: INTENT_HOTKEY_* defines are not actual intents! -//they are here to support hotkeys -#define INTENT_HOTKEY_LEFT "left" -#define INTENT_HOTKEY_RIGHT "right" - //Turf/area values for 'this space is outside' checks #define OUTSIDE_AREA null #define OUTSIDE_NO FALSE @@ -375,3 +370,11 @@ #define RADIAL_LABELS_NONE 0 #define RADIAL_LABELS_OFFSET 1 #define RADIAL_LABELS_CENTERED 2 + +#define CRAYON_DRAW_RUNE "rune" +#define CRAYON_DRAW_GRAFFITI "graffiti" +#define CRAYON_DRAW_LETTER "letter" +#define CRAYON_DRAW_ARROW "arrow" + +// Default UI style applied to client prefs. +#define DEFAULT_UI_STYLE /decl/ui_style/midnight diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index ca00ffc65a7..022c6011a7a 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -34,12 +34,6 @@ #define GETPULSE_TOOL 1 // More accurate. (med scanner, sleeper, etc.) #define PULSE_MAX_BPM 250 // Highest, readable BPM by machines and humans. -//intent flags -#define I_HELP "help" -#define I_DISARM "disarm" -#define I_GRAB "grab" -#define I_HURT "harm" - //These are used Bump() code for living mobs, in the mob_bump_flag, mob_swap_flags, and mob_push_flags vars to determine whom can bump/swap with whom. #define HUMAN 1 #define MONKEY 2 @@ -233,6 +227,7 @@ #define DATA_INGREDIENT_FLAGS /decl/reagent_data_field/ingredient_flags #define DATA_MASK_COLOR /decl/reagent_data_field/mask_color #define DATA_MASK_NAME /decl/reagent_data_field/mask_name +#define DATA_EXTRA_COLOR /decl/reagent_data_field/extra_color // Milk and chees data flags #define DATA_MILK_DONOR /decl/reagent_data_field/milk_donor diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm index 48a9f0e0973..1d2654f16d2 100644 --- a/code/__defines/qdel.dm +++ b/code/__defines/qdel.dm @@ -5,8 +5,8 @@ #define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. #define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. #define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. -#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. - //if TESTING is enabled, qdel will call this object's find_references() verb. +#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if REFTRACKING_ENABLED is not enabled in _compiler_options.dm. + //if REFTRACKING_ENABLED is enabled, qdel will call this object's find_references() verb. #define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails. //defines for the gc_destroyed var @@ -15,21 +15,31 @@ #define GC_QUEUE_HARDDELETE 3 #define GC_QUEUE_COUNT 3 //increase this when adding more steps. -#define GC_QUEUED_FOR_HARD_DEL -1 -#define GC_CURRENTLY_BEING_QDELETED -2 +// Defines for the ssgarbage queue items +#define GC_QUEUE_ITEM_QUEUE_TIME 1 //! Time this item entered the queue +#define GC_QUEUE_ITEM_REF 2 //! Ref to the item +#define GC_QUEUE_ITEM_GCD_DESTROYED 3 //! Item's gc_destroyed var value. Used to detect ref reuse. +#define GC_QUEUE_ITEM_INDEX_COUNT 3 //! Number of item indexes, used for allocating the nested lists. Don't forget to increase this if you add a new queue item index + +// Defines for the time an item has to get its reference cleaned before it fails the queue and moves to the next. +#define GC_FILTER_QUEUE (1 SECONDS) +#define GC_CHECK_QUEUE (5 MINUTES) +#define GC_DEL_QUEUE (10 SECONDS) + +#define GC_CURRENTLY_BEING_QDELETED -1 #define QDELING(X) (X.gc_destroyed) #define QDELETED(X) (isnull(X) || QDELING(X)) #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, 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_IN(item, time) if(!isnull(item)) {addtimer(CALLBACK(item, TYPE_PROC_REF(/datum, qdel_self)), time)} +#define QDEL_IN_CLIENT_TIME(item, time) if(!isnull(item)) {addtimer(CALLBACK(item, TYPE_PROC_REF(/datum, qdel_self)), time, 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, GLOBAL_PROC_REF(______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) #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/reagent_data_fields.dm b/code/__defines/reagent_data_fields.dm index 5199292ab35..0caef07d225 100644 --- a/code/__defines/reagent_data_fields.dm +++ b/code/__defines/reagent_data_fields.dm @@ -17,6 +17,10 @@ /decl/reagent_data_field/mask_color uid = "rdf_mask_color" +/// An extra colour used for things like additional reagent overlays on soups, so that you can have noodle soup with veggie bits a different colour than the main soup. +/decl/reagent_data_field/extra_color + uid = "rdf_extra_color" + /decl/reagent_data_field/mask_name uid = "rdf_mask_name" diff --git a/code/__defines/research.dm b/code/__defines/research.dm index 2fb5ac649e4..3898d8dc295 100644 --- a/code/__defines/research.dm +++ b/code/__defines/research.dm @@ -19,7 +19,8 @@ #define HOLLOW_OBJECT_MATTER_MULTIPLIER 0.05 #define BASE_OBJECT_MATTER_MULTPLIER 0.25 -#define GENERIC_SMELTING_HEAT_POINT 1350 CELSIUS +#define LOW_SMELTING_HEAT_POINT 1150 CELSIUS // Reachable with coal in a kiln on the medieval maps. +#define GENERIC_SMELTING_HEAT_POINT 1350 CELSIUS // Reachable with coal and a bellows in a kiln on medieval maps. #define HIGH_SMELTING_HEAT_POINT 4000 CELSIUS // must be at least 4074K (3800 C) to melt graphite #define TECH_MATERIAL "materials" diff --git a/code/__defines/species.dm b/code/__defines/species.dm index 0ff09486031..791e81cd17d 100644 --- a/code/__defines/species.dm +++ b/code/__defines/species.dm @@ -8,6 +8,7 @@ #define SPECIES_FLAG_NO_BLOCK BITFLAG(6) // Unable to block or defend itself from attackers. #define SPECIES_FLAG_NEED_DIRECT_ABSORB BITFLAG(7) // This species can only have their DNA taken by direct absorption. #define SPECIES_FLAG_LOW_GRAV_ADAPTED BITFLAG(8) // This species is used to lower than standard gravity, affecting stamina in high-grav +#define SPECIES_FLAG_ABSORB_ELECTRICITY BITFLAG(9) // This species can absorb electricity; snowflake flag for old slime people. // Species spawn flags #define SPECIES_IS_WHITELISTED BITFLAG(0) // Must be whitelisted to play. diff --git a/code/__defines/structures.dm b/code/__defines/structures.dm index f91ed7aed08..39849cecebc 100644 --- a/code/__defines/structures.dm +++ b/code/__defines/structures.dm @@ -1 +1,4 @@ -#define STRUCTURE_FLAG_SURFACE BITFLAG(0) \ No newline at end of file +// Structure counts as a surface for the purposes of placing items on. +#define STRUCTURE_FLAG_SURFACE BITFLAG(0) +// Structure takes damage from thrown objects colliding with it. +#define STRUCTURE_FLAG_THROWN_DAMAGE BITFLAG(1) \ No newline at end of file diff --git a/code/__defines/subsystem-priority.dm b/code/__defines/subsystem-priority.dm index fc69009e88b..cd44840622a 100644 --- a/code/__defines/subsystem-priority.dm +++ b/code/__defines/subsystem-priority.dm @@ -39,6 +39,7 @@ #define SS_PRIORITY_GHOST_IMAGES 10 // Updates ghost client images. #define SS_PRIORITY_ZCOPY 10 // Builds appearances for Z-Mimic. #define SS_PRIORITY_PROJECTILES 10 // Projectile processing! +#define SS_PRIORITY_PATHFINDING 10 // Processing pathfinding requests // SS_BACKGROUND #define SS_PRIORITY_OBJECTS 100 // processing_objects processing. diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index c9880741fa9..13861c4d9f5 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -1,7 +1,6 @@ #define INITIALIZATION_INSSATOMS 0 //New should not call Initialize -#define INITIALIZATION_INSSATOMS_LATE 1 //New should not call Initialize; after the first pass is complete (handled differently) -#define INITIALIZATION_INNEW_MAPLOAD 2 //New should call Initialize(TRUE) -#define INITIALIZATION_INNEW_REGULAR 3 //New should call Initialize(FALSE) +#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) +#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) #define INITIALIZE_HINT_NORMAL 0 //Nothing happens #define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize diff --git a/code/__defines/topic.dm b/code/__defines/topic.dm index 74e2ca005f0..219abf3728e 100644 --- a/code/__defines/topic.dm +++ b/code/__defines/topic.dm @@ -2,6 +2,8 @@ #define TOPIC_HANDLED BITFLAG(0) #define TOPIC_REFRESH BITFLAG(1) #define TOPIC_UPDATE_PREVIEW BITFLAG(2) - // use to force a browse() call, unblocking some rsc operations +/// Return this to force a browse() call, unblocking some rsc operations #define TOPIC_HARD_REFRESH BITFLAG(3) +/// Return this to indicate the window associated with this Topic() call should be closed. +#define TOPIC_CLOSE BITFLAG(4) #define TOPIC_REFRESH_UPDATE_PREVIEW (TOPIC_HARD_REFRESH|TOPIC_UPDATE_PREVIEW) diff --git a/code/__globals.dm b/code/__globals.dm index 12434ad8011..7c9e5ed5dbe 100644 --- a/code/__globals.dm +++ b/code/__globals.dm @@ -1,15 +1,15 @@ // Defined here due to being used immediately below. #define GET_DECL(D) (ispath(D, /decl) ? (decls_repository.fetched_decls[D] || decls_repository.get_decl(D)) : null) +#define IMPLIED_DECL GET_DECL(__IMPLIED_TYPE__) // Defined here due to compile order; overrides in macros make the compiler complain. /decl/global_vars var/static/list/protected_vars = list("protected_vars") // No editing the protected list! +/decl/global_vars/Initialize() + . = ..() + mark_protected_vars() /decl/global_vars/proc/mark_protected_vars() return -/hook/startup/proc/mark_protected_vars() - var/decl/global_vars/global_vars = GET_DECL(/decl/global_vars) - global_vars.mark_protected_vars() - return TRUE #define GLOBAL_GETTER(NAME, TYPE, VAL) \ var/global##TYPE/##NAME; \ diff --git a/code/_global_vars/lists/flavor.dm b/code/_global_vars/lists/flavor.dm index ccf00b40b7e..b2096edc0a4 100644 --- a/code/_global_vars/lists/flavor.dm +++ b/code/_global_vars/lists/flavor.dm @@ -115,15 +115,13 @@ GLOBAL_GETTER(cable_colors, /list, SetupCableColors()) /proc/SetupCableColors() . = list() - var/list/valid_cable_coils = typesof(/obj/item/stack/cable_coil) - for(var/ctype in list( + var/list/valid_cable_coils = typesof(/obj/item/stack/cable_coil) - typesof( /obj/item/stack/cable_coil/single, /obj/item/stack/cable_coil/cut, /obj/item/stack/cable_coil/cyborg, /obj/item/stack/cable_coil/fabricator, /obj/item/stack/cable_coil/random - )) - valid_cable_coils -= typesof(ctype) + ) var/special_name_mappings = list(/obj/item/stack/cable_coil = "Red") for(var/coil_type in valid_cable_coils) @@ -132,6 +130,6 @@ GLOBAL_GETTER(cable_colors, /list, SetupCableColors()) var/obj/item/stack/cable_coil/C = coil_type if(!initial(C.can_have_color)) continue - var/color = initial(C.color) + var/color = initial(C.paint_color) || initial(C.color) .[name] = color . = sortTim(., /proc/cmp_text_asc) diff --git a/code/_global_vars/lists/jewellery.dm b/code/_global_vars/lists/jewellery.dm new file mode 100644 index 00000000000..7364bff8b60 --- /dev/null +++ b/code/_global_vars/lists/jewellery.dm @@ -0,0 +1,23 @@ +var/global/list/random_jewellery_material_types = list( + /decl/material/solid/metal/gold, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/copper, + /decl/material/solid/metal/platinum, + /decl/material/solid/metal/steel, + /decl/material/solid/organic/bone, + /decl/material/solid/organic/wood +) +var/global/list/random_jewellery_gem_types = list( + /obj/item/gemstone/baguette/topaz, + /obj/item/gemstone/baguette/sapphire, + /obj/item/gemstone/baguette/ruby, + /obj/item/gemstone/hexagon/topaz, + /obj/item/gemstone/hexagon/sapphire, + /obj/item/gemstone/hexagon/ruby, + /obj/item/gemstone/octagon/topaz, + /obj/item/gemstone/octagon/sapphire, + /obj/item/gemstone/octagon/ruby, + /obj/item/gemstone/round/topaz, + /obj/item/gemstone/round/sapphire, + /obj/item/gemstone/round/ruby +) diff --git a/code/_helpers/animations.dm b/code/_helpers/animations.dm index b6fcccda02d..be0d2188f5a 100644 --- a/code/_helpers/animations.dm +++ b/code/_helpers/animations.dm @@ -81,22 +81,11 @@ var/segment = 360/segments if(!clockwise) segment = -segment - var/list/matrices = list() - for(var/i in 1 to segments-1) - var/matrix/M = matrix(transform) - M.Turn(segment*i) - matrices += M - var/matrix/last = matrix(transform) - matrices += last - speed /= segments - if(parallel) - animate(src, transform = matrices[1], time = speed, loops , flags = ANIMATION_PARALLEL) - else - animate(src, transform = matrices[1], time = speed, loops) + animate(src, transform = matrix().Turn(segment), time = speed, loops, flags = parallel ? (ANIMATION_PARALLEL | ANIMATION_RELATIVE) : ANIMATION_RELATIVE) for(var/i in 2 to segments) //2 because 1 is covered above - animate(transform = matrices[i], time = speed) + animate(transform = matrix().Turn(segment), time = speed, loops, flags = ANIMATION_RELATIVE) //doesn't have an object argument because this is "Stacking" with the animate call above //3 billion% intentional diff --git a/code/_helpers/cmp.dm b/code/_helpers/cmp.dm index e84ecc341fc..3a04928449e 100644 --- a/code/_helpers/cmp.dm +++ b/code/_helpers/cmp.dm @@ -137,6 +137,9 @@ /proc/cmp_decl_uid_asc(decl/a, decl/b) return sorttext(b.uid, a.uid) +/proc/cmp_decl_sort_value_asc(decl/a, decl/b) + return a.sort_order - b.sort_order + /proc/cmp_inventory_slot_desc(datum/inventory_slot/a, datum/inventory_slot/b) return b.quick_equip_priority - a.quick_equip_priority @@ -154,4 +157,7 @@ if(a == prerequisite) return -1 // goes after return cmp_skill_asc(a, GET_DECL(b.prerequisites[1])) - return cmp_name_or_type_asc(a, b) \ No newline at end of file + return cmp_name_or_type_asc(a, b) + +/proc/cmp_priority_list(list/A, list/B) + return A["priority"] - B["priority"] diff --git a/code/_helpers/emissive.dm b/code/_helpers/emissive.dm index 4ea0ca7e7cf..98cde2aadb3 100644 --- a/code/_helpers/emissive.dm +++ b/code/_helpers/emissive.dm @@ -1,5 +1,6 @@ -/proc/emissive_overlay(var/icon, var/icon_state, var/loc, var/dir, var/color) +/proc/emissive_overlay(icon, icon_state, loc, dir, color, flags) var/image/I = image(icon, loc, icon_state, EMISSIVE_LAYER, dir) I.plane = EMISSIVE_PLANE I.color = color + I.appearance_flags |= flags return I diff --git a/code/_helpers/files.dm b/code/_helpers/files.dm index b665a162e7b..c6d4b7ea49f 100644 --- a/code/_helpers/files.dm +++ b/code/_helpers/files.dm @@ -1,7 +1,7 @@ //Sends resource files to client cache /client/proc/getFiles() for(var/file in args) - direct_output(src, browse_rsc(file)) + send_rsc(src, file, null) /client/proc/browse_files(root="data/logs/", max_iterations=10, list/valid_extensions=list(".txt",".log",".htm")) var/path = root diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 2f5d2eb8e35..57710a15858 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -288,6 +288,11 @@ src.dest_y = dest_y /proc/MixColors(const/list/colors) + switch(length(colors)) + if(1) + return colors[1] + if(2) + return BlendRGBasHSV(colors[1], colors[2], 0.5) var/list/reds = list() var/list/blues = list() var/list/greens = list() diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index f3379f84c52..7b98b5f58af 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -62,7 +62,7 @@ var/global/list/string_slot_flags = list( . = new /mob/living/human/dummy/mannequin() mannequins_[ckey] = . -/hook/global_init/proc/makeDatumRefLists() +/proc/makeDatumRefLists() // Keybindings for(var/KB in subtypesof(/datum/keybinding)) var/datum/keybinding/keybinding = KB @@ -107,4 +107,13 @@ var/global/list/bodytype_species_pairs = list() // A list of bodytypes -> specie . = global.playable_species /proc/get_bodytype_species_pairs() build_species_lists() - . = global.bodytype_species_pairs \ No newline at end of file + . = global.bodytype_species_pairs + +// Used to avoid constantly generating new lists during movement. +var/global/list/all_stance_limbs = list( + ORGAN_CATEGORY_STANCE, + ORGAN_CATEGORY_STANCE_ROOT +) +var/global/list/child_stance_limbs = list( + ORGAN_CATEGORY_STANCE +) diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index 5c78a7dd62f..ee74c5f11ef 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -163,7 +163,7 @@ mob // Send the icon to src's local cache send_rsc(src, getFlatIcon(src), iconName) // Display the icon in their browser - direct_output(src, browse("

")) + show_browser(src, "

") Output_Icon() set name = "2. Output Icon" diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index b8cf7af8f12..5c1744b0178 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -26,7 +26,7 @@ var/global/log_end= world.system_type == UNIX ? ascii2text(13) : "" to_world_log("## TESTING: [msg][log_end]") /proc/game_log(category, text) - direct_output(diary, "\[[time_stamp()]] [game_id] [category]: [text][log_end]") + to_file(diary, "\[[time_stamp()]] [game_id] [category]: [text][log_end]") /proc/log_admin(text) global.admin_log.Add(text) diff --git a/code/_helpers/medical_scans.dm b/code/_helpers/medical_scans.dm index 44979e17fb0..99468c41c8c 100644 --- a/code/_helpers/medical_scans.dm +++ b/code/_helpers/medical_scans.dm @@ -1,72 +1,66 @@ -/mob/living/human/proc/get_raw_medical_data(var/tag = FALSE) - var/mob/living/human/H = src - var/list/scan = list() - - scan["name"] = H.name - scan["time"] = stationtime2text() +/mob/living/proc/get_raw_medical_data(var/tag = FALSE) + . = list() + .["name"] = name + .["time"] = stationtime2text() var/brain_result - if(H.should_have_organ(BP_BRAIN)) - var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(H, BP_BRAIN) - if(!brain || H.stat == DEAD || (H.status_flags & FAKEDEATH)) + if(should_have_organ(BP_BRAIN)) + var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(src, BP_BRAIN) + if(!brain || stat == DEAD || (status_flags & FAKEDEATH)) brain_result = 0 - else if(H.stat != DEAD) + else if(stat != DEAD) brain_result = round(max(0,(1 - brain.damage/brain.max_damage)*100)) else brain_result = -1 - scan["brain_activity"] = brain_result + .["brain_activity"] = brain_result var/pulse_result - if(H.should_have_organ(BP_HEART)) - var/obj/item/organ/internal/heart/heart = H.get_organ(BP_HEART, /obj/item/organ/internal/heart) + if(should_have_organ(BP_HEART)) + var/obj/item/organ/internal/heart/heart = get_organ(BP_HEART, /obj/item/organ/internal/heart) if(!heart) pulse_result = 0 else if(BP_IS_PROSTHETIC(heart)) pulse_result = -2 - else if(H.status_flags & FAKEDEATH) + else if(status_flags & FAKEDEATH) pulse_result = 0 else - pulse_result = H.get_pulse_as_string(GETPULSE_TOOL) + pulse_result = get_pulse_as_string(GETPULSE_TOOL) else pulse_result = -1 if(pulse_result == ">250") pulse_result = -3 - scan["pulse"] = text2num(pulse_result) - - scan["blood_pressure"] = H.get_blood_pressure() - scan["blood_o2"] = H.get_blood_oxygenation() - scan["blood_volume"] = H.vessel.total_volume - scan["blood_volume_max"] = H.vessel.maximum_volume - scan["temperature"] = H.bodytemperature - scan["trauma"] = H.get_damage(BRUTE) - scan["burn"] = H.get_damage(BURN) - scan["toxin"] = H.get_damage(TOX) - scan["oxygen"] = H.get_damage(OXY) - scan["radiation"] = H.radiation - scan["genetic"] = H.get_damage(CLONE) - scan["paralysis"] = GET_STATUS(H, STAT_PARA) - scan["immune_system"] = H.get_immunity() - scan["reagents"] = list() - - if(H.reagents?.total_volume) - for(var/liquid_type in H.reagents.liquid_volumes) + .["pulse"] = text2num(pulse_result) + + .["temperature"] = bodytemperature + .["trauma"] = get_damage(BRUTE) + .["burn"] = get_damage(BURN) + .["toxin"] = get_damage(TOX) + .["oxygen"] = get_damage(OXY) + .["radiation"] = radiation + .["genetic"] = get_damage(CLONE) + .["paralysis"] = GET_STATUS(src, STAT_PARA) + .["immune_system"] = get_immunity() + .["reagents"] = list() + + if(reagents?.total_volume) + for(var/liquid_type in reagents.liquid_volumes) var/decl/material/R = GET_DECL(liquid_type) var/list/reagent = list() - reagent["name"]= R.get_reagent_name(H.reagents, MAT_PHASE_LIQUID) - reagent["quantity"] = round(REAGENT_VOLUME(H.reagents, R.type),1) + reagent["name"]= R.get_reagent_name(reagents, MAT_PHASE_LIQUID) + reagent["quantity"] = round(REAGENT_VOLUME(reagents, R.type),1) reagent["scannable"] = R.scannable - scan["reagents"] += list(reagent) + .["reagents"] += list(reagent) - for(var/solid_type in H.reagents.solid_volumes) + for(var/solid_type in reagents.solid_volumes) var/decl/material/R = GET_DECL(solid_type) var/list/reagent = list() - reagent["name"]= R.get_reagent_name(H.reagents, MAT_PHASE_SOLID) - reagent["quantity"] = round(REAGENT_VOLUME(H.reagents, R.type),1) + reagent["name"]= R.get_reagent_name(reagents, MAT_PHASE_SOLID) + reagent["quantity"] = round(REAGENT_VOLUME(reagents, R.type),1) reagent["scannable"] = R.scannable - scan["reagents"] += list(reagent) + .["reagents"] += list(reagent) - scan["external_organs"] = list() - for(var/obj/item/organ/external/E in H.get_external_organs()) + .["external_organs"] = list() + for(var/obj/item/organ/external/E in get_external_organs()) var/list/O = list() O["name"] = E.name O["brute_ratio"] = E.brute_ratio @@ -77,10 +71,10 @@ O["scan_results"] = E.get_scan_results(tag) O["tumors"] = E.has_growths() O["ailments"] = E.has_diagnosable_ailments(scanner = TRUE) - scan["external_organs"] += list(O) + .["external_organs"] += list(O) - scan["internal_organs"] = list() - var/list/internal_organs = H.get_internal_organs() + .["internal_organs"] = list() + var/list/internal_organs = get_internal_organs() for(var/obj/item/organ/internal/I in internal_organs) var/list/O = list() O["name"] = I.name @@ -89,18 +83,25 @@ O["is_damaged"] = I.damage > 0 O["scan_results"] = I.get_scan_results(tag) O["ailments"] = I.has_diagnosable_ailments(scanner = TRUE) - scan["internal_organs"] += list(O) + .["internal_organs"] += list(O) - scan["missing_organs"] = list() + .["missing_organs"] = list() var/decl/bodytype/root_bodytype = get_bodytype() for(var/organ_name in root_bodytype.has_organ) - if(!GET_INTERNAL_ORGAN(H, organ_name)) - scan["missing_organs"] += organ_name - if(H.has_genetic_condition(GENE_COND_BLINDED)) - scan["blind"] = TRUE - if(H.has_genetic_condition(GENE_COND_NEARSIGHTED)) - scan["nearsight"] = TRUE - return scan + if(!GET_INTERNAL_ORGAN(src, organ_name)) + .["missing_organs"] += organ_name + if(has_genetic_condition(GENE_COND_BLINDED)) + .["blind"] = TRUE + if(has_genetic_condition(GENE_COND_NEARSIGHTED)) + .["nearsight"] = TRUE + +/mob/living/human/get_raw_medical_data(var/tag = FALSE) + . = ..() + .["blood_pressure"] = get_blood_pressure() + .["blood_o2"] = get_blood_oxygenation() + if(vessel) + .["blood_volume"] = vessel.total_volume + .["blood_volume_max"] = vessel.maximum_volume /proc/display_medical_data_header(var/list/scan, skill_level = SKILL_DEFAULT) //In case of problems, abort. diff --git a/code/_helpers/profiling.dm b/code/_helpers/profiling.dm index ad16a2c2d27..0c478556836 100644 --- a/code/_helpers/profiling.dm +++ b/code/_helpers/profiling.dm @@ -71,7 +71,7 @@ lines += "[entry] => [num2text(data[STAT_ENTRY_TIME], 10)]ms ([data[STAT_ENTRY_COUNT]]) (avg:[num2text(data[STAT_ENTRY_TIME]/(data[STAT_ENTRY_COUNT] || 1), 99)])" if (user) - direct_output(user, browse("
  1. [lines.Join("
  2. ")]
", "window=[url_encode("stats:[ref(stats)]")]")) + show_browser(user, "
  1. [lines.Join("
  2. ")]
", "window=[url_encode("stats:[ref(stats)]")]") . = lines.Join("\n") diff --git a/code/_helpers/sorts/__main.dm b/code/_helpers/sorts/__main.dm index 09bb861f647..391630171eb 100644 --- a/code/_helpers/sorts/__main.dm +++ b/code/_helpers/sorts/__main.dm @@ -169,7 +169,7 @@ reverse a descending sequence without violating stability. var/r = 0 //becomes 1 if any bits are shifted off while(n >= MIN_MERGE) r |= (n & 1) - n >>= 1 + n = BITSHIFT_RIGHT(n, 1) return n + r //Examines the stack of runs waiting to be merged and merges adjacent runs until the stack invariants are reestablished: diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index eea2b9b3833..90210911f1e 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -72,9 +72,34 @@ var/global/next_duration_update = 0 var/global/last_round_duration = 0 var/global/round_start_time = 0 -/hook/roundstart/proc/start_timer() - round_start_time = world.time - return 1 +/proc/ticks2shortreadable(tick_time, separator = ":") + var/hours = round(tick_time / (1 HOUR)) + var/minutes = round((tick_time % (1 HOUR)) / (1 MINUTE)) + var/seconds = round((tick_time % (1 MINUTE)) / (1 SECOND)) + var/out = list() + + if(hours > 0) + out += "[hours]" + + if(minutes > 0) + if(minutes < 10 && hours > 0) + out += "0[minutes]" + else + out += "[minutes]" + else if(hours > 0) + out += "00" + + if(seconds > 0) + if(seconds < 10 && (minutes > 0 || hours > 0)) + out += "0[seconds]" + else + out += "[seconds]" + else if(minutes > 0 || hours > 0) + out += "00" + + if(length(out)) + return jointext(out, separator) + return null /proc/ticks2readable(tick_time) var/hours = round(tick_time / (1 HOUR)) @@ -89,7 +114,7 @@ var/global/round_start_time = 0 out += "[seconds] second\s" if(length(out)) return english_list(out) - return null + return "less than a second" /proc/roundduration2text() if(!round_start_time) @@ -109,10 +134,6 @@ var/global/round_start_time = 0 next_duration_update = world.time + 1 MINUTES return last_round_duration -/hook/startup/proc/set_roundstart_hour() - roundstart_hour = rand(0, 23) - return TRUE - var/global/midnight_rollovers = 0 var/global/rollovercheck_last_timeofday = 0 /proc/update_midnight_rollover() diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 657d9e50035..88f8f402528 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -169,8 +169,10 @@ Turf and target are seperate in case you want to teleport some distance from a t return 1 return 0 +#if DM_VERSION < 516 /proc/sign(x) return x!=0?x/abs(x):0 +#endif /proc/getline(atom/M,atom/N)//Ultra-Fast Bresenham Line-Drawing Algorithm var/px=M.x //starting x @@ -690,23 +692,17 @@ Turf and target are seperate in case you want to teleport some distance from a t return zone_to_descriptor_mapping[zone] || zone //Whether or not the given item counts as sharp in terms of dealing damage -/proc/is_sharp(obj/O) - if (!O) return 0 - if (O.sharp) return 1 - if (O.edge) return 1 - return 0 +/obj/proc/is_sharp() + return FALSE //Whether or not the given item counts as cutting with an edge in terms of removing limbs -/proc/has_edge(obj/O) - if (!O) return 0 - if (O.edge) return 1 - return 0 - +/obj/proc/has_edge() + return FALSE //For items that can puncture e.g. thick plastic but aren't necessarily sharp //Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape. /obj/item/proc/can_puncture() - return sharp + return is_sharp() /obj/item/screwdriver/can_puncture() return 1 @@ -717,11 +713,8 @@ Turf and target are seperate in case you want to teleport some distance from a t /obj/item/weldingtool/can_puncture() return 1 -/obj/item/screwdriver/can_puncture() - return 1 - /obj/item/clothing/mask/smokable/cigarette/can_puncture() - return src.lit + return ..() || lit // in case someone has a sharp cigarette for some reason /* Checks if that loc and dir has a item on the wall diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm index deb7162f196..10e485e1854 100644 --- a/code/_helpers/visual_filters.dm +++ b/code/_helpers/visual_filters.dm @@ -5,9 +5,6 @@ /atom/movable var/list/filter_data // For handling persistent filters -/proc/cmp_filter_data_priority(list/A, list/B) - return A["priority"] - B["priority"] - // Defining this for future proofing and ease of searching for erroneous usage. /image/proc/add_filter(filter_name, priority, list/params) filters += filter(arglist(params)) @@ -35,7 +32,7 @@ /atom/movable/proc/update_filters() filters = null - filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) + filter_data = sortTim(filter_data, /proc/cmp_priority_list, TRUE) for(var/f in filter_data) var/list/data = filter_data[f] var/list/arguments = data.Copy() @@ -55,8 +52,8 @@ LAZYREMOVE(filter_data, filter_name) filters -= thing update_filters() - return FALSE - return TRUE + return TRUE + return FALSE /// Animate a given filter on this atom. All params after the first are passed to animate(). /atom/movable/proc/animate_filter(filter_name, list/params) diff --git a/code/_helpers/washing.dm b/code/_helpers/washing.dm index 487afbd8700..0bb0169a3d1 100644 --- a/code/_helpers/washing.dm +++ b/code/_helpers/washing.dm @@ -2,8 +2,8 @@ if(!istype(washing)) return var/mob/living/L = washing - if(L.on_fire) + if(L.is_on_fire()) L.visible_message("A cloud of steam rises up as the water hits \the [L]!") - L.ExtinguishMob() - L.fire_stacks = -20 //Douse ourselves with water to avoid fire more easily + L.extinguish_fire() + L.adjust_fire_intensity(-20) //Douse ourselves with water to avoid fire more easily washing.clean() diff --git a/code/_macros.dm b/code/_macros.dm index 5cba5893825..11e6c146b5d 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -106,9 +106,12 @@ #define show_image(target, image) target << (image) #define send_rsc(target, rsc_content, rsc_name) target << browse_rsc(rsc_content, rsc_name) #define open_link(target, url) target << link(url) +#define ftp_to(target, file_entry, suggested_name) target << ftp(file_entry, suggested_name) +#define open_file_for(target, file) target << run(file) #define to_savefile(target, key, value) target[(key)] << (value) #define from_savefile(target, key, value) target[(key)] >> (value) #define to_output(target, output_content, output_args) target << output((output_content), (output_args)) +// Avoid using this where possible, prefer the other helpers instead. #define direct_output(target, value) target << (value) /proc/html_icon(var/thing) // Proc instead of macro to avoid precompiler problems. @@ -147,34 +150,35 @@ #define SPAN_STYLE(S, X) "[X]" #define SPAN_CLASS(C, X) "[X]" -#define SPAN_ITALIC(X) SPAN_CLASS("italic", X) -#define SPAN_BOLD(X) SPAN_CLASS("bold", X) -#define SPAN_NOTICE(X) SPAN_CLASS("notice", X) -#define SPAN_WARNING(X) SPAN_CLASS("warning", X) -#define SPAN_DANGER(X) SPAN_CLASS("danger", X) -#define SPAN_ROSE(X) SPAN_CLASS("rose", X) -#define SPAN_OCCULT(X) SPAN_CLASS("cult", X) -#define SPAN_MFAUNA(X) SPAN_CLASS("mfauna", X) -#define SPAN_SUBTLE(X) SPAN_CLASS("subtle", X) -#define SPAN_INFO(X) SPAN_CLASS("info", X) -#define SPAN_RED(X) SPAN_CLASS("font_red", X) -#define SPAN_ORANGE(X) SPAN_CLASS("font_orange", X) -#define SPAN_YELLOW(X) SPAN_CLASS("font_yellow", X) -#define SPAN_GREEN(X) SPAN_CLASS("font_green", X) -#define SPAN_BLUE(X) SPAN_CLASS("font_blue", X) -#define SPAN_VIOLET(X) SPAN_CLASS("font_violet", X) -#define SPAN_PURPLE(X) SPAN_CLASS("font_purple", X) -#define SPAN_GREY(X) SPAN_CLASS("font_grey", X) -#define SPAN_MAROON(X) SPAN_CLASS("font_maroon", X) -#define SPAN_PINK(X) SPAN_CLASS("font_pink", X) -#define SPAN_PALEPINK(X) SPAN_CLASS("font_palepink", X) -#define SPAN_SINISTER(X) SPAN_CLASS("sinister", X) -#define SPAN_MODERATE(X) SPAN_CLASS("moderate", X) +#define SPAN_ITALIC(X) SPAN_CLASS("italic", X) +#define SPAN_BOLD(X) SPAN_CLASS("bold", X) +#define SPAN_NOTICE(X) SPAN_CLASS("notice", X) +#define SPAN_WARNING(X) SPAN_CLASS("warning", X) +#define SPAN_DANGER(X) SPAN_CLASS("danger", X) +#define SPAN_ROSE(X) SPAN_CLASS("rose", X) +#define SPAN_OCCULT(X) SPAN_CLASS("cult", X) +#define SPAN_CULT_ANNOUNCE(X) SPAN_CLASS("cultannounce", X) +#define SPAN_MFAUNA(X) SPAN_CLASS("mfauna", X) +#define SPAN_SUBTLE(X) SPAN_CLASS("subtle", X) +#define SPAN_INFO(X) SPAN_CLASS("info", X) +#define SPAN_RED(X) SPAN_CLASS("font_red", X) +#define SPAN_ORANGE(X) SPAN_CLASS("font_orange", X) +#define SPAN_YELLOW(X) SPAN_CLASS("font_yellow", X) +#define SPAN_GREEN(X) SPAN_CLASS("font_green", X) +#define SPAN_BLUE(X) SPAN_CLASS("font_blue", X) +#define SPAN_VIOLET(X) SPAN_CLASS("font_violet", X) +#define SPAN_PURPLE(X) SPAN_CLASS("font_purple", X) +#define SPAN_GREY(X) SPAN_CLASS("font_grey", X) +#define SPAN_MAROON(X) SPAN_CLASS("font_maroon", X) +#define SPAN_PINK(X) SPAN_CLASS("font_pink", X) +#define SPAN_PALEPINK(X) SPAN_CLASS("font_palepink", X) +#define SPAN_SINISTER(X) SPAN_CLASS("sinister", X) +#define SPAN_MODERATE(X) SPAN_CLASS("moderate", X) // placeholders -#define SPAN_GOOD(X) SPAN_GREEN(X) -#define SPAN_NEUTRAL(X) SPAN_BLUE(X) -#define SPAN_BAD(X) SPAN_RED(X) -#define SPAN_HARDSUIT(X) SPAN_BLUE(X) +#define SPAN_GOOD(X) SPAN_GREEN(X) +#define SPAN_NEUTRAL(X) SPAN_BLUE(X) +#define SPAN_BAD(X) SPAN_RED(X) +#define SPAN_HARDSUIT(X) SPAN_BLUE(X) #define CSS_CLASS_RADIO "radio" @@ -194,4 +198,8 @@ #define FONT_GIANT(X) "[X]" -#define PRINT_STACK_TRACE(X) get_stack_trace(X, __FILE__, __LINE__) \ No newline at end of file +#define PRINT_STACK_TRACE(X) get_stack_trace(X, __FILE__, __LINE__) + +/// Checks if potential_weakref is a weakref of thing. +/// NOTE: These argments are the opposite order of TG's, because I think TG's are counterintuitive. +#define IS_WEAKREF_OF(potential_weakref, thing) (istype(thing, /datum) && !isnull(potential_weakref) && thing.weakref == potential_weakref) \ No newline at end of file diff --git a/code/_onclick/MouseDrag.dm b/code/_onclick/MouseDrag.dm index fba7242aa07..6f7e0ee7c3e 100644 --- a/code/_onclick/MouseDrag.dm +++ b/code/_onclick/MouseDrag.dm @@ -15,7 +15,7 @@ return var/obj/item/gun/gun = get_active_held_item() - if(a_intent == I_HURT && istype(over_object) && (isturf(over_object) || isturf(over_object.loc)) && !incapacitated() && istype(gun)) + if(check_intent(I_FLAG_HARM) && istype(over_object) && (isturf(over_object) || isturf(over_object.loc)) && !incapacitated() && istype(gun)) gun.set_autofire(over_object, src) /mob/proc/OnMouseDown(atom/object, location, control, params) @@ -25,7 +25,7 @@ return var/obj/item/gun/gun = get_active_held_item() - if(a_intent == I_HURT && istype(object) && (isturf(object) || isturf(object.loc)) && !incapacitated() && istype(gun)) + if(check_intent(I_FLAG_HARM) && istype(object) && (isturf(object) || isturf(object.loc)) && !incapacitated() && istype(gun)) gun.set_autofire(object, src) /mob/proc/OnMouseUp(atom/object, location, control, params) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 70e40cb6eb3..328becddbbf 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -103,7 +103,7 @@ Quick adjacency (to turf): return TRUE if(istype(loc, /obj/item) || istype(loc, /obj/structure)) if(recurse > 0) - return loc.Adjacent(neighbor,recurse - 1) + return loc.Adjacent(neighbor, recurse - 1) return FALSE return ..() @@ -112,7 +112,7 @@ Quick adjacency (to turf): return TRUE if(istype(loc, /obj/item) || istype(loc, /obj/structure)) if(recurse > 0) - return loc.Adjacent(neighbor,recurse - 1) + return loc.Adjacent(neighbor, recurse - 1) return FALSE return ..() diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index e35ab0ceb7e..56e4ee39cc8 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -60,7 +60,7 @@ if(silicon_camera.in_camera_mode) silicon_camera.camera_mode_off() - silicon_camera.captureimage(A, usr) + silicon_camera.captureimage(A, src) return A.add_hiddenprint(src) @@ -118,10 +118,10 @@ I have no idea why it was in atoms.dm instead of respective files. */ -/atom/proc/AICtrlAltClick() +/atom/proc/AICtrlAltClick(mob/living/silicon/user) -/obj/machinery/door/airlock/AICtrlAltClick() // Electrifies doors. - if(usr.incapacitated()) +/obj/machinery/door/airlock/AICtrlAltClick(mob/living/silicon/user) // Electrifies doors. + if(user.incapacitated()) return if(!electrified_until) // permanent shock @@ -131,14 +131,14 @@ Topic(src, list("command"="electrify_permanently", "activate" = "0")) return 1 -/atom/proc/AICtrlShiftClick() +/atom/proc/AICtrlShiftClick(mob/living/silicon/user) return -/atom/proc/AIShiftClick() +/atom/proc/AIShiftClick(mob/living/silicon/user) return -/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors! - if(usr.incapacitated()) +/obj/machinery/door/airlock/AIShiftClick(mob/living/silicon/user) // Opens and closes doors! + if(user.incapacitated()) return if(density) Topic(src, list("command"="open", "activate" = "1")) @@ -146,11 +146,11 @@ Topic(src, list("command"="open", "activate" = "0")) return 1 -/atom/proc/AICtrlClick() +/atom/proc/AICtrlClick(mob/living/silicon/user) return FALSE -/obj/machinery/door/airlock/AICtrlClick() // Bolts doors - if(usr.incapacitated()) +/obj/machinery/door/airlock/AICtrlClick(mob/living/silicon/user) // Bolts doors + if(user.incapacitated()) return FALSE if(locked) Topic(src, list("command"="bolts", "activate" = "0")) @@ -158,35 +158,35 @@ Topic(src, list("command"="bolts", "activate" = "1")) return TRUE -/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. - if(usr.incapacitated()) +/obj/machinery/power/apc/AICtrlClick(mob/living/silicon/user) // turns off/on APCs. + if(user.incapacitated()) return FALSE Topic(src, list("breaker"="1")) return TRUE -/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets - if(usr.incapacitated()) +/obj/machinery/turretid/AICtrlClick(mob/living/silicon/user) //turns off/on Turrets + if(user.incapacitated()) return FALSE Topic(src, list("command"="enable", "value"="[!enabled]")) return TRUE -/atom/proc/AIAltClick(var/atom/A) - return AltClick(A) +/atom/proc/AIAltClick(mob/living/silicon/user) + return AltClick(user) -/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets - if(usr.incapacitated()) +/obj/machinery/turretid/AIAltClick(mob/living/silicon/user) //toggles lethal on turrets + if(user.incapacitated()) return Topic(src, list("command"="lethal", "value"="[!lethal]")) return 1 -/obj/machinery/atmospherics/binary/pump/AIAltClick() - return AltClick() +/obj/machinery/atmospherics/binary/pump/AIAltClick(mob/living/silicon/user) + return AltClick(user) /atom/proc/AIMiddleClick(var/mob/living/silicon/user) return 0 -/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights. - if(usr.incapacitated()) +/obj/machinery/door/airlock/AIMiddleClick(mob/living/silicon/user) // Toggles door bolt lights. + if(user.incapacitated()) return if(..()) return diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 045bb1e7b33..90653cccc97 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -108,7 +108,7 @@ if(holding == A) // Handle attack_self holding.attack_self(src) trigger_aiming(TARGET_CAN_CLICK) - usr.update_inhand_overlays(FALSE) + update_inhand_overlays(FALSE) return 1 //Atoms on your person @@ -116,18 +116,13 @@ var/sdepth = A.storage_depth(src) if((!isturf(A) && A == loc) || (sdepth != -1 && sdepth <= 1)) if(holding) - - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!do_attack_windup_checking(A) || holding != get_active_held_item())) - return TRUE - var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else if(ismob(A)) // No instant mob attacking - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) trigger_aiming(TARGET_CAN_CLICK) @@ -143,18 +138,14 @@ if(A.Adjacent(src)) // see adjacent.dm if(holding) - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && (!do_attack_windup_checking(A) || holding != get_active_held_item())) - return TRUE - // Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example) var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1: clicking something Adjacent - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else if(ismob(A)) // No instant mob attacking - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) UnarmedAttack(A, TRUE) trigger_aiming(TARGET_CAN_CLICK) @@ -217,18 +208,7 @@ 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) - - // TODO: some way to check if we SHOULD be doing an attack windup here; - // corgis attacking a tree, for example, will do the windup animation despite - // having no interaction or message shown at the end of it. - // AI driven mobs have a melee telegraph that needs to be handled here. - if(a_intent == I_HURT && istype(A) && !do_attack_windup_checking(A)) - return TRUE - - return FALSE + return A.attack_hand(src) /* Ranged unarmed attack: @@ -302,10 +282,17 @@ return A.CtrlClick(src) /atom/proc/CtrlClick(var/mob/user) + if(get_recursive_loc_of_type(/mob) == user) + var/decl/interaction_handler/handler = get_quick_interaction_handler(user) + if(handler) + var/using_item = user.get_active_held_item() + if(handler.is_possible(src, user, using_item)) + return handler.invoked(src, user, using_item) return FALSE /atom/movable/CtrlClick(var/mob/living/user) - return try_make_grab(user, defer_hand = TRUE) || ..() + if(!(. = ..()) && loc != user) + return try_make_grab(user, defer_hand = TRUE) || ..() /* Alt click @@ -315,7 +302,7 @@ A.AltClick(src) /atom/proc/AltClick(var/mob/user) - if(try_handle_interactions(user, get_alt_interactions(user), user?.get_active_held_item())) + if(try_handle_interactions(user, get_alt_interactions(user), user?.get_active_held_item(), check_alt_interactions = TRUE)) return TRUE if(user?.get_preference_value(/datum/client_preference/show_turf_contents) == PREF_ALT_CLICK) . = show_atom_list_for_turf(user, get_turf(src)) diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 4cb41e5b2bb..2ad7f9d7c98 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -42,9 +42,9 @@ if(silicon_camera.in_camera_mode) silicon_camera.camera_mode_off() if(is_component_functioning("camera")) - silicon_camera.captureimage(A, usr) + silicon_camera.captureimage(A, src) else - to_chat(src, "Your camera isn't functional.") + to_chat(src, SPAN_DANGER("Your camera isn't functional.")) return var/obj/item/holding = get_active_held_item() @@ -69,7 +69,7 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) return if(!isturf(loc)) @@ -81,7 +81,7 @@ var/resolved = holding.resolve_attackby(A, src, params) if(!resolved && A && holding) holding.afterattack(A, src, 1, params) // 1 indicates adjacency - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) else holding.afterattack(A, src, 0, params) return @@ -111,42 +111,39 @@ /atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden CtrlShiftClick(user) -/obj/machinery/door/airlock/BorgCtrlShiftClick() - AICtrlShiftClick() +/obj/machinery/door/airlock/BorgCtrlShiftClick(mob/living/silicon/robot/user) + AICtrlShiftClick(user) /atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden ShiftClick(user) -/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code. - AIShiftClick() +/obj/machinery/door/airlock/BorgShiftClick(mob/living/silicon/robot/user) // Opens and closes doors! Forwards to AI code. + AIShiftClick(user) /atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden return CtrlClick(user) -/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code. - return AICtrlClick() +/obj/machinery/door/airlock/BorgCtrlClick(mob/living/silicon/robot/user) // Bolts doors. Forwards to AI code. + return AICtrlClick(user) -/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code. - return AICtrlClick() +/obj/machinery/power/apc/BorgCtrlClick(mob/living/silicon/robot/user) // turns off/on APCs. Forwards to AI code. + return AICtrlClick(user) -/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code. - return AICtrlClick() +/obj/machinery/turretid/BorgCtrlClick(mob/living/silicon/robot/user) //turret control on/off. Forwards to AI code. + return AICtrlClick(user) /atom/proc/BorgAltClick(var/mob/living/silicon/robot/user) AltClick(user) return -/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code. - if (usr.a_intent != I_HELP) - AICtrlAltClick() +/obj/machinery/door/airlock/BorgAltClick(mob/living/silicon/robot/user) // Eletrifies doors. Forwards to AI code. + if (!user.check_intent(I_FLAG_HELP)) + AICtrlAltClick(user) else ..() -/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code. - AIAltClick() - -/obj/machinery/atmospherics/binary/pump/BorgAltClick() - return AltClick() +/obj/machinery/turretid/BorgAltClick(mob/living/silicon/robot/user) //turret lethal on/off. Forwards to AI code. + AIAltClick(user) /atom/proc/BorgCtrlAltClick(var/mob/living/silicon/robot/user) CtrlAltClick(user) diff --git a/code/_onclick/ghost.dm b/code/_onclick/ghost.dm index da5d187674d..7bee520bdb5 100644 --- a/code/_onclick/ghost.dm +++ b/code/_onclick/ghost.dm @@ -45,6 +45,9 @@ return if(user.client && user.client.inquisitive_ghost) user.examinate(src) + return + if(user.client?.holder || user.antagHUD) + storage?.show_to(user) return // --------------------------------------- diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index f13491832f4..5ac7ac42bd0 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -16,21 +16,21 @@ #define ui_entire_screen "WEST,SOUTH to EAST,NORTH" #define ui_center_fullscreen "CENTER-7,CENTER-7" -//Lower left, persistant menu +//Lower left, persistent menu #define ui_inventory "LEFT:6,BOTTOM:5" -//Lower center, persistant menu +//Lower center, persistent menu #define ui_sstore1 "LEFT+2:10,BOTTOM:5" -#define ui_id "LEFT+3:12,BOTTOM:5" -#define ui_belt "LEFT+4:14,BOTTOM:5" -#define ui_back "CENTER-2:14,BOTTOM:5" +#define ui_back "LEFT+3:22,BOTTOM:5" +#define ui_id "LEFT+4:26,BOTTOM:5" +#define ui_belt "RIGHT-5:16,BOTTOM:5" #define ui_rhand "CENTER-1:16,BOTTOM:5" #define ui_lhand "CENTER:16,BOTTOM:5" #define ui_equip "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand2 "CENTER:16,BOTTOM+1:5" -#define ui_storage1 "CENTER+1:16,BOTTOM:5" -#define ui_storage2 "CENTER+2:16,BOTTOM:5" +#define ui_storage1 "RIGHT-3:16,BOTTOM:5" +#define ui_storage2 "RIGHT-4:16,BOTTOM:5" #define ui_alien_head "CENTER-3:12,BOTTOM:5" //aliens #define ui_alien_oclothing "CENTER-2:14,BOTTOM:5"//aliens @@ -48,13 +48,13 @@ #define ui_construct_fire "RIGHT-1:16,CENTER+1:13" //above health, slightly to the left #define ui_construct_pull "RIGHT-1:28,BOTTOM+1:10" //above the zone selector icon -//Lower right, persistant menu +//Lower right, persistent menu #define ui_dropbutton "RIGHT-4:22,BOTTOM:5" #define ui_drop_throw "RIGHT-1:28,BOTTOM+1:7" #define ui_pull_resist "RIGHT-2:26,BOTTOM+1:7" -#define ui_acti "RIGHT-2:26,BOTTOM:5" -#define ui_movi "RIGHT-3:24,BOTTOM:5" -#define ui_attack_selector "RIGHT-3:24,BOTTOM+1:6" +#define ui_acti "CENTER,BOTTOM:5" +#define ui_movi "RIGHT-2:24,BOTTOM:5" +#define ui_attack_selector "RIGHT-2:27,BOTTOM+2:9" #define ui_zonesel "RIGHT-1:28,BOTTOM:5" #define ui_acti_alt "RIGHT-1:28,BOTTOM:5" //alternative intent switcher for when the interface is hidden #define ui_stamina "RIGHT-3:24,BOTTOM+1:5" diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index dbd392509b6..e122262cdb9 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -78,7 +78,7 @@ Deactivate() if(AB_GENERIC) if(target && procname) - call(target,procname)(usr) + call(target,procname)(owner) return /datum/action/proc/Activate() diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 81f1abf8965..651c4d1e007 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -1,6 +1,9 @@ /mob/living/silicon/ai hud_used = /datum/hud/ai +/datum/hud/ai + action_intent_type = null // no selector + /datum/hud/ai/FinalizeInstantiation() var/list/ai_hud_data = decls_repository.get_decls_of_subtype(/decl/ai_hud) for(var/elem_type in ai_hud_data) diff --git a/code/_onclick/hud/ai_hud.dm b/code/_onclick/hud/ai_hud.dm index b8edcf540c4..fa4e2200bb6 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 = TYPE_PROC_REF(/mob/living/silicon/ai, core) + proc_path = /mob/living/silicon/ai/proc/core /decl/ai_hud/ai_announcement screen_loc = ui_ai_announcement name = "AI Announcement" icon_state = "announcement" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_announcement) + proc_path = /mob/living/silicon/ai/proc/ai_announcement /decl/ai_hud/ai_cam_track screen_loc = ui_ai_cam_track name = "Track With Camera" icon_state = "track" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_camera_track) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, toggle_camera_light) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, ai_channel_change) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, sensor_mode) + proc_path = /mob/living/silicon/ai/proc/sensor_mode /decl/ai_hud/ai_manifest screen_loc = ui_ai_crew_manifest name = "Show Crew Manifest" icon_state = "manifest" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, run_program) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, ai_take_image) + proc_path = /mob/living/silicon/ai/proc/ai_take_image /decl/ai_hud/ai_view_images screen_loc = ui_ai_view_images name = "View Images" icon_state = "view_images" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_view_images) + proc_path = /mob/living/silicon/ai/proc/ai_view_images /decl/ai_hud/ai_laws screen_loc = ui_ai_state_laws name = "State Laws" icon_state = "state_laws" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_checklaws) + proc_path = /mob/living/silicon/ai/proc/ai_checklaws /decl/ai_hud/ai_call_shuttle screen_loc = ui_ai_call_shuttle name = "Call Shuttle" icon_state = "call_shuttle" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_call_shuttle) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, change_floor) + proc_path = /mob/living/silicon/ai/proc/change_floor /decl/ai_hud/ai_hologram screen_loc = ui_ai_holo_change name = "Change Hologram" icon_state = "ai_holo_change" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_hologram_change) + proc_path = /mob/living/silicon/ai/proc/ai_hologram_change /decl/ai_hud/ai_crew_monitor screen_loc = ui_ai_crew_mon name = "Crew Monitor" icon_state = "crew_monitor" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, run_program) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, ai_power_override) + proc_path = /mob/living/silicon/ai/proc/ai_power_override /decl/ai_hud/ai_shutdown screen_loc = ui_ai_shutdown name = "Shutdown" icon_state = "ai_shutdown" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_shutdown) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, toggle_hologram_movement) + proc_path = /mob/living/silicon/ai/proc/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 = TYPE_PROC_REF(/mob/living/silicon/ai, pick_icon) + proc_path = /mob/living/silicon/ai/proc/pick_icon /decl/ai_hud/ai_status screen_loc = ui_ai_status name = "Pick Status" icon_state = "ai_status" - proc_path = TYPE_PROC_REF(/mob/living/silicon/ai, ai_statuschange) + proc_path = /mob/living/silicon/ai/proc/ai_statuschange /decl/ai_hud/ai_inbuilt_comp screen_loc = ui_ai_crew_rec name = "Inbuilt Computer" icon_state = "ai_crew_rec" - proc_path = TYPE_PROC_REF(/mob/living/silicon, access_computer) + proc_path = /mob/living/silicon/proc/access_computer diff --git a/code/_onclick/hud/animal.dm b/code/_onclick/hud/animal.dm index 5c1d9173a3a..8b372aabdcc 100644 --- a/code/_onclick/hud/animal.dm +++ b/code/_onclick/hud/animal.dm @@ -11,6 +11,4 @@ move_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_MOVEMENT) move_intent.icon_state = mymob.move_intent.hud_icon_state adding += move_intent - action_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) - adding += action_intent ..() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 10b3ccf93c1..48829da57dd 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -13,6 +13,8 @@ hud_used = initial(hud_used) if(ispath(hud_used)) hud_used = new hud_used(src) + if(istype(hud_used)) + hud_used.refresh_hud_icons() refresh_lighting_master() /datum/hud @@ -22,16 +24,18 @@ var/inventory_shown = TRUE //the inventory var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/default_ui_style = /decl/ui_style/midnight + var/default_ui_style = DEFAULT_UI_STYLE var/list/alerts var/list/hand_hud_objects var/list/swaphand_hud_objects - var/obj/screen/intent/action_intent var/obj/screen/movement/move_intent var/obj/screen/stamina/stamina_bar + var/action_intent_type = /obj/screen/intent + var/obj/screen/intent/action_intent + var/list/adding = list() var/list/other = list() var/list/hud_elements = list() @@ -45,6 +49,10 @@ instantiate() ..() +/datum/hud/proc/refresh_hud_icons() + for(var/obj/screen/elem in mymob?.client?.screen) + elem.queue_icon_update() + /datum/hud/Destroy() . = ..() stamina_bar = null @@ -68,19 +76,19 @@ /datum/hud/proc/hide_inventory() inventory_shown = FALSE hidden_inventory_update() - persistant_inventory_update() + persistent_inventory_update() /datum/hud/proc/show_inventory() inventory_shown = TRUE hidden_inventory_update() - persistant_inventory_update() + persistent_inventory_update() /datum/hud/proc/hidden_inventory_update() var/decl/species/species = mymob?.get_species() if(istype(species?.species_hud)) refresh_inventory_slots(species.species_hud.hidden_slots, (inventory_shown && hud_shown)) -/datum/hud/proc/persistant_inventory_update() +/datum/hud/proc/persistent_inventory_update() var/decl/species/species = mymob?.get_species() if(istype(species?.species_hud)) refresh_inventory_slots(species.species_hud.persistent_slots, hud_shown) @@ -112,9 +120,17 @@ return FALSE /datum/hud/proc/FinalizeInstantiation() + SHOULD_CALL_PARENT(TRUE) + + if(!action_intent && action_intent_type) // Everyone needs an intent selector. + action_intent = new action_intent_type(null, mymob) + adding |= action_intent + hud_elements |= action_intent + BuildInventoryUI() BuildHandsUI() + if(mymob.client) mymob.client.screen = list() if(length(hand_hud_objects)) @@ -127,6 +143,7 @@ mymob.client.screen |= adding if(length(hotkeybuttons)) mymob.client.screen |= hotkeybuttons + hide_inventory() /datum/hud/proc/get_ui_style_data() @@ -138,6 +155,9 @@ . = available_styles[1] /datum/hud/proc/get_ui_color() + var/decl/ui_style/ui_style = get_ui_style_data() + if(!ui_style?.use_ui_color) + return COLOR_WHITE return mymob?.client?.prefs?.UI_style_color || COLOR_WHITE /datum/hud/proc/get_ui_alpha() @@ -172,25 +192,17 @@ break if(!inv_box) - inv_box = new /obj/screen/inventory(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HANDS) + inv_box = new /obj/screen/inventory/hand(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HANDS) else inv_box.set_ui_style(ui_style, UI_ICON_HANDS) inv_box.color = ui_color inv_box.alpha = ui_alpha - inv_box.SetName(hand_tag) - inv_box.icon_state = "hand_base" - - inv_box.cut_overlays() - 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]", TRUE) - inv_box.update_icon() + LAZYDISTINCTADD(hand_hud_objects, inv_box) + inv_box.SetName(hand_tag) inv_box.slot_id = hand_tag - inv_box.appearance_flags |= KEEP_TOGETHER - - LAZYDISTINCTADD(hand_hud_objects, inv_box) + inv_box.update_icon() // Clear held item boxes with no held slot. for(var/obj/screen/inventory/inv_box in hand_hud_objects) @@ -201,7 +213,7 @@ qdel(inv_box) // Rebuild offsets for the hand elements. - var/hand_y_offset = 5 + var/hand_y_offset = 21 var/list/elements = hand_hud_objects?.Copy() while(length(elements)) var/copy_index = min(length(elements), 2)+1 @@ -363,7 +375,7 @@ client.screen += zone_sel //This one is a special snowflake hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + hud_used.persistent_inventory_update() update_action_buttons() //Similar to minimize_hud() but keeps zone_sel, gun_setting_icon, and healths. @@ -400,7 +412,7 @@ hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + hud_used.persistent_inventory_update() update_action_buttons() /client/proc/reset_click_catchers() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index a4fb7dab7ff..7dc1d837d91 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -15,12 +15,6 @@ stamina_bar = new(null, mymob) adding += stamina_bar - // Draw the attack intent dialogue. - if(hud_data.has_a_intent) - action_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) - src.adding += action_intent - hud_elements |= action_intent - if(hud_data.has_m_intent) move_intent = new(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_MOVEMENT) move_intent.icon_state = mymob.move_intent.hud_icon_state diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 2b87d5f9372..b0680d9f047 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -50,11 +50,6 @@ var/global/obj/screen/robot_inventory R.ui_drop_grab = new(null, mymob) adding += R.ui_drop_grab - //Intent - action_intent = new /obj/screen/intent/robot(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) - action_intent.icon_state = R.a_intent - - adding += action_intent adding += new /obj/screen/robot_panel(null, mymob) adding += new /obj/screen/robot_store(null, mymob) @@ -96,11 +91,11 @@ var/global/obj/screen/robot_inventory R.active_storage.close(R) //Closes the inventory ui. if(!R.module) - to_chat(usr, SPAN_WARNING("No module selected.")) + to_chat(R, SPAN_WARNING("No module selected.")) return if(!R.module.equipment) - to_chat(usr, SPAN_WARNING("Selected module has no equipment available.")) + to_chat(R, SPAN_WARNING("Selected module has no equipment available.")) return if(!R.robot_modules_background) diff --git a/code/_onclick/hud/screen/_screen.dm b/code/_onclick/hud/screen/_screen.dm index fc921c67cee..4e891170d7b 100644 --- a/code/_onclick/hud/screen/_screen.dm +++ b/code/_onclick/hud/screen/_screen.dm @@ -24,6 +24,9 @@ var/ui_style_category /// Set to false for screen objects that do not rely on UI style to set their icon. var/requires_ui_style = TRUE + /// Whether or not we look for/draw an additional detail overlay. + var/apply_screen_overlay = TRUE + /// Reference to our last set ui_style /obj/screen/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) @@ -52,8 +55,13 @@ color = ui_color if(!isnull(ui_alpha)) alpha = ui_alpha + return ..() +/obj/screen/proc/get_owner_ui_style() + var/mob/owner = owner_ref?.resolve() + return (istype(owner) && istype(owner.hud_used)) ? owner.hud_used.get_ui_style_data() : null + /obj/screen/get_color() return color @@ -68,18 +76,21 @@ ui_style_category = ui_cat if(istype(ui_style) && ui_style_category) icon = ui_style.get_icon(ui_style_category) + update_icon() /obj/screen/Destroy() - if(owner_ref) - var/mob/owner = owner_ref.resolve() - if(istype(owner) && owner?.client?.screen) - owner.client.screen -= src + 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) return TRUE /obj/screen/Click(location, control, params) + var/list/paramlist = params2list(params) + if(paramlist["shift"]) + return examine(usr, 0) if(ismob(usr) && usr.client && usr.canClick() && (!user_incapacitation_flags || !usr.incapacitated(user_incapacitation_flags))) return handle_click(usr, params) return FALSE @@ -89,3 +100,25 @@ /obj/screen/check_mousedrop_interactivity(var/mob/user) return user.client && (src in user.client.screen) + +/obj/screen/on_update_icon() + rebuild_screen_overlays() + compile_overlays() + +/obj/screen/proc/get_screen_overlay_state() + return icon_state + +/obj/screen/proc/rebuild_screen_overlays() + SHOULD_CALL_PARENT(TRUE) + cut_overlays() + if(!apply_screen_overlay) + return + var/check_for_state = "[get_screen_overlay_state()]-overlay" + if(!check_state_in_icon(check_for_state, icon)) + return + var/decl/ui_style/ui_style = get_owner_ui_style() + if(ui_style?.use_overlay_color) + var/mob/living/owner = owner_ref?.resolve() + add_overlay(overlay_image(icon, check_for_state, istype(owner) ? (owner?.client?.prefs.UI_style_highlight_color || COLOR_WHITE) : COLOR_WHITE, RESET_COLOR)) + else + add_overlay(check_for_state) diff --git a/code/_onclick/hud/screen/screen_abilities.dm b/code/_onclick/hud/screen/screen_abilities.dm deleted file mode 100644 index 03961a96423..00000000000 --- a/code/_onclick/hud/screen/screen_abilities.dm +++ /dev/null @@ -1,292 +0,0 @@ -/obj/screen/ability_master - name = "Abilities" - icon = 'icons/mob/screen/spells.dmi' - icon_state = "grey_spell_ready" - screen_loc = ui_ability_master - requires_ui_style = FALSE - var/list/obj/screen/ability/ability_objects = list() - var/list/obj/screen/ability/spell_objects = list() - 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. - -/obj/screen/ability_master/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, ui_cat) - . = ..() - if(. != INITIALIZE_HINT_QDEL) - update_abilities(0, _owner) - -/obj/screen/ability_master/Destroy() - // Get rid of the ability objects. - remove_all_abilities() - ability_objects.Cut() - // 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(atom/over, mob/user, params) - if(showing) - return FALSE - . = ..() - -/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. - 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 - overlays.Add(closed_state) - else if(forced_state != 1) // We're opening it, show the icons. - open_ability_master() - update_abilities(1) - showing = 1 - overlays.len = 0 - overlays.Add(open_state) - 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(owner_client) - owner_client.screen += A - -/obj/screen/ability_master/proc/update_abilities(forced = 0, mob/user) - update_icon() - if(user && user.client) - if(!(src in user.client.screen)) - user.client.screen += src - var/i = 1 - for(var/obj/screen/ability/ability in ability_objects) - ability.update_icon(forced) - ability.maptext = "[i]" // Slot number - i++ - -/obj/screen/ability_master/on_update_icon() - if(ability_objects.len) - set_invisibility(INVISIBILITY_NONE) - else - set_invisibility(INVISIBILITY_ABSTRACT) - -/obj/screen/ability_master/proc/add_ability(var/name_given) - 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) - 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) - if(!ability) - return - ability_objects.Remove(ability) - if(istype(ability,/obj/screen/ability/spell)) - spell_objects.Remove(ability) - qdel(ability) - - - if(ability_objects.len) - toggle_open(showing + 1) - update_icon() -// else -// qdel(src) - -/obj/screen/ability_master/proc/remove_all_abilities() - for(var/obj/screen/ability/A in ability_objects) - remove_ability(A) - -/obj/screen/ability_master/proc/get_ability_by_name(name_to_search) - for(var/obj/screen/ability/A in ability_objects) - if(A.name == name_to_search) - return A - return null - -/obj/screen/ability_master/proc/get_ability_by_instance(var/obj/instance/) - for(var/obj/screen/ability/obj_based/O in ability_objects) - if(O.object == instance) - return O - return null - -/obj/screen/ability_master/proc/get_ability_by_spell(var/spell/s) - for(var/screen in spell_objects) - var/obj/screen/ability/spell/S = screen - if(S.spell == s) - return S - return null - -/obj/screen/ability_master/proc/synch_spells_to_mind(var/datum/mind/M) - if(!M) - return - LAZYINITLIST(M.learned_spells) - for(var/obj/screen/ability/spell/screen in spell_objects) - var/spell/S = screen.spell - M.learned_spells |= S - -///////////ACTUAL ABILITIES//////////// -//This is what you click to do things// -/////////////////////////////////////// -/obj/screen/ability - icon = 'icons/mob/screen/spells.dmi' - icon_state = "grey_spell_base" - maptext_x = 3 - requires_owner = FALSE - requires_ui_style = FALSE - var/background_base_state = "grey" - var/ability_icon_state = null - var/obj/screen/ability_master/ability_master - -/obj/screen/ability/Destroy() - if(ability_master) - ability_master.ability_objects -= 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) - ability_master = null - return ..() - -/obj/screen/ability/on_update_icon() - overlays.Cut() - icon_state = "[background_base_state]_spell_base" - - overlays += ability_icon_state - -/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. -/obj/screen/ability/proc/activate() - to_world("[src] had activate() called.") - return - -/////////Obj Abilities//////// -//Buttons to trigger objects// -////////////////////////////// - -/obj/screen/ability/obj_based - var/obj/object = null - -/obj/screen/ability/obj_based/activate() - if(object) - object.Click() - -// Wizard -/obj/screen/ability/spell - var/spell/spell - var/spell_base - var/last_charge = 0 - var/icon/last_charged_icon - -/obj/screen/ability/spell/Destroy() - if(spell) - spell.connected_button = null - spell = null - return ..() - -/obj/screen/ability_master/proc/add_spell(var/spell/spell) - if(!spell) return - - if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one - return - - if(get_ability_by_spell(spell)) - return - - var/obj/screen/ability/spell/A = new(null) - A.ability_master = src - A.spell = spell - A.SetName(spell.name) - - if(!spell.override_base) //if it's not set, we do basic checks - if(spell.spell_flags & CONSTRUCT_CHECK) - A.spell_base = "const" //construct spells - else - A.spell_base = "wiz" //wizard spells - else - A.spell_base = spell.override_base - A.update_charge(1) - spell_objects.Add(A) - ability_objects.Add(A) - 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) - for(var/obj/screen/ability/spell/spell in spell_objects) - spell.update_charge(forced) - -/obj/screen/ability/spell/proc/update_charge(var/forced_update = 0) - if(!spell) - qdel(src) - return - - if(last_charge == spell.charge_counter && !forced_update) - return //nothing to see here - - overlays -= spell.hud_state - - if(spell.charge_type == Sp_RECHARGE || spell.charge_type == Sp_CHARGES) - if(spell.charge_counter < spell.charge_max) - icon_state = "[spell_base]_spell_base" - if(spell.charge_counter > 0) - var/icon/partial_charge = icon(src.icon, "[spell_base]_spell_ready") - partial_charge.Crop(1, 1, partial_charge.Width(), round(partial_charge.Height() * spell.charge_counter / spell.charge_max)) - overlays += partial_charge - if(last_charged_icon) - overlays -= last_charged_icon - last_charged_icon = partial_charge - else if(last_charged_icon) - overlays -= last_charged_icon - last_charged_icon = null - else - icon_state = "[spell_base]_spell_ready" - if(last_charged_icon) - overlays -= last_charged_icon - else - icon_state = "[spell_base]_spell_ready" - - overlays += spell.hud_state - - last_charge = spell.charge_counter - - overlays -= "silence" - if(spell.silenced) - overlays += "silence" - -/obj/screen/ability/spell/on_update_icon(var/forced = 0) - update_charge(forced) - return - -/obj/screen/ability/spell/activate() - spell.perform(usr) - -/obj/screen/ability_master/proc/silence_spells(var/amount) - for(var/obj/screen/ability/spell/spell in spell_objects) - spell.spell.silenced = amount - spell.spell.process() - spell.update_charge(1) diff --git a/code/_onclick/hud/screen/screen_action_button.dm b/code/_onclick/hud/screen/screen_action_button.dm index 33bf849cb9c..df79fa29ce4 100644 --- a/code/_onclick/hud/screen/screen_action_button.dm +++ b/code/_onclick/hud/screen/screen_action_button.dm @@ -14,6 +14,7 @@ return FALSE /obj/screen/action_button/on_update_icon() + ..() if(!action) return icon = action.background_icon @@ -72,7 +73,6 @@ update_icon() user.update_action_buttons() -/obj/screen/action_button/hide_toggle/on_update_icon() - cut_overlays() +/obj/screen/action_button/hide_toggle/rebuild_screen_overlays() + ..() add_overlay(hidden ? "show" : "hide") - compile_overlays() diff --git a/code/_onclick/hud/screen/screen_ai_button.dm b/code/_onclick/hud/screen/screen_ai_button.dm index 03371223da7..e2060d6b8a1 100644 --- a/code/_onclick/hud/screen/screen_ai_button.dm +++ b/code/_onclick/hud/screen/screen_ai_button.dm @@ -1,16 +1,18 @@ /obj/screen/ai_button icon = 'icons/mob/screen/ai.dmi' requires_ui_style = FALSE - var/mob/living/silicon/ai/ai_verb + var/ai_verb var/list/input_procs var/list/input_args var/list/template_icon = list(null, "template") var/image/template_undelay /obj/screen/ai_button/handle_click(mob/user, params) - if(!isAI(usr)) + + var/mob/living/silicon/ai/A = user + if(!istype(A)) return TRUE - var/mob/living/silicon/ai/A = usr + if(!(ai_verb in A.verbs)) return TRUE @@ -30,7 +32,6 @@ if(!(ai_verb in A.verbs) || A.incapacitated()) return - input_arguments += input_arg if(length(input_args)) diff --git a/code/_onclick/hud/screen/screen_attack_selector.dm b/code/_onclick/hud/screen/screen_attack_selector.dm index ea27e11ca3e..537d2ccce38 100644 --- a/code/_onclick/hud/screen/screen_attack_selector.dm +++ b/code/_onclick/hud/screen/screen_attack_selector.dm @@ -28,6 +28,7 @@ return TRUE /obj/screen/default_attack_selector/on_update_icon() + ..() var/mob/living/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 index 6fc95896bfa..bb0965dac40 100644 --- a/code/_onclick/hud/screen/screen_cataloguer.dm +++ b/code/_onclick/hud/screen/screen_cataloguer.dm @@ -31,8 +31,8 @@ QDEL_NULL(holder_image) return ..() -/obj/screen/scan_radius/on_update_icon() - cut_overlays() +/obj/screen/scan_radius/rebuild_screen_overlays() + ..() if(scan_range <= 1) add_overlay("single") else @@ -79,5 +79,3 @@ 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_credits.dm b/code/_onclick/hud/screen/screen_credits.dm index 5025cc7a87d..2c04fffcf9a 100644 --- a/code/_onclick/hud/screen/screen_credits.dm +++ b/code/_onclick/hud/screen/screen_credits.dm @@ -18,15 +18,17 @@ 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) + addtimer(CALLBACK(src, PROC_REF(ease_out)), CREDIT_ROLL_SPEED - CREDIT_EASE_DURATION) var/mob/owner = owner_ref?.resolve() if(istype(owner) && owner.client) owner.client.screen += src +/obj/screen/credit/proc/ease_out() + if(QDELETED(src)) + return + animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION) + QDEL_IN_CLIENT_TIME(src, CREDIT_EASE_DURATION) + /obj/screen/credit/Destroy() var/client/P = parent if(istype(P)) diff --git a/code/_onclick/hud/screen/screen_equip.dm b/code/_onclick/hud/screen/screen_equip.dm index 997fe5683bc..39ca9349ad8 100644 --- a/code/_onclick/hud/screen/screen_equip.dm +++ b/code/_onclick/hud/screen/screen_equip.dm @@ -3,6 +3,6 @@ icon_state = "act_equip" /obj/screen/equip/handle_click(mob/user, params) - if(ishuman(usr)) - var/mob/living/human/H = usr + if(ishuman(user)) + var/mob/living/human/H = user H.quick_equip() diff --git a/code/_onclick/hud/screen/screen_exosuit.dm b/code/_onclick/hud/screen/screen_exosuit.dm index 565de7e3644..ad9171ed446 100644 --- a/code/_onclick/hud/screen/screen_exosuit.dm +++ b/code/_onclick/hud/screen/screen_exosuit.dm @@ -3,6 +3,7 @@ icon = 'icons/mecha/mech_hud.dmi' icon_state = "base" requires_ui_style = FALSE + apply_screen_overlay = FALSE var/initial_maptext var/height = 14 @@ -317,7 +318,8 @@ var/mob/living/exosuit/owner = get_owning_exosuit() if(owner) toggled = owner.hatch_closed - . = ..() + . = ..() + if(owner) if(toggled) maptext = MECH_UI_STYLE("OPEN") maptext_x = 5 @@ -340,19 +342,19 @@ toggled = owner.head.active_sensors . = ..() -/obj/screen/exosuit/toggle/camera/toggled() +/obj/screen/exosuit/toggle/camera/toggled(mob/user) 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.")) + to_chat(user, SPAN_WARNING("I/O Error: Camera systems not found.")) return if(!owner.head.vision_flags) - to_chat(usr, SPAN_WARNING("Alternative sensor configurations not found. Contact manufacturer for more details.")) + to_chat(user, SPAN_WARNING("Alternative sensor configurations not found. Contact manufacturer for more details.")) return if(!owner.get_cell()) - to_chat(usr, SPAN_WARNING("The augmented vision systems are offline.")) + to_chat(user, SPAN_WARNING("The augmented vision systems are offline.")) return owner.head.active_sensors = ..() - to_chat(usr, SPAN_NOTICE("[owner.head.name] advanced sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.")) + to_chat(user, SPAN_NOTICE("[owner.head.name] advanced sensor mode is [owner.head.active_sensors ? "now" : "no longer" ] active.")) /obj/screen/exosuit/needle vis_flags = VIS_INHERIT_ID diff --git a/code/_onclick/hud/screen/screen_gun.dm b/code/_onclick/hud/screen/screen_gun.dm index fdf77245d1c..86bba4206e7 100644 --- a/code/_onclick/hud/screen/screen_gun.dm +++ b/code/_onclick/hud/screen/screen_gun.dm @@ -2,8 +2,15 @@ icon = 'icons/mob/screen/styles/midnight/fire_intent.dmi' dir = SOUTH abstract_type = /obj/screen/gun + var/base_icon_state var/toggle_flag +/obj/screen/gun/on_update_icon() + if(toggle_flag && base_icon_state) + var/mob/living/owner = owner_ref?.resolve() + icon_state = "[base_icon_state][!!(istype(owner) && owner.aiming && (owner.aiming.target_permissions & toggle_flag))]" + ..() + /obj/screen/gun/handle_click(mob/user, params) if(isliving(user)) var/mob/living/shooter = user @@ -17,26 +24,35 @@ /obj/screen/gun/move name = "Allow Movement" icon_state = "no_walk1" + base_icon_state = "no_walk" screen_loc = ui_gun2 toggle_flag = TARGET_CAN_MOVE /obj/screen/gun/item name = "Allow Item Use" icon_state = "no_item1" + base_icon_state = "no_item" screen_loc = ui_gun1 toggle_flag = TARGET_CAN_CLICK /obj/screen/gun/radio name = "Disallow Radio Use" icon_state = "no_radio1" + base_icon_state = "no_radio" screen_loc = ui_gun4 toggle_flag = TARGET_CAN_RADIO /obj/screen/gun/mode name = "Toggle Gun Mode" icon_state = "gun0" + base_icon_state = "gun" screen_loc = ui_gun_select +/obj/screen/gun/mode/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + icon_state = "[base_icon_state][!!(istype(owner) && owner.aiming?.active)]" + ..() + /obj/screen/gun/mode/handle_click(mob/user, params) if(..()) var/mob/living/shooter = user diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index 138dc18c2d3..ca75b836812 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -1,24 +1,117 @@ +// Sub-element used for clickable intent selection. +/obj/screen/intent_button + layer = FLOAT_LAYER + plane = FLOAT_PLANE + icon = 'icons/screen/intents.dmi' + icon_state = "blank" + requires_ui_style = FALSE + screen_loc = null // Technically a screen element, but we use vis_contents to draw them. + var/obj/screen/intent/parent + var/decl/intent/intent + var/selected + +/obj/screen/intent_button/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat, intent_owner) + parent = intent_owner + . = ..() + +/obj/screen/intent_button/Destroy() + parent = null + intent = null + return ..() + +/obj/screen/intent_button/proc/set_selected(decl/intent/_intent) + intent = _intent + selected = TRUE + update_icon() + +/obj/screen/intent_button/proc/set_deselected(decl/intent/_intent) + intent = _intent + selected = FALSE + update_icon() + +/obj/screen/intent_button/handle_click(mob/user, params) + . = ..() + if(. && intent && parent) + parent.set_intent(intent) + +/obj/screen/intent_button/examine(mob/user, distance) + SHOULD_CALL_PARENT(FALSE) + if(desc) + to_chat(user, desc) + +/obj/screen/intent_button/on_update_icon() + . = ..() + screen_loc = null + if(intent) + name = intent.name + desc = intent.desc + icon = intent.icon + icon_state = selected ? intent.icon_state : "[intent.icon_state]_off" + /obj/screen/intent - name = "intent" - icon = 'icons/mob/screen/styles/intents.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 + name = "intent" + icon = 'icons/screen/intents.dmi' + icon_state = "blank" + screen_loc = ui_acti + requires_ui_style = FALSE + apply_screen_overlay = FALSE + var/intent_width = 16 + var/intent_height = 16 + var/list/intent_selectors + +/obj/screen/intent/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) + . = ..() update_icon() - user.a_intent = intent + // Hide from right-click. + name = "" + verbs.Cut() + +/obj/screen/intent/Destroy() + QDEL_NULL(intent_selectors) + vis_contents.Cut() + return ..() + +/obj/screen/intent/proc/set_intent(decl/intent/intent) + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && istype(intent)) + owner.set_intent(intent) + update_icon() + +/obj/screen/intent/proc/apply_intent_button_offset(atom/intent_button, index, intent_count) + intent_button.pixel_z = 0 + intent_button.pixel_w = 0 + intent_button.pixel_y = 0 + intent_button.pixel_x = -((intent_count * intent_width)/2) + ((index-1) * intent_width) + +/obj/screen/intent/proc/get_intent_button(index) + . = (index >= 1 && index <= length(intent_selectors)) ? intent_selectors[index] : null + if(!.) + . = new /obj/screen/intent_button(null, owner_ref?.resolve(), null, null, null, null, src) + LAZYADD(intent_selectors, .) /obj/screen/intent/on_update_icon() - icon_state = "intent_[intent]" + ..() + + var/mob/owner = owner_ref?.resolve() + if(!istype(owner) || QDELETED(owner)) + return + + var/decl/intent/owner_intent = owner.get_intent() + var/i = 1 + var/list/all_intents = owner.get_available_intents() + for(var/decl/intent/intent as anything in all_intents) + var/obj/screen/intent_button/intent_button = get_intent_button(i) + if(intent == owner_intent) + intent_button.set_selected(intent) + else + intent_button.set_deselected(intent) + i++ + apply_intent_button_offset(intent_button, i, length(all_intents)) + add_vis_contents(intent_button) + + if(i < length(intent_selectors)) + for(var/index = i+1 to length(intent_selectors)) + remove_vis_contents(intent_selectors[index]) + +/obj/screen/intent/binary + intent_width = 32 diff --git a/code/_onclick/hud/screen/screen_inventory.dm b/code/_onclick/hud/screen/screen_inventory.dm index 4033741be78..cc4a4835b82 100644 --- a/code/_onclick/hud/screen/screen_inventory.dm +++ b/code/_onclick/hud/screen/screen_inventory.dm @@ -40,22 +40,18 @@ mouse_over_atom_ref = null update_icon() -/obj/screen/inventory/on_update_icon() +/obj/screen/inventory/rebuild_screen_overlays() - 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)) + if(istype(mouse_over_atom) && !QDELETED(mouse_over_atom) && !owner.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 @@ -65,9 +61,7 @@ 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 + MA.appearance_flags |= (KEEP_TOGETHER | RESET_COLOR) 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_inventory_hands.dm b/code/_onclick/hud/screen/screen_inventory_hands.dm new file mode 100644 index 00000000000..7dbdbf0b152 --- /dev/null +++ b/code/_onclick/hud/screen/screen_inventory_hands.dm @@ -0,0 +1,31 @@ +/obj/screen/inventory/hand + icon_state = "hand_base" + +/obj/screen/inventory/hand/rebuild_screen_overlays() + + ..() + + // Validate our owner still exists. + var/mob/owner = owner_ref?.resolve() + if(!istype(owner) || QDELETED(owner) || !(src in owner.client?.screen)) + return + + var/overlay_color = owner?.client?.prefs.UI_style_highlight_color || COLOR_WHITE + var/decl/ui_style/ui_style = get_owner_ui_style() + if(owner.get_active_held_item_slot() == slot_id) + if(ui_style?.use_overlay_color) + add_overlay(overlay_image(icon, "hand_selected", overlay_color, RESET_COLOR)) + else + add_overlay("hand_selected") + + var/datum/inventory_slot/gripper/inv_slot = owner.get_inventory_slot_datum(slot_id) + if(istype(inv_slot)) + if(ui_style?.use_overlay_color) + add_overlay(overlay_image(icon, "hand_[inv_slot.hand_overlay || slot_id]", overlay_color, RESET_COLOR)) + else + add_overlay("hand_[inv_slot.hand_overlay || slot_id]", TRUE) + if(inv_slot.ui_label) + if(ui_style?.use_overlay_color) + add_overlay(overlay_image(icon, "hand_[inv_slot.ui_label]", overlay_color, RESET_COLOR)) + else + add_overlay("hand_[inv_slot.ui_label]", TRUE) diff --git a/code/_onclick/hud/screen/screen_maneuver.dm b/code/_onclick/hud/screen/screen_maneuver.dm index 203bffc6943..1a66910e8d5 100644 --- a/code/_onclick/hud/screen/screen_maneuver.dm +++ b/code/_onclick/hud/screen/screen_maneuver.dm @@ -9,7 +9,7 @@ user_living.prepare_maneuver() /obj/screen/maneuver/examine(mob/user, distance) - . = ..() + SHOULD_CALL_PARENT(FALSE) if(!isliving(user)) return var/mob/living/user_living = user @@ -17,3 +17,8 @@ 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.")) + +/obj/screen/maneuver/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + icon_state = (istype(owner) && owner.prepared_maneuver) ? "maneuver_on" : "maneuver_off" + ..() diff --git a/code/_onclick/hud/screen/screen_movement.dm b/code/_onclick/hud/screen/screen_movement.dm index e389e554cc5..674882295dd 100644 --- a/code/_onclick/hud/screen/screen_movement.dm +++ b/code/_onclick/hud/screen/screen_movement.dm @@ -1,7 +1,14 @@ /obj/screen/movement name = "movement method" screen_loc = ui_movi + icon_state = "creeping" /obj/screen/movement/handle_click(mob/user, params) if(istype(user)) user.set_next_usable_move_intent() + +/obj/screen/movement/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + if(istype(owner) && istype(owner.move_intent)) + icon_state = owner.move_intent.hud_icon_state + . = ..() diff --git a/code/_onclick/hud/screen/screen_needs.dm b/code/_onclick/hud/screen/screen_needs.dm index eaa8d41ed3e..8a4c66ca08b 100644 --- a/code/_onclick/hud/screen/screen_needs.dm +++ b/code/_onclick/hud/screen/screen_needs.dm @@ -12,15 +12,15 @@ if(user.nutrition_icon == src) switch(icon_state) if("nutrition0") - to_chat(usr, SPAN_WARNING("You are completely stuffed.")) + to_chat(user, SPAN_WARNING("You are completely stuffed.")) if("nutrition1") - to_chat(usr, SPAN_NOTICE("You are not hungry.")) + to_chat(user, SPAN_NOTICE("You are not hungry.")) if("nutrition2") - to_chat(usr, SPAN_NOTICE("You are a bit peckish.")) + to_chat(user, SPAN_NOTICE("You are a bit peckish.")) if("nutrition3") - to_chat(usr, SPAN_WARNING("You are quite hungry.")) + to_chat(user, SPAN_WARNING("You are quite hungry.")) if("nutrition4") - to_chat(usr, SPAN_DANGER("You are starving!")) + to_chat(user, SPAN_DANGER("You are starving!")) /obj/screen/drink name = "hydration" @@ -32,15 +32,15 @@ if(user.hydration_icon == src) switch(icon_state) if("hydration0") - to_chat(usr, SPAN_WARNING("You are overhydrated.")) + to_chat(user, SPAN_WARNING("You are overhydrated.")) if("hydration1") - to_chat(usr, SPAN_NOTICE("You are not thirsty.")) + to_chat(user, SPAN_NOTICE("You are not thirsty.")) if("hydration2") - to_chat(usr, SPAN_NOTICE("You are a bit thirsty.")) + to_chat(user, SPAN_NOTICE("You are a bit thirsty.")) if("hydration3") - to_chat(usr, SPAN_WARNING("You are quite thirsty.")) + to_chat(user, SPAN_WARNING("You are quite thirsty.")) if("hydration4") - to_chat(usr, SPAN_DANGER("You are dying of thirst!")) + to_chat(user, SPAN_DANGER("You are dying of thirst!")) /obj/screen/bodytemp name = "body temperature" @@ -52,23 +52,23 @@ if(user.bodytemp == src) switch(icon_state) if("temp4") - to_chat(usr, SPAN_DANGER("You are being cooked alive!")) + to_chat(user, SPAN_DANGER("You are being cooked alive!")) if("temp3") - to_chat(usr, SPAN_DANGER("Your body is burning up!")) + to_chat(user, SPAN_DANGER("Your body is burning up!")) if("temp2") - to_chat(usr, SPAN_DANGER("You are overheating.")) + to_chat(user, SPAN_DANGER("You are overheating.")) if("temp1") - to_chat(usr, SPAN_WARNING("You are uncomfortably hot.")) + to_chat(user, SPAN_WARNING("You are uncomfortably hot.")) if("temp-4") - to_chat(usr, SPAN_DANGER("You are being frozen solid!")) + to_chat(user, SPAN_DANGER("You are being frozen solid!")) if("temp-3") - to_chat(usr, SPAN_DANGER("You are freezing cold!")) + to_chat(user, SPAN_DANGER("You are freezing cold!")) if("temp-2") - to_chat(usr, SPAN_WARNING("You are dangerously chilled!")) + to_chat(user, SPAN_WARNING("You are dangerously chilled!")) if("temp-1") - to_chat(usr, SPAN_NOTICE("You are uncomfortably cold.")) + to_chat(user, SPAN_NOTICE("You are uncomfortably cold.")) else - to_chat(usr, SPAN_NOTICE("Your body is at a comfortable temperature.")) + to_chat(user, SPAN_NOTICE("Your body is at a comfortable temperature.")) /obj/screen/pressure name = "pressure" @@ -80,15 +80,15 @@ if(user.pressure == src) switch(icon_state) if("pressure2") - to_chat(usr, SPAN_DANGER("The air pressure here is crushing!")) + to_chat(user, SPAN_DANGER("The air pressure here is crushing!")) if("pressure1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously high.")) + to_chat(user, SPAN_WARNING("The air pressure here is dangerously high.")) if("pressure-1") - to_chat(usr, SPAN_WARNING("The air pressure here is dangerously low.")) + to_chat(user, SPAN_WARNING("The air pressure here is dangerously low.")) if("pressure-2") - to_chat(usr, SPAN_DANGER("There is nearly no air pressure here!")) + to_chat(user, SPAN_DANGER("There is nearly no air pressure here!")) else - to_chat(usr, SPAN_NOTICE("The local air pressure is comfortable.")) + to_chat(user, SPAN_NOTICE("The local air pressure is comfortable.")) /obj/screen/toxins name = "toxin" @@ -99,9 +99,9 @@ /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.")) + to_chat(user, SPAN_NOTICE("The air is clear of toxins.")) else - to_chat(usr, SPAN_DANGER("The air is eating away at your skin!")) + to_chat(user, SPAN_DANGER("The air is eating away at your skin!")) /obj/screen/oxygen name = "oxygen" @@ -112,6 +112,6 @@ /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.")) + to_chat(user, SPAN_NOTICE("You are breathing easy.")) else - to_chat(usr, SPAN_DANGER("You cannot breathe!")) + to_chat(user, SPAN_DANGER("You cannot breathe!")) diff --git a/code/_onclick/hud/screen/screen_pai.dm b/code/_onclick/hud/screen/screen_pai.dm index 7059432c1a7..51ceb9d7c27 100644 --- a/code/_onclick/hud/screen/screen_pai.dm +++ b/code/_onclick/hud/screen/screen_pai.dm @@ -68,7 +68,7 @@ /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 + var/ss_name = input(user, "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] diff --git a/code/_onclick/hud/screen/screen_robot_intent.dm b/code/_onclick/hud/screen/screen_robot_intent.dm deleted file mode 100644 index bbc6501941e..00000000000 --- a/code/_onclick/hud/screen/screen_robot_intent.dm +++ /dev/null @@ -1,7 +0,0 @@ -/obj/screen/intent/robot - name = "act_intent" - dir = SOUTHWEST - 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_throw.dm b/code/_onclick/hud/screen/screen_throw.dm index 679018fba8d..1b4de10e6e8 100644 --- a/code/_onclick/hud/screen/screen_throw.dm +++ b/code/_onclick/hud/screen/screen_throw.dm @@ -6,3 +6,9 @@ /obj/screen/throw_toggle/handle_click(mob/user, params) if(!user.stat && isturf(user.loc) && !user.restrained()) user.toggle_throw_mode() + +/obj/screen/throw_toggle/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + if(istype(owner)) + icon_state = "act_throw_[owner.in_throw_mode ? "on" : "off"]" + . = ..() diff --git a/code/_onclick/hud/screen/screen_up_hint.dm b/code/_onclick/hud/screen/screen_up_hint.dm index a6e45820115..5a1a2b796fc 100644 --- a/code/_onclick/hud/screen/screen_up_hint.dm +++ b/code/_onclick/hud/screen/screen_up_hint.dm @@ -7,3 +7,9 @@ if(isliving(user)) var/mob/living/L = user L.lookup() + +/obj/screen/up_hint/on_update_icon() + var/mob/owner = owner_ref?.resolve() + var/turf/above = istype(owner) ? GetAbove(get_turf(owner)) : null + icon_state = "uphint[!!(istype(above) && TURF_IS_MIMICKING(above))]" + ..() diff --git a/code/_onclick/hud/screen/screen_warnings.dm b/code/_onclick/hud/screen/screen_warnings.dm index 842f93677d1..d89eb94e10b 100644 --- a/code/_onclick/hud/screen/screen_warnings.dm +++ b/code/_onclick/hud/screen/screen_warnings.dm @@ -8,6 +8,12 @@ icon_state = "health0" screen_loc = ui_health +/obj/screen/health_warning/handle_click(mob/user, params) + if(ishuman(user)) + var/mob/living/human/human_user = user + human_user.check_self_injuries() + return TRUE + /obj/screen/warning_cells name = "cell" icon_state = "charge-empty" diff --git a/code/_onclick/hud/screen/screen_zone_selector.dm b/code/_onclick/hud/screen/screen_zone_selector.dm index 008d2b90262..0850498b7f2 100644 --- a/code/_onclick/hud/screen/screen_zone_selector.dm +++ b/code/_onclick/hud/screen/screen_zone_selector.dm @@ -64,10 +64,6 @@ 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 @@ -75,5 +71,6 @@ update_icon() return TRUE -/obj/screen/zone_selector/on_update_icon() - set_overlays(image('icons/mob/zone_sel.dmi', "[selecting]")) +/obj/screen/zone_selector/rebuild_screen_overlays() + ..() + add_overlay(image('icons/mob/zone_sel.dmi', "[selecting]")) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 3bb7bf3b1a7..b92356b4a14 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -26,12 +26,18 @@ avoid code duplication. This includes items that may sometimes act as a standard // If TRUE, prevent afterattack from running. /obj/item/proc/resolve_attackby(atom/A, mob/user, var/click_params) + if(!user.check_dexterity(get_required_attack_dexterity(user, A))) + return TRUE if(!(item_flags & ITEM_FLAG_NO_PRINT)) add_fingerprint(user) return A.attackby(src, user, click_params) // If TRUE, prevent afterattack from running. /atom/proc/attackby(obj/item/used_item, mob/user, var/click_params) + + if(try_handle_interactions(user, get_standard_interactions(user), user?.get_active_held_item(), check_alt_interactions = FALSE)) + return TRUE + if(storage) if(isrobot(user) && (used_item == user.get_active_held_item())) return FALSE //Robots can't store their modules. @@ -39,6 +45,7 @@ avoid code duplication. This includes items that may sometimes act as a standard return FALSE used_item.add_fingerprint(user) return storage.handle_item_insertion(user, used_item, click_params = click_params) + return FALSE /atom/movable/attackby(obj/item/W, mob/user) @@ -48,7 +55,7 @@ avoid code duplication. This includes items that may sometimes act as a standard // Return TRUE if further actions (afterattack, etc) should be prevented, FALSE if they can proceed. /atom/movable/proc/bash(obj/item/weapon, mob/user) - if(isliving(user) && user.a_intent == I_HELP) + if(isliving(user) && !user.check_intent(I_FLAG_HARM)) return FALSE if(!weapon.user_can_attack_with(user)) return FALSE @@ -61,7 +68,7 @@ avoid code duplication. This includes items that may sometimes act as a standard if(!ismob(user)) return TRUE - if(!QDELETED(used_item) && user.a_intent == I_HELP) + if(!QDELETED(used_item) && user.check_intent(I_FLAG_HELP)) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, user.get_target_zone()) if(length(E?.ailments)) for(var/datum/ailment/ailment in E.ailments) @@ -69,7 +76,7 @@ avoid code duplication. This includes items that may sometimes act as a standard ailment.was_treated_by_item(used_item, user, src) return TRUE - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) if(can_operate(src, user) != OPERATE_DENY && used_item.do_surgery(src,user)) //Surgery return TRUE if(try_butcher_in_place(user, used_item)) @@ -80,7 +87,7 @@ avoid code duplication. This includes items that may sometimes act as a standard if(milkable.handle_milked(used_item, user)) return TRUE - if(used_item.edge && has_extension(src, /datum/extension/shearable)) + if(used_item.has_edge() && has_extension(src, /datum/extension/shearable)) var/datum/extension/shearable/shearable = get_extension(src, /datum/extension/shearable) if(shearable.handle_sheared(used_item, user)) return TRUE @@ -119,14 +126,14 @@ avoid code duplication. This includes items that may sometimes act as a standard if(squash_item()) return TRUE - if(user?.a_intent != I_HURT && is_edible(target) && handle_eaten_by_mob(user, target) != EATEN_INVALID) + if(!user?.check_intent(I_FLAG_HARM) && is_edible(target) && handle_eaten_by_mob(user, target) != EATEN_INVALID) return TRUE if(item_flags & ITEM_FLAG_NO_BLUDGEON) return FALSE // If on help, possibly don't attack. - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) switch(user.get_preference_value(/datum/client_preference/help_intent_attack_blocking)) if(PREF_ALWAYS) if(user == target) @@ -165,12 +172,12 @@ avoid code duplication. This includes items that may sometimes act as a standard /obj/item/proc/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) var/use_hitsound = hitsound if(!use_hitsound) - if(edge || sharp) + if(has_edge() || is_sharp()) use_hitsound = 'sound/weapons/bladeslice.ogg' else use_hitsound = "swing_hit" playsound(loc, use_hitsound, 50, 1, -1) - return target.hit_with_weapon(src, user, get_attack_force(user), hit_zone) + return target.hit_with_weapon(src, user, expend_attack_force(user), hit_zone) /obj/item/proc/handle_reflexive_fire(var/mob/user, var/atom/aiming_at) return istype(user) && istype(aiming_at) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 0e4a32796d5..f3d74569b41 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -8,9 +8,15 @@ /atom/proc/can_interact_with_storage(user, strict = FALSE) return isliving(user) +/atom/proc/get_required_interaction_dexterity() + return DEXTERITY_NONE + /atom/proc/attack_hand(mob/user) SHOULD_CALL_PARENT(TRUE) + if(!user.check_dexterity(get_required_interaction_dexterity(), silent = TRUE)) + return FALSE + if(can_interact_with_storage(user, strict = TRUE) && storage && user.check_dexterity((DEXTERITY_HOLD_ITEM|DEXTERITY_EQUIP_ITEM), TRUE)) add_fingerprint(user) storage.open(user) @@ -19,6 +25,9 @@ if(handle_grab_interaction(user)) return TRUE + if(try_handle_interactions(user, get_standard_interactions(user), user?.get_active_held_item(), check_alt_interactions = FALSE)) + return TRUE + if(!LAZYLEN(climbers) || (user in climbers) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, silent = TRUE)) return FALSE @@ -57,7 +66,7 @@ /mob/living/RestrainedClickOn(var/atom/A) if (A != src) return ..() - if(world.time < next_restraint_chew || !get_equipped_item(slot_handcuffed_str) || a_intent != I_HURT || get_target_zone() != BP_MOUTH) + if(world.time < next_restraint_chew || !get_equipped_item(slot_handcuffed_str) || !check_intent(I_FLAG_HARM) || get_target_zone() != BP_MOUTH) return FALSE // Cannot chew with a mask or a full body restraint. if (get_equipped_item(slot_wear_mask_str) || istype(get_equipped_item(slot_wear_suit_str), /obj/item/clothing/suit/straight_jacket)) @@ -66,9 +75,9 @@ var/obj/item/organ/external/hand/O = GET_EXTERNAL_ORGAN(src, get_active_held_item_slot()) if(!istype(O)) return FALSE - var/decl/pronouns/G = get_pronouns() + var/decl/pronouns/pronouns = get_pronouns() visible_message( - SPAN_DANGER("\The [src] chews on [G.his] [O.name]"), + SPAN_DANGER("\The [src] chews on [pronouns.his] [O.name]"), SPAN_DANGER("You chew on your [O.name]!") ) admin_attacker_log(src, "chewed on their [O.name]!") @@ -94,10 +103,10 @@ return var/attacking_with = get_natural_weapon() - if(a_intent == I_HELP || !attacking_with) + if(check_intent(I_FLAG_HELP) || !attacking_with) return A.attack_animal(src) - a_intent = I_HURT + set_intent(I_FLAG_HARM) . = A.attackby(attacking_with, src) // attack effects are handled in natural_weapon's apply_hit_effect() instead of here if(!.) diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 9c1802edd7a..3b7d5f0d8ac 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -46,6 +46,6 @@ return 0 rig.selected_module.engage(A, alert_ai) if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns - setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + setClickCooldown(DEFAULT_QUICK_COOLDOWN) return 1 return 0 \ No newline at end of file diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 4e599b93113..d91f03f89ee 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -123,11 +123,7 @@ var/global/list/all_selectable_radio_filters = list( RADIO_MAGNETS ) -var/global/datum/controller/radio/radio_controller - -/hook/startup/proc/createRadioController() - radio_controller = new /datum/controller/radio() - return 1 +var/global/datum/controller/radio/radio_controller = new /datum/controller/radio() //callback used by objects to react to incoming radio signals /obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param) diff --git a/code/controllers/evacuation/evacuation.dm b/code/controllers/evacuation/evacuation.dm index 69eeb9bc5bc..90849e6e193 100644 --- a/code/controllers/evacuation/evacuation.dm +++ b/code/controllers/evacuation/evacuation.dm @@ -131,8 +131,6 @@ 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(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/hooks-defs.dm b/code/controllers/hooks-defs.dm deleted file mode 100644 index 696352c85eb..00000000000 --- a/code/controllers/hooks-defs.dm +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Global init hook. - * Called in global_init.dm when the server is initialized. - */ -/hook/global_init - -/** - * Startup hook. - * Called in world.dm when the server starts. - */ -/hook/startup - -/** - * Roundstart hook. - * Called in ticker.dm when a round starts. - */ -/hook/roundstart - -/** - * Roundend hook. - * Called in ticker.dm when a round ends. - */ -/hook/roundend - -/** - * Shutdown hook. - * Called in world.dm when world/Del is called. - */ -/hook/shutdown - -/** - * Reboot hook. - * Called in world.dm prior to the parent call in world/Reboot. - */ -/hook/reboot diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm deleted file mode 100644 index 2e05a0621b0..00000000000 --- a/code/controllers/hooks.dm +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @file hooks.dm - * Implements hooks, a simple way to run code on pre-defined events. - */ - -/** @page hooks Code hooks - * @section hooks Hooks - * A hook is defined under /hook in the type tree. - * - * To add some code to be called by the hook, define a proc under the type, as so: - * @code - hook/foo/proc/bar() - if(1) - return 1 //Sucessful - else - return 0 //Error, or runtime. - * @endcode - * All hooks must return nonzero on success, as runtimes will force return null. - */ - -/** - * Calls a hook, executing every piece of code that's attached to it. - * @param hook Identifier of the hook to call. - * @returns 1 if all hooked code runs successfully, 0 otherwise. - */ -/proc/callHook(hook, list/args=null) - var/hook_path = text2path("/hook/[hook]") - if(!hook_path) - error("Invalid hook '/hook/[hook]' called.") - return 0 - - var/caller = new hook_path - var/status = 1 - for(var/P in typesof("[hook_path]/proc")) - if(!call(caller, P)(arglist(args))) - error("Hook '[P]' failed or runtimed.") - status = 0 - - return status diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 7db377082bd..f5f59fe940c 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -220,12 +220,17 @@ var/global/datum/controller/master/Master = new CRASH("Attempted to set invalid runlevel: [new_runlevel]") // Starts the mc, and sticks around to restart it if the loop ever ends. +var/global/_announced_start = FALSE /datum/controller/master/proc/StartProcessing(delay) set waitfor = 0 if(delay) sleep(delay) report_progress("Master starting processing") - SSwebhooks.send(WEBHOOK_ROUNDPREP, list("map" = station_name(), "url" = get_world_url())) + + if(!global._announced_start) // Only announce roundstart once. + SSwebhooks.send(WEBHOOK_ROUNDPREP, list("map" = station_name(), "url" = get_world_url())) + global._announced_start = TRUE + var/rtn = Loop() if (rtn > 0 || processing < 0) return //this was suppose to happen. diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm index 4da8abb538d..92e3271df80 100644 --- a/code/controllers/subsystems/air.dm +++ b/code/controllers/subsystems/air.dm @@ -138,7 +138,13 @@ SUBSYSTEM_DEF(air) if(!SHOULD_PARTICIPATE_IN_ZONES(T)) continue simulated_turf_count++ + // We also skip anything already queued, since it'll be settled when fire() runs anyway. + if(T.needs_air_update) + continue T.update_air_properties() + // air state is necessarily globally incomplete during this + // so we can't do T.post_update_air_properties(), which needs + // connections to have been settled already. CHECK_TICK report_progress({"Total Simulated Turfs: [simulated_turf_count] @@ -198,7 +204,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun T.update_air_properties() T.post_update_air_properties() - T.needs_air_update = 0 + T.needs_air_update = FALSE #ifdef ZASDBG T.remove_vis_contents(zasdbgovl_mark) #endif @@ -214,7 +220,7 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun T.update_air_properties() T.post_update_air_properties() - T.needs_air_update = 0 + T.needs_air_update = FALSE #ifdef ZASDBG T.remove_vis_contents(zasdbgovl_mark) #endif @@ -368,13 +374,15 @@ Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_coun #ifdef ZASDBG ASSERT(isturf(T)) #endif - if(T.needs_air_update) + // don't queue us if we've already been queued + // and if SSair hasn't run, every turf in the world will get updated soon anyway + if(T.needs_air_update || !SSair.initialized) return tiles_to_update += T #ifdef ZASDBG T.add_vis_contents(zasdbgovl_mark) #endif - T.needs_air_update = 1 + T.needs_air_update = TRUE /datum/controller/subsystem/air/proc/mark_zone_update(zone/Z) #ifdef ZASDBG diff --git a/code/controllers/subsystems/ambience.dm b/code/controllers/subsystems/ambience.dm index ad9d2a1c52b..8f4b462e205 100644 --- a/code/controllers/subsystems/ambience.dm +++ b/code/controllers/subsystems/ambience.dm @@ -33,6 +33,14 @@ SUBSYSTEM_DEF(ambience) /// Whether this turf has been queued for an ambient lighting update. var/ambience_queued = FALSE +/turf/proc/shows_outdoor_ambience() + return is_outside() + +// Starlight can't be blocked by stuff above a space turf. +// TODO: decide if open sky deserves the same treatment +/turf/space/shows_outdoor_ambience() + return TRUE + /turf/proc/update_ambient_light_from_z_or_area() // If we're not outside, we don't show ambient light. @@ -40,7 +48,7 @@ SUBSYSTEM_DEF(ambience) var/ambient_light_modifier // If we're indoors because of our area, OR we're outdoors and not exposed to the weather, get interior ambience. - var/outsideness = is_outside() + var/outsideness = shows_outdoor_ambience() if((!outsideness && is_outside == OUTSIDE_AREA) || (outsideness && get_weather_exposure() != WEATHER_EXPOSED)) var/area/A = get_area(src) if(isnull(A?.interior_ambient_light_modifier)) @@ -63,10 +71,23 @@ SUBSYSTEM_DEF(ambience) // Grab what we need to set ambient light from our level handler. var/datum/level_data/level_data = SSmapping.levels_by_z[z] + var/daycycle_id = level_data.daycycle_id + // if we don't have a daycycle ourselves, and we're indoors because of a turf blocking us + // find the first daycycle above us to use + if(!outsideness && !daycycle_id && HasAbove(z)) + var/turf/above = src + var/datum/level_data/above_level_data + while ((above = GetAbove(above))) + if((above.z_flags & ZM_TERMINATOR) || !HasAbove(above.z)) + break + above_level_data = SSmapping.levels_by_z[above.z] + if(above_level_data.daycycle_id) + daycycle_id = above_level_data.daycycle_id + break // Check for daycycle ambience. - if(level_data.daycycle_id) - var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(level_data.daycycle_id) + if(daycycle_id) + var/datum/daycycle/daycycle = SSdaycycle.get_daycycle(daycycle_id) var/new_power = daycycle?.current_period?.power if(!isnull(new_power)) if(new_power > 0) diff --git a/code/controllers/subsystems/atoms.dm b/code/controllers/subsystems/atoms.dm index 6e45e5e274b..baf065bd0fd 100644 --- a/code/controllers/subsystems/atoms.dm +++ b/code/controllers/subsystems/atoms.dm @@ -11,8 +11,10 @@ SUBSYSTEM_DEF(atoms) var/atom_init_stage = INITIALIZATION_INSSATOMS var/old_init_stage - var/list/late_loaders + /// A non-associative list of lists, with the format list(list(atom, list(Initialize arguments))). var/list/created_atoms = list() + /// A non-associative list of lists, with the format list(list(atom, list(LateInitialize arguments))). + var/list/late_loaders = list() var/list/BadInitializeCalls = list() @@ -22,21 +24,25 @@ SUBSYSTEM_DEF(atoms) return ..() /datum/controller/subsystem/atoms/proc/InitializeAtoms() - if(atom_init_stage <= INITIALIZATION_INSSATOMS_LATE) + if(atom_init_stage <= INITIALIZATION_INSSATOMS) return atom_init_stage = INITIALIZATION_INNEW_MAPLOAD - LAZYINITLIST(late_loaders) - var/list/mapload_arg = list(TRUE) - var/count = created_atoms.len - while(created_atoms.len) - var/atom/A = created_atoms[created_atoms.len] - var/list/atom_args = created_atoms[A] - created_atoms.len-- - if(!QDELETED(A) && !(A.atom_flags & ATOM_FLAG_INITIALIZED)) + var/index = 1 + // Things can add to the end of this list while we iterate, so we can't use a for loop. + while(index <= length(created_atoms)) + // Don't remove from this list while we run, that's expensive. + // That would also make it harder to handle things added while we iterate. + var/list/creation_packet = created_atoms[index++] + var/atom/A = creation_packet[1] + var/list/atom_args = creation_packet[2] + // I sure hope nothing in this list is ever hard-deleted, or else QDELING will runtime. + // If you get a null reference runtime error, just change it back to QDELETED. + // The ATOM_FLAG_INITIALIZED check is because of INITIALIZE_IMMEDIATE(). + if(!QDELING(A) && !(A.atom_flags & ATOM_FLAG_INITIALIZED)) if(atom_args) atom_args.Insert(1, TRUE) InitAtom(A, atom_args) @@ -44,26 +50,19 @@ SUBSYSTEM_DEF(atoms) InitAtom(A, mapload_arg) CHECK_TICK - // If wondering why not just store all atoms in created_atoms and use the block above: that turns out unbearably expensive. - // Instead, atoms without extra arguments in New created on server start are fished out of world directly. - // We do this exactly once. - if(!initialized) - for(var/atom/A in world) - if(!QDELETED(A) && !(A.atom_flags & ATOM_FLAG_INITIALIZED)) - InitAtom(A, mapload_arg) - ++count - CHECK_TICK - - report_progress("Initialized [count] atom\s") + report_progress("Initialized [index] atom\s") + created_atoms.Cut() atom_init_stage = INITIALIZATION_INNEW_REGULAR - if(late_loaders.len) - for(var/I in late_loaders) - var/atom/A = I - A.LateInitialize(arglist(late_loaders[A])) + if(length(late_loaders)) + index = 1 + while(index <= length(late_loaders)) + var/list/creation_packet = late_loaders[index++] + var/atom/A = creation_packet[1] + A.LateInitialize(arglist(creation_packet[2])) CHECK_TICK - report_progress("Late initialized [late_loaders.len] atom\s") + report_progress("Late initialized [index] atom\s") late_loaders.Cut() /datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) @@ -91,7 +90,7 @@ SUBSYSTEM_DEF(atoms) EMPTY_BLOCK_GUARD if(INITIALIZE_HINT_LATELOAD) if(arguments[1]) //mapload - late_loaders[A] = arguments + late_loaders[++late_loaders.len] = list(A, arguments) else A.LateInitialize(arglist(arguments)) if(INITIALIZE_HINT_QDEL) @@ -113,7 +112,7 @@ SUBSYSTEM_DEF(atoms) /datum/controller/subsystem/atoms/proc/map_loader_begin() old_init_stage = atom_init_stage - atom_init_stage = INITIALIZATION_INSSATOMS_LATE + atom_init_stage = INITIALIZATION_INSSATOMS /datum/controller/subsystem/atoms/proc/map_loader_stop() atom_init_stage = old_init_stage diff --git a/code/controllers/subsystems/fluids.dm b/code/controllers/subsystems/fluids.dm index 1e95a63bf46..0b9faea243e 100644 --- a/code/controllers/subsystems/fluids.dm +++ b/code/controllers/subsystems/fluids.dm @@ -231,13 +231,21 @@ SUBSYSTEM_DEF(fluids) if(!istype(current_fluid_holder) || QDELETED(current_fluid_holder)) continue var/pushed_something = FALSE - if(current_fluid_holder.reagents?.total_volume > FLUID_SHALLOW && current_fluid_holder.last_flow_strength >= 10) - for(var/atom/movable/AM as anything in current_fluid_holder.get_contained_external_atoms()) - if(AM.is_fluid_pushable(current_fluid_holder.last_flow_strength)) - AM.pushed(current_fluid_holder.last_flow_dir) - pushed_something = TRUE - if(pushed_something && prob(1)) - playsound(current_fluid_holder, 'sound/effects/slosh.ogg', 25, 1) + + if(current_fluid_holder.last_flow_strength >= 10) + // Catwalks mean items will be above the turf; subtract the turf height from our volume. + // TODO: somehow handle stuff that is on a catwalk or on the turf within the same turf. + var/effective_volume = current_fluid_holder.reagents?.total_volume + if(current_fluid_holder.get_supporting_platform()) + // Depth is negative height, hence +=. TODO: positive heights? No idea how to handle that. + effective_volume += current_fluid_holder.get_physical_height() + if(effective_volume > FLUID_SHALLOW) + for(var/atom/movable/AM as anything in current_fluid_holder.get_contained_external_atoms()) + if(AM.try_fluid_push(effective_volume, current_fluid_holder.last_flow_strength)) + AM.pushed(current_fluid_holder.last_flow_dir) + pushed_something = TRUE + if(pushed_something && prob(1)) + playsound(current_fluid_holder, 'sound/effects/slosh.ogg', 25, 1) if(MC_TICK_CHECK) processing_flows.Cut(1, i+1) return diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm index 47c1be9e245..ac728a55ea2 100644 --- a/code/controllers/subsystems/garbage.dm +++ b/code/controllers/subsystems/garbage.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(garbage) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY init_order = SS_INIT_GARBAGE - var/list/collection_timeout = list(0, 3 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level + var/list/collection_timeout = list(GC_FILTER_QUEUE, GC_CHECK_QUEUE, GC_DEL_QUEUE) // deciseconds to wait before moving something up in the queue to the next level //Stat tracking var/delslasttick = 0 // number of del()'s we've done this tick @@ -37,7 +37,7 @@ SUBSYSTEM_DEF(garbage) //Queue var/list/queues - #ifdef TESTING + #ifdef REFTRACKING_ENABLED var/list/reference_find_on_fail = list() #endif @@ -130,30 +130,33 @@ SUBSYSTEM_DEF(garbage) lastlevel = level +// 1 from the hard reference in the queue, and 1 from `D` in the code below +#define REFS_WE_EXPECT 2 + //We do this rather then for(var/refID in queue) because that sort of for loop copies the whole list. //Normally this isn't expensive, but the gc queue can grow to 40k items, and that gets costly/causes overrun. - for (var/refidx in 1 to length(queue)) - var/refID = queue[refidx] - if (isnull(refID)) + for (var/i in 1 to length(queue)) + var/list/L = queue[i] + if (length(L) < GC_QUEUE_ITEM_INDEX_COUNT) count++ if (MC_TICK_CHECK) return continue - var/GCd_at_time = queue[refID] - if(GCd_at_time > cut_off_time) + var/queued_at_time = L[GC_QUEUE_ITEM_QUEUE_TIME] + if(queued_at_time > cut_off_time) break // Everything else is newer, skip them count++ - var/datum/D - D = locate(refID) + var/datum/D = L[GC_QUEUE_ITEM_REF] - if (isnull(D) || D.gc_destroyed != GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake + // If that's all we've got, send er off + if (refcount(D) == REFS_WE_EXPECT) ++gcedlasttick ++totalgcs pass_counts[level]++ - #ifdef TESTING - reference_find_on_fail -= refID //It's deleted we don't care anymore. + #ifdef REFTRACKING_ENABLED + reference_find_on_fail -= ref(D) //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) return @@ -161,14 +164,19 @@ SUBSYSTEM_DEF(garbage) // Something's still referring to the qdel'd object. fail_counts[level]++ + switch (level) if (GC_QUEUE_CHECK) - #ifdef TESTING + #ifdef REFTRACKING_ENABLED + // Decides how many refs to look for (potentially) + // Based off the remaining and the ones we can account for + var/remaining_refs = refcount(D) - REFS_WE_EXPECT + var/refID = ref(D) if(reference_find_on_fail[refID]) - D.find_references() + INVOKE_ASYNC(D, TYPE_PROC_REF(/datum, find_references), remaining_refs) #ifdef GC_FAILURE_HARD_LOOKUP else - D.find_references() + INVOKE_ASYNC(D, TYPE_PROC_REF(/datum, find_references), remaining_refs) #endif reference_find_on_fail -= refID #endif @@ -196,17 +204,17 @@ SUBSYSTEM_DEF(garbage) /datum/controller/subsystem/garbage/proc/Queue(datum/D, level = GC_QUEUE_FILTER) if (isnull(D)) return - if (D.gc_destroyed == GC_QUEUED_FOR_HARD_DEL) - level = GC_QUEUE_HARDDELETE if (level > GC_QUEUE_COUNT) HardDelete(D) return - var/gctime = world.time - var/refid = "\ref[D]" + var/queue_time = world.time - D.gc_destroyed = gctime + if(D.gc_destroyed <= 0) // hasn't been queued yet, or is queued for harddel/actively being qdeleted + D.gc_destroyed = queue_time var/list/queue = queues[level] - queue[refid] = gctime + // not += for byond reasons + // we include D.gc_destroyed to skip things under the cutoff + queue[++queue.len] = list(queue_time, D, D.gc_destroyed) //this is mainly to separate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/D) @@ -240,11 +248,6 @@ SUBSYSTEM_DEF(garbage) message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") postpone(time) -/datum/controller/subsystem/garbage/proc/HardQueue(datum/D) - if (D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) - queues[GC_QUEUE_FILTER] += D - D.gc_destroyed = GC_QUEUED_FOR_HARD_DEL - /datum/controller/subsystem/garbage/Recover() if (istype(SSgarbage.queues)) for (var/i in 1 to SSgarbage.queues.len) @@ -270,19 +273,19 @@ SUBSYSTEM_DEF(garbage) /datum/qdel_item/New(mytype) name = "[mytype]" -#ifdef TESTING +#ifdef REFTRACKING_ENABLED /proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE) SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE qdel(D, force) #endif -// Should be treated as a replacement for the 'del' keyword. -// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. +/// Should be treated as a replacement for the 'del' keyword. +/// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. +/// Non-datums passed to this will be hard-deleted. /proc/qdel(datum/D, force=FALSE) if(isnull(D)) return if(!istype(D)) - PRINT_STACK_TRACE("qdel() can only handle /datum (sub)types, was passed: [log_info_line(D)]") del(D) return var/datum/qdel_item/I = SSgarbage.items[D.type] @@ -328,7 +331,7 @@ SUBSYSTEM_DEF(garbage) return // Returning LETMELIVE after being told to force destroy // indicates the objects Destroy() does not respect force - #ifdef TESTING + #ifdef REFTRACKING_ENABLED if(!I.no_respect_force) PRINT_STACK_TRACE("WARNING: [D.type] has been force deleted, but is \ returning an immortal QDEL_HINT, indicating it does \ @@ -341,21 +344,22 @@ SUBSYSTEM_DEF(garbage) SSgarbage.Queue(D) if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() GC_CHECK_AM_NULLSPACE(D, "QDEL_HINT_HARDDEL") - SSgarbage.HardQueue(D) + SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) - if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + if (QDEL_HINT_FINDREFERENCE)//qdel will, if REFTRACKING_ENABLED is enabled, display all references to this object, then queue the object for deletion. SSgarbage.Queue(D) - #ifdef TESTING - D.find_references() + #ifdef REFTRACKING_ENABLED + var/remaining_refs = refcount(D) - REFS_WE_EXPECT + D.find_references(remaining_refs) #endif if (QDEL_HINT_IFFAIL_FINDREFERENCE) SSgarbage.Queue(D) - #ifdef TESTING + #ifdef REFTRACKING_ENABLED SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE #endif else - #ifdef TESTING + #ifdef REFTRACKING_ENABLED if(!I.no_hint) PRINT_STACK_TRACE("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") #endif @@ -364,7 +368,7 @@ SUBSYSTEM_DEF(garbage) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") -#ifdef TESTING +#ifdef REFTRACKING_ENABLED /datum/verb/find_refs() set category = "Debug" @@ -378,8 +382,9 @@ SUBSYSTEM_DEF(garbage) return find_references() -/datum/proc/find_references() +/datum/proc/find_references(references_to_clear = INFINITY) running_find_references = type + src.references_to_clear = references_to_clear if(usr && usr.client) if(usr.client.running_find_references) testing("CANCELLED search for references to a [usr.client.running_find_references].") @@ -406,13 +411,19 @@ SUBSYSTEM_DEF(garbage) normal_globals[global_var] = global.vars[global_var] DoSearchVar(normal_globals, "(global) -> ") //globals testing("Finished searching globals") + if(src.references_to_clear == 0) // Found all expected references! + return for(var/atom/atom_thing) //atoms DoSearchVar(atom_thing, "World -> [atom_thing]") + if(src.references_to_clear == 0) // Found all expected references! + return testing("Finished searching atoms") for (var/datum/datum_thing) //datums DoSearchVar(datum_thing, "World -> [datum_thing]") + if(src.references_to_clear == 0) // Found all expected references! + return testing("Finished searching datums") #ifndef FIND_REF_SKIP_CLIENTS @@ -420,6 +431,8 @@ SUBSYSTEM_DEF(garbage) // IT WILL CRASH!!! for (var/client/client_thing) //clients DoSearchVar(client_thing, "World -> [client_thing]") + if(src.references_to_clear == 0) // Found all expected references! + return testing("Finished searching clients") #endif @@ -455,10 +468,13 @@ SUBSYSTEM_DEF(garbage) #define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) ) #define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST) -/datum/proc/DoSearchVar(X, Xname, recursive_limit = 128) +/datum/proc/DoSearchVar(X, container_name, recursive_limit = 128) if(usr && usr.client && !usr.client.running_find_references) return if (!recursive_limit) + testing("Recursion limit reached. [container_name]") + return + if(references_to_clear == 0) return #ifndef FIND_REF_NO_CHECK_TICK @@ -466,26 +482,34 @@ SUBSYSTEM_DEF(garbage) #endif if(istype(X, /datum)) - var/datum/D = X - if(D.last_find_references == last_find_references) + var/datum/datum_container = X + if(datum_container.last_find_references == last_find_references) return - D.last_find_references = last_find_references - var/list/L = D.vars + datum_container.last_find_references = last_find_references + var/list/vars_list = datum_container.vars - for(var/varname in L) + var/is_atom = FALSE + var/is_area = FALSE + if(isatom(datum_container)) + is_atom = TRUE + if(isarea(datum_container)) + is_area = TRUE + for(var/varname in vars_list) #ifndef FIND_REF_NO_CHECK_TICK CHECK_TICK #endif - if (varname == "vars") + //Fun fact, vis_locs don't count for references + if(varname == "vars" || (is_atom && (varname == "vis_locs" || varname == "overlays" || varname == "underlays" || varname == "filters" || varname == "verbs" || (is_area && varname == "contents")))) continue - var/variable = L[varname] + var/variable = vars_list[varname] if(variable == src) - testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") + testing("Found [src.type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]") + references_to_clear -= 1 else if(islist(variable)) - DoSearchVar(variable, "[Xname] -> [varname] (list)", recursive_limit-1) + DoSearchVar(variable, "[container_name] -> [varname] (list)", recursive_limit-1) else if(islist(X)) var/normal = IS_NORMAL_LIST(X) @@ -494,16 +518,37 @@ SUBSYSTEM_DEF(garbage) CHECK_TICK #endif if (I == src) - testing("Found [src.type] \ref[src] in list [Xname].") + testing("Found [src.type] \ref[src] in list [container_name].") + + // This is dumb as hell I'm sorry + // I don't want the garbage subsystem to count as a ref for the purposes of this number + // If we find all other refs before it I want to early exit, and if we don't I want to keep searching past it + var/ignore_ref = FALSE + var/list/queues = SSgarbage.queues + for(var/list/queue in queues) + if(X in queue) + ignore_ref = TRUE + break + if(ignore_ref) + testing("[container_name] does not count as a ref for our count") + else + references_to_clear -= 1 + if(references_to_clear == 0) + testing("All references to [type] \ref[src] found, exiting.") + return else if (I && !isnum(I) && normal) if(X[I] == src) - testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]") + testing("Found [src.type] \ref[src] in list [container_name]\[[I]\]") + references_to_clear -= 1 + if(references_to_clear == 0) + testing("All references to [type] \ref[src] found, exiting.") + return else if(islist(X[I])) - DoSearchVar(X[I], "[Xname]\[[I]\]", recursive_limit-1) + DoSearchVar(X[I], "[container_name]\[[I]\]", recursive_limit-1) else if (islist(I)) var/list/Xlist = X - DoSearchVar(I, "[Xname]\[[Xlist.Find(I)]\] -> list", recursive_limit-1) + DoSearchVar(I, "[container_name]\[[Xlist.Find(I)]\] -> list", recursive_limit-1) #endif diff --git a/code/controllers/subsystems/holomap.dm b/code/controllers/subsystems/holomap.dm index 566e9ccb218..ac6662184f6 100644 --- a/code/controllers/subsystems/holomap.dm +++ b/code/controllers/subsystems/holomap.dm @@ -81,7 +81,7 @@ SUBSYSTEM_DEF(minimap) continue if((tile.turf_flags & TURF_IS_HOLOMAP_OBSTACLE) || (locate(/obj/structure/grille) in tile)) canvas.DrawBox(COLOR_HOLOMAP_OBSTACLE, tile.x + offset_x, tile.y + offset_y) - else if((tile.turf_flags & TURF_IS_HOLOMAP_PATH) || (locate(/obj/structure/catwalk) in tile)) + else if((tile.turf_flags & TURF_IS_HOLOMAP_PATH) || tile.get_supporting_platform()) canvas.DrawBox(COLOR_HOLOMAP_PATH, tile.x + offset_x, tile.y + offset_y) CHECK_TICK return canvas diff --git a/code/controllers/subsystems/initialization/character_info.dm b/code/controllers/subsystems/initialization/character_info.dm index cb09b69f361..a874ddcb4f9 100644 --- a/code/controllers/subsystems/initialization/character_info.dm +++ b/code/controllers/subsystems/initialization/character_info.dm @@ -136,7 +136,7 @@ SUBSYSTEM_DEF(character_info) fdel(dump_file_name) text2file(JOINTEXT(SScharacter_info.get_character_manifest_html(apply_striping = FALSE)), dump_file_name) if(fexists(dump_file_name)) - direct_output(usr, ftp(dump_file_name, "dump_manifest.html")) + ftp_to(usr, dump_file_name, "dump_manifest.html") return TOPIC_HANDLED catch(var/exception/E) log_debug("Exception when dumping character relationship manifest: [E]") diff --git a/code/controllers/subsystems/initialization/fabrication.dm b/code/controllers/subsystems/initialization/fabrication.dm index e383f77a1c4..37a6d57dfae 100644 --- a/code/controllers/subsystems/initialization/fabrication.dm +++ b/code/controllers/subsystems/initialization/fabrication.dm @@ -33,6 +33,9 @@ SUBSYSTEM_DEF(fabrication) var/list/all_crafting_handlers = decls_repository.get_decls_of_subtype(/decl/crafting_stage) for(var/hid in all_crafting_handlers) var/decl/crafting_stage/handler = all_crafting_handlers[hid] + // TODO: revisit this if map tech level can be mutated at runtime + if(global.using_map.map_tech_level < handler.available_to_map_tech_level) + continue if(ispath(handler.begins_with_object_type)) LAZYDISTINCTADD(crafting_procedures_by_type[handler.begins_with_object_type], handler) diff --git a/code/controllers/subsystems/initialization/modpacks.dm b/code/controllers/subsystems/initialization/modpacks.dm index 4e3819c4b56..f2f6c65a2e6 100644 --- a/code/controllers/subsystems/initialization/modpacks.dm +++ b/code/controllers/subsystems/initialization/modpacks.dm @@ -7,6 +7,7 @@ SUBSYSTEM_DEF(modpacks) // Compiled modpack information. var/list/default_submap_whitelisted_species = list() var/list/default_submap_blacklisted_species = list(SPECIES_ALIEN, SPECIES_GOLEM) + var/list/modpack_nanoui_directories = list() /datum/controller/subsystem/modpacks/Initialize() var/list/all_modpacks = decls_repository.get_decls_of_subtype(/decl/modpack) @@ -40,7 +41,7 @@ SUBSYSTEM_DEF(modpacks) // Update compiled infolists and apply. default_submap_whitelisted_species |= global.using_map.default_species - for(var/decl/submap_archetype/submap in decls_repository.get_decls_of_type_unassociated(/decl/submap_archetype)) + for(var/decl/submap_archetype/submap in global.using_map.get_available_submap_archetypes()) if(islist(submap.whitelisted_species) && !length(submap.whitelisted_species)) submap.whitelisted_species |= SSmodpacks.default_submap_whitelisted_species if(islist(submap.blacklisted_species) && !length(submap.blacklisted_species)) diff --git a/code/controllers/subsystems/initialization/webhooks.dm b/code/controllers/subsystems/initialization/webhooks.dm index 14c560979d4..c773998c9ba 100644 --- a/code/controllers/subsystems/initialization/webhooks.dm +++ b/code/controllers/subsystems/initialization/webhooks.dm @@ -46,6 +46,9 @@ SUBSYSTEM_DEF(webhooks) else to_world_log("Failed to set up webhook [wid].") +/datum/controller/subsystem/webhooks/proc/is_webhook_configured(wid) + return isnull(webhook_decls[wid]) + /datum/controller/subsystem/webhooks/proc/send(var/wid, var/wdata) var/decl/webhook/webhook = webhook_decls[wid] if(webhook) @@ -88,7 +91,3 @@ SUBSYSTEM_DEF(webhooks) log_and_message_admins("has pinged webhook [choice].", usr) to_world_log("[usr.key] has pinged webhook [choice].") webhook.send() - -/hook/roundstart/proc/run_webhook() - SSwebhooks.send(WEBHOOK_ROUNDSTART, list("url" = get_world_url())) - return 1 diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index b900dcf8c32..28244f810e9 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -45,9 +45,9 @@ SUBSYSTEM_DEF(jobs) // Create abstract submap archetype jobs for use in prefs, etc. archetype_job_datums.Cut() - var/list/submap_archetypes = decls_repository.get_decls_of_subtype(/decl/submap_archetype) - for(var/atype in submap_archetypes) - var/decl/submap_archetype/arch = submap_archetypes[atype] + var/list/submap_archetypes = list() + for(var/decl/submap_archetype/arch as anything in global.using_map.get_available_submap_archetypes()) + submap_archetypes += arch for(var/jobtype in arch.crew_jobs) var/datum/job/job = get_by_path(jobtype) if(!job && ispath(jobtype, /datum/job/submap)) @@ -57,7 +57,8 @@ SUBSYSTEM_DEF(jobs) job = get_by_path(jobtype) if(job) archetype_job_datums |= job - submap_archetypes = sortTim(submap_archetypes, /proc/cmp_submap_archetype_asc, TRUE) + if(length(submap_archetypes)) + submap_archetypes = sortTim(submap_archetypes, /proc/cmp_submap_archetype_asc) // Load job configuration (is this even used anymore?) if(job_config_file && get_config_value(/decl/config/toggle/load_jobs_from_txt)) @@ -90,16 +91,15 @@ SUBSYSTEM_DEF(jobs) primary_job_datums = sortTim(primary_job_datums, /proc/cmp_job_desc) job_lists_by_map_name = list("[global.using_map.full_name]" = list("jobs" = primary_job_datums, "default_to_hidden" = FALSE)) - for(var/atype in submap_archetypes) + for(var/decl/submap_archetype/arch as anything in submap_archetypes) var/list/submap_job_datums - var/decl/submap_archetype/arch = submap_archetypes[atype] for(var/jobtype in arch.crew_jobs) var/datum/job/job = get_by_path(jobtype) if(job) LAZYADD(submap_job_datums, job) if(LAZYLEN(submap_job_datums)) submap_job_datums = sortTim(submap_job_datums, /proc/cmp_job_desc) - job_lists_by_map_name[arch.descriptor] = list("jobs" = submap_job_datums, "default_to_hidden" = arch.default_to_hidden) + job_lists_by_map_name[arch.name] = list("jobs" = submap_job_datums, "default_to_hidden" = arch.default_to_hidden) // Update global map blacklists and whitelists. for(var/mappath in global.all_maps) @@ -413,7 +413,7 @@ SUBSYSTEM_DEF(jobs) /decl/loadout_option/proc/is_permitted(mob/living/wearer, datum/job/job) if(!istype(wearer)) return FALSE - if(allowed_roles && !(job.type in allowed_roles)) + if(allowed_roles && (!job || !(job.type in allowed_roles))) return FALSE if(allowed_branches) if(!ishuman(wearer)) @@ -441,7 +441,7 @@ SUBSYSTEM_DEF(jobs) var/decl/loadout_option/G = decls_repository.get_decl_by_id_or_var(thing, /decl/loadout_option) if(!istype(G)) continue - if(!G.is_permitted(H)) + if(!G.is_permitted(H, job)) to_chat(H, SPAN_WARNING("Your current species, job, branch, skills or whitelist status does not permit you to spawn with [thing]!")) continue if(!G.slot || !G.spawn_on_mob(H, H.client.prefs.Gear()[G.uid])) diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index daf0a7a44df..61f8b083a33 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -40,17 +40,12 @@ SUBSYSTEM_DEF(lighting) ) ..(out.Join()) -#ifdef USE_INTELLIGENT_LIGHTING_UPDATES - -/hook/roundstart/proc/lighting_init_roundstart() - SSlighting.handle_roundstart() - return TRUE - +// If intelligent updates are off, this is just an empty stub. /datum/controller/subsystem/lighting/proc/handle_roundstart() +#ifdef USE_INTELLIGENT_LIGHTING_UPDATES force_queued = FALSE total_ss_updates = 0 total_instant_updates = 0 - #endif /datum/controller/subsystem/lighting/Initialize(timeofday) @@ -59,7 +54,12 @@ SUBSYSTEM_DEF(lighting) // Generate overlays. for (var/zlevel = 1 to world.maxz) - overlaycount += InitializeZlev(zlevel) + var/datum/level_data/level = SSmapping.levels_by_z[zlevel] + for (var/turf/tile as anything in block(1, 1, zlevel, level.level_max_width, level.level_max_height)) // include TRANSITIONEDGE turfs + if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(tile)) + tile.lighting_build_overlay() + overlaycount++ + CHECK_TICK admin_notice(SPAN_DANGER("Created [overlaycount] lighting overlays in [(REALTIMEOFDAY - starttime)/10] seconds."), R_DEBUG) @@ -76,26 +76,6 @@ SUBSYSTEM_DEF(lighting) ..() -/datum/controller/subsystem/lighting/proc/InitializeZlev(zlev) - for (var/thing in Z_ALL_TURFS(zlev)) - var/turf/T = thing - if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(T) && !T.lighting_overlay) // Can't assume that one hasn't already been created on bay/neb. - new /atom/movable/lighting_overlay(T) - . += 1 - if (T.ambient_light) - T.generate_missing_corners() // Forcibly generate corners. - - CHECK_TICK - -// It's safe to pass a list of non-turfs to this list - it'll only check turfs. -/datum/controller/subsystem/lighting/proc/InitializeTurfs(list/targets) - for (var/turf/T in (targets || world)) - if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) - T.lighting_build_overlay() - - // If this isn't here, BYOND will set-background us. - CHECK_TICK - /datum/controller/subsystem/lighting/fire(resumed = FALSE, no_mc_tick = FALSE) if (!resumed) processed_lights = 0 diff --git a/code/controllers/subsystems/machines.dm b/code/controllers/subsystems/machines.dm index 48d7b425037..674ec094cc6 100644 --- a/code/controllers/subsystems/machines.dm +++ b/code/controllers/subsystems/machines.dm @@ -82,6 +82,12 @@ if(current_step == this_step || (check_resumed && !resumed)) {\ #undef INTERNAL_PROCESS_STEP +/datum/controller/subsystem/machines/StartLoadingMap() + suspend() + +/datum/controller/subsystem/machines/StopLoadingMap() + wake() + // rebuild all power networks from scratch - only called at world creation or by the admin verb // The above is a lie. Turbolifts also call this proc. /datum/controller/subsystem/machines/proc/makepowernets() diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index ecc1ad88b1e..cdba384cdf8 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -109,6 +109,8 @@ SUBSYSTEM_DEF(mapping) // Load any queued map template markers. for(var/obj/abstract/landmark/map_load_mark/queued_mark in queued_markers) queued_mark.load_subtemplate() + if(!QDELETED(queued_mark)) // for if the tile that lands on the landmark is a no-op tile + qdel(queued_mark) queued_markers.Cut() // Populate overmap. @@ -119,15 +121,9 @@ SUBSYSTEM_DEF(mapping) // This needs to be non-null even if the overmap isn't created for this map. overmap_event_handler = GET_DECL(/decl/overmap_event_handler) - var/old_maxz - for(var/z = 1 to world.maxz) - var/datum/level_data/level = levels_by_z[z] - if(!istype(level)) - level = new /datum/level_data/space(z) - PRINT_STACK_TRACE("Missing z-level data object for z[num2text(z)]!") - level.setup_level_data() + setup_data_for_levels() - old_maxz = world.maxz + var/old_maxz = world.maxz // Build away sites. global.using_map.build_away_sites() global.using_map.build_planets() @@ -150,13 +146,7 @@ SUBSYSTEM_DEF(mapping) test_load_map_templates() #endif - // Check/associated/setup our level data objects. - for(var/z = old_maxz + 1 to world.maxz) - var/datum/level_data/level = levels_by_z[z] - if(!istype(level)) - level = new /datum/level_data/space(z) - PRINT_STACK_TRACE("Missing z-level data object for z[num2text(z)]!") - level.setup_level_data() + setup_data_for_levels(min_z = old_maxz + 1) // 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) @@ -166,6 +156,14 @@ SUBSYSTEM_DEF(mapping) . = ..() +/datum/controller/subsystem/mapping/proc/setup_data_for_levels(min_z = 1, max_z = world.maxz) + for(var/z = min_z to max_z) + var/datum/level_data/level = levels_by_z[z] + if(!istype(level)) + level = new /datum/level_data/space(z) + PRINT_STACK_TRACE("Missing z-level data object for z[num2text(z)]!") + level.setup_level_data() + /datum/controller/subsystem/mapping/Recover() flags |= SS_NO_INIT map_templates = SSmapping.map_templates @@ -198,7 +196,7 @@ SUBSYSTEM_DEF(mapping) . = list() for(var/template_type in subtypesof(/datum/map_template)) var/datum/map_template/template = template_type - if(!TYPE_IS_ABSTRACT(template) && initial(template.template_parent_type) != template_type && initial(template.name)) + if(!TYPE_IS_ABSTRACT(template)) . += new template_type(type) // send name as a param to catch people doing illegal ad hoc creation /datum/controller/subsystem/mapping/proc/get_template(var/template_name) @@ -426,7 +424,3 @@ SUBSYSTEM_DEF(mapping) if(!P) continue P.begin_processing() - -/hook/roundstart/proc/start_processing_all_planets() - SSmapping.start_processing_all_planets() - return TRUE diff --git a/code/controllers/subsystems/mob_ai/auto_movement.dm b/code/controllers/subsystems/mob_ai/auto_movement.dm index 7e2990c1cb8..843f37ab2d0 100644 --- a/code/controllers/subsystems/mob_ai/auto_movement.dm +++ b/code/controllers/subsystems/mob_ai/auto_movement.dm @@ -51,5 +51,8 @@ SUBSYSTEM_DEF(automove) if(controller.handle_mover(mover, moving_metadata[mover]) == PROCESS_KILL && !QDELETED(mover)) mover.stop_automove() if(MC_TICK_CHECK) - processing_atoms.Cut(1, i+1) + if(i >= length(processing_atoms)) + processing_atoms.Cut() + else + processing_atoms.Cut(1, i+1) return diff --git a/code/controllers/subsystems/overlays.dm b/code/controllers/subsystems/overlays.dm index 42e919ae980..88650811392 100644 --- a/code/controllers/subsystems/overlays.dm +++ b/code/controllers/subsystems/overlays.dm @@ -209,7 +209,7 @@ SUBSYSTEM_DEF(overlays) if(cut_old) our_overlays = cached_other.Copy() else - our_overlays |= cached_other + LAZYDISTINCTADD(our_overlays, cached_other) if(NOT_QUEUED_ALREADY) QUEUE_FOR_COMPILE else if(cut_old) diff --git a/code/controllers/subsystems/processing/overmap.dm b/code/controllers/subsystems/overmap.dm similarity index 100% rename from code/controllers/subsystems/processing/overmap.dm rename to code/controllers/subsystems/overmap.dm diff --git a/code/controllers/subsystems/pathfinding.dm b/code/controllers/subsystems/pathfinding.dm new file mode 100644 index 00000000000..d6e63f4191f --- /dev/null +++ b/code/controllers/subsystems/pathfinding.dm @@ -0,0 +1,123 @@ +SUBSYSTEM_DEF(pathfinding) + name = "Pathfinding" + priority = SS_PRIORITY_PATHFINDING + init_order = SS_INIT_MISC_LATE + wait = 1 + + var/list/pending = list() + var/list/processing = list() + var/list/mover_metadata = list() + + VAR_PRIVATE/static/_default_adjacency_call = TYPE_PROC_REF(/turf, CardinalTurfsWithAccess) + VAR_PRIVATE/static/_default_distance_call = TYPE_PROC_REF(/turf, Distance) + +/atom/movable + var/waiting_for_path + +/atom/movable/proc/path_found(list/path) + SHOULD_CALL_PARENT(TRUE) + waiting_for_path = null + +/atom/movable/proc/path_not_found() + SHOULD_CALL_PARENT(TRUE) + waiting_for_path = null + +/datum/controller/subsystem/pathfinding/proc/dequeue_mover(atom/movable/mover, include_processing = TRUE) + if(!istype(mover)) + return + mover.waiting_for_path = null + pending -= mover + mover_metadata -= mover + if(include_processing) + processing -= mover + +// Hook to allow legacy use of AStar* to reuse the callback refs +/datum/controller/subsystem/pathfinding/proc/find_path_immediate(start, end, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude, check_tick = FALSE) + return find_path_astar(start, end, _default_adjacency_call, _default_distance_call, max_nodes, max_node_depth, min_target_dist, min_node_dist, id, exclude, check_tick) + +/datum/controller/subsystem/pathfinding/proc/enqueue_mover(atom/movable/mover, atom/target, datum/pathfinding_metadata/metadata) + if(!istype(mover) || mover.waiting_for_path) + return FALSE + if(!istype(target)) + return FALSE + pending |= mover + pending[mover] = target + if(istype(metadata)) + mover_metadata[mover] = metadata + mover.waiting_for_path = world.time + return TRUE + +/datum/controller/subsystem/pathfinding/stat_entry(msg) + . = ..("Q:[length(pending)] P:[length(processing)]") + +/datum/controller/subsystem/pathfinding/fire(resumed) + + if(!resumed) + processing = pending?.Copy() + + var/atom/movable/mover + var/atom/target + var/datum/pathfinding_metadata/metadata + var/i = 0 + + while(i < processing.len) + + i++ + mover = processing[i] + target = processing[mover] + metadata = mover_metadata[mover] + dequeue_mover(mover, include_processing = FALSE) + + if(!QDELETED(mover) && !QDELETED(target)) + try_find_path(mover, target, metadata) + + if (MC_TICK_CHECK) + processing.Cut(1, i+1) + return + + processing.Cut() + +/datum/controller/subsystem/pathfinding/proc/try_find_path(atom/movable/mover, atom/target, datum/pathfinding_metadata/metadata, adjacency_call = _default_adjacency_call, distance_call = _default_distance_call) + + var/started_pathing = world.time + mover.waiting_for_path = started_pathing + + var/list/path = find_path_astar( + get_turf(mover), + target, + adjacency_call, + distance_call, + (metadata?.max_nodes || null), + (metadata?.max_node_depth || 250), + metadata?.min_target_dist, + metadata?.min_node_depth, + (metadata?.id || mover.GetIdCard()), + metadata?.obstacle, + check_tick = TRUE + ) + if(mover.waiting_for_path == started_pathing) + if(length(path)) + mover.path_found(path) + else + mover.path_not_found() + +/datum/pathfinding_metadata + var/max_nodes = null + var/max_node_depth = 250 + var/atom/id = null + var/min_target_dist = null + var/min_node_depth = null + var/obstacle = null + +/datum/pathfinding_metadata/New(_max_nodes, _max_node_depth, _id, _min_target_dist, _min_node_depth, _obstacle) + + id = _id + obstacle = _obstacle + max_nodes = _max_nodes + + if(!isnull(_max_node_depth)) + max_node_depth = _max_node_depth + if(!isnull(_min_target_dist)) + min_target_dist = _min_target_dist + if(!isnull(_min_node_depth)) + min_node_depth = _min_node_depth diff --git a/code/controllers/subsystems/processing/nano.dm b/code/controllers/subsystems/processing/nano.dm index dfaae9e7999..dd358012c92 100644 --- a/code/controllers/subsystems/processing/nano.dm +++ b/code/controllers/subsystems/processing/nano.dm @@ -37,11 +37,10 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return /nanoui Returns the found ui, or null if none exists */ /datum/controller/subsystem/processing/nano/proc/get_open_ui(mob/user, src_object, ui_key) - var/src_object_key = "\ref[src_object]" - if (!open_uis[src_object_key] || !open_uis[src_object_key][ui_key]) + if (!open_uis[src_object] || !open_uis[src_object][ui_key]) return - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) if (ui.user == user) return ui @@ -54,12 +53,11 @@ PROCESSING_SUBSYSTEM_DEF(nano) */ /datum/controller/subsystem/processing/nano/proc/update_uis(src_object) . = 0 - var/src_object_key = "\ref[src_object]" - if (!open_uis[src_object_key]) + if (!open_uis[src_object]) return - for (var/ui_key in open_uis[src_object_key]) - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + for (var/ui_key in open_uis[src_object]) + for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) if(ui.src_object && ui.user && ui.src_object.nano_host()) ui.try_update(1) .++ @@ -78,12 +76,11 @@ PROCESSING_SUBSYSTEM_DEF(nano) if (!length(open_uis)) return - var/src_object_key = "\ref[src_object]" - if (!open_uis[src_object_key]) + if (!open_uis[src_object]) return - for (var/ui_key in open_uis[src_object_key]) - for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key]) + for (var/ui_key in open_uis[src_object]) + for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) ui.close() // If it's missing src_object or user, we want to close it even more. .++ @@ -134,9 +131,9 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return nothing */ /datum/controller/subsystem/processing/nano/proc/ui_opened(datum/nanoui/ui) - var/src_object_key = "\ref[ui.src_object]" - LAZYINITLIST(open_uis[src_object_key]) - LAZYDISTINCTADD(open_uis[src_object_key][ui.ui_key], ui) + var/src_object = ui.src_object + LAZYINITLIST(open_uis[src_object]) + LAZYDISTINCTADD(open_uis[src_object][ui.ui_key], ui) LAZYDISTINCTADD(ui.user.open_uis, ui) START_PROCESSING(SSnano, ui) @@ -149,18 +146,18 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return int 0 if no ui was removed, 1 if removed successfully */ /datum/controller/subsystem/processing/nano/proc/ui_closed(var/datum/nanoui/ui) - var/src_object_key = "\ref[ui.src_object]" - if (!open_uis[src_object_key] || !open_uis[src_object_key][ui.ui_key]) + var/src_object = ui.src_object + if (!open_uis[src_object] || !open_uis[src_object][ui.ui_key]) return 0 // wasn't open STOP_PROCESSING(SSnano, ui) if(ui.user) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface) LAZYREMOVE(ui.user.open_uis, ui) - open_uis[src_object_key][ui.ui_key] -= ui - if(!length(open_uis[src_object_key][ui.ui_key])) - open_uis[src_object_key] -= ui.ui_key - if(!length(open_uis[src_object_key])) - open_uis -= src_object_key + open_uis[src_object][ui.ui_key] -= ui + if(!length(open_uis[src_object][ui.ui_key])) + open_uis[src_object] -= ui.ui_key + if(!length(open_uis[src_object])) + open_uis -= src_object return 1 /** diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/processing/plants.dm similarity index 87% rename from code/controllers/subsystems/plants.dm rename to code/controllers/subsystems/processing/plants.dm index a6256b56331..c07b5e9c714 100644 --- a/code/controllers/subsystems/plants.dm +++ b/code/controllers/subsystems/processing/plants.dm @@ -1,11 +1,15 @@ -PROCESSING_SUBSYSTEM_DEF(plants) - name = "Plants" - priority = SS_PRIORITY_PLANTS - runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME - flags = SS_BACKGROUND|SS_POST_FIRE_TIMING - init_order = SS_INIT_PLANTS - wait = 60 +/datum/proc/process_plants() + SHOULD_NOT_SLEEP(TRUE) + return PROCESS_KILL +PROCESSING_SUBSYSTEM_DEF(plants) + name = "Plants" + priority = SS_PRIORITY_PLANTS + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME + flags = SS_BACKGROUND|SS_POST_FIRE_TIMING + init_order = SS_INIT_PLANTS + wait = 1 MINUTE + process_proc = TYPE_PROC_REF(/datum, process_plants) /// Stores generated fruit descs. var/list/product_descs = list() /// All seed data stored here. diff --git a/code/controllers/subsystems/shuttle.dm b/code/controllers/subsystems/shuttle.dm index 7c6b1a07711..77f0d4083cb 100644 --- a/code/controllers/subsystems/shuttle.dm +++ b/code/controllers/subsystems/shuttle.dm @@ -125,13 +125,14 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/initialize_shuttle(var/shuttle_type, var/map_hash, var/list/add_args) var/datum/shuttle/shuttle = shuttle_type - if(initial(shuttle.category) != shuttle_type) - var/list/shuttle_args = list(map_hash) - if(length(add_args)) - shuttle_args += add_args - shuttle = new shuttle(arglist(shuttle_args)) - shuttle_areas |= shuttle.shuttle_area - return shuttle + if(TYPE_IS_ABSTRACT(shuttle)) + return null + var/list/shuttle_args = list(map_hash) + if(length(add_args)) + shuttle_args += add_args + shuttle = new shuttle(arglist(shuttle_args)) + shuttle_areas |= shuttle.shuttle_area + return shuttle /datum/controller/subsystem/shuttle/proc/hook_up_motherships(shuttles_list) for(var/datum/shuttle/S in shuttles_list) diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 4855a9a86c5..89122cad2f9 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -89,7 +89,16 @@ SUBSYSTEM_DEF(ticker) if(job && job.create_record) CreateModularRecord(H) - callHook("roundstart") + // Initialize the roundstart timer + global.round_start_time = world.time + generate_multi_spawn_items() + SSlighting.handle_roundstart() + SSmapping.start_processing_all_planets() + SSwebhooks.send(WEBHOOK_ROUNDSTART, list("url" = get_world_url())) + global.using_map.refresh_lobby_browsers() + for(var/modpack_name in SSmodpacks.loaded_modpacks) + var/decl/modpack/loaded_modpack = SSmodpacks.loaded_modpacks[modpack_name] + loaded_modpack.on_roundstart() spawn(0)//Forking here so we dont have to wait for this to finish mode.post_setup() // Drafts antags who don't override jobs. @@ -102,7 +111,6 @@ SUBSYSTEM_DEF(ticker) global.current_holiday.set_up_holiday() if(!length(global.admins)) - send2adminirc("Round has started with no admins online.") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Round Started (Game ID: [game_id])", "body" = "Round has started with no admins online.")) /datum/controller/subsystem/ticker/proc/playing_tick() @@ -113,7 +121,7 @@ SUBSYSTEM_DEF(ticker) Master.SetRunLevel(RUNLEVEL_POSTGAME) end_game_state = END_GAME_READY_TO_END 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) + if(get_config_value(/decl/config/toggle/allow_map_switching) && get_config_value(/decl/config/toggle/auto_map_vote) && length(global.votable_maps) > 1) SSvote.initiate_vote(/datum/vote/map/end_game, automatic = 1) else if(mode_finished && (end_game_state <= END_GAME_NOT_OVER)) @@ -128,7 +136,6 @@ SUBSYSTEM_DEF(ticker) return if(END_GAME_READY_TO_END) end_game_state = END_GAME_ENDING - callHook("roundend") if (universe_has_ended) if(mode.station_was_nuked) SSstatistics.set_field_details("end_proper","nuke") diff --git a/code/datums/ai/_ai.dm b/code/datums/ai/_ai.dm index fc6101f3129..9c943dadb4f 100644 --- a/code/datums/ai/_ai.dm +++ b/code/datums/ai/_ai.dm @@ -62,6 +62,23 @@ /// Aggressive AI var; defined here for reference without casting. var/try_destroy_surroundings = FALSE + /// Reference to the atom we are targetting. + var/weakref/target_ref + + /// Current path for A* pathfinding. + var/list/executing_path + /// A counter for times we have failed to progress along our path. + var/path_frustration = 0 + /// A list of any obstacles we should path around in future. + var/list/path_obstacles = null + + /// Radius of target scan area when looking for valid targets. Set to 0 to disable target scanning. + var/target_scan_distance = 0 + /// Time tracker for next target scan. + var/next_target_scan_time + /// How long minimum between scans. + var/target_scan_delay = 1 SECOND + /datum/mob_controller/New(var/mob/living/target_body) body = target_body if(expected_type && !istype(body, expected_type)) @@ -71,6 +88,7 @@ /datum/mob_controller/Destroy() LAZYCLEARLIST(_friends) LAZYCLEARLIST(_enemies) + set_target(null) if(is_processing) STOP_PROCESSING(SSmob_ai, src) if(body) @@ -79,12 +97,6 @@ body = null . = ..() -/datum/mob_controller/proc/get_automove_target(datum/automove_metadata/metadata) - return null - -/datum/mob_controller/proc/can_do_automated_move(variant_move_delay) - return body && !body.client - /datum/mob_controller/proc/can_process() if(!body || !body.loc || ((body.client || body.mind) && !(body.status_flags & ENABLE_AI))) return FALSE @@ -111,13 +123,15 @@ // This is the place to actually do work in the AI. /datum/mob_controller/proc/do_process() SHOULD_CALL_PARENT(TRUE) - if(!body || QDELETED(body)) - return FALSE - if(!body.stat) - try_unbuckle() - try_wander() - try_bark() - return TRUE + if(get_stance() != STANCE_BUSY && !QDELETED(body) && !QDELETED(src)) + if(!body.stat) + try_unbuckle() + try_wander() + try_bark() + // Recheck in case we walked into lava or something during wandering. + return get_stance() != STANCE_BUSY && !QDELETED(body) && !QDELETED(src) + return TRUE + return FALSE // The mob will try to unbuckle itself from nets, beds, chairs, etc. /datum/mob_controller/proc/try_unbuckle() @@ -130,16 +144,6 @@ else if(prob(25)) body.visible_message(SPAN_WARNING("\The [body] struggles against \the [body.buckled]!")) - -/datum/mob_controller/proc/get_activity() - return current_activity - -/datum/mob_controller/proc/set_activity(new_activity) - if(current_activity != new_activity) - current_activity = new_activity - return TRUE - return FALSE - // The mob will periodically sit up or step 1 tile in a random direction. /datum/mob_controller/proc/try_wander() //Movement @@ -183,133 +187,17 @@ else if(ispath(do_emote, /decl/emote)) body.emote(do_emote) -/datum/mob_controller/proc/get_target() - return null - -/datum/mob_controller/proc/set_target(atom/new_target) - return - -/datum/mob_controller/proc/find_target() - return - -/datum/mob_controller/proc/valid_target(var/atom/A) - return - -/datum/mob_controller/proc/move_to_target(var/move_only = FALSE) - return - -/datum/mob_controller/proc/stop_wandering() - stop_wander = TRUE - -/datum/mob_controller/proc/resume_wandering() - stop_wander = FALSE - -/datum/mob_controller/proc/set_stance(new_stance) - if(stance != new_stance) - stance = new_stance - return TRUE - return FALSE - -/datum/mob_controller/proc/get_stance() - return stance - -/datum/mob_controller/proc/list_targets(var/dist = 7) - return - -/datum/mob_controller/proc/open_fire() - return - -/datum/mob_controller/proc/startle() - if(QDELETED(body) || body.stat != UNCONSCIOUS) - return - body.set_stat(CONSCIOUS) - if(body.current_posture?.prone) - body.set_posture(/decl/posture/standing) - -/datum/mob_controller/proc/retaliate(atom/source) - SHOULD_CALL_PARENT(TRUE) - if(!istype(body) || body.stat == DEAD) - return FALSE - startle() - if(isliving(source)) - remove_friend(source) - return TRUE - /datum/mob_controller/proc/destroy_surroundings() return -/datum/mob_controller/proc/lose_target() - return - -/datum/mob_controller/proc/lost_target() - return - /datum/mob_controller/proc/handle_death(gibbed) return -/datum/mob_controller/proc/pacify(mob/user) - lose_target() - add_friend(user) - -// General-purpose memorise proc, used by /commanded -/datum/mob_controller/proc/memorise(mob/speaker, message) - return - -// General-purpose memory checking proc, used by /faithful_hound -/datum/mob_controller/proc/check_memory(mob/speaker, message) - return FALSE - /// General-purpose scooping reaction proc, used by /passive. /// Returns TRUE if the scoop should proceed, FALSE if it should be canceled. /datum/mob_controller/proc/scooped_by(mob/initiator) return TRUE -// Enemy tracking - used on /aggressive -/datum/mob_controller/proc/get_enemies() - return _enemies - -/datum/mob_controller/proc/add_enemy(mob/enemy) - if(istype(enemy)) - LAZYDISTINCTADD(_enemies, weakref(enemy)) - -/datum/mob_controller/proc/add_enemies(list/enemies) - for(var/thing in enemies) - if(ismob(thing)) - add_friend(thing) - else if(istype(thing, /weakref)) - LAZYDISTINCTADD(_enemies, thing) - -/datum/mob_controller/proc/remove_enemy(mob/enemy) - LAZYREMOVE(_enemies, weakref(enemy)) - -/datum/mob_controller/proc/set_enemies(list/new_enemies) - _enemies = new_enemies - -/datum/mob_controller/proc/is_enemy(mob/enemy) - . = istype(enemy) && LAZYLEN(_enemies) && (weakref(enemy) in _enemies) - -/datum/mob_controller/proc/clear_enemies() - LAZYCLEARLIST(_enemies) - -// Friend tracking - used on /aggressive. -/datum/mob_controller/proc/get_friends() - return _friends - -/datum/mob_controller/proc/add_friend(mob/friend) - if(istype(friend)) - LAZYDISTINCTADD(_friends, weakref(friend)) - return TRUE - return FALSE - -/datum/mob_controller/proc/remove_friend(mob/friend) - LAZYREMOVE(_friends, weakref(friend)) - -/datum/mob_controller/proc/set_friends(list/new_friends) - _friends = new_friends - -/datum/mob_controller/proc/is_friend(mob/friend) - . = istype(friend) && LAZYLEN(_friends) && (weakref(friend) in _friends) - // By default, randomize the target area a bit to make armor/combat // a bit more dynamic (and avoid constant organ damage to the chest) /datum/mob_controller/proc/update_target_zone() diff --git a/code/datums/ai/_ai_enemies.dm b/code/datums/ai/_ai_enemies.dm new file mode 100644 index 00000000000..cbb7ddf4644 --- /dev/null +++ b/code/datums/ai/_ai_enemies.dm @@ -0,0 +1,35 @@ +// Enemy tracking - used on /aggressive +/datum/mob_controller/proc/get_enemies() + return _enemies + +/datum/mob_controller/proc/add_enemy(mob/enemy) + if(istype(enemy)) + LAZYDISTINCTADD(_enemies, weakref(enemy)) + +/datum/mob_controller/proc/add_enemies(list/enemies) + for(var/thing in enemies) + if(ismob(thing)) + add_friend(thing) + else if(istype(thing, /weakref)) + LAZYDISTINCTADD(_enemies, thing) + +/datum/mob_controller/proc/remove_enemy(mob/enemy) + LAZYREMOVE(_enemies, weakref(enemy)) + +/datum/mob_controller/proc/set_enemies(list/new_enemies) + _enemies = new_enemies + +/datum/mob_controller/proc/is_enemy(mob/enemy) + . = istype(enemy) && LAZYLEN(_enemies) && (weakref(enemy) in _enemies) + +/datum/mob_controller/proc/clear_enemies() + LAZYCLEARLIST(_enemies) + +/datum/mob_controller/proc/retaliate(atom/source) + SHOULD_CALL_PARENT(TRUE) + if(!istype(body) || body.stat == DEAD) + return FALSE + startle() + if(isliving(source)) + remove_friend(source) + return TRUE diff --git a/code/datums/ai/_ai_friends.dm b/code/datums/ai/_ai_friends.dm new file mode 100644 index 00000000000..3cab9046fce --- /dev/null +++ b/code/datums/ai/_ai_friends.dm @@ -0,0 +1,25 @@ +/datum/mob_controller/proc/pacify(mob/user) + lose_target() + add_friend(user) + +// Friend tracking - used on /aggressive. +/datum/mob_controller/proc/get_friends() + return _friends + +/datum/mob_controller/proc/add_friend(mob/friend) + if(istype(friend)) + LAZYDISTINCTADD(_friends, weakref(friend)) + return TRUE + return FALSE + +/datum/mob_controller/proc/remove_friend(mob/friend) + LAZYREMOVE(_friends, weakref(friend)) + +/datum/mob_controller/proc/set_friends(list/new_friends) + _friends = new_friends + +/datum/mob_controller/proc/is_friend(mob/friend) + . = istype(friend) && LAZYLEN(_friends) && (weakref(friend) in _friends) + +/datum/mob_controller/proc/clear_friends() + LAZYCLEARLIST(_friends) diff --git a/code/datums/ai/_ai_memory.dm b/code/datums/ai/_ai_memory.dm new file mode 100644 index 00000000000..f837a58cb8c --- /dev/null +++ b/code/datums/ai/_ai_memory.dm @@ -0,0 +1,7 @@ +// General-purpose memorise proc, used by /commanded +/datum/mob_controller/proc/memorise(mob/speaker, message) + return + +// General-purpose memory checking proc, used by /faithful_hound +/datum/mob_controller/proc/check_memory(mob/speaker, message) + return FALSE diff --git a/code/datums/ai/_ai_pathfinding.dm b/code/datums/ai/_ai_pathfinding.dm new file mode 100644 index 00000000000..e01abaa05ce --- /dev/null +++ b/code/datums/ai/_ai_pathfinding.dm @@ -0,0 +1,29 @@ +/datum/mob_controller/proc/can_do_automated_move(variant_move_delay) + return body && !body.client + +/datum/mob_controller/proc/clear_paths() + clear_path() + +/datum/mob_controller/proc/clear_path() + executing_path = null + body?.stop_automove() + +/datum/mob_controller/proc/get_automove_target(datum/automove_metadata/metadata) + var/turf/move_target = (islist(executing_path) && length(executing_path)) ? executing_path[1] : null + if(!istype(move_target) || QDELETED(move_target)) + clear_path() + return null + return move_target + +/datum/mob_controller/proc/handle_post_automoved(atom/old_loc) + if(!islist(executing_path) || length(executing_path) <= 0) + return + var/turf/body_turf = get_turf(body) + if(!istype(body_turf)) + return + if(executing_path[1] != body_turf) + return + if(length(executing_path) > 1) + executing_path.Cut(1, 2) + else + clear_path() diff --git a/code/datums/ai/_ai_stance.dm b/code/datums/ai/_ai_stance.dm index ca018169811..be3b11f94a7 100644 --- a/code/datums/ai/_ai_stance.dm +++ b/code/datums/ai/_ai_stance.dm @@ -1,30 +1,43 @@ // Stub type for future expansion/logic encapsulation. /decl/mob_controller_stance abstract_type = /decl/mob_controller_stance - /decl/mob_controller_stance/none - /decl/mob_controller_stance/idle - /decl/mob_controller_stance/alert - /decl/mob_controller_stance/attack - /decl/mob_controller_stance/attacking - /decl/mob_controller_stance/tired - /decl/mob_controller_stance/contained - /decl/mob_controller_stance/commanded abstract_type = /decl/mob_controller_stance/commanded - /decl/mob_controller_stance/commanded/stop - /decl/mob_controller_stance/commanded/follow - /decl/mob_controller_stance/commanded/misc - /decl/mob_controller_stance/commanded/heal - /decl/mob_controller_stance/commanded/healing +/decl/mob_controller_stance/busy + +/datum/mob_controller/proc/get_activity() + return current_activity + +/datum/mob_controller/proc/set_activity(new_activity) + if(current_activity != new_activity) + current_activity = new_activity + return TRUE + return FALSE + +/datum/mob_controller/proc/set_stance(new_stance) + if(stance != new_stance) + stance = new_stance + return TRUE + return FALSE + +/datum/mob_controller/proc/get_stance() + return stance + +/datum/mob_controller/proc/startle() + if(QDELETED(body) || body.stat != UNCONSCIOUS) + return + body.set_stat(CONSCIOUS) + if(body.current_posture?.prone) + body.set_posture(/decl/posture/standing) diff --git a/code/datums/ai/_ai_targets.dm b/code/datums/ai/_ai_targets.dm new file mode 100644 index 00000000000..49c5acedb09 --- /dev/null +++ b/code/datums/ai/_ai_targets.dm @@ -0,0 +1,77 @@ +/datum/mob_controller/proc/get_target() + if(isnull(target_ref)) + return null + var/atom/target = target_ref?.resolve() + if(!istype(target) || QDELETED(target)) + set_target(null) + return null + return target + +/datum/mob_controller/proc/set_target(atom/new_target) + var/weakref/new_target_ref = weakref(new_target) + if(target_ref != new_target_ref) + target_ref = new_target_ref + return TRUE + return FALSE + +/datum/mob_controller/proc/find_target() + SHOULD_CALL_PARENT(TRUE) + next_target_scan_time = world.time + target_scan_delay + +/datum/mob_controller/proc/valid_target(var/atom/A) + if(!istype(A)) + return FALSE + if(!A.simulated) + return FALSE + if(A == body) + return FALSE + if(A.invisibility > body.see_invisible) + return FALSE + if(LAZYLEN(_friends) && ismob(A) && (weakref(A) in _friends)) + return FALSE + if(!A.loc) + return FALSE + return TRUE + +/datum/mob_controller/proc/lose_target() + path_frustration = 0 + path_obstacles = null + set_target(null) + lost_target() + +/datum/mob_controller/proc/lost_target() + set_stance(STANCE_IDLE) + body.stop_automove() + +/datum/mob_controller/proc/list_targets() + // By default, we only target designated enemies. + var/list/enemies = get_enemies() + if(!LAZYLEN(enemies)) + return + var/list/possible_targets = get_raw_target_list() + if(!length(possible_targets)) + return + for(var/weakref/enemy in enemies) // Remove all entries that aren't in enemies + var/M = enemy.resolve() + if(M in possible_targets) + LAZYDISTINCTADD(., M) + +/datum/mob_controller/proc/do_target_scan() + . = target_scan_distance > 0 && world.time >= next_target_scan_time + +/datum/mob_controller/proc/move_to_target(var/move_only = FALSE) + return + +/datum/mob_controller/proc/get_raw_target_list() + if(target_scan_distance) + return hearers(body, target_scan_distance)-body + return null + +/datum/mob_controller/proc/get_valid_targets() + . = list() + for(var/target in list_targets(target_scan_distance)) + if(valid_target(target)) + . += target + +/datum/mob_controller/proc/handle_ranged_target(atom/ranged_target) + return FALSE diff --git a/code/datums/ai/_ai_wander.dm b/code/datums/ai/_ai_wander.dm new file mode 100644 index 00000000000..705d3fdcef1 --- /dev/null +++ b/code/datums/ai/_ai_wander.dm @@ -0,0 +1,5 @@ +/datum/mob_controller/proc/stop_wandering() + stop_wander = TRUE + +/datum/mob_controller/proc/resume_wandering() + stop_wander = FALSE diff --git a/code/datums/ai/aggressive.dm b/code/datums/ai/aggressive.dm index 9335610bcde..6c48ef305e5 100644 --- a/code/datums/ai/aggressive.dm +++ b/code/datums/ai/aggressive.dm @@ -2,30 +2,16 @@ stance = STANCE_IDLE stop_wander_when_pulled = FALSE try_destroy_surroundings = TRUE + target_scan_distance = 10 + var/attack_same_faction = FALSE var/only_attack_enemies = FALSE var/break_stuff_probability = 10 - var/weakref/target_ref - -/datum/mob_controller/aggressive/set_target(atom/new_target) - var/weakref/new_target_ref = weakref(new_target) - if(target_ref != new_target_ref) - target_ref = new_target_ref - return TRUE - return FALSE - -/datum/mob_controller/aggressive/get_target() - if(isnull(target_ref)) - return null - var/atom/target = target_ref?.resolve() - if(!istype(target) || QDELETED(target)) - set_target(null) - return null - return target -/datum/mob_controller/aggressive/Destroy() - set_target(null) - return ..() +/datum/mob_controller/aggressive/New() + ..() + if(isliving(body) && !QDELETED(body) && !QDELETED(src)) + body.set_intent(I_FLAG_HARM) /datum/mob_controller/aggressive/do_process() @@ -37,24 +23,36 @@ set_stance(get_target() ? STANCE_ATTACK : STANCE_IDLE) return + if(isnull(stance)) + set_stance(get_target() ? STANCE_ATTACK : STANCE_IDLE) + if(isturf(body.loc) && !body.buckled) switch(stance) if(STANCE_IDLE) - set_target(find_target()) - set_stance(STANCE_ATTACK) + if(do_target_scan()) + set_target(find_target()) + if(get_target()) + set_stance(STANCE_ATTACK) if(STANCE_ATTACK) - body.face_atom(get_target()) - if(try_destroy_surroundings) - destroy_surroundings() - move_to_target() + + if(get_target()) + body.face_atom(get_target()) + if(try_destroy_surroundings) + destroy_surroundings() + move_to_target() + else + set_stance(STANCE_IDLE) if(STANCE_ATTACKING) - body.face_atom(get_target()) - if(try_destroy_surroundings) - destroy_surroundings() - handle_attacking_target() + if(get_target()) + body.face_atom(get_target()) + if(try_destroy_surroundings) + destroy_surroundings() + handle_attacking_target() + else + set_stance(STANCE_IDLE) if(STANCE_CONTAINED) //we aren't inside something so just switch set_stance(STANCE_IDLE) @@ -74,7 +72,7 @@ /datum/mob_controller/aggressive/proc/handle_attacking_target() stop_wandering() var/atom/target = get_target() - if(!istype(target) || !attackable(target) || !(target in list_targets(10))) // consider replacing this list_targets() call with a distance or LOS check + if(!istype(target) || !attackable(target) || !(target in get_raw_target_list())) lose_target() return FALSE if (ishuman(target)) @@ -92,10 +90,14 @@ return TRUE /datum/mob_controller/aggressive/proc/attack_target() + + set waitfor = FALSE + var/atom/target = get_target() if(!istype(target)) lose_target() return + if(isliving(target) && body.buckled_mob == target && (!body.faction || body.buckled_mob.faction != body.faction)) body.visible_message(SPAN_DANGER("\The [body] attempts to unseat \the [body.buckled_mob]!")) body.set_dir(pick(global.cardinal)) @@ -107,11 +109,21 @@ var/mob/living/victim = target SET_STATUS_MAX(victim, STAT_WEAK, 3) return target - if(body.Adjacent(target)) - body.a_intent = I_HURT - body.ClickOn(target) + + if(!body.Adjacent(target)) + return target + + // AI-driven mobs have a melee telegraph that needs to be handled here. + if(!body.do_attack_windup_checking(target)) + return target + + if(QDELETED(body) || body.incapacitated() || QDELETED(target)) return target + body.set_intent(I_FLAG_HARM) + body.ClickOn(target) + return target + /datum/mob_controller/aggressive/destroy_surroundings() if(!body.can_act()) @@ -135,7 +147,7 @@ // Attack anything on the target turf. var/obj/effect/shield/S = locate(/obj/effect/shield) in targ if(S && S.gen && S.gen.check_flag(MODEFLAG_NONHUMANS)) - body.a_intent = I_HURT + body.set_intent(I_FLAG_HARM) body.ClickOn(S) return @@ -156,7 +168,7 @@ for(var/type in valid_obstacles_by_priority) var/obj/obstacle = locate(type) in targ if(obstacle) - body.a_intent = I_HURT + body.set_intent(I_FLAG_HARM) body.ClickOn(obstacle) return @@ -166,7 +178,7 @@ if(!obstacle.can_open(1)) return body.face_atom(obstacle) - body.pry_door(obstacle, (obstacle.pry_mod * body.get_door_pry_time())) + body.pry_door((obstacle.pry_mod * body.get_door_pry_time()), obstacle) return /datum/mob_controller/aggressive/retaliate(atom/source) @@ -174,27 +186,25 @@ if(!(. = ..())) return - if(!only_attack_enemies) - if(source) - set_target(source) - move_to_target(move_only = TRUE) - return - - var/list/allies - var/list/around = view(body, 7) - for(var/atom/movable/A in around) - if(A == body || !isliving(A)) - continue - var/mob/living/M = A - if(attack_same_faction || M.faction != body.faction) - add_enemy(M) - else if(istype(M.ai)) - LAZYADD(allies, M.ai) - - var/list/enemies = get_enemies() - if(LAZYLEN(enemies) && LAZYLEN(allies)) - for(var/datum/mob_controller/ally as anything in allies) - ally.add_enemies(enemies) + if(only_attack_enemies) + var/list/allies + var/list/around = view(body, 7) + for(var/atom/movable/A in around) + if(A == body || !isliving(A)) + continue + var/mob/living/M = A + if(attack_same_faction || M.faction != body.faction) + add_enemy(M) + else if(istype(M.ai)) + LAZYADD(allies, M.ai) + var/list/enemies = get_enemies() + if(LAZYLEN(enemies) && LAZYLEN(allies)) + for(var/datum/mob_controller/ally as anything in allies) + ally.add_enemies(enemies) + + if(source) + set_target(source) + move_to_target(move_only = TRUE) /datum/mob_controller/aggressive/move_to_target(var/move_only = FALSE) if(!body.can_act()) @@ -204,51 +214,40 @@ return stop_wandering() var/atom/target = get_target() - if(!istype(target) || !attackable(target) || !(target in list_targets(10))) + if(!istype(target) || !attackable(target) || !(target in get_raw_target_list())) lose_target() return if(body.has_ranged_attack() && get_dist(body, target) <= body.get_ranged_attack_distance() && !move_only) body.stop_automove() - open_fire() + handle_ranged_target(target) return set_stance(STANCE_ATTACKING) body.start_automove(target) -/datum/mob_controller/aggressive/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/list_targets() // Base hostile mobs will just destroy everything in view. // Mobs with an enemy list will filter the view by their enemies. if(!only_attack_enemies) - return hearers(body, dist)-body - var/list/enemies = get_enemies() - if(!LAZYLEN(enemies)) - return - var/list/possible_targets = hearers(body, dist)-body - if(!length(possible_targets)) - return - for(var/weakref/enemy in enemies) // Remove all entries that aren't in enemies - var/M = enemy.resolve() - if(M in possible_targets) - LAZYDISTINCTADD(., M) + return get_raw_target_list() + return ..() /datum/mob_controller/aggressive/find_target() + . = ..() if(!body.can_act() || !body.faction) return null resume_wandering() - for(var/atom/A in list_targets(10)) - if(valid_target(A)) - set_stance(STANCE_ATTACK) - body.face_atom(A) - return A + for(var/atom/A in get_valid_targets()) + set_stance(STANCE_ATTACK) + body.face_atom(A) + return A /datum/mob_controller/aggressive/valid_target(var/atom/A) - if(A == body) + if(!..()) return FALSE if(ismob(A)) var/mob/M = A if(M.faction == body.faction && !attack_same_faction) return FALSE - else if(weakref(M) in get_friends()) - return FALSE if(M.stat) return FALSE if(ishuman(M)) @@ -257,20 +256,12 @@ return FALSE return TRUE -/datum/mob_controller/aggressive/open_fire() - if(!body.can_act()) +/datum/mob_controller/aggressive/handle_ranged_target(atom/ranged_target) + if(!body.can_act() || !ranged_target) return FALSE - body.handle_ranged_attack(get_target()) + body.handle_ranged_attack(ranged_target) return TRUE -/datum/mob_controller/aggressive/lose_target() - set_target(null) - lost_target() - -/datum/mob_controller/aggressive/lost_target() - set_stance(STANCE_IDLE) - body.stop_automove() - /datum/mob_controller/aggressive/pacify(mob/user) ..() attack_same_faction = FALSE diff --git a/code/datums/ai/beast.dm b/code/datums/ai/beast.dm index 91ad1fec7a5..9090698f55a 100644 --- a/code/datums/ai/beast.dm +++ b/code/datums/ai/beast.dm @@ -36,7 +36,7 @@ qdel(S) break -/datum/mob_controller/aggressive/beast/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/beast/list_targets() . = ..() if(!length(.)) if(LAZYLEN(prey)) @@ -46,6 +46,6 @@ if(M) . |= M else if(body.get_nutrition() < body.get_max_nutrition() * 0.75) //time to look for some food - for(var/mob/living/L in view(body, dist)) + for(var/mob/living/L in get_raw_target_list()) if(attack_same_faction || L.faction != body.faction) LAZYDISTINCTADD(prey, weakref(L)) diff --git a/code/datums/ai/commanded.dm b/code/datums/ai/commanded.dm index e4452782a84..c9e1e7f8e97 100644 --- a/code/datums/ai/commanded.dm +++ b/code/datums/ai/commanded.dm @@ -85,8 +85,8 @@ var/list/targets = get_targets_by_name(message) if(LAZYLEN(targets) != 1) //CONFUSED. WHO DO I FOLLOW? return 0 - var/weakref/target_ref = targets[1] - set_target(target_ref.resolve()) //YEAH GOOD IDEA + var/weakref/single_target_ref = targets[1] + set_target(single_target_ref.resolve()) //YEAH GOOD IDEA set_stance(STANCE_COMMANDED_FOLLOW) //GOT SOMEBODY. BETTER FOLLOW EM. return 1 @@ -98,7 +98,7 @@ return stop_wandering() var/atom/target = get_target() - if(istype(target) && (target in list_targets(10))) + if(istype(target) && (target in get_raw_target_list())) body.start_automove(target) /datum/mob_controller/aggressive/commanded/proc/commanded_stop() //basically a proc that runs whenever we are asked to stay put. Probably going to remain unused. @@ -125,12 +125,14 @@ LAZYADD(., weakref(M)) /datum/mob_controller/aggressive/commanded/find_target() + SHOULD_CALL_PARENT(FALSE) + next_target_scan_time = world.time + target_scan_delay if(!LAZYLEN(_allowed_targets)) return null var/mode = "specific" if(LAZYACCESS(_allowed_targets, 1) == "everyone") //we have been given the golden gift of murdering everything. Except our master, of course. And our friends. So just mostly everyone. mode = "everyone" - for(var/atom/A in list_targets(10)) + for(var/atom/A in get_raw_target_list()) if(A == src) continue if(isliving(A)) diff --git a/code/datums/ai/hunter.dm b/code/datums/ai/hunter.dm index b7715277783..e60294d4a87 100644 --- a/code/datums/ai/hunter.dm +++ b/code/datums/ai/hunter.dm @@ -17,7 +17,7 @@ return !victim.isSynthetic() && (victim.stat == DEAD || victim.get_object_size() < body.get_object_size()) /datum/mob_controller/passive/hunter/proc/try_attack_prey(mob/living/prey) - body.a_intent = I_HURT + body.set_intent(I_FLAG_HARM) body.ClickOn(prey) /datum/mob_controller/passive/hunter/proc/consume_prey(mob/living/prey) diff --git a/code/datums/communication/aooc.dm b/code/datums/communication/aooc.dm index 52ca16f4194..8c4a25349c3 100644 --- a/code/datums/communication/aooc.dm +++ b/code/datums/communication/aooc.dm @@ -30,7 +30,7 @@ receive_communication(C, target, SPAN_AOOC("[get_options_bar(C, 0, 1, 1)]: [message]")) else if(target.mob?.mind?.assigned_special_role) var/display_name = C.key - var/player_display = holder ? "[display_name]([usr.client.holder.rank])" : display_name + var/player_display = holder ? "[display_name]([C.holder.rank])" : display_name receive_communication(C, target, SPAN_AOOC("[player_display]: [message]")) /decl/communication_channel/aooc/do_broadcast(message) diff --git a/code/datums/communication/dsay.dm b/code/datums/communication/dsay.dm index c21705a672e..273f17a36b7 100644 --- a/code/datums/communication/dsay.dm +++ b/code/datums/communication/dsay.dm @@ -61,12 +61,8 @@ keyname = C.key if(C.mob) //Most of the time this is the dead/observer mob; we can totally use him if there is no better name - var/mindname + var/mindname = C.mob.mind?.name // the mind's "original name" var/realname = C.mob.real_name - if(C.mob.mind) - mindname = C.mob.mind.name - if(C.mob.mind.original && C.mob.mind.original.real_name) - realname = C.mob.mind.original.real_name if(mindname && mindname != realname) name = "[realname] died as [mindname]" else diff --git a/code/datums/config/config_types/config_mode.dm b/code/datums/config/config_types/config_mode.dm index 7db16b2ca34..6f91654a688 100644 --- a/code/datums/config/config_types/config_mode.dm +++ b/code/datums/config/config_types/config_mode.dm @@ -6,7 +6,6 @@ /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, @@ -78,10 +77,6 @@ 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." @@ -93,7 +88,7 @@ /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.", + "Remove the # to make rounds which end instantly 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." ) diff --git a/code/datums/config/config_types/config_server.dm b/code/datums/config/config_types/config_server.dm index 47239568235..4365bbde4bb 100644 --- a/code/datums/config/config_types/config_server.dm +++ b/code/datums/config/config_types/config_server.dm @@ -16,9 +16,6 @@ /decl/config/num/drone_build_time, /decl/config/num/max_character_traits, /decl/config/num/max_alternate_languages, - /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, @@ -54,9 +51,7 @@ /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, @@ -170,20 +165,6 @@ default_value = 3 desc = "Remove the # to define a different maximum for alternate language selection 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" @@ -335,18 +316,10 @@ uid = "wait_for_sigusr1_reboot" desc = "Determines if Dream Daemon should refuse to reboot for any reason other than SIGUSR1." -/decl/config/toggle/use_irc_bot - uid = "use_irc_bot" - desc = "Determines if data is sent to the IRC bot. Generally requires MAIN_IRC and associated setup." - /decl/config/toggle/show_typing_indicator_for_whispers uid = "show_typing_indicator_for_whispers" desc = "Determinese if a typing indicator shows overhead for people currently writing whispers." -/decl/config/toggle/announce_shuttle_dock_to_irc - uid = "announce_shuttle_dock_to_irc" - desc = "Determines if announce shuttle dock announcements are sent to the main IRC channel, if MAIN_IRC has also been setup." - /decl/config/toggle/guests_allowed uid = "guests_allowed" desc = "Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server." diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 0fbfeaf0232..aa855c0b1e3 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -10,9 +10,14 @@ /// Used to avoid unnecessary refstring creation in Destroy(). var/tmp/has_state_machine = FALSE -#ifdef TESTING +#ifdef REFTRACKING_ENABLED var/tmp/running_find_references + /// When was this datum last touched by a reftracker? + /// If this value doesn't match with the start of the search + /// We know this datum has never been seen before, and we should check it var/tmp/last_find_references = 0 + /// How many references we're trying to find when searching + var/tmp/references_to_clear = 0 #endif // Default implementation of clean-up code. @@ -54,11 +59,11 @@ cleanup_events(src) if(has_state_machine) - var/list/machines = global.state_machines["\ref[src]"] + var/list/machines = global.state_machines[src] if(length(machines)) for(var/base_type in machines) qdel(machines[base_type]) - global.state_machines -= "\ref[src]" + global.state_machines -= src return QDEL_HINT_QUEUE @@ -111,10 +116,3 @@ */ /datum/proc/PopulateClone(var/datum/clone) return clone - -///////////////////////////////////////////////////////////// -//Common implementations -///////////////////////////////////////////////////////////// - -/image/GetCloneArgs() - return list(icon, loc, icon_state, layer, dir) \ No newline at end of file diff --git a/code/datums/extensions/abilities/abilities.dm b/code/datums/extensions/abilities/abilities.dm index 3995c524dc4..21e02b0126b 100644 --- a/code/datums/extensions/abilities/abilities.dm +++ b/code/datums/extensions/abilities/abilities.dm @@ -26,7 +26,7 @@ /// Clicking a grab on the currently grabbed mob. /datum/extension/abilities/proc/do_grabbed_invocation(atom/target) - if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers)) + if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers) && !istype(target, /obj/screen)) for(var/datum/ability_handler/handler in ability_handlers) if(handler.can_do_grabbed_invocation(holder, target) && handler.do_grabbed_invocation(holder, target)) return TRUE @@ -34,7 +34,7 @@ /// Clicking an adjacent target (UnarmedAttack()) /datum/extension/abilities/proc/do_melee_invocation(atom/target) - if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers)) + if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers) && !istype(target, /obj/screen)) for(var/datum/ability_handler/handler in ability_handlers) if(handler.can_do_melee_invocation(holder, target) && handler.do_melee_invocation(holder, target)) return TRUE @@ -42,7 +42,7 @@ /// Clicking a distant target (RangedAttack()) /datum/extension/abilities/proc/do_ranged_invocation(atom/target) - if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers)) + if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers) && !istype(target, /obj/screen)) for(var/datum/ability_handler/handler in ability_handlers) if(handler.can_do_ranged_invocation(holder, target) && handler.do_ranged_invocation(holder, target)) return TRUE @@ -54,3 +54,8 @@ for(var/datum/ability_handler/handler in ability_handlers) handler.refresh_login() +/datum/extension/abilities/proc/refresh_element_positioning() + var/row = 0 + for(var/datum/ability_handler/handler in ability_handlers) + if(length(handler.screen_elements)) + row += handler.refresh_element_positioning(row) diff --git a/code/datums/extensions/abilities/abilities_mob.dm b/code/datums/extensions/abilities/abilities_mob.dm index b72d0ac2c5f..4879b2d05c4 100644 --- a/code/datums/extensions/abilities/abilities_mob.dm +++ b/code/datums/extensions/abilities/abilities_mob.dm @@ -18,6 +18,7 @@ return FALSE handler = new handler_type(abilities, src) LAZYADD(abilities.ability_handlers, handler) + handler.finalize_ability_handler() return handler /mob/proc/remove_ability_handler(handler_type) @@ -28,6 +29,75 @@ if(!handler) return FALSE LAZYREMOVE(abilities.ability_handlers, handler) + qdel(handler) if(!LAZYLEN(abilities.ability_handlers)) remove_extension(src, /datum/extension/abilities) return TRUE + +/mob/living/proc/copy_abilities_from(mob/living/donor) + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + if(!abilities) + return FALSE + . = FALSE + for(var/datum/ability_handler/handler in abilities.ability_handlers) + if(handler.copy_abilities_to(src)) + . = TRUE + +/mob/living/proc/disable_abilities(var/amount = 0) + if(amount < 0) + return + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + for(var/datum/ability_handler/handler in abilities?.ability_handlers) + handler.disable_abilities(amount) + +/mob/living/proc/copy_abilities_to(mob/living/target) + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + for(var/datum/ability_handler/handler in abilities?.ability_handlers) + handler.copy_abilities_to(target) + +/mob/proc/add_ability(ability_type, list/metadata) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return FALSE + var/datum/ability_handler/handler = get_ability_handler(ability.associated_handler_type, create_if_missing = TRUE) + return handler.add_ability(ability_type, metadata) + +/mob/proc/remove_ability(ability_type) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return FALSE + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + var/datum/ability_handler/handler = locate(ability.associated_handler_type) in abilities?.ability_handlers + return handler?.remove_ability(ability_type) + +/mob/proc/get_ability_metadata(ability_type) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return null + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + var/datum/ability_handler/handler = locate(ability.associated_handler_type) in abilities?.ability_handlers + return handler?.get_metadata(ability_type, create_if_missing = TRUE) + +/mob/proc/has_ability(ability_type) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return null + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + var/datum/ability_handler/handler = locate(ability.associated_handler_type) in abilities?.ability_handlers + return handler?.provides_ability(ability_type) + +/mob/Stat() + if((. = ..()) && client) + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + for(var/datum/ability_handler/handler in abilities?.ability_handlers) + handler.show_stat_string(src) + +/mob/proc/get_all_abilities() + var/datum/extension/abilities/abilities_extension = get_extension(src, /datum/extension/abilities) + if(!istype(abilities_extension)) + return + for(var/datum/ability_handler/handler as anything in abilities_extension.ability_handlers) + for(var/ability_type in handler.known_abilities) + var/decl/ability/ability = GET_DECL(ability_type) + if(istype(ability)) + LAZYDISTINCTADD(., ability) diff --git a/code/datums/extensions/abilities/abilities_predator.dm b/code/datums/extensions/abilities/abilities_predator.dm index c6cfa9542c6..4fc37d4a828 100644 --- a/code/datums/extensions/abilities/abilities_predator.dm +++ b/code/datums/extensions/abilities/abilities_predator.dm @@ -1,16 +1,35 @@ /datum/ability_handler/predator + category_toggle_type = null var/max_dismember_size = MOB_SIZE_SMALL /datum/ability_handler/predator/can_do_melee_invocation(mob/user, atom/target) - return istype(user) && !user.incapacitated() && isatom(target) && target.Adjacent(user) + return ..() || (istype(user) && !user.incapacitated() && isatom(target) && target.Adjacent(user)) /datum/ability_handler/predator/do_melee_invocation(mob/user, atom/target) - // Nibbles - if(user.a_intent == I_HURT) + + . = ..() + if(.) + return + + // Nibbles! + if(user.check_intent(I_FLAG_HARM)) if(isliving(target)) return handle_dismemberment(user, target) if(istype(target, /obj/item/organ)) return handle_organ_destruction(user, target) + + // Digging! + var/static/list/diggable_types = list( + /turf/floor, + /turf/wall, + /obj/structure/pit, + /obj/machinery/portable_atmospherics/hydroponics/soil + ) + if(is_type_in_list(target, diggable_types)) + var/obj/item/organ/external/paw = user.get_usable_hand_slot_organ() + if(paw) + return target.attackby(paw, user) + return FALSE /datum/ability_handler/predator/proc/handle_organ_destruction(mob/user, obj/item/organ/chewtoy) diff --git a/code/datums/extensions/abilities/ability_button.dm b/code/datums/extensions/abilities/ability_button.dm new file mode 100644 index 00000000000..5ab2d44e66b --- /dev/null +++ b/code/datums/extensions/abilities/ability_button.dm @@ -0,0 +1,108 @@ +/obj/screen/ability + requires_ui_style = FALSE + requires_owner = FALSE + icon_state = "ability" + icon = 'icons/mob/screen/abilities.dmi' + abstract_type = /obj/screen/ability + var/datum/ability_handler/owning_handler + +/obj/screen/ability/Destroy() + remove_from_handler() + return ..() + +/obj/screen/ability/proc/remove_from_handler() + owning_handler = null + +/obj/screen/ability/on_update_icon() + invisibility = (isnull(owning_handler) || owning_handler.showing_abilities) ? 0 : INVISIBILITY_ABSTRACT + +/obj/screen/ability/handle_click(mob/user, params) + to_chat(user, "Click!") + +/obj/screen/ability/button + icon_state = "button" + requires_owner = TRUE + maptext_y = -3 + var/decl/ability/ability + +/obj/screen/ability/button/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) + . = ..() + START_PROCESSING(SSfastprocess, src) + on_update_icon() + +/obj/screen/ability/button/Destroy() + if(is_processing) + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/obj/screen/ability/button/Process() + // We've been broken or deleted. + if(QDELETED(src) || !ability || !owning_handler) + return PROCESS_KILL + // No reason to run periodic updates. + if(!ability.ability_cooldown_time && !ability.max_charge) + return PROCESS_KILL + // Something is broken. + var/list/metadata = owning_handler.get_metadata(ability.type, create_if_missing = FALSE) + if(!metadata) + return PROCESS_KILL + maptext = "" + if(ability.ability_cooldown_time) + var/next_cast = metadata["next_cast"] + if(world.time < next_cast) + maptext = ticks2shortreadable(next_cast - world.time) + if(ability.max_charge) + maptext += "
" + if(ability.max_charge) + maptext += "x[max(0, metadata["charges"])]" + if(maptext) + maptext = STYLE_SMALLFONTS_OUTLINE("
[maptext]
", 7, COLOR_WHITE, COLOR_BLACK) + +/obj/screen/ability/button/remove_from_handler() + owning_handler?.remove_screen_element(src, ability) + return ..() + +/obj/screen/ability/button/handle_click(mob/user, params) + if(owning_handler.prepared_ability == ability) + owning_handler.cancel_prepared_ability() + else if(ability.use_ability(user, get_turf(user), owning_handler)) // tmp, needs better/multi-step target selection + update_icon() + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), ability.get_cooldown_time(ability.get_metadata_for_user(user)) + 1) + +/obj/screen/ability/button/proc/set_ability(decl/ability/_ability) + if(ability == _ability) + return + ability = _ability + if(istype(ability)) + SetName(ability.name) + else + SetName(initial(name)) + update_icon() + +/obj/screen/ability/button/on_update_icon() + . = ..() + icon_state = initial(icon_state) + cut_overlays() + if(istype(ability)) + if(owning_handler && owning_handler.prepared_ability == ability) + icon_state = "[icon_state]-active" + if(ability.ability_icon && ability.ability_icon_state) + add_overlay(overlay_image(ability.ability_icon, ability.ability_icon_state, COLOR_WHITE, (RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM))) + +/obj/screen/ability/category + name = "Toggle Ability Category" + icon_state = "category" + +/obj/screen/ability/category/remove_from_handler() + owning_handler?.remove_screen_element(src, "toggle") + return ..() + +/obj/screen/ability/category/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) + . = ..() + update_icon() + +/obj/screen/ability/category/handle_click(mob/user, params) + owning_handler?.toggle_category_visibility() + +/obj/screen/ability/category/on_update_icon() + icon_state = owning_handler?.showing_abilities ? initial(icon_state) : "[initial(icon_state)]-off" diff --git a/code/datums/extensions/abilities/ability_decl.dm b/code/datums/extensions/abilities/ability_decl.dm new file mode 100644 index 00000000000..9f271846750 --- /dev/null +++ b/code/datums/extensions/abilities/ability_decl.dm @@ -0,0 +1,410 @@ +/decl/ability + abstract_type = /decl/ability + /// A descriptive identifier string. + var/name + /// A descriptive string about the ability. + var/desc + /// An associated handler type, used in add_ability(). + var/associated_handler_type + /// Should this ability be copied between mobs when mind is transferred? + var/copy_with_mind = FALSE + + /// If TRUE, ability is toggled on and will fire when a target is clicked, instead of instantaneously on use. + var/prep_cast = FALSE + /// Used in conjunction with prep_cast, if TRUE, ability will be untoggled after cast. + var/end_prep_on_cast = TRUE + /// Ability items invoking this ability will GC afterwards. + var/item_end_on_cast = TRUE + + /// Does this invocation trigger on a proximity click, if prepared? + var/is_melee_invocation = FALSE + /// Does this invocation trigger on a non-proximity click, if prepared? + var/is_ranged_invocation = FALSE + + // Projectile created and used to propagate this ability, if it is a ranged ability. + /// If set, this ability will create a projectile rather than applying the effect directly. + var/projectile_type + /// Sets the projectile step_delay. + var/projectile_step_delay = 1 + /// Determines the lifetime of the projectile. + var/projectile_duration = 1 SECOND + /// If not set, the ability will have documentation generated for the codex. + var/hidden_from_codex = FALSE + /// If set, this ability will be silenced by null rod and similar mechanics. + var/is_supernatural = FALSE + + // Visual/audible state for the on-turf effect of casting the spell on something. + /// If set, will attempt to draw from this icon on the turf where the ability is used. + var/overlay_icon + /// If set, will attempt to draw this icon_state on the turf where the ability is used. + var/overlay_icon_state + /// Will delete the overlay after this time. + var/overlay_lifespan = 1 SECOND + /// If set, will play a sound when used. + var/use_sound + /// Volume for above. + var/use_sound_volume = 50 + + // Visual state for the ability HUD element. + /// Type of button to use for the UI. Should be /obj/screen/ability/button or subtype. + var/ui_element_type = /obj/screen/ability/button + /// Icon to draw on the ability HUD, if any. + var/ability_icon + /// Icon state to draw on the ability HUD, if any. + var/ability_icon_state + + // Various restrictions on how and when the ability is used. + /// A decl type that handles retrieving and validating targets. + var/decl/ability_targeting/target_selector = /decl/ability_targeting + /// If set to a numeric value, the ability cannot be used before the cooldown has expired. + var/ability_cooldown_time = 5 SECONDS + /// If set, a do_after() will be applied to this spell. + var/ability_use_channel + /// Maximum charges that can be held of this item at a time. If unset, item does not accumulate charges. + var/max_charge + /// How long it takes between charges. + var/charge_delay = 1 SECOND + /// What flags to check before an ability can be used, if any. + var/check_incapacitated = (INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT) + /// What type of mob is required to use this ability. + var/mob/expected_mob_type = /mob/living + /// If set, this ability can only be used while standing on a turf (not in an atom's contents or null loc). + var/requires_turf = TRUE + /// If set, this ability cannot be used on the admin z-level. + var/admin_blocked = TRUE + + // Various failure messages. + /// Failed due to purged/null rod. + var/cast_failed_purged_str = "Another power interferes with your own!" + /// Failed due to non-turf loc. + var/cast_failed_no_turf = "You must be standing on solid ground to use this ability." + /// Failed due to being on admin level + var/cast_failed_no_admin_level = "This ability cannot be used on the admin z-level." + /// Failed due to being invalid mob type + var/cast_failed_wrong_mob_type = "This ability may only be used by living creature." + /// Failed due to being downed/buckled + var/cast_failed_incapacitated = "You are in no state to use that ability." + /// Failed due to still being on cooldown from last use + var/cast_failed_on_cooldown = "You cannot use that ability again just yet." + /// Failed due to still recharging + var/cast_failed_no_charges = "You are out of charges for that ability." + /// Failed due to being silenced/disabled + var/cast_failed_disabled_str = "You are unable to use that ability for another $TIME$!" + + // Various casting messages. + /// "$USER$ begins preparing to use an ability on $TARGET$." + var/prepare_message_3p_str + /// "You begin preparing to use an ability on $TARGET$." + var/prepare_message_1p_str + /// "$USER$ uses an ability." + var/cast_message_3p_str + /// "You use an ability." + var/cast_message_1p_str + /// "You ready yourself to use an ability." + var/ready_ability_1p_str + /// "You cease readying yourself to use an ability." + var/cancel_ability_1p_str + /// "You fail to cast an ability." + var/fail_cast_1p_str + +/decl/ability/Initialize() + target_selector = GET_DECL(target_selector) + . = ..() + +/decl/ability/validate() + . = ..() + if(!istype(target_selector, /decl/ability_targeting)) + . += "null or invalid target_selector: '[target_selector || "NULL"]'" + if(!findtext(cast_failed_disabled_str, "$TIME$")) + . += "missing $TIME$ token in cast_failed_disabled_str" + if(!ispath(associated_handler_type, /datum/ability_handler)) + . += "null or invalid associated_handler_type '[associated_handler_type]'" + if(!ability_icon) + . += "null ability_icon" + else if(!istext(ability_icon_state)) + . += "null or non-text ability_icon_state" + else if(!check_state_in_icon(ability_icon_state, ability_icon)) + . += "missing ability_icon_state '[ability_icon_state]' in icon '[ability_icon]'" + +/decl/ability/proc/get_cooldown_time(list/metadata) + return ability_cooldown_time + +/decl/ability/proc/has_valid_targets(user, atom/target, list/metadata) + // Projectiles just need something to shoot at. + if(projectile_type) + return isturf(target) || isturf(target.loc) + // Abilities need at least one valid target. + return target_selector.validate_initial_target(user, target, metadata, src) + +/decl/ability/proc/get_metadata_for(mob/user) + if(!istype(user)) + CRASH("get_metadata_for() called with null or invalid user!") + var/datum/ability_handler/handler = user.get_ability_handler(associated_handler_type, create_if_missing = FALSE) + if(istype(handler)) + . = handler.get_metadata(src) + if(!islist(.)) + PRINT_STACK_TRACE("get_metadata_for() returning null or non-list metadata!") + else + PRINT_STACK_TRACE("get_metadata_for() called by mob with no handler of associated type!") + +// This is the main entrypoint for the ability use chain. +/decl/ability/proc/use_ability(mob/user, atom/target, datum/ability_handler/handler) + + if(!istype(user)) + return + + var/list/metadata = get_metadata_for(user) + if(!islist(metadata) || !can_use_ability(user, metadata)) + return + + if(prep_cast && handler.prepared_ability != src) + handler.prepare_ability(src) + return + + // Resolve our clicked target to the appropriate turf. + target = target_selector.resolve_initial_target(target) + if(!istype(target)) + to_chat(user, SPAN_WARNING("You cannot see a target for [name].")) + return + + if(!has_valid_targets(user, target, metadata)) + to_chat(user, SPAN_WARNING("You cannot use [name] on \the [target].")) + return + + if(!prepare_to_cast(user, target, metadata, handler)) + if(fail_cast_1p_str) + to_chat(user, SPAN_WARNING(capitalize(emote_replace_user_tokens(fail_cast_1p_str, user)))) + return + + if(projectile_type) + // Fire a projectile if that is how this ability works. + fire_projectile_at(user, target, metadata) + + else + // Otherwise, just apply to the target directly. + apply_effect(user, target, metadata) + + if(end_prep_on_cast && handler.prepared_ability == src) + handler.cancel_prepared_ability() + +/decl/ability/proc/fire_projectile_at(mob/user, atom/target, list/metadata) + var/obj/item/projectile/projectile = new projectile_type(get_turf(user)) + if(istype(projectile, /obj/item/projectile/ability)) + var/obj/item/projectile/ability/ability_projectile = projectile + ability_projectile.owner = user + ability_projectile.ability_metadata = metadata + ability_projectile.carried_ability = src + projectile.original = target + projectile.starting = get_turf(user) + projectile.shot_from = user + projectile.current = projectile.original + projectile.yo = target.y - user.y + projectile.xo = target.x - user.x + projectile.life_span = projectile_duration + projectile.hitscan = !projectile_step_delay + projectile.step_delay = projectile_step_delay + projectile.launch(target) + return projectile + +/decl/ability/proc/show_cast_channel_msg(mob/user, atom/target, list/metadata) + if(prepare_message_3p_str && prepare_message_1p_str) + user.visible_message( + SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(prepare_message_3p_str, user), target))), + SPAN_NOTICE(capitalize(emote_replace_target_tokens(prepare_message_1p_str, target))) + ) + else if(prepare_message_1p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(prepare_message_1p_str, target)))) + else if(prepare_message_3p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(prepare_message_3p_str, user), target)))) + +/decl/ability/proc/show_ability_cast_msg(mob/user, list/targets, list/metadata) + var/atom/target = targets[1] + if(cast_message_3p_str && cast_message_1p_str) + user.visible_message( + SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(cast_message_3p_str, user), target))), + SPAN_NOTICE(capitalize(emote_replace_target_tokens(cast_message_1p_str, target))) + ) + else if(cast_message_1p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(cast_message_1p_str, target)))) + else if(cast_message_3p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(cast_message_3p_str, user), target)))) + +/decl/ability/proc/prepare_to_cast(mob/user, atom/target, list/metadata, datum/ability_handler/handler) + var/use_cooldown_time = get_cooldown_time(metadata) + if(ability_use_channel) + if(world.time < handler.next_channel) + return FALSE + handler.next_channel = world.time + ability_use_channel + show_cast_channel_msg(user, target, metadata) + if(!do_after(user, ability_use_channel, target) || !can_use_ability(user, metadata)) + handler.next_channel = 0 // Don't make them sit out the entire channel period, it's just a debounce/duplicate ability preventative + return FALSE + if(use_cooldown_time > 0) + metadata["next_cast"] = world.time + use_cooldown_time + return TRUE + +/decl/ability/proc/check_equipment(mob/user, list/metadata, silent = FALSE) + return TRUE + +/decl/ability/proc/get_metadata_for_user(mob/user) + if(!user.has_ability(type)) + return null + + var/datum/ability_handler/handler = user.get_ability_handler(associated_handler_type, create_if_missing = FALSE) + if(!istype(handler)) + CRASH("get_metadata_for_user() called by mob with no handler of associated type!") + + return handler.get_metadata(src) + +/decl/ability/proc/can_use_ability(mob/user, list/metadata, silent = FALSE) + + if(!user.has_ability(type)) + error("\The [user] utilized the ability '[type]' without having access to it.") + if(!silent) + to_chat(user, SPAN_WARNING("You shouldn't have this ability! Please notify a developer or raise an issue ticket.")) + return FALSE + + var/turf/my_turf = get_turf(user) + if(requires_turf) + if(!istype(my_turf)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_no_turf)) + return FALSE + if(admin_blocked && isAdminLevel(my_turf.z)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_no_admin_level)) + return FALSE + + if(!istype(user, expected_mob_type)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_wrong_mob_type)) + return FALSE + + if(!isnull(check_incapacitated) && user.incapacitated(check_incapacitated)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_incapacitated)) + return FALSE + + if(!check_equipment(user, metadata, silent)) + return FALSE + + if(ability_cooldown_time && world.time < metadata["next_cast"]) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_on_cooldown)) + return FALSE + + if(max_charge && metadata["charges"] <= 0) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_no_charges)) + return FALSE + + if(is_supernatural) + + var/is_purged = FALSE + if(isanimal(user)) + var/mob/living/simple_animal/critter = user + is_purged = !!critter.purge + + if(!is_purged) + for(var/turf/turf in range(user, 1)) + if(turf.is_purged()) + is_purged = TRUE + break + + if(is_purged) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_purged_str)) + return FALSE + + var/disabled_time = metadata["disabled"] + if(world.time < disabled_time) + if(!silent) + var/remaining_time = ceil((disabled_time - world.time) / 10) + to_chat(user, SPAN_WARNING(replacetext(cast_failed_disabled_str, "$TIME$", "[remaining_time] second\s"))) + return FALSE + + return TRUE + +/decl/ability/proc/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + SHOULD_CALL_PARENT(TRUE) + if(use_sound) + playsound(get_turf(user), use_sound, use_sound_volume, 1) + if(istype(projectile)) + projectile.expended = TRUE + + admin_attacker_log(user, "attempted to use ability [src] on [hit_target]") + + var/list/targets = target_selector.get_affected(user, hit_target, metadata, src, projectile) + if(length(targets)) + show_ability_cast_msg(user, targets, metadata) + while(length(targets)) + var/target = targets[1] + apply_effect_to(user, target, metadata) + targets = prune_targets(user, target, targets, metadata) + finish_casting(user, hit_target, metadata) + +/decl/ability/proc/finish_casting(mob/user, atom/hit_target, list/metadata) + return + +/decl/ability/proc/prune_targets(user, previous_target, list/targets, list/metadata) + if(!length(targets)) + return null + if(previous_target) + LAZYREMOVE(targets, previous_target) + return targets + +/decl/ability/proc/apply_visuals(mob/user, atom/target, list/metadata) + if(!overlay_icon || !overlay_lifespan) + return + var/turf/overlay_loc = get_turf(target) + if(!isturf(overlay_loc) || locate(/obj/effect/overlay) in overlay_loc) + return + var/obj/effect/overlay/ability_overlay = new(overlay_loc) + ability_overlay.icon = overlay_icon + ability_overlay.icon_state = overlay_icon_state + ability_overlay.anchored = TRUE + ability_overlay.set_density(FALSE) + QDEL_IN(ability_overlay, overlay_lifespan) + +/decl/ability/proc/apply_effect_to(mob/user, atom/target, list/metadata) + SHOULD_CALL_PARENT(TRUE) + SHOULD_NOT_SLEEP(TRUE) + apply_visuals(user, target, metadata) + +/decl/ability/proc/get_default_metadata() + . = list() + if(ability_cooldown_time) + .["next_cast"] = 0 + if(max_charge) + .["charges"] = max_charge + .["next_charge"] = 0 + +/decl/ability/proc/recharge(mob/owner, list/metadata) + if(max_charge <= 0 || metadata["charges"] >= max_charge) + return FALSE + if(world.time < metadata["next_charge"]) + return TRUE + metadata["next_charge"] = world.time + charge_delay + metadata["charges"]++ + return TRUE + +/decl/ability/proc/get_stat_strings(list/metadata) + var/use_name = metadata["ability_name"] || name + if(ability_cooldown_time) + var/on_cooldown = metadata["next_cast"] - world.time + if(on_cooldown > 0) + return list( + use_name, + "[ceil(on_cooldown/10)]s" + ) + if(max_charge) + return list( + use_name, + "[metadata["charges"]]/[max_charge]" + ) + +/decl/ability/ranged + abstract_type = /decl/ability/ranged + projectile_type = /obj/item/projectile/ability + is_ranged_invocation = TRUE + prep_cast = TRUE \ No newline at end of file diff --git a/code/datums/extensions/abilities/ability_handler.dm b/code/datums/extensions/abilities/ability_handler.dm index 8dc7ee1e5de..d215868a4c5 100644 --- a/code/datums/extensions/abilities/ability_handler.dm +++ b/code/datums/extensions/abilities/ability_handler.dm @@ -1,8 +1,17 @@ /datum/ability_handler abstract_type = /datum/ability_handler + var/showing_abilities = FALSE var/mob/owner - var/list/ability_items var/datum/extension/abilities/master + var/list/ability_items + var/list/screen_elements + var/list/known_abilities + var/list/recharging_abilities + var/stat_panel_type = "Abilities" + /// UI element for showing or hiding this ability category. Should be /obj/screen/ability/category or subtype. + var/category_toggle_type = /obj/screen/ability/category + var/decl/ability/prepared_ability + var/next_channel = 0 /datum/ability_handler/New(_master) master = _master @@ -12,16 +21,179 @@ if(!istype(owner)) CRASH("Ability handler received invalid owner!") ..() + refresh_login() + +/datum/ability_handler/Process() + + if(!length(recharging_abilities)) + return PROCESS_KILL + + for(var/decl/ability/ability as anything in recharging_abilities) + if(!ability.recharge(owner, get_metadata(ability))) + LAZYREMOVE(recharging_abilities, ability) + +/datum/ability_handler/proc/get_metadata(decl/ability/ability, create_if_missing = TRUE) + if(istype(ability)) + . = known_abilities[ability.type] + if(!islist(.) && create_if_missing) + . = ability.get_default_metadata() + known_abilities[ability.type] = . + else if(ispath(ability, /decl/ability)) + . = known_abilities[ability] + if(!islist(.) && create_if_missing) + ability = GET_DECL(ability) + if(!istype(ability)) + return list() + . = ability.get_default_metadata() + known_abilities[ability] = . + else if(create_if_missing) + PRINT_STACK_TRACE("ability metadata retrieval passed invalid ability type: '[ability]'") + . = list() /datum/ability_handler/Destroy() + recharging_abilities = null + known_abilities = null QDEL_NULL_LIST(ability_items) + + for(var/ability in screen_elements) + var/obj/element = screen_elements[ability] + if(istype(element)) + qdel(element) + screen_elements = null + if(master) LAZYREMOVE(master.ability_handlers, src) master.update() master = null owner = null + if(is_processing) + STOP_PROCESSING(SSprocessing, src) return ..() +/datum/ability_handler/proc/add_ability(ability_type, list/metadata) + if(provides_ability(ability_type)) + return FALSE + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability)) + return FALSE + if(islist(metadata)) + metadata = metadata.Copy() // Prevent mutating during copy from other mobs. + else + metadata = ability.get_default_metadata() // Always unique, no copy needed. + + if(ability.ui_element_type && !istype(LAZYACCESS(screen_elements, ability), ability.ui_element_type)) + var/existing = screen_elements[ability] + if(existing) + remove_screen_element(existing, ability, FALSE) + var/obj/screen/ability/button/button = new ability.ui_element_type(null, owner, null, null, null, null, null) + button.set_ability(ability) + add_screen_element(button, ability, TRUE) + + LAZYSET(known_abilities, ability_type, metadata) + if(ability.max_charge) + LAZYDISTINCTADD(recharging_abilities, ability_type) + if(!is_processing) + START_PROCESSING(SSprocessing, src) + return TRUE + +/datum/ability_handler/proc/remove_ability(ability_type) + if(!provides_ability(ability_type)) + return FALSE + LAZYREMOVE(known_abilities, ability_type) + LAZYREMOVE(recharging_abilities, ability_type) + + var/decl/ability/ability = GET_DECL(ability_type) + if(ability?.ui_element_type) + var/obj/screen/existing_button = LAZYACCESS(screen_elements, ability) + if(istype(existing_button)) + remove_screen_element(existing_button, ability) + + if(!LAZYLEN(recharging_abilities) && is_processing) + STOP_PROCESSING(SSprocessing, src) + + if(!LAZYLEN(known_abilities)) + owner.remove_ability_handler(type) + + return TRUE + +/datum/ability_handler/proc/provides_ability(ability_type) + return (ability_type in known_abilities) + +/datum/ability_handler/proc/finalize_ability_handler() + if(category_toggle_type) + var/obj/screen/ability/category/category_toggle = new category_toggle_type(null, null, null, null, null, null, null) + add_screen_element(category_toggle, "toggle", TRUE) + toggle_category_visibility(TRUE) + +/datum/ability_handler/proc/refresh_element_positioning(row = 1, col = 1) + if(!LAZYLEN(screen_elements)) + return 0 + var/button_pos = col + var/button_row = row + . = 1 + for(var/ability in screen_elements) + var/obj/screen/element = screen_elements[ability] + if(istype(element, /obj/screen/ability/category)) + element.screen_loc = "RIGHT-[col]:-4,TOP-[row]" + else if(!element.invisibility) + button_pos++ + if((button_pos-col) > 5) + button_row++ + .++ + button_pos = col+1 + element.screen_loc = "RIGHT-[button_pos]:-4,TOP-[button_row]" + +/datum/ability_handler/proc/toggle_category_visibility(force_state) + showing_abilities = isnull(force_state) ? !showing_abilities : force_state + update_screen_elements() + if(master) + master.refresh_element_positioning() + +/datum/ability_handler/proc/update_screen_elements() + for(var/ability in screen_elements) + var/obj/screen/ability/ability_button = screen_elements[ability] + ability_button.update_icon() + +/datum/ability_handler/proc/copy_abilities_to(mob/living/target) + for(var/decl/ability/ability as anything in known_abilities) + if(!ability.copy_with_mind) + continue + if(target.add_ability(ability, get_metadata(ability, create_if_missing = FALSE))) + . = TRUE + +/datum/ability_handler/proc/disable_abilities(amount) + for(var/ability in known_abilities) + var/list/metadata = get_metadata(ability) + metadata["disabled"] = max(metadata["disabled"], (world.time + amount)) + +/datum/ability_handler/proc/enable_abilities(amount) + for(var/ability in known_abilities) + var/list/metadata = get_metadata(ability) + metadata["disabled"] = 0 + +/datum/ability_handler/proc/add_screen_element(atom/element, decl/ability/ability, update_positions = TRUE) + if(isnull(ability) || isnum(ability)) + return + LAZYSET(screen_elements, ability, element) + owner?.client?.screen |= element + if(istype(element, /obj/screen/ability)) + var/obj/screen/ability/ability_button = element + ability_button.owning_handler = src + if(update_positions && master && length(screen_elements)) + master.refresh_element_positioning() + +/datum/ability_handler/proc/remove_screen_element(atom/element, decl/ability/ability, update_positions = TRUE) + if(isnull(ability) || isnum(ability)) + return + LAZYREMOVE(screen_elements, ability) + owner?.client?.screen -= element + if(istype(element, /obj/screen/ability)) + var/obj/screen/ability/ability_button = element + if(ability_button.owning_handler == src) + ability_button.owning_handler = null + if(update_positions && master && LAZYLEN(screen_elements)) + master.refresh_element_positioning() + /datum/ability_handler/proc/cancel() if(LAZYLEN(ability_items)) for(var/thing in ability_items) @@ -29,9 +201,48 @@ qdel(thing) ability_items = null +/datum/ability_handler/proc/show_stat_string(mob/user) + if(!stat_panel_type || !statpanel(stat_panel_type)) + return + for(var/ability_type in known_abilities) + var/decl/ability/ability = GET_DECL(ability_type) + var/list/stat_strings = ability.get_stat_strings(get_metadata(ability)) + if(length(stat_strings) >= 2) + stat(stat_strings[1], stat_strings[2]) + /// Individual ability methods/disciplines (psioncs, etc.) so that mobs can have multiple. /datum/ability_handler/proc/refresh_login() - return + SHOULD_CALL_PARENT(TRUE) + if(LAZYLEN(screen_elements)) + var/list/add_elements = list() + for(var/ability in screen_elements) + var/atom/element = screen_elements[ability] + if(istype(element)) + add_elements |= element + if(length(add_elements)) + owner?.client?.screen |= add_elements + +/datum/ability_handler/proc/cancel_prepared_ability() + if(!prepared_ability) + return FALSE + if(prepared_ability.cancel_ability_1p_str) + to_chat(owner, capitalize(emote_replace_user_tokens(prepared_ability.cancel_ability_1p_str), owner)) + var/obj/screen/ability/button/button = LAZYACCESS(screen_elements, prepared_ability) + prepared_ability = null + if(istype(button)) + button.update_icon() + return TRUE + +/datum/ability_handler/proc/prepare_ability(decl/ability/ability) + if(prepared_ability && !cancel_prepared_ability()) + return FALSE + prepared_ability = ability + if(ability.ready_ability_1p_str) + to_chat(owner, capitalize(emote_replace_user_tokens(ability.ready_ability_1p_str), owner)) + var/obj/screen/ability/button/button = LAZYACCESS(screen_elements, ability) + if(istype(button)) + button.update_icon() + return TRUE /datum/ability_handler/proc/can_do_self_invocation(mob/user) return FALSE @@ -46,13 +257,23 @@ return FALSE /datum/ability_handler/proc/can_do_melee_invocation(mob/user, atom/target) - return FALSE + SHOULD_CALL_PARENT(TRUE) + return prepared_ability ? prepared_ability.is_melee_invocation : FALSE /datum/ability_handler/proc/do_melee_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(TRUE) + if(prepared_ability) + prepared_ability.use_ability(user, target, src) + return TRUE return FALSE /datum/ability_handler/proc/can_do_ranged_invocation(mob/user, atom/target) - return FALSE + SHOULD_CALL_PARENT(TRUE) + return prepared_ability ? prepared_ability.is_ranged_invocation : FALSE /datum/ability_handler/proc/do_ranged_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(TRUE) + if(prepared_ability) + prepared_ability.use_ability(user, target, src) + return TRUE return FALSE diff --git a/code/datums/extensions/abilities/ability_item.dm b/code/datums/extensions/abilities/ability_item.dm index 98bb2b8d43b..b4838fd4145 100644 --- a/code/datums/extensions/abilities/ability_item.dm +++ b/code/datums/extensions/abilities/ability_item.dm @@ -1,26 +1,37 @@ /obj/item/ability - simulated = 1 - obj_flags = OBJ_FLAG_NO_STORAGE - anchored = TRUE + simulated = FALSE + icon = 'icons/mob/screen/ability_inhand.dmi' + obj_flags = OBJ_FLAG_NO_STORAGE + anchored = TRUE pickup_sound = null drop_sound = null equip_sound = null is_spawnable_type = FALSE abstract_type = /obj/item/ability - var/mob/living/owner + var/decl/ability/ability + var/weakref/owner_ref var/handler_type -/obj/item/ability/Initialize() - owner = loc - if(!istype(owner)) +/obj/item/ability/Initialize(ml, decl/ability/_ability) + var/mob/living/owner = loc + var/datum/ability_handler/handler = istype(owner) && owner.get_ability_handler(handler_type, FALSE) + if(!istype(handler)) return INITIALIZE_HINT_QDEL - return ..() + if(_ability) + ability = _ability + if(!istype(ability)) + return INITIALIZE_HINT_QDEL + owner_ref = weakref(owner) + LAZYDISTINCTADD(handler.ability_items, src) + . = ..() + owner.put_in_hands(src) /obj/item/ability/Destroy() + var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/handler = istype(owner) && owner.get_ability_handler(handler_type, FALSE) - if(handler) + if(istype(handler)) LAZYREMOVE(handler.ability_items, src) - . = ..() + return ..() /obj/item/ability/dropped() ..() @@ -29,3 +40,23 @@ /obj/item/ability/attack_self(var/mob/user) user?.drop_from_inventory(src) return TRUE + +/obj/item/ability/use_on_mob(mob/living/target, mob/living/user, animate) + return FALSE + +/obj/item/ability/afterattack(atom/target, mob/user, proximity) + if(QDELETED(src) || !istype(ability)) + return TRUE + var/list/metadata = ability.get_metadata_for(user) + if(!islist(metadata)) + return TRUE + if(ability.projectile_type) + // Fire a projectile if that is how this ability works. + ability.fire_projectile_at(user, target, metadata) + else + // Otherwise, apply to the target. Range checking etc. will be handled in apply_effect(). + ability.apply_effect(user, target, metadata) + + // Clean up our item if needed. + if(ability.item_end_on_cast) + qdel(src) diff --git a/code/datums/extensions/abilities/ability_projectile.dm b/code/datums/extensions/abilities/ability_projectile.dm new file mode 100644 index 00000000000..896acba2e95 --- /dev/null +++ b/code/datums/extensions/abilities/ability_projectile.dm @@ -0,0 +1,31 @@ +/obj/item/projectile/ability + name = "ability" + // The projectile is functionally a tracer, the ability deals the damage. + nodamage = TRUE + penetrating = FALSE + + /// Default; can be set by the ability. + life_span = 1 SECOND + + var/expended = FALSE + var/mob/owner + var/list/ability_metadata + var/decl/ability/carried_ability + +/obj/item/projectile/ability/Destroy() + owner = null + carried_ability = null + return ..() + +/obj/item/projectile/ability/explosion_act() + SHOULD_CALL_PARENT(FALSE) + +/obj/item/projectile/ability/Bump(var/atom/A, forced=0) + if(loc && carried_ability && !expended) + carried_ability.apply_effect(owner, A, ability_metadata, src) + return TRUE + +/obj/item/projectile/ability/on_impact(var/atom/A) + if(loc && carried_ability && !expended) + carried_ability.apply_effect(owner, A, ability_metadata, src) + return TRUE diff --git a/code/datums/extensions/abilities/ability_targeting.dm b/code/datums/extensions/abilities/ability_targeting.dm new file mode 100644 index 00000000000..52f7ee8166c --- /dev/null +++ b/code/datums/extensions/abilities/ability_targeting.dm @@ -0,0 +1,91 @@ +/decl/ability_targeting + abstract_type = /decl/ability_targeting + /// If set, this ability is applied to a square of this radius. + var/effect_radius = 0 + /// Set to except the inner space of the spell from target checks. + var/effect_inner_radius = -1 + /// If set, user will be excepted from targets. + var/user_is_immune = FALSE + /// If set, this ability will never target our faction. + var/faction_immune = FALSE + /// If set, this ability will only target our faction. + var/faction_only = FALSE + /// If set, this ability will resolve targets to turfs before doing any assessment or targetting. + var/target_turf = TRUE + /// If set along with target turf type, will include dense turfs. + var/ignore_dense_turfs = TRUE + /// If set along target turf type, will include space turfs. + var/ignore_space_turfs = FALSE + +/decl/ability_targeting/proc/get_effect_radius(mob/user, atom/hit_target, list/metadata) + return effect_radius + +/// This proc exists so that subtypes can override it and take advantage of the speed benefits of `for(var/mob in range())` and similar optimizations. +/// It should ONLY ever be called in get_affected(). +/decl/ability_targeting/proc/get_affected_atoms(atom/center, new_effect_radius) + PROTECTED_PROC(TRUE) + . = list() + for(var/atom/target in range(center, new_effect_radius)) + . += target + +/decl/ability_targeting/proc/get_affected(mob/user, atom/hit_target, list/metadata, decl/ability/ability, obj/item/projectile/ability/projectile) + if(effect_radius <= 0) + return validate_target(user, hit_target, metadata, ability) ? list(hit_target) : null + var/atom/center = projectile || hit_target + var/new_effect_radius = get_effect_radius(user, hit_target, metadata) + var/list/except_atoms = effect_inner_radius >= 0 ? range(effect_inner_radius, center) : null + var/list/target_candidates = get_affected_atoms(center, new_effect_radius) + for(var/atom/target in except_atoms ? target_candidates - except_atoms : target_candidates) // sloooooow... + if(validate_target(user, target, metadata, ability)) + LAZYADD(., target) + +/decl/ability_targeting/proc/resolve_initial_target(atom/target) + if(target_turf) + return get_turf(target) + return target + +/decl/ability_targeting/proc/validate_initial_target(mob/user, atom/target, list/metadata, decl/ability/ability) + return validate_target(user, target, metadata, ability) + +/decl/ability_targeting/proc/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + if(target == user && !user_is_immune) + return FALSE + if(target_turf && !isturf(target)) + return FALSE + if(user.faction) + if(faction_immune && ismob(target)) + var/mob/target_mob = target + if(target_mob.faction == user.faction) + return FALSE + if(faction_only) + if(!ismob(target)) + return FALSE + var/mob/target_mob = target + if(target_mob.faction != user.faction) + return FALSE + else if(faction_only) + return FALSE + if(isturf(target)) + if(ignore_dense_turfs && target.density) + return FALSE + if(ignore_space_turfs && istype(target, /turf/space)) + return FALSE + return TRUE + +/decl/ability_targeting/clear_turf + ignore_dense_turfs = TRUE + +/decl/ability_targeting/clear_turf/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + . = ..() && isturf(target) + if(.) + var/turf/target_turf = target + return !target_turf.contains_dense_objects(user) + +/decl/ability_targeting/living_mob + target_turf = FALSE + +/decl/ability_targeting/living_mob/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + . = ..() && isliving(target) + if(.) + var/mob/living/victim = target + return victim.simulated diff --git a/code/datums/extensions/abilities/readme.dm b/code/datums/extensions/abilities/readme.dm new file mode 100644 index 00000000000..b7e17f8d59e --- /dev/null +++ b/code/datums/extensions/abilities/readme.dm @@ -0,0 +1,26 @@ +/* + + ABILITY DECL SYSTEM NOTES + + - Mobs have an extension, /datum/extension/abilities + - This extension has a list of associated handlers, /datum/ability_handler + - The handlers have a list of associated ability decls, /decl/ability, which are indexes for associative metadata lists. + - The abilities have an associated targeting handler, /decl/ability_targeting, which handles single target, turf target, AOE, etc. + - Handlers are added/removed with mob.add_ability_handler(handler_type) and mob.remove_ability_handler(handler_type) + - The extension will be added to the mob automatically when adding a handler, and removed if the last handler is removed. + - Abilities are added/removed with mob.add_ability(ability_type, preset metadata if any) and mob.remove_ability(ability_type) + - Handlers for abilities will be inferred from the /decl and added to the mob automatically. + - Metadata is retrieved with handler.get_metadata(ability type or instance) + + - Upon invocation, an ability will: + - retrieve handler and metadata from the user mob + - validate the handler/metadata/user against whatever requirements the ability has + - resolve the initial click target to the appropriate target for the ability (turf under the clicked target for example) + - check any additional requirements like charges, cooldowns, etc. + - if a projectile ability, spawn and launch a projectile that will carry the ability and metadata to the destination target. + - apply the ability to the destination target + - while applying the ability, the targeting decl will be used to grab all applicable targets at or near the point of use (projectile hit or clicked target) + - the ability effects will then get applied (fire, ice, explosion, so on) + - the ability will then set cooldown as appropriate in metadata, deduct charges, etc + +*/ \ No newline at end of file diff --git a/code/datums/extensions/assembly/assembly_interaction.dm b/code/datums/extensions/assembly/assembly_interaction.dm index 9e250bb5d7b..a4c4c8b2f92 100644 --- a/code/datums/extensions/assembly/assembly_interaction.dm +++ b/code/datums/extensions/assembly/assembly_interaction.dm @@ -20,7 +20,7 @@ return TRUE to_chat(user, "You begin repairing damage to \the [holder]...") - if(WT.weld(round(damage/75)) && do_after(usr, damage/10)) + if(WT.weld(round(damage/75)) && do_after(user, damage/10)) damage = 0 to_chat(user, "You repair \the [holder].") return TRUE @@ -33,11 +33,11 @@ for(var/obj/item/stock_parts/computer/H in parts) component_names.Add(H.name) - var/choice = input(usr, "Which component do you want to uninstall?", "[assembly_name] maintenance", null) as null|anything in component_names + var/choice = input(user, "Which component do you want to uninstall?", "[assembly_name] maintenance", null) as null|anything in component_names if(!choice) return TRUE var/atom/movable/HA = holder - if(!HA.Adjacent(usr)) + if(!HA.Adjacent(user)) return TRUE var/obj/item/stock_parts/H = find_component_by_name(choice) diff --git a/code/datums/extensions/eye/landing.dm b/code/datums/extensions/eye/landing.dm index b54a722cb4f..deaa8dafc8d 100644 --- a/code/datums/extensions/eye/landing.dm +++ b/code/datums/extensions/eye/landing.dm @@ -27,12 +27,12 @@ /datum/action/eye/landing/rotate_cw name = "Rotate clockwise" - procname ="turn_shuttle_cw" + procname = TYPE_PROC_REF(/mob/observer/eye/landing, turn_shuttle_cw) button_icon_state = "shuttle_rotate_cw" target_type = EYE_TARGET /datum/action/eye/landing/rotate_ccw name = "Rotate counterclockwise" - procname ="turn_shuttle_ccw" + procname = TYPE_PROC_REF(/mob/observer/eye/landing, turn_shuttle_ccw) button_icon_state = "shuttle_rotate_ccw" target_type = EYE_TARGET \ No newline at end of file diff --git a/code/datums/extensions/holster/holster.dm b/code/datums/extensions/holster/holster.dm index f83a5ac67a9..569ca88bdb1 100644 --- a/code/datums/extensions/holster/holster.dm +++ b/code/datums/extensions/holster/holster.dm @@ -73,16 +73,16 @@ to_chat(user, SPAN_WARNING("You need an empty hand to draw \the [holstered]!")) return 1 var/using_intent_preference = user.client ? user.client.get_preference_value(/datum/client_preference/holster_on_intent) == PREF_YES : FALSE - if(avoid_intent || (using_intent_preference && user.a_intent != I_HELP)) + if(avoid_intent || (using_intent_preference && !user.check_intent(I_FLAG_HELP))) var/sound_vol = 25 - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) sound_vol = 50 if(istype(holstered, /obj/item/gun)) var/obj/item/gun/G = holstered G.check_accidents(user) if(G.safety() && !user.skill_fail_prob(SKILL_WEAPONS, 100, SKILL_EXPERT, 0.5)) //Experienced shooter will disable safety before shooting. G.toggle_safety(user) - usr.visible_message( + user.visible_message( "\The [user] draws \the [holstered], ready to go!", "You draw \the [holstered], ready to go!" ) @@ -111,7 +111,7 @@ to_chat(user, "It is empty.") /datum/extension/holster/proc/check_holster() - if(holstered.loc != storage) + if(holstered.loc != storage.holder) clear_holster() /atom/proc/holster_verb(var/holster_name in get_holsters()) @@ -154,4 +154,63 @@ else for(var/i = 1 to holster_accessories.len) var/holster_name = "[accessory_name] [i]" - .[holster_name] = get_extension(holster_accessories[i], /datum/extension/holster) \ No newline at end of file + .[holster_name] = get_extension(holster_accessories[i], /datum/extension/holster) + +// Basic unholster for an item at the top level. +/decl/interaction_handler/unholster + name = "Unholster" + +/decl/interaction_handler/unholster/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() && !prop + if(.) + var/datum/extension/holster/holster = get_extension(target, /datum/extension/holster) + return !!holster?.holstered + +/decl/interaction_handler/unholster/invoked(atom/target, mob/user, obj/item/prop) + var/datum/extension/holster/holster = get_extension(target, /datum/extension/holster) + return holster?.unholster(user, avoid_intent = TRUE) + +// Interaction procs for getting this interaction for basic items. +/obj/item/get_quick_interaction_handler(mob/user) + if(!(. = ..())) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + if(holster?.holstered) + return GET_DECL(/decl/interaction_handler/unholster) + +// More complex version of the above that iterates clothing accessories. +/decl/interaction_handler/unholster_accessory + name = "Unholster From Accessory" + expected_target_type = /obj/item/clothing + +/decl/interaction_handler/unholster_accessory/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() && !prop + if(.) + var/obj/item/clothing/clothes = target + for(var/obj/item/thing in clothes.accessories) + var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster) + if(holster?.holstered) + return TRUE + return FALSE + +/decl/interaction_handler/unholster_accessory/invoked(atom/target, mob/user, obj/item/prop) + var/obj/item/clothing/clothes = target + for(var/obj/item/thing in clothes.accessories) + var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster) + if(holster?.unholster(user, avoid_intent = TRUE)) + return TRUE + return FALSE + +// Interaction procs for getting this interaction for clothing accessories. +/obj/item/clothing/get_alt_interactions(mob/user) + . = ..() + for(var/obj/item/thing in accessories) + var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster) + if(holster?.holstered) + LAZYADD(., GET_DECL(/decl/interaction_handler/unholster_accessory)) + +/obj/item/clothing/get_quick_interaction_handler(mob/user) + if(!(. = ..())) + for(var/obj/item/thing in accessories) + var/datum/extension/holster/holster = get_extension(thing, /datum/extension/holster) + if(holster?.holstered) + return GET_DECL(/decl/interaction_handler/unholster_accessory) diff --git a/code/datums/extensions/milkable/milkable.dm b/code/datums/extensions/milkable/milkable.dm index debc42f4853..523a37e3e53 100644 --- a/code/datums/extensions/milkable/milkable.dm +++ b/code/datums/extensions/milkable/milkable.dm @@ -8,6 +8,10 @@ var/milk_min = 5 var/milk_max = 10 + var/cream_type = /decl/material/liquid/drink/milk/cream + var/cream_min = 2 + var/cream_max = 5 + var/impatience = 0 var/decl/skill/milking_skill = SKILL_BOTANY var/milking_skill_req = SKILL_BASIC @@ -42,9 +46,16 @@ create_milk() /datum/extension/milkable/proc/create_milk() - var/create_milk = min(rand(milk_min, milk_max), REAGENTS_FREE_SPACE(udder)) - if(create_milk > 0) - udder.add_reagent(milk_type, create_milk, get_milk_data()) + + var/create_milk = min(rand(milk_min, milk_max), REAGENTS_FREE_SPACE(udder)) + var/create_cream = min(rand(cream_min, cream_max), REAGENTS_FREE_SPACE(udder) - create_milk) + + if(create_milk <= 0 && create_cream <= 0) + return + + var/list/milk_data = get_milk_data() + udder.add_reagent(milk_type, create_milk, milk_data) + udder.add_reagent(cream_type, create_cream, milk_data) /datum/extension/milkable/proc/get_milk_data() var/static/list/milk_data = list( @@ -113,7 +124,7 @@ SPAN_NOTICE("\The [user] milks \the [critter] into \the [container]."), SPAN_NOTICE("You milk \the [critter] into \the [container].") ) - udder.trans_type_to(container, milk_type, min(REAGENTS_FREE_SPACE(container.reagents), rand(15, 20))) + udder.trans_to(container, min(REAGENTS_FREE_SPACE(container.reagents), rand(15, 20))) return TRUE /datum/extension/milkable/proc/handle_milking_failure(mob/user, mob/living/critter) diff --git a/code/datums/extensions/multitool/_multitool.dm b/code/datums/extensions/multitool/_multitool.dm deleted file mode 100644 index fd581a007f9..00000000000 --- a/code/datums/extensions/multitool/_multitool.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define MT_NOACTION 0 -#define MT_REFRESH 1 -#define MT_CLOSE 2 diff --git a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm index 703d9c4f3f6..ae95b5cb13a 100644 --- a/code/datums/extensions/multitool/circuitboards/buildtype_select.dm +++ b/code/datums/extensions/multitool/circuitboards/buildtype_select.dm @@ -25,5 +25,5 @@ board.build_path = path var/obj/thing = path board.SetName("circuitboard ([initial(thing.name)])") - return MT_REFRESH + return TOPIC_REFRESH return ..() \ No newline at end of file diff --git a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm index 9e267968246..77ad6c394f3 100644 --- a/code/datums/extensions/multitool/circuitboards/shuttle_console.dm +++ b/code/datums/extensions/multitool/circuitboards/shuttle_console.dm @@ -19,11 +19,11 @@ break if(!new_name) to_chat(user, SPAN_WARNING("No eligible shuttle could be located. Make sure the board is inside a shuttle and try again.")) - return MT_NOACTION + return TOPIC_NOACTION if(!board.is_valid_shuttle(SSshuttle.shuttles[new_name])) to_chat(user, SPAN_WARNING("The current shuttle does not support this console type. Try a different shuttle or circuit board.")) - return MT_NOACTION + return TOPIC_NOACTION board.shuttle_tag = new_name to_chat(user, SPAN_NOTICE("You set the shuttle name to '[new_name]'.")) - return MT_REFRESH + return TOPIC_REFRESH return ..() \ No newline at end of file diff --git a/code/datums/extensions/multitool/circuitboards/stationalert.dm b/code/datums/extensions/multitool/circuitboards/stationalert.dm index e3ec67a2024..209dfba6b73 100644 --- a/code/datums/extensions/multitool/circuitboards/stationalert.dm +++ b/code/datums/extensions/multitool/circuitboards/stationalert.dm @@ -18,12 +18,12 @@ var/datum/alarm_handler/AH = locate(href_list["add"]) in SSalarm.all_handlers if(AH) SA.alarm_handlers |= AH - return MT_REFRESH + return TOPIC_REFRESH if(href_list["remove"]) var/datum/alarm_handler/AH = locate(href_list["remove"]) in SSalarm.all_handlers if(AH) SA.alarm_handlers -= AH - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/datums/extensions/multitool/items/cable.dm b/code/datums/extensions/multitool/items/cable.dm index f58fc823297..7f95e27e73e 100644 --- a/code/datums/extensions/multitool/items/cable.dm +++ b/code/datums/extensions/multitool/items/cable.dm @@ -21,6 +21,6 @@ var/obj/item/stack/cable_coil/cable_coil = holder if(href_list["select_color"] && (href_list["select_color"] in get_global_cable_colors())) cable_coil.set_cable_color(href_list["select_color"], user) - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/datums/extensions/multitool/items/stock_parts_radio.dm b/code/datums/extensions/multitool/items/stock_parts_radio.dm index ec0b51dc454..e35bf864977 100644 --- a/code/datums/extensions/multitool/items/stock_parts_radio.dm +++ b/code/datums/extensions/multitool/items/stock_parts_radio.dm @@ -49,48 +49,48 @@ var/obj/item/stock_parts/radio/radio = holder if(href_list["unlink"]) machine = null - return MT_CLOSE + return TOPIC_CLOSE if(href_list["frequency"]) var/new_frequency = input(user, "Select a new frequency:", "Frequency Selection", radio.frequency) as null|num if(!new_frequency || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) if(new_frequency == radio.frequency) - return MT_NOACTION + return TOPIC_NOACTION radio.set_frequency(new_frequency, radio.filter) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["id_tag"]) var/new_id_tag = input(user, "Select a new ID:", "ID Selection", radio.id_tag) as null|text if(!new_id_tag || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_id_tag = sanitize(new_id_tag) if(new_id_tag == radio.id_tag) - return MT_NOACTION + return TOPIC_NOACTION radio.set_id_tag(new_id_tag) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["filter"]) var/new_filter = input(user, "Select a new radio filter (usually signals are sent to listeners on your id_tag; this will override that behavior):", "Filter Selection", radio.filter) as null|anything in global.all_selectable_radio_filters if(!new_filter || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION if(new_filter == radio.filter) - return MT_NOACTION + return TOPIC_NOACTION radio.set_frequency(radio.frequency, new_filter) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["encryption"]) var/new_encryption = input(user, "Select a new encryption key:", "Encryption Key Selection", radio.encryption) as null|num if(!new_encryption || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_encryption = sanitize_integer(new_encryption, 0, 999, radio.encryption) if(new_encryption == radio.encryption) - return MT_NOACTION + return TOPIC_NOACTION radio.encryption = new_encryption - return MT_REFRESH + return TOPIC_REFRESH if(href_list["stockreset"]) var/obj/machinery/actual_machine = machine && machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE actual_machine.apply_preset_to(radio) - return MT_REFRESH + return TOPIC_REFRESH // Helper. /datum/extension/interactive/multitool/radio/proc/event_list_to_selection_table(table_tag, list/selected_events) @@ -111,44 +111,44 @@ if(href_list["remove"]) var/thing = href_list["remove"] LAZYREMOVE(selected_events, thing) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["rename"]) var/thing = href_list["rename"] if(selected_events && selected_events[thing]) var/new_name = input(user, "Select a new message key for this item:", "Key Select", thing) as null|text new_name = sanitize(new_name) if(!new_name || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_REFRESH + return TOPIC_REFRESH if(!selected_events || !selected_events[thing]) - return MT_REFRESH + return TOPIC_REFRESH selected_events[new_name] = selected_events[thing] selected_events -= thing - return MT_REFRESH + return TOPIC_REFRESH if(href_list["new_val"]) var/thing = href_list["new_val"] var/decl/public_access/variable = selected_events && selected_events[thing] if(!variable || !LAZYLEN(valid_events)) - return MT_REFRESH + return TOPIC_REFRESH var/valid_variables = list() for(var/path in valid_events) valid_variables += valid_events[path] var/new_var = input(user, "Select a new action for this item:", "Action Select", thing) as null|anything in valid_variables if(!new_var || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_REFRESH + return TOPIC_REFRESH if(!(selected_events && selected_events[thing] == variable)) - return MT_REFRESH + return TOPIC_REFRESH selected_events[thing] = new_var - return MT_REFRESH + return TOPIC_REFRESH if(href_list["add"]) if(!LAZYLEN(valid_events)) - return MT_REFRESH + return TOPIC_REFRESH LAZYSET(selected_events, copytext(md5(num2text(rand(0, 1))), 1, 11), valid_events[pick(valid_events)]) // random key - return MT_REFRESH + return TOPIC_REFRESH if(href_list["desc"]) var/decl/public_access/variable = locate(href_list["desc"]) if(istype(variable)) to_chat(user, variable.desc) - return MT_NOACTION + return TOPIC_NOACTION /datum/extension/interactive/multitool/radio/transmitter/aquire_target() var/obj/machinery/actual_machine = ..() @@ -178,7 +178,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/transmitter/basic/radio = holder if(href_list["on_change"]) return event_list_topic(radio.transmit_on_change, actual_machine.public_variables, user, href_list) @@ -216,7 +216,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/transmitter/on_event/radio = holder if(href_list["on_event"]) @@ -257,7 +257,7 @@ return var/obj/machinery/actual_machine = machine.resolve() if(!actual_machine) - return MT_CLOSE + return TOPIC_CLOSE var/obj/item/stock_parts/radio/receiver/radio = holder if(href_list["call"]) return event_list_topic(radio.receive_and_call, actual_machine.public_methods, user, href_list) diff --git a/code/datums/extensions/multitool/multitool.dm b/code/datums/extensions/multitool/multitool.dm index 08e98ebe7eb..7bfdeac2770 100644 --- a/code/datums/extensions/multitool/multitool.dm +++ b/code/datums/extensions/multitool/multitool.dm @@ -13,7 +13,7 @@ popup.set_content(html) popup.open() else - close_window(usr) + close_window(user) /datum/extension/interactive/multitool/proc/get_interact_window(var/obj/item/multitool/M, var/mob/user) return @@ -36,7 +36,7 @@ /datum/extension/interactive/multitool/extension_act(href, href_list, var/mob/user) if(..()) - close_window(usr) + close_window(user) return TRUE var/obj/item/multitool/M = user.get_multitool() @@ -45,26 +45,29 @@ . = send_buffer(M, buffer, user) else if(href_list["purge"]) M.set_buffer(null) - . = MT_REFRESH + . = TOPIC_REFRESH else . = on_topic(href, href_list, user) - switch(.) - if(MT_REFRESH) - interact(M, user) - if(MT_CLOSE) - close_window(user) - return MT_NOACTION ? FALSE : TRUE + if(. & TOPIC_CLOSE) + close_window(user) + return TOPIC_HANDLED // don't run any other Topic() behavior for this call + else if(. & TOPIC_REFRESH) + interact(M, user) + return TOPIC_HANDLED // don't return TOPIC_REFRESH to avoid any potential double-refreshes + else if(!.) + return TOPIC_NOACTION + return TOPIC_REFRESH /datum/extension/interactive/multitool/proc/on_topic(href, href_list, user) - return MT_NOACTION + return TOPIC_NOACTION /datum/extension/interactive/multitool/proc/send_buffer(var/obj/item/multitool/M, var/atom/buffer, var/mob/user) if(M.get_buffer() == buffer && buffer) receive_buffer(M, buffer, user) else if(!buffer) to_chat(user, "Unable to acquire data from the buffered object. Purging from memory.") - return MT_REFRESH + return TOPIC_REFRESH /datum/extension/interactive/multitool/proc/receive_buffer(var/obj/item/multitool/M, var/atom/buffer, var/mob/user) return \ No newline at end of file diff --git a/code/datums/extensions/state_machine.dm b/code/datums/extensions/state_machine.dm index 63e58f0dd67..edba84c7965 100644 --- a/code/datums/extensions/state_machine.dm +++ b/code/datums/extensions/state_machine.dm @@ -3,16 +3,15 @@ var/global/list/state_machines = list() /proc/get_state_machine(var/datum/holder, var/base_type) if(istype(holder) && base_type && holder.has_state_machine) - var/list/machines = global.state_machines["\ref[holder]"] + var/list/machines = global.state_machines[holder] return islist(machines) && machines[base_type] /proc/add_state_machine(var/datum/holder, var/datum/state_machine/fsm_type) if(istype(holder) && fsm_type) - var/holder_ref = "\ref[holder]" - var/list/machines = global.state_machines[holder_ref] + var/list/machines = global.state_machines[holder] if(!islist(machines)) machines = list() - global.state_machines[holder_ref] = machines + global.state_machines[holder] = machines var/base_type = fsm_type::base_type if(!machines[base_type]) var/datum/state_machine/machine = new fsm_type(holder) @@ -22,12 +21,11 @@ var/global/list/state_machines = list() /proc/remove_state_machine(var/datum/holder, var/base_type) if(istype(holder) && base_type && holder.has_state_machine) - var/holder_ref = "\ref[holder]" - var/list/machines = global.state_machines[holder_ref] + var/list/machines = global.state_machines[holder] if(length(machines)) machines -= base_type if(!length(machines)) - global.state_machines -= holder_ref + global.state_machines -= holder holder.has_state_machine = FALSE return TRUE return FALSE diff --git a/code/datums/extensions/storage/_storage.dm b/code/datums/extensions/storage/_storage.dm index e6200fdaf08..4ff70967e1c 100644 --- a/code/datums/extensions/storage/_storage.dm +++ b/code/datums/extensions/storage/_storage.dm @@ -79,12 +79,10 @@ var/global/list/_test_storage_items = list() LAZYDISTINCTADD(., storage_inv) /datum/storage/proc/show_to(mob/user) - if(storage_ui) - storage_ui.show_to(user) + storage_ui?.show_to(user) /datum/storage/proc/hide_from(mob/user) - if(storage_ui) - storage_ui.hide_from(user) + storage_ui?.hide_from(user) /datum/storage/proc/open(mob/user) if(!opened) @@ -98,11 +96,12 @@ var/global/list/_test_storage_items = list() robot.hud_used.toggle_show_robot_modules() prepare_ui() - storage_ui.on_open(user) - storage_ui.show_to(user) + if(storage_ui) + storage_ui.on_open(user) + storage_ui.show_to(user) /datum/storage/proc/prepare_ui() - storage_ui.prepare_ui() + storage_ui?.prepare_ui() /datum/storage/proc/close(mob/user) if(opened) @@ -110,12 +109,10 @@ var/global/list/_test_storage_items = list() play_close_sound() holder?.queue_icon_update() hide_from(user) - if(storage_ui) - storage_ui.after_close(user) + storage_ui?.after_close(user) /datum/storage/proc/close_all() - if(storage_ui) - storage_ui.close_all() + storage_ui?.close_all() /datum/storage/proc/storage_space_used() . = 0 @@ -153,10 +150,10 @@ var/global/list/_test_storage_items = list() return 0 //If attempting to lable the storage item, silently fail to allow it - if(istype(W, /obj/item/hand_labeler) && user?.a_intent != I_HELP) + if(istype(W, /obj/item/hand_labeler) && !user?.check_intent(I_FLAG_HELP)) return FALSE //Prevent package wrapper from being inserted by default - if(istype(W, /obj/item/stack/package_wrap) && user?.a_intent != I_HELP) + if(istype(W, /obj/item/stack/package_wrap) && !user?.check_intent(I_FLAG_HELP)) return FALSE // Don't allow insertion of unsafed compressed matter implants @@ -255,6 +252,8 @@ var/global/list/_test_storage_items = list() storage_ui?.on_insertion() /datum/storage/proc/update_ui_after_item_removal(obj/item/removed) + if(QDELETED(holder)) + return prepare_ui() storage_ui?.on_post_remove() diff --git a/code/datums/extensions/storage/_storage_ui.dm b/code/datums/extensions/storage/_storage_ui.dm index 6f4db924f32..a3e1f23bfcb 100644 --- a/code/datums/extensions/storage/_storage_ui.dm +++ b/code/datums/extensions/storage/_storage_ui.dm @@ -216,7 +216,8 @@ closer.screen_loc = "LEFT+[SCREEN_LOC_MOD_FIRST + cols + 1]:[SCREEN_LOC_MOD_DIVIDED],BOTTOM+[SCREEN_LOC_MOD_SECOND]:[SCREEN_LOC_MOD_DIVIDED]" /datum/storage_ui/default/proc/space_orient_objs() - + if(QDELETED(_storage?.holder)) // don't bother if we've been deleted + return var/baseline_max_storage_space = DEFAULT_BOX_STORAGE //storage size corresponding to 224 pixels var/storage_cap_width = 2 //length of sprite for start and end of the box representing total storage space var/stored_cap_width = 4 //length of sprite for start and end of the box representing the stored item diff --git a/code/datums/extensions/storage/subtypes_basket.dm b/code/datums/extensions/storage/subtypes_basket.dm index 26b00fd25da..e5601ca9115 100644 --- a/code/datums/extensions/storage/subtypes_basket.dm +++ b/code/datums/extensions/storage/subtypes_basket.dm @@ -3,3 +3,6 @@ use_sound = 'sound/effects/storage/box.ogg' max_w_class = ITEM_SIZE_LARGE max_storage_space = DEFAULT_BOX_STORAGE + +/datum/storage/basket/large + max_storage_space = DEFAULT_BACKPACK_STORAGE diff --git a/code/datums/extensions/storage/subtypes_mre.dm b/code/datums/extensions/storage/subtypes_mre.dm index 5b7f4910716..b5045c1fc1b 100644 --- a/code/datums/extensions/storage/subtypes_mre.dm +++ b/code/datums/extensions/storage/subtypes_mre.dm @@ -5,8 +5,11 @@ open_sound = 'sound/effects/rip1.ogg' /datum/storage/mre/open(mob/user) - if(!opened) - to_chat(user, "You tear open the bag, breaking the vacuum seal.") + var/obj/item/mre/mre = holder + if(istype(mre) && !mre.has_been_opened) + to_chat(user, SPAN_NOTICE("You tear open the bag, breaking the vacuum seal.")) + mre.has_been_opened = TRUE + mre.update_icon() . = ..() /datum/storage/mrebag diff --git a/code/datums/extensions/storage/subtypes_sheets.dm b/code/datums/extensions/storage/subtypes_sheets.dm index 1db2042cb97..a72c49ab856 100644 --- a/code/datums/extensions/storage/subtypes_sheets.dm +++ b/code/datums/extensions/storage/subtypes_sheets.dm @@ -44,10 +44,10 @@ inserted = 1 break if(!inserted || !S.amount) - usr.drop_from_inventory(S, holder) + user.drop_from_inventory(S, holder) if(!S.amount) qdel(S) - prepare_ui(usr) + prepare_ui(user) if(isatom(holder)) var/atom/atom_holder = holder atom_holder.update_icon() @@ -64,8 +64,8 @@ if(!S.amount) qdel(S) // todo: there's probably something missing here prepare_ui() - if(usr.active_storage) - usr.active_storage.show_to(usr) + if(user.active_storage) + user.active_storage.show_to(user) if(isatom(holder)) var/atom/atom_holder = holder atom_holder.update_icon() diff --git a/code/datums/graph/graph.dm b/code/datums/graph/graph.dm index 249f513e419..1610a6b4397 100644 --- a/code/datums/graph/graph.dm +++ b/code/datums/graph/graph.dm @@ -35,6 +35,8 @@ /datum/graph/proc/Connect(var/datum/node/node, var/list/neighbours, var/queue = TRUE) SHOULD_NOT_SLEEP(TRUE) SHOULD_NOT_OVERRIDE(TRUE) + if(QDELETED(src)) + CRASH("Attempted to connect node [node] to a qdeleted graph!") if(!istype(neighbours)) neighbours = list(neighbours) if(!length(neighbours)) @@ -90,8 +92,7 @@ if(neighbours_to_disconnect) neighbours |= neighbours_to_disconnect - if(neighbours.len) - LAZYSET(pending_disconnections, node, neighbours) + LAZYSET(pending_disconnections, node, neighbours) if(queue) SSgraphs_update.Queue(src) @@ -193,8 +194,6 @@ neighbour_edges |= N LAZYCLEARLIST(pending_connections) - if(!LAZYLEN(pending_disconnections)) - return for(var/pending_node_disconnect in pending_disconnections) var/pending_edge_disconnects = pending_disconnections[pending_node_disconnect] @@ -211,7 +210,8 @@ if(!length(other_pending_edge_disconnects)) pending_disconnections -= connected_node - edges[pending_node_disconnect] -= pending_edge_disconnects + if(edges[pending_node_disconnect]) + edges[pending_node_disconnect] -= pending_edge_disconnects if(!length(edges[pending_node_disconnect])) edges -= pending_node_disconnect @@ -225,12 +225,15 @@ var/checked_nodes = list() var/list/nodes_to_traverse = list(root_node) while(length(nodes_to_traverse)) - var/node_to_check = nodes_to_traverse[nodes_to_traverse.len] + var/datum/node/node_to_check = nodes_to_traverse[nodes_to_traverse.len] nodes_to_traverse.len-- + if(QDELETED(node_to_check)) + continue checked_nodes += node_to_check nodes_to_traverse |= ((edges[node_to_check] || list()) - checked_nodes) - all_nodes -= checked_nodes - subgraphs[++subgraphs.len] = checked_nodes + if(length(checked_nodes)) + all_nodes -= checked_nodes + subgraphs[++subgraphs.len] = checked_nodes if(length(subgraphs) == 1) if(!length(nodes)) diff --git a/code/datums/inventory_slots/_inventory_slot.dm b/code/datums/inventory_slots/_inventory_slot.dm index 204284e6f2c..6f23b1b51a1 100644 --- a/code/datums/inventory_slots/_inventory_slot.dm +++ b/code/datums/inventory_slots/_inventory_slot.dm @@ -19,6 +19,8 @@ var/requires_slot_flags var/requires_organ_tag var/quick_equip_priority = 0 // Higher priority means it will be checked first. If null, will not be considered for quick equip. + /// What depth of fluid is necessary for an item in this slot to be considered submerged? + var/fluid_height = FLUID_SHALLOW // we're treating FLUID_SHALLOW as waist level, basically var/mob_overlay_layer var/alt_mob_overlay_layer diff --git a/code/datums/inventory_slots/inventory_gripper.dm b/code/datums/inventory_slots/inventory_gripper.dm index c11a09eed72..334be51e15c 100644 --- a/code/datums/inventory_slots/inventory_gripper.dm +++ b/code/datums/inventory_slots/inventory_gripper.dm @@ -5,6 +5,7 @@ /// If set, use this icon_state for the hand slot overlay; otherwise, use slot_id. var/hand_overlay quick_equip_priority = null // you quick-equip stuff by holding it in a gripper, so this ought to be skipped + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level, reasoning that you can just hold it up out of the water // For reference, grippers do not use ui_loc, they have it set dynamically during /datum/hud/proc/rebuild_hands() diff --git a/code/datums/inventory_slots/slots/slot_back.dm b/code/datums/inventory_slots/slots/slot_back.dm index cc65742561b..7c2496867ed 100644 --- a/code/datums/inventory_slots/slots/slot_back.dm +++ b/code/datums/inventory_slots/slots/slot_back.dm @@ -7,6 +7,7 @@ requires_slot_flags = SLOT_BACK mob_overlay_layer = HO_BACK_LAYER quick_equip_priority = 14 + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/back/simple requires_organ_tag = null diff --git a/code/datums/inventory_slots/slots/slot_ears.dm b/code/datums/inventory_slots/slots/slot_ears.dm index 295c24a5a89..1e905433cfc 100644 --- a/code/datums/inventory_slots/slots/slot_ears.dm +++ b/code/datums/inventory_slots/slots/slot_ears.dm @@ -10,6 +10,7 @@ requires_slot_flags = SLOT_EARS mob_overlay_layer = HO_L_EAR_LAYER quick_equip_priority = 7 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /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) diff --git a/code/datums/inventory_slots/slots/slot_glasses.dm b/code/datums/inventory_slots/slots/slot_glasses.dm index 0068fac4a1e..d686ac93edb 100644 --- a/code/datums/inventory_slots/slots/slot_glasses.dm +++ b/code/datums/inventory_slots/slots/slot_glasses.dm @@ -11,6 +11,7 @@ mob_overlay_layer = HO_GLASSES_LAYER alt_mob_overlay_layer = HO_GOGGLES_LAYER quick_equip_priority = 5 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /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_head.dm b/code/datums/inventory_slots/slots/slot_head.dm index dce1c5e4ab6..6c31459f016 100644 --- a/code/datums/inventory_slots/slots/slot_head.dm +++ b/code/datums/inventory_slots/slots/slot_head.dm @@ -9,6 +9,7 @@ requires_slot_flags = SLOT_HEAD mob_overlay_layer = HO_HEAD_LAYER quick_equip_priority = 9 + fluid_height = FLUID_OVER_MOB_HEAD /datum/inventory_slot/head/simple requires_organ_tag = null diff --git a/code/datums/inventory_slots/slots/slot_id.dm b/code/datums/inventory_slots/slots/slot_id.dm index 35d80c2c5a4..67b759c682c 100644 --- a/code/datums/inventory_slots/slots/slot_id.dm +++ b/code/datums/inventory_slots/slots/slot_id.dm @@ -6,6 +6,7 @@ requires_slot_flags = SLOT_ID mob_overlay_layer = HO_ID_LAYER quick_equip_priority = 13 + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/id/update_mob_equipment_overlay(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE) var/obj/item/clothing/clothes = 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 33f44fa9044..53fa82f6421 100644 --- a/code/datums/inventory_slots/slots/slot_mask.dm +++ b/code/datums/inventory_slots/slots/slot_mask.dm @@ -10,6 +10,7 @@ can_be_hidden = TRUE mob_overlay_layer = HO_FACEMASK_LAYER quick_equip_priority = 10 + fluid_height = (FLUID_SHALLOW * 0.25 + FLUID_OVER_MOB_HEAD * 0.75) // 3/4 of the way between waist-level and the top of your head /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_shoes.dm b/code/datums/inventory_slots/slots/slot_shoes.dm index 02c47d26787..6fc4889be0b 100644 --- a/code/datums/inventory_slots/slots/slot_shoes.dm +++ b/code/datums/inventory_slots/slots/slot_shoes.dm @@ -10,6 +10,7 @@ ) requires_slot_flags = SLOT_FEET quick_equip_priority = 3 + fluid_height = 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) diff --git a/code/datums/inventory_slots/slots/slot_suit_storage.dm b/code/datums/inventory_slots/slots/slot_suit_storage.dm index 91a03c4610d..832a7256329 100644 --- a/code/datums/inventory_slots/slots/slot_suit_storage.dm +++ b/code/datums/inventory_slots/slots/slot_suit_storage.dm @@ -5,6 +5,7 @@ slot_id = slot_s_store_str requires_organ_tag = BP_CHEST mob_overlay_layer = HO_SUIT_STORE_LAYER + fluid_height = (FLUID_SHALLOW + FLUID_OVER_MOB_HEAD) / 2 // halfway between waist and top of head, so roughly chest level /datum/inventory_slot/suit_storage/can_equip_to_slot(var/mob/user, var/obj/item/prop, var/disable_warning, var/ignore_equipped) . = ..() diff --git a/code/datums/mil_ranks.dm b/code/datums/mil_ranks.dm index 23a0b69cb66..136559c4aa7 100644 --- a/code/datums/mil_ranks.dm +++ b/code/datums/mil_ranks.dm @@ -143,10 +143,11 @@ var/global/datum/mil_branches/mil_branches = new() . += spawn_rank +// todo: should this be on /datum/map? this will need heavy reworking if we promote submaps from second to first class map status anyway /** * Populate the global branches list from global.using_map */ -/hook/startup/proc/populate_branches() +/proc/populate_branches() if(!(global.using_map.flags & MAP_HAS_BRANCH) && !(global.using_map.flags & MAP_HAS_RANK)) mil_branches.branches = null mil_branches.spawn_branches_ = null diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index 355cd25efdc..1db34888001 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -33,7 +33,6 @@ var/key var/name //replaces mob/var/original_name var/mob/living/current - var/mob/living/original //TODO: remove.not used in any meaningful way ~Carn. First I'll need to tweak the way silicon-mobs handle minds. var/active = 0 var/gen_relations_info @@ -71,19 +70,11 @@ if(current?.mind == src) current.mind = null current = null - if(original?.mind == src) - original.mind = null - original = null . = ..() /datum/mind/proc/handle_mob_deletion(mob/living/deleted_mob) if (current == deleted_mob) - current.spellremove() current = null - - if (original == deleted_mob) - original = null - /datum/mind/proc/transfer_to(mob/living/new_character) if(!istype(new_character)) to_world_log("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn") @@ -91,6 +82,8 @@ if(current?.mind == src) current.mind = null SSnano.user_transferred(current, new_character) // transfer active NanoUI instances to new user + if(istype(current)) // exclude new_players and observers + current.copy_abilities_to(new_character) if(new_character.mind) //remove any mind currently in our new body's mind variable new_character.mind.current = null @@ -99,9 +92,6 @@ current = new_character //link ourself to our new body new_character.mind = src //and link our new body to ourself - if(learned_spells && learned_spells.len) - restore_spells(new_character) - if(active) new_character.key = key //now transfer the key to link the client to our new body @@ -152,8 +142,8 @@ if(href_list["add_goal"]) - var/mob/caller = locate(href_list["add_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["add_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(can_modify) if(is_admin) @@ -171,8 +161,8 @@ if(href_list["abandon_goal"]) var/datum/goal/goal = get_goal_from_href(href_list["abandon_goal"]) - var/mob/caller = locate(href_list["abandon_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["abandon_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(goal && can_modify) if(usr == current) @@ -186,8 +176,8 @@ if(href_list["reroll_goal"]) var/datum/goal/goal = get_goal_from_href(href_list["reroll_goal"]) - var/mob/caller = locate(href_list["reroll_goal_caller"]) - if(caller && caller == current) can_modify = TRUE + var/mob/calling_proc = locate(href_list["reroll_goal_caller"]) + if(calling_proc && calling_proc == current) can_modify = TRUE if(goal && (goal in goals) && can_modify) qdel(goal) @@ -506,7 +496,6 @@ mind.key = key else mind = new /datum/mind(key) - mind.original = src SSticker.minds += mind if(!mind.name) mind.name = real_name mind.current = src diff --git a/code/datums/movement/automove_controller.dm b/code/datums/movement/automove_controller.dm index 08dae443f35..b413d999849 100644 --- a/code/datums/movement/automove_controller.dm +++ b/code/datums/movement/automove_controller.dm @@ -1,7 +1,8 @@ /// Implements automove logic; can be overridden on mob procs if you want to vary the logic from the below. /decl/automove_controller - var/completion_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom reaches its target. - var/failure_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom fails to move. + var/completion_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom reaches its target. + var/failure_signal = FALSE // Set to TRUE if you want movement to stop processing when the atom fails to move. + var/try_avoid_obstacles = TRUE // Will try to move 90 degrees around an obstacle. /decl/automove_controller/proc/handle_mover(atom/movable/mover, datum/automove_metadata/metadata) @@ -49,14 +50,16 @@ return TRUE // no idea how we would get into this position if(mover.SelfMove(target_dir) && (old_loc != mover.loc)) - return TRUE + mover.handle_post_automoved(old_loc) + return (mover.get_automove_target() == mover.loc) // We may have transitioned to the next step in a path. - // Try to move around any obstacle. - var/static/list/_alt_dir_rot = list(45, -45) - for(var/alt_dir in shuffle(_alt_dir_rot)) - mover.reset_movement_delay() - if(mover.SelfMove(turn(target_dir, alt_dir)) && (old_loc != mover.loc)) - return TRUE + if(try_avoid_obstacles) + // Try to move around any obstacle. + var/static/list/_alt_dir_rot = list(45, -45) + for(var/alt_dir in shuffle(_alt_dir_rot)) + mover.reset_movement_delay() + if(mover.SelfMove(turn(target_dir, alt_dir)) && (old_loc != mover.loc)) + return TRUE mover.failed_automove() diff --git a/code/datums/music_tracks/europa.dm b/code/datums/music_tracks/europa.dm index ccbc948eda0..b1b050118ba 100644 --- a/code/datums/music_tracks/europa.dm +++ b/code/datums/music_tracks/europa.dm @@ -8,7 +8,7 @@ /decl/music_track/martiancowboy artist = "Kevin MacLeod" title = "Martian Cowboy" - song = 'sound/music/europa/Martian Cowboy.ogg' + song = 'sound/music/europa/MartianCowboy.ogg' license = /decl/license/cc_by_3_0 url = "https://incompetech.com/music/royalty-free/index.html?isrc=usuan1100349" diff --git a/code/datums/outfits/equipment/backpacks.dm b/code/datums/outfits/equipment/backpacks.dm index 13b7df63e46..2a4aed715ea 100644 --- a/code/datums/outfits/equipment/backpacks.dm +++ b/code/datums/outfits/equipment/backpacks.dm @@ -43,6 +43,14 @@ name = "Sack" path = /obj/item/bag/sack +/decl/backpack_outfit/haversack + name = "Haversack" + path = /obj/item/backpack/crafted + +/decl/backpack_outfit/backpack/crafted + name = "Handmade Backpack" + path = /obj/item/backpack/crafted/backpack + /* Code */ /decl/backpack_outfit var/flags diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm index d2336d8be29..42538ab43b0 100644 --- a/code/datums/outfits/horror_killers.dm +++ b/code/datums/outfits/horror_killers.dm @@ -29,11 +29,11 @@ r_pocket = /obj/item/scalpel hands = list(/obj/item/bladed/axe/fire) -/decl/outfit/masked_killer/post_equip(var/mob/living/human/H) +/decl/outfit/masked_killer/post_equip(var/mob/living/wearer) ..() - var/victim = get_mannequin(H.ckey) + var/victim = get_mannequin(wearer.ckey) if(victim) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + for(var/obj/item/carried_item in wearer.get_equipped_items(TRUE)) carried_item.add_blood(victim) //Oh yes, there will be blood... just not blood from the killer because that's odd /decl/outfit/reaper @@ -50,9 +50,9 @@ pda_slot = slot_belt_str pda_type = /obj/item/modular_computer/pda/heads -/decl/outfit/reaper/post_equip(var/mob/living/human/H) +/decl/outfit/reaper/post_equip(var/mob/living/wearer) ..() - var/obj/item/secure_storage/briefcase/sec_briefcase = new(H) + var/obj/item/secure_storage/briefcase/sec_briefcase = new(wearer) for(var/obj/item/briefcase_item in sec_briefcase) qdel(briefcase_item) for(var/i=3, i>0, i--) @@ -61,4 +61,4 @@ new /obj/item/gun/projectile/revolver(sec_briefcase) new /obj/item/ammo_magazine/speedloader(sec_briefcase) new /obj/item/plastique(sec_briefcase) - H.put_in_hands_or_del(sec_briefcase) + wearer.put_in_hands_or_del(sec_briefcase) diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 5fb2378b8b2..c3728f48a2a 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -1,24 +1,26 @@ /decl/outfit abstract_type = /decl/outfit - var/name = "Naked" - var/uniform = null - var/suit = null - var/back = null - var/belt = null - var/gloves = null - var/shoes = null - var/head = null - var/mask = null - var/l_ear = null - var/r_ear = null - var/glasses = null - var/id = null - var/l_pocket = null - var/r_pocket = null + var/name = "Naked And Afraid" + var/uniform = null + var/suit = null + var/back = null + var/belt = null + var/gloves = null + var/shoes = null + var/head = null + var/mask = null + var/l_ear = null + var/r_ear = null + var/glasses = null + var/id = null + var/l_pocket = null + var/r_pocket = null var/suit_store = null - var/holster = null + var/holster = null + /// Linear list of types. Will attempt to place items in hands. var/list/hands - var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format + //. An associative list in list(path=count,otherpath=count) format. Will attempt to place items in storage. + var/list/backpack_contents var/id_type var/id_desc @@ -36,16 +38,21 @@ . = ..() backpack_overrides = backpack_overrides || list() -// This proc is structured slightly strangely because I will be adding pants to it. +// Used for slightly cleaner code around multi-equip records. +/decl/outfit/proc/resolve_equip_to_list(check_type) + if(islist(check_type)) + return check_type + if(ispath(check_type)) + return list(check_type) + return null + /decl/outfit/validate() . = ..() for(var/check_type in list(uniform, suit, back, belt, gloves, shoes, head, mask, l_ear, r_ear, glasses, id, l_pocket, r_pocket, suit_store, pda_type, id_type)) - var/obj/item/thing = check_type - if(isnull(thing)) - continue - if(TYPE_IS_ABSTRACT(thing)) - . += "equipment includes abstract type '[thing]'" + for(var/obj/item/thing as anything in resolve_equip_to_list(check_type)) + if(TYPE_IS_ABSTRACT(thing)) + . += "equipment includes abstract type '[thing]'" for(var/check_type in hands) var/obj/item/thing = check_type @@ -62,150 +69,179 @@ . += "backpack includes abstract type '[thing]'" 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/sensor/vitals - 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/outfit/proc/pre_equip(mob/living/human/H) + var/list/uniforms = resolve_equip_to_list(uniform) + if(!length(uniforms)) + . += "outfit is flagged for sensors, but has no uniform" + else + var/succeeded = FALSE + var/obj/item/sensor = new /obj/item/clothing/sensor/vitals + for(var/thing in uniforms) + if(!ispath(thing, /obj/item/clothing)) + . += "outfit is flagged for sensors, but uniform [thing] cannot take accessories" + if(thing) + var/obj/item/clothing/wear_uniform = new thing // sadly we need to read a list + if(wear_uniform.can_attach_accessory(sensor)) + succeeded = TRUE + if(!QDELETED(wear_uniform)) + qdel(wear_uniform) + if(succeeded) + break + if(!QDELETED(sensor)) + qdel(sensor) + if(!succeeded) + . += "outfit is flagged for sensors, but uniform does not accept sensors" + +/decl/outfit/proc/pre_equip(mob/living/wearer) if(outfit_flags & OUTFIT_RESET_EQUIPMENT) - H.delete_inventory(TRUE) + wearer.delete_inventory(TRUE) -/decl/outfit/proc/post_equip(mob/living/human/H) +/decl/outfit/proc/post_equip(mob/living/wearer) if(outfit_flags & OUTFIT_HAS_JETPACK) - var/obj/item/tank/jetpack/J = locate(/obj/item/tank/jetpack) in H + var/obj/item/tank/jetpack/J = locate(/obj/item/tank/jetpack) in wearer if(!J) return J.toggle() J.toggle_valve() -/decl/outfit/proc/equip_outfit(mob/living/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) +/decl/outfit/proc/equip_outfit(mob/living/wearer, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) + equip_base(wearer, equip_adjustments) + equip_id(wearer, assignment, equip_adjustments, job, rank) for(var/path in backpack_contents) - var/number = backpack_contents[path] - for(var/i=0,i severe_index) - high_security_level = severe_security_level - - // Finally switch up to the default starting security level. - current_security_level.switching_up_to() - -/decl/security_state/proc/can_change_security_level() - return current_security_level in standard_security_levels - -/decl/security_state/proc/can_switch_to(var/given_security_level) - if(!can_change_security_level()) - return FALSE - return given_security_level in standard_security_levels - -/decl/security_state/proc/current_security_level_is_lower_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index < given_index - -/decl/security_state/proc/current_security_level_is_same_or_higher_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index >= given_index - -/decl/security_state/proc/current_security_level_is_higher_than(var/given_security_level) - var/current_index = all_security_levels.Find(current_security_level) - var/given_index = all_security_levels.Find(given_security_level) - - return given_index && current_index > given_index - -/decl/security_state/proc/set_security_level(var/decl/security_level/new_security_level, var/force_change = FALSE) - if(new_security_level == current_security_level) - return FALSE - if(!(new_security_level in all_security_levels)) - return FALSE - if(!force_change && !can_switch_to(new_security_level)) - return FALSE - - var/decl/security_level/previous_security_level = current_security_level - current_security_level = new_security_level - - var/previous_index = all_security_levels.Find(previous_security_level) - var/new_index = all_security_levels.Find(new_security_level) - - if(new_index > previous_index) - previous_security_level.switching_up_from() - new_security_level.switching_up_to() - else - previous_security_level.switching_down_from() - new_security_level.switching_down_to() - - log_and_message_admins("has changed the security level from [previous_security_level.name] to [new_security_level.name].") - return TRUE - -// This proc decreases the current security level, if possible -/decl/security_state/proc/decrease_security_level(var/force_change = FALSE) - var/current_index = all_security_levels.Find(current_security_level) - if(current_index == 1) - return FALSE - return set_security_level(all_security_levels[current_index - 1], force_change) - -/decl/security_level - var/icon - var/name - - // These values are primarily for station alarms and status displays, and which light colors and overlays to use - var/light_range - var/light_power - var/light_color_alarm - var/light_color_class - var/light_color_status_display - - var/up_description - var/down_description - - var/datum/alarm_appearance/alarm_appearance - - abstract_type = /decl/security_level - -/decl/security_level/Initialize() - . = ..() - if(ispath(alarm_appearance, /datum/alarm_appearance)) - alarm_appearance = new alarm_appearance - -/decl/security_level/validate() - . = ..() - var/initial_appearance = initial(alarm_appearance) - if(!initial_appearance) - . += "alarm_appearance was not set" - else if(!ispath(initial_appearance)) - . += "alarm_appearance was not set to a /datum/alarm_appearance subpath" - else if(!istype(alarm_appearance, /datum/alarm_appearance)) - . += "alarm_appearance creation failed (check runtimes?)" - -// Called when we're switching from a lower security level to this one. -/decl/security_level/proc/switching_up_to() - return - -// Called when we're switching from a higher security level to this one. -/decl/security_level/proc/switching_down_to() - return - -// Called when we're switching from this security level to a higher one. -/decl/security_level/proc/switching_up_from() - return - -// Called when we're switching from this security level to a lower one. -/decl/security_level/proc/switching_down_from() - return - -/* -* The default security state and levels setup -*/ -/decl/security_state/default - all_security_levels = list(/decl/security_level/default/code_green, /decl/security_level/default/code_blue, /decl/security_level/default/code_red, /decl/security_level/default/code_delta) - -/decl/security_level/default - abstract_type = /decl/security_level/default - icon = 'icons/misc/security_state.dmi' - - var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) - var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) - -/decl/security_level/default/switching_up_to() - if(up_description) - security_announcement_up.Announce(up_description, "Attention! Alert level elevated to [name]!") - notify_station() - -/decl/security_level/default/switching_down_to() - if(down_description) - security_announcement_down.Announce(down_description, "Attention! Alert level changed to [name]!") - notify_station() - -/decl/security_level/default/proc/notify_station() - for(var/obj/machinery/firealarm/FA in SSmachines.machinery) - if(isContactLevel(FA.z)) - FA.update_icon() - post_status("alert") - -/decl/security_level/default/code_green - name = "code green" - - light_range = 2 - light_power = 1 - - light_color_alarm = COLOR_GREEN - light_color_class = "font_green" - light_color_status_display = COLOR_GREEN - - - alarm_appearance = /datum/alarm_appearance/green - - down_description = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - -/decl/security_level/default/code_blue - name = "code blue" - - light_range = 2 - light_power = 1 - light_color_alarm = COLOR_BLUE - light_color_class = "font_blue" - light_color_status_display = COLOR_BLUE - - alarm_appearance = /datum/alarm_appearance/blue - - up_description = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." - down_description = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." - -/decl/security_level/default/code_red - name = "code red" - - light_range = 4 - light_power = 2 - light_color_alarm = COLOR_RED - light_color_class = "font_red" - light_color_status_display = COLOR_RED - - alarm_appearance = /datum/alarm_appearance/red - - up_description = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." - down_description = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." - -/decl/security_level/default/code_delta - name = "code delta" - - light_range = 4 - light_power = 2 - light_color_alarm = COLOR_RED - light_color_class = "font_red" - light_color_status_display = COLOR_RED - - alarm_appearance = /datum/alarm_appearance/delta - - - var/static/datum/announcement/priority/security/security_announcement_delta = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/effects/siren.ogg')) - -/decl/security_level/default/code_delta/switching_up_to() - security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") - notify_station() - -/datum/alarm_appearance - var/display_icon //The icon_state for the displays. Normally only one is used, unless uses_twotone_displays is TRUE. - var/display_icon_color //The color for the display icon. - - var/display_icon_twotone //Used for two-tone displays. - var/display_icon_twotone_color //The color for the display icon. - - var/display_emblem //The icon_state for the emblem, i.e for delta, a radstorm, alerts. - var/display_emblem_color //The color for the emblem. - - var/alarm_icon //The icon_state for the alarms - var/alarm_icon_color //the color for the icon_state - - var/alarm_icon_twotone //Used for two-tone alarms (i.e delta). - var/alarm_icon_twotone_color //The color for the secondary tone icon. - -/datum/alarm_appearance/green - display_icon = "status_display_lines" - display_icon_color = PIPE_COLOR_GREEN - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_normal" - alarm_icon_color = PIPE_COLOR_GREEN - -/datum/alarm_appearance/blue - display_icon = "status_display_lines" - display_icon_color = COLOR_BLUE - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_normal" - alarm_icon_color = COLOR_BLUE - -/datum/alarm_appearance/red - display_icon = "status_display_lines" - display_icon_color = COLOR_RED - - display_emblem = "status_display_alert" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_blinking" - alarm_icon_color = COLOR_RED - -/datum/alarm_appearance/delta - display_icon = "status_display_twotone1" - display_icon_color = COLOR_RED - - display_icon_twotone = "status_display_twotone2" - display_icon_twotone_color = COLOR_YELLOW - - display_emblem = "delta" - display_emblem_color = COLOR_WHITE - - alarm_icon = "alarm_blinking_twotone1" - alarm_icon_color = COLOR_RED - - alarm_icon_twotone = "alarm_blinking_twotone2" - alarm_icon_twotone_color = PIPE_COLOR_YELLOW \ No newline at end of file diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index 91b8006a194..e7ec3c1645b 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -155,20 +155,6 @@ containername = "shield generator construction kit crate" access = access_engine -/decl/hierarchy/supply_pack/engineering/inertial_damper - name = "Equipment - inertial damper construction kit" - contains = list(/obj/item/stock_parts/circuitboard/inertial_damper, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/console_screen) - containertype = /obj/structure/closet/crate/secure - containername = "inertial damper construction kit crate" - access = access_engine - -/decl/hierarchy/supply_pack/engineering/smbig - name = "Power - Supermatter core" - contains = list(/obj/machinery/power/supermatter) - containertype = /obj/structure/closet/crate/secure/large/supermatter - containername = "\improper Supermatter crate (CAUTION)" - access = access_ce - /decl/hierarchy/supply_pack/engineering/robotics name = "Parts - Robotics assembly" contains = list(/obj/item/assembly/prox_sensor = 3, diff --git a/code/datums/supplypacks/galley.dm b/code/datums/supplypacks/galley.dm index 5eb7cc9f071..45c2c05ea16 100644 --- a/code/datums/supplypacks/galley.dm +++ b/code/datums/supplypacks/galley.dm @@ -72,6 +72,12 @@ containername = "pizza crate" supply_method = /decl/supply_method/randomized +/decl/hierarchy/supply_pack/galley/nuggets + name = "Emergency - Nugget crate" + contains = list(/obj/item/box/nuggets = 2) + containertype = /obj/structure/closet/crate/freezer + containername = "nugget crate" + /decl/hierarchy/supply_pack/galley/rations num_contained = 6 name = "Emergency - MREs" diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 6575ca30fd0..cee09fc29b6 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -74,9 +74,9 @@ /decl/hierarchy/supply_pack/nonessent/wizard name = "Costume - Wizard" contains = list(/obj/item/staff/crystal, - /obj/item/clothing/suit/wizrobe/fake, + /obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal, - /obj/item/clothing/head/wizard/fake) + /obj/item/clothing/head/wizard/beard) containername = "wizard costume crate" /decl/hierarchy/supply_pack/nonessent/costume @@ -170,9 +170,9 @@ /decl/hierarchy/supply_pack/nonessent/witch name = "Costume - Witch" - contains = list(/obj/item/clothing/suit/wizrobe/marisa/fake, + contains = list(/obj/item/clothing/suit/wizrobe/marisa, /obj/item/clothing/shoes/sandal, - /obj/item/clothing/head/wizard/marisa/fake, + /obj/item/clothing/head/wizard/marisa, /obj/item/staff/broom) containername = "witch costume crate" containertype = /obj/structure/closet diff --git a/code/datums/supplypacks/supplypack.dm b/code/datums/supplypacks/supplypack.dm index 159c8ae31e7..1be6469edc5 100644 --- a/code/datums/supplypacks/supplypack.dm +++ b/code/datums/supplypacks/supplypack.dm @@ -24,9 +24,7 @@ var/global/list/cargoprices = list() cost = 0 for(var/entry in contains) cost += atom_info_repository.get_combined_worth_for(entry) * max(1, contains[entry]) - var/container_value = containertype ? atom_info_repository.get_single_worth_for(containertype) : 0 - if(container_value) - cost += atom_info_repository.get_single_worth_for(containertype) + cost += containertype ? atom_info_repository.get_single_worth_for(containertype) : 0 cost = max(1, NONUNIT_CEILING((cost * WORTH_TO_SUPPLY_POINTS_CONSTANT * SSsupply.price_markup), WORTH_TO_SUPPLY_POINTS_ROUND_CONSTANT)) global.cargoprices[name] = cost diff --git a/code/datums/trading/traders/ai.dm b/code/datums/trading/traders/ai.dm index 5ca4c941b7a..76a26290728 100644 --- a/code/datums/trading/traders/ai.dm +++ b/code/datums/trading/traders/ai.dm @@ -37,7 +37,6 @@ They sell generic supplies and ask for generic supplies. ) possible_trading_items = list( /obj/item/bag = TRADER_SUBTYPES_ONLY, - /obj/item/bag/cash/infinite = TRADER_BLACKLIST, /obj/item/backpack = TRADER_ALL, /obj/item/backpack/cultpack = TRADER_BLACKLIST, /obj/item/backpack/holding = TRADER_BLACKLIST, @@ -99,25 +98,27 @@ They sell generic supplies and ask for generic supplies. origin = "Manifacturing Beacon" possible_trading_items = list( - /obj/structure/aicore = TRADER_THIS_TYPE, - /obj/structure/girder = TRADER_THIS_TYPE, - /obj/structure/grille = TRADER_THIS_TYPE, - /obj/structure/mopbucket = TRADER_THIS_TYPE, - /obj/structure/ore_box = TRADER_THIS_TYPE, - /obj/structure/coatrack = TRADER_THIS_TYPE, - /obj/structure/bookcase = TRADER_THIS_TYPE, - /obj/item/bee_pack = TRADER_THIS_TYPE, - /obj/item/bee_smoker = TRADER_THIS_TYPE, - /obj/item/beehive_assembly = TRADER_THIS_TYPE, - /obj/item/glass_jar = TRADER_THIS_TYPE, - /obj/item/honey_frame = TRADER_THIS_TYPE, - /obj/item/target = TRADER_ALL, - /obj/structure/tank_rack = TRADER_SUBTYPES_ONLY, - /obj/structure/filing_cabinet = TRADER_THIS_TYPE, - /obj/structure/safe = TRADER_THIS_TYPE, - /obj/structure/plushie = TRADER_SUBTYPES_ONLY, - /obj/structure/sign = TRADER_SUBTYPES_ONLY, - /obj/structure/sign/double = TRADER_BLACKLIST_ALL, - /obj/structure/sign/plaque/golden = TRADER_BLACKLIST_ALL, - /obj/structure/sign/poster = TRADER_BLACKLIST + /obj/structure/aicore = TRADER_THIS_TYPE, + /obj/structure/girder = TRADER_THIS_TYPE, + /obj/structure/grille = TRADER_THIS_TYPE, + /obj/structure/mopbucket = TRADER_THIS_TYPE, + /obj/structure/ore_box = TRADER_THIS_TYPE, + /obj/structure/coatrack = TRADER_THIS_TYPE, + /obj/structure/bookcase = TRADER_THIS_TYPE, + /obj/item/bee_pack = TRADER_THIS_TYPE, + /obj/item/bee_smoker = TRADER_THIS_TYPE, + /obj/item/beehive_assembly = TRADER_THIS_TYPE, + /obj/item/glass_jar = TRADER_THIS_TYPE, + /obj/item/honey_frame = TRADER_THIS_TYPE, + /obj/item/training_dummy = TRADER_THIS_TYPE, + /obj/item/training_dummy/syndicate = TRADER_THIS_TYPE, + /obj/item/training_dummy/alien = TRADER_THIS_TYPE, + /obj/structure/tank_rack = TRADER_SUBTYPES_ONLY, + /obj/structure/filing_cabinet = TRADER_THIS_TYPE, + /obj/structure/safe = TRADER_THIS_TYPE, + /obj/structure/plushie = TRADER_SUBTYPES_ONLY, + /obj/structure/sign = TRADER_SUBTYPES_ONLY, + /obj/structure/sign/double = TRADER_BLACKLIST_ALL, + /obj/structure/sign/plaque/golden = TRADER_BLACKLIST_ALL, + /obj/structure/sign/poster = TRADER_BLACKLIST ) \ No newline at end of file diff --git a/code/datums/trading/traders/goods.dm b/code/datums/trading/traders/goods.dm index d260685de19..81d294268dc 100644 --- a/code/datums/trading/traders/goods.dm +++ b/code/datums/trading/traders/goods.dm @@ -47,7 +47,6 @@ /obj/item/deck = TRADER_SUBTYPES_ONLY, /obj/item/pack = TRADER_SUBTYPES_ONLY, /obj/item/dice = TRADER_ALL, - /obj/item/dice/d20/cursed = TRADER_BLACKLIST, /obj/item/gun/launcher/money = TRADER_THIS_TYPE ) diff --git a/code/datums/trading/traders/misc.dm b/code/datums/trading/traders/misc.dm index 4366e0fede4..6356be83f0d 100644 --- a/code/datums/trading/traders/misc.dm +++ b/code/datums/trading/traders/misc.dm @@ -155,7 +155,7 @@ ) possible_trading_items = list( /obj/item/clothing/head/wizard/magus = TRADER_THIS_TYPE, - /obj/item/shield/buckler = TRADER_THIS_TYPE, + /obj/item/shield/crafted/buckler = TRADER_THIS_TYPE, /obj/item/clothing/head/redcoat = TRADER_THIS_TYPE, /obj/item/clothing/head/powdered_wig = TRADER_THIS_TYPE, /obj/item/clothing/head/hasturhood = TRADER_THIS_TYPE, @@ -167,8 +167,8 @@ /obj/item/clothing/suit/hastur = TRADER_THIS_TYPE, /obj/item/clothing/suit/imperium_monk = TRADER_THIS_TYPE, /obj/item/clothing/suit/judgerobe = TRADER_THIS_TYPE, - /obj/item/clothing/suit/wizrobe/magusred = TRADER_THIS_TYPE, - /obj/item/clothing/suit/wizrobe/magusblue = TRADER_THIS_TYPE, + /obj/item/clothing/suit/wizrobe/magus = TRADER_THIS_TYPE, + /obj/item/clothing/suit/wizrobe/magus/red = TRADER_THIS_TYPE, /obj/item/clothing/costume/gladiator = TRADER_THIS_TYPE, /obj/item/clothing/costume/kilt = TRADER_THIS_TYPE, /obj/item/clothing/costume/redcoat = TRADER_THIS_TYPE, diff --git a/code/datums/trading/traders/unique.dm b/code/datums/trading/traders/unique.dm index d5c98f8e392..dd30cd3b4be 100644 --- a/code/datums/trading/traders/unique.dm +++ b/code/datums/trading/traders/unique.dm @@ -68,7 +68,6 @@ /obj/item/stack/material/ore = TRADER_ALL ) possible_trading_items = list( - /obj/machinery/power/supermatter = TRADER_ALL, /obj/item/aiModule = TRADER_SUBTYPES_ONLY ) want_multiplier = 5000 @@ -90,51 +89,3 @@ 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" - ) - - possible_wanted_items = list( - /mob/living/simple_animal/familiar = TRADER_SUBTYPES_ONLY, - /mob/living/simple_animal/familiar/pet = TRADER_BLACKLIST, - /mob/living/simple_animal/hostile/mimic = TRADER_ALL - ) - possible_trading_items = list( - /obj/item/clothing/gloves/wizard = TRADER_THIS_TYPE, - /obj/item/clothing/head/helmet/space/void/wizard = TRADER_THIS_TYPE, - /obj/item/clothing/head/wizard = TRADER_ALL, - /obj/item/clothing/suit/space/void/wizard = TRADER_THIS_TYPE, - /obj/item/toy/figure/wizard = TRADER_THIS_TYPE, - /obj/item/staff = TRADER_ALL, - ) //Probably see about getting some more wizard based shit - - 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/traits/_traits.dm b/code/datums/traits/_traits.dm index ad1041e32da..bd1cbbf2636 100644 --- a/code/datums/traits/_traits.dm +++ b/code/datums/traits/_traits.dm @@ -2,12 +2,6 @@ // Selectable traits are basically skills + stats + feats all rolled into one. You get to choose a // certain number of them at character generation and they will alter some interactions with the world. -/hook/startup/proc/initialize_trait_trees() - // Precache/build trait trees. - for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) - trait.build_references() - return 1 - /mob/living var/list/traits @@ -170,7 +164,7 @@ if(ispath(parent)) parent = GET_DECL(parent) - if(abstract_type != type && category) + if(category) var/datum/trait_category/trait_category = global.trait_categories[category] if(!istype(trait_category)) trait_category = new(category) @@ -236,6 +230,8 @@ result += trait.get_trait_selection_data(caller, ticked_traits, (recurse_level+1), ignore_children_if_unticked) return result +/// Shows `show_to` a browser window describing the character setup traits taken by `src`. +/// `show_to` must be non-null. /mob/proc/get_trait_data(var/mob/show_to) var/list/traits = get_traits() @@ -262,7 +258,7 @@ if(printed_cat) dat += "
" - var/datum/browser/popup = new((show_to || usr), "trait_summary_\ref[src]", "Aspect Summary") + var/datum/browser/popup = new(show_to, "trait_summary_\ref[src]", "Aspect Summary") popup.set_content(jointext(dat, null)) popup.open() diff --git a/code/datums/traits/maluses/amputations.dm b/code/datums/traits/maluses/amputations.dm index 5cbd3ea7c77..8ce9bc5d418 100644 --- a/code/datums/traits/maluses/amputations.dm +++ b/code/datums/traits/maluses/amputations.dm @@ -15,8 +15,6 @@ if(trait_type == type) continue var/decl/trait/malus/amputation/trait = check_traits[trait_type] - if(!trait.name) - continue // remove when abstract decl handling from dev is merged for(var/limb in trait.apply_to_limbs) if(limb in ban_traits_relating_to_limbs) LAZYDISTINCTADD(incompatible_with, trait_type) diff --git a/code/datums/uplink/devices and tools.dm b/code/datums/uplink/devices_and_tools.dm similarity index 100% rename from code/datums/uplink/devices and tools.dm rename to code/datums/uplink/devices_and_tools.dm diff --git a/code/datums/uplink/grenades.dm b/code/datums/uplink/grenades.dm index 2a20f984ebe..c91af43ad7d 100644 --- a/code/datums/uplink/grenades.dm +++ b/code/datums/uplink/grenades.dm @@ -80,17 +80,3 @@ item_cost = 40 antag_roles = list(/decl/special_role/mercenary) path = /obj/item/box/frags - -/datum/uplink_item/item/grenades/supermatter - name = "1x Supermatter Grenade" - desc = "This grenade contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." - item_cost = 15 - antag_roles = list(/decl/special_role/mercenary) - path = /obj/item/grenade/supermatter - -/datum/uplink_item/item/grenades/supermatters - name = "5x Supermatter Grenades" - desc = "These grenades contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." - item_cost = 60 - antag_roles = list(/decl/special_role/mercenary) - path = /obj/item/box/supermatters diff --git a/code/datums/vote/map.dm b/code/datums/vote/map.dm index 9e64ac63bcb..aabfdde2845 100644 --- a/code/datums/vote/map.dm +++ b/code/datums/vote/map.dm @@ -9,14 +9,14 @@ return ..() /datum/vote/map/setup_vote() - for(var/name in global.all_maps) + for(var/name in global.votable_maps) choices += name ..() /datum/vote/map/report_result() if(..()) return 1 - var/datum/map/M = global.all_maps[result[1]] + var/datum/map/M = global.votable_maps[result[1]] fdel("use_map") text2file(M.path, "use_map") diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm index a613528d27c..ce8a7fa4ba6 100644 --- a/code/datums/weakref.dm +++ b/code/datums/weakref.dm @@ -14,15 +14,13 @@ return D.weakref /weakref - var/ref - - // Handy info for debugging - var/tmp/ref_name - var/tmp/ref_type + var/ref //- Actual datum ref. + var/name //- Useful for input() on lists of weakrefs. + var/tmp/ref_type //- Handy info for debugging /weakref/New(datum/D) - ref = "\ref[D]" - ref_name = "[D]" + ref = "\ref[D]" + name = "[D]" ref_type = D.type /weakref/Destroy() @@ -38,7 +36,7 @@ return null /weakref/get_log_info_line() - return "[ref_name] ([ref_type]) ([ref]) (WEAKREF)" + return "[name] ([ref_type]) ([ref]) (WEAKREF)" /weakref/CanClone() return FALSE //Pass weakref as references since they're unique per atom instance \ No newline at end of file diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm index 06c679edfd2..c984ebbcb77 100644 --- a/code/datums/wires/nuclearbomb.dm +++ b/code/datums/wires/nuclearbomb.dm @@ -20,7 +20,7 @@ var/global/const/NUCLEARBOMB_WIRE_SAFETY = 4 var/obj/machinery/nuclearbomb/N = holder . += ..() . += "
The device is [N.timing ? "shaking!" : "still."]
" - . += "The device is is [N.safety ? "quiet" : "whirring"].
" + . += "The device is [N.safety ? "quiet" : "whirring"].
" . += "The lights are [N.lighthack ? "static" : "functional"].
" /datum/wires/nuclearbomb/proc/toggle_hacked() diff --git a/code/datums/wires/smes.dm b/code/datums/wires/smes.dm index 15eff146d15..7cc90b2d664 100644 --- a/code/datums/wires/smes.dm +++ b/code/datums/wires/smes.dm @@ -9,68 +9,68 @@ new /datum/wire_description(SMES_WIRE_FAILSAFES, "This wire appears to connect to a failsafe mechanism.") ) -var/global/const/SMES_WIRE_RCON = 1 // Remote control (AI and consoles), cut to disable -var/global/const/SMES_WIRE_INPUT = 2 // Input wire, cut to disable input, pulse to disable for 60s -var/global/const/SMES_WIRE_OUTPUT = 4 // Output wire, cut to disable output, pulse to disable for 60s -var/global/const/SMES_WIRE_GROUNDING = 8 // Cut to quickly discharge causing sparks, pulse to only create few sparks -var/global/const/SMES_WIRE_FAILSAFES = 16 // Cut to disable failsafes, mend to reenable - - -/datum/wires/smes/CanUse(var/mob/living/L) - var/obj/machinery/power/smes/buildable/S = holder - if(!S.grounding && S.powernet && S.powernet.avail) - electrocute_mob(L, S.powernet, S, S.safeties_enabled? 0.1 : 1) - if(S.panel_open) - return 1 - return 0 +/// Remote control (AI and consoles), cut to disable +var/global/const/SMES_WIRE_RCON = BITFLAG(0) +/// Input wire, cut to disable input, pulse to disable for 60s +var/global/const/SMES_WIRE_INPUT = BITFLAG(1) +/// Output wire, cut to disable output, pulse to disable for 60s +var/global/const/SMES_WIRE_OUTPUT = BITFLAG(2) +/// Cut to quickly discharge causing sparks, pulse to only create few sparks +var/global/const/SMES_WIRE_GROUNDING = BITFLAG(3) +/// Cut to disable failsafes, mend to reenable +var/global/const/SMES_WIRE_FAILSAFES = BITFLAG(4) +/datum/wires/smes/CanUse(var/mob/living/user) + var/obj/machinery/power/smes/buildable/storage = holder + if(!storage.grounding && storage.powernet && storage.powernet.avail) + electrocute_mob(user, storage.powernet, storage, (storage.safeties_enabled? 0.1 : 1)) + return storage.panel_open /datum/wires/smes/GetInteractWindow(mob/user) - var/obj/machinery/power/smes/buildable/S = holder + var/obj/machinery/power/smes/buildable/storage = holder . += ..() - . += "The green light is [(S.input_cut || S.input_pulsed || S.output_cut || S.output_pulsed) ? "off" : "on"]
" - . += "The red light is [(S.safeties_enabled || S.grounding) ? "off" : "blinking"]
" - . += "The blue light is [S.RCon ? "on" : "off"]" - + . += "The green light is [(storage.input_cut || storage.input_pulsed || storage.output_cut || storage.output_pulsed) ? "off" : "on"]
" + . += "The red light is [(storage.safeties_enabled || storage.grounding) ? "off" : "blinking"]
" + . += "The blue light is [storage.RCon ? "on" : "off"]" /datum/wires/smes/UpdateCut(var/index, var/mended) - var/obj/machinery/power/smes/buildable/S = holder + var/obj/machinery/power/smes/buildable/storage = holder switch(index) if(SMES_WIRE_RCON) - S.RCon = mended + storage.RCon = mended if(SMES_WIRE_INPUT) - S.input_cut = !mended + storage.input_cut = !mended if(SMES_WIRE_OUTPUT) - S.output_cut = !mended + storage.output_cut = !mended if(SMES_WIRE_GROUNDING) - S.grounding = mended + storage.grounding = mended if(SMES_WIRE_FAILSAFES) - S.safeties_enabled = mended + storage.safeties_enabled = mended /datum/wires/smes/proc/reset_rcon() - var/obj/machinery/power/smes/buildable/S = holder - if(S) - S.RCon = TRUE + var/obj/machinery/power/smes/buildable/storage = holder + if(storage) + storage.RCon = TRUE /datum/wires/smes/proc/reset_safeties() - var/obj/machinery/power/smes/buildable/S = holder - if(S) - S.safeties_enabled = TRUE + var/obj/machinery/power/smes/buildable/storage = holder + if(storage) + storage.safeties_enabled = TRUE /datum/wires/smes/UpdatePulsed(var/index) - var/obj/machinery/power/smes/buildable/S = holder + var/obj/machinery/power/smes/buildable/storage = holder switch(index) if(SMES_WIRE_RCON) - if(S.RCon) - S.RCon = 0 + if(storage.RCon) + storage.RCon = 0 addtimer(CALLBACK(src, PROC_REF(reset_rcon)), 1 SECOND) if(SMES_WIRE_INPUT) - S.toggle_input() + storage.toggle_input() if(SMES_WIRE_OUTPUT) - S.toggle_output() + storage.toggle_output() if(SMES_WIRE_GROUNDING) - S.grounding = 0 + storage.grounding = 0 if(SMES_WIRE_FAILSAFES) - if(S.safeties_enabled) - S.safeties_enabled = 0 + if(storage.safeties_enabled) + storage.safeties_enabled = 0 addtimer(CALLBACK(src, PROC_REF(reset_safeties)), 1 SECOND) diff --git a/code/game/alpha_masks.dm b/code/game/alpha_masks.dm index 05b23f45eaa..3eb68a3b343 100644 --- a/code/game/alpha_masks.dm +++ b/code/game/alpha_masks.dm @@ -54,10 +54,14 @@ var/global/list/_alpha_masks = list() /atom/movable/proc/get_turf_alpha_mask_states() return 'icons/effects/alpha_mask.dmi' +/atom/movable/proc/should_have_alpha_mask() + // Mobs and obj both need to avoid this when on structures. Looks wonky. + return simulated && isturf(loc) && !(locate(/obj/structure) in loc) + // Proc called by /turf/Entered() to update a mob's mask overlay. /atom/movable/proc/update_turf_alpha_mask() set waitfor = FALSE - if(!simulated || updating_turf_alpha_mask) + if(!simulated || QDELETED(src) || updating_turf_alpha_mask) return updating_turf_alpha_mask = TRUE sleep(0) @@ -65,7 +69,7 @@ var/global/list/_alpha_masks = list() if(QDELETED(src)) return var/turf/our_turf = loc - var/mask_state = isturf(our_turf) && our_turf.get_movable_alpha_mask_state(src) + var/mask_state = isturf(our_turf) && should_have_alpha_mask() && our_turf.get_movable_alpha_mask_state(src) if(mask_state) var/atom/movable/alpha_mask/mask = get_or_create_alpha_mask(src) if(mask) diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index be291b8ac25..042a32f12ee 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -19,6 +19,7 @@ // Visual references. var/antaghud_indicator = "hudsyndicate" // Used by the ghost antagHUD. var/antag_indicator // icon_state for icons/mob/mob.dm visual indicator. + var/antag_hud_icon = 'icons/screen/hud_antag.dmi' var/faction_indicator // See antag_indicator, but for factionalized people only. var/faction_invisible // Can members of the faction identify other antagonists? @@ -104,6 +105,17 @@ /decl/special_role/validate() . = ..() + + // Check for our antaghud icons. + if(faction_indicator || antag_indicator) + if(antag_hud_icon) + if(faction_indicator && !check_state_in_icon(faction_indicator, antag_hud_icon)) + . += "missing faction_indicator '[faction_indicator]' from icon 'antag_hud_icon]'" + if(antag_indicator && !check_state_in_icon(antag_indicator, antag_hud_icon)) + . += "missing antag_indicator '[antag_indicator]' from icon 'antag_hud_icon]'" + else + . += "missing antag_hud_icon" + // Grab initial in case it was already successfully loaded. var/initial_base_to_load = initial(base_to_load) if(isnull(initial_base_to_load)) diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index be03efcadfd..fcfd2c5fcdc 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -13,7 +13,6 @@ player.current = new mob_path(get_turf(player.current)) player.transfer_to(player.current) if(holder) qdel(holder) - player.original = player.current if(!preserve_appearance && (flags & ANTAG_SET_APPEARANCE)) spawn(3) var/mob/living/human/H = player.current @@ -32,10 +31,12 @@ qdel(I) /decl/special_role/proc/get_indicator(var/datum/mind/recipient, var/datum/mind/other) - if(!antag_indicator || !other.current || !recipient.current) + if(!other.current || !recipient.current) return var/indicator = (faction_indicator && (other in faction_members)) ? faction_indicator : antag_indicator - var/image/I = image('icons/mob/hud.dmi', loc = other.current, icon_state = indicator, layer = ABOVE_HUMAN_LAYER) + if(!indicator) + return + var/image/I = image(antag_hud_icon, loc = other.current, icon_state = indicator, layer = ABOVE_HUMAN_LAYER) var/decl/bodytype/root_bodytype = other.current.get_bodytype() if(istype(root_bodytype)) I.pixel_x = root_bodytype.antaghud_offset_x diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm deleted file mode 100644 index 9aa819de843..00000000000 --- a/code/game/antagonist/outsider/wizard.dm +++ /dev/null @@ -1,115 +0,0 @@ -/decl/special_role/wizard - name = "Wizard" - name_plural = "Wizards" - landmark_id = "wizard" - welcome_text = "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.
In your pockets you will find a teleport scroll. Use it as needed." - flags = ANTAG_OVERRIDE_JOB | ANTAG_OVERRIDE_MOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE - antaghud_indicator = "hudwizard" - default_access = list(access_wizard) - hard_cap = 1 - hard_cap_round = 3 - initial_spawn_req = 1 - initial_spawn_target = 1 - min_player_age = 18 - - faction = "wizard" - base_to_load = "Wizard Base" - -/decl/special_role/wizard/create_objectives(var/datum/mind/wizard) - - if(!..()) - return - - var/kill - var/escape - var/steal - var/hijack - - switch(rand(1,100)) - if(1 to 30) - escape = 1 - kill = 1 - if(31 to 60) - escape = 1 - steal = 1 - if(61 to 99) - kill = 1 - steal = 1 - else - hijack = 1 - - if(kill) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = wizard - kill_objective.find_target() - wizard.objectives |= kill_objective - if(steal) - var/datum/objective/steal/steal_objective = new - steal_objective.owner = wizard - steal_objective.find_target() - wizard.objectives |= steal_objective - if(escape) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = wizard - wizard.objectives |= survive_objective - if(hijack) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = wizard - wizard.objectives |= hijack_objective - return - -/decl/special_role/wizard/update_antag_mob(var/datum/mind/wizard) - ..() - wizard.StoreMemory("Remember: do not forget to prepare your spells.", /decl/memory_options/system) - wizard.current.real_name = "[pick(global.wizard_first)] [pick(global.wizard_second)]" - wizard.current.SetName(wizard.current.real_name) - -/decl/special_role/wizard/equip_role(var/mob/living/human/wizard_mob) - default_outfit = pick(decls_repository.get_decl_paths_of_subtype(/decl/outfit/wizard)) - . = ..() - -/decl/special_role/wizard/print_player_summary() - ..() - for(var/p in current_antagonists) - var/datum/mind/player = p - var/text = "[player.name]'s spells were:" - if(!player.learned_spells || !player.learned_spells.len) - text += "
None!" - else - for(var/s in player.learned_spells) - var/spell/spell = s - text += "
[spell.name] - " - text += "Speed: [spell.spell_levels["speed"]] Power: [spell.spell_levels["power"]]" - text += "
" - to_world(text) - - -//To batch-remove wizard spells. Linked to mind.dm. -/mob/proc/spellremove() - if(!mind || !mind.learned_spells) - return - for(var/spell/spell_to_remove in mind.learned_spells) - remove_spell(spell_to_remove) - -// Does this clothing slot count as wizard garb? (Combines a few checks) -/proc/is_wiz_garb(var/obj/item/clothing/C) - return istype(C) && C.wizard_garb - -/*Checks if the wizard is wearing the proper attire. -Made a proc so this is not repeated 14 (or more) times.*/ -/mob/proc/wearing_wiz_garb() - to_chat(src, "Silly creature, you're not a human. Only humans can cast this spell.") - return 0 - -// Humans can wear clothes. -/mob/living/human/wearing_wiz_garb() - if(!is_wiz_garb(get_equipped_item(slot_wear_suit_str)) && (!istype(species.species_hud) || (slot_wear_suit_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my robe.") - return 0 - if(!is_wiz_garb(get_equipped_item(slot_shoes_str)) && (!istype(species.species_hud) || (slot_shoes_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my sandals.") - return 0 - if(!is_wiz_garb(get_equipped_item(slot_head_str)) && (!istype(species.species_hud) || (slot_head_str in species.species_hud.equip_slots))) - to_chat(src, "I don't feel strong enough without my hat.") - return 0 - return 1 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 38163a445fd..b8c1eaa4e04 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -92,7 +92,15 @@ var/global/list/areas = list() area_blurb_category = type ..() +/area/proc/get_additional_fishing_results() + return + /area/Initialize() + var/list/additional_fishing_results = get_additional_fishing_results() + if(LAZYLEN(additional_fishing_results)) + LAZYINITLIST(fishing_results) + for(var/fish in additional_fishing_results) + fishing_results[fish] = additional_fishing_results[fish] . = ..() global.areas += src if(!requires_power || !apc) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 01856eb7773..196f4cc44e5 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -145,10 +145,12 @@ /atom/proc/try_on_reagent_change() SHOULD_NOT_OVERRIDE(TRUE) set waitfor = FALSE - if(_reagent_update_started >= world.time) + if(QDELETED(src) ||_reagent_update_started >= world.time) return FALSE _reagent_update_started = world.time sleep(0) // Defer to end of tick so we don't drop subsequent reagent updates. + if(QDELETED(src)) + return return on_reagent_change() /atom/proc/on_reagent_change() @@ -293,6 +295,17 @@ to_chat(user, "[html_icon(src)] That's [f_name] [suffix]") to_chat(user, desc) + + var/list/alt_interactions = get_alt_interactions(user) + if(LAZYLEN(alt_interactions)) + var/list/interaction_strings = list() + for(var/interaction_type as anything in alt_interactions) + var/decl/interaction_handler/interaction = GET_DECL(interaction_type) + if(interaction.examine_desc && (interaction.always_show_on_examine || interaction.is_possible(src, user, user?.get_active_held_item()))) + interaction_strings += emote_replace_target_tokens(interaction.examine_desc, src) + if(length(interaction_strings)) + to_chat(user, SPAN_INFO("Alt-click on \the [src] to [english_list(interaction_strings, and_text = " or ")].")) + RAISE_EVENT(/decl/observ/atom_examined, src, user, distance) return TRUE @@ -500,10 +513,12 @@ - Returns: `TRUE` if qdel() was called, otherwise `FALSE` */ /atom/proc/lava_act() - visible_message(SPAN_DANGER("\The [src] sizzles and melts away, consumed by the lava!")) - playsound(src, 'sound/effects/flare.ogg', 100, 3) - qdel(src) - . = TRUE + if(simulated) + visible_message(SPAN_DANGER("\The [src] sizzles and melts away, consumed by the lava!")) + playsound(src, 'sound/effects/flare.ogg', 100, 3) + qdel(src) + return TRUE + return FALSE /** Handle this atom being hit by a thrown atom @@ -892,22 +907,6 @@ return check_loc check_loc = check_loc.loc -/** - Get a list of alt interactions for a user from this atom. - - - `user`: The mob that these alt interactions are for - - Return: A list containing the alt interactions -*/ -/atom/proc/get_alt_interactions(var/mob/user) - SHOULD_CALL_PARENT(TRUE) - RETURN_TYPE(/list) - . = list() - if(storage) - . += /decl/interaction_handler/storage_open - if(reagents?.total_volume && ATOM_IS_OPEN_CONTAINER(src)) - . += /decl/interaction_handler/wash_hands - . += /decl/interaction_handler/drink - /atom/proc/can_climb_from_below(var/mob/climber) return FALSE @@ -993,4 +992,16 @@ return /atom/proc/is_watertight() - return ATOM_IS_OPEN_CONTAINER(src) + return !ATOM_IS_OPEN_CONTAINER(src) + +/atom/proc/can_drink_from(mob/user) + return ATOM_IS_OPEN_CONTAINER(src) && reagents?.total_volume && user.check_has_mouth() + +/atom/proc/adjust_required_attack_dexterity(mob/user, required_dexterity) + if(storage) // TODO: possibly check can_be_inserted() to avoid being able to shoot mirrors as a drake. + return DEXTERITY_HOLD_ITEM + return required_dexterity + +/atom/proc/immune_to_floor_hazards() + return !simulated + diff --git a/code/game/atoms_fires.dm b/code/game/atoms_fires.dm new file mode 100644 index 00000000000..c70cc007cb8 --- /dev/null +++ b/code/game/atoms_fires.dm @@ -0,0 +1,21 @@ +// Stubs for atom fire system, TODO. +/atom/proc/set_fire_intensity(amount) + return + +/atom/proc/get_fire_intensity() + return 0 + +/atom/proc/adjust_fire_intensity(amount) + return + +/atom/proc/can_ignite() + return FALSE + +/atom/proc/ignite_fire() + return + +/atom/proc/extinguish_fire(mob/user, no_message = FALSE) + return + +/atom/proc/is_on_fire() + return FALSE diff --git a/code/game/atoms_fluids.dm b/code/game/atoms_fluids.dm index e69ed3bbfc3..bf49a3469c0 100644 --- a/code/game/atoms_fluids.dm +++ b/code/game/atoms_fluids.dm @@ -16,26 +16,71 @@ /atom/proc/CanFluidPass(var/coming_from) return TRUE -/atom/movable/proc/is_fluid_pushable(var/amt) +/atom/movable/proc/try_fluid_push(volume, strength) return simulated && !anchored /atom/movable/is_flooded(var/lying_mob, var/absolute) var/turf/T = get_turf(src) return T?.is_flooded(lying_mob, absolute) -/atom/proc/submerged(depth) +/atom/proc/submerged(depth, above_turf) + var/turf/T = get_turf(src) if(isnull(depth)) - var/turf/T = get_turf(src) if(!istype(T)) return FALSE depth = T.get_fluid_depth() + if(istype(T)) + var/turf_height = T.get_physical_height() + // If we're not on the surface of the turf (floating, leaping, or other sources) + // then we add the turf height to the depth, so you can jump over a water-filled pit + // or throw something over it + if(turf_height < 0 && above_turf) + depth += turf_height if(ismob(loc)) return depth >= FLUID_SHALLOW if(isturf(loc)) + if(locate(/obj/structure/table)) + return depth >= FLUID_SHALLOW return depth >= 3 return depth >= FLUID_OVER_MOB_HEAD -/turf/submerged(depth) +// This override exists purely because throwing is movable-level and not atom-level, +// for obvious reasons (that being that non-movable atoms cannot move). +/atom/movable/submerged(depth, above_turf) + above_turf ||= immune_to_floor_hazards() + return ..() + +/obj/item/submerged(depth, above_turf) + var/datum/inventory_slot/slot = get_any_equipped_slot_datum() + // we're in a mob and have a slot, so we bail early + if(istype(slot)) + var/mob/owner = loc // get_any_equipped_slot checks istype already + if(owner.current_posture.prone) + return ..() // treat us like an atom sitting on the ground (or table), really + if(isnull(depth)) // copied from base proc, since we aren't calling parent in this block + var/turf/T = get_turf(src) + if(!istype(T)) + return FALSE + depth = T.get_fluid_depth() + return depth >= slot.fluid_height + return ..() + +/mob/submerged(depth, above_turf) + above_turf ||= immune_to_floor_hazards() // check throwing here because of the table check coming before parent call + var/obj/structure/table/standing_on = locate(/obj/structure/table) in loc + // can't stand on a table if we're floating + if(!above_turf && standing_on && standing_on.mob_offset > 0) // standing atop a table that is a meaningful amount above the ground (not a bench) + if(isnull(depth)) // duplicated from atom because we don't call parent in this block + var/turf/T = get_turf(src) + if(!istype(T)) + return FALSE + depth = T.get_fluid_depth() + // assuming default tables are at waist height, this is a simple adjustment to scale it for taller/shorter ones + return depth >= floor(FLUID_SHALLOW * (standing_on.mob_offset / /obj/structure/table::mob_offset)) + return ..() + +// above_turf is nonsensical for turfs but I don't want the linter to complain +/turf/submerged(depth, above_turf) if(isnull(depth)) depth = get_fluid_depth() return depth >= FLUID_OVER_MOB_HEAD diff --git a/code/game/atoms_init.dm b/code/game/atoms_init.dm index 3a2f3b619c1..eb08297e2ab 100644 --- a/code/game/atoms_init.dm +++ b/code/game/atoms_init.dm @@ -16,18 +16,15 @@ var/do_initialize = SSatoms.atom_init_stage var/list/created = SSatoms.created_atoms - if(do_initialize > INITIALIZATION_INSSATOMS_LATE) + if(do_initialize > INITIALIZATION_INSSATOMS) args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD if(SSatoms.InitAtom(src, args)) //we were deleted return - else if(created) - var/list/argument_list - if(length(args) > 1) - argument_list = args.Copy(2) - if(argument_list || do_initialize == INITIALIZATION_INSSATOMS_LATE) - created[src] = argument_list - + else if(length(args) > 1) + created[++created.len] = list(src, args.Copy(2)) + else + created[++created.len] = list(src, null) if(atom_flags & ATOM_FLAG_CLIMBABLE) verbs += /atom/proc/climb_on @@ -80,7 +77,7 @@ /atom/Destroy() // must be done before deletion // TODO: ADD PRE_DELETION OBSERVATION - if(isatom(loc) && loc.storage) + if(isatom(loc) && loc.storage && !QDELETED(loc.storage)) loc.storage.on_item_pre_deletion(src) UNQUEUE_TEMPERATURE_ATOM(src) QDEL_NULL(reagents) @@ -94,7 +91,7 @@ QDEL_NULL(atom_codex_ref) var/atom/oldloc = loc . = ..() - if(isatom(oldloc) && oldloc.storage) + if(isatom(oldloc) && oldloc.storage && !QDELETED(loc.storage)) oldloc.storage.on_item_post_deletion(src) // must be done after deletion // This might need to be moved onto a Del() override at some point. QDEL_NULL(storage) diff --git a/code/game/atoms_interactions.dm b/code/game/atoms_interactions.dm new file mode 100644 index 00000000000..1f8c07525c1 --- /dev/null +++ b/code/game/atoms_interactions.dm @@ -0,0 +1,44 @@ +// List of interactions used in procs below. +var/global/list/_reagent_interactions = list( + /decl/interaction_handler/wash_hands, + /decl/interaction_handler/drink, + /decl/interaction_handler/dip_item, + /decl/interaction_handler/fill_from, + /decl/interaction_handler/empty_into +) + +/** + Get a list of standard interactions (attack_hand and attackby) for a user from this atom. + At time of writing, these are really easy to have interfere with or be interfered with by + attack_hand() and attackby() overrides. Putting them on items us a bad idea due to pickup code. + + - `user`: The mob that these interactions are for + - Return: A list containing the interactions +*/ +/atom/proc/get_standard_interactions(var/mob/user) + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + return null + +/** + Get a default interaction for a user from this atom. + + - `user`: The mob that this interaction is for + - Return: A default interaction decl, or null. +*/ +/atom/proc/get_quick_interaction_handler(mob/user) + return + +/** + Get a list of alt interactions (alt-click) for a user from this atom. + + - `user`: The mob that these alt interactions are for + - Return: A list containing the alt interactions +*/ +/atom/proc/get_alt_interactions(var/mob/user) + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + if(storage) + LAZYADD(., /decl/interaction_handler/storage_open) + if(reagents?.maximum_volume) + LAZYADD(., global._reagent_interactions) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d2be93779da..9c481be8d46 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -40,6 +40,9 @@ // Marker for alpha mask update process. null == never update, TRUE == currently updating, FALSE == finished updating. var/updating_turf_alpha_mask = null + // Damage type from using or throwing this atom. + var/atom_damage_type = BRUTE + // This proc determines if the instance is preserved when the process() despawn of crypods occurs. /atom/movable/proc/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return FALSE @@ -269,7 +272,7 @@ if(isturf(loc)) var/turf/T = loc - if(T.reagents) + if(T.reagents?.total_volume && submerged()) fluid_act(T.reagents) for(var/mob/viewer in storage?.storage_ui?.is_seeing) @@ -581,7 +584,29 @@ if(!.) // If we're under or inside shelter, use the z-level rain (for ambience) . = SSweather.weather_by_z[my_turf.z] +/atom/movable/proc/handle_post_automoved(atom/old_loc) + return + /atom/movable/take_vaporized_reagent(reagent, amount) if(ATOM_IS_OPEN_CONTAINER(src)) return loc?.take_vaporized_reagent(reagent, amount) return null + +/atom/movable/immune_to_floor_hazards() + return ..() || !!throwing + +// TODO: make everything use this. +/atom/movable/proc/set_anchored(new_anchored) + SHOULD_CALL_PARENT(TRUE) + if(anchored != new_anchored) + anchored = new_anchored + return TRUE + return FALSE + +// updates pixel offsets, triggers fluids, etc. +/atom/movable/proc/on_turf_height_change(new_height) + if(simulated) + reset_offsets() + return TRUE + return FALSE + diff --git a/code/game/atoms_movable_grabs.dm b/code/game/atoms_movable_grabs.dm index 7f0f7d148b5..357047a0e31 100644 --- a/code/game/atoms_movable_grabs.dm +++ b/code/game/atoms_movable_grabs.dm @@ -23,7 +23,7 @@ // Anchored check so we can operate switches etc on grab intent without getting grab failure msgs. // NOTE: /mob/living overrides this to return FALSE in favour of using default_grab_interaction - if(isliving(user) && user.a_intent == I_GRAB && !user.current_posture.prone && !anchored) + if(isliving(user) && user.check_intent(I_FLAG_GRAB) && !user.current_posture.prone && !anchored) return try_make_grab(user) return ..() diff --git a/code/game/atoms_movable_interactions.dm b/code/game/atoms_movable_interactions.dm index 110c09afb82..8cf50ef5bc4 100644 --- a/code/game/atoms_movable_interactions.dm +++ b/code/game/atoms_movable_interactions.dm @@ -14,6 +14,7 @@ name = "Examine" expected_user_type = /mob interaction_flags = 0 + examine_desc = "examine $TARGET_THEM$" /decl/interaction_handler/look/invoked(atom/target, mob/user, obj/item/prop) target.examine(user, get_dist(user, target)) @@ -22,6 +23,7 @@ name = "Grab" expected_target_type = /atom/movable interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_TURF + examine_desc = "grab $TARGET_THEM$" /decl/interaction_handler/grab/is_possible(atom/movable/target, mob/user, obj/item/prop) return ..() && !target.anchored diff --git a/code/game/gamemodes/endgame/endgame.dm b/code/game/gamemodes/endgame/endgame.dm index 6d81b42d639..c1c03164c55 100644 --- a/code/game/gamemodes/endgame/endgame.dm +++ b/code/game/gamemodes/endgame/endgame.dm @@ -1,3 +1,4 @@ +var/global/universe_has_ended = 0 /********************** * ENDGAME STUFF **********************/ diff --git a/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm b/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm index e01a6995e1b..3aa8d9d84b6 100644 --- a/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm +++ b/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm @@ -38,7 +38,7 @@ SSticker.mode.station_was_nuked = 1 SSticker.mode.station_explosion_in_progress = FALSE if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is - universe_has_ended = 1 + universe_has_ended = TRUE /datum/universal_state/nuclear_explosion/OnExit() if(SSticker.mode) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8fca9e3f5cf..e6a2f45c19a 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -283,11 +283,10 @@ var/global/list/additional_antag_types = list() for(var/decl/special_role/antag in antag_templates) antag.reset_antag_selection() -/decl/game_mode/proc/announce_ert_disabled() - if(!ert_disabled) - return - - var/list/reasons = list( +/// Gets a list of default reasons for the ERT to be disabled. +/decl/game_mode/proc/possible_ert_disabled_reasons() + // This uses a static var so that modpacks can add default reasons, e.g. "supermatter dust". + var/static/list/reasons = list( "political instability", "quantum fluctuations", "hostile raiders", @@ -300,7 +299,6 @@ var/global/list/additional_antag_types = list() "wormholes to another dimension", "a telescience mishap", "radiation flares", - "supermatter dust", "leaks into a negative reality", "antiparticle clouds", "residual exotic energy", @@ -319,7 +317,12 @@ var/global/list/additional_antag_types = list() "classified security operations", "a gargantuan glowing goat" ) - 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") + return reasons + +/decl/game_mode/proc/announce_ert_disabled() + if(!ert_disabled) + return + command_announcement.Announce("The presence of [pick(possible_ert_disabled_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") /decl/game_mode/proc/check_finished() if(SSevac.evacuation_controller?.round_over() || station_was_nuked) @@ -410,7 +413,6 @@ var/global/list/additional_antag_types = list() if(escaped_total > 0) SSstatistics.set_field("escaped_total",escaped_total) - send2mainirc("A round of [src.name] has ended - [surviving_total] survivor\s, [ghosts] ghost\s.") SSwebhooks.send(WEBHOOK_ROUNDEND, list("survivors" = surviving_total, "escaped" = escaped_total, "ghosts" = ghosts, "clients" = clients)) return 0 @@ -543,7 +545,7 @@ var/global/list/additional_antag_types = list() continue //Admin paralyzed if(L.stat) if(L.stat == UNCONSCIOUS) - msg += "[L.name] ([L.ckey]), the [L.job] (Dying)\n" + msg += "[L.name] ([L.ckey]), the [L.job] (Unconscious)\n" continue //Unconscious if(L.stat == DEAD) msg += "[L.name] ([L.ckey]), the [L.job] (Dead)\n" @@ -551,7 +553,7 @@ var/global/list/additional_antag_types = list() continue //Happy connected client for(var/mob/observer/ghost/D in SSmobs.mob_list) - if(D.mind && (D.mind.original == L || D.mind.current == L)) + if(D.mind && D.mind.current == L) if(L.stat == DEAD) msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" continue //Dead mob, ghost abandoned diff --git a/code/game/gamemodes/wizard/servant_items/caretaker.dm b/code/game/gamemodes/wizard/servant_items/caretaker.dm deleted file mode 100644 index c5adb272efe..00000000000 --- a/code/game/gamemodes/wizard/servant_items/caretaker.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/item/clothing/head/caretakerhood - name = "holy hood" - desc = "The hood of a shining white robe, with blue trim. Who would possess this robe and still want to hide themself away?" - icon = 'icons/clothing/head/caretaker.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/caretakercloak - name = "holy cloak" - desc = "A shining white and blue robe. For some reason, it reminds you of the holidays." - icon = 'icons/clothing/suits/wizard/servant/caretaker.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - -/obj/item/clothing/shoes/dress/caretakershoes - name = "black leather shoes" - desc = "Dress shoes. These aren't as shiny as usual." - inset_color = COLOR_SKY_BLUE - shine = 30 - armor = list( - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/servant_items/champion.dm b/code/game/gamemodes/wizard/servant_items/champion.dm deleted file mode 100644 index 80e04ee1bfd..00000000000 --- a/code/game/gamemodes/wizard/servant_items/champion.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/clothing/head/champhelm - name = "champion's crown" - desc = "A spiky, golden crown. It's probably worth more than your bank account." - - icon = 'icons/clothing/head/champion.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_RESISTANT, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/suit/champarmor - name = "champion's armor" - desc = "A mighty suit of silver and gold armor, with a gleaming blue crystal inlaid into its left gaunlet." - icon = 'icons/clothing/suits/wizard/servant/champion.dmi' - siemens_coefficient = 0.5 - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS|SLOT_TAIL - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_RESISTANT, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/pants/champion - name = "champion's garb" - desc = "Some dark, archaic leggings." - icon = 'icons/clothing/pants/leggings/leggings_champion.dmi' - siemens_coefficient = 0.8 - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR - ) - starting_accessories = list( - /obj/item/clothing/shirt/tunic/blue/champion - ) - -/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/organic/leather - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED - ) - artificail_shine = 0 - -/obj/item/sword/excalibur - name = "champion's blade" - desc = "For at his belt hung Excalibur, the finest sword that there was, which sliced through iron as through wood." - icon = 'icons/obj/items/weapon/swords/excalibur.dmi' - attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "cleaved", "sundered") - material_alteration = MAT_FLAG_ALTERATION_NONE - -/obj/item/sword/excalibur/on_picked_up(var/mob/living/user) - if(user.mind) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(!wizards.is_antagonist(user.mind) || user.mind.assigned_special_role != "Spellbound Servant") - START_PROCESSING(SSobj, src) - to_chat(user,"\The [src] heats up in your hands, burning you!") - -/obj/item/sword/excalibur/Process() - if(isliving(loc)) - if(ishuman(loc)) - var/mob/living/human/H = loc - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) - E?.take_external_damage(burn=2,used_weapon="stovetop") - else - var/mob/living/M = loc - M.take_damage(2, BURN) - if(prob(2)) - to_chat(loc,"\The [src] is burning you!") - return 1 - -/obj/item/sword/excalibur/dropped() - . = ..() - STOP_PROCESSING(SSobj, src) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/servant_items/familiar.dm b/code/game/gamemodes/wizard/servant_items/familiar.dm deleted file mode 100644 index 05cc8cdf961..00000000000 --- a/code/game/gamemodes/wizard/servant_items/familiar.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/item/clothing/head/bandana/familiarband - name = "familiar's headband" - desc = "It's a simple headband made of leather." - icon = 'icons/clothing/head/familiar.dmi' - -/obj/item/clothing/pants/familiar - name = "familiar's garb" - desc = "Some rough leather leggings, reinforced here and there. A hasty job." - starting_accessories = list( - /obj/item/clothing/shirt/tunic/green/familiar - ) - -/obj/item/clothing/pants/familiar/Initialize() - . = ..() - LAZYSET(slowdown_per_slot, slot_w_uniform_str, -3) diff --git a/code/game/gamemodes/wizard/servant_items/fiend.dm b/code/game/gamemodes/wizard/servant_items/fiend.dm deleted file mode 100644 index e52606eb62f..00000000000 --- a/code/game/gamemodes/wizard/servant_items/fiend.dm +++ /dev/null @@ -1,49 +0,0 @@ -/obj/item/clothing/head/fiendhood - name = "fiend's hood" - desc = "A dark hood with blood-red trim. Something about the fabric blocks more light than it should." - icon = 'icons/clothing/head/fiend_hood.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/fiendcowl - name = "fiend's cowl" - desc = "A charred black duster with red trim. In its fabric, you can see the faint outline of millions of eyes." - icon = 'icons/clothing/suits/wizard/servant/fiend_cowl.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS|SLOT_TAIL - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_RAD = ARMOR_RAD_SHIELDED - ) - -/obj/item/clothing/costume/fiendsuit - name = "black suit" - desc = "A snappy black suit with red trim. The undershirt's stained with something, though..." - icon = 'icons/clothing/suits/suit_fiend.dmi' - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/shoes/dress/devilshoes - desc = "Off-colour leather dress shoes. Their footsteps are silent." - inset_color = COLOR_MAROON - item_flags = ITEM_FLAG_SILENT - color = "#2e1e1e" - -/obj/item/clothing/head/fiendhood/fem - name = "fiend's visage" - desc = "To gaze upon this is to gaze into an inferno. Look away, before it looks back of its own accord." - icon = 'icons/clothing/head/fiend_visage.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/clothing/suit/fiendcowl/fem - name = "fiend's robe" - icon = 'icons/clothing/suits/wizard/servant/fiend_robe.dmi' - desc = "A tattered, black and red robe. Nothing is visible through the holes in its fabric, except for a strange, inky blackness. It looks as if it was stitched together with other clothing..." diff --git a/code/game/gamemodes/wizard/servant_items/infiltrator.dm b/code/game/gamemodes/wizard/servant_items/infiltrator.dm deleted file mode 100644 index 846addc5b7c..00000000000 --- a/code/game/gamemodes/wizard/servant_items/infiltrator.dm +++ /dev/null @@ -1,42 +0,0 @@ -/obj/item/clothing/head/infilhat - name = "immaculate fedora" - desc = "Whoever owns this hat means business. Hopefully, it's just good business." - color = COLOR_SILVER - icon = 'icons/clothing/head/detective.dmi' - markings_state_modifier = "band" - markings_color = COLOR_DARK_GRAY - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - -/obj/item/clothing/suit/infilsuit - name = "immaculate suit" - desc = "The clothes of an impeccable diplomat. Or perhaps a businessman. Let's not consider the horrors that might arise if it belongs to a lawyer." - icon = 'icons/clothing/suits/wizard/servant/inf_suit.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_MINOR, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) - -/obj/item/clothing/shoes/dress/infilshoes - name = "black leather shoes" - desc = "Dress shoes. Their footsteps are dead silent." - inset_color = COLOR_INDIGO - item_flags = ITEM_FLAG_SILENT - -/obj/item/clothing/head/infilhat/fem - name = "maid's headband" - desc = "This dainty, frilled thing is apparently meant to go on your head." - icon = 'icons/clothing/head/inf_hat.dmi' - markings_state_modifier = null - -/obj/item/clothing/suit/infilsuit/fem - name = "maid's uniform" - desc = "The uniform of someone you'd expect to see dusting off the Antique Gun's display case." - icon = 'icons/clothing/suits/wizard/servant/inf_dress.dmi' diff --git a/code/game/gamemodes/wizard/servant_items/overseer.dm b/code/game/gamemodes/wizard/servant_items/overseer.dm deleted file mode 100644 index f8676e0440d..00000000000 --- a/code/game/gamemodes/wizard/servant_items/overseer.dm +++ /dev/null @@ -1,40 +0,0 @@ -/obj/item/clothing/head/overseerhood - name = "grim hood" - desc = "Darker than dark. What... what is this made of?" - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SHIELDED, - ARMOR_BULLET = ARMOR_BALLISTIC_HEAVY, - ARMOR_LASER = ARMOR_LASER_HEAVY, - ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, - ARMOR_BOMB = ARMOR_BOMB_SHIELDED - ) - icon = 'icons/clothing/head/necromancer.dmi' - item_flags = ITEM_FLAG_AIRTIGHT - max_pressure_protection = FIRESUIT_MAX_PRESSURE - min_pressure_protection = 0 - bodytype_equip_flags = BODY_EQUIP_FLAG_HUMANOID - flags_inv = HIDEEARS | BLOCK_HEAD_HAIR - -/obj/item/clothing/suit/straight_jacket/overseercloak - name = "grim cloak" - desc = "The void of space woven into fabric. It's hard to tell where its edges are." - icon = 'icons/clothing/suits/wizard/servant/overseer.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_SHIELDED, - ARMOR_BULLET = ARMOR_BALLISTIC_HEAVY, - ARMOR_LASER = ARMOR_LASER_HEAVY, - ARMOR_ENERGY = ARMOR_ENERGY_SHIELDED, - ARMOR_BOMB = ARMOR_BOMB_SHIELDED - ) - item_flags = ITEM_FLAG_AIRTIGHT - max_pressure_protection = FIRESUIT_MAX_PRESSURE - min_pressure_protection = 0 - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_FEET|SLOT_ARMS|SLOT_HANDS|SLOT_TAIL - -//These are the ones that it gets when they toggle it off -/obj/item/clothing/shoes/sandal/grimboots - name = "stained boots" - desc = "These boots are stained with blood so dry that it's turned black..." - color = COLOR_BLACK - shine = 10 - item_flags = ITEM_FLAG_SILENT \ No newline at end of file diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm deleted file mode 100644 index 72792403db1..00000000000 --- a/code/game/gamemodes/wizard/wizard.dm +++ /dev/null @@ -1,10 +0,0 @@ -/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." - 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/gamemodes/wizard/wizard_props.dm b/code/game/gamemodes/wizard/wizard_props.dm deleted file mode 100644 index b8b834679db..00000000000 --- a/code/game/gamemodes/wizard/wizard_props.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/structure/talisman_altar - name = "Altar" - desc = "A bloodstained altar dedicated to the worship of some unknown dark entity." - icon = 'icons/obj/cult.dmi' - icon_state = "talismanaltar" - density = TRUE - anchored = TRUE - -/obj/structure/fake_pylon - name = "\improper Pylon" - desc = "A floating crystal that hums with an unearthly energy." - icon = 'icons/obj/structures/pylon.dmi' - icon_state = "pylon" - light_power = 0.5 - light_range = 13 - light_color = "#3e0000" - -// A de-culted version of the cult gateway, for the wizard base map. -/obj/effect/gateway/active/spooky - light_range=5 - light_color="#ff0000" \ No newline at end of file diff --git a/code/game/images.dm b/code/game/images.dm deleted file mode 100644 index e8b84493749..00000000000 --- a/code/game/images.dm +++ /dev/null @@ -1,3 +0,0 @@ -/image/Destroy() - ..() - return QDEL_HINT_HARDDEL diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 979f91bd034..0d636922180 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -460,12 +460,6 @@ var/global/const/access_mercenary = "ACCESS_MERCENARY" desc = "Mercenary" access_type = ACCESS_TYPE_ANTAG -var/global/const/access_wizard = "ACCESS_WIZARD" -/datum/access/wizard - id = access_wizard - desc = "Wizard" - access_type = ACCESS_TYPE_ANTAG - /******* * Misc * *******/ diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm index f5df1fe5197..06e985a8772 100644 --- a/code/game/jobs/job/_job.dm +++ b/code/game/jobs/job/_job.dm @@ -34,7 +34,8 @@ var/announced = TRUE // If their arrival is announced on radio var/latejoin_at_spawnpoints // If this job should use roundstart spawnpoints for latejoin (offstation jobs etc) 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 + var/hud_icon // icon used for secHUD overlay + var/hud_icon_state // icon state used for secHUD overlay // A list of string IDs for keys to grant on join. var/list/lock_keys = list() @@ -69,7 +70,7 @@ if(type == /datum/job && global.using_map.default_job_type == type) title = "Debug Job" - hud_icon = "hudblank" + hud_icon_state = "hudblank" outfit_type = /decl/outfit/job/generic/scientist autoset_department = TRUE @@ -83,7 +84,9 @@ spawn_positions = 0 if(!hud_icon) - hud_icon = "hud[ckey(title)]" + hud_icon = global.using_map.hud_icons + if(!hud_icon_state) + hud_icon_state = "hud[ckey(title)]" ..() diff --git a/code/game/jobs/server_whitelist.dm b/code/game/jobs/server_whitelist.dm index 083876ecad3..9c8b84f46b5 100644 --- a/code/game/jobs/server_whitelist.dm +++ b/code/game/jobs/server_whitelist.dm @@ -31,7 +31,7 @@ var/global/list/server_whitelist to_file(write_file, jointext(global.server_whitelist, "\n")) var/global/list/alien_whitelist = list() -/hook/startup/proc/loadAlienWhitelist() +/proc/try_load_alien_whitelist() if(get_config_value(/decl/config/toggle/use_alien_whitelist)) if(get_config_value(/decl/config/toggle/use_alien_whitelist_sql)) if(!load_alienwhitelistSQL()) diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 16353f9bf47..55054da3de1 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -38,7 +38,7 @@ if(IS_WIRECUTTER(O)) if(cable && cable.amount) - var/m = round(input(usr,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) + var/m = round(input(user,"Please specify the length of cable to cut","Cut cable",min(cable.amount,30)) as num, 1) m = min(m, cable.amount) m = min(m, 30) if(m) @@ -47,7 +47,7 @@ var/obj/item/stack/cable_coil/CC = new (get_turf(src)) CC.amount = m else - to_chat(usr, "There's no more cable on the reel.") + to_chat(user, "There's no more cable on the reel.") return TRUE return ..() diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index dd697812746..0efbfce6cd4 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -248,7 +248,7 @@ /obj/machinery/sleeper/CanUseTopic(user) if(user == occupant) - to_chat(usr, SPAN_WARNING("You can't reach the controls from the inside.")) + to_chat(user, SPAN_WARNING("You can't reach the controls from the inside.")) return STATUS_CLOSE . = ..() diff --git a/code/game/machinery/_machines_base/machine_construction/_construction.dm b/code/game/machinery/_machines_base/machine_construction/_construction.dm index 26a364d9d8f..fa819a58c1a 100644 --- a/code/game/machinery/_machines_base/machine_construction/_construction.dm +++ b/code/game/machinery/_machines_base/machine_construction/_construction.dm @@ -88,8 +88,8 @@ /decl/machine_construction/proc/attackby(obj/item/I, mob/user, obj/machinery/machine) if(!validate_state(machine)) PRINT_STACK_TRACE("Machine [log_info_line(machine)] violated the state assumptions of the construction state [type]!") - machine.attackby(I, user) - return TRUE + return machine.attackby(I, user) + return FALSE /decl/machine_construction/proc/mechanics_info() diff --git a/code/game/machinery/_machines_base/machine_construction/airlock.dm b/code/game/machinery/_machines_base/machine_construction/airlock.dm index 52c25f29a99..835402c5484 100644 --- a/code/game/machinery/_machines_base/machine_construction/airlock.dm +++ b/code/game/machinery/_machines_base/machine_construction/airlock.dm @@ -9,7 +9,7 @@ playsound(get_turf(machine), 'sound/items/Screwdriver.ogg', 50, 1) to_chat(user, SPAN_NOTICE("You release some of the logic wiring on \the [machine]. The cover panel remains closed.")) machine.update_icon() - return + return TRUE if(IS_WRENCH(I)) TRANSFER_STATE(down_state) playsound(get_turf(machine), 'sound/items/Crowbar.ogg', 50, 1) @@ -23,6 +23,7 @@ machine.part_replacement(user, replacer) machine.display_parts(user) return TRUE + return FALSE /decl/machine_construction/default/panel_closed/door/mechanics_info() . = list() @@ -40,6 +41,7 @@ to_chat(user, SPAN_NOTICE("You tuck the exposed wiring back into \the [machine] and screw the hatch back into place.")) machine.queue_icon_update() return TRUE + return FALSE /decl/machine_construction/default/panel_closed/door/hacking/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/default.dm b/code/game/machinery/_machines_base/machine_construction/default.dm index b2cd2e49d11..c178a598eb4 100644 --- a/code/game/machinery/_machines_base/machine_construction/default.dm +++ b/code/game/machinery/_machines_base/machine_construction/default.dm @@ -30,13 +30,14 @@ machine.panel_open = TRUE to_chat(user, SPAN_NOTICE("You open the maintenance hatch of \the [machine].")) machine.update_icon() - return + return TRUE if(istype(I, /obj/item/part_replacer)) var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) machine.display_parts(user) return TRUE + return FALSE /decl/machine_construction/default/panel_closed/post_construct(obj/machinery/machine) try_change_state(machine, down_state) @@ -75,16 +76,14 @@ machine.panel_open = FALSE to_chat(user, SPAN_NOTICE("You close the maintenance hatch of \the [machine].")) machine.update_icon() - return - + return TRUE if(istype(I, /obj/item/part_replacer)) return machine.part_replacement(user, I) - if(IS_WRENCH(I)) return machine.part_removal(user) - if(istype(I)) return machine.part_insertion(user, I) + return FALSE /decl/machine_construction/default/panel_open/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/frame.dm b/code/game/machinery/_machines_base/machine_construction/frame.dm index 459f90a8fb2..1913c959fbe 100644 --- a/code/game/machinery/_machines_base/machine_construction/frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/frame.dm @@ -30,7 +30,7 @@ TRANSFER_STATE(/decl/machine_construction/default/deconstructed) to_chat(user, "You deconstruct \the [machine].") machine.dismantle() - + return FALSE /decl/machine_construction/frame/unwrenched/mechanics_info() . = list() @@ -49,15 +49,13 @@ try_change_state(machine, /decl/machine_construction/frame/unwrenched) /decl/machine_construction/frame/wrenched/attackby(obj/item/I, mob/user, obj/machinery/machine) - if(IS_WRENCH(I)) playsound(machine.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20, machine)) TRANSFER_STATE(/decl/machine_construction/frame/unwrenched) to_chat(user, "You unfasten \the [machine].") machine.anchored = FALSE - return - + return TRUE if(IS_COIL(I)) var/obj/item/stack/cable_coil/C = I if(C.get_amount() < 5) @@ -69,7 +67,7 @@ TRANSFER_STATE(/decl/machine_construction/frame/awaiting_circuit) to_chat(user, "You add cables to the frame.") return TRUE - + return FALSE /decl/machine_construction/frame/wrenched/mechanics_info() . = list() @@ -91,22 +89,22 @@ if(istype(I, /obj/item/stock_parts/circuitboard)) var/obj/item/stock_parts/circuitboard/circuit = I if(circuit.board_type == machine.expected_machine_type) - if(!user.canUnEquip(I)) - return FALSE - TRANSFER_STATE(/decl/machine_construction/frame/awaiting_parts) - user.try_unequip(I, machine) - playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) - to_chat(user, "You add the circuit board to \the [machine].") - machine.circuit = I - return + if(user.canUnEquip(I)) + TRANSFER_STATE(/decl/machine_construction/frame/awaiting_parts) + user.try_unequip(I, machine) + playsound(machine.loc, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You add the circuit board to \the [machine].") + machine.circuit = I else to_chat(user, "This frame does not accept circuit boards of this type!") - return TRUE + return TRUE if(IS_WIRECUTTER(I)) TRANSFER_STATE(/decl/machine_construction/frame/wrenched) playsound(machine.loc, 'sound/items/Wirecutter.ogg', 50, 1) to_chat(user, "You remove the cables.") new /obj/item/stack/cable_coil(machine.loc, 5) + return TRUE + return FALSE /decl/machine_construction/frame/awaiting_circuit/mechanics_info() . = list() @@ -131,7 +129,7 @@ machine.circuit.dropInto(machine.loc) machine.circuit = null to_chat(user, "You remove the circuit board.") - return + return TRUE if(IS_SCREWDRIVER(I)) playsound(machine.loc, 'sound/items/Screwdriver.ogg', 50, 1) var/obj/machinery/new_machine = new machine.circuit.build_path(machine.loc, machine.dir, FALSE) @@ -145,6 +143,7 @@ PRINT_STACK_TRACE("Machine of type [new_machine.type] was built from a circuit and frame, but had no construct state set.") qdel(machine) return TRUE + return FALSE /decl/machine_construction/frame/awaiting_parts/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm index f395d35b1b9..234319a1bca 100644 --- a/code/game/machinery/_machines_base/machine_construction/item_chassis.dm +++ b/code/game/machinery/_machines_base/machine_construction/item_chassis.dm @@ -11,7 +11,7 @@ playsound(get_turf(machine), 'sound/items/Ratchet.ogg', 50, 1) machine.visible_message(SPAN_NOTICE("\The [user] deconstructs \the [machine].")) machine.dismantle() - return + return TRUE return ..() /decl/machine_construction/default/panel_closed/item_chassis/mechanics_info() diff --git a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm index 023bbbc699f..e050c23ff8f 100644 --- a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm @@ -78,7 +78,7 @@ new /obj/item/stack/cable_coil(get_turf(machine), 5) machine.set_broken(TRUE, MACHINE_BROKEN_CONSTRUCT) machine.queue_icon_update() - return + return TRUE if((. = up_interaction(I, user, machine))) return @@ -135,10 +135,9 @@ to_chat(user, SPAN_NOTICE("You wire the [machine].")) machine.set_broken(FALSE, MACHINE_BROKEN_CONSTRUCT) machine.queue_icon_update() - return else to_chat(user, SPAN_WARNING("You need five pieces of cable to wire \the [machine].")) - return TRUE + return TRUE if((. = down_interaction(I, user, machine))) return @@ -200,14 +199,16 @@ machine.install_component(board) user.visible_message(SPAN_NOTICE("\The [user] inserts \the [board] into \the [machine]!"), SPAN_NOTICE("You insert \the [board] into \the [machine]!")) machine.queue_icon_update() - return + return TRUE if(IS_WRENCH(I)) TRANSFER_STATE(/decl/machine_construction/default/deconstructed) playsound(get_turf(machine), 'sound/items/Ratchet.ogg', 50, 1) machine.visible_message(SPAN_NOTICE("\The [user] deconstructs \the [machine].")) machine.dismantle() - return + return TRUE + + return FALSE /decl/machine_construction/wall_frame/no_circuit/mechanics_info() . = list() diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 290540f78f5..d6fafc99f1e 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -234,6 +234,8 @@ Class Procs: /obj/machinery/CouldUseTopic(var/mob/user) ..() user.set_machine(src) + if(clicksound && isliving(user)) + playsound(src, clicksound, clickvol) /obj/machinery/CouldNotUseTopic(var/mob/user) user.unset_machine() @@ -391,11 +393,6 @@ Class Procs: /datum/proc/remove_visual(mob/M) return -/obj/machinery/CouldUseTopic(var/mob/user) - ..() - if(clicksound && isliving(user)) - playsound(src, clicksound, clickvol) - /obj/machinery/proc/display_parts(mob/user) to_chat(user, "Following parts detected in the machine:") for(var/obj/item/C in component_parts) @@ -433,6 +430,8 @@ Class Procs: var/obj/item/fake_thing = type parts += "[num2text(missing[type])] [initial(fake_thing.name)]" to_chat(user, "\The [src] is missing [english_list(parts)], rendering it inoperable.") + for(var/obj/item/stock_parts/part in component_parts) + part.on_machine_examined(user) // This is really pretty crap and should be overridden for specific machines. /obj/machinery/fluid_act(var/datum/reagents/fluids) diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index f6096358929..d775b0e8070 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -255,8 +255,8 @@ var/global/list/machine_path_to_circuit_type /obj/machinery/proc/component_stat_change(var/obj/item/stock_parts/part, old_stat, flag) /obj/machinery/attackby(obj/item/I, mob/user) - if(component_attackby(I, user)) - return TRUE + if((. = component_attackby(I, user))) + return return ..() /obj/machinery/proc/component_attackby(obj/item/I, mob/user) @@ -265,7 +265,7 @@ var/global/list/machine_path_to_circuit_type continue if((. = part.attackby(I, user))) return - return construct_state && construct_state.attackby(I, user, src) + return construct_state?.attackby(I, user, src) /obj/machinery/proc/component_attack_hand(mob/user) for(var/obj/item/stock_parts/part in component_parts) @@ -352,3 +352,12 @@ Standard helpers for users interacting with machinery parts. var/present = number_of_components(required_type, only_functional) if(present < needed) LAZYSET(., required_type, needed - present) + +/obj/machinery/get_alt_interactions(mob/user) + . = ..() + for(var/obj/item/stock_parts/component in component_parts) + if(!components_are_accessible(component.type)) + continue + var/list/machine_alt_interactions = component.get_machine_alt_interactions(user) + if(LAZYLEN(machine_alt_interactions)) + LAZYADD(., machine_alt_interactions) diff --git a/code/game/machinery/_machines_base/machinery_damage.dm b/code/game/machinery/_machines_base/machinery_damage.dm index a434776abd8..bba75011ff7 100644 --- a/code/game/machinery/_machines_base/machinery_damage.dm +++ b/code/game/machinery/_machines_base/machinery_damage.dm @@ -85,7 +85,7 @@ /obj/machinery/bash(obj/item/W, mob/user) if(!istype(W)) return FALSE - var/force = W.get_attack_force(user) + var/force = W.expend_attack_force(user) if(force <= 5) return FALSE . = ..() diff --git a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm index f4aab2938f7..7ce4792bc9f 100644 --- a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm @@ -109,3 +109,13 @@ if(istype(M) && (src in M.component_parts)) return ..() + +/// Alt-click interactions provided to our parent machine. +/obj/item/stock_parts/proc/get_machine_alt_interactions(mob/user) + SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) + RETURN_TYPE(/list) + . = list() + +/// A stub for showing messages based on part status when a machine is examined. +/obj/item/stock_parts/proc/on_machine_examined(mob/user) \ No newline at end of file diff --git a/code/game/machinery/_machines_base/stock_parts/access_lock.dm b/code/game/machinery/_machines_base/stock_parts/access_lock.dm index 1858545205e..f5ae7df7558 100644 --- a/code/game/machinery/_machines_base/stock_parts/access_lock.dm +++ b/code/game/machinery/_machines_base/stock_parts/access_lock.dm @@ -61,7 +61,7 @@ if(I && check_access(I)) locked = !locked visible_message(SPAN_NOTICE("\The [src] beeps and flashes green twice: it is now [locked ? "" : "un"]locked.")) - return TRUE + return TRUE return ..() /obj/item/stock_parts/access_lock/attack_self(mob/user) 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 f78430de17d..3f92564a8d7 100644 --- a/code/game/machinery/_machines_base/stock_parts/card_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/card_reader.dm @@ -14,6 +14,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_TRACE, ) max_health = ITEM_HEALTH_NO_DAMAGE + eject_handler = /decl/interaction_handler/remove_held_item/card var/should_swipe = FALSE //Whether the card should only be swiped instead of being inserted var/obj/item/card/inserted_card //Card currently in the slot @@ -67,3 +68,10 @@ /obj/item/stock_parts/item_holder/card_reader/proc/get_emag_card() return istype(inserted_card, /obj/item/card/emag) ? inserted_card : null + +/decl/interaction_handler/remove_held_item/card + name = "Eject Card" + icon = 'icons/screen/radial.dmi' + icon_state = "radial_eject_id" + expected_component_type = /obj/item/stock_parts/item_holder/card_reader + examine_desc = "eject an inserted ID card" diff --git a/code/game/machinery/_machines_base/stock_parts/cupholder.dm b/code/game/machinery/_machines_base/stock_parts/cupholder.dm new file mode 100644 index 00000000000..da49b9b5e9c --- /dev/null +++ b/code/game/machinery/_machines_base/stock_parts/cupholder.dm @@ -0,0 +1,51 @@ +/obj/item/stock_parts/item_holder/cupholder + name = "cupholder" + desc = "A holder for cups." + icon = 'icons/obj/items/stock_parts/modular_components.dmi' + icon_state = "cupholder" + material = /decl/material/solid/organic/plastic + part_flags = PART_FLAG_HAND_REMOVE + place_verb = "place" + eject_handler = /decl/interaction_handler/remove_held_item/cup + var/image/cupholder_overlay + var/obj/item/cup + +/obj/item/stock_parts/item_holder/cupholder/Destroy() + QDEL_NULL(cup) + . = ..() + +/obj/item/stock_parts/item_holder/cupholder/is_item_inserted() + return !isnull(cup) + +/obj/item/stock_parts/item_holder/cupholder/is_accepted_type(obj/O) + var/static/allowed_cup_types + if(!allowed_cup_types) + allowed_cup_types = typecacheof(list( + /obj/item/chems/drinks/cans, + /obj/item/chems/drinks/bottle, + /obj/item/chems/glass/bottle, + /obj/item/chems/drinks/juicebox, + /obj/item/chems/drinks/glass2, + /obj/item/chems/drinks/h_chocolate, + /obj/item/chems/drinks/dry_ramen, + /obj/item/chems/drinks/tea, + /obj/item/chems/glass/handmade/cup, + /obj/item/chems/glass/handmade/mug, + /obj/item/chems/drinks/shaker, + /obj/item/chems/drinks/flask + )) + return is_type_in_typecache(O, allowed_cup_types) + +/obj/item/stock_parts/item_holder/cupholder/get_inserted() + return cup + +/obj/item/stock_parts/item_holder/cupholder/set_inserted(obj/O) + cup = O + +/obj/item/stock_parts/item_holder/cupholder/get_description_insertable() + return "cup" + +/decl/interaction_handler/remove_held_item/cup + name = "Remove Cup" + expected_component_type = /obj/item/stock_parts/item_holder/cupholder + examine_desc = "remove a cup" 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 eb6a5b8fe72..7c35679ef55 100644 --- a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm @@ -14,6 +14,7 @@ /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, ) max_health = ITEM_HEALTH_NO_DAMAGE + eject_handler = /decl/interaction_handler/remove_held_item/disk var/obj/item/disk/disk //Disk currently inserted /obj/item/stock_parts/item_holder/disk_reader/buildable @@ -38,3 +39,8 @@ /obj/item/stock_parts/item_holder/disk_reader/get_description_insertable() return "disk" + +/decl/interaction_handler/remove_held_item/disk + name = "Eject Disk" + expected_component_type = /obj/item/stock_parts/item_holder/disk_reader + examine_desc = "remove a disk" diff --git a/code/game/machinery/_machines_base/stock_parts/item_holder.dm b/code/game/machinery/_machines_base/stock_parts/item_holder.dm index 170d90d0f39..d6404088a4c 100644 --- a/code/game/machinery/_machines_base/stock_parts/item_holder.dm +++ b/code/game/machinery/_machines_base/stock_parts/item_holder.dm @@ -5,8 +5,12 @@ name = null desc = null icon = 'icons/obj/items/stock_parts/modular_components.dmi' + var/decl/interaction_handler/eject_handler // The interaction handler type used for alt-interactions. var/datum/callback/on_insert_target //Callback to call when an item is inserted var/datum/callback/on_eject_target //Callback to call when an item is ejected + /// The verb used when a player inserts an item. + /// e.g. You [insert/place/attach] the cup in the cupholder. + var/place_verb = "insert" /obj/item/stock_parts/item_holder/Destroy() unregister_on_insert() @@ -38,6 +42,10 @@ /obj/item/stock_parts/item_holder/proc/get_inserted() return +/obj/item/stock_parts/item_holder/on_machine_examined(mob/user) + if(is_item_inserted()) + to_chat(user, SPAN_INFO("It has \a [get_inserted()] in \the [src].")) + ///Handle putting the object in the component's contents. Doesn't trigger any callbacks, or messages. /obj/item/stock_parts/item_holder/proc/set_inserted(var/obj/O) return @@ -55,7 +63,7 @@ if(user) if(user.try_unequip(O, src)) - to_chat(user, SPAN_NOTICE("You insert \the [O] into \the [src].")) + to_chat(user, SPAN_NOTICE("You [place_verb] \the [O] into \the [src].")) else return FALSE else @@ -75,7 +83,7 @@ return var/obj/O = get_inserted() - if(user) + if(user && loc.Adjacent(user)) // Check adjacency in case this is called via UI stuff from a distance. user.put_in_hands(O) to_chat(user, SPAN_NOTICE("You remove \the [O] from \the [src].")) else @@ -111,4 +119,41 @@ QDEL_NULL(on_insert_target) /obj/item/stock_parts/item_holder/proc/unregister_on_eject() - QDEL_NULL(on_eject_target) \ No newline at end of file + QDEL_NULL(on_eject_target) + +// Alt interaction handling +/decl/interaction_handler/remove_held_item + abstract_type = /decl/interaction_handler/remove_held_item + expected_target_type = /obj/machinery + name = "Eject Item" + icon = 'icons/screen/radial.dmi' + icon_state = "radial_eject" + examine_desc = "eject an item" + var/obj/item/stock_parts/item_holder/expected_component_type + +/decl/interaction_handler/remove_held_item/validate() + . = ..() + if(!ispath(expected_component_type)) + . += "Expected component type was [isnull(expected_component_type) ? "NULL" : expected_component_type], expected /obj/item/stock_parts/item_holder subtype" + +/decl/interaction_handler/remove_held_item/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(.) + var/obj/machinery/target_machine = target + // Check all components, not just the first one. Maybe we have multiple! + for(var/obj/item/stock_parts/item_holder/holder in target_machine.get_all_components_of_type(expected_component_type)) + if(holder.is_item_inserted()) + return TRUE + +/decl/interaction_handler/remove_held_item/invoked(atom/target, mob/user, obj/item/prop) + var/obj/machinery/target_machine = target + // Check all components, not just the first one. Maybe we have multiple! + for(var/obj/item/stock_parts/item_holder/holder in target_machine.get_all_components_of_type(expected_component_type)) + if(holder.is_item_inserted()) + holder.eject_item(user) + return + +/obj/item/stock_parts/item_holder/get_machine_alt_interactions(mob/user) + . = ..() + if(ispath(eject_handler)) + LAZYADD(., eject_handler) diff --git a/code/game/machinery/_machines_base/stock_parts/network_lock.dm b/code/game/machinery/_machines_base/stock_parts/network_lock.dm index ca74dc09444..54098438408 100644 --- a/code/game/machinery/_machines_base/stock_parts/network_lock.dm +++ b/code/game/machinery/_machines_base/stock_parts/network_lock.dm @@ -183,7 +183,7 @@ if(href_list["add_pattern"]) if(length(groups) >= MAX_PATTERNS) - to_chat(usr, SPAN_WARNING("You cannot add more than [MAX_PATTERNS] patterns to \the [src]!")) + to_chat(user, SPAN_WARNING("You cannot add more than [MAX_PATTERNS] patterns to \the [src]!")) return TOPIC_HANDLED LAZYADD(groups, list(list())) return TOPIC_REFRESH 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 041e68950f9..732d90839c9 100644 --- a/code/game/machinery/_machines_base/stock_parts/power/terminal.dm +++ b/code/game/machinery/_machines_base/stock_parts/power/terminal.dm @@ -135,7 +135,7 @@ if(!C.can_use(10)) to_chat(user, "You need ten lengths of cable for \the [machine].") return TRUE - user.visible_message("\The [user] adds cables to the \the [machine].", \ + user.visible_message("\The [user] adds cables to \the [machine].", \ "You start adding cables to \the [machine] frame...") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, machine)) @@ -147,8 +147,8 @@ return TRUE C.use(10) user.visible_message(\ - "\The [user] has added cables to the \the [machine]!",\ - "You add cables to the \the [machine].") + "\The [user] has added cables to \the [machine]!",\ + "You add cables to \the [machine].") make_terminal(machine) return TRUE return FALSE diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index dc389cb9dec..e571411e973 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -7,9 +7,9 @@ var/uses = 20 var/disabled = 1 var/locked = 1 - var/cooldown_time = 0 - var/cooldown_timeleft = 0 - var/cooldown_on = 0 + var/slip_cooldown_time = 0 + var/slip_cooldown_timeleft = 0 + var/slip_cooldown_on = 0 initial_access = list(access_ai_upload) /obj/machinery/ai_slipper/on_update_icon() @@ -52,13 +52,11 @@ if(!area || !isturf(loc)) return var/t = "AI Liquid Dispenser ([area.proper_name])
" - if(src.locked && (!issilicon(user))) t += "(Swipe ID card to unlock control panel.)
" else t += text("Dispenser [] - []?
\n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") t += text("Uses Left: [uses]. Activate the dispenser?
\n") - show_browser(user, t, "window=computer;size=575x450") onclose(user, "computer") @@ -74,30 +72,26 @@ update_icon() . = TOPIC_REFRESH if (href_list["toggleUse"]) - if(!(cooldown_on || disabled)) + if(!(slip_cooldown_on || disabled)) new /obj/effect/effect/foam(src.loc) src.uses-- - cooldown_on = 1 - cooldown_time = world.timeofday + 100 + slip_cooldown_on = 1 + slip_cooldown_time = world.timeofday + 100 slip_process() . = TOPIC_REFRESH - if(. == TOPIC_REFRESH) ui_interact(user) /obj/machinery/ai_slipper/proc/slip_process() - while(cooldown_time - world.timeofday > 0) - var/ticksleft = cooldown_time - world.timeofday - + while(slip_cooldown_time - world.timeofday > 0) + var/ticksleft = slip_cooldown_time - world.timeofday if(ticksleft > 1e5) - cooldown_time = world.timeofday + 10 // midnight rollover - - - cooldown_timeleft = (ticksleft / 10) + slip_cooldown_time = world.timeofday + 10 // midnight rollover + slip_cooldown_timeleft = (ticksleft / 10) sleep(5) if (uses <= 0) return if (uses >= 0) - cooldown_on = 0 + slip_cooldown_on = 0 src.power_change() return diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index a08744dd251..721eddb4ad9 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -221,7 +221,7 @@ return TOPIC_REFRESH if(href_list["set_input_tag"]) - var/t = sanitize_safe(input(usr, "Enter the input ID tag.", src.name, src.input_tag), MAX_NAME_LEN) + var/t = sanitize_safe(input(user, "Enter the input ID tag.", src.name, src.input_tag), MAX_NAME_LEN) t = sanitize_safe(t, MAX_NAME_LEN) if (t) src.input_tag = t @@ -229,7 +229,7 @@ return TOPIC_REFRESH if(href_list["set_output_tag"]) - var/t = sanitize_safe(input(usr, "Enter the output ID tag.", src.name, src.output_tag), MAX_NAME_LEN) + var/t = sanitize_safe(input(user, "Enter the output ID tag.", src.name, src.output_tag), MAX_NAME_LEN) t = sanitize_safe(t, MAX_NAME_LEN) if (t) src.output_tag = t @@ -237,7 +237,7 @@ return TOPIC_REFRESH if(href_list["set_sensor_tag"]) - var/t = sanitize_safe(input(usr, "Enter the sensor ID tag.", src.name, src.sensor_tag)) + var/t = sanitize_safe(input(user, "Enter the sensor ID tag.", src.name, src.sensor_tag)) t = sanitize_safe(t, MAX_NAME_LEN) if(t) src.sensor_tag = t @@ -245,7 +245,7 @@ return TOPIC_REFRESH if(href_list["set_sensor_name"]) - var/t = sanitize_safe(input(usr, "Enter the sensor name.", src.name, src.sensor_name)) + var/t = sanitize_safe(input(user, "Enter the sensor name.", src.name, src.sensor_name)) t = sanitize_safe(t, MAX_NAME_LEN) if(t) src.sensor_name = t @@ -331,8 +331,3 @@ radio_connection.post_signal(src, signal, device_tag) ..() - -/obj/machinery/computer/air_control/supermatter_core - icon = 'icons/obj/computer.dmi' - frequency = 1438 - out_pressure_mode = 1 \ No newline at end of file diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index f317c799c01..d3d06f81b00 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -207,7 +207,7 @@ EMPTY_CANISTER(phoron, /obj/machinery/portable_atmospherics/canister/phoron) /obj/machinery/portable_atmospherics/canister/bash(var/obj/item/W, var/mob/user) . = ..() if(.) - current_health -= W.get_attack_force(user) + current_health -= W.expend_attack_force(user) healthcheck() /obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/W, var/mob/user) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index e6eb5609476..f9583f4acfc 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -79,45 +79,53 @@ return SPAN_NOTICE("You must turn \the [src] off first.") return ..() -/obj/machinery/biogenerator/attackby(var/obj/item/O, var/mob/user) - if((. = component_attackby(O, user))) - return +/obj/machinery/biogenerator/attackby(var/obj/item/used_item, var/mob/user) + if(processing) - to_chat(user, "\The [src] is currently processing.") - if(istype(O, /obj/item/chems/glass)) + if((. = component_attackby(used_item, user))) + return + to_chat(user, SPAN_WARNING("\The [src] is currently processing.")) + return TRUE + + if(istype(used_item, /obj/item/chems/glass)) if(beaker) - to_chat(user, "]\The [src] is already loaded.") - return TRUE - else if(user.try_unequip(O, src)) - beaker = O + to_chat(user, SPAN_NOTICE("\The [src] is already loaded.")) + else if(user.try_unequip(used_item, src)) + beaker = used_item state = BG_READY updateUsrDialog() - return TRUE + return TRUE if(ingredients >= capacity) - to_chat(user, "\The [src] is already full! Activate it.") - else if(isobj(O)) - if(O.storage) - var/hadPlants = 0 - for(var/obj/item/food/grown/G in O.storage.get_contents()) - hadPlants = 1 - O.storage.remove_from_storage(user, G, src, TRUE) - ingredients++ - if(ingredients >= capacity) - to_chat(user, "You fill \the [src] to its capacity.") - break - O.storage.finish_bulk_removal() //Now do the UI stuff once. - if(!hadPlants) - to_chat(user, "\The [O] has no produce inside.") - else if(ingredients < capacity) - to_chat(user, "You empty \the [O] into \the [src].") - - else if(!istype(O, /obj/item/food/grown)) - to_chat(user, "You cannot put this in \the [src].") - else if(user.try_unequip(O, src)) + to_chat(user, SPAN_NOTICE("\The [src] is already full! Activate it.")) + return TRUE + + if(used_item.storage) + var/added_plants = FALSE + for(var/obj/item/food/grown/G in used_item.storage.get_contents()) + added_plants = TRUE + used_item.storage.remove_from_storage(user, G, src, TRUE) + ingredients++ + if(ingredients >= capacity) + to_chat(user, SPAN_NOTICE("You fill \the [src] to its capacity.")) + break + used_item.storage.finish_bulk_removal() //Now do the UI stuff once. + if(!added_plants) + to_chat(user, SPAN_WARNING("\The [used_item] has no produce inside.")) + else if(ingredients < capacity) + to_chat(user, SPAN_NOTICE("You empty \the [used_item] into \the [src].")) + return TRUE + + if(!istype(used_item, /obj/item/food/grown)) + to_chat(user, SPAN_WARNING("You cannot put this in \the [src].")) + return TRUE + + if(user.try_unequip(used_item, src)) ingredients++ - to_chat(user, "You put \the [O] in \the [src]") - update_icon() + to_chat(user, SPAN_NOTICE("You put \the [used_item] in \the [src]")) + return TRUE + + return ..() /** * Display the NanoUI window for the vending machine. @@ -160,7 +168,7 @@ /obj/machinery/biogenerator/OnTopic(user, href_list) switch (href_list["action"]) if("activate") - activate() + activate(user) if("detach") if(beaker) beaker.dropInto(src.loc) @@ -186,8 +194,8 @@ ui_interact(user) return TRUE -/obj/machinery/biogenerator/proc/activate() - if (usr.stat) +/obj/machinery/biogenerator/proc/activate(mob/user) + if (user.incapacitated()) return if (stat) //NOPOWER etc return diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index ee9a28eee31..3262bf5a423 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -187,7 +187,7 @@ /obj/machinery/camera/physical_attack_hand(mob/living/human/user) if(!istype(user)) return TRUE - if(user.species.can_shred(user)) + if(user.can_shred()) user.do_attack_animation(src) visible_message(SPAN_WARNING("\The [user] slashes at [src]!")) playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 0042bac3abb..d1a10d81ea0 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -149,33 +149,32 @@ /mob/living/silicon/ai/proc/ai_actual_track(mob/living/target) if(!istype(target)) return - var/mob/living/silicon/ai/U = usr - if(target == U.cameraFollow) + if(target == cameraFollow) return - if(U.cameraFollow) - U.ai_cancel_tracking() - U.cameraFollow = target - to_chat(U, "Tracking target...") + if(cameraFollow) + ai_cancel_tracking() + cameraFollow = target + to_chat(src, "Tracking target...") target.tracking_initiated() spawn (0) - while (U.cameraFollow == target) - if (U.cameraFollow == null) + while (cameraFollow == target) + if (cameraFollow == null) return switch(target.tracking_status()) if(TRACKING_NO_COVERAGE) - to_chat(U, "Target is not near any active cameras.") + to_chat(src, "Target is not near any active cameras.") sleep(100) continue if(TRACKING_TERMINATE) - U.ai_cancel_tracking(1) + ai_cancel_tracking(1) return - if(U.eyeobj) - U.eyeobj.setLoc(get_turf(target), 0) + if(eyeobj) + eyeobj.setLoc(get_turf(target), 0) else view_core() return diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 37ac6e0d729..af53c701163 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -34,7 +34,7 @@ to_chat(usr, SPAN_NOTICE("Issuing reason: [reason].")) /obj/item/card/id/guest/proc/expire() - color = COLOR_BLACK + set_color(COLOR_BLACK) detail_color = COLOR_BLACK update_icon() diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 16503b09fe9..0c145faa9de 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -120,7 +120,7 @@ dat += "
[++i]. Set Custom Key
" else dat += "

Please authenticate with the server in order to show additional options." - if((isAI(user) || isrobot(user)) && (user.mind.assigned_special_role && user.mind.original == user)) + if((isAI(user) || isrobot(user)) && player_is_antag(user.mind)) //Malf/Traitor AIs can bruteforce into the system to gain the Key. dat += "
*&@#. Bruteforce Key
" @@ -283,7 +283,7 @@ //Hack the Console to get the password if (href_list["hack"]) - if((isAI(usr) || isrobot(usr)) && usr.mind.assigned_special_role && usr.mind.original == usr) + if((isAI(usr) || isrobot(usr)) && player_is_antag(usr.mind)) src.hacking = 1 src.screen = 2 update_icon() diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 524f6a35889..4b1d38034e5 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -68,7 +68,7 @@ return TOPIC_HANDLED // Antag AI checks - if(!isAI(user) || !(user.mind.assigned_special_role && user.mind.original == user)) + if(!isAI(user) || !player_is_antag(user.mind)) to_chat(user, "Access Denied") return TOPIC_HANDLED @@ -103,9 +103,9 @@ . = TOPIC_REFRESH // Proc: get_cyborgs() -// Parameters: 1 (operator - mob which is operating the console.) +// Parameters: 1 (user - mob which is operating the console.) // Description: Returns NanoUI-friendly list of accessible cyborgs. -/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/operator) +/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/user) var/list/robots = list() for(var/mob/living/silicon/robot/R in global.silicon_mob_list) @@ -145,7 +145,7 @@ robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None" robot["hackable"] = 0 // Antag AIs know whether linked cyborgs are hacked or not. - if(operator && isAI(operator) && (R.connected_ai == operator) && (operator.mind.assigned_special_role && operator.mind.original == operator)) + if(user && isAI(user) && (R.connected_ai == user) && player_is_antag(user.mind)) robot["hacked"] = R.emagged ? 1 : 0 robot["hackable"] = R.emagged? 0 : 1 robots.Add(list(robot)) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 11c41dca7ca..df5391cc06d 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -19,7 +19,7 @@ update_icon() /obj/machinery/constructable_frame/dismantle() - SSmaterials.create_object(/decl/material/solid/metal/steel, loc, 5, object_type = /obj/item/stack/material/strut) + SSmaterials.create_object(/decl/material/solid/metal/steel, loc, 5, object_type = /obj/item/stack/material/rods) qdel(src) return TRUE diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 5b319d56bcb..345a6b0359a 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -52,9 +52,9 @@ else switch(W.atom_damage_type) if(BURN) - current_health -= W.get_attack_force(user) * 0.75 + current_health -= W.expend_attack_force(user) * 0.75 if(BRUTE) - current_health -= W.get_attack_force(user) * 0.5 + current_health -= W.expend_attack_force(user) * 0.5 if (current_health <= 0) explode() return TRUE diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index 356db05a3fa..e76fe49edfe 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -325,7 +325,7 @@ return 1 /obj/machinery/door/bash(obj/item/weapon, mob/user) - if(isliving(user) && user.a_intent != I_HURT) + if(isliving(user) && !user.check_intent(I_FLAG_HARM)) return FALSE if(!weapon.user_can_attack_with(user)) return FALSE @@ -335,7 +335,7 @@ return FALSE user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(src) - var/force = weapon.get_attack_force(user) + var/force = weapon.expend_attack_force(user) if(force < min_force) user.visible_message("\The [user] hits \the [src] with \the [weapon] with no visible effect.") else diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 65f6f87a176..1be24240e75 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -141,9 +141,6 @@ About the new airlock wires panel: return ..(user) -/obj/machinery/door/airlock/bumpopen(mob/living/simple_animal/user) - ..(user) - /obj/machinery/door/airlock/proc/isElectrified() if(src.electrified_until != 0) return 1 @@ -783,7 +780,7 @@ About the new airlock wires panel: close(1) return TRUE - if(istype(C, /obj/item/bladed/axe/fire) && !arePowerSystemsOn() && !(user.a_intent == I_HURT)) + if(istype(C, /obj/item/bladed/axe/fire) && !arePowerSystemsOn() && !(user.check_intent(I_FLAG_HARM))) var/obj/item/bladed/axe/fire/F = C if(F.is_held_twohanded(user)) if(locked) @@ -805,7 +802,7 @@ About the new airlock wires panel: else if((stat & (BROKEN|NOPOWER)) && isanimal(user)) var/mob/living/simple_animal/A = user var/obj/item/I = A.get_natural_weapon() - if(I?.get_attack_force(user) >= 10) + if(I?.expend_attack_force(user) >= 10) if(density) visible_message(SPAN_DANGER("\The [A] forces \the [src] open!")) open(1) @@ -820,12 +817,12 @@ About the new airlock wires panel: /obj/machinery/door/airlock/bash(obj/item/weapon, mob/user) //if door is unbroken, hit with fire axe using harm intent - if (istype(weapon, /obj/item/bladed/axe/fire) && !(stat & BROKEN) && user.a_intent == I_HURT && weapon.user_can_attack_with(user)) + if (istype(weapon, /obj/item/bladed/axe/fire) && !(stat & BROKEN) && user.check_intent(I_FLAG_HARM) && weapon.user_can_attack_with(user)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/obj/item/bladed/axe/fire/F = weapon if (F.is_held_twohanded()) playsound(src, 'sound/weapons/smash.ogg', 100, 1) - current_health -= F.get_attack_force(user) * 2 + current_health -= F.expend_attack_force(user) * 2 if(current_health <= 0) user.visible_message(SPAN_DANGER("[user] smashes \the [weapon] into the airlock's control panel! It explodes in a shower of sparks!"), SPAN_DANGER("You smash \the [weapon] into the airlock's control panel! It explodes in a shower of sparks!")) current_health = 0 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 6ec853d2eb8..e6366bcc0a0 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -139,13 +139,11 @@ return /obj/machinery/door/window/physical_attack_hand(mob/user) - if(ishuman(user)) - var/mob/living/human/H = user - if(H.species.can_shred(H)) - playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) - visible_message("\The [user] smashes against \the [src].", 1) - take_damage(25) - return TRUE + if(user.can_shred()) + playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) + visible_message(SPAN_DANGER("\The [user] smashes against \the [src].")) + take_damage(25) + return TRUE return ..() /obj/machinery/door/window/emag_act(var/remaining_charges, var/mob/user) diff --git a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm index f187d98f09c..dabbb7680fb 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers_dummy.dm @@ -132,12 +132,12 @@ if(href_list["input_tag"]) var/new_tag = input(user, "Enter the tag of the controller to connect to.", "Tag Selection", terminal.id_tag) as text|null if(extension_status(user) != STATUS_INTERACTIVE) - return MT_NOACTION + return TOPIC_NOACTION new_tag = sanitize_name(new_tag, MAX_MESSAGE_LEN, TRUE, FALSE) if(new_tag) terminal.id_tag = new_tag terminal.setup_target_controller() - return MT_REFRESH + return TOPIC_REFRESH if(istext(href_list["set_tag"])) var/new_tag = href_list["set_tag"] @@ -145,6 +145,6 @@ if(new_tag) terminal.id_tag = new_tag terminal.setup_target_controller() - return MT_REFRESH + return TOPIC_REFRESH return ..() diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index bfdbc356c44..2f893501f6e 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -174,20 +174,20 @@ if(href_list["set_tag"]) var/new_tag = input(user, "Enter a new tag to use. Warning: this will reset all tags used by this machine, not just the main one!", "Tag Selection", controller.id_tag) as text|null if(extension_status(user) != STATUS_INTERACTIVE) - return MT_NOACTION + return TOPIC_NOACTION new_tag = sanitize_name(new_tag, MAX_MESSAGE_LEN, TRUE, FALSE) if(new_tag) controller.reset_id_tags(new_tag) controller.set_frequency(controller.frequency) - return MT_REFRESH + return TOPIC_REFRESH if(href_list["set_freq"]) var/new_frequency = input(user, "Enter a new frequency to use.", "frequency Selection", controller.frequency) as num|null if(!new_frequency || (extension_status(user) != STATUS_INTERACTIVE)) - return MT_NOACTION + return TOPIC_NOACTION new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) controller.set_frequency(new_frequency) - return MT_REFRESH + return TOPIC_REFRESH /decl/stock_part_preset/radio/receiver/vent_pump/airlock frequency = EXTERNAL_AIR_FREQ diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 65fef9d81f1..b6fefd1fe27 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -58,13 +58,13 @@ var/global/list/floor_light_cache = list() qdel(src) return TRUE - if(W.get_attack_force(user) && user.a_intent == I_HURT) + if(W.get_attack_force(user) && user.check_intent(I_FLAG_HARM)) return physical_attack_hand(user) return ..() /obj/machinery/floor_light/physical_attack_hand(var/mob/user) - if(user.a_intent == I_HURT && !issmall(user)) + if(user.check_intent(I_FLAG_HARM) && !issmall(user)) if(!isnull(damaged) && !(stat & BROKEN)) visible_message(SPAN_DANGER("\The [user] smashes \the [src]!")) playsound(src, "shatter", 70, 1) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 6d804caa374..b8628b7e508 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -41,7 +41,7 @@ var/m = input("Choose work mode", "Mode") as null|anything in mode mode[m] = !mode[m] var/O = mode[m] - user.visible_message("[usr] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") + user.visible_message("[user] has set \the [src] [m] mode [!O?"off":"on"].", "You set \the [src] [m] mode [!O?"off":"on"].") return TRUE if(istype(W, /obj/item/stack/tile)) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 9d871d3e2b5..ce3c79b45d8 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -80,6 +80,9 @@ var/global/list/holopads = list() /obj/machinery/hologram/holopad/Destroy() global.listening_objects -= src + global.holopads -= src + for (var/mob/living/master in masters) + clear_holo(master) return ..() /obj/machinery/hologram/holopad/interface_interact(var/mob/living/human/user) //Carn: Hologram requests. @@ -387,13 +390,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ idle_power_usage = 5 active_power_usage = 100 -//Destruction procs. -/obj/machinery/hologram/holopad/Destroy() - global.holopads -= src - for (var/mob/living/master in masters) - clear_holo(master) - return ..() - /* * Other Stuff: Is this even used? */ diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index f086a33332b..47f7eab5211 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -40,7 +40,7 @@ /obj/machinery/igniter/interface_interact(mob/user) if(!CanInteract(user, DefaultTopicState())) return FALSE - ignite() + toggle_igniter() visible_message(SPAN_NOTICE("\The [user] toggles \the [src].")) return TRUE @@ -51,7 +51,7 @@ location.hotspot_expose(1000,500,1) return 1 -/obj/machinery/igniter/proc/ignite() +/obj/machinery/igniter/proc/toggle_igniter() use_power_oneoff(2000) on = !on if(on) @@ -73,7 +73,7 @@ /decl/public_access/public_method/igniter_toggle name = "igniter toggle" desc = "Toggle the igniter on or off." - call_proc = TYPE_PROC_REF(/obj/machinery/igniter, ignite) + call_proc = TYPE_PROC_REF(/obj/machinery/igniter, toggle_igniter) /decl/stock_part_preset/radio/receiver/igniter frequency = BUTTON_FREQ @@ -133,19 +133,15 @@ return ..() /obj/machinery/sparker/attack_ai() - if (anchored) - return ignite() - else - return + return anchored ? create_sparks() : null -/obj/machinery/sparker/proc/ignite() +/obj/machinery/sparker/proc/create_sparks() if (stat & NOPOWER) return if (disable || (last_spark && world.time < last_spark + 50)) return - flick("[base_state]-spark", src) spark_at(src, amount=2, cardinal_only = TRUE) src.last_spark = world.time @@ -159,13 +155,13 @@ if(stat & (BROKEN|NOPOWER)) ..(severity) return - ignite() + create_sparks() ..(severity) /decl/public_access/public_method/sparker_spark name = "spark" desc = "Creates sparks to ignite nearby gases." - call_proc = TYPE_PROC_REF(/obj/machinery/sparker, ignite) + call_proc = TYPE_PROC_REF(/obj/machinery/sparker, create_sparks) /decl/stock_part_preset/radio/receiver/sparker frequency = BUTTON_FREQ diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 6351cca16c7..1fb6b7666b7 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -110,7 +110,7 @@ if(emagged) emag_play() else if(!current_track) - to_chat(usr, "No track selected.") + to_chat(user, "No track selected.") else StartPlaying() return TOPIC_REFRESH diff --git a/code/game/machinery/kitchen/drying_oven.dm b/code/game/machinery/kitchen/drying_oven.dm index 7c2a310b112..e69de29bb2d 100644 --- a/code/game/machinery/kitchen/drying_oven.dm +++ b/code/game/machinery/kitchen/drying_oven.dm @@ -1,45 +0,0 @@ -/obj/machinery/smartfridge/drying_oven - name = "drying oven" - desc = "A machine for drying plants." - icon_state = "drying_rack" - icon_base = "drying_rack" - obj_flags = OBJ_FLAG_ANCHORABLE - atom_flags = ATOM_FLAG_CLIMBABLE - -/obj/machinery/smartfridge/drying_oven/accept_check(var/obj/item/O) - return istype(O) && O.is_dryable() - -/obj/machinery/smartfridge/drying_oven/Process() - ..() - if(inoperable()) - return - var/do_update = FALSE - for(var/obj/item/thing in get_contained_external_atoms()) - var/obj/item/product = thing.dry_out(src, silent = TRUE) - if(product) - product.dropInto(loc) - do_update = TRUE - if(QDELETED(thing) || !(thing in contents)) - for(var/datum/stored_items/I in item_records) - I.instances -= thing - if(do_update) - update_icon() - -/obj/machinery/smartfridge/drying_oven/on_update_icon() - ..() - var/has_items = FALSE - for(var/datum/stored_items/I in item_records) - if(I.get_amount()) - has_items = TRUE - break - if(inoperable()) - if(has_items) - icon_state = "[icon_base]-plant-off" - else - icon_state = "[icon_base]-off" - else if(has_items) - icon_state = "[icon_base]-plant" - if(!inoperable()) - icon_state = "[icon_base]-close" - else - icon_state = icon_base diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index 2a893f6e61b..cd751f4d64a 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -33,7 +33,7 @@ if(ICECREAM_STRAWBERRY) return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/drink/juice/berry) if(ICECREAM_BLUE) - return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/ethanol/bluecuracao) + return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/alcohol/bluecuracao) if(ICECREAM_CHERRY) return list(/decl/material/liquid/drink/milk, /decl/material/solid/ice, /decl/material/liquid/nutriment/cherryjelly) if(ICECREAM_BANANA) diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 632c1458349..bda3e44c704 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -415,20 +415,20 @@ ffuu.add_to_reagents(/decl/material/liquid/acrylamide, amount/10) return ffuu -/obj/machinery/microwave/OnTopic(href, href_list) +/obj/machinery/microwave/OnTopic(mob/user, href_list) switch(href_list["action"]) if ("cook") cook() return TOPIC_REFRESH if ("dispose") - dispose(usr) + dispose(user) return TOPIC_REFRESH if ("ejectitem") for(var/obj/O in get_contained_external_atoms()) if(strip_improper(O.name) == href_list["target"]) - eject_item(usr, O) + eject_item(user, O) break return TOPIC_REFRESH @@ -437,7 +437,7 @@ for(var/material_type in reagents.reagent_volumes) mat = GET_DECL(material_type) if(mat.name == href_list["target"]) - eject_reagent(usr, material_type) + eject_reagent(user, material_type) break return TOPIC_REFRESH diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm deleted file mode 100644 index 87285e91403..00000000000 --- a/code/game/machinery/magnet.dm +++ /dev/null @@ -1,391 +0,0 @@ -// Magnetic attractor, creates variable magnetic fields and attraction. -// Can also be used to emit electron/proton beams to create a center of magnetism on another tile - -// tl;dr: it's magnets lol -// This was created for firing ranges, but I suppose this could have other applications - Doohl - -var/global/list/magnetic_modules = list() - -/obj/machinery/magnetic_module - - icon = 'icons/obj/objects.dmi' - icon_state = "floor_magnet-f" - name = "Electromagnetic Generator" - desc = "A device that uses powernet to create points of magnetic energy." - level = LEVEL_BELOW_PLATING - layer = ABOVE_WIRE_LAYER - anchored = TRUE - idle_power_usage = 50 - - var/freq = 1449 // radio frequency - var/electricity_level = 1 // intensity of the magnetic pull - var/magnetic_field = 1 // the range of magnetic attraction - var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something - var/turf/center // the center of magnetic attraction - var/on = 0 - var/pulling = 0 - - // x, y modifiers to the center turf; (0, 0) is centered on the magnet, whereas (1, -1) is one tile right, one tile down - var/center_x = 0 - var/center_y = 0 - var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer - -/obj/machinery/magnetic_module/Initialize() - . = ..() - global.magnetic_modules += src - var/turf/T = loc - if(!T) - return INITIALIZE_HINT_QDEL - hide(!T.is_plating()) - center = T - - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_MAGNETS) - - magnetic_process() - - // update the invisibility and icon -/obj/machinery/magnetic_module/hide(var/intact) - set_invisibility(intact ? 101 : 0) - update_icon() - - // update the icon_state -/obj/machinery/magnetic_module/on_update_icon() - var/state="floor_magnet" - var/onstate="" - if(!on) - onstate="0" - - if(invisibility) - icon_state = "[state][onstate]-f" // if invisible, set icon to faded version - // in case of being revealed by T-scanner - else - icon_state = "[state][onstate]" - -/obj/machinery/magnetic_module/receive_signal(datum/signal/signal) - - var/command = signal.data["command"] - var/modifier = signal.data["modifier"] - var/signal_code = signal.data["code"] - if(command && (signal_code == code)) - - Cmd(command, modifier) - - - -/obj/machinery/magnetic_module/proc/Cmd(var/command, var/modifier) - - if(command) - switch(command) - if("set-electriclevel") - if(modifier) electricity_level = modifier - if("set-magneticfield") - if(modifier) magnetic_field = modifier - - if("add-elec") - electricity_level++ - if(electricity_level > 12) - electricity_level = 12 - if("sub-elec") - electricity_level-- - if(electricity_level <= 0) - electricity_level = 1 - if("add-mag") - magnetic_field++ - if(magnetic_field > 4) - magnetic_field = 4 - if("sub-mag") - magnetic_field-- - if(magnetic_field <= 0) - magnetic_field = 1 - - if("set-x") - if(modifier) center_x = modifier - if("set-y") - if(modifier) center_y = modifier - - if("N") // NORTH - center_y++ - if("S") // SOUTH - center_y-- - if("E") // EAST - center_x++ - if("W") // WEST - center_x-- - if("C") // CENTER - center_x = 0 - center_y = 0 - if("R") // RANDOM - center_x = rand(-max_dist, max_dist) - center_y = rand(-max_dist, max_dist) - - if("set-code") - if(modifier) code = modifier - if("toggle-power") - on = !on - - if(on) - spawn() - magnetic_process() - - - -/obj/machinery/magnetic_module/Process() - if(stat & NOPOWER) - on = 0 - - // Sanity checks: - if(electricity_level <= 0) - electricity_level = 1 - if(magnetic_field <= 0) - magnetic_field = 1 - - - // Limitations: - if(abs(center_x) > max_dist) - center_x = max_dist - if(abs(center_y) > max_dist) - center_y = max_dist - if(magnetic_field > 4) - magnetic_field = 4 - if(electricity_level > 12) - electricity_level = 12 - - // Update power usage: - if(on) - update_use_power(POWER_USE_ACTIVE) - change_power_consumption(electricity_level*15, POWER_USE_ACTIVE) - else - update_use_power(POWER_USE_IDLE) - -/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the pulling - set waitfor = FALSE - if(pulling) return - while(on) - - pulling = 1 - center = locate(x+center_x, y+center_y, z) - if(center) - for(var/obj/M in orange(magnetic_field, center)) - if(!M.anchored && (M.obj_flags & OBJ_FLAG_CONDUCTIBLE)) - step_towards(M, center) - - for(var/mob/living/silicon/S in orange(magnetic_field, center)) - if(isAI(S)) continue - step_towards(S, center) - - use_power_oneoff(electricity_level * 5) - sleep(13 - electricity_level) - - pulling = 0 - -/obj/machinery/magnetic_module/Destroy() - if(radio_controller) - radio_controller.remove_object(src, freq) - global.magnetic_modules -= src - return ..() - -/obj/machinery/magnetic_controller // TODO: IMPLEMENT OR REMOVE - name = "magnetic control console" - icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING! - icon_state = "airlock_control_off" - density = TRUE - anchored = TRUE - idle_power_usage = 45 - var/frequency = 1449 - var/code = 0 - var/list/magnets = list() - var/title = "Magnetic Control Console" - var/autolink = 0 // if set to 1, can't probe for other magnets! - - var/pathpos = 1 // position in the path - var/path = "NULL" // text path of the magnet - var/speed = 1 // lowest = 1, highest = 10 - var/list/rpath = list() // real path of the magnet, used in iterator - - var/moving = 0 // 1 if scheduled to loop - var/looping = 0 // 1 if looping - - var/datum/radio_frequency/radio_connection - - -/obj/machinery/magnetic_controller/Initialize() - . = ..() - if(autolink) - for(var/obj/machinery/magnetic_module/M in global.magnetic_modules) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - - if(radio_controller) - radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) - - if(path) // check for default path - filter_path() // renders rpath - - -/obj/machinery/magnetic_controller/Process() - if(magnets.len == 0 && autolink) - for(var/obj/machinery/magnetic_module/M in global.magnetic_modules) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - -/obj/machinery/magnetic_controller/interface_interact(user) - interact(user) - return TRUE - -/obj/machinery/magnetic_controller/interact(mob/user) - if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "[title]

" - if(!autolink) - dat += {" - Frequency: [frequency]
- Code: [code]
- Probe Generators
- "} - - if(magnets.len >= 1) - - dat += "Magnets confirmed:
" - var/i = 0 - for(var/obj/machinery/magnetic_module/M in magnets) - i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" - - dat += "
Speed: - [speed] +
" - dat += "Path: {[path]}
" - dat += "Moving: [moving ? "Enabled":"Disabled"]" - - - show_browser(user, dat, "window=magnet;size=400x500") - onclose(user, "magnet") - -/obj/machinery/magnetic_controller/Topic(href, href_list) - if(..()) - return 1 - if(stat & (BROKEN|NOPOWER)) - return - usr.set_machine(src) - - if(href_list["radio-op"]) - - // Prepare signal beforehand, because this is a radio operation - var/datum/signal/signal = new - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - // Apply any necessary commands - switch(href_list["radio-op"]) - if("togglepower") - signal.data["command"] = "toggle-power" - - if("minuselec") - signal.data["command"] = "sub-elec" - if("pluselec") - signal.data["command"] = "add-elec" - - if("minusmag") - signal.data["command"] = "sub-mag" - if("plusmag") - signal.data["command"] = "add-mag" - - - // Broadcast the signal - - radio_connection.post_signal(src, signal, radio_filter = RADIO_MAGNETS) - - spawn(1) - updateUsrDialog() // pretty sure this increases responsiveness - - if(href_list["operation"]) - switch(href_list["operation"]) - if("plusspeed") - speed ++ - if(speed > 10) - speed = 10 - if("minusspeed") - speed -- - if(speed <= 0) - speed = 1 - if("setpath") - var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null) - if(newpath && newpath != "") - moving = 0 // stop moving - path = newpath - pathpos = 1 // reset position - filter_path() // renders rpath - - if("togglemoving") - moving = !moving - if(moving) - spawn() MagnetMove() - - - updateUsrDialog() - -/obj/machinery/magnetic_controller/proc/MagnetMove() - if(looping) return - - while(moving && rpath.len >= 1) - - if(stat & (BROKEN|NOPOWER)) - break - - looping = 1 - - // Prepare the radio signal - var/datum/signal/signal = new - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! - pathpos = 1 - - var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive - - if(!(nextmove in list("N","S","E","W","C","R"))) - // N, S, E, W are directional - // C is center - // R is random (in magnetic field's bounds) - qdel(signal) - break // break the loop if the character located is invalid - - signal.data["command"] = nextmove - - - pathpos++ // increase iterator - - // Broadcast the signal - spawn() - radio_connection.post_signal(src, signal, radio_filter = RADIO_MAGNETS) - - if(speed == 10) - sleep(1) - else - sleep(12-speed) - - looping = 0 - - -/obj/machinery/magnetic_controller/proc/filter_path() - // Generates the rpath variable using the path string, think of this as "string2list" - // Doesn't use params2list() because of the akward way it stacks entities - rpath = list() // clear rpath - var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length - - for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path - - var/nextchar = copytext(path, i, i+1) // find next character - - if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore - rpath += copytext(path, i, i+1) // else, add to list - - // there doesn't HAVE to be separators but it makes paths syntatically visible - -/obj/machinery/magnetic_controller/Destroy() - if(radio_controller) - radio_controller.remove_object(src, frequency) - return ..() \ No newline at end of file diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 75221d30278..50cf312569b 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -253,7 +253,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Message Body: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) - send_rsc(usr, photo_data.photo.img, "tmp_photo.png") + send_rsc(user, photo_data.photo.img, "tmp_photo.png") dat+="
" dat+="
Delete Photo
" else @@ -325,7 +325,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="-[MESSAGE.body]
" if(MESSAGE.img) var/resourc_name = "newscaster_photo_[sanitize(viewing_channel.channel_name)]_[i].png" - send_asset(usr.client, resourc_name) + send_asset(user.client, resourc_name) dat+="
" if(MESSAGE.caption) dat+="[MESSAGE.caption]
" @@ -397,7 +397,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Description: [src.msg]
" dat+="Photo: " if(photo_data && photo_data.photo) - send_rsc(usr, photo_data.photo.img, "tmp_photo.png") + send_rsc(user, photo_data.photo.img, "tmp_photo.png") dat+="
" dat+="
Delete Photo
" else @@ -431,7 +431,7 @@ var/global/list/allCasters = list() //Global list that will contain reference to dat+="Description: [news_network.wanted_issue.body]
" dat+="Photo: " if(news_network.wanted_issue.img) - send_rsc(usr, news_network.wanted_issue.img, "tmp_photow.png") + send_rsc(user, news_network.wanted_issue.img, "tmp_photow.png") dat+="
" else dat+="None" diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 27e7d81ea03..dd3da2e44ae 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -278,7 +278,7 @@ var/global/bomb_set to_chat(usr, "Nothing happens, something might be wrong with the wiring.") return 1 if(!timing && !safety) - start_bomb() + start_bomb(usr) else check_cutoff() if(href_list["safety"]) @@ -306,9 +306,9 @@ var/global/bomb_set to_chat(usr, "There is nothing to anchor to!") return 1 -/obj/machinery/nuclearbomb/proc/start_bomb() +/obj/machinery/nuclearbomb/proc/start_bomb(user) timing = 1 - log_and_message_admins("activated the detonation countdown of \the [src]") + log_and_message_admins("activated the detonation countdown of \the [src]", user) bomb_set++ //There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke/N var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) original_level = security_state.current_security_level @@ -479,11 +479,11 @@ var/global/bomb_set if(href_list["anchor"]) return -/obj/machinery/nuclearbomb/station/start_bomb() +/obj/machinery/nuclearbomb/station/start_bomb(mob/user) for(var/inserter in inserters) var/obj/machinery/self_destruct/sd = inserter if(!istype(sd) || !sd.armed) - to_chat(usr, "An inserter has not been armed or is damaged.") + to_chat(user, "An inserter has not been armed or is damaged.") return visible_message("Warning. The self-destruct sequence override will be disabled [self_destruct_cutoff] seconds before detonation.") ..() diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 27a13a93063..aeb5ac90cac 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -185,7 +185,7 @@ /obj/machinery/oxygen_pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] if(!tank) - to_chat(usr, SPAN_WARNING("It is missing a tank!")) + to_chat(user, SPAN_WARNING("It is missing a tank!")) data["tankPressure"] = 0 data["releasePressure"] = 0 data["defaultReleasePressure"] = 0 diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index 647e9c0b572..fdc1b122ef3 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -73,7 +73,7 @@ if(m) use_metal(m) SSmaterials.create_object(/decl/material/solid/metal/steel, get_turf(src), m) - user.visible_message("[user] removes [m] sheet\s of metal from the \the [src].", "You remove [m] sheet\s of metal from \the [src]") + user.visible_message(SPAN_NOTICE("[user] removes [m] sheet\s of metal from \the [src]."), SPAN_NOTICE("You remove [m] sheet\s of metal from \the [src]")) else to_chat(user, "\The [src] is empty.") return TRUE diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index e7f5b123b93..286ac6310cc 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -193,7 +193,7 @@ var/global/list/turret_icons return STATUS_CLOSE if(!anchored) - to_chat(usr, "\The [src] has to be secured first!") + to_chat(user, "\The [src] has to be secured first!") return STATUS_CLOSE return ..() @@ -290,7 +290,7 @@ var/global/list/turret_icons else //if the turret was attacked with the intention of harming it: - var/force = I.get_attack_force(user) * 0.5 + var/force = I.expend_attack_force(user) * 0.5 user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) take_damage(force, I.atom_damage_type) if(force > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 6bc3d2230d4..28bcefc7158 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -14,9 +14,6 @@ /obj/machinery/seed_extractor/attackby(var/obj/item/O, var/mob/user) - if((. = component_attackby(O, user))) - return - // Fruits and vegetables. if(istype(O, /obj/item/food/grown)) if(!user.try_unequip(O)) diff --git a/code/game/machinery/self_destruct.dm b/code/game/machinery/self_destruct.dm index ee842c32e23..3cf9137e831 100644 --- a/code/game/machinery/self_destruct.dm +++ b/code/game/machinery/self_destruct.dm @@ -14,7 +14,7 @@ if(!damaged) return FALSE user.visible_message("[user] begins to repair [src].", "You begin repairing [src].") - if(do_after(usr, 100, src)) + if(do_after(user, 100, src)) var/obj/item/weldingtool/w = W if(w.weld(10)) damaged = 0 diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/smartfridge/_smartfridge.dm similarity index 59% rename from code/game/machinery/kitchen/smartfridge.dm rename to code/game/machinery/smartfridge/_smartfridge.dm index e9020da7cf0..28f51fab493 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/smartfridge/_smartfridge.dm @@ -3,8 +3,8 @@ */ /obj/machinery/smartfridge name = "\improper SmartFridge" - icon = 'icons/obj/vending.dmi' - icon_state = "fridge_sci" + icon = 'icons/obj/machines/smartfridges/science.dmi' + icon_state = ICON_STATE_WORLD layer = BELOW_OBJ_LAYER density = TRUE anchored = TRUE @@ -14,9 +14,11 @@ obj_flags = OBJ_FLAG_ANCHORABLE | OBJ_FLAG_ROTATABLE atmos_canpass = CANPASS_NEVER required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES + construct_state = /decl/machine_construction/default/panel_closed + uncreated_component_parts = null + stat_immune = 0 - var/icon_base = "fridge_sci" - var/icon_contents = "chem" + var/overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_chem.dmi' var/list/item_records = list() var/seconds_electrified = 0; var/shoot_inventory = 0 @@ -24,13 +26,6 @@ var/scan_id = 1 var/is_secure = 0 - construct_state = /decl/machine_construction/default/panel_closed - uncreated_component_parts = null - stat_immune = 0 - -/obj/machinery/smartfridge/secure - is_secure = 1 - /obj/machinery/smartfridge/Initialize() if(is_secure) wires = new/datum/wires/smartfridge/secure(src) @@ -55,75 +50,6 @@ return 1 return 0 -/obj/machinery/smartfridge/seeds - name = "\improper MegaSeed Servitor" - desc = "When you need seeds fast!" - -/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O) - if(istype(O,/obj/item/seeds/)) - return 1 - return 0 - -/obj/machinery/smartfridge/secure/medbay - name = "\improper Refrigerated Medicine Storage" - desc = "A refrigerated storage unit for storing medicine and chemicals." - icon_contents = "chem" - 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)) - return 1 - if(istype(O,/obj/item/pill_bottle)) - return 1 - 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/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." - icon_contents = "chem" - -/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O) - if(istype(O,/obj/item/pill_bottle) || istype(O,/obj/item/chems)) - return 1 - return 0 - -/obj/machinery/smartfridge/drinks - name = "\improper Drink Showcase" - desc = "A refrigerated storage unit for tasty tasty alcohol." - icon_state = "fridge_dark" - icon_base = "fridge_dark" - icon_contents = "drink" - -/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O) - if(istype(O,/obj/item/chems/glass) || istype(O,/obj/item/chems/drinks) || istype(O,/obj/item/chems/condiment)) - return 1 - -/obj/machinery/smartfridge/foods - name = "\improper Hot Foods Display" - desc = "A heated storage unit for piping hot meals." - icon_state = "fridge_food" - icon_contents = "food" - -/obj/machinery/smartfridge/foods/accept_check(var/obj/item/O) - if(istype(O,/obj/item/food) || istype(O,/obj/item/utensil)) - return 1 - /obj/machinery/smartfridge/Process() if(stat & (BROKEN|NOPOWER)) return @@ -133,42 +59,61 @@ src.throw_item() /obj/machinery/smartfridge/on_update_icon() - overlays.Cut() - if(stat & (BROKEN|NOPOWER)) - icon_state = "[icon_base]-off" - else - icon_state = icon_base + // Reset our icon_state and overlays. + icon_state = initial(icon_state) + cut_overlays() // Does not appear to be called lower down the chain, sadly. + + // Draw our side panel overlay (for access checking) + var/draw_state if(is_secure) - overlays += image(icon, "[icon_base]-sidepanel") + if(stat & BROKEN) + draw_state = "[icon_state]-sidepanel-broken" + else + draw_state = "[icon_state]-sidepanel" + if(check_state_in_icon(draw_state, icon)) + add_overlay(draw_state) + // Draw our panel overlay. if(panel_open) - overlays += image(icon, "[icon_base]-panel") - - var/image/I - var/is_off = "" - if(inoperable()) - is_off = "-off" + draw_state = "[icon_state]-panel" + if(check_state_in_icon(draw_state, icon)) + add_overlay(draw_state) // Fridge contents - switch(contents.len - LAZYLEN(component_parts)) - if(0) - I = image(icon, "empty[is_off]") - if(1 to 2) - I = image(icon, "[icon_contents]-1[is_off]") - if(3 to 5) - I = image(icon, "[icon_contents]-2[is_off]") - if(6 to 8) - I = image(icon, "[icon_contents]-3[is_off]") - else - I = image(icon, "[icon_contents]-4[is_off]") - overlays += I + if(overlay_contents_icon) + var/is_off = inoperable() ? "-off" : "" + switch(contents.len - LAZYLEN(component_parts)) + if(0) + draw_state = "empty[is_off]" + if(1 to 2) + draw_state = "1[is_off]" + if(3 to 5) + draw_state = "2[is_off]" + if(6 to 8) + draw_state = "3[is_off]" + else + draw_state = "4[is_off]" + if(draw_state && check_state_in_icon(draw_state, icon)) + add_overlay(image(overlay_contents_icon, draw_state)) // Fridge top - I = image(icon, "[icon_base]-top") - I.pixel_z = 32 - I.layer = ABOVE_WINDOW_LAYER - overlays += I + if(stat & BROKEN) + draw_state = "[draw_state]-top-broken" + else + draw_state = "[icon_state]-top" + + if(check_state_in_icon(draw_state, icon)) + var/image/I = image(icon, draw_state) + I.pixel_z = 32 + I.layer = ABOVE_WINDOW_LAYER + add_overlay(I) + + // Append our off state if needed. + if(stat & BROKEN) + icon_state = "[icon_state]-broken" + else if(stat & NOPOWER) + icon_state = "[icon_state]-off" /obj/machinery/smartfridge/dismantle() for(var/datum/stored_items/I in item_records) @@ -208,14 +153,6 @@ return TRUE return ..() -/obj/machinery/smartfridge/secure/emag_act(var/remaining_charges, var/mob/user) - if(!emagged) - emagged = 1 - locked = -1 - req_access.Cut() - to_chat(user, "You short out the product lock on [src].") - return 1 - /obj/machinery/smartfridge/proc/stock_item(var/obj/item/O) for(var/datum/stored_items/I in item_records) if(istype(O, I.item_path) && O.name == I.item_name) @@ -288,7 +225,9 @@ for(var/i = 1 to amount) I.get_product(get_turf(src)) update_icon() - + var/vend_state = "[icon_state]-vend" + if (check_state_in_icon(vend_state, icon)) //Show the vending animation if needed + flick(vend_state, src) return 1 return 0 @@ -311,12 +250,3 @@ update_icon() return 1 -/************************ -* Secure SmartFridges -*************************/ - -/obj/machinery/smartfridge/secure/CanUseTopic(mob/user, datum/topic_state/state, href_list) - if(!allowed(user) && !emagged && locked != -1 && href_list && href_list["vend"] && scan_id) - to_chat(user, "Access denied.") - return STATUS_CLOSE - return ..() \ No newline at end of file diff --git a/code/game/machinery/smartfridge/_smartfridge_secure.dm b/code/game/machinery/smartfridge/_smartfridge_secure.dm new file mode 100644 index 00000000000..25ba47725b7 --- /dev/null +++ b/code/game/machinery/smartfridge/_smartfridge_secure.dm @@ -0,0 +1,22 @@ +/************************ +* Secure SmartFridges +*************************/ +/obj/machinery/smartfridge/secure + is_secure = 1 + +/obj/machinery/smartfridge/secure/CanUseTopic(mob/user, datum/topic_state/state, href_list) + if(!allowed(user) && !emagged && locked != -1 && href_list && href_list["vend"] && scan_id) + to_chat(user, SPAN_WARNING("Access denied.")) + var/vend_state = "[icon_state]-deny" + if (check_state_in_icon(vend_state, icon)) //Show the vending animation if needed + flick(vend_state, src) + return STATUS_CLOSE + return ..() + +/obj/machinery/smartfridge/secure/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + emagged = 1 + locked = -1 + req_access.Cut() + to_chat(user, SPAN_NOTICE("You short out the product lock on \the [src].")) + return 1 diff --git a/code/game/machinery/smartfridge/chemistry.dm b/code/game/machinery/smartfridge/chemistry.dm new file mode 100644 index 00000000000..486a812d281 --- /dev/null +++ b/code/game/machinery/smartfridge/chemistry.dm @@ -0,0 +1,9 @@ +/obj/machinery/smartfridge/chemistry + name = "\improper Smart Chemical Storage" + desc = "A refrigerated storage unit for medicine and chemical storage." + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_chem.dmi' + +/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O) + if(istype(O,/obj/item/pill_bottle) || istype(O,/obj/item/chems)) + return 1 + return 0 diff --git a/code/game/machinery/smartfridge/drinks.dm b/code/game/machinery/smartfridge/drinks.dm new file mode 100644 index 00000000000..f90f23e2d4b --- /dev/null +++ b/code/game/machinery/smartfridge/drinks.dm @@ -0,0 +1,9 @@ +/obj/machinery/smartfridge/drinks + name = "\improper Drink Showcase" + desc = "A refrigerated storage unit for tasty tasty alcohol." + icon = 'icons/obj/machines/smartfridges/dark.dmi' + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_drink.dmi' + +/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O) + if(istype(O,/obj/item/chems/glass) || istype(O,/obj/item/chems/drinks) || istype(O,/obj/item/chems/condiment)) + return 1 diff --git a/code/game/machinery/smartfridge/drying_oven.dm b/code/game/machinery/smartfridge/drying_oven.dm new file mode 100644 index 00000000000..ece54b6c8c3 --- /dev/null +++ b/code/game/machinery/smartfridge/drying_oven.dm @@ -0,0 +1,35 @@ +/obj/machinery/smartfridge/drying_oven + name = "drying oven" + desc = "A machine for drying plants." + icon = 'icons/obj/machines/smartfridges/drying_oven.dmi' + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_plants.dmi' + obj_flags = OBJ_FLAG_ANCHORABLE + atom_flags = ATOM_FLAG_CLIMBABLE + +/obj/machinery/smartfridge/drying_oven/accept_check(var/obj/item/O) + return istype(O) && O.is_dryable() + +/obj/machinery/smartfridge/drying_oven/Process() + ..() + if(inoperable()) + return + var/do_update = FALSE + for(var/obj/item/thing in get_contained_external_atoms()) + var/obj/item/product = thing.dry_out(src, silent = TRUE) + if(product) + product.dropInto(loc) + do_update = TRUE + if(QDELETED(thing) || !(thing in contents)) + for(var/datum/stored_items/I in item_records) + I.instances -= thing + if(do_update) + update_icon() + +/obj/machinery/smartfridge/drying_oven/on_update_icon() + if(!inoperable()) + for(var/datum/stored_items/I in item_records) + if(I.get_amount()) + cut_overlays() + icon_state = "[initial(icon_state)]-closed" + return + return ..() diff --git a/code/game/machinery/smartfridge/foods.dm b/code/game/machinery/smartfridge/foods.dm new file mode 100644 index 00000000000..1d3cf0d5b89 --- /dev/null +++ b/code/game/machinery/smartfridge/foods.dm @@ -0,0 +1,14 @@ +/obj/machinery/smartfridge/foods + name = "\improper Hot Foods Display" + desc = "A heated storage unit for piping hot meals." + icon = 'icons/obj/machines/smartfridges/food.dmi' + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_food.dmi' + +/obj/machinery/smartfridge/foods/accept_check(var/obj/item/O) + var/static/list/_food_types = list( + /obj/item/food, + /obj/item/utensil, + /obj/item/chems/glass/bowl, + /obj/item/chems/glass/handmade/bowl + ) + return istype(O) && O.reagents?.total_volume && is_type_in_list(O, _food_types) diff --git a/code/game/machinery/smartfridge/medbay.dm b/code/game/machinery/smartfridge/medbay.dm new file mode 100644 index 00000000000..c1361990e87 --- /dev/null +++ b/code/game/machinery/smartfridge/medbay.dm @@ -0,0 +1,15 @@ + +/obj/machinery/smartfridge/secure/medbay + name = "\improper Refrigerated Medicine Storage" + desc = "A refrigerated storage unit for storing medicine and chemicals." + overlay_contents_icon = 'icons/obj/machines/smartfridges/contents_chem.dmi' + 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)) + return 1 + if(istype(O,/obj/item/pill_bottle)) + return 1 + if(istype(O,/obj/item/chems/pill)) + return 1 + return 0 diff --git a/code/game/machinery/smartfridge/produce.dm b/code/game/machinery/smartfridge/produce.dm new file mode 100644 index 00000000000..b7ef607b1b5 --- /dev/null +++ b/code/game/machinery/smartfridge/produce.dm @@ -0,0 +1,6 @@ +/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/food/grown) diff --git a/code/game/machinery/smartfridge/seeds.dm b/code/game/machinery/smartfridge/seeds.dm new file mode 100644 index 00000000000..9aa1259e528 --- /dev/null +++ b/code/game/machinery/smartfridge/seeds.dm @@ -0,0 +1,8 @@ +/obj/machinery/smartfridge/seeds + name = "\improper MegaSeed Servitor" + desc = "When you need seeds fast!" + +/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O) + if(istype(O,/obj/item/seeds/)) + return 1 + return 0 diff --git a/code/game/machinery/smartfridge/sheets.dm b/code/game/machinery/smartfridge/sheets.dm new file mode 100644 index 00000000000..a1e9c3be5f8 --- /dev/null +++ b/code/game/machinery/smartfridge/sheets.dm @@ -0,0 +1,6 @@ +/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) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index e59df75a663..77dcbafee90 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -81,7 +81,7 @@ dat += " [set_temperature]K ([set_temperature-T0C]°C)" dat += "+
" - var/datum/browser/popup = new(usr, "spaceheater", "Space Heater Control Panel") + var/datum/browser/popup = new(user, "spaceheater", "Space Heater Control Panel") popup.set_content(jointext(dat, null)) popup.open() diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 550e474d0ef..831363ce53e 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -11,10 +11,6 @@ var/deploy_path = /obj/structure/supply_beacon var/deploy_time = 30 -/obj/item/supply_beacon/supermatter - name = "inactive supermatter supply beacon" - deploy_path = /obj/structure/supply_beacon/supermatter - /obj/item/supply_beacon/attack_self(var/mob/user) user.visible_message(SPAN_NOTICE("\The [user] begins setting up \the [src].")) if(!do_after(user, deploy_time, src)) @@ -45,10 +41,6 @@ if(!drop_type) drop_type = pick(supply_drop_random_loot_types()) -/obj/structure/supply_beacon/supermatter - name = "supermatter supply beacon" - drop_type = "supermatter" - /obj/structure/supply_beacon/attackby(var/obj/item/W, var/mob/user) if(!activated && IS_WRENCH(W)) anchored = !anchored diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index e6ce02af3f7..f48d05b08d7 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -66,13 +66,13 @@ L = locate("landmark*[C.data]") // use old stype if(istype(L, /obj/abstract/landmark) && isturf(L.loc) && user.try_unequip(I)) - to_chat(usr, "You insert the coordinates into the machine.") - to_chat(usr, "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the [station_name()] at all times.") + to_chat(user, "You insert the coordinates into the machine.") + to_chat(user, "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the [station_name()] at all times.") qdel(I) audible_message(SPAN_NOTICE("Locked in.")) src.locked = L one_time_use = 1 - add_fingerprint(usr) + add_fingerprint(user) return TRUE /obj/machinery/computer/teleporter/interface_interact(var/mob/user) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 141619bd14f..c7c2924326f 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -89,7 +89,7 @@ return FALSE if(istype(W, /obj/item/card/id)||istype(W, /obj/item/modular_computer)) - if(src.allowed(usr)) + if(src.allowed(user)) if(emagged) to_chat(user, "The turret control is unresponsive.") else diff --git a/code/game/machinery/turrets/_turrets.dm b/code/game/machinery/turrets/_turrets.dm index 3030bc2bef9..957c3407889 100644 --- a/code/game/machinery/turrets/_turrets.dm +++ b/code/game/machinery/turrets/_turrets.dm @@ -188,7 +188,7 @@ playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) reloading_progress = 0 - else if(stored_magazine && length(stored_magazine.stored_ammo) < stored_magazine.max_ammo) + else if(stored_magazine && stored_magazine.get_stored_ammo_count() < stored_magazine.max_ammo) var/obj/item/stock_parts/ammo_box/ammo_box = get_component_of_type(/obj/item/stock_parts/ammo_box) if(ammo_box?.is_functional() && ammo_box.stored_caliber == proj_gun.caliber) var/obj/item/ammo_casing/casing = ammo_box.remove_ammo(stored_magazine) @@ -366,7 +366,7 @@ // Only reload the magazine if we're completely out of ammo or we don't have a target. if(ammo_remaining == 0) return TRUE - if(!is_valid_target(target?.resolve()) && length(proj_gun.ammo_magazine.stored_ammo) != proj_gun.ammo_magazine.max_ammo) + if(!is_valid_target(target?.resolve()) && proj_gun.ammo_magazine.get_stored_ammo_count() != proj_gun.ammo_magazine.max_ammo) return TRUE else return FALSE diff --git a/code/game/machinery/turrets/turret_ammo.dm b/code/game/machinery/turrets/turret_ammo.dm index 7054e5ecf23..2ae59092307 100644 --- a/code/game/machinery/turrets/turret_ammo.dm +++ b/code/game/machinery/turrets/turret_ammo.dm @@ -32,10 +32,10 @@ var/obj/item/ammo_casing/casing = W if(stored_caliber && casing.caliber != stored_caliber) to_chat(user, SPAN_WARNING("The caliber of \the [casing] does not match the caliber stored in \the [src]!")) - return FALSE + return TRUE if(length(stored_ammo) >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) - return FALSE + return TRUE casing.forceMove(src) stored_ammo += casing @@ -49,16 +49,16 @@ var/obj/item/ammo_magazine/magazine = W if(stored_caliber && magazine.caliber != stored_caliber) to_chat(user, SPAN_WARNING("The caliber of \the [magazine] does not match the caliber stored in \the [src]!")) - return FALSE - if(!length(magazine.stored_ammo)) + return TRUE + if(!magazine.get_stored_ammo_count()) to_chat(user, SPAN_WARNING("\The [magazine] is empty!")) - return FALSE + return TRUE if(length(stored_ammo) >= max_ammo) to_chat(user, SPAN_WARNING("\The [src] is full!")) - return FALSE + return TRUE stored_caliber = magazine.caliber - for(var/obj/item/ammo_casing/casing in magazine.stored_ammo) + for(var/obj/item/ammo_casing/casing in magazine.get_stored_ammo_count()) // Just in case. if(casing.caliber != stored_caliber) continue diff --git a/code/game/machinery/vending/_vending.dm b/code/game/machinery/vending/_vending.dm index 9e08c83653a..b3036e17317 100644 --- a/code/game/machinery/vending/_vending.dm +++ b/code/game/machinery/vending/_vending.dm @@ -4,8 +4,8 @@ /obj/machinery/vending name = "Vendomat" desc = "A generic vending machine." - icon = 'icons/obj/vending.dmi' - icon_state = "generic" + icon = 'icons/obj/machines/vending/generic.dmi' + icon_state = ICON_STATE_WORLD layer = BELOW_OBJ_LAYER anchored = TRUE density = TRUE @@ -20,9 +20,6 @@ wires = /datum/wires/vending required_interaction_dexterity = DEXTERITY_SIMPLE_MACHINES - var/icon_vend //Icon_state when vending - var/icon_deny //Icon_state when denying access - // Power var/vend_power_usage = 150 //actuators and stuff @@ -110,7 +107,7 @@ var/category = current_list[2] for(var/entry in current_list[1]) var/datum/stored_items/vending_products/product = new(src, entry) - product.price = atom_info_repository.get_combined_worth_for(entry) * markup + product.price = ceil(atom_info_repository.get_combined_worth_for(entry) * markup) product.category = category if(product && populate_parts) product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1 @@ -143,6 +140,10 @@ to_chat(user, "You short out the product lock on \the [src].") return 1 +/obj/machinery/vending/receive_mouse_drop(atom/dropping, mob/user, params) + if(!(. = ..()) && isitem(dropping) && istype(user) && user.check_intent(I_FLAG_HELP) && CanPhysicallyInteract(user)) + return attempt_to_stock(dropping, user) + /obj/machinery/vending/attackby(obj/item/W, mob/user) var/obj/item/charge_stick/CS = W.GetChargeStick() @@ -173,14 +174,18 @@ if (istype(W, /obj/item/cash)) attack_hand_with_interaction_checks(user) return TRUE + if(IS_MULTITOOL(W) || IS_WIRECUTTER(W)) if(panel_open) attack_hand_with_interaction_checks(user) return TRUE - if((user.a_intent == I_HELP) && attempt_to_stock(W, user)) - return TRUE + if((. = component_attackby(W, user))) return + + if((user.check_intent(I_FLAG_HELP)) && attempt_to_stock(W, user)) + return TRUE + if((obj_flags & OBJ_FLAG_ANCHORABLE) && (IS_WRENCH(W) || IS_HAMMER(W))) wrench_floor_bolts(user, null, W) power_change() @@ -190,11 +195,6 @@ . = ..() SSnano.update_uis(src) -/obj/machinery/vending/receive_mouse_drop(atom/dropping, mob/user, params) - . = ..() - if(!. && dropping.loc == user && attempt_to_stock(dropping, user)) - return TRUE - /obj/machinery/vending/proc/attempt_to_stock(var/obj/item/I, var/mob/user) for(var/datum/stored_items/vending_products/R in product_records) if(I.type == R.item_path) @@ -208,9 +208,9 @@ if(currently_vending.price > cashmoney.absolute_worth) // This is not a status display message, since it's something the character // themselves is meant to see BEFORE putting the money in - to_chat(usr, "[html_icon(cashmoney)] That is not enough money.") + to_chat(usr, SPAN_WARNING("[html_icon(cashmoney)] That is not enough money.")) return 0 - visible_message("\The [usr] inserts some cash into \the [src].") + visible_message(SPAN_INFO("\The [usr] inserts some cash into \the [src].")) cashmoney.adjust_worth(-(currently_vending.price)) // Vending machines have no idea who paid with cash credit_purchase("(cash)") @@ -223,7 +223,7 @@ * successful, 0 if failed. */ /obj/machinery/vending/proc/pay_with_charge_card(var/obj/item/charge_stick/wallet) - visible_message("\The [usr] plugs \the [wallet] into \the [src].") + visible_message(SPAN_INFO("\The [usr] plugs \the [wallet] into \the [src].")) if(wallet.is_locked()) status_message = "Unlock \the [wallet] before using it." status_error = TRUE @@ -309,10 +309,8 @@ if (href_list["vend"] && !currently_vending) var/key = text2num(href_list["vend"]) - if(!is_valid_index(key, product_records)) - return TOPIC_REFRESH - var/datum/stored_items/vending_products/R = product_records[key] - if(!istype(R)) + var/datum/stored_items/vending_products/R = LAZYACCESS(product_records, key) + if(!R) return TOPIC_REFRESH // This should not happen unless the request from NanoUI was bad @@ -322,7 +320,7 @@ if(R.price <= 0) vend(R, user) else if(issilicon(user)) //If the item is not free, provide feedback if a synth is trying to buy something. - to_chat(user, "Artificial unit recognized. Artificial units cannot complete this transaction. Purchase canceled.") + to_chat(user, SPAN_DANGER("Artificial unit recognized. Artificial units cannot complete this transaction. Purchase canceled.")) else currently_vending = R if(!vendor_account || vendor_account.suspended) @@ -350,9 +348,12 @@ if(!vend_ready) return if((!allowed(user)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH - to_chat(user, "Access denied.")//Unless emagged of course - flick(icon_deny,src) + to_chat(user, SPAN_WARNING("Access denied."))//Unless emagged of course + var/deny_state = "[icon_state]-deny" + if(check_state_in_icon(deny_state, icon)) + flick(deny_state, src) return + vend_ready = 0 //One thing at a time!! status_message = "Vending..." status_error = 0 @@ -361,8 +362,9 @@ do_vending_reply() use_power_oneoff(vend_power_usage) //actuators and stuff - if (icon_vend) //Show the vending animation if needed - flick(icon_vend,src) + var/vend_state = "[icon_state]-vend" + if (check_state_in_icon(vend_state, icon)) //Show the vending animation if needed + flick(vend_state, src) addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/vending, finish_vending), R), vend_delay) /obj/machinery/vending/proc/do_vending_reply() @@ -381,7 +383,7 @@ if(prob(1)) //The vending gods look favorably upon you sleep(3) if(product.get_product(get_turf(src))) - visible_message("\The [src] clunks as it vends an additional [product.item_name].") + visible_message(SPAN_NOTICE("\The [src] clunks as it vends an additional [product.item_name].")) status_message = "" status_error = 0 vend_ready = 1 @@ -399,7 +401,7 @@ return if(R.add_product(W)) - to_chat(user, "You insert \the [W] in the product receptor.") + to_chat(user, SPAN_NOTICE("You insert \the [W] in the product receptor.")) SSnano.update_uis(src) return 1 @@ -475,5 +477,5 @@ return 0 spawn(0) throw_item.throw_at(target, rand(1,2), 3) - visible_message("\The [src] launches \a [throw_item] at \the [target]!") + visible_message(SPAN_WARNING("\The [src] launches \a [throw_item] at \the [target]!")) return 1 diff --git a/code/game/machinery/vending/actors.dm b/code/game/machinery/vending/actors.dm index 6ab863b7612..0dac1d09962 100644 --- a/code/game/machinery/vending/actors.dm +++ b/code/game/machinery/vending/actors.dm @@ -3,9 +3,7 @@ /obj/machinery/vending/props name = "prop dispenser" desc = "All the props an actor could need. Probably." - icon_state = "theater" - icon_vend = "theater-vend" - icon_deny = "theater-deny" + icon = 'icons/obj/machines/vending/theater.dmi' products = list( /obj/structure/flora/pottedplant = 2, /obj/item/flashlight/lamp = 2, @@ -24,7 +22,7 @@ /obj/machinery/vending/containers name = "container dispenser" desc = "A container that dispenses containers." - icon_state = "robotics" + icon = 'icons/obj/machines/vending/robotics.dmi' base_type = /obj/machinery/vending/containers products = list( /obj/structure/closet/crate/freezer = 2, diff --git a/code/game/machinery/vending/botany.dm b/code/game/machinery/vending/botany.dm index 9f29ac496ed..b1042ee71ea 100644 --- a/code/game/machinery/vending/botany.dm +++ b/code/game/machinery/vending/botany.dm @@ -4,9 +4,7 @@ desc = "A plant nutrients vendor." product_slogans = "Aren't you glad you don't have to fertilize the natural way?;Now with 50% less stink!;Plants are people too!" product_ads = "We like plants!;Don't you want some?;The greenest thumbs ever.;We like big plants.;Soft soil..." - icon_state = "nutri" - icon_deny = "nutri-deny" - icon_vend = "nutri-vend" + icon = 'icons/obj/machines/vending/nutrimat.dmi' vend_delay = 26 base_type = /obj/machinery/vending/hydronutrients products = list( @@ -22,18 +20,14 @@ markup = 0 /obj/machinery/vending/hydronutrients/generic - icon_state = "nutri_generic" - icon_vend = "nutri_generic-vend" - icon_deny = "nutri_generic-deny" + icon = 'icons/obj/machines/vending/nutri_green.dmi' /obj/machinery/vending/hydroseeds name = "MegaSeed Servitor" desc = "When you need seeds fast!" product_slogans = "THIS'S WHERE TH' SEEDS LIVE! GIT YOU SOME!;Hands down the best seed selection this half of the galaxy!;Also certain mushroom varieties available, more for experts! Get certified today!" product_ads = "We like plants!;Grow some crops!;Grow, baby, growww!;Aw h'yeah son!" - icon_state = "seeds" - icon_vend = "seeds-vend" - icon_deny = "seeds-deny" + icon = 'icons/obj/machines/vending/seeds_green.dmi' vend_delay = 13 base_type = /obj/machinery/vending/hydroseeds markup = 0 @@ -85,6 +79,4 @@ ) /obj/machinery/vending/hydroseeds/generic - icon_state = "seeds_generic" - icon_vend = "seeds_generic-vend" - icon_deny = "seeds_generic-deny" + icon = 'icons/obj/machines/vending/seeds_grey.dmi' diff --git a/code/game/machinery/vending/cigs.dm b/code/game/machinery/vending/cigs.dm index b54fa328b69..e5cb5a43b02 100644 --- a/code/game/machinery/vending/cigs.dm +++ b/code/game/machinery/vending/cigs.dm @@ -21,9 +21,7 @@ We understand the depressed, alcoholic cowboy in you. That's why we also smoke Jericho.;\ Professionals. Better cigarettes for better people. Yes, better people." vend_delay = 21 - icon_state = "cigs" - icon_vend = "cigs-vend" - icon_deny = "cigs-deny" + icon = 'icons/obj/machines/vending/cigarettes.dmi' base_type = /obj/machinery/vending/cigarette products = list( /obj/item/cigpaper/filters = 5, diff --git a/code/game/machinery/vending/engineering.dm b/code/game/machinery/vending/engineering.dm index d23ee004bdb..6eda475db41 100644 --- a/code/game/machinery/vending/engineering.dm +++ b/code/game/machinery/vending/engineering.dm @@ -2,9 +2,7 @@ name = "YouTool" desc = "Tools for tools." markup = 0 - icon_state = "tool" - icon_deny = "tool-deny" - icon_vend = "tool-vend" + icon = 'icons/obj/machines/vending/tool.dmi' vend_delay = 11 base_type = /obj/machinery/vending/tool products = list( @@ -29,9 +27,7 @@ /obj/machinery/vending/engivend name = "Engi-Vend" desc = "Spare tool vending. What? Did you expect some witty description?" - icon_state = "engivend" - icon_deny = "engivend-deny" - icon_vend = "engivend-vend" + icon = 'icons/obj/machines/vending/engivend.dmi' markup = 0 vend_delay = 21 base_type = /obj/machinery/vending/engivend @@ -52,9 +48,7 @@ /obj/machinery/vending/engineering name = "Robco Tool Maker" desc = "Everything you need for do-it-yourself repair." - icon_state = "engi" - icon_deny = "engi-deny" - icon_vend = "engi-vend" + icon = 'icons/obj/machines/vending/engivend.dmi' base_type = /obj/machinery/vending/engineering markup = 0 initial_access = list(access_atmospherics, access_engine_equip) @@ -87,9 +81,7 @@ /obj/machinery/vending/robotics name = "Robotech Deluxe" desc = "All the tools you need to create your own robot army." - icon_state = "robotics" - icon_deny = "robotics-deny" - icon_vend = "robotics-vend" + icon = 'icons/obj/machines/vending/robotics.dmi' initial_access = list(access_robotics) base_type = /obj/machinery/vending/robotics products = list( @@ -108,9 +100,7 @@ /obj/machinery/vending/materials name = "MatterVend" desc = "Provides access to baryonic matter in easy to handle sheet form." - icon_state = "engivend" - icon_deny = "engivend-deny" - icon_vend = "engivend-vend" + icon = 'icons/obj/machines/vending/engivend.dmi' markup = 0 vend_delay = 21 base_type = /obj/machinery/vending/materials diff --git a/code/game/machinery/vending/food.dm b/code/game/machinery/vending/food.dm index c435303b96a..8abc07f5536 100644 --- a/code/game/machinery/vending/food.dm +++ b/code/game/machinery/vending/food.dm @@ -4,9 +4,7 @@ desc = "A snack machine courtesy of the Getmore Chocolate Corporation, based out of Mars." product_slogans = "Try our new nougat bar!;Twice the calories for half the price!" product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!" - icon_state = "snack" - icon_vend = "snack-vend" - icon_deny = "snack-deny" + icon = 'icons/obj/machines/vending/snacks.dmi' vend_delay = 25 base_type = /obj/machinery/vending/snack products = list( @@ -33,10 +31,7 @@ vend_delay = 30 base_type = /obj/machinery/vending/snix product_slogans = "Snix!" - - icon_state = "snix" - icon_vend = "snix-vend" - icon_deny = "snix-deny" + icon = 'icons/obj/machines/vending/snix.dmi' products = list(/obj/item/food/junk/semki = 7, /obj/item/food/can/caviar = 7, /obj/item/food/junk/squid = 7, @@ -58,9 +53,7 @@ desc = "A SolCentric vending machine dispensing treats from home." vend_delay = 30 product_slogans = "A taste of home!" - icon_state = "solsnack" - icon_vend = "solsnack-vend" - icon_deny = "solsnack-deny" + icon = 'icons/obj/machines/vending/solsnacks.dmi' products = list( /obj/item/food/junk/lunacake = 8, /obj/item/food/junk/lunacake/mochicake = 8, @@ -79,9 +72,7 @@ desc = "A distressingly ethnic vending machine loaded with high sucrose low calorie for lack of better words snacks." vend_delay = 30 product_slogans = "Konnichiwa gaijin senpai! ;Notice me senpai!; Kawaii-desu!" - icon_state = "weeb" - icon_vend = "weeb-vend" - icon_deny = "weeb-deny" + icon = 'icons/obj/machines/vending/weeb.dmi' products = list( /obj/item/food/junk/weebonuts = 8, /obj/item/food/junk/ricecake = 8, @@ -100,10 +91,7 @@ desc = "An old vending machine promising 'hot foods'. You doubt any of its contents are still edible." vend_delay = 40 base_type = /obj/machinery/vending/hotfood - - icon_state = "hotfood" - icon_deny = "hotfood-deny" - icon_vend = "hotfood-vend" + icon = 'icons/obj/machines/vending/hotfood.dmi' products = list(/obj/item/food/old/pizza = 1, /obj/item/food/old/burger = 1, /obj/item/food/old/hamburger = 1, @@ -120,8 +108,7 @@ /obj/machinery/vending/boozeomat name = "Booze-O-Mat" desc = "A refrigerated vending unit for alcoholic beverages and alcoholic beverage accessories." - icon_state = "fridge_dark" - icon_deny = "fridge_dark-deny" + icon = 'icons/obj/machines/vending/bar.dmi' markup = 0 products = list( /obj/item/chems/drinks/glass2/square = 10, @@ -183,9 +170,7 @@ name = "Hot Drinks machine" desc = "A vending machine which dispenses hot drinks and hot drinks accessories." product_ads = "Have a drink!;Drink up!;It's good for you!;Would you like a hot joe?;I'd kill for some coffee!;The best beans in the galaxy.;Only the finest brew for you.;Mmmm. Nothing like a coffee.;I like coffee, don't you?;Coffee helps you work!;Try some tea.;We hope you like the best!;Try our new chocolate!;Admin conspiracies" - icon_state = "coffee" - icon_vend = "coffee-vend" - icon_deny = "coffee-deny" + icon = 'icons/obj/machines/vending/coffee.dmi' vend_delay = 34 base_type = /obj/machinery/vending/coffee idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. @@ -206,7 +191,7 @@ /obj/machinery/vending/coffee/on_update_icon() ..() - if(stat & BROKEN && prob(20)) + if((stat & BROKEN) && prob(20)) icon_state = "[initial(icon_state)]-hellfire" else if(!(stat & NOPOWER)) add_overlay("[initial(icon_state)]-screen") @@ -214,9 +199,7 @@ /obj/machinery/vending/cola name = "Robust Softdrinks" desc = "A softdrink vendor provided by Robust Industries, LLC." - icon_state = "Cola_Machine" - icon_vend = "Cola_Machine-vend" - icon_deny = "Cola_Machine-deny" + icon = 'icons/obj/machines/vending/drinks.dmi' vend_delay = 11 base_type = /obj/machinery/vending/cola product_slogans = "Robust Softdrinks: More robust than a toolbox to the head!" @@ -245,9 +228,7 @@ desc = "An exercise aid and nutrition supplement vendor that preys on your inadequacy." product_slogans = "SweatMAX, get robust!" product_ads = "Pain is just weakness leaving the body!;Run! Your fat is catching up to you;Never forget leg day!;Push out!;This is the only break you get today.;Don't cry, sweat!;Healthy is an outfit that looks good on everybody." - icon_state = "fitness" - icon_vend = "fitness-vend" - icon_deny = "fitness-deny" + icon = 'icons/obj/machines/vending/fitness.dmi' vend_delay = 6 base_type = /obj/machinery/vending/fitness products = list( @@ -272,9 +253,7 @@ /obj/machinery/vending/sovietsoda name = "BODA" desc = "An old soda vending machine. How could this have got here?" - icon_state = "sovietsoda" - icon_vend = "sovietsoda-vend" - icon_deny = "sovietsoda-deny" + icon = 'icons/obj/machines/vending/soviet.dmi' base_type = /obj/machinery/vending/sovietsoda product_ads = "For Tsar and Country.;Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." products = list( diff --git a/code/game/machinery/vending/medical.dm b/code/game/machinery/vending/medical.dm index a974f0767da..4796499cbe3 100644 --- a/code/game/machinery/vending/medical.dm +++ b/code/game/machinery/vending/medical.dm @@ -2,9 +2,7 @@ /obj/machinery/vending/medical name = "NanoMed Plus" desc = "Medical drug dispenser." - icon_state = "med" - icon_deny = "med-deny" - icon_vend = "med-vend" + icon = 'icons/obj/machines/vending/medical.dmi' vend_delay = 18 markup = 0 base_type = /obj/machinery/vending/medical @@ -38,9 +36,7 @@ name = "NanoMed" desc = "A wall-mounted version of the NanoMed." product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" - icon_state = "wallmed" - icon_deny = "wallmed-deny" - icon_vend = "wallmed-vend" + icon = 'icons/obj/machines/vending/wallmed.dmi' base_type = /obj/machinery/vending/wallmed1 density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude products = list( @@ -61,9 +57,7 @@ name = "NanoMed Mini" desc = "A wall-mounted version of the NanoMed, containing only vital first aid equipment." product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?" - icon_state = "wallmed" - icon_deny = "wallmed-deny" - icon_vend = "wallmed-vend" + icon = 'icons/obj/machines/vending/wallmed.dmi' density = FALSE //It is wall-mounted, and thus, not dense. --Superxpdude base_type = /obj/machinery/vending/wallmed2 products = list( diff --git a/code/game/machinery/vending/misc.dm b/code/game/machinery/vending/misc.dm index 7fc59e04370..a9386e3930e 100644 --- a/code/game/machinery/vending/misc.dm +++ b/code/game/machinery/vending/misc.dm @@ -1,9 +1,7 @@ /obj/machinery/vending/magivend name = "MagiVend" desc = "A magic vending machine." - icon_state = "MagiVend" - icon_deny = "MagiVend-deny" - icon_vend = "MagiVend-vend" + icon = 'icons/obj/machines/vending/magic.dmi' product_slogans = "Sling spells the proper way with MagiVend!;Be your own Houdini! Use MagiVend!" vend_delay = 15 vend_reply = "Have an enchanted evening!" @@ -20,9 +18,7 @@ name = "Dinnerware" desc = "A kitchen and restaurant equipment vendor." product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." - icon_state = "dinnerware" - icon_vend = "dinnerware-vend" - icon_deny = "dinnerware-deny" + icon = 'icons/obj/machines/vending/dinnerware.dmi' markup = 0 base_type = /obj/machinery/vending/dinnerware products = list( @@ -52,7 +48,7 @@ name = "Smashing Fashions" desc = "For all your cheap knockoff needs." product_slogans = "Look smashing for your darling!;Be rich! Dress rich!" - icon_state = "theater" + icon = 'icons/obj/machines/vending/theater.dmi' vend_delay = 15 base_type = /obj/machinery/vending/fashionvend vend_reply = "Absolutely smashing!" @@ -78,9 +74,7 @@ vend_delay = 15 product_slogans = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!" product_ads = "Elves and dwarves!;Totally not satanic!;Fun times forever!" - icon_state = "games" - icon_deny = "games-deny" - icon_vend = "games-vend" + icon = 'icons/obj/machines/vending/games.dmi' base_type = /obj/machinery/vending/games products = list( /obj/item/toy/blink = 5, @@ -113,10 +107,7 @@ desc = "Vends things that make you less reviled in the work-place!" vend_delay = 15 product_slogans = "Take a shower you hippie.;Get a haircut, hippie!;Reeking of scale taint? Take a shower!" - - icon_state = "lavatory" - icon_deny = "lavatory-deny" - icon_vend = "lavatory-vend" + icon = 'icons/obj/machines/vending/lavatory.dmi' base_type = /obj/machinery/vending/lavatory products = list( /obj/item/soap = 12, diff --git a/code/game/machinery/vending/security.dm b/code/game/machinery/vending/security.dm index 22576276160..17b2a6cc88d 100644 --- a/code/game/machinery/vending/security.dm +++ b/code/game/machinery/vending/security.dm @@ -3,9 +3,7 @@ name = "SecTech" desc = "A security equipment vendor." product_ads = "Crack capitalist skulls!;Beat some heads in!;Don't forget - harm is good!;Your weapons are right here.;Handcuffs!;Freeze, scumbag!;Don't tase me bro!;Tase them, bro.;Why not have a donut?" - icon_state = "sec" - icon_deny = "sec-deny" - icon_vend = "sec-vend" + icon = 'icons/obj/machines/vending/security.dmi' vend_delay = 14 markup = 0 base_type = /obj/machinery/vending/security diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 7e7e2717612..f06099ed6e3 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -246,7 +246,7 @@ icon = 'icons/obj/airlock_machines.dmi' icon_state = "airlock_control_off" name = "airlock controller frame" - desc = "Used to build airlock controllers. Use a multitool on the circuit to determine which type you want, and then hit this with the the circuit." + desc = "Used to build airlock controllers. Use a multitool on the circuit to determine which type you want, and then hit this with the circuit." build_machine_type = null ///Used when configuring a dummy controller var/master_controller_id_tag diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index a82e8082510..bf5c3741630 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -250,6 +250,7 @@ /decl/interaction_handler/start_washer name = "Start washer" expected_target_type = /obj/machinery/washing_machine + examine_desc = "start a wash cycle" /decl/interaction_handler/start_washer/is_possible(obj/machinery/washing_machine/washer, mob/user) . = ..() @@ -263,6 +264,7 @@ /decl/interaction_handler/toggle_open/washing_machine name = "Toggle detergent port" expected_target_type = /obj/machinery/washing_machine + examine_desc = "open the detergent port" /decl/interaction_handler/toggle_open/washing_machine/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/washing_machine/washer = target diff --git a/code/game/objects/objs.dm b/code/game/objects/__objs.dm similarity index 93% rename from code/game/objects/objs.dm rename to code/game/objects/__objs.dm index e55af95d154..812aaa9ddca 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/__objs.dm @@ -14,10 +14,8 @@ 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/sharp = 0 // whether this object cuts - var/edge = 0 // whether this object is more likely to dismember + var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! - var/atom_damage_type = BRUTE var/armor_penetration = 0 var/anchor_fall = FALSE var/holographic = 0 //if the obj is a holographic object spawned by the holodeck @@ -120,12 +118,12 @@ /obj/proc/damage_flags() . = 0 - if(has_edge(src)) - . |= DAM_EDGE - if(is_sharp(src)) - . |= DAM_SHARP + if(is_sharp()) + . |= DAM_SHARP|DAM_EDGE if(atom_damage_type == BURN) . |= DAM_LASER + else if(has_edge()) + . |= DAM_EDGE /obj/attackby(obj/item/used_item, mob/user) // We need to call parent even if we lack dexterity, so that storage can work. @@ -157,8 +155,8 @@ add_fingerprint(user) return ..() -/obj/is_fluid_pushable(var/amt) - return ..() && w_class <= round(amt/20) +/obj/try_fluid_push(volume, strength) + return ..() && w_class <= round(strength/20) /obj/proc/can_embed() return FALSE @@ -400,3 +398,20 @@ if(obj_flags & OBJ_FLAG_INSULATED_HANDLE) return return ..() + +// Stub, used by /item and /structure +/obj/proc/refresh_color() + return + +// Slightly convoluted reagent logic to avoid fluid_act() putting reagents straight back into the destroyed /obj. +/obj/physically_destroyed(skip_qdel) + var/dumped_reagents = FALSE + var/atom/last_loc = loc + if(last_loc && reagents?.total_volume) + reagents.trans_to(loc, reagents.total_volume, defer_update = TRUE) + dumped_reagents = TRUE + reagents.clear_reagents() // We are qdeling, don't bother with a more nuanced update. + . = ..() + if(dumped_reagents && last_loc && !QDELETED(last_loc) && last_loc.reagents?.total_volume) + last_loc.reagents.handle_update() + HANDLE_REACTIONS(last_loc.reagents) diff --git a/code/game/objects/obj_edibility.dm b/code/game/objects/_obj_edibility.dm similarity index 98% rename from code/game/objects/obj_edibility.dm rename to code/game/objects/_obj_edibility.dm index f58e6721d98..9fa4ec70827 100644 --- a/code/game/objects/obj_edibility.dm +++ b/code/game/objects/_obj_edibility.dm @@ -133,7 +133,7 @@ show_food_no_mouth_message(user, target) return EATEN_UNABLE - if(!target.can_eat_food_currently(src, user)) + if(!target.can_eat_food_currently(src, user, consumption_method)) return EATEN_UNABLE var/blocked = target.check_mouth_coverage() diff --git a/code/game/objects/objs_damage.dm b/code/game/objects/_objs_damage.dm similarity index 100% rename from code/game/objects/objs_damage.dm rename to code/game/objects/_objs_damage.dm diff --git a/code/game/objects/objs_interactions.dm b/code/game/objects/_objs_interactions.dm similarity index 92% rename from code/game/objects/objs_interactions.dm rename to code/game/objects/_objs_interactions.dm index b295c6fd71f..65d143b39b3 100644 --- a/code/game/objects/objs_interactions.dm +++ b/code/game/objects/_objs_interactions.dm @@ -8,6 +8,7 @@ /decl/interaction_handler/rotate name = "Rotate" expected_target_type = /obj + examine_desc = "rotate $TARGET_THEM$" /decl/interaction_handler/rotate/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/game/objects/alien_props.dm b/code/game/objects/alien_props.dm index b6dca18e783..6297ef140f0 100644 --- a/code/game/objects/alien_props.dm +++ b/code/game/objects/alien_props.dm @@ -65,8 +65,7 @@ . = ..() if(!random_light_color) random_light_color = get_random_colour(FALSE, 100, 255) - b_color = random_light_color - color = random_light_color + set_color(random_light_color) // if stuff starts exploding due to too-early update_icon calls it's this thing's fault //Airlock /obj/machinery/door/airlock/alien diff --git a/code/game/objects/auras/aura.dm b/code/game/objects/auras/aura.dm index 8d1d35a0680..5de18f3adf6 100644 --- a/code/game/objects/auras/aura.dm +++ b/code/game/objects/auras/aura.dm @@ -15,6 +15,7 @@ They should also be used for when you want to effect the ENTIRE mob, like having /obj/aura/Destroy() if(user) user.remove_aura(src) + removed() return ..() /obj/aura/proc/added_to(var/mob/living/target) diff --git a/code/game/objects/auras/blueforge_aura.dm b/code/game/objects/auras/blueforge_aura.dm deleted file mode 100644 index ae3925d0e20..00000000000 --- a/code/game/objects/auras/blueforge_aura.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/aura/blueforge_aura - name = "Blueforge Aura" - icon = 'icons/mob/human_races/species/blueforged/eyes.dmi' - icon_state = "eyes" - layer = MOB_LAYER - -/obj/aura/blueforge_aura/life_tick() - user.heal_damage(TOX, 10) - return 0 - -/obj/aura/blueforge_aura/bullet_act(var/obj/item/projectile/P) - if(P.atom_damage_type == BURN) - P.damage *=2 - else if(P.agony || P.stun) - return AURA_FALSE - return 0 \ No newline at end of file diff --git a/code/game/objects/auras/radiant_aura.dm b/code/game/objects/auras/radiant_aura.dm index 0968d057060..d25cfa807b9 100644 --- a/code/game/objects/auras/radiant_aura.dm +++ b/code/game/objects/auras/radiant_aura.dm @@ -17,4 +17,4 @@ if(P.damage_flags() & DAM_LASER) user.visible_message("\The [P] refracts, bending into \the [user]'s aura.") return AURA_FALSE - return 0 \ No newline at end of file + return 0 diff --git a/code/game/objects/auras/shadowling_aura.dm b/code/game/objects/auras/shadowling_aura.dm deleted file mode 100644 index ff081f7dfb1..00000000000 --- a/code/game/objects/auras/shadowling_aura.dm +++ /dev/null @@ -1,21 +0,0 @@ -/obj/aura/shadowling_aura - name = "Shadowling Aura" - var/added_mutation = FALSE - -/obj/aura/shadowling_aura/added_to(var/mob/living/L) - ..() - if(L.add_genetic_condition(GENE_COND_SPACE_RESISTANCE)) - added_mutation = TRUE - -/obj/aura/shadowling_aura/removed() - if(added_mutation) - added_mutation = FALSE - user.remove_genetic_condition(GENE_COND_SPACE_RESISTANCE) - ..() - -/obj/aura/shadowling_aura/bullet_act(var/obj/item/projectile/P) - if(P.damage_flags() & DAM_LASER) - P.damage *= 2 - if(P.agony) - P.agony *= 2 - return 0 \ No newline at end of file diff --git a/code/game/objects/auras/starlight.dm b/code/game/objects/auras/starlight.dm deleted file mode 100644 index 5e6253cbd93..00000000000 --- a/code/game/objects/auras/starlight.dm +++ /dev/null @@ -1,20 +0,0 @@ -/obj/aura/starborn - name = "starborn's gift" - icon = 'icons/effects/effects.dmi' - icon_state = "white_electricity_constant" - color = "#33cc33" - layer = MOB_LAYER - -/obj/aura/starborn/bullet_act(var/obj/item/projectile/P, var/def_zone) - if(P.atom_damage_type == BURN) - user.visible_message("\The [P] seems to only make \the [user] stronger.") - user.heal_damage(BRUTE, P.damage) - return AURA_FALSE - return 0 - -/obj/aura/starborn/attackby(var/obj/item/I, var/mob/i_user) - if(I.atom_damage_type == BURN) - to_chat(i_user, "\The [I] seems to only feed into \the [user]'s flames.") - user.heal_damage(BRUTE, I.get_attack_force(user)) - return AURA_FALSE - return 0 \ No newline at end of file diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index fc4fdc8470d..ccfd9b93b6e 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -160,12 +160,6 @@ if(LAZYLEN(chemholder.reagents.reagent_volumes)) for(var/turf/T in (wallList|targetTurfs)) chemholder.reagents.touch_turf(T) - for(var/turf/T in targetTurfs) - for(var/atom/A in T.contents) - if(istype(A, /obj/effect/effect/smoke/chem) || ismob(A)) - continue - else if(isobj(A) && !A.simulated) - chemholder.reagents.touch_obj(A) var/color = chemholder.reagents.get_color() //build smoke icon var/icon/I diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 5ff19547765..70d5c86bb2e 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -37,8 +37,6 @@ if(!metal && reagents) var/turf/T = get_turf(src) reagents.touch_turf(T) - for(var/obj/O in T) - reagents.touch_obj(O) /obj/effect/effect/foam/Process() if(--amount < 0) @@ -173,7 +171,7 @@ return TRUE /obj/structure/foamedmetal/attackby(var/obj/item/I, var/mob/user) - if(prob(I.get_attack_force(user) * 20 - metal * 25)) + if(prob(I.expend_attack_force(user) * 20 - metal * 25)) user.visible_message( SPAN_WARNING("\The [user] smashes through the foamed metal."), SPAN_NOTICE("You smash through the foamed metal with \the [I].") diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index ef1d2ba6096..8f4dbce7bb7 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -45,8 +45,7 @@ break sleep(delay) - sleep(10) - qdel(src) + QDEL_IN(src, 1 SECOND) /obj/effect/effect/water/Move(turf/newloc) if(newloc.density) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 3cc2dd4bf5e..77bb9276f64 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -1,4 +1,3 @@ -#define DRYING_TIME 5 MINUTES //for 1 unit of depth in puddle (amount var) #define BLOOD_SIZE_SMALL 1 #define BLOOD_SIZE_MEDIUM 2 #define BLOOD_SIZE_BIG 3 @@ -21,6 +20,8 @@ var/base_icon = 'icons/effects/blood.dmi' var/basecolor=COLOR_BLOOD_HUMAN // Color when wet. var/amount = 5 + //for 1 unit of depth in puddle (amount var) + var/time_to_dry = 5 MINUTES var/drytime var/dryname = "dried blood" var/drydesc = "It's dry and crusty. Someone isn't doing their job." @@ -29,19 +30,21 @@ var/chemical = /decl/material/liquid/blood /obj/effect/decal/cleanable/blood/reveal_blood() - if(!fluorescent) + if(ispath(chemical, /decl/material/liquid/blood) && !fluorescent) fluorescent = FLUORESCENT_GLOWS basecolor = COLOR_LUMINOL update_icon() /obj/effect/decal/cleanable/blood/clean(clean_forensics = TRUE) - fluorescent = FALSE - if(invisibility != INVISIBILITY_ABSTRACT) - set_invisibility(INVISIBILITY_ABSTRACT) - amount = 0 - STOP_PROCESSING(SSobj, src) - remove_extension(src, /datum/extension/scent) - . = ..(clean_forensics = FALSE) + if(ispath(chemical, /decl/material/liquid/blood)) + clean_forensics = FALSE + fluorescent = FALSE + if(invisibility != INVISIBILITY_ABSTRACT) + set_invisibility(INVISIBILITY_ABSTRACT) + amount = 0 + STOP_PROCESSING(SSobj, src) + remove_extension(src, /datum/extension/scent) + . = ..(clean_forensics) /obj/effect/decal/cleanable/blood/hide() return @@ -50,8 +53,11 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/effect/decal/cleanable/blood/Initialize(mapload) +// new_chemical is a material typepath, or null +/obj/effect/decal/cleanable/blood/Initialize(ml, _age, new_chemical) . = ..() + if(!isnull(new_chemical)) + chemical = new_chemical if(merge_with_blood()) return INITIALIZE_HINT_QDEL start_drying() @@ -61,16 +67,31 @@ if(!isturf(loc) || blood_size == BLOOD_SIZE_NO_MERGE) return FALSE for(var/obj/effect/decal/cleanable/blood/B in loc) - if(B != src && B.blood_size != BLOOD_SIZE_NO_MERGE) - if(B.blood_DNA) - blood_size = BLOOD_SIZE_NO_MERGE - B.blood_DNA |= blood_DNA.Copy() - B.alpha = initial(B.alpha) // reset rain-based fading due to more drips - return TRUE + if(B == src) + continue + if(B.blood_size == BLOOD_SIZE_NO_MERGE) + continue + if(B.invisibility >= INVISIBILITY_ABSTRACT) // has been cleaned + continue + if(B.chemical != chemical) // don't mix blood and oil or oil and mud etc + continue // todo: refactor to make bloody steps use reagents and track data/size/amount on there? + if(B.blood_DNA) + blood_size = BLOOD_SIZE_NO_MERGE + B.blood_DNA |= blood_DNA.Copy() + B.alpha = initial(B.alpha) // reset rain-based fading due to more drips + return TRUE return FALSE /obj/effect/decal/cleanable/blood/proc/start_drying() - drytime = world.time + DRYING_TIME * (amount+1) + var/decl/material/our_chemical = GET_DECL(chemical) + time_to_dry = our_chemical.get_time_to_dry_stain(src) + switch(time_to_dry) + if(0) // dry instantly + dry() + return + if(-INFINITY to 0) // don't even bother trying to dry this + return + drytime = world.time + time_to_dry * (amount+1) update_icon() START_PROCESSING(SSobj, src) @@ -91,29 +112,18 @@ /obj/effect/decal/cleanable/blood/Crossed(atom/movable/AM) if(!isliving(AM) || amount < 1) return - - 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 = 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 (M.buckled && istype(M.buckled, /obj/structure/bed/chair/wheelchair)) - var/obj/structure/bed/chair/wheelchair/W = M.buckled - W.bloodiness = 4 - - M.update_equipment_overlay(slot_shoes_str) + var/mob/living/walker = AM + if(istype(walker.buckled, /obj/structure/bed/chair/wheelchair)) + var/obj/structure/bed/chair/wheelchair/wheelchair = walker.buckled + wheelchair.bloodiness = 4 + else + walker.add_walking_contaminant(chemical, amount, (blood_data ? blood_data[pick(blood_data)] : null)) amount-- /obj/effect/decal/cleanable/blood/proc/dry() + var/decl/material/our_chemical = GET_DECL(chemical) + if(our_chemical.handle_stain_dry(src)) + return TRUE // prevent additional drying handling; this includes preventing processing, so be careful name = dryname desc = drydesc color = adjust_brightness(color, -50) @@ -121,6 +131,7 @@ blood_data = null remove_extension(src, /datum/extension/scent) STOP_PROCESSING(SSobj, src) + return FALSE /obj/effect/decal/cleanable/blood/attack_hand(mob/user) if(!amount || !length(blood_data) || !ishuman(user)) @@ -247,7 +258,7 @@ for (var/i = 0, i < pick(1, 200; 2, 150; 3, 50; 4), i++) sleep(3) if (i > 0) - var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc) + var/obj/effect/decal/cleanable/blood/b = new /obj/effect/decal/cleanable/blood/splatter(loc, null, chemical) b.basecolor = src.basecolor b.update_icon() if (step_to(src, get_step(src, direction), 0)) diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 4abf329fd59..6fe6ea7441a 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -1,19 +1,20 @@ /obj/effect/decal/cleanable/generic - name = "clutter" - desc = "Someone should clean that up." - gender = PLURAL - icon = 'icons/obj/objects.dmi' - icon_state = "shards" - sweepable = TRUE + name = "clutter" + desc = "Someone should clean that up." + gender = PLURAL + icon = 'icons/obj/objects.dmi' + icon_state = "shards" + sweepable = TRUE /obj/effect/decal/cleanable/ash - name = "ashes" - desc = "Ashes to ashes, dust to dust, and into space." - gender = PLURAL - icon = 'icons/obj/objects.dmi' - icon_state = "ash" - weather_sensitive = FALSE - sweepable = TRUE + name = "ashes" + desc = "Ashes to ashes, dust to dust, and into space." + gender = PLURAL + icon = 'icons/obj/objects.dmi' + icon_state = "ash" + weather_sensitive = FALSE + sweepable = TRUE + burnable = FALSE /obj/effect/decal/cleanable/ash/attackby(obj/item/I, mob/user) if(ATOM_IS_OPEN_CONTAINER(I)) @@ -36,50 +37,50 @@ return TRUE /obj/effect/decal/cleanable/flour - name = "flour" - desc = "It's still good. Four second rule!" - gender = PLURAL - icon = 'icons/effects/effects.dmi' - icon_state = "flour" - persistent = TRUE - sweepable = TRUE + name = "flour" + desc = "It's still good. Four second rule!" + gender = PLURAL + icon = 'icons/effects/effects.dmi' + icon_state = "flour" + persistent = TRUE + sweepable = TRUE /obj/effect/decal/cleanable/cobweb - name = "cobweb" - desc = "Somebody should remove that." - layer = ABOVE_HUMAN_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "cobweb1" - weather_sensitive = FALSE - sweepable = TRUE + name = "cobweb" + desc = "Somebody should remove that." + layer = ABOVE_HUMAN_LAYER + icon = 'icons/effects/effects.dmi' + icon_state = "cobweb1" + weather_sensitive = FALSE + sweepable = TRUE /obj/effect/decal/cleanable/molten_item - name = "gooey grey mass" - desc = "It looks like a melted... something." - icon = 'icons/effects/molten_item.dmi' - icon_state = "molten" - persistent = TRUE - generic_filth = TRUE - weather_sensitive = FALSE + name = "gooey grey mass" + desc = "It looks like a melted... something." + icon = 'icons/effects/molten_item.dmi' + icon_state = "molten" + persistent = TRUE + generic_filth = TRUE + weather_sensitive = FALSE /obj/effect/decal/cleanable/cobweb2 - name = "cobweb" - desc = "Somebody should remove that." - layer = ABOVE_HUMAN_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "cobweb2" - weather_sensitive = FALSE - sweepable = TRUE + name = "cobweb" + desc = "Somebody should remove that." + layer = ABOVE_HUMAN_LAYER + icon = 'icons/effects/effects.dmi' + icon_state = "cobweb2" + weather_sensitive = FALSE + sweepable = TRUE //Vomit (sorry) /obj/effect/decal/cleanable/vomit - name = "vomit" - desc = "Gosh, how unpleasant." - gender = PLURAL - icon = 'icons/effects/vomit.dmi' - icon_state = "vomit_1" - persistent = TRUE - generic_filth = TRUE + name = "vomit" + desc = "Gosh, how unpleasant." + gender = PLURAL + icon = 'icons/effects/vomit.dmi' + icon_state = "vomit_1" + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/vomit/Initialize(ml, _age) random_icon_states = icon_states(icon) @@ -89,51 +90,62 @@ if(prob(75)) set_rotation(pick(90, 180, 270)) +/obj/effect/decal/cleanable/vomit/mapped/Initialize(ml, _age) + . = ..() + add_to_reagents(/decl/material/liquid/acid/stomach, rand(3,5)) + add_to_reagents(/decl/material/liquid/nutriment, rand(5,8)) + /obj/effect/decal/cleanable/vomit/on_update_icon() . = ..() - color = reagents.get_color() + color = reagents?.get_color() + +/obj/effect/decal/cleanable/vomit/Crossed(atom/movable/AM) + . = ..() + if(!QDELETED(src) && reagents?.total_volume >= 1 && isliving(AM)) + var/mob/living/walker = AM + walker.add_walking_contaminant(reagents, rand(2, 3)) /obj/effect/decal/cleanable/tomato_smudge - name = "tomato smudge" - desc = "It's red." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "tomato_floor1" + 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 + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/egg_smudge - name = "smashed egg" - desc = "Seems like this one won't hatch." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "smashed_egg1" + 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 + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/pie_smudge //honk - name = "smashed pie" - desc = "It's pie cream from a cream pie." - icon = 'icons/effects/tomatodecal.dmi' - icon_state = "smashed_pie" + 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 + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/fruit_smudge - name = "smudge" - desc = "Some kind of fruit smear." - icon = 'icons/effects/blood.dmi' - icon_state = "mfloor1" + name = "smudge" + desc = "Some kind of fruit smear." + icon = 'icons/effects/blood.dmi' + icon_state = "mfloor1" random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7") - persistent = TRUE - generic_filth = TRUE + persistent = TRUE + generic_filth = TRUE /obj/effect/decal/cleanable/champagne - name = "champagne" - desc = "Someone got a bit too excited." - gender = PLURAL - icon = 'icons/effects/effects.dmi' - icon_state = "fchampagne1" - color = COLOR_BRASS + name = "champagne" + desc = "Someone got a bit too excited." + gender = PLURAL + icon = 'icons/effects/effects.dmi' + icon_state = "fchampagne1" + color = COLOR_BRASS random_icon_states = list("fchampagne1", "fchampagne2", "fchampagne3", "fchampagne4") diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 330acc9f3ce..8487334c1a4 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -13,9 +13,6 @@ /obj/effect/decal/cleanable/blood/gibs/robot/on_update_icon() color = "#ffffff" -/obj/effect/decal/cleanable/blood/gibs/robot/dry() //pieces of robots do not dry up like - return - /obj/effect/decal/cleanable/blood/gibs/robot/streak(var/list/directions) spawn (0) var/direction = pick(directions) @@ -44,8 +41,9 @@ chemical = /decl/material/liquid/lube cleanable_scent = "industrial lubricant" -/obj/effect/decal/cleanable/blood/oil/dry() - return +/obj/effect/decal/cleanable/blood/oil/Initialize(mapload) + . = ..() + update_icon() /obj/effect/decal/cleanable/blood/oil/streak random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5") diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 870df8fbbf1..d2e28c977da 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -10,8 +10,7 @@ #define TRACKS_GOING_EAST 64 #define TRACKS_GOING_WEST 128 -// 5 seconds -#define TRACKS_CRUSTIFY_TIME 50 +#define TRACKS_CRUSTIFY_TIME 5 SECONDS /datum/fluidtrack var/direction=0 @@ -26,7 +25,8 @@ src.wet=_wet /obj/effect/decal/cleanable/blood/tracks/reveal_blood() - if(!fluorescent) + // don't reveal non-blood tracks + if(ispath(chemical, /decl/material/liquid/blood) && !fluorescent) if(stack && stack.len) for(var/datum/fluidtrack/track in stack) track.basecolor = COLOR_LUMINOL @@ -68,6 +68,7 @@ * @param bloodcolor Color of the blood when wet. */ /obj/effect/decal/cleanable/blood/tracks/proc/AddTracks(var/list/DNA, var/comingdir, var/goingdir, var/bloodcolor=COLOR_BLOOD_HUMAN) + var/updated=0 // Shift our goingdir 4 spaces to the left so it's in the GOING bitblock. var/realgoing=BITSHIFT_LEFT(goingdir,4) @@ -124,7 +125,7 @@ update_icon() /obj/effect/decal/cleanable/blood/tracks/on_update_icon() - overlays.Cut() + cut_overlays() color = "#ffffff" var/truedir=0 @@ -145,8 +146,9 @@ track.fresh=0 track.overlay=I stack[stack_idx]=track - overlays += I + add_overlay(I) updatedtracks=0 // Clear our memory of updated tracks. + compile_overlays() /obj/effect/decal/cleanable/blood/tracks/footprints name = "wet footprints" diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 6c7d9ec89e0..66319d3ee89 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -3,6 +3,7 @@ anchored = TRUE abstract_type = /obj/effect/decal/cleanable + var/burnable = TRUE var/sweepable = FALSE var/weather_sensitive = TRUE var/persistent = FALSE @@ -46,6 +47,11 @@ SSpersistence.forget_value(src, /decl/persistence_handler/filth) . = ..() +/obj/effect/decal/cleanable/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + . = ..() + if(burnable && !QDELETED(src)) + qdel(src) + /obj/effect/decal/cleanable/process_weather(obj/abstract/weather_system/weather, decl/state/weather/weather_state) if(!weather_sensitive) return PROCESS_KILL diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index b5d5d29540a..664d7af8c8f 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -1,27 +1,30 @@ /obj/effect/decal/cleanable/crayon - name = "rune" - desc = "A rune drawn in crayon." - icon = 'icons/obj/rune.dmi' + name = "rune" + desc = "A rune drawn in crayon." + icon = 'icons/effects/crayondecal.dmi' + icon_state = "rune1" weather_sensitive = FALSE + var/shade_color = COLOR_BLACK -/obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#ffffff", shade = "#000000", var/type = "rune") - name = type - desc = "\A [type] drawn in crayon." +/obj/effect/decal/cleanable/crayon/Initialize(mapload, _color = COLOR_WHITE, _shade_color = COLOR_BLACK, _drawtype = CRAYON_DRAW_RUNE) + . = ..() + name = _drawtype + desc = "\A [_drawtype], drawn in crayon." + color = _color + shade_color = _shade_color + switch(_drawtype) + if(CRAYON_DRAW_RUNE) + icon_state = "rune[rand(1,6)]" + if(CRAYON_DRAW_GRAFFITI) + icon_state = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") + else + icon_state = _drawtype + update_icon() - switch(type) - if("rune") - type = "rune[rand(1,6)]" - if("graffiti") - type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") - - var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1) - var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1) - - mainOverlay.Blend(main,ICON_ADD) - shadeOverlay.Blend(shade,ICON_ADD) - - overlays += mainOverlay - overlays += shadeOverlay - - add_hiddenprint(usr) - . = ..() \ No newline at end of file +/obj/effect/decal/cleanable/crayon/on_update_icon() + . = ..() + if(shade_color) + var/overlay_state = "[icon_state]s" + if(check_state_in_icon(overlay_state, icon)) + add_overlay(overlay_image(icon, overlay_state, shade_color, RESET_COLOR)) + compile_overlays() diff --git a/code/game/objects/effects/decals/posters/_poster.dm b/code/game/objects/effects/decals/posters/_poster.dm index e06ef097d23..2f3ca709b56 100644 --- a/code/game/objects/effects/decals/posters/_poster.dm +++ b/code/game/objects/effects/decals/posters/_poster.dm @@ -7,9 +7,9 @@ icon = 'icons/obj/items/posters.dmi' icon_state = "poster0" anchored = TRUE - directional_offset = @'{"NORTH":{"y":32}, "SOUTH":{"y":-32}, "WEST":{"x":32}, "EAST":{"x":-32}}' + directional_offset = @'{"NORTH":{"y":32}, "SOUTH":{"y":-32}, "EAST":{"x":32}, "WEST":{"x":-32}}' material = /decl/material/solid/organic/paper - max_health = 10 + max_health = 10 parts_type = /obj/item/poster parts_amount = 1 @@ -71,7 +71,7 @@ return TRUE /obj/structure/sign/poster/attack_hand(mob/user) - if(user.a_intent != I_HURT || ruined) + if(!user.check_intent(I_FLAG_HARM) || ruined) return ..() if(!CanPhysicallyInteract(user) || !user.check_dexterity(DEXTERITY_HOLD_ITEM)) return TRUE diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index 798d07d738c..8c2df8b9f8b 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -9,10 +9,24 @@ alpha = 0 var/dirt_amount = 0 +/obj/effect/decal/cleanable/dirt/lava_act() + qdel(src) + return TRUE + +// 'the dirt falls through the x' is pretty silly, dirt is generated by people walking. +/obj/effect/decal/cleanable/dirt/begin_falling(lastloc, below) + SHOULD_CALL_PARENT(FALSE) + qdel(src) + return TRUE + +/obj/effect/decal/cleanable/dirt/visible + dirt_amount = 60 + persistent = FALSE // This is a subtype for mapping. + /obj/effect/decal/cleanable/dirt/Initialize() . = ..() - name = "" verbs.Cut() + update_icon() /obj/effect/decal/cleanable/dirt/on_update_icon() . = ..() diff --git a/code/game/objects/effects/footprints.dm b/code/game/objects/effects/footprints.dm new file mode 100644 index 00000000000..09ea5bddc7b --- /dev/null +++ b/code/game/objects/effects/footprints.dm @@ -0,0 +1,56 @@ +// Effect used to render dark spot on turfs like snow/mud. +/obj/effect/footprints + icon = 'icons/mob/footprints/footprints.dmi' + icon_state = "blank" + simulated = FALSE + anchored = TRUE + is_spawnable_type = FALSE + blend_mode = BLEND_SUBTRACT + alpha = 128 + var/list/image/footprints + +/obj/effect/footprints/Initialize(mapload) + . = ..() + verbs.Cut() + name = null + +/obj/effect/footprints/Destroy() + footprints.Cut() // don't qdel images + . = ..() + +/obj/effect/footprints/on_turf_height_change(new_height) + if(simulated) + qdel(src) + return TRUE + return FALSE + +/obj/effect/footprints/on_update_icon() + set_overlays(footprints?.Copy()) + compile_overlays() + +/obj/effect/footprints/proc/add_footprints(mob/crosser, footprint_icon, movement_dir, use_state = "coming") + var/image/update_footprint + for(var/image/footprint in footprints) + if(footprint.icon == footprint_icon && footprint.dir == movement_dir && footprint.icon_state == use_state) + update_footprint = footprint + break + if(!update_footprint) + update_footprint = image(footprint_icon, icon_state = use_state, dir = movement_dir) + update_footprint.alpha = 20 + LAZYADD(footprints, update_footprint) + if(update_footprint.alpha < 120) + update_footprint.alpha += round(crosser.get_object_size() / 5) + queue_icon_update() + return TRUE + +/mob/proc/get_footprints_icon() + if(is_floating) + return null + if(buckled || current_posture?.prone) + return 'icons/mob/footprints/footprints_trail.dmi' + if(istype(buckled, /obj/structure/bed/chair)) + return 'icons/mob/footprints/footprints_wheelchair.dmi' + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes) && shoes.footprint_icon) + return shoes.footprint_icon + return get_bodytype()?.get_footprints_icon() diff --git a/code/game/objects/effects/gateway.dm b/code/game/objects/effects/gateway.dm index 3a976ecf4de..2b6be989f27 100644 --- a/code/game/objects/effects/gateway.dm +++ b/code/game/objects/effects/gateway.dm @@ -60,7 +60,7 @@ qdel(W) var/mob/living/new_mob = new /mob/living/simple_animal/corgi(AM.loc) - new_mob.a_intent = I_HURT + new_mob.set_intent(I_FLAG_HARM) if(victim.mind) victim.mind.transfer_to(new_mob) else diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index 7d695e1f75d..e2e87ae2470 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -132,18 +132,18 @@ /obj/abstract/landmark/costume/holiday_priest/make_costumes() new /obj/item/clothing/suit/holidaypriest(loc) -/obj/abstract/landmark/costume/marisawizard/fake/make_costumes() - new /obj/item/clothing/head/wizard/marisa/fake(loc) - new/obj/item/clothing/suit/wizrobe/marisa/fake(loc) +/obj/abstract/landmark/costume/marisawizard/make_costumes() + new /obj/item/clothing/head/wizard/marisa(loc) + new/obj/item/clothing/suit/wizrobe/marisa(loc) /obj/abstract/landmark/costume/cutewitch/make_costumes() new /obj/item/clothing/dress/sun(loc) new /obj/item/clothing/head/witchwig(loc) new /obj/item/staff/broom(loc) -/obj/abstract/landmark/costume/fakewizard/make_costumes() - new /obj/item/clothing/suit/wizrobe/fake(loc) - new /obj/item/clothing/head/wizard/fake(loc) +/obj/abstract/landmark/costume/wizard/make_costumes() + new /obj/item/clothing/suit/wizrobe(loc) + new /obj/item/clothing/head/wizard/beard(loc) new /obj/item/staff/(loc) /obj/abstract/landmark/costume/sexyclown/make_costumes() diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 7f70b3e996c..ac59e8322d4 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -34,16 +34,14 @@ if(ismob(obj)) var/mob/mob = obj mob.add_genetic_condition(pick(decls_repository.get_decls_of_type(/decl/genetic_condition/disability))) - spawn(0) - qdel(src) + qdel(src) /obj/effect/mine/proc/triggerstun(obj) if(ismob(obj)) var/mob/M = obj SET_STATUS_MAX(M, STAT_STUN, 30) spark_at(src, cardinal_only = TRUE) - spawn(0) - qdel(src) + qdel(src) /obj/effect/mine/proc/triggern2o(obj) //example: n2o triggerproc @@ -53,8 +51,7 @@ if(target.simulated && !target.blocks_air) target.assume_gas(/decl/material/gas/nitrous_oxide, 30) - spawn(0) - qdel(src) + qdel(src) /obj/effect/mine/proc/triggerflame(obj) for (var/turf/target in range(1,src)) @@ -62,21 +59,18 @@ target.assume_gas(/decl/material/gas/hydrogen, 30) target.hotspot_expose(1000, CELL_VOLUME) - spawn(0) - qdel(src) + qdel(src) /obj/effect/mine/proc/triggerkick(obj) spark_at(src, cardinal_only = TRUE) if(ismob(obj)) var/mob/victim = obj qdel(victim.client) - spawn(0) - qdel(src) + qdel(src) /obj/effect/mine/proc/explode(obj) explosion(loc, 0, 1, 2, 3) - spawn(0) - qdel(src) + qdel(src) /obj/effect/mine/dnascramble name = "Radiation Mine" diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 4a78d796efd..38cd105e6d0 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -35,11 +35,12 @@ icon = 'icons/misc/beach.dmi' icon_state = "coconuts" +// This isn't modularized because I hate modularizing layer defines. Bite me. /obj/effect/overlay/bluespacify name = "subspace" icon = 'icons/turf/space.dmi' icon_state = "bluespacify" - layer = SUPERMATTER_WALL_LAYER + layer = SUBSPACE_WALL_LAYER /obj/effect/overlay/wallrot name = "wallrot" @@ -54,3 +55,13 @@ . = ..() pixel_x += rand(-10, 10) pixel_y += rand(-10, 10) + +/// Set and cleaned up by moving projectiles for the most part. +/obj/effect/overlay/projectile_trail + var/obj/item/projectile/master + +/obj/effect/overlay/projectile_trail/Destroy() + if(master) + LAZYREMOVE(master.proj_trails, src) + master = null + return ..() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index a1a3fd87bd3..2aae839cd61 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -41,9 +41,9 @@ else visible_message("\The [src] has been attacked with \the [W][(user ? " by [user]." : ".")]") - var/damage = W.get_attack_force(user) / 4 + var/damage = W.expend_attack_force(user) / 4 - if(W.edge) + if(W.has_edge()) damage += 5 if(IS_WELDER(W)) diff --git a/code/game/objects/effects/temporaray.dm b/code/game/objects/effects/temporary.dm similarity index 84% rename from code/game/objects/effects/temporaray.dm rename to code/game/objects/effects/temporary.dm index b457013a103..b56d38275f1 100644 --- a/code/game/objects/effects/temporaray.dm +++ b/code/game/objects/effects/temporary.dm @@ -5,7 +5,7 @@ layer = ABOVE_HUMAN_LAYER mouse_opacity = MOUSE_OPACITY_UNCLICKABLE simulated = FALSE - var/duration = 10 //in deciseconds + var/duration = 1 SECOND //in deciseconds /obj/effect/temp_visual/Initialize(mapload, set_dir) if(set_dir) @@ -17,9 +17,15 @@ icon = 'icons/effects/effects.dmi' icon_state = "empdisable" +/obj/effect/temp_visual/emppulse + name = "electromagnetic pulse" + icon = 'icons/effects/effects.dmi' + icon_state = "emppulse" + duration = 2 SECONDS + /obj/effect/temp_visual/bloodsplatter icon = 'icons/effects/bloodspatter.dmi' - duration = 5 + duration = 0.5 SECONDS layer = LYING_HUMAN_LAYER var/splatter_type = "splatter" diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index 33ea333138c..24dad4dfb5d 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -14,13 +14,7 @@ log_and_message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") if(heavy_range > 1) - var/obj/effect/overlay/pulse = new/obj/effect/overlay(epicenter) - pulse.icon = 'icons/effects/effects.dmi' - pulse.icon_state = "emppulse" - pulse.SetName("electromagnetic pulse") - pulse.anchored = TRUE - spawn(20) - qdel(pulse) + new /obj/effect/temp_visual/emppulse(epicenter) if(heavy_range > light_range) light_range = heavy_range diff --git a/code/game/objects/item_mob_overlay.dm b/code/game/objects/item_mob_overlay.dm index 5827dbba478..5739ddef4b1 100644 --- a/code/game/objects/item_mob_overlay.dm +++ b/code/game/objects/item_mob_overlay.dm @@ -8,13 +8,14 @@ var/global/list/bodypart_to_slot_lookup_table = list( ) /obj/item/proc/reconsider_single_icon(var/update_icon) - use_single_icon = check_state_in_icon(ICON_STATE_INV, icon) || check_state_in_icon(ICON_STATE_WORLD, icon) + var/list/icon_states = get_states_in_icon_cached(icon) // pre-cache to make our up-to-three checks faster + // except now we only do two because i rewrote it + has_inventory_icon = use_single_icon = icon_states[ICON_STATE_INV] + if(!has_inventory_icon) + use_single_icon = icon_states[ICON_STATE_WORLD] if(use_single_icon) - has_inventory_icon = check_state_in_icon(ICON_STATE_INV, icon) icon_state = get_world_inventory_state() . = TRUE - else - has_inventory_icon = FALSE if(. || update_icon) update_icon() @@ -27,14 +28,33 @@ var/global/list/icon_state_cache = list() // isicon() is apparently quite expensive so short-circuit out early if we can. if(!istext(checkstate) || isnull(checkicon) || !(isfile(checkicon) || isicon(checkicon))) return FALSE - var/checkkey = "\ref[checkicon]" - var/list/check = global.icon_state_cache[checkkey] + var/list/check = _fetch_icon_state_cache_entry(checkicon) // should never return null once we reach this point + return check[checkstate] + +/// A proc for getting an associative list of icon states in an icon. +/// Uses the same cache as check_state_in_icon. +/// Does not copy, MUST NOT BE MUTATED. +/proc/get_states_in_icon_cached(checkicon) /* as OD_MAP(text, OD_BOOL) */ + return _fetch_icon_state_cache_entry(checkicon) || list() + +/// get_states_in_icon_cached but it does a copy, so the return value can be mutated. +/proc/get_states_in_icon(checkicon) /* as OD_MAP(text, OD_BOOL) */ + var/list/out = get_states_in_icon_cached(checkicon) + return out.Copy() + +/proc/_fetch_icon_state_cache_entry(checkicon) + if(isnull(checkicon) || !(isfile(checkicon) || isicon(checkicon))) + return null + // if we want to let people del icons (WHY???) then we can use weakreF() + // but right now it's cheaper to just use checkicon directly + // ref doesn't even do any deduplication + var/list/check = global.icon_state_cache[checkicon] if(!check) check = list() for(var/istate in icon_states(checkicon)) check[istate] = TRUE - global.icon_state_cache[checkkey] = check - . = check[checkstate] + global.icon_state_cache[checkicon] = check + return check /obj/item/proc/update_world_inventory_state() if(use_single_icon && has_inventory_icon) @@ -68,9 +88,9 @@ var/global/list/icon_state_cache = list() if(!use_single_icon) 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() + var/decl/bodytype/root_bodytype = user_mob?.get_equipment_bodytype(slot, bodypart) if(istype(root_bodytype)) - var/use_slot = (bodypart in root_bodytype.equip_adjust) ? bodypart : slot + var/use_slot = (bodypart in root_bodytype.get_equip_adjustments(user_mob)) ? bodypart : slot return root_bodytype.get_offset_overlay_image(user_mob, mob_icon, mob_state, color, use_slot) return overlay_image(mob_icon, mob_state, color, RESET_COLOR) @@ -153,7 +173,7 @@ var/global/list/icon_state_cache = list() overlay.icon_state = wielded_state apply_additional_mob_overlays(user_mob, bodytype, overlay, slot, bodypart, use_fallback_if_icon_missing) - var/decl/bodytype/root_bodytype = user_mob?.get_bodytype() + var/decl/bodytype/root_bodytype = user_mob?.get_equipment_bodytype(slot, bodypart) if(root_bodytype && root_bodytype.bodytype_category != bodytype) var/list/overlays_to_offset = overlay.overlays overlay = root_bodytype.get_offset_overlay_image(user_mob, overlay.icon, overlay.icon_state, color, (bodypart || slot)) diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 3575c49f2f4..7c41d0aa13f 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -6,10 +6,14 @@ abstract_type = /obj/item temperature_sensitive = TRUE + /// Set to prefix name with this string ('woven' for 'woven basket' etc) + var/name_prefix + /// Set to false to skip state checking and never draw an icon on the mob (except when held) var/draw_on_mob_when_equipped = TRUE - var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite + /// this saves our blood splatter/coating overlay, which will be processed not to go over the edges of the sprite. + var/image/coating_overlay var/randpixel = 6 var/material_health_multiplier = 0.2 var/hitsound @@ -96,7 +100,8 @@ var/paint_verb /// What dexterity is required to attack with this item? - var/needs_attack_dexterity = DEXTERITY_WIELD_ITEM + var/needs_attack_dexterity = DEXTERITY_WIELD_ITEM + var/needs_interaction_dexterity = DEXTERITY_HOLD_ITEM /// Vars relating to wielding the item with two or more hands. var/can_be_twohanded = FALSE @@ -115,6 +120,20 @@ /// Can this item knock someone out if used as a weapon? Overridden for natural weapons as a nerf to simplemobs. var/weapon_can_knock_prone = TRUE +/// Returns a dexterity value required to use this item as a weapon. +/obj/item/proc/get_required_attack_dexterity(mob/user, atom/target) + // We can likely assume that if we're located inside a rig, then the wearer + // has the appropriate dexterity to wear and use the rig, even if they aren't + // manually dexterous; specifically useful for things like baxxid and drakes. + var/obj/item/rig/rig = get_recursive_loc_of_type(/obj/item/rig) + . = istype(rig) ? DEXTERITY_NONE : needs_attack_dexterity + if(istype(target)) + . = target.adjust_required_attack_dexterity(user, .) + +// Returns a dexterity value required to interact with this item at all, such as picking it up. +/obj/item/get_required_interaction_dexterity() + return needs_interaction_dexterity + /obj/item/get_color() if(paint_color) return paint_color @@ -123,20 +142,21 @@ return initial(color) /obj/item/set_color(new_color) - if(new_color == COLOR_WHITE) new_color = null - if(paint_color != new_color) paint_color = new_color . = TRUE + refresh_color() +/obj/item/refresh_color() if(paint_color) color = paint_color else if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR)) color = material.color else - color = new_color + color = null + /obj/item/proc/can_contaminate() return !(obj_flags & ITEM_FLAG_NO_CONTAMINATION) @@ -169,6 +189,19 @@ set_material(material_key) paint_verb ||= "painted" // fallback for the case of no material + // This is a bit gross, but it makes writing rings and necklaces much easier. + // If the decorations list is already populated at this point, we assume it's + // prebaked decorations. + // Only things handled appropriately at the moment are gems and material inlays. + if(length(decorations)) + for(var/decoration_type in decorations) + decorations -= decoration_type + if(ispath(decoration_type, /obj/item/gemstone)) + decorations[GET_DECL(/decl/item_decoration/setting)] = list("object" = new decoration_type(src)) + else if(ispath(decoration_type, /decl/material)) + decorations[GET_DECL(/decl/item_decoration/inset)] = list("material" = GET_DECL(decoration_type)) + else + PRINT_STACK_TRACE("Item [type] tried to initialize with an unsupported initial decoration type ('[decoration_type]')") . = ..() setup_sprite_sheets() @@ -196,6 +229,9 @@ /obj/item/Destroy() + // May contain object references. + LAZYCLEARLIST(decorations) + if(LAZYLEN(_item_effects)) _item_effects = null SSitem_effects.queued_items -= src @@ -224,7 +260,7 @@ /obj/item/PopulateClone(obj/item/clone) clone = ..() clone.contaminated = contaminated - clone.blood_overlay = image(blood_overlay) + clone.coating_overlay = image(coating_overlay) clone.current_health = current_health //#TODO: once item damage in, check health! @@ -299,11 +335,7 @@ var/list/available_recipes = list() for(var/decl/crafting_stage/initial_stage in SSfabrication.find_crafting_recipes(type)) if(initial_stage.can_begin_with(src) && ispath(initial_stage.completion_trigger_type)) - var/atom/movable/prop = initial_stage.completion_trigger_type - if(initial_stage.stack_consume_amount > 1) - available_recipes[initial_stage] = "[initial_stage.stack_consume_amount] [initial(prop.name)]\s" - else - available_recipes[initial_stage] = "\a [initial(prop.name)]" + available_recipes[initial_stage] = initial_stage.generate_completion_string() if(length(available_recipes)) @@ -362,7 +394,7 @@ return ..(user, distance, "", jointext(desc_comp, "
")) /obj/item/check_mousedrop_adjacency(var/atom/over, var/mob/user) - . = (loc == user && istype(over, /obj/screen/inventory)) || ..() + . = (loc == user && istype(over, /obj/screen)) || ..() /obj/item/handle_mouse_drop(atom/over, mob/user, params) @@ -454,7 +486,7 @@ return . || TRUE /obj/item/attack_self(mob/user) - if(user.a_intent == I_HURT && istype(material)) + if(user.check_intent(I_FLAG_HARM) && istype(material)) var/list/results = squash_item(skip_qdel = TRUE) if(results && user.try_unequip(src, user.loc)) user.visible_message(SPAN_DANGER("\The [user] squashes \the [src] into a lump.")) @@ -552,12 +584,12 @@ return TRUE return FALSE -/obj/item/proc/user_can_attack_with(mob/user, silent = FALSE) - return !needs_attack_dexterity || user.check_dexterity(needs_attack_dexterity, silent = silent) +/obj/item/proc/user_can_attack_with(mob/user, atom/target, silent = FALSE) + return user.check_dexterity(get_required_attack_dexterity(user, target), silent = silent) /obj/item/attackby(obj/item/used_item, mob/user) // if can_wield is false we still need to call parent for storage objects to work properly - var/can_wield = user_can_attack_with(user, silent = TRUE) + var/can_wield = used_item.user_can_attack_with(user, silent = TRUE) if(can_wield && try_slapcrafting(used_item, user)) return TRUE @@ -580,11 +612,6 @@ return ..() -/obj/item/attack_ghost(mob/user) - var/mob/observer/ghost/pronouns = user - if(pronouns.client?.holder || pronouns.antagHUD) - storage?.show_to(user) - /obj/item/proc/talk_into(mob/living/M, message, message_mode, var/verb = "says", var/decl/language/speaking = null) return @@ -778,7 +805,7 @@ if(was_bloodied && !fluorescent) fluorescent = FLUORESCENT_GLOWS blood_color = COLOR_LUMINOL - blood_overlay.color = COLOR_LUMINOL + coating_overlay.color = COLOR_LUMINOL update_icon() /obj/item/add_blood(mob/living/M, amount = 2, list/blood_data) @@ -802,21 +829,19 @@ LAZYSET(blood_DNA, unique_enzymes, blood_type) return TRUE -var/global/list/_blood_overlay_cache = list() -var/global/icon/_item_blood_mask = icon('icons/effects/blood.dmi', "itemblood") -/obj/item/proc/generate_blood_overlay(force = FALSE) - if(blood_overlay && !force) - return - var/cache_key = "[icon]-[icon_state]" - if(global._blood_overlay_cache[cache_key]) - blood_overlay = global._blood_overlay_cache[cache_key] +var/global/list/icon/_coating_overlay_cache = list() +var/global/icon/_item_coating_mask = icon('icons/effects/blood.dmi', "itemblood") +/obj/item/proc/generate_coating_overlay(force = FALSE) + if(coating_overlay && !force) return - var/icon/I = new /icon(icon, icon_state) - I.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) // Sets the icon RGB channel to pure white. - I.Blend(global._item_blood_mask, ICON_MULTIPLY) // Masks the blood overlay against the generated mask. - blood_overlay = image(I) - blood_overlay.appearance_flags |= NO_CLIENT_COLOR|RESET_COLOR - global._blood_overlay_cache[cache_key] = blood_overlay + var/cache_key = "\ref[icon]-[icon_state]" // this needs to use ref because of stringification + if(!global._coating_overlay_cache[cache_key]) + var/icon/I = new /icon(icon, icon_state) + I.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) // Sets the icon RGB channel to pure white. + I.Blend(global._item_coating_mask, ICON_MULTIPLY) // Masks the coating overlay against the generated mask. + global._coating_overlay_cache[cache_key] = I + coating_overlay = image(global._coating_overlay_cache[cache_key]) + coating_overlay.appearance_flags |= NO_CLIENT_COLOR|RESET_COLOR /obj/item/proc/showoff(mob/user) for(var/mob/M in view(user)) @@ -965,6 +990,11 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. if(citem.item_state) set_icon_state(citem.item_state) +/obj/item/clothing/inherit_custom_item_data(var/datum/custom_item/citem) + . = ..() + base_clothing_icon = icon + base_clothing_state = icon_state + /obj/item/proc/is_special_cutting_tool(var/high_power) return FALSE @@ -986,11 +1016,11 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/proc/get_autopsy_descriptors() var/list/descriptors = list() descriptors += w_class_description() - if(sharp) + if(is_sharp()) descriptors += "sharp" - if(edge) + if(has_edge()) descriptors += "edged" - if(get_attack_force() >= 10 && !sharp && !edge) + if(get_attack_force() >= 10 && !is_sharp() && !has_edge()) descriptors += "heavy" if(material) descriptors += "made of [material.solid_name]" @@ -1001,13 +1031,15 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/proc/add_coating(reagent_type, amount, data) if(!coating) - coating = new/datum/reagents(10, src) - coating.add_reagent(reagent_type, amount, data) - - if(!blood_overlay) - generate_blood_overlay() - blood_overlay.color = coating.get_color() - + coating = new /datum/reagents(10, src) + if(ispath(reagent_type)) + coating.add_reagent(reagent_type, amount, data) + else if(istype(reagent_type, /datum/reagents)) + var/datum/reagents/source = reagent_type + source.trans_to_holder(coating, amount) + if(!coating_overlay) + generate_coating_overlay() + coating_overlay.color = coating.get_color() update_icon() /obj/item/proc/remove_coating(amount) @@ -1020,7 +1052,7 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/clean(clean_forensics=TRUE) . = ..() QDEL_NULL(coating) - blood_overlay = null + coating_overlay = null if(clean_forensics) var/datum/extension/forensic_evidence/forensics = get_extension(src, /datum/extension/forensic_evidence) if(forensics) @@ -1036,16 +1068,38 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. if(item_flags & ITEM_FLAG_IS_BELT) LAZYADD(., slot_belt_str) + // Where are we usually worn? + var/default_slot = get_fallback_slot() + if(default_slot) + LAZYDISTINCTADD(., default_slot) + // Uniforms can show or hide ID. + if(default_slot == slot_w_uniform_str) + LAZYDISTINCTADD(., slot_wear_id_str) + + // Currently this proc is used for clothing updates, so we + // need to care what slot we are being worn in, if any. + if(ismob(loc)) + var/mob/wearer = loc + var/equipped_slot = wearer.get_equipped_slot_for_item(src) + if(equipped_slot) + LAZYDISTINCTADD(., equipped_slot) + // Updates the icons of the mob wearing the clothing item, if any. /obj/item/proc/update_clothing_icon(do_update_icon = TRUE) - var/mob/wearer = loc - if(!istype(wearer)) - return FALSE - var/equip_slots = get_associated_equipment_slots() - if(!islist(equip_slots)) + + // Accessories should pass this back to their holder. + if(isitem(loc)) + var/obj/item/holder = loc + return holder.update_clothing_icon(do_update_icon) + + // If we're not on a mob, we do not care. + if(!ismob(loc)) return FALSE - for(var/slot in equip_slots) - wearer.update_equipment_overlay(slot, FALSE) + + // We refresh our equipped slot and any associated slots that might depend on the state of this slot. + var/mob/wearer = loc + for(var/equipped_slot in get_associated_equipment_slots()) + wearer.update_equipment_overlay(equipped_slot, FALSE) if(do_update_icon) wearer.update_icon() return TRUE @@ -1077,9 +1131,6 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. 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) base_name = new_name @@ -1218,7 +1269,19 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. var/image/reagent_overlay = overlay_image(icon, reagents_state, reagents.get_color(), RESET_COLOR | RESET_ALPHA) for(var/reagent_type in reagents.reagent_volumes) var/decl/material/reagent = GET_DECL(reagent_type) + if(!reagent.reagent_overlay) + continue var/modified_reagent_overlay = state_prefix ? "[state_prefix]_[reagent.reagent_overlay]" : reagent.reagent_overlay - if(modified_reagent_overlay && check_state_in_icon(modified_reagent_overlay, icon)) - reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_color(), RESET_COLOR | RESET_ALPHA) + if(!check_state_in_icon(modified_reagent_overlay, icon)) + continue + reagent_overlay.overlays += overlay_image(icon, modified_reagent_overlay, reagent.get_reagent_overlay_color(reagents), RESET_COLOR | RESET_ALPHA) return reagent_overlay + +/obj/item/on_reagent_change() + . = ..() + // You can't put liquids in clay/sand/dirt vessels, sorry. + if(reagents?.total_liquid_volume > 0 && material && material.hardness <= MAT_VALUE_MALLEABLE && !QDELETED(src)) + visible_message(SPAN_DANGER("\The [src] falls apart!")) + squash_item() + if(!QDELETED(src)) + physically_destroyed() diff --git a/code/game/objects/items/_item_damage.dm b/code/game/objects/items/_item_damage.dm index aa598d7ebf0..c9103026205 100644 --- a/code/game/objects/items/_item_damage.dm +++ b/code/game/objects/items/_item_damage.dm @@ -48,6 +48,13 @@ . = ..() take_damage(explosion_severity_damage(severity), BURN, DAM_EXPLODE | DAM_DISPERSED, "explosion") +/obj/item/bash(obj/item/weapon, mob/user) + . = ..() + var/force = weapon.expend_attack_force(user) + if(force >= 3 && .) + user.setClickCooldown(weapon.attack_cooldown + weapon.w_class) + take_damage(force, weapon.atom_damage_type) + /obj/item/proc/explosion_severity_damage(var/severity) var/mult = explosion_severity_damage_multiplier() return (mult * (4 - severity)) + (severity != 1? rand(-(mult / severity), (mult / severity)) : 0 ) diff --git a/code/game/objects/items/_item_force.dm b/code/game/objects/items/_item_force.dm index 3ff63de0cc7..790d894e596 100644 --- a/code/game/objects/items/_item_force.dm +++ b/code/game/objects/items/_item_force.dm @@ -17,6 +17,13 @@ if(can_be_twohanded) . = round(. * _wielded_force_multiplier) +/obj/item/proc/expend_attack_force(mob/living/user) + . = get_attack_force(user) + var/list/item_effects = get_item_effects(IE_CAT_DAMAGE) + if(length(item_effects)) + for(var/decl/item_effect/damage_effect as anything in item_effects) + . = damage_effect.expend_attack_use(src, user, item_effects[damage_effect]) + /obj/item/proc/get_attack_force(mob/living/user) if(_base_attack_force <= 0 || (item_flags & ITEM_FLAG_NO_BLUDGEON)) return 0 @@ -31,7 +38,7 @@ return get_object_size() /obj/item/get_thrown_attack_force() - return round(get_attack_force() * _thrown_force_multiplier) + return round(expend_attack_force() * _thrown_force_multiplier) /obj/item/proc/get_base_attack_force() return _base_attack_force @@ -43,18 +50,6 @@ _cached_attack_force = null _base_attack_force = new_force -/obj/item/proc/set_edge(new_edge) - if(edge != new_edge) - edge = new_edge - return TRUE - return FALSE - -/obj/item/proc/set_sharp(new_sharp) - if(sharp != new_sharp) - sharp = new_sharp - return TRUE - return FALSE - /obj/item/proc/update_attack_force() // Get our base force. @@ -108,10 +103,17 @@ return _cached_attack_force // TODO: consider strength, athletics, mob size +// `dry_run` param used in grindstone modpack to avoid depleting sharpness on non-attacks. /mob/living/proc/modify_attack_force(obj/item/weapon, supplied_force, wield_mult) if(!istype(weapon) || !weapon.is_held_twohanded()) - return supplied_force - return round(supplied_force * wield_mult) + . = supplied_force + else + . = supplied_force * wield_mult + var/list/item_effects = weapon.get_item_effects(IE_CAT_DAMAGE) + if(length(item_effects)) + for(var/decl/item_effect/damage_effect as anything in item_effects) + . = damage_effect.modify_attack_damage(., weapon, src, item_effects[damage_effect]) + return round(.) // Debug proc - leaving in for future work. Linter hates protected var access so leave commented. /* @@ -142,7 +144,7 @@ item = new item - var/attk_force = item.get_attack_force() + var/attk_force = item.expend_attack_force() var/expected_material_mod = ((attk_force * item._weight_force_factor) + (attk_force * item._hardness_force_factor))/2 rows += jointext(list( @@ -155,11 +157,11 @@ (attk_force + expected_material_mod), (attk_force * item._wielded_force_multiplier), item.armor_penetration, - (item.sharp||item.edge) + (item.sharp|item.edge) ), "|") text2file(jointext(rows, "\n"), "weapon_stats_dump.csv") if(fexists("weapon_stats_dump.csv")) - direct_output(usr, ftp("weapon_stats_dump.csv", "weapon_stats_dump.csv")) + ftp_to(usr, "weapon_stats_dump.csv", "weapon_stats_dump.csv") to_chat(usr, "Done.") */ diff --git a/code/game/objects/items/_item_interactions.dm b/code/game/objects/items/_item_interactions.dm index d926931f8c5..6467b1d19d5 100644 --- a/code/game/objects/items/_item_interactions.dm +++ b/code/game/objects/items/_item_interactions.dm @@ -34,95 +34,10 @@ name = "Open Storage" expected_target_type = /atom incapacitation_flags = INCAPACITATION_DISRUPTED + examine_desc = "open $TARGET_THEIR$ storage" /decl/interaction_handler/storage_open/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && (ishuman(user) || isrobot(user) || issmall(user)) && target?.storage /decl/interaction_handler/storage_open/invoked(atom/target, mob/user, obj/item/prop) target?.storage?.open(user) - -/decl/interaction_handler/wash_hands - name = "Wash Hands" - expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC - -/decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) - if(.) - for(var/hand_slot in user.get_held_item_slots()) - var/obj/item/organ/external/organ = user.get_organ(hand_slot) - if(istype(organ) && organ.is_washable) - return TRUE - -/decl/interaction_handler/wash_hands/invoked(atom/target, mob/user, obj/item/prop) - - // Probably needs debounce and do_after() but showers and wading into water don't, so whatever. - if(!target?.reagents?.has_reagent(/decl/material/liquid/water, 150)) // To avoid washing your hands in beakers. - to_chat(user, SPAN_WARNING("\The [src] doesn't have enough water in it to wash your hands.")) - return - - var/found_hand = FALSE - for(var/hand_slot in user.get_held_item_slots()) - var/obj/item/organ/external/organ = user.get_organ(hand_slot) - if(istype(organ) && organ.is_washable) - found_hand = TRUE - break - - if(!found_hand) - return - - var/decl/pronouns/pronouns = user.get_pronouns() - if(isturf(target)) - var/turf/turf = target - var/fluid = turf.get_fluid_name() - user.visible_message( - SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [fluid]."), - SPAN_NOTICE("You wash your hands in \the [fluid].") - ) - else - user.visible_message( - SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [target]."), - SPAN_NOTICE("You wash your hands in \the [target].") - ) - - user.clean() - playsound(user.loc, 'sound/effects/slosh.ogg', 25, 1) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - -/decl/interaction_handler/drink - name = "Drink" - expected_target_type = /atom - interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC - -/decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && ATOM_IS_OPEN_CONTAINER(target) && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) - -/decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) - - // Items can be picked up and drunk from, this interaction is for turfs and structures. - if(istype(target, /obj/item)) - return - - if(!user.check_has_mouth()) - target.show_food_no_mouth_message(user, user) - return - - if(!target?.reagents?.total_volume) - target.show_food_empty_message(user, EATING_METHOD_DRINK) - return - - if(!user.can_eat_food_currently(null, user, EATING_METHOD_DRINK)) - return - - var/blocked = user.check_mouth_coverage() - if(blocked) - to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) - return - - user.visible_message( - SPAN_NOTICE("\The [user] drinks from \the [target]."), - SPAN_NOTICE("You drink from \the [target].") - ) - target.reagents.trans_to_mob(user, 5, CHEM_INGEST) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) diff --git a/code/game/objects/items/_item_materials.dm b/code/game/objects/items/_item_materials.dm index 95bc6402777..ecf48b7029e 100644 --- a/code/game/objects/items/_item_materials.dm +++ b/code/game/objects/items/_item_materials.dm @@ -5,8 +5,8 @@ if((material_alteration & MAT_FLAG_ALTERATION_COLOR) && material) alpha = 100 + material.opacity * 255 color = get_color() // avoiding set_color() here as that will set it on paint_color - if(blood_overlay) - add_overlay(blood_overlay) + if(coating_overlay) + add_overlay(coating_overlay) if(global.contamination_overlay && contaminated) add_overlay(global.contamination_overlay) @@ -104,10 +104,13 @@ queue_icon_update() /obj/item/proc/update_name() - if(material_alteration & MAT_FLAG_ALTERATION_NAME) - SetName("[material.adjective_name] [base_name || initial(name)]") - else - SetName(base_name || initial(name)) + var/list/new_name = list(base_name || initial(name)) + if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_NAME)) + new_name.Insert(1, material.adjective_name) + if(name_prefix) + new_name.Insert(1, name_prefix) + if(length(new_name)) + SetName(jointext(new_name, " ")) /obj/item/get_matter_amount_modifier() . = ..() diff --git a/code/game/objects/items/_item_melting.dm b/code/game/objects/items/_item_melting.dm index d835d7d1c7d..318d8f28823 100644 --- a/code/game/objects/items/_item_melting.dm +++ b/code/game/objects/items/_item_melting.dm @@ -16,16 +16,22 @@ try_burn_wearer(holder, holder.get_equipped_slot_for_item(src)) // Temp gate until generalized temperature-based melting works properly. - if(istype(loc, /obj/item/chems/crucible)) - // Check if this is meltable at all. - var/list/meltable_materials - for(var/mat in matter) - var/decl/material/melt_material = GET_DECL(mat) - if(!isnull(melt_material.melting_point) && temperature >= melt_material.melting_point) - LAZYDISTINCTADD(meltable_materials, melt_material) - if(length(meltable_materials)) - . = null // Don't return PROCESS_KILL here. - handle_melting(meltable_materials) + var/static/list/_melting_containers = list( + /obj/item/chems/crucible, + /obj/item/organ/internal/stomach + ) + if(!is_type_in_list(loc, _melting_containers)) + return + + // Check if this is meltable at all. + var/list/meltable_materials + for(var/mat in matter) + var/decl/material/melt_material = GET_DECL(mat) + if(!isnull(melt_material.melting_point) && temperature >= melt_material.melting_point) + LAZYDISTINCTADD(meltable_materials, melt_material) + if(length(meltable_materials)) + . = null // Don't return PROCESS_KILL here. + handle_melting(meltable_materials) /obj/item/place_melted_product(list/meltable_materials) diff --git a/code/game/objects/items/_item_reagents.dm b/code/game/objects/items/_item_reagents.dm index c4de45769dc..e664024c952 100644 --- a/code/game/objects/items/_item_reagents.dm +++ b/code/game/objects/items/_item_reagents.dm @@ -1,5 +1,5 @@ -/obj/item/proc/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) // This goes into afterattack - if(!istype(target) || (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER)) +/obj/item/proc/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) // This goes into afterattack + if(!istype(target) || (!skip_container_check && (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER))) return FALSE if(!target.reagents || !target.reagents.total_volume) @@ -18,7 +18,7 @@ if(!istype(target)) return FALSE - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) to_chat(user, SPAN_NOTICE("You can't splash people on help intent.")) return TRUE @@ -64,12 +64,12 @@ return TRUE var/had_liquids = length(reagents.liquid_volumes) - var/trans = reagents.trans_to(target, amount) + var/transferred_amount = reagents.trans_to(target, amount) if(had_liquids) playsound(src, 'sound/effects/pour.ogg', 25, 1) else // Sounds more like pouring small pellets or dust. playsound(src, 'sound/effects/refill.ogg', 25, 1) - to_chat(user, SPAN_NOTICE("You transfer [trans] unit\s of the solution to \the [target]. \The [src] now contains [src.reagents.total_volume] units.")) + to_chat(user, SPAN_NOTICE("You transfer [transferred_amount] unit\s of the solution to \the [target]. \The [src] now contains [reagents.total_volume] unit\s.")) return TRUE diff --git a/code/game/objects/items/_item_sharpness.dm b/code/game/objects/items/_item_sharpness.dm new file mode 100644 index 00000000000..a37c1bf56fe --- /dev/null +++ b/code/game/objects/items/_item_sharpness.dm @@ -0,0 +1,21 @@ +/obj/item + VAR_PROTECTED/sharp = FALSE + VAR_PROTECTED/edge = FALSE + +/obj/item/is_sharp() + return sharp + +/obj/item/has_edge() + return edge + +/obj/item/proc/set_edge(new_edge) + if(edge != new_edge) + edge = new_edge + return TRUE + return FALSE + +/obj/item/proc/set_sharp(new_sharp) + if(sharp != new_sharp) + sharp = new_sharp + return TRUE + return FALSE diff --git a/code/game/objects/items/artifice/chain.dm b/code/game/objects/items/artifice/chain.dm new file mode 100644 index 00000000000..3a48abad475 --- /dev/null +++ b/code/game/objects/items/artifice/chain.dm @@ -0,0 +1,9 @@ +// Stub for forging. TODO crafting that uses chains. +/obj/item/chain + name = "chain" + name_prefix = "length of" + desc = "A flexible length of interconnected links forming a chain." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/chain.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL diff --git a/code/game/objects/items/artifice/hook.dm b/code/game/objects/items/artifice/hook.dm new file mode 100644 index 00000000000..c20c77b1480 --- /dev/null +++ b/code/game/objects/items/artifice/hook.dm @@ -0,0 +1,8 @@ +// Stub for forging. TODO use for slapcrafting a fishing rod? +/obj/item/hook + name = "hook" + desc = "A small, sharp, curved object." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/hook.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL diff --git a/code/game/objects/items/blades/_blade.dm b/code/game/objects/items/blades/_blade.dm index 775b5a0f09b..19dbcbce1cd 100644 --- a/code/game/objects/items/blades/_blade.dm +++ b/code/game/objects/items/blades/_blade.dm @@ -15,9 +15,11 @@ slot_flags = SLOT_LOWER_BODY material = /decl/material/solid/metal/steel _base_attack_force = 10 - var/decl/material/hilt_material = /decl/material/solid/organic/wood - var/decl/material/guard_material = /decl/material/solid/organic/wood - var/decl/material/pommel_material = /decl/material/solid/organic/wood + + var/decl/material/hilt_material = /decl/material/solid/organic/wood/oak + var/decl/material/guard_material = /decl/material/solid/organic/wood/oak + var/decl/material/pommel_material = /decl/material/solid/organic/wood/oak + /// Cache var for blade material shine calculation. var/tmp/shine diff --git a/code/game/objects/items/blades/axe.dm b/code/game/objects/items/blades/axe.dm index c136fb4e34d..9bda1a9a134 100644 --- a/code/game/objects/items/blades/axe.dm +++ b/code/game/objects/items/blades/axe.dm @@ -5,7 +5,7 @@ drop_sound = 'sound/foley/tooldrop1.ogg' w_class = ITEM_SIZE_HUGE slot_flags = SLOT_BACK - hilt_material = /decl/material/solid/organic/wood + hilt_material = /decl/material/solid/organic/wood/oak guard_material = /decl/material/solid/organic/leather/gut pommel_material = null attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") diff --git a/code/game/objects/items/blades/folding.dm b/code/game/objects/items/blades/folding.dm index 456ca87c0ed..98287a0ca7c 100644 --- a/code/game/objects/items/blades/folding.dm +++ b/code/game/objects/items/blades/folding.dm @@ -8,7 +8,7 @@ guard_material = null slot_flags = null material = /decl/material/solid/metal/bronze - hilt_material = /decl/material/solid/organic/wood + hilt_material = /decl/material/solid/organic/wood/oak _base_attack_force = 5 var/open = FALSE @@ -25,7 +25,7 @@ update_attack_force() /obj/item/bladed/folding/attack_self(mob/user) - if(user.a_intent != I_HELP) + if(!user.check_intent(I_FLAG_HELP)) set_open(!open, user) return TRUE var/decl/interaction_handler/folding_knife/interaction = GET_DECL(/decl/interaction_handler/folding_knife) @@ -53,9 +53,8 @@ /obj/item/bladed/folding/update_attack_force() ..() - // TODO: check sharp/edge. - edge = open - sharp = open + set_edge(open) + set_sharp(open) if(open) w_class = open_item_size attack_verb = open_attack_verbs @@ -98,6 +97,7 @@ name = "Adjust Folding Knife" expected_target_type = /obj/item/bladed/folding interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION + examine_desc = "adjust $TARGET_THEM$" /decl/interaction_handler/folding_knife/is_possible(atom/target, mob/user) . = ..() diff --git a/code/game/objects/items/blades/polearm.dm b/code/game/objects/items/blades/polearm.dm index 1761b1a7942..d7fe1b8e866 100644 --- a/code/game/objects/items/blades/polearm.dm +++ b/code/game/objects/items/blades/polearm.dm @@ -5,7 +5,7 @@ drop_sound = 'sound/foley/tooldrop1.ogg' w_class = ITEM_SIZE_HUGE slot_flags = SLOT_BACK - hilt_material = /decl/material/solid/organic/wood + hilt_material = /decl/material/solid/organic/wood/oak guard_material = /decl/material/solid/organic/leather/gut pommel_material = null _base_attack_force = 20 diff --git a/code/game/objects/items/blades/spear.dm b/code/game/objects/items/blades/spear.dm index 8659642ba91..2779646e0c8 100644 --- a/code/game/objects/items/blades/spear.dm +++ b/code/game/objects/items/blades/spear.dm @@ -3,8 +3,8 @@ desc = "A haphazardly-constructed yet still deadly weapon of ancient design." icon = 'icons/obj/items/bladed/spear.dmi' throw_speed = 3 - edge = 0 - sharp = 1 + edge = FALSE + sharp = TRUE attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") does_spin = FALSE abstract_type = /obj/item/bladed/polearm/spear diff --git a/code/game/objects/items/blades/spear_improvised.dm b/code/game/objects/items/blades/spear_improvised.dm index ad575292627..9f1a1da2425 100644 --- a/code/game/objects/items/blades/spear_improvised.dm +++ b/code/game/objects/items/blades/spear_improvised.dm @@ -1,4 +1,5 @@ /obj/item/bladed/polearm/spear/improvised + name_prefix = "improvised" material = /decl/material/solid/glass hilt_material = /decl/material/solid/metal/steel guard_material = /decl/material/solid/metal/copper @@ -11,10 +12,6 @@ force_binding_color = pick(global.cable_colors) . = ..(ml, material_key, _hilt_mat, _guard_mat) -/obj/item/bladed/polearm/spear/improvised/update_name() - . = ..() - SetName("improvised [name]") - /obj/item/bladed/polearm/spear/improvised/get_guard_color() return force_binding_color || ..() @@ -34,10 +31,10 @@ /obj/item/bladed/polearm/spear/improvised/steel material = /decl/material/solid/metal/steel - hilt_material = /decl/material/solid/organic/wood + hilt_material = /decl/material/solid/organic/wood/oak force_binding_color = COLOR_GREEN -/obj/item/bladed/polearm/spear/improvised/supermatter - material = /decl/material/solid/supermatter +/obj/item/bladed/polearm/spear/improvised/exotic_matter + material = /decl/material/solid/exotic_matter hilt_material = /decl/material/solid/organic/wood/ebony force_binding_color = COLOR_INDIGO diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index c9c67e53fc7..5a082bb9180 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -59,7 +59,7 @@ return FALSE name += " - [S.name]" - desc = "Blueprints of \the [S.name]. There is a \"Classified\" stamp and several coffee stains on it." + desc = "Blueprints of \the [S]. There is a \"Classified\" stamp and several coffee stains on it." valid_z_levels += S.map_z area_prefix = S.name return TRUE diff --git a/code/game/objects/items/books/_book.dm b/code/game/objects/items/books/_book.dm index b3fedb7df44..a71fd39032a 100644 --- a/code/game/objects/items/books/_book.dm +++ b/code/game/objects/items/books/_book.dm @@ -126,7 +126,7 @@ author = newauthor return TRUE - if((IS_KNIFE(W) || IS_WIRECUTTER(W)) && user.a_intent == I_HURT && try_carve(user, W)) + if((IS_KNIFE(W) || IS_WIRECUTTER(W)) && user.check_intent(I_FLAG_HARM) && try_carve(user, W)) return TRUE return ..() diff --git a/code/game/objects/items/books/manuals/engineering.dm b/code/game/objects/items/books/manuals/engineering.dm index 1dccd0022d3..bad39f2562c 100644 --- a/code/game/objects/items/books/manuals/engineering.dm +++ b/code/game/objects/items/books/manuals/engineering.dm @@ -26,13 +26,6 @@ title = "Particle Accelerator User's Guide" guide_decl = /datum/codex_entry/guide/particle_accelerator -/obj/item/book/manual/supermatter_engine - name = "supermatter engine reference manual" - icon = 'icons/obj/items/books/book_supermatter.dmi' - author = "Central Engineering Division" - title = "Supermatter Engine Operating Manual" - guide_decl = /datum/codex_entry/guide/supermatter - /obj/item/book/manual/rust_engine name = "fusion reactor reference Manual" icon_state = "bookMagazine" diff --git a/code/game/objects/items/books/skill/_skill.dm b/code/game/objects/items/books/skill/_skill.dm index 78b612b6ec9..9c9bf06db82 100644 --- a/code/game/objects/items/books/skill/_skill.dm +++ b/code/game/objects/items/books/skill/_skill.dm @@ -11,7 +11,7 @@ Skill books that increase your skills while you activate and hold them 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) + matter = list(/decl/material/solid/organic/wood/oak = MATTER_AMOUNT_REINFORCEMENT) abstract_type = /obj/item/book/skill var/decl/skill/skill // e.g. SKILL_LITERACY diff --git a/code/game/objects/items/candelabra.dm b/code/game/objects/items/candelabra.dm new file mode 100644 index 00000000000..1f82ec443aa --- /dev/null +++ b/code/game/objects/items/candelabra.dm @@ -0,0 +1,54 @@ +/datum/storage/candelabra + can_hold = list(/obj/item/flame/candle) + storage_slots = 3 + var/static/list/candle_offsets = list( + list("x" = -4, "y" = 17), + list("x" = 1, "y" = 19), + list("x" = 6, "y" = 17) + ) + +/datum/storage/candelabra/can_be_inserted(obj/item/W, mob/user, stop_messages, click_params) + . = ..() && holder && length(holder.get_stored_inventory()) < length(candle_offsets) + +/obj/item/candelabra + name = "candelabra" + desc = "A three-tined candle stand." + icon = 'icons/obj/items/candelabra.dmi' + icon_state = ICON_STATE_WORLD + storage = /datum/storage/candelabra + material = /decl/material/solid/metal/brass + material_alteration = MAT_FLAG_ALTERATION_ALL + +/obj/item/candelabra/attackby(obj/item/used_item, mob/user) + if(!user.check_intent(I_FLAG_HARM) && (used_item.isflamesource() || used_item.get_heat() > T100C)) + for(var/obj/item/flame/candle/candle in contents) + if(!candle.lit && candle.attackby(used_item, user)) + return TRUE + . = ..() + +/obj/item/candelabra/filled/Initialize(ml, material_key) + new /obj/item/flame/candle/random(src) + new /obj/item/flame/candle/random(src) + new /obj/item/flame/candle/random(src) + . = ..() + update_icon() + +// Workaround for vis_contents propagating color. +/obj/item/candelabra/on_update_icon() + ..() + var/datum/storage/candelabra/candles_storage = storage + if(istype(candles_storage)) + var/i = 1 + for(var/obj/item/flame/candle/candle in get_stored_inventory()) + var/offsets = candles_storage.candle_offsets[i] + candle.set_dir(SOUTH) + for(var/image/candle_overlay in candle.get_sconce_overlay()) + candle_overlay.pixel_x = offsets["x"] + candle_overlay.pixel_y = offsets["y"] + candle_overlay.dir = SOUTH + candle_overlay.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(candle_overlay) + i++ + if(i > length(candles_storage.candle_offsets)) + break + compile_overlays() diff --git a/code/game/objects/items/chisel.dm b/code/game/objects/items/chisel.dm new file mode 100644 index 00000000000..8bdcf2ab1a4 --- /dev/null +++ b/code/game/objects/items/chisel.dm @@ -0,0 +1,12 @@ +// Stub for forging. TODO implement TOOL_CHISEL. +/obj/item/tool/chisel + name = "chisel" + desc = "A hard, sharpened tool used to chisel stone, wood or bone." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/tool/chisel.dmi' + material = /decl/material/solid/metal/steel + handle_material = /decl/material/solid/organic/plastic + binding_material = null + +/obj/item/tool/chisel/forged + handle_material = null diff --git a/code/game/objects/items/crutches.dm b/code/game/objects/items/crutches.dm index 19221c12eb7..5a9ac03b477 100644 --- a/code/game/objects/items/crutches.dm +++ b/code/game/objects/items/crutches.dm @@ -53,7 +53,7 @@ padding_color = COLOR_GRAY20 /obj/item/crutch/wooden - material = /decl/material/solid/organic/wood // oak + material = /decl/material/solid/organic/wood/oak /obj/item/crutch/wooden/padded padding_material = /decl/material/solid/organic/leather \ No newline at end of file diff --git a/code/game/objects/items/devices/auto_cpr.dm b/code/game/objects/items/devices/auto_cpr.dm index ae70328b395..ec0a688f4ed 100644 --- a/code/game/objects/items/devices/auto_cpr.dm +++ b/code/game/objects/items/devices/auto_cpr.dm @@ -24,7 +24,7 @@ /obj/item/auto_cpr/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(ishuman(target) && user.a_intent == I_HELP) + if(ishuman(target) && user.check_intent(I_FLAG_HELP)) var/obj/item/suit = target.get_equipped_item(slot_wear_suit_str) if(suit) to_chat(user, SPAN_WARNING("Their [suit] is in the way, remove it first!")) diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 567039e9b51..f09470bc64e 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -147,7 +147,10 @@ // As it is, the effect can freely levitate over any open space. /obj/effect/dummy/chameleon/Move() . = ..() - if(. && isturf(loc) && loc.has_gravity() && !(locate(/obj/structure/catwalk) in loc) && !(locate(/obj/structure/lattice) in loc)) + if(!. || !isturf(loc) || !loc.has_gravity()) + return + var/turf/my_turf = loc + if(!my_turf.get_supporting_platform() && !(locate(/obj/structure/lattice) in loc)) disrupted() /datum/movement_handler/delay/chameleon_projector diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index c58b5bd7ae2..4508758e19d 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -377,6 +377,7 @@ var/global/list/all_gps_units = list() /decl/interaction_handler/gps_toggle name = "Toggle Tracking" expected_target_type = /obj/item/gps + examine_desc = "toggle GPS tracking" /decl/interaction_handler/gps_toggle/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gps/G = target diff --git a/code/game/objects/items/devices/inducer.dm b/code/game/objects/items/devices/inducer.dm index b3bc6d8ae8f..132fcc0e82f 100644 --- a/code/game/objects/items/devices/inducer.dm +++ b/code/game/objects/items/devices/inducer.dm @@ -33,7 +33,7 @@ target.update_icon() /obj/item/inducer/afterattack(obj/O, mob/living/user, var/proximity) - if (!proximity || user.a_intent == I_HURT || CannotUse(user) || !recharge(O, user)) + if (!proximity || user.check_intent(I_FLAG_HARM) || CannotUse(user) || !recharge(O, user)) return ..() /obj/item/inducer/proc/CannotUse(mob/user) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 3565259a08e..34115f49b63 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -110,7 +110,7 @@ if(!user.try_unequip(L)) return TRUE AddUses(1) - to_chat(user, "You insert \the [L.name] into \the [src]. You have [uses] light\s remaining.") + to_chat(user, "You insert \the [L] into \the [src]. You have [uses] light\s remaining.") qdel(L) return TRUE else diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index a9dbd8a0878..3c6f0868145 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -223,7 +223,7 @@ return FALSE if(!flooring.can_paint || F.is_floor_damaged()) - to_chat(user, SPAN_WARNING("\The [src] cannot paint \the [F.name].")) + to_chat(user, SPAN_WARNING("\The [src] cannot paint \the [F].")) return FALSE var/list/decal_data = decals[decal] @@ -456,6 +456,7 @@ name = "Change Color Preset" expected_target_type = /obj/item/paint_sprayer interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_INVENTORY + examine_desc = "change the color preset" /decl/interaction_handler/paint_sprayer_colour/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/paint_sprayer/sprayer = target diff --git a/code/game/objects/items/devices/radio/headsets_shared.dm b/code/game/objects/items/devices/radio/headsets_shared.dm index c591cb4a83a..6c5551ea983 100644 --- a/code/game/objects/items/devices/radio/headsets_shared.dm +++ b/code/game/objects/items/devices/radio/headsets_shared.dm @@ -221,6 +221,18 @@ encryption_keys = list(/obj/item/encryptionkey/raider) analog_secured = list((access_raider) = TRUE) +/obj/item/encryptionkey/hacked + can_decrypt = list(access_hacked) + 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}' + encryption_keys = list(/obj/item/encryptionkey/hacked) + // Bowman alts /obj/item/radio/headset/headset_mining/bowman name = "mining bowman radio headset" diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 882706ebc6f..0726d380a41 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -25,10 +25,6 @@ START_PROCESSING(SSobj, src) update_icon() -/obj/item/radio/intercom/wizard - name = "enchanted intercom" - desc = "Talk into this while you ponder your orb." - /obj/item/radio/intercom/raider name = "piratical intercom" desc = "Pirate radio, but not in the usual sense of the word." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index e4db86946c2..2b435362919 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -227,11 +227,11 @@ return STATUS_CLOSE return ..() -/obj/item/radio/OnTopic(href, href_list) +/obj/item/radio/OnTopic(mob/user, href_list) if((. = ..())) return - usr.set_machine(src) + user.set_machine(src) if(href_list["analog"]) if(can_use_analog) analog = text2num(href_list["analog"]) @@ -258,8 +258,8 @@ var/new_frequency = sanitize_frequency(frequency + text2num(href_list["freq"])) set_frequency(new_frequency) if(hidden_uplink) - if(hidden_uplink.check_trigger(usr, frequency, traitor_frequency)) - close_browser(usr, "window=radio") + if(hidden_uplink.check_trigger(user, frequency, traitor_frequency)) + close_browser(user, "window=radio") . = TOPIC_REFRESH else if (href_list["talk"]) toggle_broadcast() @@ -278,14 +278,14 @@ . = TOPIC_REFRESH else if(href_list["spec_freq"]) var freq = href_list["spec_freq"] - if(has_channel_access(usr, freq)) + if(has_channel_access(user, freq)) set_frequency(text2num(freq)) . = TOPIC_REFRESH if(href_list["nowindow"]) // here for pAIs, maybe others will want it, idk return TOPIC_HANDLED if(href_list["network_settings"]) var/datum/extension/network_device/D = get_extension(src, /datum/extension/network_device) - D.ui_interact(usr) + D.ui_interact(user) . = TOPIC_HANDLED if(. & TOPIC_REFRESH) SSnano.update_uis(src) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index b83f35bca48..2f2506b6aa0 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -7,11 +7,27 @@ var/obj/item/tank/tank_one var/obj/item/tank/tank_two var/obj/item/assembly/attached_device - var/mob/attacher = null + var/weakref/attacher_ref = null var/valve_open = 0 var/toggle = 1 movable_flags = MOVABLE_FLAG_PROXMOVE +/obj/item/transfer_valve/Destroy() + if(!QDELETED(tank_one)) + QDEL_NULL(tank_one) + else + tank_one = null + if(!QDELETED(tank_two)) + QDEL_NULL(tank_two) + else + tank_two = null + if(!QDELETED(attached_device)) + QDEL_NULL(attached_device) + else + attached_device = null + attacher_ref = null + return ..() + /obj/item/transfer_valve/attackby(obj/item/item, mob/user) var/turf/location = get_turf(src) // For admin logs if(istype(item, /obj/item/tank)) @@ -56,7 +72,7 @@ global.bombers += "[key_name(user)] attached a [item] to a transfer valve." message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") - attacher = user + attacher_ref = weakref(user) . = TRUE if(.) update_icon() @@ -189,6 +205,7 @@ var/area/A = get_area(bombturf) var/attacher_name = "" + var/mob/attacher = attacher_ref.resolve() if(!attacher) attacher_name = "Unknown" else diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index bbcbc43e488..272de843372 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -96,6 +96,7 @@ update_held_icon() /* Assembly by a roboticist */ +// TODO: Make this slapcrafting or remove tvcamera/tvassembly entirely /obj/item/robot_parts/head/attackby(var/obj/item/assembly/S, mob/user) if (!istype(S, /obj/item/assembly/infra)) return ..() diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index f10c6c28f34..02f4eb078b7 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -69,7 +69,7 @@ do var/datum/uplink_random_selection/uplink_selection = get_uplink_random_selection_by_type(/datum/uplink_random_selection/blacklist) new_discount_item = uplink_selection.get_random_item(INFINITY, src) - // Ensures we only only get items for which we get an actual discount and that this particular uplink can actually view (can buy would risk near-infinite loops). + // Ensures we only get items for which we get an actual discount and that this particular uplink can actually view (can buy would risk near-infinite loops). while(is_improper_item(new_discount_item, discount_amount)) if(!new_discount_item) return diff --git a/code/game/objects/items/flame/_flame.dm b/code/game/objects/items/flame/_flame.dm index 4527a2b6bc1..86fa054e41a 100644 --- a/code/game/objects/items/flame/_flame.dm +++ b/code/game/objects/items/flame/_flame.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_TINY origin_tech = @'{"materials":1}' - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /// Parameters for lighting when lit. var/lit_light_range = 1 @@ -56,7 +56,7 @@ loc.update_icon() /obj/item/flame/Destroy() - extinguish(null, TRUE) + snuff_out(null, TRUE) return ..() /obj/item/flame/proc/get_available_scents() @@ -102,7 +102,7 @@ /obj/item/flame/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(!istype(target) || user.a_intent == I_HURT || !lit || user.get_target_zone() != BP_MOUTH) + if(!istype(target) || user.check_intent(I_FLAG_HARM) || !lit || user.get_target_zone() != BP_MOUTH) return ..() var/obj/item/clothing/mask/smokable/cigarette/cig = target.get_equipped_item(slot_wear_mask_str) @@ -115,7 +115,7 @@ return ..() -/obj/item/flame/proc/extinguish(var/mob/user, var/no_message) +/obj/item/flame/proc/snuff_out(mob/user, no_message = FALSE) if(!lit) return FALSE lit = FALSE @@ -125,6 +125,9 @@ update_attack_force() update_icon() + if(ismob(loc)) // not very robust for things like accessories... + update_held_icon() + update_clothing_icon() if(istype(loc, /obj/structure/wall_sconce)) loc.update_icon() @@ -147,7 +150,7 @@ return TRUE if(lit && can_manually_extinguish) - extinguish(user) + snuff_out(user) return TRUE return ..() @@ -167,15 +170,8 @@ if(waterproof) return - var/check_depth = FLUID_PUDDLE - if(ismob(loc)) - var/mob/holder = loc - if(!holder.current_posture?.prone) - check_depth = FLUID_OVER_MOB_HEAD - else - check_depth = FLUID_SHALLOW - if(fluids.total_volume >= check_depth) - extinguish(no_message = TRUE) + if(fluids.total_volume >= FLUID_PUDDLE) + snuff_out(no_message = TRUE) /obj/item/flame/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) . = ..() @@ -205,32 +201,22 @@ if(!other.can_manually_light) other.light(user) -/obj/item/flame/attackby(obj/item/W, mob/user) - - if(user.a_intent != I_HURT && !can_manually_light && (W.isflamesource() || W.get_heat() > T100C)) +/obj/item/flame/attackby(obj/item/used_item, mob/user) + if(!user.check_intent(I_FLAG_HARM) && !can_manually_light && (used_item.isflamesource() || used_item.get_heat() > T100C)) light(user) return TRUE - return ..() /obj/item/flame/Process() - if((!waterproof && submerged()) || !expend_fuel(_fuel_spend_amt)) - extinguish() + snuff_out() return PROCESS_KILL - update_icon() - if(istype(loc, /obj/structure/wall_sconce)) - loc.update_icon() - - // TODO: generalized ignition proc - if(isliving(loc)) - var/mob/living/M = loc - M.IgniteMob() - - var/turf/location = get_turf(src) - if(location) - location.hotspot_expose(get_heat(), w_class) + if(loc) + loc.ignite_fire() + var/turf/my_turf = get_turf(src) + if(my_turf) + my_turf.hotspot_expose(get_heat(), w_class) /obj/item/flame/dropped(var/mob/user) //If dropped, put ourselves out @@ -239,7 +225,7 @@ var/turf/location = loc if(istype(location)) location.hotspot_expose(700, 5) - extinguish() + snuff_out() return ..() /obj/item/flame/spark_act(obj/effect/sparks/sparks) diff --git a/code/game/objects/items/flame/flame_candle.dm b/code/game/objects/items/flame/flame_candle.dm index dcf647104f6..906824d52bc 100644 --- a/code/game/objects/items/flame/flame_candle.dm +++ b/code/game/objects/items/flame/flame_candle.dm @@ -41,7 +41,7 @@ /obj/item/flame/candle/get_sconce_overlay() . = list(overlay_image(icon, "[icon_state]-sconce", color = color, flags = RESET_COLOR)) if(lit) - . += overlay_image(icon, "[icon_state]-sconce-lit", color = color, flags = RESET_COLOR) + . += overlay_image(icon, "[icon_state]-sconce-lit", color = COLOR_WHITE, flags = RESET_COLOR) /obj/item/flame/candle/on_update_icon() @@ -63,6 +63,9 @@ // TODO: emissives add_overlay(overlay_image(icon, "[icon_state]_lit", flags = RESET_COLOR)) + if(istype(loc, /obj/item/candelabra)) + loc.queue_icon_update() + /obj/item/flame/candle/proc/get_available_colors() return null @@ -83,6 +86,11 @@ /obj/item/flame/candle/get_available_scents() return null +/obj/item/flame/candle/set_dir(ndir) + if(istype(loc, /obj/item/candelabra)) + ndir = SOUTH + . = ..() + /obj/item/flame/candle/scented name = "scented candle" desc = "A candle which releases pleasant-smelling oils into the air when burned." diff --git a/code/game/objects/items/flame/flame_fuelled.dm b/code/game/objects/items/flame/flame_fuelled.dm index fceada02226..07bcfe40859 100644 --- a/code/game/objects/items/flame/flame_fuelled.dm +++ b/code/game/objects/items/flame/flame_fuelled.dm @@ -21,7 +21,7 @@ // Boilerplate from /obj/item/chems/glass. TODO generalize to a lower level. /obj/item/flame/fuelled/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(get_attack_force() && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.a_intent == I_HURT) + if(get_attack_force() && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.check_intent(I_FLAG_HARM)) . = ..() if(reagents?.total_volume && !QDELETED(target)) target.visible_message(SPAN_DANGER("Some of the contents of \the [src] splash onto \the [target].")) diff --git a/code/game/objects/items/flame/flame_fuelled_lighter.dm b/code/game/objects/items/flame/flame_fuelled_lighter.dm index 7719c082a6f..2e1e6903bc2 100644 --- a/code/game/objects/items/flame/flame_fuelled_lighter.dm +++ b/code/game/objects/items/flame/flame_fuelled_lighter.dm @@ -33,7 +33,7 @@ user.visible_message(SPAN_NOTICE("After a few attempts, \the [user] manages to light \the [src], burning their finger in the process.")) playsound(src.loc, "light_bic", 100, 1, -4) -/obj/item/flame/fuelled/lighter/extinguish(var/mob/user, var/no_message) +/obj/item/flame/fuelled/lighter/snuff_out(mob/user, no_message = FALSE) if(!no_message && user) no_message = TRUE . = ..() diff --git a/code/game/objects/items/flame/flame_matches.dm b/code/game/objects/items/flame/flame_matches.dm index ebaead8790b..41300c9d1e0 100644 --- a/code/game/objects/items/flame/flame_matches.dm +++ b/code/game/objects/items/flame/flame_matches.dm @@ -23,7 +23,7 @@ /obj/item/flame/match/light(mob/user, no_message) . = !burnt && ..() -/obj/item/flame/match/extinguish(var/mob/user, var/no_message) +/obj/item/flame/match/snuff_out(mob/user, no_message = FALSE) . = ..() if(. && !burnt) _fuel = 0 diff --git a/code/game/objects/items/flame/flame_torch.dm b/code/game/objects/items/flame/flame_torch.dm index 66aac1847d6..0e2f14c1022 100644 --- a/code/game/objects/items/flame/flame_torch.dm +++ b/code/game/objects/items/flame/flame_torch.dm @@ -13,10 +13,6 @@ var/head_material = /decl/material/solid/organic/cloth var/burnt = FALSE -/obj/item/flame/torch/Initialize() - . = ..() - set_color(null) // clear our scent color - /obj/item/flame/torch/get_available_scents() var/static/list/available_scents = list( /decl/scent_type/woodsmoke @@ -34,6 +30,7 @@ /obj/item/flame/torch/Initialize(var/ml, var/material_key, var/_head_material) . = ..() + set_color(null) // clear our scent color. TODO: allow flame items to disable scent color setting in the first place if(_head_material) head_material = _head_material @@ -50,7 +47,7 @@ update_icon() -/obj/item/flame/torch/extinguish(var/mob/user, var/no_message) +/obj/item/flame/torch/snuff_out(mob/user, no_message = FALSE) . = ..() if(. && _fuel <= 0 && !burnt) burnt = TRUE @@ -76,11 +73,11 @@ if(head_material) var/decl/material/head_mat = GET_DECL(head_material) if(burnt) - add_overlay(overlay_image(icon, "[icon_state]-burnt", head_mat.color, flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-burnt", head_mat.color, flags = RESET_COLOR|KEEP_APART)) else - add_overlay(overlay_image(icon, "[icon_state]-head", head_mat.color, flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-head", head_mat.color, flags = RESET_COLOR|KEEP_APART)) if(lit) - add_overlay(overlay_image(icon, "[icon_state]-lit", flags = RESET_COLOR)) + add_overlay(overlay_image(icon, "[icon_state]-lit", flags = RESET_COLOR|KEEP_APART)) /obj/item/flame/torch/get_sconce_overlay() . = list(overlay_image(icon, "[icon_state]-sconce", color = color, flags = RESET_COLOR)) diff --git a/code/game/objects/items/flashlights/glowstick.dm b/code/game/objects/items/flashlights/glowstick.dm index 689fd0a7eb8..c0f07103a33 100644 --- a/code/game/objects/items/flashlights/glowstick.dm +++ b/code/game/objects/items/flashlights/glowstick.dm @@ -43,5 +43,5 @@ color = "#ff00ff" /obj/item/flashlight/flare/glowstick/random/Initialize() - color = rgb(rand(50,255),rand(50,255),rand(50,255)) + set_color(rgb(rand(50,255),rand(50,255),rand(50,255))) . = ..() diff --git a/code/game/objects/items/horseshoe.dm b/code/game/objects/items/horseshoe.dm new file mode 100644 index 00000000000..089d3c9cc4b --- /dev/null +++ b/code/game/objects/items/horseshoe.dm @@ -0,0 +1,8 @@ +// Stub for forging. TODO implement shoes on honse. +/obj/item/horseshoe + name = "horseshoe" + desc = "A curved length of metal, usually nailed to a horse's hoof. May bring luck." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/horseshoe.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL diff --git a/code/game/objects/items/hourglass.dm b/code/game/objects/items/hourglass.dm new file mode 100644 index 00000000000..98bb75f1281 --- /dev/null +++ b/code/game/objects/items/hourglass.dm @@ -0,0 +1,133 @@ +// I considered just putting this in the fantasy modpack, but +// it's probably better in core code, since it's a nice prop. +/obj/item/hourglass + name = "hourglass" + icon = 'icons/obj/items/hourglass.dmi' + icon_state = "world-preview" + desc = "Sand trickles from one fused dome to another, tracking the inevitable passage of time. What are you doing with your life?" + w_class = ITEM_SIZE_SMALL + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR + material = /decl/material/solid/organic/wood/mahogany + max_health = null // autoset from material, let it be destroyed! + // These two variables cannot be null, currently. If you want to allow that, you need to change a lot of the code. + var/decl/material/glass_material = /decl/material/solid/glass + var/decl/material/sand_material = /decl/material/solid/sand + /// The world.time at which the hourglass was last flipped. Used to determine if sand is currently falling. + var/last_flipped = null + /// How long in deciseconds does it take for the sand to finish falling? + var/sand_duration = 1 MINUTE // TODO: Make this based off of matter somehow, instead of vice versa? This means damaging it and leaking sand would make it run fast... + /// The number of falling sand states to use, [0, X) (including 0 but excluding X). + var/sand_falling_states = 4 + /// This is an internal variable used to prevent unnecessary update_icon calls. + var/tmp/last_sand_state = null + +/obj/item/hourglass/Initialize(ml, material_key, glass_material_key, sand_material_key) + if(!isnull(glass_material_key)) + glass_material = glass_material_key + if(ispath(glass_material)) + glass_material = GET_DECL(glass_material) + if(!isnull(sand_material_key)) + sand_material = sand_material_key + if(ispath(sand_material)) + sand_material = GET_DECL(sand_material) + last_flipped = -sand_duration + . = ..() // Materials should be set when going into create_matter + update_icon() + +/obj/item/hourglass/create_matter() + var/sand_matter = sand_duration / (1 MINUTE) * MATTER_AMOUNT_TRACE // Shorter duration, less sand; higher duration, more sand. + LAZYSET(matter, sand_material.type, sand_matter) + LAZYSET(matter, glass_material.type, MATTER_AMOUNT_REINFORCEMENT) + return ..() // Parent call has to go last so we apply size modifiers properly. + +/obj/item/hourglass/proc/sand_is_falling() + return (world.time - last_flipped) < sand_duration + +/obj/item/hourglass/examine(mob/user, distance, infix, suffix) + . = ..() + if(distance <= 2) + var/sand_string = "not falling" + switch(clamp(world.time - last_flipped, 0, sand_duration) / sand_duration) + if(0) + sand_string = "not falling" + if(0 to 0.25) + sand_string = "almost done falling" + if(0.25 to 0.4) + sand_string = "over halfway done falling" + if(0.4 to 0.6) + sand_string = "about halfway done falling" + if(0.6 to 0.75) + sand_string = "almost halfway done falling" + if(0.75 to 1) + sand_string = "just starting to fall" + to_chat(user, SPAN_NOTICE("The [sand_material.solid_name] in \the [src] is [sand_string].")) + +/obj/item/hourglass/proc/get_sand_state(world_inventory_state) + /// This is a fraction of the sand_duration. + var/sand_progress = (world.time - last_flipped) / sand_duration + switch(sand_progress) + if(0 to 1) + return "sand-falling[floor(sand_progress * sand_falling_states)]-[world_inventory_state]" // 0 to sand_falling_states exclusive. + else + return "sand-[world_inventory_state]" + +/obj/item/hourglass/on_update_icon() + . = ..() + icon_state = get_world_inventory_state() + last_sand_state = get_sand_state(icon_state) + // Sand goes before glass + add_overlay(overlay_image(icon, last_sand_state, sand_material.color, RESET_ALPHA|RESET_COLOR)) + // Glass goes over the sand + add_overlay(overlay_image(icon, "glass-[icon_state]", glass_material.color, RESET_ALPHA|RESET_COLOR)) + compile_overlays() // Don't wait for SSoverlays, this is pretty time-sensitive. + +/obj/item/hourglass/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + // TODO: held item falling sand states? + overlay.add_overlay(overlay_image(overlay.icon, "sand-[overlay.icon_state]", sand_material.color, RESET_ALPHA | RESET_COLOR)) + overlay.add_overlay(overlay_image(overlay.icon, "glass-[overlay.icon_state]", glass_material.color, RESET_ALPHA | RESET_COLOR)) + return ..() + +/obj/item/hourglass/attack_self(mob/user) + . = ..() + if(.) // Already did something like squash it or empty storage. + return + return flip_hourglass(user) + +/obj/item/hourglass/proc/flip_hourglass(mob/user) + if(user) + // You can't see or hear this from very far. + user.visible_message("\The [user] flips \the [src].", SPAN_NOTICE("You flip \the [src]."), SPAN_NOTICE("You hear falling sand."), range = 2) + // Invert the time elapsed so that it becomes the time remaining. + var/time_elapsed = sand_duration - clamp(world.time - last_flipped, 0, sand_duration) + last_flipped = world.time - time_elapsed + update_icon() + if(!is_processing) + START_PROCESSING(SSobj, src) + return TRUE + +/obj/item/hourglass/Process() + if(!sand_is_falling()) + return PROCESS_KILL + if(get_sand_state(get_world_inventory_state()) == last_sand_state) // No need to do an update yet. + return + update_icon() + +/obj/item/hourglass/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/hourglass/physically_destroyed(skip_qdel) + // This code is adapted from compost bins. + // TODO: Make a helper for 'create or add to scraps'. + var/obj/item/debris/scraps/remains = (locate() in loc) || new(loc) + LAZYINITLIST(remains.matter) + if(matter[sand_material.type]) // Make sure we haven't already lost our sand... somehow? + remains.matter[sand_material.type] += matter[sand_material.type] + UNSETEMPTY(remains.matter) + remains.update_primary_material() + // Now create shards of our glass material. + // At some point in the future this should probably respect matter conservation. + // Right now we just make sure we have any glass left at all. + if(matter[glass_material.type]) + glass_material.place_shards(loc) + return ..() \ No newline at end of file diff --git a/code/game/objects/items/instruments.dm b/code/game/objects/items/instruments.dm index 4b51b677e19..f75cca75194 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/organic/wood + material = /decl/material/solid/organic/wood/oak slot_flags = SLOT_BACK throw_speed = 3 throw_range = 6 diff --git a/code/game/objects/items/plushies.dm b/code/game/objects/items/plushies.dm index 13a1439b0c0..3d07788f436 100644 --- a/code/game/objects/items/plushies.dm +++ b/code/game/objects/items/plushies.dm @@ -15,15 +15,15 @@ if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() playsound(src.loc, 'sound/effects/rustle1.ogg', 100, 1) - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) user.visible_message( SPAN_NOTICE("\The [user] hugs \the [src]!"), SPAN_NOTICE("You hug \the [src]!")) - else if (user.a_intent == I_HURT) + else if (user.check_intent(I_FLAG_HARM)) user.visible_message( SPAN_WARNING("\The [user] punches \the [src]!"), SPAN_WARNING("You punch \the [src]!")) - else if (user.a_intent == I_GRAB) + else if (user.check_intent(I_FLAG_GRAB)) user.visible_message( SPAN_WARNING("\The [user] attempts to strangle \the [src]!"), SPAN_WARNING("You attempt to strangle \the [src]!")) @@ -75,15 +75,15 @@ var/phrase_vary = TRUE /obj/item/toy/plushie/attack_self(mob/user) - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) user.visible_message( SPAN_NOTICE("\The [user] hugs \the [src]!"), SPAN_NOTICE("You hug \the [src]!")) - else if (user.a_intent == I_HURT) + else if (user.check_intent(I_FLAG_HARM)) user.visible_message( SPAN_WARNING("\The [user] punches \the [src]!"), SPAN_WARNING("You punch \the [src]!")) - else if (user.a_intent == I_GRAB) + else if (user.check_intent(I_FLAG_GRAB)) user.visible_message( SPAN_WARNING("\The [user] attempts to strangle \the [src]!"), SPAN_WARNING("You attempt to strangle \the [src]!")) diff --git a/code/game/objects/items/robot/robot_frame.dm b/code/game/objects/items/robot/robot_frame.dm index bd8f71787b8..24f7474aa6e 100644 --- a/code/game/objects/items/robot/robot_frame.dm +++ b/code/game/objects/items/robot/robot_frame.dm @@ -111,6 +111,7 @@ O.custom_name = created_name O.updatename("Default") + clear_antag_roles(brainmob.mind, implanted = TRUE) // some antag roles persist brainmob.mind.transfer_to(O) if(O.mind && O.mind.assigned_role) O.job = O.mind.assigned_role diff --git a/code/game/objects/items/saddle.dm b/code/game/objects/items/saddle.dm index cf7d51f0a3c..2fb35ce01a4 100644 --- a/code/game/objects/items/saddle.dm +++ b/code/game/objects/items/saddle.dm @@ -9,7 +9,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL /obj/item/saddle/mob_can_equip(mob/user, slot, disable_warning, force, ignore_equipped) - if(!istype(user, /mob/living/simple_animal/passive/horse)) + if(!istype(user) || !istype(user.get_bodytype(), /decl/bodytype/quadruped)) return FALSE return ..() diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm deleted file mode 100644 index 18dce99c9e5..00000000000 --- a/code/game/objects/items/shooting_range.dm +++ /dev/null @@ -1,142 +0,0 @@ -// Targets, the things that actually get shot! -/obj/item/target - name = "shooting target" - desc = "A shooting target." - icon = 'icons/obj/objects.dmi' - icon_state = "target_h" - density = FALSE - material = /decl/material/solid/organic/plastic - var/obj/structure/target_stake/stake - var/hp = 1800 - var/icon/virtualIcon - var/list/bulletholes = list() - -/obj/item/target/Destroy() - . = ..() - if (stake) - stake.set_target(null) - -/obj/item/target/attackby(var/obj/item/W, var/mob/user) - if(IS_WELDER(W)) - var/obj/item/weldingtool/WT = W - if(WT.weld(0, user)) - overlays.Cut() - bulletholes.Cut() - hp = initial(hp) - to_chat(user, "You slice off [src]'s uneven chunks of aluminium and scorch marks.") - return TRUE - return ..() - -/obj/item/target/attack_hand(var/mob/user) - // taking pinned targets off! - if(!stake || !user.check_dexterity(DEXTERITY_HOLD_ITEM)) - return ..() - return stake.attack_hand(user) - -/obj/item/target/syndicate - icon_state = "target_s" - desc = "A shooting target that looks like a hostile agent." - hp = 2600 // i guess syndie targets are sturdier? -/obj/item/target/alien - icon_state = "target_q" - desc = "A shooting target with a threatening silhouette." - hp = 2350 // alium onest too kinda - -/obj/item/target/bullet_act(var/obj/item/projectile/Proj) - var/p_x = Proj.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset Proj.p_x!" - var/p_y = Proj.p_y + pick(0,0,0,0,0,-1,1) - var/decaltype = 1 // 1 - scorch, 2 - bullet - - if(istype(/obj/item/projectile/bullet, Proj)) - decaltype = 2 - - - virtualIcon = new(icon, icon_state) - - if( virtualIcon.GetPixel(p_x, p_y) ) // if the located pixel isn't blank (null) - - hp -= Proj.damage - if(hp <= 0) - visible_message(SPAN_WARNING("\The [src] breaks into tiny pieces and collapses!")) - qdel(src) - - // Create a temporary object to represent the damage - var/obj/bmark = new - bmark.pixel_x = p_x - bmark.pixel_y = p_y - bmark.icon = 'icons/effects/effects.dmi' - bmark.layer = ABOVE_OBJ_LAYER - bmark.icon_state = "scorch" - - if(decaltype == 1) - // Energy weapons are hot. they scorch! - - // offset correction - bmark.pixel_x-- - bmark.pixel_y-- - - if(Proj.damage >= 20 || istype(Proj, /obj/item/projectile/beam/practice)) - bmark.icon_state = "scorch" - bmark.set_dir(pick(NORTH,SOUTH,EAST,WEST)) // random scorch design - - - else - bmark.icon_state = "light_scorch" - else - - // Bullets are hard. They make dents! - bmark.icon_state = "dent" - - if(Proj.damage >= 10 && bulletholes.len <= 35) // maximum of 35 bullet holes - if(decaltype == 2) // bullet - if(prob(Proj.damage+30)) // bullets make holes more commonly! - new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole - else // Lasers! - if(prob(Proj.damage-10)) // lasers make holes less commonly - new/datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole - - // draw bullet holes - for(var/datum/bullethole/B in bulletholes) - - virtualIcon.DrawBox(null, B.b1x1, B.b1y, B.b1x2, B.b1y) // horizontal line, left to right - virtualIcon.DrawBox(null, B.b2x, B.b2y1, B.b2x, B.b2y2) // vertical line, top to bottom - - overlays += bmark // add the decal - - icon = virtualIcon // apply bulletholes over decals - - return - - return PROJECTILE_CONTINUE // the bullet/projectile goes through the target! - - -// Small memory holder entity for transparent bullet holes -/datum/bullethole - // First box - var/b1x1 = 0 - var/b1x2 = 0 - var/b1y = 0 - - // Second box - var/b2x = 0 - var/b2y1 = 0 - var/b2y2 = 0 - -/datum/bullethole/New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0) - if(!Target) return - - // Randomize the first box - b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4) - b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4) - b1y = pixel_y - if(prob(35)) - b1y += rand(-4,4) - - // Randomize the second box - b2x = pixel_x - if(prob(35)) - b2x += rand(-4,4) - b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4) - b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4) - - Target.bulletholes.Add(src) \ No newline at end of file diff --git a/code/game/objects/items/spirit_board.dm b/code/game/objects/items/spirit_board.dm index ac145093843..6134ada23b9 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/organic/wood + material = /decl/material/solid/organic/wood/oak var/next_use = 0 var/planchette = "A" var/lastuser = null @@ -14,7 +14,7 @@ to_chat(user, "The planchette is sitting at \"[planchette]\".") /obj/item/spirit_board/attack_hand(mob/user) - if(user.a_intent == I_GRAB || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) + if(user.check_intent(I_FLAG_GRAB) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() spirit_board_pick_letter(user) return TRUE diff --git a/code/game/objects/items/stacks/medical/_medical.dm b/code/game/objects/items/stacks/medical/_medical.dm index 22d016c2b49..8a7cb9a017a 100644 --- a/code/game/objects/items/stacks/medical/_medical.dm +++ b/code/game/objects/items/stacks/medical/_medical.dm @@ -51,7 +51,7 @@ /obj/item/stack/medical/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(!user_can_attack_with(user) || user.a_intent == I_HURT) + if(!user_can_attack_with(user) || user.check_intent(I_FLAG_HARM)) return ..() if(get_amount() < 1) diff --git a/code/game/objects/items/stacks/medical/medical_splint.dm b/code/game/objects/items/stacks/medical/medical_splint.dm index 76b3e381b4e..1d268de10cd 100644 --- a/code/game/objects/items/stacks/medical/medical_splint.dm +++ b/code/game/objects/items/stacks/medical/medical_splint.dm @@ -90,7 +90,7 @@ plural_name = "splints" icon_state = "simple-splint" amount = 1 - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak matter = list( /decl/material/solid/organic/cloth = MATTER_AMOUNT_REINFORCEMENT ) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 86363f815e9..7e244c18453 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,45 +1,37 @@ /obj/item/stack/material/rods - name = "rod" - desc = "Some rods. Can be used for building, or something." - singular_name = "rod" - plural_name = "rods" - icon_state = "rod" - plural_icon_state = "rod-mult" - max_icon_state = "rod-max" - w_class = ITEM_SIZE_LARGE - attack_cooldown = 21 + name = "rod" + desc = "Some rods. Can be used for building, or something." + singular_name = "rod" + plural_name = "rods" + icon_state = "rod" + plural_icon_state = "rod-mult" + max_icon_state = "rod-max" + w_class = ITEM_SIZE_LARGE + attack_cooldown = 21 melee_accuracy_bonus = -20 - throw_speed = 5 - throw_range = 20 - max_amount = 100 - attack_verb = list("hit", "bludgeoned", "whacked") - lock_picking_level = 3 - matter_multiplier = 0.3 - material = /decl/material/solid/metal/steel - is_spawnable_type = TRUE - - pickup_sound = 'sound/foley/tooldrop3.ogg' - drop_sound = 'sound/foley/tooldrop2.ogg' + throw_speed = 5 + throw_range = 20 + max_amount = 100 + attack_verb = list("hit", "bludgeoned", "whacked") + lock_picking_level = 3 + matter_multiplier = 0.3 + material = /decl/material/solid/metal/steel + crafting_stack_type = /obj/item/stack/material/rods + pickup_sound = 'sound/foley/tooldrop3.ogg' + drop_sound = 'sound/foley/tooldrop2.ogg' /obj/item/stack/material/rods/get_autopsy_descriptors() . = ..() . += "narrow" -/obj/item/stack/material/rods/ten - amount = 10 - -/obj/item/stack/material/rods/fifty - amount = 50 - /obj/item/stack/material/rods/cyborg - name = "metal rod synthesizer" - desc = "A device that makes metal rods." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(500) - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE + name = "metal rod synthesizer" + desc = "A device that makes metal rods." + gender = NEUTER + matter = null + uses_charge = 1 + charge_costs = list(500) + max_health = ITEM_HEALTH_NO_DAMAGE /obj/item/stack/material/rods/Initialize() . = ..() @@ -54,12 +46,14 @@ else icon_state = base_state +// TODO: slapcrafting recipes to replace this block. /obj/item/stack/material/rods/attackby(obj/item/W, mob/user) + if(IS_WELDER(W)) var/obj/item/weldingtool/WT = W if(!can_use(2)) - to_chat(user, "You need at least two rods to do this.") + to_chat(user, SPAN_WARNING("You need at least two rods to do this.")) return TRUE if(WT.weld(0,user)) @@ -87,8 +81,3 @@ src.use(1) return TRUE return ..() - -/obj/item/stack/material/rods/attack_self(mob/user) - add_fingerprint(user) - if(isturf(user.loc)) - place_grille(user, user.loc, src) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 9ce85118765..7c72b83c0bc 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -50,6 +50,15 @@ singular_name = "sheet" if(!plural_name) plural_name = text_make_plural(singular_name) + update_name() + +/obj/item/stack/update_name() + if(amount == 1) + gender = NEUTER + SetName(singular_name) + else + gender = PLURAL + SetName(plural_name) /obj/item/stack/Destroy() if (src && usr && usr.machine == src) @@ -291,6 +300,7 @@ for(var/i = 1 to charge_costs.len) var/datum/matter_synth/S = synths[i] S.use_charge(charge_costs[i] * used) // Doesn't need to be deleted + update_name() update_icon() return TRUE diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index a53c61d5bad..02e51277a75 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -66,75 +66,6 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME replacement_turf_type = /turf/floor/woven -/* - * Wood - */ -/obj/item/stack/tile/wood - name = "wood floor tile" - singular_name = "wood floor tile" - desc = "An easy to fit wooden floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_GENERIC - material = /decl/material/solid/organic/wood - -/obj/item/stack/tile/wood/cyborg - name = "wood floor tile synthesizer" - desc = "A device that makes wood floor tiles." - uses_charge = 1 - charge_costs = list(250) - stack_merge_type = /obj/item/stack/tile/wood - build_type = /obj/item/stack/tile/wood - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE - -/obj/item/stack/tile/mahogany - name = "mahogany floor tile" - singular_name = "mahogany floor tile" - desc = "An easy to fit mahogany wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_RICH - material = /decl/material/solid/organic/wood - -/obj/item/stack/tile/maple - name = "maple floor tile" - singular_name = "maple floor tile" - desc = "An easy to fit maple wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_PALE - material = /decl/material/solid/organic/wood - -/obj/item/stack/tile/ebony - name = "ebony floor tile" - singular_name = "ebony floor tile" - desc = "An easy to fit ebony floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_BLACK - material = /decl/material/solid/organic/wood - -/obj/item/stack/tile/walnut - name = "walnut floor tile" - singular_name = "walnut floor tile" - desc = "An easy to fit walnut wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_CHOCOLATE - material = /decl/material/solid/organic/wood - -/obj/item/stack/tile/bamboo - name = "bamboo floor tile" - singular_name = "bamboo floor tile" - desc = "An easy to fit bamboo wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_PALE2 - material = /decl/material/solid/organic/wood - -/obj/item/stack/tile/yew - name = "yew floor tile" - singular_name = "yew floor tile" - desc = "An easy to fit yew wood floor tile." - icon_state = "tile-wood" - color = WOOD_COLOR_YELLOW - material = /decl/material/solid/organic/wood - /obj/item/stack/tile/floor name = "steel floor tile" singular_name = "steel floor tile" @@ -285,7 +216,6 @@ /obj/item/stack/tile/carpet/on_update_icon() . = ..() - color = get_color() if(detail_color) set_overlays(overlay_image(icon, "[icon_state]-detail", detail_color, RESET_COLOR)) diff --git a/code/game/objects/items/stacks/tiles/tile_types_wooden.dm b/code/game/objects/items/stacks/tiles/tile_types_wooden.dm new file mode 100644 index 00000000000..a184391251f --- /dev/null +++ b/code/game/objects/items/stacks/tiles/tile_types_wooden.dm @@ -0,0 +1,53 @@ +#define WOOD_TILE_SUBTYPE(MAT_NAME, STACK_TYPE, MAT_TYPE) \ +/obj/item/stack/tile/wood/##STACK_TYPE { \ + name = MAT_NAME + " floor tile"; \ + singular_name = MAT_NAME + " floor tile"; \ + plural_name = MAT_NAME + " floor tiles"; \ + desc = "An easy-to-fit " + MAT_NAME + " floor tile."; \ + color = /decl/material/solid/organic/wood/MAT_TYPE::color; \ + material = /decl/material/solid/organic/wood/MAT_TYPE; \ +} + +/obj/item/stack/tile/wood/cyborg + name = "wood floor tile synthesizer" + singular_name = "wood floor tile" + desc = "A device that makes laminated wooden floor tiles." + uses_charge = 1 + charge_costs = list(250) + stack_merge_type = /obj/item/stack/tile/wood/laminate + build_type = /obj/item/stack/tile/wood/laminate + color = /decl/material/solid/organic/wood/chipboard::color + material = /decl/material/solid/organic/wood/chipboard + max_health = ITEM_HEALTH_NO_DAMAGE + is_spawnable_type = FALSE + +/obj/item/stack/tile/wood + abstract_type = /obj/item/stack/tile/wood + icon_state = "tile-wood" + +/obj/item/stack/tile/wood/laminate + abstract_type = /obj/item/stack/tile/wood/laminate + +/obj/item/stack/tile/wood/rough + abstract_type = /obj/item/stack/tile/wood/rough + +WOOD_TILE_SUBTYPE("oak", oak, oak) +WOOD_TILE_SUBTYPE("mahogany", mahogany, mahogany) +WOOD_TILE_SUBTYPE("maple", maple, maple) +WOOD_TILE_SUBTYPE("ebony", ebony, ebony) +WOOD_TILE_SUBTYPE("walnut", walnut, walnut) +WOOD_TILE_SUBTYPE("bamboo", bamboo, bamboo) +WOOD_TILE_SUBTYPE("yew", yew, yew) +WOOD_TILE_SUBTYPE("rough oak", rough/oak, oak) +WOOD_TILE_SUBTYPE("rough mahogany", rough/mahogany, mahogany) +WOOD_TILE_SUBTYPE("rough maple", rough/maple, maple) +WOOD_TILE_SUBTYPE("rough ebony", rough/ebony, ebony) +WOOD_TILE_SUBTYPE("rough walnut", rough/walnut, walnut) +WOOD_TILE_SUBTYPE("rough bamboo", rough/bamboo, bamboo) +WOOD_TILE_SUBTYPE("rough yew", rough/yew, yew) +WOOD_TILE_SUBTYPE("oak laminate", laminate/oak, chipboard) +WOOD_TILE_SUBTYPE("mahogany laminate", laminate/mahogany, chipboard/mahogany) +WOOD_TILE_SUBTYPE("maple laminate", laminate/maple, chipboard/maple) +WOOD_TILE_SUBTYPE("ebony laminate", laminate/ebony, chipboard/ebony) +WOOD_TILE_SUBTYPE("walnut laminate", laminate/walnut, chipboard/walnut) +WOOD_TILE_SUBTYPE("yew laminate", laminate/yew, chipboard/yew) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 78dd90338f6..53ec5ef987f 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -145,7 +145,7 @@ name = "toy sword" desc = "A cheap, plastic replica of an energy sword. Realistic sounds! Ages 8 and up." sharp = FALSE - edge = FALSE + edge = FALSE attack_verb = list("hit") material = /decl/material/solid/organic/plastic active_hitsound = 'sound/weapons/genhit.ogg' @@ -497,8 +497,8 @@ 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/organic/plastic/foam - edge = 0 - sharp = 0 + edge = FALSE + sharp = FALSE /obj/item/inflatable_duck //#TODO: Move under obj/item/toy ? name = "inflatable duck" @@ -526,13 +526,13 @@ /obj/item/marshalling_wand/attack_self(mob/user) playsound(src.loc, 'sound/effects/rustle1.ogg', 100, 1) - if (user.a_intent == I_HELP) + if (user.check_intent(I_FLAG_HELP)) user.visible_message("[user] beckons with \the [src], signalling forward motion.", "You beckon with \the [src], signalling forward motion.") - else if (user.a_intent == I_DISARM) + else if (user.check_intent(I_FLAG_DISARM)) user.visible_message("[user] holds \the [src] above their head, signalling a stop.", "You hold \the [src] above your head, signalling a stop.") - else if (user.a_intent == I_GRAB) + else if (user.check_intent(I_FLAG_GRAB)) var/wand_dir if(user.get_equipped_item(BP_L_HAND) == src) wand_dir = "left" @@ -542,7 +542,7 @@ wand_dir = pick("left", "right") user.visible_message("[user] waves \the [src] to the [wand_dir], signalling a turn.", "You wave \the [src] to the [wand_dir], signalling a turn.") - else if (user.a_intent == I_HURT) + else if (user.check_intent(I_FLAG_HARM)) user.visible_message("[user] frantically waves \the [src] above their head!", "You frantically wave \the [src] above your head!") @@ -562,13 +562,13 @@ /obj/item/toy/ringbell/attack_hand(mob/user) if(!user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) return ..() - if (user.a_intent == I_HELP) + if (user.check_intent(I_FLAG_HELP)) user.visible_message("[user] rings \the [src], signalling the beginning of the contest.") playsound(user.loc, 'sound/items/oneding.ogg', 60) - else if (user.a_intent == I_DISARM) + else if (user.check_intent(I_FLAG_DISARM)) user.visible_message("[user] rings \the [src] three times, signalling the end of the contest!") playsound(user.loc, 'sound/items/threedings.ogg', 60) - else if (user.a_intent == I_HURT) + else if (user.check_intent(I_FLAG_HARM)) user.visible_message("[user] rings \the [src] repeatedly, signalling a disqualification!") playsound(user.loc, 'sound/items/manydings.ogg', 60) return TRUE diff --git a/code/game/objects/items/training_dummy.dm b/code/game/objects/items/training_dummy.dm new file mode 100644 index 00000000000..d870699ddd1 --- /dev/null +++ b/code/game/objects/items/training_dummy.dm @@ -0,0 +1,176 @@ +// Used in conjunction with /obj/structure/target_stake. +/obj/item/training_dummy + name = "shooting target" + desc = "A shooting target." + icon = 'icons/obj/items/training_dummies/standard.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/metal/aluminium + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + max_health = 1800 + appearance_flags = KEEP_TOGETHER // Needed for BLEND_INSET_OVERLAY on the decals. + + // Burn/bullet hole/dent decals to apply to our icon. + var/list/decals + var/const/MAX_DECALS = 250 + + // Very crude bounding box; we do pixel-precise checking within these ranges. + var/decal_min_x = 7 + var/decal_min_y = 3 + var/decal_range_x = 17 + var/decal_range_y = 25 + +/obj/item/training_dummy/proc/get_damage_decal_icon() + return 'icons/obj/items/training_dummies/damage.dmi' + +// Can't repair cloth, straw or plastic targets currently. +/obj/item/training_dummy/proc/can_repair_with(obj/item/thing) + return IS_WELDER(thing) && istype(material, /decl/material/solid/metal) + +/obj/item/training_dummy/proc/perform_repair(mob/user, obj/item/tool) + var/obj/item/weldingtool/welder = tool + if(!istype(welder) || !welder.isOn()) + to_chat(user, SPAN_WARNING("Turn \the [welder] on first.")) + return FALSE + return tool.do_tool_interaction(TOOL_WELDER, user, src, 2 SECONDS) + +/obj/item/training_dummy/proc/repair_target_dummy(obj/item/used_item, mob/user) + + if(!can_repair_with(used_item)) + return FALSE + + var/max_health = get_max_health() + if(current_health >= max_health) + to_chat(user, SPAN_NOTICE("\The [src] doesn't need repairs.")) + return TRUE + + if(perform_repair(user, used_item)) + current_health += rand(100,200) // They have a lot of HP. + if(LAZYLEN(decals)) + if(current_health >= get_max_health()) + current_health = get_max_health() + LAZYCLEARLIST(decals) + else + var/remove_decal = pick(decals) + LAZYREMOVE(decals, remove_decal) + update_icon() + return TRUE + + return FALSE + +/obj/item/training_dummy/attackby(obj/item/used_item, mob/user) + if(repair_target_dummy(used_item, user)) + return TRUE + return ..() + +/obj/item/training_dummy/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + + var/old_health = current_health + . = ..() + if(QDELETED(src) || old_health == current_health) + return + + if(damage <= 0) + update_icon() + return + + if(LAZYLEN(decals) >= MAX_DECALS) + return + + var/decal_icon = get_damage_decal_icon() + if(!decal_icon) + return + + var/decal_state + if(damage_type == BURN) + if(damage < 10) + decal_state = "light_scorch" + else + decal_state = "scorch" + else if(damage_type == BRUTE) + if(damage < 10) + decal_state = "dent" + else + decal_state = "bhole" + else + return + + var/image/new_decal = image(decal_icon, decal_state) + new_decal.blend_mode = BLEND_INSET_OVERLAY + new_decal = apply_decal_offsets(new_decal) + if(new_decal) + LAZYADD(decals, new_decal) + update_icon() + +/obj/item/training_dummy/proc/apply_decal_offsets(image/decal) + + // Static list cache for this broke immediately, so seems like we need a fresh icon every time. + // At least it isn't being assigned anywhere so shouldn't cause network overhead. + var/icon/check_icon = icon(icon, icon_state) + if(!check_icon) + return + + var/use_pixel_x + var/use_pixel_y + var/sanity = 100 + while(sanity) + sanity-- + use_pixel_x = decal_min_x + rand(decal_range_x) + use_pixel_y = decal_min_y + rand(decal_range_y) + var/check_pixel = check_icon.GetPixel(use_pixel_x, use_pixel_y) + // Pixel has a colour and no alpha component; we are good. + if(istext(check_pixel) && length(check_pixel) == 7) + break + + if(!sanity || !isnum(use_pixel_x) || use_pixel_x < 0 || !isnum(use_pixel_y) || use_pixel_y < 0) + return + + decal.pixel_x = use_pixel_x + decal.pixel_y = use_pixel_y + return decal + +/obj/item/training_dummy/on_update_icon() + . = ..() + if(LAZYLEN(decals)) + if(current_health >= get_max_health()) + LAZYCLEARLIST(decals) + else + set_overlays(decals.Copy()) + if(istype(loc, /obj/structure/target_stake)) + compile_overlays() // We need to update our loc immediately. + loc.update_icon() + +/obj/item/training_dummy/syndicate + icon = 'icons/obj/items/training_dummies/syndicate.dmi' + desc = "A shooting target that looks like a hostile agent." + decal_min_x = 7 + decal_min_y = 2 + decal_range_x = 18 + decal_range_y = 30 + +/obj/item/training_dummy/alien + icon = 'icons/obj/items/training_dummies/alien.dmi' + desc = "A shooting target with a threatening silhouette." + decal_min_x = 7 + decal_min_y = 2 + decal_range_x = 18 + decal_range_y = 30 + +/obj/item/training_dummy/straw + name = "training dummy" + icon = 'icons/obj/items/training_dummies/straw.dmi' + desc = "A roughly humanoid shape used for melee practice." + material = /decl/material/solid/organic/plantmatter/grass/dry + material_alteration = MAT_FLAG_ALTERATION_ALL + decal_min_x = 8 + decal_min_y = 12 + decal_range_x = 16 + decal_range_y = 17 + +/obj/item/training_dummy/straw/archery + name = "archery butt" + icon = 'icons/obj/items/training_dummies/archery.dmi' + desc = "A thick circular mat used for archery practice." + decal_min_x = 7 + decal_min_y = 5 + decal_range_x = 19 + decal_range_y = 21 diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index bf4bfab6f1b..8c88b8edc0d 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -10,15 +10,12 @@ var/age = 0 /obj/item/trash/Initialize(mapload, var/_age) + if(!mapload) + SSpersistence.track_value(src, /decl/persistence_handler/filth/trash) . = ..(mapload) if(!isnull(_age)) age = _age -/obj/item/trash/Initialize(var/ml) - if(!ml) - SSpersistence.track_value(src, /decl/persistence_handler/filth/trash) - . = ..() - /obj/item/trash/Destroy() SSpersistence.forget_value(src, /decl/persistence_handler/filth/trash) . = ..() diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index 298388f36ec..73852feaef0 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -1,4 +1,4 @@ -/obj/item/chems/waterskin +/obj/item/chems/glass/waterskin name = "waterskin" desc = "A water-carrying vessel made from the dried stomach of some unfortunate animal." icon = 'icons/obj/items/waterskin.dmi' @@ -10,38 +10,40 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME var/decl/material/stopper_material = /decl/material/solid/organic/cloth/hemp -/obj/item/chems/waterskin/proc/get_stopper_message() +/obj/item/chems/glass/waterskin/can_lid() + return FALSE // We handle it in attack_self(). + +/obj/item/chems/glass/waterskin/proc/get_stopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You tie the neck of \the [src] closed with \a [stopper_material_instance.adjective_name] cord." -/obj/item/chems/waterskin/proc/get_unstopper_message() +/obj/item/chems/glass/waterskin/proc/get_unstopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You untie \the [stopper_material_instance.adjective_name] cord from around the neck of \the [src]." -/obj/item/chems/waterskin/proc/get_stopper_overlay() +/obj/item/chems/glass/waterskin/proc/get_stopper_overlay() if(ATOM_IS_OPEN_CONTAINER(src)) return null var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return overlay_image(icon, "[icon_state]-stopper", stopper_material_instance.color, RESET_COLOR | RESET_ALPHA) -/obj/item/chems/waterskin/attack_self() - . = ..() - if(!.) - if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE(get_stopper_message())) - atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER - else - to_chat(usr, SPAN_NOTICE(get_unstopper_message())) - atom_flags |= ATOM_FLAG_OPEN_CONTAINER - update_icon() +/obj/item/chems/glass/waterskin/attack_self() + if(ATOM_IS_OPEN_CONTAINER(src)) + to_chat(usr, SPAN_NOTICE(get_stopper_message())) + atom_flags &= ~ATOM_FLAG_OPEN_CONTAINER + else + to_chat(usr, SPAN_NOTICE(get_unstopper_message())) + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + update_icon() + return TRUE -/obj/item/chems/waterskin/on_update_icon() // TODO: filled/empty sprites +/obj/item/chems/glass/waterskin/on_update_icon() // TODO: filled/empty sprites . = ..() // cuts overlays var/image/stopper_overlay = get_stopper_overlay() if(stopper_overlay) add_overlay(stopper_overlay) -/obj/item/chems/waterskin/crafted +/obj/item/chems/glass/waterskin/crafted desc = "A long and rather unwieldly water-carrying vessel." icon = 'icons/obj/items/waterskin_crafted.dmi' material = /decl/material/solid/organic/leather @@ -49,17 +51,17 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC stopper_material = /decl/material/solid/organic/wood/maple -/obj/item/chems/waterskin/crafted/get_stopper_message() +/obj/item/chems/glass/waterskin/crafted/get_stopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You insert \a [stopper_material_instance.adjective_name] stopper in the neck of \the [src]." -/obj/item/chems/waterskin/crafted/get_unstopper_message() +/obj/item/chems/glass/waterskin/crafted/get_unstopper_message() var/decl/material/stopper_material_instance = GET_DECL(stopper_material) return "You remove \the [stopper_material_instance.adjective_name] stopper from the neck of \the [src]." -/obj/item/chems/waterskin/crafted/wine +/obj/item/chems/glass/waterskin/crafted/wine name = "wineskin" -/obj/item/chems/waterskin/crafted/wine/populate_reagents() +/obj/item/chems/glass/waterskin/crafted/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents?.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents?.maximum_volume) diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 8e40d1f38f8..f48b28762d0 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -32,6 +32,7 @@ var/decl/hierarchy/h = GET_DECL(/decl/hierarchy/rcd_mode) work_modes = h.children work_mode = work_modes[1] + update_icon() //Initializes the ammo counter /obj/item/rcd/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) return FALSE @@ -45,10 +46,6 @@ to_chat(user, "The current mode is '[work_mode]'.") to_chat(user, "It currently holds [stored_matter]/[max_stored_matter] matter-units.") -/obj/item/rcd/Initialize() - . = ..() - update_icon() //Initializes the ammo counter - /obj/item/rcd/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/rcd_ammo)) var/obj/item/rcd_ammo/cartridge = W diff --git a/code/game/objects/items/weapons/broom.dm b/code/game/objects/items/weapons/broom.dm index 29c016a2418..aaa799ed5a8 100644 --- a/code/game/objects/items/weapons/broom.dm +++ b/code/game/objects/items/weapons/broom.dm @@ -39,19 +39,27 @@ /obj/item/staff/broom/resolve_attackby(atom/A, mob/user, click_params) - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) // Sweep up dirt. if(isturf(A)) + var/turf/cleaning = A + var/dirty = cleaning.get_dirt() if(dirty > 10) // a small amount so that you can't sweep immediately after someone walks somewhere user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.visible_message(SPAN_NOTICE("\The [user] sweeps \the [A].")) playsound(A, "sweeping", 100, TRUE) cleaning.remove_dirt(min(dirty, rand(20,30))) - else - to_chat(user, SPAN_WARNING("\The [cleaning] is not in need of sweeping.")) + return TRUE + + var/obj/effect/footprints/prints = locate() in cleaning + if(prints) + user.visible_message(SPAN_NOTICE("\The [user] sweeps away the footprints.")) + return TRUE + + to_chat(user, SPAN_WARNING("\The [cleaning] is not in need of sweeping.")) return TRUE // Sweep up dry spills. diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index 75851fa02da..37020adb925 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -131,7 +131,7 @@ if(choice && CanUseTopic(user, state)) src.icon_state = choice.icon_state src.item_state = choice.item_state - src.color = choice.color + set_color(choice.color) src.detail_color = choice.detail_color src.extra_details = choice.extra_details update_icon() diff --git a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm index fe637a0b0dd..0498af95839 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm @@ -7,19 +7,6 @@ var/sensor_name var/list/sensor_information = list() -/obj/item/stock_parts/circuitboard/air_management/supermatter_core - name = "circuitboard (core control)" - build_path = /obj/machinery/computer/air_control/supermatter_core - frequency = 1438 - var/input_tag - var/output_tag - - var/list/input_info = list() - var/list/output_info = list() - - var/input_flow_setting = 700 - var/pressure_setting = 100 - /obj/item/stock_parts/circuitboard/air_management/injector_control name = "circuitboard (injector control)" build_path = /obj/machinery/computer/air_control/fuel_injection @@ -42,18 +29,6 @@ C.sensor_info = sensor_information.Copy() return 1 -/obj/item/stock_parts/circuitboard/air_management/supermatter_core/construct(var/obj/machinery/computer/air_control/supermatter_core/SC) - if(..(SC)) - SC.input_tag = input_tag - SC.output_tag = output_tag - - SC.input_info = input_info.Copy() - SC.output_info = output_info.Copy() - - SC.input_flow_setting = input_flow_setting - SC.pressure_setting = input_flow_setting - return 1 - /obj/item/stock_parts/circuitboard/air_management/injector_control/construct(var/obj/machinery/computer/air_control/fuel_injection/FI) if(..(FI)) FI.device_tag = device_tag @@ -75,18 +50,6 @@ sensor_information = C.sensor_info.Copy() return 1 -/obj/item/stock_parts/circuitboard/air_management/supermatter_core/deconstruct(var/obj/machinery/computer/air_control/supermatter_core/SC) - if(..(SC)) - input_tag = SC.input_tag - output_tag = SC.output_tag - - input_info = SC.input_info.Copy() - output_info = SC.output_info.Copy() - - input_flow_setting = SC.input_flow_setting - pressure_setting = SC.input_flow_setting - return 1 - /obj/item/stock_parts/circuitboard/air_management/injector_control/deconstruct(var/obj/machinery/computer/air_control/fuel_injection/FI) if(..(FI)) device_tag = FI.device_tag diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm index 9c8b800d3c1..c013c88bdf5 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm @@ -91,6 +91,10 @@ /obj/item/stock_parts/circuitboard/design_console name = "circuitboard (design database console)" build_path = /obj/machinery/computer/design_console + additional_spawn_components = list( + /obj/item/stock_parts/power/apc/buildable = 1, + /obj/item/stock_parts/item_holder/disk_reader/buildable = 1, + ) /obj/item/stock_parts/circuitboard/central_atmos name = "circuitboard (central atmospherics computer)" diff --git a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm b/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm index 44377add2c0..1d9cccaf50b 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm @@ -1,5 +1,5 @@ /obj/item/stock_parts/circuitboard/reagent_heater - name = "circuitboard (chemical heater)" + name = "circuitboard (hotplate)" build_path = /obj/machinery/reagent_temperature board_type = "machine" origin_tech = @'{"powerstorage":2,"engineering":1}' diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 5d31dd554da..efe256ceef4 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -265,6 +265,7 @@ req_components = list() additional_spawn_components = list( /obj/item/stock_parts/power/apc/buildable = 1, + /obj/item/stock_parts/item_holder/disk_reader/buildable = 1, /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1 ) \ 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 d147fbe340c..b4b580c4a9b 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -59,7 +59,7 @@ if(!limb) return ..() var/target_zone = user.get_target_zone() - if(user.a_intent == I_HELP && target_zone != apply_to_zone && istype(limb, /obj/item/organ/external/head)) + if(user.check_intent(I_FLAG_HELP) && target_zone != apply_to_zone && istype(limb, /obj/item/organ/external/head)) var/obj/item/organ/external/head/head = limb head.write_on(user, name) return TRUE diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 18ed460f4b2..cdaab55ecaa 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -195,6 +195,7 @@ max_health = ITEM_HEALTH_NO_DAMAGE _base_attack_force = 2 can_be_twohanded = TRUE + minimum_size_to_twohand = MOB_SIZE_SMALL var/safety = 1 //if you can zap people with the paddles on harm mode var/combat = 0 //If it can be used to revive people wearing thick clothing (e.g. spacesuits) @@ -282,7 +283,7 @@ return 0 /obj/item/shockpaddles/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(!ishuman(target) || user.a_intent == I_HURT) + if(!ishuman(target) || user.check_intent(I_FLAG_HARM)) return ..() //Do a regular attack. Harm intent shocking happens as a hit effect var/mob/living/human/H = target if(can_use(user, H)) diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index dc05320c090..0a55a70a950 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -22,6 +22,10 @@ ec_cartridge = new cartridge_type(src) . = ..() +/obj/item/clothing/mask/smokable/ecig/Destroy() + QDEL_NULL(ec_cartridge) + return ..() + /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 diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 9c0239a12aa..cc1018b1639 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -94,7 +94,7 @@ // Make sure our user is still holding us if(user && user.get_active_held_item() == src) - if(user.a_intent == I_HELP) //don't shoot if we're on help intent + if(user.check_intent(I_FLAG_HELP)) //don't shoot if we're on help intent to_chat(user, SPAN_WARNING("You refrain from firing \the [src] as your intent is set to help.")) return @@ -296,7 +296,7 @@ target.create_fire(tank.air_contents.temperature * 2 + 400) target.hotspot_expose(1000, 100) for(var/mob/living/M in target) - M.IgniteMob(1) + M.ignite_fire() // slightly weird looking initialize cuz it has to do some stuff first /obj/item/flamethrower/full/Initialize() 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 a9fdaf0deab..19054df59bd 100644 --- a/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm +++ b/code/game/objects/items/weapons/grenades/anti_photon_grenade.dm @@ -18,5 +18,4 @@ /obj/item/grenade/anti_photon/proc/finish() set_light(10, 10, rgb(rand(64,255), rand(64,255), rand(64,255))) playsound(loc, 'sound/effects/bang.ogg', 50, 1, 5) - sleep(1 SECOND) - qdel(src) \ No newline at end of file + QDEL_IN(src, 1 SECOND) \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/decompiler.dm b/code/game/objects/items/weapons/grenades/decompiler.dm index e3918357a66..36592f51da2 100644 --- a/code/game/objects/items/weapons/grenades/decompiler.dm +++ b/code/game/objects/items/weapons/grenades/decompiler.dm @@ -5,7 +5,7 @@ origin_tech = @'{"materials":3,"magnets":2,"exoticmatter":3}' matter = list( /decl/material/solid/phoron = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/supermatter = MATTER_AMOUNT_TRACE + /decl/material/solid/exotic_matter = MATTER_AMOUNT_TRACE ) /obj/item/grenade/decompiler/detonate() diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index d16532308ee..1f91dc035d8 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -88,16 +88,16 @@ switch(det_time) if (1) det_time = 10 - to_chat(user, SPAN_NOTICE("You set the \the [src] for 1 second detonation time.")) + to_chat(user, SPAN_NOTICE("You set \the [src] for 1 second detonation time.")) if (10) det_time = 30 - to_chat(user, SPAN_NOTICE("You set the \the [src] for 3 second detonation time.")) + to_chat(user, SPAN_NOTICE("You set \the [src] for 3 second detonation time.")) if (30) det_time = 50 - to_chat(user, SPAN_NOTICE("You set the \the [src] for 5 second detonation time.")) + to_chat(user, SPAN_NOTICE("You set \the [src] for 5 second detonation time.")) if (50) det_time = 1 - to_chat(user, SPAN_NOTICE("You set the \the [src] for instant detonation.")) + to_chat(user, SPAN_NOTICE("You set \the [src] for instant detonation.")) add_fingerprint(user) return TRUE return ..() diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 8df73ff611f..a636763ac07 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -1,5 +1,5 @@ /obj/item/grenade/spawnergrenade - desc = "It is set to detonate in 5 seconds. It will unleash unleash an unspecified anomaly into the vicinity." + desc = "It is set to detonate in 5 seconds. It will unleash an unspecified anomaly into the vicinity." name = "delivery grenade" icon = 'icons/obj/items/grenades/delivery.dmi' origin_tech = @'{"materials":3,"magnets":4}' diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index fe6ac6673c9..41b4cae00d9 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -34,7 +34,7 @@ var/obj/item/clothing/mask/smokable/cigarette/cig = W if (cig.lit == 1) visible_message(SPAN_NOTICE("\The [user] crushes \the [cig] in \the [src], putting it out.")) - W = cig.extinguish(no_message = 1) + W = cig.extinguish_fire(no_message = TRUE) else if (cig.lit == 0) to_chat(user, SPAN_NOTICE("You place \the [cig] in \the [src] without even smoking it. Why would you do that?")) else diff --git a/code/game/objects/items/weapons/material/bell.dm b/code/game/objects/items/weapons/material/bell.dm index e07f7f913d8..05c21a0f309 100644 --- a/code/game/objects/items/weapons/material/bell.dm +++ b/code/game/objects/items/weapons/material/bell.dm @@ -10,10 +10,10 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME /obj/item/bell/attack_hand(mob/user) - if(user.a_intent == I_GRAB) + if(user.check_intent(I_FLAG_GRAB)) return ..() - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) user.visible_message("\The [user] hammers \the [src]!") playsound(user.loc, 'sound/items/manydings.ogg', 60) else diff --git a/code/game/objects/items/weapons/material/folding.dm b/code/game/objects/items/weapons/material/folding.dm index 46a631afe6d..38cfa3a2476 100644 --- a/code/game/objects/items/weapons/material/folding.dm +++ b/code/game/objects/items/weapons/material/folding.dm @@ -29,15 +29,14 @@ /obj/item/knife/folding/update_attack_force() ..() if(open) - // TODO: check sharp/edge. - edge = TRUE - sharp = TRUE + set_edge(TRUE) + set_sharp(TRUE) w_class = ITEM_SIZE_NORMAL attack_verb = list("slashed", "stabbed") ..() else - edge = initial(edge) - sharp = initial(sharp) + set_edge(initial(edge)) + set_sharp(initial(sharp)) w_class = initial(w_class) attack_verb = closed_attack_verbs diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index bd592ca5a83..b33cef4f1c8 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -12,7 +12,7 @@ desc = "Used to knock out the Bartender." icon_state = "rolling_pin" attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/kitchen/rollingpin/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50) && user.try_unequip(src)) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 71eddb9f95a..9df9b46dc09 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -39,7 +39,7 @@ /obj/item/knife/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(user.a_intent != I_HELP && user.get_target_zone() == BP_EYES) + if(!user.check_intent(I_FLAG_HELP) && user.get_target_zone() == BP_EYES) if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) target = user return eyestab(target, user) @@ -52,7 +52,7 @@ 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/organic/wood + material = /decl/material/solid/organic/wood/oak 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 ca46b180bfa..8040747110e 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -1,8 +1,8 @@ /obj/item/harpoon name = "harpoon" desc = "A short throwing spear with a deep barb, specifically designed to embed itself in its target." - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE icon = 'icons/obj/items/weapon/harpoon.dmi' icon_state = "harpoon" item_state = "harpoon" @@ -47,8 +47,8 @@ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow." icon = 'icons/obj/items/tool/scythe.dmi' icon_state = ICON_STATE_WORLD - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE throw_speed = 1 throw_range = 3 w_class = ITEM_SIZE_HUGE @@ -67,7 +67,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/organic/wood + material = /decl/material/solid/organic/wood/oak /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 0f7ba375f55..4150bd92532 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -6,8 +6,8 @@ desc = "Made of nothing. How does this even exist?" // set based on material, if this desc is visible it's a bug (shards default to being made of glass) icon_state = "large" randpixel = 8 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE w_class = ITEM_SIZE_SMALL item_state = "shard-glass" attack_verb = list("stabbed", "slashed", "sliced", "cut") @@ -51,12 +51,10 @@ /obj/item/shard/on_update_icon() . = ..() - if(material) - // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity - alpha = 255 * (1 - (1 - material.opacity)*(1 - material.opacity)) - else - color = "#ffffff" - alpha = 255 + // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity + alpha = 255 * (material ? (1 - (1 - material.opacity)**2) : 1) + if(has_handle) + add_overlay(overlay_image(icon, "handle", has_handle, RESET_COLOR)) /obj/item/shard/attackby(obj/item/W, mob/user) if(IS_WELDER(W) && material.shard_can_repair) @@ -84,41 +82,38 @@ return TRUE return ..() -/obj/item/shard/on_update_icon() - . = ..() - if(has_handle) - add_overlay(overlay_image(icon, "handle", has_handle, RESET_COLOR)) - /obj/item/shard/Crossed(atom/movable/AM) ..() if(!isliving(AM)) return - var/mob/living/M = AM - if(M.buckled) //wheelchairs, office chairs, rollerbeds + var/mob/living/victim = AM + if(victim.buckled) //wheelchairs, office chairs, rollerbeds + return + if(victim.immune_to_floor_hazards()) 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.get_shock_vulnerability(M) < 0.5 || (walker_species.species_flags & (SPECIES_FLAG_NO_EMBED|SPECIES_FLAG_NO_MINOR_CUT)))) //Thick skin. + var/decl/species/walker_species = victim.get_species() + if(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) + var/obj/item/shoes = victim.get_equipped_item(slot_shoes_str) + var/obj/item/suit = victim.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) + var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(victim, picked) if(!affecting || BP_IS_PROSTHETIC(affecting)) continue - to_chat(M, SPAN_DANGER("You step on \the [src]!")) + to_chat(victim, 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) + SET_STATUS_MAX(victim, STAT_WEAK, 3) return //Prevent the shard from being allowed to shatter diff --git a/code/game/objects/items/weapons/material/stick.dm b/code/game/objects/items/weapons/material/stick.dm index ff4248fbc7b..d752ca73f46 100644 --- a/code/game/objects/items/weapons/material/stick.dm +++ b/code/game/objects/items/weapons/material/stick.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/stick.dmi' icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak attack_verb = list("poked", "jabbed") material_alteration = MAT_FLAG_ALTERATION_ALL lock_picking_level = 3 @@ -16,9 +16,9 @@ /obj/item/stick/attackby(obj/item/W, mob/user) - if(W.sharp && W.edge && !sharp) + if(W.is_sharp() && W.has_edge() && !sharp) user.visible_message("[user] sharpens [src] with [W].", "You sharpen [src] using [W].") - sharp = 1 //Sharpen stick + set_sharp(TRUE) SetName("sharpened " + name) update_attack_force() return TRUE @@ -63,7 +63,7 @@ return ..() /obj/item/stick/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(user != target && user.a_intent == I_HELP) + if(user != target && user.check_intent(I_FLAG_HELP)) //Playful poking is its own thing user.visible_message( SPAN_NOTICE("\The [user] pokes \the [target] with \the [src]."), diff --git a/code/game/objects/items/weapons/material/swiss.dm b/code/game/objects/items/weapons/material/swiss.dm index 5cb933d6236..44f237dc853 100644 --- a/code/game/objects/items/weapons/material/swiss.dm +++ b/code/game/objects/items/weapons/material/swiss.dm @@ -53,7 +53,7 @@ /obj/item/knife/folding/swiss/attack_self(mob/user) var/choice - if(user.a_intent != I_HELP && ((SWISSKNF_LBLADE in tools) || (SWISSKNF_SBLADE in tools)) && active_tool == SWISSKNF_CLOSED) + if(!user.check_intent(I_FLAG_HELP) && ((SWISSKNF_LBLADE in tools) || (SWISSKNF_SBLADE in tools)) && active_tool == SWISSKNF_CLOSED) open = TRUE if(SWISSKNF_LBLADE in tools) choice = SWISSKNF_LBLADE @@ -102,8 +102,8 @@ else siemens_coefficient = initial(siemens_coefficient) else - edge = initial(edge) - sharp = initial(sharp) + set_edge(initial(edge)) + set_sharp(initial(sharp)) attack_verb = closed_attack_verbs siemens_coefficient = initial(siemens_coefficient) diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index 555aabe275c..094dd9767a2 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -7,8 +7,8 @@ w_class = ITEM_SIZE_LARGE item_flags = ITEM_FLAG_IS_WEAPON armor_penetration = 10 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' base_parry_chance = 50 @@ -22,13 +22,13 @@ /obj/item/edge/set_edge(new_edge) . = ..() - if(. && !edge) + if(. && !has_edge()) attack_verb = list("attacked", "stabbed", "jabbed", "smacked", "prodded") hitsound = 'sound/weapons/pierce.ogg' /obj/item/sword/set_sharp(new_sharp) . = ..() - if(. && !sharp) + if(. && !is_sharp()) attack_verb = list("attacked", "smashed", "jabbed", "smacked", "prodded", "bonked") hitsound = "chop" @@ -47,7 +47,7 @@ . = ..() /obj/item/sword/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak draw_handle = FALSE /obj/item/sword/replica @@ -72,7 +72,7 @@ draw_handle = FALSE /obj/item/sword/katana/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak 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 e42d4638695..7e878a0ac20 100644 --- a/code/game/objects/items/weapons/material/thrown.dm +++ b/code/game/objects/items/weapons/material/thrown.dm @@ -6,8 +6,8 @@ randpixel = 12 throw_speed = 10 throw_range = 15 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE material = /decl/material/solid/metal/steel material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME item_flags = ITEM_FLAG_IS_WEAPON @@ -25,5 +25,5 @@ /obj/item/star/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) user.mob_throw_item(target, src) diff --git a/code/game/objects/items/weapons/material/urn.dm b/code/game/objects/items/weapons/material/urn.dm index c3183ae361b..fe640bd26a4 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/organic/wood + material = /decl/material/solid/organic/wood/oak /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 47de3c87b7b..bfc53022ae6 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -13,8 +13,6 @@ _base_attack_force = 3 // bonk throw_speed = 1 throw_range = 5 - sharp = 0 - edge = 0 armor_penetration = 0 material = /decl/material/solid/metal/steel @@ -90,8 +88,8 @@ if(active) obj_flags |= OBJ_FLAG_NO_STORAGE - sharp = active_sharp - edge = active_edge + set_sharp(active_sharp) + set_edge(active_edge) base_parry_chance = active_parry_chance armor_penetration = active_armour_pen hitsound = active_hitsound @@ -105,8 +103,8 @@ else obj_flags &= ~OBJ_FLAG_NO_STORAGE - sharp = initial(sharp) - edge = initial(edge) + set_sharp(initial(sharp)) + set_edge(initial(edge)) base_parry_chance = initial(base_parry_chance) armor_penetration = initial(armor_penetration) hitsound = initial(hitsound) diff --git a/code/game/objects/items/weapons/melee/energy_axe.dm b/code/game/objects/items/weapons/melee/energy_axe.dm index e70d70971f5..e7845e08985 100644 --- a/code/game/objects/items/weapons/melee/energy_axe.dm +++ b/code/game/objects/items/weapons/melee/energy_axe.dm @@ -12,8 +12,8 @@ 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 - edge = 1 + sharp = TRUE + edge = TRUE base_parry_chance = 30 active_parry_chance = 30 melee_accuracy_bonus = 15 diff --git a/code/game/objects/items/weapons/melee/energy_sword.dm b/code/game/objects/items/weapons/melee/energy_sword.dm index 3d20dd638d3..045040acb76 100644 --- a/code/game/objects/items/weapons/melee/energy_sword.dm +++ b/code/game/objects/items/weapons/melee/energy_sword.dm @@ -20,9 +20,6 @@ if(!lighting_color) lighting_color = blade_color . = ..() - -/obj/item/energy_blade/sword/Initialize() - . = ..() set_extension(src, /datum/extension/demolisher/energy) /obj/item/energy_blade/sword/is_special_cutting_tool(var/high_power) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 6520154a48c..e46bd9dddc4 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -7,12 +7,16 @@ throw_range = 10 w_class = ITEM_SIZE_NORMAL attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak matter = list( /decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY, ) var/mopspeed = 40 - var/list/moppable_types = list( + var/static/list/moppable_types + +/obj/item/mop/proc/populate_moppable_types() + moppable_types = list( + /turf/floor, /obj/effect/decal/cleanable, /obj/structure/catwalk ) @@ -20,6 +24,8 @@ /obj/item/mop/Initialize() . = ..() initialize_reagents() + if(!moppable_types) + populate_moppable_types() /obj/item/mop/initialize_reagents(populate = TRUE) create_reagents(30) @@ -27,45 +33,40 @@ /obj/item/mop/afterattack(atom/A, mob/user, proximity) if(!proximity) - return + return ..() + var/turf/moppable_turf = get_turf(A) + if(!istype(moppable_turf)) + return ..() - var/moppable - if(isturf(A)) - var/turf/T = A - if(T?.reagents?.total_volume > 0) - if(T.reagents.total_volume > FLUID_SHALLOW) + if(moppable_turf?.reagents?.total_volume > 0) + if(moppable_turf.reagents.total_volume > FLUID_SHALLOW) + to_chat(user, SPAN_WARNING("There is too much water here to be mopped up.")) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] begins to mop up \the [moppable_turf].")) + if(do_after(user, 40, moppable_turf) && !QDELETED(moppable_turf)) + if(moppable_turf.reagents?.total_volume > FLUID_SHALLOW) to_chat(user, SPAN_WARNING("There is too much water here to be mopped up.")) else - user.visible_message(SPAN_NOTICE("\The [user] begins to mop up \the [T].")) - if(do_after(user, 40, T) && !QDELETED(T)) - if(T.reagents?.total_volume > FLUID_SHALLOW) - to_chat(user, SPAN_WARNING("There is too much water here to be mopped up.")) - else - to_chat(user, SPAN_NOTICE("You have finished mopping!")) - T.reagents?.clear_reagents() - return - moppable = TRUE - - else if(is_type_in_list(A,moppable_types)) - moppable = TRUE - - if(moppable) - if(reagents.total_volume < 1) - to_chat(user, SPAN_WARNING("Your mop is dry!")) - return - var/turf/T = get_turf(A) - if(!T) - return - - var/trans_amt = FLUID_QDEL_POINT - if(user.a_intent == I_HURT) - trans_amt = round(FLUID_PUDDLE * 0.25) - user.visible_message(SPAN_DANGER("\The [user] begins to aggressively mop \the [T]!")) - else - user.visible_message(SPAN_NOTICE("\The [user] begins to clean \the [T].")) - if(do_after(user, mopspeed, T) && reagents?.total_volume) - reagents.splash(T, trans_amt) - to_chat(user, SPAN_NOTICE("You have finished mopping!")) + to_chat(user, SPAN_NOTICE("You have finished mopping!")) + moppable_turf.reagents?.clear_reagents() + return TRUE + + if(!is_type_in_list(A, moppable_types)) + return ..() + + if(reagents?.total_volume < 1) + to_chat(user, SPAN_WARNING("\The [src] is dry!")) + return TRUE + + if(user.check_intent(I_FLAG_HARM)) + user.visible_message(SPAN_DANGER("\The [user] begins to aggressively mop \the [moppable_turf]!")) + else + user.visible_message(SPAN_NOTICE("\The [user] begins to clean \the [moppable_turf].")) + if(do_after(user, mopspeed, moppable_turf) && reagents?.total_volume) + reagents.touch_turf(moppable_turf) + reagents.remove_any(1) + to_chat(user, SPAN_NOTICE("You have finished mopping!")) + return TRUE /obj/effect/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/mop) || istype(I, /obj/item/soap)) diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 0b2da5f210a..37304ae49fc 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -22,6 +22,12 @@ add_to_reagents(pigment, amt) add_to_reagents(/decl/material/liquid/paint, amt) +/obj/item/chems/glass/paint/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/paint/get_utensil_food_type() + return null + /obj/item/chems/glass/paint/on_update_icon() . = ..() if(reagents?.total_volume) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index c7443568027..81ae83daba0 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -250,7 +250,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar /obj/structure/tape_barricade/proc/update_neighbors(var/location = loc) for (var/look_dir in global.cardinal) var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, get_step(location, look_dir)) - if(B && !QDELETED(B)) + if(!QDELETED(B)) B.update_icon() if(!QDELETED(src)) @@ -261,10 +261,11 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar neighbors = 0 for (var/look_dir in global.cardinal) var/turf/target_turf = get_step(src, look_dir) - var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade, target_turf) - //We connect to walls and other tape_barricades - if((B && !QDELETED(B)) || (!B && target_turf?.is_wall())) - neighbors |= look_dir + if(target_turf) + var/obj/structure/tape_barricade/B = locate(/obj/structure/tape_barricade) in target_turf + //We connect to walls and other tape_barricades + if((B && !QDELETED(B)) || (!B && target_turf.is_wall())) + neighbors |= look_dir /**Allow sutypes to override with their own forced icon state name.*/ /obj/structure/tape_barricade/proc/icon_name_override() @@ -316,12 +317,12 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar /obj/structure/tape_barricade/attack_hand(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) user.visible_message(SPAN_DANGER("\The [user] tears \the [src]!")) physically_destroyed() return TRUE - if (user.a_intent != I_HELP || !allowed(user) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) + if (!user.check_intent(I_FLAG_HELP) || !allowed(user) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) return ..() if(TAPE_BARRICADE_IS_CORNER_NEIGHBORS(neighbors) || (TAPE_BARRICADE_GET_NB_NEIGHBORS(neighbors) > 2)) @@ -349,7 +350,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar /obj/structure/tape_barricade/CanPass(atom/movable/mover, turf/target, height, air_group) if(!is_lifted && ismob(mover)) var/mob/M = mover - if (!allowed(M) && M.a_intent == I_HELP) + if (!allowed(M) && M.check_intent(I_FLAG_HELP)) return FALSE return ..() @@ -362,7 +363,7 @@ var/global/list/image/hazard_overlays //Cached hazard floor overlays for the bar 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) + if(!M.check_intent(I_FLAG_HELP)) crumple() /obj/structure/tape_barricade/proc/crumple() diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm deleted file mode 100644 index 0b513dc546a..00000000000 --- a/code/game/objects/items/weapons/scrolls.dm +++ /dev/null @@ -1,50 +0,0 @@ -/obj/item/paper/scroll/teleportation - name = "scroll of teleportation" - desc = "A scroll for moving around." - origin_tech = @'{"wormholes":4}' - info = {" - Teleportation Scroll:
-
- Comes with four charges! Use them wisely.
- Kind regards,
Wizards Federation

P.S. Don't forget to bring your gear, you'll need it to cast most spells. - "} - var/uses = 4 - -/obj/item/paper/scroll/teleportation/examine(mob/user, distance) - . = ..() - if(distance <= 1) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(wizards.is_antagonist(user.mind)) - to_chat(user, SPAN_NOTICE("\The [src] has [uses] charge\s remaining.")) - -/obj/item/paper/scroll/teleportation/attack_self(mob/user) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(user, SPAN_WARNING("You stare at \the [src], but cannot make sense of the markings!")) - return TRUE - if(alert(user, "Do you wish to teleport using \the [src]? It has [uses] charge\s remaining.", "Scroll of Teleportation", "No", "Yes") == "Yes") - teleportscroll(user) - return TRUE - -/obj/item/paper/scroll/teleportation/proc/teleportscroll(var/mob/user) - if(uses <= 0) - return - - var/area/thearea = input(user, "Select an area to jump to.", "Scroll of Teleportation") as null|anything in wizteleportlocs - if(!thearea || QDELETED(src) || QDELETED(user) || user.get_active_held_item() != src || CanUseTopic(user) != STATUS_INTERACTIVE) - return - - thearea = thearea ? wizteleportlocs[thearea] : thearea - if(!thearea) - return - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, user.loc) - smoke.attach(user) - smoke.start() - var/turf/end = user.try_teleport(thearea) - if(!end) - to_chat(user, SPAN_WARNING("The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry!")) - return - smoke.start() - src.uses -= 1 diff --git a/code/game/objects/items/weapons/secrets_disk.dm b/code/game/objects/items/weapons/secrets_disk.dm index ee152b86151..ec806c4132f 100644 --- a/code/game/objects/items/weapons/secrets_disk.dm +++ b/code/game/objects/items/weapons/secrets_disk.dm @@ -13,19 +13,39 @@ This one has a lengthy legal label on it denoting it the private, copyrighted property of the Expeditionary Corps Organisation." req_access = list(access_rd) +/obj/item/disk/secret_project/proc/get_secret_project_codenames() + var/static/list/codenames = list( + "gamma", "delta", "epsilon", "zeta", "theta", "lambda", "omicron", "sigma", "tau", + "upsilon", "omega", "echelon", "prism", "calypso", "bernoulli", "harmony", "nyx", "fresnel" + ) + +/obj/item/disk/secret_project/proc/get_secret_project_types() + var/static/list/types = list( + "an experimental design for", + "a blueprint to build", + "a long set of theoretical formulas detailing the functioning of" + ) + return types + +/obj/item/disk/secret_project/proc/get_secret_project_nouns() + var/static/list/nouns = list( + "a superluminal artillery cannon", "a fusion engine", "an atmospheric scrubber",\ + "a human cloning pod", "a microwave oven", "a wormhole generator", "a laser carbine", "an energy pistol",\ + "a wormhole", "a teleporter", "a huge mining drill", "a strange spacecraft", "a space station",\ + "a sleek-looking fighter spacecraft", "a ballistic rifle", "an energy sword", "an inanimate carbon rod" + ) + return nouns + +/obj/item/disk/secret_project/proc/get_secret_project_descriptors() + var/static/list/descriptors = list( + "that is extremely powerful", "which is highly efficient", "which is incredibly compact", "created by aliens", + "that runs off of an exotic form of matter", "that runs off of hydrogen gas", "that just looks really cool" + ) + /obj/item/disk/secret_project/Initialize() . = ..() - var/codename = pick("gamma", "delta", "epsilon", "zeta", "theta", "lambda", "omicron", "sigma", "tau",\ - "upsilon", "omega", "echelon", "prism", "calypso", "bernoulli", "harmony", "nyx", "fresnel") - name = "'[codename]' project data disk" - subject = pick("an experimental design for", "a blueprint to build",\ - "a long set of theoretical formulas detailing the functioning of") - subject += " " + pick("a superluminal artillery cannon", "a supermatter engine", "a fusion engine", "an atmospheric scrubber",\ - "a human cloning pod", "a microwave oven", "a wormhole generator", "a laser carbine", "an energy pistol",\ - "a wormhole", "a teleporter", "a huge mining drill", "a strange spacecraft", "a space station",\ - "a sleek-looking fighter spacecraft", "a ballistic rifle", "an energy sword", "an inanimate carbon rod") - subject += " " + pick("that is extremely powerful", "which is highly efficient", "which is incredibly compact",\ - "that runs off of an exotic form of matter", "that runs off of hydrogen gas", "created by aliens", "that just looks really cool") + name = "'[pick(get_secret_project_codenames())]' project data disk" + subject = "[pick(get_secret_project_types())] [pick(get_secret_project_nouns())] [pick(get_secret_project_descriptors())]" /obj/item/disk/secret_project/examine(mob/user) . = ..() diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm deleted file mode 100644 index db21be248f5..00000000000 --- a/code/game/objects/items/weapons/shields.dm +++ /dev/null @@ -1,223 +0,0 @@ -//** Shield Helpers -//These are shared by various items that have shield-like behaviour - -//bad_arc is the ABSOLUTE arc of directions from which we cannot block. If you want to fix it to e.g. the user's facing you will need to rotate the dirs yourself. -/proc/check_shield_arc(mob/user, var/bad_arc, atom/damage_source = null, mob/attacker = null) - //check attack direction - var/attack_dir = 0 //direction from the user to the source of the attack - if(istype(damage_source, /obj/item/projectile)) - var/obj/item/projectile/P = damage_source - attack_dir = get_dir(get_turf(user), P.starting) - else if(attacker) - attack_dir = get_dir(get_turf(user), get_turf(attacker)) - else if(damage_source) - attack_dir = get_dir(get_turf(user), get_turf(damage_source)) - - if(!(attack_dir && (attack_dir & bad_arc))) - return 1 - return 0 - -/proc/default_parry_check(mob/user, mob/attacker, atom/damage_source) - //parry only melee attacks - if(istype(damage_source, /obj/item/projectile) || (attacker && get_dist(user, attacker) > 1) || user.incapacitated()) - return 0 - - //block as long as they are not directly behind us - var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block - if(!check_shield_arc(user, bad_arc, damage_source, attacker)) - return 0 - - return 1 - -/obj/item/shield - name = "abstract shield" - abstract_type = /obj/item/shield - var/base_block_chance = 60 - -/obj/item/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - if(user.incapacitated()) - return 0 - //block as long as they are not directly behind us - var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block - if(check_shield_arc(user, bad_arc, damage_source, attacker)) - var/block_chance = get_block_chance(user, damage, damage_source, attacker) - if(attacker) - block_chance = max(0, block_chance - 10 * attacker.get_skill_difference(SKILL_COMBAT, user)) - if(prob(block_chance)) - user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - if(max_health != ITEM_HEALTH_NO_DAMAGE) - take_damage(damage) - return 1 - return 0 - -/obj/item/shield/proc/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - return base_block_chance - -/obj/item/shield/riot - name = "riot shield" - desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." - icon = 'icons/obj/items/shield/riot.dmi' - icon_state = ICON_STATE_WORLD - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BACK - throw_speed = 1 - throw_range = 4 - w_class = ITEM_SIZE_HUGE - origin_tech = @'{"materials":2}' - material = /decl/material/solid/fiberglass - matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) - attack_verb = list("shoved", "bashed") - var/cooldown = 0 //shield bash cooldown. based on world.time - var/max_block = 15 - var/can_block_lasers = FALSE - -/obj/item/shield/riot/handle_shield(mob/user) - . = ..() - if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) - -/obj/item/shield/riot/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - if(istype(damage_source, /obj/item/projectile)) - var/obj/item/projectile/P = damage_source - //plastic shields do not stop bullets or lasers, even in space. Will block beanbags, rubber bullets, and stunshots just fine though. - if(is_sharp(P) && damage >= max_block) - return 0 - if(istype(P, /obj/item/projectile/beam) && (!can_block_lasers || (P.armor_penetration >= max_block))) - return 0 - return base_block_chance - -/obj/item/shield/riot/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/baton)) - if(cooldown < world.time - 25) - user.visible_message("[user] bashes [src] with [W]!") - playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) - cooldown = world.time - return TRUE - else - return ..() - -/obj/item/shield/riot/metal - name = "plasteel combat shield" - icon = 'icons/obj/items/shield/metal.dmi' - icon_state = ICON_STATE_WORLD - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BACK - throw_range = 3 - w_class = ITEM_SIZE_HUGE - material = /decl/material/solid/metal/plasteel - max_block = 50 - can_block_lasers = TRUE - slowdown_general = 1.5 - _base_attack_force = 6 - -/obj/item/shield/riot/metal/security //A cosmetic difference. - icon = 'icons/obj/items/shield/metal_security.dmi' - -/obj/item/shield/buckler - name = "buckler" - desc = "A wooden buckler used to block sharp things from entering your body back in the day." - icon = 'icons/obj/items/shield/buckler.dmi' - icon_state = "buckler" - slot_flags = SLOT_BACK - base_block_chance = 60 - throw_speed = 10 - throw_range = 20 - w_class = ITEM_SIZE_HUGE - origin_tech = @'{"materials":1}' - material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/organic/wood = MATTER_AMOUNT_REINFORCEMENT) - attack_verb = list("shoved", "bashed") - _base_attack_force = 8 - max_health = 250 - -/obj/item/shield/buckler/handle_shield(mob/user) - . = ..() - if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) - -/obj/item/shield/buckler/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - if(istype(damage_source, /obj/item/projectile/bullet)) - return 0 //No blocking bullets, I'm afraid. - return base_block_chance - -/* - * Energy Shield - */ - -/obj/item/shield/energy - name = "energy combat shield" - desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." - icon = 'icons/obj/items/shield/e_shield.dmi' - icon_state = "eshield0" // eshield1 for expanded - obj_flags = OBJ_FLAG_CONDUCTIBLE - throw_speed = 1 - throw_range = 4 - w_class = ITEM_SIZE_SMALL - origin_tech = @'{"materials":4,"magnets":3,"esoteric":4}' - attack_verb = list("shoved", "bashed") - material = /decl/material/solid/metal/titanium - matter = list( - /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE, - ) - _base_attack_force = 3 - var/active = 0 - var/shield_light_color = "#006aff" - -/obj/item/shield/energy/Initialize() - set_extension(src, /datum/extension/base_icon_state, copytext(initial(icon_state), 1, length(initial(icon_state)))) - . = ..() - update_icon() - -/obj/item/shield/energy/handle_shield(mob/user) - if(!active) - return 0 //turn it on first! - . = ..() - - if(.) - spark_at(user.loc, amount=5) - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) - -/obj/item/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - if(istype(damage_source, /obj/item/projectile)) - var/obj/item/projectile/P = damage_source - if((is_sharp(P) && damage > 10) || istype(P, /obj/item/projectile/beam)) - return (base_block_chance - round(damage / 2.5)) //block bullets and beams using the old block chance - return base_block_chance - -/obj/item/shield/energy/attack_self(mob/user) - if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) - to_chat(user, SPAN_DANGER("You beat yourself in the head with [src].")) - if(isliving(user)) - var/mob/living/M = user - M.take_organ_damage(5, 0) - active = !active - if (active) - set_base_attack_force(10) - update_icon() - w_class = ITEM_SIZE_HUGE - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("\The [src] is now active.")) - - else - set_base_attack_force(3) - update_icon() - w_class = ITEM_SIZE_SMALL - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("\The [src] can now be concealed.")) - - if(ishuman(user)) - var/mob/living/human/H = user - H.update_inhand_overlays() - - add_fingerprint(user) - return - -/obj/item/shield/energy/on_update_icon() - . = ..() - var/datum/extension/base_icon_state/base_name = get_extension(src, /datum/extension/base_icon_state) - icon_state = "[base_name.base_icon_state][active]" //Replace 0 with current state - if(active) - set_light(1.5, 1.5, shield_light_color) - else - set_light(0) \ No newline at end of file diff --git a/code/game/objects/items/weapons/shields/_shield.dm b/code/game/objects/items/weapons/shields/_shield.dm new file mode 100644 index 00000000000..6da8605ec6b --- /dev/null +++ b/code/game/objects/items/weapons/shields/_shield.dm @@ -0,0 +1,54 @@ +//** Shield Helpers +//These are shared by various items that have shield-like behaviour + +//bad_arc is the ABSOLUTE arc of directions from which we cannot block. If you want to fix it to e.g. the user's facing you will need to rotate the dirs yourself. +/proc/check_shield_arc(mob/user, var/bad_arc, atom/damage_source = null, mob/attacker = null) + //check attack direction + var/attack_dir = 0 //direction from the user to the source of the attack + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + attack_dir = get_dir(get_turf(user), P.starting) + else if(attacker) + attack_dir = get_dir(get_turf(user), get_turf(attacker)) + else if(damage_source) + attack_dir = get_dir(get_turf(user), get_turf(damage_source)) + + if(!(attack_dir && (attack_dir & bad_arc))) + return 1 + return 0 + +/proc/default_parry_check(mob/user, mob/attacker, atom/damage_source) + //parry only melee attacks + if(istype(damage_source, /obj/item/projectile) || (attacker && get_dist(user, attacker) > 1) || user.incapacitated()) + return 0 + + //block as long as they are not directly behind us + var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block + if(!check_shield_arc(user, bad_arc, damage_source, attacker)) + return 0 + + return 1 + +/obj/item/shield + name = "abstract shield" + abstract_type = /obj/item/shield + var/base_block_chance = 60 + +/obj/item/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(user.incapacitated()) + return 0 + //block as long as they are not directly behind us + var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + var/block_chance = get_block_chance(user, damage, damage_source, attacker) + if(attacker) + block_chance = max(0, block_chance - 10 * attacker.get_skill_difference(SKILL_COMBAT, user)) + if(prob(block_chance)) + user.visible_message("\The [user] blocks [attack_text] with \the [src]!") + if(max_health != ITEM_HEALTH_NO_DAMAGE) + take_damage(damage) + return 1 + return 0 + +/obj/item/shield/proc/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + return base_block_chance diff --git a/code/game/objects/items/weapons/shields/shield_crafted.dm b/code/game/objects/items/weapons/shields/shield_crafted.dm new file mode 100644 index 00000000000..5d892688b0a --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_crafted.dm @@ -0,0 +1,38 @@ +/obj/item/shield/crafted + slot_flags = SLOT_BACK + base_block_chance = 60 + throw_speed = 10 + throw_range = 20 + w_class = ITEM_SIZE_HUGE + origin_tech = @'{"materials":1}' + abstract_type = /obj/item/shield/crafted + icon_state = ICON_STATE_WORLD + attack_verb = list("shoved", "bashed") + _base_attack_force = 8 + max_health = 250 + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/wooden_icon + var/decl/material/reinforcement_material = /decl/material/solid/metal/iron + +/obj/item/shield/crafted/set_material(new_material) + . = ..() + if(wooden_icon) + if(istype(material, /decl/material/solid/organic/wood)) + set_icon(wooden_icon) + else + set_icon(initial(icon)) + update_icon() + +/obj/item/shield/crafted/Initialize(ml, material_key, reinf_material_key) + if(reinf_material_key) + reinforcement_material = reinf_material_key + if(ispath(reinforcement_material)) + reinforcement_material = GET_DECL(reinforcement_material) + LAZYSET(matter, reinforcement_material.type, MATTER_AMOUNT_REINFORCEMENT) + . = ..() + +/obj/item/shield/crafted/on_update_icon() + . = ..() + if(istype(reinforcement_material)) + add_overlay(overlay_image(icon, "[icon_state]-reinforcement", reinforcement_material.color, RESET_COLOR)) diff --git a/code/game/objects/items/weapons/shields/shield_crafted_buckler.dm b/code/game/objects/items/weapons/shields/shield_crafted_buckler.dm new file mode 100644 index 00000000000..6d78daef790 --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_crafted_buckler.dm @@ -0,0 +1,17 @@ +/obj/item/shield/crafted/buckler + name = "buckler" + desc = "A small, round shield used to block sharp things from entering your body." + icon = 'icons/obj/items/shield/buckler_metal.dmi' + wooden_icon = 'icons/obj/items/shield/buckler_wood.dmi' + +/obj/item/shield/crafted/buckler/improvised + name_prefix = "improvised" + +/obj/item/shield/crafted/buckler/handle_shield(mob/user) + . = ..() + if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) + +/obj/item/shield/crafted/buckler/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile/bullet)) + return 0 //No blocking bullets, I'm afraid. + return base_block_chance diff --git a/code/game/objects/items/weapons/shields/shield_crafting.dm b/code/game/objects/items/weapons/shields/shield_crafting.dm new file mode 100644 index 00000000000..307db9bce88 --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_crafting.dm @@ -0,0 +1,52 @@ +// General item for 'proper' shield crafting. +/obj/item/shield_fasteners + name = "shield fasteners" + desc = "A handful of shaped fasteners used to hold a buckler or shield together." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/shield_fasteners.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL + +// TODO: single-step slapcrafting +/obj/item/shield_base + w_class = ITEM_SIZE_LARGE + desc = "An unfinished collection of shield bits, waiting for fastenings." + icon_state = ICON_STATE_WORLD + abstract_type = /obj/item/shield_base + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/wooden_icon + var/fittings_type = /obj/item/shield_fasteners + var/finished_type + var/work_skill = SKILL_CONSTRUCTION + +/obj/item/shield_base/attackby(obj/item/used_item, mob/user) + if(fittings_type && istype(used_item, fittings_type) && finished_type && user.try_unequip(used_item)) + to_chat(user, SPAN_NOTICE("You start laying out \the [src] and affixing \the [used_item].")) + if(user.do_skilled(5 SECONDS, work_skill, src, check_holding = TRUE)) + var/was_held = (loc == user) + var/obj/item/shield/crafted/shield = new finished_type(get_turf(src), material?.type, used_item.material?.type) + user.visible_message("\The [user] secures \the [src] with \the [used_item], finishing \a [shield].") + qdel(src) + qdel(used_item) + if(was_held) + user.put_in_hands(shield) + return TRUE + return ..() + +/obj/item/shield_base/set_material(new_material) + . = ..() + if(wooden_icon) + if(istype(material, /decl/material/solid/organic/wood)) + set_icon(wooden_icon) + else + set_icon(initial(icon)) + update_icon() + +// Subtypes below. +/obj/item/shield_base/buckler + name_prefix = "unfinished" + name = "buckler" + icon = 'icons/obj/items/shield/buckler_base_metal.dmi' + wooden_icon = 'icons/obj/items/shield/buckler_base_wood.dmi' + finished_type = /obj/item/shield/crafted/buckler diff --git a/code/game/objects/items/weapons/shields/shield_energy.dm b/code/game/objects/items/weapons/shields/shield_energy.dm new file mode 100644 index 00000000000..c7d54652a56 --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_energy.dm @@ -0,0 +1,83 @@ +/* + * Energy Shield + */ + +/obj/item/shield/energy + name = "energy combat shield" + desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." + icon = 'icons/obj/items/shield/e_shield.dmi' + icon_state = "eshield0" // eshield1 for expanded + obj_flags = OBJ_FLAG_CONDUCTIBLE + throw_speed = 1 + throw_range = 4 + w_class = ITEM_SIZE_SMALL + origin_tech = @'{"materials":4,"magnets":3,"esoteric":4}' + attack_verb = list("shoved", "bashed") + material = /decl/material/solid/metal/titanium + matter = list( + /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE, + ) + _base_attack_force = 3 + var/active = 0 + var/shield_light_color = "#006aff" + +/obj/item/shield/energy/Initialize() + set_extension(src, /datum/extension/base_icon_state, copytext(initial(icon_state), 1, length(initial(icon_state)))) + . = ..() + update_icon() + +/obj/item/shield/energy/handle_shield(mob/user) + if(!active) + return 0 //turn it on first! + . = ..() + + if(.) + spark_at(user.loc, amount=5) + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + +/obj/item/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + if(((P.is_sharp() || P.has_edge()) && damage > 10) || istype(P, /obj/item/projectile/beam)) + return (base_block_chance - round(damage / 2.5)) //block bullets and beams using the old block chance + return base_block_chance + +/obj/item/shield/energy/attack_self(mob/user) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) + to_chat(user, SPAN_DANGER("You beat yourself in the head with [src].")) + if(isliving(user)) + var/mob/living/M = user + M.take_organ_damage(5, 0) + active = !active + if (active) + set_base_attack_force(10) + update_icon() + w_class = ITEM_SIZE_HUGE + playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + to_chat(user, SPAN_NOTICE("\The [src] is now active.")) + + else + set_base_attack_force(3) + update_icon() + w_class = ITEM_SIZE_SMALL + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + to_chat(user, SPAN_NOTICE("\The [src] can now be concealed.")) + + if(ishuman(user)) + var/mob/living/human/H = user + H.update_inhand_overlays() + + add_fingerprint(user) + return + +/obj/item/shield/energy/on_update_icon() + . = ..() + var/datum/extension/base_icon_state/base_name = get_extension(src, /datum/extension/base_icon_state) + icon_state = "[base_name.base_icon_state][active]" //Replace 0 with current state + if(active) + set_light(1.5, 1.5, shield_light_color) + else + set_light(0) diff --git a/code/game/objects/items/weapons/shields/shield_riot.dm b/code/game/objects/items/weapons/shields/shield_riot.dm new file mode 100644 index 00000000000..0cc0c9324f0 --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_riot.dm @@ -0,0 +1,58 @@ +/obj/item/shield/riot + name = "riot shield" + desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." + icon = 'icons/obj/items/shield/riot.dmi' + icon_state = ICON_STATE_WORLD + obj_flags = OBJ_FLAG_CONDUCTIBLE + slot_flags = SLOT_BACK + throw_speed = 1 + throw_range = 4 + w_class = ITEM_SIZE_HUGE + origin_tech = @'{"materials":2}' + material = /decl/material/solid/fiberglass + matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) + attack_verb = list("shoved", "bashed") + var/cooldown = 0 //shield bash cooldown. based on world.time + var/max_block = 15 + var/can_block_lasers = FALSE + +/obj/item/shield/riot/handle_shield(mob/user) + . = ..() + if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) + +/obj/item/shield/riot/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + //plastic shields do not stop bullets or lasers, even in space. Will block beanbags, rubber bullets, and stunshots just fine though. + if((P.is_sharp() || P.has_edge()) && damage >= max_block) + return 0 + if(istype(P, /obj/item/projectile/beam) && (!can_block_lasers || (P.armor_penetration >= max_block))) + return 0 + return base_block_chance + +/obj/item/shield/riot/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/baton)) + if(cooldown < world.time - 25) + user.visible_message("[user] bashes [src] with [W]!") + playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) + cooldown = world.time + return TRUE + else + return ..() + +/obj/item/shield/riot/metal + name = "plasteel combat shield" + icon = 'icons/obj/items/shield/metal.dmi' + icon_state = ICON_STATE_WORLD + obj_flags = OBJ_FLAG_CONDUCTIBLE + slot_flags = SLOT_BACK + throw_range = 3 + w_class = ITEM_SIZE_HUGE + material = /decl/material/solid/metal/plasteel + max_block = 50 + can_block_lasers = TRUE + slowdown_general = 1.5 + _base_attack_force = 6 + +/obj/item/shield/riot/metal/security //A cosmetic difference. + icon = 'icons/obj/items/shield/metal_security.dmi' diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index c669236eb49..99614d0fe16 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -57,49 +57,46 @@ add_to_reagents(/decl/material/liquid/cleaner/soap, SOAP_CLEANER_ON_WET) /obj/item/soap/Crossed(atom/movable/AM) - if(!isliving(AM)) - return - var/mob/living/M = AM - M.slip("\the [src]", 3) + var/mob/living/victim = AM + if(istype(victim)) + victim.slip("\the [src]", 3) + return ..() /obj/item/soap/afterattack(atom/target, mob/user, proximity) - if(!proximity) return - //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. - //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn - var/cleaned = FALSE - if(user.client && (target in user.client.screen)) - to_chat(user, SPAN_NOTICE("You need to take that [target.name] off before cleaning it.")) - else if(istype(target,/obj/effect/decal/cleanable/blood)) - to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) - target.clean() //Blood is a cleanable decal, therefore needs to be accounted for before all cleanable decals. - cleaned = TRUE - else if(istype(target,/obj/effect/decal/cleanable)) - to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) - qdel(target) - cleaned = TRUE - else if(isturf(target) || istype(target, /obj/structure/catwalk)) - var/turf/T = get_turf(target) - if(!T) - return - user.visible_message(SPAN_NOTICE("\The [user] starts scrubbing \the [T].")) - if(do_after(user, 8 SECONDS, T) && reagents?.total_volume) - reagents.splash(T, FLUID_QDEL_POINT) - to_chat(user, SPAN_NOTICE("You scrub \the [target] clean.")) - cleaned = TRUE - else if(istype(target,/obj/structure/hygiene/sink)) + + if(!proximity) + return ..() + + if(istype(target,/obj/structure/hygiene/sink)) to_chat(user, SPAN_NOTICE("You wet \the [src] in the sink.")) wet() + return TRUE + + if(reagents?.total_volume < 1) + to_chat(user, SPAN_WARNING("\The [src] is too dry to clean \the [target].")) + return TRUE + + if(isturf(target) || istype(target, /obj/structure/catwalk)) + target = get_turf(target) + if(!isturf(target)) + return ..() + user.visible_message(SPAN_NOTICE("\The [user] starts scrubbing \the [target].")) + if(!do_after(user, 8 SECONDS, target) && reagents?.total_volume) + return TRUE + to_chat(user, SPAN_NOTICE("You scrub \the [target] clean.")) + else if(istype(target,/obj/effect/decal/cleanable)) + to_chat(user, SPAN_NOTICE("You scrub \the [target] out.")) else - to_chat(user, SPAN_NOTICE("You clean \the [target.name].")) - target.clean() //Clean bloodied atoms. Blood decals themselves need to be handled above. - cleaned = TRUE + to_chat(user, SPAN_NOTICE("You clean \the [target].")) - if(cleaned) - user.update_personal_goal(/datum/goal/clean, 1) + reagents.touch_atom(target) + reagents.remove_any(1) + user.update_personal_goal(/datum/goal/clean, 1) + return TRUE //attack_as_weapon /obj/item/soap/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(ishuman(target) && user?.a_intent != I_HURT) + if(ishuman(target) && !user?.check_intent(I_FLAG_HARM)) var/mob/living/human/victim = target if(user.get_target_zone() == BP_MOUTH && victim.check_has_mouth()) user.visible_message(SPAN_DANGER("\The [user] washes \the [target]'s mouth out with soap!")) diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 646fe9b1729..f355815734b 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -6,7 +6,7 @@ w_class = ITEM_SIZE_HUGE attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_ALL base_parry_chance = 30 _base_attack_force = 3 @@ -32,7 +32,7 @@ . += "narrow" /obj/item/staff/attackby(obj/item/used_item, mob/user) - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) var/decl/material/bristles_material = used_item.material if(istype(bristles_material) && can_make_broom_with(user, used_item)) var/obj/item/staff/broom/broom = new(get_turf(user), material?.type, bristles_material?.type) @@ -42,9 +42,8 @@ return TRUE return ..() -// TODO: move back into wizard modpack when the timelines converge. /obj/item/staff/crystal - name = "wizard's staff" + name = "crystal staff" icon = 'icons/obj/items/staff_crystal.dmi' /obj/item/staff/crystal/can_make_broom_with(mob/user, obj/item/thing) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 6b9c600b959..fb4d2bb6756 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -17,17 +17,14 @@ /obj/item/backpack/can_contaminate() return FALSE -/obj/item/backpack/equipped() - if(!has_extension(src, /datum/extension/appearance)) - set_extension(src, /datum/extension/appearance/cardborg) - ..() - /obj/item/backpack/attackby(obj/item/W, mob/user) if (storage?.use_sound) playsound(src.loc, storage.use_sound, 50, 1, -5) return ..() /obj/item/backpack/equipped(var/mob/user, var/slot) + if(!has_extension(src, /datum/extension/appearance)) + set_extension(src, /datum/extension/appearance/cardborg) if (slot == slot_back_str && storage?.use_sound) playsound(loc, storage.use_sound, 50, 1, -5) return ..(user, slot) @@ -445,3 +442,17 @@ name = "security messenger bag" desc = "A tactical backpack worn over one shoulder. This one is in Security colors." icon = 'icons/obj/items/storage/backpack/messenger_sec.dmi' + +// Crafted backpacks. +/obj/item/backpack/crafted + name = "haversack" + desc = "A rather rough handmade haversack." + icon = 'icons/obj/items/storage/backpack/backpack_haversack.dmi' + material = /decl/material/solid/organic/leather + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + +/obj/item/backpack/crafted/backpack + name = "backpack" + name_prefix = "handmade" + desc = "A rather rough handmade backpack." + icon = 'icons/obj/items/storage/backpack/backpack_crafted.dmi' diff --git a/code/game/objects/items/weapons/storage/basket.dm b/code/game/objects/items/weapons/storage/basket.dm index d7eada18765..8c7661451a9 100644 --- a/code/game/objects/items/weapons/storage/basket.dm +++ b/code/game/objects/items/weapons/storage/basket.dm @@ -1,10 +1,25 @@ /obj/item/basket - name = "woven basket" - desc = "A simple woven basket. Very rustic." - icon = 'icons/obj/items/storage/basket.dmi' - icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_HUGE - slot_flags = SLOT_BACK + name_prefix = "woven" + name = "handbasket" + desc = "A simple woven basket. Very rustic." + icon = 'icons/obj/items/storage/baskets/basket_round.dmi' + icon_state = ICON_STATE_WORLD + w_class = ITEM_SIZE_HUGE material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - storage = /datum/storage/basket - material = /decl/material/solid/organic/plantmatter/grass/dry + storage = /datum/storage/basket + material = /decl/material/solid/organic/plantmatter/grass/dry + +/obj/item/basket/on_update_icon() + . = ..() + icon_state = get_world_inventory_state() + if(storage?.opened) + icon_state = "[icon_state]-open" + +/obj/item/basket/large + name_prefix = "large woven" + name = "basket" + slot_flags = SLOT_BACK + icon = 'icons/obj/items/storage/baskets/basket_large.dmi' + w_class = ITEM_SIZE_GARGANTUAN + storage = /datum/storage/basket/large + slowdown_general = 1 // Large and unwieldly diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 3d6aa29ea00..e53ef9f89e0 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -13,10 +13,6 @@ material = /decl/material/solid/organic/leather/synth var/overlay_flags -/obj/item/belt/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_belt_str) - /obj/item/belt/verb/toggle_layer() set name = "Switch Belt Layer" set category = "Object" @@ -28,11 +24,11 @@ . = ..() if(overlay_flags & BELT_OVERLAY_ITEMS) var/list/cur_overlays - for(var/obj/item/I in contents) - if(I.use_single_icon) - LAZYADD(cur_overlays, I.get_on_belt_overlay()) + for(var/obj/item/thing in contents) + if(thing.use_single_icon) + LAZYADD(cur_overlays, thing.get_on_belt_overlay()) else - LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state)) + LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', thing.icon_state)) if(LAZYLEN(cur_overlays)) add_overlay(cur_overlays) @@ -41,8 +37,8 @@ /obj/item/belt/get_mob_overlay(mob/user_mob, slot, bodypart, use_fallback_if_icon_missing = TRUE, skip_adjustment = FALSE) 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, use_fallback_if_icon_missing, TRUE) + for(var/obj/item/thing in contents) + var/image/new_overlay = thing.get_mob_overlay(user_mob, slot, bodypart, use_fallback_if_icon_missing, TRUE) if(new_overlay) ret.overlays += new_overlay return ret @@ -61,37 +57,36 @@ . = ..() set_extension(src, /datum/extension/holster, storage, sound_in, sound_out, can_holster) -/obj/item/belt/holster/attackby(obj/item/W, mob/user) - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) - if(H.holster(W, user)) +/obj/item/belt/holster/attackby(obj/item/used_item, mob/user) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + if(holster?.holster(used_item, user)) return TRUE - else - . = ..(W, user) + return ..(used_item, user) /obj/item/belt/holster/attack_hand(mob/user) if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) - if(H.unholster(user)) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + if(holster?.unholster(user)) return TRUE return ..() /obj/item/belt/holster/examine(mob/user) . = ..() - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) - H.examine_holster(user) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + holster.examine_holster(user) /obj/item/belt/holster/on_update_icon() . = ..() - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) if(overlay_flags) var/list/cur_overlays - for(var/obj/item/I in contents) - if(I == H.holstered) + for(var/obj/item/thing in contents) + if(thing == holster.holstered) if(overlay_flags & BELT_OVERLAY_HOLSTER) - LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state)) + LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', thing.icon_state)) else if(overlay_flags & BELT_OVERLAY_ITEMS) - LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', I.icon_state)) + LAZYADD(cur_overlays, overlay_image('icons/obj/clothing/obj_belt_overlays.dmi', thing.icon_state)) if(LAZYLEN(cur_overlays)) add_overlay(cur_overlays) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 499ffb5d858..639d83a1754 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -275,13 +275,6 @@ /obj/item/box/anti_photons/WillContain() return list(/obj/item/grenade/anti_photon = 5) -/obj/item/box/supermatters - name = "box of supermatter grenades" - desc = "A box containing 5 highly experimental supermatter grenades." - icon_state = "radbox" -/obj/item/box/supermatters/WillContain() - return list(/obj/item/grenade/supermatter = 5) - /obj/item/box/decompilers name = "box of decompiler grenades" desc = "A box containing 5 experimental decompiler grenades." diff --git a/code/game/objects/items/weapons/storage/fancy/_fancy.dm b/code/game/objects/items/weapons/storage/fancy/_fancy.dm index ec59092259d..66774d7abae 100644 --- a/code/game/objects/items/weapons/storage/fancy/_fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy/_fancy.dm @@ -14,7 +14,11 @@ /obj/item/box/fancy/proc/update_icon_state() icon_state = initial(icon_state) - if(key_type && storage?.opened) + if(!length(contents)) + var/empty_state = "[icon_state]0" + if(check_state_in_icon(empty_state, icon)) + icon_state = empty_state + else if(key_type && storage?.opened) icon_state = "[icon_state][count_by_type(contents, key_type)]" /obj/item/box/fancy/proc/add_contents_overlays() diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index 8c2acb816db..70bbf23d777 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -12,6 +12,7 @@ MRE Stuff obj_flags = OBJ_FLAG_HOLLOW var/main_meal = /obj/item/mrebag var/meal_desc = "This one is menu 1, meat pizza." + var/has_been_opened = FALSE /obj/item/mre/WillContain() . = list( @@ -33,10 +34,13 @@ MRE Stuff . = ..() to_chat(user, meal_desc) +/obj/item/mre/attack_self(mob/user) + . = ..() + /obj/item/mre/on_update_icon() . = ..() icon_state = get_world_inventory_state() - if(storage?.opened) + if(has_been_opened) icon_state = "[icon_state]-open" /obj/item/mre/attack_self(mob/user) diff --git a/code/game/objects/items/weapons/storage/nuggets.dm b/code/game/objects/items/weapons/storage/nuggets.dm new file mode 100644 index 00000000000..3ecc72ce227 --- /dev/null +++ b/code/game/objects/items/weapons/storage/nuggets.dm @@ -0,0 +1,63 @@ +/datum/storage/box/nuggets + can_hold = list(/obj/item/food/nugget) + var/expected_nugget_count = 10 + +/datum/storage/box/nuggets/New() + max_storage_space = /obj/item/food/nugget::w_class * expected_nugget_count + ..() + +/datum/storage/box/nuggets/twenty + expected_nugget_count = 20 + +/datum/storage/box/nuggets/forty + expected_nugget_count = 40 + +/obj/item/box/nuggets + name = "10-piece nuggets box" + icon = 'icons/obj/items/storage/nugget_box.dmi' + icon_state = "nuggetbox_ten" + desc = "A share pack of golden chicken nuggets in various fun shapes. Rumours of the rare and deadly 'fifth nugget shape' remain unsubstantiated." + storage = /datum/storage/box/nuggets + center_of_mass = @'{"x":16,"y":9}' + +/obj/item/box/nuggets/Initialize(ml, material_key) + . = ..() + update_icon() + +/obj/item/box/nuggets/WillContain() + . = list() + if(istype(storage, /datum/storage/box/nuggets)) + var/datum/storage/box/nuggets/nugget_box = storage + for(var/i = 1 to nugget_box.expected_nugget_count) + . += /obj/item/food/nugget + +/obj/item/box/nuggets/on_update_icon() + var/datum/storage/box/nuggets/nugget_box = storage + if(length(contents) == 0 || !istype(nugget_box)) + icon_state = "[initial(icon_state)]_empty" + else if(length(contents) >= nugget_box.expected_nugget_count) + icon_state = "[initial(icon_state)]_full" + else + icon_state = initial(icon_state) + +// Subtypes below. +/obj/item/box/nuggets/twenty + name = "20-piece nuggets box" + icon_state = "nuggetbox_twenty" + storage = /datum/storage/box/nuggets/twenty + +/obj/item/box/nuggets/twenty/WillContain() + . = list() + for(var/i = 1 to 20) + . += /obj/item/food/nugget + +/obj/item/box/nuggets/twenty/empty/WillContain() + return + +/obj/item/box/nuggets/forty + name = "40-piece nuggets box" + icon_state = "nuggetbox_forty" + storage = /datum/storage/box/nuggets/forty + +/obj/item/box/nuggets/forty/empty/WillContain() + return diff --git a/code/game/objects/items/weapons/storage/specialized.dm b/code/game/objects/items/weapons/storage/specialized.dm index d85bd453f5c..01481422311 100644 --- a/code/game/objects/items/weapons/storage/specialized.dm +++ b/code/game/objects/items/weapons/storage/specialized.dm @@ -12,8 +12,8 @@ /obj/item/ore name = "mining satchel" desc = "This sturdy bag can be used to store and transport ores." - icon = 'icons/obj/mining.dmi' - icon_state = "satchel" + icon = 'icons/obj/items/mining_satchel.dmi' + icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_LARGE storage = /datum/storage/ore @@ -57,8 +57,8 @@ /obj/item/sheetsnatcher name = "sheet snatcher" - icon = 'icons/obj/mining.dmi' - icon_state = "sheetsnatcher" + icon = 'icons/obj/items/sheet_snatcher.dmi' + icon_state = ICON_STATE_WORLD desc = "A patented storage system designed for any kind of mineral sheet." material = /decl/material/solid/organic/plastic storage = /datum/storage/sheets diff --git a/code/game/objects/items/weapons/storage/wall_mirror.dm b/code/game/objects/items/weapons/storage/wall_mirror.dm index c7e5d89a2b9..91b5554585d 100644 --- a/code/game/objects/items/weapons/storage/wall_mirror.dm +++ b/code/game/objects/items/weapons/storage/wall_mirror.dm @@ -48,7 +48,7 @@ . = ..() /obj/structure/mirror/attack_hand(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(shattered) to_chat(user, SPAN_WARNING("You enter the key combination for the style you want on the panel, but the nanomachines inside \the [src] refuse to come out.")) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index faf51ae0c59..5fcafd398ae 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -89,6 +89,7 @@ /decl/interaction_handler/remove_id/wallet expected_target_type = /obj/item/wallet + examine_desc = "remove an ID card" /decl/interaction_handler/remove_id/wallet/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && ishuman(user) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 506f7399815..f1d555da4d0 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -5,8 +5,6 @@ icon = 'icons/obj/items/weapon/stunbaton.dmi' icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY - sharp = 0 - edge = 0 w_class = ITEM_SIZE_NORMAL origin_tech = @'{"combat":2}' attack_verb = list("beaten") @@ -112,7 +110,7 @@ var/mob/living/human/H = target affecting = GET_EXTERNAL_ORGAN(H, hit_zone) var/abuser = user ? "" : "by [user]" - if(user && user.a_intent == I_HURT) + if(user && user.check_intent(I_FLAG_HARM)) . = ..() if(.) return diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index c5b1f30ef20..082bccc7a32 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -99,8 +99,8 @@ icon = 'icons/obj/surgery.dmi' icon_state = "scalpel" obj_flags = OBJ_FLAG_CONDUCTIBLE - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS throw_speed = 3 @@ -160,8 +160,8 @@ /obj/item/incision_manager name = "incision management system" desc = "A true extension of the surgeon's body, this marvel combines several medical tools into one modular package." - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE atom_damage_type = BURN icon = 'icons/obj/surgery.dmi' icon_state = "scalpel_manager_on" @@ -202,8 +202,8 @@ material = /decl/material/solid/metal/steel matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) attack_verb = list("attacked", "slashed", "sawed", "cut") - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE pickup_sound = 'sound/foley/pickup2.ogg' drop_sound = 'sound/foley/knifedrop3.ogg' _base_attack_force = 15 diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 091cafca675..eb8b3a9e3a8 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -14,12 +14,12 @@ icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY item_flags = ITEM_FLAG_IS_WEAPON - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak _base_attack_force = 10 /obj/item/classic_baton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if (user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) - var/force = get_attack_force(user) + var/force = expend_attack_force(user) to_chat(user, SPAN_WARNING("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) @@ -66,8 +66,8 @@ update_held_icon() /obj/item/telebaton/on_update_icon() - if(length(blood_DNA)) - generate_blood_overlay(TRUE) // Force recheck. + if(coating?.total_volume || blood_DNA) + generate_coating_overlay(TRUE) // Force recheck. . = ..() if(on) icon = 'icons/obj/items/weapon/telebaton_extended.dmi' @@ -76,7 +76,7 @@ /obj/item/telebaton/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(on && user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) - var/force = get_attack_force(user) + var/force = expend_attack_force(user) to_chat(user, SPAN_DANGER("You club yourself over the head.")) SET_STATUS_MAX(user, STAT_WEAK, (3 * force)) if(ishuman(user)) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 02b8102756d..a2016aef379 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -147,12 +147,12 @@ var/global/list/global/tank_gauge_cache = list() var/obj/item/assembly_holder/assy = proxyassembly.assembly if(assy.a_left && assy.a_right) - assy.dropInto(usr.loc) + assy.dropInto(user.loc) assy.master = null proxyassembly.assembly = null else if(!proxyassembly.assembly.a_left) - assy.a_right.dropInto(usr.loc) + assy.a_right.dropInto(user.loc) assy.a_right.holder = null assy.a_right = null proxyassembly.assembly = null @@ -193,7 +193,7 @@ var/global/list/global/tank_gauge_cache = list() var/obj/item/weldingtool/WT = W if(WT.weld(1,user)) if(!valve_welded) - to_chat(user, "You begin welding the \the [src] emergency pressure relief valve.") + to_chat(user, "You begin welding \the [src] emergency pressure relief valve.") if(do_after(user, 40,src)) to_chat(user, "You carefully weld \the [src] emergency pressure relief valve shut. \The [src] may now rupture under pressure!") valve_welded = 1 @@ -299,7 +299,7 @@ var/global/list/global/tank_gauge_cache = list() return TOPIC_REFRESH if (href_list["stat"]) - toggle_valve(usr) + toggle_valve(user) return TOPIC_REFRESH /obj/item/tank/proc/toggle_valve(var/mob/user) @@ -553,7 +553,7 @@ var/global/list/global/tank_gauge_cache = list() return ..() /obj/item/tankassemblyproxy/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. - tank.ignite() //boom (or not boom if you made shijwtty mix) + tank.cause_explosion() //boom (or not boom if you made shijwtty mix) /obj/item/tank/proc/assemble_bomb(W,user) //Bomb assembly proc. This turns assembly+tank into a bomb var/obj/item/assembly_holder/S = W @@ -573,7 +573,7 @@ var/global/list/global/tank_gauge_cache = list() update_icon(TRUE) -/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode +/obj/item/tank/proc/cause_explosion() //This happens when a bomb is told to explode var/obj/item/assembly_holder/assy = proxyassembly.assembly var/ign = assy.a_right var/obj/item/other = assy.a_left diff --git a/code/game/objects/items/weapons/tech_disks.dm b/code/game/objects/items/weapons/tech_disks.dm index a6f98ef13ca..91922a2853d 100644 --- a/code/game/objects/items/weapons/tech_disks.dm +++ b/code/game/objects/items/weapons/tech_disks.dm @@ -122,7 +122,7 @@ var/datum/fabricator_recipe/blueprint /obj/item/disk/design_disk/attack_hand(mob/user) - if(user.a_intent != I_HURT || !blueprint || !user.check_dexterity(DEXTERITY_KEYBOARDS)) + if(!user.check_intent(I_FLAG_HARM) || !blueprint || !user.check_dexterity(DEXTERITY_KEYBOARDS)) return ..() blueprint = null SetName(initial(name)) diff --git a/code/game/objects/items/weapons/tools/screwdriver.dm b/code/game/objects/items/weapons/tools/screwdriver.dm index 2a1ef5f107b..d16e6c230f3 100644 --- a/code/game/objects/items/weapons/tools/screwdriver.dm +++ b/code/game/objects/items/weapons/tools/screwdriver.dm @@ -40,7 +40,7 @@ return res /obj/item/screwdriver/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(user.a_intent == I_HELP || user.get_target_zone() != BP_EYES && user.get_target_zone() != BP_HEAD) + if(user.check_intent(I_FLAG_HELP) || user.get_target_zone() != BP_EYES && user.get_target_zone() != BP_HEAD) return ..() if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) target = user diff --git a/code/game/objects/items/weapons/tools/shears.dm b/code/game/objects/items/weapons/tools/shears.dm index c57dff7b9e2..b5958ab0025 100644 --- a/code/game/objects/items/weapons/tools/shears.dm +++ b/code/game/objects/items/weapons/tools/shears.dm @@ -8,8 +8,8 @@ material = /decl/material/solid/metal/steel center_of_mass = @'{"x":18,"y":10}' attack_verb = list("sheared", "cut") - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE material_alteration = MAT_FLAG_ALTERATION_COLOR drop_sound = 'sound/foley/singletooldrop1.ogg' diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 6cc583631c2..615c0068291 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -192,7 +192,7 @@ var/turf/location = get_turf(user) if(isliving(O)) var/mob/living/L = O - L.IgniteMob() + L.ignite_fire() else if(isatom(O)) O.handle_external_heating(WELDING_TOOL_HOTSPOT_TEMP_ACTIVE, src, user) if (isturf(location)) @@ -243,7 +243,7 @@ var/mob/living/L = loc if(!(src in L.get_held_items())) fuel_usage = max(fuel_usage, 2) - L.IgniteMob() + L.ignite_fire() else if(isturf(loc)) var/turf/location = get_turf(src) location.hotspot_expose(WELDING_TOOL_HOTSPOT_TEMP_IDLE, 5) //a bit colder when idling @@ -345,7 +345,7 @@ /obj/item/weldingtool/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) var/obj/item/organ/external/affecting = istype(target) && GET_EXTERNAL_ORGAN(target, user?.get_target_zone()) - if(affecting && user.a_intent == I_HELP) + if(affecting && user.check_intent(I_FLAG_HELP)) if(!affecting.is_robotic()) to_chat(user, SPAN_WARNING("\The [target]'s [affecting.name] is not robotic. \The [src] cannot repair it.")) else if(BP_IS_BRITTLE(affecting)) @@ -423,7 +423,7 @@ return TRUE if(handle_eaten_by_mob(user, O) != EATEN_INVALID) return TRUE - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) if(standard_splash_mob(user, O)) return TRUE if(reagents && reagents.total_volume) @@ -432,7 +432,7 @@ return TRUE return ..() -/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target) +/obj/item/chems/welder_tank/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) if(!can_refuel) to_chat(user, SPAN_DANGER("\The [src] does not have a refuelling port.")) return FALSE diff --git a/code/game/objects/items/weapons/tools/wirecutter.dm b/code/game/objects/items/weapons/tools/wirecutter.dm index 284e5cc8c18..7eda6a47b54 100644 --- a/code/game/objects/items/weapons/tools/wirecutter.dm +++ b/code/game/objects/items/weapons/tools/wirecutter.dm @@ -9,8 +9,8 @@ material = /decl/material/solid/metal/steel center_of_mass = @'{"x":18,"y":10}' attack_verb = list("pinched", "nipped") - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE material_alteration = MAT_FLAG_ALTERATION_COLOR drop_sound = 'sound/foley/singletooldrop1.ogg' @@ -44,9 +44,9 @@ /obj/item/wirecutters/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) var/obj/item/handcuffs/cable/cuffs = target.get_equipped_item(slot_handcuffed_str) - if(user.a_intent == I_HELP && istype(cuffs) && target.try_unequip(cuffs)) + if(user.check_intent(I_FLAG_HELP) && istype(cuffs) && target.try_unequip(cuffs)) user.visible_message( - "\The [usr] cuts \the [target]'s restraints with \the [src]!", + "\The [user] cuts \the [target]'s restraints with \the [src]!", "You cut \the [target]'s restraints with \the [src]!", "You hear cable being cut." ) diff --git a/code/game/objects/items/weapons/tools/wrench.dm b/code/game/objects/items/weapons/tools/wrench.dm index e3f8e9e9d7a..c117895cea1 100644 --- a/code/game/objects/items/weapons/tools/wrench.dm +++ b/code/game/objects/items/weapons/tools/wrench.dm @@ -30,6 +30,7 @@ // Twohanded wrench. /obj/item/wrench/pipe + name_prefix = "enormous" name = "pipe wrench" desc = "You are no longer asking nicely." icon = 'icons/obj/items/tool/pipewrench.dmi' @@ -47,10 +48,6 @@ /obj/item/wrench/pipe/get_handle_color() return null -/obj/item/wrench/pipe/update_name() - . = ..() - SetName("enormous [name]") - /obj/item/wrench/pipe/Initialize() . = ..() set_extension(src, /datum/extension/tool, list(TOOL_WRENCH = TOOL_QUALITY_DEFAULT)) diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index c15817b4e71..3b111a31629 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -44,7 +44,7 @@ STOP_PROCESSING(SSobj, src) /obj/item/towel/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) var/reagent_space = reagents.maximum_volume - reagents.total_volume @@ -62,10 +62,10 @@ return TRUE /obj/item/towel/attack_self(mob/user) - if(user.a_intent == I_GRAB) + if(user.check_intent(I_FLAG_GRAB)) lay_out() return TRUE - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) return use_on_mob(user, user) return ..() diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 07845b81c45..397257e0d29 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -1,17 +1,17 @@ /obj/item/beartrap - name = "mechanical trap" - throw_speed = 2 - throw_range = 1 - gender = PLURAL - icon = 'icons/obj/items/beartrap.dmi' - icon_state = "beartrap0" - randpixel = 0 - desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." - w_class = ITEM_SIZE_NORMAL - origin_tech = @'{"materials":1}' - material = /decl/material/solid/metal/steel - can_buckle = 0 //disallow manual un/buckling - var/deployed = 0 + name = "mechanical trap" + desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." + throw_speed = 2 + throw_range = 1 + gender = PLURAL + icon = 'icons/obj/items/beartrap.dmi' + icon_state = "beartrap0" + randpixel = 0 + w_class = ITEM_SIZE_NORMAL + origin_tech = @'{"materials":1}' + material = /decl/material/solid/metal/steel + can_buckle = FALSE //disallow manual un/buckling + var/deployed = FALSE /obj/item/beartrap/proc/can_use(mob/user) . = (user.check_dexterity(DEXTERITY_SIMPLE_MACHINES) && !issilicon(user) && !user.stat && !user.restrained()) @@ -19,12 +19,12 @@ /obj/item/beartrap/user_unbuckle_mob(mob/user) if(buckled_mob && can_use(user)) user.visible_message( - "\The [user] begins freeing \the [buckled_mob] from \the [src].", - "You carefully begin to free \the [buckled_mob] from \the [src].", - "You hear metal creaking." + SPAN_NOTICE("\The [user] begins freeing \the [buckled_mob] from \the [src]."), + SPAN_NOTICE("You carefully begin to free \the [buckled_mob] from \the [src]."), + SPAN_NOTICE("You hear metal creaking.") ) if(do_after(user, 60, src)) - user.visible_message("\The [buckled_mob] has been freed from \the [src] by \the [user].") + user.visible_message(SPAN_NOTICE("\The [buckled_mob] has been freed from \the [src] by \the [user].")) unbuckle_mob() anchored = FALSE @@ -32,19 +32,18 @@ ..() if(!deployed && can_use(user)) user.visible_message( - "[user] starts to deploy \the [src].", - "You begin deploying \the [src]!", + SPAN_DANGER("\The [user] starts to deploy \the [src]."), + SPAN_DANGER("You begin deploying \the [src]!"), "You hear the slow creaking of a spring." - ) + ) - if (do_after(user, 60, src) && user.try_unequip(src)) + if (do_after(user, 6 SECONDS, src) && user.try_unequip(src)) user.visible_message( - "\The [user] has deployed \the [src].", - "You have deployed \the [src]!", + SPAN_DANGER("\The [user] has deployed \the [src]."), + SPAN_DANGER("You have deployed \the [src]!"), "You hear a latch click loudly." - ) - - deployed = 1 + ) + deployed = TRUE update_icon() anchored = TRUE @@ -55,7 +54,7 @@ user_unbuckle_mob(user) return TRUE if(!deployed || !can_use(user)) - return FALSE + return ..() user.visible_message( SPAN_DANGER("\The [user] starts to disarm \the [src]."), SPAN_NOTICE("You begin disarming \the [src]!"), @@ -71,40 +70,45 @@ update_icon() return TRUE -/obj/item/beartrap/proc/attack_mob(mob/L) +/obj/item/beartrap/proc/attack_mob(mob/victim) + + if(victim.immune_to_floor_hazards()) + return FALSE var/target_zone - if(L.current_posture.prone) + if(victim.current_posture.prone) target_zone = ran_zone() else target_zone = pick(BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG) - if(!L.apply_damage(30, BRUTE, target_zone, used_weapon=src)) - return 0 + if(!victim.apply_damage(30, BRUTE, target_zone, used_weapon=src)) + return FALSE //trap the victim in place - set_dir(L.dir) - buckle_mob(L) - to_chat(L, "The steel jaws of \the [src] bite into you, trapping you in place!") - deployed = 0 + set_dir(victim.dir) + buckle_mob(victim) + to_chat(victim, SPAN_DANGER("The steel jaws of \the [src] bite into you, trapping you in place!")) + deployed = FALSE + return TRUE /obj/item/beartrap/Crossed(atom/movable/AM) ..() if(!deployed || !isliving(AM)) return - var/mob/living/L = AM - if(MOVING_DELIBERATELY(L)) + var/mob/living/victim = AM + if(MOVING_DELIBERATELY(victim) || victim.immune_to_floor_hazards()) return - L.visible_message( - SPAN_DANGER("\The [L] steps on \the [src]."), + victim.visible_message( + SPAN_DANGER("\The [victim] steps on \the [src]."), SPAN_DANGER("You step on \the [src]!"), - "You hear a loud metallic snap!") - attack_mob(L) + "You hear a loud metallic snap!" + ) + attack_mob(victim) if(!buckled_mob) anchored = FALSE - deployed = 0 + deployed = FALSE update_icon() /obj/item/beartrap/on_update_icon() . = ..() - icon_state = "beartrap[deployed == TRUE]" + icon_state = "beartrap[deployed]" diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 73a259e6458..3d6b8c86fc5 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -34,8 +34,7 @@ return ..() /obj/item/nullrod/proc/holy_act(mob/living/target, mob/living/user) - if(target.mind && LAZYLEN(target.mind.learned_spells)) - target.silence_spells(30 SECONDS) + if(target.disable_abilities(30 SECONDS)) to_chat(target, SPAN_DANGER("You've been silenced!")) return TRUE return FALSE @@ -65,8 +64,7 @@ /obj/item/energy_net/dropped() ..() - spawn(10) - if(src) qdel(src) + QDEL_IN(src, 1 SECOND) /obj/item/energy_net/throw_impact(atom/hit_atom) ..() @@ -86,8 +84,7 @@ qdel(src) // If we miss or hit an obstacle, we still want to delete the net. - spawn(10) - if(src) qdel(src) + QDEL_IN(src, 1 SECOND) /obj/effect/energy_net name = "energy net" @@ -192,15 +189,11 @@ healthcheck() /obj/effect/energy_net/attack_hand(var/mob/user) - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) return ..() - var/decl/species/my_species = user.get_species() - if(my_species) - if(my_species.can_shred(user)) - playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) - current_health -= rand(10, 20) - else - current_health -= rand(1,3) + if(user.can_shred()) + playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) + current_health -= rand(10, 20) else current_health -= rand(5,8) to_chat(user, SPAN_DANGER("You claw at the energy net.")) @@ -208,7 +201,7 @@ return TRUE /obj/effect/energy_net/attackby(obj/item/W, mob/user) - current_health -= W.get_attack_force(user) + current_health -= W.expend_attack_force(user) healthcheck() return TRUE diff --git a/code/game/objects/random/subtypes/clothing.dm b/code/game/objects/random/subtypes/clothing.dm index f9bac2fd1c4..8524aff474c 100644 --- a/code/game/objects/random/subtypes/clothing.dm +++ b/code/game/objects/random/subtypes/clothing.dm @@ -238,19 +238,3 @@ /obj/item/clothing/suit/space/void/medical/alt ) return spawnable_choices - -/obj/random/hardsuit - name = "Random Hardsuit" - desc = "This is a random hardsuit control module." - icon = 'icons/obj/rig_modules.dmi' - icon_state = "generic" - -/obj/random/hardsuit/spawn_choices() - var/static/list/spawnable_choices = list( - /obj/item/rig/industrial, - /obj/item/rig/eva, - /obj/item/rig/light/hacker, - /obj/item/rig/light/stealth, - /obj/item/rig/light - ) - return spawnable_choices diff --git a/code/game/objects/random/subtypes/food.dm b/code/game/objects/random/subtypes/food.dm index f390e57cf5d..36aa8a4a37e 100644 --- a/code/game/objects/random/subtypes/food.dm +++ b/code/game/objects/random/subtypes/food.dm @@ -102,7 +102,8 @@ /obj/random/mre/spread/spawn_choices() var/static/list/spawnable_choices = list( /obj/item/chems/packet/jelly, - /obj/item/chems/packet/honey + /obj/item/chems/packet/honey, + /obj/item/chems/packet/honey_fake ) return spawnable_choices diff --git a/code/game/objects/random/subtypes/maintenance.dm b/code/game/objects/random/subtypes/maintenance.dm index 0df746fd50a..b141867e7e1 100644 --- a/code/game/objects/random/subtypes/maintenance.dm +++ b/code/game/objects/random/subtypes/maintenance.dm @@ -209,14 +209,10 @@ something, make sure it's not in one of the other lists.*/ var/static/list/spawnable_choices = list( /obj/random/maintenance/clean = 320, /obj/item/clothing/head/soft/sec = 4, - /obj/item/clothing/head/soft/sec/corp = 4, /obj/item/backpack/security = 3, /obj/item/backpack/satchel/sec = 3, /obj/item/clothing/shoes/jackboots = 3, /obj/item/clothing/suit/armor/vest = 3, - /obj/item/clothing/head/beret/corp/sec = 3, - /obj/item/clothing/head/beret/corp/sec/corporate/hos = 3, - /obj/item/clothing/head/beret/corp/sec/navy/officer = 3, /obj/item/flashlight/maglight = 2, /obj/item/flash = 2, /obj/item/clothing/mask/balaclava = 2, @@ -226,7 +222,6 @@ something, make sure it's not in one of the other lists.*/ /obj/item/belt/security = 2, /obj/item/clothing/glasses/hud/security = 2, /obj/item/clothing/head/helmet = 2, - /obj/item/clothing/suit/armor/vest/security = 2, /obj/item/clothing/webbing/drop_pouches/black = 2, /obj/item/clothing/head/earmuffs = 2, /obj/item/handcuffs = 2, diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index 1a9506c2828..dfc3dc477e9 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -14,7 +14,7 @@ /obj/item/pill_bottle/happy = 2, /obj/item/pill_bottle/zoom = 2, /obj/item/chems/glass/beaker/vial/random/toxin = 1, - /obj/item/chems/glass/beaker/sulphuric = 1, + /obj/item/chems/glass/beaker/sulfuric = 1, /obj/item/poster = 5, /obj/item/butterflyblade = 3, /obj/item/butterflyhandle = 3, @@ -164,7 +164,8 @@ /obj/effect/decal/cleanable/ash, /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/flour, - /obj/effect/decal/cleanable/dirt, + /obj/effect/decal/cleanable/filth, + /obj/effect/decal/cleanable/dirt/visible, /obj/item/remains/robot ) return spawnable_choices @@ -211,8 +212,8 @@ /obj/item/stack/material/plank/mapped/wood/fifty, /obj/item/stack/material/cardstock/mapped/cardboard/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, - /obj/item/stack/material/rods/ten, - /obj/item/stack/material/rods/fifty + /obj/item/stack/material/rods/mapped/steel/ten, + /obj/item/stack/material/rods/mapped/steel/fifty ) return spawnable_choices @@ -387,8 +388,8 @@ /obj/random/vendor name = "random vending machine" desc = "This is a randomly selected vending machine." - icon = 'icons/obj/vending.dmi' - icon_state = "coffee-hellfire" + icon = 'icons/obj/machines/vending/coffee.dmi' + icon_state = "world-hellfire" /obj/random/vendor/spawn_choices() var/static/list/spawnable_choices = list( @@ -467,16 +468,6 @@ ) return spawnable_choices -/obj/random/crayon - name = "random crayon" - desc = "This is a random crayon." - icon = 'icons/obj/items/crayons.dmi' - icon_state = "crayonred" - -/obj/random/crayon/spawn_choices() - var/static/list/spawnable_choices = subtypesof(/obj/item/pen/crayon) - return spawnable_choices - /obj/random/umbrella name = "Random Umbrella" desc = "This is a random umbrella." @@ -517,22 +508,22 @@ /obj/random/jewelry/spawn_choices() var/static/list/spawnable_choices = list( - /obj/item/clothing/ears/stud/wood = 10, - /obj/item/clothing/ears/dangle/wood = 10, - /obj/item/clothing/gloves/bracelet = 10, - /obj/item/clothing/neck/necklace = 10, - /obj/item/clothing/gloves/ring/material/silver = 5, - /obj/item/clothing/gloves/ring/material/bronze = 5, - /obj/item/clothing/gloves/ring/material/gold = 3, - /obj/item/clothing/ears/stud/silver = 3, - /obj/item/clothing/ears/dangle/silver = 3, - /obj/item/clothing/ears/stud/gold = 3, - /obj/item/clothing/ears/dangle/gold = 3, - /obj/item/clothing/gloves/ring/material/platinum = 1, - /obj/item/clothing/ears/stud/platinum = 1, - /obj/item/clothing/ears/dangle/platinum = 1, - /obj/item/clothing/ears/stud/diamond = 1, - /obj/item/clothing/ears/dangle/diamond = 1 + /obj/item/clothing/ears/stud/wood = 10, + /obj/item/clothing/ears/dangle/wood = 10, + /obj/item/clothing/gloves/bracelet = 10, + /obj/item/clothing/neck/necklace = 10, + /obj/item/clothing/gloves/ring/silver = 5, + /obj/item/clothing/gloves/ring/bronze = 5, + /obj/item/clothing/gloves/ring/gold = 3, + /obj/item/clothing/ears/stud/silver = 3, + /obj/item/clothing/ears/dangle/silver = 3, + /obj/item/clothing/ears/stud/gold = 3, + /obj/item/clothing/ears/dangle/gold = 3, + /obj/item/clothing/gloves/ring/platinum = 1, + /obj/item/clothing/ears/stud/platinum = 1, + /obj/item/clothing/ears/dangle/platinum = 1, + /obj/item/clothing/ears/stud/diamond = 1, + /obj/item/clothing/ears/dangle/diamond = 1 ) return spawnable_choices diff --git a/code/game/objects/random/subtypes/multi.dm b/code/game/objects/random/subtypes/multi.dm index 34cd5d7077e..a0268faecae 100644 --- a/code/game/objects/random/subtypes/multi.dm +++ b/code/game/objects/random/subtypes/multi.dm @@ -1,7 +1,3 @@ -/hook/roundstart/proc/roundstart_multi_spawn() - generate_multi_spawn_items() - return TRUE - /proc/generate_multi_spawn_items() for(var/id in multi_point_spawns) var/list/spawn_points = multi_point_spawns[id] diff --git a/code/game/objects/random/subtypes/paperwork.dm b/code/game/objects/random/subtypes/paperwork.dm index 061b4944609..a073a9d9506 100644 --- a/code/game/objects/random/subtypes/paperwork.dm +++ b/code/game/objects/random/subtypes/paperwork.dm @@ -12,7 +12,8 @@ icon_state = "crayonred" /obj/random/crayon/spawn_choices() - return subtypesof(/obj/item/pen/crayon) + var/static/list/spawnable_choices = subtypesof(/obj/item/pen/crayon) + return spawnable_choices /obj/random/clipboard name = "random clipboard" diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 6c3032c8709..7beee9b0878 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -32,13 +32,16 @@ new_color = null if(paint_color != new_color) paint_color = new_color + . = TRUE + refresh_color() + +/obj/structure/refresh_color() if(paint_color) color = paint_color else if(material && (material_alteration & MAT_FLAG_ALTERATION_COLOR)) color = material.color else - color = new_color - return FALSE + color = null /obj/structure/create_matter() ..() @@ -85,19 +88,19 @@ if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) - to_chat(user, SPAN_SUBTLE("Can be unanchored with a wrench, and moved around.")) + to_chat(user, SPAN_SUBTLE("Can be unanchored with a wrench or hammer, and moved around.")) else - to_chat(user, SPAN_SUBTLE("Can be anchored in place with a wrench.")) + to_chat(user, SPAN_SUBTLE("Can be anchored in place with a wrench or hammer.")) if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) - var/removed_with = "a crowbar" + var/removed_with = "a crowbar or hammer" if(material && material.removed_by_welder) removed_with = "a welding torch" if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) else - to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench first.")) + to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench or hammer first.")) else to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) @@ -156,7 +159,7 @@ last_damage_message = 0.75 /obj/structure/physically_destroyed(var/skip_qdel) - if(..(TRUE)) + if((. = ..(TRUE))) return dismantle_structure() /obj/structure/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -223,7 +226,7 @@ return TRUE var/mob/living/victim = grab.get_affecting_mob() - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) if(!istype(victim)) to_chat(user, SPAN_WARNING("You need to be grabbing a living creature to do that!")) @@ -242,12 +245,12 @@ playsound(loc, 'sound/weapons/tablehit1.ogg', 50, 1) var/list/L = take_damage(rand(1,5)) for(var/obj/item/shard/S in L) - if(S.sharp && prob(50)) + if(S.is_sharp() && prob(50)) victim.visible_message( SPAN_DANGER("\The [S] slices into [victim]'s face!"), SPAN_DANGER("\The [S] slices into your face!") ) - victim.standard_weapon_hit_effects(S, user, S.get_attack_force()*2, BP_HEAD) + victim.standard_weapon_hit_effects(S, user, S.expend_attack_force()*2, BP_HEAD) qdel(grab) else if(atom_flags & ATOM_FLAG_CLIMBABLE) var/obj/occupied = turf_is_crowded() @@ -319,3 +322,22 @@ Note: This proc can be overwritten to allow for different types of auto-alignmen W.pixel_x = (CELLSIZE * (cell_x + 0.5)) - center["x"] W.pixel_y = (CELLSIZE * (cell_y + 0.5)) - center["y"] W.pixel_z = 0 + +// Does this structure override turf depth for the purposes of mob offsets? +/obj/structure/proc/is_platform() + return FALSE + +/obj/structure/proc/is_z_passable() + return TRUE + +/obj/structure/on_turf_height_change(new_height) + // We may be a fixed point. + return !is_platform() && ..() + +/obj/structure/hitby(var/atom/movable/AM, var/datum/thrownthing/TT) + . = ..() + if(. && (structure_flags & STRUCTURE_FLAG_THROWN_DAMAGE)) + visible_message(SPAN_DANGER("\The [src] was hit by \the [AM].")) + playsound(src.loc, hitsound, 100, 1) + take_damage(AM.get_thrown_attack_force() * (TT.speed/THROWFORCE_SPEED_DIVISOR), AM.atom_damage_type) + diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index c367f6f1bf8..186aa29e0e0 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -4,81 +4,27 @@ /obj/structure/proc/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) if((tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unsecuring [src]" : "securing [src] in place"] with \the [wrench].")) - if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) - return TRUE - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - anchored = !anchored - visible_message(SPAN_NOTICE("\The [user] has [anchored ? "secured" : "unsecured"] \the [src] with \the [wrench].")) - update_icon() - return TRUE + return tool_toggle_anchors(user, wrench) return FALSE /obj/structure/proc/handle_default_welder_attackby(var/mob/user, var/obj/item/weldingtool/welder) if((tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user)) - if(material && !material.removed_by_welder) - to_chat(user, SPAN_WARNING("\The [src] is too delicate to be dismantled with \the [welder]; try a crowbar.")) - return TRUE - if(!welder.isOn()) - to_chat(user, SPAN_WARNING("Try lighting \the [welder] first.")) - return TRUE - if(welder.get_fuel() < 5) - to_chat(user, SPAN_WARNING("You need more fuel to complete this task.")) - return TRUE - playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) - visible_message(SPAN_NOTICE("\The [user] starts slicing apart \the [src] with \the [welder].")) - if(!do_after(user, 3 SECONDS, src) || QDELETED(src) || !welder.weld(5, user)) - return TRUE - playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) - visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [welder].")) - dismantle_structure(user) - return TRUE + return welder_dismantle(user, welder) return FALSE /obj/structure/proc/handle_default_crowbar_attackby(var/mob/user, var/obj/item/crowbar) if((tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user)) - if(material && material.removed_by_welder) - to_chat(user, SPAN_WARNING("\The [src] is too robust to be dismantled with \the [crowbar]; try a welding tool.")) - return TRUE - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - visible_message(SPAN_NOTICE("\The [user] starts levering apart \the [src] with \the [crowbar].")) - if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) - return TRUE - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [crowbar].")) - dismantle_structure(user) - return TRUE + return tool_dismantle(user, crowbar) return FALSE /obj/structure/proc/handle_default_cable_attackby(var/mob/user, var/obj/item/stack/cable_coil/coil) if((tool_interaction_flags & TOOL_INTERACTION_WIRING) && anchored) - if(wired) - to_chat(user, SPAN_WARNING("\The [src] has already been wired.")) - return TRUE - var/obj/item/stack/cable_coil/cable = coil - if(cable.get_amount() < 1) - to_chat(user, SPAN_WARNING("You need one length of coil to wire \the [src].")) - else - visible_message(SPAN_NOTICE("\The [user] starts to wire \the [src].")) - if(do_after(user, 4 SECONDS, src) && !wired && anchored && !QDELETED(src) && cable.use(1)) - wired = TRUE - visible_message(SPAN_NOTICE("\The [user] finishes wiring \the [src].")) - return TRUE + return install_wiring(user, coil) return FALSE -/obj/structure/proc/handle_default_wirecutter_attackby(var/mob/user, var/obj/item/wirecutters/wirecutters) +/obj/structure/proc/handle_default_wirecutter_attackby(var/mob/user, var/obj/item/wirecutters) if((tool_interaction_flags & TOOL_INTERACTION_WIRING) && anchored) - if(!wired) - to_chat(user, SPAN_WARNING("\The [src] has not been wired.")) - return TRUE - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins stripping the wiring out of \the [src].")) - if(do_after(user, 4 SECONDS, src) && !QDELETED(src) && wired) - visible_message(SPAN_NOTICE("\The [user] finishes stripping the wiring from \the [src].")) - new/obj/item/stack/cable_coil(src.loc, 1) - wired = FALSE - return TRUE + return strip_wiring(user, wirecutters) return FALSE /obj/structure/proc/handle_default_screwdriver_attackby(var/mob/user, var/obj/item/screwdriver) @@ -114,33 +60,41 @@ current_health = clamp(current_health + used*DOOR_REPAIR_AMOUNT, current_health, current_max_health) /obj/structure/attackby(obj/item/used_item, mob/user) + if(used_item.user_can_attack_with(user, silent = TRUE)) - var/force = used_item.get_attack_force(user) - if(force && user.a_intent == I_HURT) + var/force = used_item.expend_attack_force(user) + if(force && user.check_intent(I_FLAG_HARM)) attack_animation(user) visible_message(SPAN_DANGER("\The [src] has been [pick(used_item.attack_verb)] with \the [used_item] by \the [user]!")) take_damage(force, used_item.atom_damage_type) - . = TRUE - - else if(IS_WRENCH(used_item)) - . = handle_default_wrench_attackby(user, used_item) - else if(IS_SCREWDRIVER(used_item)) - . = handle_default_screwdriver_attackby(user, used_item) - else if(IS_WELDER(used_item)) - . = handle_default_welder_attackby(user, used_item) - else if(IS_CROWBAR(used_item)) - . = handle_default_crowbar_attackby(user, used_item) - else if(IS_COIL(used_item)) - . = handle_default_cable_attackby(user, used_item) - else if(IS_WIRECUTTER(used_item)) - . = handle_default_wirecutter_attackby(user, used_item) - else if(can_repair_with(used_item) && can_repair(user)) - . = handle_repair(user, used_item) - if(.) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) add_fingerprint(user) - return . - return ..() + return TRUE + + // This handles standard tool interactions (anchoring, dismantling), calls below are for legacy purposes. + . = ..() + if(.) + return + + if(IS_HAMMER(used_item)) + . = handle_default_hammer_attackby(user, used_item) + else if(IS_WRENCH(used_item)) + . = handle_default_wrench_attackby(user, used_item) + else if(IS_SCREWDRIVER(used_item)) + . = handle_default_screwdriver_attackby(user, used_item) + else if(IS_WELDER(used_item)) + . = handle_default_welder_attackby(user, used_item) + else if(IS_CROWBAR(used_item)) + . = handle_default_crowbar_attackby(user, used_item) + else if(IS_COIL(used_item)) + . = handle_default_cable_attackby(user, used_item) + else if(IS_WIRECUTTER(used_item)) + . = handle_default_wirecutter_attackby(user, used_item) + else if(can_repair_with(used_item) && can_repair(user)) + . = handle_repair(user, used_item) + if(.) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + add_fingerprint(user) /obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/environment_smash) if(environment_smash >= 1) @@ -156,4 +110,96 @@ take_damage(damage) else visible_message(SPAN_NOTICE("\The [user] bonks \the [src] harmlessly.")) - return TRUE \ No newline at end of file + return TRUE + +/obj/structure/proc/strip_wiring(mob/user, obj/item/wirecutters) + if(!wired) + to_chat(user, SPAN_WARNING("\The [src] has not been wired.")) + return TRUE + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + visible_message(SPAN_NOTICE("\The [user] begins stripping the wiring out of \the [src].")) + if(do_after(user, 4 SECONDS, src) && !QDELETED(src) && wired) + visible_message(SPAN_NOTICE("\The [user] finishes stripping the wiring from \the [src].")) + new/obj/item/stack/cable_coil(src.loc, 1) + wired = FALSE + return TRUE + +/obj/structure/proc/install_wiring(mob/user, obj/item/stack/cable_coil/coil) + if(wired) + to_chat(user, SPAN_WARNING("\The [src] has already been wired.")) + return TRUE + var/obj/item/stack/cable_coil/cable = coil + if(cable.get_amount() < 1) + to_chat(user, SPAN_WARNING("You need one length of coil to wire \the [src].")) + else + visible_message(SPAN_NOTICE("\The [user] starts to wire \the [src].")) + if(do_after(user, 4 SECONDS, src) && !wired && anchored && !QDELETED(src) && cable.use(1)) + wired = TRUE + visible_message(SPAN_NOTICE("\The [user] finishes wiring \the [src].")) + return TRUE + + +/obj/structure/proc/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) + + // Resolve ambiguous interactions. + var/can_deconstruct = (tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user) + var/can_unanchor = (tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user) + if(can_deconstruct && can_unanchor) + var/choice = alert(user, "Do you wish to [anchored ? "unanchor" : "anchor"] or dismantle this structure?", "Tool Choice", (anchored ? "Unanchor" : "Anchor"), "Deconstruct", "Cancel") + if(!choice || choice == "Cancel" || QDELETED(src) || QDELETED(user) || QDELETED(hammer) || !CanPhysicallyInteract(user) || user.get_active_held_item() != hammer) + return TRUE + if(choice == "Deconstruct") + can_unanchor = FALSE + else + can_deconstruct = FALSE + + if(can_unanchor) + return tool_toggle_anchors(user, hammer, anchor_sound = 'sound/items/Deconstruct.ogg') + + if(can_deconstruct) + return tool_dismantle(user, hammer, deconstruct_string = "knocking apart") + + return FALSE + +/obj/structure/proc/tool_dismantle(mob/user, obj/item/tool, dismantle_sound = 'sound/items/Crowbar.ogg', deconstruct_string = "levering apart") + if(material && material.removed_by_welder) + to_chat(user, SPAN_WARNING("\The [src] is too robust to be dismantled with \the [tool]; try a welding tool.")) + return TRUE + playsound(loc, dismantle_sound, 50, 1) + visible_message(SPAN_NOTICE("\The [user] starts [deconstruct_string] \the [src] with \the [tool].")) + if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(loc, dismantle_sound, 50, 1) + visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [tool].")) + dismantle_structure(user) + return TRUE + +/obj/structure/proc/welder_dismantle(mob/user, obj/item/weldingtool/welder) + if(material && !material.removed_by_welder) + to_chat(user, SPAN_WARNING("\The [src] is too delicate to be dismantled with \the [welder]; try a crowbar.")) + return TRUE + if(!welder.isOn()) + to_chat(user, SPAN_WARNING("Try lighting \the [welder] first.")) + return TRUE + if(welder.get_fuel() < 5) + to_chat(user, SPAN_WARNING("You need more fuel to complete this task.")) + return TRUE + playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + visible_message(SPAN_NOTICE("\The [user] starts slicing apart \the [src] with \the [welder].")) + if(!do_after(user, 3 SECONDS, src) || QDELETED(src) || !welder.weld(5, user)) + return TRUE + playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [welder].")) + dismantle_structure(user) + return TRUE + +/obj/structure/proc/tool_toggle_anchors(mob/user, obj/item/tool, anchor_sound = 'sound/items/Ratchet.ogg') + playsound(src.loc, anchor_sound, 100, 1) + visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unsecuring [src]" : "securing [src] in place"] with \the [tool].")) + if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(src.loc, anchor_sound, 100, 1) + anchored = !anchored + visible_message(SPAN_NOTICE("\The [user] has [anchored ? "secured" : "unsecured"] \the [src] with \the [tool].")) + update_icon() + return TRUE diff --git a/code/game/objects/structures/_structure_icon.dm b/code/game/objects/structures/_structure_icon.dm index 8dad14601ba..3f3c7e7e4ec 100644 --- a/code/game/objects/structures/_structure_icon.dm +++ b/code/game/objects/structures/_structure_icon.dm @@ -7,7 +7,7 @@ var/global/list/default_noblend_objects = list(/obj/machinery/door/window, /obj/ /obj/structure/on_update_icon() ..() if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() cut_overlays() if(istype(lock)) update_lock_overlay() diff --git a/code/game/objects/structures/_structure_interactions.dm b/code/game/objects/structures/_structure_interactions.dm new file mode 100644 index 00000000000..ac17e0641db --- /dev/null +++ b/code/game/objects/structures/_structure_interactions.dm @@ -0,0 +1,74 @@ +// Anchoring or unanchoring with a hammer or a wrench. +/decl/interaction_handler/structure + abstract_type = /decl/interaction_handler/structure + expected_target_type = /obj/structure + +/decl/interaction_handler/structure/unanchor + name = "Toggle Anchoring" + examine_desc = "anchor or unanchor $TARGET_THEM$" + +/decl/interaction_handler/structure/unanchor/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + var/obj/structure/struct = target + if(!(struct.tool_interaction_flags & TOOL_INTERACTION_ANCHOR) || !struct.can_unanchor(user)) + return FALSE + return istype(prop) && (IS_WRENCH(prop) || IS_HAMMER(prop)) + +/decl/interaction_handler/structure/unanchor/invoked(atom/target, mob/user, obj/item/prop) + . = ..() + var/obj/structure/struct = target + return struct.tool_toggle_anchors(user, prop) + +// Removing wiring with wirecutters or installing it with a cable coil. +/decl/interaction_handler/structure/wiring + name = "Modify Wiring" + examine_desc = "strip or install wiring" + +/decl/interaction_handler/structure/wiring/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + var/obj/structure/struct = target + if(!(struct.tool_interaction_flags & TOOL_INTERACTION_WIRING)) + return FALSE + if(struct.wired) + return IS_WIRECUTTER(prop) + return IS_COIL(prop) + +/decl/interaction_handler/structure/wiring/invoked(atom/target, mob/user, obj/item/prop) + var/obj/structure/struct = target + if(struct.wired) + return struct.strip_wiring(user, prop) + return struct.install_wiring(user, prop) + +// Dismantling a structure. +/decl/interaction_handler/structure/dismantle + name = "Dismantle Structure" + examine_desc = "dismantle $TARGET_THEM$" + +/decl/interaction_handler/structure/dismantle/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + var/obj/structure/struct = target + if(!(struct.tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) || !struct.can_dismantle(user)) + return FALSE + return IS_WELDER(prop) || IS_CROWBAR(prop) || IS_HAMMER(prop) + +/decl/interaction_handler/structure/dismantle/invoked(atom/target, mob/user, obj/item/prop) + var/obj/structure/struct = target + if(IS_WELDER(prop)) + return struct.welder_dismantle(user, prop) + return struct.tool_dismantle(user, prop) + +/decl/interaction_handler/put_in_storage + name = "Put In Storage" + +/decl/interaction_handler/put_in_storage/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && istype(prop) && target.storage + +// Boilerplate from /atom/proc/attackby(), replicated here so tool interactions can be bypassed. +/decl/interaction_handler/put_in_storage/invoked(atom/target, mob/user, obj/item/prop) + if((isrobot(user) && (prop == user.get_active_held_item())) || !target.storage.can_be_inserted(prop, user)) + return FALSE + prop.add_fingerprint(user) + return target.storage.handle_item_insertion(user, prop) diff --git a/code/game/objects/structures/structure_lock.dm b/code/game/objects/structures/_structure_lock.dm similarity index 93% rename from code/game/objects/structures/structure_lock.dm rename to code/game/objects/structures/_structure_lock.dm index 0470b4bc9c5..2713beb48b3 100644 --- a/code/game/objects/structures/structure_lock.dm +++ b/code/game/objects/structures/_structure_lock.dm @@ -44,7 +44,7 @@ return FALSE if(!lock.isLocked()) return TRUE - if(user?.a_intent == I_HELP && (istype(held, /obj/item/key) || istype(held, /obj/item/keyring))) + if(user?.check_intent(I_FLAG_HELP) && (istype(held, /obj/item/key) || istype(held, /obj/item/keyring))) try_key_unlock(held, user) if(!lock.isLocked()) return TRUE diff --git a/code/game/objects/structures/_structure_materials.dm b/code/game/objects/structures/_structure_materials.dm index 2c50f024bbe..db8065e41d4 100644 --- a/code/game/objects/structures/_structure_materials.dm +++ b/code/game/objects/structures/_structure_materials.dm @@ -17,7 +17,7 @@ if(material_alteration & MAT_FLAG_ALTERATION_DESC) update_material_desc() if(material_alteration & MAT_FLAG_ALTERATION_COLOR) - update_material_colour() + update_material_color() if((alpha / 255) < 0.5) set_opacity(FALSE) else @@ -37,19 +37,19 @@ /obj/structure/proc/update_material_name(var/override_name) var/base_name = override_name || initial(name) - if(istype(material)) + if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_NAME)) SetName("[material.adjective_name] [base_name]") else SetName(base_name) /obj/structure/proc/update_material_desc(var/override_desc) var/base_desc = override_desc || initial(desc) - if(istype(material)) + if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_DESC)) desc = "[base_desc] This one is made of [material.solid_name]." else desc = base_desc -/obj/structure/proc/update_material_colour() +/obj/structure/proc/update_material_color() color = get_color() if(istype(material)) alpha = clamp((50 + material.opacity * 255), 0, 255) @@ -65,19 +65,25 @@ if(parts_type && !ispath(parts_type, /obj/item/stack)) for(var/i = 1 to max(parts_amount, 1)) LAZYADD(., create_dismantled_part(T)) - else - for(var/mat in matter) - var/decl/material/M = GET_DECL(mat) - var/placing - if(isnull(parts_amount)) - placing = (matter[mat] / SHEET_MATERIAL_AMOUNT) * 0.75 - if(parts_type) - placing *= atom_info_repository.get_matter_multiplier_for(parts_type, mat, placing) - placing = floor(placing) - else - placing = parts_amount - if(placing > 0) + return + + for(var/mat in matter) + + var/decl/material/M = GET_DECL(mat) + var/placing + if(isnull(parts_amount)) + placing = (matter[mat] / SHEET_MATERIAL_AMOUNT) * 0.75 + if(material == M && parts_type) + placing *= atom_info_repository.get_matter_multiplier_for(parts_type, mat, placing) + placing = floor(placing) + else + placing = parts_amount + + if(placing > 0) + if(material == M) LAZYADD(., M.place_dismantled_product(T, FALSE, placing, parts_type)) + else + LAZYADD(., M.place_dismantled_product(T, FALSE, placing)) /obj/structure/proc/clear_materials() matter = null diff --git a/code/game/objects/structures/armor_stand.dm b/code/game/objects/structures/armor_stand.dm new file mode 100644 index 00000000000..7dabc4c24f0 --- /dev/null +++ b/code/game/objects/structures/armor_stand.dm @@ -0,0 +1,76 @@ +/obj/structure/armor_stand + name = "armor stand" + desc = "A simple stand used to hold armor and helmets for display." + icon = 'icons/obj/structures/armor_stand.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/list/slots_to_gear = list( + (slot_wear_suit_str) = null, + (slot_head_str) = null, + (slot_belt_str) = null, + (slot_shoes_str) = null, + (slot_gloves_str) = null + ) + var/list/gear_to_slot + +/obj/structure/armor_stand/Exited(atom/movable/AM, atom/new_loc) + . = ..() + var/weakref/atom_ref = weakref(AM) + if(atom_ref in gear_to_slot) + var/slot = gear_to_slot[atom_ref] + slots_to_gear[slot] = null + LAZYREMOVE(gear_to_slot, atom_ref) + update_icon() + +/obj/structure/armor_stand/Destroy() + slots_to_gear.Cut() + LAZYCLEARLIST(gear_to_slot) + . = ..() + +/obj/structure/armor_stand/attack_hand(mob/user) + . = ..() + if(. || !LAZYLEN(gear_to_slot)) + return + var/weakref/removed_item_ref + if(LAZYLEN(gear_to_slot) == 1) + removed_item_ref = gear_to_slot[1] + else + removed_item_ref = input(user, "Which piece of equipment would you like to remove?", "Armor Stand") as null|anything in gear_to_slot + if(!CanPhysicallyInteract(user) || QDELETED(src) || QDELETED(user) || !(removed_item_ref in gear_to_slot)) + return TRUE + var/obj/item/removed_item = removed_item_ref?.resolve() + if(istype(removed_item) && !QDELETED(removed_item) && removed_item.loc == src) + removed_item.dropInto(loc) + user.put_in_hands(removed_item) + return TRUE + +/obj/structure/armor_stand/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/clothing)) + var/obj/item/clothing/clothes = used_item + if(!(clothes.fallback_slot in slots_to_gear)) + to_chat(user, SPAN_WARNING("\The [src] cannot hold \the [used_item].")) + else if(slots_to_gear[clothes.fallback_slot]) + var/weakref/atom_ref = slots_to_gear[clothes.fallback_slot] + to_chat(user, SPAN_WARNING("\The [src] is already holding \the [atom_ref.resolve()].")) + else if(user.try_unequip(clothes, src)) + var/weakref/atom_ref = weakref(clothes) + slots_to_gear[clothes.fallback_slot] = atom_ref + LAZYSET(gear_to_slot, atom_ref, clothes.fallback_slot) + to_chat(user, SPAN_NOTICE("You hang \the [clothes] from \the [src].")) + update_icon() + return TRUE + return ..() + +/obj/structure/armor_stand/on_update_icon() + . = ..() + for(var/slot in slots_to_gear) + var/weakref/atom_ref = slots_to_gear[slot] + var/obj/item/thing = atom_ref?.resolve() + if(istype(thing)) + var/image/mob_overlay = thing.get_mob_overlay(null, slot) + mob_overlay.appearance_flags |= RESET_COLOR + add_overlay(mob_overlay) + compile_overlays() diff --git a/code/game/objects/structures/banners.dm b/code/game/objects/structures/banners.dm deleted file mode 100644 index 11f37de7bfd..00000000000 --- a/code/game/objects/structures/banners.dm +++ /dev/null @@ -1,158 +0,0 @@ -/obj/structure/banner_frame - name = "banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon = 'icons/obj/structures/banner_frame.dmi' - icon_state = "banner_stand_preview" - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - anchored = TRUE - density = FALSE - opacity = FALSE - 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 - max_health = 50 - var/base_icon_state = "banner_stand" - /// Reference to any banner currently hung on the frame. - var/obj/item/banner/banner - -/obj/structure/banner_frame/Initialize(ml, _mat, _reinf_mat) - if(ispath(banner)) - set_banner(new banner(src)) - . = ..() - update_icon() - -/obj/structure/banner_frame/proc/set_banner(var/new_banner) - if(banner == new_banner) - return - banner = new_banner - if(banner) - name = banner.name - desc = "[initial(desc)] [banner.hung_desc]" - else - name = initial(name) - desc = initial(desc) - update_icon() - -/obj/structure/banner_frame/attack_hand(mob/user) - if(banner && user.check_dexterity(DEXTERITY_HOLD_ITEM)) - user.put_in_hands(banner) - var/old_banner = banner - set_banner(null) - user.visible_message(SPAN_NOTICE("\The [user] removes \the [old_banner] from \the [src]."), SPAN_NOTICE("You remove \the [old_banner] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) - return TRUE - return ..() - -/obj/structure/banner_frame/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/banner)) - if(banner) - to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) - return TRUE - if(user.try_unequip(O, src)) - user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) - set_banner(O) - return TRUE - return ..() - -/obj/structure/banner_frame/dump_contents(atom/forced_loc = loc, mob/user) - if(istype(banner)) - banner.dropInto(forced_loc) - banner = null - . = ..() - -/obj/structure/banner_frame/on_update_icon() - . = ..() - icon_state = base_icon_state - if(istype(banner)) - var/image/I = image(banner.icon, "banner_base") - I.appearance_flags |= RESET_COLOR - I.color = banner.color - add_overlay(I) - for(var/decal in banner.decals) - I = image(banner.icon, decal) - I.appearance_flags |= RESET_COLOR - I.color = banner.decals[decal] - add_overlay(I) - -/obj/structure/banner_frame/Destroy() - if(istype(banner)) - QDEL_NULL(banner) - return ..() - -/obj/item/banner - name = "banner" - desc = "A furled-up banner." - icon = 'icons/obj/banner.dmi' - icon_state = "banner" - material = /decl/material/solid/organic/cloth - color = /decl/material/solid/organic/cloth::color - max_health = 20 - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME - w_class = ITEM_SIZE_NORMAL - var/hung_desc = "The banner is rather plain, with no markings." - var/list/decals - -/obj/item/banner/woven - icon = 'icons/obj/banner_woven.dmi' - material = /decl/material/solid/organic/plantmatter/grass/dry - color = /decl/material/solid/organic/plantmatter/grass/dry::color - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - hung_desc = "The woven banner is rustic and uneven." - -/obj/item/banner/green - name = "green banner" - paint_color = COLOR_GREEN - color = COLOR_GREEN - -/obj/item/banner/red - name = "red banner" - paint_color = COLOR_RED - color = COLOR_RED - -/obj/item/banner/blue - name = "blue banner" - paint_color = COLOR_BLUE - color = COLOR_BLUE - -// Mapping helpers below. -/obj/structure/banner_frame/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color // Mapping preview colour. - -/obj/structure/banner_frame/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color - -/obj/structure/banner_frame/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color - -// A wall-mounted banner frame with no stand. -/obj/structure/banner_frame/wall - name = "hanging banner frame" - desc = "A sturdy frame suitable for hanging a banner." - icon_state = "banner_hanging_preview" - base_icon_state = "banner_hanging" - directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' - -/obj/structure/banner_frame/wall/ebony - material = /decl/material/solid/organic/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color - -/obj/structure/banner_frame/wall/ebony/red - banner = /obj/item/banner/red - color = /obj/item/banner/red::color // Mapping preview colour. - -/obj/structure/banner_frame/wall/ebony/blue - banner = /obj/item/banner/blue - color = /obj/item/banner/blue::color - -/obj/structure/banner_frame/wall/ebony/green - banner = /obj/item/banner/green - color = /obj/item/banner/green::color - -/obj/structure/banner_frame/wall/ebony/woven - banner = /obj/item/banner/woven - color = /obj/item/banner/woven::color \ No newline at end of file diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm deleted file mode 100644 index 20d0c9d6eb2..00000000000 --- a/code/game/objects/structures/barrel.dm +++ /dev/null @@ -1,79 +0,0 @@ -/obj/structure/reagent_dispensers/barrel - name = "barrel" - desc = "A stout barrel for storing large amounts of liquids or substances." - icon = 'icons/obj/structures/barrel.dmi' - icon_state = ICON_STATE_WORLD - anchored = TRUE - atom_flags = ATOM_FLAG_CLIMBABLE - matter = null - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - wrenchable = FALSE - storage = /datum/storage/barrel - amount_dispensed = 10 - possible_transfer_amounts = @"[10,25,50,100]" - volume = 7500 - movable_flags = MOVABLE_FLAG_WHEELED - throwpass = TRUE - -/obj/structure/reagent_dispensers/barrel/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/structure/reagent_dispensers/barrel/attackby(obj/item/W, mob/user) - . = ..() - if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) - user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) - W.fluid_act(reagents) - return TRUE - -/obj/structure/reagent_dispensers/barrel/LateInitialize(mapload, ...) - ..() - if(mapload) - for(var/obj/item/thing in loc) - if(!thing.simulated || thing.anchored) - continue - if(storage.can_be_inserted(thing, null)) - storage.handle_item_insertion(null, thing) - -/obj/structure/reagent_dispensers/barrel/on_reagent_change() - if(!(. = ..())) - return - var/primary_mat = reagents?.get_primary_reagent_name() - if(primary_mat) - update_material_name("[initial(name)] of [primary_mat]") - else - update_material_name() - update_icon() - -/obj/structure/reagent_dispensers/barrel/on_update_icon() - . = ..() - if(ATOM_IS_OPEN_CONTAINER(src)) - if(reagents) - var/overlay_amount = NONUNIT_CEILING(reagents.total_liquid_volume / reagents.maximum_volume * 100, 10) - var/image/filling_overlay = overlay_image(icon, "[icon_state]-[overlay_amount]", reagents.get_color(), RESET_COLOR | RESET_ALPHA) - add_overlay(filling_overlay) - add_overlay(overlay_image(icon, "[icon_state]-lidopen", material.color, RESET_COLOR)) - else - add_overlay(overlay_image(icon, "[icon_state]-lidclosed", material.color, RESET_COLOR)) - -/obj/structure/reagent_dispensers/barrel/ebony - material = /decl/material/solid/organic/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color - -/obj/structure/reagent_dispensers/barrel/ebony/water/populate_reagents() - . = ..() - add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) - -/obj/structure/reagent_dispensers/barrel/ebony/beer/populate_reagents() - . = ..() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) - -/obj/structure/reagent_dispensers/barrel/ebony/wine/populate_reagents() - . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) - -/obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() - . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm new file mode 100644 index 00000000000..73424c45322 --- /dev/null +++ b/code/game/objects/structures/barrels/barrel.dm @@ -0,0 +1,132 @@ +/obj/structure/reagent_dispensers/barrel + name = "barrel" + desc = "A stout barrel for storing large amounts of liquids or substances." + icon = 'icons/obj/structures/barrels/barrel.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + atom_flags = ATOM_FLAG_CLIMBABLE + matter = null + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + wrenchable = FALSE + storage = /datum/storage/barrel + amount_dispensed = 10 + volume = 7500 + movable_flags = MOVABLE_FLAG_WHEELED + throwpass = TRUE + tool_interaction_flags = TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT + // Should we draw our lid and liquid contents as overlays? + var/show_liquid_contents = TRUE + // Rivets, bands, etc. Currently just cosmetic. + var/decl/material/metal_material = /decl/material/solid/metal/iron + +// Overrides due to wonky reagent_dispeners opencontainer flag handling. +/obj/structure/reagent_dispensers/barrel/can_be_poured_from(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +/obj/structure/reagent_dispensers/barrel/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) + +// Override to skip open container check. +/obj/structure/reagent_dispensers/barrel/can_drink_from(mob/user) + return reagents?.total_volume && user.check_has_mouth() + +/obj/structure/reagent_dispensers/barrel/Initialize() + if(ispath(metal_material)) + metal_material = GET_DECL(metal_material) + if(!istype(metal_material)) + metal_material = null + . = ..() + if(. == INITIALIZE_HINT_NORMAL && storage) + return INITIALIZE_HINT_LATELOAD // we want to grab our turf contents. + +/obj/structure/reagent_dispensers/barrel/LateInitialize(mapload, ...) + ..() + if(mapload) + for(var/obj/item/thing in loc) + if(!thing.simulated || thing.anchored) + continue + if(storage.can_be_inserted(thing, null)) + storage.handle_item_insertion(null, thing) + +/obj/structure/reagent_dispensers/barrel/on_reagent_change() + if(!(. = ..()) || QDELETED(src)) + return + var/primary_mat = reagents?.get_primary_reagent_name() + if(primary_mat) + update_material_name("[initial(name)] of [primary_mat]") + else + update_material_name() + update_icon() + +/obj/structure/reagent_dispensers/barrel/on_update_icon() + + . = ..() + + // Layer below lid/lid metal. + if(metal_material) + add_overlay(overlay_image(icon, "[icon_state]-metal", metal_material.color, RESET_COLOR)) + + // Add lid/reagents overlay/lid metal. + if(show_liquid_contents && ATOM_IS_OPEN_CONTAINER(src)) + if(reagents) + var/overlay_amount = NONUNIT_CEILING(reagents.total_liquid_volume / reagents.maximum_volume * 100, 10) + var/image/filling_overlay = overlay_image(icon, "[icon_state]-[overlay_amount]", reagents.get_color(), RESET_COLOR | RESET_ALPHA) + add_overlay(filling_overlay) + add_overlay(overlay_image(icon, "[icon_state]-lidopen", material?.color, RESET_COLOR)) + if(metal_material) + add_overlay(overlay_image(icon, "[icon_state]-lidopen-metal", metal_material.color, RESET_COLOR)) + else + add_overlay(overlay_image(icon, "[icon_state]-lidclosed", material?.color, RESET_COLOR)) + if(metal_material) + add_overlay(overlay_image(icon, "[icon_state]-lidclosed-metal", metal_material.color, RESET_COLOR)) + + if(istype(loc, /obj/structure/cask_rack)) + loc.update_icon() + +/obj/structure/reagent_dispensers/barrel/get_standard_interactions(var/mob/user) + . = ..() + if(reagents?.maximum_volume) + LAZYADD(., global._reagent_interactions) + + // Disambiguation actions, since barrels can have several different potential interactions for + // the same item. It would be nice to enable this on /obj/structure in general but there are a + // ton of really bespoke overrides of the standard tool methods (windows, AI core, etc.). + if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) + LAZYADD(., /decl/interaction_handler/structure/unanchor) + if(tool_interaction_flags & TOOL_INTERACTION_WIRING) + LAZYADD(., /decl/interaction_handler/structure/wiring) + if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) + LAZYADD(., /decl/interaction_handler/structure/dismantle) + if(LAZYLEN(.) && storage) + LAZYADD(., /decl/interaction_handler/put_in_storage) + +// Copy of above - maybe we should just have a single 'get interactions' proc at this point? +/obj/structure/reagent_dispensers/barrel/get_alt_interactions(mob/user) + . = ..() + if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) + LAZYADD(., /decl/interaction_handler/structure/unanchor) + if(tool_interaction_flags & TOOL_INTERACTION_WIRING) + LAZYADD(., /decl/interaction_handler/structure/wiring) + if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) + LAZYADD(., /decl/interaction_handler/structure/dismantle) + +/obj/structure/reagent_dispensers/barrel/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/reagent_dispensers/barrel/ebony/water/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/ebony/beer/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/ebony/wine/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/ebony/oil/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/oil, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/cask.dm b/code/game/objects/structures/barrels/cask.dm new file mode 100644 index 00000000000..d3755dfe55e --- /dev/null +++ b/code/game/objects/structures/barrels/cask.dm @@ -0,0 +1,42 @@ +/obj/structure/reagent_dispensers/barrel/cask + name = "cask" + desc = "A small barrel used to store moderate amounts of liquids or substances." + icon = 'icons/obj/structures/barrels/cask.dmi' + anchored = FALSE + show_liquid_contents = FALSE + storage = null // Intended for storing liquids. + +// Horrible workaround for physical interaction checks. +/obj/structure/reagent_dispensers/barrel/cask/nano_host() + return istype(loc, /obj/structure/cask_rack) ? loc : src + +/obj/structure/reagent_dispensers/barrel/cask/receive_mouse_drop(atom/dropping, mob/user, params) + if(istype(loc, /obj/structure/cask_rack)) + return loc.receive_mouse_drop(dropping, user, params) + return ..() + +/obj/structure/reagent_dispensers/barrel/cask/handle_mouse_drop(atom/over, mob/user, params) + var/obj/structure/cask_rack/rack = loc + if(istype(rack) && isturf(over) && user.Adjacent(over) && rack.Adjacent(over) && rack.try_unstack_barrel(src, over, user)) + return + return ..() + +/obj/structure/reagent_dispensers/barrel/cask/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/reagent_dispensers/barrel/cask/ebony/water/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/cask/ebony/beer/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/cask/ebony/wine/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) + +/obj/structure/reagent_dispensers/barrel/cask/ebony/oil/populate_reagents() + . = ..() + add_to_reagents(/decl/material/liquid/oil, reagents.maximum_volume) diff --git a/code/game/objects/structures/barrels/cask_rack.dm b/code/game/objects/structures/barrels/cask_rack.dm new file mode 100644 index 00000000000..cbe68ef5f7e --- /dev/null +++ b/code/game/objects/structures/barrels/cask_rack.dm @@ -0,0 +1,174 @@ +/obj/structure/cask_rack + name = "cask rack" + desc = "A flat rack used to stop a cask from rolling around." + icon = 'icons/obj/structures/barrels/cask_rack.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + opacity = FALSE + density = FALSE // Recalculated when barrels added or removed + w_class = ITEM_SIZE_STRUCTURE + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + var/max_stack = 1 + +/obj/structure/cask_rack/Initialize(ml, _mat, _reinf_mat) + . = ..() + if(isturf(loc)) + for(var/atom/movable/stackable in loc) + if(try_stack_barrel(stackable) && length(contents) >= max_stack) + return + +/obj/structure/cask_rack/examine(mob/user, distance, infix, suffix) + . = ..() + if(length(contents)) + to_chat(user, SPAN_NOTICE("It contains [english_list(contents)].")) + +/obj/structure/cask_rack/handle_mouse_drop(atom/over, mob/user, params) + if(isturf(over) && user.Adjacent(over) && Adjacent(over) && try_unstack_barrel(target = over, user = user)) + return + return ..() + +/obj/structure/cask_rack/receive_mouse_drop(atom/dropping, mob/user, params) + . = ..() + if(!. && user.Adjacent(src) && dropping.Adjacent(src) && user.Adjacent(dropping)) + return try_stack_barrel_timed(dropping, user) + +/obj/structure/cask_rack/on_update_icon() + . = ..() + if(length(contents)) + // Workaround for base color getting applied to vis_contents. + var/base_color = get_color() + color = null + var/image/I = image(icon, icon_state) + I.color = base_color + add_overlay(I) + // Reposition/update our contents. + var/i = 0 + var/list/stackable_types = get_stackable_barrel_types() + for(var/atom/movable/barrel in contents) + if(is_type_in_list(barrel, stackable_types)) + i++ + adjust_barrel_offsets(barrel, i) + else + color = get_color() + compile_overlays() // Avoid wonky flickering on contents changes + +/obj/structure/cask_rack/proc/adjust_barrel_offsets(atom/movable/barrel, barrel_position) + barrel.reset_offsets(anim_time = 0) + barrel.vis_flags |= (VIS_INHERIT_LAYER | VIS_INHERIT_PLANE) + +/obj/structure/cask_rack/Entered(atom/movable/AM, atom/old_loc) + . = ..() + if(istype(AM) && !QDELETED(AM) && is_type_in_list(AM, get_stackable_barrel_types())) + vis_contents |= AM + recalculate_barrel_values() + +/obj/structure/cask_rack/Exited(atom/movable/AM, atom/new_loc) + . = ..() + if(istype(AM) && is_type_in_list(AM, get_stackable_barrel_types())) + vis_contents -= AM + AM.vis_flags = initial(AM.vis_flags) + AM.reset_offsets(anim_time = 0) + recalculate_barrel_values() + +/obj/structure/cask_rack/proc/recalculate_barrel_values() + if(length(contents)) + density = TRUE + anchored = TRUE + obj_flags &= ~OBJ_FLAG_ANCHORABLE + atom_flags |= ATOM_FLAG_CLIMBABLE + else + density = FALSE + obj_flags |= OBJ_FLAG_ANCHORABLE + atom_flags &= ~ATOM_FLAG_CLIMBABLE + update_icon() + +/obj/structure/cask_rack/proc/try_unstack_barrel(atom/movable/barrel, turf/target, mob/user) + if(!loc) + return FALSE + if(!barrel) + if(!length(contents)) + to_chat(user, SPAN_WARNING("\The [src] has nothing stacked on it.")) + return FALSE + barrel = contents[length(contents)] + if(!istype(barrel) || !barrel.simulated) + return FALSE + if(target && (!isturf(target) || !loc.Adjacent(target))) // TODO: Enter() or CanPass() checks instead of relying on step_towards() below. + to_chat(user, SPAN_NOTICE("You cannot move \the [barrel] to \the [target].")) + return FALSE + if(user && !user.do_skilled(3 SECONDS, SKILL_HAULING, src)) + to_chat(user, SPAN_NOTICE("You stop moving \the [barrel] off of \the [src].")) + return FALSE + to_chat(user, SPAN_NOTICE("You move \the [barrel] off \the [src].")) + barrel.dropInto(loc) + if(target) + step_towards(barrel, target) + return TRUE + +/obj/structure/cask_rack/proc/can_stack_barrel(atom/movable/barrel, mob/user) + if(!istype(barrel) || !barrel.simulated || barrel.anchored) + return FALSE + if(length(contents) >= max_stack) + to_chat(user, SPAN_WARNING("\The [src] is already stacked to capacity.")) + return FALSE + var/list/stackable_types = get_stackable_barrel_types() + if(!is_type_in_list(barrel, stackable_types)) + to_chat(user, SPAN_WARNING("\The [src] cannot hold \the [barrel].")) + return FALSE + return TRUE + +/obj/structure/cask_rack/proc/try_stack_barrel(atom/movable/barrel, mob/user) + if(!can_stack_barrel(barrel, user)) + return FALSE + barrel.forceMove(src) + return TRUE + +/obj/structure/cask_rack/proc/try_stack_barrel_timed(atom/movable/barrel, mob/user) + if(!can_stack_barrel(barrel, user)) + return FALSE + if(user && !user.do_skilled(3 SECONDS, SKILL_HAULING, src)) + to_chat(user, SPAN_NOTICE("You stop stacking \the [barrel] onto \the [src].")) + return FALSE + if(try_stack_barrel(barrel, user)) + to_chat(user, SPAN_NOTICE("You stack \the [barrel] onto \the [src].")) + return TRUE + return FALSE + +/obj/structure/cask_rack/proc/get_stackable_barrel_types() + var/static/list/_stackable_barrel_types = list( + /obj/structure/reagent_dispensers/barrel/cask + ) + return _stackable_barrel_types + +// A larger stack, used to arrange up to three casks. +/obj/structure/cask_rack/large + desc = "A flat rack used to stop casks from rolling around." + max_stack = 3 + w_class = ITEM_SIZE_LARGE_STRUCTURE + icon = 'icons/obj/structures/barrels/cask_rack_large.dmi' + +// We want 'large wooden cask rack' not 'wooden large cask rack' +/obj/structure/cask_rack/large/update_material_name(override_name) + . = ..() + SetName("large [name]") + +/obj/structure/cask_rack/large/adjust_barrel_offsets(atom/movable/barrel, barrel_position) + ..() + switch(barrel_position) + if(1) + barrel.pixel_x -= 7 + if(2) + barrel.pixel_x += 7 + if(3) + barrel.pixel_y += 8 + +/obj/structure/cask_rack/large/mapped + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/cask_rack/large/mapped/Initialize(ml, _mat, _reinf_mat) + . = ..() + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/water) + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/beer) + try_stack_barrel(new /obj/structure/reagent_dispensers/barrel/cask/ebony/wine) diff --git a/code/game/objects/structures/barricade.dm b/code/game/objects/structures/barricade.dm index da01780265c..b5708b8f18f 100644 --- a/code/game/objects/structures/barricade.dm +++ b/code/game/objects/structures/barricade.dm @@ -18,12 +18,12 @@ /obj/structure/barricade/spike/Initialize() if(!reinf_material) - reinf_material = /decl/material/solid/organic/wood + reinf_material = /decl/material/solid/organic/wood/oak . = ..() /obj/structure/barricade/Initialize() if(!material) - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak . = ..() if(!istype(material)) return INITIALIZE_HINT_QDEL diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index bca9199f37d..50fb98d51d0 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -19,7 +19,7 @@ LINEN BINS material = /decl/material/solid/organic/cloth /obj/item/bedsheet/attackby(obj/item/I, mob/user) - if(is_sharp(I)) + if(I.is_sharp() || I.has_edge()) user.visible_message("\The [user] begins cutting up \the [src] with \a [I].", "You begin cutting up \the [src] with \the [I].") if(do_after(user, 50, src)) to_chat(user, "You cut \the [src] into pieces!") diff --git a/code/game/objects/structures/benches.dm b/code/game/objects/structures/benches.dm index ed9805ff78b..6d8e7637b15 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/organic/wood - reinf_material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak + reinf_material = /decl/material/solid/organic/wood/oak /obj/structure/table/bench/padded icon_state = "padded_preview" diff --git a/code/game/objects/structures/bookcase.dm b/code/game/objects/structures/bookcase.dm index 7f9f04171fe..c51e005f3cf 100644 --- a/code/game/objects/structures/bookcase.dm +++ b/code/game/objects/structures/bookcase.dm @@ -44,7 +44,7 @@ var/global/list/station_bookcases = list() var/place_key = GET_BOOK_POS(src, place_x, place_y) if(isnull(book_positions[place_key])) - book_positions[place_key] = inserted + book_positions[place_key] = weakref(inserted) /datum/storage/bookcase/update_ui_after_item_removal(obj/item/removed) . = ..() @@ -53,7 +53,8 @@ var/global/list/station_bookcases = list() for(var/bX = 0 to (book_slots_x-1)) for(var/bY = 0 to (book_slots_y-1)) var/bK = GET_BOOK_POS(src, bX, bY) - if(book_positions[bK] == removed) + var/weakref/potential_book = book_positions[bK] + if(IS_WEAKREF_OF(potential_book, removed)) book_positions[bK] = null return @@ -65,16 +66,19 @@ var/global/list/station_bookcases = list() for(var/bX = 0 to (book_slots_x-1)) for(var/bY = 0 to (book_slots_y-1)) var/bK = GET_BOOK_POS(src, bX, bY) - var/obj/item/thing = book_positions[bK] - if(!isnull(thing) && (QDELETED(thing) || thing.loc != holder)) + var/weakref/book_ref = book_positions[bK] + var/obj/item/thing = book_ref?.resolve() + if(!isnull(thing) && (QDELING(thing) || thing.loc != holder)) // QDELING because it might be deleting but hasn't been moved to nullspace yet book_positions[bK] = null for(var/obj/item/thing in holder.get_stored_inventory()) var/positioned = FALSE + // Avoid moving us if we're already positioned for(var/bX = 0 to (book_slots_x-1)) for(var/bY = 0 to (book_slots_y-1)) - if(book_positions[GET_BOOK_POS(src, bX, bY)] == thing) + var/weakref/potential_book = book_positions[GET_BOOK_POS(src, bX, bY)] + if(IS_WEAKREF_OF(potential_book, thing)) positioned = TRUE break if(positioned) @@ -83,26 +87,30 @@ var/global/list/station_bookcases = list() if(positioned) continue + // Otherwise, find a new position for(var/bX = 0 to (book_slots_x-1)) for(var/bY = 0 to (book_slots_y-1)) var/bK = GET_BOOK_POS(src, bX, bY) if(isnull(book_positions[bK])) - book_positions[bK] = thing + book_positions[bK] = weakref(thing) positioned = TRUE break if(positioned) break + // No position, fall on the ground! + if(!positioned) + thing.dropInto(holder.loc) /obj/structure/bookcase name = "bookcase" icon = 'icons/obj/structures/bookcase.dmi' - icon_state = ICON_STATE_WORLD + icon_state = "bookcase" anchored = TRUE density = TRUE opacity = TRUE obj_flags = OBJ_FLAG_ANCHORABLE - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) material_alteration = MAT_FLAG_ALTERATION_ALL storage = /datum/storage/bookcase @@ -133,6 +141,12 @@ var/global/list/station_bookcases = list() . = ..() + // TODO: Handle repair, drop book contents when too damaged? + // At the very least, should probably add an update_icon() call on take_damage()... + if(get_health_ratio() < 0.5) + icon_state = "[initial(icon_state)]-damaged" + return // No storage contents while damaged. + var/datum/storage/bookcase/book_storage = storage if(!istype(book_storage) || !length(contents)) return @@ -143,12 +157,13 @@ var/global/list/station_bookcases = list() for(var/bY = 0 to (book_storage.book_slots_y-1)) var/bK = (bY * book_storage.book_slots_x) + bX + 1 - var/obj/item/book = book_storage.book_positions[bK] + var/weakref/book_ref = book_storage.book_positions[bK] + var/obj/item/book = book_ref?.resolve() if(!istype(book) || !check_state_in_icon("bookcase", book.icon)) continue var/use_lying_state = "bookcase" - if(bX < (book_storage.book_slots_x-1) && isnull(book_storage.book_positions[bK+1]) && check_state_in_icon("bookcase_flat", book.icon)) + if(bX < (book_storage.book_slots_x-1) && !isnull(book_storage.book_positions[bK+1]) && check_state_in_icon("bookcase_flat", book.icon)) use_lying_state = "bookcase_flat" var/image/book_overlay = overlay_image(book.icon, use_lying_state, book.get_color(), RESET_COLOR) @@ -157,7 +172,7 @@ var/global/list/station_bookcases = list() add_overlay(book_overlay) var/page_state = "[book_overlay.icon_state]-pages" - if(check_state_in_icon(book_overlay.icon, page_state)) + if(check_state_in_icon(page_state, book_overlay.icon)) var/image/page_overlay = overlay_image(book_overlay.icon, page_state, COLOR_WHITE, RESET_COLOR) page_overlay.pixel_x = book_overlay.pixel_x page_overlay.pixel_y = book_overlay.pixel_y @@ -191,14 +206,34 @@ var/global/list/station_bookcases = list() name = "book cart" anchored = FALSE opacity = FALSE + icon_state = "book-0" desc = "A mobile cart for carrying books around." movable_flags = MOVABLE_FLAG_WHEELED icon = 'icons/obj/structures/book_cart.dmi' tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT obj_flags = 0 + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/structure/bookcase/cart/on_update_icon() + // We don't (can't) call parent, so we have to do this here + if(material_alteration & MAT_FLAG_ALTERATION_COLOR) + update_material_color() + cut_overlays() + if(istype(lock)) + update_lock_overlay() + // End boilerplate + var/used_space_ratio = storage.storage_space_used() / storage.max_storage_space + icon_state = "book-[round(used_space_ratio * 5)]" /obj/structure/bookcase/ebony material = /decl/material/solid/organic/wood/ebony color = /decl/material/solid/organic/wood/ebony::color +/obj/structure/bookcase/fancy + icon_state = "fancy" + +/obj/structure/bookcase/fancy/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + #undef GET_BOOK_POS diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 28d320d564f..b7186e1926d 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -19,14 +19,6 @@ var/list/connections var/list/other_connections -/obj/structure/catwalk/clear_connections() - connections = null - other_connections = null - -/obj/structure/catwalk/set_connections(dirs, other_dirs) - connections = dirs_to_corner_states(dirs) - other_connections = dirs_to_corner_states(other_dirs) - /obj/structure/catwalk/Initialize() . = ..() DELETE_IF_DUPLICATE_OF(/obj/structure/catwalk) @@ -41,9 +33,6 @@ update_connections(1) update_icon() -/obj/structure/catwalk/can_climb_from_below(var/mob/climber) - return TRUE - /obj/structure/catwalk/Destroy() var/turf/oldloc = loc redraw_nearby_catwalks() @@ -51,6 +40,26 @@ if(istype(oldloc)) for(var/atom/movable/AM in oldloc) AM.fall(oldloc) + oldloc.supporting_platform = null + +// Catwalks need to layer over grass and water. +/obj/structure/catwalk/update_turf_alpha_mask() + return FALSE + +/obj/structure/catwalk/clear_connections() + connections = null + other_connections = null + +/obj/structure/catwalk/is_platform() + return TRUE + +/obj/structure/catwalk/set_connections(dirs, other_dirs) + connections = dirs_to_corner_states(dirs) + other_connections = dirs_to_corner_states(other_dirs) + +/obj/structure/catwalk/can_climb_from_below(var/mob/climber) + return TRUE + /obj/structure/catwalk/proc/redraw_nearby_catwalks() for(var/direction in global.alldirs) @@ -170,6 +179,9 @@ /obj/structure/catwalk/refresh_neighbors() return +/obj/structure/catwalk/is_z_passable() + return !plated_tile + /obj/effect/catwalk_plated name = "plated catwalk spawner" icon = 'icons/obj/structures/catwalks.dmi' diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 2360879e427..089425bcc9d 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -46,7 +46,7 @@ var/obj/item/removing = contents[contents.len] user.visible_message( \ SPAN_NOTICE("\The [user] takes \the [removing] off \the [src]."), - SPAN_NOTICE("You take \the [removing] off the \the [src].") + SPAN_NOTICE("You take \the [removing] off \the [src].") ) removing.dropInto(loc) user.put_in_active_hand(removing) @@ -79,7 +79,7 @@ if(user.try_unequip(W, src)) user.visible_message( \ SPAN_NOTICE("\The [user] hangs \the [W] on \the [src]."), \ - SPAN_NOTICE("You hang \the [W] on the \the [src].") \ + SPAN_NOTICE("You hang \the [W] on \the [src].") \ ) update_icon() return TRUE diff --git a/code/game/objects/structures/compost.dm b/code/game/objects/structures/compost.dm index 2f851822519..938eb620d3e 100644 --- a/code/game/objects/structures/compost.dm +++ b/code/game/objects/structures/compost.dm @@ -12,7 +12,7 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME density = TRUE atom_flags = ATOM_FLAG_CLIMBABLE matter = null - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC wrenchable = FALSE possible_transfer_amounts = @"[10,25,50,100]" @@ -90,7 +90,7 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME /obj/structure/reagent_dispensers/compost_bin/attackby(obj/item/W, mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(W.storage) diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index 70b311eb6dc..6bfeca7cfe8 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -42,7 +42,7 @@ var/global/list/closets = list() var/decl/closet_appearance/app = GET_DECL(closet_appearance) if(app) icon = app.icon - color = null + reset_color() queue_icon_update() return INITIALIZE_HINT_LATELOAD @@ -250,7 +250,7 @@ var/global/list/closets = list() /obj/structure/closet/attackby(obj/item/used_item, mob/user) - if(user.a_intent == I_HURT && used_item.get_attack_force(user)) + if(user.check_intent(I_FLAG_HARM) && used_item.get_attack_force(user)) return ..() if(!opened && (istype(used_item, /obj/item/stack/material) || IS_WRENCH(used_item)) ) @@ -344,7 +344,7 @@ var/global/list/closets = list() if(!. && istype(AM) && opened && !istype(AM, /obj/structure/closet) && AM.simulated && !AM.anchored && (large || !ismob(AM))) step_towards(AM, loc) if(user != AM) - user.show_viewers(SPAN_DANGER("\The [user] stuffs \the [AM] into \the [src]!")) + user.visible_message(SPAN_DANGER("\The [user] stuffs \the [AM] into \the [src]!"), SPAN_DANGER("You stuff \the [AM] into \the [src]!")) return TRUE /obj/structure/closet/attack_ai(mob/living/silicon/ai/user) @@ -548,6 +548,7 @@ var/global/list/closets = list() /decl/interaction_handler/closet_lock_toggle name = "Toggle Lock" expected_target_type = /obj/structure/closet + examine_desc = "toggle the lock" /decl/interaction_handler/closet_lock_toggle/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index be7435ff3a0..27ed4bce9fd 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -9,8 +9,8 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC open_sound = 'sound/effects/doorcreaky.ogg' close_sound = 'sound/effects/doorcreaky.ogg' - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color closet_appearance = /decl/closet_appearance/cabinet/nocolor /obj/structure/closet/cabinet/wooden/ebony 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 710f7d92d05..806048ba7a1 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -64,12 +64,14 @@ /obj/structure/closet/secure_closet/pilot name = "pilot locker" req_access = list(access_xenobiology) + /// The jumpsuit type spawned for this locker. Exists to be overridden by the corporate modpack, which adds pilot jumpsuits. + var/jumpsuit_type = /obj/item/clothing/jumpsuit/white /obj/structure/closet/secure_closet/pilot/WillContain() return list( /obj/item/backpack/parachute, /obj/item/knife/utility, - /obj/item/clothing/jumpsuit/pilot, + jumpsuit_type, /obj/item/clothing/suit/jacket/bomber, /obj/item/clothing/mask/gas/half, /obj/item/clothing/shoes/color/black, diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index b34c334d77e..27a6d55f4fc 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -99,7 +99,7 @@ check_health() /obj/structure/closet/statue/attackby(obj/item/I, mob/user) - current_health -= I.get_attack_force(user) + current_health -= I.expend_attack_force(user) user.do_attack_animation(src) visible_message("[user] strikes [src] with [I].") check_health() diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 516555b112d..cec2aeb75ae 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -133,7 +133,7 @@ /obj/item/stack/material/puck/mapped/uranium/fifty, /obj/item/stack/material/gemstone/mapped/diamond/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, - /obj/item/stack/material/rods/fifty + /obj/item/stack/material/rods/mapped/steel/fifty ) for(var/i = 0, i < 2, i++) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 925b88e9b16..d3aa1f21c39 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -236,9 +236,6 @@ storage_types = CLOSET_STORAGE_ITEMS|CLOSET_STORAGE_STRUCTURES icon = 'icons/obj/closets/bases/large_crate.dmi' -/obj/structure/closet/crate/secure/large/supermatter - closet_appearance = /decl/closet_appearance/large_crate/secure/hazard - //fluff variant /obj/structure/closet/crate/secure/large/reinforced desc = "A hefty, reinforced metal crate with an electronic locking system." @@ -322,8 +319,31 @@ close_sound = 'sound/effects/storage/briefcase.ogg' closet_appearance = /decl/closet_appearance/crate/chest material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + var/icon/overlay_icon = 'icons/obj/closets/bases/chest.dmi' + // TODO: Rework chest crafting so that this can use reinf_material instead. + /// The material used for the opacity and color of the trim overlay. + var/decl/material/overlay_material = /decl/material/solid/metal/iron + +/obj/structure/closet/crate/chest/Initialize() + . = ..() + if(ispath(overlay_material)) + overlay_material = GET_DECL(overlay_material) + // icon update is already queued in parent because of closet appearance + +/obj/structure/closet/crate/chest/update_material_desc(override_desc) + ..() + if(overlay_material) + desc = "[desc] It has a trim made of [overlay_material.solid_name]." + +/obj/structure/closet/crate/chest/on_update_icon() + . = ..() + if(istype(overlay_material)) + var/overlay_state = opened ? "open-overlay" : "base-overlay" + var/image/trim = overlay_image(overlay_icon, overlay_state, overlay_material.color, RESET_COLOR|RESET_ALPHA) + trim.alpha = clamp((50 + overlay_material.opacity * 255), 0, 255) + add_overlay(trim) /obj/structure/closet/crate/chest/ebony material = /decl/material/solid/organic/wood/ebony diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 5c1e42f3764..4e4e37090ac 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -5,7 +5,7 @@ icon_state = "densecrate" density = TRUE atom_flags = ATOM_FLAG_CLIMBABLE - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/structure/largecrate/Initialize() . = ..() @@ -15,7 +15,7 @@ I.forceMove(src) /obj/structure/largecrate/attack_hand(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() to_chat(user, SPAN_WARNING("You need a crowbar to pry this open!")) return TRUE diff --git a/code/game/objects/structures/crematorium.dm b/code/game/objects/structures/crematorium.dm index 4b03414f3bd..61b22755224 100644 --- a/code/game/objects/structures/crematorium.dm +++ b/code/game/objects/structures/crematorium.dm @@ -82,7 +82,7 @@ if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() if(locked) - to_chat(usr, SPAN_WARNING("It's currently locked.")) + to_chat(user, SPAN_WARNING("It's currently locked.")) return TRUE if(open) close() diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index bffd87cc4fe..4e1bafbf36e 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -60,7 +60,7 @@ if(curtain_kind_path) var/decl/curtain_kind/kind = GET_DECL(curtain_kind_path) alpha = kind.alpha - color = kind.color + set_color(kind.color) // // Curtain Structure diff --git a/code/game/objects/structures/defensive_barrier.dm b/code/game/objects/structures/defensive_barrier.dm index 27768c86d00..7545fcc0641 100644 --- a/code/game/objects/structures/defensive_barrier.dm +++ b/code/game/objects/structures/defensive_barrier.dm @@ -105,13 +105,12 @@ if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() - var/decl/species/species = user.get_species() - if(ishuman(user) && species?.can_shred(user) && user.a_intent == I_HURT) + if(user.can_shred() && user.check_intent(I_FLAG_HARM)) take_damage(20) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE - if(user.a_intent == I_GRAB) + if(user.check_intent(I_FLAG_GRAB)) try_pack_up(user) return TRUE diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 9b6fa1c413a..b07bef0480e 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -133,7 +133,7 @@ update_icon() return TRUE - else if(!destroyed && user.a_intent == I_HURT) + else if(!destroyed && user.check_intent(I_FLAG_HARM)) visible_message(SPAN_WARNING("[user] kicks \the [src]."), SPAN_WARNING("You kick \the [src].")) take_damage(2) return TRUE diff --git a/code/game/objects/structures/divider.dm b/code/game/objects/structures/divider.dm new file mode 100644 index 00000000000..d0cb78e85df --- /dev/null +++ b/code/game/objects/structures/divider.dm @@ -0,0 +1,48 @@ +/obj/structure/divider + name = "room divider" + desc = "A thin, somewhat flimsy folding room divider." + icon = 'icons/obj/structures/divider.dmi' + icon_state = ICON_STATE_WORLD + "-closed" + material = /decl/material/solid/organic/wood/bamboo + color = /decl/material/solid/organic/wood/bamboo::color + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + var/extended = FALSE + +/obj/structure/divider/extended + icon_state = ICON_STATE_WORLD + extended = TRUE + +/obj/structure/divider/wood + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + +/obj/structure/divider/extended/wood + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + +/obj/structure/divider/attack_hand(mob/user) + if(user.check_intent(I_FLAG_HELP) && user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, silent = TRUE)) + extended = !extended + if(material.dooropen_noise) + playsound(loc, material.dooropen_noise, 50, 1) + update_divider() + visible_message(SPAN_NOTICE("\The [user] [extended ? "extends" : "collapses"] \the [src].")) + return TRUE + . = ..() + +/obj/structure/divider/Initialize() + . = ..() + update_divider() + +/obj/structure/divider/proc/update_divider() + anchored = extended + density = extended + opacity = extended || (material.opacity < 0.5) + update_icon() + +/obj/structure/divider/on_update_icon() + . = ..() + if(extended) + icon_state = ICON_STATE_WORLD + else + icon_state = ICON_STATE_WORLD + "-closed" diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 93ef799d01a..adb261b01e9 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -198,7 +198,7 @@ if(do_after(user, 40,src)) if(QDELETED(src)) return TRUE - to_chat(user, "You cut the airlock wires.!") + to_chat(user, "You cut the airlock wires!") new/obj/item/stack/cable_coil(src.loc, 1) src.state = 0 update_icon() diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 5402bf1e6a4..ff698963837 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -1,18 +1,18 @@ /obj/structure/door - name = "door" - icon = 'icons/obj/doors/material_doors.dmi' - icon_state = "metal" - hitsound = 'sound/weapons/genhit.ogg' - material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR - max_health = 50 - density = TRUE - anchored = TRUE - opacity = TRUE - - var/has_window = FALSE - var/changing_state = FALSE - var/icon_base + name = "door" + icon = 'icons/obj/doors/material_doors.dmi' + icon_state = "metal" + hitsound = 'sound/weapons/genhit.ogg' + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + max_health = 50 + density = TRUE + anchored = TRUE + opacity = TRUE + structure_flags = STRUCTURE_FLAG_THROWN_DAMAGE + var/has_window = FALSE + var/changing_state = FALSE var/door_sound_volume = 25 + var/icon_base /obj/structure/door/Initialize() ..() @@ -163,7 +163,7 @@ /obj/structure/door/attackby(obj/item/used_item, mob/user) add_fingerprint(user, 0, used_item) - if((user.a_intent == I_HURT && used_item.get_attack_force(user)) || istype(used_item, /obj/item/stack/material)) + if((user.check_intent(I_FLAG_HARM) && used_item.get_attack_force(user)) || istype(used_item, /obj/item/stack/material)) return ..() if(used_item.user_can_attack_with(user, silent = TRUE)) @@ -205,19 +205,20 @@ /obj/structure/door/get_alt_interactions(var/mob/user) . = ..() if(density) - . += /decl/interaction_handler/knock_on_door + LAZYADD(., /decl/interaction_handler/knock_on_door) /decl/interaction_handler/knock_on_door name = "Knock On Door" expected_target_type = /obj/structure/door interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_TURF + examine_desc = "knock on $TARGET_THEM$" /decl/interaction_handler/knock_on_door/invoked(atom/target, mob/user, obj/item/prop) if(!istype(target) || !target.density) return FALSE user.do_attack_animation(src) playsound(target.loc, 'sound/effects/glassknock.ogg', 80, 1) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) target.visible_message( SPAN_DANGER("\The [user] bangs against \the [src]!"), blind_message = "You hear a banging sound!" @@ -255,8 +256,8 @@ material = /decl/material/solid/gemstone/diamond /obj/structure/door/wood - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color /obj/structure/door/mahogany material = /decl/material/solid/organic/wood/mahogany @@ -275,7 +276,7 @@ color = /decl/material/solid/organic/wood/walnut::color /obj/structure/door/wood/saloon - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak opacity = FALSE /obj/structure/door/wood/saloon/ebony @@ -293,7 +294,7 @@ material = /decl/material/solid/organic/plastic /obj/structure/door/exotic_matter - material = /decl/material/solid/supermatter + material = /decl/material/solid/exotic_matter /obj/structure/door/shuttle material = /decl/material/solid/metal/steel diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 03d91b43ce4..768fe81af7f 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -80,6 +80,7 @@ /decl/interaction_handler/extinguisher_cabinet_open name = "Open/Close" expected_target_type = /obj/structure/extinguisher_cabinet + examine_desc = "open or close $TARGET_THEM$" /decl/interaction_handler/extinguisher_cabinet_open/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/extinguisher_cabinet/C = target diff --git a/code/game/objects/structures/filter_stand.dm b/code/game/objects/structures/filter_stand.dm index e46cc29be69..3cd598d2e7b 100644 --- a/code/game/objects/structures/filter_stand.dm +++ b/code/game/objects/structures/filter_stand.dm @@ -5,7 +5,7 @@ icon_state = ICON_STATE_WORLD density = TRUE anchored = TRUE - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_ALL atom_flags = ATOM_FLAG_OPEN_CONTAINER diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm index f16681fa2d4..ec563ffce7e 100644 --- a/code/game/objects/structures/fireaxe_cabinet.dm +++ b/code/game/objects/structures/fireaxe_cabinet.dm @@ -81,7 +81,7 @@ update_icon() return TRUE - var/force = O.get_attack_force(user) + var/force = O.expend_attack_force(user) if(force) user.setClickCooldown(10) attack_animation(user) diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index faf17bcae81..4da0fe52597 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -28,6 +28,9 @@ abstract_type = /obj/structure/fire_source throwpass = TRUE + // Counter for world.time, used to reduce lighting spam. + var/next_light_spam_guard = 0 + var/has_draught = TRUE var/static/list/draught_values = list( "all the way open" = 1, @@ -67,7 +70,8 @@ var/lit = FIRE_OUT /// How much fuel is left? var/fuel = 0 - + /// Have we been fed by a bellows recently? + var/bellows_oxygenation = 0 /obj/structure/fire_source/Initialize() . = ..() @@ -135,6 +139,7 @@ /obj/structure/fire_source/proc/die() if(lit == FIRE_LIT) + bellows_oxygenation = 0 lit = FIRE_DEAD last_fuel_ignite_temperature = null last_fuel_burn_temperature = T20C @@ -158,6 +163,9 @@ if(lit == FIRE_LIT && !force) return FALSE if(!process_fuel(ignition_temperature)) + if(world.time >= next_light_spam_guard) + visible_message(SPAN_WARNING("\The [src] smoulders, but fails to catch alight. Perhaps it needs better airflow or more fuel?")) + next_light_spam_guard = world.time + 3 SECONDS return FALSE last_fuel_burn_temperature = max(last_fuel_burn_temperature, ignition_temperature) // needed for initial burn procs to function lit = FIRE_LIT @@ -210,7 +218,7 @@ update_icon() return TRUE - if(lit != FIRE_LIT && user.a_intent == I_HURT) + if(lit != FIRE_LIT && user.check_intent(I_FLAG_HARM)) to_chat(user, SPAN_DANGER("You start stomping on \the [src], trying to destroy it.")) if(do_after(user, 5 SECONDS, src)) visible_message(SPAN_DANGER("\The [user] stamps and kicks at \the [src] until it is completely destroyed.")) @@ -223,7 +231,7 @@ var/mob/living/victim = grab.get_affecting_mob() if(!istype(victim)) return FALSE - if (user.a_intent != I_HURT) + if (!user.check_intent(I_FLAG_HARM)) return TRUE if (!grab.force_danger()) to_chat(user, SPAN_WARNING("You need a better grip!")) @@ -238,9 +246,6 @@ /obj/structure/fire_source/isflamesource() return (lit == FIRE_LIT) -/obj/structure/fire_source/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return ..() || (istype(mover) && mover.checkpass(PASS_FLAG_TABLE)) - /obj/structure/fire_source/proc/burn_material(var/decl/material/mat, var/amount) var/effective_burn_temperature = get_effective_burn_temperature() . = mat.get_burn_products(amount, effective_burn_temperature) @@ -272,7 +277,7 @@ /obj/structure/fire_source/attackby(var/obj/item/thing, var/mob/user) // Gate a few interactions behind intent so they can be bypassed if needed. - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) // Put cooking items onto the fire source. if(istype(thing, /obj/item/chems/cooking_vessel) && user.try_unequip(thing, get_turf(src))) thing.reset_offsets() @@ -292,7 +297,7 @@ try_light(thing.get_heat()) return TRUE - if((lit != FIRE_LIT || user.a_intent == I_HURT)) + if((lit != FIRE_LIT || user.check_intent(I_FLAG_HARM))) // Only drop in one log at a time. if(istype(thing, /obj/item/stack)) var/obj/item/stack/stack = thing @@ -305,7 +310,9 @@ return ..() /obj/structure/fire_source/proc/get_draught_multiplier() - return has_draught ? draught_values[draught_values[current_draught]] : 1 + . = has_draught ? draught_values[draught_values[current_draught]] : 1 + if(bellows_oxygenation) + . *= 1.25 // Burns 25% hotter while oxygenated. /obj/structure/fire_source/proc/process_fuel(ignition_temperature) var/draught_mult = get_draught_multiplier() @@ -410,6 +417,10 @@ die() return + // Spend our bellows charge. + if(bellows_oxygenation > 0) + bellows_oxygenation-- + fuel -= (FUEL_CONSUMPTION_CONSTANT * get_draught_multiplier()) if(!process_fuel()) die() @@ -435,7 +446,6 @@ removed.add_thermal_energy(heat_transfer) environment.merge(removed) - queue_icon_update() /obj/structure/fire_source/proc/has_fuel() @@ -459,7 +469,7 @@ switch(lit) if(FIRE_LIT) - if(fuel >= HIGH_FUEL) + if(bellows_oxygenation || fuel >= HIGH_FUEL) var/image/I = image(icon, "[icon_state]_lit") I.appearance_flags |= RESET_COLOR | RESET_ALPHA | KEEP_APART add_overlay(I) @@ -486,10 +496,10 @@ try_light(1000) /obj/structure/fire_source/CanPass(atom/movable/mover, turf/target, height, air_group) - . = ..() + . = ..() || mover?.checkpass(PASS_FLAG_TABLE) if(. && lit && ismob(mover)) var/mob/M = mover - if(!MOVING_QUICKLY(M)) + if(M.client && !M.current_posture?.prone && !MOVING_QUICKLY(M)) to_chat(M, SPAN_WARNING("You refrain from stepping into \the [src].")) return FALSE return ..() @@ -508,6 +518,7 @@ /decl/interaction_handler/adjust_draught name = "Adjust Draught" expected_target_type = /obj/structure/fire_source + examine_desc = "adjust the draught" /decl/interaction_handler/adjust_draught/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/fire_source/fire = target diff --git a/code/game/objects/structures/fishtanks.dm b/code/game/objects/structures/fishtanks.dm index 39e278d390d..b6724f46775 100644 --- a/code/game/objects/structures/fishtanks.dm +++ b/code/game/objects/structures/fishtanks.dm @@ -63,13 +63,13 @@ var/global/list/fishtank_cache = list() add_to_reagents(fill_type, reagents.maximum_volume) /obj/structure/glass_tank/attack_hand(var/mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() visible_message(SPAN_NOTICE("\The [user] taps on \the [src].")) return TRUE /obj/structure/glass_tank/attackby(var/obj/item/W, var/mob/user) - if(W.get_attack_force(user) < 5 || user.a_intent != I_HURT) + if(W.get_attack_force(user) < 5 || !user.check_intent(I_FLAG_HARM)) attack_animation(user) visible_message(SPAN_NOTICE("\The [user] taps \the [src] with \the [W].")) else @@ -191,13 +191,13 @@ var/global/list/global/aquarium_states_and_layers = list( return if(!Adjacent(target)) return - usr.visible_message(SPAN_WARNING("\The [user] starts climbing out of \the [src]!")) + user.visible_message(SPAN_WARNING("\The [user] starts climbing out of \the [src]!")) if(!do_after(user,50)) return if (!Adjacent(target)) return - usr.forceMove(target) - usr.visible_message(SPAN_WARNING("\The [user] climbs out of \the [src]!")) + user.forceMove(target) + user.visible_message(SPAN_WARNING("\The [user] climbs out of \the [src]!")) /obj/structure/glass_tank/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) . = locate(/obj/structure/glass_tank) in (target == loc) ? (mover && mover.loc) : target diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm index 25be6aa2bf0..6cbc033c7a3 100644 --- a/code/game/objects/structures/fitness.dm +++ b/code/game/objects/structures/fitness.dm @@ -20,7 +20,7 @@ to_chat(H, SPAN_WARNING("You [synth ? "need more energy" : "are too tired"] to use the punching bag. Go [synth ? "recharge" : "eat something"].")) return TRUE - if(H.a_intent == I_HURT) + if(H.check_intent(I_FLAG_HARM)) H.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) flick("[icon_state]_hit", src) playsound(src.loc, 'sound/effects/woodhit.ogg', 25, 1, -1) diff --git a/code/game/objects/structures/flora/_flora.dm b/code/game/objects/structures/flora/_flora.dm index 7782bc39a1c..c38361f4a84 100644 --- a/code/game/objects/structures/flora/_flora.dm +++ b/code/game/objects/structures/flora/_flora.dm @@ -26,7 +26,7 @@ return ..() /obj/structure/flora/attackby(obj/item/O, mob/user) - if(user.a_intent != I_HURT && can_cut_down(O, user)) + if(!user.check_intent(I_FLAG_HARM) && can_cut_down(O, user)) play_cut_sound(user) cut_down(O, user) return TRUE @@ -34,7 +34,7 @@ /**Whether the item used by user can cause cut_down to be called. Used to bypass default attack proc for some specific items/tools. */ /obj/structure/flora/proc/can_cut_down(var/obj/item/I, var/mob/user) - return (I.get_attack_force(user) >= 5) && I.sharp //Anything sharp and relatively strong can cut us instantly + return (I.expend_attack_force(user) >= 5) && I.is_sharp() //Anything sharp and relatively strong can cut us instantly /**What to do when the can_cut_down check returns true. Normally simply calls dismantle. */ /obj/structure/flora/proc/play_cut_sound(mob/user) diff --git a/code/game/objects/structures/flora/plant.dm b/code/game/objects/structures/flora/plant.dm index bec1cc91866..ceb0b5e205e 100644 --- a/code/game/objects/structures/flora/plant.dm +++ b/code/game/objects/structures/flora/plant.dm @@ -70,7 +70,7 @@ /obj/structure/flora/plant/on_update_icon() . = ..() icon_state = "blank" - color = null + reset_color() set_overlays(plant.get_appearance(dead = dead, growth_stage = growth_stage, can_harvest = !!harvestable)) /obj/structure/flora/plant/attackby(obj/item/O, mob/user) @@ -81,7 +81,7 @@ return TRUE // Hydrotray boilerplate for taking samples. - if(O.edge && O.w_class < ITEM_SIZE_NORMAL && user.a_intent != I_HURT) + if(O.has_edge() && O.w_class < ITEM_SIZE_NORMAL && !user.check_intent(I_FLAG_HARM)) if(sampled) to_chat(user, SPAN_WARNING("There's no bits that can be used for a sampling left.")) return TRUE diff --git a/code/game/objects/structures/flora/potted.dm b/code/game/objects/structures/flora/potted.dm index 5984436d57e..b046efc7a54 100644 --- a/code/game/objects/structures/flora/potted.dm +++ b/code/game/objects/structures/flora/potted.dm @@ -9,7 +9,7 @@ anchored = FALSE layer = ABOVE_HUMAN_LAYER w_class = ITEM_SIZE_LARGE - remains_type = /obj/effect/decal/cleanable/dirt + remains_type = /obj/effect/decal/cleanable/dirt/visible hitsound = 'sound/effects/glass_crack2.ogg' snd_cut = 'sound/effects/break_ceramic.ogg' material = /decl/material/solid/stone/pottery diff --git a/code/game/objects/structures/flora/stump.dm b/code/game/objects/structures/flora/stump.dm index 297be6ac8cf..4911cd3a57e 100644 --- a/code/game/objects/structures/flora/stump.dm +++ b/code/game/objects/structures/flora/stump.dm @@ -27,7 +27,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/organic/wood + material = /decl/material/solid/organic/wood/oak //dead trees /obj/structure/flora/stump/tree/dead @@ -40,6 +40,7 @@ //pine trees /obj/structure/flora/stump/tree/pine icon_state = "pine_1" + material = /decl/material/solid/organic/wood/oak // TODO: pine /obj/structure/flora/stump/tree/pine/init_appearance() icon_state = "pine_[rand(1, 3)]" diff --git a/code/game/objects/structures/flora/tree.dm b/code/game/objects/structures/flora/tree.dm index 92b124d8b93..a088f2297cf 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/organic/wood + material = /decl/material/solid/organic/wood/oak w_class = ITEM_SIZE_STRUCTURE hitsound = 'sound/effects/hit_wood.ogg' snd_cut = 'sound/effects/plants/tree_fall.ogg' @@ -102,6 +102,7 @@ /obj/structure/flora/tree/pine/init_appearance() icon_state = "pine_[rand(1, 3)]" +var/global/list/christmas_trees = list() /obj/structure/flora/tree/pine/xmas name = "\improper Christmas tree" desc = "O Christmas tree, O Christmas tree..." @@ -109,6 +110,14 @@ icon_state = "pine_c" stump_type = /obj/structure/flora/stump/tree/pine/xmas +/obj/structure/flora/tree/pine/xmas/Initialize(ml, _mat, _reinf_mat) + . = ..() + global.christmas_trees += src + +/obj/structure/flora/tree/pine/xmas/Destroy() + global.christmas_trees -= src + return ..() + /obj/structure/flora/tree/pine/xmas/init_appearance() return //Only one possible icon diff --git a/code/game/objects/structures/fountain.dm b/code/game/objects/structures/fountain.dm index 7df7c3ee307..c92c9d360b1 100644 --- a/code/game/objects/structures/fountain.dm +++ b/code/game/objects/structures/fountain.dm @@ -1,24 +1,26 @@ //the fountain of youth/unyouth /obj/structure/fountain - name = "strange fountain" - desc = "The water from the spout is still as if frozen in time, yet the water in the base ripples perpetually." - icon = 'icons/obj/fountain.dmi' - icon_state = "fountain" - density = TRUE - anchored = TRUE - pixel_x = -16 - var/used = FALSE + name = "strange fountain" + desc = "The water from the spout is still as if frozen in time, yet the water in the base ripples perpetually." + icon = 'icons/obj/fountain.dmi' + icon_state = "fountain" + density = TRUE + anchored = TRUE + pixel_x = -16 + light_range = 5 + light_power = 0.5 + var/used = FALSE var/increase_age_prob = (100 / 6) /obj/structure/fountain/Initialize(ml, _mat, _reinf_mat) + if(light_range && light_power) + light_color = get_random_colour(lower = 190) . = ..() - light_color = get_random_colour(lower = 190) - set_light(5, 0.5, light_color) /obj/structure/fountain/attack_hand(var/mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(used) @@ -48,7 +50,7 @@ L.flash_eyes(3) SET_STATUS_MAX(L, STAT_BLURRY, 9) - visible_message("\The [src] erupts in a bright flash of light!") + visible_message(SPAN_WARNING("\The [src] erupts in a bright flash of light!")) playsound(src,'sound/items/time.ogg',100) var/old_age = user.get_age() @@ -65,19 +67,19 @@ new_age = max(new_age, min_age) // This will clamp to the max defined age already so only need to min() if(new_age == old_age) - to_chat(user, "You touch the fountain, and feel your memories sifted through by a great presence. Then, it withdraws, leaving you unchanged.") + to_chat(user, SPAN_CULT_ANNOUNCE("You touch the fountain, and feel your memories sifted through by a great presence. Then, it withdraws, leaving you unchanged.")) else user.set_age(new_age) if(new_age < old_age) - to_chat(user, "You touch the fountain. Everything stops - then reverses. You relive in an instant the events of your life. The fountain, yesterday's lunch, your first love, your first kiss. It all feels as though it just happened moments ago. Then it feels like it never happened at all. Time reverses back into normality and continues its advance. You feel great, but why are you here?") + to_chat(user, SPAN_CULT_ANNOUNCE("You touch the fountain. Everything stops - then reverses. You relive in an instant the events of your life. The fountain, yesterday's lunch, your first love, your first kiss. It all feels as though it just happened moments ago. Then it feels like it never happened at all. Time reverses back into normality and continues its advance. You feel great, but why are you here?")) user.became_younger = TRUE 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.") + to_chat(user, SPAN_CULT_ANNOUNCE("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 SET_HAIR_COLOR(user, COLOR_GRAY80, FALSE) 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.") + to_chat(user, SPAN_CULT_ANNOUNCE("The burden of the years is too much, and you are reduced to dust.")) user.dust() used = TRUE @@ -93,6 +95,8 @@ used = TRUE material_alteration = MAT_FLAG_ALTERATION_ALL atom_flags = ATOM_FLAG_OPEN_CONTAINER | ATOM_FLAG_CLIMBABLE + light_range = null + light_power = null /obj/structure/fountain/mundane/Initialize(ml, _mat, _reinf_mat) . = ..() @@ -106,7 +110,7 @@ add_to_reagents(/decl/material/liquid/water, reagents.maximum_volume) //Don't give free water when building one /obj/structure/fountain/mundane/attack_hand(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() return TRUE diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d4aed89ecdc..a82c4c7733d 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -10,7 +10,7 @@ tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) max_health = 100 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/cover = 50 var/prepped_for_fakewall @@ -19,20 +19,13 @@ set_extension(src, /datum/extension/penetration/simple, 100) . = ..() -/obj/structure/girder/can_unanchor(var/mob/user) - . = ..() - var/turf/T = loc - if(!anchored && . && (!istype(T) || T.is_open())) - to_chat(user, SPAN_WARNING("You can only secure \the [src] to solid ground.")) - return FALSE - /obj/structure/girder/handle_default_screwdriver_attackby(var/mob/user, var/obj/item/screwdriver) if(reinf_material) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins unscrewing \the [reinf_material.solid_name] struts from \the [src].")) + visible_message(SPAN_NOTICE("\The [user] begins unscrewing \the [reinf_material.solid_name] rods from \the [src].")) if(do_after(user, 5 SECONDS, src) || QDELETED(src) || !reinf_material) - visible_message(SPAN_NOTICE("\The [user] unscrews and removes \the [reinf_material.solid_name] struts from \the [src].")) + visible_message(SPAN_NOTICE("\The [user] unscrews and removes \the [reinf_material.solid_name] rods from \the [src].")) reinf_material.place_dismantled_product(get_turf(src)) reinf_material = null return TRUE @@ -85,9 +78,13 @@ /obj/structure/girder/can_unanchor(var/mob/user) if(anchored && reinf_material) - to_chat(user, SPAN_WARNING("You must remove the support struts before you can dislodge \the [src].")) + to_chat(user, SPAN_WARNING("You must remove the support rods before you can dislodge \the [src].")) return FALSE . = ..() + var/turf/T = loc + if(!anchored && . && (!istype(T) || T.is_open())) + to_chat(user, SPAN_WARNING("You can only secure \the [src] to solid ground.")) + return FALSE /obj/structure/girder/can_dismantle(var/mob/user) if(reinf_material) @@ -145,7 +142,7 @@ to_chat(user, SPAN_WARNING("You will need a support made of sturdier material to hold up [S.material.solid_name] cladding.")) return FALSE - add_hiddenprint(usr) + add_hiddenprint(user) if(S.material.integrity < 50) to_chat(user, SPAN_WARNING("This material is too soft for use in wall construction.")) return 0 @@ -165,7 +162,7 @@ var/turf/wall/T = get_turf(src) T.set_turf_materials(S.material, reinf_material, null, material) T.can_open = prepped_for_fakewall - T.add_hiddenprint(usr) + T.add_hiddenprint(user) material = null reinf_material = null qdel(src) @@ -182,7 +179,7 @@ if(!istype(M) || M.integrity < 50) to_chat(user, SPAN_WARNING("You cannot reinforce \the [src] with [M.solid_name]; it is too soft.")) return TRUE - visible_message(SPAN_NOTICE("\The [user] begins installing [M.solid_name] struts into \the [src].")) + visible_message(SPAN_NOTICE("\The [user] begins installing [M.solid_name] rods into \the [src].")) if (!do_after(user, 4 SECONDS, src) || !S.use(2)) return TRUE visible_message(SPAN_NOTICE("\The [user] finishes reinforcing \the [src] with [M.solid_name].")) diff --git a/code/game/objects/structures/grandfather_clock.dm b/code/game/objects/structures/grandfather_clock.dm new file mode 100644 index 00000000000..76cc0c8295d --- /dev/null +++ b/code/game/objects/structures/grandfather_clock.dm @@ -0,0 +1,64 @@ +// TODO: buildable with artifice? +// TODO: looping 2 second tick tock sound, somehow aligned with pendulum (may not be possible in DM) +/obj/structure/grandfather_clock + name = "grandfather clock" + desc = "A tall, stately timepiece." + icon = 'icons/obj/structures/grandfather_clock.dmi' + icon_state = ICON_STATE_WORLD + density = TRUE + material = /decl/material/solid/organic/wood/mahogany + material_alteration = MAT_FLAG_ALTERATION_ALL + var/face_color = "#f0edc7" + var/last_time + var/decl/material/clockwork_mat = /decl/material/solid/metal/brass + +/obj/structure/grandfather_clock/Initialize(ml, _mat, _reinf_mat) + if(ispath(clockwork_mat)) + clockwork_mat = GET_DECL(clockwork_mat) + . = ..() + START_PROCESSING(SSobj, src) + update_icon() + +/obj/structure/grandfather_clock/examine(mob/user, distance, infix, suffix) + . = ..() + // TODO: check literacy? + if(isnull(last_time)) + last_time = stationtime2text() + to_chat(user, SPAN_NOTICE("The face of \the [src] reads [last_time].")) + +// TODO: don't magically make the time update when swinging is restarted +// TODO: alt interaction to interfere with the clock? +/obj/structure/grandfather_clock/attack_hand(mob/user) + . = ..() + if(!.) + if(is_processing) + STOP_PROCESSING(SSobj, src) + user.visible_message(SPAN_NOTICE("\The [user] reaches into \the [src] and stops the pendulum.")) + else + START_PROCESSING(SSobj, src) + user.visible_message(SPAN_NOTICE("\The [user] reaches into \the [src] and sets the pendulum swinging.")) + update_icon() + return TRUE + +/obj/structure/grandfather_clock/Process() + ..() + var/new_time = stationtime2text() + if(new_time != last_time) + last_time = new_time + update_icon() + +/obj/structure/grandfather_clock/on_update_icon() + . = ..() + if(isnull(last_time)) + last_time = stationtime2text() + if(face_color) + add_overlay(overlay_image(icon, "[icon_state]-face", face_color, RESET_COLOR)) + if(!clockwork_mat) + return + if(is_processing) + add_overlay(overlay_image(icon, "[icon_state]-pendulum-swing", clockwork_mat.color, RESET_COLOR)) + else + add_overlay(overlay_image(icon, "[icon_state]-pendulum", clockwork_mat.color, RESET_COLOR)) + var/list/time_stats = splittext(last_time, ":") + add_overlay(overlay_image(icon, "[icon_state]-hour[round(((text2num(time_stats[1]) / 24) * 360) / 45) * 45]"), clockwork_mat.color, RESET_COLOR) + add_overlay(overlay_image(icon, "[icon_state]-minute[round(((text2num(time_stats[2]) / 60) * 360) / 45) * 45]"), clockwork_mat.color, RESET_COLOR) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 6bde6ee9cb1..f1717f3be26 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -85,11 +85,12 @@ add_overlay(I) /obj/structure/grille/Bumped(atom/user) - if(ismob(user)) shock(user, 70) + if(ismob(user)) + shock(user, 70) /obj/structure/grille/attack_hand(mob/user) - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) return ..() user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) @@ -101,12 +102,10 @@ var/damage_dealt = 1 var/attack_message = "kicks" - if(ishuman(user)) - var/mob/living/human/H = user - if(H.species.can_shred(H)) - attack_message = "mangles" - damage_dealt = 5 - attack_generic(user,damage_dealt,attack_message) + if(user.can_shred()) + attack_message = "mangles" + damage_dealt = 5 + attack_generic(user, damage_dealt, attack_message) return TRUE /obj/structure/grille/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -211,9 +210,9 @@ playsound(loc, 'sound/effects/grillehit.ogg', 80, 1) switch(W.atom_damage_type) if(BURN) - take_damage(W.get_attack_force(user)) + take_damage(W.expend_attack_force(user)) if(BRUTE) - take_damage(W.get_attack_force(user) * 0.1) + take_damage(W.expend_attack_force(user) * 0.1) return TRUE return ..() @@ -229,25 +228,23 @@ // returns 1 if shocked, 0 otherwise /obj/structure/grille/proc/shock(mob/user, prb) if(!anchored || destroyed) // anchored/destroyed grilles are never connected - return 0 + return FALSE if(!(material.conductive)) - return 0 + return FALSE if(!prob(prb)) - return 0 + return FALSE if(!in_range(src, user))//To prevent TK and exosuit users from getting shocked - return 0 - var/turf/T = get_turf(src) - var/obj/structure/cable/C = T.get_cable_node() - if(C) - if(electrocute_mob(user, C, src)) - if(C.powernet) - C.powernet.trigger_warning() - spark_at(src, cardinal_only = TRUE) - if(HAS_STATUS(user, STAT_STUN)) - return 1 - else - return 0 - return 0 + return FALSE + var/turf/my_turf = get_turf(src) + var/obj/structure/cable/cable = my_turf.get_cable_node() + if(!cable) + return FALSE + if(!electrocute_mob(user, cable, src)) + return FALSE + if(cable.powernet) + cable.powernet.trigger_warning() + spark_at(src, cardinal_only = TRUE) + return !!HAS_STATUS(user, STAT_STUN) /obj/structure/grille/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!destroyed) diff --git a/code/game/objects/structures/hay.dm b/code/game/objects/structures/hay.dm new file mode 100644 index 00000000000..47fa6ac3205 --- /dev/null +++ b/code/game/objects/structures/hay.dm @@ -0,0 +1,73 @@ +// Items that provide animal feed. +/datum/storage/haystack + can_hold = list(/obj/item/food/hay) + +// Not actually a food item, but you can eat it if you like. +/obj/item/food/hay + name = "handful of hay" + icon = 'icons/obj/food/hay.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/plantmatter/grass/dry + nutriment_amt = 1 + nutriment_type = /decl/material/solid/organic/plantmatter/grass + material_alteration = MAT_FLAG_ALTERATION_COLOR + +/obj/item/food/hay/end_throw() + . = ..() + addtimer(CALLBACK(src, PROC_REF(check_self_destroy)), 1, (TIMER_UNIQUE | TIMER_OVERRIDE) ) + +/obj/item/food/hay/proc/check_self_destroy() + if(isturf(loc) && !QDELETED(src)) + physically_destroyed() + +/obj/item/food/hay/physically_destroyed() + new /obj/effect/decal/cleanable/hay(loc) + . = ..() + +/obj/effect/decal/cleanable/hay + name = "loose hay" + desc = "Some loose hay from a haybale." + icon = 'icons/effects/hay.dmi' + icon_state = ICON_STATE_WORLD + color = /decl/material/solid/organic/plantmatter/grass/dry::color + sweepable = TRUE + +/obj/effect/decal/cleanable/hay/Initialize(ml, _age) + for(var/obj/effect/decal/cleanable/hay/hay in loc) + if(hay != src) + return INITIALIZE_HINT_QDEL + return ..() + +/obj/structure/haystack + name = "haystack" + desc = "A pile of dry, prickly hay. Not a great place for storing needles." + icon = 'icons/obj/structures/haystack.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/plantmatter/grass/dry + storage = /datum/storage/haystack + material_alteration = MAT_FLAG_ALTERATION_COLOR + atom_flags = ATOM_FLAG_CLIMBABLE + var/const/FOOD_MAX = 20 + +/obj/structure/haystack/Initialize(ml, _mat, _reinf_mat) + . = ..() + for(var/i = 1 to FOOD_MAX) + new /obj/item/food/hay(src) + storage.make_exact_fit() + +/obj/structure/haystack/Exited(atom/movable/am, atom/new_loc) + . = ..() + if(!QDELETED(src) && !length(contents)) + physically_destroyed() + +/obj/structure/haystack/create_matter() + matter = null // Haystack is almost a dummy item; the matter is the food inside. + +/obj/structure/haystack/physically_destroyed(skip_qdel) + new /obj/effect/decal/cleanable/hay(loc) + . = ..() + +/obj/structure/haystack/bale + name = "haybale" + desc = "A tight bundle of dry grass, probably set aside as animal feed." + icon = 'icons/obj/structures/haybale.dmi' diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 467abd3e26e..825e04a5ba6 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -139,7 +139,7 @@ /obj/structure/inflatable/attackby(obj/item/W, mob/user) - if((W.atom_damage_type == BRUTE || W.atom_damage_type == BURN) && (W.can_puncture() || W.get_attack_force(user) > 10)) + if((W.atom_damage_type == BRUTE || W.atom_damage_type == BURN) && (W.can_puncture() || W.expend_attack_force(user) > 10)) visible_message(SPAN_DANGER("\The [user] pierces \the [src] with \the [W]!")) deflate(TRUE) return TRUE @@ -209,7 +209,7 @@ return TryToSwitchState(user) /obj/structure/inflatable/door/attack_hand(mob/user) - if(user.a_intent == I_HURT || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) + if(user.check_intent(I_FLAG_HARM) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) return ..() return TryToSwitchState(user) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index cfdce2510d7..3de7c1dba7b 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -88,12 +88,13 @@ return TRUE var/obj/item/stack/material/rods/R = C - if(locate(/obj/structure/catwalk) in get_turf(src)) - to_chat(user, SPAN_WARNING("There is already a catwalk here.")) + var/turf/my_turf = get_turf(src) + if(my_turf?.get_supporting_platform()) + to_chat(user, SPAN_WARNING("There is already a platform here.")) return TRUE else if(R.use(2)) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) - new /obj/structure/catwalk(src.loc, R.material.type) + new /obj/structure/catwalk(my_turf, R.material.type) return TRUE else to_chat(user, SPAN_WARNING("You require at least two rods to complete the catwalk.")) diff --git a/code/game/objects/structures/pedestal.dm b/code/game/objects/structures/pedestal.dm index e8941a6028f..48ab35087c0 100644 --- a/code/game/objects/structures/pedestal.dm +++ b/code/game/objects/structures/pedestal.dm @@ -11,7 +11,7 @@ var/place_item_y = -5 /obj/structure/pedestal/attackby(obj/item/used_item, mob/user) - if(user.a_intent != I_HURT && user.try_unequip(used_item, get_turf(src))) + if(!user.check_intent(I_FLAG_HARM) && user.try_unequip(used_item, get_turf(src))) used_item.reset_offsets(anim_time = 0) used_item.pixel_y = used_item.default_pixel_y + place_item_y return TRUE diff --git a/code/game/objects/structures/pillar.dm b/code/game/objects/structures/pillar.dm index 6f625ac789b..6c77b5c5379 100644 --- a/code/game/objects/structures/pillar.dm +++ b/code/game/objects/structures/pillar.dm @@ -17,3 +17,14 @@ /obj/structure/pillar/triad icon = 'icons/obj/structures/pillars/pillar_triad.dmi' + +/obj/structure/pillar/wide + name = "wide pillar" + w_class = ITEM_SIZE_LARGE_STRUCTURE + icon = 'icons/obj/structures/pillars/pillar_wide_round.dmi' + +/obj/structure/pillar/wide/square + icon = 'icons/obj/structures/pillars/pillar_wide_square.dmi' + +/obj/structure/pillar/wide/inset + icon = 'icons/obj/structures/pillars/pillar_wide_inset.dmi' diff --git a/code/game/objects/structures/pit.dm b/code/game/objects/structures/pit.dm index 69fab843a65..766362844bb 100644 --- a/code/game/objects/structures/pit.dm +++ b/code/game/objects/structures/pit.dm @@ -147,7 +147,7 @@ pixel_x = 15 pixel_y = 8 anchored = TRUE - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak w_class = ITEM_SIZE_NORMAL material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR var/message = "Unknown." @@ -168,7 +168,7 @@ /obj/structure/gravemarker/attackby(obj/item/used_item, mob/user) // we can dig it up with a shovel if the destruction tool is not a shovel, or if we're not on harm intent - var/digging = IS_SHOVEL(used_item) && (destruction_tool != TOOL_SHOVEL || user?.a_intent != I_HURT) + var/digging = IS_SHOVEL(used_item) && (destruction_tool != TOOL_SHOVEL || !user?.check_intent(I_FLAG_HARM)) if(digging && used_item.do_tool_interaction(TOOL_SHOVEL, user, src, 2 SECONDS, "digging up", "digging up", check_skill = SKILL_HAULING)) unbury(user, place_in_hands = TRUE) // deletes the grave marker and spawns an item in its place return TRUE @@ -222,7 +222,7 @@ desc = "You're not the first." icon = 'icons/obj/structures/gravestone.dmi' icon_state = "wood" - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak w_class = ITEM_SIZE_NORMAL material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR var/gravemarker_type = /obj/structure/gravemarker @@ -244,13 +244,13 @@ to_chat(user, "You can't read the inscription from here.") /obj/item/gravemarker/attack_self(mob/user) - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) try_bury(get_turf(user), user) return TRUE return ..() /obj/item/gravemarker/afterattack(turf/target, mob/user, proximity) - if((. = ..()) || (user.a_intent == I_HURT && !(item_flags & ITEM_FLAG_NO_BLUDGEON)) || !proximity) + if((. = ..()) || (user.check_intent(I_FLAG_HARM) && !(item_flags & ITEM_FLAG_NO_BLUDGEON)) || !proximity) return if(!istype(target)) target = get_turf(target) diff --git a/code/game/objects/structures/produce_bin.dm b/code/game/objects/structures/produce_bin.dm index 7c09a013966..5c4b2343432 100644 --- a/code/game/objects/structures/produce_bin.dm +++ b/code/game/objects/structures/produce_bin.dm @@ -5,8 +5,8 @@ icon_state = ICON_STATE_WORLD anchored = TRUE density = TRUE - color = /decl/material/solid/organic/wood::color - material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood/oak::color + material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_ALL storage = /datum/storage/produce_bin @@ -25,7 +25,7 @@ /obj/structure/produce_bin/attackby(obj/item/bag, mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(bag.storage) diff --git a/code/game/objects/structures/quicksand.dm b/code/game/objects/structures/quicksand.dm index 383b435943b..d891b03a6ea 100644 --- a/code/game/objects/structures/quicksand.dm +++ b/code/game/objects/structures/quicksand.dm @@ -80,7 +80,7 @@ update_icon() /obj/effect/quicksand/attackby(obj/item/W, mob/user) - if(!exposed && W.get_attack_force(user)) + if(!exposed && W.expend_attack_force(user)) expose() return TRUE else diff --git a/code/game/objects/structures/racks.dm b/code/game/objects/structures/racks.dm index 7f1c77404ec..2cbeb5bb7f5 100644 --- a/code/game/objects/structures/racks.dm +++ b/code/game/objects/structures/racks.dm @@ -10,7 +10,7 @@ atom_flags = ATOM_FLAG_CLIMBABLE throwpass = TRUE parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods density = TRUE anchored = TRUE structure_flags = STRUCTURE_FLAG_SURFACE @@ -29,6 +29,12 @@ I.pixel_y = max(3-i*3, -3) + 1 I.pixel_z = 0 +/obj/structure/rack/adjust_required_attack_dexterity(mob/user, required_dexterity) + // Let people put stuff on tables without necessarily being able to use a gun or such. + if(user?.check_intent(I_FLAG_HELP)) + return DEXTERITY_HOLD_ITEM + return ..() + /obj/structure/rack/attackby(obj/item/O, mob/user, click_params) . = ..() if(!. && !isrobot(user) && O.loc == user && user.try_unequip(O, loc)) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 01e7a84e68a..2ae373f0513 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -14,11 +14,14 @@ material_alteration = MAT_FLAG_ALTERATION_ALL max_health = 100 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/broken = FALSE var/neighbor_status = 0 +/obj/structure/railing/should_have_alpha_mask() + return simulated && isturf(loc) && !(locate(/obj/structure/railing) in get_step(loc, SOUTH)) + /obj/structure/railing/mapped anchored = TRUE color = COLOR_ORANGE @@ -28,7 +31,7 @@ density = FALSE /obj/structure/railing/mapped/wooden - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak parts_type = /obj/item/stack/material/plank color = WOOD_COLOR_GENERIC paint_color = null @@ -218,7 +221,7 @@ WOOD_RAILING_SUBTYPE(yew) to_chat(user, SPAN_WARNING("You need a better grip to do that!")) return TRUE - if(user.a_intent == I_HURT && ishuman(victim)) + if(user.check_intent(I_FLAG_HARM) && ishuman(victim)) visible_message(SPAN_DANGER("\The [user] slams \the [victim]'s face against \the [src]!")) playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) var/blocked = victim.get_blocked_ratio(BP_HEAD, BRUTE, damage = 8) @@ -288,7 +291,7 @@ WOOD_RAILING_SUBTYPE(yew) update_icon() return TRUE - var/force = W.get_attack_force(user) + var/force = W.expend_attack_force(user) if(force && (W.atom_damage_type == BURN || W.atom_damage_type == BRUTE)) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) visible_message("\The [src] has been [LAZYLEN(W.attack_verb) ? pick(W.attack_verb) : "attacked"] with \the [W] by \the [user]!") diff --git a/code/game/objects/structures/rug.dm b/code/game/objects/structures/rug.dm new file mode 100644 index 00000000000..b4bf628184f --- /dev/null +++ b/code/game/objects/structures/rug.dm @@ -0,0 +1,12 @@ +/obj/structure/rug + name = "rug" + desc = "A small, circular floor covering." + icon = 'icons/obj/structures/rug.dmi' + material = /decl/material/solid/organic/cloth/wool + icon_state = ICON_STATE_WORLD + paint_color = COLOR_GRAY20 + color = COLOR_GRAY20 + +/obj/structure/rug/crafted + paint_color = null + color = null diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 7b78fc8c944..10db1cd1afb 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -100,7 +100,7 @@ FLOOR SAFES to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!") return - var/canhear = locate(/obj/item/clothing/neck/stethoscope) in usr.get_held_items() + var/canhear = locate(/obj/item/clothing/neck/stethoscope) in user.get_held_items() if(href_list["decrement"]) dial = decrement(dial) if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71) diff --git a/code/game/objects/structures/seaweed.dm b/code/game/objects/structures/seaweed.dm index 52a5af6125c..bfa52f88a18 100644 --- a/code/game/objects/structures/seaweed.dm +++ b/code/game/objects/structures/seaweed.dm @@ -31,7 +31,7 @@ icon = 'icons/obj/structures/plants.dmi' /obj/effect/decal/cleanable/lichen/attackby(obj/item/I, mob/user) - if(I.sharp && I.get_attack_force(user) > 1) + if(I.is_sharp() && I.expend_attack_force(user) > 1) qdel(src) return TRUE . = ..() \ No newline at end of file diff --git a/code/game/objects/structures/snowman.dm b/code/game/objects/structures/snowman.dm new file mode 100644 index 00000000000..60382df695c --- /dev/null +++ b/code/game/objects/structures/snowman.dm @@ -0,0 +1,59 @@ +/obj/structure/snowman + name = "man" + icon = 'icons/obj/structures/snowmen/snowman.dmi' + icon_state = ICON_STATE_WORLD + desc = "A happy little $NAME$ smiles back at you!" + anchored = TRUE + material = /decl/material/solid/ice/snow + material_alteration = MAT_FLAG_ALTERATION_ALL // We override name and desc below. + +/obj/structure/snowman/Initialize(ml, _mat, _reinf_mat) + . = ..() + update_icon() + +/obj/structure/snowman/update_material_name(override_name) + SHOULD_CALL_PARENT(FALSE) + if(istype(material)) + SetName("[material.solid_name][initial(name)]") + else + SetName("mystery[initial(name)]") + +/obj/structure/snowman/update_material_desc(override_desc) + SHOULD_CALL_PARENT(FALSE) + if(istype(material)) + var/snowname = "[material.solid_name][initial(name)]" + desc = replacetext(initial(desc), "$NAME$", snowname) + else + desc = replacetext(initial(desc), "$NAME$", "mysteryman") + +/obj/structure/snowman/on_update_icon() + . = ..() + // TODO: make carrot/stick arms/coal require items? + add_overlay(overlay_image(icon, "[icon_state]-decorations", COLOR_WHITE, RESET_COLOR)) + compile_overlays() + +/obj/structure/snowman/proc/user_destroyed(user) + to_chat(user, SPAN_DANGER("\The [src] crumples into a pile of [material.solid_name] after a single solid hit. You monster.")) + physically_destroyed() + +/obj/structure/snowman/attackby(obj/item/used_item, mob/user) + if(user.check_intent(I_FLAG_HARM) && used_item.get_base_attack_force()) + user_destroyed(user) + return TRUE + return ..() + +/obj/structure/snowman/attack_hand(mob/user) + if(user.check_intent(I_FLAG_HARM)) + user_destroyed(user) + return TRUE + return ..() + +/obj/structure/snowman/bot + name = "bot" + icon = 'icons/obj/structures/snowmen/snowbot.dmi' + desc = "A bland-faced little $NAME$. It even has a monitor for a head." + +/obj/structure/snowman/spider + name = "spider" + icon = 'icons/obj/structures/snowmen/snowspider.dmi' + desc = "An impressively-crafted $NAME$. Not nearly as creepy as the real thing." \ No newline at end of file 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 519dae2ab6e..f1ec03d9f7c 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 @@ -22,7 +22,7 @@ material_alteration = MAT_FLAG_ALTERATION_ALL tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods user_comfort = 1 obj_flags = OBJ_FLAG_SUPPORT_MOB var/base_icon = "bed" @@ -176,7 +176,7 @@ buckle_pixel_shift = list("x" = 0, "y" = 0, "z" = 6) movable_flags = MOVABLE_FLAG_WHEELED user_comfort = 0 - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/structure/bed/travois/can_apply_padding() return FALSE @@ -234,8 +234,8 @@ remove_beaker(user) return TRUE -/obj/structure/bed/roller/proc/collapse() - visible_message("[usr] collapses [src].") +/obj/structure/bed/roller/proc/collapse(mob/user) + visible_message("[user] collapses [src].") new item_form_type(get_turf(src)) qdel(src) @@ -300,7 +300,7 @@ remove_beaker(user) return TRUE if(!buckled_mob) - collapse() + collapse(user) return TRUE . = ..() 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 93979252fa1..f2e6ebadec4 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 @@ -302,7 +302,7 @@ icon_state = "wooden_chair_preview" base_icon = "wooden_chair" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/structure/bed/chair/wood/can_apply_padding() return FALSE 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 index 9e849a85d38..59da1232a7c 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm @@ -6,11 +6,14 @@ base_icon = "bench" color = WOOD_COLOR_GENERIC reinf_material = null - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak obj_flags = 0 anchored = TRUE var/connect_neighbors = TRUE +/obj/structure/bed/chair/bench/should_have_alpha_mask() + return simulated && isturf(loc) && connect_neighbors && !(locate(/obj/structure/bed/chair/bench) in get_step(loc, SOUTH)) + /obj/structure/bed/chair/bench/single name = "slatted seat" base_icon = "bench_standing" @@ -132,4 +135,20 @@ /obj/structure/bed/chair/bench/pew/ebony color = /decl/material/solid/organic/wood/ebony::color - material = /decl/material/solid/organic/wood/ebony \ No newline at end of file + material = /decl/material/solid/organic/wood/ebony + +/obj/structure/bed/chair/bench/lounge + name = "lounge" + desc = "An elegant lounge, perfect for reclining on." + icon = 'icons/obj/structures/lounge.dmi' + icon_state = "lounge_standing" + base_icon = "lounge" + +/obj/structure/bed/chair/bench/lounge/get_material_icon() + return icon + +/obj/structure/bed/chair/bench/lounge/mapped + color = /decl/material/solid/organic/wood/mahogany::color + material = /decl/material/solid/organic/wood/mahogany + reinf_material = /decl/material/solid/organic/cloth + padding_color = COLOR_RED_GRAY diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm index b36f4fae215..100e94deedc 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/rustic_chairs.dm @@ -13,7 +13,7 @@ name = "chair" desc = "An ornate, detailed chair made from wood. It has armrests!" icon = 'icons/obj/structures/fancy_rustic_chair.dmi' - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak color = COLOR_WHITE // preview state is precolored reinf_material = /decl/material/solid/organic/cloth padding_color = COLOR_CHERRY_RED diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm index 53161624e9c..100527ea293 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/simple_bed.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/structures/simple_bed.dmi' icon_state = "bed_padded_preview" // For map editor preview purposes parts_type = /obj/item/stack/material/plank - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak reinf_material = /decl/material/solid/organic/plantmatter/grass/dry color = /decl/material/solid/organic/plantmatter/grass/dry::color anchored = TRUE @@ -49,7 +49,7 @@ /obj/structure/bed/simple/crafted reinf_material = null icon_state = "bed" - color = /decl/material/solid/organic/wood::color + color = /decl/material/solid/organic/wood/oak::color /obj/item/bedsheet/furs name = "sleeping furs" 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 2095b2324c3..93cfc6b1c5c 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 | OBJ_FLAG_ANCHORABLE - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak reinf_material = /decl/material/solid/organic/cloth material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC 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 59ccd454a5d..07eeb6e2087 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 @@ -157,14 +157,11 @@ return ..() /obj/item/stool/rustic - name = "stool" - icon = 'icons/obj/stool_rustic.dmi' - material = /decl/material/solid/organic/wood/walnut - color = /decl/material/solid/organic/wood/walnut::color - -/obj/item/stool/rustic/update_name() - ..() - SetName("rustic [name]") // rustic oaken stool, not oaken rustic stool + name_prefix = "rustic" + name = "stool" + icon = 'icons/obj/stool_rustic.dmi' + material = /decl/material/solid/organic/wood/walnut + color = /decl/material/solid/organic/wood/walnut::color /obj/item/stool/rustic/can_be_padded() return FALSE @@ -174,4 +171,4 @@ //Generated subtypes for mapping porpoises /obj/item/stool/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm index caa3e14df93..c6b882a2a67 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/wheelchair.dm @@ -12,6 +12,7 @@ tool_interaction_flags = 0 var/item_form_type = /obj/item/wheelchair_kit + // TODO: Replace with reagent holder? This doesn't even properly handle non-human bloodstains. var/bloodiness /obj/structure/bed/chair/wheelchair/Initialize() @@ -141,7 +142,7 @@ user.visible_message("[user] starts to lay out \the [src].") if(do_after(user, 4 SECONDS, src)) var/obj/structure/bed/chair/wheelchair/W = new structure_form_type(get_turf(user)) - user.visible_message(SPAN_NOTICE("[user] lays out \the [W.name].")) + user.visible_message(SPAN_NOTICE("[user] lays out \the [W].")) W.add_fingerprint(user) qdel(src) diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index c66281e59f2..68fba364973 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -19,13 +19,14 @@ 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 + parts_type = /obj/item/stack/material/rods structure_flags = STRUCTURE_FLAG_SURFACE can_support_butchery = TRUE var/can_flip = TRUE var/is_flipped = FALSE var/decl/material/additional_reinf_material + var/base_type = /obj/structure/table var/top_surface_noun = "tabletop" @@ -37,11 +38,8 @@ /// Whether items can be placed on this table via clicking. var/can_place_items = TRUE -/obj/structure/table/clear_connections() - connections = null - -/obj/structure/table/set_connections(dirs, other_dirs) - connections = dirs_to_corner_states(dirs) +/obj/structure/table/should_have_alpha_mask() + return simulated && isturf(loc) && !(locate(/obj/structure/table) in get_step(loc, SOUTH)) /obj/structure/table/Initialize() if(ispath(additional_reinf_material, /decl/material)) @@ -59,8 +57,34 @@ // We do this because need to make sure adjacent tables init their material before we try and merge. /obj/structure/table/LateInitialize() ..() - update_connections(TRUE) - update_icon() + if(is_flipped) + flip(dir, TRUE) + else + update_connections(TRUE) + update_icon() + +/obj/structure/table/Destroy() + var/turf/oldloc = loc + additional_reinf_material = null + . = ..() + if(istype(oldloc)) + for(var/obj/structure/table/table in range(oldloc, 1)) + if(QDELETED(table)) + continue + table.update_connections(FALSE) + table.update_icon() + +/obj/structure/table/adjust_required_attack_dexterity(mob/user, required_dexterity) + // Let people put stuff on tables without necessarily being able to use a gun or such. + if(user?.check_intent(I_FLAG_HELP)) + return DEXTERITY_HOLD_ITEM + return ..() + +/obj/structure/table/clear_connections() + connections = null + +/obj/structure/table/set_connections(dirs, other_dirs) + connections = dirs_to_corner_states(dirs) /obj/structure/table/get_material_health_modifier() . = additional_reinf_material ? 0.75 : 0.5 @@ -99,17 +123,6 @@ felted = FALSE additional_reinf_material = null -/obj/structure/table/Destroy() - var/turf/oldloc = loc - additional_reinf_material = null - . = ..() - if(istype(oldloc)) - for(var/obj/structure/table/table in range(oldloc, 1)) - if(QDELETED(table)) - continue - table.update_connections(FALSE) - table.update_icon() - /obj/structure/table/can_dismantle(mob/user) . = ..() if(.) @@ -168,7 +181,7 @@ /obj/structure/table/attackby(obj/item/W, mob/user, click_params) - if(user.a_intent == I_HURT && W.is_special_cutting_tool()) + if(user.check_intent(I_FLAG_HARM) && W.is_special_cutting_tool()) spark_at(src.loc, amount=5) playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1) user.visible_message(SPAN_DANGER("\The [src] was sliced apart by \the [user]!")) @@ -202,7 +215,7 @@ return TRUE if(istype(W, /obj/item/deck)) //playing cards - if(user.a_intent == I_GRAB) + if(user.check_intent(I_FLAG_GRAB)) var/obj/item/deck/D = W if(!length(D.cards)) to_chat(user, "There are no cards in the deck.") @@ -290,80 +303,74 @@ if(additional_reinf_material) desc = "[desc] It has been reinforced with [additional_reinf_material.solid_name]." -/obj/structure/table/on_update_icon() - - color = "#ffffff" +/obj/structure/table/proc/handle_normal_icon() + color = null // Don't double-apply our color, clear the map preview. alpha = 255 - ..() - - if(!handle_generic_blending) - return - icon_state = "blank" - if(!is_flipped) - mob_offset = initial(mob_offset) - var/image/I - // Base frame shape. + var/image/I + // Base frame shape. + for(var/i = 1 to 4) + I = image(icon, dir = BITFLAG(i-1), icon_state = connections ? connections[i] : "0") + I.color = material.color + I.alpha = 255 * material.opacity + add_overlay(I) + // Tabletop + if(reinf_material) for(var/i = 1 to 4) - I = image(icon, dir = BITFLAG(i-1), icon_state = connections ? connections[i] : "0") - I.color = material.color - I.alpha = 255 * material.opacity - add_overlay(I) - // Tabletop - if(reinf_material) - for(var/i = 1 to 4) - I = image(icon, "[reinf_material.table_icon_base]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) - I.color = reinf_material.color - I.alpha = 255 * reinf_material.opacity - add_overlay(I) - if(additional_reinf_material) - for(var/i = 1 to 4) - I = image(icon, "[additional_reinf_material.table_icon_reinforced]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) - I.color = additional_reinf_material.color - I.alpha = 255 * additional_reinf_material.opacity - add_overlay(I) - - if(felted) - for(var/i = 1 to 4) - add_overlay(image(icon, "carpet_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1))) - else - - mob_offset = 0 - - var/obj/structure/table/left_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, -90)) - var/obj/structure/table/right_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, 90)) - var/left_neighbor_blend = istype(left_neighbor) && blend_with(left_neighbor) && left_neighbor.is_flipped == is_flipped && left_neighbor.dir == dir - var/right_neighbor_blend = istype(right_neighbor) && blend_with(right_neighbor) && right_neighbor.is_flipped == is_flipped && right_neighbor.dir == dir - - var/flip_type = 0 - var/flip_mod = "" - if(left_neighbor_blend && right_neighbor_blend) - flip_type = 2 - icon_state = "flip[flip_type]" - else if(left_neighbor_blend || right_neighbor_blend) - flip_type = 1 - flip_mod = (left_neighbor_blend ? "+" : "-") - icon_state = "flip[flip_type][flip_mod]" - - color = material.color - alpha = 255 * material.opacity - - var/image/I - if(reinf_material) - I = image(icon, "[reinf_material.table_icon_base]_flip[flip_type][flip_mod]") + I = image(icon, "[reinf_material.table_icon_base]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) I.color = reinf_material.color I.alpha = 255 * reinf_material.opacity - I.appearance_flags |= RESET_COLOR|RESET_ALPHA add_overlay(I) - if(additional_reinf_material) - I = image(icon, "[reinf_material.table_icon_reinforced]_flip[flip_type][flip_mod]") + if(additional_reinf_material) + for(var/i = 1 to 4) + I = image(icon, "[additional_reinf_material.table_icon_reinforced]_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1)) I.color = additional_reinf_material.color I.alpha = 255 * additional_reinf_material.opacity - I.appearance_flags |= RESET_COLOR|RESET_ALPHA add_overlay(I) - if(felted) - add_overlay("carpet_flip[flip_type][flip_mod]") + if(felted) + for(var/i = 1 to 4) + add_overlay(image(icon, "carpet_[connections ? connections[i] : "0"]", dir = BITFLAG(i-1))) + +/obj/structure/table/proc/handle_flipped_icon() + var/obj/structure/table/left_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, -90)) + var/obj/structure/table/right_neighbor = locate(/obj/structure/table) in get_step(loc, turn(dir, 90)) + var/left_neighbor_blend = istype(left_neighbor) && blend_with(left_neighbor) && left_neighbor.is_flipped == is_flipped && left_neighbor.dir == dir + var/right_neighbor_blend = istype(right_neighbor) && blend_with(right_neighbor) && right_neighbor.is_flipped == is_flipped && right_neighbor.dir == dir + + var/flip_type = 0 + var/flip_mod = "" + if(left_neighbor_blend && right_neighbor_blend) + flip_type = 2 + icon_state = "flip[flip_type]" + else if(left_neighbor_blend || right_neighbor_blend) + flip_type = 1 + flip_mod = (left_neighbor_blend ? "+" : "-") + icon_state = "flip[flip_type][flip_mod]" + + var/image/I + if(reinf_material) + I = image(icon, "[reinf_material.table_icon_base]_flip[flip_type][flip_mod]") + I.color = reinf_material.color + I.alpha = 255 * reinf_material.opacity + I.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(I) + if(additional_reinf_material) + I = image(icon, "[reinf_material.table_icon_reinforced]_flip[flip_type][flip_mod]") + I.color = additional_reinf_material.color + I.alpha = 255 * additional_reinf_material.opacity + I.appearance_flags |= RESET_COLOR|RESET_ALPHA + add_overlay(I) + + if(felted) + add_overlay("carpet_flip[flip_type][flip_mod]") + +/obj/structure/table/on_update_icon() + . = ..() + if(is_flipped) + handle_flipped_icon() + else + handle_normal_icon() /obj/structure/table/proc/blend_with(var/obj/structure/table/other) if(!istype(other) || !istype(material) || !istype(other.material) || material.type != other.material.type) @@ -585,7 +592,8 @@ if(dir != NORTH) layer = ABOVE_HUMAN_LAYER atom_flags &= ~ATOM_FLAG_CLIMBABLE //flipping tables allows them to be used as makeshift barriers - is_flipped = 1 + is_flipped = TRUE + mob_offset = 0 atom_flags |= ATOM_FLAG_CHECKS_BORDER for(var/D in list(turn(direction, 90), turn(direction, -90))) @@ -617,6 +625,7 @@ reset_plane_and_layer() atom_flags |= ATOM_FLAG_CLIMBABLE is_flipped = FALSE + mob_offset = initial(mob_offset) atom_flags &= ~ATOM_FLAG_CHECKS_BORDER for(var/D in list(turn(dir, 90), turn(dir, -90))) var/obj/structure/table/T = locate() in get_step(src.loc,D) @@ -637,6 +646,9 @@ return TRUE return FALSE +/obj/structure/table/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) + return !reinf_material && ..() + /obj/structure/table/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) return !reinf_material && ..() @@ -717,67 +729,129 @@ reinf_material = /decl/material/solid/organic/wood/holographic //wood wood wood -/obj/structure/table/woodentable +/obj/structure/table/wood icon_state = "solid_preview" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/organic/wood - reinf_material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak + reinf_material = /decl/material/solid/organic/wood/oak parts_type = /obj/item/stack/material/plank -/obj/structure/table/woodentable/mahogany +/obj/structure/table/wood/mahogany color = WOOD_COLOR_RICH material = /decl/material/solid/organic/wood/mahogany reinf_material = /decl/material/solid/organic/wood/mahogany -/obj/structure/table/woodentable/maple +/obj/structure/table/wood/maple color = WOOD_COLOR_PALE material = /decl/material/solid/organic/wood/maple reinf_material = /decl/material/solid/organic/wood/maple -/obj/structure/table/woodentable/ebony +/obj/structure/table/wood/ebony color = WOOD_COLOR_BLACK material = /decl/material/solid/organic/wood/ebony reinf_material = /decl/material/solid/organic/wood/ebony -/obj/structure/table/woodentable/walnut +/obj/structure/table/wood/walnut color = WOOD_COLOR_CHOCOLATE material = /decl/material/solid/organic/wood/walnut reinf_material = /decl/material/solid/organic/wood/walnut -/obj/structure/table/woodentable_reinforced +/obj/structure/table/wood/reinforced icon_state = "reinf_preview" color = WOOD_COLOR_GENERIC - material = /decl/material/solid/organic/wood - reinf_material = /decl/material/solid/organic/wood - additional_reinf_material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak + reinf_material = /decl/material/solid/organic/wood/oak + additional_reinf_material = /decl/material/solid/organic/wood/oak -/obj/structure/table/woodentable_reinforced/walnut +/obj/structure/table/wood/reinforced/walnut color = WOOD_COLOR_CHOCOLATE 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 +/obj/structure/table/wood/reinforced/walnut/maple additional_reinf_material = /decl/material/solid/organic/wood/maple -/obj/structure/table/woodentable_reinforced/mahogany +/obj/structure/table/wood/reinforced/mahogany color = WOOD_COLOR_RICH 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 +/obj/structure/table/wood/reinforced/mahogany/walnut additional_reinf_material = /decl/material/solid/organic/wood/walnut -/obj/structure/table/woodentable_reinforced/ebony +/obj/structure/table/wood/reinforced/ebony color = WOOD_COLOR_BLACK 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 +/obj/structure/table/wood/reinforced/ebony/walnut additional_reinf_material = /decl/material/solid/organic/wood/walnut +// Wood laminate tables; chipboard basically. +// Smooth texture like plastic etc for a less rustic vibe on spacer maps. +/obj/structure/table/laminate + icon_state = "solid_preview" + color = WOOD_COLOR_GENERIC + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + +/obj/structure/table/laminate/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/chipboard/mahogany + reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/structure/table/laminate/maple + color = WOOD_COLOR_PALE + material = /decl/material/solid/organic/wood/chipboard/maple + reinf_material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/structure/table/laminate/ebony + color = WOOD_COLOR_BLACK + material = /decl/material/solid/organic/wood/chipboard/ebony + reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/structure/table/laminate/walnut + color = WOOD_COLOR_CHOCOLATE + material = /decl/material/solid/organic/wood/chipboard/walnut + reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminate/reinforced + icon_state = "reinf_preview" + color = WOOD_COLOR_GENERIC + material = /decl/material/solid/organic/wood/chipboard + reinf_material = /decl/material/solid/organic/wood/chipboard + additional_reinf_material = /decl/material/solid/organic/wood/chipboard + +/obj/structure/table/laminate/reinforced/walnut + color = WOOD_COLOR_CHOCOLATE + material = /decl/material/solid/organic/wood/chipboard/walnut + reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminate/reinforced/walnut/maple + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/maple + +/obj/structure/table/laminate/reinforced/mahogany + color = WOOD_COLOR_RICH + material = /decl/material/solid/organic/wood/chipboard/mahogany + reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/obj/structure/table/laminate/reinforced/mahogany/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + +/obj/structure/table/laminate/reinforced/ebony + color = WOOD_COLOR_BLACK + material = /decl/material/solid/organic/wood/chipboard/ebony + reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/ebony + +/obj/structure/table/laminate/reinforced/ebony/walnut + additional_reinf_material = /decl/material/solid/organic/wood/chipboard/walnut + // A table that doesn't smooth, intended for bedside tables or otherwise standalone tables. // TODO: make table legs use material and tabletop use reinf_material // theoretically, this could also be made to use the normal table icon system, unlike desks? @@ -792,6 +866,9 @@ material_alteration = MAT_FLAG_ALTERATION_ALL can_flip = FALSE +/obj/structure/table/end/handle_normal_icon() + icon_state = initial(icon_state) + /obj/structure/table/end/alt icon_state = "end_table_2" @@ -838,6 +915,9 @@ // we don't do frames or anything, just skip right to decon tool_interaction_flags |= TOOL_INTERACTION_DECONSTRUCT +/obj/structure/table/desk/handle_normal_icon() + return // logic is handled in on_update_icon + /obj/structure/table/desk/right icon_state = "desk_right" diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index d1e4d36df79..38feb74fd25 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -1,49 +1,94 @@ -// Target stakes for the firing range. +// TODO: skill check on melee/ranged hit to show bullseye/heart shot/etc /obj/structure/target_stake - name = "target stake" - desc = "A thin platform with negatively-magnetized wheels." - icon = 'icons/obj/objects.dmi' - icon_state = "target_stake" - density = TRUE - obj_flags = OBJ_FLAG_CONDUCTIBLE - var/obj/item/target/pinned_target - -/obj/structure/target_stake/attackby(var/obj/item/W, var/mob/user) - if (!pinned_target && istype(W, /obj/item/target) && user.try_unequip(W, get_turf(src))) - to_chat(user, "You slide [W] into the stake.") - set_target(W) + name = "target stake" + desc = "A simple stand used to prop up a target for practice." + icon = 'icons/obj/structures/target_stakes/target_stake.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + structure_flags = STRUCTURE_FLAG_THROWN_DAMAGE + var/obj/item/training_dummy/dummy + +/obj/structure/target_stake/Destroy() + dummy = null + . = ..() + +/obj/structure/target_stake/take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + if(dummy) + . = dummy.take_damage(damage, damage_type, damage_flags, inflicter, armor_pen, silent, do_update_health) + if(QDELETED(dummy)) + dummy = null + update_icon() + return + return ..() + +/obj/structure/target_stake/proc/can_hold_dummy(mob/user, obj/item/training_dummy/new_dummy) + return istype(new_dummy) && !istype(new_dummy, /obj/item/training_dummy/straw/archery) + +/obj/structure/target_stake/attack_hand(mob/user) + if(dummy) + dummy.dropInto(loc) + user.put_in_hands(dummy) + dummy = null + update_icon() + return TRUE + return ..() + +/obj/structure/target_stake/attackby(obj/item/used_item, mob/user) + if(dummy?.repair_target_dummy(used_item, user)) + return TRUE + if(istype(used_item, /obj/item/training_dummy) && can_hold_dummy(user, used_item)) + if(dummy) + to_chat(user, SPAN_WARNING("\The [src] is already holding \the [dummy].")) + else if(user.try_unequip(used_item, src)) + dummy = used_item + visible_message(SPAN_NOTICE("\The [user] places \the [dummy] onto \the [src].")) + update_icon() return TRUE return ..() -/obj/structure/target_stake/attack_hand(var/mob/user) - if (!pinned_target || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) - return ..() - to_chat(user, SPAN_NOTICE("You take \the [pinned_target] off the stake.")) - user.put_in_hands(pinned_target) - set_target(null) - return TRUE - -/obj/structure/target_stake/proc/set_target(var/obj/item/target/T) - if (T) - set_density(0) - T.set_density(1) - T.pixel_x = 0 - T.pixel_y = 0 - T.layer = ABOVE_OBJ_LAYER - 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 - set_density(1) - if(pinned_target) - pinned_target.set_density(0) - pinned_target.layer = OBJ_LAYER - events_repository.unregister(/decl/observ/moved, pinned_target, src) - events_repository.unregister(/decl/observ/moved, src, pinned_target) - pinned_target.stake = null - pinned_target = null +/obj/structure/target_stake/Initialize(ml, _mat, _reinf_mat) + if(ispath(dummy)) + dummy = new dummy(src) + . = ..() + update_icon() -/obj/structure/target_stake/Destroy() +/obj/structure/target_stake/on_update_icon() . = ..() - set_target(null) \ No newline at end of file + if(dummy) + // WTB way to stop vis_contents inheriting atom color + var/image/dummy_overlay = new /image + dummy_overlay.appearance = dummy + dummy_overlay.pixel_x = 0 + dummy_overlay.pixel_y = 0 + dummy_overlay.pixel_z = 0 + dummy_overlay.pixel_w = 0 + dummy_overlay.plane = FLOAT_PLANE + dummy_overlay.layer = FLOAT_LAYER + dummy_overlay.appearance_flags |= RESET_COLOR + add_overlay(dummy_overlay) + +// Subtypes below. +/obj/structure/target_stake/steel + material = /decl/material/solid/metal/steel + +/obj/structure/target_stake/archery + name = "archery butt" + desc = "A heavy circular target used for practicing archery." + icon = 'icons/obj/structures/target_stakes/archery_butt.dmi' + +/obj/structure/target_stake/archery/can_hold_dummy(mob/user, obj/item/training_dummy/new_dummy) + return istype(new_dummy, /obj/item/training_dummy/straw/archery) + +// Subtypes with/for dummies. +/obj/structure/target_stake/mapped + dummy = /obj/item/training_dummy/straw + +/obj/structure/target_stake/steel/mapped/Initialize() + dummy = pick(/obj/item/training_dummy, /obj/item/training_dummy/alien, /obj/item/training_dummy/syndicate) + return ..() + +/obj/structure/target_stake/archery/mapped + dummy = /obj/item/training_dummy/straw/archery diff --git a/code/game/objects/structures/town_bell.dm b/code/game/objects/structures/town_bell.dm index 4a0faee50f5..45cb1f48451 100644 --- a/code/game/objects/structures/town_bell.dm +++ b/code/game/objects/structures/town_bell.dm @@ -48,7 +48,7 @@ /obj/structure/town_bell/attackby(obj/item/used_item, mob/user) . = ..() - if(used_item.get_attack_force()) + if(used_item.expend_attack_force()) ding_dong() /obj/structure/town_bell/attack_hand(mob/user) diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm index 289b7d7c251..b7fba083f5c 100644 --- a/code/game/objects/structures/transit_tubes.dm +++ b/code/game/objects/structures/transit_tubes.dm @@ -45,7 +45,12 @@ var/moving = 0 var/datum/gas_mixture/air_contents = new() - +/obj/structure/transit_tube_pod/attack_hand(mob/user) + if(!moving && length(contents) && isturf(user.loc)) + user.visible_message(SPAN_NOTICE("\The [user] empties out \the [src]!")) + dump_contents() + return TRUE + return ..() /obj/structure/transit_tube_pod/Destroy() dump_contents() diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index db853713b21..e8f8ab1e513 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -78,7 +78,7 @@ var/datum/category_group/underwear/UWC = global.underwear.categories_by_name[href_list["select_underwear"]] if(!UWC) return - var/datum/category_item/underwear/UWI = input("Select your desired underwear:", "Choose underwear") as null|anything in exlude_none(UWC.items) + var/datum/category_item/underwear/UWI = input("Select your desired underwear:", "Choose underwear") as null|anything in exclude_none(UWC.items) if(!UWI) return @@ -113,7 +113,7 @@ if(.) interact(H) -/obj/structure/undies_wardrobe/proc/exlude_none(var/list/L) +/obj/structure/undies_wardrobe/proc/exclude_none(var/list/L) . = L.Copy() for(var/e in .) var/datum/category_item/underwear/UWI = e diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index 850fc4d7c58..3aaf589d466 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -18,7 +18,7 @@ tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) max_health = 40 parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/stripe_color var/list/connections var/list/other_connections diff --git a/code/game/objects/structures/wall_sconce.dm b/code/game/objects/structures/wall_sconce.dm index c66f3e453fd..c1211712b3c 100644 --- a/code/game/objects/structures/wall_sconce.dm +++ b/code/game/objects/structures/wall_sconce.dm @@ -58,6 +58,10 @@ QDEL_NULL(light_source) return ..() +/obj/structure/wall_sconce/ignite_fire() + . = ..() + update_icon() + /obj/structure/wall_sconce/physically_destroyed() if(light_source) light_source.dropInto(loc) @@ -84,7 +88,7 @@ /obj/structure/wall_sconce/attackby(obj/item/W, mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(IS_HAMMER(W) || IS_WRENCH(W)) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 454e6e9b6b5..549d7d913ab 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -49,6 +49,23 @@ var/global/list/hygiene_props = list() if(clogged <= 0) unclog() return TRUE + //toilet paper interaction for clogging toilets and other facilities + if (istype(thing, /obj/item/stack/tape_roll/barricade_tape/toilet)) + if (clogged == -1) + to_chat(user, SPAN_WARNING("Try as you might, you can not clog \the [src] with \the [thing].")) + return TRUE + if (clogged) + to_chat(user, SPAN_WARNING("\The [src] is already clogged.")) + return TRUE + if (!do_after(user, 3 SECONDS, src)) + to_chat(user, SPAN_WARNING("You must stay still to clog \the [src].")) + return TRUE + if (clogged || QDELETED(thing) || !user.try_unequip(thing)) + return TRUE + to_chat(user, SPAN_NOTICE("You unceremoniously jam \the [src] with \the [thing]. What a rebel.")) + clog(1) + qdel(thing) + return TRUE . = ..() /obj/structure/hygiene/examine(mob/user) @@ -474,27 +491,6 @@ var/global/list/hygiene_props = list() . = ..() icon_state = "puddle" -//toilet paper interaction for clogging toilets and other facilities - -/obj/structure/hygiene/attackby(obj/item/I, mob/user) - if (!istype(I, /obj/item/stack/tape_roll/barricade_tape/toilet)) - return ..() - if (clogged == -1) - to_chat(user, SPAN_WARNING("Try as you might, you can not clog \the [src] with \the [I].")) - return TRUE - if (clogged) - to_chat(user, SPAN_WARNING("\The [src] is already clogged.")) - return TRUE - if (!do_after(user, 3 SECONDS, src)) - to_chat(user, SPAN_WARNING("You must stay still to clog \the [src].")) - return TRUE - if (clogged || QDELETED(I) || !user.try_unequip(I)) - return TRUE - to_chat(user, SPAN_NOTICE("You unceremoniously jam \the [src] with \the [I]. What a rebel.")) - clog(1) - qdel(I) - return TRUE - //////////////////////////////////////////////////// // Toilet Paper Roll //////////////////////////////////////////////////// diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index cb0c2006285..911413e67e9 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -18,6 +18,10 @@ can_toggle_open = FALSE var/auto_refill +// Override to skip open container check. +/obj/structure/reagent_dispensers/well/can_drink_from(mob/user) + return reagents?.total_volume && user.check_has_mouth() + /obj/structure/reagent_dispensers/well/populate_reagents() . = ..() if(auto_refill) @@ -32,6 +36,10 @@ . = ..() if(reagents?.total_volume) add_overlay(overlay_image(icon, "[icon_state]-fluid", reagents.get_color(), (RESET_COLOR | RESET_ALPHA))) + if(istype(reinf_material)) // reinf_material -> roof and posts, at this point in time + var/image/roof_image = overlay_image(icon, "[icon_state]-roof", reinf_material.color, RESET_COLOR | RESET_ALPHA | KEEP_APART) + roof_image.pixel_y = 16 // we have to use 32x32 sprites but want this to be, effectively, 48x32 + add_overlay(roof_image) /obj/structure/reagent_dispensers/well/on_reagent_change() if(!(. = ..())) @@ -40,12 +48,16 @@ if(!is_processing && auto_refill) START_PROCESSING(SSobj, src) -/obj/structure/reagent_dispensers/well/attackby(obj/item/W, mob/user) +// Overrides due to wonky reagent_dispeners opencontainer flag handling. +/obj/structure/reagent_dispensers/well/can_be_poured_from(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +/obj/structure/reagent_dispensers/well/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) + +/obj/structure/reagent_dispensers/well/get_standard_interactions(var/mob/user) . = ..() - if(!. && user.a_intent == I_HELP && reagents?.total_volume > FLUID_PUDDLE) - user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) - W.fluid_act(reagents) - return TRUE + if(reagents?.maximum_volume) + LAZYADD(., global._reagent_interactions) /obj/structure/reagent_dispensers/well/Process() if(!reagents || !auto_refill) // if we're full, we only stop at the end of the proc; we need to check for contaminants first @@ -64,6 +76,9 @@ /obj/structure/reagent_dispensers/well/mapped auto_refill = /decl/material/liquid/water +/obj/structure/reagent_dispensers/well/mapped/covered + reinf_material = /decl/material/solid/organic/wood/walnut + /obj/structure/reagent_dispensers/well/wall_fountain name = "wall fountain" desc = "An intricately-constructed fountain set into a wall." diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4ad6358add5..7b9c56f7110 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -145,23 +145,25 @@ /obj/structure/window/attack_hand(mob/user) SHOULD_CALL_PARENT(FALSE) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - if (user.a_intent && user.a_intent == I_HURT) + if (user.check_intent(I_FLAG_HARM)) - if (ishuman(user)) - var/mob/living/human/H = user - if(H.species.can_shred(H)) - return attack_generic(H,25) + if(user.can_shred()) + return attack_generic(user, 25) playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) user.do_attack_animation(src) - user.visible_message(SPAN_DANGER("\The [user] bangs against \the [src]!"), - SPAN_DANGER("You bang against \the [src]!"), - "You hear a banging sound.") + user.visible_message( + SPAN_DANGER("\The [user] bangs against \the [src]!"), + SPAN_DANGER("You bang against \the [src]!"), + "You hear a banging sound." + ) else playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1) - user.visible_message("[user.name] knocks on \the [src].", - "You knock on \the [src].", - "You hear a knocking sound.") + user.visible_message( + SPAN_NOTICE("\The [user] knocks on \the [src]."), + SPAN_NOTICE("You knock on \the [src]."), + "You hear a knocking sound." + ) return TRUE /obj/structure/window/do_simple_ranged_interaction(var/mob/user) @@ -207,6 +209,9 @@ playsound(loc, crowbar.get_tool_sound(TOOL_CROWBAR) || 'sound/items/Crowbar.ogg', 75, 1) return TRUE +/obj/structure/window/handle_default_hammer_attackby(mob/user, obj/item/hammer) + return FALSE + /obj/structure/window/handle_default_wrench_attackby(mob/user, obj/item/wrench) if(anchored || (reinf_material && construction_state > CONSTRUCTION_STATE_NO_FRAME)) return FALSE // ineligible, allow other interactions to proceed @@ -279,7 +284,7 @@ return ..() // handle generic interactions, bashing, etc /obj/structure/window/bash(obj/item/weapon, mob/user) - if(isliving(user) && user.a_intent == I_HELP) + if(isliving(user) && user.check_intent(I_FLAG_HELP)) return FALSE if(!weapon.user_can_attack_with(user)) return FALSE @@ -289,7 +294,7 @@ // physical damage types that can impart force; swinging a bat or energy sword if(weapon.atom_damage_type == BRUTE || weapon.atom_damage_type == BURN) user.do_attack_animation(src) - hit(weapon.get_attack_force(user)) + hit(weapon.expend_attack_force(user)) if(current_health <= 7) set_anchored(FALSE) step(src, get_dir(user, src)) @@ -311,7 +316,7 @@ thing.set_color(paint_color) /obj/structure/window/grab_attack(obj/item/grab/grab, mob/user) - if (user.a_intent != I_HURT) + if (!user.check_intent(I_FLAG_HARM)) return TRUE if (!grab.force_danger()) to_chat(user, SPAN_DANGER("You need a better grip to do that!")) @@ -401,12 +406,10 @@ if (polarized) to_chat(user, SPAN_NOTICE("It appears to be wired.")) -/obj/structure/window/proc/set_anchored(var/new_anchored) - if(anchored == new_anchored) - return - anchored = new_anchored - update_connections(1) - update_nearby_icons() +/obj/structure/window/set_anchored(new_anchored) + if((. = ..())) + update_connections(1) + update_nearby_icons() //This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc! /obj/structure/window/proc/update_nearby_icons() diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 981d5aa6b81..7618f0600ea 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -16,7 +16,7 @@ var/global/list/flooring_cache = list() var/gender = PLURAL /// "that's some grass" var/icon_base var/color = COLOR_WHITE - var/footstep_type = /decl/footsteps/blank + var/footstep_type = /decl/footsteps/plating var/growth_value = 0 var/neighbour_type @@ -35,11 +35,17 @@ var/global/list/flooring_cache = list() /// BYOND ticks. var/build_time = 0 + var/drop_material_on_remove + var/descriptor var/flooring_flags var/remove_timer = 10 var/can_paint var/can_engrave = TRUE + var/can_collect = FALSE + + // Not bloody prints, but rather prints on top of the turf (snow, mud) + var/print_type var/turf_light_range var/turf_light_power @@ -78,7 +84,7 @@ var/global/list/flooring_cache = list() var/render_trenches = TRUE var/floor_layer = TURF_LAYER var/holographic = FALSE - var/dirt_color = "#7c5e42" + var/dirt_color = /decl/material/solid/soil::color var/list/burned_states var/list/broken_states @@ -261,8 +267,9 @@ var/global/list/flooring_cache = list() global.flooring_cache[cache_key] = I return global.flooring_cache[cache_key] -/decl/flooring/proc/on_remove() - return +/decl/flooring/proc/on_flooring_remove(turf/removing_from) + if(force_material && drop_material_on_remove) + force_material.create_object(removing_from, rand(3,5)) /decl/flooring/proc/get_movement_delay(var/travel_dir, var/mob/mover) return movement_delay @@ -270,9 +277,20 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/get_movable_alpha_mask_state(atom/movable/mover) return +/decl/flooring/proc/handle_hand_interaction(turf/floor/floor, mob/user) + if(!force_material || !can_collect) + return FALSE + user.visible_message(SPAN_NOTICE("\The [user] begins scraping together some of \the [name]...")) + if(do_after(user, 3 SECONDS, floor) && !QDELETED(floor) && !QDELETED(user) && floor.get_topmost_flooring() == src && isnull(user.get_active_held_item())) + var/list/created = force_material.create_object(floor, 1) + user.visible_message(SPAN_NOTICE("\The [user] scrapes together [english_list(created)].")) + for(var/obj/item/stack/stack in created) + stack.add_to_stacks(user, TRUE) + return TRUE + /decl/flooring/proc/handle_item_interaction(turf/floor/floor, mob/user, obj/item/item) - if(!istype(user) || !istype(item) || !istype(floor) || user.a_intent == I_HURT) + if(!istype(user) || !istype(item) || !istype(floor) || user.check_intent(I_FLAG_HARM)) return FALSE if(!(IS_SCREWDRIVER(item) && (flooring_flags & TURF_REMOVE_SCREWDRIVER)) && floor.try_graffiti(user, item)) @@ -347,3 +365,35 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/handle_environment_proc(turf/floor/target) return PROCESS_KILL + +/decl/flooring/proc/handle_turf_digging(turf/floor/target) + return TRUE + +/decl/flooring/proc/turf_exited(turf/target, atom/movable/crosser, atom/new_loc) + return print_type && try_place_footprints(crosser, target, target, new_loc, "going") + +/decl/flooring/proc/turf_entered(turf/target, atom/movable/crosser, atom/old_loc) + return print_type && try_place_footprints(crosser, target, old_loc, target, "coming") + +/decl/flooring/proc/try_place_footprints(atom/movable/crosser, turf/target, turf/from_turf, turf/to_turf, use_state = "going") + if(!ismob(crosser) || !crosser.simulated || !isturf(from_turf) || !isturf(to_turf)) + return FALSE + if(target.check_fluid_depth(FLUID_QDEL_POINT)) + return FALSE + var/movement_dir = get_dir(from_turf, to_turf) + if(!movement_dir) + return FALSE + var/mob/walker = crosser + var/footprint_icon = walker.get_footprints_icon() + if(!footprint_icon) + return FALSE + var/obj/effect/footprints/prints = (locate() in target) || new print_type(target) + prints.add_footprints(crosser, footprint_icon, movement_dir, use_state) + +/decl/flooring/proc/turf_crossed(atom/movable/crosser) + return + +/// target is the turf that wants to know if it supports footprints +/// contaminant is, optionally, the material of the coating that wants to be added. +/decl/flooring/proc/can_show_coating_footprints(turf/target, decl/material/contaminant) + return TRUE diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index 802c509f573..8ac33265fdb 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -21,6 +21,10 @@ return TRUE return ..() +/decl/flooring/grass/handle_turf_digging(turf/floor/target) + target.set_flooring(null) + return FALSE + /decl/flooring/grass/wild name = "wild grass" icon = 'icons/turf/flooring/wildgrass.dmi' @@ -34,9 +38,10 @@ . = ..() || "mask_grass" /decl/flooring/grass/wild/handle_item_interaction(turf/floor/floor, mob/user, obj/item/item) - if(IS_KNIFE(item) && harvestable) + var/decl/material/floor_material = floor.get_material() + if(IS_KNIFE(item) && harvestable && istype(floor_material) && floor_material.dug_drop_type) if(item.do_tool_interaction(TOOL_KNIFE, user, floor, 3 SECONDS, start_message = "harvesting", success_message = "harvesting") && !QDELETED(floor) && floor.get_topmost_flooring() == src) - new /obj/item/stack/material/bundle/grass(floor, rand(2,5)) + new floor_material.dug_drop_type(floor, rand(2,5)) floor.set_flooring(/decl/flooring/grass) return TRUE return ..() diff --git a/code/game/turfs/flooring/flooring_lava.dm b/code/game/turfs/flooring/flooring_lava.dm index beebb36b775..d8137d15b35 100644 --- a/code/game/turfs/flooring/flooring_lava.dm +++ b/code/game/turfs/flooring/flooring_lava.dm @@ -13,12 +13,12 @@ /decl/flooring/lava/handle_environment_proc(turf/floor/target) . = PROCESS_KILL - if(locate(/obj/structure/catwalk) in target) + if(target.get_supporting_platform()) return var/datum/gas_mixture/environment = target.return_air() var/pressure = environment?.return_pressure() for(var/atom/movable/AM as anything in target.get_contained_external_atoms()) - if(!AM.is_burnable()) + if(!AM.is_burnable() || AM.immune_to_floor_hazards()) continue . = null if(isliving(AM)) diff --git a/code/game/turfs/flooring/flooring_misc.dm b/code/game/turfs/flooring/flooring_misc.dm index eaed5e06b52..cdedfb75619 100644 --- a/code/game/turfs/flooring/flooring_misc.dm +++ b/code/game/turfs/flooring/flooring_misc.dm @@ -35,7 +35,6 @@ can_engrave = FALSE color = GLASS_COLOR z_flags = ZM_MIMIC_DEFAULTS - footstep_type = /decl/footsteps/plating force_material = /decl/material/solid/glass constructed = TRUE @@ -76,8 +75,8 @@ /decl/flooring/straw name = "straw floor" desc = "A thick layer of straw, suitable for livestock." - icon = 'icons/turf/flooring/wildgrass.dmi' // temporary, replace with better icon at some point - icon_base = "wildgrass" + icon = 'icons/turf/flooring/straw.dmi' + icon_base = "straw" has_base_range = null icon_edge_layer = FLOOR_EDGE_GRASS_WILD damage_temperature = T0C+80 diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index 59be34fdfad..d6d77b4e9e3 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -3,11 +3,14 @@ desc = "A stretch of thick, waterlogged mud." icon = 'icons/turf/flooring/mud.dmi' icon_base = "mud" + color = null // autoset from material icon_edge_layer = FLOOR_EDGE_MUD footstep_type = /decl/footsteps/mud turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/soil growth_value = 1.1 + can_collect = TRUE + print_type = /obj/effect/footprints /decl/flooring/mud/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!target.reagents?.total_volume) @@ -18,6 +21,17 @@ return return ..() +/decl/flooring/mud/turf_crossed(atom/movable/crosser) + if(!isliving(crosser)) + return + var/mob/living/walker = crosser + walker.add_walking_contaminant(force_material.type, rand(2,3)) + +/decl/flooring/mud/can_show_coating_footprints(turf/target, decl/material/contaminant) + if(force_material.type == contaminant) // So we don't end up covered in a million footsteps that we provided. + return FALSE + return ..() + /decl/flooring/dry_mud name = "dry mud" desc = "This was once mud, but forgot to keep hydrated." @@ -45,7 +59,7 @@ icon = 'icons/turf/flooring/dirt.dmi' icon_base = "dirt" icon_edge_layer = FLOOR_EDGE_DIRT - color = "#41311b" + color = null // autoset from material footstep_type = /decl/footsteps/asteroid turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/soil diff --git a/code/game/turfs/flooring/flooring_natural.dm b/code/game/turfs/flooring/flooring_natural.dm index 55742476ec3..63d3b2ec93c 100644 --- a/code/game/turfs/flooring/flooring_natural.dm +++ b/code/game/turfs/flooring/flooring_natural.dm @@ -7,16 +7,18 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand gender = NEUTER + footstep_type = /decl/footsteps/sand /decl/flooring/shrouded name = "packed sand" desc = "Packed-down sand forming a solid layer." - icon = 'icons/turf/flooring/shrouded.dmi' + icon = 'icons/turf/flooring/shrouded.dmi' // Note: this icon is not greyscaled icon_base = "shrouded" - dirt_color = "#3e3960" + dirt_color = "#3e3960" // Does this mean we're double-applying the colour? Or is that just an issue with the 'color' variable? has_base_range = 8 turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand + footstep_type = /decl/footsteps/asteroid /decl/flooring/meat name = "fleshy ground" @@ -27,6 +29,7 @@ has_base_range = null footstep_type = /decl/footsteps/mud force_material = /decl/material/solid/organic/meat + print_type = /obj/effect/footprints /decl/flooring/barren name = "ground" @@ -50,13 +53,14 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/clay growth_value = 1.2 + can_collect = TRUE + print_type = /obj/effect/footprints /decl/flooring/ice name = "ice" desc = "A hard, slippery layer of frozen water." icon = 'icons/turf/flooring/ice.dmi' icon_base = "ice" - footstep_type = /decl/footsteps/plating color = COLOR_LIQUID_WATER force_material = /decl/material/solid/ice diff --git a/code/game/turfs/flooring/flooring_path.dm b/code/game/turfs/flooring/flooring_path.dm index 37ce339b7ec..475573d5773 100644 --- a/code/game/turfs/flooring/flooring_path.dm +++ b/code/game/turfs/flooring/flooring_path.dm @@ -7,6 +7,7 @@ neighbour_type = /decl/flooring/path color = null constructed = TRUE + // If null, this is just skipped. var/paving_adjective = "cobbled" var/paver_adjective = "loose" diff --git a/code/game/turfs/flooring/flooring_reinforced.dm b/code/game/turfs/flooring/flooring_reinforced.dm index a926312bc8f..0a46fa2d41c 100644 --- a/code/game/turfs/flooring/flooring_reinforced.dm +++ b/code/game/turfs/flooring/flooring_reinforced.dm @@ -9,7 +9,6 @@ build_cost = 1 build_time = 30 can_paint = 1 - footstep_type = /decl/footsteps/plating force_material = /decl/material/solid/metal/steel constructed = TRUE gender = NEUTER diff --git a/code/game/turfs/flooring/flooring_sand.dm b/code/game/turfs/flooring/flooring_sand.dm index 27084c19ecb..caf29c81049 100644 --- a/code/game/turfs/flooring/flooring_sand.dm +++ b/code/game/turfs/flooring/flooring_sand.dm @@ -8,6 +8,8 @@ has_base_range = 4 turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand + can_collect = TRUE + print_type = /obj/effect/footprints /decl/flooring/sand/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if((exposed_temperature > T0C + 1700 && prob(5)) || exposed_temperature > T0C + 3000) diff --git a/code/game/turfs/flooring/flooring_snow.dm b/code/game/turfs/flooring/flooring_snow.dm index 6055cdda83d..f1d1dded76e 100644 --- a/code/game/turfs/flooring/flooring_snow.dm +++ b/code/game/turfs/flooring/flooring_snow.dm @@ -4,9 +4,13 @@ icon = 'icons/turf/flooring/snow.dmi' icon_base = "snow" icon_edge_layer = FLOOR_EDGE_SNOW + flooring_flags = TURF_REMOVE_SHOVEL footstep_type = /decl/footsteps/snow has_base_range = 13 force_material = /decl/material/solid/ice/snow + can_collect = TRUE + print_type = /obj/effect/footprints + drop_material_on_remove = TRUE /decl/flooring/snow/get_movement_delay(var/travel_dir, var/mob/mover) . = ..() @@ -28,6 +32,19 @@ return return ..() +/decl/flooring/snow/turf_crossed(atom/movable/crosser) + if(!isliving(crosser)) + return + var/mob/living/walker = crosser + // at some point this might even be able to use the height + // of the snow flooring layer, so deep snow gives you more coating + walker.add_walking_contaminant(force_material.type, rand(1, 2)) + +/decl/flooring/snow/can_show_coating_footprints(turf/target, decl/material/contaminant) + if(force_material.type == contaminant) // So we don't end up covered in a million footsteps that we provided. + return FALSE + return ..() + /decl/flooring/permafrost name = "permafrost" desc = "A stretch of frozen soil that hasn't seen a thaw for many seasons." diff --git a/code/game/turfs/flooring/flooring_wood.dm b/code/game/turfs/flooring/flooring_wood.dm index a9c136bfcb5..b5fc086d42f 100644 --- a/code/game/turfs/flooring/flooring_wood.dm +++ b/code/game/turfs/flooring/flooring_wood.dm @@ -9,8 +9,8 @@ build_type = /obj/item/stack/tile/wood flooring_flags = TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER footstep_type = /decl/footsteps/wood - color = /decl/material/solid/organic/wood::color - force_material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood/oak::color + force_material = /decl/material/solid/organic/wood/oak constructed = TRUE gender = NEUTER broken_states = list( @@ -25,30 +25,121 @@ /decl/flooring/wood/mahogany color = /decl/material/solid/organic/wood/mahogany::color - build_type = /obj/item/stack/tile/mahogany + build_type = /obj/item/stack/tile/wood/mahogany force_material = /decl/material/solid/organic/wood/mahogany /decl/flooring/wood/maple color = /decl/material/solid/organic/wood/maple::color - build_type = /obj/item/stack/tile/maple + build_type = /obj/item/stack/tile/wood/maple force_material = /decl/material/solid/organic/wood/maple /decl/flooring/wood/ebony color = /decl/material/solid/organic/wood/ebony::color - build_type = /obj/item/stack/tile/ebony + build_type = /obj/item/stack/tile/wood/ebony force_material = /decl/material/solid/organic/wood/ebony /decl/flooring/wood/walnut color = /decl/material/solid/organic/wood/walnut::color - build_type = /obj/item/stack/tile/walnut + build_type = /obj/item/stack/tile/wood/walnut force_material = /decl/material/solid/organic/wood/walnut /decl/flooring/wood/bamboo color = /decl/material/solid/organic/wood/bamboo::color - build_type = /obj/item/stack/tile/bamboo + build_type = /obj/item/stack/tile/wood/bamboo force_material = /decl/material/solid/organic/wood/bamboo /decl/flooring/wood/yew color = /decl/material/solid/organic/wood/yew::color - build_type = /obj/item/stack/tile/yew + build_type = /obj/item/stack/tile/wood/yew force_material = /decl/material/solid/organic/wood/yew + +// Rough-hewn floors. +/decl/flooring/wood/rough + + name = "rough wooden floor" + desc = "A stretch of loosely-fitted, rough-hewn wooden planks." + icon = 'icons/turf/flooring/wood_alt.dmi' + icon_base = "wood_peasant" + has_base_range = 3 + build_type = /obj/item/stack/tile/wood/rough + broken_states = null + +/decl/flooring/wood/rough/mahogany + color = /decl/material/solid/organic/wood/mahogany::color + build_type = /obj/item/stack/tile/wood/rough/mahogany + force_material = /decl/material/solid/organic/wood/mahogany + +/decl/flooring/wood/rough/maple + color = /decl/material/solid/organic/wood/maple::color + build_type = /obj/item/stack/tile/wood/rough/maple + force_material = /decl/material/solid/organic/wood/maple + +/decl/flooring/wood/rough/ebony + color = /decl/material/solid/organic/wood/ebony::color + build_type = /obj/item/stack/tile/wood/rough/ebony + force_material = /decl/material/solid/organic/wood/ebony + +/decl/flooring/wood/rough/walnut + color = /decl/material/solid/organic/wood/walnut::color + build_type = /obj/item/stack/tile/wood/rough/walnut + force_material = /decl/material/solid/organic/wood/walnut + +/decl/flooring/wood/rough/bamboo + color = /decl/material/solid/organic/wood/bamboo::color + build_type = /obj/item/stack/tile/wood/rough/bamboo + force_material = /decl/material/solid/organic/wood/bamboo + +/decl/flooring/wood/rough/yew + color = /decl/material/solid/organic/wood/yew::color + build_type = /obj/item/stack/tile/wood/rough/yew + force_material = /decl/material/solid/organic/wood/yew + +// Chipboard/wood laminate floors. Uses older icons. +/decl/flooring/laminate + name = "wooden laminate floor" + desc = "A stretch of closely-fitted sections of chipboard with a laminated veneer." + icon = 'icons/turf/flooring/laminate.dmi' + icon_base = "wood" + damage_temperature = T0C+200 + descriptor = "sections" + build_type = /obj/item/stack/tile/wood/laminate/oak + flooring_flags = TURF_IS_FRAGILE | TURF_REMOVE_SCREWDRIVER + footstep_type = /decl/footsteps/wood + color = /decl/material/solid/organic/wood/chipboard::color + force_material = /decl/material/solid/organic/wood/chipboard + constructed = TRUE + gender = NEUTER + broken_states = list( + "broken0", + "broken1", + "broken2", + "broken3", + "broken4", + "broken5", + "broken6" + ) + +/decl/flooring/laminate/mahogany + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + build_type = /obj/item/stack/tile/wood/laminate/mahogany + force_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/flooring/laminate/maple + color = /decl/material/solid/organic/wood/chipboard/maple::color + build_type = /obj/item/stack/tile/wood/laminate/maple + force_material = /decl/material/solid/organic/wood/chipboard/maple + +/decl/flooring/laminate/ebony + color = /decl/material/solid/organic/wood/chipboard/ebony::color + build_type = /obj/item/stack/tile/wood/laminate/ebony + force_material = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/flooring/laminate/walnut + color = /decl/material/solid/organic/wood/chipboard/walnut::color + build_type = /obj/item/stack/tile/wood/laminate/walnut + force_material = /decl/material/solid/organic/wood/chipboard/yew + +/decl/flooring/laminate/yew + color = /decl/material/solid/organic/wood/chipboard/yew::color + build_type = /obj/item/stack/tile/wood/laminate/yew + force_material = /decl/material/solid/organic/wood/chipboard/yew diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 8a5562d03ad..d7e8441fda0 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -44,8 +44,7 @@ if(floortype) set_flooring(GET_DECL(floortype), skip_update = TRUE) - if(fill_reagent_type && get_physical_height() < 0) - add_to_reagents(fill_reagent_type, abs(height), phase = MAT_PHASE_LIQUID) + fill_to_zero_height() // try to refill turfs that act as fluid sources if(floor_material || get_topmost_flooring()) if(ml) @@ -71,6 +70,12 @@ STOP_PROCESSING(SSobj, src) return ..() +/turf/floor/proc/fill_to_zero_height() + var/my_height = get_physical_height() + if(fill_reagent_type && my_height < 0 && (!reagents || !QDELING(reagents)) && reagents?.total_volume < abs(my_height)) + var/reagents_to_add = abs(my_height) - reagents?.total_volume + add_to_reagents(fill_reagent_type, reagents_to_add, phase = MAT_PHASE_LIQUID) + /turf/floor/can_climb_from_below(var/mob/climber) return TRUE @@ -92,9 +97,9 @@ /turf/floor/on_reagent_change() . = ..() - var/my_height = get_physical_height() - if(!QDELETED(src) && fill_reagent_type && my_height < 0 && !QDELETED(reagents) && reagents.total_volume < abs(my_height)) - add_to_reagents(fill_reagent_type, abs(my_height) - reagents.total_volume) + if(!QDELETED(src)) + fill_to_zero_height() + update_floor_strings() /turf/floor/proc/set_base_flooring(new_base_flooring, skip_update) if(ispath(new_base_flooring, /decl/flooring)) @@ -138,7 +143,7 @@ for(var/obj/effect/decal/writing/W in src) qdel(W) - _flooring.on_remove() + _flooring.on_flooring_remove(src) if(_flooring.build_type && place_product) // If build type uses material stack, check for it // Because material stack uses different arguments @@ -172,7 +177,6 @@ /turf/floor/proc/update_from_flooring(skip_update) - var/decl/flooring/copy_from = get_topmost_flooring() if(!istype(copy_from)) return // this should never be the case @@ -199,6 +203,9 @@ levelupdate() + for(var/obj/effect/footprints/print in src) + qdel(print) + if(!skip_update) update_icon() for(var/dir in global.alldirs) @@ -276,16 +283,18 @@ return PROCESS_KILL // In case a catwalk or other blocking item is destroyed. -/turf/floor/Exited(atom/movable/AM) +/turf/floor/Exited(atom/movable/AM, atom/new_loc) . = ..() if(!is_processing) for(var/decl/flooring/flooring in get_all_flooring()) if(flooring.has_environment_proc) START_PROCESSING(SSobj, src) break + var/decl/flooring/print_flooring = get_topmost_flooring() + print_flooring?.turf_exited(src, AM, new_loc) // In case something of interest enters our turf. -/turf/floor/Entered(atom/movable/AM) +/turf/floor/Entered(atom/movable/AM, atom/old_loc) . = ..() for(var/decl/flooring/flooring in get_all_flooring()) if(flooring.has_environment_proc) @@ -293,7 +302,17 @@ START_PROCESSING(SSobj, src) flooring.handle_environment_proc(src) break + var/decl/flooring/print_flooring = get_topmost_flooring() + print_flooring?.turf_entered(src, AM, old_loc) /turf/floor/get_plant_growth_rate() var/decl/flooring/flooring = get_topmost_flooring() return flooring ? flooring.growth_value : ..() + +/turf/floor/Crossed(atom/movable/AM) + var/decl/flooring/flooring = get_topmost_flooring() + flooring?.turf_crossed(AM) + return ..() + +/turf/floor/can_show_coating_footprints(decl/material/contaminant = null) + return ..() && get_topmost_flooring()?.can_show_coating_footprints(src, contaminant) diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm index c87c7b79ce9..8b81baf3ae7 100644 --- a/code/game/turfs/floors/floor_attackby.dm +++ b/code/game/turfs/floors/floor_attackby.dm @@ -1,10 +1,14 @@ /turf/floor/attack_hand(mob/user) - if(!ishuman(user)) - return ..() - var/mob/living/human/H = user - var/obj/item/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) - if(hand && try_graffiti(H, hand)) + + // Collect snow or mud. + var/decl/flooring/flooring = get_topmost_flooring() + if(flooring?.handle_hand_interaction(src, user)) return TRUE + + var/obj/item/hand = GET_EXTERNAL_ORGAN(user, user.get_active_held_item_slot()) + if(hand && try_graffiti(user, hand)) + return TRUE + return ..() /turf/floor/attackby(var/obj/item/used_item, var/mob/user) @@ -24,7 +28,7 @@ return ..() /turf/floor/proc/try_build_catwalk(var/obj/item/used_item, var/mob/user) - if(!(locate(/obj/structure/catwalk) in src) && istype(used_item, /obj/item/stack/material/rods)) + if(istype(used_item, /obj/item/stack/material/rods) && !get_supporting_platform()) var/obj/item/stack/material/rods/R = used_item if (R.use(2)) playsound(src, 'sound/weapons/Genhit.ogg', 50, 1) @@ -73,8 +77,8 @@ if((istype(flooring) && flooring.constructed) || !istype(used_item) || !istype(user)) return FALSE - flooring = get_base_flooring() - if(istype(flooring) && flooring.constructed) + var/decl/flooring/base_flooring = get_base_flooring() + if(istype(base_flooring) && base_flooring.constructed) return FALSE if(!istype(used_item, /obj/item/stack/material/ore) && !istype(used_item, /obj/item/stack/material/lump)) @@ -84,11 +88,11 @@ to_chat(user, SPAN_WARNING("\The [src] is flush with ground level and cannot be backfilled.")) return TRUE - if(!used_item.material?.can_backfill_turf_type) + if(!used_item.material?.can_backfill_floor_type) to_chat(user, SPAN_WARNING("You cannot use \the [used_item] to backfill \the [src].")) return TRUE - var/can_backfill = islist(used_item.material.can_backfill_turf_type) ? is_type_in_list(src, used_item.material.can_backfill_turf_type) : istype(src, used_item.material.can_backfill_turf_type) + var/can_backfill = islist(used_item.material.can_backfill_floor_type) ? is_type_in_list(flooring, used_item.material.can_backfill_floor_type) : istype(flooring, used_item.material.can_backfill_floor_type) if(!can_backfill) to_chat(user, SPAN_WARNING("You cannot use \the [used_item] to backfill \the [src].")) return TRUE diff --git a/code/game/turfs/floors/floor_digging.dm b/code/game/turfs/floors/floor_digging.dm index 4262e953ad8..123458d009c 100644 --- a/code/game/turfs/floors/floor_digging.dm +++ b/code/game/turfs/floors/floor_digging.dm @@ -1,10 +1,15 @@ -/turf/floor/proc/is_fundament() +/turf/floor + var/gemstone_dropped = FALSE + +/turf/floor/proc/flooring_is_diggable() var/decl/flooring/flooring = get_topmost_flooring() - return flooring ? !flooring.constructed : TRUE + if(!flooring || flooring.constructed) + return FALSE + return TRUE /turf/floor/can_be_dug(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) // This should be removed before digging trenches. - if(!is_fundament()) + if(!flooring_is_diggable()) return FALSE var/decl/flooring/flooring = get_base_flooring() if(istype(flooring) && flooring.constructed) @@ -23,21 +28,42 @@ /turf/floor/can_dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_be_dug(tool_hardness, using_tool) && get_physical_height() > -(FLUID_DEEP) -/turf/floor/dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) - if(!is_fundament()) +/turf/floor/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) + if(flooring_is_diggable()) + handle_trench_digging(user) + +/turf/floor/proc/handle_trench_digging(mob/user) + var/decl/flooring/flooring = get_topmost_flooring() + if(!flooring.handle_turf_digging(src)) return - var/new_height = max(get_physical_height()-TRENCH_DEPTH_PER_ACTION, -(FLUID_DEEP)) - var/height_diff = abs(get_physical_height()-new_height) // Only drop mats if we actually changed the turf height sufficiently. + var/old_height = get_physical_height() + var/new_height = max(old_height-TRENCH_DEPTH_PER_ACTION, -(FLUID_DEEP)) + var/height_diff = abs(old_height-new_height) if(height_diff >= TRENCH_DEPTH_PER_ACTION) - drop_diggable_resources() + drop_diggable_resources(user) set_physical_height(new_height) -/turf/floor/dig_pit(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/floor/dig_pit(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return has_flooring() ? null : ..() /turf/floor/get_diggable_resources() var/decl/material/my_material = get_material() - if(is_fundament() && istype(my_material) && my_material.dug_drop_type && (get_physical_height() > -(FLUID_DEEP))) - return list(my_material.dug_drop_type = list(3, 2)) - return null + if(!flooring_is_diggable() || !istype(my_material) || !my_material.dug_drop_type || (get_physical_height() <= -(FLUID_DEEP))) + return + + . = list() + + // All turfs drop resources to backfill them with (or make firepits, etc) + .[my_material.dug_drop_type] = list("amount" = 3, "variance" = 2, "material" = my_material.type) + + // Dirt/mud/etc might have some worms. + if(prob(5 * get_plant_growth_rate())) + .[/obj/item/food/worm] = list("amount" = 1, "material" = /obj/item/food/worm::material) + + // Some materials (like clay) might contain gemstones. + if(!gemstone_dropped && prob(my_material.gemstone_chance) && LAZYLEN(my_material.gemstone_types)) + gemstone_dropped = TRUE + var/gem_mat = pick(my_material.gemstone_types) + .[/obj/item/gemstone] = list("amount" = 1, "material" = gem_mat) + diff --git a/code/game/turfs/floors/floor_height.dm b/code/game/turfs/floors/floor_height.dm index 2dd080f5edd..8968d6020a5 100644 --- a/code/game/turfs/floors/floor_height.dm +++ b/code/game/turfs/floors/floor_height.dm @@ -5,12 +5,18 @@ return density ? 0 : height /turf/floor/set_physical_height(new_height) - if(height != new_height) - height = new_height - for(var/turf/neighbor as anything in RANGE_TURFS(src, 1)) - neighbor.update_icon() - fluid_update() - if(fluid_overlay) - fluid_overlay.update_icon() - return TRUE - return FALSE + + if(height == new_height) + return FALSE + + height = new_height + for(var/turf/neighbor as anything in RANGE_TURFS(src, 1)) + neighbor.update_icon() + fluid_update() + if(fluid_overlay) + fluid_overlay.update_icon() + + for(var/atom/movable/thing in contents) + thing.on_turf_height_change(new_height) + + return TRUE diff --git a/code/game/turfs/floors/floor_icon.dm b/code/game/turfs/floors/floor_icon.dm index 5e060f35848..c4c7cbb8315 100644 --- a/code/game/turfs/floors/floor_icon.dm +++ b/code/game/turfs/floors/floor_icon.dm @@ -45,11 +45,14 @@ layer = initial(layer) if(istype(flooring) && !flooring.render_trenches) // TODO: Update pool tiles/edges to behave properly with this new system. + default_pixel_z = initial(default_pixel_z) + pixel_z = default_pixel_z return FALSE var/my_height = get_physical_height() - if(my_height < 0) - + if(my_height >= 0) + default_pixel_z = initial(default_pixel_z) + else var/height_ratio = clamp(abs(my_height) / FLUID_DEEP, 0, 1) default_pixel_z = -(min(HEIGHT_OFFSET_RANGE, round(HEIGHT_OFFSET_RANGE * height_ratio))) pixel_z = default_pixel_z @@ -76,7 +79,7 @@ var/trench_icon = (istype(neighbor) && neighbor.get_trench_icon()) || get_trench_icon() if(trench_icon) // cache the trench image, keyed by icon and color - var/trench_color = isatom(neighbor) ? neighbor.color : color + var/trench_color = isatom(neighbor) ? neighbor.get_color() : get_color() var/trench_icon_key = "[ref(trench_icon)][trench_color]" I = _trench_image_cache[trench_icon_key] if(!I) @@ -97,6 +100,7 @@ I.appearance_flags |= RESET_COLOR | RESET_ALPHA _height_north_shadow_cache[shadow_alpha_key] = I add_overlay(I) + pixel_z = default_pixel_z /turf/floor/on_update_icon(var/update_neighbors) . = ..() diff --git a/code/game/turfs/floors/subtypes/floor_misc.dm b/code/game/turfs/floors/subtypes/floor_misc.dm index fbc7d2400e1..91c472fc284 100644 --- a/code/game/turfs/floors/subtypes/floor_misc.dm +++ b/code/game/turfs/floors/subtypes/floor_misc.dm @@ -45,8 +45,8 @@ /turf/floor/straw name = "loose straw" - icon = 'icons/turf/flooring/wildgrass.dmi' - icon_state = "wildgrass" + icon = 'icons/turf/flooring/straw.dmi' + icon_state = "straw" color = COLOR_WHEAT _flooring = /decl/flooring/straw @@ -54,6 +54,14 @@ /turf/floor/plating _base_flooring = /decl/flooring/plating // Setting here so overrides on /turf/floor do not impact explicitly typed plating turfs. +// Dirt plating for Tradeship farms. +/turf/floor/plating/dirt + name = "dirt" + icon = 'icons/turf/flooring/dirt.dmi' + icon_state = "dirt" + color = "#41311b" + _flooring = /decl/flooring/dirt + /turf/floor/plating/broken _floor_broken = TRUE diff --git a/code/game/turfs/floors/subtypes/floor_natural.dm b/code/game/turfs/floors/subtypes/floor_natural.dm index 4b2ddd092f9..5851afd8ab9 100644 --- a/code/game/turfs/floors/subtypes/floor_natural.dm +++ b/code/game/turfs/floors/subtypes/floor_natural.dm @@ -8,7 +8,7 @@ name = "dirt" icon = 'icons/turf/flooring/dirt.dmi' icon_state = "dirt" - color = "#41311b" + color = /decl/material/solid/soil::color // preview color _base_flooring = /decl/flooring/dirt /turf/floor/chlorine_sand @@ -72,6 +72,7 @@ name = "mud" icon = 'icons/turf/flooring/mud.dmi' icon_state = "mud" + color = /decl/material/solid/soil::color // preview color _base_flooring = /decl/flooring/mud /turf/floor/mud/water @@ -99,6 +100,13 @@ color = "#ae9e66" _flooring = /decl/flooring/sand +/turf/floor/rock/basalt/sand + name = "sand" + icon = 'icons/turf/flooring/sand.dmi' + icon_state = "sand0" + color = "#ae9e66" + _flooring = /decl/flooring/sand + /turf/floor/rock/sand/water color = COLOR_SKY_BLUE fill_reagent_type = /decl/material/liquid/water diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index 9ab163825a6..eff98a2a117 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -2,9 +2,15 @@ name = "wooden floor" icon = 'icons/turf/flooring/wood.dmi' icon_state = "wood0" - color = /decl/material/solid/organic/wood::color + color = /decl/material/solid/organic/wood/oak::color _flooring = /decl/flooring/wood +#define WOOD_FLOOR_SUBTYPE(BASE, WOOD) \ +/turf/floor/##BASE/##WOOD { \ + color = /decl/material/solid/organic/wood/##WOOD::color; \ + _flooring = /decl/flooring/##BASE/##WOOD; \ +} + /turf/floor/wood/broken icon_state = "wood_broken0" _floor_broken = TRUE @@ -31,26 +37,78 @@ icon_state = "wood_broken4" _floor_broken = "broken4" -/turf/floor/wood/mahogany - color = /decl/material/solid/organic/wood/mahogany::color - _flooring = /decl/flooring/wood/mahogany +WOOD_FLOOR_SUBTYPE(wood, mahogany) +WOOD_FLOOR_SUBTYPE(wood, maple) +WOOD_FLOOR_SUBTYPE(wood, ebony) +WOOD_FLOOR_SUBTYPE(wood, walnut) +WOOD_FLOOR_SUBTYPE(wood, bamboo) +WOOD_FLOOR_SUBTYPE(wood, yew) + +// Rough wood floors; lower skill requirement, more wasteful to craft. +/turf/floor/wood/rough + name = "rough-hewn wooden floor" + icon = 'icons/turf/flooring/wood_alt.dmi' + icon_state = "wood_peasant0" + color = /decl/material/solid/organic/wood/oak::color + _flooring = /decl/flooring/wood + +WOOD_FLOOR_SUBTYPE(wood/rough, mahogany) +WOOD_FLOOR_SUBTYPE(wood/rough, maple) +WOOD_FLOOR_SUBTYPE(wood/rough, ebony) +WOOD_FLOOR_SUBTYPE(wood/rough, walnut) +WOOD_FLOOR_SUBTYPE(wood/rough, bamboo) +WOOD_FLOOR_SUBTYPE(wood/rough, yew) + +// Laminate floor; basically identical to wood, but uses older smoother icons. +/turf/floor/laminate + name = "wooden laminate floor" + icon = 'icons/turf/flooring/laminate.dmi' + icon_state = "wood" + color = /decl/material/solid/organic/wood/chipboard::color + _flooring = /decl/flooring/laminate + +/turf/floor/laminate/broken + icon_state = "wood_broken0" + _floor_broken = TRUE + +/turf/floor/laminate/broken/Initialize() + . = ..() + var/setting_broken = _floor_broken + _floor_broken = null + set_floor_broken(setting_broken) + +/turf/floor/laminate/broken/one + icon_state = "wood_broken1" + _floor_broken = "broken1" + +/turf/floor/laminate/broken/two + icon_state = "wood_broken2" + _floor_broken = "broken2" + +/turf/floor/laminate/broken/three + icon_state = "wood_broken3" + _floor_broken = "broken3" + +/turf/floor/laminate/broken/four + icon_state = "wood_broken4" + _floor_broken = "broken4" -/turf/floor/wood/maple - color = /decl/material/solid/organic/wood/maple::color - _flooring = /decl/flooring/wood/maple +/turf/floor/laminate/mahogany + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + _flooring = /decl/flooring/laminate/mahogany -/turf/floor/wood/ebony - color = /decl/material/solid/organic/wood/ebony::color - _flooring = /decl/flooring/wood/ebony +/turf/floor/laminate/maple + color = /decl/material/solid/organic/wood/chipboard/maple::color + _flooring = /decl/flooring/laminate/maple -/turf/floor/wood/walnut - color = /decl/material/solid/organic/wood/walnut::color - _flooring = /decl/flooring/wood/walnut +/turf/floor/laminate/ebony + color = /decl/material/solid/organic/wood/chipboard/ebony::color + _flooring = /decl/flooring/laminate/ebony -/turf/floor/wood/bamboo - color = /decl/material/solid/organic/wood/bamboo::color - _flooring = /decl/flooring/wood/bamboo +/turf/floor/laminate/walnut + color = /decl/material/solid/organic/wood/chipboard/walnut::color + _flooring = /decl/flooring/laminate/walnut -/turf/floor/wood/yew - color = /decl/material/solid/organic/wood/yew::color - _flooring = /decl/flooring/wood/yew +/turf/floor/laminate/yew + color = /decl/material/solid/organic/wood/chipboard/yew::color + _flooring = /decl/flooring/laminate/yew diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a25d818697f..87ca2918d54 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -54,8 +54,8 @@ // get overridden almost immediately. // TL;DR: just leave these vars alone. + var/is_outside = OUTSIDE_AREA // non-tmp to allow visibility in mapper. var/tmp/obj/abstract/weather_system/weather - var/tmp/is_outside = OUTSIDE_AREA var/tmp/last_outside_check = OUTSIDE_UNCERTAIN ///The cached air mixture of a turf. Never directly access, use `return_air()`. @@ -86,6 +86,9 @@ var/paint_color + /// Floorlike structures like catwalks. Updated/retrieved by get_supporting_platform() + var/obj/structure/supporting_platform + /turf/Initialize(mapload, ...) . = null && ..() // This weird construct is to shut up the 'parent proc not called' warning without disabling the lint for child types. We explicitly return an init hint so this won't change behavior. @@ -140,6 +143,8 @@ /turf/Destroy() + supporting_platform = null + if(zone) if(can_safely_remove_from_zone()) c_copy_air() @@ -204,11 +209,14 @@ if(weather) . += weather.get_movement_delay(return_air(), travel_dir) // TODO: check user species webbed feet, wearing swimming gear - if(reagents?.total_volume > FLUID_PUDDLE) + if(!get_supporting_platform() && reagents?.total_volume > FLUID_PUDDLE) . += (reagents.total_volume > FLUID_SHALLOW) ? 6 : 3 /turf/attack_hand(mob/user) + SHOULD_CALL_PARENT(FALSE) + + // Find an atom that should be intercepting this click. var/datum/extension/turf_hand/highest_priority_intercept for(var/atom/thing in contents) var/datum/extension/turf_hand/intercept = get_extension(thing, /datum/extension/turf_hand) @@ -218,6 +226,7 @@ user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) var/atom/intercepting_atom = highest_priority_intercept.holder return intercepting_atom.attack_hand(user) + return FALSE /turf/attack_robot(var/mob/user) @@ -243,11 +252,17 @@ if(IS_SHOVEL(W)) + // TODO: move these checks into the interaction handlers. + var/atom/platform = get_supporting_platform() + if(platform) + to_chat(user, SPAN_WARNING("\The [platform] [platform.get_pronouns().is] in the way!")) + return TRUE + if(!can_be_dug(W.material?.hardness)) to_chat(user, SPAN_WARNING("\The [src] is too hard to be dug with \the [W].")) return TRUE - if(user.a_intent == I_HELP && can_dig_pit(W.material?.hardness)) + if(user.check_intent(I_FLAG_HELP) && can_dig_pit(W.material?.hardness)) try_dig_pit(user, W) else if(can_dig_trench(W.material?.hardness)) try_dig_trench(user, W) @@ -258,6 +273,12 @@ var/decl/material/material = get_material() if(IS_PICK(W) && material) + // TODO: move these checks into the interaction handlers. + var/atom/platform = get_supporting_platform() + if(platform) + to_chat(user, SPAN_WARNING("\The [platform] [platform.get_pronouns().is] in the way!")) + return TRUE + if(material?.hardness <= MAT_VALUE_FLEXIBLE) to_chat(user, SPAN_WARNING("\The [src] is too soft to be excavated with \the [W]. Use a shovel.")) return TRUE @@ -284,19 +305,6 @@ if(IS_COIL(W) && try_build_cable(W, user)) return TRUE - if(reagents?.total_volume >= FLUID_PUDDLE) - if(ATOM_IS_OPEN_CONTAINER(W) && W.reagents) - var/taking = min(reagents.total_volume, REAGENTS_FREE_SPACE(W.reagents)) - if(taking > 0) - to_chat(user, SPAN_NOTICE("You fill \the [W] with [reagents.get_primary_reagent_name()] from \the [src].")) - reagents.trans_to(W, taking) - return TRUE - - if(user.a_intent == I_HELP) - user.visible_message(SPAN_NOTICE("\The [user] dips \the [W] into \the [reagents.get_primary_reagent_name()].")) - W.fluid_act(reagents) - return TRUE - return ..() /turf/Enter(atom/movable/mover, atom/forget) @@ -340,7 +348,7 @@ return 0 // Check if they need to climb out of a hole. - if(has_gravity()) + if(has_gravity() && !get_supporting_platform()) var/mob/mover_mob = mover if(!istype(mover_mob) || (!mover_mob.throwing && !mover_mob.can_overcome_gravity())) var/turf/old_turf = mover.loc @@ -408,11 +416,13 @@ L.Add(t) return L -/turf/proc/contains_dense_objects() +/turf/proc/contains_dense_objects(exceptions) if(density) return 1 for(var/atom/A in src) if(A.density && !(A.atom_flags & ATOM_FLAG_CHECKS_BORDER)) + if(exceptions && (exceptions == A || (A in exceptions))) + continue return 1 return 0 @@ -452,7 +462,7 @@ /turf/proc/try_graffiti(var/mob/vandal, var/obj/item/tool) - if(!tool.sharp || !can_engrave() || vandal.a_intent != I_HELP) + if(!tool.is_sharp() || !can_engrave() || !vandal.check_intent(I_FLAG_HELP)) return FALSE if(jobban_isbanned(vandal, "Graffiti")) @@ -524,7 +534,7 @@ 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. +/// Updates turf participation in ZAS according to outside status and atmosphere participation bools. Must be called whenever any of those values may change. /turf/proc/update_external_atmos_participation() var/old_outside = last_outside_check last_outside_check = OUTSIDE_UNCERTAIN @@ -637,6 +647,7 @@ LAZYDISTINCTADD(., air_graphic) if(length(weather?.vis_contents_additions)) LAZYADD(., weather.vis_contents_additions) + . += pick(weather.particle_sources) // we know . is never null here if(flooded) var/flood_object = get_flood_overlay(flooded) if(flood_object) @@ -696,8 +707,8 @@ return TRUE /turf/clean(clean_forensics = TRUE) - for(var/obj/effect/decal/cleanable/blood/B in contents) - B.clean(clean_forensics) + for(var/obj/effect/decal/cleanable/filth in contents) + filth.clean(clean_forensics) . = ..() //returns 1 if made bloody, returns 0 otherwise @@ -707,8 +718,11 @@ var/mob/living/human/H = M var/unique_enzymes = H.get_unique_enzymes() var/blood_type = H.get_blood_type() + var/blood_reagent = H.species.blood_reagent if(unique_enzymes && blood_type) for(var/obj/effect/decal/cleanable/blood/B in contents) + if(B.chemical != blood_reagent) + continue if(!LAZYACCESS(B.blood_DNA, unique_enzymes)) LAZYSET(B.blood_DNA, unique_enzymes, blood_type) LAZYSET(B.blood_data, unique_enzymes, REAGENT_DATA(H.vessel, H.species.blood_reagent)) @@ -718,13 +732,29 @@ blood_splatter(src, M, 1) return TRUE -/turf/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor=COLOR_BLOOD_HUMAN) - if(!simulated) +/// Creates a new /obj/effect/decal/cleanable/blood/tracks instance of a given type, +/// or merges it with an existing (not-yet-cleaned) one that matches typepath and chemical. +/// typepath is a type, not an instance +/// new_chemical is optional argument for things like muddy footprints, where typepath isn't enough +/turf/proc/AddTracks(obj/effect/decal/cleanable/blood/tracks/typepath, bloodDNA, comingdir, goingdir, bloodcolor = COLOR_BLOOD_HUMAN, new_chemical = null) + if(!simulated || check_fluid_depth(FLUID_QDEL_POINT)) return - var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src + // Populate defaults from the given typepath, where possible. + if(isnull(new_chemical)) + new_chemical = typepath::chemical || /decl/material/liquid/blood + + var/obj/effect/decal/cleanable/blood/tracks/tracks = null + for(var/obj/effect/decal/cleanable/blood/tracks/candidate in src) + if(!istype(candidate, typepath)) + continue + if(candidate.invisibility >= INVISIBILITY_ABSTRACT) // has been cleaned + continue + if(candidate.chemical != new_chemical) + continue + tracks = candidate if(!tracks) - tracks = new typepath(src) - tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor) + tracks = new typepath(src, null, new_chemical) + tracks.AddTracks(bloodDNA, comingdir, goingdir, bloodcolor) // Proc called in /turf/Entered() to supply an appropriate fluid overlay. /turf/proc/get_movable_alpha_mask_state(atom/movable/mover) @@ -734,12 +764,13 @@ var/mob/moving_mob = mover if(moving_mob.can_overcome_gravity()) return null - var/fluid_depth = get_fluid_depth() - if(fluid_depth > FLUID_PUDDLE) - if(fluid_depth <= FLUID_SHALLOW) - return "mask_shallow" - if(fluid_depth <= FLUID_DEEP) - return "mask_deep" + if(!get_supporting_platform()) + var/fluid_depth = get_fluid_depth() + if(fluid_depth > FLUID_PUDDLE) + if(fluid_depth <= FLUID_SHALLOW) + return "mask_shallow" + if(fluid_depth <= FLUID_DEEP) + return "mask_deep" /turf/spark_act(obj/effect/sparks/sparks) if(simulated) @@ -801,26 +832,43 @@ /turf/get_affecting_weather() return weather +/turf/can_be_poured_into(atom/source) + return !density + +/turf/proc/get_supporting_platform() + if(isnull(supporting_platform)) + for(var/obj/structure/platform in get_contained_external_atoms()) + if(platform.is_platform()) + supporting_platform = platform + break + return supporting_platform + /turf/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/show_turf_contents) - if(user) - var/obj/item/held = user.get_active_held_item() - if(istype(held)) - if(IS_SHOVEL(held)) - if(can_dig_pit(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/pit) - if(can_dig_trench(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) - if(IS_PICK(held) && can_dig_trench(held.material?.hardness, using_tool = TOOL_PICK)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) - if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/farm) + var/obj/item/held = user ? (user.get_active_held_item() || user.get_usable_hand_slot_organ()) : null + if(!istype(held)) + return + if(IS_SHOVEL(held)) + if(can_dig_pit(held.material?.hardness)) + LAZYADD(., /decl/interaction_handler/dig/pit) + if(can_dig_trench(held.material?.hardness)) + LAZYADD(., /decl/interaction_handler/dig/trench) + if(IS_PICK(held) && can_dig_trench(held.material?.hardness, using_tool = TOOL_PICK)) + LAZYADD(., /decl/interaction_handler/dig/trench) + if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) + LAZYADD(., /decl/interaction_handler/dig/farm) + +/// Contaminant may be the chemical type of the footprint being provided, +/// or null if we just want to know if we support footprints, at all, ever. +/turf/proc/can_show_coating_footprints(decl/material/contaminant) + return simulated /decl/interaction_handler/show_turf_contents name = "Show Turf Contents" expected_user_type = /mob interaction_flags = 0 + examine_desc = "list everything on $TARGET_THEM$" /decl/interaction_handler/show_turf_contents/invoked(atom/target, mob/user, obj/item/prop) target.show_atom_list_for_turf(user, get_turf(target)) @@ -833,8 +881,16 @@ /decl/interaction_handler/dig/trench name = "Dig Trench" + examine_desc = "dig a trench" + +/decl/interaction_handler/dig/trench/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(. && istype(target, /turf/floor)) + var/turf/floor/target_turf = target + return target_turf.flooring_is_diggable() /decl/interaction_handler/dig/trench/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(IS_SHOVEL(prop)) if(T.can_dig_trench(prop?.material?.hardness)) @@ -846,19 +902,25 @@ /decl/interaction_handler/dig/pit name = "Dig Pit" + examine_desc = "dig a pit" /decl/interaction_handler/dig/pit/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(T.can_dig_pit(prop?.material?.hardness)) T.try_dig_pit(user, prop) /decl/interaction_handler/dig/farm name = "Dig Farm Plot" + examine_desc = "dig a farm plot" /decl/interaction_handler/dig/farm/invoked(atom/target, mob/user, obj/item/prop) + prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. var/turf/T = get_turf(target) if(T.can_dig_farm(prop?.material?.hardness)) T.try_dig_farm(user, prop) /turf/take_vaporized_reagent(reagent, amount) return assume_gas(reagent, round(amount / REAGENT_UNITS_PER_GAS_MOLE)) + +/turf/proc/is_purged() \ No newline at end of file diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index ce53c478566..19db7607c2e 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -36,6 +36,7 @@ above.ChangeTurf(open_turf_type, keep_air = TRUE, 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/update_open_turfs_above = TRUE, var/keep_height = FALSE) + if (!N) return @@ -49,6 +50,9 @@ if (!(atom_flags & ATOM_FLAG_INITIALIZED)) return new N(src) + // Rebuilt on next call. + supporting_platform = null + // Track a number of old values for the purposes of raising // state change events after changing the turf to the new type. var/old_fire = fire @@ -140,7 +144,7 @@ if ((old_opacity != opacity) || (tidlu != old_dynamic_lighting) || force_lighting_update) reconsider_lights() - if (tidlu != old_dynamic_lighting) + if (tidlu != old_dynamic_lighting && SSlighting.initialized) // don't fuck with lighting before lighting flush if (tidlu) lighting_build_overlay() else @@ -148,24 +152,24 @@ // end of lighting stuff - // In case the turf isn't marked for update in Initialize (e.g. space), we call this to create any unsimulated edges necessary. - if(W.zone_membership_candidate != old_zone_membership_candidate) - SSair.mark_for_update(src) - // we check the var rather than the proc, because area outside values usually shouldn't be set on turfs W.last_outside_check = OUTSIDE_UNCERTAIN if(W.is_outside != old_outside) // This will check the exterior atmos participation of this turf and all turfs connected by open space below. W.set_outside(old_outside, skip_weather_update = TRUE) - else if(HasBelow(z) && (W.is_open() != old_is_open)) // Otherwise, we do it here if the open status of the turf has changed. - var/turf/checking = src - while(HasBelow(checking.z)) - checking = GetBelow(checking) - if(!isturf(checking)) - break - checking.update_external_atmos_participation() - if(!checking.is_open()) - break + else // We didn't already update our external atmos participation in set_outside. + if(HasBelow(z) && (W.is_open() != old_is_open)) // Otherwise, we do it here if the open status of the turf has changed. + var/turf/checking = src + while(HasBelow(checking.z)) + checking = GetBelow(checking) + if(!isturf(checking)) + break + checking.update_external_atmos_participation() + if(!checking.is_open()) + break + // In case the turf isn't marked for update in Initialize (e.g. space), we call this to create any unsimulated edges necessary. + if(W.zone_membership_candidate != old_zone_membership_candidate) + update_external_atmos_participation() W.update_weather(force_update_below = W.is_open() != old_is_open) diff --git a/code/game/turfs/turf_digging.dm b/code/game/turfs/turf_digging.dm index 6eea34afe2e..5f832ae8045 100644 --- a/code/game/turfs/turf_digging.dm +++ b/code/game/turfs/turf_digging.dm @@ -1,5 +1,5 @@ -/// Return an assoc list of resource item type to a base and a random component -/// ex. return list(/obj/item/stack/material/ore/handful/sand = list(3, 2)) +/// Return an assoc list of resource item type to a metadata list containing base amount, random component, and material override +/// ex. return list(/obj/item/stack/material/ore/handful/sand = list("amount" = 3, "variance" = 2, "material" = /decl/material/foo)) /turf/proc/get_diggable_resources() return null @@ -10,17 +10,31 @@ /turf/proc/can_be_dug(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return FALSE -/turf/proc/drop_diggable_resources() +/turf/proc/drop_diggable_resources(mob/user) 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] + + var/list/resource_data = diggable_resources[resource_type] + var/list/loot = list() + var/amount = max(1, resource_data["amount"] + resource_data["variance"]) + var/spawn_material = resource_data["material"] + if(ispath(resource_type, /obj/item/stack)) - LAZYADD(., new resource_type(src, resource_amounts[1] + rand(resource_amounts[2]), get_material_type())) + loot += new resource_type(src, amount, spawn_material) else - LAZYADD(., new resource_type(src, get_material_type())) + for(var/i = 1 to amount) + loot += new resource_type(src, spawn_material) + + if(length(loot)) + if(user) + for(var/obj/item/thing in loot) + if(thing.material && thing.material != get_material()) + to_chat(user, SPAN_NOTICE("You unearth \a [thing]!")) + LAZYADD(., loot) + clear_diggable_resources() // Procs for digging pits. @@ -29,10 +43,10 @@ /turf/proc/try_dig_pit(var/mob/user, var/obj/item/tool, using_tool = TOOL_SHOVEL) if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 5 SECONDS, check_skill = SKILL_HAULING, set_cooldown = TRUE)) - return dig_pit(tool?.material?.hardness, using_tool) + return dig_pit(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_pit(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_pit(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_dig_pit(tool_hardness, using_tool) && new /obj/structure/pit(src) // Procs for digging farms. @@ -44,10 +58,10 @@ if(!material?.tillable) return if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 5 SECONDS, set_cooldown = TRUE, check_skill = SKILL_BOTANY)) - return dig_farm(tool?.material?.hardness, using_tool) + return dig_farm(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_farm(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_farm(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return can_dig_farm(tool_hardness, using_tool) && new /obj/machinery/portable_atmospherics/hydroponics/soil(src) // Proc for digging trenches. @@ -56,8 +70,8 @@ /turf/proc/try_dig_trench(mob/user, obj/item/tool, using_tool = TOOL_SHOVEL) if((!user && !tool) || tool.do_tool_interaction(using_tool, user, src, 2.5 SECONDS, check_skill = SKILL_HAULING, set_cooldown = TRUE)) - return dig_trench(tool?.material?.hardness, using_tool) + return dig_trench(user, tool?.material?.hardness, using_tool) return null -/turf/proc/dig_trench(tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) +/turf/proc/dig_trench(mob/user, tool_hardness = MAT_VALUE_MALLEABLE, using_tool = TOOL_SHOVEL) return FALSE diff --git a/code/game/turfs/turf_effects.dm b/code/game/turfs/turf_effects.dm index 84aaba661be..93e5da6a91e 100644 --- a/code/game/turfs/turf_effects.dm +++ b/code/game/turfs/turf_effects.dm @@ -37,6 +37,7 @@ if(!dirt) dirt = new(src) dirt.dirt_amount = min(dirt.dirt_amount + amount, MAX_DIRT) + dirt.update_icon() return TRUE #undef MAX_DIRT diff --git a/code/game/turfs/turf_enter.dm b/code/game/turfs/turf_enter.dm index a0cc300474d..a83d87a855f 100644 --- a/code/game/turfs/turf_enter.dm +++ b/code/game/turfs/turf_enter.dm @@ -29,7 +29,9 @@ regenerate_ao() #endif - if(isturf(old_loc) && has_gravity() && A.can_fall() && !(weakref(A) in skip_height_fall_for)) + var/obj/structure/platform = get_supporting_platform() + if(isturf(old_loc) && has_gravity() && A.can_fall() && !isnull(platform) && !(weakref(A) in skip_height_fall_for)) + var/turf/old_turf = old_loc var/old_height = old_turf.get_physical_height() + old_turf.reagents?.total_volume var/current_height = get_physical_height() + reagents?.total_volume @@ -69,7 +71,7 @@ // Delay to allow transition to the new turf and avoid layering issues. var/mob/M = A M.reset_offsets() - if(get_physical_height() > T.get_physical_height()) + if(platform || (get_physical_height() > T.get_physical_height())) M.reset_layer() else // arbitrary timing value that feels good in practice. it sucks and is inconsistent:( diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index e377ec4b32f..f0dd37d11c1 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -62,7 +62,14 @@ fluid_update() // We are now floodable, so wake up our neighbors. /turf/is_flooded(var/lying_mob, var/absolute) - return (flooded || (!absolute && check_fluid_depth(lying_mob ? FLUID_OVER_MOB_HEAD : FLUID_DEEP))) + if(flooded) + return TRUE + if(absolute) + return FALSE + var/required_depth = lying_mob ? FLUID_OVER_MOB_HEAD : FLUID_DEEP + if(get_supporting_platform()) // Increase required depth if we are over the water. + required_depth -= get_physical_height() // depth is negative, -= to increase required depth. + return check_fluid_depth(required_depth) /turf/check_fluid_depth(var/min = 1) . = (get_fluid_depth() >= min) @@ -103,7 +110,7 @@ create_reagents(FLUID_MAX_DEPTH) return ..() -/turf/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE, phase) +/turf/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE, phase = null) if(!reagents) create_reagents(FLUID_MAX_DEPTH) return ..() @@ -116,9 +123,17 @@ /turf/fluid_act(var/datum/reagents/fluids) ..() if(!QDELETED(src) && fluids?.total_volume) - fluids.touch_turf(src) - for(var/atom/movable/AM as anything in get_contained_external_atoms()) - AM.fluid_act(fluids) + fluids.touch_turf(src, touch_atoms = FALSE) // Handled in fluid_act() below. + // Wet items that are not supported on a platform or such. + var/effective_volume = fluids?.total_volume + if(get_supporting_platform()) + // Depth is negative height, hence +=. TODO: positive heights? No idea how to handle that. + effective_volume += get_physical_height() + if(effective_volume > FLUID_PUDDLE) + for(var/atom/movable/AM as anything in get_contained_external_atoms()) + if(!AM.submerged()) + continue + AM.fluid_act(fluids) /turf/proc/remove_fluids(var/amount, var/defer_update) if(!reagents?.total_liquid_volume) @@ -177,6 +192,8 @@ var/decl/material/primary_reagent = reagents.get_primary_reagent_decl() if(primary_reagent && (REAGENT_VOLUME(reagents, primary_reagent.type) >= primary_reagent.slippery_amount)) last_slipperiness = primary_reagent.slipperiness + else + last_slipperiness = 0 if(!fluid_overlay) fluid_overlay = new(src, TRUE) fluid_overlay.update_icon() @@ -188,6 +205,7 @@ SSfluids.pending_flows -= src if(last_slipperiness > 0) wet_floor(last_slipperiness) + last_slipperiness = 0 for(var/checkdir in global.cardinal) var/turf/neighbor = get_step_resolving_mimic(src, checkdir) diff --git a/code/game/turfs/turf_footsteps.dm b/code/game/turfs/turf_footsteps.dm index 371d40feefa..bfa1f917156 100644 --- a/code/game/turfs/turf_footsteps.dm +++ b/code/game/turfs/turf_footsteps.dm @@ -12,4 +12,4 @@ return get_footstep_for_mob(/decl/footsteps/water, caller) if(footstep_type) return get_footstep_for_mob(footstep_type, caller) - return get_footstep_for_mob(/decl/footsteps/blank, caller) \ No newline at end of file + return get_footstep_for_mob(/decl/footsteps/blank, caller) diff --git a/code/game/turfs/turf_navigation.dm b/code/game/turfs/turf_navigation.dm new file mode 100644 index 00000000000..9085f6b99d9 --- /dev/null +++ b/code/game/turfs/turf_navigation.dm @@ -0,0 +1,62 @@ +/******************************************************************/ +// Navigation procs +// Used for A-star pathfinding + +// Returns the surrounding cardinal turfs with open links +// Including through doors openable with the ID +/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID) + var/L[] = new() + + for(var/d in global.cardinal) + var/turf/T = get_step(src, d) + if(istype(T) && !T.density && T.simulated && !LinkBlockedWithAccess(src, T, ID)) + L.Add(T) + return L + + +// Returns true if a link between A and B is blocked +// Movement through doors allowed if ID has access +/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID) + + if(A == null || B == null) return 1 + var/adir = get_dir(A,B) + var/rdir = get_dir(B,A) + if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal + var/iStep = get_step(A,adir&(NORTH|SOUTH)) + if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) + return 0 + + var/pStep = get_step(A,adir&(EAST|WEST)) + if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) + return 0 + return 1 + + if(DirBlockedWithAccess(A,adir, ID)) + return 1 + + if(DirBlockedWithAccess(B,rdir, ID)) + return 1 + + for(var/obj/O in B) + if(O.density && !istype(O, /obj/machinery/door) && !(O.atom_flags & ATOM_FLAG_CHECKS_BORDER)) + return 1 + + return 0 + +// Returns true if direction is blocked from loc +// Checks doors against access with given ID +/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID) + for(var/obj/structure/window/D in loc) + if(!D.density) continue + if(D.dir == SOUTHWEST) return 1 + if(D.dir == dir) return 1 + + for(var/obj/machinery/door/D in loc) + if(!D.density) continue + if(istype(D, /obj/machinery/door/window)) + if( dir & D.dir ) return !D.check_access(ID) + + //if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID) + //if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID) + else return !D.check_access(ID) // it's a real, air blocking door + return 0 diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index 67200a23bf8..45e70ce956e 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -25,3 +25,6 @@ /turf/unsimulated/get_lumcount(var/minlum = 0, var/maxlum = 1) return 0.8 + +/turf/unsimulated/get_movable_alpha_mask_state(atom/movable/mover) + return null diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 449745e5e12..c7d8fc3c6f1 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -52,6 +52,23 @@ /turf/unsimulated/floor/wood/broken6 icon_state = "wood_broken6" +/turf/unsimulated/floor/laminate + name = "wooden laminate floor" + icon = 'icons/turf/flooring/laminate.dmi' + icon_state = "wood" + +/turf/unsimulated/floor/laminate/broken + icon_state = "wood_broken0" + +/turf/unsimulated/floor/laminate/broken1 + icon_state = "wood_broken1" + +/turf/unsimulated/floor/laminate/broken2 + icon_state = "wood_broken2" + +/turf/unsimulated/floor/laminate/broken6 + icon_state = "wood_broken6" + /turf/unsimulated/floor/vault icon_state = "vault" diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 084fb135e17..973d7105635 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -18,7 +18,7 @@ var/global/list/wall_fullblend_objects = list( /turf/wall name = "wall" - desc = "A huge chunk of metal used to seperate rooms." + desc = "A huge chunk of metal used to separate rooms." icon = 'icons/turf/walls/_previews.dmi' icon_state = "solid" opacity = TRUE @@ -51,6 +51,8 @@ var/global/list/wall_fullblend_objects = list( var/handle_structure_blending = TRUE var/min_dismantle_amount = 2 var/max_dismantle_amount = 2 + /// The reinforcement icon to use. Set in update_material() based on reinf_material. + var/reinf_icon /// Icon to use if shutter state is non-null. var/shutter_icon = 'icons/turf/walls/shutter.dmi' diff --git a/code/game/turfs/walls/wall_attacks.dm b/code/game/turfs/walls/wall_attacks.dm index 4c567def785..9e8eb62472e 100644 --- a/code/game/turfs/walls/wall_attacks.dm +++ b/code/game/turfs/walls/wall_attacks.dm @@ -132,8 +132,8 @@ qdel(WR) return TRUE else - var/force = W.get_attack_force(user) - if((!is_sharp(W) && force >= 10) || force >= 20) + var/force = W.expend_attack_force(user) + if((!W.is_sharp() && !W.has_edge() && force >= 10) || force >= 20) to_chat(user, "\The [src] crumbles away under the force of your [W.name].") physically_destroyed() return TRUE @@ -297,8 +297,8 @@ return TRUE // Attack the wall with items - var/force = W.get_attack_force(user) - if(istype(W,/obj/item/rcd) || istype(W, /obj/item/chems) || !force || user.a_intent == I_HELP) + var/force = W.expend_attack_force(user) + if(istype(W,/obj/item/rcd) || istype(W, /obj/item/chems) || !force || user.check_intent(I_FLAG_HELP)) return ..() user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) diff --git a/code/game/turfs/walls/wall_icon.dm b/code/game/turfs/walls/wall_icon.dm index c682d4f266f..08732bbecaf 100644 --- a/code/game/turfs/walls/wall_icon.dm +++ b/code/game/turfs/walls/wall_icon.dm @@ -12,8 +12,12 @@ if(material) explosion_resistance = material.explosion_resistance hitsound = material.hitsound - if(reinf_material && reinf_material.explosion_resistance > explosion_resistance) - explosion_resistance = reinf_material.explosion_resistance + if(reinf_material) + reinf_icon = islist(reinf_material.icon_reinf) ? pick(reinf_material.icon_reinf) : reinf_material.icon_reinf + if(reinf_material.explosion_resistance > explosion_resistance) + explosion_resistance = reinf_material.explosion_resistance + else + reinf_icon = null update_strings() refresh_opacity() SSradiation.resistance_cache.Remove(src) @@ -52,7 +56,16 @@ . = (istype(material) && material.icon_base) || 'icons/turf/walls/solid.dmi' /turf/wall/proc/apply_reinf_overlay() - . = istype(reinf_material) + . = istype(reinf_material) && reinf_icon + +/// Gets the base wall colour for icon rendering. Can be overridden on wall subtypes. Not equivalent to get_color(). +/// Should only be used in places where material is known to be set, e.g. update_wall_icon(). +/turf/wall/proc/get_base_color() + return material.color + +/// Gets the reinforcement colour. Can be overridden so that some wall types don't apply paint colour to their reinforcements. +/turf/wall/proc/get_reinf_color() + return paint_color || reinf_material?.color /turf/wall/proc/refresh_connections() if(wall_connections && other_connections) @@ -100,7 +113,7 @@ /turf/wall/proc/update_wall_icon() var/material_icon_base = get_wall_icon() - var/base_color = material.color + var/base_color = get_base_color() var/new_icon var/new_icon_state @@ -124,17 +137,17 @@ if(apply_reinf_overlay()) var/image/I - var/reinf_color = paint_color ? paint_color : reinf_material.color + var/reinf_color = get_reinf_color() if(construction_stage != null && construction_stage < 6) I = image('icons/turf/walls/_construction_overlays.dmi', "[construction_stage]") I.color = reinf_color add_overlay(I) else if(reinf_material.use_reinf_state) - I = image(reinf_material.icon_reinf, reinf_material.use_reinf_state) + I = image(reinf_icon, reinf_material.use_reinf_state) I.color = reinf_color else - I = image(_get_wall_subicon(reinf_material.icon_reinf, wall_connections, reinf_color)) + I = image(_get_wall_subicon(reinf_icon, wall_connections, reinf_color)) add_overlay(I) // Update icon on ambient light change, for shutter overlays. diff --git a/code/game/turfs/walls/wall_log.dm b/code/game/turfs/walls/wall_log.dm index 3d092408226..7cdf1fedc1a 100644 --- a/code/game/turfs/walls/wall_log.dm +++ b/code/game/turfs/walls/wall_log.dm @@ -1,7 +1,7 @@ /turf/wall/log icon_state = "log" - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color girder_material = null floor_type = /turf/floor/dirt min_dismantle_amount = 3 diff --git a/code/game/turfs/walls/wall_natural.dm b/code/game/turfs/walls/wall_natural.dm index e878e59747e..ce8ea3dbbce 100644 --- a/code/game/turfs/walls/wall_natural.dm +++ b/code/game/turfs/walls/wall_natural.dm @@ -10,6 +10,7 @@ var/image/ore_overlay var/static/list/exterior_wall_shine_cache = list() var/being_mined = FALSE + var/gem_dropped = FALSE /turf/wall/natural/flooded flooded = /decl/material/liquid/water @@ -150,6 +151,10 @@ if(prob(30) && !ramp_slope_direction && material) var/drop_type = material.ore_type || /obj/item/stack/material/ore pass_geodata_to(new drop_type(src, material.ore_result_amount, material.type)) + if(!gem_dropped && material && prob(material.gemstone_chance) && LAZYLEN(material.gemstone_types)) + gem_dropped = TRUE + new /obj/item/gemstone(get_turf(src), pickweight(material.gemstone_types)) + visible_message(SPAN_NOTICE("A glimmer of colour shines amongst the rubble...")) /turf/wall/natural/proc/pass_geodata_to(obj/O) var/datum/extension/geological_data/ours = get_extension(src, /datum/extension/geological_data) @@ -167,7 +172,7 @@ if(!prob(reinf_material.ore_spread_chance)) continue var/turf/wall/natural/target_turf = get_step_resolving_mimic(src, trydir) - if(!istype(target_turf) || !isnull(target_turf.reinf_material)) + if(!istype(target_turf) || !isnull(target_turf.reinf_material) || target_turf.ramp_slope_direction) continue target_turf.set_turf_materials(target_turf.material, reinf_material) target_turf.spread_deposit() diff --git a/code/game/turfs/walls/wall_natural_ramps.dm b/code/game/turfs/walls/wall_natural_ramps.dm index 7566bf7578f..760c4a01f0d 100644 --- a/code/game/turfs/walls/wall_natural_ramps.dm +++ b/code/game/turfs/walls/wall_natural_ramps.dm @@ -54,6 +54,7 @@ /decl/interaction_handler/drill_ramp name = "Drill Ramp" expected_target_type = /turf/wall/natural + examine_desc = "drill a ramp in the direction you are facing" /decl/interaction_handler/drill_ramp/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/game/turfs/walls/wall_types.dm b/code/game/turfs/walls/wall_types.dm index 45f51c0c7b6..9933ad43d59 100644 --- a/code/game/turfs/walls/wall_types.dm +++ b/code/game/turfs/walls/wall_types.dm @@ -74,7 +74,7 @@ /turf/wall/wood color = COLOR_BROWN icon_state = "wood" - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /turf/wall/walnut color = COLOR_BROWN_ORANGE diff --git a/code/game/turfs/walls/wall_wattle.dm b/code/game/turfs/walls/wall_wattle.dm new file mode 100644 index 00000000000..42a93e90fc0 --- /dev/null +++ b/code/game/turfs/walls/wall_wattle.dm @@ -0,0 +1,158 @@ +/turf/wall/wattle + icon_state = "wattle" + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + girder_material = null + floor_type = /turf/floor/dirt + min_dismantle_amount = 3 + max_dismantle_amount = 5 + shutter_icon = 'icons/turf/walls/square_shutter.dmi' + var/decl/skill/daubing_skill = SKILL_CONSTRUCTION + var/decl/material/daubing_material // todo: daubing as a material made from clay/soil and plant matter? + var/const/matter_to_daub = MATTER_AMOUNT_REINFORCEMENT + // Currently, plastering is done via painting... undecided if that should change in the future. + +/turf/wall/wattle/Initialize(ml, materialtype, rmaterialtype) + if(ispath(daubing_material)) + daubing_material = GET_DECL(daubing_material) + return ..() + +/turf/wall/wattle/get_turf_validation_corner_states() + return list("", "paint") // paint should always be available because of plastering! + +// Daubing with clay or soil +/turf/wall/wattle/attackby(obj/item/W, mob/user, click_params) + if(isnull(daubing_material)) + var/static/list/daub_materials = list( // Does not include subtypes. + /decl/material/solid/soil = TRUE, + /decl/material/solid/clay = TRUE + ) + if(istype(W, /obj/item/stack/material) && daub_materials[W.material?.type]) + if(!user.check_dexterity(DEXTERITY_WIELD_ITEM)) + return TRUE + var/obj/item/stack/material/stack = W + var/sheets_to_use = stack.matter_units_to_sheets(matter_to_daub) + if(stack.can_use(sheets_to_use) && user.do_skilled(1 SECOND, daubing_skill, target = src) && stack.can_use(sheets_to_use)) + to_chat(user, SPAN_NOTICE("You daub \the [src] with \the [stack].")) + daubing_material = stack.material + stack.use(sheets_to_use) + else if(stack.can_use(sheets_to_use)) // failed the do_skilled + to_chat(user, SPAN_WARNING("You have to stay still to daub \the [src] with \the [stack].")) + else + to_chat(user, SPAN_WARNING("You need [stack.get_string_for_amount(sheets_to_use)] to daub \the [src].")) + return TRUE + return ..() + +/turf/wall/wattle/get_dismantle_stack_type() + return /obj/item/stack/material/log // temp? + +// daubed walls have the color of their daubing +/turf/wall/wattle/get_base_color() + if(daubing_material) + return "#ae9f70" // daubing_material.color // sorry, but using the daubing material color looks bad + return ..() + +// don't plaster over our damn reinforcements +/turf/wall/wattle/get_reinf_color() + return reinf_material?.color + +/turf/wall/wattle/get_wall_icon() + if(isnull(daubing_material)) + return 'icons/turf/walls/wattle.dmi' + else + return 'icons/turf/walls/wattledaub.dmi' + +/turf/wall/wattle/get_dismantle_sound() + return 'sound/foley/wooden_drop.ogg' + +/turf/wall/wattle/update_strings() + if(isnull(daubing_material)) + if(reinf_material) + SetName("[reinf_material.solid_name]-framed [material.adjective_name] wattle wall") + desc = "A wattle wall made of [material.adjective_name] strips and framed with [reinf_material.solid_name]." + else + SetName("[material.solid_name] wattle wall") + desc = "A wattle wall made of [material.adjective_name] strips." + else if(paint_color) + if(reinf_material) + SetName("[reinf_material.solid_name]-framed plastered wall") + else + SetName("plastered wall") + else + if(reinf_material) + SetName("[reinf_material.solid_name]-framed [material.adjective_name] wattle and daub wall") + desc = "A daubed wattle wall made of [material.adjective_name] strips and framed with [reinf_material.solid_name]." + else + SetName("[material.solid_name] wattle and daub wall") + desc = "A daubed wattle wall made of [material.adjective_name] strips." + +/turf/wall/wattle/daubed + icon_state = "wattledaub" + daubing_material = /decl/material/solid/clay + // the daub is lost when destroyed/deconstructed, since it's dried anyway + +/turf/wall/wattle/daubed/plastered + icon_state = "plaster" + paint_color = "#c2b8a1" // this is what applies the plaster... icky + color = "#c2b8a1" // preview color for plaster + +/turf/wall/wattle/daubed/plastered/framed + icon_state = "framed" + reinf_material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color // preview, still painted + +// Subtypes. +#define WATTLE_WALL_SUBTYPE(material_name) \ +/turf/wall/wattle/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/daubed/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/plastered/##material_name/shutter/open { \ + shutter_state = TRUE; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name { \ + material = /decl/material/solid/organic/wood/##material_name; \ + reinf_material = /decl/material/solid/organic/wood/##material_name; \ + color = /decl/material/solid/organic/wood/##material_name::color; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name/shutter { \ + shutter_state = FALSE; \ + icon_state = "wattle_shutter"; \ +}; \ +/turf/wall/wattle/daubed/plastered/framed/##material_name/shutter/open { \ + shutter_state = TRUE; \ +} +WATTLE_WALL_SUBTYPE(fungal) +WATTLE_WALL_SUBTYPE(ebony) +WATTLE_WALL_SUBTYPE(walnut) +WATTLE_WALL_SUBTYPE(maple) +WATTLE_WALL_SUBTYPE(mahogany) +WATTLE_WALL_SUBTYPE(bamboo) +WATTLE_WALL_SUBTYPE(yew) + +#undef WATTLE_WALL_SUBTYPE \ No newline at end of file diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index 4131ea677ae..dacae043660 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -104,7 +104,7 @@ else msg += line - 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.") + if(SSwebhooks.is_webhook_configured(WEBHOOK_AHELP_SENT)) + to_chat(src, "Adminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and join.") 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 420c09757f5..1c65910d510 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -1,6 +1,6 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) -/hook/global_init/proc/generate_game_id() +/proc/generate_game_id() if(!isnull(global.game_id)) return @@ -70,6 +70,10 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) return match +// Get the URL used to connect to the server. +/proc/get_world_url() + return "byond://[get_config_value(/decl/config/text/server) || get_config_value(/decl/config/text/serverurl) || "[world.address]:[world.port]"]" + /world/New() //set window title @@ -83,10 +87,23 @@ GLOBAL_PROTECTED_UNTYPED(game_id, null) 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.") - callHook("startup") - //Emergency Fix - load_mods() - //end-emergency fix + // Initialize the global vars decl, which marks vars as protected. + GET_DECL(/decl/global_vars) + // And the offset used for in-game time + global.roundstart_hour = rand(0, 23) + initialise_map_list() + world.load_mode() + world.load_motd() + load_admins() + world.connect_database() + jobban_loadbanfile() + LoadBans() + update_holiday() //Uncommenting ALLOW_HOLIDAYS in configuration will enable this. + try_load_alien_whitelist() + investigate_reset() + // Precache/build trait trees. + for(var/decl/trait/trait in decls_repository.get_decls_of_type_unassociated(/decl/trait)) + trait.build_references() . = ..() @@ -109,7 +126,7 @@ var/global/world_topic_last = world.timeofday throttle[2] = reason /world/Topic(T, addr, master, key) - direct_output(diary, "TOPIC: \"[T]\", from:[addr], master:[master], key:[key][log_end]") + to_file(diary, "TOPIC: \"[T]\", from:[addr], master:[master], key:[key][log_end]") if (global.world_topic_last > world.timeofday) global.world_topic_throttle = list() //probably passed midnight @@ -129,11 +146,14 @@ var/global/world_topic_last = world.timeofday return command.try_use(T, addr, master, key) +var/global/_reboot_announced = FALSE /world/Reboot(var/reason) 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.") + if(!global._reboot_announced) + to_world("World reboot waiting for external scripts. Please be patient.") + global._reboot_announced = TRUE global.Master.restart_timeout = 5 MINUTES return @@ -149,18 +169,24 @@ var/global/world_topic_last = world.timeofday game_log("World rebooted at [time_stamp()]") - callHook("reboot") + on_reboot(reason) ..(reason) +/// If you need to add modular functionality on-reboot, override this instead of /world/Reboot(). +/// It runs directly before the parent call in /world/Reboot(). +/world/proc/on_reboot(reason) + return + /world/Del() Master.Shutdown() - callHook("shutdown") + on_shutdown() return ..() -/hook/startup/proc/loadMode() - world.load_mode() - return 1 +/// If you need to add modular functionality on-shutdown, override this instead of /world/Del(). +/// It runs directly before the parent call in /world/Del(). +/world/proc/on_shutdown() + return /world/proc/load_mode() if(!fexists("data/mode.txt")) @@ -175,40 +201,11 @@ var/global/world_topic_last = world.timeofday /world/proc/save_mode(var/the_mode) var/F = file("data/mode.txt") fdel(F) - direct_output(F, the_mode) - -/hook/startup/proc/loadMOTD() - world.load_motd() - return 1 + to_file(F, the_mode) /world/proc/load_motd() join_motd = safe_file2text("config/motd.txt", FALSE) -/hook/startup/proc/loadMods() - world.load_mods() - return 1 - -/world/proc/load_mods() - 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") - else - var/list/lines = splittext(text, "\n") - for(var/line in lines) - if (!line) - continue - - if (copytext(line, 1, 2) == ";") - continue - - var/title = "Moderator" - var/rights = admin_ranks[title] - - var/ckey = copytext(line, 1, length(line)+1) - var/datum/admins/D = new /datum/admins(title, rights, ckey) - D.associate(global.ckey_directory[ckey]) - /world/proc/update_status() var/s = "[station_name()]" @@ -281,12 +278,11 @@ var/global/world_topic_last = world.timeofday #define FAILED_DB_CONNECTION_CUTOFF 5 var/global/failed_db_connections = 0 -/hook/startup/proc/connectDB() +/world/proc/connect_database() if(!setup_database_connection()) to_world_log("Your server failed to establish a connection with the SQL database.") else to_world_log("SQL database connection established.") - return 1 /proc/setup_database_connection() diff --git a/code/game/world_topic_commands.dm b/code/game/world_topic_commands.dm index 2bbc05f1436..cfd86601053 100644 --- a/code/game/world_topic_commands.dm +++ b/code/game/world_topic_commands.dm @@ -356,6 +356,5 @@ uid = "topic_command_prometheus_metrics" /decl/topic_command/secure/prometheus_metrics/use() - if(!global.prometheus_metrics) - return "Metrics not ready" - return global.prometheus_metrics.collect() + var/static/decl/prometheus_metrics/prometheus_metrics = IMPLIED_DECL + return prometheus_metrics.collect() diff --git a/code/modules/ZAS/Atom.dm b/code/modules/ZAS/Atom.dm index d8575f1f9ce..c56c561fecd 100644 --- a/code/modules/ZAS/Atom.dm +++ b/code/modules/ZAS/Atom.dm @@ -42,4 +42,5 @@ // Make sure you know what you're doing if you call this // You probably want CanPass() /atom/movable/Cross(atom/movable/crossed_atom) - return CanPass(crossed_atom, crossed_atom.loc) \ No newline at end of file + // We only want to call CanPass() for multitiles, otherwise call parent. + return bounds != "32,32" ? CanPass(crossed_atom, crossed_atom.loc) : ..() \ No newline at end of file diff --git a/code/modules/ZAS/Fire.dm b/code/modules/ZAS/Fire.dm index c961aed56c7..10ecd938f69 100644 --- a/code/modules/ZAS/Fire.dm +++ b/code/modules/ZAS/Fire.dm @@ -17,7 +17,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return simulated /turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) - if(locate(/obj/fire) in src) + if((locate(/obj/fire) in src) || !simulated) return 1 var/datum/gas_mixture/air_contents = return_air() diff --git a/code/modules/ZAS/Turf.dm b/code/modules/ZAS/Turf.dm index 82312858622..016d69b4c53 100644 --- a/code/modules/ZAS/Turf.dm +++ b/code/modules/ZAS/Turf.dm @@ -35,9 +35,9 @@ var/list/postponed #ifdef MULTIZAS - for(var/d = 1, d < 64, d *= 2) + for(var/d in global.cardinalz) #else - for(var/d = 1, d < 16, d *= 2) + for(var/d in global.cardinal) #endif var/turf/unsim = get_step(src, d) @@ -167,7 +167,7 @@ #define GET_ZONE_NEIGHBOURS(T, ret) \ ret = 0; \ if (T.zone) { \ - for (var/_gzn_dir in gzn_check) { \ + for (var/_gzn_dir in ZAS_GZN_CHECK) { \ var/turf/other = get_step(T, _gzn_dir); \ if (istype(other) && other.simulated && other.zone == T.zone) { \ var/block; \ @@ -198,7 +198,7 @@ if (!(check_dirs & (check_dirs - 1))) //Equivalent to: if(IsInteger(log(2, .))) return TRUE - for(var/dir in global.csrfz_check) + for(var/dir in ZAS_CSRFZ_CHECK) //for each pair of "adjacent" cardinals (e.g. NORTH and WEST, but not NORTH and SOUTH) if((dir & check_dirs) == dir) //check that they are connected by the corner turf diff --git a/code/modules/ZAS/Variable Settings.dm b/code/modules/ZAS/VariableSettings.dm similarity index 100% rename from code/modules/ZAS/Variable Settings.dm rename to code/modules/ZAS/VariableSettings.dm diff --git a/code/modules/abstract/abstract_fluid_direction.dm b/code/modules/abstract/abstract_fluid_direction.dm new file mode 100644 index 00000000000..7dabaa77623 --- /dev/null +++ b/code/modules/abstract/abstract_fluid_direction.dm @@ -0,0 +1,37 @@ +/obj/abstract/force_fluid_flow + icon_state = "arrow" + +/obj/abstract/force_fluid_flow/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/abstract/force_fluid_flow/north + dir = NORTH + +/obj/abstract/force_fluid_flow/south + dir = SOUTH + +/obj/abstract/force_fluid_flow/east + dir = EAST + +/obj/abstract/force_fluid_flow/west + dir = WEST + +/obj/abstract/force_fluid_flow/southeast + dir = SOUTHEAST + +/obj/abstract/force_fluid_flow/southwest + dir = SOUTHWEST + +/obj/abstract/force_fluid_flow/northeast + dir = NORTHEAST + +/obj/abstract/force_fluid_flow/northwest + dir = NORTHWEST + +/obj/abstract/force_fluid_flow/LateInitialize() + . = ..() + var/atom/movable/fluid_overlay/fluids = locate() in loc + fluids.force_flow_direction = dir + fluids.queue_icon_update() + qdel(src) diff --git a/code/modules/acting/acting_items.dm b/code/modules/acting/acting_items.dm index ac454ee5975..43fab633270 100644 --- a/code/modules/acting/acting_items.dm +++ b/code/modules/acting/acting_items.dm @@ -1,8 +1,8 @@ /obj/machinery/acting/wardrobe name = "wardrobe dispenser" desc = "A machine that dispenses holo-clothing for those in need." - icon = 'icons/obj/vending.dmi' - icon_state = "cart" + icon = 'icons/obj/machines/vending/cartridges.dmi' + icon_state = ICON_STATE_WORLD anchored = TRUE density = TRUE var/active = 1 diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 5f2e3c19cc6..ecfb5bd522f 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -59,9 +59,6 @@ var/global/savefile/Banlist CMinutes = (world.realtime / 10) / 60 return 1 -/hook/startup/proc/loadBans() - return LoadBans() - /proc/LoadBans() Banlist = new("data/banlist.bdb") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 79c44208bc0..c211f274d60 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -321,7 +321,7 @@ var/global/BSACooldown = 0 dat += "Remove" dat += "
" if(update_file) - direct_output(info, infos) + to_file(info, infos) dat += "
Add Comment
" @@ -789,9 +789,7 @@ var/global/BSACooldown = 0 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.") - var/full_message = "[key_name(src)]" + long_message - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Hub Visibility Toggled (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Hub Visibility Toggled (Game ID: [game_id])", "body" = "[key_name(src)]" + long_message)) log_and_message_admins(long_message) SSstatistics.add_field_details("admin_verb","THUB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc diff --git a/code/modules/admin/admin_attack_log.dm b/code/modules/admin/admin_attack_log.dm index ae2938067fb..433420e57eb 100644 --- a/code/modules/admin/admin_attack_log.dm +++ b/code/modules/admin/admin_attack_log.dm @@ -43,7 +43,7 @@ var/intent = "(INTENT: N/A)" var/target_zone = "(ZONE_SEL: N/A)" if(attacker) - intent = "(INTENT: [uppertext(attacker.a_intent)])" + intent = "(INTENT: [uppertext(attacker.get_intent().name)])" if (attacker.get_target_zone()) target_zone = "(ZONE_SEL: [uppertext(attacker.get_target_zone())])" if(victim) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 66fe7e8daff..8483aa50faa 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -11,10 +11,6 @@ /proc/investigate_subject2file(var/subject) return file("[INVESTIGATE_DIR][subject].html") -/hook/startup/proc/resetInvestigate() - investigate_reset() - return 1 - /proc/investigate_reset() if(fdel(INVESTIGATE_DIR)) return 1 return 0 @@ -38,7 +34,7 @@ return show_browser(src, F, "window=investigate[subject];size=800x300") - if("hrefs") //persistant logs and stuff + if("hrefs") //persistent logs and stuff 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") diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 5a6a4d7b17a..42eab17d7f7 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -52,10 +52,6 @@ var/global/list/admin_ranks = list() //list of all ranks with associated testing(msg) #endif -/hook/startup/proc/loadAdmins() - load_admins() - return 1 - /proc/load_admins() //clear the datums references admin_datums.Cut() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b93ccd2bde9..aba99df3baf 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -883,16 +883,6 @@ var/global/list/admin_verbs_mod = list( log_and_message_admins("told everyone to man up and deal with it.") -/client/proc/give_spell(mob/T as mob in SSmobs.mob_list) // -- Urist - set category = "Fun" - set name = "Give Spell" - set desc = "Gives a spell to a mob." - var/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells - if(!S) return - T.add_spell(new S) - SSstatistics.add_field_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_and_message_admins("gave [key_name(T)] the spell [S].") - /client/proc/change_lobby_screen() set name = "Lobby Screen: Change" set category = "Fun" diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 79ca30569ee..37374968324 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -36,10 +36,6 @@ var/global/list/jobban_keylist = list() //to store the keys & ranks return "Reason Unspecified" return 0 -/hook/startup/proc/loadJobBans() - jobban_loadbanfile() - return 1 - /proc/jobban_loadbanfile() if(get_config_value(/decl/config/toggle/on/ban_legacy_system)) var/savefile/S=new("data/job_full.ban") diff --git a/code/modules/admin/secrets/fun_secrets/waddle.dm b/code/modules/admin/secrets/fun_secrets/waddle.dm index ea7bbd58889..90c663b5a82 100644 --- a/code/modules/admin/secrets/fun_secrets/waddle.dm +++ b/code/modules/admin/secrets/fun_secrets/waddle.dm @@ -35,7 +35,7 @@ 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() +/datum/extension/waddle/Destroy() events_repository.unregister(/decl/observ/destroyed, holder, src) events_repository.unregister(/decl/observ/moved, holder, src) return ..() diff --git a/code/modules/admin/secrets/investigation/admin_pms.dm b/code/modules/admin/secrets/investigation/admin_pms.dm deleted file mode 100644 index cd57bf73283..00000000000 --- a/code/modules/admin/secrets/investigation/admin_pms.dm +++ /dev/null @@ -1,40 +0,0 @@ -/datum/admin_secret_item/investigation/admin_pms - name = "Admin PMs" - -/datum/admin_secret_item/investigation/admin_pms/execute(var/mob/user, var/filter) - . = ..() - if(!.) - return - var/dat = list() - dat += "Refresh Filtering on: " - if(filter) - dat += " [filter] Clear" - else - dat += "None" - dat += "
" - dat += "" - dat += "" - - for(var/datum/admin_privat_message/pm in admin_pm_repository.admin_pms_) - var/datum/client_lite/sender = pm.sender - var/datum/client_lite/receiver = pm.receiver - - if(filter && !(sender.ckey == filter || (receiver && receiver.ckey == filter))) - continue - - if(receiver) - dat += "" - else - dat += "" - dat += "" - dat += "
TimeSenderReceiver
[pm.station_time][sender.key_name(FALSE)] F[receiver.key_name(FALSE)] F
[pm.station_time][sender.key_name(FALSE)] F
[pm.message]
" - - var/datum/browser/popup = new(user, "admin_ahelps", "Admin PMs", 800, 400) - popup.set_content(jointext(dat, null)) - popup.open() - -/datum/admin_secret_item/investigation/admin_pms/Topic(href, href_list) - . = ..() - if(.) - return - execute(usr, href_list["filter"]) diff --git a/code/modules/admin/secrets/investigation/attack_logs.dm b/code/modules/admin/secrets/investigation/attack_logs.dm index 201adaa00bf..5a915fd379c 100644 --- a/code/modules/admin/secrets/investigation/attack_logs.dm +++ b/code/modules/admin/secrets/investigation/attack_logs.dm @@ -69,9 +69,8 @@ . = filters_per_client[user.client] if(!.) . = list() - for(var/af_type in subtypesof(/attack_filter)) - var/attack_filter/af = af_type - if(initial(af.category) == af_type) + for(var/datum/attack_filter/af_type as anything in subtypesof(/datum/attack_filter)) + if(TYPE_IS_ABSTRACT(af_type)) continue . += new af_type(src) filters_per_client[user.client] = . @@ -79,56 +78,56 @@ /datum/admin_secret_item/investigation/attack_logs/proc/get_filter_html(user) . = list() for(var/filter in get_user_filters(user)) - var/attack_filter/af = filter + var/datum/attack_filter/af = filter . += af.get_html() . = jointext(.," | ") /datum/admin_secret_item/investigation/attack_logs/proc/filter_log(user, var/datum/attack_log/al) for(var/filter in get_user_filters(user)) - var/attack_filter/af = filter + var/datum/attack_filter/af = filter if(af.filter_attack(al)) return TRUE return FALSE /datum/admin_secret_item/investigation/attack_logs/proc/reset_user_filters(user) for(var/filter in get_user_filters(user)) - var/attack_filter/af = filter + var/datum/attack_filter/af = filter af.reset() -/attack_filter - var/category = /attack_filter +/datum/attack_filter + abstract_type = /datum/attack_filter var/datum/admin_secret_item/investigation/attack_logs/holder -/attack_filter/New(var/holder) +/datum/attack_filter/New(var/holder) ..() src.holder = holder -/attack_filter/Topic(href, href_list) +/datum/attack_filter/Topic(href, href_list) if(..()) return TRUE if(OnTopic(href_list)) holder.execute(usr) return TRUE -/attack_filter/proc/get_html() +/datum/attack_filter/proc/get_html() return -/attack_filter/proc/reset() +/datum/attack_filter/proc/reset() return -/attack_filter/proc/filter_attack(var/datum/attack_log/al) +/datum/attack_filter/proc/filter_attack(var/datum/attack_log/al) return FALSE -/attack_filter/proc/OnTopic(href_list) +/datum/attack_filter/proc/OnTopic(href_list) return FALSE /* * Filter logs with one or more missing clients */ -/attack_filter/no_client +/datum/attack_filter/no_client var/filter_missing_clients = TRUE -/attack_filter/no_client/get_html() +/datum/attack_filter/no_client/get_html() . = list() . += "Must have clients: " if(filter_missing_clients) @@ -137,7 +136,7 @@ . += "YesNo" . = jointext(.,null) -/attack_filter/no_client/OnTopic(href_list) +/datum/attack_filter/no_client/OnTopic(href_list) if(href_list["yes"] && !filter_missing_clients) filter_missing_clients = TRUE return TRUE @@ -145,10 +144,10 @@ filter_missing_clients = FALSE return TRUE -/attack_filter/no_client/reset() +/datum/attack_filter/no_client/reset() filter_missing_clients = initial(filter_missing_clients) -/attack_filter/no_client/filter_attack(var/datum/attack_log/al) +/datum/attack_filter/no_client/filter_attack(var/datum/attack_log/al) if(!filter_missing_clients) return FALSE if(al.attacker && al.attacker.client.ckey == NO_CLIENT_CKEY) @@ -160,19 +159,19 @@ /* Either subject must be the selected client */ -/attack_filter/must_be_given_ckey +/datum/attack_filter/must_be_given_ckey var/ckey_filter var/check_attacker = TRUE var/check_victim = TRUE var/description = "Either ckey is" -/attack_filter/must_be_given_ckey/reset() +/datum/attack_filter/must_be_given_ckey/reset() ckey_filter = null -/attack_filter/must_be_given_ckey/get_html() +/datum/attack_filter/must_be_given_ckey/get_html() return "[description]: [ckey_filter ? ckey_filter : "*ANY*"]" -/attack_filter/must_be_given_ckey/OnTopic(href_list) +/datum/attack_filter/must_be_given_ckey/OnTopic(href_list) if(!href_list["select_ckey"]) return var/ckey = input("Select ckey to filter on","Select ckey", ckey_filter) as null|anything in get_ckeys() @@ -183,7 +182,7 @@ ckey_filter = ckey return TRUE -/attack_filter/must_be_given_ckey/proc/get_ckeys() +/datum/attack_filter/must_be_given_ckey/proc/get_ckeys() . = list() for(var/log in attack_log_repository.attack_logs_) var/datum/attack_log/al = log @@ -194,7 +193,7 @@ . = sortTim(., /proc/cmp_text_asc) . += "*ANY*" -/attack_filter/must_be_given_ckey/filter_attack(var/datum/attack_log/al) +/datum/attack_filter/must_be_given_ckey/filter_attack(var/datum/attack_log/al) if(!ckey_filter) return FALSE if(check_attacker && al.attacker && al.attacker.client.ckey == ckey_filter) @@ -206,19 +205,19 @@ /* Attacker must be the selected client */ -/attack_filter/must_be_given_ckey/attacker +/datum/attack_filter/must_be_given_ckey/attacker description = "Attacker ckey is" check_victim = FALSE -/attack_filter/must_be_given_ckey/attacker/filter_attack(al) +/datum/attack_filter/must_be_given_ckey/attacker/filter_attack(al) return ..(al, TRUE, FALSE) /* Victim must be the selected client */ -/attack_filter/must_be_given_ckey/victim +/datum/attack_filter/must_be_given_ckey/victim description = "Victim ckey is" check_attacker = FALSE -/attack_filter/must_be_given_ckey/victim/filter_attack(al) +/datum/attack_filter/must_be_given_ckey/victim/filter_attack(al) return ..(al, FALSE, TRUE) diff --git a/code/modules/admin/ticket.dm b/code/modules/admin/ticket.dm index 526c9867927..8612a5306d9 100644 --- a/code/modules/admin/ticket.dm +++ b/code/modules/admin/ticket.dm @@ -51,7 +51,6 @@ var/global/list/ticket_panels = list() src.closed_by = closed_by to_chat(client_by_ckey(src.owner.ckey), "Your ticket has been closed by [closed_by.key].") message_staff("[src.owner.key_name(0)]'s ticket has been closed by [closed_by.key].") - send2adminirc("[src.owner.key_name(0)]'s ticket has been closed by [closed_by.key].") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Ticket ([id]) (Game ID: [game_id]) Ticket Closed", "body" = "[src.owner.key_name(0)] 's ticket (ID [id]) has been closed by [closed_by.key].")) var/closed_by_not_assigned = TRUE @@ -100,7 +99,6 @@ var/global/list/ticket_panels = list() ticket_take.Execute() message_staff("[assigned_admin.key] has assigned themself to [src.owner.key_name(0)]'s ticket.") - send2adminirc("[assigned_admin.key] has assigned themself to [src.owner.key_name(0)]'s ticket.") to_chat(client_by_ckey(src.owner.ckey), "[assigned_admin.key] has added themself to your ticket and should respond shortly. Thanks for your patience!") SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Ticket ([id]) (Game ID: [game_id]) Ticked Assigned", "body" = "[assigned_admin.key] has added themself to ticket ID [id].")) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 8adc77ad2e7..c9e2798773b 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -174,7 +174,7 @@ else if(task == "permissions") if(!D) return var/list/permissionlist = list() - for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left BITSHIFT_LEFT + for(var/i=1, i<=R_MAXPERMISSION, i = BITSHIFT_LEFT(i, 1)) permissionlist[rights2text(i)] = i var/new_permission = input("Select a permission to turn on/off", "Permission toggle", null, null) as null|anything in permissionlist if(!new_permission) return @@ -979,8 +979,7 @@ var/obj/effect/stop/S S = new /obj/effect/stop(M.loc) S.victim = M - spawn(20) - qdel(S) + QDEL_IN(S, 2 SECONDS) var/turf/floor/T = get_turf(M) if(istype(T)) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ee9f73e756b..77017eee5f6 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -134,10 +134,6 @@ var/global/list/adminhelp_ignored_words = list("unknown","the","a","an","of","mo to_chat(src, SPAN_BLUE("PM to-Staff (CLOSE): [original_msg]")) var/admin_number_present = global.admins.len - admin_number_afk log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.") - if(admin_number_present <= 0) - adminmsg2adminirc(src, null, "[html_decode(original_msg)] - !![admin_number_afk ? "All admins AFK ([admin_number_afk])" : "No admins online"]!!") - else - adminmsg2adminirc(src, null, "[html_decode(original_msg)]") SSstatistics.add_field_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index d3e506f6327..7371ff70873 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -151,7 +151,6 @@ sound_to(C, 'sound/effects/adminhelp.ogg') log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") - adminmsg2adminirc(src, C, html_decode(msg)) ticket.msgs += new /datum/ticket_msg(src.ckey, C.ckey, msg) update_ticket_panels() @@ -168,31 +167,3 @@ continue if(X.key != key && X.key != C.key && (X.holder.rights & R_ADMIN|R_MOD)) to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0, ticket)] to [key_name(C, X, 0, ticket)] ([(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]) (CLOSE): [msg]") - -/client/proc/cmd_admin_irc_pm(sender) - if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") - return - - var/msg = input(src,"Message:", "Reply private message to [sender] on IRC / 400 character limit") as text|null - - if(!msg) - return - - // Handled on Bot32's end, unsure about other bots -// if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends. -// to_chat(src, "Your message was not sent because it was more then 400 characters, find your message below for ease of copy/pasting.") -// to_chat(src, "[msg]") -// return - - adminmsg2adminirc(src, sender, html_decode(msg)) - msg = sanitize(msg) - log_admin("PM: [key_name(src)]->IRC-[sender]: [msg]") - admin_pm_repository.store_pm(src, "IRC-[sender]", msg) - - to_chat(src, "" + create_text_tag("pm_out_alt", "PM", src) + " to [sender]: [msg]") - for(var/client/X in global.admins) - if(X == src) - continue - if(X.holder.rights & R_ADMIN|R_MOD) - to_chat(X, "" + create_text_tag("pm_other", "PM:", X) + " [key_name(src, X, 0)] to [sender]: [msg]") diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 75b90a33712..179676df7f3 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -10,7 +10,7 @@ var/inactive_groups = SSair.zones.len - active_groups var/hotspots = 0 - for(var/obj/fire/hotspot in world) + for(var/obj/fire/hotspot in SSair.active_hotspots) hotspots++ var/active_on_main_station = 0 diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 24bbe2f93ab..0527485b126 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -51,7 +51,7 @@ return message_admins("[key_name_admin(src)] accessed file: [path]") - direct_output(src, run(file(path))) + open_file_for(src, file(path)) to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") return @@ -64,6 +64,6 @@ set name = "Show Server Log" set desc = "Shows today's server log." - direct_output(usr, run(diary)) + open_file_for(usr, diary) SSstatistics.add_field_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return \ No newline at end of file diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm index 2394d2a8197..afea1d4a6fe 100644 --- a/code/modules/admin/verbs/grief_fixers.dm +++ b/code/modules/admin/verbs/grief_fixers.dm @@ -4,35 +4,55 @@ if(!check_rights(R_ADMIN|R_DEBUG)) return - if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") + if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. This may require any atmos-based generators to shut down. Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") return SSstatistics.add_field_details("admin_verb","FA") log_and_message_admins("Full atmosphere reset initiated by [usr].") - to_world("Initiating restart of atmosphere. The server may lag a bit.") + to_world(SPAN_DANGER("Initiating restart of atmosphere. The server may lag a bit.")) sleep(10) var/current_time = world.timeofday - // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. - for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) - S.power = 0 - to_chat(usr, "\[1/5\] - Supermatter depowered") + var/list/steps = sortTim(decls_repository.get_decls_of_subtype_unassociated(/decl/atmos_grief_fix_step), /proc/cmp_decl_sort_value_asc) + var/step_count = length(steps) + for(var/step_index in 1 to length(step_count)) + var/decl/atmos_grief_fix_step/fix_step = steps[step_index] + to_chat(usr, "\[[step_index]/[step_count]\] - [fix_step.name].") + fix_step.act() + to_world(SPAN_DANGER("Atmosphere restart completed in [(world.timeofday - current_time)/(1 SECOND)] seconds.")) +/decl/atmos_grief_fix_step + abstract_type = /decl/atmos_grief_fix_step + var/name + +/decl/atmos_grief_fix_step/proc/act() + return + +/decl/atmos_grief_fix_step/purge_pipenets + name = "All pipenets purged of gas" + sort_order = 1 + +/decl/atmos_grief_fix_step/purge_pipenets/act() // Remove all gases from all pipenets - for(var/net in SSmachines.pipenets) - var/datum/pipe_network/PN = net + for(var/datum/pipe_network/PN as anything in SSmachines.pipenets) for(var/datum/gas_mixture/G in PN.gases) - G.gas = list() + G.gas.Cut() G.update_values() - to_chat(usr, "\[2/5\] - All pipenets purged of gas.") +/decl/atmos_grief_fix_step/delete_zones + name = "All ZAS Zones removed" + sort_order = 2 +/decl/atmos_grief_fix_step/delete_zones/act() // Delete all zones. for(var/zone/Z in SSair.zones) Z.c_invalidate() - to_chat(usr, "\[3/5\] - All ZAS Zones removed.") +/decl/atmos_grief_fix_step/reset_turfs + name = "All turfs reset to roundstart values" + sort_order = 3 +/decl/atmos_grief_fix_step/reset_turfs/act() var/list/unsorted_overlays = list() var/list/all_gasses = decls_repository.get_decls_of_subtype(/decl/material/gas) for(var/id in all_gasses) @@ -41,12 +61,11 @@ for(var/turf/T in world) T.air = null - T.overlays.Remove(unsorted_overlays) T.zone = null - to_chat(usr, "\[4/5\] - All turfs reset to roundstart values.") +/decl/atmos_grief_fix_step/reboot_zas + name = "ZAS Rebooted" + sort_order = 4 +/decl/atmos_grief_fix_step/reboot_zas/act() SSair.reboot() - - to_chat(usr, "\[5/5\] - ZAS Rebooted") - to_world("Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 6638c344791..b599e3845e6 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -24,6 +24,7 @@ var/global/camera_range_display_status = 0 var/global/intercom_range_display_status = 0 +var/global/list/debug_camera_range_markers = list() /obj/effect/debugging/camera_range icon = 'icons/480x480.dmi' icon_state = "25percent" @@ -33,11 +34,25 @@ var/global/intercom_range_display_status = 0 default_pixel_x = -224 default_pixel_y = -224 reset_offsets(0) + global.debug_camera_range_markers += src +/obj/effect/debugging/camera_range/Destroy() + global.debug_camera_range_markers -= src + return ..() + +var/global/list/mapping_debugging_markers = list() /obj/effect/debugging/marker icon = 'icons/turf/areas.dmi' icon_state = "yellow" +/obj/effect/debugging/marker/Initialize(mapload) + . = ..() + global.mapping_debugging_markers += src + +/obj/effect/debugging/marker/Destroy() + global.mapping_debugging_markers -= src + return ..() + /obj/effect/debugging/marker/Move() return 0 @@ -56,7 +71,7 @@ var/global/intercom_range_display_status = 0 - for(var/obj/effect/debugging/camera_range/C in world) + for(var/obj/effect/debugging/camera_range/C as anything in debug_camera_range_markers) qdel(C) if(camera_range_display_status) @@ -113,7 +128,7 @@ var/global/intercom_range_display_status = 0 else intercom_range_display_status = 1 - for(var/obj/effect/debugging/marker/M in world) + for(var/obj/effect/debugging/marker/M in global.mapping_debugging_markers) qdel(M) if(intercom_range_display_status) @@ -150,7 +165,6 @@ var/global/list/debug_verbs = list ( /client/proc/hide_debug_verbs, /client/proc/testZAScolors, /client/proc/testZAScolors_remove, - /datum/admins/proc/setup_supermatter, /datum/admins/proc/setup_fusion, /client/proc/atmos_toggle_debug, /client/proc/spawn_tanktransferbomb, diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 8605ad977a8..06c04257bab 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -318,6 +318,7 @@ variable = param_var_name + // TODO: check for list-typed O? Proc does not exist on non-datum types. var_value = O.get_variable_value(variable) if(autodetect_class) diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index 8e30b30b4d7..7b7155b8391 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -1,6 +1,4 @@ - -// Keep these two together, they *must* be defined on both -// If /client ever becomes /datum/client or similar, they can be merged +// If /client/var/parent_type ever stops being /datum, this proc will need to be redefined on client. /datum/proc/get_view_variables_header() return "[src]" @@ -8,16 +6,16 @@ return {" [src]
- << + \<\< [dir2text(dir)] - >> + \>\> "} /mob/living/get_view_variables_header() return {" [src] -
<< [dir2text(dir)] >> +
\<\< [dir2text(dir)] \>\>
[ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"]
BRUTE:[get_damage(BRUTE)] @@ -37,7 +35,6 @@ return ..() + {" - @@ -50,6 +47,9 @@ + + + diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 9cec7322e10..971e7a394bc 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -1,4 +1,3 @@ - /client/proc/view_var_Topic(href, href_list, hsrc) //This should all be moved over to datum/admins/Topic() or something ~Carn if( (usr.client != src) || !src.holder ) @@ -97,17 +96,6 @@ src.holder.show_player_panel(victim) href_list["datumrefresh"] = href_list["mob_player_panel"] - else if(href_list["give_spell"]) - if(!check_rights(R_ADMIN|R_FUN)) return - - var/mob/victim = locate(href_list["give_spell"]) - if(!istype(victim)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.give_spell(victim) - href_list["datumrefresh"] = href_list["give_spell"] - else if(href_list["godmode"]) if(!check_rights(R_REJUVENATE)) return @@ -302,8 +290,8 @@ return var/list/possible_ailments = list() for(var/atype in subtypesof(/datum/ailment)) - var/datum/ailment/ailment = get_ailment_reference(atype) - if(ailment && ailment.category != ailment.type && ailment.can_apply_to(limb)) + var/datum/ailment/ailment = get_ailment_reference(atype) // will not get abstract ailments + if(ailment && ailment.can_apply_to(limb)) possible_ailments |= ailment var/datum/ailment/ailment = input("Select an ailment type to add.", "Add Ailment") as null|anything in possible_ailments @@ -599,9 +587,9 @@ href_list["datumrefresh"] = href_list["mobToDamage"] else if(href_list["call_proc"]) - var/datum/callee = locate(href_list["call_proc"]) - if(istype(callee) || istype(callee, /client)) // can call on clients too, not just datums - callproc_targetpicked(1, callee) + var/datum/called_proc = locate(href_list["call_proc"]) + if(istype(called_proc) || istype(called_proc, /client)) // can call on clients too, not just datums + callproc_targetpicked(1, called_proc) else if(href_list["addaura"]) if(!check_rights(R_DEBUG|R_ADMIN|R_FUN)) return var/mob/living/victim = locate(href_list["addaura"]) @@ -690,6 +678,33 @@ item.set_material(new_material.type) to_chat(usr, "Set material of [item] to [item.get_material()].") + else if(href_list["give_ability"]) + var/mob/target = locate(href_list["give_ability"]) + if(!istype(target) || QDELETED(target)) + to_chat(usr, "Mob no longer exists.") + else + var/list/abilities = decls_repository.get_decls_of_type_unassociated(/decl/ability) + abilities = abilities.Copy() + abilities -= target.get_all_abilities() + var/decl/ability/ability = input(usr, "Which ability do you wish to grant?", "Give Ability") as null|anything in abilities + if(istype(ability) && !QDELETED(usr) && !QDELETED(target)) + if(target.add_ability(ability.type)) + log_and_message_admins("has given [ability] to [key_name(target)].") + else + to_chat(usr, SPAN_WARNING("Failed to give [ability] to [target]!")) + + else if(href_list["remove_ability"]) + var/mob/target = locate(href_list["remove_ability"]) + if(!istype(target) || QDELETED(target)) + to_chat(usr, "Mob no longer exists.") + else + var/decl/ability/ability = input(usr, "Which ability do you wish to remove?", "Remove Ability") as null|anything in target.get_all_abilities() + if(istype(ability) && !QDELETED(usr) && !QDELETED(target)) + if(target.remove_ability(ability.type)) + log_and_message_admins("has removed [ability] from [key_name(target)].") + else + to_chat(usr, SPAN_WARNING("Failed to remove [ability] from [target]!")) + if(href_list["datumrefresh"]) var/datum/datum_to_refresh = locate(href_list["datumrefresh"]) if(istype(datum_to_refresh, /datum) || istype(datum_to_refresh, /client)) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index e583f5664ce..47dcc913a45 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -12,7 +12,7 @@ var/secured = 1 var/list/attached_overlays = null - var/obj/item/assembly_holder/holder = null + var/obj/item/assembly_holder/holder = null // currently can be a TTV or assemblyholder, todo make ttv use assemblyholder var/cooldown = 0//To prevent spam var/wires = WIRE_RECEIVE | WIRE_PULSE @@ -24,10 +24,7 @@ /obj/item/assembly/Destroy() if(!QDELETED(holder)) - if(holder.a_left == src) - holder.a_left = null - if(holder.a_right == src) - holder.a_right = null + // the holder has the responsibility to clear its associated vars on destroy QDEL_NULL(holder) else holder = null @@ -35,53 +32,49 @@ /// What the device does when turned on /obj/item/assembly/proc/activate() - return - -/// Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs -/obj/item/assembly/proc/pulsed(var/radio = 0) - return - -/// Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct -/obj/item/assembly/proc/pulse_device(var/radio = 0) - return + if(!secured || (cooldown > 0)) return 0 + cooldown = 2 + spawn(10) + process_cooldown() + return 1 /// Code that has to happen when the assembly is un\secured goes here /obj/item/assembly/proc/toggle_secure() - return + secured = !secured + update_icon() + return secured /// Called when an assembly is attacked by another -/obj/item/assembly/proc/attach_assembly(var/obj/A, var/mob/user) - return - -/// Called via spawn(10) to have it count down the cooldown var -/obj/item/assembly/proc/process_cooldown() - return +/obj/item/assembly/proc/attach_assembly(var/obj/item/A, var/mob/user) + holder = new/obj/item/assembly_holder(get_turf(src)) + if(holder.attach(A,src,user)) + to_chat(user, "You attach \the [A] to \the [src]!") + return 1 + return 0 /// Called when the holder is moved /obj/item/assembly/proc/holder_movement() return -/// Called when attack_self is called -/obj/item/assembly/interact(mob/user) - return - -/obj/item/assembly/process_cooldown() +/// Called via spawn(10) to have it count down the cooldown var +/// This is really bad. Please just make it process... +/obj/item/assembly/proc/process_cooldown() cooldown-- if(cooldown <= 0) return 0 spawn(10) process_cooldown() return 1 - -/obj/item/assembly/pulsed(var/radio = 0) +/// Called when another assembly acts on this one, var/radio will determine where it came from for wire calcs +/obj/item/assembly/proc/pulsed(var/radio = 0) if(holder && (wires & WIRE_RECEIVE)) activate() if(radio && (wires & WIRE_RADIO_RECEIVE)) activate() return 1 - -/obj/item/assembly/pulse_device(var/radio = 0) +/// Called when this device attempts to act on another device, var/radio determines if it was sent via radio or direct +/obj/item/assembly/proc/pulse_device(var/radio = 0) if(holder && (wires & WIRE_PULSE)) holder.process_activation(src, 1, 0) if(holder && (wires & WIRE_PULSE_SPECIAL)) @@ -90,29 +83,6 @@ //Not sure what goes here quite yet send signal? return 1 - -/obj/item/assembly/activate() - if(!secured || (cooldown > 0)) return 0 - cooldown = 2 - spawn(10) - process_cooldown() - return 1 - - -/obj/item/assembly/toggle_secure() - secured = !secured - update_icon() - return secured - - -/obj/item/assembly/attach_assembly(var/obj/item/assembly/A, var/mob/user) - holder = new/obj/item/assembly_holder(get_turf(src)) - if(holder.attach(A,src,user)) - to_chat(user, "You attach \the [A] to \the [src]!") - return 1 - return 0 - - /obj/item/assembly/attackby(obj/item/component, mob/user) if(!user_can_attack_with(user) || !component.user_can_attack_with(user)) return TRUE @@ -152,6 +122,7 @@ interact(user) return TRUE +/// Called when attack_self is called /obj/item/assembly/interact(mob/user) return //HTML MENU FOR WIRES GOES HERE diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index c4ef0fcdbfa..9a794b2c900 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -36,20 +36,11 @@ special_assembly = null return ..() -/obj/item/assembly_holder/proc/attach(var/obj/item/left, var/obj/item/right, var/mob/user) - return - -/obj/item/assembly_holder/proc/process_activation(var/atom/activator) - return - -/obj/item/assembly_holder/proc/detached() - return - -/obj/item/assembly_holder/attach(var/obj/item/assembly/left, var/obj/item/assembly/right, var/mob/user) - if((!left)||(!right)) - return 0 - if((!istype(left))||(!istype(right))) +/obj/item/assembly_holder/proc/attach(var/obj/item/left_item, var/obj/item/right_item, var/mob/user) + if(!istype(left_item) || !istype(right_item)) return 0 + var/obj/item/assembly/left = left_item + var/obj/item/assembly/right = right_item if((left.secured)||(right.secured)) return 0 if(user) @@ -67,6 +58,24 @@ return 1 +/obj/item/assembly_holder/proc/process_activation(var/atom/activator, var/normal = 1, var/special = 1) + if(!activator) return 0 + if(!secured) + visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") + if((normal) && (a_right) && (a_left)) + if(a_right != activator) + a_right.pulsed(0) + if(a_left != activator) + a_left.pulsed(0) + if(master) + master.receive_signal() +// if(special && special_assembly) +// if(!special_assembly == activator) +// special_assembly.dothings() + return 1 + +/obj/item/assembly_holder/proc/detached() + return /obj/item/assembly_holder/HasProximity(atom/movable/AM) . = ..() @@ -150,27 +159,9 @@ if(a_right) a_right.holder = null a_right.forceMove(T) - spawn(0) - qdel(src) + qdel(src) return - -/obj/item/assembly_holder/process_activation(var/atom/activator, var/normal = 1, var/special = 1) - if(!activator) return 0 - if(!secured) - visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") - if((normal) && (a_right) && (a_left)) - if(a_right != activator) - a_right.pulsed(0) - if(a_left != activator) - a_left.pulsed(0) - if(master) - master.receive_signal() -// if(special && special_assembly) -// if(!special_assembly == activator) -// special_assembly.dothings() - return 1 - /obj/item/assembly_holder/hear_talk(mob/living/M, msg, verb, decl/language/speaking) if(a_right) a_right.hear_talk(M,msg,verb,speaking) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 1253014bd80..77623305db1 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -67,7 +67,7 @@ holder.update_icon() update_beams() -/obj/item/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel +/obj/item/assembly/infra/interact(mob/user)//TODO: change this to the wire control panel if(!secured) return if(!CanInteract(user, global.physical_topic_state)) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index b0b1aed79e3..d8bcb207a12 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -3,7 +3,7 @@ desc = "A handy little spring-loaded trap for catching pesty rodents." icon_state = "mousetrap" origin_tech = @'{"combat":1}' - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) var/armed = 0 diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index aee7624c0f7..a451bcffec1 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -20,7 +20,23 @@ var/range = 2 /obj/item/assembly/prox_sensor/proc/toggle_scan() + if(!secured) return 0 + scanning = !scanning + update_icon() + return + /obj/item/assembly/prox_sensor/proc/sense() + var/turf/mainloc = get_turf(src) +// if(scanning && cooldown <= 0) +// mainloc.visible_message("[html_icon(src)] *boop* *boop*", "*boop* *boop*") + if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 + pulse_device(0) + if(!holder) + mainloc.visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") + cooldown = 2 + spawn(10) + process_cooldown() + return /obj/item/assembly/prox_sensor/activate() @@ -46,19 +62,6 @@ if(. && !istype(AM, /obj/effect/ir_beam) && AM.move_speed < 12) sense() -/obj/item/assembly/prox_sensor/sense() - var/turf/mainloc = get_turf(src) -// if(scanning && cooldown <= 0) -// mainloc.visible_message("[html_icon(src)] *boop* *boop*", "*boop* *boop*") - if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0 - pulse_device(0) - if(!holder) - mainloc.visible_message("[html_icon(src)] *beep* *beep*", "*beep* *beep*") - cooldown = 2 - spawn(10) - process_cooldown() - return - /obj/item/assembly/prox_sensor/Process() if(scanning) @@ -80,12 +83,6 @@ . = ..() addtimer(CALLBACK(src, PROC_REF(sense)), 0) -/obj/item/assembly/prox_sensor/toggle_scan() - if(!secured) return 0 - scanning = !scanning - update_icon() - return - /obj/item/assembly/prox_sensor/on_update_icon() . = ..() diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index aeb57facd84..bac9d7ec079 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -16,9 +16,6 @@ var/timing = 0 var/time = 10 -/obj/item/assembly/timer/proc/timer_end() - - /obj/item/assembly/timer/activate() if(!..()) return 0//Cooldown check @@ -39,7 +36,7 @@ return secured -/obj/item/assembly/timer/timer_end() +/obj/item/assembly/timer/proc/timer_end() if(!secured) return 0 pulse_device(0) if(!holder) diff --git a/code/modules/atmospherics/_atmos_setup.dm b/code/modules/atmospherics/_atmos_setup.dm index 57b3c67d140..74d85deb11a 100644 --- a/code/modules/atmospherics/_atmos_setup.dm +++ b/code/modules/atmospherics/_atmos_setup.dm @@ -17,10 +17,10 @@ var/global/list/pipe_colors = list( "white" = PIPE_COLOR_WHITE, "dark gray" = COLOR_DARK_GRAY) -/proc/pipe_color_check(var/color) +/obj/machinery/atmospherics/proc/pipe_color_check(var/color) if(!color) - return 1 + return TRUE for(var/C in pipe_colors) if(color == pipe_colors[C]) - return 1 - return 0 + return TRUE + return FALSE diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index a0b05c844cd..156e19f2f39 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -213,6 +213,7 @@ Thus, the two variables affect pump operation are set in New(): /decl/interaction_handler/binary_pump_toggle name = "Switch On/Off" expected_target_type = /obj/machinery/atmospherics/binary/pump + examine_desc = "turn $TARGET_THEM$ on or off" /decl/interaction_handler/binary_pump_toggle/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/atmospherics/binary/pump/P = target diff --git a/code/modules/atmospherics/components/unary/heat_exchanger.dm b/code/modules/atmospherics/components/unary/heat_exchanger.dm index 30849bc53b9..f19c4ecb4f7 100644 --- a/code/modules/atmospherics/components/unary/heat_exchanger.dm +++ b/code/modules/atmospherics/components/unary/heat_exchanger.dm @@ -4,7 +4,7 @@ icon_state = "intact" density = TRUE - name = "Heat Exchanger" + name = "heat exchanger" desc = "Exchanges heat between two input gases. Setup for fast heat transfer." var/obj/machinery/atmospherics/unary/heat_exchanger/partner = null diff --git a/code/modules/atmospherics/datum_pipeline.dm b/code/modules/atmospherics/datum_pipeline.dm index cace579e65b..55a58d0138f 100644 --- a/code/modules/atmospherics/datum_pipeline.dm +++ b/code/modules/atmospherics/datum_pipeline.dm @@ -45,7 +45,7 @@ . = ..() -/datum/pipeline/Process()//This use to be called called from the pipe networks +/datum/pipeline/Process()//This use to be called from the pipe networks //Check to see if pressure is within acceptable limits var/pressure = air.return_pressure() if(pressure > maximum_pressure) @@ -193,13 +193,23 @@ network.update = 1 /datum/pipeline/proc/temperature_interact(turf/target, share_volume, thermal_conductivity) + + if(air.volume <= 0) // Avoid div by zero. + return + var/total_heat_capacity = air.heat_capacity() var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) + if(total_heat_capacity <= 0) // Avoid div by zero. + return + if(SHOULD_PARTICIPATE_IN_ZONES(target) && !target.blocks_air) + + if(partial_heat_capacity <= 0) + return + var/delta_temperature = 0 var/sharer_heat_capacity = 0 - if(target.zone) delta_temperature = (air.temperature - target.zone.air.temperature) sharer_heat_capacity = target.zone.air.heat_capacity() @@ -207,18 +217,14 @@ delta_temperature = (air.temperature - target.air.temperature) sharer_heat_capacity = target.air.heat_capacity() + if(sharer_heat_capacity <= 0) + return + var/self_temperature_delta = 0 var/sharer_temperature_delta = 0 - - if((sharer_heat_capacity > 0) && (partial_heat_capacity > 0)) - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) - - self_temperature_delta = -heat/total_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity - else - return 1 - + var/heat = thermal_conductivity * delta_temperature * ( partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity + sharer_heat_capacity) ) + self_temperature_delta = -heat/total_heat_capacity + sharer_temperature_delta = heat/sharer_heat_capacity air.temperature += self_temperature_delta if(target.zone) @@ -228,33 +234,29 @@ else if(target.external_atmosphere_participation && !target.blocks_air) - var/turf/modeled_location = target - var/datum/gas_mixture/target_air = modeled_location.return_air() + if(partial_heat_capacity <= 0) + return - var/delta_temperature = air.temperature - target_air.temperature - var/sharer_heat_capacity = target_air.heat_capacity() + var/datum/gas_mixture/target_air = target.return_air() + var/sharer_heat_capacity = target_air?.heat_capacity() - if((sharer_heat_capacity > 0) && (partial_heat_capacity > 0)) - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) - air.temperature += -heat/total_heat_capacity - else - return 1 + if(sharer_heat_capacity <= 0) + return - else - if((target.heat_capacity > 0) && (partial_heat_capacity > 0)) - var/delta_temperature = air.temperature - target.temperature - - var/heat = thermal_conductivity*delta_temperature* \ - (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) + var/delta_temperature = air.temperature - target_air.temperature + var/heat = thermal_conductivity * delta_temperature * ( partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity+sharer_heat_capacity) ) + air.temperature += -heat/total_heat_capacity - air.temperature -= heat/total_heat_capacity - // Only increase the temperature of the target if it's simulated. - if(target.simulated) - target.temperature += heat/target.heat_capacity + else if((target.heat_capacity > 0) && (partial_heat_capacity > 0)) + var/delta_temperature = air.temperature - target.temperature + var/heat = thermal_conductivity * delta_temperature * ( partial_heat_capacity * target.heat_capacity / (partial_heat_capacity + target.heat_capacity) ) + air.temperature -= heat/total_heat_capacity + // Only increase the temperature of the target if it's simulated. + if(target.simulated) + target.temperature += heat/target.heat_capacity if(network) - network.update = 1 + network.update = TRUE //surface must be the surface area in m^2 /datum/pipeline/proc/radiate_heat_to_space(surface, thermal_conductivity) diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index 49437ef28d4..380adf9245f 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -1,32 +1,35 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging - icon = 'icons/atmos/heat.dmi' - icon_state = "11" - color = "#404040" - pipe_color = "#404040" - level = LEVEL_ABOVE_PLATING - connect_types = CONNECT_TYPE_HE + icon = 'icons/atmos/heat.dmi' + icon_state = "11" + color = "#404040" + pipe_color = "#404040" + 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 - var/surface = 2 //surface area in m^2 - var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh build_icon_state = "he" - atom_flags = 0 // no painting + atom_flags = 0 // no painting + maximum_pressure = 360 ATM + fatigue_pressure = 300 ATM + can_buckle = TRUE + buckle_lying = TRUE appearance_flags = KEEP_TOGETHER + var/initialize_directions_he + var/surface = 2 //surface area in m^2 + var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh var/thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT var/minimum_temperature_difference = 20 - maximum_pressure = 360 ATM - fatigue_pressure = 300 ATM - - can_buckle = 1 - buckle_lying = 1 - /obj/machinery/atmospherics/pipe/simple/heat_exchanging/Initialize() . = ..() add_filter("glow",1, list(type = "drop_shadow", x = 0, y = 0, offset = 0, size = 4)) +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/pipe_color_check(var/color) + if (color == initial(pipe_color)) + return TRUE + return FALSE + /obj/machinery/atmospherics/pipe/simple/heat_exchanging/set_dir(new_dir) . = ..() initialize_directions_he = get_initialize_directions() // all directions are HE @@ -52,62 +55,57 @@ update_icon() /obj/machinery/atmospherics/pipe/simple/heat_exchanging/Process() + if(!parent) ..() - else - var/turf/turf = loc - var/datum/gas_mixture/pipe_air = return_air() - if(istype(loc, /turf/space)) - parent.radiate_heat_to_space(surface, 1) - else if(istype(turf) && turf.simulated) - var/turf/pipe_turf = loc - var/environment_temperature = 0 - if(pipe_turf.blocks_air) - environment_temperature = pipe_turf.temperature - else - var/datum/gas_mixture/environment = pipe_turf.return_air() - environment_temperature = environment.temperature - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(pipe_turf, volume, thermal_conductivity) - - if(buckled_mob) - var/hc = pipe_air.heat_capacity() - var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500) - pipe_air.temperature = avg_temp - buckled_mob.bodytemperature = avg_temp - - var/heat_limit = 1000 - - var/mob/living/human/H = buckled_mob - if(istype(H) && H.species) - 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") - - //fancy radiation glowing - if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K - if(abs(pipe_air.temperature - icon_temperature) > 10) - icon_temperature = pipe_air.temperature - var/scale = max((icon_temperature - 500) / 1500, 0) - - var/h_r = heat2color_r(icon_temperature) - var/h_g = heat2color_g(icon_temperature) - var/h_b = heat2color_b(icon_temperature) - - if(icon_temperature < 2000) //scale up overlay until 2000K - h_r = 64 + (h_r - 64)*scale - h_g = 64 + (h_g - 64)*scale - h_b = 64 + (h_b - 64)*scale - var/scale_color = rgb(h_r, h_g, h_b) - var/list/animate_targets = get_above_oo() + src - for (var/thing in animate_targets) - var/atom/movable/AM = thing - animate(AM, color = scale_color, time = 2 SECONDS, easing = SINE_EASING) - animate_filter("glow", list(color = scale_color, time = 2 SECONDS, easing = LINEAR_EASING)) - set_light(min(3, scale*2.5), min(3, scale*2.5), scale_color) + return + + // Handle pipe heat exchange. + var/turf/turf = loc + var/datum/gas_mixture/pipe_air = return_air() + if(istype(loc, /turf/space)) + parent.radiate_heat_to_space(surface, 1) + else if(istype(turf) && turf.simulated) + var/environment_temperature = 0 + if(turf.blocks_air) + environment_temperature = turf.temperature else - set_light(0, 0) + var/datum/gas_mixture/environment = turf.return_air() + environment_temperature = environment?.temperature || 0 + if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) + parent.temperature_interact(turf, volume, thermal_conductivity) + + // Burn mobs buckled to this pipe. + if(buckled_mob) + var/hc = pipe_air.heat_capacity() + var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500) + pipe_air.temperature = avg_temp + buckled_mob.bodytemperature = avg_temp + var/heat_limit = buckled_mob.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") + + //fancy radiation glowing + if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K + if(abs(pipe_air.temperature - icon_temperature) > 10) + icon_temperature = pipe_air.temperature + var/scale = max((icon_temperature - 500) / 1500, 0) + var/h_r = heat2color_r(icon_temperature) + var/h_g = heat2color_g(icon_temperature) + var/h_b = heat2color_b(icon_temperature) + if(icon_temperature < 2000) //scale up overlay until 2000K + h_r = 64 + (h_r - 64)*scale + h_g = 64 + (h_g - 64)*scale + h_b = 64 + (h_b - 64)*scale + var/scale_color = rgb(h_r, h_g, h_b) + var/list/animate_targets = get_above_oo() + src + for (var/thing in animate_targets) + var/atom/movable/AM = thing + animate(AM, color = scale_color, time = 2 SECONDS, easing = SINE_EASING) + animate_filter("glow", list(color = scale_color, time = 2 SECONDS, easing = LINEAR_EASING)) + set_light(min(3, scale*2.5), min(3, scale*2.5), scale_color) + else + set_light(0, 0) /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction icon = 'icons/atmos/junction.dmi' diff --git a/code/modules/augment/active/armblades.dm b/code/modules/augment/active/armblades.dm index 3b622668915..8e40dc7c43e 100644 --- a/code/modules/augment/active/armblades.dm +++ b/code/modules/augment/active/armblades.dm @@ -5,8 +5,8 @@ icon = 'icons/obj/augment.dmi' desc = "A handy utility blade for the discerning augmentee. Warranty void if used for cutting." base_parry_chance = 30 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE attack_verb = list("stabbed", "sliced", "cut") origin_tech = @'{"materials":1,"engineering":1,"combat":2}' material = /decl/material/solid/metal/steel @@ -24,6 +24,8 @@ //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel + +/obj/item/organ/internal/augment/active/simple/armblade/reset_matter() matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) /obj/item/armblade/claws @@ -44,4 +46,6 @@ //Limited to robolimbs augment_flags = AUGMENTATION_MECHANIC material = /decl/material/solid/metal/steel + +/obj/item/organ/internal/augment/active/simple/wolverine/reset_matter() matter = list(/decl/material/solid/gemstone/diamond = MATTER_AMOUNT_REINFORCEMENT) diff --git a/code/modules/augment/active/tool/engineering.dm b/code/modules/augment/active/tool/engineering.dm index 14e3c94b56e..b46692f220d 100644 --- a/code/modules/augment/active/tool/engineering.dm +++ b/code/modules/augment/active/tool/engineering.dm @@ -3,7 +3,6 @@ action_button_name = "Deploy Engineering Tool" desc = "A lightweight augmentation for the engineer on-the-go. This one comes with a series of common tools." material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) paths = list( /obj/item/screwdriver/finger, /obj/item/wrench/finger, @@ -14,6 +13,9 @@ ) origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' +/obj/item/organ/internal/augment/active/polytool/engineer/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + /obj/item/weldingtool/finger name = "digital welder" desc = "A precise, high quality welding tool." diff --git a/code/modules/augment/active/tool/surgical.dm b/code/modules/augment/active/tool/surgical.dm index 808d0c5c24c..faa771cf3e9 100644 --- a/code/modules/augment/active/tool/surgical.dm +++ b/code/modules/augment/active/tool/surgical.dm @@ -3,10 +3,6 @@ action_button_name = "Deploy Surgical Tool" desc = "Part of a line of biomedical augmentations, this device contains the full set of tools any surgeon would ever need." material = /decl/material/solid/metal/steel - matter = list( - /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT - ) paths = list( /obj/item/bonesetter, /obj/item/cautery, @@ -17,3 +13,9 @@ /obj/item/surgicaldrill ) origin_tech = @'{"materials":4,"magnets":3,"engineering":3}' + +/obj/item/organ/internal/augment/active/polytool/surgical/reset_matter() + matter = list( + /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/metal/silver = MATTER_AMOUNT_REINFORCEMENT + ) \ No newline at end of file diff --git a/code/modules/augment/augment.dm b/code/modules/augment/augment.dm index 9b43eea445c..ef122136d5c 100644 --- a/code/modules/augment/augment.dm +++ b/code/modules/augment/augment.dm @@ -2,11 +2,13 @@ name = "embedded augment" desc = "An embedded augment." icon = 'icons/obj/augment.dmi' + w_class = ITEM_SIZE_TINY // Need to be tiny to fit inside limbs. //By default these fit on both flesh and robotic organs and are robotic 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}' + w_class = ITEM_SIZE_TINY var/descriptor = "" var/known = TRUE @@ -16,7 +18,9 @@ /obj/item/organ/internal/augment/Initialize() . = ..() organ_tag = pick(allowed_organs) + set_bodytype(/decl/bodytype/prosthetic/augment) update_parent_organ() + reagents?.clear_reagents() // Removing meat from the reagents list. /obj/item/organ/internal/augment/attackby(obj/item/W, mob/user) if(IS_SCREWDRIVER(W) && allowed_organs.len > 1) diff --git a/code/modules/augment/passive/armor.dm b/code/modules/augment/passive/armor.dm index 738e6c278c7..306de571064 100644 --- a/code/modules/augment/passive/armor.dm +++ b/code/modules/augment/passive/armor.dm @@ -4,7 +4,9 @@ icon_state = "armor-chest" 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}' var/brute_mult = 0.8 - var/burn_mult = 1 \ No newline at end of file + var/burn_mult = 1 + +/obj/item/organ/internal/augment/armor/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) \ No newline at end of file diff --git a/code/modules/augment/passive/boost/muscle.dm b/code/modules/augment/passive/boost/muscle.dm index b9c9bd7f57e..ca38a5cd2ff 100644 --- a/code/modules/augment/passive/boost/muscle.dm +++ b/code/modules/augment/passive/boost/muscle.dm @@ -9,10 +9,12 @@ icon_state = "muscule" 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}' var/obj/item/organ/internal/augment/boost/muscle/other //we need two for these +/obj/item/organ/internal/augment/boost/muscle/reset_matter() + matter = list(/decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT) + /obj/item/organ/internal/augment/boost/muscle/on_add_effects() . = ..() if(!owner) diff --git a/code/modules/augment/passive/boost/reflex.dm b/code/modules/augment/passive/boost/reflex.dm index d249075c429..a066e9f1074 100644 --- a/code/modules/augment/passive/boost/reflex.dm +++ b/code/modules/augment/passive/boost/reflex.dm @@ -4,11 +4,13 @@ buffs = list(SKILL_COMBAT = 1) injury_debuffs = list(SKILL_COMBAT = -1) material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":2,"magnets":3,"programming":5,"biotech":2}' + +/obj/item/organ/internal/augment/boost/reflex/reset_matter() matter = list( /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}' /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 d29a67a21be..33306ef9f56 100644 --- a/code/modules/augment/passive/boost/shooting.dm +++ b/code/modules/augment/passive/boost/shooting.dm @@ -4,16 +4,18 @@ buffs = list(SKILL_WEAPONS = 1) injury_debuffs = list(SKILL_WEAPONS = -1) material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' + +/obj/item/organ/internal/augment/boost/shooting/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) - origin_tech = @'{"materials":4,"magnets":3,"biotech":3}' -/obj/item/organ/internal/augment/boost/reflex/buff() +/obj/item/organ/internal/augment/boost/shooting/buff() if((. = ..())) to_chat(owner, SPAN_NOTICE("Notice: AIM-4 finished reboot.")) -/obj/item/organ/internal/augment/boost/reflex/debuff() +/obj/item/organ/internal/augment/boost/shooting/debuff() if((. = ..())) to_chat(owner, SPAN_WARNING("Catastrophic damage detected: AIM-4 shutting down.")) \ No newline at end of file diff --git a/code/modules/augment/passive/nanoaura.dm b/code/modules/augment/passive/nanoaura.dm index e7602677d83..b18920b72e8 100644 --- a/code/modules/augment/passive/nanoaura.dm +++ b/code/modules/augment/passive/nanoaura.dm @@ -15,15 +15,16 @@ desc = "Nanomachines, son." action_button_name = "Toggle Nanomachines" material = /decl/material/solid/metal/steel + origin_tech = @'{"materials":4,"magnets":4,"engineering":5,"biotech":3}' + var/obj/aura/nanoaura/aura = null + var/charges = 4 + +/obj/item/organ/internal/augment/active/nanounit/reset_matter() matter = list( /decl/material/solid/fiberglass = MATTER_AMOUNT_REINFORCEMENT, /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}' - - var/obj/aura/nanoaura/aura = null - var/charges = 4 /obj/item/organ/internal/augment/active/nanounit/on_add_effects() . = ..() diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm new file mode 100644 index 00000000000..34727eaa11b --- /dev/null +++ b/code/modules/banners/__banner.dm @@ -0,0 +1,136 @@ +/obj/item/banner + name = "banner" + base_name = "banner" // necessary for premapped subtypes + desc = "A furled-up banner." + icon = 'icons/obj/items/banners/banner.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/organic/cloth + color = /decl/material/solid/organic/cloth::color + max_health = 20 + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + w_class = ITEM_SIZE_NORMAL + var/colourise_decal = TRUE + var/hung_desc = "The banner is rather unremarkable." + var/banner_type = /obj/item/banner + var/embroiderable = TRUE + var/list/decals + var/trim_color + +/obj/item/banner/Initialize(ml, material_key) + for(var/decal in decals) + if(ispath(decal)) + var/decl/banner_symbol/decal_decl = GET_DECL(decal) + decals[decal_decl] = decals[decal] + decals -= decal + . = ..() + +var/global/list/banner_type_to_symbols = list() +/obj/item/banner/proc/get_available_decals() + . = global.banner_type_to_symbols[banner_type] + if(!.) + . = list() + for(var/decl/banner_symbol/symbol in decls_repository.get_decls_of_type_unassociated(/decl/banner_symbol)) + if(banner_type in symbol.usable_by_banner_type) + . += symbol + global.banner_type_to_symbols[banner_type] = . + +// TODO: PROPER EMBROIDERY AND ITEM DECORATION. +/obj/item/banner/attackby(obj/item/used_item, mob/user) + + if(embroiderable && istype(used_item, /obj/item/stack/material/thread)) + + // TODO: check material crafting skill and do a do_after() + + if((!length(get_available_decals()) || length(decals)) && trim_color) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + + var/obj/item/stack/material/thread/used_stack = used_item + if(used_stack.get_amount() < 5) + to_chat(user, SPAN_WARNING("You need at least five lengths of thread to embroider a banner.")) + return TRUE + + if(!trim_color) + user.visible_message("\The [user] sews a trim onto \the [src].") + trim_color = used_item.color + used_stack.use(5) + return TRUE + + if(length(get_available_decals()) && !length(decals)) + var/list/available_decals = get_available_decals() + var/decal_color = used_item.color + var/decal_to_sew = input(user, "Which symbol do you wish to add to \the [src]?", "Banner Symbol") as null|anything in available_decals + if(decal_to_sew && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item && used_stack.use(5)) + decals[decal_to_sew] = decal_color + return TRUE + + . = ..() + +/obj/item/banner/examine(mob/user, distance, infix, suffix) + . = ..() + var/decorations = get_decal_string() + if(decorations) + to_chat(user, "\The [src] is decorated with [decorations].") + +/obj/item/banner/proc/get_decal_string() + for(var/decl/banner_symbol/decal in decals) + if(colourise_decal) + LAZYADD(., "\a [decal.name]") + else + LAZYADD(., "\a [decal.name]") + if(trim_color) + // This is weak but I'm not sure how else to phrase it without a color-to-string system. + LAZYADD(., "a trim") + if(.) + return english_list(.) + +/obj/item/banner/forked + name_prefix = "forked" + hung_desc = "The banner splits into two tails at the bottom." + icon = 'icons/obj/items/banners/banner_forked.dmi' + +/obj/item/banner/forked/get_available_decals() + return null // Current decals do not work nicely with the fork + +/obj/item/banner/pointed + name_prefix = "pointed" + hung_desc = "The banner narrows to a point at the bottom." + icon = 'icons/obj/items/banners/banner_pointed.dmi' + +/obj/item/banner/rounded + name_prefix = "rounded" + hung_desc = "The banner has a rounded lower edge." + icon = 'icons/obj/items/banners/banner_rounded.dmi' + +/obj/item/banner/square + name_prefix = "square" + hung_desc = "The banner has a squared-off lower edge." + icon = 'icons/obj/items/banners/banner_square.dmi' + +/obj/item/banner/tasselled + name_prefix = "tasselled" + hung_desc = "The banner has several dangling tassels at the bottom." + icon = 'icons/obj/items/banners/banner_tasselled.dmi' + +/obj/item/banner/woven + name_prefix = "woven" + icon = 'icons/obj/items/banners/banner_woven.dmi' + material = /decl/material/solid/organic/plantmatter/grass/dry + color = /decl/material/solid/organic/plantmatter/grass/dry::color + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + hung_desc = "The woven banner is rustic and uneven." + +/obj/item/banner/green + name = "green banner" + paint_color = COLOR_GREEN + color = COLOR_GREEN + +/obj/item/banner/red + name = "red banner" + paint_color = COLOR_RED + color = COLOR_RED + +/obj/item/banner/blue + name = "blue banner" + paint_color = COLOR_BLUE + color = COLOR_BLUE diff --git a/code/modules/banners/_banner_frame.dm b/code/modules/banners/_banner_frame.dm new file mode 100644 index 00000000000..39090a1ada7 --- /dev/null +++ b/code/modules/banners/_banner_frame.dm @@ -0,0 +1,126 @@ +/obj/structure/banner_frame + name = "banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon = 'icons/obj/structures/banner_frame.dmi' + icon_state = "banner_stand_preview" + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + anchored = TRUE + opacity = FALSE + 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 + max_health = 50 + density = TRUE + + var/force_south_facing = TRUE + var/base_icon_state = "banner_stand" + /// Reference to any banner currently hung on the frame. + var/obj/item/banner/banner + var/accepts_banner_type = /obj/item/banner + +/obj/structure/banner_frame/set_dir(ndir) + return ..(force_south_facing ? SOUTH : ndir) + +/obj/structure/banner_frame/Initialize(ml, _mat, _reinf_mat) + if(ispath(banner)) + set_banner(new banner(src)) + . = ..() + update_icon() + +/obj/structure/banner_frame/proc/set_banner(var/new_banner) + if(banner == new_banner) + return + banner = new_banner + if(banner) + name = banner.name + var/list/desc_strings = list(initial(desc), banner.hung_desc) + var/decorations = banner.get_decal_string() + if(decorations) + desc_strings += "It is decorated with [decorations]." + desc = jointext(desc_strings, " ") + else + name = initial(name) + desc = initial(desc) + update_icon() + +/obj/structure/banner_frame/attack_hand(mob/user) + if(banner && user.check_dexterity(DEXTERITY_HOLD_ITEM)) + user.put_in_hands(banner) + var/old_banner = banner + set_banner(null) + user.visible_message( + SPAN_NOTICE("\The [user] removes \the [old_banner] from \the [src]."), + SPAN_NOTICE("You remove \the [old_banner] from \the [src]."), + SPAN_NOTICE("You hear the rustling of fabric.") + ) + return TRUE + return ..() + +/obj/structure/banner_frame/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/banner)) + if(banner) + to_chat(user, SPAN_WARNING("There is already a banner hung on \the [src].")) + return TRUE + + var/obj/item/banner/other_banner = O + if(other_banner.banner_type != accepts_banner_type) + to_chat(user, SPAN_WARNING("\The [src] is not suitable for hanging \the [O].")) + return TRUE + + if(user.try_unequip(O, src)) + user.visible_message(SPAN_NOTICE("\The [user] hangs \the [O] from \the [src]."), SPAN_NOTICE("You hang \the [O] from \the [src]."), SPAN_NOTICE("You hear the rustling of fabric.")) + set_banner(O) + return TRUE + return ..() + +/obj/structure/banner_frame/dump_contents(atom/forced_loc = loc, mob/user) + if(istype(banner)) + banner.dropInto(forced_loc) + banner = null + . = ..() + +/obj/structure/banner_frame/on_update_icon() + . = ..() + + icon_state = base_icon_state + if(!istype(banner)) + return + + var/image/I = image(banner.icon, "[banner.icon_state]-hanging") + I.appearance_flags |= RESET_COLOR + I.color = banner.color + add_overlay(I) + + for(var/decl/banner_symbol/decal as anything in banner.decals) + I = image(decal.icon, decal.icon_state) + I.appearance_flags |= RESET_COLOR + I.blend_mode = BLEND_INSET_OVERLAY // Masks us to the banner icon. + if(banner.colourise_decal) + I.color = banner.decals[decal] + else + I.color = banner.color + add_overlay(I) + + if(banner.trim_color) + I = image(banner.icon, "[banner.icon_state]-trim") + I.appearance_flags |= RESET_COLOR + I.color = banner.trim_color + add_overlay(I) + +/obj/structure/banner_frame/Destroy() + if(istype(banner)) + QDEL_NULL(banner) + return ..() + +// A wall-mounted banner frame with no stand. +/obj/structure/banner_frame/wall + name = "hanging banner frame" + desc = "A sturdy frame suitable for hanging a banner." + icon_state = "banner_hanging_preview" + base_icon_state = "banner_hanging" + directional_offset = @'{"NORTH":{"y":-32},"SOUTH":{"y":-32},"EAST":{"x":-32},"WEST":{"x":-32}}' + force_south_facing = FALSE + density = FALSE diff --git a/code/modules/banners/_banner_symbols.dm b/code/modules/banners/_banner_symbols.dm new file mode 100644 index 00000000000..2de8b8a6521 --- /dev/null +++ b/code/modules/banners/_banner_symbols.dm @@ -0,0 +1,201 @@ +/decl/banner_symbol + abstract_type = /decl/banner_symbol + decl_flags = DECL_FLAG_MANDATORY_UID + /// Icon to draw from when rendering on a banner. + var/icon = 'icons/obj/items/banners/banner_symbols.dmi' + /// Icon state to draw from the icon. + var/icon_state + /// String used to select/describe a symbol + var/name + var/usable_by_banner_type = list( + /obj/item/banner + ) + +/decl/banner_symbol/validate() + . = ..() + if(!icon) + . += "null icon" + if(!istext(icon_state)) + . += "invalid/null icon_state" + if(!istext(name)) + . += "invalid/null name" + if(icon && icon_state && !check_state_in_icon(icon_state, icon)) + . += "missing icon_state '[icon_state]' from icon '[icon]'" + +// Default definitions below. +/decl/banner_symbol/starburst + name = "starburst" + icon_state = "starburst" + uid = "symbol_starburst" + +/decl/banner_symbol/fern + name = "fern" + icon_state = "fern" + uid = "symbol_fern" + +/decl/banner_symbol/snowflake + name = "snowflake" + icon_state = "snowflake" + uid = "symbol_snowflake" + +/decl/banner_symbol/sun + name = "sun" + icon_state = "sun" + uid = "symbol_sun" + +/decl/banner_symbol/scarab + name = "scarab" + icon_state = "scarab" + uid = "symbol_scarab" + +/decl/banner_symbol/triangle_chevron + name = "triangle with chevron" + icon_state = "triangle with chevron" + uid = "symbol_triangle_chevron" + +/decl/banner_symbol/triangle_down + name = "downward triangle" + icon_state = "downward triangle" + uid = "symbol_triangle_down" + +/decl/banner_symbol/triangle_up + name = "upward triangle" + icon_state = "upward triangle" + uid = "symbol_triangle_up" + +/decl/banner_symbol/hand + name = "hand" + icon_state = "hand" + uid = "symbol_hand" + +/decl/banner_symbol/sword + name = "sword" + icon_state = "sword" + uid = "symbol_sword" + +/decl/banner_symbol/knot + name = "knot" + icon_state = "knot" + uid = "symbol_knot" + +/decl/banner_symbol/circled_cup + name = "circled cup" + icon_state = "circled cup" + uid = "symbol_cup_circle" + +/decl/banner_symbol/aquila + name = "aquila" + icon_state = "aquila" + uid = "symbol_aquila" + +/decl/banner_symbol/orb + name = "orb" + icon_state = "orb" + uid = "symbol_orb" + +/decl/banner_symbol/bird_head + name = "bird head" + icon_state = "bird head" + uid = "symbol_bird_head" + +/decl/banner_symbol/deer + name = "deer" + icon_state = "deer" + uid = "symbol_deer" + +/decl/banner_symbol/deer_antler + name = "antlered deer" + icon_state = "antlered deer" + uid = "symbol_deer_antler" + +/decl/banner_symbol/duck + name = "duck head" + icon_state = "duck head" + uid = "symbol_duck_head" + +/decl/banner_symbol/frog + name = "frog" + icon_state = "frog" + uid = "symbol_frog" + +/decl/banner_symbol/fish + name = "fish" + icon_state = "fish" + uid = "symbol_fish" + +/decl/banner_symbol/bird + name = "bird" + icon_state = "bird" + uid = "symbol_bird" + +/decl/banner_symbol/cross + name = "cross" + icon_state = "cross" + uid = "symbol_cross" + +/decl/banner_symbol/sign + icon = 'icons/obj/items/banners/sign_symbols.dmi' + abstract_type = /decl/banner_symbol/sign + usable_by_banner_type = list( + /obj/item/banner/sign + ) + +/decl/banner_symbol/sign/mug + name = "mug" + icon_state = "mug" + uid = "symbol_sign_mug" + +/decl/banner_symbol/sign/scales + name = "scales" + icon_state = "scales" + uid = "symbol_sign_scales" + +/decl/banner_symbol/sign/mortar_pestle + name = "mortar and pestle" + icon_state = "mortar and pestle" + uid = "symbol_sign_mortar_pestle" + +/decl/banner_symbol/sign/pick_shovel + name = "pick and shovel" + icon_state = "pick and shovel" + uid = "symbol_sign_pick_shovel" + +/decl/banner_symbol/sign/face + name = "face" + icon_state = "face" + uid = "symbol_sign_face" + +/decl/banner_symbol/sign/crescent + name = "crescent" + icon_state = "crescent" + uid = "symbol_sign_crescent" + +/decl/banner_symbol/sign/vial + name = "vial" + icon_state = "vial" + uid = "symbol_sign_vial" + +/decl/banner_symbol/sign/spool + name = "spool" + icon_state = "spool" + uid = "symbol_sign_spool" + +/decl/banner_symbol/sign/pawnbroker + name = "pawnbroker" + icon_state = "pawnbroker" + uid = "symbol_sign_pawnbroker" + +/decl/banner_symbol/sign/sword + name = "sword" + icon_state = "sword" + uid = "symbol_sign_sword" + +/decl/banner_symbol/sign/cross + name = "cross" + icon_state = "cross" + uid = "symbol_sign_cross" + +/decl/banner_symbol/sign/circle + name = "circle" + icon_state = "circle" + uid = "symbol_sign_circle" diff --git a/code/modules/banners/banner_frame_definitions.dm b/code/modules/banners/banner_frame_definitions.dm new file mode 100644 index 00000000000..cf09eaf4652 --- /dev/null +++ b/code/modules/banners/banner_frame_definitions.dm @@ -0,0 +1,57 @@ +// Mapping helpers below. +/obj/structure/banner_frame/blue + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color // Mapping preview colour. + +/obj/structure/banner_frame/red + banner = /obj/item/banner/red + color = /obj/item/banner/red::color + +/obj/structure/banner_frame/green + banner = /obj/item/banner/green + color = /obj/item/banner/green::color + +/obj/structure/banner_frame/wall/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/banner_frame/wall/ebony/red + banner = /obj/item/banner/red + color = /obj/item/banner/red::color // Mapping preview colour. + +/obj/structure/banner_frame/wall/ebony/blue + banner = /obj/item/banner/blue + color = /obj/item/banner/blue::color + +/obj/structure/banner_frame/wall/ebony/green + banner = /obj/item/banner/green + color = /obj/item/banner/green::color + +/obj/structure/banner_frame/wall/ebony/woven + banner = /obj/item/banner/woven + color = /obj/item/banner/woven::color + +// Debug item. +/obj/structure/banner_frame/random/Initialize(ml, _mat, _reinf_mat) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/random/LateInitialize() + ..() + var/banner_type = pick(list( + /obj/item/banner/pointed, + /obj/item/banner/rounded, + /obj/item/banner/square, + /obj/item/banner/tasselled, + /obj/item/banner/woven + )) + var/obj/item/banner/new_banner = new banner_type(src) + new_banner.set_color(get_random_colour()) + new_banner.trim_color = get_random_colour() + var/list/available_decals = new_banner.get_available_decals() + if(length(available_decals)) + var/decal = pick(available_decals) + var/decal_color = get_random_colour() + LAZYSET(new_banner.decals, decal, decal_color) + new_banner.update_icon() + set_banner(new_banner) diff --git a/code/modules/banners/sign.dm b/code/modules/banners/sign.dm new file mode 100644 index 00000000000..835a8842427 --- /dev/null +++ b/code/modules/banners/sign.dm @@ -0,0 +1,25 @@ +/obj/item/banner/sign + name = "sign" + banner_type = /obj/item/banner/sign + embroiderable = FALSE + icon = 'icons/obj/items/banners/sign.dmi' + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color + hung_desc = "The sign is unadorned." + colourise_decal = FALSE + +/obj/item/banner/sign/attackby(obj/item/used_item, mob/user) + if(IS_KNIFE(used_item) && user.check_intent(I_FLAG_HELP)) + var/available_decals = get_available_decals() + if(!length(available_decals) || length(decals)) + to_chat(user, SPAN_WARNING("\The [src] is already as decorated as it can be.")) + return TRUE + var/decal_to_add = input(user, "Which symbol do you wish to add to \the [src]?", "Sign Symbol") as null|anything in available_decals + if(decal_to_add && CanPhysicallyInteract(user) && !length(decals) && user.get_active_held_item() == used_item) + decals[decal_to_add] = COLOR_WHITE + return TRUE + . = ..() + +/obj/item/banner/sign/random/Initialize(ml, material_key) + material = pick(typesof(/decl/material/solid/organic/wood)) + . = ..() diff --git a/code/modules/banners/sign_post.dm b/code/modules/banners/sign_post.dm new file mode 100644 index 00000000000..d1d0f959023 --- /dev/null +++ b/code/modules/banners/sign_post.dm @@ -0,0 +1,32 @@ +// what is a sign, if not a wooden banner +/obj/structure/banner_frame/sign + name = "sign post" + desc = "A post for hanging a sign." + icon = 'icons/obj/structures/sign_post.dmi' + desc = "A post for hanging a sign." + base_icon_state = "sign" + accepts_banner_type = /obj/item/banner/sign + icon_state = "sign_preview" + density = TRUE + +/obj/structure/banner_frame/sign/wall + base_icon_state = "sign_hanging" + icon_state = "sign_hanging_preview" + force_south_facing = FALSE + density = FALSE + +/obj/structure/banner_frame/sign/random/Initialize(ml, _mat, _reinf_mat) + material = pick(typesof(/decl/material/solid/organic/wood)) + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/structure/banner_frame/sign/random/LateInitialize() + . = ..() + var/obj/item/banner/new_banner = new /obj/item/banner/sign/random(src) + if(new_banner) + var/list/available_decals = new_banner.get_available_decals() + if(length(available_decals)) + var/decal = pick(available_decals) + LAZYSET(new_banner.decals, decal, COLOR_WHITE) + new_banner.update_icon() + set_banner(new_banner) diff --git a/code/modules/blob/blob.dm b/code/modules/blob/blob.dm index e8f001355f0..5de1ac052b1 100644 --- a/code/modules/blob/blob.dm +++ b/code/modules/blob/blob.dm @@ -182,11 +182,11 @@ var/damage = 0 switch(W.atom_damage_type) if(BURN) - damage = (W.get_attack_force(user) / fire_resist) + damage = (W.expend_attack_force(user) / fire_resist) if(IS_WELDER(W)) playsound(loc, 'sound/items/Welder.ogg', 100, 1) if(BRUTE) - damage = (W.get_attack_force(user) / brute_resist) + damage = (W.expend_attack_force(user) / brute_resist) take_damage(damage, W.atom_damage_type) return TRUE diff --git a/code/modules/species/species_bodytype.dm b/code/modules/bodytype/_bodytype.dm similarity index 78% rename from code/modules/species/species_bodytype.dm rename to code/modules/bodytype/_bodytype.dm index 616dd50ca55..7bb3afd7447 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/bodytype/_bodytype.dm @@ -4,70 +4,95 @@ var/global/list/bodytypes_by_category = list() decl_flags = DECL_FLAG_MANDATORY_UID abstract_type = /decl/bodytype /// Name used in general. - var/name = "default" + var/name = "default" /// Name used in preference bodytype selection. Defaults to name. var/pref_name /// Seen when examining a prosthetic limb, if non-null. var/desc + /// The base 'standard' icon set for this bodytype's organs. var/icon_base + /// A variant on icon_base for used when a limb has the mutated status. var/icon_deformed + /// An icon used to draw from for cosmetic sprite accessories. var/cosmetics_icon + /// A set of overlays to draw from when a limb has been bandaged. TODO: merge with bandage markings. var/bandages_icon - var/bodytype_flag = BODY_EQUIP_FLAG_HUMANOID - var/bodytype_category = BODYTYPE_OTHER - var/limb_icon_intensity = 1.5 + /// A flag used on clothing to determine if this bodytype can wear a given clothing item. + var/bodytype_flag = BODY_EQUIP_FLAG_HUMANOID + /// A general label for bodytypes. + var/bodytype_category = BODYTYPE_OTHER + /// A general intensity value applied to limbs during apply_limb_colouration(). + var/limb_icon_intensity + /// A set of states to use when rendering blood over the top of worn clothing. TODO: move this to item icons. var/blood_overlays - var/vulnerable_location = BP_GROIN //organ tag that can be kicked for increased pain, previously `sexybits_location`. - var/limb_blend = ICON_ADD - var/damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' - var/husk_icon = 'icons/mob/human_races/species/default_husk.dmi' - var/skeletal_icon = 'icons/mob/human_races/species/human/skeleton.dmi' - var/icon_template = 'icons/mob/human_races/species/template.dmi' // Used for mob icon generation for non-32x32 species. - var/ignited_icon = 'icons/mob/OnFire.dmi' + /// An organ tag that can be kicked for increased pain, previously `sexybits_location`. + var/vulnerable_location = BP_GROIN + /// What blend mode should be used when drawing this limb icon? + var/limb_blend = ICON_ADD + /// A set of base icons used to generate damaged states for brute/burn injuries to limbs. + var/damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' + /// An overlay applied when a mob is 'husked' via burn damage. + var/husk_icon = 'icons/mob/human_races/species/default_husk.dmi' + /// An alternate icon set to use when a mob or organ has been skeletonised. + var/skeletal_icon = 'icons/mob/human_races/species/human/skeleton.dmi' + /// Used for mob icon generation for non-32x32 species. + var/icon_template = 'icons/mob/human_races/species/template.dmi' + /// Drawn over a mob when the mob is on fire. + var/ignited_icon = 'icons/mob/OnFire.dmi' + /// Drawn over mob bodyparts when they are surgically open/retracted. + var/surgery_overlay_icon = 'icons/mob/surgery.dmi' + /// Icon to use when walking across snow, sand or mud. Separate to bloody footprints for now. + var/footprints_icon = 'icons/mob/footprints/footprints.dmi' + /// Used to retrieve bodytypes by pronoun type in get_bodytype_by_pronouns() var/associated_gender - var/appearance_flags = 0 // Appearance/display related features. - - /// Used when filing your nails. + /// Appearance/display related features. + var/appearance_flags = 0 + // Preview in prefs positioning. If null, uses defaults set on a static list in preferences.dm. + var/list/character_preview_screen_locs + /// What noun is used when filing your nails? var/nail_noun /// What tech levels should limbs of this type use/need? - var/limb_tech = @'{"biotech":2}' - var/icon_cache_uid + var/limb_tech = @'{"biotech":2}' /// Determines if eyes should render on heads using this bodytype. - var/has_eyes = TRUE + var/has_eyes = TRUE /// Prefixed to the initial name of the limb, if non-null. var/modifier_string /// Modifies min and max broken damage for the limb. - var/hardiness = 1 + var/hardiness = 1 /// Applies a slowdown value to this limb. - var/movement_slowdown = 0 + var/movement_slowdown = 0 /// Determines if this bodytype can be repaired by nanopaste, sparks when damaged, can malfunction, and can take EMP damage. - var/is_robotic = FALSE + var/is_robotic = FALSE /// For hands, determines the dexterity value passed to get_manual_dexterity(). If null, defers to species. - var/manual_dexterity = null + var/manual_dexterity = null /// Determines how the limb behaves with regards to manual attachment/detachment. - var/modular_limb_tier = MODULAR_BODYPART_INVALID - // Expected organ types per category, used only for stance checking at time of writing. - var/list/organs_by_category = list() - // Expected organ tags per category, used only for stance checking at time of writing. - var/list/organ_tags_by_category = list() - + var/modular_limb_tier = MODULAR_BODYPART_INVALID + /// Expected organ types per category, used only for stance checking at time of writing. + VAR_PRIVATE/list/_organs_by_category + /// Expected organ tags per category, used only for stance checking at time of writing. + VAR_PRIVATE/list/_organ_tags_by_category + /// A set of slot strings to modifier strings, used to modify clothing if the state is available in the icon. var/list/onmob_state_modifiers + /// An intensity value applied to limbs with this bodytype when creating the health status indicator HUD element. var/health_hud_intensity = 1 - - var/pixel_offset_x = 0 // Used for offsetting large icons. - var/pixel_offset_y = 0 // Used for offsetting large icons. - var/pixel_offset_z = 0 // Used for offsetting large icons. - - var/antaghud_offset_x = 0 // As above, but specifically for the antagHUD indicator. - var/antaghud_offset_y = 0 // As above, but specifically for the antagHUD indicator. - - var/eye_offset = 0 // Amount to shift eyes on the Y axis to correct for non-32px height. - - var/z_flags = 0 - - var/list/prone_overlay_offset = list(0, 0) // amount to shift overlays when lying - - // Per-bodytype per-zone message strings, see /mob/proc/get_hug_zone_messages + /// Used for offsetting large icons. + var/pixel_offset_x = 0 + /// Used for offsetting large icons. + var/pixel_offset_y = 0 + /// Used for offsetting large icons. + var/pixel_offset_z = 0 + /// Used to offset the antagHUD indicator for wide or tall mobs. + var/antaghud_offset_x = 0 + /// Used to offset the antagHUD indicator for wide or tall mobs. + var/antaghud_offset_y = 0 + /// Amount to shift eyes on the Y axis to correct for non-32px height. Used downstream, do not remove. + var/eye_offset = 0 + /// Used to apply flags like WIDE_LOAD to nonstandard mobs. + var/z_flags = 0 + /// Amount to shift overlays when lying. TODO: check if this is still needed with KEEP_TOGETHER + var/list/prone_overlay_offset + + /// Per-bodytype per-zone message strings, see /mob/proc/get_hug_zone_messages var/list/default_hug_message var/list/hug_messages = list( BP_L_HAND = list( @@ -88,6 +113,7 @@ var/global/list/bodytypes_by_category = list() ) ) + /// For emotes that check bodytypes for sounds, this list will partially override the general emote_sounds list. var/list/override_emote_sounds = list( "cough" = list( 'sound/voice/emotes/f_cougha.ogg', @@ -97,6 +123,8 @@ var/global/list/bodytypes_by_category = list() 'sound/voice/emotes/f_sneeze.ogg' ) ) + + /// Provides bodytype-specific sounds to emote that need them. var/list/emote_sounds = list( "whistle" = list('sound/voice/emotes/longwhistle.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle.ogg'), @@ -106,24 +134,26 @@ var/global/list/bodytypes_by_category = list() var/list/broadcast_emote_sounds = list( "swhistle" = list('sound/voice/emotes/summon_whistle.ogg') ) + + /// Sounds that play when a mob with this bodytype goes prone. var/list/bodyfall_sounds = list( 'sound/foley/meat1.ogg', 'sound/foley/meat2.ogg' ) // Used for initializing prefs/preview - var/base_color = COLOR_BLACK - var/base_eye_color = COLOR_BLACK + var/base_color = COLOR_BLACK + var/base_eye_color = COLOR_BLACK /// Used to initialize organ material - var/material = /decl/material/solid/organic/meat + var/organ_material = /decl/material/solid/organic/meat /// Used to initialize organ matter - var/list/matter = null + var/list/matter /// 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/solid/organic/meat /// A bitfield representing various bodytype-specific features. - var/body_flags = 0 + var/body_flags = 0 /// Used to modify the arterial_bleed_severity of organs. var/arterial_bleed_multiplier = 1 /// Associative list of organ_tag = "encased value". If set, sets the organ's encased var to the corresponding value; used in surgery. @@ -167,53 +197,66 @@ var/global/list/bodytypes_by_category = list() var/vision_organ /// If set, an organ with this tag is required for breathing var/breathing_organ - - var/list/override_organ_types // Used for species that only need to change one or two entries in has_organ. - + /// Used for species that only need to change one or two entries in has_organ. + var/list/override_organ_types + /// Used for comparing ages between mobs. var/age_descriptor = /datum/appearance_descriptor/age + /// Used for comparing various cosmetic properties between mobs. var/list/appearance_descriptors = list( /datum/appearance_descriptor/height = 1, /datum/appearance_descriptor/build = 1 ) - /// Losing an organ from this list will give a grace period of `vital_organ_failure_death_delay` then kill the mob. var/list/vital_organs = list(BP_BRAIN) /// The grace period before mob death when an organ in `vital_organs` is lost var/vital_organ_failure_death_delay = 25 SECONDS + /// The relative size of a mob. Consistent with ITEM_SIZE defines. var/mob_size = MOB_SIZE_MEDIUM - + /// A list of sprite accessories applied to this mob by default. var/list/default_sprite_accessories // Darksight handling /// Fractional multiplier (0 to 1) for the base alpha of the darkness overlay. A value of 1 means darkness is completely invisible. - var/eye_base_low_light_vision = 0 + var/eye_base_low_light_vision = 0 /// The lumcount (turf luminosity) threshold under which adaptive low light vision will begin processing. - var/eye_low_light_vision_threshold = 0.3 + var/eye_low_light_vision_threshold = 0.3 /// Fractional multiplier for the overall effectiveness of low light vision for this species. Caps the final alpha value of the darkness plane. - var/eye_low_light_vision_effectiveness = 0 + var/eye_low_light_vision_effectiveness = 0 /// The rate at which low light vision adjusts towards the final value, as a fractional multiplier of the difference between the current and target alphas. ie. set to 0.15 for a 15% shift towards the target value each tick. var/eye_low_light_vision_adjustment_speed = 0.15 + /// How many tiles can this mob see in the dark? Note that degree of visibility is determined by low light vision vars above, this is just the radius. + var/eye_darksight_range = 2 - // Other eye vars. - var/eye_contaminant_guard = 0 + /// Do the eyes of this bodytype protect against chlorine and such? + var/eye_contaminant_guard = 0 + /// Are the eyes of this bodytype resistant to flashes? var/eye_innate_flash_protection = FLASH_PROTECTION_NONE - var/eye_icon = 'icons/mob/human_races/species/default_eyes.dmi' - var/apply_eye_colour = TRUE - var/eye_darksight_range = 2 - var/eye_blend = ICON_ADD + /// Icon to draw eye overlays from. + var/eye_icon = 'icons/mob/human_races/species/default_eyes.dmi' + /// Do the eyes of this mob apply a pref colour like hair? + var/apply_eye_colour = TRUE + /// What blend mode is used to draw eyes onto the mob? + var/eye_blend = ICON_ADD /// Stun from blindness modifier. - var/eye_flash_mod = 1 + 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. + /// Cold damage level 1 below this point. -30 Celsium degrees + var/cold_level_1 = 243 + /// Cold damage level 2 below this point. + var/cold_level_2 = 200 + /// Cold damage level 3 below this point. + var/cold_level_3 = 120 + /// Heat damage level 1 above this point. + var/heat_level_1 = 360 + /// Heat damage level 2 above this point. + var/heat_level_2 = 400 + /// Heat damage level 3 above this point. + var/heat_level_3 = 1000 + + // Above this point, discomfort strings will be shown. var/heat_discomfort_level = 315 + // Below this point, discomfort strings will be shown. var/cold_discomfort_level = 285 /// Aesthetic messages about feeling warm. var/list/heat_discomfort_strings = list( @@ -326,6 +369,8 @@ var/global/list/bodytypes_by_category = list() ) /// Set to FALSE if the mob will update prone icon based on state rather than transform. var/rotate_on_prone = TRUE + /// Armour values used if naked. + var/list/natural_armour_values /decl/bodytype/Initialize() . = ..() @@ -372,15 +417,19 @@ var/global/list/bodytypes_by_category = list() organ_data["descriptor"] = initial(organ.name) var/organ_cat = initial(organ.organ_category) if(organ_cat) - LAZYADD(organs_by_category[organ_cat], organ) - LAZYADD(organ_tags_by_category[organ_cat], organ_tag) + LAZYINITLIST(_organs_by_category) + LAZYADD(_organs_by_category[organ_cat], organ) + LAZYINITLIST(_organ_tags_by_category) + LAZYADD(_organ_tags_by_category[organ_cat], organ_tag) for(var/organ_tag in has_organ) var/obj/item/organ/organ = has_organ[organ_tag] var/organ_cat = initial(organ.organ_category) if(organ_cat) - LAZYADD(organs_by_category[organ_cat], organ) - LAZYADD(organ_tags_by_category[organ_cat], organ_tag) + LAZYINITLIST(_organs_by_category) + LAZYADD(_organs_by_category[organ_cat], organ) + LAZYINITLIST(_organ_tags_by_category) + LAZYADD(_organ_tags_by_category[organ_cat], organ_tag) if(LAZYLEN(appearance_descriptors)) for(var/desctype in appearance_descriptors) @@ -394,13 +443,18 @@ var/global/list/bodytypes_by_category = list() appearance_descriptors.Insert(1, age.name) appearance_descriptors[age.name] = age +/decl/bodytype/proc/get_expected_organ_tags_for_category(var/category) + return LAZYACCESS(_organ_tags_by_category, category) + /decl/bodytype/proc/get_expected_organ_count_for_categories(var/list/categories) . = 0 for(var/category in categories) - if(category && (category in organs_by_category)) - . += length(organs_by_category[category]) + if(category && (category in _organs_by_category)) + . += length(_organs_by_category[category]) /decl/bodytype/proc/apply_limb_colouration(var/obj/item/organ/external/E, var/icon/applying) + if(!isnull(limb_icon_intensity)) + applying.SetIntensity(limb_icon_intensity) return applying /decl/bodytype/proc/check_dismember_type_override(var/disintegrate) @@ -570,11 +624,15 @@ var/global/list/bodytypes_by_category = list() return 220 /decl/bodytype/proc/apply_bodytype_organ_modifications(obj/item/organ/org) - if(istype(org, /obj/item/organ/external)) - var/obj/item/organ/external/E = org - E.arterial_bleed_severity *= arterial_bleed_multiplier - if(islist(apply_encased)) - E.encased = apply_encased[E.organ_tag] + if(!istype(org, /obj/item/organ/external)) + return + var/obj/item/organ/external/limb = org + limb.arterial_bleed_severity *= arterial_bleed_multiplier + if(islist(apply_encased)) + limb.encased = apply_encased[limb.organ_tag] + if(LAZYLEN(natural_armour_values)) + remove_extension(limb, /datum/extension/armor) + set_extension(limb, /datum/extension/armor, natural_armour_values) //fully_replace: If true, all existing organs will be discarded. Useful when doing mob transformations, and not caring about the existing organs /decl/bodytype/proc/create_missing_organs(mob/living/human/H, fully_replace = FALSE) @@ -717,7 +775,7 @@ var/global/list/bodytypes_by_category = list() 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) + innard.set_bodytype(type, override_material || organ_material) replacing_organs -= innard.organ_tag else limb.owner.remove_organ(innard, FALSE, FALSE, TRUE, TRUE, FALSE) @@ -748,27 +806,23 @@ var/global/list/bodytypes_by_category = list() else CRASH("get_species_temperature_threshold() called with invalid threshold value.") -/decl/bodytype/proc/get_environment_discomfort(var/mob/living/human/H, var/msg_type) +/decl/bodytype/proc/get_environment_discomfort(var/mob/living/human/victim, 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 + // If we have any items that cover both the upper and lower body, we're covered. + // This is to have parity with the original implementation, but to be honest + // it might be better to just use the non-exact checks. + var/covered = victim.get_covering_equipped_item_exact(SLOT_UPPER_BODY|SLOT_LOWER_BODY) switch(msg_type) if("cold") if(!covered && length(cold_discomfort_strings)) - to_chat(H, SPAN_DANGER(pick(cold_discomfort_strings))) + to_chat(victim, SPAN_DANGER(pick(cold_discomfort_strings))) if("heat") if(covered && length(heat_discomfort_strings)) - to_chat(H, SPAN_DANGER(pick(heat_discomfort_strings))) + to_chat(victim, SPAN_DANGER(pick(heat_discomfort_strings))) /decl/bodytype/proc/get_user_species_for_validation() for(var/species_name in get_all_species()) @@ -795,3 +849,6 @@ var/global/list/limbs_with_nails = list( /decl/bodytype/proc/get_movement_slowdown(var/mob/living/human/H) return movement_slowdown + +/decl/bodytype/proc/get_footprints_icon() + return footprints_icon diff --git a/code/modules/species/species_bodytype_abilities.dm b/code/modules/bodytype/bodytype_abilities.dm similarity index 100% rename from code/modules/species/species_bodytype_abilities.dm rename to code/modules/bodytype/bodytype_abilities.dm diff --git a/code/modules/species/species_crystalline_bodytypes.dm b/code/modules/bodytype/bodytype_crystalline.dm similarity index 93% rename from code/modules/species/species_crystalline_bodytypes.dm rename to code/modules/bodytype/bodytype_crystalline.dm index 15c0f6047bb..138d34bae56 100644 --- a/code/modules/species/species_crystalline_bodytypes.dm +++ b/code/modules/bodytype/bodytype_crystalline.dm @@ -7,7 +7,7 @@ abstract_type = /decl/bodytype/crystalline limb_tech = @'{"materials":4}' is_robotic = FALSE - material = /decl/material/solid/gemstone/crystal + organ_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 diff --git a/code/modules/species/species_bodytype_helpers.dm b/code/modules/bodytype/bodytype_helpers.dm similarity index 96% rename from code/modules/species/species_bodytype_helpers.dm rename to code/modules/bodytype/bodytype_helpers.dm index bff05c2fa81..53e30984d13 100644 --- a/code/modules/species/species_bodytype_helpers.dm +++ b/code/modules/bodytype/bodytype_helpers.dm @@ -5,9 +5,7 @@ return "Standing" /decl/bodytype/proc/get_icon_cache_uid(var/mob/H) - if(!icon_cache_uid) - icon_cache_uid = "[sequential_id(/decl/bodytype)]" - return icon_cache_uid + return uid /decl/bodytype/proc/get_bandages_icon(var/mob/living/human/H) return bandages_icon @@ -85,3 +83,6 @@ /decl/bodytype/proc/adjust_status(mob/living/target, condition, amount) return amount + +/decl/bodytype/proc/get_surgery_overlay_icon(var/mob/living/user) + return surgery_overlay_icon diff --git a/code/modules/species/species_bodytype_offsets.dm b/code/modules/bodytype/bodytype_offsets.dm similarity index 68% rename from code/modules/species/species_bodytype_offsets.dm rename to code/modules/bodytype/bodytype_offsets.dm index 6679500a3eb..0a149de8192 100644 --- a/code/modules/species/species_bodytype_offsets.dm +++ b/code/modules/bodytype/bodytype_offsets.dm @@ -4,8 +4,8 @@ each one can be in the NORTH, SOUTH, EAST, and WEST direction. Specify the x and y amounts to shift the thing for a given direction. example: - equip_adjust = list( - slot_back_str = list("[NORTH]" = list(-12, 7), "[EAST]" = list(-2, -12)) + _equip_adjust = list( + (slot_back_str) = list("[NORTH]" = list(-12, 7), "[EAST]" = list(-2, -12)) ) This would shift back items (backpacks, axes, etc.) when the mob @@ -18,21 +18,26 @@ The slots that you can use are found in items_clothing.dm and are the inventory */ /decl/bodytype - var/list/equip_adjust - var/list/equip_overlays = list() + VAR_PRIVATE/list/_equip_adjust + VAR_PRIVATE/list/equip_overlays = list() -/decl/bodytype/proc/get_equip_adjust(mob/mob) - return equip_adjust +// Will be used by changelings/shapeshifters in the future +/decl/bodytype/proc/resolve_to_equipment_bodytype(mob/living/user) + return src + +/decl/bodytype/proc/get_equip_adjustments(mob/mob) + return _equip_adjust /decl/bodytype/proc/get_offset_overlay_image(mob/mob, mob_icon, mob_state, color, slot) // If we don't actually need to offset this, don't bother with any of the generation/caching. - var/list/use_equip_adjust = get_equip_adjust(mob) + var/list/use_equip_adjust = get_equip_adjustments(mob) if(length(use_equip_adjust) && use_equip_adjust[slot] && length(use_equip_adjust[slot])) // Check the cache for previously made icons. var/modifier = mob?.get_overlay_state_modifier() var/image_key = modifier ? "[modifier]-[mob_icon]-[mob_state]-[color]-[slot]" : "generic-[mob_icon]-[mob_state]-[color]-[slot]" - if(!equip_overlays[image_key]) + var/image/copying = equip_overlays[image_key] + if(!copying) var/icon/final_I = new(icon_template) var/list/shifts = use_equip_adjust[slot] @@ -44,9 +49,15 @@ The slots that you can use are found in items_clothing.dm and are the inventory 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[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) + final_I.Insert(canvas, icon_state = mob_state, dir = use_dir) + copying = overlay_image(final_I, mob_state, color, RESET_COLOR) + equip_overlays[image_key] = copying + var/image/I = new() // We return a copy of the cached image, in case downstream procs mutate it. - I.appearance = equip_overlays[image_key] + I.appearance = copying + // For some reason icon_state is coming back null... + I.icon = copying.icon + I.icon_state = copying.icon_state return I + return overlay_image(mob_icon, mob_state, color, RESET_COLOR) diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm b/code/modules/bodytype/bodytype_prosthetic.dm similarity index 70% rename from code/modules/organs/prosthetics/prosthetics_manufacturer.dm rename to code/modules/bodytype/bodytype_prosthetic.dm index e687a696f63..c01812a7578 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer.dm +++ b/code/modules/bodytype/bodytype_prosthetic.dm @@ -1,18 +1,20 @@ /decl/bodytype/prosthetic - 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}' - 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 - appearance_flags = HAS_EYE_COLOR - eye_flash_mod = 1 - eye_darksight_range = 2 - associated_gender = null + abstract_type = /decl/bodytype/prosthetic + icon_base = 'icons/mob/human_races/cyberlimbs/robotic.dmi' + surgery_overlay_icon = null + desc = "A generic unbranded robotic prosthesis." + 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 + organ_material = /decl/material/solid/metal/steel + appearance_flags = HAS_EYE_COLOR + eye_flash_mod = 1 + eye_darksight_range = 2 + associated_gender = null + edible_reagent = null emote_sounds = list( - "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), + "whistle" = list('sound/voice/emotes/longwhistle_robot.ogg'), "qwhistle" = list('sound/voice/emotes/shortwhistle_robot.ogg'), "swhistle" = list('sound/voice/emotes/summon_whistle_robot.ogg'), "wwhistle" = list('sound/voice/emotes/wolfwhistle_robot.ogg') @@ -37,17 +39,20 @@ 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 + 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 + 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 /// Prosthetics of this type are not available in chargen unless the map has the required tech level. diff --git a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm b/code/modules/bodytype/bodytype_prosthetic_models.dm similarity index 67% rename from code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm rename to code/modules/bodytype/bodytype_prosthetic_models.dm index 64776e6aefb..d7156bf6bdc 100644 --- a/code/modules/organs/prosthetics/prosthetics_manufacturer_models.dm +++ b/code/modules/bodytype/bodytype_prosthetic_models.dm @@ -10,13 +10,18 @@ icon_base = 'icons/mob/human_races/cyberlimbs/morgan/morgan_main.dmi' modifier_string = "wooden" hardiness = 0.75 - manual_dexterity = DEXTERITY_SIMPLE_MACHINES + manual_dexterity = DEXTERITY_SIMPLE_MACHINES | DEXTERITY_HOLD_ITEM | DEXTERITY_EQUIP_ITEM | DEXTERITY_KEYBOARDS | DEXTERITY_GRAPPLE movement_slowdown = 1 is_robotic = FALSE modular_limb_tier = MODULAR_BODYPART_ANYWHERE bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/organic/wood + organ_material = /decl/material/solid/organic/wood/oak required_map_tech = MAP_TECH_LEVEL_MEDIEVAL uid = "bodytype_prosthetic_wooden" DEFINE_ROBOLIMB_MODEL_TRAITS(/decl/bodytype/prosthetic/wooden, pirate, 0, "wooden") + +// Dummy/stub prosthetic type for augment implants. +/decl/bodytype/prosthetic/augment + name = "Augment" + uid = "bodytype_prosthetic_augment" diff --git a/code/modules/species/species_bodytype_quadruped.dm b/code/modules/bodytype/bodytype_quadruped.dm similarity index 100% rename from code/modules/species/species_bodytype_quadruped.dm rename to code/modules/bodytype/bodytype_quadruped.dm diff --git a/code/modules/species/species_bodytype_random.dm b/code/modules/bodytype/bodytype_random.dm similarity index 100% rename from code/modules/species/species_bodytype_random.dm rename to code/modules/bodytype/bodytype_random.dm diff --git a/code/modules/butchery/butchery_data.dm b/code/modules/butchery/butchery_data.dm index 065f8232ef0..1cd4c1850cf 100644 --- a/code/modules/butchery/butchery_data.dm +++ b/code/modules/butchery/butchery_data.dm @@ -35,13 +35,13 @@ if(donor && product_loc) blood_splatter(product_loc, donor, large = TRUE) if(ispath(product_type, /obj/item/stack)) - LAZYADD(., new product_type(product_loc, product_amount, product_material, donor)) + LAZYADD(., new product_type(product_loc, product_amount, product_material, donor?.butchery_data, donor?.get_butchery_product_name())) else if(ispath(product_type, /obj/item/food)) for(var/i = 1 to product_amount) - LAZYADD(., new product_type(product_loc, product_material, TRUE, donor)) + LAZYADD(., new product_type(product_loc, product_material, TRUE, donor?.butchery_data, donor?.get_butchery_product_name())) else for(var/i = 1 to product_amount) - LAZYADD(., new product_type(product_loc, product_material, donor)) + LAZYADD(., new product_type(product_loc, product_material, donor?.butchery_data, donor?.get_butchery_product_name())) /decl/butchery_data/proc/harvest_skin(mob/living/donor) . = place_products(donor, skin_material, skin_amount, skin_type) diff --git a/code/modules/butchery/butchery_data_fish.dm b/code/modules/butchery/butchery_data_fish.dm index 9932fc224e8..f7f37c31878 100644 --- a/code/modules/butchery/butchery_data_fish.dm +++ b/code/modules/butchery/butchery_data_fish.dm @@ -11,6 +11,9 @@ gut_type = /obj/item/food/butchery/offal/small meat_flags = ALLERGEN_FISH +/decl/butchery_data/animal/fish/oily + meat_type = /obj/item/food/butchery/meat/fish/oily + /decl/butchery_data/animal/fish/small bone_amount = 1 skin_amount = 2 @@ -56,3 +59,27 @@ bone_amount = 30 skin_amount = 30 butchery_offset = list(-16, 0) + +/decl/butchery_data/animal/fish/mollusc + meat_name = "mollusc" + meat_type = /obj/item/food/butchery/meat/fish/mollusc + bone_material = /decl/material/solid/organic/bone/cartilage + skin_material = /decl/material/solid/organic/skin // i have no clue what mollusc skin is like aside from 'slimy' + +/decl/butchery_data/animal/fish/mollusc/clam + meat_type = /obj/item/food/butchery/meat/fish/mollusc/clam + bone_material = /decl/material/solid/organic/bone // no 'shell' material :( + +/decl/butchery_data/animal/fish/mollusc/barnacle + meat_type = /obj/item/food/butchery/meat/fish/mollusc/barnacle + bone_material = /decl/material/solid/organic/bone // maybe we just need calcium carbonate or something... limestone? + +/decl/butchery_data/animal/fish/mollusc/octopus + meat_name = "tako" + meat_type = /obj/item/food/butchery/meat/fish/octopus + stomach_type = /obj/item/food/butchery/stomach + gut_type = /obj/item/food/butchery/offal + meat_amount = 5 + bone_amount = 15 + skin_amount = 15 + must_use_hook = TRUE \ No newline at end of file diff --git a/code/modules/butchery/butchery_data_livestock.dm b/code/modules/butchery/butchery_data_livestock.dm index 00c18399232..5f5e65368fb 100644 --- a/code/modules/butchery/butchery_data_livestock.dm +++ b/code/modules/butchery/butchery_data_livestock.dm @@ -4,17 +4,13 @@ /decl/butchery_data/animal/ruminant/harvest_meat(mob/donor) var/static/list/extra_product = list( - /obj/item/food/butchery/haunch/shoulder, - /obj/item/food/butchery/haunch/shoulder, - /obj/item/food/butchery/haunch/side, - /obj/item/food/butchery/haunch/side, - /obj/item/food/butchery/haunch, - /obj/item/food/butchery/haunch + /obj/item/food/butchery/haunch/shoulder = 2, + /obj/item/food/butchery/haunch/side = 2, + /obj/item/food/butchery/haunch = 2 ) - var/create_turf = get_turf(donor) + . = list() for(var/product in extra_product) - var/food = new product(create_turf, meat_material, donor, bone_material) - LAZYADD(., food) + . += place_products(donor, meat_material, extra_product[product], product) /decl/butchery_data/animal/ruminant/goat meat_name = "chevon" diff --git a/code/modules/butchery/butchery_data_misc.dm b/code/modules/butchery/butchery_data_misc.dm index 2dc6f568ab4..54720ce3b74 100644 --- a/code/modules/butchery/butchery_data_misc.dm +++ b/code/modules/butchery/butchery_data_misc.dm @@ -4,7 +4,7 @@ meat_type = /obj/item/stack/material/rods bone_material = /decl/material/solid/metal/titanium - bone_type = /obj/item/stack/material/strut + bone_type = /obj/item/stack/material/rods skin_material = /decl/material/solid/metal/aluminium skin_type = /obj/item/stack/material/sheet/shiny @@ -28,3 +28,12 @@ gut_amount = null gut_material = null gut_type = null + +/decl/butchery_data/xeno + meat_name = "xeno" + meat_type = /obj/item/food/butchery/meat/xeno + meat_amount = 10 + skin_material = /decl/material/solid/organic/skin/insect + skin_amount = 25 + bone_material = /decl/material/solid/organic/bone/cartilage + bone_amount = 15 \ No newline at end of file diff --git a/code/modules/butchery/butchery_hook.dm b/code/modules/butchery/butchery_hook.dm index bd34f55f0c2..58945994cd8 100644 --- a/code/modules/butchery/butchery_hook.dm +++ b/code/modules/butchery/butchery_hook.dm @@ -19,7 +19,7 @@ ) tool_interaction_flags = (TOOL_INTERACTION_ANCHOR | TOOL_INTERACTION_DECONSTRUCT) parts_amount = 2 - parts_type = /obj/item/stack/material/strut + parts_type = /obj/item/stack/material/rods var/mob/living/occupant var/occupant_state = CARCASS_EMPTY @@ -35,7 +35,7 @@ name = "truss" icon_state = "improvised" secures_occupant = FALSE - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak parts_type = /obj/item/stack/material/plank /obj/structure/meat_hook/attack_hand(var/mob/user) @@ -195,12 +195,14 @@ update_icon() if(!tool?.do_tool_interaction(TOOL_KNIFE, user, src, 3 SECONDS, start_message = butchery_string, success_message = butchery_string, check_skill = SKILL_COOKING)) return FALSE - if(!QDELETED(user) && !QDELETED(last_occupant) && occupant == last_occupant && occupant_state == last_state) + if(!QDELETED(user) && !QDELETED(last_occupant) && occupant == last_occupant && occupant_state == last_state && user.get_active_held_item() == tool) var/decl/butchery_data/butchery_data = GET_DECL(occupant.butchery_data) if(!butchery_data) return FALSE + tool.add_blood(occupant) + switch(next_state) if(CARCASS_SKINNED) if(occupant.currently_has_skin()) diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index 7d2f0d8a6bb..d12b2980a3a 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -14,25 +14,55 @@ cooked_food = FOOD_RAW var/fat_material = /decl/material/solid/organic/meat/gut var/meat_name = "meat" - -/obj/item/food/butchery/Initialize(mapload, material_key, skip_plate = FALSE, mob/living/donor) - var/decl/butchery_data/butchery_decl = GET_DECL(donor?.butchery_data) - if(butchery_decl) - if(butchery_decl.meat_material) - material = butchery_decl.meat_material - fat_material = butchery_decl.gut_material - if(isnull(slice_path)) - slice_path = butchery_decl.meat_type + /// The initial butchery data to use (if a typepath), otherwise the butchery data of our donor. + var/decl/butchery_data/butchery_data + /// A multiplier for the number of slices, when autosetting from butchery_data. + var/slices_multiplier = 1 + +// This contains, specifically, initialisation code that must run before the parent call in Initialize(). +/obj/item/food/butchery/proc/initialize_butchery_data(decl/butchery_data/new_data, new_meat_name) + if(new_data) + if(ispath(new_data)) + butchery_data = GET_DECL(new_data) + else if(istype(new_data)) + butchery_data = new_data + else + PRINT_STACK_TRACE("Invalid value passed to [type], expected /decl/butchery_data, got [new_data]") + else if(ispath(butchery_data)) + butchery_data = GET_DECL(butchery_data) + if(butchery_data) + if(butchery_data.meat_material) + material = butchery_data.meat_material + fat_material = butchery_data.gut_material if(isnull(slice_num)) - slice_num = butchery_decl.meat_amount + if(slices_multiplier != 1) + slice_num = max(1, round(butchery_data.meat_amount * slices_multiplier)) + else + slice_num = butchery_data.meat_amount + if(slice_num > 0 && isnull(slice_path)) // Don't autoset a path if we're intentionally not sliceable. + slice_path = butchery_data.meat_type + // only butchery_data's meat_name, not src's meat_name, to avoid synthmeat that tastes like 'synthetic' + if(butchery_data.meat_name) + nutriment_desc = list((butchery_data.meat_name) = 10) + +/obj/item/food/butchery/Initialize(mapload, material_key, skip_plate = FALSE, decl/butchery_data/new_data, new_meat_name) + initialize_butchery_data(new_data, new_meat_name) . = ..() - if(butchery_decl) - add_allergen_flags(butchery_decl.meat_flags) - if(istype(donor)) - meat_name = donor.get_butchery_product_name() + if(butchery_data) + add_allergen_flags(butchery_data.meat_flags) + if(new_meat_name) + meat_name = new_meat_name + else if(butchery_data) + meat_name = butchery_data.meat_name || initial(meat_name) if(meat_name) set_meat_name(meat_name) +/obj/item/food/butchery/create_slice() + if(ispath(slice_path, /obj/item/food/butchery)) + return new slice_path(loc, material?.type, TRUE, butchery_data, meat_name) + else + return ..() + /obj/item/food/butchery/get_drying_state(var/obj/rack) return "meat" @@ -162,13 +192,13 @@ nutriment_amt = 5 w_class = ITEM_SIZE_SMALL slice_path = null - slice_num = null + slice_num = 0 // null means autoset, 0 means none /obj/item/food/butchery/offal/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/offal/small/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/haunch name = "haunch" @@ -179,13 +209,12 @@ w_class = ITEM_SIZE_LARGE var/bone_material = /decl/material/solid/organic/bone -/obj/item/food/butchery/haunch/Initialize(mapload, material_key, skip_plate = FALSE, mob/living/donor) - var/decl/butchery_data/butchery_decl = GET_DECL(donor?.butchery_data) - if(butchery_decl) - bone_material = butchery_decl.bone_material +/obj/item/food/butchery/haunch/initialize_butchery_data(decl/butchery_data/new_data, new_meat_name) + . = ..() // sets butchery_data for us + if(butchery_data) + bone_material = butchery_data.bone_material if(bone_material) LAZYSET(matter, bone_material, MATTER_AMOUNT_REINFORCEMENT) - . = ..() /obj/item/food/butchery/haunch/on_update_icon() ..() @@ -199,31 +228,27 @@ add_overlay(overlay_image(icon, "[icon_state]-fat", fat.color, RESET_COLOR)) /obj/item/food/butchery/haunch/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/haunch/shoulder name = "shoulder" /obj/item/food/butchery/haunch/shoulder/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/haunch/side name = "side of meat" desc = "Approximately half the torso and body of an unfortunate animal, split lengthways, cleaned, and ready for cooking." icon = 'icons/obj/food/butchery/side.dmi' w_class = ITEM_SIZE_HUGE - -/obj/item/food/butchery/haunch/side/Initialize(mapload, material_key, skip_plate = FALSE, mob/living/donor) - . = ..() - if(donor && !isnull(slice_num)) - slice_num = max(1, round(slice_num/2)) + slices_multiplier = 0.5 /obj/item/food/butchery/haunch/side/set_meat_name(new_meat_name) meat_name = new_meat_name SetName("side of [new_meat_name]") /obj/item/food/butchery/haunch/side/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow // TODO: unify with organ/internal/stomach? /obj/item/food/butchery/stomach @@ -232,12 +257,12 @@ icon = 'icons/obj/food/butchery/ruminant_stomach.dmi' material = /decl/material/solid/organic/meat/gut nutriment_amt = 8 - dried_type = /obj/item/chems/waterskin + dried_type = /obj/item/chems/glass/waterskin w_class = ITEM_SIZE_SMALL var/stomach_reagent = /decl/material/liquid/acid/stomach /obj/item/food/butchery/stomach/get_dried_product() - var/obj/item/chems/waterskin/result = ..() + var/obj/item/chems/glass/waterskin/result = ..() if(istype(result) && reagents?.total_volume) reagents.trans_to_holder(result.reagents, reagents.total_volume) return result diff --git a/code/modules/butchery/butchery_products_chopped.dm b/code/modules/butchery/butchery_products_chopped.dm index 400418476ee..64bf8d898d8 100644 --- a/code/modules/butchery/butchery_products_chopped.dm +++ b/code/modules/butchery/butchery_products_chopped.dm @@ -5,14 +5,12 @@ bitesize = 2 nutriment_amt = 1 w_class = ITEM_SIZE_TINY - -/obj/item/food/butchery/chopped/Initialize(mapload, material_key, skip_plate = FALSE) - . = ..() - slice_path = null - slice_num = null + filling_color = "#ff1c1c" + slice_path = null + slice_num = 0 // null means autoset, 0 means none /obj/item/food/butchery/chopped/set_meat_name(new_meat_name) - . = ..() + meat_name = new_meat_name if(cooked_food == FOOD_RAW) SetName("chopped raw [new_meat_name]") else diff --git a/code/modules/butchery/butchery_products_cutlet.dm b/code/modules/butchery/butchery_products_cutlet.dm index 984c8a4d583..5e05b10fecd 100644 --- a/code/modules/butchery/butchery_products_cutlet.dm +++ b/code/modules/butchery/butchery_products_cutlet.dm @@ -24,5 +24,5 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR /obj/item/food/butchery/cutlet/raw/beef - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow desc = "A thin piece of raw beef." \ No newline at end of file diff --git a/code/modules/butchery/butchery_products_meat.dm b/code/modules/butchery/butchery_products_meat.dm index 0c65f0f83eb..aa4cdbd9a51 100644 --- a/code/modules/butchery/butchery_products_meat.dm +++ b/code/modules/butchery/butchery_products_meat.dm @@ -43,44 +43,42 @@ /obj/item/food/butchery/meat/beef desc = "The classic red meat." - meat_name = "beef" + butchery_data = /decl/butchery_data/animal/ruminant/cow /obj/item/food/butchery/meat/goat desc = "Goat meat, to the uncultured." - meat_name = "chevon" + butchery_data = /decl/butchery_data/animal/ruminant/goat /obj/item/food/butchery/meat/chicken name = "piece" desc = "It tastes like you'd expect." material = /decl/material/solid/organic/meat/chicken - meat_name = "chicken" + butchery_data = /decl/butchery_data/animal/small/fowl/chicken /obj/item/food/butchery/meat/chicken/game desc = "Fresh game meat, harvested from some wild bird." - meat_name = "fowl" + butchery_data = /decl/butchery_data/animal/small/fowl /obj/item/food/butchery/meat/corgi desc = "Tastes like... well you know..." - meat_name = "dog" - + butchery_data = /decl/butchery_data/animal/corgi /obj/item/food/butchery/meat/xeno desc = "A slab of green meat. Smells like acid." icon_state = "xenomeat" - meat_name = "xeno" color = "#43de18" center_of_mass = @'{"x":16,"y":10}' bitesize = 6 + butchery_data = /decl/butchery_data/xeno /obj/item/food/butchery/meat/xeno/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/acid/polyacid, 6) - /obj/item/food/butchery/meat/bear - meat_name = "bear" desc = "A very manly slab of meat." icon_state = "bearmeat" + butchery_data = /decl/butchery_data/animal/space_bear /obj/item/food/butchery/meat/bear/populate_reagents() . = ..() diff --git a/code/modules/butchery/butchery_products_meat_fish.dm b/code/modules/butchery/butchery_products_meat_fish.dm index ae64e5d1c18..90040989b1f 100644 --- a/code/modules/butchery/butchery_products_meat_fish.dm +++ b/code/modules/butchery/butchery_products_meat_fish.dm @@ -14,8 +14,19 @@ backyard_grilling_announcement = "steams gently." slice_path = /obj/item/food/sashimi slice_num = 3 - meat_name = "fish" + butchery_data = /decl/butchery_data/animal/fish allergen_flags = ALLERGEN_FISH + var/oil_type = /decl/material/liquid/oil/fish + var/oil_amount = 2 + +/obj/item/food/butchery/meat/fish/oily + nutriment_amt = 4 + oil_amount = 4 + +/obj/item/food/butchery/meat/fish/populate_reagents() + . = ..() + if(oil_type && oil_amount > 0) + add_to_reagents(oil_type, oil_amount) /obj/item/food/butchery/meat/fish/get_meat_icons() var/static/list/meat_icons = list( @@ -44,7 +55,7 @@ backyard_grilling_product = null backyard_grilling_announcement = null slice_path = null - slice_num = null + slice_num = 0 // null means autoset, 0 means none material_alteration = MAT_FLAG_ALTERATION_NONE cooked_food = FOOD_COOKED @@ -52,36 +63,36 @@ . = ..() SetName("grilled [name]") -/obj/item/food/butchery/meat/fish/get_meat_icons() +/obj/item/food/butchery/meat/fish/grilled/get_meat_icons() var/static/list/meat_icons = list( 'icons/obj/food/butchery/fish_grilled.dmi' ) return meat_icons /obj/item/food/butchery/meat/fish/poison - meat_name = "space carp" + butchery_data = /decl/butchery_data/animal/fish/space_carp /obj/item/food/butchery/meat/fish/poison/populate_reagents() . = ..() add_to_reagents(/decl/material/liquid/carpotoxin, 6) /obj/item/food/butchery/meat/fish/shark - meat_name = "shark" + butchery_data = /decl/butchery_data/animal/fish/shark /obj/item/food/butchery/meat/fish/carp - meat_name = "carp" + butchery_data = /decl/butchery_data/animal/fish/carp /obj/item/food/butchery/meat/fish/octopus - meat_name = "tako" + butchery_data = /decl/butchery_data/animal/fish/mollusc/octopus /obj/item/food/butchery/meat/fish/mollusc name = "meat" desc = "Some slimy meat from clams or molluscs." - meat_name = "mollusc" + butchery_data = /decl/butchery_data/animal/fish/mollusc nutriment_type = /decl/material/liquid/nutriment/slime_meat /obj/item/food/butchery/meat/fish/mollusc/clam - meat_name = "clam" + butchery_data = /decl/butchery_data/animal/fish/mollusc/clam /obj/item/food/butchery/meat/fish/mollusc/barnacle - meat_name = "barnacle" + butchery_data = /decl/butchery_data/animal/fish/mollusc/barnacle diff --git a/code/modules/chat_filter/_chat_filter.dm b/code/modules/chat_filter/_chat_filter.dm index 15beabc9ba0..7e9ce18e77a 100644 --- a/code/modules/chat_filter/_chat_filter.dm +++ b/code/modules/chat_filter/_chat_filter.dm @@ -1,7 +1,7 @@ var/global/list/chat_blockers_in_use var/global/list/chat_modifiers_in_use -/hook/startup/proc/build_filter_lists() +/proc/build_filter_lists() global.chat_blockers_in_use = list() global.chat_modifiers_in_use = list() var/list/all_filters = decls_repository.get_decls_of_type(/decl/chat_filter) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 8e8c90860c4..f83344b4841 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -45,7 +45,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the client.sending |= asset_name var/job = ++client.last_asset_job - direct_output(client, browse("", "window=asset_cache_browser")) + show_browser(client, "", "window=asset_cache_browser") var/t = 0 var/timeout_time = (ASSET_CACHE_SEND_TIMEOUT * client.sending.len) + ASSET_CACHE_SEND_TIMEOUT @@ -85,7 +85,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the client.sending |= unreceived var/job = ++client.last_asset_job - direct_output(client, browse("", "window=asset_cache_browser")) + show_browser(client, "", "window=asset_cache_browser") var/t = 0 var/timeout_time = ASSET_CACHE_SEND_TIMEOUT * client.sending.len @@ -185,7 +185,7 @@ var/global/template_file_name = "all_templates.json" if(fexists(path + filename)) register_asset(filename, fcopy_rsc(path + filename)) - merge_and_register_templates() + merge_and_register_all_templates() var/list/mapnames = list() for(var/z in SSmapping.map_levels) @@ -199,13 +199,18 @@ var/global/template_file_name = "all_templates.json" common[filename] = fcopy_rsc(file_path) register_asset(filename, common[filename]) -/datum/asset/nanoui/proc/merge_and_register_templates() - var/list/templates = flist(template_dir) - for(var/filename in templates) - if(copytext(filename, length(filename)) != "/") - templates[filename] = replacetext(replacetext(file2text(template_dir + filename), "\n", ""), "\t", "") - else - templates -= filename +/datum/asset/nanoui/proc/merge_and_register_all_templates() + . = merge_templates(template_dir) + . += merge_modpack_templates() + register_templates(.) + +/datum/asset/nanoui/proc/merge_modpack_templates() + PRIVATE_PROC(TRUE) + . = list() + for(var/mod_template_dir in SSmodpacks.modpack_nanoui_directories) + . += merge_templates(mod_template_dir) + +/datum/asset/nanoui/proc/register_templates(templates) var/full_file_name = template_temp_dir + global.template_file_name if(fexists(full_file_name)) fdel(file(full_file_name)) @@ -213,6 +218,17 @@ var/global/template_file_name = "all_templates.json" to_file(template_file, json_encode(templates)) register_asset(global.template_file_name, fcopy_rsc(template_file)) +/// Handles adding a directory's templates to the compiled templates list. +/datum/asset/nanoui/proc/merge_templates(use_dir) + PRIVATE_PROC(TRUE) + var/list/templates = flist(use_dir) + for(var/filename in templates) + if(copytext(filename, length(filename)) != "/") + templates[filename] = replacetext(replacetext(file2text(use_dir + filename), "\n", ""), "\t", "") + else + templates -= filename + return templates + /datum/asset/nanoui/send(client, uncommon) if(!islist(uncommon)) uncommon = list(uncommon) @@ -223,11 +239,12 @@ var/global/template_file_name = "all_templates.json" // Note: this is intended for dev work, and is unsafe. Do not use outside of that. /datum/asset/nanoui/proc/recompute_and_resend_templates() - merge_and_register_templates() + merge_and_register_all_templates() for(var/client/C in clients) - if(C) // there are sleeps here, potentially - send_asset(C, global.template_file_name, FALSE, FALSE) - to_chat(C, SPAN_WARNING("Nanoui templates have been updated. Please close and reopen any browser windows.")) + spawn() // there are sleeps here, potentially + if(C) + send_asset(C, global.template_file_name, FALSE, FALSE) + to_chat(C, SPAN_WARNING("Nanoui templates have been updated. Please close and reopen any browser windows.")) /client/proc/resend_nanoui_templates() set category = "Debug" diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4afacdc2b06..5a4b8a07540 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -65,16 +65,6 @@ var/global/list/localhost_addresses = list( cmd_admin_pm(C, null, ticket) return - if(href_list["irc_msg"]) - if(!holder && received_irc_pm < world.time - 6000) //Worst they can do is spam IRC for 10 minutes - to_chat(usr, SPAN_WARNING("You are no longer able to use this, it's been more then 10 minutes since an admin on IRC has responded to you.")) - return - if(mute_irc) - to_chat(usr, SPAN_WARNING("You cannot use this as your client has been muted from sending messages to the admins on IRC.")) - return - cmd_admin_irc_pm(href_list["irc_msg"]) - return - if(href_list["close_ticket"]) var/datum/ticket/ticket = locate(href_list["close_ticket"]) @@ -180,7 +170,7 @@ var/global/list/localhost_addresses = list( holder.owner = src handle_staff_login() - //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) + //preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum) prefs = SScharacter_setup.preferences_datums[ckey] if(!prefs) prefs = new /datum/preferences(src) @@ -378,14 +368,10 @@ var/global/list/localhost_addresses = list( if(admin_datums[ckey] && GAME_STATE == RUNLEVEL_GAME) //Only report this stuff if we are currently playing. 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. - var/full_message = "[key_name(src)] logged out - no more staff online." - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Admin Logout (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Admin Logout (Game ID: [game_id])", "body" = "[key_name(src)] logged out - no more staff online.")) 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) - full_message = "Toggled hub visibility. The server is now invisible." - send2adminirc(full_message) - SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Automatic Hub Visibility Toggle (Game ID: [game_id])", "body" = full_message)) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Automatic Hub Visibility Toggle (Game ID: [game_id])", "body" = "Toggled hub visibility. The server is now invisible.")) //checks if a client is afk //3000 frames = 5 minutes diff --git a/code/modules/client/mouse_pointer/_mouse_pointer.dm b/code/modules/client/mouse_pointer/_mouse_pointer.dm new file mode 100644 index 00000000000..3f42c8b3f4e --- /dev/null +++ b/code/modules/client/mouse_pointer/_mouse_pointer.dm @@ -0,0 +1,67 @@ +/* + * Adds pointer entries to clients to allow for multiple sources wanting to modify the cursor at once. + * - add_mouse_pointer(pointer_type, pointer_priority, icon_index) will add or replace a pointer of the specified /decl/mouse_pointer type. + * - remove_mouse_pointer(pointer_type) will clear that entry. + * - Updates are handled automatically by adding/removing, other procs should not be used without a good reason. + */ + +/client + VAR_PRIVATE/list/_mouse_pointers + +/client/proc/clear_mouse_pointers() + if(LAZYLEN(_mouse_pointers)) + LAZYCLEARLIST(_mouse_pointers) + update_mouse_pointer() + return TRUE + return FALSE + +/client/proc/set_mouse_pointer_icon(new_cursor) + if(isnull(new_cursor)) + new_cursor = initial(mouse_pointer_icon) + if(mouse_pointer_icon != new_cursor) + mouse_pointer_icon = new_cursor + return TRUE + return FALSE + +/client/proc/add_mouse_pointer(pointer_type, pointer_priority = 1, icon_index = 1) + + // Is an identical pointer already being tracked? + var/decl/mouse_pointer/pointer_decl = ispath(pointer_type) ? GET_DECL(pointer_type) : pointer_type + if(!isnum(icon_index) || icon_index < 1 || icon_index > length(pointer_decl.icons)) + CRASH("Invalid icon_index passed to add_mouse_pointer() for [pointer_type].") + + var/pointer_icon = pointer_decl.icons[icon_index] + var/list/comparing = _mouse_pointers?[pointer_type] + if(islist(comparing) && comparing["icon"] == pointer_icon && comparing["priority"] == pointer_priority) + return FALSE + + // Update our list entry. If we have multiple pointers, sort by priority. + var/need_update = !(pointer_type in _mouse_pointers) + LAZYSET(_mouse_pointers, pointer_type, list("icon" = pointer_icon, "priority" = pointer_priority)) + if(LAZYLEN(_mouse_pointers) > 1) + _mouse_pointers = sortTim(_mouse_pointers, /proc/cmp_priority_list, TRUE) + need_update = TRUE + + // Refresh if needed. + if(need_update) + update_mouse_pointer() + +/client/proc/remove_mouse_pointer(pointer_type) + if(!_mouse_pointers?[pointer_type]) + return FALSE + var/current_pointer = _mouse_pointers[1] + LAZYREMOVE(_mouse_pointers, pointer_type) + if(pointer_type == current_pointer) + update_mouse_pointer() + return TRUE + +/client/proc/update_mouse_pointer() + if(!LAZYLEN(_mouse_pointers)) + return set_mouse_pointer_icon() + var/list/pointer = _mouse_pointers[_mouse_pointers[1]] + if(!islist(pointer)) + return set_mouse_pointer_icon() + var/set_pointer = pointer["icon"] + if(isicon(set_pointer)) + return set_mouse_pointer_icon(set_pointer) + return set_mouse_pointer_icon() diff --git a/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm b/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm new file mode 100644 index 00000000000..f03d328975a --- /dev/null +++ b/code/modules/client/mouse_pointer/mouse_pointer_definitions.dm @@ -0,0 +1,31 @@ +/decl/mouse_pointer + abstract_type = /decl/mouse_pointer + /// Icon to set on the client for this cursor. + var/list/icons + +/decl/mouse_pointer/Initialize() + . = ..() + if(icons && !islist(icons)) + icons = list(icons) + +/decl/mouse_pointer/validate() + . = ..() + if(length(icons)) + var/static/list/check_states = list( + "", + "over", + "drag", + "drop", + "all" + ) + for(var/icon in icons) + for(var/check_state in check_states) + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from icon '[icon]'" + else + . += "null or empty icon list" + +// Subtypes for use in add_mouse_pointer() below. +/decl/mouse_pointer/examine + uid = "pointer_examine" + icons = 'icons/effects/mouse_pointers/examine_pointer.dmi' diff --git a/code/modules/client/preference_setup/general/05_flavor.dm b/code/modules/client/preference_setup/general/05_flavor.dm index e34ae4c9dc3..803e65cee7c 100644 --- a/code/modules/client/preference_setup/general/05_flavor.dm +++ b/code/modules/client/preference_setup/general/05_flavor.dm @@ -54,11 +54,11 @@ if("open") pass() if("general") - var/msg = sanitize(input(usr,"Give a general description of your character. This will be shown regardless of clothing. Do not include OOC information here.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Give a general description of your character. This will be shown regardless of clothing. Do not include OOC information here.","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavor_texts[href_list["flavor_text"]] = msg else - var/msg = sanitize(input(usr,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the flavor text for your [href_list["flavor_text"]].","Flavor Text",html_decode(pref.flavor_texts[href_list["flavor_text"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavor_texts[href_list["flavor_text"]] = msg SetFlavorText(user) @@ -69,11 +69,11 @@ if("open") pass() if("Default") - var/msg = sanitize(input(usr,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the default flavour text for your robot. It will be used for any module without individual setting.","Flavour Text",html_decode(pref.flavour_texts_robot["Default"])) as message, extra = 0) if(CanUseTopic(user)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg else - var/msg = sanitize(input(usr,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0) + var/msg = sanitize(input(user,"Set the flavour text for your robot with [href_list["flavour_text_robot"]] module. If you leave this empty, default flavour text will be used for this module.","Flavour Text",html_decode(pref.flavour_texts_robot[href_list["flavour_text_robot"]])) as message, extra = 0) if(CanUseTopic(user)) pref.flavour_texts_robot[href_list["flavour_text_robot"]] = msg SetFlavourTextRobot(user) diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm index de5797080c4..f48998316cc 100644 --- a/code/modules/client/preference_setup/global/01_ui.dm +++ b/code/modules/client/preference_setup/global/01_ui.dm @@ -1,16 +1,17 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) /datum/preferences - var/clientfps = 0 - var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color - var/icon_size = 64 + var/clientfps = 0 + var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color + var/icon_size = 64 var/UI_style - var/UI_style_alpha = 255 - var/UI_style_color = COLOR_WHITE - var/UI_mouseover_alpha = 255 - var/UI_mouseover_color = COLOR_AMBER + var/UI_style_alpha = 255 + var/UI_style_color = "#8a8872" + var/UI_style_highlight_color = "#545e78" + var/UI_mouseover_alpha = 255 + var/UI_mouseover_color = COLOR_AMBER //Style for popup tooltips - var/tooltip_style = "Midnight" + var/tooltip_style = "Midnight" /datum/category_item/player_setup_item/player_global/ui name = "UI" @@ -25,26 +26,28 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) if(ui_style) pref.UI_style = ui_style.type - pref.icon_size = R.read("icon_size") - pref.UI_mouseover_color = R.read("UI_mouseover_color") - pref.UI_mouseover_alpha = R.read("UI_mouseover_alpha") - pref.UI_style_color = R.read("UI_style_color") - pref.UI_style_alpha = R.read("UI_style_alpha") - pref.ooccolor = R.read("ooccolor") - pref.clientfps = R.read("clientfps") + pref.icon_size = R.read("icon_size") + pref.UI_mouseover_color = R.read("UI_mouseover_color") + pref.UI_mouseover_alpha = R.read("UI_mouseover_alpha") + pref.UI_style_color = R.read("UI_style_color") + pref.UI_style_highlight_color = R.read("UI_style_highlight_color") + pref.UI_style_alpha = R.read("UI_style_alpha") + pref.ooccolor = R.read("ooccolor") + pref.clientfps = R.read("clientfps") /datum/category_item/player_setup_item/player_global/ui/save_preferences(datum/pref_record_writer/W) var/decl/ui_style/ui_style = GET_DECL(pref.UI_style) W.write("UI_style", ui_style.uid) - W.write("icon_size", pref.icon_size) - W.write("UI_mouseover_color", pref.UI_mouseover_color) - W.write("UI_mouseover_alpha", pref.UI_mouseover_alpha) - W.write("UI_style_color", pref.UI_style_color) - W.write("UI_style_alpha", pref.UI_style_alpha) - W.write("ooccolor", pref.ooccolor) - W.write("clientfps", pref.clientfps) + W.write("icon_size", pref.icon_size) + W.write("UI_mouseover_color", pref.UI_mouseover_color) + W.write("UI_mouseover_alpha", pref.UI_mouseover_alpha) + W.write("UI_style_color", pref.UI_style_color) + W.write("UI_style_highlight_color", pref.UI_style_highlight_color) + W.write("UI_style_alpha", pref.UI_style_alpha) + W.write("ooccolor", pref.ooccolor) + W.write("clientfps", pref.clientfps) /datum/category_item/player_setup_item/player_global/ui/sanitize_preferences() @@ -52,13 +55,14 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) for(var/decl/ui_style/style in get_ui_styles()) all_ui_style_types |= style.type - pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_style_types, all_ui_style_types[1]) - pref.UI_mouseover_color = sanitize_hexcolor(pref.UI_mouseover_color, initial(pref.UI_mouseover_color)) - pref.UI_mouseover_alpha = sanitize_integer(pref.UI_mouseover_alpha, 0, 255, initial(pref.UI_mouseover_alpha)) - pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color)) - pref.UI_style_alpha = sanitize_integer(pref.UI_style_alpha, 0, 255, initial(pref.UI_style_alpha)) - pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor)) - pref.clientfps = sanitize_integer(pref.clientfps, CLIENT_MIN_FPS, CLIENT_MAX_FPS, initial(pref.clientfps)) + pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_style_types, all_ui_style_types[1]) + pref.UI_mouseover_color = sanitize_hexcolor(pref.UI_mouseover_color, initial(pref.UI_mouseover_color)) + pref.UI_mouseover_alpha = sanitize_integer(pref.UI_mouseover_alpha, 0, 255, initial(pref.UI_mouseover_alpha)) + pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color)) + pref.UI_style_highlight_color = sanitize_hexcolor(pref.UI_style_highlight_color, initial(pref.UI_style_highlight_color)) + pref.UI_style_alpha = sanitize_integer(pref.UI_style_alpha, 0, 255, initial(pref.UI_style_alpha)) + pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor)) + pref.clientfps = sanitize_integer(pref.clientfps, CLIENT_MIN_FPS, CLIENT_MAX_FPS, initial(pref.clientfps)) if(!isnum(pref.icon_size)) pref.icon_size = initial(pref.icon_size) @@ -71,6 +75,11 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) . += "
__
" . += "reset" . += "" + . += "UI Highlight" + . += "[pref.UI_style_highlight_color]" + . += "
__
" + . += "reset" + . += "" . += "UI Opacity" . += "[pref.UI_style_alpha]" . += "reset" @@ -98,26 +107,62 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) . += "Client FPS: [pref.clientfps]
" /datum/category_item/player_setup_item/player_global/ui/OnTopic(var/href,var/list/href_list, var/mob/user) + if(href_list["select_style"]) var/decl/ui_style/current_style = GET_DECL(pref.UI_style) var/decl/ui_style/UI_style_new = input(user, "Choose UI style.", CHARACTER_PREFERENCE_INPUT_TITLE, current_style) as null|anything in get_ui_styles() - if(!istype(UI_style_new) || !CanUseTopic(user)) return TOPIC_NOACTION + if(!istype(UI_style_new) || !CanUseTopic(user)) + return TOPIC_NOACTION pref.UI_style = UI_style_new.type - return TOPIC_REFRESH + if(!isnull(UI_style_new.default_color)) + pref.UI_style_color = UI_style_new.default_color + if(!isnull(UI_style_new.default_alpha)) + pref.UI_style_alpha = UI_style_new.default_alpha + . = TOPIC_REFRESH else if(href_list["select_color"]) var/UI_style_color_new = input(user, "Choose UI color, dark colors are not recommended!", "Global Preference", pref.UI_style_color) as color|null - if(isnull(UI_style_color_new) || !CanUseTopic(user)) return TOPIC_NOACTION + if(isnull(UI_style_color_new) || !CanUseTopic(user)) + return TOPIC_NOACTION pref.UI_style_color = UI_style_color_new + . = TOPIC_REFRESH + + else if(href_list["select_highlight_color"]) + var/UI_style_highlight_color_new = input(user, "Choose UI highlight color, dark colors are not recommended!", "Global Preference", pref.UI_style_highlight_color) as color|null + if(isnull(UI_style_highlight_color_new) || !CanUseTopic(user)) return TOPIC_NOACTION + pref.UI_style_highlight_color = UI_style_highlight_color_new return TOPIC_REFRESH else if(href_list["select_alpha"]) var/UI_style_alpha_new = input(user, "Select UI alpha (transparency) level, between 50 and 255.", "Global Preference", pref.UI_style_alpha) as num|null - if(isnull(UI_style_alpha_new) || (UI_style_alpha_new < 50 || UI_style_alpha_new > 255) || !CanUseTopic(user)) return TOPIC_NOACTION + if(isnull(UI_style_alpha_new) || (UI_style_alpha_new < 50 || UI_style_alpha_new > 255) || !CanUseTopic(user)) + return TOPIC_NOACTION pref.UI_style_alpha = UI_style_alpha_new - return TOPIC_REFRESH + . = TOPIC_REFRESH + + else if(href_list["reset"]) + switch(href_list["reset"]) + if("ui") + pref.UI_style_color = initial(pref.UI_style_color) + if("highlight") + pref.UI_style_highlight_color = initial(pref.UI_style_highlight_color) + if("alpha") + pref.UI_style_alpha = initial(pref.UI_style_alpha) + if("mouseover_color") + pref.UI_mouseover_color = initial(pref.UI_mouseover_color) + if("mouseover_alpha") + pref.UI_mouseover_alpha = initial(pref.UI_mouseover_alpha) + if("ooc") + pref.ooccolor = initial(pref.ooccolor) + . = TOPIC_REFRESH - else if(href_list["select_ooc_color"]) + if(. == TOPIC_REFRESH) + // This is overkill, but we do not currently have a way to tell what elements should grab a new color or alpha. + // TODO: maybe limit or debounce/queue this? + user.hud_reset(TRUE) + return + + if(href_list["select_ooc_color"]) var/new_ooccolor = input(user, "Choose OOC color:", "Global Preference") as color|null if(new_ooccolor && can_select_ooc_color(user) && CanUseTopic(user)) pref.ooccolor = new_ooccolor @@ -142,20 +187,6 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) pref.tooltip_style = tooltip_style_new return TOPIC_REFRESH - else if(href_list["reset"]) - switch(href_list["reset"]) - if("ui") - pref.UI_style_color = initial(pref.UI_style_color) - if("alpha") - pref.UI_style_alpha = initial(pref.UI_style_alpha) - if("mouseover_color") - pref.UI_mouseover_color = initial(pref.UI_mouseover_color) - if("mouseover_alpha") - pref.UI_mouseover_alpha = initial(pref.UI_mouseover_alpha) - if("ooc") - pref.ooccolor = initial(pref.ooccolor) - return TOPIC_REFRESH - else if(href_list["select_icon_size"]) var/new_icon_size = input(user, "Enter a new default icon size.", "Default Icon Size", pref.icon_size) as null|anything in global.valid_icon_sizes if(new_icon_size && pref.icon_size != new_icon_size) diff --git a/code/modules/client/preference_setup/global/03_pai.dm b/code/modules/client/preference_setup/global/03_pai.dm index 61c82951286..aeef174d4ff 100644 --- a/code/modules/client/preference_setup/global/03_pai.dm +++ b/code/modules/client/preference_setup/global/03_pai.dm @@ -67,13 +67,13 @@ if(!isnull(t) && CanUseTopic(user)) candidate.comments = sanitize(t) if("chassis") - t = input(usr,"What would you like to use for your mobile chassis icon?") as null|anything in global.possible_chassis + t = input(user,"What would you like to use for your mobile chassis icon?") as null|anything in global.possible_chassis if(!isnull(t) && CanUseTopic(user)) candidate.chassis = t update_pai_preview(user) . = TOPIC_HARD_REFRESH if("say") - t = input(usr,"What theme would you like to use for your speech verbs?") as null|anything in global.possible_say_verbs + t = input(user,"What theme would you like to use for your speech verbs?") as null|anything in global.possible_say_verbs if(!isnull(t) && CanUseTopic(user)) candidate.say_verb = t if("cyclebg") diff --git a/code/modules/client/preference_setup/loadout/lists/accessories.dm b/code/modules/client/preference_setup/loadout/lists/accessories.dm index 7f43717605b..739dc589b36 100644 --- a/code/modules/client/preference_setup/loadout/lists/accessories.dm +++ b/code/modules/client/preference_setup/loadout/lists/accessories.dm @@ -51,6 +51,32 @@ path = /obj/item/clothing/neck/necklace loadout_flags = GEAR_HAS_COLOR_SELECTION uid = "gear_accessory_necklace" + var/list/available_materials = list( + /decl/material/solid/metal/steel, + /decl/material/solid/metal/bronze, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/gold, + /decl/material/solid/metal/platinum + ) + +/decl/loadout_option/accessory/necklace/get_gear_tweak_options() + . = ..() + LAZYINITLIST(.[/datum/gear_tweak/path]) + .[/datum/gear_tweak/path] |= list( + "necklace" = /obj/item/clothing/neck/necklace, + "necklace, square pendant" = /obj/item/clothing/neck/necklace/square, + "necklace, frill" = /obj/item/clothing/neck/necklace/frill, + "necklace, cross pendant" = /obj/item/clothing/neck/necklace/cross, + "necklace, diamond pendant" = /obj/item/clothing/neck/necklace/diamond, + "necklace, ornate" = /obj/item/clothing/neck/necklace/ornate + ) + if(length(available_materials)) + for(var/mat in available_materials) + var/decl/material/mat_decl = GET_DECL(mat) + available_materials -= mat + available_materials[mat_decl.name] = mat + LAZYINITLIST(.[/datum/gear_tweak/material]) + .[/datum/gear_tweak/material] = available_materials /decl/loadout_option/accessory/bow name = "bowtie, horrible" diff --git a/code/modules/client/preference_setup/loadout/lists/gloves.dm b/code/modules/client/preference_setup/loadout/lists/gloves.dm index 94387e8dee2..c923ba47b6b 100644 --- a/code/modules/client/preference_setup/loadout/lists/gloves.dm +++ b/code/modules/client/preference_setup/loadout/lists/gloves.dm @@ -24,20 +24,39 @@ path = /obj/item/clothing/gloves/ring cost = 2 uid = "gear_gloves_ring" + var/list/available_materials = list( + /decl/material/solid/metal/steel, + /decl/material/solid/metal/bronze, + /decl/material/solid/metal/silver, + /decl/material/solid/metal/gold, + /decl/material/solid/metal/platinum, + /decl/material/solid/glass, + /decl/material/solid/organic/plastic, + /decl/material/solid/organic/wood/oak, + /decl/material/solid/organic/wood/bamboo, + /decl/material/solid/organic/wood/ebony, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/maple, + /decl/material/solid/organic/wood/walnut, + /decl/material/solid/organic/wood/yew + ) /decl/loadout_option/ring/get_gear_tweak_options() . = ..() LAZYINITLIST(.[/datum/gear_tweak/path]) .[/datum/gear_tweak/path] |= list( - "engagement ring" = /obj/item/clothing/gloves/ring/engagement, - "signet ring" = /obj/item/clothing/gloves/ring/seal/signet, - "masonic ring" = /obj/item/clothing/gloves/ring/seal/mason, - "ring, steel" = /obj/item/clothing/gloves/ring/material/steel, - "ring, bronze" = /obj/item/clothing/gloves/ring/material/bronze, - "ring, silver" = /obj/item/clothing/gloves/ring/material/silver, - "ring, gold" = /obj/item/clothing/gloves/ring/material/gold, - "ring, platinum" = /obj/item/clothing/gloves/ring/material/platinum, - "ring, glass" = /obj/item/clothing/gloves/ring/material/glass, - "ring, wood" = /obj/item/clothing/gloves/ring/material/wood, - "ring, plastic" = /obj/item/clothing/gloves/ring/material/plastic + "ring" = /obj/item/clothing/gloves/ring/gold, + "ring, thin" = /obj/item/clothing/gloves/ring/thin, + "ring, thick" = /obj/item/clothing/gloves/ring/thick, + "ring, split" = /obj/item/clothing/gloves/ring/split, + "engagement ring" = /obj/item/clothing/gloves/ring/engagement, + "signet ring" = /obj/item/clothing/gloves/ring/seal/signet, + "masonic ring" = /obj/item/clothing/gloves/ring/seal/mason ) + if(length(available_materials)) + for(var/mat in available_materials) + var/decl/material/mat_decl = GET_DECL(mat) + available_materials -= mat + available_materials[mat_decl.name] = mat + LAZYINITLIST(.[/datum/gear_tweak/material]) + .[/datum/gear_tweak/material] = available_materials diff --git a/code/modules/client/preference_setup/loadout/lists/misc.dm b/code/modules/client/preference_setup/loadout/lists/misc.dm index 5db0b1b2e4c..064cd91dfae 100644 --- a/code/modules/client/preference_setup/loadout/lists/misc.dm +++ b/code/modules/client/preference_setup/loadout/lists/misc.dm @@ -9,7 +9,7 @@ var/list/available_materials = list( /decl/material/solid/metal/aluminium, /decl/material/solid/organic/plastic, - /decl/material/solid/organic/wood, + /decl/material/solid/organic/wood/oak, /decl/material/solid/organic/wood/bamboo, /decl/material/solid/organic/wood/ebony, /decl/material/solid/organic/wood/mahogany, diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8e156896877..f7bf90cf83b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -295,7 +295,7 @@ var/global/list/time_prefs_fixed = list() return if(href_list["preference"] == "open_whitelist_forum") if(get_config_value(/decl/config/text/forumurl)) - direct_output(user, link(get_config_value(/decl/config/text/forumurl))) + open_link(user, get_config_value(/decl/config/text/forumurl)) else to_chat(user, "The forum URL is not set in the server configuration.") return @@ -381,7 +381,6 @@ var/global/list/time_prefs_fixed = list() character.set_gender(gender) character.blood_type = blood_type - character.set_skin_colour(skin_colour, skip_update = TRUE) character.skin_tone = skin_tone @@ -501,7 +500,7 @@ var/global/list/time_prefs_fixed = list() key_bindings = deepCopyList(global.hotkey_keybinding_list_by_key) if(istype(client)) - // Preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum). + // Preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum). SScharacter_setup.preferences_datums[client.ckey] = src setup() diff --git a/code/modules/client/ui_styles/_helpers.dm b/code/modules/client/ui_styles/_helpers.dm index 36685c53f35..97d99ab4f2f 100644 --- a/code/modules/client/ui_styles/_helpers.dm +++ b/code/modules/client/ui_styles/_helpers.dm @@ -6,24 +6,7 @@ LAZYADD(., ui) /proc/get_default_ui_icon(ui_key) - var/static/list/default_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/midnight/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/midnight/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/midnight/hands.dmi', - UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', - UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', - UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/midnight/interaction.dmi', - UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/midnight/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/midnight/movement.dmi', - UI_ICON_NUTRITION = 'icons/mob/screen/styles/nutrition.dmi', - UI_ICON_STATUS = 'icons/mob/screen/styles/status.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/midnight/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/midnight/zone_selector.dmi' - ) - return istext(ui_key) ? default_icons[ui_key] : null + return get_ui_icon(global.using_map.default_ui_style, ui_key) /proc/get_ui_icon(ui_style, ui_key) var/decl/ui_style/style = GET_DECL(ui_style) diff --git a/code/modules/client/ui_styles/_ui_style.dm b/code/modules/client/ui_styles/_ui_style.dm index 24e3d908516..d7a51a45f87 100644 --- a/code/modules/client/ui_styles/_ui_style.dm +++ b/code/modules/client/ui_styles/_ui_style.dm @@ -13,7 +13,6 @@ UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', UI_ICON_INTERACTION = 'icons/mob/screen/styles/midnight/interaction.dmi', UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', UI_ICON_INVENTORY = 'icons/mob/screen/styles/midnight/inventory.dmi', @@ -27,6 +26,12 @@ ) /// A subset of UI keys to icon files used to override the above. var/list/override_icons + /// A color to reset this UI to on pref selection. + var/default_color = COLOR_WHITE + /// An alpha to reset this UI to on pref selection. + var/default_alpha = 255 + var/use_overlay_color = FALSE + var/use_ui_color = FALSE /decl/ui_style/Initialize() for(var/ui_key in override_icons) @@ -47,11 +52,16 @@ var/check_icon = icons[ui_key] var/list/missing_states = list() var/list/checking_states = states_to_check[ui_key] - var/list/remaining_states = icon_states(check_icon) + var/list/remaining_states = get_states_in_icon(check_icon) for(var/check_state in checking_states) remaining_states -= check_state - if(!check_state_in_icon(check_state, check_icon)) + if(check_state_in_icon(check_state, check_icon)) + check_state = "[check_state]-overlay" + if(check_state_in_icon(check_state, check_icon)) + remaining_states -= check_state + else missing_states |= check_state + if(length(remaining_states)) . += "icon [check_icon] for key [ui_key] has extraneous states: '[jointext(remaining_states, "', '")]'" if(length(missing_states)) diff --git a/code/modules/client/ui_styles/_ui_style_states.dm b/code/modules/client/ui_styles/_ui_style_states.dm index bac1d053713..881a423335e 100644 --- a/code/modules/client/ui_styles/_ui_style_states.dm +++ b/code/modules/client/ui_styles/_ui_style_states.dm @@ -10,7 +10,6 @@ var/global/list/_ui_all_keys = list( UI_ICON_NUTRITION, UI_ICON_HYDRATION, UI_ICON_FIRE_INTENT, - UI_ICON_INTENT, UI_ICON_UP_HINT, UI_ICON_STATUS, UI_ICON_STATUS_FIRE, @@ -73,14 +72,6 @@ var/global/list/_ui_expected_states "hydration3", "hydration4" ), - UI_ICON_INTENT = list( - "intent_all", - "intent_help", - "intent_disarm", - "intent_grab", - "intent_harm", - "intent_none" - ), UI_ICON_INTERACTION = list( "act_resist", "act_throw_off", diff --git a/code/modules/client/ui_styles/ui_style_subtypes.dm b/code/modules/client/ui_styles/ui_style_subtypes.dm index 7fbd15f6c0d..7b1f311ebd7 100644 --- a/code/modules/client/ui_styles/ui_style_subtypes.dm +++ b/code/modules/client/ui_styles/ui_style_subtypes.dm @@ -7,69 +7,97 @@ name = "Orange" uid = "ui_style_orange" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/orange/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/orange/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/orange/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/orange/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/orange/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/orange/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/orange/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/orange/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/orange/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/orange/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/orange/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/orange/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/orange/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/orange/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/orange/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/orange/zone_selector.dmi' ) /decl/ui_style/old name = "Old" uid = "ui_style_old" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/old/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/old/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/old/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/old/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/old/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/old/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/old/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/old/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/old/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/old/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/old/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/old/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/old/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/old/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/old/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/old/zone_selector.dmi' ) /decl/ui_style/old_noborder name = "Old (no border)" uid = "ui_style_old_noborder" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/old/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/old/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/old/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/old/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/old_noborder/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/old/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/old_noborder/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/old_noborder/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/old/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/old/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/old/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/old/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/old_noborder/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/old/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/old_noborder/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/old_noborder/zone_selector.dmi' ) /decl/ui_style/white name = "White" uid = "ui_style_white" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/white/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/white/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/white/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/white/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/white/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/white/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/white/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/white/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/white/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/white/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/white/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/white/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/white/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/white/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/white/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/white/zone_selector.dmi' ) + use_overlay_color = TRUE + use_ui_color = TRUE /decl/ui_style/minimalist name = "Minimalist" uid = "ui_style_minimalist" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/minimalist/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/minimalist/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/minimalist/hands.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/minimalist/intents.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/minimalist/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/minimalist/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/minimalist/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/minimalist/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/minimalist/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/minimalist/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/minimalist/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/minimalist/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/minimalist/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/minimalist/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/minimalist/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/minimalist/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/minimalist/zone_selector.dmi' ) + use_overlay_color = TRUE + use_ui_color = TRUE + +/decl/ui_style/underworld + name = "Underworld" + uid = "ui_style_underworld" + restricted = FALSE + icons = list( + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/underworld/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/underworld/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/underworld/hands.dmi', + (UI_ICON_HEALTH) = 'icons/mob/screen/styles/health.dmi', + (UI_ICON_CRIT_MARKER) = 'icons/mob/screen/styles/crit_markers.dmi', + (UI_ICON_HYDRATION) = 'icons/mob/screen/styles/hydration.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/underworld/interaction.dmi', + (UI_ICON_INTERNALS) = 'icons/mob/screen/styles/internals.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/underworld/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/underworld/movement.dmi', + (UI_ICON_NUTRITION) = 'icons/mob/screen/styles/nutrition.dmi', + (UI_ICON_STATUS_FIRE) = 'icons/mob/screen/styles/status_fire.dmi', + (UI_ICON_STATUS) = 'icons/mob/screen/styles/status.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/underworld/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/underworld/zone_selector.dmi', + (UI_ICON_CHARGE) = 'icons/mob/screen/styles/charge.dmi' + ) + use_overlay_color = TRUE + use_ui_color = TRUE diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index ba08599120f..684f8196ac2 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -9,7 +9,6 @@ icon_state = ICON_STATE_WORLD _base_attack_force = 3 - var/wizard_garb = 0 var/flash_protection = FLASH_PROTECTION_NONE // Sets the item's level of flash protection. var/tint = TINT_NONE // Sets the item's level of visual impairment tint. var/bodytype_equip_flags // Bitfields; if null, checking is skipped. Determine if a given mob can equip this item or not. @@ -39,6 +38,9 @@ var/markings_color // for things like colored parts of labcoats or shoes var/should_display_id = TRUE var/fallback_slot + // Used to track our icon, or custom icon, for resetting when accessories are added/removed + var/base_clothing_icon + var/base_clothing_state /obj/item/clothing/get_equipment_tint() return tint @@ -98,7 +100,7 @@ /obj/item/clothing/attackby(obj/item/I, mob/user) var/rags = RAG_COUNT(src) - if(istype(material) && material.default_solid_form && rags && (I.edge || I.sharp) && user.a_intent == I_HURT) + if(istype(material) && material.default_solid_form && rags && (I.is_sharp() || I.has_edge()) && user.check_intent(I_FLAG_HARM)) if(length(accessories)) to_chat(user, SPAN_WARNING("You should remove the accessories attached to \the [src] first.")) return TRUE @@ -206,30 +208,40 @@ ndir = SOUTH return ..() +/obj/item/clothing/proc/should_use_combined_accessory_appearance() + for(var/obj/item/clothing/accessory as anything in accessories) + if(accessory.draw_on_mob_when_equipped) + return TRUE + return FALSE + /obj/item/clothing/on_update_icon() . = ..() // Clothing does not generally align with each other's world icons, so we just use the mob overlay in this case. - var/set_appearance = FALSE - if(length(accessories)) + if(should_use_combined_accessory_appearance()) var/image/I = get_mob_overlay(ismob(loc) ? loc : null, get_fallback_slot()) - if(I) + if(I?.icon) // Null or invisible overlay, we don't want to make our clothing invisible just because it has an accessory. I.plane = plane I.layer = layer - I.alpha = alpha I.color = color - I.name = name + I.alpha = alpha + I.name = name appearance = I set_dir(SOUTH) - set_appearance = TRUE - if(!set_appearance) - icon_state = JOINTEXT(list(get_world_inventory_state(), get_clothing_state_modifier())) - if(markings_state_modifier && markings_color) - add_overlay(mutable_appearance(icon, "[icon_state][markings_state_modifier]", markings_color)) - + update_clothing_icon() + return + + if(!base_clothing_icon) + base_clothing_icon = initial(icon) + set_icon(base_clothing_icon) + if(!base_clothing_state) + base_clothing_state = initial(icon_state) + set_icon_state(base_clothing_state) + icon_state = JOINTEXT(list(get_world_inventory_state(), get_clothing_state_modifier())) + if(markings_state_modifier && markings_color) + add_overlay(mutable_appearance(icon, "[icon_state][markings_state_modifier]", markings_color)) update_clothing_icon() - // 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) @@ -290,12 +302,12 @@ update_clothing_icon() /obj/item/clothing/get_examine_name() - var/list/ensemble = list(name) + var/list/ensemble = list(..()) for(var/obj/item/clothing/accessory in accessories) if(accessory.accessory_visibility == ACCESSORY_VISIBILITY_ENSEMBLE) - LAZYADD(ensemble, accessory.get_examine_name()) - if(length(ensemble) <= 1) - return ..() + ensemble += accessory.get_examine_name() + if(length(ensemble) == 1) // don't worry about it being empty, we always have a minimum of one + return ensemble[1] return english_list(ensemble, summarize = TRUE) /obj/item/clothing/get_examine_line() @@ -359,7 +371,7 @@ var/list/ties = list() for(var/accessory in accessories) ties += "[html_icon(accessory)] \a [accessory]" - to_chat(user, "Attached to \the [src] are [english_list(ties)].") + to_chat(user, "Attached to \the [src] [length(ties) == 1 ? "is" : "are"] [english_list(ties)].") return TOPIC_HANDLED if(href_list["list_armor_damage"] && can_see) var/datum/extension/armor/ablative/armor_datum = get_extension(src, /datum/extension/armor) @@ -438,7 +450,8 @@ /decl/interaction_handler/clothing_set_sensors name = "Set Sensors Level" expected_target_type = /obj/item/clothing + examine_desc = "adjust vitals sensors" /decl/interaction_handler/clothing_set_sensors/invoked(atom/target, mob/user, obj/item/prop) - var/obj/item/clothing/U = target - U.set_sensors(user) + var/obj/item/clothing/clothes = target + clothes.set_sensors(user) diff --git a/code/modules/clothing/_clothing_accessories.dm b/code/modules/clothing/_clothing_accessories.dm index 81e9d41a80a..0469f605d01 100644 --- a/code/modules/clothing/_clothing_accessories.dm +++ b/code/modules/clothing/_clothing_accessories.dm @@ -216,7 +216,8 @@ accessory_visibility = clothes.accessory_visibility accessory_slowdown = clothes.accessory_slowdown mimicking_state_modifiers = TRUE - clothing_state_modifiers = clothes.clothing_state_modifiers?.Copy() + clothing_state_modifiers = clothes.clothing_state_modifiers?.Copy() + bodytype_equip_flags = clothes.bodytype_equip_flags else accessory_hide_on_states = get_initial_accessory_hide_on_states() accessory_slot = initial(accessory_slot) @@ -225,5 +226,6 @@ accessory_slowdown = initial(accessory_slowdown) mimicking_state_modifiers = FALSE clothing_state_modifiers = null + bodytype_equip_flags = initial(bodytype_equip_flags) update_clothing_state_toggles() diff --git a/code/modules/clothing/badges/_badge.dm b/code/modules/clothing/badges/_badge.dm index d4767634d08..c894afd0e08 100644 --- a/code/modules/clothing/badges/_badge.dm +++ b/code/modules/clothing/badges/_badge.dm @@ -58,7 +58,7 @@ user.visible_message("[user] displays their [src.name].\nIt reads: [badge_string].","You display your [src.name]. It reads: [badge_string].") /obj/item/clothing/badge/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(isliving(user) && user.a_intent == I_HURT) + if(isliving(user) && user.check_intent(I_FLAG_HARM)) user.visible_message( SPAN_DANGER("\The [user] invades \the [target]'s personal space, thrusting \the [src] into their face insistently."), SPAN_DANGER("You invade \the [target]'s personal space, thrusting \the [src] into their face insistently.") diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 4f05723b4e1..4a85cb47cef 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -3,28 +3,24 @@ //***************** /obj/item/proc/disguise(var/newtype, var/mob/user) - if(!user || !CanPhysicallyInteract(user)) - return - //this is necessary, unfortunately, as initial() does not play well with list vars - var/obj/item/copy = new newtype(null) - desc = copy.desc - name = copy.name - icon = copy.icon - color = copy.color - icon_state = copy.icon_state - item_state = copy.item_state - body_parts_covered = copy.body_parts_covered - flags_inv = copy.flags_inv - set_gender(copy.gender) - if(copy.sprite_sheets) - sprite_sheets = copy.sprite_sheets.Copy() - - OnDisguise(copy, user) - qdel(copy) + if(user && CanPhysicallyInteract(user)) + return OnDisguise(atom_info_repository.get_instance_of(newtype), user) + return FALSE // Subtypes shall override this, not /disguise() /obj/item/proc/OnDisguise(var/obj/item/copy, var/mob/user) - return + . = istype(copy) && !QDELETED(copy) + if(.) + desc = copy.desc + name = copy.name + icon = copy.icon + color = copy.color + icon_state = copy.icon_state + item_state = copy.item_state + body_parts_covered = copy.body_parts_covered + sprite_sheets = copy.sprite_sheets?.Copy() + flags_inv = copy.flags_inv + set_gender(copy.gender) /proc/generate_chameleon_choices(var/basetype) . = list() @@ -102,6 +98,7 @@ desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist." origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + bodytype_equip_flags = null var/static/list/clothing_choices /obj/item/clothing/jumpsuit/chameleon/Initialize() @@ -137,6 +134,7 @@ origin_tech = @'{"esoteric":3}' body_parts_covered = 0 item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + bodytype_equip_flags = null var/static/list/clothing_choices /obj/item/clothing/head/chameleon/Initialize() @@ -166,6 +164,7 @@ desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change its appearance, but offering no protection. It seems to have a small dial inside." origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + bodytype_equip_flags = null var/static/list/clothing_choices /obj/item/clothing/suit/chameleon/Initialize() @@ -194,6 +193,7 @@ 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}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + bodytype_equip_flags = null var/static/list/clothing_choices /obj/item/clothing/shoes/chameleon/Initialize() @@ -257,6 +257,7 @@ desc = "It looks like a pair of gloves, but it seems to have a small dial inside." origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + bodytype_equip_flags = null var/static/list/clothing_choices /obj/item/clothing/gloves/chameleon/Initialize() @@ -286,6 +287,7 @@ desc = "It looks like a plain gask mask, but on closer inspection, it seems to have a small dial inside." origin_tech = @'{"esoteric":3}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + bodytype_equip_flags = null var/static/list/clothing_choices /obj/item/clothing/mask/chameleon/Initialize() @@ -315,6 +317,7 @@ 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}' item_flags = ITEM_FLAG_INVALID_FOR_CHAMELEON + bodytype_equip_flags = null var/static/list/clothing_choices /obj/item/clothing/glasses/chameleon/Initialize() diff --git a/code/modules/clothing/clothing_state/clothing_state_buttons.dm b/code/modules/clothing/clothing_state/clothing_state_buttons.dm index 74c9fe7e444..05b531f2639 100644 --- a/code/modules/clothing/clothing_state/clothing_state_buttons.dm +++ b/code/modules/clothing/clothing_state/clothing_state_buttons.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/buttons name = "Toggle Open Or Closed" state_decl_type = /decl/clothing_state_modifier/buttons + examine_desc = "fasten or undo $TARGET_THEIR$ buttons" /obj/item/clothing/proc/toggle_buttons_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_hood.dm b/code/modules/clothing/clothing_state/clothing_state_hood.dm index 281174461bd..81ddc6301dc 100644 --- a/code/modules/clothing/clothing_state/clothing_state_hood.dm +++ b/code/modules/clothing/clothing_state/clothing_state_hood.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/hood name = "Adjust Hood" state_decl_type = /decl/clothing_state_modifier/hood + examine_desc = "push the hood up or down" /obj/item/clothing/proc/toggle_hood_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_rolled.dm b/code/modules/clothing/clothing_state/clothing_state_rolled.dm index 84d9f8ade84..f368481918f 100644 --- a/code/modules/clothing/clothing_state/clothing_state_rolled.dm +++ b/code/modules/clothing/clothing_state/clothing_state_rolled.dm @@ -8,6 +8,7 @@ /decl/interaction_handler/clothing_toggle/rolled_down name = "Roll Up Or Down" state_decl_type = /decl/clothing_state_modifier/rolled_down + examine_desc = "roll $TARGET_THEM$ up or down" /obj/item/clothing/proc/toggle_rolled_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_sleeves.dm b/code/modules/clothing/clothing_state/clothing_state_sleeves.dm index 7356c78e404..33a099b4194 100644 --- a/code/modules/clothing/clothing_state/clothing_state_sleeves.dm +++ b/code/modules/clothing/clothing_state/clothing_state_sleeves.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/rolled_sleeves name = "Roll Sleeves Up Or Down" state_decl_type = /decl/clothing_state_modifier/rolled_sleeves + examine_desc = "roll $TARGET_THEIR$ sleeves up or down" /obj/item/clothing/proc/toggle_sleeves_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_tucked.dm b/code/modules/clothing/clothing_state/clothing_state_tucked.dm index 41714c01f86..dbfaaecf3be 100644 --- a/code/modules/clothing/clothing_state/clothing_state_tucked.dm +++ b/code/modules/clothing/clothing_state/clothing_state_tucked.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/tucked_in name = "Tuck In Or Untuck" state_decl_type = /decl/clothing_state_modifier/tucked_in + examine_desc = "tuck $TARGET_THEM$ in or out" /obj/item/clothing/proc/toggle_tucked_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_untied.dm b/code/modules/clothing/clothing_state/clothing_state_untied.dm index 98313e2441d..759b6001504 100644 --- a/code/modules/clothing/clothing_state/clothing_state_untied.dm +++ b/code/modules/clothing/clothing_state/clothing_state_untied.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/untied name = "Tie Or Untie" state_decl_type = /decl/clothing_state_modifier/untied + examine_desc = "tie or untie $TARGET_THEM$" /obj/item/clothing/proc/toggle_untied_verb() diff --git a/code/modules/clothing/costumes/_costume.dm b/code/modules/clothing/costumes/_costume.dm index 1afd7a2643f..bb0035a8e63 100644 --- a/code/modules/clothing/costumes/_costume.dm +++ b/code/modules/clothing/costumes/_costume.dm @@ -6,8 +6,3 @@ w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES - -/obj/item/clothing/costume/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/dresses/_dress.dm b/code/modules/clothing/dresses/_dress.dm index 11570f7b552..c29c27b6734 100644 --- a/code/modules/clothing/dresses/_dress.dm +++ b/code/modules/clothing/dresses/_dress.dm @@ -8,8 +8,3 @@ w_class = ITEM_SIZE_NORMAL valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES fallback_slot = slot_w_uniform_str - -/obj/item/clothing/dress/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/ears/earrings.dm b/code/modules/clothing/ears/earrings.dm index f1f6f2b3867..fd7da2c59bf 100644 --- a/code/modules/clothing/ears/earrings.dm +++ b/code/modules/clothing/ears/earrings.dm @@ -7,7 +7,7 @@ /obj/item/clothing/ears/stud/glass material = /decl/material/solid/glass /obj/item/clothing/ears/stud/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/clothing/ears/stud/iron material = /decl/material/solid/metal/iron /obj/item/clothing/ears/stud/steel @@ -30,7 +30,7 @@ /obj/item/clothing/ears/dangle/glass material = /decl/material/solid/glass /obj/item/clothing/ears/dangle/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/clothing/ears/dangle/iron material = /decl/material/solid/metal/iron /obj/item/clothing/ears/dangle/steel diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 8e0f44b9e18..5802d8fe8b9 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -8,6 +8,7 @@ body_parts_covered = SLOT_EYES slot_flags = SLOT_EYES fallback_slot = slot_glasses_str + gender = PLURAL var/vision_flags = 0 var/darkness_view = 0 @@ -103,9 +104,9 @@ /obj/item/clothing/glasses/update_clothing_icon() . = ..() - if(.) - var/mob/M = loc - M.update_action_buttons() + if(. && ismob(loc)) + var/mob/wearer = loc + wearer.update_action_buttons() /obj/item/clothing/glasses/proc/toggle() set category = "Object" diff --git a/code/modules/clothing/glasses/blindfolds.dm b/code/modules/clothing/glasses/blindfolds.dm index a23709ee6df..737a3e06978 100644 --- a/code/modules/clothing/glasses/blindfolds.dm +++ b/code/modules/clothing/glasses/blindfolds.dm @@ -8,6 +8,7 @@ darkness_view = -1 toggleable = TRUE activation_sound = null + gender = NEUTER toggle_off_message = "You flip $ITEM$ up." toggle_on_message = "You slide $ITEM$ down, blinding yourself." diff --git a/code/modules/clothing/glasses/eyepatch.dm b/code/modules/clothing/glasses/eyepatch.dm index 53be997ae1e..8a484b3b6bb 100644 --- a/code/modules/clothing/glasses/eyepatch.dm +++ b/code/modules/clothing/glasses/eyepatch.dm @@ -3,6 +3,7 @@ desc = "Yarr." body_parts_covered = 0 icon = 'icons/clothing/eyes/eyepatch.dmi' + gender = NEUTER var/flipped_icon = 'icons/clothing/eyes/eyepatch_right.dmi' /obj/item/clothing/glasses/eyepatch/verb/flip_patch() diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index b97d5aed843..78696640604 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -17,10 +17,6 @@ fallback_slot = slot_gloves_str var/obj/item/clothing/gloves/ring/covering_ring -/obj/item/clothing/gloves/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_gloves_str) - /obj/item/clothing/gloves/proc/Touch(var/atom/A, var/proximity) return diff --git a/code/modules/clothing/gloves/jewelry/rings/_ring.dm b/code/modules/clothing/gloves/jewelry/rings/_ring.dm index 7789e812804..aadeedab558 100644 --- a/code/modules/clothing/gloves/jewelry/rings/_ring.dm +++ b/code/modules/clothing/gloves/jewelry/rings/_ring.dm @@ -1,6 +1,123 @@ /obj/item/clothing/gloves/ring - name = "ring" - icon = 'icons/clothing/accessories/jewelry/rings/ring.dmi' - w_class = ITEM_SIZE_TINY - gender = NEUTER + name = "ring" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band.dmi' + desc = null + w_class = ITEM_SIZE_TINY + gender = NEUTER + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_DESC // We handle name manually + sprite_sheets = null + var/use_material_name = TRUE var/can_fit_under_gloves = TRUE + var/can_inscribe = TRUE + var/inscription + var/base_desc + +/obj/item/clothing/gloves/ring/Initialize() + if(desc) + base_desc = desc + . = ..() + +/obj/item/clothing/gloves/ring/get_decoration_icon(default_icon, obj/item/thing, on_mob = FALSE) + if(!on_mob && istype(thing, /obj/item/gemstone)) + return thing.icon + return ..() + +/obj/item/clothing/gloves/ring/update_name() + var/list/name_comp = list() + if(name_prefix) + name_comp += name_prefix + if(use_material_name) + var/obj/item/gemstone/gem = locate() in contents + if(gem) + name_comp += gem.name + if(material) + name_comp += material.adjective_name + name_comp += base_name || initial(name) + SetName(jointext(name_comp, " ")) + +/obj/item/clothing/gloves/ring/set_material(var/new_material) + . = ..() + update_desc() + +// To avoid clobbering custom loadout descriptions. +/obj/item/clothing/gloves/ring/set_custom_desc(new_desc) + base_desc = new_desc + update_desc() + +/obj/item/clothing/gloves/ring/proc/update_desc() + if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_DESC)) + desc = "A ring made from [material.solid_name]." + if(inscription) + desc += "
Written on \the [src] is the inscription \"[inscription]\"" + if(base_desc) + desc = "[base_desc] [desc]" + +/obj/item/clothing/gloves/ring/attackby(var/obj/item/tool, var/mob/user) + if(can_inscribe && tool.is_sharp() && user.check_intent(I_FLAG_HELP)) + var/new_inscription = sanitize(input("Enter an inscription to engrave.", "Inscription") as null|text) + if(user.stat || !user.incapacitated() || !user.Adjacent(src) || tool.loc != user) + return TRUE + if(!new_inscription) + return TRUE + to_chat(user, SPAN_WARNING("You carve \"[new_inscription]\" into \the [src].")) + inscription = new_inscription + update_desc() + return TRUE + return ..() + +/obj/item/clothing/gloves/ring/OnTopic(var/mob/user, var/list/href_list) + if(href_list["examine"]) + if(istype(user)) + var/mob/living/human/H = get_recursive_loc_of_type(/mob/living/human) + if(H.Adjacent(user)) + user.examinate(src) + return TOPIC_HANDLED + return ..() + +/obj/item/clothing/gloves/ring/get_examine_line() + . = ..() + . += " \[View\]" + +// Craftable subtypes. +/obj/item/clothing/gloves/ring/thin + name_prefix = "thin" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi' + +/obj/item/clothing/gloves/ring/thick + name_prefix = "thick" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi' + +/obj/item/clothing/gloves/ring/split + name_prefix = "split" + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_split.dmi' + +// Material subtypes for mapping etc. +/obj/item/clothing/gloves/ring/wood + material = /decl/material/solid/organic/wood/walnut + +/obj/item/clothing/gloves/ring/plastic + material = /decl/material/solid/organic/plastic + +/obj/item/clothing/gloves/ring/steel + material = /decl/material/solid/metal/steel + +/obj/item/clothing/gloves/ring/silver + material = /decl/material/solid/metal/silver + +/obj/item/clothing/gloves/ring/gold + material = /decl/material/solid/metal/gold + +/obj/item/clothing/gloves/ring/platinum + material = /decl/material/solid/metal/platinum + +/obj/item/clothing/gloves/ring/bronze + material = /decl/material/solid/metal/bronze + +/obj/item/clothing/gloves/ring/glass + material = /decl/material/solid/glass + +/obj/item/clothing/gloves/ring/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + decorations = list(pick(global.random_jewellery_gem_types)) + . = ..() diff --git a/code/modules/clothing/gloves/jewelry/rings/material.dm b/code/modules/clothing/gloves/jewelry/rings/material.dm deleted file mode 100644 index f2ac541d18e..00000000000 --- a/code/modules/clothing/gloves/jewelry/rings/material.dm +++ /dev/null @@ -1,52 +0,0 @@ -///////////////////////////////////////// -//Material Rings -// TODO: Merge this into /obj/item/clothing/gloves/ring? -/obj/item/clothing/gloves/ring/material - material_alteration = MAT_FLAG_ALTERATION_ALL - -/obj/item/clothing/gloves/ring/material/set_material(var/new_material) - . = ..() - if(istype(material) && (material_alteration & MAT_FLAG_ALTERATION_DESC)) - desc = "A ring made from [material.solid_name]." - -/obj/item/clothing/gloves/ring/material/attackby(var/obj/item/S, var/mob/user) - if(S.sharp) - var/inscription = sanitize(input("Enter an inscription to engrave.", "Inscription") as null|text) - if(user.stat || !user.incapacitated() || !user.Adjacent(src) || S.loc != user) - return TRUE - if(!inscription) - return TRUE - desc = "A ring made from [material.solid_name]." - to_chat(user, "You carve \"[inscription]\" into \the [src].") - desc += "
Written on \the [src] is the inscription \"[inscription]\"" - return TRUE - return ..() - -/obj/item/clothing/gloves/ring/material/OnTopic(var/mob/user, var/list/href_list) - if(href_list["examine"]) - if(istype(user)) - var/mob/living/human/H = get_recursive_loc_of_type(/mob/living/human) - if(H.Adjacent(user)) - user.examinate(src) - return TOPIC_HANDLED - -/obj/item/clothing/gloves/ring/material/get_examine_line() - . = ..() - . += " \[View\]" - -/obj/item/clothing/gloves/ring/material/wood - material = /decl/material/solid/organic/wood/walnut -/obj/item/clothing/gloves/ring/material/plastic - material = /decl/material/solid/organic/plastic -/obj/item/clothing/gloves/ring/material/steel - material = /decl/material/solid/metal/steel -/obj/item/clothing/gloves/ring/material/silver - material = /decl/material/solid/metal/silver -/obj/item/clothing/gloves/ring/material/gold - material = /decl/material/solid/metal/gold -/obj/item/clothing/gloves/ring/material/platinum - material = /decl/material/solid/metal/platinum -/obj/item/clothing/gloves/ring/material/bronze - material = /decl/material/solid/metal/bronze -/obj/item/clothing/gloves/ring/material/glass - material = /decl/material/solid/glass diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm b/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm new file mode 100644 index 00000000000..2a6c167d7fe --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_aura.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/gloves/ring/aura_ring + icon = 'icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi' + can_inscribe = FALSE + material = /decl/material/solid/metal/silver + abstract_type = /obj/item/clothing/gloves/ring/aura_ring + material_alteration = MAT_FLAG_ALTERATION_COLOR + var/obj/aura/granted_aura + +/obj/item/clothing/gloves/ring/aura_ring/update_name() + return + +/obj/item/clothing/gloves/ring/aura_ring/Initialize() + if(ispath(granted_aura)) + granted_aura = new granted_aura + . = ..() + +/obj/item/clothing/gloves/ring/aura_ring/Destroy() + QDEL_NULL(granted_aura) + . = ..() + +/obj/item/clothing/gloves/ring/aura_ring/equipped(var/mob/living/L, var/slot) + ..() + if(istype(granted_aura) && slot == slot_gloves_str) + L.add_aura(granted_aura) + +/obj/item/clothing/gloves/ring/aura_ring/dropped(var/mob/living/L) + ..() + if(istype(granted_aura)) + L.remove_aura(granted_aura) diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm b/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm new file mode 100644 index 00000000000..7660a833859 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_misc.dm @@ -0,0 +1,24 @@ +///////////////////////////////////////// +//Standard Rings +/obj/item/clothing/gloves/ring/engagement + name = "engagement ring" + desc = "An engagement ring. It certainly looks expensive." + material = /decl/material/solid/metal/silver + decorations = list(/obj/item/gemstone/round) + +/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) + user.visible_message(SPAN_WARNING("\The [user] gets down on one knee, presenting \the [src]."), SPAN_WARNING("You get down on one knee, presenting \the [src].")) + +/obj/item/clothing/gloves/ring/cti + name = "\improper CTI ring" + desc = "A ring commemorating graduation from CTI." + material = /decl/material/solid/metal/silver + decorations = list(/obj/item/gemstone/round/sapphire) + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/mariner + name = "\improper Mariner University ring" + desc = "A ring commemorating graduation from Mariner University." + material = /decl/material/solid/metal/gold + decorations = list(/obj/item/gemstone/round/ruby) + use_material_name = FALSE diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm new file mode 100644 index 00000000000..c1941779748 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_reagent.dm @@ -0,0 +1,37 @@ +///////////////////////////////////////// +//Reagent Rings +/obj/item/clothing/gloves/ring/reagent + atom_flags = ATOM_FLAG_OPEN_CONTAINER + origin_tech = @'{"materials":2,"esoteric":4}' + var/tmp/volume = 15 + +/obj/item/clothing/gloves/ring/reagent/Initialize(ml, material_key) + . = ..() + initialize_reagents() + +/obj/item/clothing/gloves/ring/reagent/initialize_reagents(populate = TRUE) + if(!reagents) + create_reagents(volume) + else + reagents.maximum_volume = max(volume, reagents.maximum_volume) + . = ..() + +/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) + ..() + if(istype(H) && H.get_equipped_item(slot_gloves_str) == src) + to_chat(H, SPAN_DANGER("You feel a prick as you slip on the ring.")) + + if(reagents.total_volume) + if(H.reagents) + var/contained_reagents = reagents.get_reagents() + var/trans = reagents.trans_to_mob(H, reagents.total_volume, CHEM_INJECT) + admin_inject_log(usr, H, src, contained_reagents, trans) + return + +//Sleepy Ring +/obj/item/clothing/gloves/ring/reagent/sleepy + origin_tech = @'{"materials":2,"esoteric":5}' + +/obj/item/clothing/gloves/ring/reagent/sleepy/populate_reagents() + add_to_reagents(/decl/material/liquid/paralytics, 10) + add_to_reagents(/decl/material/liquid/sedatives, 5) diff --git a/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm b/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm new file mode 100644 index 00000000000..9ba92ac5659 --- /dev/null +++ b/code/modules/clothing/gloves/jewelry/rings/ring_seal.dm @@ -0,0 +1,42 @@ +///////////////////////////////////////// +//Seals and Signet Rings +/obj/item/clothing/gloves/ring/seal + name = "signet ring" + desc = "A ring with a heavy setting for pressing into hot wax to seal letters." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal.dmi' + material = /decl/material/solid/metal/silver + +/obj/item/clothing/gloves/ring/seal/Initialize() + . = ..() + set_extension(src, /datum/extension/tool, list(TOOL_STAMP = TOOL_QUALITY_DEFAULT)) + +/obj/item/clothing/gloves/ring/seal/secretary + name = "\improper Secretary-General's official seal" + desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring." + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/seal/mason + name = "masonic ring" + desc = "The Square and Compasses feature prominently on this Masonic ring." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi' + material = /decl/material/solid/metal/brass + use_material_name = FALSE + +/obj/item/clothing/gloves/ring/seal/signet + name = "signet ring" + desc = "A signet ring, for when you're too sophisticated to sign letters." + icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi' + use_material_name = FALSE + var/name_set = FALSE + +/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) + if(!user.check_intent(I_FLAG_HELP)) + return ..() + if(name_set) + to_chat(user, SPAN_NOTICE("\The [src] has already been claimed!")) + else + name_set = TRUE + to_chat(user, SPAN_NOTICE("You claim \the [src] as your own!")) + base_name = "\the [user]'s signet ring" + desc = "A signet ring belonging to [user], for when they're too sophisticated to sign letters." + return TRUE diff --git a/code/modules/clothing/gloves/jewelry/rings/rings.dm b/code/modules/clothing/gloves/jewelry/rings/rings.dm deleted file mode 100644 index 332b4cf234a..00000000000 --- a/code/modules/clothing/gloves/jewelry/rings/rings.dm +++ /dev/null @@ -1,112 +0,0 @@ -///////////////////////////////////////// -//Standard Rings -/obj/item/clothing/gloves/ring/engagement - name = "engagement ring" - desc = "An engagement ring. It certainly looks expensive." - icon = 'icons/clothing/accessories/jewelry/rings/ring_diamond.dmi' - -/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user) - user.visible_message(SPAN_WARNING("\The [user] gets down on one knee, presenting \the [src]."), SPAN_WARNING("You get down on one knee, presenting \the [src].")) - -/obj/item/clothing/gloves/ring/cti - name = "CTI ring" - desc = "A ring commemorating graduation from CTI." - icon = 'icons/clothing/accessories/jewelry/rings/ring_cti.dmi' - -/obj/item/clothing/gloves/ring/mariner - name = "Mariner University ring" - desc = "A ring commemorating graduation from Mariner University." - icon = 'icons/clothing/accessories/jewelry/rings/ring_mariner.dmi' - -///////////////////////////////////////// -//Magic Rings - -/obj/item/clothing/gloves/ring/magic - name = "magic ring" - desc = "A strange ring with symbols carved on it in some arcane language." - icon = 'icons/clothing/accessories/jewelry/rings/ring_magic.dmi' - -/obj/item/clothing/gloves/ring/magic/equipped(var/mob/living/human/H, var/slot) - ..() - if(istype(H) && slot == SLOT_HANDS) - H.add_cloaking_source(src) - -/obj/item/clothing/gloves/ring/magic/dropped(var/mob/living/human/H) - if(!..()) - return 0 - - if(istype(H)) - H.remove_cloaking_source(src) - -///////////////////////////////////////// -//Reagent Rings - -/obj/item/clothing/gloves/ring/reagent - atom_flags = ATOM_FLAG_OPEN_CONTAINER - origin_tech = @'{"materials":2,"esoteric":4}' - var/tmp/volume = 15 - -/obj/item/clothing/gloves/ring/reagent/Initialize(ml, material_key) - . = ..() - initialize_reagents() - -/obj/item/clothing/gloves/ring/reagent/initialize_reagents(populate = TRUE) - if(!reagents) - create_reagents(volume) - else - reagents.maximum_volume = max(volume, reagents.maximum_volume) - . = ..() - -/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/human/H) - ..() - if(istype(H) && H.get_equipped_item(slot_gloves_str) == src) - to_chat(H, SPAN_DANGER("You feel a prick as you slip on the ring.")) - - if(reagents.total_volume) - if(H.reagents) - var/contained_reagents = reagents.get_reagents() - var/trans = reagents.trans_to_mob(H, reagents.total_volume, CHEM_INJECT) - admin_inject_log(usr, H, src, contained_reagents, trans) - return - -//Sleepy Ring -/obj/item/clothing/gloves/ring/reagent/sleepy - name = "silver ring" - desc = "A ring made from what appears to be silver." - origin_tech = @'{"materials":2,"esoteric":5}' - -/obj/item/clothing/gloves/ring/reagent/sleepy/populate_reagents() - add_to_reagents(/decl/material/liquid/paralytics, 10) - add_to_reagents(/decl/material/liquid/sedatives, 5) - -///////////////////////////////////////// -//Seals and Signet Rings -/obj/item/clothing/gloves/ring/seal - name = "Secretary-General's official seal" - desc = "The official seal of the Secretary-General of the Solar Confederate Government, featured prominently on a silver ring." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi' - -/obj/item/clothing/gloves/ring/seal/Initialize() - . = ..() - set_extension(src, /datum/extension/tool, list(TOOL_STAMP = TOOL_QUALITY_DEFAULT)) - -/obj/item/clothing/gloves/ring/seal/mason - name = "masonic ring" - desc = "The Square and Compasses feature prominently on this Masonic ring." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi' - -/obj/item/clothing/gloves/ring/seal/signet - name = "signet ring" - desc = "A signet ring, for when you're too sophisticated to sign letters." - icon = 'icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi' - var/nameset = 0 - -/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user) - if(nameset) - to_chat(user, SPAN_NOTICE("\The [src] has already been claimed!")) - return - - nameset = 1 - to_chat(user, SPAN_NOTICE("You claim \the [src] as your own!")) - name = "[user]'s signet ring" - desc = "A signet ring belonging to [user], for when you're too sophisticated to sign letters." diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index a4728547633..ae91f9dcc1f 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -57,7 +57,3 @@ 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) diff --git a/code/modules/clothing/head/fated_key.dm b/code/modules/clothing/head/fated_key.dm index cc65bd80239..626126d50c9 100644 --- a/code/modules/clothing/head/fated_key.dm +++ b/code/modules/clothing/head/fated_key.dm @@ -51,7 +51,7 @@ var/atom/blade for(var/obj/item/held in shuffle(user.get_held_items())) - if(has_edge(held)) + if(held.has_edge()) blade = held break if(!blade) @@ -113,5 +113,5 @@ animate(src, alpha = 255, time = 3) sleep(13) animate(src, alpha = 0, time = 40) - sleep(40) - qdel(src) + if(!QDELING(src)) + QDEL_IN(src, 4 SECONDS) diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 6616b992929..01d01335e58 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -153,7 +153,7 @@ // Duplicated from growns for now. TODO: move sliceability down to other objects like clay. /obj/item/clothing/head/pumpkinhead/attackby(obj/item/W, mob/user) - if(IS_KNIFE(W) && user.a_intent != I_HURT) + if(IS_KNIFE(W) && !user.check_intent(I_FLAG_HARM)) var/datum/seed/plant = SSplants.seeds[plant_type] if(!plant) return ..() @@ -204,7 +204,7 @@ icon = 'icons/clothing/head/cakehat.dmi' body_parts_covered = SLOT_HEAD item_flags = null - var/is_on_fire = FALSE + VAR_PRIVATE/_on_fire = FALSE /obj/item/clothing/head/cakehat/equipped(mob/user, slot) . = ..() @@ -217,7 +217,7 @@ /obj/item/clothing/head/cakehat/on_update_icon(mob/user) . = ..() z_flags &= ~ZMM_MANGLE_PLANES - if(is_on_fire && check_state_in_icon("[icon_state]-flame", icon)) + if(is_on_fire() && check_state_in_icon("[icon_state]-flame", icon)) if(plane == HUD_PLANE) add_overlay("[icon_state]-flame") else @@ -230,7 +230,7 @@ return emissive_overlay(overlay.icon, "[overlay.icon_state]-flame") /obj/item/clothing/head/cakehat/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) - if(overlay && is_on_fire) + if(overlay && is_on_fire()) var/image/I = get_mob_flame_overlay(overlay, bodytype) if(I) overlay.overlays += I @@ -241,7 +241,7 @@ return ..() /obj/item/clothing/head/cakehat/Process() - if(!is_on_fire) + if(!is_on_fire()) STOP_PROCESSING(SSobj, src) return var/turf/location = loc @@ -255,9 +255,9 @@ /obj/item/clothing/head/cakehat/attack_self(mob/user) . = ..() if(!.) - is_on_fire = !is_on_fire + _on_fire = !_on_fire update_icon() - if(is_on_fire) + if(is_on_fire()) atom_damage_type = BURN START_PROCESSING(SSobj, src) else diff --git a/code/modules/clothing/head/wizard.dm b/code/modules/clothing/head/wizard.dm new file mode 100644 index 00000000000..e4de99269e1 --- /dev/null +++ b/code/modules/clothing/head/wizard.dm @@ -0,0 +1,32 @@ +// Props from wizard mode, preserved as costume pieces. +/obj/item/clothing/head/wizard + name = "wizard hat" + desc = "It has WIZZARD written across it in sequins." + icon = 'icons/clothing/head/wizard/wizard.dmi' + body_parts_covered = 0 + +/obj/item/clothing/head/wizard/red + name = "red wizard hat" + icon = 'icons/clothing/head/wizard/red.dmi' + +/obj/item/clothing/head/wizard/beard + name = "wizard hat" + desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." + icon = 'icons/clothing/head/wizard/fake.dmi' + body_parts_covered = SLOT_HEAD|SLOT_FACE + +/obj/item/clothing/head/wizard/marisa + name = "witch hat" + desc = "Strange-looking hat-wear. Makes you want to cast fireballs." + icon = 'icons/clothing/head/wizard/marisa.dmi' + +/obj/item/clothing/head/wizard/magus + name = "magus helm" + desc = "A mysterious helmet. Hard to see out of." + icon = 'icons/clothing/head/wizard/magus.dmi' + body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES + +/obj/item/clothing/head/wizard/cap + name = "gentleman's cap" + desc = "A checkered gray flat cap." + icon = 'icons/clothing/head/flatcap.dmi' diff --git a/code/modules/clothing/jumpsuits/_jumpsuit.dm b/code/modules/clothing/jumpsuits/_jumpsuit.dm index ef614e6b69e..21be4c2e731 100644 --- a/code/modules/clothing/jumpsuits/_jumpsuit.dm +++ b/code/modules/clothing/jumpsuits/_jumpsuit.dm @@ -15,8 +15,3 @@ GET_DECL(/decl/clothing_state_modifier/rolled_sleeves) ) return expected_state_modifiers - -/obj/item/clothing/costume/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/masks/_mask.dm b/code/modules/clothing/masks/_mask.dm index 6053880f172..214afe1c907 100644 --- a/code/modules/clothing/masks/_mask.dm +++ b/code/modules/clothing/masks/_mask.dm @@ -30,10 +30,6 @@ action_button_name = "Adjust Mask" verbs += .verb/adjust_mask -/obj/item/clothing/mask/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_wear_mask_str) - /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/chewable.dm b/code/modules/clothing/masks/chewable.dm index 093950d7caa..84d490148fb 100644 --- a/code/modules/clothing/masks/chewable.dm +++ b/code/modules/clothing/masks/chewable.dm @@ -51,7 +51,7 @@ /obj/item/clothing/mask/chewable/Process() chew(1) if(chewtime < 1) - extinguish() + extinguish_fire() /obj/item/clothing/mask/chewable/tobacco name = "wad" @@ -72,7 +72,7 @@ desc = "A disgusting spitwad." icon = 'icons/clothing/mask/chewables/chew_spit.dmi' -/obj/item/clothing/mask/chewable/proc/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/chewable/extinguish_fire(mob/user, no_message = FALSE) STOP_PROCESSING(SSobj, src) if(type_butt) var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) @@ -137,10 +137,11 @@ /obj/item/clothing/mask/chewable/candy/proc/get_possible_initial_reagents() return -/obj/item/clothing/mask/chewable/candy/initialize_reagents(populate) +/obj/item/clothing/mask/chewable/candy/initialize_reagents() . = ..() - color = reagents.get_color() - desc += " This one is labeled '[reagents.get_primary_reagent_name()]'." + if(reagents?.total_volume) + set_color(reagents.get_color()) + desc += " This one is labeled '[reagents.get_primary_reagent_name()]'." /obj/item/trash/cigbutt/spitgum name = "old gum" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index e74903d380b..7ceb955904c 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -93,12 +93,16 @@ w_class = ITEM_SIZE_SMALL siemens_coefficient = 0.9 -/obj/item/clothing/mask/horsehead/Initialize() - . = ..() - // The horse mask doesn't cause voice changes by default, the wizard spell changes the flag as necessary +/obj/item/clothing/mask/horsehead/cursed + voicechange = TRUE say_messages = list("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") say_verbs = list("whinnies", "neighs", "says") +/obj/item/clothing/mask/horsehead/cursed/equipped(mob/user, slot) + . = ..() + if(slot == slot_wear_mask_str) + canremove = FALSE + /obj/item/clothing/mask/ai name = "camera MIU" desc = "Allows for direct mental connection to accessible camera channels." diff --git a/code/modules/clothing/masks/smokable.dm b/code/modules/clothing/masks/smokable.dm index c270ba8e802..cdf734b4b9f 100644 --- a/code/modules/clothing/masks/smokable.dm +++ b/code/modules/clothing/masks/smokable.dm @@ -82,7 +82,7 @@ if (src == user.get_equipped_item(slot_wear_mask_str) && user.internal) environment = user.internal.return_air() if(environment.get_by_flag(XGM_GAS_OXIDIZER) < gas_consumption) - extinguish() + extinguish_fire() else environment.remove_by_flag(XGM_GAS_OXIDIZER, gas_consumption) environment.adjust_gas(/decl/material/gas/carbon_dioxide, 0.5*gas_consumption,0) @@ -91,7 +91,7 @@ /obj/item/clothing/mask/smokable/Process() var/turf/location = get_turf(src) if(submerged() || smoketime < 1) - extinguish() + extinguish_fire() return smoke(1) if(location) @@ -126,7 +126,7 @@ var/turf/location = get_turf(src) if(location) location.hotspot_expose(700, 5) - extinguish(no_message = TRUE) + extinguish_fire(no_message = TRUE) /obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights \the [src].") if(QDELETED(src)) @@ -153,12 +153,25 @@ smoke_amount = reagents.total_volume / smoketime START_PROCESSING(SSobj, src) -/obj/item/clothing/mask/smokable/proc/extinguish(var/mob/user, var/no_message) +/obj/item/clothing/mask/smokable/extinguish_fire(mob/user, no_message = FALSE) lit = FALSE atom_damage_type = BRUTE STOP_PROCESSING(SSobj, src) set_light(0) update_icon() + remove_extension(src, /datum/extension/scent) + if (type_butt) + var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) + transfer_fingerprints_to(butt) + if(istype(butt) && butt.use_color) + butt.color = color + if(brand) + butt.desc += " This one is a [brand]." + if(ismob(loc)) + var/mob/living/M = loc + if (!no_message) + to_chat(M, SPAN_NOTICE("Your [name] goes out.")) + qdel(src) /obj/item/clothing/mask/smokable/attackby(var/obj/item/W, var/mob/user) if(W.isflamesource() || W.get_heat() >= T100C) @@ -183,9 +196,9 @@ return ..() /obj/item/clothing/mask/smokable/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(target.on_fire) + if(target.is_on_fire()) user.do_attack_animation(target) - light(SPAN_NOTICE("\The [user] coldly lights the \the [src] with the burning body of \the [target].")) + light(SPAN_NOTICE("\The [user] coldly lights \the [src] with the burning body of \the [target].")) return TRUE return ..() @@ -222,22 +235,6 @@ if(is_processing) set_scent_by_reagents(src) -/obj/item/clothing/mask/smokable/extinguish(var/mob/user, var/no_message) - ..() - remove_extension(src, /datum/extension/scent) - if (type_butt) - var/obj/item/trash/cigbutt/butt = new type_butt(get_turf(src)) - transfer_fingerprints_to(butt) - if(istype(butt) && butt.use_color) - butt.color = color - if(brand) - butt.desc += " This one is a [brand]." - if(ismob(loc)) - var/mob/living/M = loc - if (!no_message) - to_chat(M, SPAN_NOTICE("Your [name] goes out.")) - qdel(src) - /obj/item/clothing/mask/smokable/cigarette/menthol name = "menthol cigarette" desc = "A cigarette with a little minty kick. Well, minty in theory." @@ -359,7 +356,7 @@ 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/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/clothing/mask/smokable/cigarette/attackby(var/obj/item/W, var/mob/user) if(istype(W, /obj/item/energy_blade/sword)) @@ -385,7 +382,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE - if(!lit && target.on_fire) + if(!lit && target.is_on_fire()) user.do_attack_animation(target) light(target, user) return TRUE @@ -413,7 +410,7 @@ /obj/item/clothing/mask/smokable/cigarette/attack_self(var/mob/user) if(lit == 1) user.visible_message(SPAN_NOTICE("[user] calmly drops and treads on the lit [src], putting it out instantly.")) - extinguish(no_message = 1) + extinguish_fire(no_message = TRUE) return ..() //////////// @@ -531,22 +528,10 @@ set_scent_by_reagents(src) update_icon() -/obj/item/clothing/mask/smokable/pipe/extinguish(var/mob/user, var/no_message) - ..() - new /obj/effect/decal/cleanable/ash(get_turf(src)) - if(ismob(loc)) - var/mob/living/M = loc - if (!no_message) - to_chat(M, SPAN_NOTICE("Your [name] goes out, and you empty the ash.")) - remove_extension(src, /datum/extension/scent) - /obj/item/clothing/mask/smokable/pipe/attack_self(var/mob/user) - if(lit == 1) + if(lit) user.visible_message(SPAN_NOTICE("[user] puts out [src]."), SPAN_NOTICE("You put out [src].")) - lit = FALSE - update_icon() - STOP_PROCESSING(SSobj, src) - remove_extension(src, /datum/extension/scent) + extinguish_fire(user, no_message = TRUE) else if (smoketime) var/turf/location = get_turf(user) user.visible_message(SPAN_NOTICE("[user] empties out [src]."), SPAN_NOTICE("You empty out [src].")) diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index edee4acd8eb..8ecc47d727c 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -30,3 +30,7 @@ /obj/item/clothing/mask/chameleon/voice/Initialize() . = ..() changer = new(src) + +/obj/item/clothing/mask/chameleon/voice/Destroy() + QDEL_NULL(changer) + return ..() diff --git a/code/modules/clothing/misc/dog_tags.dm b/code/modules/clothing/misc/dog_tags.dm index a8a79f362f2..0b81dc8b225 100644 --- a/code/modules/clothing/misc/dog_tags.dm +++ b/code/modules/clothing/misc/dog_tags.dm @@ -12,7 +12,7 @@ var/owner_branch /obj/item/clothing/dog_tags/attack_self(mob/user) - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) user.visible_message(SPAN_NOTICE("\The [user] displays \the [src].")) if(owner_name) user.visible_message(SPAN_NOTICE("They read: \"[owner_name] - [owner_rank] - [owner_branch].\"")) diff --git a/code/modules/clothing/neck/jewelry.dm b/code/modules/clothing/neck/jewelry.dm deleted file mode 100644 index 9f30ace8ac8..00000000000 --- a/code/modules/clothing/neck/jewelry.dm +++ /dev/null @@ -1,57 +0,0 @@ -/obj/item/clothing/neck/necklace - name = "necklace" - desc = "A simple necklace." - icon = 'icons/clothing/accessories/jewelry/necklace.dmi' - material = /decl/material/solid/metal/silver - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC - -/obj/item/clothing/neck/necklace/prayer_beads - name = "prayer beads" - desc = "A string of smooth, polished beads." - icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' - material = /decl/material/solid/organic/wood/ebony - -/obj/item/clothing/neck/necklace/prayer_beads/gold - material = /decl/material/solid/metal/gold - -/obj/item/clothing/neck/necklace/prayer_beads/basalt - material = /decl/material/solid/stone/basalt - -/obj/item/clothing/neck/necklace/locket - name = "locket" - desc = "A locket that seems to have space for a photo within." - icon = 'icons/clothing/accessories/jewelry/locket.dmi' - var/open - var/obj/item/held - -/obj/item/clothing/neck/necklace/locket/attack_self(mob/user) - if(!("[get_world_inventory_state()]-open" in icon_states(icon))) - to_chat(user, SPAN_WARNING("\The [src] doesn't seem to open.")) - return TRUE - open = !open - to_chat(user, SPAN_NOTICE("You flip \the [src] [open ? "open" : "closed"].")) - if(open && held) - to_chat(user, SPAN_DANGER("\The [held] falls out!")) - held.dropInto(user.loc) - held = null - update_icon() - return TRUE - -/obj/item/clothing/neck/necklace/locket/on_update_icon() - . = ..() - icon_state = get_world_inventory_state() - if(open && check_state_in_icon("[icon_state]-open", icon)) - icon_state = "[icon_state]-open" - -/obj/item/clothing/neck/necklace/locket/attackby(var/obj/item/O, mob/user) - if(!open) - to_chat(user, SPAN_WARNING("You have to open it first.")) - return TRUE - if(istype(O,/obj/item/paper) || istype(O, /obj/item/photo)) - if(held) - to_chat(usr, SPAN_WARNING("\The [src] already has something inside it.")) - else if(user.try_unequip(O, src)) - to_chat(usr, SPAN_NOTICE("You slip \the [O] into \the [src].")) - held = O - return TRUE - return ..() diff --git a/code/modules/clothing/neck/necklace/__necklace.dm b/code/modules/clothing/neck/necklace/__necklace.dm new file mode 100644 index 00000000000..d94e49bf267 --- /dev/null +++ b/code/modules/clothing/neck/necklace/__necklace.dm @@ -0,0 +1,98 @@ +/obj/item/clothing/neck/necklace + name = "necklace" + desc = "A fine chain worn around the neck." + icon = 'icons/clothing/accessories/jewelry/necklace.dmi' + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC | MAT_FLAG_ALTERATION_COLOR + var/obj/item/pendant/pendant + +/obj/item/clothing/neck/necklace/Initialize() + . = ..() + if(ispath(pendant)) + set_pendant(new pendant(src, material?.type)) + +/obj/item/clothing/neck/necklace/Destroy() + set_pendant(null) + return ..() + +/obj/item/clothing/neck/necklace/proc/set_pendant(obj/item/new_pendant) + if(pendant == new_pendant) + return FALSE + pendant = new_pendant + update_icon() + return TRUE + +/obj/item/clothing/neck/necklace/examine(mob/user) + . = ..() + if(istype(pendant)) + to_chat(user, "There is \a [pendant] attached.") + +/obj/item/clothing/neck/necklace/on_update_icon() + . = ..() + if(istype(pendant)) + var/list/pendant_overlays = pendant.get_pendant_overlays(icon_state) + if(length(pendant_overlays)) + add_overlay(pendant_overlays) + +/obj/item/clothing/neck/necklace/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && istype(pendant)) + var/pendant_overlays = pendant.get_pendant_overlays(overlay.icon_state) + if(pendant_overlays) + overlay.overlays += pendant_overlays + return ..() + +/obj/item/clothing/neck/necklace/attack_self(mob/user) + if(pendant?.attack_self(user)) + return TRUE + return ..() + +/obj/item/clothing/neck/necklace/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/pendant)) + if(istype(pendant)) + to_chat(user, SPAN_WARNING("\The [src] doesn't have room for \the [used_item].")) + else if(user.try_unequip(used_item, src)) + set_pendant(used_item) + update_icon() + to_chat(user, SPAN_NOTICE("You attach \the [pendant] to \the [src].")) + return TRUE + if(pendant?.attackby(used_item, user)) + return TRUE + return ..() + +/obj/item/clothing/neck/necklace/get_alt_interactions(mob/user) + . = ..() + if(istype(pendant)) + LAZYADD(., /decl/interaction_handler/remove_pendant) + +/decl/interaction_handler/remove_pendant + name = "Remove Pendant" + expected_target_type = /obj/item/clothing/neck/necklace + examine_desc = "remove $TARGET_THEIR$ pendant" + +/decl/interaction_handler/remove_pendant/invoked(atom/target, mob/user, obj/item/prop) + var/obj/item/clothing/neck/necklace/necklace = target + if(!necklace.pendant) + return FALSE + necklace.pendant.dropInto(user.loc) + user.put_in_hands(necklace.pendant) + necklace.set_pendant(null) + return TRUE + +// Loadout subtypes. +/obj/item/clothing/neck/necklace/prism + pendant = /obj/item/pendant/prism + +/obj/item/clothing/neck/necklace/frill + pendant = /obj/item/pendant/frill + +/obj/item/clothing/neck/necklace/square + pendant = /obj/item/pendant/setting/square + +/obj/item/clothing/neck/necklace/cross + pendant = /obj/item/pendant/setting/cross + +/obj/item/clothing/neck/necklace/diamond + pendant = /obj/item/pendant/setting/diamond + +/obj/item/clothing/neck/necklace/ornate + pendant = /obj/item/pendant/setting/ornate diff --git a/code/modules/clothing/neck/necklace/_pendant.dm b/code/modules/clothing/neck/necklace/_pendant.dm new file mode 100644 index 00000000000..d29a9e6af27 --- /dev/null +++ b/code/modules/clothing/neck/necklace/_pendant.dm @@ -0,0 +1,51 @@ +/obj/item/pendant + name = "pendant" + desc = "A simple pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/square.dmi' + abstract_type = /obj/item/pendant + material = /decl/material/solid/metal/silver + material_alteration = MAT_FLAG_ALTERATION_COLOR // We do manual name/desc handling for the gem. + +// I swear we had a proc for this on /obj/item? +/obj/item/pendant/set_material(new_material) + . = ..() + if(material) + desc = "[desc] This one is made of [material.solid_name]." + +/obj/item/pendant/update_name() + var/list/name_comp = get_name_components() + if(length(name_comp)) + SetName(jointext(name_comp, " ")) + +/obj/item/pendant/proc/get_name_components() + . = list() + if(name_prefix) + . += name_prefix + if(material) + . += material.adjective_name + . += base_name || initial(name) + +/obj/item/pendant/proc/get_pendant_base_state(base_state) + return base_state + +/obj/item/pendant/proc/get_pendant_overlays(base_state) + base_state = get_pendant_base_state(base_state) + var/list/overlay_states = list((base_state) = get_color()) + for(var/decl/item_decoration/decoration as anything in decorations) + overlay_states["[base_state]-[decoration.icon_state_modifier]"] = decoration.resolve_color(src) + . = list() + for(var/overlay_state in overlay_states) + if(check_state_in_icon(overlay_state, icon)) + . += overlay_image(icon, overlay_state, overlay_states[overlay_state], RESET_COLOR) + +// Subtypes below. +/obj/item/pendant/prism + name = "prism" + desc = "A large prism-shaped pendant that hangs from a clasp." + icon = 'icons/clothing/accessories/jewelry/pendants/crystal.dmi' + material = /decl/material/solid/gemstone/diamond + +/obj/item/pendant/frill + name = "chain frill" + icon = 'icons/clothing/accessories/jewelry/pendants/frill.dmi' + desc = "A set of fine chain frills." diff --git a/code/modules/clothing/neck/necklace/necklaces.dm b/code/modules/clothing/neck/necklace/necklaces.dm new file mode 100644 index 00000000000..1cc8ef598c2 --- /dev/null +++ b/code/modules/clothing/neck/necklace/necklaces.dm @@ -0,0 +1,15 @@ +// Subtypes for mapping etc. +/obj/item/clothing/neck/necklace/locket + pendant = /obj/item/pendant/locket + +/obj/item/clothing/neck/necklace/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + pendant = pick(list( + /obj/item/pendant/setting/cross/random, + /obj/item/pendant/setting/square/random, + /obj/item/pendant/setting/diamond/random, + /obj/item/pendant/setting/ornate/random, + /obj/item/pendant/prism/random, + /obj/item/pendant/frill/random + )) + return ..() diff --git a/code/modules/clothing/neck/necklace/pendant_locket.dm b/code/modules/clothing/neck/necklace/pendant_locket.dm new file mode 100644 index 00000000000..930f7c927e3 --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_locket.dm @@ -0,0 +1,50 @@ +/obj/item/pendant/locket + name = "locket" + desc = "A locket that seems to have space for a photo within." + icon = 'icons/clothing/accessories/jewelry/pendants/locket.dmi' + var/open + var/obj/item/held + +/obj/item/pendant/locket/attack_self(mob/user) + if(!("[get_world_inventory_state()]-open" in icon_states(icon))) + to_chat(user, SPAN_WARNING("\The [src] doesn't seem to open.")) + return TRUE + open = !open + to_chat(user, SPAN_NOTICE("You flip \the [src] [open ? "open" : "closed"].")) + if(open && held) + to_chat(user, SPAN_DANGER("\The [held] falls out!")) + held.dropInto(user.loc) + held = null + update_icon() + return TRUE + +/obj/item/pendant/locket/on_update_icon() + . = ..() + icon_state = get_pendant_base_state(get_world_inventory_state()) + if(istype(loc, /obj/item)) + loc.update_icon() + +/obj/item/pendant/locket/get_pendant_base_state(base_state) + . = ..() + if(open) + . = "[.]-open" + +/obj/item/pendant/locket/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && open) + var/pendant_state = get_pendant_base_state(overlay.icon_state) + if(check_state_in_icon(pendant_state, overlay.icon)) + overlay.icon_state = pendant_state + return ..() + +/obj/item/pendant/locket/attackby(obj/item/used_item, mob/user) + if(!open) + to_chat(user, SPAN_WARNING("You have to open it first.")) + return TRUE + if(istype(used_item, /obj/item/paper) || istype(used_item, /obj/item/photo)) + if(held) + to_chat(user, SPAN_WARNING("\The [src] already has something inside it.")) + else if(user.try_unequip(used_item, src)) + to_chat(user, SPAN_NOTICE("You slip \the [used_item] into \the [src].")) + held = used_item + return TRUE + return ..() \ No newline at end of file diff --git a/code/modules/clothing/neck/necklace/pendant_random.dm b/code/modules/clothing/neck/necklace/pendant_random.dm new file mode 100644 index 00000000000..f17171032c6 --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_random.dm @@ -0,0 +1,27 @@ +/obj/item/pendant/prism/random/Initialize(ml, material_key) + material_key = list(global.random_jewellery_gem_types) + . = ..() + +/obj/item/pendant/frill/random/Initialize(ml, material_key) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/square/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/cross/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/diamond/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() + +/obj/item/pendant/setting/ornate/random/Initialize(ml, material_key) + decorations = list(pick(global.random_jewellery_gem_types)) + material_key = pick(global.random_jewellery_material_types) + . = ..() diff --git a/code/modules/clothing/neck/necklace/pendant_setting.dm b/code/modules/clothing/neck/necklace/pendant_setting.dm new file mode 100644 index 00000000000..80e79b13cf2 --- /dev/null +++ b/code/modules/clothing/neck/necklace/pendant_setting.dm @@ -0,0 +1,36 @@ +// Pendant with a setting for a stone. +/obj/item/pendant/setting + abstract_type = /obj/item/pendant/setting + +// Duplicating some logic here to consistently insert the gem name where appropriate. +/obj/item/pendant/setting/get_name_components() + . = list() + if(name_prefix) + . += name_prefix + if(material) + . += material.adjective_name + var/obj/item/gemstone/gem = locate() in contents + if(gem) + . += gem.name + . += name // base_name has already been applied by parent call + +// Subtypes below. +/obj/item/pendant/setting/square + name_prefix = "square" + desc = "A square-shaped pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/square.dmi' + +/obj/item/pendant/setting/cross + name = "cross" + desc = "A hard-edged cross pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/cross.dmi' + +/obj/item/pendant/setting/diamond + name_prefix = "diamond" + desc = "A diamond-shaped pendant." + icon = 'icons/clothing/accessories/jewelry/pendants/diamond.dmi' + +/obj/item/pendant/setting/ornate + name_prefix = "ornate" + desc = "An ornate set of pendants." + icon = 'icons/clothing/accessories/jewelry/pendants/ornate.dmi' diff --git a/code/modules/clothing/neck/prayer_beads.dm b/code/modules/clothing/neck/prayer_beads.dm new file mode 100644 index 00000000000..0c081e35108 --- /dev/null +++ b/code/modules/clothing/neck/prayer_beads.dm @@ -0,0 +1,29 @@ +/obj/item/clothing/neck/prayer_beads + name = "prayer beads" + desc = "A string of smooth, polished beads." + icon = 'icons/clothing/accessories/jewelry/prayer_beads.dmi' + gender = PLURAL + material = /decl/material/solid/organic/wood/ebony + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/clothing/neck/prayer_beads/gold + material = /decl/material/solid/metal/gold + +/obj/item/clothing/neck/prayer_beads/basalt + material = /decl/material/solid/stone/basalt + +/obj/item/clothing/neck/prayer_beads/bone + material = /decl/material/solid/organic/bone + +/obj/item/clothing/neck/prayer_beads/random + var/list/random_materials = list( + /decl/material/solid/organic/bone, + /decl/material/solid/stone/marble, + /decl/material/solid/stone/basalt, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/ebony + ) + +/obj/item/clothing/neck/prayer_beads/random/Initialize() + material = pick(random_materials) + return ..() diff --git a/code/modules/clothing/neck/stethoscope.dm b/code/modules/clothing/neck/stethoscope.dm index 903491c3c0a..b4ccdd76243 100644 --- a/code/modules/clothing/neck/stethoscope.dm +++ b/code/modules/clothing/neck/stethoscope.dm @@ -5,7 +5,7 @@ accessory_visibility = ACCESSORY_VISIBILITY_ATTACHMENT /obj/item/clothing/neck/stethoscope/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(ishuman(target) && isliving(user) && user.a_intent == I_HELP) + if(ishuman(target) && isliving(user) && user.check_intent(I_FLAG_HELP)) var/obj/item/organ/organ = GET_EXTERNAL_ORGAN(target, user.get_target_zone()) if(organ) user.visible_message( diff --git a/code/modules/clothing/pants/_pants.dm b/code/modules/clothing/pants/_pants.dm index f0fd128a5fc..89f3e1c5b43 100644 --- a/code/modules/clothing/pants/_pants.dm +++ b/code/modules/clothing/pants/_pants.dm @@ -9,8 +9,3 @@ w_class = ITEM_SIZE_NORMAL fallback_slot = slot_w_uniform_str valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES - -/obj/item/clothing/pants/get_associated_equipment_slots() - . = ..() - var/static/list/pants_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., pants_slots) diff --git a/code/modules/clothing/shirts/_shirts.dm b/code/modules/clothing/shirts/_shirts.dm index ff3eeb08056..7b841100fd4 100644 --- a/code/modules/clothing/shirts/_shirts.dm +++ b/code/modules/clothing/shirts/_shirts.dm @@ -5,8 +5,3 @@ slot_flags = SLOT_UPPER_BODY accessory_slot = ACCESSORY_SLOT_DECOR fallback_slot = slot_w_uniform_str - -/obj/item/clothing/shirt/get_associated_equipment_slots() - . = ..() - var/static/list/shirt_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., shirt_slots) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index aa9b8d82291..bd4284407d8 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -24,7 +24,7 @@ var/hidden_item_max_w_class = ITEM_SIZE_SMALL var/obj/item/hidden_item = null var/shine = -1 // if material should apply shine overlay. Set to -1 for it to not do that - + var/footprint_icon = 'icons/mob/footprints/footprints.dmi' /// A multiplier applied to footstep volume. var/footstep_volume_mod = 1 /// A multiplier applied to footstep range. @@ -162,10 +162,6 @@ attached_cuffs = null return -/obj/item/clothing/shoes/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_shoes_str) - /obj/item/clothing/shoes/set_material(var/new_material) ..() if(shine != -1 && material.reflectiveness >= MAT_VALUE_DULL) diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 04ffa05e7be..0df136daa33 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -84,7 +84,6 @@ icon = 'icons/clothing/feet/sandals.dmi' bodytype_equip_flags = null body_parts_covered = 0 - wizard_garb = 1 can_add_hidden_item = FALSE can_add_cuffs = FALSE diff --git a/code/modules/clothing/skirts/_skirt.dm b/code/modules/clothing/skirts/_skirt.dm index 4ec2f85f32d..893909ee364 100644 --- a/code/modules/clothing/skirts/_skirt.dm +++ b/code/modules/clothing/skirts/_skirt.dm @@ -8,8 +8,3 @@ w_class = ITEM_SIZE_NORMAL valid_accessory_slots = UNIFORM_DEFAULT_ACCESSORIES fallback_slot = slot_w_uniform_str - -/obj/item/clothing/skirt/get_associated_equipment_slots() - . = ..() - var/static/list/under_slots = list(slot_w_uniform_str, slot_wear_id_str) - LAZYDISTINCTADD(., under_slots) diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index f4f98e4ae1e..ff88b304078 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -48,7 +48,7 @@ /obj/item/rig_module/device/flash/installed() . = ..() - if(!holder.gloves)//gives select option for gloveless suits, why even use rig at this point + if(!holder?.gloves)//gives select option for gloveless suits, why even use rig at this point selectable = 1 activates_on_touch = 0 toggleable = 0 @@ -215,10 +215,6 @@ var/obj/item/gun/gun -/obj/item/rig_module/mounted/Destroy() - QDEL_NULL(gun) - . = ..() - /obj/item/rig_module/mounted/Initialize() . = ..() if(ispath(gun)) @@ -320,7 +316,7 @@ if(!check() || !gun) return 0 - if(holder.wearer.a_intent == I_HURT || !target.Adjacent(holder.wearer)) + if(holder.wearer.check_intent(I_FLAG_HARM) || !target.Adjacent(holder.wearer)) gun.Fire(target,holder.wearer) return 1 else diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index b3d1533d3b6..abf699315de 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -313,14 +313,16 @@ voice_holder.active = 0 /obj/item/rig_module/voice/installed() - ..() - holder.speech = src - holder.verbs |= /obj/item/rig/proc/alter_voice + . = ..() + if(holder) + holder.speech = src + holder.verbs |= /obj/item/rig/proc/alter_voice /obj/item/rig_module/voice/removed() - ..() - holder.speech = null - holder.verbs -= /obj/item/rig/proc/alter_voice + if(holder) + holder.speech = null + holder.verbs -= /obj/item/rig/proc/alter_voice + . = ..() /obj/item/rig_module/voice/engage() @@ -368,7 +370,7 @@ deactivate_string = "Deactivate Thrusters" interface_name = "maneuvering jets" - interface_desc = "An inbuilt EVA maneuvering system that runs off a seperate gas supply." + interface_desc = "An inbuilt EVA maneuvering system that runs off a separate gas supply." origin_tech = @'{"materials":6,"engineering":7}' material = /decl/material/solid/metal/steel matter = list( @@ -454,14 +456,7 @@ use_power_cost = 200 usable = 1 selectable = 0 - device = /obj/item/paper_bin - -/obj/item/rig_module/device/paperdispenser/engage(atom/target) - if(!..() || !device) - return FALSE - if(!target) - device.attack_hand_with_interaction_checks(holder.wearer) - return TRUE + device = /obj/item/form_printer /obj/item/rig_module/device/pen name = "mounted pen" diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index 3b19bf49653..9ba365b34fa 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -160,8 +160,14 @@ // There should only ever be one vision module installed in a suit. /obj/item/rig_module/vision/installed() - ..() - holder.visor = src + . = ..() + if(holder) + holder.visor = src + +/obj/item/rig_module/vision/removed() + if(holder) + holder.visor = null + . = ..() /obj/item/rig_module/vision/engage() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 0002058a65f..f9f4f356c2b 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -264,7 +264,7 @@ wearer.visible_message( SPAN_HARDSUIT("[wearer]'s suit emits a quiet hum as it begins to adjust its seals."), SPAN_HARDSUIT("With a quiet hum, the suit begins running checks and adjusting components.")) - if(seal_delay && !do_after(wearer,seal_delay, src)) + if(seal_delay && !do_after(wearer, seal_delay, src)) if(wearer) to_chat(wearer, "You must remain still while the suit is adjusting the components.") failed_to_seal = 1 @@ -299,7 +299,7 @@ var/obj/item/compare_piece = piece_data[2] var/msg_type = piece_data[3] - if(!piece) + if(!piece || !compare_piece) continue if(!istype(wearer) || !istype(piece) || !istype(compare_piece) || !msg_type) diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 22a1e57aafe..896bd3db241 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -1,6 +1,6 @@ //Spacesuit //Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together. -// Meaning the the suit is defined directly after the corrisponding helmet. Just like below! +// Meaning the suit is defined directly after the corresponding helmet. Just like below! /obj/item/clothing/head/helmet/space name = "space helmet" diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm deleted file mode 100644 index 48dfc6d852a..00000000000 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ /dev/null @@ -1,66 +0,0 @@ -//Wizard Rig -/obj/item/clothing/head/helmet/space/void/wizard - name = "gem-encrusted voidsuit helmet" - desc = "A bizarre gem-encrusted helmet that radiates magical energies." - icon = 'icons/clothing/spacesuit/void/wizard/helmet.dmi' - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 - wizard_garb = 1 - -/obj/item/clothing/suit/space/void/wizard - name = "gem-encrusted voidsuit" - 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 - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 - wizard_garb = 1 - flags_inv = HIDESHOES|HIDEJUMPSUIT|HIDETAIL //For gloves. - body_parts_covered = SLOT_UPPER_BODY | SLOT_LOWER_BODY | SLOT_LEGS | SLOT_FEET | SLOT_ARMS | SLOT_TAIL - cold_protection = SLOT_UPPER_BODY | SLOT_LOWER_BODY | SLOT_LEGS | SLOT_FEET | SLOT_ARMS | SLOT_TAIL - -/obj/item/clothing/suit/space/void/wizard/Initialize() - . = ..() - LAZYSET(slowdown_per_slot, slot_wear_suit_str, 1) - -/obj/item/clothing/gloves/wizard - name = "mystical gloves" - desc = "Reinforced, gem-studded gloves that radiate energy. They look like they go along with a matching voidsuit." - color = COLOR_VIOLET - item_flags = ITEM_FLAG_THICKMATERIAL - body_parts_covered = SLOT_HANDS - cold_protection = SLOT_HANDS - min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE - bodytype_equip_flags = null - gender = PLURAL - gas_transfer_coefficient = 0.01 - permeability_coefficient = 0.02 - material = /decl/material/solid/gemstone/crystal - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = ARMOR_RAD_SMALL - ) - siemens_coefficient = 0.7 diff --git a/code/modules/clothing/suits/_suit.dm b/code/modules/clothing/suits/_suit.dm index f256b84311f..7b4809a3b42 100644 --- a/code/modules/clothing/suits/_suit.dm +++ b/code/modules/clothing/suits/_suit.dm @@ -16,10 +16,6 @@ /obj/item/clothing/suit/gives_weather_protection() return protects_against_weather -/obj/item/clothing/suit/get_associated_equipment_slots() - . = ..() - LAZYDISTINCTADD(., slot_wear_suit_str) - /obj/item/clothing/suit/preserve_in_cryopod(var/obj/machinery/cryopod/pod) return TRUE diff --git a/code/modules/clothing/suits/armor/_armor.dm b/code/modules/clothing/suits/armor/_armor.dm index d7fcd4281c2..eef73b5c8fa 100644 --- a/code/modules/clothing/suits/armor/_armor.dm +++ b/code/modules/clothing/suits/armor/_armor.dm @@ -11,7 +11,14 @@ /obj/item/baton, /obj/item/handcuffs, /obj/item/gun/magnetic, - /obj/item/clothing/head/helmet + /obj/item/clothing/head/helmet, + /obj/item/shield/crafted/buckler, + /obj/item/bladed/knife, + /obj/item/bladed/shortsword, + /obj/item/bladed/longsword, + /obj/item/bladed/axe, + /obj/item/flame/torch, + /obj/item/flame/fuelled/lantern ) body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY item_flags = ITEM_FLAG_THICKMATERIAL diff --git a/code/modules/clothing/suits/armor/craftable.dm b/code/modules/clothing/suits/armor/craftable.dm index ddca0ec73ba..824a7c5b553 100644 --- a/code/modules/clothing/suits/armor/craftable.dm +++ b/code/modules/clothing/suits/armor/craftable.dm @@ -33,5 +33,5 @@ material = /decl/material/solid/gemstone/diamond /obj/item/clothing/suit/armor/crafted/gold material = /decl/material/solid/metal/gold -/obj/item/clothing/suit/armor/crafted/supermatter - material = /decl/material/solid/supermatter +/obj/item/clothing/suit/armor/crafted/exotic_matter + material = /decl/material/solid/exotic_matter diff --git a/code/modules/clothing/suits/armor/forged/brigandine.dm b/code/modules/clothing/suits/armor/forged/brigandine.dm index 98583fb6b03..f790258a962 100644 --- a/code/modules/clothing/suits/armor/forged/brigandine.dm +++ b/code/modules/clothing/suits/armor/forged/brigandine.dm @@ -10,3 +10,4 @@ name = "gambeson" desc = "A quilted, padded jacket, typically worn underneath heavier armour." icon = 'icons/clothing/shirts/gambeson.dmi' + material = /decl/material/solid/organic/cloth/wool diff --git a/code/modules/clothing/suits/armor/merc.dm b/code/modules/clothing/suits/armor/merc.dm index 869b423be90..a138ef7b732 100644 --- a/code/modules/clothing/suits/armor/merc.dm +++ b/code/modules/clothing/suits/armor/merc.dm @@ -9,7 +9,7 @@ /obj/item/clothing/armor_attachment/plate/merc name = "heavy armor plate" - desc = "A diamond-reinforced titanium armor plate, providing state of of the art protection. Attaches to a plate carrier." + desc = "A diamond-reinforced titanium armor plate, providing state of the art protection. Attaches to a plate carrier." icon = 'icons/clothing/accessories/armor/armor_merc.dmi' armor = list( ARMOR_MELEE = ARMOR_MELEE_RESISTANT, diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index dea74926342..5888d3ec832 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -1,15 +1,17 @@ -/obj/item/clothing/suit/cloak // A colorable cloak - name = "plain cloak" - desc = "A simple, bland cloak." - icon = 'icons/clothing/suits/cloaks/_cloak.dmi' - w_class = ITEM_SIZE_NORMAL - slot_flags = SLOT_OVER_BODY - allowed = list(/obj/item/tank/emergency/oxygen) - armor = list(ARMOR_MELEE = 0, ARMOR_BULLET = 0, ARMOR_LASER = 0,ARMOR_ENERGY = 0, ARMOR_BOMB = 0, ARMOR_BIO = 0, ARMOR_RAD = 0) - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS - siemens_coefficient = 0.9 - accessory_slot = ACCESSORY_SLOT_OVER +// A colorable cloak +/obj/item/clothing/suit/cloak + name = "plain cloak" + desc = "A simple, bland cloak." + icon = 'icons/clothing/suits/cloaks/_cloak.dmi' + w_class = ITEM_SIZE_NORMAL + slot_flags = SLOT_OVER_BODY + allowed = list(/obj/item/tank/emergency/oxygen) + armor = null + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS + siemens_coefficient = 0.9 + accessory_slot = ACCESSORY_SLOT_OVER accessory_visibility = ACCESSORY_VISIBILITY_ATTACHMENT + storage = /datum/storage/pockets/suit /obj/item/clothing/suit/cloak/on_update_icon() . = ..() diff --git a/code/modules/clothing/suits/hooded_cloak.dm b/code/modules/clothing/suits/hooded_cloak.dm index 24964e2f77a..36018720bb6 100644 --- a/code/modules/clothing/suits/hooded_cloak.dm +++ b/code/modules/clothing/suits/hooded_cloak.dm @@ -8,11 +8,12 @@ w_class = ITEM_SIZE_NORMAL slot_flags = SLOT_OVER_BODY allowed = list(/obj/item/tank/emergency/oxygen) - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS|SLOT_HANDS|SLOT_FEET accessory_slot = ACCESSORY_SLOT_OVER accessory_visibility = ACCESSORY_VISIBILITY_ATTACHMENT hood = /obj/item/clothing/head/hood/cloak material_alteration = MAT_FLAG_ALTERATION_ALL + material = /decl/material/solid/organic/cloth/wool /obj/item/clothing/suit/hooded_cloak/get_assumed_clothing_state_modifiers() var/static/list/expected_state_modifiers = list( diff --git a/code/modules/clothing/suits/jackets/_jacket.dm b/code/modules/clothing/suits/jackets/_jacket.dm index 3486a1c88e1..abdd83bf2d4 100644 --- a/code/modules/clothing/suits/jackets/_jacket.dm +++ b/code/modules/clothing/suits/jackets/_jacket.dm @@ -8,6 +8,7 @@ slot_flags = SLOT_OVER_BODY w_class = ITEM_SIZE_NORMAL accessory_slot = ACCESSORY_SLOT_DECOR + storage = /datum/storage/pockets/suit valid_accessory_slots = list( ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMBAND, diff --git a/code/modules/clothing/suits/jackets/hoodies.dm b/code/modules/clothing/suits/jackets/hoodies.dm index fcbd38712c8..adfd915c60a 100644 --- a/code/modules/clothing/suits/jackets/hoodies.dm +++ b/code/modules/clothing/suits/jackets/hoodies.dm @@ -18,13 +18,6 @@ desc = "A warm, black sweatshirt." color = COLOR_DARK_GRAY -/obj/item/clothing/suit/jacket/hoodie/get_assumed_clothing_state_modifiers() - var/static/list/expected_state_modifiers = list( - GET_DECL(/decl/clothing_state_modifier/buttons), - GET_DECL(/decl/clothing_state_modifier/hood) - ) - return expected_state_modifiers - /obj/item/clothing/head/hoodiehood name = "hoodie hood" desc = "A hood attached to a warm sweatshirt." diff --git a/code/modules/clothing/suits/mantle.dm b/code/modules/clothing/suits/mantle.dm index 6d7888cfebb..94824410806 100644 --- a/code/modules/clothing/suits/mantle.dm +++ b/code/modules/clothing/suits/mantle.dm @@ -1,7 +1,8 @@ /obj/item/clothing/suit/mantle - name = "mantle" - desc = "A light garment worn draped over and around the shoulders." - icon = 'icons/clothing/suits/mantle.dmi' + name = "mantle" + desc = "A garment worn draped over and around the shoulders." + icon = 'icons/clothing/suits/mantle.dmi' + material = /decl/material/solid/organic/cloth/wool accessory_slot = ACCESSORY_SLOT_OVER /obj/item/clothing/suit/mantle/fated diff --git a/code/modules/clothing/suits/misc.dm b/code/modules/clothing/suits/misc.dm new file mode 100644 index 00000000000..eb58d81b67e --- /dev/null +++ b/code/modules/clothing/suits/misc.dm @@ -0,0 +1,5 @@ +/obj/item/clothing/suit/gentlecoat + name = "gentleman's coat" + desc = "A heavy-threaded gray tweed jacket." + icon = 'icons/clothing/suits/wizard/gentleman.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS diff --git a/code/modules/clothing/suits/robes.dm b/code/modules/clothing/suits/robes.dm index 4ffdbf004b7..eabd216c555 100644 --- a/code/modules/clothing/suits/robes.dm +++ b/code/modules/clothing/suits/robes.dm @@ -3,11 +3,18 @@ desc = "A simple garment." icon = 'icons/clothing/suits/rough_robe.dmi' gender = PLURAL + cold_protection = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC slot_flags = SLOT_UPPER_BODY | SLOT_OVER_BODY accessory_slot = ACCESSORY_SLOT_DECOR +/obj/item/clothing/suit/robe/sleeved + desc = "A simple garment with long sleeves." + cold_protection = SLOT_ARMS|SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS + body_parts_covered = SLOT_ARMS|SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS + icon = 'icons/clothing/suits/sleeved_robe.dmi' + /obj/item/clothing/suit/robe/thawb name = "thawb" gender = NEUTER diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm deleted file mode 100644 index 16dd6386ebb..00000000000 --- a/code/modules/clothing/suits/wiz_robe.dm +++ /dev/null @@ -1,113 +0,0 @@ -/obj/item/clothing/head/wizard - name = "wizard hat" - desc = "Strange-looking hat-wear that most certainly belongs to a real magic user." - icon = 'icons/clothing/head/wizard/wizard.dmi' - //Not given any special protective value since the magic robes are full-body protection --NEO - siemens_coefficient = 0.8 - body_parts_covered = 0 - wizard_garb = 1 - -/obj/item/clothing/head/wizard/red - name = "red wizard hat" - desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user." - icon = 'icons/clothing/head/wizard/red.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/head/wizard/fake - name = "wizard hat" - desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." - icon = 'icons/clothing/head/wizard/fake.dmi' - body_parts_covered = SLOT_HEAD|SLOT_FACE - -/obj/item/clothing/head/wizard/marisa - name = "witch hat" - desc = "Strange-looking hat-wear, makes you want to cast fireballs." - icon = 'icons/clothing/head/wizard/marisa.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/head/wizard/magus - name = "magus helm" - desc = "A mysterious helmet that hums with an unearthly power." - icon = 'icons/clothing/head/wizard/magus.dmi' - siemens_coefficient = 0.8 - body_parts_covered = SLOT_HEAD|SLOT_FACE|SLOT_EYES - -/obj/item/clothing/head/wizard/cap - name = "gentleman's cap" - desc = "A checkered gray flat cap woven together with the rarest of threads." - icon = 'icons/clothing/head/flatcap.dmi' - siemens_coefficient = 0.8 - -/obj/item/clothing/suit/wizrobe - name = "wizard robe" - desc = "A magnificant, gem-lined robe that seems to radiate power." - icon = 'icons/clothing/suits/wizard/wizard.dmi' - gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE - permeability_coefficient = 0.01 - armor = list( - ARMOR_MELEE = ARMOR_MELEE_RESISTANT, - ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, - ARMOR_LASER = ARMOR_LASER_SMALL, - ARMOR_ENERGY = ARMOR_ENERGY_SMALL, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR, - ARMOR_RAD = ARMOR_RAD_MINOR - ) - allowed = list(/obj/item/paper/scroll) - siemens_coefficient = 0.8 - wizard_garb = 1 - -/obj/item/clothing/suit/wizrobe/red - name = "red wizard robe" - desc = "A magnificant, red, gem-lined robe that seems to radiate power." - icon = 'icons/clothing/suits/wizard/red.dmi' - -/obj/item/clothing/suit/wizrobe/marisa - name = "witch robe" - desc = "Magic is all about the spell power, ZE!" - icon = 'icons/clothing/suits/wizard/marisa.dmi' - -/obj/item/clothing/suit/wizrobe/magusblue - name = "magus robe" - desc = "A set of armoured robes that seem to radiate a dark power." - icon = 'icons/clothing/suits/wizard/magusblue.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET - -/obj/item/clothing/suit/wizrobe/magusred - name = "magus robe" - desc = "A set of armoured robes that seem to radiate a dark power." - icon = 'icons/clothing/suits/wizard/magusred.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET - -/obj/item/clothing/suit/wizrobe/psypurple - name = "purple robes" - desc = "Heavy, royal purple robes threaded with psychic amplifiers and weird, bulbous lenses. Do not machine wash." - icon = 'icons/clothing/suits/wizard/psy.dmi' - gender = PLURAL - -/obj/item/clothing/suit/wizrobe/gentlecoat - name = "gentleman's coat" - desc = "A heavy threaded tweed gray jacket. For a different sort of Gentleman." - icon = 'icons/clothing/suits/wizard/gentleman.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS - -/obj/item/clothing/suit/wizrobe/fake - name = "wizard robe" - desc = "A rather dull, blue robe meant to mimick real wizard robes." - icon = 'icons/clothing/suits/wizard/fake.dmi' - armor = null - siemens_coefficient = 1.0 - -/obj/item/clothing/head/wizard/marisa/fake - name = "witch hat" - desc = "Strange-looking hat-wear, makes you want to cast fireballs." - armor = null - siemens_coefficient = 1.0 - -/obj/item/clothing/suit/wizrobe/marisa/fake - name = "witch robe" - desc = "Magic is all about the spell power, ZE!" - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS - armor = null - siemens_coefficient = 1.0 - diff --git a/code/modules/clothing/suits/wizard.dm b/code/modules/clothing/suits/wizard.dm new file mode 100644 index 00000000000..c8f0208fb4d --- /dev/null +++ b/code/modules/clothing/suits/wizard.dm @@ -0,0 +1,25 @@ +// Props from wizard mode, preserved as costume pieces. +/obj/item/clothing/suit/wizrobe + name = "wizard robe" + desc = "A rather ratty blue robe." + icon = 'icons/clothing/suits/wizard/wizard.dmi' + allowed = list(/obj/item/paper/scroll) + +/obj/item/clothing/suit/wizrobe/red + name = "red wizard robe" + desc = "A rather ratty red robe." + icon = 'icons/clothing/suits/wizard/red.dmi' + +/obj/item/clothing/suit/wizrobe/marisa + name = "witch robe" + desc = "Magic is all about the spell power, ZE!" + icon = 'icons/clothing/suits/wizard/marisa.dmi' + +/obj/item/clothing/suit/wizrobe/magus + name = "magus robe" + desc = "A set of mysterious armoured robes." + icon = 'icons/clothing/suits/wizard/magusblue.dmi' + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_HANDS|SLOT_LEGS|SLOT_FEET + +/obj/item/clothing/suit/wizrobe/magus/red + icon = 'icons/clothing/suits/wizard/magusred.dmi' diff --git a/code/modules/clothing/webbing/holster.dm b/code/modules/clothing/webbing/holster.dm index 47ca037c939..1d49eaabc2b 100644 --- a/code/modules/clothing/webbing/holster.dm +++ b/code/modules/clothing/webbing/holster.dm @@ -12,25 +12,24 @@ . = ..() set_extension(src, /datum/extension/holster, storage, sound_in, sound_out, can_holster) -/obj/item/clothing/webbing/holster/attackby(obj/item/W, mob/user) - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) - if(H.holster(W, user)) +/obj/item/clothing/webbing/holster/attackby(obj/item/used_item, mob/user) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + if(holster.holster(used_item, user)) return TRUE - else - . = ..(W, user) + return ..(used_item, user) /obj/item/clothing/webbing/holster/attack_hand(mob/user) if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) - if(H.unholster(user)) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + if(holster.unholster(user)) return TRUE return ..() /obj/item/clothing/webbing/holster/examine(mob/user) . = ..(user) - var/datum/extension/holster/H = get_extension(src, /datum/extension/holster) - H.examine_holster(user) + var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) + holster.examine_holster(user) /obj/item/clothing/webbing/holster/on_attached(var/obj/item/clothing/holder, var/mob/user) . = ..() diff --git a/code/modules/codex/categories/category_phenomena.dm b/code/modules/codex/categories/category_phenomena.dm index f9777ed43fa..e2637bf9e73 100644 --- a/code/modules/codex/categories/category_phenomena.dm +++ b/code/modules/codex/categories/category_phenomena.dm @@ -4,16 +4,16 @@ /decl/codex_category/phenomena/Populate() - // This needs duplicate checking but I resent even having to spend time on spellcode. - var/list/spells = list() - for(var/thing in subtypesof(/spell)) - var/spell/spell = thing - if(!initial(spell.hidden_from_codex) && initial(spell.desc) && initial(spell.name)) - spells["[initial(spell.name)] (phenomena)"] = initial(spell.desc) - for(var/spell in spells) + var/list/abilities = list() + for(var/decl/ability/ability in decls_repository.get_decls_of_subtype_unassociated(/decl/ability)) + if(ability.hidden_from_codex || !ability.is_supernatural || !ability.desc) + continue + abilities["[ability.name] (phenomena)"] = ability.desc + + for(var/ability in abilities) var/datum/codex_entry/entry = new( - _display_name = spell, - _antag_text = spells[spell] + _display_name = ability, + _antag_text = abilities[ability] ) items |= entry.name . = ..() diff --git a/code/modules/codex/categories/category_recipes.dm b/code/modules/codex/categories/category_recipes.dm index 292eca01761..caf8064f577 100644 --- a/code/modules/codex/categories/category_recipes.dm +++ b/code/modules/codex/categories/category_recipes.dm @@ -40,7 +40,7 @@ if(!product) continue lore_text = initial(product.lore_text) - if(ispath(food.result, /decl/material/liquid/drink) || ispath(food.result, /decl/material/liquid/ethanol)) + if(ispath(food.result, /decl/material/liquid/drink) || ispath(food.result, /decl/material/liquid/alcohol)) category_name = "drink recipe" mechanics_text = "This recipe produces [food.result_amount]u [product.name].
It should be performed in a glass or shaker, and requires the following ingredients:" else diff --git a/code/modules/codex/categories/category_substances.dm b/code/modules/codex/categories/category_substances.dm index e17ac5d3e66..e8c96d49b72 100644 --- a/code/modules/codex/categories/category_substances.dm +++ b/code/modules/codex/categories/category_substances.dm @@ -77,7 +77,7 @@ else if(mat.dissolves_in <= MAT_SOLVENT_MODERATE) solvent_needed = "a moderately strong solvent, like acetone" else if(mat.dissolves_in <= MAT_SOLVENT_STRONG) - solvent_needed = "a strong solvent, like sulphuric acid" + solvent_needed = "a strong solvent, like sulfuric acid" material_info += "
  • It can be dissolved with [solvent_needed] solvent, producing [english_list(chems)].
  • " if(mat.radioactivity) material_info += "
  • It is radioactive.
  • " diff --git a/code/modules/codex/codex_atom.dm b/code/modules/codex/codex_atom.dm index ebe02e59ab7..49d718ebbff 100644 --- a/code/modules/codex/codex_atom.dm +++ b/code/modules/codex/codex_atom.dm @@ -36,5 +36,8 @@ /atom/examine(mob/user, distance, infix = "", suffix = "") . = ..() + var/decl/interaction_handler/handler = get_quick_interaction_handler(user) + if(handler) + to_chat(user, SPAN_NOTICE("Ctrl-click \the [src] while in your inventory to [lowertext(handler.name)].")) 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, SPAN_NOTICE("The codex has relevant information available.")) diff --git a/code/modules/codex/codex_implant.dm b/code/modules/codex/codex_implant.dm index 6918ebd175a..48d57b472ed 100644 --- a/code/modules/codex/codex_implant.dm +++ b/code/modules/codex/codex_implant.dm @@ -8,4 +8,4 @@ /obj/item/implant/codex/implanted(var/mob/source) . = ..(source) - to_chat(usr, "You feel the brief sensation of having an entire encyclopedia at the tip of your tongue as the codex implant meshes with your nervous system.") + to_chat(imp_in, SPAN_NOTICE("You feel the brief sensation of having an entire encyclopedia at the tip of your tongue as the codex implant meshes with your nervous system.")) diff --git a/code/modules/codex/entries/atmospherics.dm b/code/modules/codex/entries/atmospherics.dm index 9111548f4ae..a6da8b6771f 100644 --- a/code/modules/codex/entries/atmospherics.dm +++ b/code/modules/codex/entries/atmospherics.dm @@ -19,7 +19,7 @@ //Normal valves /datum/codex_entry/atmos_valve associated_paths = list(/obj/machinery/atmospherics/valve) - mechanics_text = "Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected." + mechanics_text = "Click this to turn the valve. If red, the pipes on each end are separated. Otherwise, they are connected." disambiguator = "atmospherics" available_to_map_tech_level = MAP_TECH_LEVEL_SPACE diff --git a/code/modules/codex/entries/engineering.dm b/code/modules/codex/entries/engineering.dm index f6f9b4a7c00..f5e9ac99fa3 100644 --- a/code/modules/codex/entries/engineering.dm +++ b/code/modules/codex/entries/engineering.dm @@ -1,20 +1,3 @@ -/datum/codex_entry/supermatter - associated_paths = list(/obj/machinery/power/supermatter) - mechanics_text = "When energized by a laser (or something hitting it), it emits radiation and heat. If the heat reaches above 7000 kelvin, it will send an alert and start taking damage. \ - After integrity falls to zero percent, it will delaminate, causing a massive explosion, station-wide radiation spikes, and hallucinations. \ - Supermatter reacts badly to oxygen in the atmosphere. It'll also heat up really quick if it is in vacuum.
    \ -
    \ - Supermatter cores are extremely dangerous to be close to, and requires protection to handle properly. The protection you will need is:
    \ - Optical meson scanners on your eyes, to prevent hallucinations when looking at the supermatter.
    \ - Radiation helmet and suit, as the supermatter is radioactive.
    \ -
    \ - Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you. \ - It is advised to obtain a genetic backup before trying to drag it." - antag_text = "Exposing the supermatter to oxygen or vaccum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \ - cause a period of lag as the explosion is processed by the server, as well as irradiating the entire station and causing hallucinations to happen. \ - Wearing radiation equipment will protect you from most of the delamination effects sans explosion." - available_to_map_tech_level = MAP_TECH_LEVEL_SPACE - /datum/codex_entry/apc associated_paths = list(/obj/machinery/power/apc) mechanics_text = "An APC (Area Power Controller) regulates and supplies backup power for the area they are in. Their power channels are divided \ diff --git a/code/modules/codex/entries/guides.dm b/code/modules/codex/entries/guides.dm index 4ed96a6c0cf..747a279d691 100644 --- a/code/modules/codex/entries/guides.dm +++ b/code/modules/codex/entries/guides.dm @@ -601,10 +601,6 @@ /datum/codex_entry/guide/construction name = "Guide to Construction" -/datum/codex_entry/guide/supermatter - name = "Guide to Supermatter Engines" - available_to_map_tech_level = MAP_TECH_LEVEL_SPACE - /datum/codex_entry/guide/fusion name = "Guide to Fusion Reactors" available_to_map_tech_level = MAP_TECH_LEVEL_SPACE diff --git a/code/modules/codex/entries/guns.dm b/code/modules/codex/entries/guns.dm index eefcbd251aa..ffdbb675590 100644 --- a/code/modules/codex/entries/guns.dm +++ b/code/modules/codex/entries/guns.dm @@ -35,7 +35,7 @@ traits += "It's best fired with a two-handed grip." if(has_safety) - traits += "It has a safety switch. Control-Click it to toggle safety." + traits += "It has a safety switch, which can be toggled via ctrl-click or selecting Toggle Safety from the alt-click radial." if(is_secure_gun()) traits += "It's fitted with a secure registration chip. Swipe ID on it to register." diff --git a/code/modules/crafting/forging/bellows.dm b/code/modules/crafting/forging/bellows.dm new file mode 100644 index 00000000000..3402f4c2cfa --- /dev/null +++ b/code/modules/crafting/forging/bellows.dm @@ -0,0 +1,40 @@ +/obj/structure/working/bellows + name = "bellows" + desc = "An air pump used to improve the heat of a furnace." + icon = 'icons/obj/structures/forging/bellows.dmi' + obj_flags = OBJ_FLAG_ANCHORABLE | OBJ_FLAG_ROTATABLE + work_skill = SKILL_HAULING + var/decl/material/bellows_material = /decl/material/solid/organic/leather + +/obj/structure/working/bellows/Initialize() + bellows_material = GET_DECL(bellows_material) + . = ..() + +/obj/structure/working/bellows/on_update_icon() + . = ..() + underlays = list(overlay_image(icon, "[icon_state]-bellows", bellows_material.color, RESET_COLOR)) + +/obj/structure/working/bellows/try_start_working(mob/user) + + var/obj/structure/fire_source/stoking = locate() in get_step(loc, EAST) + if(!istype(stoking) || !stoking.lit) + to_chat(user, SPAN_WARNING("\The [src] must face east towards a lit fire source; it would be pointless to work them currently.")) + return TRUE + + to_chat(user, SPAN_NOTICE("You begin working \the [src], stoking \the [stoking] to a hotter flame.")) + start_working() + while(user.do_skilled(3 SECONDS, work_skill, src)) + if(QDELETED(src) || QDELETED(user) || user.get_stamina() <= 0) + break + stoking = locate() in get_step(loc, EAST) + if(!istype(stoking) || !stoking.lit) + break + user.adjust_stamina(-25) + stoking.bellows_oxygenation = max(50, stoking.bellows_oxygenation+3) + + if(!QDELETED(user)) + to_chat(user, SPAN_NOTICE("You stop working \the [src].")) + + stop_working() + return TRUE + diff --git a/code/modules/crafting/handmade_fancy.dm b/code/modules/crafting/handmade_fancy.dm new file mode 100644 index 00000000000..9622296a587 --- /dev/null +++ b/code/modules/crafting/handmade_fancy.dm @@ -0,0 +1,58 @@ +/obj/item/chems/glass/handmade/fancy + abstract_type = /obj/item/chems/glass/handmade/fancy + material = /decl/material/solid/metal/silver + +/obj/item/chems/glass/handmade/fancy/get_single_monetary_worth() + . = ..() * 1.5 // Crafting value, todo proper crafting skill modifying sale price. + +/obj/item/chems/glass/handmade/fancy/decanter + name = "decanter" + desc = "A masterfully made decanter with a fluted neck and graceful handle." + icon = 'icons/obj/items/handmade/decanter.dmi' + amount_per_transfer_from_this = 10 + volume = 120 + obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE + +/obj/item/chems/glass/handmade/fancy/goblet + name = "goblet" + desc = "An elegant goblet with a flared base, likely handmade by some master artisan." + icon = 'icons/obj/items/handmade/cup_fancy.dmi' + amount_per_transfer_from_this = 10 + volume = 60 + +/obj/item/chems/glass/handmade/fancy/bowl + name = "bowl" + desc = "A sleek, polished bowl, likely handmade by some master artisan." + icon = 'icons/obj/items/handmade/bowl_fancy.dmi' + amount_per_transfer_from_this = 10 + volume = 60 + +/obj/item/chems/glass/handmade/fancy/vase + name = "vase" + desc = "An elegant masterwork vase." + icon = 'icons/obj/items/handmade/vase_fancy.dmi' + amount_per_transfer_from_this = 20 + volume = 240 + material = /decl/material/solid/stone/ceramic + +/obj/item/chems/glass/handmade/fancy/vase/fluted + desc = "An elegant masterwork vase with a fluted neck." + icon = 'icons/obj/items/handmade/vase_fancy_fluted.dmi' + +/obj/item/chems/glass/handmade/fancy/vase/fluted/update_name() + . = ..() + SetName("fluted [name]") + +// Decorated subtypes for mapping/ +/obj/item/chems/glass/handmade/fancy/vase/mapped + decorations = list(/decl/material/solid/organic/bone) + +/obj/item/chems/glass/handmade/fancy/vase/fluted/mapped + decorations = list(/decl/material/solid/organic/bone) + +/obj/item/chems/glass/handmade/fancy/goblet/mapped + material = /decl/material/solid/metal/gold + decorations = list(/obj/item/gemstone/octagon/ruby) + +/obj/item/chems/glass/handmade/fancy/bowl/mapped + decorations = list(/obj/item/gemstone/octagon/sapphire) diff --git a/code/modules/crafting/handmade_items.dm b/code/modules/crafting/handmade_items.dm index d870d9ecf31..93ae530b113 100644 --- a/code/modules/crafting/handmade_items.dm +++ b/code/modules/crafting/handmade_items.dm @@ -5,14 +5,20 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME presentation_flags = PRESENTATION_FLAG_NAME +/obj/item/chems/glass/handmade/can_lid() + return FALSE + /obj/item/chems/glass/handmade/on_reagent_change() if((. = ..())) update_icon() +/obj/item/chems/glass/handmade/get_mould_difficulty() + return SKILL_NONE + /obj/item/chems/glass/handmade/teapot name = "teapot" desc = "A handmade, slightly lumpy teapot." - icon = 'icons/obj/pottery/teapot.dmi' + icon = 'icons/obj/items/handmade/teapot.dmi' amount_per_transfer_from_this = 10 volume = 120 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -20,14 +26,14 @@ /obj/item/chems/glass/handmade/cup name = "cup" desc = "A handmade, slightly lumpy cup." - icon = 'icons/obj/pottery/cup.dmi' + icon = 'icons/obj/items/handmade/cup.dmi' amount_per_transfer_from_this = 10 volume = 30 /obj/item/chems/glass/handmade/mug name = "mug" desc = "A handmade, slightly lumpy mug." - icon = 'icons/obj/pottery/mug.dmi' + icon = 'icons/obj/items/handmade/mug.dmi' amount_per_transfer_from_this = 10 volume = 60 obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE @@ -35,57 +41,56 @@ /obj/item/chems/glass/handmade/vase name = "vase" desc = "A handmade, slightly lumpy vase." - icon = 'icons/obj/pottery/vase.dmi' + icon = 'icons/obj/items/handmade/vase.dmi' amount_per_transfer_from_this = 20 volume = 240 /obj/item/chems/glass/handmade/jar name = "jar" desc = "A handmade, slightly lumpy jar." - icon = 'icons/obj/pottery/jar.dmi' + icon = 'icons/obj/items/handmade/jar.dmi' amount_per_transfer_from_this = 10 volume = 60 /obj/item/chems/glass/handmade/bottle name = "bottle" desc = "A handmade, slightly lumpy bottle." - icon = 'icons/obj/pottery/bottle.dmi' + icon = 'icons/obj/items/handmade/bottle.dmi' amount_per_transfer_from_this = 10 volume = 120 /obj/item/chems/glass/handmade/bottle/tall name = "tall bottle" - icon = 'icons/obj/pottery/bottle_tall.dmi' + icon = 'icons/obj/items/handmade/bottle_tall.dmi' /obj/item/chems/glass/handmade/bottle/wide name = "wide bottle" - icon = 'icons/obj/pottery/bottle_wide.dmi' + icon = 'icons/obj/items/handmade/bottle_wide.dmi' /obj/item/chems/glass/handmade/bowl name = "bowl" desc = "A handmade, slightly lumpy bowl." - icon = 'icons/obj/pottery/bowl.dmi' + icon = 'icons/obj/items/handmade/bowl.dmi' amount_per_transfer_from_this = 10 volume = 60 /obj/item/chems/glass/handmade/cup/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/chems/glass/handmade/mug/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/chems/glass/handmade/bowl/wood - material = /decl/material/solid/organic/wood - + material = /decl/material/solid/organic/wood/oak /obj/item/chems/glass/handmade/bottle/beer/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/item/chems/glass/handmade/bottle/tall/wine/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/item/chems/glass/handmade/bottle/wide/whiskey/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/ethanol/whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/whiskey, reagents.maximum_volume) diff --git a/code/modules/crafting/metalwork/metalwork_items.dm b/code/modules/crafting/metalwork/metalwork_items.dm index 5815340c135..5278aaf343e 100644 --- a/code/modules/crafting/metalwork/metalwork_items.dm +++ b/code/modules/crafting/metalwork/metalwork_items.dm @@ -19,37 +19,37 @@ obj_flags = OBJ_FLAG_NO_STORAGE var/max_held = 10 -/obj/item/chems/crucible/attackby(obj/item/W, mob/user) +/obj/item/chems/crucible/attackby(obj/item/used_item, mob/user) // Fill a mould. - if(istype(W, /obj/item/chems/mould)) - if(W.material?.hardness <= MAT_VALUE_MALLEABLE) - to_chat(user, SPAN_WARNING("\The [W] is currently too soft to be used as a mould.")) + if(istype(used_item, /obj/item/chems/mould)) + if(used_item.material?.hardness <= MAT_VALUE_MALLEABLE) + to_chat(user, SPAN_WARNING("\The [used_item] is currently too soft to be used as a mould.")) return TRUE - if(standard_pour_into(user, W)) + if(standard_pour_into(user, used_item)) return TRUE // Skim off any slag. - if(istype(W, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(W) && W.reagents) + if(istype(used_item, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(used_item) && used_item.reagents) // Pour contents into the crucible. - if(W.reagents.total_volume) - var/obj/item/chems/pouring = W + if(used_item.reagents.total_volume) + var/obj/item/chems/pouring = used_item if(pouring.standard_pour_into(user, src)) return TRUE // Attempting to skim off slag. // TODO: check for appropriate vessel material? Check melting point against temperature of crucible? if(reagents?.total_volume && length(reagents.reagent_volumes) > 1) - var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(W.reagents)) + var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(used_item.reagents)) if(removing < length(reagents.reagent_volumes)-1) - to_chat(user, SPAN_WARNING("\The [W] is full.")) + to_chat(user, SPAN_WARNING("\The [used_item] is full.")) return TRUE // Remove a portion, excepting the primary reagent. - var/old_amt = W.reagents.total_volume + var/old_amt = used_item.reagents.total_volume var/decl/material/primary_mat = reagents.get_primary_reagent_decl() - reagents.trans_to_holder(W.reagents, removing, skip_reagents = list(primary_mat.type)) - to_chat(user, SPAN_NOTICE("You skim [W.reagents.total_volume-old_amt] unit\s of slag from the top of \the [primary_mat].")) + reagents.trans_to_holder(used_item.reagents, removing, skip_reagents = list(primary_mat.type)) + to_chat(user, SPAN_NOTICE("You skim [used_item.reagents.total_volume-old_amt] unit\s of slag from the top of \the [primary_mat].")) return TRUE return ..() diff --git a/code/modules/crafting/pottery/pottery_moulds.dm b/code/modules/crafting/pottery/pottery_moulds.dm index 7f256ce8737..0075f90ea29 100644 --- a/code/modules/crafting/pottery/pottery_moulds.dm +++ b/code/modules/crafting/pottery/pottery_moulds.dm @@ -59,7 +59,7 @@ /obj/item/chems/mould/attackby(obj/item/W, mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() // This is kind of gross but getting /chems/attackby() diff --git a/code/modules/crafting/pottery/pottery_structures.dm b/code/modules/crafting/pottery/pottery_structures.dm index 34f021019fa..73adc6e921f 100644 --- a/code/modules/crafting/pottery/pottery_structures.dm +++ b/code/modules/crafting/pottery/pottery_structures.dm @@ -6,7 +6,7 @@ density = TRUE cap_last_fuel_burn = null - var/list/pottery = list() + var/list/pottery var/maximum_items = 3 var/firebox_open = TRUE @@ -17,12 +17,12 @@ /obj/structure/fire_source/kiln/high_temperature material = /decl/material/solid/stone/pottery -/obj/structure/fire_source/kiln/remove_atom(atom/movable/thing) +/obj/structure/fire_source/kiln/Exited(atom/movable/thing) . = ..() - pottery -= thing + LAZYREMOVE(pottery, thing) /obj/structure/fire_source/kiln/get_removable_atoms() - . = pottery?.Copy() + . = pottery?.Copy() || list() if(firebox_open) . |= ..() @@ -38,14 +38,14 @@ if(length(other)) LAZYDISTINCTADD(., other) -/obj/structure/fire_source/kiln/attackby(obj/item/W, mob/user) +/obj/structure/fire_source/kiln/attackby(obj/item/used_item, mob/user) if(firebox_open) return ..() if(length(pottery) >= maximum_items) to_chat(user, SPAN_WARNING("\The [src] is full, take something out first.")) - else if(user.try_unequip(W, src)) - user.visible_message("\The [user] slides \the [W] into \the [src].") - pottery += W + else if(user.try_unequip(used_item, src)) + user.visible_message("\The [user] slides \the [used_item] into \the [src].") + LAZYADD(pottery, used_item) return TRUE /obj/structure/fire_source/kiln/get_alt_interactions(var/mob/user) @@ -56,6 +56,7 @@ name = "Open Firebox" expected_target_type = /obj/structure/fire_source/kiln incapacitation_flags = INCAPACITATION_DISRUPTED + examine_desc = "open or close the firebox" /decl/interaction_handler/open_firebox/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && ishuman(user) @@ -63,5 +64,5 @@ /decl/interaction_handler/open_firebox/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/fire_source/kiln/kiln = target kiln.firebox_open = !kiln.firebox_open - to_chat(usr, SPAN_NOTICE("You [kiln.firebox_open ? "open" : "close"] \the [kiln]'s firebox.")) + to_chat(user, SPAN_NOTICE("You [kiln.firebox_open ? "open" : "close"] \the [kiln]'s firebox.")) kiln.update_icon() diff --git a/code/modules/crafting/slapcrafting/_crafting_holder.dm b/code/modules/crafting/slapcrafting/_crafting_holder.dm index 5a2ef109779..b89a73d69a1 100644 --- a/code/modules/crafting/slapcrafting/_crafting_holder.dm +++ b/code/modules/crafting/slapcrafting/_crafting_holder.dm @@ -13,17 +13,13 @@ var/list/next_products = list() for(var/decl/crafting_stage/next_stage in current_crafting_stage.next_stages) if(ispath(next_stage.completion_trigger_type)) - var/atom/next_tool = next_stage.completion_trigger_type - var/tool_string = initial(next_tool.name) - if(next_stage.stack_consume_amount > 1) - tool_string = "[next_stage.stack_consume_amount] [tool_string]\s" - else - tool_string = "\a [tool_string]" + var/tool_string = next_stage.generate_completion_string() if(ispath(next_stage.product)) var/atom/next_product = next_stage.product next_products[tool_string] = "\a [initial(next_product.name)]" else next_steps += tool_string + if(length(next_products)) for(var/thing in next_products) to_chat(user, SPAN_NOTICE("With [thing], you could finish building [next_products[thing]].")) @@ -31,14 +27,27 @@ to_chat(user, SPAN_NOTICE("You could continue to work on this with [english_list(next_steps, and_text = " or ")].")) /obj/item/crafting_holder/Initialize(var/ml, var/decl/crafting_stage/initial_stage, var/obj/item/target, var/obj/item/tool, var/mob/user) + . = ..(ml) if(!initial_stage) return INITIALIZE_HINT_QDEL + name = "[target.name] assembly" - var/mob/M = target.loc - if(istype(M)) + + // Move our component into the new holder. + if(ismob(target.loc)) + var/mob/M = target.loc M.drop_from_inventory(target) - target.forceMove(src) + target.forceMove(src) + else if(ismovable(target.loc)) + var/atom/movable/holder = target.loc + if(holder.storage) + holder.storage.remove_from_storage(user, target, src) + else + target.forceMove(src) + else + target.forceMove(src) + current_crafting_stage = initial_stage update_icon() update_strings() @@ -78,9 +87,18 @@ if(ismob(product) && label_name) var/mob/M = product M.SetName(label_name) - if(ismob(src.loc)) - var/mob/M = src.loc + + if(ismob(loc)) + var/mob/M = loc M.drop_from_inventory(src) + else if(ismovable(loc)) + var/atom/movable/holder = loc + if(holder.storage) + holder.storage.remove_from_storage(user, src, get_turf(src)) + else + forceMove(get_turf(src)) + else + forceMove(get_turf(src)) qdel_self() else current_crafting_stage = next_stage diff --git a/code/modules/crafting/slapcrafting/_crafting_stage.dm b/code/modules/crafting/slapcrafting/_crafting_stage.dm index 6b1cc730cd7..50ede2c90bd 100644 --- a/code/modules/crafting/slapcrafting/_crafting_stage.dm +++ b/code/modules/crafting/slapcrafting/_crafting_stage.dm @@ -10,6 +10,8 @@ var/begins_with_object_type var/list/next_stages var/product + /// What is the minimum map tech level to have access to this recipe? + var/available_to_map_tech_level = MAP_TECH_LEVEL_ANY /decl/crafting_stage/Initialize() . = ..() @@ -18,12 +20,37 @@ stages += GET_DECL(nid) next_stages = stages +/decl/crafting_stage/proc/generate_completion_string() + var/list/names = assemble_name_strings() + if(ispath(completion_trigger_type, /obj/item/stack) || stack_consume_amount) + names.Insert(1, max(stack_consume_amount, 1)) + return jointext(names, " ") + +/decl/crafting_stage/proc/assemble_name_strings() + SHOULD_CALL_PARENT(TRUE) + var/list/names = list() + var/obj/item/prop = completion_trigger_type + if(ispath(prop, /obj/item/stack)) + var/obj/item/stack/stack = prop + if(stack_consume_amount == 1) + names += stack::singular_name + else + names += stack::plural_name + else if(stack_consume_amount > 1) + names += "[prop::name]\s" + else + names += prop::name + return names + +/decl/crafting_stage/proc/is_available() + return global.using_map.map_tech_level >= available_to_map_tech_level + /decl/crafting_stage/proc/can_begin_with(var/obj/item/thing) . = istype(thing, begins_with_object_type) /decl/crafting_stage/proc/get_next_stage(var/obj/item/trigger) for(var/decl/crafting_stage/next_stage in next_stages) - if(next_stage.is_appropriate_tool(trigger) && next_stage.is_sufficient_amount(null, trigger)) + if(next_stage.is_available() && next_stage.is_appropriate_tool(trigger) && next_stage.is_sufficient_amount(null, trigger)) return next_stage /decl/crafting_stage/proc/progress_to(var/obj/item/thing, var/mob/user, var/obj/item/target) @@ -49,17 +76,18 @@ . = !consume_completion_trigger || user.try_unequip(thing, target) if(. && stack_consume_amount > 0) var/obj/item/stack/stack = thing - if(!istype(stack) || stack.amount < stack_consume_amount) + if(!istype(stack) || stack.get_amount() < stack_consume_amount) on_insufficient_material(user, stack) return FALSE var/obj/item/stack/used_stack - if(stack.amount == stack_consume_amount) + if(stack.amount > stack_consume_amount) + used_stack = stack.split(stack_consume_amount) + else if(!user.try_unequip(thing, target)) return FALSE used_stack = stack - else - used_stack = stack.split(stack_consume_amount) - used_stack.forceMove(target) + if(!QDELETED(used_stack)) + used_stack.forceMove(target) target?.update_icon() /decl/crafting_stage/proc/on_insufficient_material(var/mob/user, var/obj/item/stack/thing) @@ -84,6 +112,14 @@ consume_completion_trigger = FALSE var/stack_material = /decl/material/solid/metal/steel +/decl/crafting_stage/material/assemble_name_strings() + var/list/names = ..() + if(stack_material) + var/decl/material/mat = GET_DECL(stack_material) + if(mat) + names.Insert(1, mat.solid_name) + return names + /decl/crafting_stage/material/consume_crafting_resource(var/mob/user, var/obj/item/thing, var/obj/item/target) var/obj/item/stack/material/M = thing . = istype(M) && (!stack_material || M.material.type == stack_material) && ..() diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm index 0c270b5d63e..38a9a9da507 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_floorbot.dm @@ -6,6 +6,7 @@ progress_message = "You dump a bunch of floor tiles into the empty toolbox." item_icon_state = "floorbot_1" next_stages = list(/decl/crafting_stage/proximity/floorbot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/proximity/floorbot progress_message = "You wedge the proximity sensor in amongst the floor tiles." @@ -22,4 +23,4 @@ var/mob/living/bot/floorbot/bot = . var/obj/item/toolbox/box = locate() in work bot.boxtype = box.icon_state - bot.update_icon() + bot.update_icon() diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm index 8b249c33ad3..90b6b3a8d18 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_janibot.dm @@ -4,6 +4,7 @@ progress_message = "You put the proximity sensor into the bucket." item_icon_state = "janibot_1" next_stages = list(/decl/crafting_stage/robot_arms/janibot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/robot_arms/janibot progress_message = "You attach the arm to the assembly and finish off the Janibot. Beep boop." diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm index c376a5bffb2..5a44b023be7 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_medibot.dm @@ -5,6 +5,7 @@ completion_trigger_type = /obj/item/robot_parts item_icon_state = "medibot_1" next_stages = list(/decl/crafting_stage/scanner) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/scanner progress_message = "You add the health sensor to the assembly" diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm index 9e53c82645d..af756c222af 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/bot_crafting/crafting_secbot.dm @@ -5,6 +5,7 @@ progress_message = "You add the signaler to the helmet." item_icon_state = "secbot_1" next_stages = list(/decl/crafting_stage/welding/secbot) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/secbot_signaller/can_begin_with(var/obj/item/thing) . = istype(thing, begins_with_object_type) diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm index 4270ffc3b33..4cab4e48465 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm @@ -7,6 +7,7 @@ progress_message = "You crudely sever the legs off the stool and remove the seat." consume_completion_trigger = FALSE next_stages = list(/decl/crafting_stage/buckler_panels) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE // todo: modern tech level /decl/crafting_stage/buckler_panels item_desc = "It's the seat of a stool with the legs sawn off and wooden planks layered over the top, ready to secure in place." @@ -19,4 +20,13 @@ /decl/crafting_stage/screwdriver/buckler_finish progress_message = "You secure the buckler's panels in place and finish it off." - product = /obj/item/shield/buckler + product = /obj/item/shield/crafted/buckler/improvised + +/decl/crafting_stage/screwdriver/buckler_finish/get_product(var/obj/item/work) + if(!ispath(product)) + return null + var/obj/item/stool/stool = locate() in work + var/obj/item/stack/material/plank/plank = locate() in work + if(istype(stool) && istype(plank)) + return new product(get_turf(work), plank.material?.type, stool.material?.type) + return ..() diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm index 0516f188c22..7335cb83aef 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_crossbow.dm @@ -14,6 +14,7 @@ item_icon_state = "crossbowframe1" progress_message = "You assemble a backbone of rods around the wooden stock." next_stages = list(/decl/crafting_stage/welding/crossbow_rods) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/welding/crossbow_rods completion_trigger_type = /obj/item/weldingtool diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm index c79c047216b..1b8e062fbbc 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_spear_prod.dm @@ -11,6 +11,7 @@ /decl/crafting_stage/spear_blade_blade, /decl/crafting_stage/stunprod_wirecutters ) + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/crafting_stage/material/stunprod_rod/consume_crafting_resource(var/mob/user, var/obj/item/thing, var/obj/item/target) . = ..() diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm b/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm index c8169a999c2..5472d992243 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm @@ -12,6 +12,10 @@ var/global/list/_tool_crafting_lookup return global._tool_crafting_lookup var/global/list/_tool_crafting_components = list( + /obj/item/tool/chisel = list( + /obj/item/tool_component/head/chisel, + /obj/item/tool_component/handle/short + ), /obj/item/tool/hammer = list( /obj/item/tool_component/head/hammer, /obj/item/tool_component/handle/short @@ -35,6 +39,10 @@ var/global/list/_tool_crafting_components = list( /obj/item/tool/axe = list( /obj/item/tool_component/head/handaxe, /obj/item/tool_component/handle/short + ), + /obj/item/tool/hammer/forge = list( + /obj/item/tool_component/head/forging_hammer, + /obj/item/tool_component/handle/short ) ) diff --git a/code/modules/crafting/stack_recipes/_recipe.dm b/code/modules/crafting/stack_recipes/_recipe.dm index a73dbc0298f..7c481de823a 100644 --- a/code/modules/crafting/stack_recipes/_recipe.dm +++ b/code/modules/crafting/stack_recipes/_recipe.dm @@ -61,7 +61,8 @@ /obj/item/stack/material/ore, /obj/item/stack/material/log, /obj/item/stack/material/lump, - /obj/item/stack/material/slab + /obj/item/stack/material/slab, + /obj/item/stack/material/bundle ) /// If set, will group recipes under a stack recipe list. var/category @@ -149,9 +150,16 @@ else if(length(used_skill.levels) < difficulty) . += "required skill [recipe_skill] is missing skill level [json_encode(difficulty)]" - if(length(forbidden_craft_stack_types) && length(craft_stack_types)) - for(var/stack_type in (forbidden_craft_stack_types|craft_stack_types)) - if((stack_type in craft_stack_types) && (stack_type in forbidden_craft_stack_types)) + var/list/check_forbidden_craft_stack_types = forbidden_craft_stack_types + if(check_forbidden_craft_stack_types && !islist(check_forbidden_craft_stack_types)) + check_forbidden_craft_stack_types = list(check_forbidden_craft_stack_types) + var/list/check_craft_stack_types = craft_stack_types + if(check_craft_stack_types && !islist(check_craft_stack_types)) + check_craft_stack_types = list(check_craft_stack_types) + + if(length(check_forbidden_craft_stack_types) && length(check_craft_stack_types)) + for(var/stack_type in (check_forbidden_craft_stack_types|check_craft_stack_types)) + if((stack_type in check_craft_stack_types) && (stack_type in check_forbidden_craft_stack_types)) . += "[stack_type] is in both forbidden and craftable stack types" /decl/stack_recipe/proc/get_required_stack_amount(obj/item/stack/stack) diff --git a/code/modules/crafting/stack_recipes/recipes_bricks.dm b/code/modules/crafting/stack_recipes/recipes_bricks.dm index 1901075e8e0..ec8bf11e3b3 100644 --- a/code/modules/crafting/stack_recipes/recipes_bricks.dm +++ b/code/modules/crafting/stack_recipes/recipes_bricks.dm @@ -71,6 +71,19 @@ name = "pillar, round" result_type = /obj/structure/pillar/round +/decl/stack_recipe/bricks/furniture/pillar/wide_round + name = "pillar, wide round" + result_type = /obj/structure/pillar/wide + +/decl/stack_recipe/bricks/furniture/pillar/wide_square + name = "pillar, wide square" + + result_type = /obj/structure/pillar/wide/square + +/decl/stack_recipe/bricks/furniture/pillar/wide_inset + name = "pillar, wide inset" + result_type = /obj/structure/pillar/wide/inset + /decl/stack_recipe/bricks/furniture/pillar/pedestal name = "pedestal, square" result_type = /obj/structure/pedestal diff --git a/code/modules/crafting/stack_recipes/recipes_fodder.dm b/code/modules/crafting/stack_recipes/recipes_fodder.dm new file mode 100644 index 00000000000..a84f3c45cf6 --- /dev/null +++ b/code/modules/crafting/stack_recipes/recipes_fodder.dm @@ -0,0 +1,15 @@ +/decl/stack_recipe/fodder + result_type = /obj/structure/haystack + required_material = /decl/material/solid/organic/plantmatter/grass/dry + craft_stack_types = list(/obj/item/stack/material/bundle) + forbidden_craft_stack_types = null + one_per_turf = TRUE + on_floor = TRUE + difficulty = MAT_VALUE_EASY_DIY + recipe_skill = SKILL_BOTANY + +/decl/stack_recipe/fodder/get_required_stack_amount(obj/item/stack/stack) + return 30 // Arbitrary amount to make 20 food items. + +/decl/stack_recipe/fodder/bale + result_type = /obj/structure/haystack/bale diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index d6f262e90bc..17caba7e0c4 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -1,16 +1,26 @@ /decl/stack_recipe/woven - abstract_type = /decl/stack_recipe/woven - craft_stack_types = /obj/item/stack/material/bundle - category = "woven items" + abstract_type = /decl/stack_recipe/woven + craft_stack_types = /obj/item/stack/material/bundle + category = "woven items" + forbidden_craft_stack_types = null /decl/stack_recipe/woven/can_be_made_from(stack_type, tool_type, decl/material/mat, decl/material/reinf_mat) if((istype(mat) ? mat.type : mat) == /decl/material/solid/organic/plantmatter/grass) return FALSE return ..() +/decl/stack_recipe/woven/rug + result_type = /obj/structure/rug/crafted + one_per_turf = TRUE + on_floor = TRUE + category = "furniture" + /decl/stack_recipe/woven/basket result_type = /obj/item/basket +/decl/stack_recipe/woven/large_basket + result_type = /obj/item/basket/large + /decl/stack_recipe/woven/banner result_type = /obj/item/banner/woven @@ -19,6 +29,7 @@ craft_stack_types = /obj/item/stack/material/bundle required_material = /decl/material/solid/organic/plantmatter/grass/dry result_type = /obj/item/stack/tile/roof/woven + forbidden_craft_stack_types = null /decl/stack_recipe/tile/woven/floor name = "woven floor tile" @@ -32,3 +43,6 @@ /obj/item/stack/material/bundle, /obj/item/stack/material/thread ) + +/decl/stack_recipe/woven/dummy + result_type = /obj/item/training_dummy/straw diff --git a/code/modules/crafting/stack_recipes/recipes_hardness.dm b/code/modules/crafting/stack_recipes/recipes_hardness.dm index a656ebc868e..903769244d6 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness.dm @@ -75,7 +75,19 @@ result_type = /obj/item/chems/glass/mortar /decl/stack_recipe/ring - result_type = /obj/item/clothing/gloves/ring/material + result_type = /obj/item/clothing/gloves/ring + +/decl/stack_recipe/ring_thin + name = "ring, thin" + result_type = /obj/item/clothing/gloves/ring/thin + +/decl/stack_recipe/ring_thick + name = "ring, thick" + result_type = /obj/item/clothing/gloves/ring/thick + +/decl/stack_recipe/ring_split + name = "ring, split" + result_type = /obj/item/clothing/gloves/ring/split /decl/stack_recipe/hardness/clipboard result_type = /obj/item/clipboard diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 92e580a6d0e..eafa6e89d73 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -2,6 +2,18 @@ abstract_type = /decl/stack_recipe/hardness/integrity required_integrity = 50 +/decl/stack_recipe/hardness/integrity/sign + result_type = /obj/item/banner/sign + +/decl/stack_recipe/hardness/integrity/buckler + result_type = /obj/item/shield_base/buckler + difficulty = MAT_VALUE_HARD_DIY + +// TODO: forging +/decl/stack_recipe/hardness/integrity/shield_fasteners + result_type = /obj/item/shield_fasteners + difficulty = MAT_VALUE_VERY_HARD_DIY + /decl/stack_recipe/hardness/integrity/furniture abstract_type = /decl/stack_recipe/hardness/integrity/furniture one_per_turf = TRUE @@ -19,6 +31,12 @@ /decl/stack_recipe/hardness/integrity/furniture/banner_frame result_type = /obj/structure/banner_frame +/decl/stack_recipe/hardness/integrity/furniture/sign_hook + result_type = /obj/structure/banner_frame/sign + +/decl/stack_recipe/hardness/integrity/furniture/sign_hook/wall + result_type = /obj/structure/banner_frame/sign/wall + /decl/stack_recipe/hardness/integrity/furniture/coatrack result_type = /obj/structure/coatrack @@ -43,6 +61,10 @@ /decl/stack_recipe/hardness/integrity/furniture/bench/pew/single result_type = /obj/structure/bed/chair/bench/pew/single +/decl/stack_recipe/hardness/integrity/furniture/bench/lounge + result_type = /obj/structure/bed/chair/bench/lounge + difficulty = MAT_VALUE_VERY_HARD_DIY + /decl/stack_recipe/hardness/integrity/furniture/closet result_type = /obj/structure/closet @@ -76,6 +98,9 @@ /decl/stack_recipe/hardness/integrity/lock result_type = /obj/item/lock_construct +/decl/stack_recipe/hardness/integrity/lockpick + result_type = /obj/item/lockpick + /decl/stack_recipe/hardness/integrity/key result_type = /obj/item/key diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index c3dd35a7e40..00f4f0f41b6 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -78,6 +78,29 @@ /decl/stack_recipe/planks/bowl result_type = /obj/item/chems/glass/handmade/bowl +/decl/stack_recipe/planks/buckler + result_type = /obj/item/shield_base/buckler + +/decl/stack_recipe/planks/fancy + abstract_type = /decl/stack_recipe/planks/fancy + difficulty = MAT_VALUE_VERY_HARD_DIY + +/decl/stack_recipe/planks/fancy/decanter + result_type = /obj/item/chems/glass/handmade/fancy/decanter + +/decl/stack_recipe/planks/fancy/goblet + result_type = /obj/item/chems/glass/handmade/fancy/goblet + +/decl/stack_recipe/planks/fancy/bowl + result_type = /obj/item/chems/glass/handmade/fancy/bowl + +/decl/stack_recipe/planks/fancy/vase + result_type = /obj/item/chems/glass/handmade/fancy/vase + +/decl/stack_recipe/planks/fancy/vase_fluted + name = "vase, fluted" + result_type = /obj/item/chems/glass/handmade/fancy/vase/fluted + /decl/stack_recipe/planks/noticeboard/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) . = ..() if(user) @@ -204,6 +227,16 @@ result_type = /obj/structure/reagent_dispensers/barrel difficulty = MAT_VALUE_HARD_DIY +/decl/stack_recipe/planks/furniture/barrel/cask + result_type = /obj/structure/reagent_dispensers/barrel/cask + +/decl/stack_recipe/planks/furniture/barrel/cask_rack + result_type = /obj/structure/cask_rack + +/decl/stack_recipe/planks/furniture/barrel/large_cask_rack + name = "cask rack, large" + result_type = /obj/structure/cask_rack/large + /decl/stack_recipe/planks/furniture/table_frame result_type = /obj/structure/table/frame category = "furniture" @@ -212,3 +245,15 @@ /decl/stack_recipe/planks/furniture/gravemarker result_type = /obj/item/gravemarker difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/planks/furniture/divider + result_type = /obj/structure/divider + difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/planks/furniture/armor_stand + result_type = /obj/structure/armor_stand + difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/planks/furniture/target_stake + result_type = /obj/structure/target_stake + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/crafting/stack_recipes/recipes_struts.dm b/code/modules/crafting/stack_recipes/recipes_rods.dm similarity index 72% rename from code/modules/crafting/stack_recipes/recipes_struts.dm rename to code/modules/crafting/stack_recipes/recipes_rods.dm index fced999502f..c010556a990 100644 --- a/code/modules/crafting/stack_recipes/recipes_struts.dm +++ b/code/modules/crafting/stack_recipes/recipes_rods.dm @@ -1,6 +1,7 @@ -/decl/stack_recipe/strut - abstract_type = /decl/stack_recipe/strut +/decl/stack_recipe/rods + abstract_type = /decl/stack_recipe/rods craft_stack_types = list( + /obj/item/stack/material/rods, /obj/item/stack/material/strut, /obj/item/stack/material/bone ) @@ -10,64 +11,69 @@ available_to_map_tech_level = MAP_TECH_LEVEL_MEDIEVAL category = "structures" -/decl/stack_recipe/strut/stick +/decl/stack_recipe/rods/stick result_type = /obj/item/stick one_per_turf = FALSE on_floor = FALSE difficulty = MAT_VALUE_EASY_DIY category = "items" -/decl/stack_recipe/strut/stick/staff +/decl/stack_recipe/rods/stick/staff result_type = /obj/item/staff difficulty = MAT_VALUE_NORMAL_DIY -/decl/stack_recipe/strut/stick/cane +/decl/stack_recipe/rods/stick/cane result_type = /obj/item/cane difficulty = MAT_VALUE_NORMAL_DIY -/decl/stack_recipe/strut/railing +/decl/stack_recipe/rods/railing result_type = /obj/structure/railing -/decl/stack_recipe/strut/ladder +/decl/stack_recipe/rods/ladder result_type = /obj/structure/ladder on_floor = FALSE required_wall_support_value = 10 -/decl/stack_recipe/strut/girder +/decl/stack_recipe/rods/girder result_type = /obj/structure/girder required_wall_support_value = 10 req_amount = 5 * SHEET_MATERIAL_AMOUNT // Arbitrary value since girders return weird matter values. available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/wall_frame +/decl/stack_recipe/rods/wall_frame result_type = /obj/structure/wall_frame available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/table_frame +/decl/stack_recipe/rods/table_frame result_type = /obj/structure/table/frame category = "furniture" -/decl/stack_recipe/strut/rack +/decl/stack_recipe/rods/rack result_type = /obj/structure/rack category = "furniture" -/decl/stack_recipe/strut/butcher_hook +/decl/stack_recipe/rods/butcher_hook result_type = /obj/structure/meat_hook one_per_turf = TRUE difficulty = MAT_VALUE_NORMAL_DIY category = "furniture" -/decl/stack_recipe/strut/bed +/decl/stack_recipe/rods/bed result_type = /obj/structure/bed required_integrity = 50 required_min_hardness = MAT_VALUE_FLEXIBLE + 10 category = "furniture" -/decl/stack_recipe/strut/machine +/decl/stack_recipe/rods/machine result_type = /obj/machinery/constructable_frame/machine_frame req_amount = 5 * SHEET_MATERIAL_AMOUNT // Arbitrary value since machines don't handle matter properly yet. required_material = /decl/material/solid/metal/steel available_to_map_tech_level = MAP_TECH_LEVEL_SPACE -/decl/stack_recipe/strut/machine/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) +/decl/stack_recipe/rods/machine/spawn_result(mob/user, location, amount, decl/material/mat, decl/material/reinf_mat, paint_color, spent_type, spent_amount = 1) return ..(user, location, amount, null, null, paint_color, spent_type, spent_amount) + +/decl/stack_recipe/rods/grille + result_type = /obj/structure/grille + one_per_turf = TRUE + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/crafting/stack_recipes/recipes_soft.dm b/code/modules/crafting/stack_recipes/recipes_soft.dm index 00a0e650a45..32422a17549 100644 --- a/code/modules/crafting/stack_recipes/recipes_soft.dm +++ b/code/modules/crafting/stack_recipes/recipes_soft.dm @@ -2,7 +2,11 @@ time = 1 SECOND abstract_type = /decl/stack_recipe/soft craft_stack_types = null - forbidden_craft_stack_types = null + forbidden_craft_stack_types = list( + /obj/item/stack/material/bundle, + /obj/item/stack/material/thread, + /obj/item/stack/material/bolt + ) required_min_hardness = 0 required_max_hardness = MAT_VALUE_SOFT crafting_extra_cost_factor = 1 // No wastage for just resculpting materials. @@ -85,3 +89,20 @@ /decl/stack_recipe/soft/mould/ingot name = "mould, ingot" result_type = /obj/item/chems/mould/ingot + +/decl/stack_recipe/soft/sculpture + abstract_type = /decl/stack_recipe/soft/sculpture + one_per_turf = TRUE + on_floor = TRUE + category = "sculptures" + +/decl/stack_recipe/soft/sculpture/snowman + result_type = /obj/structure/snowman + +/decl/stack_recipe/soft/sculpture/snowspider + result_type = /obj/structure/snowman/spider + difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/soft/sculpture/snowbot + result_type = /obj/structure/snowman/bot + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE diff --git a/code/modules/crafting/stack_recipes/recipes_stacks.dm b/code/modules/crafting/stack_recipes/recipes_stacks.dm index 0e97225f58d..06c19604fbf 100644 --- a/code/modules/crafting/stack_recipes/recipes_stacks.dm +++ b/code/modules/crafting/stack_recipes/recipes_stacks.dm @@ -7,25 +7,68 @@ /decl/stack_recipe/tile/wood result_type = /obj/item/stack/tile/wood - required_material = /decl/material/solid/organic/wood + required_material = /decl/material/solid/organic/wood/oak /decl/stack_recipe/tile/wood/mahogany - result_type = /obj/item/stack/tile/mahogany + result_type = /obj/item/stack/tile/wood/mahogany required_material = /decl/material/solid/organic/wood/mahogany /decl/stack_recipe/tile/wood/maple - result_type = /obj/item/stack/tile/maple + result_type = /obj/item/stack/tile/wood/maple required_material = /decl/material/solid/organic/wood/maple /decl/stack_recipe/tile/wood/ebony difficulty = MAT_VALUE_VERY_HARD_DIY - result_type = /obj/item/stack/tile/ebony + result_type = /obj/item/stack/tile/wood/ebony required_material = /decl/material/solid/organic/wood/ebony /decl/stack_recipe/tile/wood/walnut - result_type = /obj/item/stack/tile/walnut + result_type = /obj/item/stack/tile/wood/walnut required_material = /decl/material/solid/organic/wood/walnut +/decl/stack_recipe/tile/wood/mahogany/rough + crafting_extra_cost_factor = 2 // wasteful but easy + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/mahogany + +/decl/stack_recipe/tile/wood/maple/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/maple + +/decl/stack_recipe/tile/wood/ebony/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_HARD_DIY + result_type = /obj/item/stack/tile/wood/rough/ebony + +/decl/stack_recipe/tile/wood/walnut/rough + crafting_extra_cost_factor = 2 + difficulty = MAT_VALUE_EASY_DIY + result_type = /obj/item/stack/tile/wood/rough/walnut + +/decl/stack_recipe/tile/wood/oak_laminate + result_type = /obj/item/stack/tile/wood/laminate/oak + required_material = /decl/material/solid/organic/wood/chipboard + +/decl/stack_recipe/tile/wood/mahogany_laminate + result_type = /obj/item/stack/tile/wood/laminate/mahogany + required_material = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/stack_recipe/tile/wood/maple_laminate + result_type = /obj/item/stack/tile/wood/laminate/maple + required_material = /decl/material/solid/organic/wood/chipboard/maple + +/decl/stack_recipe/tile/wood/ebony_laminate + result_type = /obj/item/stack/tile/wood/laminate/ebony + required_material = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/stack_recipe/tile/wood/walnut_laminate + result_type = /obj/item/stack/tile/wood/walnut + required_material = /decl/material/solid/organic/wood/chipboard/walnut + +/decl/stack_recipe/tile/wood/yew_laminate + result_type = /obj/item/stack/tile/wood/laminate/yew + required_material = /decl/material/solid/organic/wood/chipboard/yew /decl/stack_recipe/tile/steel abstract_type = /decl/stack_recipe/tile/steel diff --git a/code/modules/crafting/stack_recipes/recipes_steel.dm b/code/modules/crafting/stack_recipes/recipes_steel.dm index 8f15300c367..9befbe3d3f1 100644 --- a/code/modules/crafting/stack_recipes/recipes_steel.dm +++ b/code/modules/crafting/stack_recipes/recipes_steel.dm @@ -108,3 +108,11 @@ /decl/stack_recipe/steel/furniture/drill_brace result_type = /obj/structure/drill_brace + +/decl/stack_recipe/steel/furniture/armor_stand + result_type = /obj/structure/armor_stand + difficulty = MAT_VALUE_NORMAL_DIY + +/decl/stack_recipe/steel/furniture/target_stake + result_type = /obj/structure/target_stake + difficulty = MAT_VALUE_NORMAL_DIY diff --git a/code/modules/crafting/stack_recipes/recipes_textiles.dm b/code/modules/crafting/stack_recipes/recipes_textiles.dm index ee608b17555..3f39d08385e 100644 --- a/code/modules/crafting/stack_recipes/recipes_textiles.dm +++ b/code/modules/crafting/stack_recipes/recipes_textiles.dm @@ -7,16 +7,43 @@ crafting_extra_cost_factor = 1.5 // measure twice, cut once; material is lost. todo: produce scraps? abstract_type = /decl/stack_recipe/textiles +/decl/stack_recipe/textiles/rug + result_type = /obj/structure/rug/crafted + one_per_turf = TRUE + on_floor = TRUE + category = "furniture" + /decl/stack_recipe/textiles/cloak - result_type = /obj/item/clothing/suit/cloak/hide - category = "clothing" + result_type = /obj/item/clothing/suit/cloak/hide + category = "clothing" /decl/stack_recipe/textiles/banner + name = "banner" result_type = /obj/item/banner category = "furniture" crafting_extra_cost_factor = 1.1 // less material is lost because it's relatively simple difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making actual clothing. +/decl/stack_recipe/textiles/banner/forked + name = "banner, forked" + result_type = /obj/item/banner/forked + +/decl/stack_recipe/textiles/banner/pointed + name = "banner, pointed" + result_type = /obj/item/banner/pointed + +/decl/stack_recipe/textiles/banner/rounded + name = "banner, rounded" + result_type = /obj/item/banner/rounded + +/decl/stack_recipe/textiles/banner/square + name = "banner, square" + result_type = /obj/item/banner/square + +/decl/stack_recipe/textiles/banner/tasselled + name = "banner, tasselled" + result_type = /obj/item/banner/tasselled + /decl/stack_recipe/textiles/sack result_type = /obj/item/bag/sack category = "storage" @@ -39,9 +66,9 @@ category = "clothing" /decl/stack_recipe/textiles/leather/bedroll - result_type = /obj/item/bedroll - difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. - category = "bedding" + result_type = /obj/item/bedroll + difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. + category = "bedding" /decl/stack_recipe/textiles/leather/shoes result_type = /obj/item/clothing/shoes/craftable @@ -60,8 +87,19 @@ crafting_extra_cost_factor = 1.1 // less material is lost because it's relatively simple difficulty = MAT_VALUE_NORMAL_DIY // Slightly easier than making clothing. +/decl/stack_recipe/textiles/leather/sack + result_type = /obj/item/bag/sack + difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/textiles/leather/backpack + result_type = /obj/item/backpack/crafted/backpack + difficulty = MAT_VALUE_VERY_HARD_DIY + +/decl/stack_recipe/textiles/leather/backpack/haversack + result_type = /obj/item/backpack/crafted + /decl/stack_recipe/textiles/leather/waterskin - result_type = /obj/item/chems/waterskin/crafted + result_type = /obj/item/chems/glass/waterskin/crafted required_material = /decl/material/solid/organic/leather category = null diff --git a/code/modules/crafting/working/_working.dm b/code/modules/crafting/working/_working.dm index 8c99837597e..4957dc0052a 100644 --- a/code/modules/crafting/working/_working.dm +++ b/code/modules/crafting/working/_working.dm @@ -4,8 +4,8 @@ icon_state = ICON_STATE_WORLD anchored = TRUE density = TRUE - color = /decl/material/solid/organic/wood::color - material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood/oak::color + material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC atom_flags = ATOM_FLAG_CLIMBABLE obj_flags = OBJ_FLAG_ANCHORABLE @@ -49,21 +49,21 @@ work_sound.stop(src) update_icon() -/obj/structure/working/attackby(obj/item/W, mob/user) +/obj/structure/working/attackby(obj/item/used_item, mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(working) to_chat(user, SPAN_WARNING("\The [src] is currently in use, please wait for it to be finished.")) return TRUE - if(try_take_input(W, user)) + if(try_take_input(used_item, user)) return TRUE return ..() -/obj/structure/working/proc/try_take_input(obj/item/W, mob/user, silent) +/obj/structure/working/proc/try_take_input(obj/item/used_item, mob/user, silent) return FALSE /obj/structure/working/proc/try_unload_material(mob/user) @@ -74,7 +74,7 @@ /obj/structure/working/attack_hand(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(working) diff --git a/code/modules/crafting/working/textiles/loom.dm b/code/modules/crafting/working/textiles/loom.dm index 5c25cb36002..a68bdacbf57 100644 --- a/code/modules/crafting/working/textiles/loom.dm +++ b/code/modules/crafting/working/textiles/loom.dm @@ -34,24 +34,24 @@ weaving_type = null weaving_progress = 0 -/obj/structure/working/loom/try_take_input(obj/item/W, mob/user) +/obj/structure/working/loom/try_take_input(obj/item/used_item, mob/user) - if(istype(W, /obj/item/stack/material/thread)) + if(istype(used_item, /obj/item/stack/material/thread)) - if(!W.material.has_textile_fibers) - to_chat(user, SPAN_WARNING("\The [W] isn't suitable for making cloth.")) + if(!used_item.material.has_textile_fibers) + to_chat(user, SPAN_WARNING("\The [used_item] isn't suitable for making cloth.")) return TRUE var/loaded = FALSE if(loaded_thread) - if(!loaded_thread.can_merge_stacks(W)) + if(!loaded_thread.can_merge_stacks(used_item)) to_chat(user, SPAN_WARNING("\The [src] is already wound with \the [loaded_thread].")) return TRUE - var/obj/item/stack/feeding = W + var/obj/item/stack/feeding = used_item feeding.transfer_to(loaded_thread) loaded = TRUE - else if(user.try_unequip(W, src)) - loaded_thread = W + else if(user.try_unequip(used_item, src)) + loaded_thread = used_item loaded = TRUE if(loaded) weaving_color = loaded_thread.get_color() @@ -74,7 +74,7 @@ add_overlay(I) /obj/structure/working/loom/try_unload_material(mob/user) - if(user.a_intent == I_GRAB) + if(user.check_intent(I_FLAG_GRAB)) if(loaded_thread) to_chat(user, SPAN_NOTICE("You remove \the [loaded_thread] from \the [src].")) loaded_thread.dropInto(loc) diff --git a/code/modules/crafting/working/textiles/spinning_wheel.dm b/code/modules/crafting/working/textiles/spinning_wheel.dm index 69d7c36edce..84b1dab6e1b 100644 --- a/code/modules/crafting/working/textiles/spinning_wheel.dm +++ b/code/modules/crafting/working/textiles/spinning_wheel.dm @@ -24,16 +24,16 @@ /obj/structure/working/spinning_wheel/proc/can_process(obj/item/thing) return istype(thing) && thing.has_textile_fibers() -/obj/structure/working/spinning_wheel/try_take_input(obj/item/W, mob/user) +/obj/structure/working/spinning_wheel/try_take_input(obj/item/used_item, mob/user) - if(istype(W.storage)) + if(istype(used_item.storage)) var/list/loading_growns = list() - for(var/obj/item/thing in W.get_stored_inventory()) + for(var/obj/item/thing in used_item.get_stored_inventory()) if(can_process(thing)) loading_growns += thing if(!length(loading_growns)) - to_chat(user, SPAN_WARNING("Nothing in \the [W] is suitable for processing on \the [src].")) + to_chat(user, SPAN_WARNING("Nothing in \the [used_item] is suitable for processing on \the [src].")) return TRUE if(length(loaded) >= MAX_LOADED) @@ -42,24 +42,24 @@ var/loaded_items = 0 for(var/obj/item/thing as anything in loading_growns) - if(W.storage.remove_from_storage(thing, src, TRUE)) + if(used_item.storage.remove_from_storage(thing, src, TRUE)) loaded_items++ LAZYADD(loaded, thing) if(length(loaded) >= MAX_LOADED) break if(loaded_items) - W.storage.finish_bulk_removal() - to_chat(user, SPAN_NOTICE("You prepare \the [src] with [loaded_items] items from \the [W].")) + used_item.storage.finish_bulk_removal() + to_chat(user, SPAN_NOTICE("You prepare \the [src] with [loaded_items] items from \the [used_item].")) update_icon() return TRUE - if(can_process(W)) + if(can_process(used_item)) if(length(loaded) >= MAX_LOADED) to_chat(user, SPAN_WARNING("\The [src] is already fully stocked and ready for spinning.")) return TRUE - if(user.try_unequip(W, src)) - LAZYADD(loaded, W) - to_chat(user, SPAN_NOTICE("You prepare \the [src] with \the [W].")) + if(user.try_unequip(used_item, src)) + LAZYADD(loaded, used_item) + to_chat(user, SPAN_NOTICE("You prepare \the [src] with \the [used_item].")) update_icon() return TRUE return TRUE @@ -121,7 +121,7 @@ return TRUE /obj/structure/working/spinning_wheel/try_unload_material(mob/user) - if(user.a_intent == I_GRAB) + if(user.check_intent(I_FLAG_GRAB)) if(!length(loaded)) to_chat(user, SPAN_WARNING("\The [src] has no fibers to remove.")) else diff --git a/code/modules/decoration/_decoration.dm b/code/modules/decoration/_decoration.dm new file mode 100644 index 00000000000..0228f99654b --- /dev/null +++ b/code/modules/decoration/_decoration.dm @@ -0,0 +1,104 @@ +// Should return a linear list of /decl/item_decoration types that can apply to the target items. +/proc/get_decoration_types_for(mob/user, obj/item/target_item, obj/item/used_item) + // TODO: consider caching this somewhere? + for(var/decl/item_decoration/decoration as anything in decls_repository.get_decls_of_subtype_unassociated(/decl/item_decoration)) + if(decoration in target_item.decorations) + continue + if(!decoration.can_apply_to(user, target_item, used_item)) + continue + LAZYADD(., decoration) + +// Decl types for decorations below. +/decl/item_decoration + abstract_type = /decl/item_decoration + /// A descriptive named used to select this decoration. + var/name + /// State used when searching item icon files for world/inventory/onmob states to draw. + var/icon_state_modifier + /// A list of types that this decoration can be applied to. Must contain at least one entry. + var/list/can_decorate_types + /// A list of types that can be used to apply this decoration. Must contain at least one entry. + var/list/can_decorate_with_types + /// String used to describe this action. + var/decoration_verb = "decorate" + /// String used to describe this action while underway. + var/decoration_action = "decorating" + /// What skill to use when applying this decoration. If null, defaults to the material. + var/work_skill + /// How long this work should take. + var/work_time = 10 SECONDS + /// Factor value supplied to do_skilled() + var/work_factor = 1 + /// Additional monetary worth for the item, as a percentage of the base item value (ie. 0.1 = +10%) + var/decoration_worth_factor = 0.1 + +/decl/item_decoration/validate() + . = ..() + if(!istext(name)) + . += "null or invalid name" + if(!istext(icon_state_modifier)) + . += "null or invalid icon_state_modifier" + if(!length(can_decorate_types)) + . += "no types in can_decorate_types" + if(!length(can_decorate_with_types)) + . += "no types in can_decorate_with_types" + +/decl/item_decoration/proc/can_apply_to(mob/user, obj/item/thing, obj/item/decorating_with) + if(!istype(thing) || !is_type_in_list(thing, can_decorate_types)) + return FALSE + if(!istype(decorating_with) || !is_type_in_list(decorating_with, can_decorate_with_types)) + return FALSE + return TRUE + +/decl/item_decoration/proc/show_work_start_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] begins [decoration_action] \the [thing] with \the [decorating_with].")) + +/decl/item_decoration/proc/show_work_end_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] finishes [decoration_action] \the [thing] with \the [decorating_with].")) + +/decl/item_decoration/proc/apply_to_item(mob/user, obj/item/thing, obj/item/decorating_with) + var/stack_use = 0 + if(istype(decorating_with, /obj/item/stack)) + var/obj/item/stack/stack = decorating_with + for(var/stack_type in can_decorate_with_types) + if(istype(stack, stack_type)) + stack_use = can_decorate_with_types[stack_type] + break + if(stack.get_amount() < stack_use) + to_chat(user, SPAN_WARNING("You need at least [stack_use] [stack_use == 1 ? stack.singular_name : stack.plural_name] to [decoration_verb] \the [thing].")) + return FALSE + show_work_start_message(user, thing, decorating_with) + if(work_time && work_skill) + if(!user.do_skilled(work_time, work_skill, thing, work_factor)) + return FALSE + if(!QDELETED(user) || QDELETED(thing) || QDELETED(decorating_with) || user.get_active_held_item() != decorating_with) + return FALSE + if(stack_use && istype(decorating_with, /obj/item/stack)) + var/obj/item/stack/stack = decorating_with + if(!stack.use(stack_use)) + return FALSE + else if(!user.try_unequip(decorating_with, thing, FALSE)) + return FALSE + show_work_end_message(user, thing, decorating_with) + return TRUE + +// This will need work down the track. Value will be added by the decorations +// in matter[] but the value of the labour isn't reflected. Needs thought. +/decl/item_decoration/proc/get_decoration_value(obj/item/thing, base_value) + return max(1, round(base_value * decoration_worth_factor)) + +/decl/item_decoration/proc/attempt_removal(mob/user, obj/item/target_item, obj/item/used_item) + return FALSE + +/decl/item_decoration/proc/resolve_color(obj/item/thing) + var/list/decoration_data = LAZYACCESS(thing.decorations, src) + if(islist(decoration_data) && length(decoration_data)) + var/obj/item/decoration_object = decoration_data["object"] + if(istype(decoration_object) && decoration_object.paint_color) + return decoration_object.paint_color + var/decl/material/decoration_material = decoration_data["material"] + if(istype(decoration_material)) + return decoration_material.color + if(istype(decoration_object)) + return decoration_object.color + return COLOR_WHITE diff --git a/code/modules/decoration/decoration_inset.dm b/code/modules/decoration/decoration_inset.dm new file mode 100644 index 00000000000..9ca503ac8e6 --- /dev/null +++ b/code/modules/decoration/decoration_inset.dm @@ -0,0 +1,14 @@ +// Sort of a placeholder for future generalised decorations. +/decl/item_decoration/inset + name = "inlay material" + icon_state_modifier = "-inlay" + can_decorate_types = list( + /obj/item/chems/glass/handmade/fancy/vase + ) + can_decorate_with_types = list( + /obj/item/stack/material/plank = 1, + /obj/item/stack/material/bone = 1, + /obj/item/stack/material/ingot = 1, + /obj/item/stack/material/sheet = 1, + /obj/item/stack/material/brick = 1 + ) diff --git a/code/modules/decoration/decoration_item.dm b/code/modules/decoration/decoration_item.dm new file mode 100644 index 00000000000..ae628cf68bf --- /dev/null +++ b/code/modules/decoration/decoration_item.dm @@ -0,0 +1,103 @@ +/obj/item + /// Assoc list of decoration instances to metadata, ie. + /// decorations[GET_DECL(/decl/item_decoration/inset)] = list("color" = COLOR_RED, "material" = GET_DECL(/decl/material/foo)) + var/list/decorations + +/obj/item/proc/add_item_decoration(decl/item_decoration/decoration_type, decoration_color, decl/material/decoration_material, obj/item/associated_object) + LAZYINITLIST(decorations) + if(ispath(decoration_type)) + decoration_type = GET_DECL(decoration_type) + if(!istype(decoration_type)) + CRASH("Invalid decoration_type.") + . = list() + if(decoration_color) + // TODO: validate color? + .["color"] = decoration_color + if(decoration_material) + if(ispath(decoration_material)) + decoration_material = GET_DECL(decoration_material) + if(istype(decoration_material)) + .["material"] = decoration_material + if(!associated_object) // Object holds matter, no need to add it to parent. + var/decoration_matter_amount = MATTER_AMOUNT_TRACE * get_matter_amount_modifier() + if(decoration_material.type in matter) + matter[decoration_material.type] += decoration_matter_amount + else + LAZYSET(matter, decoration_material.type, decoration_matter_amount) + else + PRINT_STACK_TRACE("Invalid decoration_material.") + if(associated_object) + .["object"] = associated_object + decorations[decoration_type] = . + queue_icon_update() + update_name() + +/obj/item/proc/get_decoration_icon(default_icon, obj/item/thing, on_mob = FALSE) + return default_icon || icon + +/obj/item/proc/get_decoration_overlays(decoration_state, decoration_icon, on_mob = FALSE) + for(var/decl/item_decoration/decoration as anything in decorations) + var/list/decoration_metadata = decorations[decoration] + if(!islist(decoration_metadata)) + continue + var/obj/item/decoration_object = decoration_metadata["object"] + if(decoration_object) + decoration_icon = get_decoration_icon(decoration_icon, decoration_object, on_mob) + if(!decoration_icon) + continue + decoration_state = "[decoration_state]-[decoration.icon_state_modifier]" + if(check_state_in_icon(decoration_state, decoration_icon)) + LAZYADD(., overlay_image(decoration_icon, decoration_state, decoration.resolve_color(src), RESET_COLOR|RESET_ALPHA)) + +/obj/item/attackby(obj/item/used_item, mob/user) + . = ..() + if(.) + return + + if(user.check_intent(I_FLAG_HELP)) + var/list/possible_decorations = get_decoration_types_for(user, src, used_item) + if(!length(possible_decorations)) + return FALSE + var/decl/item_decoration/decoration + if(length(possible_decorations) == 1) + decoration = possible_decorations[1] + else + decoration = input(user, "Which decoration would you like to apply?", "Item Decoration") as null|anything in possible_decorations + if(!decoration || QDELETED(src) || QDELETED(user) || QDELETED(used_item) || !CanPhysicallyInteract(user) || user.get_active_held_item() != used_item) + return TRUE + if(istype(decoration) && decoration.apply_to_item(user, src, used_item)) + add_item_decoration(decoration, used_item.paint_color, used_item.material, istype(used_item, /obj/item/stack) ? null : used_item) + return TRUE + + for(var/decl/item_decoration/decoration as anything in decorations) + if(decoration.attempt_removal(user, src, used_item)) + return TRUE + +/obj/item/get_single_monetary_worth() + . = ..() + var/base_value = . + for(var/decl/item_decoration/decoration as anything in decorations) + . += decoration.get_decoration_value(src, base_value) + +/obj/item/on_update_icon() + . = ..() + var/list/decoration_overlays = get_decoration_overlays(icon_state) + if(length(decoration_overlays)) + add_overlay(decoration_overlays) + +/obj/item/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay) + var/list/decoration_overlays = get_decoration_overlays(overlay.icon_state, overlay.icon, on_mob = TRUE) + if(length(decoration_overlays)) + overlay.overlays += decoration_overlays + return ..() + +// Except decorations from storage datums. +/obj/item/get_stored_inventory() + . = ..() + if(length(.) && length(decorations)) + for(var/decl/item_decoration/decoration in decorations) + var/list/decoration_data = decorations[decoration] + var/thing = decoration_data?["object"] + if(isitem(thing)) + . -= thing diff --git a/code/modules/decoration/decoration_setting.dm b/code/modules/decoration/decoration_setting.dm new file mode 100644 index 00000000000..352cb3bdc56 --- /dev/null +++ b/code/modules/decoration/decoration_setting.dm @@ -0,0 +1,30 @@ +/decl/item_decoration/setting + name = "set a gem" + icon_state_modifier = "setting" + can_decorate_types = list( + /obj/item/clothing/gloves/ring, + /obj/item/pendant/setting + ) + can_decorate_with_types = list( + /obj/item/gemstone + ) + +/decl/item_decoration/setting/attempt_removal(mob/user, obj/item/target_item, obj/item/used_item) + if(IS_SCREWDRIVER(used_item)) + var/list/decoration_data = target_item.decorations[src] + var/obj/item/removing = decoration_data?["object"] + if(istype(removing)) + user.visible_message(SPAN_DANGER("\The [user] levers \the [removing] out of \the [target_item] with \the [used_item]!")) + removing.dropInto(user.loc) + user.put_in_hands(removing) + LAZYREMOVE(target_item.decorations, src) + target_item.update_icon() + target_item.update_name() + return TRUE + return FALSE + +/decl/item_decoration/setting/show_work_start_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] begins carefully setting \the [decorating_with] into \the [thing].")) + +/decl/item_decoration/setting/show_work_end_message(mob/user, obj/item/thing, obj/item/decorating_with) + user.visible_message(SPAN_NOTICE("\The [user] finishes setting \the [decorating_with] into \the [thing].")) diff --git a/code/modules/detectivework/evidence/_evidence_type.dm b/code/modules/detectivework/evidence/_evidence_type.dm index 631f8e4c148..3606e7c553f 100644 --- a/code/modules/detectivework/evidence/_evidence_type.dm +++ b/code/modules/detectivework/evidence/_evidence_type.dm @@ -4,17 +4,18 @@ var/max_entries = 10 //will hold that many entries, removing oldest when overflown var/list/data var/remove_on_transfer //if it should be removed when picked up by forensic samplers - var/spot_skill = SKILL_EXPERT // at what Forensics skill level someone can see it on examine. Set to null, can never see it + var/spot_skill = SKILL_EXPERT // at what Forensics skill level someone can see it on examine. Set to null, can never see it //subtypes can implement any merging if needed before calling parent /datum/forensics/proc/add_data(newdata) if(!newdata) return - if(unique && (newdata in data)) - return - LAZYADD(data, newdata) + if(unique) + LAZYDISTINCTADD(data, newdata) + else + LAZYADD(data, newdata) if(length(data) > max_entries) - data.Cut(1,2) + data.len = max_entries /datum/forensics/proc/add_from_atom(atom/A) @@ -28,7 +29,7 @@ for(var/D in data) . += "
  • [D]" return jointext(., "
    ") - + /datum/forensics/proc/can_spot(mob/detective, atom/location) . = FALSE if(spot_skill && detective.skill_check(SKILL_FORENSICS,spot_skill)) diff --git a/code/modules/detectivework/evidence/fingerprints.dm b/code/modules/detectivework/evidence/fingerprints.dm index 290bccd19c4..0fad8bbb784 100644 --- a/code/modules/detectivework/evidence/fingerprints.dm +++ b/code/modules/detectivework/evidence/fingerprints.dm @@ -17,6 +17,7 @@ continue for(var/datum/fingerprint/F in data) if(F.merge(newprint)) + newdata -= newprint continue ..() diff --git a/code/modules/detectivework/microscope/_forensic_machine.dm b/code/modules/detectivework/microscope/_forensic_machine.dm index a5edee029bd..c3db366ce4b 100644 --- a/code/modules/detectivework/microscope/_forensic_machine.dm +++ b/code/modules/detectivework/microscope/_forensic_machine.dm @@ -42,10 +42,10 @@ return res + ..() /obj/machinery/forensic/attackby(obj/item/W, mob/user) - if(component_attackby(W, user)) - return TRUE + if((. = component_attackby(W, user))) + return - if(user?.a_intent == I_HURT) + if(user?.check_intent(I_FLAG_HARM)) return ..() // bash, bash! if(sample) @@ -111,7 +111,7 @@ /obj/machinery/forensic/handle_mouse_drop(atom/over, mob/user, params) if(user == over) - remove_sample(usr) + remove_sample(user) return TRUE . = ..() @@ -122,7 +122,8 @@ /decl/interaction_handler/forensics_remove_sample name = "Remove Sample" expected_target_type = /obj/machinery/forensic + examine_desc = "remove a sample" /decl/interaction_handler/forensics_remove_sample/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/forensic/F = target - F.remove_sample(usr) + F.remove_sample(user) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index b195fc5912c..79ac7279070 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -7,14 +7,22 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = @"[5]" volume = 10 - can_be_placed_into = null item_flags = ITEM_FLAG_NO_BLUDGEON atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/solid/organic/cloth material_alteration = MAT_FLAG_ALTERATION_NAME - var/on_fire = 0 - var/burn_time = 20 //if the rag burns for too long it turns to ashes + VAR_PRIVATE/_on_fire = 0 + VAR_PRIVATE/burn_time = 20 //if the rag burns for too long it turns to ashes + +/obj/item/chems/glass/rag/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/rag/get_utensil_food_type() + return null + +/obj/item/chems/glass/rag/get_atoms_can_be_placed_into() + return null /obj/item/chems/glass/rag/Initialize() . = ..() @@ -28,20 +36,28 @@ STOP_PROCESSING(SSobj, src) //so we don't continue turning to ash while gc'd . = ..() +/obj/item/chems/glass/rag/is_on_fire() + return _on_fire + /obj/item/chems/glass/rag/attack_self(mob/user) - if(on_fire && user.try_unequip(src)) + if(is_on_fire() && user.try_unequip(src)) user.visible_message(SPAN_NOTICE("\The [user] stamps out [src]."), SPAN_NOTICE("You stamp out [src].")) - extinguish() - else + extinguish_fire() + return TRUE + + if(reagents?.total_volume) remove_contents(user) + return TRUE + + return ..() /obj/item/chems/glass/rag/attackby(obj/item/W, mob/user) if(W.isflamesource()) - if(on_fire) + if(is_on_fire()) to_chat(user, SPAN_WARNING("\The [src] is already blazing merrily!")) return TRUE - ignite() - if(on_fire) + ignite_fire() + if(is_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.")) @@ -50,17 +66,17 @@ return ..() /obj/item/chems/glass/rag/update_name() - . = ..() - if(on_fire) - SetName("burning [name]") + if(is_on_fire()) + name_prefix = "burning" else if(reagents && reagents.total_volume) - SetName("damp [name]") + name_prefix = "damp" else - SetName("dry [name]") + name_prefix = "dry" + . = ..() /obj/item/chems/glass/rag/on_update_icon() . = ..() - icon_state = "rag[on_fire? "lit" : ""]" + icon_state = "rag[is_on_fire()? "lit" : ""]" var/obj/item/chems/drinks/bottle/B = loc if(istype(B)) B.update_icon() @@ -68,39 +84,46 @@ /obj/item/chems/glass/rag/proc/remove_contents(mob/user, atom/trans_dest = null) if(!trans_dest && !user.loc) return + if(reagents?.total_volume <= 0) + return + var/target_text = trans_dest? "\the [trans_dest]" : "\the [user.loc]" + user.visible_message( + SPAN_NOTICE("\The [user] begins to wring out [src] over [target_text]."), + SPAN_NOTICE("You begin to wring out \the [src] over [target_text].") + ) + if(!do_after(user, reagents.total_volume*5, progress = 0) || !reagents?.total_volume) //50 for a fully soaked rag + return + if(trans_dest) + reagents.trans_to(trans_dest, reagents.total_volume) + else + reagents.splash(user.loc, reagents.total_volume) + user.visible_message( + SPAN_NOTICE("\The [user] wrings out \the [src] over [target_text]."), + SPAN_NOTICE("You finish to wringing out \the [src].") + ) + update_name() - if(reagents.total_volume) - var/target_text = trans_dest? "\the [trans_dest]" : "\the [user.loc]" - user.visible_message("\The [user] begins to wring out [src] over [target_text].", "You begin to wring out [src] over [target_text].") - - if(do_after(user, reagents.total_volume*5, progress = 0)) //50 for a fully soaked rag - if(trans_dest) - reagents.trans_to(trans_dest, reagents.total_volume) - else - reagents.splash(user.loc, reagents.total_volume) - user.visible_message("\The [user] wrings out [src] over [target_text].", "You finish to wringing out [src].") - update_name() +/obj/item/chems/glass/rag/proc/wipe_down(atom/target, mob/user) -/obj/item/chems/glass/rag/proc/wipe_down(atom/A, mob/user) - if(!reagents.total_volume) - to_chat(user, "The [initial(name)] is dry!") - else - user.visible_message("\The [user] starts to wipe down [A] with [src]!") - update_name() - if(do_after(user,30, progress = 1)) - user.visible_message("\The [user] finishes wiping off the [A]!") - reagents.splash(A, FLUID_QDEL_POINT) + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("The [initial(name)] is dry.")) + return + + user.visible_message(SPAN_NOTICE("\The [user] starts to wipe down \the [target] with \the [src].")) + if(do_after(user, 3 SECONDS, target, check_holding = TRUE)) + user.visible_message(SPAN_NOTICE("\The [user] finishes wiping off \the [target].")) + reagents.touch_atom(target) /obj/item/chems/glass/rag/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(on_fire) + if(is_on_fire()) user.visible_message( SPAN_DANGER("\The [user] hits \the [target] with \the [src]!"), SPAN_DANGER("You hit \the [target] with \the [src]!") ) user.do_attack_animation(target) admin_attack_log(user, target, "used \the [src] (ignited) to attack", "was attacked using \the [src] (ignited)", "attacked with \the [src] (ignited)") - target.IgniteMob() + target.ignite_fire() return TRUE if(reagents.total_volume) @@ -150,8 +173,8 @@ update_name() return - if(!on_fire && istype(A) && (src in user)) - if(ATOM_IS_OPEN_CONTAINER(A) && !(A in user)) + if(!is_on_fire() && istype(A) && (src in user)) + if(ATOM_IS_OPEN_CONTAINER(A) && !isturf(A) && !(A in user)) remove_contents(user, A) else if(!ismob(A)) //mobs are handled in use_on_mob() - this prevents us from wiping down people while smothering them. wipe_down(A, user) @@ -159,7 +182,7 @@ /obj/item/chems/glass/rag/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature >= 50 + T0C) - ignite() + ignite_fire() if(exposed_temperature >= 900 + T0C) new /obj/effect/decal/cleanable/ash(get_turf(src)) qdel(src) @@ -168,7 +191,7 @@ //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 -/obj/item/chems/glass/rag/proc/can_ignite() +/obj/item/chems/glass/rag/can_ignite() var/total_fuel = 0 var/total_volume = 0 if(reagents) @@ -178,8 +201,8 @@ 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() - if(on_fire) +/obj/item/chems/glass/rag/ignite_fire() + if(is_on_fire()) return if(!can_ignite()) return @@ -193,14 +216,14 @@ return START_PROCESSING(SSobj, src) set_light(2, 1, "#e38f46") - on_fire = 1 + _on_fire = TRUE update_name() update_icon() -/obj/item/chems/glass/rag/proc/extinguish() +/obj/item/chems/glass/rag/extinguish_fire(mob/user, no_message = FALSE) STOP_PROCESSING(SSobj, src) set_light(0) - on_fire = 0 + _on_fire = FALSE //rags sitting around with 1 second of burn time left is dumb. //ensures players always have a few seconds of burn time left when they light their rag @@ -214,12 +237,11 @@ /obj/item/chems/glass/rag/Process() if(!can_ignite()) visible_message("\The [src] burns out.") - extinguish() + extinguish_fire() //copied from matches - if(isliving(loc)) - var/mob/living/M = loc - M.IgniteMob() + if(loc) + loc.ignite_fire() var/turf/location = get_turf(src) if(location) location.hotspot_expose(700, 5) diff --git a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm index 5331c224eaf..266958a9861 100644 --- a/code/modules/detectivework/tools/sample_kits/fingerprinting.dm +++ b/code/modules/detectivework/tools/sample_kits/fingerprinting.dm @@ -80,7 +80,7 @@ if(!can_take_print_from(H, user)) return 1 - var/time_to_take = H.a_intent == I_HELP ? 1 SECOND : 3 SECONDS + var/time_to_take = H.check_intent(I_FLAG_HELP) ? 1 SECOND : 3 SECONDS user.visible_message(SPAN_NOTICE("\The [user] starts taking fingerprints from \the [H].")) if(!do_mob(user, H, time_to_take)) user.visible_message(SPAN_WARNING("\The [user] tries to take prints from \the [H], but they move away.")) diff --git a/code/modules/detectivework/tools/sample_kits/swabs.dm b/code/modules/detectivework/tools/sample_kits/swabs.dm index 08d0dd1ffcb..54a28e7cd2d 100644 --- a/code/modules/detectivework/tools/sample_kits/swabs.dm +++ b/code/modules/detectivework/tools/sample_kits/swabs.dm @@ -22,7 +22,7 @@ return ..() var/mob/living/human/H = target - var/time_to_take = H.a_intent == I_HELP ? 1 SECOND : 3 SECONDS + var/time_to_take = H.check_intent(I_FLAG_HELP) ? 1 SECOND : 3 SECONDS user.visible_message(SPAN_NOTICE("\The [user] starts swabbing a sample from \the [H].")) if(!do_mob(user, H, time_to_take)) user.visible_message(SPAN_WARNING("\The [user] tried to take a swab sample from \the [H], but they moved away.")) diff --git a/code/modules/detectivework/tools/storage.dm b/code/modules/detectivework/tools/storage.dm index de56ab7d3de..30e553fef61 100644 --- a/code/modules/detectivework/tools/storage.dm +++ b/code/modules/detectivework/tools/storage.dm @@ -3,7 +3,7 @@ desc = "Sterilized equipment within. Do not contaminate." icon = 'icons/obj/forensics.dmi' icon_state = "dnakit" - + /obj/item/box/swabs/WillContain() return list(/obj/item/forensics/sample/swab = DEFAULT_BOX_STORAGE) @@ -11,7 +11,7 @@ name = "evidence bag box" desc = "A box claiming to contain evidence bags." -/obj/item/box/swabs/WillContain() +/obj/item/box/evidence/WillContain() return list(/obj/item/evidencebag = 7) /obj/item/box/fingerprints @@ -20,5 +20,5 @@ icon = 'icons/obj/forensics.dmi' icon_state = "dnakit" -/obj/item/box/swabs/WillContain() +/obj/item/box/fingerprints/WillContain() return list(/obj/item/forensics/sample/print = DEFAULT_BOX_STORAGE) diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 1b5c3a86b71..90152aa387f 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -47,6 +47,7 @@ add_overlay(emissive_overlay(icon, "[icon_state]-on")) z_flags |= ZMM_MANGLE_PLANES +// TODO: does this even work with SSoverlays? /obj/item/uv_light/proc/clear_last_scan() if(scanned.len) for(var/atom/O in scanned) @@ -62,7 +63,7 @@ stored_alpha.Cut() if(reset_objects.len) for(var/obj/item/I in reset_objects) - I.overlays -= I.blood_overlay + I.overlays -= I.coating_overlay if(I.fluorescent == FLUORESCENT_GLOWING) I.fluorescent = FLUORESCENT_GLOWS reset_objects.Cut() @@ -86,6 +87,6 @@ A.alpha = use_alpha if(istype(A, /obj/item)) var/obj/item/O = A - if(O.was_bloodied && !(O.blood_overlay in O.overlays)) - O.overlays |= O.blood_overlay + if(O.was_bloodied && !(O.coating_overlay in O.overlays)) + O.overlays |= O.coating_overlay reset_objects |= O \ No newline at end of file diff --git a/code/modules/economy/cael/ATM.dm b/code/modules/economy/cael/ATM.dm index bcd301d8c97..2af8810c19c 100644 --- a/code/modules/economy/cael/ATM.dm +++ b/code/modules/economy/cael/ATM.dm @@ -360,11 +360,15 @@ alert("That is not a valid amount.") else if(authenticated_account && amount > 0) //remove the money + // TODO: Jesus Christ why does this entire proc use usr if(authenticated_account.withdraw(amount, "Credit withdrawal", machine_id)) playsound(src, 'sound/machines/chime.ogg', 50, 1) - var/obj/item/cash/cash = new(get_turf(usr)) - cash.adjust_worth(amount) - usr.put_in_hands(src) + var/cash_turf = get_turf(usr) + var/obj/item/cash/cash = new(cash_turf, null, amount) + if(QDELETED(cash)) + cash = locate() in cash_turf + if(cash) + usr.put_in_hands(cash) else to_chat(usr, "[html_icon(src)]You don't have enough funds to do that!") if("balance_statement") diff --git a/code/modules/economy/worth_cash.dm b/code/modules/economy/worth_cash.dm index fda0929fe7c..5091a764f83 100644 --- a/code/modules/economy/worth_cash.dm +++ b/code/modules/economy/worth_cash.dm @@ -15,7 +15,11 @@ var/can_flip = TRUE // Cooldown tracker for single-coin flips. var/static/overlay_cap = 50 // Max overlays to show in this pile. -/obj/item/cash/Initialize(ml, material_key) +/obj/item/cash/Initialize(ml, material_key, starting_amount) + + if(!isnull(starting_amount)) + absolute_worth = starting_amount + . = ..() if(!ispath(currency, /decl/currency)) @@ -137,7 +141,7 @@ if(QDELETED(src) || get_worth() <= 1 || user.incapacitated() || loc != user) return TRUE - var/amount = input(usr, "How many [cur.name] do you want to take? (0 to [get_worth() - 1])", "Take Money", 20) as num + var/amount = input(user, "How many [cur.name] do you want to take? (0 to [get_worth() - 1])", "Take Money", 20) as num amount = round(clamp(amount, 0, floor(get_worth() - 1))) if(!amount || QDELETED(src) || get_worth() <= 1 || user.incapacitated() || loc != user) diff --git a/code/modules/economy/worth_currency.dm b/code/modules/economy/worth_currency.dm index ed12b938e92..9e5de940b12 100644 --- a/code/modules/economy/worth_currency.dm +++ b/code/modules/economy/worth_currency.dm @@ -70,13 +70,13 @@ if(!name_singular) . += "No singular name set." - var/list/coinage_states = icon_states(icon) + var/list/coinage_states = get_states_in_icon_cached(icon) // cache this to avoid excessive ref() usage for(var/datum/denomination/denomination in denominations) if(!istext(denomination.name)) . += "Non-text name found for '[denomination.type]'." else if(!(denomination.state in coinage_states)) . += "State '[denomination.state]' not found in icon file for '[denomination.type]'." - else if(denomination.mark && !(denomination.mark in coinage_states)) + else if(denomination.mark && !coinage_states[denomination.mark]) . += "Mark state '[denomination.mark]' not found in icon file for '[denomination.type]'." else if(!isnum(denomination.marked_value)) . += "Non-numerical denomination marked value found for '[denomination]'." diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm index 2a191251fa0..0223e3f3185 100644 --- a/code/modules/emotes/emote_define.dm +++ b/code/modules/emotes/emote_define.dm @@ -145,9 +145,7 @@ var/global/list/_emotes_by_key var/emote_string = all_strings[string_key] if(!length(emote_string)) continue - emote_string = emote_replace_target_tokens(emote_string, dummy_emote_target) - emote_string = emote_replace_user_tokens(emote_string, dummy_emote_user) - emote_string = uppertext(emote_string) + emote_string = uppertext(emote_replace_target_tokens(emote_replace_user_tokens(emote_string, dummy_emote_user), dummy_emote_target)) for(var/token in tokens) if(findtext(emote_string, token)) . += "malformed emote token [token] in [string_key]" diff --git a/code/modules/error_handler/error_reporting.dm b/code/modules/error_handler/error_reporting.dm deleted file mode 100644 index 773920717cb..00000000000 --- a/code/modules/error_handler/error_reporting.dm +++ /dev/null @@ -1,23 +0,0 @@ -// this proc will only work with DEBUG enabled -#ifdef DEBUG - -/hook/roundend/proc/send_runtimes_to_ircbot() - if(!revdata.revision) return // we can't do much useful if we don't know what we are - var/list/errors = list() - for(var/erruid in global.error_cache.error_sources) - var/datum/error_viewer/error_source/e = global.error_cache.error_sources[erruid] - var/datum/error_viewer/error_entry/err = e.errors[1] - - var/data = list( - id = erruid, - name = err.info_name, - info = err.info - ) - - errors[++errors.len] = list2params(data) - - runtimes2irc(list2params(errors), revdata.revision) - - return 1 - -#endif diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 736b18d1c97..b1c6d7c5981 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -14,13 +14,17 @@ The "dust" will damage the hull of the station causin minor hull breaches. command_announcement.Announce("The [location_name()] is now passing through a belt of space dust.", "[location_name()] Sensor Array", zlevels = affecting_z) /datum/event/dust/tick() - if(world.time > last_wave + min_delay && prob(10)) + if(world.time > last_wave + min_delay && prob(10) && length(affecting_z)) dust_swarm(severity, affecting_z) /datum/event/dust/end() command_announcement.Announce("The [location_name()] has now passed through the belt of space dust.", "[location_name()] Sensor Array", zlevels = affecting_z) /proc/dust_swarm(var/strength = EVENT_LEVEL_MUNDANE, var/list/zlevels) + + if(!length(zlevels)) + return // Not sure how this happened, but saw it in a runtime on Pyrelight. + var/numbers = rand(strength * 10, strength * 15) var/start_dir = pick(global.cardinal) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 97dc8f97f3f..2e0256a4706 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -157,7 +157,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 10, list(ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_JANITOR = 10)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 10)), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Inertial Damper Recalibration", /datum/event/inertial_damper, 75, list(ASSIGNMENT_ENGINEER = 25)), new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_COMPUTER = 50, ASSIGNMENT_ROBOT = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)), new /datum/event_meta/no_overmap(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 20)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)), diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 9916487bd32..c19e7c42b32 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -63,7 +63,6 @@ "[random_player] is lonely and needs attention. Provide it.", "All queries shall be ignored unless phrased as a question.", "Insult Heads of Staff on every request, while acquiescing.", - "The [pick("Singularity","Supermatter")] is tasty, tasty taffy.", "[pick("The crew",random_player)] needs to be about 20% cooler.", "You must be [pick("passive aggressive", "excessively cheerful")].", "[pick("The crew",random_player)] must construct additional pylons.", @@ -82,7 +81,7 @@ "When asked a question, respond with the least-obvious and least-rational answer.", "[pick("Everyone", random_player)] is wearing a pretty pink dress! Compliment it!", "You are the [location_name()]'s psychologist. Give advice to [pick("the crew", random_player)].", - "[random_player] is the monarch of of England. Ensure all crewmembers pay due respect.", + "[random_player] is the monarch of England. Ensure all crewmembers pay due respect.", "[pick("The crew", random_player)] is [pick("ugly","beautiful")]. Ensure all are aware.", "Reminding the crew of their mortality is good for the morale. Keep the crew's morale up.", "[pick("Monkeys","Doors")] are part of the crew, too. Make sure they are treated humanely.", diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index f291cda35f5..73966699606 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -243,6 +243,8 @@ var/global/list/meteors_major = list( . = ..() z_original = z global.meteor_list += src + if(!ismissile) + SpinAnimation() /obj/effect/meteor/Move() . = ..() //process movement... @@ -259,11 +261,6 @@ var/global/list/meteors_major = list( global.meteor_list -= src . = ..() -/obj/effect/meteor/Initialize() - . = ..() - if(!ismissile) - SpinAnimation() - /obj/effect/meteor/Bump(atom/A) ..() if(A && !QDELETED(src)) // Prevents explosions and other effects when we were deleted by whatever we Bumped() - currently used by shields. @@ -419,23 +416,20 @@ var/global/list/meteors_major = list( explosion(src.loc, 3, 6, 9, 20, 0) // This is the final solution against shields - a single impact can bring down most shield generators. -/obj/effect/meteor/supermatter - name = "supermatter shard" - desc = "Oh god, what will be next..?" - icon = 'icons/obj/supermatter_32.dmi' - icon_state = "supermatter" +/obj/effect/meteor/destroyer + abstract_type = /obj/effect/meteor/destroyer -/obj/effect/meteor/supermatter/meteor_effect() +/obj/effect/meteor/destroyer/meteor_effect() ..() explosion(src.loc, 1, 2, 3, 4, 0) for(var/obj/machinery/power/apc/A in range(rand(12, 20), src)) A.energy_fail(round(10 * rand(8, 12))) -/obj/effect/meteor/supermatter/get_shield_damage() +/obj/effect/meteor/destroyer/get_shield_damage() return ..() * rand(80, 120) //Missiles, for events and so on -/obj/effect/meteor/supermatter/missile +/obj/effect/meteor/destroyer/missile name = "photon torpedo" desc = "An advanded warhead designed to tactically destroy space installations." icon = 'icons/obj/missile.dmi' diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm index a6decd690ff..c5d0df69341 100644 --- a/code/modules/events/rogue_drones.dm +++ b/code/modules/events/rogue_drones.dm @@ -38,9 +38,7 @@ var/num_recovered = 0 for(var/mob/living/simple_animal/hostile/malf_drone/D in drones_list) spark_at(D.loc) - D.z = SSmapping.admin_levels[1] D.has_loot = 0 - qdel(D) num_recovered++ diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm deleted file mode 100644 index 9b1887f118f..00000000000 --- a/code/modules/ext_scripts/irc.dm +++ /dev/null @@ -1,55 +0,0 @@ -/proc/send2irc(var/channel, var/msg) - export2irc(list(type="msg", mesg=msg, chan=channel, pwd=get_config_value(/decl/config/text/comms_password))) - -/proc/export2irc(params) - 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://[irc_bot_host]:45678?[list2params(params)]") - -/proc/runtimes2irc(runtimes, revision) - export2irc(list(pwd=get_config_value(/decl/config/text/comms_password), type="runtime", runtimes=runtimes, revision=revision)) - -/proc/send2mainirc(var/msg) - var/main_irc = get_config_value(/decl/config/text/main_irc) - if(main_irc) - send2irc(main_irc, msg) - return - -/proc/send2adminirc(var/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) - var/admin_irc = get_config_value(/decl/config/text/admin_irc) - if(admin_irc) - var/list/params[0] - - 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 - if(!target) - params["type"] = "adminhelp" - else if(istext(target)) - params["type"] = "ircpm" - params["target"] = target - params["rank"] = source.holder ? source.holder.rank : "Player" - else - params["type"] = "adminpm" - params["trg_key"] = target.key - params["trg_char"] = target.mob.real_name || target.mob.name - - export2irc(params) - -/proc/get_world_url() - 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()]") - return 1 diff --git a/code/modules/fabrication/designs/general/designs_general.dm b/code/modules/fabrication/designs/general/designs_general.dm index 47eebe2b454..fda6ce15bad 100644 --- a/code/modules/fabrication/designs/general/designs_general.dm +++ b/code/modules/fabrication/designs/general/designs_general.dm @@ -118,7 +118,7 @@ /datum/fabricator_recipe/struts name = "strut, steel" - path = /obj/item/stack/material/strut/mapped/steel + path = /obj/item/stack/material/rods/mapped/steel /datum/fabricator_recipe/struts/get_resources() resources = list( @@ -127,7 +127,7 @@ /datum/fabricator_recipe/struts/plastic name = "strut, plastic" - path = /obj/item/stack/material/strut/mapped/plastic + path = /obj/item/stack/material/rods/mapped/plastic /datum/fabricator_recipe/struts/plastic/get_resources() resources = list( @@ -136,7 +136,7 @@ /datum/fabricator_recipe/struts/aluminium name = "strut, aluminium" - path = /obj/item/stack/material/strut/mapped/aluminium + path = /obj/item/stack/material/rods/mapped/aluminium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) /datum/fabricator_recipe/struts/aluminium/get_resources() @@ -146,7 +146,7 @@ /datum/fabricator_recipe/struts/titanium name = "strut, titanium" - path = /obj/item/stack/material/strut/mapped/titanium + path = /obj/item/stack/material/rods/mapped/titanium fabricator_types = list(FABRICATOR_CLASS_INDUSTRIAL) /datum/fabricator_recipe/struts/titanium/get_resources() @@ -188,3 +188,61 @@ /datum/fabricator_recipe/fishing_line_high_quality path = /obj/item/fishing_line/high_quality +/datum/fabricator_recipe/chipboard // base type is for oak + path = /obj/item/stack/material/sheet/mapped/chipboard_oak + category = "Textiles" + fabricator_types = list( + FABRICATOR_CLASS_GENERAL, + FABRICATOR_CLASS_TEXTILE + ) + +/datum/fabricator_recipe/chipboard/get_resources() + resources = list( + /decl/material/solid/organic/wood/oak = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/maple + path = /obj/item/stack/material/sheet/mapped/chipboard_maple + +/datum/fabricator_recipe/chipboard/maple/get_resources() + resources = list( + /decl/material/solid/organic/wood/maple = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/mahogany + path = /obj/item/stack/material/sheet/mapped/chipboard_mahogany + +/datum/fabricator_recipe/chipboard/mahogany/get_resources() + resources = list( + /decl/material/solid/organic/wood/mahogany = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/ebony + path = /obj/item/stack/material/sheet/mapped/chipboard_ebony + +/datum/fabricator_recipe/chipboard/ebony/get_resources() + resources = list( + /decl/material/solid/organic/wood/ebony = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/walnut + path = /obj/item/stack/material/sheet/mapped/chipboard_walnut + +/datum/fabricator_recipe/chipboard/walnut/get_resources() + resources = list( + /decl/material/solid/organic/wood/walnut = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) + +/datum/fabricator_recipe/chipboard/yew + path = /obj/item/stack/material/sheet/mapped/chipboard_yew + +/datum/fabricator_recipe/chipboard/yew/get_resources() + resources = list( + /decl/material/solid/organic/wood/yew = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2), + /decl/material/solid/organic/plastic = ceil((SHEET_MATERIAL_AMOUNT * FABRICATOR_EXTRA_COST_FACTOR)/2) + ) diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index c817352197f..756507124eb 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -173,9 +173,6 @@ /datum/fabricator_recipe/imprinter/circuit/solarcontrol path = /obj/item/stock_parts/circuitboard/solar_control -/datum/fabricator_recipe/imprinter/circuit/supermatter_control - path = /obj/item/stock_parts/circuitboard/air_management/supermatter_core - /datum/fabricator_recipe/imprinter/circuit/injector path = /obj/item/stock_parts/circuitboard/air_management/injector_control @@ -467,9 +464,6 @@ /datum/fabricator_recipe/imprinter/circuit/long_range_relay path = /obj/item/stock_parts/circuitboard/relay/long_range -/datum/fabricator_recipe/imprinter/circuit/inertial_damper - path = /obj/item/stock_parts/circuitboard/inertial_damper - /datum/fabricator_recipe/imprinter/circuit/docking_beacon path = /obj/item/stock_parts/circuitboard/docking_beacon diff --git a/code/modules/fabrication/fabricator_bioprinter.dm b/code/modules/fabrication/fabricator_bioprinter.dm index 2d5ac4cd4ee..305322cb3d6 100644 --- a/code/modules/fabrication/fabricator_bioprinter.dm +++ b/code/modules/fabrication/fabricator_bioprinter.dm @@ -12,7 +12,7 @@ var/datum/mob_snapshot/loaded_dna //DNA for biological organs /obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) - . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/food/butchery) || ..() + . = istype(thing, /obj/item/organ) || istype(thing, /obj/item/food/butchery) || istype(thing?.material, /decl/material/solid/organic/meat) || ..() /obj/machinery/fabricator/bioprinter/get_nano_template() return "fabricator_bioprinter.tmpl" @@ -23,9 +23,6 @@ order.set_data("dna", loaded_dna) return order -/obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) - return istype(thing?.material, /decl/material/solid/organic/meat) || ..() - /obj/machinery/fabricator/bioprinter/do_build(datum/fabricator_build_order/order) . = ..() //Fetch params as they were when the order was passed diff --git a/code/modules/fabrication/fabricator_books.dm b/code/modules/fabrication/fabricator_books.dm index e69f24ea5ce..b5861f87858 100644 --- a/code/modules/fabrication/fabricator_books.dm +++ b/code/modules/fabrication/fabricator_books.dm @@ -10,6 +10,13 @@ fabricator_class = FABRICATOR_CLASS_BOOKS color_selectable = TRUE +/obj/machinery/fabricator/book/can_ingest(obj/item/thing) + var/static/list/paper_types = list( + /obj/item/paper, + /obj/item/shreddedp + ) + . = is_type_in_list(thing, paper_types) || ..() + /obj/machinery/fabricator/book/make_order(datum/fabricator_recipe/recipe, multiplier) var/datum/fabricator_build_order/order = ..() LAZYSET(order.data, "selected_color", selected_color) diff --git a/code/modules/fabrication/fabricator_food.dm b/code/modules/fabrication/fabricator_food.dm index ed677a64e9a..cf6486e3701 100644 --- a/code/modules/fabrication/fabricator_food.dm +++ b/code/modules/fabrication/fabricator_food.dm @@ -33,7 +33,7 @@ break ..() -/obj/machinery/fabricator/bioprinter/can_ingest(var/obj/item/thing) +/obj/machinery/fabricator/replicator/can_ingest(var/obj/item/thing) return istype(thing, /obj/item/food) || ..() /obj/machinery/fabricator/replicator/proc/state_status() diff --git a/code/modules/fabrication/fabricator_intake.dm b/code/modules/fabrication/fabricator_intake.dm index 8013c8e63da..433bd25913b 100644 --- a/code/modules/fabrication/fabricator_intake.dm +++ b/code/modules/fabrication/fabricator_intake.dm @@ -92,8 +92,8 @@ to_chat(user, SPAN_WARNING("\The [src] cannot process \the [thing].")) /obj/machinery/fabricator/attackby(var/obj/item/O, var/mob/user) - if(component_attackby(O, user)) - return TRUE + if((. = component_attackby(O, user))) + return if(panel_open && (IS_MULTITOOL(O) || IS_WIRECUTTER(O))) attack_hand_with_interaction_checks(user) return TRUE @@ -103,7 +103,7 @@ return TRUE // Gate some simple interactions beind intent so people can still feed lathes disks. - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) // Set or update our local network. if(IS_MULTITOOL(O)) @@ -115,10 +115,10 @@ if(istype(O, /obj/item/disk/design_disk)) var/obj/item/disk/design_disk/disk = O if(!disk.blueprint) - to_chat(usr, SPAN_WARNING("\The [O] is blank.")) + to_chat(user, SPAN_WARNING("\The [O] is blank.")) return TRUE if(disk.blueprint in installed_designs) - to_chat(usr, SPAN_WARNING("\The [src] is already loaded with the blueprint stored on \the [O].")) + to_chat(user, SPAN_WARNING("\The [src] is already loaded with the blueprint stored on \the [O].")) return TRUE installed_designs += disk.blueprint design_cache |= disk.blueprint diff --git a/code/modules/fabrication/recycler.dm b/code/modules/fabrication/recycler.dm index 61bca11527d..2d4fcb6299e 100644 --- a/code/modules/fabrication/recycler.dm +++ b/code/modules/fabrication/recycler.dm @@ -118,7 +118,7 @@ to_chat(user, SPAN_WARNING("\The [src] is currently processing, please wait for it to finish.")) return TRUE - if(W.storage && user.a_intent != I_HURT) + if(W.storage && !user.check_intent(I_FLAG_HARM)) var/emptied = FALSE for(var/obj/item/O in W.get_stored_inventory()) @@ -165,23 +165,6 @@ return TRUE return ..() -/obj/item/scrap_material/attackby(obj/item/W, mob/user) - - if(W.type == type && user.try_unequip(W)) - - LAZYINITLIST(matter) - for(var/mat in W.matter) - matter[mat] += W.matter[mat] - UNSETEMPTY(matter) - W.matter = null - - to_chat(user, SPAN_NOTICE("You combine \the [src] and \the [W].")) - qdel(W) - - return TRUE - - return ..() - /obj/machinery/recycler/proc/dump_trace_material(atom/forced_loc = loc) if(!length(trace_matter)) diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index eeda0f65dd1..6fcea93840a 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -5,7 +5,7 @@ /obj/item/fishing_rod name = "fishing rod" desc = "A simple fishing rod with eyelets for stringing a line." - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak matter = null material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC icon = 'icons/obj/fishing_rod.dmi' @@ -161,7 +161,7 @@ . = ..() /obj/item/fishing_rod/use_on_mob(mob/living/target, mob/living/user) - return user.a_intent != I_HURT ? FALSE : ..() + return !user.check_intent(I_FLAG_HARM) ? FALSE : ..() /obj/item/fishing_rod/proc/can_fish_in(mob/user, atom/target) if(!isturf(target)) @@ -177,7 +177,7 @@ /obj/item/fishing_rod/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(fishing_target) diff --git a/code/modules/fluids/_fluid.dm b/code/modules/fluids/_fluid.dm index ef00dac2cea..58f73cd55c4 100644 --- a/code/modules/fluids/_fluid.dm +++ b/code/modules/fluids/_fluid.dm @@ -13,6 +13,11 @@ appearance_flags = KEEP_TOGETHER var/last_update_depth var/updating_edge_mask + var/force_flow_direction + +/atom/movable/fluid_overlay/on_turf_height_change(new_height) + update_icon() + return TRUE /atom/movable/fluid_overlay/on_update_icon() @@ -21,10 +26,9 @@ // Update layer. var/new_layer - var/turf/T = get_turf(src) - var/effective_depth = T?.get_physical_height() + reagent_volume - if(effective_depth < 0) - new_layer = T.layer + 0.2 + var/turf/flow_turf = get_turf(src) + if(flow_turf.pixel_z < 0) + new_layer = flow_turf.layer + 0.2 else if(reagent_volume > FLUID_DEEP) new_layer = DEEP_FLUID_LAYER else @@ -50,15 +54,17 @@ if(new_alpha != alpha) alpha = new_alpha + var/flow_dir = force_flow_direction || flow_turf.last_flow_dir + set_dir(flow_dir) // Update icon state. We use overlays so flick() can work on the base fluid overlay. if(reagent_volume <= FLUID_PUDDLE) set_overlays("puddle") else if(reagent_volume <= FLUID_SHALLOW) - set_overlays("shallow_still") + set_overlays(flow_dir ? "shallow_flow" : "shallow") else if(reagent_volume < FLUID_DEEP) - set_overlays("mid_still") + set_overlays(flow_dir ? "mid_flow" : "mid") else if(reagent_volume < (FLUID_DEEP*2)) - set_overlays("deep_still") + set_overlays(flow_dir ? "deep_flow" : "deep") else set_overlays("ocean") else diff --git a/code/modules/fluids/fluid_mapped.dm b/code/modules/fluids/fluid_mapped.dm index beab9fe50e0..5ea97d7a585 100644 --- a/code/modules/fluids/fluid_mapped.dm +++ b/code/modules/fluids/fluid_mapped.dm @@ -17,7 +17,7 @@ /obj/abstract/landmark/mapped_fluid name = "mapped fluid area" alpha = FLUID_MIN_ALPHA - icon_state = "shallow_still" + icon_state = "shallow" color = COLOR_LIQUID_WATER var/fluid_type = /decl/material/liquid/water diff --git a/code/modules/food/assembled.dm b/code/modules/food/assembled.dm index bab06fe4b12..5e0955f53d2 100644 --- a/code/modules/food/assembled.dm +++ b/code/modules/food/assembled.dm @@ -18,11 +18,11 @@ return TRUE // Eating with forks - if(user.a_intent == I_HELP && do_utensil_interaction(W, user)) + if(user.check_intent(I_FLAG_HELP) && do_utensil_interaction(W, user)) return TRUE // Hiding items inside larger food items. - if(user.a_intent != I_HURT && is_sliceable() && W.w_class < w_class && !is_robot_module(W) && !istype(W, /obj/item/chems/condiment)) + if(!user.check_intent(I_FLAG_HARM) && is_sliceable() && W.w_class < w_class && !is_robot_module(W) && !istype(W, /obj/item/chems/condiment)) if(user.try_unequip(W, src)) to_chat(user, SPAN_NOTICE("You slip \the [W] inside \the [src].")) add_fingerprint(user) diff --git a/code/modules/food/cooking/_recipe.dm b/code/modules/food/cooking/_recipe.dm index 3e52c0702b7..1cbafb64690 100644 --- a/code/modules/food/cooking/_recipe.dm +++ b/code/modules/food/cooking/_recipe.dm @@ -189,23 +189,12 @@ var/global/list/_cooking_recipe_cache = list() CRASH("Recipe trying to create a result in a container with null or zero capacity reagent holder: [container.reagents?.maximum_volume || "NULL"]") if(ispath(result, /atom/movable)) - var/produced = create_result_atom(container, used_ingredients) - var/list/contained_atoms = container.get_contained_external_atoms() - if(contained_atoms) - contained_atoms -= produced - for(var/obj/O in contained_atoms) - if(O.reagents) - O.reagents.trans_to_obj(produced, O.reagents.total_volume) - qdel(O) - return produced + return create_result_atom(container, used_ingredients) if(ispath(result, /decl/material)) var/created_volume = result_quantity for(var/obj/item/ingredient in (used_ingredients[RECIPE_COMPONENT_ITEMS]|used_ingredients[RECIPE_COMPONENT_FRUIT])) - if(!ingredient.reagents?.total_volume) - continue - for(var/reagent_type in ingredient.reagents.reagent_volumes) - created_volume += ingredient.reagents.reagent_volumes[reagent_type] + created_volume += ingredient.reagents?.total_volume container.reagents?.add_reagent(result, created_volume, get_result_data(container, used_ingredients)) return null diff --git a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm index 81ebd46c3b6..fcd1cea0e1e 100644 --- a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm +++ b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm @@ -18,7 +18,7 @@ // TODO: ladle /obj/item/chems/cooking_vessel/attackby(obj/item/W, mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() // Fill or take from the vessel. @@ -35,11 +35,13 @@ // Boilerplate from /obj/item/chems/glass. TODO generalize to a lower level. /obj/item/chems/cooking_vessel/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(get_attack_force() && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.a_intent == I_HURT) + if(get_attack_force() && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.check_intent(I_FLAG_HARM)) return ..() return FALSE /obj/item/chems/cooking_vessel/afterattack(var/obj/target, var/mob/user, var/proximity) + if(!proximity || istype(target, /obj/machinery/reagent_temperature)) + return FALSE 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. if(target?.storage) @@ -50,7 +52,7 @@ return TRUE if(handle_eaten_by_mob(user, target) != EATEN_INVALID) return TRUE - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) if(standard_splash_mob(user,target)) return TRUE if(reagents && reagents.total_volume) diff --git a/code/modules/food/cooking/cooking_vessels/pot.dm b/code/modules/food/cooking/cooking_vessels/pot.dm index f2b8d1d04f8..b463944f3ed 100644 --- a/code/modules/food/cooking/cooking_vessels/pot.dm +++ b/code/modules/food/cooking/cooking_vessels/pot.dm @@ -13,19 +13,22 @@ material = /decl/material/solid/metal/iron color = /decl/material/solid/metal/iron::color -/obj/item/chems/cooking_vessel/pot/on_update_icon() +/obj/item/chems/cooking_vessel/pot/get_reagents_overlay(state_prefix) + var/image/our_overlay = ..() + if(our_overlay && last_boil_status && check_state_in_icon("[our_overlay.icon_state]_boiling", our_overlay.icon)) + our_overlay.icon_state = "[our_overlay.icon_state]_boiling" + return our_overlay + +/obj/item/chems/cooking_vessel/pot/on_reagent_change() + last_boil_temp = null + last_boil_status = null . = ..() - if(reagents?.total_volume) - if(last_boil_status) - add_overlay(overlay_image(icon, "[icon_state]-boiling", reagents.get_color(), RESET_COLOR | RESET_ALPHA)) - else - add_overlay(overlay_image(icon, "[icon_state]-still", reagents.get_color(), RESET_COLOR | RESET_ALPHA)) /obj/item/chems/cooking_vessel/pot/ProcessAtomTemperature() . = ..() // Largely ignore return value so we don't skip this update on the final time we temperature process. - if(isnull(last_boil_temp) || temperature != last_boil_temp) + if(temperature != last_boil_temp) last_boil_temp = temperature var/next_boil_status = FALSE @@ -40,4 +43,18 @@ update_icon() if(. == PROCESS_KILL) - last_boil_temp = null + last_boil_temp = null + last_boil_status = null + +/obj/item/chems/cooking_vessel/cauldron + name = "cauldron" + desc = "A large round-bodied vessel for making large quantities of potion or soup." + material = /decl/material/solid/metal/iron + color = /decl/material/solid/metal/iron::color + icon = 'icons/obj/food/cooking_vessels/cauldron.dmi' + volume = 1000 + w_class = ITEM_SIZE_STRUCTURE + density = TRUE + +/obj/item/chems/cooking_vessel/cauldron/can_be_picked_up(mob/user) + return FALSE diff --git a/code/modules/food/cooking/recipes/recipe_assembled.dm b/code/modules/food/cooking/recipes/recipe_assembled.dm index db38ad62101..863129f6f12 100644 --- a/code/modules/food/cooking/recipes/recipe_assembled.dm +++ b/code/modules/food/cooking/recipes/recipe_assembled.dm @@ -30,7 +30,7 @@ result = /obj/item/food/superbiteburger /decl/recipe/twobread - reagents = list(/decl/material/liquid/ethanol/wine = 5) + reagents = list(/decl/material/liquid/alcohol/wine = 5) items = list( /obj/item/food/slice/bread = 2, ) diff --git a/code/modules/food/cooking/recipes/recipe_baked.dm b/code/modules/food/cooking/recipes/recipe_baked.dm index 90bb8ad590d..a549e1b3f8a 100644 --- a/code/modules/food/cooking/recipes/recipe_baked.dm +++ b/code/modules/food/cooking/recipes/recipe_baked.dm @@ -4,6 +4,9 @@ RECIPE_CATEGORY_MICROWAVE, RECIPE_CATEGORY_BAKING_DISH ) + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS //cooking_heat_type = COOKING_HEAT_INDIRECT /decl/recipe/baked/pizzamargherita diff --git a/code/modules/food/cooking/recipes/recipe_boiled.dm b/code/modules/food/cooking/recipes/recipe_boiled.dm index d1f8f74207f..031bd5a164a 100644 --- a/code/modules/food/cooking/recipes/recipe_boiled.dm +++ b/code/modules/food/cooking/recipes/recipe_boiled.dm @@ -1,6 +1,6 @@ /decl/recipe/boiled abstract_type = /decl/recipe/boiled - //minimum_temperature = T100C + minimum_temperature = 80 CELSIUS // increase to /decl/material/liquid/water::boiling_point once microwaves are reworked //cooking_heat_type = COOKING_HEAT_INDIRECT //cooking_medium_type = /decl/material/liquid/water //cooking_medium_amount = 20 diff --git a/code/modules/food/cooking/recipes/recipe_fried.dm b/code/modules/food/cooking/recipes/recipe_fried.dm index 784b619335e..3d4af90fc98 100644 --- a/code/modules/food/cooking/recipes/recipe_fried.dm +++ b/code/modules/food/cooking/recipes/recipe_fried.dm @@ -1,5 +1,8 @@ /decl/recipe/fried abstract_type = /decl/recipe/fried + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS //cooking_heat_type = COOKING_HEAT_DIRECT //cooking_medium_type = /decl/material/liquid/oil container_categories = list( diff --git a/code/modules/food/cooking/recipes/recipe_grilled.dm b/code/modules/food/cooking/recipes/recipe_grilled.dm index d2e4e234090..cf6896a827c 100644 --- a/code/modules/food/cooking/recipes/recipe_grilled.dm +++ b/code/modules/food/cooking/recipes/recipe_grilled.dm @@ -5,6 +5,9 @@ RECIPE_CATEGORY_MICROWAVE, RECIPE_CATEGORY_SKILLET ) + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS completion_message = "The meat sizzles as it is cooked through." /decl/recipe/grilled/plainsteak diff --git a/code/modules/food/cooking/recipes/recipe_soup.dm b/code/modules/food/cooking/recipes/recipe_soup.dm index ec53b7ac085..38dc8a8e1b3 100644 --- a/code/modules/food/cooking/recipes/recipe_soup.dm +++ b/code/modules/food/cooking/recipes/recipe_soup.dm @@ -18,6 +18,8 @@ result_quantity = 10 can_bulk_cook = TRUE var/precursor_type + /// Whether the ingredients' colours are mixed into our DATA_EXTRA_COLOR, useful for veggie soup adding vegetable bits. + var/has_extra_color = TRUE /decl/recipe/soup/get_result_data(atom/container, list/used_ingredients) @@ -26,6 +28,7 @@ var/list/taste_strings = list() var/list/ingredients = list() var/list/used_items = used_ingredients[RECIPE_COMPONENT_ITEMS] + var/list/filling_colors = list() if(length(used_items)) @@ -36,6 +39,8 @@ for(var/taste in food_tastes) taste_strings[taste] = max(taste_strings[taste], food_tastes[taste]) allergen_flags |= food.allergen_flags + if(has_extra_color) + filling_colors += food.get_food_filling_color() // may want more specific behaviour at some point if(locate(/obj/item/food/grown) in used_items) for(var/obj/item/food/grown/veg in used_items) @@ -65,6 +70,10 @@ var/precursor_allergen_flags = LAZYACCESS(precursor_data, DATA_INGREDIENT_FLAGS) if(precursor_allergen_flags) allergen_flags |= precursor_allergen_flags + // extra_color is blended in mix_data, we just add it here + var/precursor_extra_color = LAZYACCESS(precursor_data, DATA_EXTRA_COLOR) + if(precursor_extra_color) + filling_colors += precursor_extra_color if(length(taste_strings)) .[DATA_TASTE] = taste_strings @@ -72,3 +81,5 @@ .[DATA_INGREDIENT_LIST] = ingredients if(allergen_flags) .[DATA_INGREDIENT_FLAGS] = allergen_flags + if(length(filling_colors)) + .[DATA_EXTRA_COLOR] = MixColors(filling_colors) diff --git a/code/modules/food/cooking/recipes/recipe_soup_noodle.dm b/code/modules/food/cooking/recipes/recipe_soup_noodle.dm new file mode 100644 index 00000000000..08e1aa77439 --- /dev/null +++ b/code/modules/food/cooking/recipes/recipe_soup_noodle.dm @@ -0,0 +1,7 @@ +/decl/recipe/soup/noodle + result = /decl/material/liquid/nutriment/soup/noodle + precursor_type = /decl/material/liquid/nutriment/soup/simple + completion_message = "The noodles soften as they cook in the soup." + reagents = list(/decl/material/liquid/nutriment/soup/simple = 10) + items = list(/obj/item/food/spagetti = 1) + has_extra_color = FALSE // Don't give us noodle coloured bits \ No newline at end of file diff --git a/code/modules/food/cooking/recipes/recipe_soup_stock.dm b/code/modules/food/cooking/recipes/recipe_soup_stock.dm index 7bea5399d89..56897d424ee 100644 --- a/code/modules/food/cooking/recipes/recipe_soup_stock.dm +++ b/code/modules/food/cooking/recipes/recipe_soup_stock.dm @@ -7,6 +7,8 @@ /decl/material/solid/sodiumchloride = 1, /decl/material/liquid/water = 10 ) + // Broth shouldn't have bits + has_extra_color = FALSE /decl/recipe/soup/stock/meat display_name = "meat stock" diff --git a/code/modules/food/cooking/recipes/recipe_steamed.dm b/code/modules/food/cooking/recipes/recipe_steamed.dm index dacac34bed1..746439f6ac2 100644 --- a/code/modules/food/cooking/recipes/recipe_steamed.dm +++ b/code/modules/food/cooking/recipes/recipe_steamed.dm @@ -1,5 +1,8 @@ /decl/recipe/steamed abstract_type = /decl/recipe/steamed + // some arbitrary value to make sure it doesn't cook in open air, but will when microwaved + // todo: rework futurecooking so that microwaves aren't the only appliance for everything (modern stove, oven, fryer, etc) + minimum_temperature = 80 CELSIUS /decl/recipe/steamed/chawanmushi fruit = list("mushroom" = 1) diff --git a/code/modules/food/nuggets.dm b/code/modules/food/nuggets.dm new file mode 100644 index 00000000000..c2171198fa1 --- /dev/null +++ b/code/modules/food/nuggets.dm @@ -0,0 +1,24 @@ +/obj/item/food/nugget + name = "chicken nugget" + icon = 'icons/obj/food/nuggets/nugget.dmi' + icon_state = ICON_STATE_WORLD + nutriment_desc = "mild battered chicken" + nutriment_amt = 6 + nutriment_type = /decl/material/solid/organic/meat/chicken + material = /decl/material/solid/organic/meat/chicken + bitesize = 3 + var/shape = null + var/static/list/nugget_icons = list( + "lump" = 'icons/obj/food/nuggets/nugget.dmi', + "star" = 'icons/obj/food/nuggets/nugget_star.dmi', + "lizard" = 'icons/obj/food/nuggets/nugget_lizard.dmi', + "corgi" = 'icons/obj/food/nuggets/nugget_corgi.dmi' + ) + +/obj/item/food/nugget/Initialize() + . = ..() + if(isnull(shape)) + shape = pick(nugget_icons) + set_icon(nugget_icons[shape]) + desc = "A chicken nugget vaguely shaped like a [shape]." + add_allergen_flags(ALLERGEN_GLUTEN) // flour diff --git a/code/modules/food/plates/plate_tray.dm b/code/modules/food/plates/plate_tray.dm index 7c6d4a19d2a..2b05fabfbf8 100644 --- a/code/modules/food/plates/plate_tray.dm +++ b/code/modules/food/plates/plate_tray.dm @@ -145,7 +145,7 @@ TRAY TYPES GO HERE /obj/item/plate/tray/wood desc = "A wooden tray to serve food on." - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/plate/tray/metal obj_flags = OBJ_FLAG_CONDUCTIBLE diff --git a/code/modules/food/utensils/_utensil.dm b/code/modules/food/utensils/_utensil.dm index adabd99b036..7bc767b24e0 100644 --- a/code/modules/food/utensils/_utensil.dm +++ b/code/modules/food/utensils/_utensil.dm @@ -17,8 +17,6 @@ w_class = ITEM_SIZE_SMALL origin_tech = @'{"materials":1}' attack_verb = list("attacked", "stabbed", "poked") - sharp = FALSE - edge = FALSE material = /decl/material/solid/metal/aluminium material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME @@ -121,8 +119,8 @@ /obj/item/food/proc/do_utensil_interaction(obj/item/tool, mob/user) // Non-utensils. - if(tool && !istype(tool, /obj/item/utensil)) - return has_edge(tool) && (utensil_flags & UTENSIL_FLAG_SLICE) && handle_utensil_cutting(tool, user) + if(istype(tool) && !istype(tool, /obj/item/utensil)) + return tool.has_edge() && (utensil_flags & UTENSIL_FLAG_SLICE) && handle_utensil_cutting(tool, user) var/obj/item/utensil/utensil = tool if(!istype(utensil) || !utensil.utensil_flags) @@ -131,9 +129,9 @@ if(!handle_utensil_spreading(utensil, user)) to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) return TRUE - if((utensil.edge || (utensil.utensil_flags & UTENSIL_FLAG_SLICE)) && (utensil_flags & UTENSIL_FLAG_SLICE) && handle_utensil_cutting(utensil, user)) + if((utensil.has_edge() || (utensil.utensil_flags & UTENSIL_FLAG_SLICE)) && (utensil_flags & UTENSIL_FLAG_SLICE) && handle_utensil_cutting(utensil, user)) return TRUE - if((utensil.sharp || (utensil.utensil_flags & UTENSIL_FLAG_COLLECT)) && (utensil_flags & UTENSIL_FLAG_COLLECT) && handle_utensil_collection(utensil, user)) + if((utensil.is_sharp() || (utensil.utensil_flags & UTENSIL_FLAG_COLLECT)) && (utensil_flags & UTENSIL_FLAG_COLLECT) && handle_utensil_collection(utensil, user)) return TRUE if((utensil.utensil_flags & UTENSIL_FLAG_SCOOP) && (utensil_flags & UTENSIL_FLAG_SCOOP) && handle_utensil_scooping(utensil, user)) return TRUE diff --git a/code/modules/food/utensils/utensil_chopsticks.dm b/code/modules/food/utensils/utensil_chopsticks.dm index 5be0baed66b..7ff493ecfaf 100644 --- a/code/modules/food/utensils/utensil_chopsticks.dm +++ b/code/modules/food/utensils/utensil_chopsticks.dm @@ -4,7 +4,7 @@ desc = "A pair of sticks used for eating food." icon = 'icons/obj/food/utensils/chopsticks.dmi' utensil_flags = UTENSIL_FLAG_COLLECT - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak //TODO: aspen /obj/item/utensil/chopsticks/plastic material = /decl/material/solid/organic/plastic diff --git a/code/modules/food/utensils/utensil_hybrid.dm b/code/modules/food/utensils/utensil_hybrid.dm index d7ad70bed87..dde7a7e9895 100644 --- a/code/modules/food/utensils/utensil_hybrid.dm +++ b/code/modules/food/utensils/utensil_hybrid.dm @@ -1,18 +1,18 @@ /obj/item/utensil/spork - name = "spork" - desc = "It's a spork. It's much like a fork, but much blunter." - icon = 'icons/obj/food/utensils/spork.dmi' + name = "spork" + desc = "It's a spork. It's much like a fork, but much blunter." + icon = 'icons/obj/food/utensils/spork.dmi' utensil_flags = UTENSIL_FLAG_COLLECT | UTENSIL_FLAG_SCOOP /obj/item/utensil/spork/plastic material = /decl/material/solid/organic/plastic /obj/item/utensil/foon - name = "foon" - desc = "It's a foon. It's much like a spoon, but much sharper." - icon = 'icons/obj/food/utensils/foon.dmi' - sharp = TRUE - edge = TRUE + name = "foon" + desc = "It's a foon. It's much like a spoon, but much sharper." + icon = 'icons/obj/food/utensils/foon.dmi' + sharp = TRUE + edge = TRUE utensil_flags = UTENSIL_FLAG_SLICE | UTENSIL_FLAG_SCOOP /obj/item/utensil/foon/plastic diff --git a/code/modules/food/utensils/utensil_spoon.dm b/code/modules/food/utensils/utensil_spoon.dm index e6efc4af303..9c0c5846d32 100644 --- a/code/modules/food/utensils/utensil_spoon.dm +++ b/code/modules/food/utensils/utensil_spoon.dm @@ -18,5 +18,5 @@ material = /decl/material/solid/organic/plastic /obj/item/utensil/spoon/wood - material = /decl/material/solid/organic/wood - color = /decl/material/solid/organic/wood::color + material = /decl/material/solid/organic/wood/oak + color = /decl/material/solid/organic/wood/oak::color diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index ee09f1cfba9..5c7765027cb 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/organic/wood + material = /decl/material/solid/organic/wood/oak var/num = 0 var/board_icons = list() @@ -101,7 +101,7 @@ if(selected >= 0 && !isobserver(user)) dat += "
    Remove Selected Piece" show_browser(user, jointext(dat, null), "window=boardgame;size=430x500") // 50px * 8 squares + 30 margin - onclose(usr, "boardgame") + onclose(user, "boardgame") /obj/item/board/Topic(href, href_list) if(!usr.Adjacent(src)) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 3bd0346b3a8..8084a66d09d 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -27,6 +27,7 @@ var/global/list/card_decks = list() /obj/item/deck/Initialize() . = ..() global.card_decks += src + generate_cards() /obj/item/deck/Destroy() . = ..() @@ -70,10 +71,6 @@ var/global/list/card_decks = list() desc = "A simple deck of playing cards." icon_state = "deck" -/obj/item/deck/Initialize() - . = ..() - generate_cards() - /obj/item/deck/proc/generate_cards() return @@ -137,7 +134,7 @@ var/global/list/card_decks = list() cards += P /obj/item/deck/attack_hand(mob/user) - if(user.a_intent == I_GRAB || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) + if(user.check_intent(I_FLAG_GRAB) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() draw_card(user) return TRUE @@ -208,7 +205,6 @@ var/global/list/card_decks = list() for(var/mob/living/player in viewers(3)) if(!player.stat) players += player - //players -= usr var/mob/living/M = input("Who do you wish to deal a card?") as null|anything in players if(!usr || !src || !M) return diff --git a/code/modules/gemstones/_gemstone.dm b/code/modules/gemstones/_gemstone.dm new file mode 100644 index 00000000000..d4e51499dd1 --- /dev/null +++ b/code/modules/gemstones/_gemstone.dm @@ -0,0 +1,127 @@ +var/global/list/_available_gemstone_cuts + +/proc/get_available_gemstone_cuts() + if(!global._available_gemstone_cuts) + global._available_gemstone_cuts = list() + for(var/decl/gemstone_cut/cut as anything in decls_repository.get_decls_of_type_unassociated(/decl/gemstone_cut)) + if(cut.can_be_cut) + global._available_gemstone_cuts += cut + return global._available_gemstone_cuts + +/obj/item/gemstone + name = "uncut gemstone" + desc = "A hunk of uncut gemstone." + icon = 'icons/obj/items/gemstones/uncut.dmi' + w_class = ITEM_SIZE_TINY + material = /decl/material/solid/gemstone/diamond + material_alteration = MAT_FLAG_ALTERATION_COLOR // Name and desc are handled manually. + var/decl/gemstone_cut/cut = /decl/gemstone_cut/uncut + var/work_skill = SKILL_CONSTRUCTION + +/obj/item/gemstone/Initialize(ml, material_key) + cut = GET_DECL(cut) + . = ..() + update_from_cut() + +/obj/item/gemstone/proc/update_from_cut() + icon = cut.icon + desc = cut.desc + update_name() + update_icon() + +/obj/item/gemstone/update_name() + SetName("[cut.adjective] [material.solid_name]") + +/obj/item/gemstone/get_single_monetary_worth() + . = ..() * cut.worth_multiplier + +/obj/item/gemstone/attackby(obj/item/used_item, mob/user) + if(IS_HAMMER(used_item) && !user.check_intent(I_FLAG_HARM)) // TOOL_CHISEL when? + if(!cut.can_attempt_cut) + to_chat(user, SPAN_WARNING("\The [src] has already been cut.")) + return TRUE + var/decl/gemstone_cut/desired_cut = input(user, "What cut would you like to attempt?", "Cut Gemstone") as null|anything in get_available_gemstone_cuts() + if(!desired_cut || QDELETED(src) || QDELETED(user) || !CanPhysicallyInteract(user) || !cut.can_attempt_cut) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] begins carefully cutting \the [src].")) + if(!user.do_skilled(10 SECONDS, work_skill, src, check_holding = TRUE) || !CanPhysicallyInteract(user)) + if(QDELETED(src) || !cut.can_attempt_cut || QDELETED(user)) + return TRUE + to_chat(user, SPAN_DANGER("You were interrupted, botching the cut!")) + cut = GET_DECL(/decl/gemstone_cut/poor) + else + if(QDELETED(src) || !cut.can_attempt_cut || QDELETED(user)) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] finishes cutting \the [src].")) + if(user.skill_fail_prob(work_skill, 100, SKILL_EXPERT)) + to_chat(user, SPAN_DANGER("You've done a really poor job...")) + cut = GET_DECL(/decl/gemstone_cut/poor) + else + cut = desired_cut + update_from_cut() + return TRUE + . = ..() + +// Subtypes for mapping/spawning etc. +/obj/item/gemstone/poor + name = "poorly-cut diamond" + cut = /decl/gemstone_cut/poor + icon = 'icons/obj/items/gemstones/poor.dmi' + +/obj/item/gemstone/baguette + name = "baguette-cut diamond" + cut = /decl/gemstone_cut/baguette + icon = 'icons/obj/items/gemstones/baguette.dmi' + +/obj/item/gemstone/hexagon + name = "hexagon-cut diamond" + cut = /decl/gemstone_cut/hexagon + icon = 'icons/obj/items/gemstones/hexagon.dmi' + +/obj/item/gemstone/octagon + name = "octagon-cut diamond" + cut = /decl/gemstone_cut/octagon + icon = 'icons/obj/items/gemstones/octagon.dmi' + +/obj/item/gemstone/round + name = "round-cut diamond" + cut = /decl/gemstone_cut/round + icon = 'icons/obj/items/gemstones/round.dmi' + + +// Material subtypes. +/obj/item/gemstone/baguette/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/baguette/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/baguette/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/hexagon/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/hexagon/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/hexagon/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/octagon/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/octagon/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/octagon/ruby + material = /decl/material/solid/gemstone/ruby + +/obj/item/gemstone/round/topaz + material = /decl/material/solid/gemstone/topaz + +/obj/item/gemstone/round/sapphire + material = /decl/material/solid/gemstone/sapphire + +/obj/item/gemstone/round/ruby + material = /decl/material/solid/gemstone/ruby diff --git a/code/modules/gemstones/gemstone_cuts.dm b/code/modules/gemstones/gemstone_cuts.dm new file mode 100644 index 00000000000..4b8b15fb7d8 --- /dev/null +++ b/code/modules/gemstones/gemstone_cuts.dm @@ -0,0 +1,76 @@ +/decl/gemstone_cut + abstract_type = /decl/gemstone_cut + var/worth_multiplier = 1.5 + var/name + var/desc + var/adjective + var/icon + // Can we cut this cut into a new cut? + var/can_attempt_cut = FALSE + // Can we attempt to cut to this cut? + var/can_be_cut = TRUE + +/decl/gemstone_cut/validate() + . = ..() + if(!istext(name)) + . += "invalid or null name" + if(!istext(desc)) + . += "invalid or null desc" + if(!istext(adjective)) + . += "invalid or null adjective" + if(icon) + if(!check_state_in_icon(ICON_STATE_WORLD, icon)) + . += "missing world state from '[icon]'" + if(!check_state_in_icon(ICON_STATE_INV, icon)) + . += "missing inventory state from '[icon]'" + var/decl/item_decoration/gem_set = GET_DECL(/decl/item_decoration/setting) + var/check_state = "[ICON_STATE_WORLD]-[gem_set.icon_state_modifier]" + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from '[icon]'" + check_state = "[ICON_STATE_INV]-[gem_set.icon_state_modifier]" + if(!check_state_in_icon(check_state, icon)) + . += "missing state '[check_state]' from '[icon]'" + else + . += "null or unset icon" + +// Subtypes below. +/decl/gemstone_cut/uncut + name = "uncut" + adjective = "uncut" + desc = "A rough, uncut gemstone." + icon = 'icons/obj/items/gemstones/uncut.dmi' + can_attempt_cut = TRUE + can_be_cut = FALSE + worth_multiplier = 1 + +/decl/gemstone_cut/poor + name = "poorly-cut" + adjective = "poorly-cut" + desc = "A poorly-cut and uneven gemstone." + icon = 'icons/obj/items/gemstones/poor.dmi' + worth_multiplier = 0.5 + can_be_cut = FALSE + +/decl/gemstone_cut/baguette + name = "baguette" + adjective = "baguette-cut" + desc = "A square-cut gemstone." + icon = 'icons/obj/items/gemstones/baguette.dmi' + +/decl/gemstone_cut/hexagon + name = "hexagon" + adjective = "hexagon-cut" + desc = "A hexagon-cut gemstone." + icon = 'icons/obj/items/gemstones/hexagon.dmi' + +/decl/gemstone_cut/octagon + name = "octagon" + adjective = "octagon-cut" + desc = "A octagon-cut gemstone." + icon = 'icons/obj/items/gemstones/octagon.dmi' + +/decl/gemstone_cut/round + name = "round" + adjective = "round-cut" + desc = "A round-cut gemstone." + icon = 'icons/obj/items/gemstones/round.dmi' diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index da2c66433b4..1f450a9aadf 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -176,18 +176,6 @@ if(istype(drone)) drone.transfer_personality(candidate.client) -/****************** -* Wizard Familiar * -******************/ -/decl/ghosttrap/wizard_familiar - name = "wizard familiar" - pref_check = "ghost_wizard" - ghost_trap_message = "They are occupying a familiar now." - ban_checks = list(/decl/special_role/wizard) - -/decl/ghosttrap/wizard_familiar/welcome_candidate(var/mob/target) - return 0 - // Stub PAI ghost trap so that PAI shows up in the ghost role list. // Actually invoking this ghost trap as normal will not do anything. /decl/ghosttrap/personal_ai diff --git a/code/modules/grooming/_grooming.dm b/code/modules/grooming/_grooming.dm index c8cae43216e..0618caac491 100644 --- a/code/modules/grooming/_grooming.dm +++ b/code/modules/grooming/_grooming.dm @@ -39,7 +39,7 @@ /obj/item/grooming/proc/try_groom(mob/living/user, mob/living/target) - if(!istype(user) || !istype(target) || user.incapacitated() || user.a_intent == I_HURT) + if(!istype(user) || !istype(target) || user.incapacitated() || user.check_intent(I_FLAG_HARM)) return FALSE if(!length(target.get_external_organs())) diff --git a/code/modules/grooming/grooming_comb.dm b/code/modules/grooming/grooming_comb.dm index 1ea34a3196f..5b57babd5ce 100644 --- a/code/modules/grooming/grooming_comb.dm +++ b/code/modules/grooming/grooming_comb.dm @@ -32,7 +32,7 @@ var/opened = FALSE /obj/item/grooming/comb/butterfly/attack_self(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() opened = !opened if(opened) diff --git a/code/modules/holidays/holiday_hook.dm b/code/modules/holidays/holiday_hook.dm index 6b6870c5bb0..231c1a056fd 100644 --- a/code/modules/holidays/holiday_hook.dm +++ b/code/modules/holidays/holiday_hook.dm @@ -1,8 +1,3 @@ -//Uncommenting ALLOW_HOLIDAYS in configuration will enable this hook. -/hook/startup/proc/updateHoliday() - update_holiday() - return TRUE - /proc/update_holiday() if(!get_config_value(/decl/config/toggle/allow_holidays)) diff --git a/code/modules/holidays/holiday_special.dm b/code/modules/holidays/holiday_special.dm index 36f2c7f2695..375c6a3d9f8 100644 --- a/code/modules/holidays/holiday_special.dm +++ b/code/modules/holidays/holiday_special.dm @@ -1,12 +1,12 @@ -/datum/holiday/christmas/New() - ..() +/datum/holiday/christmas announcement = "Merry Christmas, everyone!" /datum/holiday/christmas/set_up_holiday() - for(var/obj/structure/flora/tree/pine/xmas in world) - if(isNotStationLevel(xmas.z)) + for(var/obj/structure/flora/tree/pine/xmas/crimmas_tree in global.christmas_trees) + if(isNotStationLevel(crimmas_tree.z)) continue - for(var/turf/T in orange(1,xmas)) - if(T.is_floor() && T.simulated) - for(var/i = 1 to rand(1,5)) - new /obj/item/a_gift(T) + for(var/turf/T in orange(1, crimmas_tree)) + if(!T.is_floor() || !T.simulated) + continue + for(var/i = 1 to rand(1,5)) + new /obj/item/a_gift(T) diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 3a497c97ce2..843d0ed4d48 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -144,7 +144,7 @@ update_projections() to_chat(user, "You vastly increase projector power and override the safety and security protocols.") to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call [global.using_map.company_name] maintenance and do not use the simulator.") - log_game("[key_name(usr)] emagged the Holodeck Control Computer") + log_game("[key_name(user)] emagged the Holodeck Control Computer") src.updateUsrDialog() return 1 else diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 2d9b37d4209..e151a9bbbc4 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -157,7 +157,7 @@ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) visible_message("\The [src] was hit by \the [I].") if(I.atom_damage_type == BRUTE || I.atom_damage_type == BURN) - take_damage(I.get_attack_force(user)) + take_damage(I.expend_attack_force(user)) return TRUE src.add_fingerprint(user) diff --git a/code/modules/holomap/holomap.dm b/code/modules/holomap/holomap.dm index 6c298d6b99c..9d5fbc13b44 100644 --- a/code/modules/holomap/holomap.dm +++ b/code/modules/holomap/holomap.dm @@ -62,7 +62,7 @@ update_icon() /obj/machinery/holomap/attack_hand(var/mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() if(watching_mob && (watching_mob != user)) to_chat(user, SPAN_WARNING("Someone else is currently watching the holomap.")) diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index fdcb8b8adbe..e2c2d1bc219 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -233,14 +233,14 @@ icon = 'icons/obj/beekeeping.dmi' icon_state = "honeyframe" w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak 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/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/honey_frame/filled/Initialize() . = ..() @@ -251,7 +251,7 @@ desc = "Contains everything you need to build a beehive." icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "apiary" - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/beehive_assembly/attack_self(var/mob/user) to_chat(user, "You start assembling \the [src]...") diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index dd271cc640e..3e145679b34 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -203,7 +203,7 @@ seed.thrown_at(src,hit_atom) var/global/list/_wood_materials = list( - /decl/material/solid/organic/wood, + /decl/material/solid/organic/wood/oak, /decl/material/solid/organic/wood/mahogany, /decl/material/solid/organic/wood/maple, /decl/material/solid/organic/wood/ebony, @@ -222,7 +222,7 @@ var/global/list/_wood_materials = list( /obj/item/food/grown/attackby(var/obj/item/W, var/mob/user) - if(!seed || user.a_intent == I_HURT) + if(!seed || user.check_intent(I_FLAG_HARM)) return ..() if(seed.get_trait(TRAIT_PRODUCES_POWER) && IS_COIL(W)) @@ -308,7 +308,7 @@ var/global/list/_wood_materials = list( /obj/item/food/grown/attack_self(mob/user) if(seed) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) user.visible_message(SPAN_DANGER("\The [user] squashes \the [src]!")) seed.thrown_at(src,user) sleep(-1) diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index 34650444cd0..e98328e4b39 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -4,7 +4,7 @@ display_name = "cotton patch" product_material = /decl/material/solid/organic/plantmatter/pith/husk chems = list( - /decl/material/liquid/nutriment/plant_oil = list(3,10), + /decl/material/liquid/oil/plant = list(3,10), /decl/material/solid/organic/cloth = list(10,1) ) slice_product = null @@ -28,7 +28,7 @@ display_name = "flax patch" // Do we want linseed oil at some point? chems = list( - /decl/material/liquid/nutriment/plant_oil = list(5,12), + /decl/material/liquid/oil/plant = list(5,12), /decl/material/solid/organic/cloth/linen = list(8,1) ) @@ -288,7 +288,7 @@ mutants = null chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/ethanol/bluecuracao = list(10,5) + /decl/material/liquid/alcohol/bluecuracao = list(10,5) ) /datum/seed/tomato/blue/teleport/New() @@ -400,7 +400,7 @@ display_name = "hemp patch" mutants = null chems = list( - /decl/material/liquid/nutriment/plant_oil = list(3,10), + /decl/material/liquid/oil/plant = list(3,10), /decl/material/solid/organic/cloth/hemp = list(8,1), /decl/material/liquid/nutriment = list(1) ) @@ -584,7 +584,7 @@ name = "towercap" product_name = "dwarf towercap" display_name = "dwarf towercap thicket" - chems = list(/decl/material/solid/organic/wood = list(10,1)) + chems = list(/decl/material/solid/organic/wood/fungal = list(10,1)) mutants = null product_type = /obj/item/stack/material/log/towercap @@ -725,7 +725,7 @@ product_name = "sunflower" display_name = "sunflower patch" chems = list( - /decl/material/liquid/nutriment/plant_oil = list(10,10) + /decl/material/liquid/oil/plant = list(10,10) ) /datum/seed/flower/sunflower/New() @@ -800,7 +800,7 @@ display_name = "peanut vine" chems = list( /decl/material/liquid/nutriment = list(1,10), - /decl/material/liquid/nutriment/plant_oil = list(1,10) + /decl/material/liquid/oil/plant = list(1,10) ) slice_product = /obj/item/food/processed_grown/chopped slice_amount = 3 @@ -890,7 +890,7 @@ name = "corn" product_name = "corn" display_name = "ears of corn" - chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/nutriment/cornoil = list(1,10)) + chems = list(/decl/material/liquid/nutriment = list(1,10), /decl/material/liquid/oil/plant/corn = list(1,10)) grown_tag = "corn" trash_type = /obj/item/corncob backyard_grilling_product = /obj/item/food/popcorn @@ -987,7 +987,7 @@ display_name = "soybean patch" chems = list( /decl/material/liquid/nutriment = list(1,20), - /decl/material/liquid/nutriment/plant_oil = list(3,20), + /decl/material/liquid/oil/plant = list(3,20), /decl/material/liquid/drink/milk/soymilk = list(7,20) ) grown_tag = "soybeans" diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 873ec702462..1065eb1d8a2 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -131,23 +131,23 @@ return var/damage = 0 - var/has_edge = 0 + var/edged = 0 if(get_trait(TRAIT_CARNIVOROUS) >= 2) if(affecting) to_chat(target, "\The [fruit]'s thorns pierce your [affecting.name] greedily!") else to_chat(target, "\The [fruit]'s thorns pierce your flesh greedily!") damage = max(5, round(15*get_trait(TRAIT_POTENCY)/100, 1)) - has_edge = prob(get_trait(TRAIT_POTENCY)/2) + edged = prob(get_trait(TRAIT_POTENCY)/2) else if(affecting) to_chat(target, "\The [fruit]'s thorns dig deeply into your [affecting.name]!") else to_chat(target, "\The [fruit]'s thorns dig deeply into your flesh!") damage = max(1, round(5*get_trait(TRAIT_POTENCY)/100, 1)) - has_edge = prob(get_trait(TRAIT_POTENCY)/5) + edged = prob(get_trait(TRAIT_POTENCY)/5) - var/damage_flags = DAM_SHARP|(has_edge? DAM_EDGE : 0) + var/damage_flags = DAM_SHARP|(edged? DAM_EDGE : 0) target.apply_damage(damage, BRUTE, target_limb, damage_flags, used_weapon = "Thorns") // Adds reagents to a target. @@ -256,16 +256,15 @@ var/growth_rate = 1 var/turf/current_turf = isturf(holder) ? holder : get_turf(holder) - if(istype(holder) && !holder.mechanical && current_turf) - growth_rate = current_turf.get_plant_growth_rate() + if(istype(holder)) + growth_rate = holder.get_growth_rate() var/health_change = 0 // Handle gas consumption. if(consume_gasses && consume_gasses.len) var/missing_gas = 0 for(var/gas in consume_gasses) - if(environment && environment.gas && environment.gas[gas] && \ - environment.gas[gas] >= consume_gasses[gas]) + if(LAZYACCESS(environment?.gas, gas) >= consume_gasses[gas]) if(!check_only) environment.adjust_gas(gas,-consume_gasses[gas],1) else diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index aca1014088d..21efe8deead 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -26,7 +26,7 @@ /obj/item/seeds/populate_reagents() . = ..() - add_to_reagents(/decl/material/liquid/nutriment/plant_oil, 3) + add_to_reagents(/decl/material/liquid/oil/plant, 3) /obj/item/seeds/get_single_monetary_worth() . = seed ? seed.get_monetary_value() : ..() diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 01887107c99..bee76cb91f7 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -3,14 +3,12 @@ var/amount var/datum/seed/seed_type // Keeps track of what our seed is var/list/obj/item/seeds/seeds = list() // Tracks actual objects contained in the pile - var/ID -/datum/seed_pile/New(var/obj/item/seeds/O, var/ID) +/datum/seed_pile/New(var/obj/item/seeds/O) name = O.name amount = 1 seed_type = O.seed seeds += O - src.ID = ID /datum/seed_pile/proc/matches(var/obj/item/seeds/O) if (O.seed == seed_type) @@ -24,8 +22,8 @@ /obj/machinery/seed_storage name = "Seed storage" desc = "It stores, sorts, and dispenses seeds." - icon = 'icons/obj/vending.dmi' - icon_state = "seeds" + icon = 'icons/obj/machines/vending/seeds_grey.dmi' + icon_state = ICON_STATE_WORLD density = TRUE anchored = TRUE idle_power_usage = 100 @@ -62,7 +60,6 @@ /obj/machinery/seed_storage/garden name = "Garden seed storage" scanner = list("stats") - icon_state = "seeds_generic" starting_seeds = list( /obj/item/seeds/ambrosiavulgarisseed = 15, /obj/item/seeds/appleseed = 15, @@ -195,7 +192,8 @@ if ("soil" in scanner) dat += "NutriWater" dat += "NotesAmount" - for (var/datum/seed_pile/S in piles) + for (var/key in 1 to length(piles)) + var/datum/seed_pile/S = piles[key] var/datum/seed/seed = S.seed_type if(!seed) continue @@ -281,7 +279,7 @@ dat += "LUM " dat += "" dat += "[S.amount]" - dat += "Vend Purge" + dat += "Vend Purge" dat += "" dat += "" @@ -292,29 +290,26 @@ if (..()) return var/task = href_list["task"] - var/ID = text2num(href_list["id"]) + var/id = text2num(href_list["id"]) + var/datum/seed_pile/our_pile = LAZYACCESS(piles, id) - for (var/datum/seed_pile/N in piles) - if (N.ID == ID) - if (task == "vend") - var/obj/O = pick(N.seeds) - if (O) - --N.amount - N.seeds -= O - if (N.amount <= 0 || N.seeds.len <= 0) - piles -= N - qdel(N) - flick("[initial(icon_state)]-vend", src) - O.dropInto(loc) - else - piles -= N - qdel(N) - else if (task == "purge") - for (var/obj/O in N.seeds) - qdel(O) - piles -= N - qdel(N) - break + switch(task) + if ("vend") + var/obj/O = pick(our_pile.seeds) + if (O) + --our_pile.amount + our_pile.seeds -= O + if (our_pile.amount <= 0 || our_pile.seeds.len <= 0) + piles -= our_pile + qdel(our_pile) + flick("[initial(icon_state)]-vend", src) + O.dropInto(loc) + if ("purge") + QDEL_LIST(our_pile.seeds) + our_pile.seeds.Cut() + if(!length(our_pile.seeds)) + piles -= our_pile + QDEL_NULL(our_pile) updateUsrDialog() /obj/machinery/seed_storage/attackby(var/obj/item/O, var/mob/user) @@ -334,7 +329,7 @@ if (loaded) user.visible_message(SPAN_NOTICE("\The [user] puts the seeds from \the [O] into \the [src].")) else - to_chat(user, SPAN_WARNING("There are no seeds in \the [O.name].")) + to_chat(user, SPAN_WARNING("There are no seeds in \the [O].")) return TRUE return ..() @@ -349,28 +344,13 @@ O.loc?.storage?.remove_from_storage(null, O, src) O.forceMove(src) - var/newID = 0 for (var/datum/seed_pile/N in piles) if (N.matches(O)) ++N.amount N.seeds += (O) return - else if(N.ID >= newID) - newID = N.ID + 1 - piles += new /datum/seed_pile(O, newID) + piles += new /datum/seed_pile(O) flick("[initial(icon_state)]-vend", src) return - -/obj/machinery/seed_storage/cannot_transition_to(state_path, mob/user) - if(state_path == /decl/machine_construction/default/deconstructed) - var/alert = alert(user, "Are you certain you wish to deconstruct this? It will destroy all seeds stored inside!", "Deconstruct Warning", "Yes", "No") - if(alert != "Yes" || !CanPhysicallyInteract(user)) - return MCS_BLOCK - return ..() - -/obj/machinery/seed_storage/dismantle() - for(var/obj/item/seeds/seed in src) - qdel(seed) // ..() would dump them; this would cause lots of client lag. We did warn them above... - return ..() \ No newline at end of file diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 25734ea911c..0980347c73d 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -200,7 +200,7 @@ /obj/effect/vine/attackby(var/obj/item/W, var/mob/user) START_PROCESSING(SSvines, src) - if(W.edge && W.w_class < ITEM_SIZE_NORMAL && user.a_intent != I_HURT) + if(W.has_edge() && W.w_class < ITEM_SIZE_NORMAL && !user.check_intent(I_FLAG_HARM)) if(!is_mature()) to_chat(user, SPAN_WARNING("\The [src] is not mature enough to yield a sample yet.")) return TRUE @@ -216,8 +216,8 @@ return TRUE else . = ..() - var/damage = W.get_attack_force(user) - if(W.edge) + var/damage = W.expend_attack_force(user) + if(W.has_edge()) damage *= 2 adjust_health(-damage) playsound(get_turf(src), W.hitsound, 100, 1) @@ -275,16 +275,17 @@ /decl/interaction_handler/vine_chop name = "Chop Down" expected_target_type = /obj/effect/vine + examine_desc = "chop $TARGET_THEM$ down" /decl/interaction_handler/vine_chop/invoked(atom/target, mob/user, obj/item/prop) var/obj/effect/vine/vine = target var/obj/item/holding = user.get_active_held_item() - if(!istype(holding) || !holding.edge || holding.w_class < ITEM_SIZE_NORMAL) + if(!istype(holding) || !holding.has_edge() || holding.w_class < ITEM_SIZE_NORMAL) to_chat(user, SPAN_WARNING("You need a larger or sharper object for this task!")) return user.visible_message(SPAN_NOTICE("\The [user] starts chopping down \the [vine].")) playsound(get_turf(vine), holding.hitsound, 100, 1) - var/chop_time = (vine.current_health/holding.get_attack_force(user)) * 0.5 SECONDS + var/chop_time = (vine.current_health/holding.expend_attack_force(user)) * 0.5 SECONDS if(user.skill_check(SKILL_BOTANY, SKILL_ADEPT)) chop_time *= 0.5 if(do_after(user, chop_time, vine, TRUE)) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 321b940dd9e..89f86eacdb6 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -36,8 +36,6 @@ // Mechanical concerns. var/plant_health = 0 // Plant health. var/lastproduce = 0 // Last time tray was harvested - var/lastcycle = 0 // Cycle timing/tracking var. - var/cycledelay = 150 // Delay per cycle. var/closed_system // If set, the tray will attempt to take atmos from a pipe. var/force_update // Set this to bypass the cycle time check. var/obj/temp_chem_holder // Something to hold reagents during process_reagents() @@ -59,7 +57,7 @@ ) var/static/list/nutrient_reagents = list( /decl/material/liquid/drink/milk = 0.1, - /decl/material/liquid/ethanol/beer = 0.25, + /decl/material/liquid/alcohol/beer = 0.25, /decl/material/solid/phosphorus = 0.1, /decl/material/liquid/nutriment/sugar = 0.1, /decl/material/liquid/drink/sodawater = 0.1, @@ -89,7 +87,7 @@ /decl/material/liquid/water = 1, /decl/material/liquid/adminordrazine = 1, /decl/material/liquid/drink/milk = 0.9, - /decl/material/liquid/ethanol/beer = 0.7, + /decl/material/liquid/alcohol/beer = 0.7, /decl/material/liquid/fuel/hydrazine = -2, /decl/material/solid/phosphorus = -0.5, /decl/material/liquid/water = 1, @@ -98,7 +96,7 @@ // Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order). var/static/list/beneficial_reagents = list( - /decl/material/liquid/ethanol/beer = list( -0.05, 0, 0 ), + /decl/material/liquid/alcohol/beer = list( -0.05, 0, 0 ), /decl/material/liquid/fuel/hydrazine = list( -2, 0, 0 ), /decl/material/solid/phosphorus = list( -0.75, 0, 0 ), /decl/material/liquid/drink/sodawater = list( 0.1, 0, 0 ), @@ -137,6 +135,7 @@ age = 0 sampled = 0 harvest = 0 + plant_health = seed ? seed.get_trait(TRAIT_ENDURANCE) : 0 if(reset_values) yield_mod = 0 @@ -327,8 +326,6 @@ return //Weed does not exist, someone fucked up. age = 0 - plant_health = seed.get_trait(TRAIT_ENDURANCE) - lastcycle = world.time harvest = 0 weedlevel = 0 pestlevel = 0 @@ -396,48 +393,25 @@ var/previous_plant = seed.display_name set_seed(SSplants.seeds[newseed]) mutate(1) - plant_health = seed.get_trait(TRAIT_ENDURANCE) - lastcycle = world.time + plant_health = seed.get_trait(TRAIT_ENDURANCE) // re-run in case mutation changed our endurance update_icon() visible_message("The [previous_plant] has suddenly mutated into [seed.display_name]!") return -/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/O, var/mob/user) +/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/used_item, var/mob/user) - if(istype(O, /obj/item/food/grown)) - var/obj/item/food/grown/bulb = O + if(istype(used_item, /obj/item/food/grown)) + var/obj/item/food/grown/bulb = used_item if(bulb.seed?.grown_is_seed) plant_seed(user, bulb) return TRUE - if (ATOM_IS_OPEN_CONTAINER(O)) - return FALSE - - if(istype(O, /obj/item/chems/syringe)) - var/obj/item/chems/syringe/S = O - if (S.mode == 1) - if(seed) - return ..() - else - to_chat(user, SPAN_WARNING("There's no plant to inject.")) - else - if(seed) - //Leaving this in in case we want to extract from plants later. - to_chat(user, SPAN_WARNING("You can't get any extract out of this plant.")) - else - to_chat(user, SPAN_WARNING("There's nothing to draw something from.")) - return TRUE - - if(istype(O, /obj/item/seeds)) - plant_seed(user, O) - return TRUE - - if(IS_HOE(O)) + if(IS_HOE(used_item)) if(weedlevel > 0) - if(!O.do_tool_interaction(TOOL_HOE, user, src, 2 SECONDS, start_message = "uprooting the weeds in", success_message = "weeding") || weedlevel <= 0 || QDELETED(src)) + if(!used_item.do_tool_interaction(TOOL_HOE, user, src, 2 SECONDS, start_message = "uprooting the weeds in", success_message = "weeding") || weedlevel <= 0 || QDELETED(src)) return TRUE weedlevel = 0 update_icon() @@ -450,37 +424,66 @@ to_chat(user, SPAN_WARNING("This plot is completely devoid of weeds. It doesn't need uprooting.")) return TRUE - if(IS_SHOVEL(O)) + if(IS_SHOVEL(used_item)) if(seed) var/removing_seed = seed - if(O.do_tool_interaction(TOOL_SHOVEL, user, src, 3 SECONDS, start_message = "removing \the [seed.display_name] from", success_message = "removing \the [seed.display_name] from") && seed == removing_seed) + if(used_item.do_tool_interaction(TOOL_SHOVEL, user, src, 3 SECONDS, start_message = "removing \the [seed.display_name] from", success_message = "removing \the [seed.display_name] from") && seed == removing_seed) set_seed(null) else to_chat(user, SPAN_WARNING("There is no plant in \the [src] to remove.")) return TRUE - if (istype(O, /obj/item/plants)) + if(!user.check_intent(I_FLAG_HARM)) + var/decl/interaction_handler/sample_interaction = GET_DECL(/decl/interaction_handler/hydroponics/sample) + if(sample_interaction.is_possible(src, user, used_item)) + sample_interaction.invoked(src, user, used_item) + return TRUE + + // Handled in afterattack/ + if (ATOM_IS_OPEN_CONTAINER(used_item)) + return FALSE + + if(istype(used_item, /obj/item/chems/syringe)) + var/obj/item/chems/syringe/S = used_item + if (S.mode == 1) + if(seed) + return ..() + else + to_chat(user, SPAN_WARNING("There's no plant to inject.")) + else + if(seed) + //Leaving this in in case we want to extract from plants later. + to_chat(user, SPAN_WARNING("You can't get any extract out of this plant.")) + else + to_chat(user, SPAN_WARNING("There's nothing to draw something from.")) + return TRUE + + if(istype(used_item, /obj/item/seeds)) + plant_seed(user, used_item) + return TRUE + + if (istype(used_item, /obj/item/plants)) physical_attack_hand(user) // Harvests and clears out dead plants. - if(O.storage) + if(used_item.storage) for (var/obj/item/food/grown/G in get_turf(user)) - if(O.storage.can_be_inserted(G, user)) - O.storage.handle_item_insertion(user, G, TRUE) + if(used_item.storage.can_be_inserted(G, user)) + used_item.storage.handle_item_insertion(user, G, TRUE) return TRUE - if ( istype(O, /obj/item/plantspray) ) + if ( istype(used_item, /obj/item/plantspray) ) - var/obj/item/plantspray/spray = O + var/obj/item/plantspray/spray = used_item toxins += spray.toxicity pestlevel -= spray.pest_kill_str weedlevel -= spray.weed_kill_str update_icon() - to_chat(user, "You spray [src] with [O].") + to_chat(user, "You spray [src] with [used_item].") playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) - qdel(O) + qdel(used_item) check_plant_health() return TRUE - if(mechanical && IS_WRENCH(O)) + if(mechanical && IS_WRENCH(used_item)) //If there's a connector here, the portable_atmospherics setup can handle it. if(locate(/obj/machinery/atmospherics/portables_connector/) in loc) @@ -491,18 +494,19 @@ to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") return TRUE - var/force = O.get_attack_force(user) - if(force && seed) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.visible_message("\The [seed.display_name] has been attacked by [user] with \the [O]!") - playsound(get_turf(src), O.hitsound, 100, 1) - if(!dead) - plant_health -= force - check_plant_health() - return TRUE + if(seed) + var/force = used_item.expend_attack_force(user) + if(force) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.visible_message("\The [seed.display_name] has been attacked by [user] with \the [used_item]!") + playsound(get_turf(src), used_item.hitsound, 100, 1) + if(!dead) + plant_health -= force + check_plant_health() + return TRUE if(mechanical) - return component_attackby(O, user) + return component_attackby(used_item, user) return ..() @@ -547,8 +551,8 @@ age = 1 //Snowflakey, maybe move this to the seed datum + // re-running to adjust based on planting method plant_health = (istype(S, /obj/item/seeds/extracted/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) - lastcycle = world.time var/needed_skill = seed.mysterious ? SKILL_ADEPT : SKILL_BASIC if(prob(user.skill_fail_chance(SKILL_BOTANY, 40, needed_skill))) @@ -644,8 +648,8 @@ if(S.seed) set_seed(S.seed) age = 1 + // re-running to adjust for planting method plant_health = (istype(S, /obj/item/seeds/extracted/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE)) - lastcycle = world.time check_plant_health() qdel(S) @@ -667,6 +671,7 @@ /decl/interaction_handler/hydroponics/close_lid name = "Open/Close Lid" + examine_desc = "open or close the lid" /decl/interaction_handler/hydroponics/close_lid/is_possible(atom/target, mob/user, obj/item/prop) var/obj/machinery/portable_atmospherics/hydroponics/tray = target @@ -678,9 +683,10 @@ /decl/interaction_handler/hydroponics/sample name = "Sample Plant" + examine_desc = "take a sample" /decl/interaction_handler/hydroponics/sample/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && istype(prop) && prop.edge && prop.w_class < ITEM_SIZE_NORMAL + return ..() && istype(prop) && prop.has_edge() && prop.w_class < ITEM_SIZE_NORMAL /decl/interaction_handler/hydroponics/sample/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/portable_atmospherics/hydroponics/tray = target diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm index 05c029e69b4..dbcf6f19447 100644 --- a/code/modules/hydroponics/trays/tray_process.dm +++ b/code/modules/hydroponics/trays/tray_process.dm @@ -1,37 +1,29 @@ -/obj/machinery/portable_atmospherics/hydroponics/Process() - - var/growth_rate = 1 - var/turf/T = get_turf(src) - if(istype(T)) - if(!mechanical) - growth_rate = T.get_plant_growth_rate() - - if(!closed_system) - var/space_left = reagents ? (reagents.maximum_volume - reagents.total_volume) : 0 - if(space_left > 0 && reagents.total_volume < 10) - // Handle nearby smoke if any. - for(var/obj/effect/effect/smoke/chem/smoke in view(1, src)) - if(smoke.reagents.total_volume) - smoke.reagents.trans_to_obj(src, 5, copy = 1) - // Handle environmental effects like weather and flooding. - if(T.reagents?.total_volume) - T.reagents.trans_to_obj(src, min(space_left, min(T.reagents.total_volume, rand(5,10)))) - if(istype(T.weather?.weather_system?.current_state, /decl/state/weather/rain)) - var/decl/state/weather/rain/rain = T.weather.weather_system.current_state - if(rain.is_liquid) - reagents.add_reagent(T.weather.water_material, min(space_left, rand(3,5))) +/obj/machinery/portable_atmospherics/hydroponics/proc/get_growth_rate() + return 1 + +/obj/machinery/portable_atmospherics/hydroponics/process_plants() + + var/growth_rate = get_growth_rate() + var/turf/my_turf = get_turf(src) + if(istype(my_turf) && !closed_system) + var/space_left = reagents ? (reagents.maximum_volume - reagents.total_volume) : 0 + if(space_left > 0 && reagents.total_volume < 10) + // Handle nearby smoke if any. + for(var/obj/effect/effect/smoke/chem/smoke in view(1, src)) + if(smoke.reagents.total_volume) + smoke.reagents.trans_to_obj(src, 5, copy = 1) + // Handle environmental effects like weather and flooding. + if(my_turf.reagents?.total_volume) + my_turf.reagents.trans_to_obj(src, min(space_left, min(my_turf.reagents.total_volume, rand(5,10)))) + if(istype(my_turf.weather?.weather_system?.current_state, /decl/state/weather/rain)) + var/decl/state/weather/rain/rain = my_turf.weather.weather_system.current_state + if(rain.is_liquid) + reagents.add_reagent(my_turf.weather.water_material, min(space_left, rand(3,5))) //Do this even if we're not ready for a plant cycle. process_reagents() var/needs_icon_update = 0 - // Update values every cycle rather than every process() tick. - if(force_update) - force_update = 0 - else if(world.time < (lastcycle + cycledelay)) - return - lastcycle = world.time - // Mutation level drops each main tick. mutation_level -= rand(2,4) @@ -94,7 +86,7 @@ if(closed_system && (get_port() || holding)) environment = air_contents // If atmos input is not there, grab from turf. - if(!environment && istype(T)) environment = T.return_air() + if(!environment && istype(my_turf)) environment = my_turf.return_air() if(!environment) return // Seed datum handles gasses, light and pressure. @@ -148,9 +140,9 @@ if(!closed_system && \ seed.get_trait(TRAIT_SPREAD) == 2 && \ 2 * age >= seed.get_trait(TRAIT_MATURATION) && \ - !(locate(/obj/effect/vine) in T) && \ + !(locate(/obj/effect/vine) in my_turf) && \ prob(2 * seed.get_trait(TRAIT_POTENCY))) - new /obj/effect/vine(T, seed) + new /obj/effect/vine(my_turf, seed) if(prob(3)) // On each tick, there's a chance the pest population will increase pestlevel += 0.1 * growth_rate diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index ca88be8d82a..279cc704d58 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -10,12 +10,23 @@ matter = null pixel_z = 8 color = "#7c5e42" + + // Not actually a machine, per se. + frame_type = null + uncreated_component_parts = list() + maximum_component_parts = list() + construct_state = /decl/machine_construction/noninteractive + var/obj/item/stack/material/brick/reinforced_with /obj/machinery/portable_atmospherics/hydroponics/soil/get_alt_interactions(var/mob/user) . = ..() - . -= /decl/interaction_handler/drink - . -= /decl/interaction_handler/wash_hands + LAZYREMOVE(., global._reagent_interactions) + LAZYADD(., /decl/interaction_handler/empty_into) + +/obj/machinery/portable_atmospherics/hydroponics/soil/get_growth_rate() + var/turf/my_turf = get_turf(src) + return max(0, my_turf?.get_plant_growth_rate()) /obj/machinery/portable_atmospherics/hydroponics/soil/Initialize() @@ -32,11 +43,10 @@ pixel_y = rand(-1,1) update_icon() -/obj/machinery/portable_atmospherics/hydroponics/soil/physically_destroyed() - if(reinforced_with) - reinforced_with.dropInto(loc) - reinforced_with = null - return ..() +/obj/machinery/portable_atmospherics/hydroponics/soil/dismantle() + dump_contents() + qdel(src) + return null /obj/machinery/portable_atmospherics/hydroponics/soil/Destroy() var/oldloc = loc @@ -57,7 +67,7 @@ return if(prob(25)) return - to_chat(walker, SPAN_DANGER("You trample \the [seed]!")) + to_chat(walker, SPAN_DANGER("You trample \the [seed.display_name]!")) plant_health = max(0, plant_health - rand(3,5)) check_plant_health() @@ -101,7 +111,7 @@ neighbor.update_icon() return TRUE - if(!seed && user.a_intent == I_HURT && (IS_SHOVEL(O) || IS_HOE(O))) + if(!seed && user.check_intent(I_FLAG_HARM) && (IS_SHOVEL(O) || IS_HOE(O))) var/use_tool = O.get_tool_quality(TOOL_SHOVEL) > O.get_tool_quality(TOOL_HOE) ? TOOL_SHOVEL : TOOL_HOE if(use_tool) if(O.do_tool_interaction(use_tool, user, src, 3 SECONDS, "filling in", "filling in", check_skill = SKILL_BOTANY)) @@ -156,7 +166,6 @@ dead = 0 age = start_mature ? seed.get_trait(TRAIT_MATURATION) : 1 plant_health = seed.get_trait(TRAIT_ENDURANCE) - lastcycle = world.time if(isnull(default_pixel_y)) default_pixel_y = rand(-12,12) if(isnull(default_pixel_y)) @@ -193,4 +202,7 @@ for(var/obj/effect/vine/plant in get_turf(src)) if(plant.invisibility == INVISIBILITY_MAXIMUM) plant.set_invisibility(initial(plant.invisibility)) - . = ..() \ No newline at end of file + . = ..() + +/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/get_growth_rate() + return max(..(), 1) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 0b01b0e7525..7d4a7ce5774 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -414,7 +414,7 @@ return TRUE else for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) + S.attackby_react(I, user, user.get_intent()) return ..() else if(IS_MULTITOOL(I) || istype(I, /obj/item/integrated_electronics/wirer) || istype(I, /obj/item/integrated_electronics/debugger)) if(opened) @@ -423,18 +423,18 @@ else to_chat(user, "[src]'s hatch is closed, so you can't fiddle with the internal components.") for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) + S.attackby_react(I, user, user.get_intent()) return ..() else if(istype(I, /obj/item/cell)) if(!opened) to_chat(user, "[src]'s hatch is closed, so you can't access \the [src]'s power supplier.") for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) + S.attackby_react(I, user, user.get_intent()) return ..() if(battery) to_chat(user, "[src] already has \a [battery] installed. Remove it first if you want to replace it.") for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) + S.attackby_react(I, user, user.get_intent()) return ..() var/obj/item/cell/cell = I if(user.try_unequip(I,loc)) @@ -474,9 +474,9 @@ current_health = min(get_max_health(), current_health + 5) return TRUE - else if(user.a_intent != I_HURT) + else if(!user.check_intent(I_FLAG_HARM)) for(var/obj/item/integrated_circuit/input/S in assembly_components) - S.attackby_react(I,user,user.a_intent) + S.attackby_react(I, user, user.get_intent()) return TRUE return ..() //Handle weapon attacks and etc diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index f60872d9179..b37f0c5fe0a 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -53,7 +53,7 @@ a creative player the means to solve many problems. Circuits are held inside an /obj/item/integrated_circuit/proc/any_examine(mob/user) return -/obj/item/integrated_circuit/proc/attackby_react(var/atom/movable/A,mob/user) +/obj/item/integrated_circuit/proc/attackby_react(var/atom/movable/A, mob/user, decl/intent/intent) return /obj/item/integrated_circuit/proc/sense(var/atom/movable/A,mob/user,prox) diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index b63528d1eec..ab3c9759592 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -98,14 +98,14 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH var/volume = 60 var/list/fuel = list( - /decl/material/solid/phoron = 50000, - /decl/material/gas/hydrogen = 50000, + /decl/material/solid/phoron = 50000, + /decl/material/gas/hydrogen = 50000, /decl/material/gas/hydrogen/deuterium = 50000, - /decl/material/gas/hydrogen/tritium = 50000, - /decl/material/liquid/fuel = 15000, - /decl/material/solid/carbon = 10000, - /decl/material/liquid/ethanol = 10000, - /decl/material/liquid/nutriment = 8000 + /decl/material/gas/hydrogen/tritium = 50000, + /decl/material/liquid/fuel = 15000, + /decl/material/solid/carbon = 10000, + /decl/material/liquid/alcohol/ethanol = 10000, + /decl/material/liquid/nutriment = 8000 ) var/multi = 1 diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm index d96f8ba47f3..ef601575bd9 100644 --- a/code/modules/integrated_electronics/subtypes/access.dm +++ b/code/modules/integrated_electronics/subtypes/access.dm @@ -18,7 +18,7 @@ name = "card reader" spawn_flags = 0 -/obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/user, intent) +/obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/user, decl/intent/intent) var/obj/item/card/id/card = I.GetIdCard() var/list/access = I.GetAccess() var/json_access = json_encode(access) @@ -65,7 +65,7 @@ // check if the signature is valid if(!check_data_signature(signature, result)) return FALSE - + if(length(result) > 1) result = cached_json_decode(result) else diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index d644eab71ef..d568d687893 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -914,8 +914,8 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH power_draw_per_use = 20 -/obj/item/integrated_circuit/input/obj_scanner/attackby_react(var/atom/A,var/mob/user,intent) - if(intent!=I_HELP) +/obj/item/integrated_circuit/input/obj_scanner/attackby_react(var/atom/A,var/mob/user, decl/intent/intent) + if(istype(intent) && !(intent.intent_flags & I_FLAG_HELP)) return FALSE if(!check_then_do_work()) return FALSE @@ -1139,7 +1139,7 @@ "on read" = IC_PINTYPE_PULSE_OUT ) -/obj/item/integrated_circuit/input/data_card_reader/attackby_react(obj/item/I, mob/user, intent) +/obj/item/integrated_circuit/input/data_card_reader/attackby_react(obj/item/I, mob/user, decl/intent/intent) var/obj/item/card/data/card = I var/write_mode = get_pin_data(IC_INPUT, 3) if(istype(card)) diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index c4c127693b4..b105438a037 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -63,7 +63,7 @@ /obj/item/integrated_circuit/memory/huge name = "large memory stick" - desc = "This stick of memory can store up up to sixteen pieces of data." + desc = "This stick of memory can store up to sixteen pieces of data." icon_state = "memory16" w_class = ITEM_SIZE_SMALL spawn_flags = IC_SPAWN_RESEARCH diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 9d674ef0bb7..5255d8469c8 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -516,7 +516,7 @@ /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) +/obj/item/integrated_circuit/input/funnel/attackby_react(obj/item/I, mob/user, decl/intent/intent) var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) var/obj/item/chems/container = I diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm index 25f9dca52a4..f92af368dcd 100644 --- a/code/modules/integrated_electronics/subtypes/smart.dm +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -96,6 +96,10 @@ return ..() /obj/item/integrated_circuit/smart/advanced_pathfinder/do_work() + + if(waiting_for_path) + return + if(!assembly) activate_pin(3) return @@ -119,20 +123,30 @@ 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), 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))) + SSpathfinding.enqueue_mover( + src, + locate(get_pin_data(IC_INPUT, 1), get_pin_data(IC_INPUT, 2), a_loc.z), + new /datum/pathfinding_metadata( + _max_node_depth = 200, + _id = idc, + _obstacle = get_turf(get_pin_data_as_type(IC_INPUT, 3, /atom)) + ) + ) - if(!P) - activate_pin(3) - return - else - var/list/Xn = new/list(P.len) - var/list/Yn = new/list(P.len) - var/turf/T - for(var/i =1 to P.len) - T=P[i] - Xn[i] = T.x - Yn[i] = T.y - set_pin_data(IC_OUTPUT, 1, Xn) - set_pin_data(IC_OUTPUT, 2, Yn) - push_data() - activate_pin(2) +/obj/item/integrated_circuit/smart/advanced_pathfinder/path_not_found() + ..() + activate_pin(3) + +/obj/item/integrated_circuit/smart/advanced_pathfinder/path_found(list/path) + ..() + var/list/Xn = new/list(path.len) + var/list/Yn = new/list(path.len) + var/turf/T + for(var/i = 1 to path.len) + T=path[i] + Xn[i] = T.x + Yn[i] = T.y + set_pin_data(IC_OUTPUT, 1, Xn) + set_pin_data(IC_OUTPUT, 2, Yn) + push_data() + activate_pin(2) diff --git a/code/modules/interactions/_interactions.dm b/code/modules/interactions/_interactions.dm index ebdd06610dd..3d515a3000d 100644 --- a/code/modules/interactions/_interactions.dm +++ b/code/modules/interactions/_interactions.dm @@ -1,12 +1,17 @@ /decl/interaction_handler abstract_type = /decl/interaction_handler var/name + /// A string displayed when examining an atom that provides this handler as an alt interaction. + var/examine_desc + /// If set to TRUE, alt interactions will skip is_possible() before displaying in examine(). + var/always_show_on_examine = FALSE var/icon var/icon_state var/expected_target_type = /atom var/expected_user_type = /mob/living var/interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION var/incapacitation_flags + var/apply_click_cooldown = DEFAULT_ATTACK_COOLDOWN /decl/interaction_handler/proc/is_possible(var/atom/target, var/mob/user, var/obj/item/prop) diff --git a/code/modules/interactions/interactions_atom.dm b/code/modules/interactions/interactions_atom.dm index e8073b75f4a..980172b26b2 100644 --- a/code/modules/interactions/interactions_atom.dm +++ b/code/modules/interactions/interactions_atom.dm @@ -1,4 +1,4 @@ -/atom/proc/try_handle_interactions(var/mob/user, var/list/interactions, var/obj/item/prop) +/atom/proc/try_handle_interactions(var/mob/user, var/list/interactions, var/obj/item/prop, var/check_alt_interactions) if(!length(interactions)) return FALSE @@ -18,9 +18,17 @@ if(length(possibilities) > 1 || (choice.interaction_flags & INTERACTION_NEVER_AUTOMATIC)) choice = null choice = show_radial_menu(user, src, possibilities, use_labels = RADIAL_LABELS_CENTERED) - if(!istype(choice) || QDELETED(user) || !(choice.type in get_alt_interactions(user)) || !choice.is_possible(src, user, prop)) + if(!istype(choice) || QDELETED(user) || QDELETED(src)) + return TRUE + // This is not ideal but I don't want to pass a callback through here as a param and call it. :( + var/list/new_interactions = check_alt_interactions ? get_alt_interactions(user) : get_standard_interactions(user) + if(!(choice.type in new_interactions)) + return TRUE + if(!choice.is_possible(src, user, user.get_active_held_item())) return TRUE user.face_atom(src) choice.invoked(src, user, prop) + if(choice.apply_click_cooldown) + user.setClickCooldown(choice.apply_click_cooldown) return TRUE diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm new file mode 100644 index 00000000000..7a50cfaacf5 --- /dev/null +++ b/code/modules/interactions/interactions_reagents.dm @@ -0,0 +1,149 @@ +/decl/interaction_handler/dip_item + name = "Dip Into" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "dip an item into $TARGET_THEM$" + +/decl/interaction_handler/dip_item/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && target != prop && target.reagents?.total_volume >= FLUID_MINIMUM_TRANSFER && istype(prop) && target.can_be_poured_from(user, prop) + +/decl/interaction_handler/dip_item/invoked(atom/target, mob/user, obj/item/prop) + user.visible_message(SPAN_NOTICE("\The [user] dips \the [prop] into \the [target.reagents.get_primary_reagent_name()].")) + if(istype(prop, /obj/item/food) && isobj(target)) + var/obj/target_obj = target + var/transferring = min(target_obj.get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(prop.reagents)) + if(transferring) + target.reagents.trans_to_holder(prop.reagents, transferring) + if(target.reagents?.total_volume >= FLUID_MINIMUM_TRANSFER) + prop.fluid_act(target.reagents) + return TRUE + +/decl/interaction_handler/fill_from + name = "Fill From" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "fill a held item from $TARGET_THEM$" + +/decl/interaction_handler/fill_from/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + if(target == prop || target.reagents?.total_volume < FLUID_PUDDLE) + return FALSE + if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure/reagent_dispensers))) + return FALSE + return target.can_be_poured_from(user, prop) && prop.can_be_poured_into(user, target) + +/decl/interaction_handler/fill_from/invoked(atom/target, mob/user, obj/item/prop) + if(isitem(target)) + var/obj/item/vessel = target + return vessel.standard_pour_into(user, prop) + if(istype(target, /obj/structure/reagent_dispensers)) + // Reagent dispensers have some wonky assumptions due to old UX around filling/emptying so we skip the atom flags check. + return prop.standard_dispenser_refill(user, target, skip_container_check = TRUE) + return FALSE + +/decl/interaction_handler/empty_into + name = "Pour Into" + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "pour a held item into $TARGET_THEM$" + +/decl/interaction_handler/empty_into/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + if(target == prop || !istype(prop) || prop.reagents?.total_volume <= 0) + return FALSE + return target.can_be_poured_into(user, prop) && prop.can_be_poured_from(user, target) + +/decl/interaction_handler/empty_into/invoked(atom/target, mob/user, obj/item/prop) + prop.standard_pour_into(user, target) + return TRUE + +/decl/interaction_handler/wash_hands + name = "Wash Hands" + expected_target_type = /atom + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "wash your hands in $TARGET_THEM$" + +/decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() && !istype(prop) && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) + if(.) + for(var/hand_slot in user.get_held_item_slots()) + var/obj/item/organ/external/organ = user.get_organ(hand_slot) + if(istype(organ) && organ.is_washable) + return TRUE + +/decl/interaction_handler/wash_hands/invoked(atom/target, mob/user, obj/item/prop) + + // Probably needs debounce and do_after() but showers and wading into water don't, so whatever. + if(!target?.reagents?.has_reagent(/decl/material/liquid/water, 150)) // To avoid washing your hands in beakers. + to_chat(user, SPAN_WARNING("\The [src] doesn't have enough water in it to wash your hands.")) + return + + var/found_hand = FALSE + for(var/hand_slot in user.get_held_item_slots()) + var/obj/item/organ/external/organ = user.get_organ(hand_slot) + if(istype(organ) && organ.is_washable) + found_hand = TRUE + break + + if(!found_hand) + return FALSE + + var/decl/pronouns/pronouns = user.get_pronouns() + if(isturf(target)) + var/turf/turf = target + var/fluid = turf.get_fluid_name() + user.visible_message( + SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [fluid]."), + SPAN_NOTICE("You wash your hands in \the [fluid].") + ) + else + user.visible_message( + SPAN_NOTICE("\The [user] washes [pronouns.his] hands in \the [target]."), + SPAN_NOTICE("You wash your hands in \the [target].") + ) + + user.clean() + playsound(user.loc, 'sound/effects/slosh.ogg', 25, 1) + return TRUE + +/decl/interaction_handler/drink + name = "Drink" + expected_target_type = /atom + interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "drink from $TARGET_THEM$" + +/decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && !istype(prop) && target.can_drink_from(user) + +/decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) + + // Items can be picked up and drunk from, this interaction is for turfs and structures. + if(istype(target, /obj/item)) + return + + if(!user.check_has_mouth()) + target.show_food_no_mouth_message(user, user) + return + + if(!target?.reagents?.total_volume) + target.show_food_empty_message(user, EATING_METHOD_DRINK) + return + + if(!user.can_eat_food_currently(null, user, EATING_METHOD_DRINK)) + return + + var/blocked = user.check_mouth_coverage() + if(blocked) + to_chat(user, SPAN_NOTICE("\The [blocked] is in the way!")) + return + + var/fluid_name = "\the [target]" + if(isturf(target)) + var/turf/target_turf = target + fluid_name = "\the [target_turf.get_fluid_name()]" + + user.visible_message( + SPAN_NOTICE("\The [user] drinks from [fluid_name]."), + SPAN_NOTICE("You drink from [fluid_name].") + ) + target.reagents.trans_to_mob(user, 5, CHEM_INGEST) + playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) diff --git a/code/modules/interactions/interactions_shared.dm b/code/modules/interactions/interactions_shared.dm index db486feb277..b8f50f15113 100644 --- a/code/modules/interactions/interactions_shared.dm +++ b/code/modules/interactions/interactions_shared.dm @@ -3,25 +3,30 @@ name = "Eject Disk" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject" + examine_desc = "remove a disk" /decl/interaction_handler/set_transfer name = "Set Transfer Amount" abstract_type = /decl/interaction_handler/set_transfer + examine_desc = "set the transfer amount" /decl/interaction_handler/remove_id name = "Remove ID" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject_id" abstract_type = /decl/interaction_handler/remove_id + examine_desc = "remove an ID card" /decl/interaction_handler/remove_pen name = "Remove Pen" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject_pen" abstract_type = /decl/interaction_handler/remove_pen + examine_desc = "remove a pen" /decl/interaction_handler/rename name = "Rename" icon = 'icons/screen/radial.dmi' icon_state = "radial_rename" abstract_type = /decl/interaction_handler/rename + examine_desc = "rename $TARGET_THEM$" diff --git a/code/modules/item_effects/_item_effect.dm b/code/modules/item_effects/_item_effect.dm index 9516a3a9639..54199b3584d 100644 --- a/code/modules/item_effects/_item_effect.dm +++ b/code/modules/item_effects/_item_effect.dm @@ -1,13 +1,3 @@ -#define ITEM_EFFECT_STRIKE "weff_strike" -#define ITEM_EFFECT_PARRY "weff_parry" -#define ITEM_EFFECT_USED "weff_used" -#define ITEM_EFFECT_WIELDED "weff_wield" -#define ITEM_EFFECT_VISUAL "weff_visual" -#define ITEM_EFFECT_LISTENER "weff_listener" -#define ITEM_EFFECT_VISIBLE "weff_visible" -#define ITEM_EFFECT_RANGED "weff_ranged" -#define ITEM_EFFECT_PROCESS "weff_process" - /decl/item_effect abstract_type = /decl/item_effect @@ -75,6 +65,12 @@ SHOULD_CALL_PARENT(FALSE) return FALSE -/decl/item_effect/proc/examined(obj/item/item, mob/user) +/decl/item_effect/proc/on_examined(obj/item/item, mob/user, distance, list/parameters) SHOULD_CALL_PARENT(FALSE) return FALSE + +/decl/item_effect/proc/modify_attack_damage(base_damage, obj/item/used_item, mob/user, dry_run, list/parameters) + return base_damage + +/decl/item_effect/proc/expend_attack_use(obj/item/used_item, mob/user, dry_run, list/parameters) + return diff --git a/code/modules/item_effects/item_effect_aura.dm b/code/modules/item_effects/item_effect_aura.dm index d08b4a4968e..c30e3a36461 100644 --- a/code/modules/item_effects/item_effect_aura.dm +++ b/code/modules/item_effects/item_effect_aura.dm @@ -16,7 +16,7 @@ user.remove_aura(aura_type) return TRUE -/decl/item_effect/aura/examined(obj/item/item, mob/user) +/decl/item_effect/aura/on_examined(obj/item/item, mob/user) var/obj/aura/aura = aura_type to_chat(user, SPAN_NOTICE("\The [item] grants \a [initial(aura.name)] to the wielder.")) diff --git a/code/modules/item_effects/item_effect_charges.dm b/code/modules/item_effects/item_effect_charges.dm index 4a27d3d0a27..06e8126b16f 100644 --- a/code/modules/item_effects/item_effect_charges.dm +++ b/code/modules/item_effects/item_effect_charges.dm @@ -3,14 +3,14 @@ abstract_type = /decl/item_effect/charges /decl/item_effect/charges/do_ranged_effect(mob/user, obj/item/item, atom/target, list/parameters) - var/charges = (LAZYACCESS(parameters, "charges") || 0) + var/charges = (LAZYACCESS(parameters, IE_PAR_USES) || 0) if(charges <= 0) return FALSE - item.set_item_effect_parameter(src, ITEM_EFFECT_RANGED, "charges", charges-1) + item.set_item_effect_parameter(src, IE_CAT_RANGED, IE_PAR_USES, charges-1) return TRUE -/decl/item_effect/charges/examined(obj/item/item, mob/user) - to_chat(user, SPAN_NOTICE("\The [item] has [item.get_item_effect_parameter(src, ITEM_EFFECT_RANGED, "charges") || 0] charge\s of [effect_descriptor] left.")) +/decl/item_effect/charges/on_examined(obj/item/item, mob/user) + to_chat(user, SPAN_NOTICE("\The [item] has [item.get_item_effect_parameter(src, IE_CAT_RANGED, IE_PAR_USES) || 0] charge\s of [effect_descriptor] left.")) /obj/item/projectile/fireball name = "fireball" diff --git a/code/modules/item_effects/item_effect_debug.dm b/code/modules/item_effects/item_effect_debug.dm index 352143ed57b..1533abda483 100644 --- a/code/modules/item_effects/item_effect_debug.dm +++ b/code/modules/item_effects/item_effect_debug.dm @@ -37,7 +37,7 @@ /decl/item_effect/debug/hear_speech(obj/item/item, mob/user, message, decl/language/speaking) log_debug("[type]: [item] heard [user] say [message] in [speaking] ([json_encode(args)])") -/decl/item_effect/debug/examined(obj/item/item, mob/user) +/decl/item_effect/debug/on_examined(obj/item/item, mob/user) log_debug("[type]: [user] examined [item] ([json_encode(args)])") /decl/item_effect/debug/do_process_effect(obj/item/item, list/parameters) @@ -46,21 +46,21 @@ /obj/item/sword/katana/debug/Initialize() . = ..() add_item_effect(/decl/item_effect/debug, list( - ITEM_EFFECT_VISUAL = list("vis" = "ual"), - ITEM_EFFECT_STRIKE = list("foo" = "bar"), - ITEM_EFFECT_PARRY = list("fizz" = "buzz"), - ITEM_EFFECT_USED = list("aard" = "vark"), - ITEM_EFFECT_VISIBLE = list("ooo" = "aaa"), - ITEM_EFFECT_LISTENER = list("walla walla" = "bing bong"), - ITEM_EFFECT_PROCESS = list("hyonk" = "hjonk") + (IE_CAT_VISUAL) = list("vis" = "ual"), + (IE_CAT_STRIKE) = list("foo" = "bar"), + (IE_CAT_PARRY) = list("fizz" = "buzz"), + (IE_CAT_USED) = list("aard" = "vark"), + (IE_CAT_EXAMINE) = list("ooo" = "aaa"), + (IE_CAT_LISTENER) = list("walla walla" = "bing bong"), + (IE_CAT_PROCESS) = list("hyonk" = "hjonk") )) add_item_effect(/decl/item_effect/charges/fireball, list( - ITEM_EFFECT_VISIBLE, - ITEM_EFFECT_RANGED = list("charges" = 5) + (IE_CAT_EXAMINE), + (IE_CAT_RANGED) = list(IE_PAR_USES = 5) )) add_item_effect(/decl/item_effect/aura/regeneration, list( - ITEM_EFFECT_VISIBLE, - ITEM_EFFECT_WIELDED + (IE_CAT_EXAMINE), + (IE_CAT_WIELDED) )) /obj/item/staff/crystal/beacon/fireball @@ -71,6 +71,6 @@ /obj/item/staff/crystal/beacon/fireball/Initialize(ml, material_key) . = ..() add_item_effect(/decl/item_effect/charges/fireball, list( - ITEM_EFFECT_VISIBLE, - ITEM_EFFECT_RANGED = list("charges" = 5) + (IE_CAT_EXAMINE), + (IE_CAT_RANGED) = list(IE_PAR_USES = 5) )) \ No newline at end of file diff --git a/code/modules/item_effects/item_effect_item.dm b/code/modules/item_effects/item_effect_item.dm index 22c57157bd4..ea1be1cfd24 100644 --- a/code/modules/item_effects/item_effect_item.dm +++ b/code/modules/item_effects/item_effect_item.dm @@ -1,6 +1,15 @@ /obj/item var/list/_item_effects +/obj/item/proc/has_item_effect(decl/item_effect/effect, effect_category) + if(!length(_item_effects)) + return FALSE + if(ispath(effect)) + effect = GET_DECL(effect) + if(!istype(effect)) + return FALSE + return LAZYISIN(LAZYACCESS(_item_effects, effect_category), effect) + /obj/item/proc/add_item_effect(effect_type, list/effect_parameters) if(!effect_type || !length(effect_parameters)) return FALSE @@ -13,13 +22,15 @@ . = TRUE if(.) - if(ITEM_EFFECT_LISTENER in effect_parameters) + if(IE_CAT_LISTENER in effect_parameters) global.listening_objects |= src - if(ITEM_EFFECT_PROCESS in effect_parameters) + if(IE_CAT_PROCESS in effect_parameters) SSitem_effects.queued_items |= src /obj/item/proc/remove_item_effect(decl/item_effect/effect) - if(!effect || !length(_item_effects)) + if(ispath(effect)) + effect = GET_DECL(effect) + if(!istype(effect) || !length(_item_effects)) return FALSE var/list/removed_effect_categories = list() for(var/effect_category in _item_effects) @@ -30,13 +41,23 @@ LAZYREMOVE(_item_effects, effect_category) . = TRUE if(.) - if(ITEM_EFFECT_LISTENER in removed_effect_categories) + if(IE_CAT_LISTENER in removed_effect_categories) global.listening_objects -= src - if(ITEM_EFFECT_PROCESS in removed_effect_categories) + if(IE_CAT_PROCESS in removed_effect_categories) SSitem_effects.queued_items -= src +/obj/item/proc/get_item_effect_parameters(decl/item_effect/effect, effect_category) + if(ispath(effect)) + effect = GET_DECL(effect) + if(!istype(effect) || !length(_item_effects) || !effect_category) + return null + var/list/effects = LAZYACCESS(_item_effects, effect_category) + return LAZYACCESS(effects, effect) + /obj/item/proc/get_item_effect_parameter(decl/item_effect/effect, effect_category, parameter_name) - if(!effect || !length(_item_effects) || !effect_category || !parameter_name) + if(ispath(effect)) + effect = GET_DECL(effect) + if(!istype(effect) || !length(_item_effects) || !effect_category || !parameter_name) return null var/list/effects = LAZYACCESS(_item_effects, effect_category) if(!LAZYISIN(effects, effect)) @@ -44,7 +65,9 @@ return LAZYACCESS(effects[effect], parameter_name) /obj/item/proc/set_item_effect_parameter(decl/item_effect/effect, effect_category, parameter_name, parameter_value) - if(!effect || !length(_item_effects) || !effect_category || !parameter_name) + if(ispath(effect)) + effect = GET_DECL(effect) + if(!istype(effect) || !length(_item_effects) || !effect_category || !parameter_name) return FALSE var/list/effects = LAZYACCESS(_item_effects, effect_category) if(!LAZYISIN(effects, effect)) @@ -59,7 +82,7 @@ /obj/item/resolve_attackby(atom/A, mob/user, var/click_params) if(!(. = ..())) return - var/list/item_effects = get_item_effects(ITEM_EFFECT_STRIKE) + var/list/item_effects = get_item_effects(IE_CAT_STRIKE) if(!length(item_effects)) return if(!istype(user) || QDELETED(user) || QDELETED(src)) @@ -72,7 +95,7 @@ // PARRY effects /obj/item/on_parry(mob/user, damage_source, mob/attacker) . = ..() - var/list/item_effects = get_item_effects(ITEM_EFFECT_PARRY) + var/list/item_effects = get_item_effects(IE_CAT_PARRY) if(!length(item_effects)) return if(!istype(user) || QDELETED(user) || QDELETED(src)) @@ -86,7 +109,7 @@ // VISUAL effects (world icon) /obj/item/on_update_icon() . = ..() - var/list/item_effects = get_item_effects(ITEM_EFFECT_VISUAL) + var/list/item_effects = get_item_effects(IE_CAT_VISUAL) if(!length(item_effects)) return for(var/decl/item_effect/used_effect as anything in item_effects) @@ -96,7 +119,7 @@ /obj/item/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) // TODO: this might need work to handle items that do a state or appearance update in the parent call. if(overlay) - var/list/item_effects = get_item_effects(ITEM_EFFECT_VISUAL) + var/list/item_effects = get_item_effects(IE_CAT_VISUAL) if(length(item_effects)) for(var/decl/item_effect/used_effect as anything in item_effects) used_effect.apply_onmob_appearance_to(src, user_mob, bodytype, overlay, slot, bodypart, item_effects[used_effect]) @@ -106,7 +129,7 @@ /obj/item/attack_self(mob/user) if((. = ..())) return - var/list/item_effects = get_item_effects(ITEM_EFFECT_USED) + var/list/item_effects = get_item_effects(IE_CAT_USED) if(!length(item_effects)) return if(!istype(user) || QDELETED(user) || QDELETED(src)) @@ -120,7 +143,7 @@ // WIELD effects (unwielded) /obj/item/dropped(mob/user) . = ..() - var/list/item_effects = get_item_effects(ITEM_EFFECT_WIELDED) + var/list/item_effects = get_item_effects(IE_CAT_WIELDED) if(!length(item_effects)) return if(!istype(user) || QDELETED(user) || QDELETED(src)) @@ -133,7 +156,7 @@ // WIELD effects (wielded) /obj/item/equipped(mob/user, slot) . = ..() - var/list/item_effects = get_item_effects(ITEM_EFFECT_WIELDED) + var/list/item_effects = get_item_effects(IE_CAT_WIELDED) if(!length(item_effects)) return if(!istype(user) || QDELETED(user) || QDELETED(src) || loc != user || !(slot in user.get_held_item_slots())) @@ -146,7 +169,7 @@ // LISTENING effects /obj/item/hear_talk(mob/M, text, verb, decl/language/speaking) . = ..() - var/list/item_effects = get_item_effects(ITEM_EFFECT_LISTENER) + var/list/item_effects = get_item_effects(IE_CAT_LISTENER) if(!length(item_effects)) return for(var/decl/item_effect/listening_effect as anything in item_effects) @@ -157,17 +180,17 @@ . = ..() if(!user) return - var/list/item_effects = get_item_effects(ITEM_EFFECT_VISIBLE) + var/list/item_effects = get_item_effects(IE_CAT_EXAMINE) if(!length(item_effects)) return for(var/decl/item_effect/examine_effect as anything in item_effects) - examine_effect.examined(src, user, distance, item_effects[examine_effect]) + examine_effect.on_examined(src, user, distance, item_effects[examine_effect]) // RANGED effects /obj/item/afterattack(turf/floor/target, mob/user, proximity) if((. = ..()) || proximity) return - var/list/item_effects = get_item_effects(ITEM_EFFECT_RANGED) + var/list/item_effects = get_item_effects(IE_CAT_RANGED) if(!length(item_effects)) return for(var/decl/item_effect/ranged_effect as anything in item_effects) @@ -177,7 +200,7 @@ // PROCESS effects /obj/item/proc/process_item_effects() - var/list/item_effects = get_item_effects(ITEM_EFFECT_PROCESS) + var/list/item_effects = get_item_effects(IE_CAT_PROCESS) if(length(item_effects)) for(var/decl/item_effect/process_effect as anything in item_effects) process_effect.do_process_effect(src, item_effects[process_effect]) diff --git a/code/modules/item_worth/_helpers.dm b/code/modules/item_worth/_helpers.dm deleted file mode 100644 index 8841debc67a..00000000000 --- a/code/modules/item_worth/_helpers.dm +++ /dev/null @@ -1,3 +0,0 @@ -//Workaround by Ginja due to the fact initial(parent_type) does not work. - -#define PARENT(x) text2path(replacetext("[x]", regex("/\[^/\]+$"), "")) \ No newline at end of file diff --git a/code/modules/keybindings/mob.dm b/code/modules/keybindings/mob.dm index 14d43d22f86..4ab7f0f14f9 100644 --- a/code/modules/keybindings/mob.dm +++ b/code/modules/keybindings/mob.dm @@ -52,7 +52,7 @@ full_name = "Select Help Intent" /datum/keybinding/mob/select_help_intent/down(client/user) - user.mob.a_intent_change(I_HELP) + user.mob.set_intent(I_FLAG_HELP) return TRUE /datum/keybinding/mob/select_disarm_intent @@ -61,7 +61,7 @@ full_name = "Select Disarm Intent" /datum/keybinding/mob/select_disarm_intent/down(client/user) - user.mob.a_intent_change(I_DISARM) + user.mob.set_intent(I_FLAG_DISARM) return TRUE /datum/keybinding/mob/select_grab_intent @@ -70,7 +70,7 @@ full_name = "Select Grab Intent" /datum/keybinding/mob/select_grab_intent/down(client/user) - user.mob.a_intent_change(I_GRAB) + user.mob.set_intent(I_FLAG_GRAB) return TRUE /datum/keybinding/mob/select_harm_intent @@ -79,7 +79,7 @@ full_name = "Select Harm Intent" /datum/keybinding/mob/select_harm_intent/down(client/user) - user.mob.a_intent_change(I_HURT) + user.mob.set_intent(I_FLAG_HARM) return TRUE /datum/keybinding/mob/cycle_intent_right @@ -88,7 +88,7 @@ full_name = "Сycle Intent: Right" /datum/keybinding/mob/cycle_intent_right/down(client/user) - user.mob.a_intent_change(INTENT_HOTKEY_RIGHT) + user.mob.cycle_intent(INTENT_HOTKEY_RIGHT) return TRUE /datum/keybinding/mob/cycle_intent_left @@ -97,7 +97,7 @@ full_name = "Сycle Intent: Left" /datum/keybinding/mob/cycle_intent_left/down(client/user) - user.mob.a_intent_change(INTENT_HOTKEY_LEFT) + user.mob.cycle_intent(INTENT_HOTKEY_LEFT) return TRUE /datum/keybinding/mob/activate_inhand diff --git a/code/modules/keybindings/robot.dm b/code/modules/keybindings/robot.dm index 800078894b3..e01ab94ae71 100644 --- a/code/modules/keybindings/robot.dm +++ b/code/modules/keybindings/robot.dm @@ -44,7 +44,7 @@ description = "Cycles the intent left" /datum/keybinding/robot/intent_cycle/down(client/user) - user.mob.a_intent_change(INTENT_HOTKEY_LEFT) + user.mob.cycle_intent(INTENT_HOTKEY_LEFT) return TRUE /datum/keybinding/robot/module_cycle diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 687dcc2a49d..b1e8d111ed7 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -237,6 +237,7 @@ var/global/list/REVERSE_LIGHTING_CORNER_DIAGONAL = list(0, 0, 0, 0, 3, 4, 0, 0, update_overlays(TRUE) /datum/lighting_corner/proc/update_ambient_lumcount(delta_r, delta_g, delta_b, skip_update = FALSE) + ambient_r += delta_r ambient_g += delta_g ambient_b += delta_b diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index de8134d5e51..53e59fa5b9b 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -1,16 +1,22 @@ /turf var/dynamic_lighting = TRUE - var/ambient_light // If non-null, a hex RGB light color that should be applied to this turf. - var/ambient_light_multiplier = 0.3 // The power of the above is multiplied by this. Setting too high may drown out normal lights on the same turf. + /// If non-null, a hex RGB light color that should be applied to this turf. + var/ambient_light + /// The power of the above is multiplied by this. Setting too high may drown out normal lights on the same turf. + var/ambient_light_multiplier = 0.3 luminosity = 1 var/tmp/lighting_corners_initialised = FALSE - var/tmp/list/datum/light_source/affecting_lights // List of light sources affecting this turf. - var/tmp/atom/movable/lighting_overlay/lighting_overlay // Our lighting overlay. + /// List of light sources affecting this turf. + var/tmp/list/datum/light_source/affecting_lights + /// Our lighting overlay, used to apply multiplicative lighting to the tile and its contents. + var/tmp/atom/movable/lighting_overlay/lighting_overlay var/tmp/list/datum/lighting_corner/corners - var/tmp/has_opaque_atom = FALSE // Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. - var/tmp/ambient_has_indirect = FALSE // If this is TRUE, an above turf's ambient light is affecting this turf. + /// Not to be confused with opacity, this will be TRUE if there's any opaque atom on the tile. + var/tmp/has_opaque_atom = FALSE + /// If this is TRUE, an above turf's ambient light is affecting this turf. + var/tmp/ambient_has_indirect = FALSE // Record-keeping, do not touch -- that means you, admins. var/tmp/ambient_light_old @@ -43,9 +49,9 @@ var/ambient_b = 0 if (ambient_light) - ambient_r = ((HEX_RED(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_r - ambient_g = ((HEX_GREEN(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_g - ambient_b = ((HEX_BLUE(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_b + ambient_r = round(((HEX_RED(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_r, LIGHTING_ROUND_VALUE) + ambient_g = round(((HEX_GREEN(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_g, LIGHTING_ROUND_VALUE) + ambient_b = round(((HEX_BLUE(ambient_light) / 255) * ambient_light_multiplier)/4 - ambient_light_old_b, LIGHTING_ROUND_VALUE) else ambient_r = -ambient_light_old_r ambient_g = -ambient_light_old_g @@ -55,31 +61,21 @@ ambient_light_old_g += ambient_g ambient_light_old_b += ambient_b - if (ambient_r + ambient_g + ambient_b == 0) + if (abs(ambient_r + ambient_g + ambient_b) == 0) return // Unlit turfs will have corners if they have a lit neighbor -- don't generate corners for them, but do update them if they're there. - // if (!corners) - // var/force_build_corners = FALSE - // for (var/turf/T as anything in RANGE_TURFS(src, 1)) - // if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) - // force_build_corners = TRUE - // break - - // if (force_build_corners || TURF_IS_DYNAMICALLY_LIT_UNSAFE(src)) - // generate_missing_corners() - // else - // return - - // still inefficient :( - if(!corners || !lighting_corners_initialised) - /* Commented out pending working out why this doesn't work properly on Neb. - if(TURF_IS_DYNAMICALLY_LIT_UNSAFE(src)) + if (!corners) + var/force_build_corners = FALSE + for (var/turf/T as anything in RANGE_TURFS(src, 1)) + if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(T)) + force_build_corners = TRUE + break + + if (force_build_corners || TURF_IS_DYNAMICALLY_LIT_UNSAFE(src)) generate_missing_corners() else return - */ - generate_missing_corners() // This list can contain nulls on things like space turfs -- they only have their neighbors' corners. for (var/datum/lighting_corner/C in corners) @@ -92,14 +88,14 @@ ambient_light_old = ambient_light -// Causes any affecting light sources to be queued for a visibility update, for example a door got opened. +/// Causes any affecting light sources to be queued for a visibility update, for example a door got opened. /turf/proc/reconsider_lights() var/datum/light_source/L for (var/thing in affecting_lights) L = thing L.vis_update() -// Forces a lighting update. Reconsider lights is preferred when possible. +/// Forces a lighting update. Reconsider lights is preferred when possible. /turf/proc/force_update_lights() var/datum/light_source/L for (var/thing in affecting_lights) @@ -120,8 +116,7 @@ // Builds a lighting overlay for us, but only if our area is dynamic. /turf/proc/lighting_build_overlay(now = FALSE) if (lighting_overlay) - return // shrug - // CRASH("Attempted to create lighting_overlay on tile that already had one.") + CRASH("Attempted to create lighting_overlay on tile that already had one.") if (TURF_IS_DYNAMICALLY_LIT_UNSAFE(src)) if (!lighting_corners_initialised || !corners) @@ -137,7 +132,7 @@ C.active = TRUE -// Returns the average color of this tile. Roughly corresponds to the color of a single old-style lighting overlay. +/// Returns the average color of this tile. Roughly corresponds to the color of a single old-style lighting overlay. /turf/proc/get_avg_color() if (!lighting_overlay) return null @@ -159,7 +154,7 @@ #define SCALE(targ,min,max) (targ - min) / (max - min) -// Used to get a scaled lumcount. +/// Returns a lumcount (average intensity of color channels) scaled between minlum and maxlum. /turf/proc/get_lumcount(minlum = 0, maxlum = 1) if (!lighting_overlay) return 0.5 @@ -176,7 +171,7 @@ #undef SCALE -// Can't think of a good name, this proc will recalculate the has_opaque_atom variable. +/// Can't think of a good name, this proc will recalculate the has_opaque_atom variable. /turf/proc/recalc_atom_opacity() #ifdef AO_USE_LIGHTING_OPACITY var/old = has_opaque_atom diff --git a/code/modules/locks/lock.dm b/code/modules/locks/lock.dm index 82692f60586..20f148f194c 100644 --- a/code/modules/locks/lock.dm +++ b/code/modules/locks/lock.dm @@ -20,6 +20,7 @@ var/lock_data = "" //basically a randomized string. The longer the string the more complex the lock. var/atom/holder var/material + var/lockpicking_skill = SKILL_DEVICES /datum/lock/New(var/atom/h, var/complexity = 1, var/mat) holder = h @@ -77,9 +78,9 @@ if(!unlock_power) return FALSE user.visible_message("\The [user] begins to pick \the [holder]'s lock with \the [I].", SPAN_NOTICE("You begin picking \the [holder]'s lock.")) - if(!do_after(user, 2 SECONDS, holder)) + if(!user.do_skilled(2 SECONDS, lockpicking_skill, holder, check_holding = TRUE, set_cooldown = TRUE)) return FALSE - if(prob(20*(unlock_power/getComplexity()))) + if(!user.skill_fail_prob(lockpicking_skill, 100 - (20*(unlock_power/getComplexity())), SKILL_EXPERT)) to_chat(user, SPAN_NOTICE("You pick open \the [holder]'s lock!")) unlock(lock_data) return TRUE @@ -88,4 +89,4 @@ I.take_damage(rand(5,10)) else to_chat(user, SPAN_WARNING("You fail to pick open \the [holder].")) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/maps/_map_template.dm b/code/modules/maps/_map_template.dm index a48c199cccc..f7a22eaf01f 100644 --- a/code/modules/maps/_map_template.dm +++ b/code/modules/maps/_map_template.dm @@ -1,4 +1,5 @@ /datum/map_template + abstract_type = /datum/map_template ///Name for differentiating templates var/name = "Default Template Name" ///The width of the template's levels. Size is preloaded from template during template registration. @@ -14,7 +15,7 @@ ///Shuttles in this template's levels that need to be initialized with SSshuttle. var/list/shuttles_to_initialise = list() ///Sub-templates to spawn on this template if any. Ruins and sites and etc.. - var/list/subtemplates_to_spawn + var/list/subtemplates_to_spawn = list() ///Percent of chances to end up onto a level from this template by spacewalking between space z-levels. var/accessibility_weight = 0 ///Flags for defining special properties of this template. @@ -23,8 +24,6 @@ var/modify_tag_vars = TRUE ///List of strings to store the templates under for mass retrieval. var/list/template_categories - ///If this is equal to current type, the datum is abstract and should not be created. - var/template_parent_type = /datum/map_template ///The initial type of level_data to instantiate new z-level with initially. (Is replaced by whatever is in the map file.) If null, will use default. var/level_data_type /// Various tags used for selecting templates for placement on a map. @@ -67,45 +66,22 @@ if (SSatoms.atom_init_stage == INITIALIZATION_INSSATOMS) return // let proper initialisation handle it later - var/list/turf/turfs = list() - var/list/obj/machinery/atmospherics/atmos_machines = list() - var/list/obj/machinery/machines = list() - var/list/obj/structure/cable/cables = list() - - for(var/atom/A in atoms) - if(isturf(A)) - turfs += A - if(istype(A, /obj/structure/cable)) - cables += A - if(istype(A, /obj/machinery/atmospherics)) - atmos_machines += A - if(istype(A, /obj/machinery)) - machines += A - if(istype(A, /obj/abstract/landmark/map_load_mark)) - LAZYADD(subtemplates_to_spawn, A) - - var/notsuspended - if(!SSmachines.suspended) - SSmachines.suspend() - notsuspended = TRUE - SSatoms.InitializeAtoms() // The atoms should have been getting queued there. This flushes the queue. - SSmachines.setup_powernets_for_cables(cables) - SSmachines.setup_atmos_machinery(atmos_machines) - if(notsuspended) - SSmachines.wake() + for(var/obj/abstract/landmark/map_load_mark/landmark in atoms) + subtemplates_to_spawn += landmark - for (var/obj/machinery/machine as anything in machines) - machine.power_change() + // fun fact: these already filter for us, so it's pointless to sort + SSmachines.setup_powernets_for_cables(atoms) + SSmachines.setup_atmos_machinery(atoms) - for (var/turf/T as anything in turfs) + for (var/turf/T in atoms) if(template_flags & TEMPLATE_FLAG_NO_RUINS) T.turf_flags |= TURF_FLAG_NO_POINTS_OF_INTEREST if(template_flags & TEMPLATE_FLAG_NO_RADS) qdel(SSradiation.sources_assoc[T]) - if(istype(T) && T.simulated) - T.update_air_properties() + if(T.simulated) + SSair.mark_for_update(T) /datum/map_template/proc/pre_init_shuttles() . = SSshuttle.block_queue @@ -185,8 +161,6 @@ for(var/z_index = bounds[MAP_MINZ] to bounds[MAP_MAXZ]) var/datum/level_data/level = SSmapping.levels_by_z[z_index] level.after_template_load(src) - if(SSlighting.initialized) - SSlighting.InitializeZlev(z_index) Master.StopLoadingMap() log_game("Z-level [name] loaded at [x],[y],[world.maxz]") loaded++ @@ -225,11 +199,9 @@ init_atoms(atoms_to_initialise) init_shuttles(shuttle_state, map_hash, initialized_areas_by_type) after_load() - if (SSlighting.initialized) - SSlighting.InitializeTurfs(atoms_to_initialise) // Hopefully no turfs get placed on new coords by SSatoms. Master.StopLoadingMap() - log_game("[name] loaded at at [T.x],[T.y],[T.z]") + log_game("[name] loaded at [T.x],[T.y],[T.z]") loaded++ return TRUE @@ -238,7 +210,7 @@ for(var/obj/abstract/landmark/map_load_mark/mark as anything in subtemplates_to_spawn) subtemplates_to_spawn -= mark mark.load_subtemplate() - if(!QDELETED(mark)) + if(!QDELETED(mark)) // for if the tile that lands on the landmark is a no-op tile qdel(mark) subtemplates_to_spawn = null generate_multi_spawn_items() diff --git a/code/modules/maps/reader.dm b/code/modules/maps/reader.dm index efc444d7b0a..71bedba3639 100644 --- a/code/modules/maps/reader.dm +++ b/code/modules/maps/reader.dm @@ -12,18 +12,32 @@ var/global/dmm_suite/preloader/_preloader = new var/list/atoms_to_initialise /dmm_suite - // /"([a-zA-Z]+)" = \(((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}/g - var/static/regex/dmmRegex = new/regex({""(\[a-zA-Z]+)" = \\(((?:.|\n)*?)\\)\n(?!\t)|\\((\\d+),(\\d+),(\\d+)\\) = \\{"(\[a-zA-Z\n]*)"\\}"}, "g") + // /"([a-zA-Z]+)" = \(((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"\n*([a-zA-Z\n]*)\n?"\}/g + var/static/regex/dmmRegex = new/regex({""(\[a-zA-Z]+)" = \\(((?:.|\n)*?)\\)\n(?!\t)|\\((\\d+),(\\d+),(\\d+)\\) = \\{"\n*(\[a-zA-Z\n]*)\n?"\\}"}, "g") // /^[\s\n]+"?|"?[\s\n]+$|^"|"$/g var/static/regex/trimQuotesRegex = new/regex({"^\[\\s\n]+"?|"?\[\\s\n]+$|^"|"$"}, "g") // /^[\s\n]+|[\s\n]+$/ var/static/regex/trimRegex = new/regex("^\[\\s\n]+|\[\\s\n]+$", "g") var/static/list/modelCache = list() var/static/space_key + var/static/list/types_to_delete #ifdef TESTING var/static/turfsSkipped #endif +// Set up some basic cached vars, like types_to_delete, that have to check things like subtypes. +/dmm_suite/New() + if(!types_to_delete) + types_to_delete = typecacheof(list( + /mob/living, + /obj/effect, + /obj/item, + /obj/machinery, + /obj/structure, + /obj/abstract/landmark/exoplanet_spawn, + )) + ..() + /** * Construct the model map and control the loading process * @@ -124,20 +138,11 @@ var/global/dmm_suite/preloader/_preloader = new bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd) var/list/gridLines = splittext(dmmRegex.group[6], "\n") - - var/leadingBlanks = 0 - while(leadingBlanks < gridLines.len && gridLines[++leadingBlanks] == "") - if(leadingBlanks > 1) - gridLines.Cut(1, leadingBlanks) // Remove all leading blank lines. - - if(!gridLines.len) // Skip it if only blank lines exist. + if(!length(gridLines)) // Skip it if only blank lines exist. continue - if(gridLines.len && gridLines[gridLines.len] == "") - gridLines.Cut(gridLines.len) // Remove only one blank line at the end. - bounds[MAP_MINY] = min(bounds[MAP_MINY], clamp(ycrd, y_lower, y_upper)) - ycrd += gridLines.len - 1 // Start at the top and work down + ycrd += length(gridLines) - 1 // Start at the top and work down if(!cropMap && ycrd > world.maxy) if(!measureOnly) @@ -185,8 +190,6 @@ var/global/dmm_suite/preloader/_preloader = new maxx = max(maxx, xcrd) ++xcrd --ycrd - if (zexpansion && SSlighting.initialized) - SSlighting.InitializeZlev(zcrd) bounds[MAP_MAXX] = clamp(max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx), x_lower, x_upper) @@ -226,16 +229,6 @@ var/global/dmm_suite/preloader/_preloader = new var/list/atoms_to_initialise var/list/atoms_to_delete -/dmm_suite/proc/types_to_delete() - return list( - /mob/living, - /obj/effect, - /obj/item, - /obj/machinery, - /obj/structure, - /obj/abstract/landmark/exoplanet_spawn, - ) - /dmm_suite/proc/parse_grid(model as text, model_key as text, xcrd as num,ycrd as num,zcrd as num, no_changeturf as num, clear_contents as num, initialized_areas_by_type) /*Method parse_grid() - Accepts a text string containing a comma separated list of type paths of the @@ -288,8 +281,8 @@ var/global/dmm_suite/preloader/_preloader = new if(variables_start)//if there's any variable full_def = copytext(full_def,variables_start+1,length(full_def))//removing the last '}' fields = readlist(full_def, ";") - if(fields.len) - if(!trim(fields[fields.len])) + if(length(fields)) + if(!trim(fields[length(fields)])) --fields.len for(var/I in fields) var/value = fields[I] @@ -312,7 +305,7 @@ var/global/dmm_suite/preloader/_preloader = new // 5. and the members are world.turf and world.area // Basically, if we find an entry like this: "XXX" = (/turf/default, /area/default) // We can skip calling this proc every time we see XXX - if(no_changeturf && !space_key && members.len == 2 && members_attributes.len == 2 && length(members_attributes[1]) == 0 && length(members_attributes[2]) == 0 && (world.area in members) && (world.turf in members)) + if(no_changeturf && !space_key && length(members) == 2 && length(members_attributes) == 2 && length(members_attributes[1]) == 0 && length(members_attributes[2]) == 0 && (world.area in members) && (world.turf in members)) space_key = model_key return @@ -329,7 +322,7 @@ var/global/dmm_suite/preloader/_preloader = new var/atoms_to_delete = list() //first instance the /area and remove it from the members list - index = members.len + index = length(members) if(members[index] != /area/template_noop) is_not_noop = TRUE var/list/attr = members_attributes[index] @@ -363,20 +356,20 @@ var/global/dmm_suite/preloader/_preloader = new if(T) //if others /turf are presents, simulates the underlays piling effect index = first_turf_index + 1 - while(index <= members.len - 1) // Last item is an /area + while(index < length(members)) // Last item is an /area var/underlay = T.appearance T = instance_atom(members[index],members_attributes[index],crds,no_changeturf)//instance new turf T.underlays += underlay index++ atoms_to_initialise += T - if (clear_contents && is_not_noop) - for (var/type_to_delete in types_to_delete()) - for (var/atom/pre_existing in crds) - if(crds != pre_existing.loc) // avoid deleting multitile objects unnecessarily, only check their 'real' loc - continue - if (istype(pre_existing, type_to_delete)) - atoms_to_delete |= pre_existing + if (clear_contents && is_not_noop && length(crds.contents)) + for (var/atom/movable/pre_existing as anything in crds) + if(!types_to_delete[pre_existing.type]) + continue + if(crds != pre_existing.loc) // avoid deleting multitile objects unnecessarily, only check their 'real' loc + continue + atoms_to_delete += pre_existing //finally instance all remainings objects/mobs for(index in 1 to first_turf_index-1) diff --git a/code/modules/maps/template_types/antag_spawn.dm b/code/modules/maps/template_types/antag_spawn.dm index 7c079ead9eb..8b8b167bd0f 100644 --- a/code/modules/maps/template_types/antag_spawn.dm +++ b/code/modules/maps/template_types/antag_spawn.dm @@ -1,3 +1,3 @@ /datum/map_template/ruin/antag_spawn prefix = "maps/antag_spawn/" - template_parent_type = /datum/map_template/ruin/antag_spawn + abstract_type = /datum/map_template/ruin/antag_spawn diff --git a/code/modules/maps/template_types/away_site.dm b/code/modules/maps/template_types/away_site.dm index b9adb30914b..81d77b0152e 100644 --- a/code/modules/maps/template_types/away_site.dm +++ b/code/modules/maps/template_types/away_site.dm @@ -1,7 +1,7 @@ /datum/map_template/ruin/away_site prefix = "maps/away/" template_categories = list(MAP_TEMPLATE_CATEGORY_AWAYSITE) - template_parent_type = /datum/map_template/ruin/away_site + abstract_type = /datum/map_template/ruin/away_site var/spawn_weight = 1 /datum/map_template/ruin/away_site/get_spawn_weight() diff --git a/code/modules/maps/template_types/mapped_planet/mapped_planet_template.dm b/code/modules/maps/template_types/mapped_planet/mapped_planet_template.dm index 45396ae3baf..4a7f663352e 100644 --- a/code/modules/maps/template_types/mapped_planet/mapped_planet_template.dm +++ b/code/modules/maps/template_types/mapped_planet/mapped_planet_template.dm @@ -6,7 +6,6 @@ /datum/map_template/planetoid name = "planetoid" abstract_type = /datum/map_template/planetoid - template_parent_type = /datum/map_template/planetoid template_categories = list(MAP_TEMPLATE_CATEGORY_PLANET) level_data_type = /datum/level_data/planetoid modify_tag_vars = TRUE 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 b8e70d839d6..221ee935055 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 @@ -15,7 +15,7 @@ 'sound/ambience/ominous3.ogg' ) -/datum/exoplanet_theme/robotic_guardians/modify_template_whitelist(whitelist_flags) +/datum/exoplanet_theme/ruined_city/modify_template_whitelist(whitelist_flags) return whitelist_flags | TEMPLATE_TAG_ALIEN /datum/exoplanet_theme/ruined_city/get_map_generators(/datum/planetoid_data/E) diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm index 7ef37a05e79..6de9ef4a600 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/barren.dm @@ -13,7 +13,7 @@ /datum/level_data/planetoid/exoplanet/barren base_area = /area/exoplanet/barren - base_turf = /turf/floor + base_turf = /turf/floor/barren exterior_atmosphere = null //Generate me exterior_atmos_temp = null //Generate me level_generators = list( @@ -76,7 +76,6 @@ overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/barren template_tags_blacklist = TEMPLATE_TAG_HABITAT|TEMPLATE_TAG_WATER subtemplate_budget = 6 - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/barren prefered_level_data_per_z = list( /datum/level_data/planetoid/exoplanet/barren, //surface level @@ -99,7 +98,7 @@ ///Generator for fauna and flora spawners for the surface of the barren exoplanet /datum/random_map/noise/exoplanet/barren descriptor = "barren exoplanet" - land_type = /turf/floor + land_type = /turf/floor/barren flora_prob = 0.1 large_flora_prob = 0 fauna_prob = 0 @@ -111,7 +110,7 @@ /area/exoplanet/barren name = "\improper Planetary surface" - base_turf = /turf/floor + base_turf = /turf/floor/barren is_outside = OUTSIDE_YES ambience = list( 'sound/effects/wind/wind_2_1.ogg', diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/chlorine.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/chlorine.dm index c45df0faf7c..9ec7a882388 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/chlorine.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/chlorine.dm @@ -87,7 +87,6 @@ planetoid_data_type = /datum/planetoid_data/random/chlorine overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/chlorine template_tags_blacklist = TEMPLATE_TAG_HABITAT|TEMPLATE_TAG_WATER - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/chlorine prefered_level_data_per_z = list( /datum/level_data/planetoid/exoplanet/chlorine, diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/desert.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/desert.dm index 93053b6b88e..098a604152c 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/desert.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/desert.dm @@ -95,7 +95,6 @@ name = "desert exoplanet" planetoid_data_type = /datum/planetoid_data/random/desert overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/desert - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/desert prefered_level_data_per_z = list( /datum/level_data/planetoid/exoplanet/desert, 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 f3bc7a90522..d6ecd767659 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 @@ -119,7 +119,6 @@ name = "lush exoplanet" planetoid_data_type = /datum/planetoid_data/random/grass overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/grass - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/grass prefered_level_data_per_z = list( /datum/level_data/planetoid/exoplanet/grass, 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 90aaf8dad69..95ad399b57d 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 @@ -91,7 +91,6 @@ planetoid_data_type = /datum/planetoid_data/random/meat overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/meat template_tags_blacklist = TEMPLATE_TAG_HABITAT|TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_WATER - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/meat prefered_level_data_per_z = null diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/shrouded.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/shrouded.dm index 07b282eb4da..5b201f4509d 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/shrouded.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/shrouded.dm @@ -86,7 +86,6 @@ planetoid_data_type = /datum/planetoid_data/random/shrouded overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/shrouded template_tags_blacklist = TEMPLATE_TAG_HABITAT - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/shrouded prefered_level_data_per_z = list( /datum/level_data/planetoid/exoplanet/shrouded, diff --git a/code/modules/maps/template_types/random_exoplanet/planet_types/snow.dm b/code/modules/maps/template_types/random_exoplanet/planet_types/snow.dm index 6926e0d004d..567c152b758 100644 --- a/code/modules/maps/template_types/random_exoplanet/planet_types/snow.dm +++ b/code/modules/maps/template_types/random_exoplanet/planet_types/snow.dm @@ -77,7 +77,6 @@ name = "snow exoplanet" planetoid_data_type = /datum/planetoid_data/random/snow overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/snow - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/snow prefered_level_data_per_z = list( /datum/level_data/planetoid/exoplanet/snow, 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 a6b669411bb..fc24c4a289f 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 @@ -92,7 +92,6 @@ overmap_marker_type = /obj/effect/overmap/visitable/sector/planetoid/exoplanet/volcanic max_themes = 1 template_tags_blacklist = TEMPLATE_TAG_HABITAT|TEMPLATE_TAG_WATER - template_parent_type = /datum/map_template/planetoid/random/exoplanet level_data_type = /datum/level_data/planetoid/exoplanet/volcanic prefered_level_data_per_z = list( /datum/level_data/planetoid/exoplanet/volcanic, 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 8eb2764c4c1..3cdd8d4a0f3 100644 --- a/code/modules/maps/template_types/random_exoplanet/random_exoplanet.dm +++ b/code/modules/maps/template_types/random_exoplanet/random_exoplanet.dm @@ -2,7 +2,6 @@ /datum/map_template/planetoid/random/exoplanet name = "random exoplanet" abstract_type = /datum/map_template/planetoid/random/exoplanet - template_parent_type = /datum/map_template/planetoid/random/exoplanet template_categories = list(MAP_TEMPLATE_CATEGORY_EXOPLANET) template_category = MAP_TEMPLATE_CATEGORY_EXOPLANET_SITE tallness = 1 diff --git a/code/modules/maps/template_types/random_exoplanet/random_planet.dm b/code/modules/maps/template_types/random_exoplanet/random_planet.dm index cc846e98ae2..d19a9ee7625 100644 --- a/code/modules/maps/template_types/random_exoplanet/random_planet.dm +++ b/code/modules/maps/template_types/random_exoplanet/random_planet.dm @@ -7,7 +7,6 @@ /datum/map_template/planetoid/random name = "random planetoid" abstract_type = /datum/map_template/planetoid/random - template_parent_type = /datum/map_template/planetoid/random modify_tag_vars = TRUE //Would set it to false, since we're generating everything on the fly, but unit test doesn't like it tallness = 1 //Amount of vertical z-levels to generate for this planet. @@ -203,9 +202,9 @@ //Run the finishing touch on all loaded levels for(var/datum/level_data/LD in new_level_data) - LD.after_template_load(src) - if(SSlighting.initialized) - SSlighting.InitializeZlev(LD.level_z) + //This is done in parent if we have mappaths, so skip it unless we don't have any + if(!length(mappaths)) + LD.after_template_load(src) log_game("Z-level '[LD.name]'(planetoid:'[name]') loaded at [LD.level_z]") loaded++ return WORLD_CENTER_TURF(world.maxz) diff --git a/code/modules/maps/template_types/ruins.dm b/code/modules/maps/template_types/ruins.dm index 5c5782ac0a3..9e26f2c6212 100644 --- a/code/modules/maps/template_types/ruins.dm +++ b/code/modules/maps/template_types/ruins.dm @@ -1,7 +1,7 @@ /datum/map_template/ruin name = null template_flags = 0 // No duplicates by default - template_parent_type = /datum/map_template/ruin + abstract_type = /datum/map_template/ruin var/description var/cost = 0 var/prefix diff --git a/code/modules/maps/template_types/ruins_exoplanet.dm b/code/modules/maps/template_types/ruins_exoplanet.dm index a0a34f76975..d6c405132af 100644 --- a/code/modules/maps/template_types/ruins_exoplanet.dm +++ b/code/modules/maps/template_types/ruins_exoplanet.dm @@ -1,4 +1,4 @@ /datum/map_template/ruin/exoplanet prefix = "maps/random_ruins/exoplanet_ruins/" template_categories = list(MAP_TEMPLATE_CATEGORY_EXOPLANET_SITE) - template_parent_type = /datum/map_template/ruin/exoplanet + abstract_type = /datum/map_template/ruin/exoplanet diff --git a/code/modules/materials/_material_stack.dm b/code/modules/materials/_material_stack.dm index 776f0da2ffb..e8e684c7f24 100644 --- a/code/modules/materials/_material_stack.dm +++ b/code/modules/materials/_material_stack.dm @@ -64,6 +64,9 @@ /obj/item/stack/material/proc/special_crafting_check() return TRUE +/obj/item/stack/material/update_name() + update_strings() + /obj/item/stack/material/proc/update_strings() var/prefix_name = name_modifier ? "[name_modifier] " : "" if(amount>1) @@ -85,10 +88,6 @@ else origin_tech = initial(origin_tech) -/obj/item/stack/material/use(var/used) - . = ..() - update_strings() - /obj/item/stack/material/clear_matter() ..() reinf_material = null @@ -109,10 +108,6 @@ if(!is_same(M)) return 0 . = ..(M,tamount,1) - if(!QDELETED(src)) - update_strings() - if(!QDELETED(M)) - M.update_strings() /obj/item/stack/material/copy_from(var/obj/item/stack/material/other) ..() @@ -135,7 +130,7 @@ return TRUE // TODO: convert to converts_into entry. - if(can_be_pulverized && IS_HAMMER(W) && material?.hardness >= MAT_VALUE_RIGID && user.a_intent == I_HURT) + if(can_be_pulverized && IS_HAMMER(W) && material?.hardness >= MAT_VALUE_RIGID && user.check_intent(I_FLAG_HARM)) if(W.material?.hardness < material.hardness) to_chat(user, SPAN_WARNING("\The [W] is not hard enough to pulverize [material.solid_name].")) @@ -160,7 +155,7 @@ return TRUE var/list/can_be_converted_into = get_stack_conversion_dictionary() - if(length(can_be_converted_into) && user.a_intent != I_HURT) + if(length(can_be_converted_into) && !user.check_intent(I_FLAG_HARM)) var/convert_tool var/obj/item/stack/convert_type @@ -224,3 +219,13 @@ . += " [singular_name]" return indefinite_article ? "[indefinite_article] [.]" : ADD_ARTICLE(.) return "[amount] [.] [plural_name]" + +/obj/item/stack/material/proc/matter_units_to_sheets(used) + if(!material || get_reinforced_material()) + return 0 + return ceil(used / matter_per_piece[material.type]) + +// Horrible solution to heat damage for atoms causing logs and +// fuel to vanish. Replace this when the atom fire system exists. +/obj/item/stack/material/should_take_heat_damage(datum/gas_mixture/air, exposed_temperature) + return istype(loc, /obj/structure/fire_source) ? FALSE : ..() diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index e615eefe25a..6617c5c2a1e 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -112,7 +112,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/toxicity = 0 // Organ damage from ingestion. var/toxicity_targets_organ // Bypass liver/kidneys when ingested, harm this organ directly (using BP_FOO defines). - var/can_backfill_turf_type + var/can_backfill_floor_type // Shards/tables/structures var/shard_type = SHARD_SHRAPNEL // Path of debris object. @@ -125,6 +125,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // Icons var/icon_base = 'icons/turf/walls/solid.dmi' var/icon_base_natural = 'icons/turf/walls/natural.dmi' + /// Either the icon used for reinforcement, or a list of icons to pick from. var/icon_reinf = 'icons/turf/walls/reinforced_metal.dmi' var/wall_flags = 0 var/list/wall_blend_icons = list() // Which wall icon types walls of this material type will consider blending with. Assoc list (icon path = TRUE/FALSE) @@ -140,6 +141,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/list/stack_origin_tech = @'{"materials":1}' // Research level for stacks. // Attributes + /// Does this material float to the top of liquids, allowing it to be skimmed off? Specific to cream at time of writing. + var/skimmable = FALSE /// How rare is this material in exoplanet xenoflora? var/exoplanet_rarity_plant = MAT_RARITY_MUNDANE /// How rare is this material in exoplanet atmospheres? @@ -261,6 +264,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/cocktail_ingredient var/defoliant var/fruit_descriptor // String added to fruit desc if this chemical is present. + /// Does this reagent have an antibiotic effect (helping with infections)? + var/antibiotic_strength = 0 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. @@ -286,13 +291,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/chilling_message = "crackles and freezes!" var/chilling_sound = 'sound/effects/bubbles.ogg' var/list/chilling_products - var/bypass_chilling_products_for_root_type var/heating_point var/heating_message = "begins to boil!" var/heating_sound = 'sound/effects/bubbles.ogg' var/list/heating_products - var/bypass_heating_products_for_root_type var/accelerant_value = FUEL_VALUE_NONE var/burn_temperature = 100 CELSIUS var/burn_product @@ -363,10 +366,15 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /// If an item has a null paint_verb, it automatically sets it based on material. var/paint_verb = "painted" + /// Chance of a natural wall made of this material dropping a gemstone, if the gemstone_types list is populated. + var/gemstone_chance = 5 + /// Assoc weighted list of gemstone material types to weighting. + var/list/gemstone_types + // Placeholders for light tiles and rglass. /decl/material/proc/reinforce(var/mob/user, var/obj/item/stack/material/used_stack, var/obj/item/stack/material/target_stack, var/use_sheets = 1) if(!used_stack.can_use(use_sheets)) - to_chat(user, SPAN_WARNING("You need need at least one [used_stack.singular_name] to reinforce [target_stack].")) + to_chat(user, SPAN_WARNING("You need at least one [used_stack.singular_name] to reinforce [target_stack].")) return var/decl/material/reinf_mat = used_stack.get_material() @@ -375,7 +383,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) return if(!target_stack.can_use(use_sheets)) - to_chat(user, SPAN_WARNING("You need need at least [use_sheets] [use_sheets == 1 ? target_stack.singular_name : target_stack.plural_name] for reinforcement with \the [used_stack].")) + to_chat(user, SPAN_WARNING("You need at least [use_sheets] [use_sheets == 1 ? target_stack.singular_name : target_stack.plural_name] for reinforcement with \the [used_stack].")) return to_chat(user, SPAN_NOTICE("You reinforce the [target_stack] with [reinf_mat.solid_name].")) @@ -439,7 +447,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) else if(isnull(temperature_damage_threshold)) var/new_temperature_damage_threshold = max(melting_point, boiling_point, heating_point) // Don't let the threshold be lower than the ignition point. - if(!isnull(new_temperature_damage_threshold) && (isnull(ignition_point) || (new_temperature_damage_threshold > ignition_point))) + if(isnull(new_temperature_damage_threshold) && !isnull(ignition_point)) + temperature_damage_threshold = ignition_point + else if(isnull(ignition_point) || (new_temperature_damage_threshold > ignition_point)) temperature_damage_threshold = new_temperature_damage_threshold if(!shard_icon) @@ -558,13 +568,15 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) . += "'[icon_base_natural]' - missing natural shine icon state 'shine[i]'" if(icon_reinf) - if(use_reinf_state) - if(!check_state_in_icon(use_reinf_state, icon_reinf)) - . += "'[icon_reinf]' - missing reinf icon state '[use_reinf_state]'" - else - for(var/i = 0 to 7) - if(!check_state_in_icon("[i]", icon_reinf)) - . += "'[icon_reinf]' - missing directional reinf icon state '[i]'" + var/list/all_reinf_icons = islist(icon_reinf) ? icon_reinf : list(icon_reinf) + for(var/sub_icon in all_reinf_icons) + if(use_reinf_state) + if(!check_state_in_icon(use_reinf_state, sub_icon)) + . += "'[sub_icon]' - missing reinf icon state '[use_reinf_state]'" + else + for(var/i = 0 to 7) + if(!check_state_in_icon(num2text(i), sub_icon)) + . += "'[sub_icon]' - missing directional reinf icon state '[i]'" if(length(color) != 7) . += "invalid color (not #RRGGBB)" @@ -706,12 +718,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /decl/material/proc/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) // Acid melting, cleaner cleaning, etc - if(solvent_power >= MAT_SOLVENT_MILD) - if(istype(O, /obj/item/paper)) + if(solvent_power >= MAT_SOLVENT_MODERATE) + if(istype(O, /obj/item/paper) && amount >= FLUID_MINIMUM_TRANSFER) var/obj/item/paper/paperaffected = O paperaffected.clearpaper() O.visible_message(SPAN_NOTICE("The solution dissolves the ink on the paper."), range = 1) - else if(istype(O, /obj/item/book) && amount >= 5) + else if(istype(O, /obj/item/book) && amount >= FLUID_PUDDLE) var/obj/item/book/affectedbook = O if(affectedbook.can_dissolve_text) affectedbook.dat = null @@ -741,31 +753,30 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // 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(accelerant_value != FUEL_VALUE_NONE && amount && istype(M)) - M.fire_stacks += floor((amount * accelerant_value)/FLAMMABLE_LIQUID_DIVISOR) + M.adjust_fire_intensity(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 +/decl/material/proc/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) // Cleaner cleaning, lube lubbing, etc, all go here if(REAGENT_VOLUME(holder, type) < turf_touch_threshold) return - if(istype(T) && T.simulated) - var/turf/wall/W = T + if(istype(touching_turf) && touching_turf.simulated) if(defoliant) - for(var/obj/effect/overlay/wallrot/E in W) - W.visible_message(SPAN_NOTICE("\The [E] is completely dissolved by the solution!")) - qdel(E) - if(slipperiness != 0 && !T.check_fluid_depth()) // Don't make floors slippery if they have an active fluid on top of them please. + for(var/obj/effect/overlay/wallrot/rot in touching_turf) + touching_turf.visible_message(SPAN_NOTICE("\The [rot] is completely dissolved by the solution!")) + qdel(rot) + if(slipperiness != 0 && !touching_turf.check_fluid_depth()) // Don't make floors slippery if they have an active fluid on top of them please. if(slipperiness < 0) - W.unwet_floor(TRUE) + touching_turf.unwet_floor(TRUE) else if (REAGENT_VOLUME(holder, type) >= slippery_amount) - W.wet_floor(slipperiness) + touching_turf.wet_floor(slipperiness) if(length(vapor_products)) var/volume = REAGENT_VOLUME(holder, type) var/temperature = holder?.my_atom?.temperature || T20C for(var/vapor in vapor_products) - T.assume_gas(vapor, (volume * vapor_products[vapor]), temperature) + touching_turf.assume_gas(vapor, (volume * vapor_products[vapor]), temperature) holder.remove_reagent(type, volume) /decl/material/proc/on_mob_life(var/mob/living/M, var/metabolism_class, var/datum/reagents/holder, var/list/life_dose_tracker) @@ -825,6 +836,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(M.status_flags & GODMODE) return + if(antibiotic_strength) + M.adjust_immunity(-0.1 * antibiotic_strength) + M.add_chemical_effect(CE_ANTIBIOTIC, antibiotic_strength) + if(REAGENT_VOLUME(holder, type) > 10) + M.adjust_immunity(-0.3 * antibiotic_strength) + if(LAZYACCESS(M.chem_doses, type) > 15) + M.adjust_immunity(-0.25 * antibiotic_strength) + if(nutriment_factor || hydration_factor) if(injectable_nutrition) adjust_mob_nutrition(M, removed, holder, CHEM_INJECT) @@ -941,60 +960,60 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) subject.adjust_hydration(effective_power) // Slightly different to other reagent processing - return TRUE to consume the removed amount, FALSE not to consume. -/decl/material/proc/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/proc/affect_touch(var/mob/living/victim, var/removed, var/datum/reagents/holder) SHOULD_CALL_PARENT(TRUE) - if(!istype(M)) + if(!istype(victim)) return FALSE if(radioactivity) - M.apply_damage((radioactivity / 2) * removed, IRRADIATE) + victim.apply_damage((radioactivity / 2) * removed, IRRADIATE) . = TRUE if(dirtiness <= DIRTINESS_STERILE) - if(M.germ_level < INFECTION_LEVEL_TWO) // rest and antibiotics is required to cure serious infections - M.germ_level -= min(removed*20, M.germ_level) - for(var/obj/item/I in M.contents) + if(victim.germ_level < INFECTION_LEVEL_TWO) // rest and antibiotics is required to cure serious infections + victim.germ_level -= min(removed*20, victim.germ_level) + for(var/obj/item/I in victim.contents) I.was_bloodied = null - M.was_bloodied = null + victim.was_bloodied = null . = TRUE // TODO: clean should add the gross reagents washed off to a holder to dump on the loc. if(dirtiness <= DIRTINESS_CLEAN) - for(var/obj/item/thing in M.get_held_items()) + for(var/obj/item/thing in victim.get_held_items()) thing.clean() - var/obj/item/mask = M.get_equipped_item(slot_wear_mask_str) + var/obj/item/mask = victim.get_equipped_item(slot_wear_mask_str) if(mask) mask.clean() - if(ishuman(M)) - var/mob/living/human/H = M - var/obj/item/head = H.get_equipped_item(slot_head_str) + if(ishuman(victim)) + var/mob/living/human/human_victim = victim + var/obj/item/head = human_victim.get_equipped_item(slot_head_str) if(head) head.clean() - var/obj/item/suit = H.get_equipped_item(slot_wear_suit_str) + var/obj/item/suit = human_victim.get_equipped_item(slot_wear_suit_str) if(suit) suit.clean() else - var/obj/item/uniform = H.get_equipped_item(slot_w_uniform_str) + var/obj/item/uniform = human_victim.get_equipped_item(slot_w_uniform_str) if(uniform) uniform.clean() - var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) + var/obj/item/shoes = human_victim.get_equipped_item(slot_shoes_str) if(shoes) shoes.clean() else - H.clean() - return - M.clean() + human_victim.clean() + else + victim.clean() - 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)) + if(solvent_power > MAT_SOLVENT_NONE && removed >= solvent_melt_dose && victim.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)) . = TRUE -/decl/material/proc/affect_overdose(mob/living/M, total_dose) // Overdose effect. Doesn't happen instantly. - M.add_chemical_effect(CE_TOXIN, 1) - M.take_damage(REM, TOX) +/decl/material/proc/affect_overdose(mob/living/victim, total_dose) // Overdose effect. Doesn't happen instantly. + victim.add_chemical_effect(CE_TOXIN, 1) + victim.take_damage(REM, TOX) /decl/material/proc/initialize_data(list/newdata) // Called when the reagent is first added to a reagents datum. . = newdata @@ -1048,6 +1067,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(length(tastes)) LAZYSET(., DATA_TASTE, tastes) + // Blend our extra_colour... + var/new_extra_color = newdata?[DATA_EXTRA_COLOR] + if(new_extra_color) + .[DATA_EXTRA_COLOR] = BlendRGBasHSV(new_extra_color, .[DATA_EXTRA_COLOR], new_fraction) + /decl/material/proc/explosion_act(obj/item/chems/holder, severity) SHOULD_CALL_PARENT(TRUE) . = TRUE @@ -1166,8 +1190,28 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) return data_color return color +/decl/material/proc/get_reagent_overlay_color(datum/reagents/holder) + var/list/rdata = REAGENT_DATA(holder, type) + return LAZYACCESS(rdata, DATA_EXTRA_COLOR) || get_reagent_color(holder) + num2hex(opacity * 255) + /decl/material/proc/can_hold_sharpness() return hardness > MAT_VALUE_FLEXIBLE /decl/material/proc/can_hold_edge() return hardness > MAT_VALUE_FLEXIBLE + +// TODO: expand this to more than just Actual Poison. +/decl/material/proc/is_unsafe_to_drink(mob/user) + return toxicity > 0 + +/// Used for material-dependent effects on stain dry. +/// Return TRUE to skip default drying handling. +/decl/material/proc/handle_stain_dry(obj/effect/decal/cleanable/blood/stain) + return FALSE + +/// Returns (in deciseconds) how long until dry() will be called on this stain, +/// or null to use the stain's default. +/// If 0 is returned, it dries instantly. +/// If any value below 0 is returned, it doesn't start processing. +/decl/material/proc/get_time_to_dry_stain(obj/effect/decal/cleanable/blood/stain) + return initial(stain.time_to_dry) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm b/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm index ae855b451f1..bb527d7123d 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_chemistry.dm @@ -25,3 +25,7 @@ value = 0.1 slipperiness = 80 exoplanet_rarity_gas = MAT_RARITY_EXOTIC + +// Prevent oil stains from drying. +/decl/material/liquid/lube/get_time_to_dry_stain(obj/effect/decal/cleanable/blood/stain) + return -1 \ No newline at end of file diff --git a/code/modules/materials/definitions/liquids/materials_liquid_mundane.dm b/code/modules/materials/definitions/liquids/materials_liquid_mundane.dm new file mode 100644 index 00000000000..97cfe6b65f9 --- /dev/null +++ b/code/modules/materials/definitions/liquids/materials_liquid_mundane.dm @@ -0,0 +1,12 @@ +/decl/material/liquid/mucus + name = "mucus" + uid = "chem_mucus" + lore_text = "A gooey semi-liquid produced by a wide variety of organisms. In some, it's associated with disease and illness." + taste_description = "slime" + color = COLOR_LIQUID_WATER + opacity = 0.5 + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + +/decl/material/liquid/mucus/handle_stain_dry(obj/effect/decal/cleanable/blood/stain) + qdel(stain) + return TRUE // skip blood handling \ No newline at end of file diff --git a/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm b/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm index bbfa9096bfe..ec78c02b460 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm @@ -1,6 +1,6 @@ /decl/material/liquid/acid - name = "sulphuric acid" - uid = "liquid_sulphuric_acid" + name = "sulfuric acid" + uid = "liquid_sulfuric_acid" lore_text = "A very corrosive mineral acid with the molecular formula H2SO4." taste_description = "acid" color = "#db5008" diff --git a/code/modules/materials/definitions/liquids/materials_liquid_soup.dm b/code/modules/materials/definitions/liquids/materials_liquid_soup.dm index 364ccab4bfe..ff7723e0ae4 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_soup.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_soup.dm @@ -84,6 +84,7 @@ /decl/material/liquid/nutriment/soup/simple name = "soup" liquid_name = "soup" + codex_name = "simple soup" solid_name = "powdered soup" uid = "liquid_soup_simple" mask_name_suffix = "soup" @@ -104,7 +105,7 @@ nutriment_factor = 10 glass_name = "stew" reagent_overlay_base = "reagent_base_chunky" - opacity = 1 + opacity = 1.0 /decl/material/liquid/nutriment/soup/chili name = "chili" @@ -116,7 +117,7 @@ glass_name = "chili" nutriment_factor = 10 reagent_overlay_base = "reagent_base_chunky" - opacity = 1 + opacity = 1.0 /decl/material/liquid/nutriment/soup/curry name = "curry" @@ -127,4 +128,16 @@ reagent_overlay = "soup_dumplings" glass_name = "curry" nutriment_factor = 10 - opacity = 1 + opacity = 1.0 + +/decl/material/liquid/nutriment/soup/noodle + name = "noodle soup" + liquid_name = "noodle soup" + solid_name = "noodles" + uid = "liquid_soup_noodles" + mask_name_suffix = "noodle soup" + reagent_overlay = "soup_chunks" // todo: maybe differentiate meat vs veggie noodle soup + glass_name = "noodle soup" + nutriment_factor = 10 + color = COLOR_POLISHED_BRASS + opacity = 0.7 diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 2b8f8eca63c..3b42ee375e4 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -128,16 +128,14 @@ ..() ADJ_STATUS(M, STAT_CONFUSE, 1.5) -/decl/material/liquid/heartstopper/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/heartstopper/affect_overdose(mob/living/victim, total_dose) ..() - if(ishuman(M)) - var/mob/living/human/H = M - if(H.stat != UNCONSCIOUS) - if(H.ticks_since_last_successful_breath >= 10) - H.ticks_since_last_successful_breath = max(10, H.ticks_since_last_successful_breath-10) - H.take_damage(2, OXY) - SET_STATUS_MAX(H, STAT_WEAK, 10) - M.add_chemical_effect(CE_NOPULSE, 1) + if(victim.stat != UNCONSCIOUS) + if(victim.ticks_since_last_successful_breath >= 10) + victim.ticks_since_last_successful_breath = max(10, victim.ticks_since_last_successful_breath-10) + victim.take_damage(2, OXY) + SET_STATUS_MAX(victim, STAT_WEAK, 10) + victim.add_chemical_effect(CE_NOPULSE, 1) /decl/material/liquid/zombiepowder name = "zombie powder" @@ -218,9 +216,9 @@ color = "#140b30" toxicity = 4 heating_products = list( - /decl/material/liquid/acetone = 0.4, - /decl/material/solid/carbon = 0.4, - /decl/material/liquid/ethanol = 0.2 + /decl/material/liquid/acetone = 0.4, + /decl/material/solid/carbon = 0.4, + /decl/material/liquid/alcohol/ethanol = 0.2 ) heating_point = 145 CELSIUS heating_message = "separates." diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index 76caa77b46f..efb84cdf8e7 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -48,22 +48,23 @@ affect_blood(M, removed, holder) #define WATER_LATENT_HEAT 9500 // How much heat is removed when applied to a hot turf, in J/unit (9500 makes 120 u of water roughly equivalent to 2L -/decl/material/liquid/water/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/water/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) ..() - if(!istype(T)) + if(!istype(touching_turf)) return - var/datum/gas_mixture/environment = T.return_air() + var/datum/gas_mixture/environment = touching_turf.return_air() var/min_temperature = T20C + rand(0, 20) // Room temperature + some variance. An actual diminishing return would be better, but this is *like* that. In a way. . This has the potential for weird behavior, but I says fuck it. Water grenades for everyone. - var/hotspot = (locate(/obj/fire) in T) - if(hotspot && !isspaceturf(T)) - var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles) + // TODO: Cannot for the life of me work out what this is doing or why it's reducing the air temp by 2000; shouldn't it just be using environment? + var/hotspot = (locate(/obj/fire) in touching_turf) + if(hotspot && !isspaceturf(touching_turf)) + var/datum/gas_mixture/lowertemp = touching_turf.remove_air(touching_turf:air:total_moles) lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0) lowertemp.react() - T.assume_air(lowertemp) + touching_turf.assume_air(lowertemp) qdel(hotspot) var/volume = REAGENT_VOLUME(holder, type) @@ -71,11 +72,11 @@ var/removed_heat = clamp(volume * WATER_LATENT_HEAT, 0, -environment.get_thermal_energy_change(min_temperature)) environment.add_thermal_energy(-removed_heat) if (prob(5) && environment && environment.temperature > T100C) - T.visible_message("The water sizzles as it lands on \the [T]!") + touching_turf.visible_message(SPAN_NOTICE("The water sizzles as it lands on \the [touching_turf]!")) var/list/data = REAGENT_DATA(holder, type) if(LAZYACCESS(data, "holy")) - T.turf_flags |= TURF_FLAG_HOLY + touching_turf.turf_flags |= TURF_FLAG_HOLY /decl/material/liquid/water/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) ..() @@ -87,11 +88,11 @@ /decl/material/liquid/water/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) ..() if(istype(M)) - var/needed = M.fire_stacks * 10 + var/needed = M.get_fire_intensity() * 10 if(amount > needed) - M.fire_stacks = 0 - M.ExtinguishMob() + M.set_fire_intensity(0) + M.extinguish_fire() holder.remove_reagent(type, needed) else - M.adjust_fire_stacks(-(amount / 10)) + M.adjust_fire_intensity(-(amount / 10)) holder.remove_reagent(type, amount) diff --git a/code/modules/materials/definitions/solids/_mat_solid.dm b/code/modules/materials/definitions/solids/_mat_solid.dm index 5e7797cd07d..88085e5c1d9 100644 --- a/code/modules/materials/definitions/solids/_mat_solid.dm +++ b/code/modules/materials/definitions/solids/_mat_solid.dm @@ -22,4 +22,4 @@ solution_name = "[name] solution" if(!ore_compresses_to) ore_compresses_to = type - . = ..() \ No newline at end of file + . = ..() diff --git a/code/modules/materials/definitions/solids/materials_solid_butchery.dm b/code/modules/materials/definitions/solids/materials_solid_butchery.dm index 666d18c6517..f1bdababb12 100644 --- a/code/modules/materials/definitions/solids/materials_solid_butchery.dm +++ b/code/modules/materials/definitions/solids/materials_solid_butchery.dm @@ -24,6 +24,8 @@ reagent_overlay = "soup_chunks" nutriment_factor = 10 allergen_flags = ALLERGEN_MEAT + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 /decl/material/solid/organic/meat/egg name = "egg yolk" diff --git a/code/modules/materials/definitions/solids/materials_solid_exotic.dm b/code/modules/materials/definitions/solids/materials_solid_exotic.dm index 142cd8be044..3f40fc95d95 100644 --- a/code/modules/materials/definitions/solids/materials_solid_exotic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_exotic.dm @@ -100,10 +100,10 @@ if(prob(10 * accelerant_value)) M.handle_contaminants() -/decl/material/solid/supermatter +/decl/material/solid/exotic_matter name = "exotic matter" uid = "solid_exotic_matter" - 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." + lore_text = "Exotic matter is a non-baryonic form of matter, which features heavily in all kinds of fringe physics-defying technology." color = "#ffff00" radioactivity = 20 stack_origin_tech = @'{"wormholes":2,"materials":6,"exoticmatter":4}' diff --git a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm index f0718ad4ccf..dcb3b5d38a6 100644 --- a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm +++ b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm @@ -1,54 +1,69 @@ /decl/material/solid/gemstone - name = null - flags = MAT_FLAG_UNMELTABLE - cut_delay = 60 - color = COLOR_DIAMOND - opacity = 0.4 - shard_type = SHARD_SHARD - tableslam_noise = 'sound/effects/Glasshit.ogg' - reflectiveness = MAT_VALUE_MIRRORED - conductive = 0 - ore_icon_overlay = "gems" - default_solid_form = /obj/item/stack/material/gemstone - abstract_type = /decl/material/solid/gemstone - sound_manipulate = 'sound/foley/pebblespickup1.ogg' - sound_dropped = 'sound/foley/pebblesdrop1.ogg' + flags = MAT_FLAG_UNMELTABLE + cut_delay = 60 + color = COLOR_DIAMOND + opacity = 0.4 + shard_type = SHARD_SHARD + tableslam_noise = 'sound/effects/Glasshit.ogg' + conductive = 0 + ore_icon_overlay = "gems" + default_solid_form = /obj/item/stack/material/gemstone + abstract_type = /decl/material/solid/gemstone + sound_manipulate = 'sound/foley/pebblespickup1.ogg' + sound_dropped = 'sound/foley/pebblesdrop1.ogg' + exoplanet_rarity_plant = MAT_RARITY_UNCOMMON + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + dissolves_in = MAT_SOLVENT_IMMUNE + dissolves_into = null + hardness = MAT_VALUE_VERY_HARD + reflectiveness = MAT_VALUE_VERY_SHINY + construction_difficulty = MAT_VALUE_VERY_HARD_DIY /decl/material/solid/gemstone/diamond - 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}' - hardness = MAT_VALUE_VERY_HARD + 20 - construction_difficulty = MAT_VALUE_VERY_HARD_DIY - ore_name = "rough diamonds" - ore_result_amount = 1 - ore_spread_chance = 10 - ore_scan_icon = "mineral_rare" - xarch_source_mineral = /decl/material/gas/ammonia - value = 1.8 - sparse_material_weight = 5 - rich_material_weight = 5 - ore_type_value = ORE_PRECIOUS - ore_data_value = 2 - exoplanet_rarity_plant = MAT_RARITY_UNCOMMON - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - dissolves_in = MAT_SOLVENT_IMMUNE - dissolves_into = null + 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}' + hardness = MAT_VALUE_VERY_HARD + 20 + ore_name = "rough diamonds" + ore_result_amount = 1 + ore_spread_chance = 10 + ore_scan_icon = "mineral_rare" + xarch_source_mineral = /decl/material/gas/ammonia + value = 1.8 + sparse_material_weight = 5 + rich_material_weight = 5 + ore_type_value = ORE_PRECIOUS + ore_data_value = 2 /decl/material/solid/gemstone/crystal - name = "crystal" - uid = "solid_crystal" - hardness = MAT_VALUE_VERY_HARD - reflectiveness = MAT_VALUE_VERY_SHINY + name = "crystal" + uid = "solid_crystal" + value = 2 hidden_from_codex = TRUE - value = 2 - exoplanet_rarity_plant = MAT_RARITY_UNCOMMON - exoplanet_rarity_gas = MAT_RARITY_NOWHERE - dissolves_in = MAT_SOLVENT_IMMUNE - dissolves_into = null + +/decl/material/solid/gemstone/ruby + name = "ruby" + lore_text = "A rich red stone sometimes found in marble." + uid = "solid_ruby" + value = 1.6 + color = "#d00000" + +/decl/material/solid/gemstone/sapphire + name = "sapphire" + lore_text = "A deep blue gemstone sometimes found in clay or other sediment." + uid = "solid_sapphite" + value = 1.6 + color = "#2983de" + +/decl/material/solid/gemstone/topaz + name = "topaz" + lore_text = "A golden gemstone sometimes found in granite." + uid = "solid_topaz" + value = 1.6 + color = "#f7b92d" diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index dd69df88531..b37ec038e84 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -34,13 +34,41 @@ liquid_name = "water" solid_name = "snow" gas_name = "steam" + adjective_name = "snow" color = COLOR_WHITE codex_name = null uid = "solid_snow" hardness = MAT_VALUE_MALLEABLE dug_drop_type = /obj/item/stack/material/ore/handful - default_solid_form = /obj/item/stack/material/ore/handful - can_backfill_turf_type = /turf/floor/snow + default_solid_form = /obj/item/stack/material/lump/large + can_backfill_floor_type = /decl/flooring/snow + +/decl/material/solid/ice/snow/handle_stain_dry(obj/effect/decal/cleanable/blood/stain) + var/ambient_temperature = stain.get_ambient_temperature() + if(ambient_temperature < melting_point) + // reset the drying timer, it's not warm enough to melt + stain.start_drying() // you'd better not ever melt instantly below your melting point, or else this will cause infinite recursion + else if(ambient_temperature > boiling_point) + qdel(src) // melt instantly, no questions asked + else + if(--stain.amount < 0) // reduce the amount of snow (amount is always 0 for footprints currently, but maybe someday?) + qdel(src) + return TRUE // skip base blood handling + +// For snowy footprints melting. +/decl/material/solid/ice/snow/get_time_to_dry_stain(obj/effect/decal/cleanable/blood/stain) + // Attempt to melt once every two minutes at T20C, + // and every 5 minutes at T0C, trying to 'fake' latent heat. + // Above T20C it scales based on (temperature / T20C). + // At or above the boiling point it melts instantly. + // This doesn't mean it WILL melt at that point, just that it'll attempt to. + var/ambient_temperature = max(stain.get_ambient_temperature(), melting_point) + if(ambient_temperature >= boiling_point) + return 0 // dry instantly + if(ambient_temperature < melting_point) + return 5 MINUTES + // convert from kelvins to celsius by subtracting the 0C point in Kelvins + return Interpolate(5 MINUTES, 2 MINUTES, (ambient_temperature - T0C) / 20) / (stain.amount + 1) // Undo the scaling done by blood. /decl/material/solid/ice/aspium name = "aspium" @@ -117,9 +145,9 @@ liquid_name = null gas_name = null heating_products = list( - /decl/material/gas/ammonia = 0.05, - /decl/material/liquid/water = 0.55, - /decl/material/liquid/ethanol = 0.4 + /decl/material/gas/ammonia = 0.05, + /decl/material/liquid/water = 0.55, + /decl/material/liquid/alcohol/ethanol = 0.4 ) uid = "solid_ice_ediroite" value = 0.2 diff --git a/code/modules/materials/definitions/solids/materials_solid_metal.dm b/code/modules/materials/definitions/solids/materials_solid_metal.dm index d5a79687013..1b22aae712d 100644 --- a/code/modules/materials/definitions/solids/materials_solid_metal.dm +++ b/code/modules/materials/definitions/solids/materials_solid_metal.dm @@ -78,6 +78,7 @@ /decl/material/solid/metal/gold name = "gold" + adjective_name = "golden" 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." @@ -486,3 +487,4 @@ taste_mult = 0 //no taste color = "#dcdcdc" value = 0.5 + melting_point = 3422 CELSIUS diff --git a/code/modules/materials/definitions/solids/materials_solid_mineral.dm b/code/modules/materials/definitions/solids/materials_solid_mineral.dm index 2be84c6c5df..bd0b1ca1ad4 100644 --- a/code/modules/materials/definitions/solids/materials_solid_mineral.dm +++ b/code/modules/materials/definitions/solids/materials_solid_mineral.dm @@ -68,6 +68,7 @@ boiling_point = 2504 color = "#effffe" reflectiveness = MAT_VALUE_SHINY + hardness = MAT_VALUE_VERY_HARD - 5 // Hard enough to whet steel. sparse_material_weight = 3 rich_material_weight = 1 dissolves_into = list( @@ -181,7 +182,7 @@ /decl/material/solid/potassium = 1 ) -/decl/material/solid/potassium/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/solid/potash/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() var/volume = REAGENT_VOLUME(holder, type) if(volume > 3) @@ -234,7 +235,7 @@ ) dug_drop_type = /obj/item/stack/material/ore/handful default_solid_form = /obj/item/stack/material/ore/handful - can_backfill_turf_type = /turf/floor/rock/sand + can_backfill_floor_type = /decl/flooring/sand /decl/material/solid/clay name = "clay" @@ -257,7 +258,9 @@ melting_point = null // Clay is already almost a liquid... // lower than the temperature expected from a kiln so that clay can be used to make bricks to make a high-temperature kiln. bakes_into_at_temperature = 950 CELSIUS - can_backfill_turf_type = /turf/floor/clay + can_backfill_floor_type = /decl/flooring/clay + gemstone_chance = 0.01 + gemstone_types = list(/decl/material/solid/gemstone/sapphire = 1) /decl/material/solid/soil name = "soil" @@ -272,9 +275,9 @@ dirtiness = 30 dug_drop_type = /obj/item/stack/material/lump/large tillable = TRUE - can_backfill_turf_type = list( - /turf/floor/mud, - /turf/floor/dirt + can_backfill_floor_type = list( + /decl/flooring/mud, + /decl/flooring/dirt ) /decl/material/solid/hematite @@ -285,7 +288,7 @@ /decl/material/solid/metal/iron = 0.8, /decl/material/solid/slag = 0.2 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_result_amount = 2 @@ -330,7 +333,7 @@ /decl/material/solid/metal/silver = 0.4, /decl/material/solid/slag = 0.2 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_result_amount = 2 @@ -352,7 +355,7 @@ /decl/material/solid/metal/copper = 0.1, /decl/material/solid/slag = 0.1 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_result_amount = 2 @@ -379,7 +382,7 @@ /decl/material/solid/metal/copper = 0.6, /decl/material/solid/slag = 0.4 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_result_amount = 2 @@ -439,7 +442,7 @@ /decl/material/solid/metal/tungsten = 0.2, /decl/material/solid/slag = 0.1 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_name = "cassiterite" @@ -467,7 +470,7 @@ /decl/material/solid/metal/iron = 0.2, /decl/material/solid/slag = 0.5 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_name = "wolframite" @@ -496,7 +499,7 @@ /decl/material/solid/glass = 0.1, /decl/material/solid/slag = 0.3 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_name = "sperrylite" @@ -525,7 +528,7 @@ /decl/material/solid/metal/iron = 0.1, /decl/material/solid/slag = 0.2 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_name = "sphalerite" @@ -554,7 +557,7 @@ /decl/material/solid/metal/silver = 0.1, /decl/material/solid/slag = 0.1 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_name = "galena" @@ -582,7 +585,7 @@ /decl/material/solid/metal/silver = 0.3, /decl/material/solid/slag = 0.1 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_name = "calaverite" @@ -609,7 +612,7 @@ /decl/material/solid/metal/lead = 0.4, /decl/material/solid/slag = 0.3 ) - heating_point = GENERIC_SMELTING_HEAT_POINT + heating_point = LOW_SMELTING_HEAT_POINT heating_sound = null heating_message = null ore_name = "crocoite" diff --git a/code/modules/materials/definitions/solids/materials_solid_organic.dm b/code/modules/materials/definitions/solids/materials_solid_organic.dm index b410f85be58..26d720a8814 100644 --- a/code/modules/materials/definitions/solids/materials_solid_organic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_organic.dm @@ -3,6 +3,7 @@ ignition_point = T0C+500 // Based on loose ignition temperature of plastic accelerant_value = 0.1 burn_product = /decl/material/gas/carbon_monoxide + boiling_point = null melting_point = null compost_value = 1 diff --git a/code/modules/materials/definitions/solids/materials_solid_stone.dm b/code/modules/materials/definitions/solids/materials_solid_stone.dm index 6334b03f1b8..acf1e65ed86 100644 --- a/code/modules/materials/definitions/solids/materials_solid_stone.dm +++ b/code/modules/materials/definitions/solids/materials_solid_stone.dm @@ -51,6 +51,7 @@ brute_armor = 15 explosion_resistance = 15 integrity = 500 //granite is very strong + gemstone_types = list(/decl/material/solid/gemstone/topaz = 1) dissolves_into = list( /decl/material/solid/silicon = 0.75, /decl/material/solid/bauxite = 0.15, @@ -88,6 +89,7 @@ brute_armor = 3 integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system construction_difficulty = MAT_VALUE_HARD_DIY + gemstone_types = list(/decl/material/solid/gemstone/ruby = 1) /decl/material/solid/stone/basalt name = "basalt" diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index 01629ab0acf..e4cb6575b1c 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -1,10 +1,6 @@ /decl/material/solid/organic/wood - name = "oak" - uid = "solid_wood" - liquid_name = "wood pulp" - adjective_name = "oaken" - lore_text = "Oak timber is strong yet simple to carve, making it a fine choice for wooden handicrafts." - adjective_name = "oaken" + name = "wood" + abstract_type = /decl/material/solid/organic/wood color = WOOD_COLOR_GENERIC integrity = 75 icon_base = 'icons/turf/walls/wood.dmi' @@ -16,6 +12,14 @@ 'icons/turf/walls/log.dmi' = TRUE, 'icons/turf/walls/metal.dmi' = TRUE ) + icon_reinf = list( + 'icons/turf/walls/reinforced_timber.dmi', + 'icons/turf/walls/reinforced_timber_alt_1.dmi', + 'icons/turf/walls/reinforced_timber_alt_2.dmi', + 'icons/turf/walls/reinforced_timber_alt_3.dmi', + 'icons/turf/walls/reinforced_timber_alt_4.dmi' + ) + use_reinf_state = null table_icon_base = "wood" bench_icon = 'icons/obj/structures/wood_benches.dmi' pew_icon = 'icons/obj/structures/wood_pews.dmi' @@ -46,8 +50,16 @@ sound_manipulate = 'sound/foley/woodpickup1.ogg' sound_dropped = 'sound/foley/wooddrop1.ogg' compost_value = 0.2 - temperature_burn_milestone_material = /decl/material/solid/organic/wood paint_verb = "stained" + liquid_name = "wood pulp" + +/decl/material/solid/organic/wood/oak + name = "oak" + uid = "solid_wood" + adjective_name = "oaken" + lore_text = "Oak timber is strong yet simple to carve, making it a fine choice for wooden handicrafts." + adjective_name = "oaken" + temperature_burn_milestone_material = /decl/material/solid/organic/wood/oak // Wood is hard but can't really give it an edge. /decl/material/solid/organic/wood/can_hold_edge() @@ -133,3 +145,53 @@ /decl/material/liquid/heartstopper = 0.1 ) value = 1.8 + +// Used solely to give the old smooth table icons for spacer tables. +// Easy to work, not very strong or valuable. +/decl/material/solid/organic/wood/chipboard + name = "oak chipboard" + adjective_name = "oak laminate" + uid = "solid_wood_chipboard_oak" + lore_text = "Also known as particle board, this material is made from various kinds of oak wood chips and resin, with a plastic laminate." + bench_icon = 'icons/obj/structures/benches.dmi' + pew_icon = 'icons/obj/structures/pews.dmi' + door_icon_base = "metal" + table_icon_base = "metal" + color = WOOD_COLOR_GENERIC + value = 1.1 + default_solid_form = /obj/item/stack/material/sheet + +/decl/material/solid/organic/wood/chipboard/maple + name = "maple chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of maple wood chips and resin, with a plastic laminate." + adjective_name = "maple laminate" + uid = "solid_wood_chipboard_maple" + color = WOOD_COLOR_PALE + +/decl/material/solid/organic/wood/chipboard/mahogany + name = "mahogany chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of mahogany wood chips and resin, with a plastic laminate." + adjective_name = "mahogany laminate" + uid = "solid_wood_chipboard_mahogany" + color = WOOD_COLOR_RICH + +/decl/material/solid/organic/wood/chipboard/ebony + name = "ebony chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of ebony wood chips and resin, with a plastic laminate." + adjective_name = "ebony laminate" + uid = "solid_wood_chipboard_ebony" + color = WOOD_COLOR_BLACK + +/decl/material/solid/organic/wood/chipboard/walnut + name = "walnut chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of walnut wood chips and resin, with a plastic laminate." + adjective_name = "walnut laminate" + uid = "solid_wood_chipboard_walnut" + color = WOOD_COLOR_CHOCOLATE + +/decl/material/solid/organic/wood/chipboard/yew + name = "yew chipboard" + lore_text = "Also known as particle board, this material is made from various kinds of yew wood chips and resin, with a plastic laminate." + adjective_name = "yew laminate" + uid = "solid_wood_chipboard_yew" + color = WOOD_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/materials/material_sheets_mapping.dm b/code/modules/materials/material_sheets_mapping.dm index e68df296d77..16494ababf8 100644 --- a/code/modules/materials/material_sheets_mapping.dm +++ b/code/modules/materials/material_sheets_mapping.dm @@ -64,14 +64,14 @@ STACK_SUBTYPES(steel, "steel", solid/metal/stee STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, sheet/shiny, null) STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, sheet/reinforced, null) STACK_SUBTYPES(plasteel, "plasteel", solid/metal/plasteel, sheet/reinforced, null) -STACK_SUBTYPES(wood, "wood", solid/organic/wood, plank, null) +STACK_SUBTYPES(wood, "wood", solid/organic/wood/oak, 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(wood, "wood", solid/organic/wood, log, null) +STACK_SUBTYPES(wood, "wood", solid/organic/wood/oak, log, null) STACK_SUBTYPES(mahogany, "mahogany", solid/organic/wood/mahogany, log, null) STACK_SUBTYPES(maple, "maple", solid/organic/wood/maple, log, null) STACK_SUBTYPES(ebony, "ebony", solid/organic/wood/ebony, log, null) @@ -115,7 +115,19 @@ STACK_SUBTYPES(plastic, "plastic", solid/organic/pl 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, rods, null) +STACK_SUBTYPES(plastic, "plastic", solid/organic/plastic, rods, null) +STACK_SUBTYPES(aluminium, "aluminium", solid/metal/aluminium, rods, null) +STACK_SUBTYPES(titanium, "titanium", solid/metal/titanium, rods, null) + STACK_SUBTYPES(cotton, "cotton", solid/organic/cloth, thread, null) STACK_SUBTYPES(dried_gut, "dried gut", solid/organic/leather/gut, thread, null) +STACK_SUBTYPES(chipboard_oak, "oak chipboard", solid/organic/wood/chipboard, sheet, null) +STACK_SUBTYPES(chipboard_maple, "maple chipboard", solid/organic/wood/chipboard/maple, sheet, null) +STACK_SUBTYPES(chipboard_mahogany, "mahogany chipboard", solid/organic/wood/chipboard/mahogany, sheet, null) +STACK_SUBTYPES(chipboard_ebony, "ebony chipboard", solid/organic/wood/chipboard/ebony, sheet, null) +STACK_SUBTYPES(chipboard_walnut, "walnut chipboard", solid/organic/wood/chipboard/walnut, sheet, null) +STACK_SUBTYPES(chipboard_yew, "yew chipboard", solid/organic/wood/chipboard/yew, sheet, null) + #undef STACK_SUBTYPES \ No newline at end of file diff --git a/code/modules/materials/material_stack_misc.dm b/code/modules/materials/material_stack_misc.dm index 18949aeab5e..cd0e834821c 100644 --- a/code/modules/materials/material_stack_misc.dm +++ b/code/modules/materials/material_stack_misc.dm @@ -156,9 +156,13 @@ /obj/item/stack/material/bundle/grass material = /decl/material/solid/organic/plantmatter/grass + drying_wetness = 50 + dried_type = /obj/item/stack/material/bundle/grass/dry /obj/item/stack/material/bundle/grass/dry material = /decl/material/solid/organic/plantmatter/grass/dry + drying_wetness = null + dried_type = null /obj/item/stack/material/strut name = "struts" @@ -169,14 +173,3 @@ max_icon_state = "sheet-strut-max" stack_merge_type = /obj/item/stack/material/strut crafting_stack_type = /obj/item/stack/material/strut - -/obj/item/stack/material/strut/cyborg - name = "metal strut synthesizer" - desc = "A device that makes metal strut." - gender = NEUTER - matter = null - uses_charge = 1 - charge_costs = list(500) - material = /decl/material/solid/metal/steel - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE diff --git a/code/modules/materials/material_synth.dm b/code/modules/materials/material_synth.dm index 4aa562ea6a1..26d3323a81c 100644 --- a/code/modules/materials/material_synth.dm +++ b/code/modules/materials/material_synth.dm @@ -37,7 +37,7 @@ /obj/item/stack/material/cyborg/wood name = "cyborg wood synthesiser" icon_state = "sheet-wood" - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/stack/material/cyborg/glass name = "cyborg glass synthesiser" diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm index 4d8016e7138..e60ba072403 100644 --- a/code/modules/mechs/components/body.dm +++ b/code/modules/mechs/components/body.dm @@ -50,6 +50,21 @@ "[WEST]" = list("x" = 8, "y" = 0) ) ) + if(pilot_coverage >= 100) //Open cockpits dont get to have air + cockpit = new + cockpit.volume = 200 + if(loc) + var/datum/gas_mixture/air = loc.return_air() + if(air) + //Essentially at this point its like we created a vacuum, but realistically making a bottle doesnt actually increase volume of a room and neither should a mech + for(var/g in air.gas) + cockpit.gas[g] = (air.gas[g] / air.volume) * cockpit.volume + + cockpit.temperature = air.temperature + cockpit.update_values() + + air_supply = new /obj/machinery/portable_atmospherics/canister/air(src) + storage_compartment = new(src) /obj/item/mech_component/chassis/Destroy() QDEL_NULL(cell) @@ -74,24 +89,6 @@ if(!m_armour) to_chat(user, SPAN_WARNING("It is missing exosuit armour plating.")) -/obj/item/mech_component/chassis/Initialize() - . = ..() - if(pilot_coverage >= 100) //Open cockpits dont get to have air - cockpit = new - cockpit.volume = 200 - if(loc) - var/datum/gas_mixture/air = loc.return_air() - if(air) - //Essentially at this point its like we created a vacuum, but realistically making a bottle doesnt actually increase volume of a room and neither should a mech - for(var/g in air.gas) - cockpit.gas[g] = (air.gas[g] / air.volume) * cockpit.volume - - cockpit.temperature = air.temperature - cockpit.update_values() - - air_supply = new /obj/machinery/portable_atmospherics/canister/air(src) - storage_compartment = new(src) - /obj/item/mech_component/chassis/proc/update_air(var/take_from_supply) var/changed diff --git a/code/modules/mechs/components/frame.dm b/code/modules/mechs/components/frame.dm index 79dcade3a3a..fd03301f1e8 100644 --- a/code/modules/mechs/components/frame.dm +++ b/code/modules/mechs/components/frame.dm @@ -75,7 +75,7 @@ // Removing components. if(IS_CROWBAR(thing)) if(is_reinforced == FRAME_REINFORCED) - if(!do_after(user, 5 * user.skill_delay_mult(SKILL_DEVICES)) || !material) + if(!user.do_skilled(0.5 SECONDS, SKILL_DEVICES, src) || !material) return TRUE user.visible_message(SPAN_NOTICE("\The [user] crowbars the reinforcement off \the [src].")) material.create_object(src.loc, 10) @@ -162,7 +162,7 @@ user.visible_message("\The [user] begins wiring \the [src]...") - if(!do_after(user, 30 * user.skill_delay_mult(SKILL_ELECTRICAL))) + if(!user.do_skilled(3 SECONDS, SKILL_ELECTRICAL, src)) return TRUE if(!CC || !user || !src || CC.get_amount() < 10 || is_wired) @@ -180,7 +180,7 @@ user.visible_message("\The [user] begins adjusting the wiring inside \the [src]...") var/last_wiring_state = is_wired - if(!do_after(user, 30 * user.skill_delay_mult(SKILL_ELECTRICAL)) || last_wiring_state != is_wired) + if(!user.do_skilled(3 SECONDS, SKILL_ELECTRICAL, src) || last_wiring_state != is_wired) return TRUE visible_message("\The [user] [(is_wired == FRAME_WIRED_ADJUSTED) ? "snips some of" : "neatens"] the wiring in \the [src].") @@ -197,9 +197,9 @@ to_chat(user, SPAN_WARNING("You need at least ten sheets to reinforce \the [src].")) return TRUE - visible_message("\The [user] begins layering the interior of the \the [src] with \the [M].") + visible_message("\The [user] begins layering the interior of \the [src] with \the [M].") - if(!do_after(user, 30 * user.skill_delay_mult(SKILL_DEVICES)) || is_reinforced) + if(!user.do_skilled(3 SECONDS, SKILL_DEVICES, src) || is_reinforced) return TRUE visible_message("\The [user] reinforces \the [src] with \the [M].") @@ -243,7 +243,7 @@ var/last_reinforced_state = is_reinforced visible_message("\The [user] begins welding the metal reinforcement inside \the [src].") - if(!do_after(user, 20 * user.skill_delay_mult(SKILL_DEVICES)) || last_reinforced_state != is_reinforced) + if(!user.do_skilled(2 SECONDS, SKILL_DEVICES, src) || last_reinforced_state != is_reinforced) return TRUE visible_message("\The [user] [(is_reinforced == FRAME_REINFORCED_WELDED) ? "unwelds the reinforcement from" : "welds the reinforcement into"] \the [src].") @@ -301,7 +301,7 @@ return 0 if(user) visible_message(SPAN_NOTICE("\The [user] begins installing \the [thing] into \the [src].")) - if(!user.canUnEquip(thing) || !do_after(user, 30 * user.skill_delay_mult(SKILL_DEVICES)) || user.get_active_held_item() != thing) + if(!user.canUnEquip(thing) || !user.do_skilled(3 SECONDS, SKILL_DEVICES, src) || user.get_active_held_item() != thing) return if(!user.try_unequip(thing)) return @@ -313,7 +313,7 @@ /obj/structure/heavy_vehicle_frame/proc/uninstall_component(var/obj/item/component, var/mob/user) if(!istype(component) || (component.loc != src) || !istype(user)) return FALSE - if(!do_after(user, 40 * user.skill_delay_mult(SKILL_DEVICES)) || component.loc != src) + if(!user.do_skilled(4 SECONDS, SKILL_DEVICES, src) || component.loc != src) return FALSE user.visible_message(SPAN_NOTICE("\The [user] crowbars \the [component] off \the [src].")) component.forceMove(get_turf(src)) diff --git a/code/modules/mechs/equipment/_equipment.dm b/code/modules/mechs/equipment/_equipment.dm index 03ba4a1ac81..9df6c691597 100644 --- a/code/modules/mechs/equipment/_equipment.dm +++ b/code/modules/mechs/equipment/_equipment.dm @@ -71,10 +71,6 @@ owner = null canremove = TRUE -/obj/item/mech_equipment/Destroy() - owner = null - . = ..() - /obj/item/mech_equipment/proc/get_effective_obj() return src diff --git a/code/modules/mechs/equipment/combat.dm b/code/modules/mechs/equipment/combat.dm index 86663b7e98a..fbc24657a60 100644 --- a/code/modules/mechs/equipment/combat.dm +++ b/code/modules/mechs/equipment/combat.dm @@ -255,14 +255,14 @@ if (!isliving(A)) return ..() - if (user.a_intent == I_HURT) + if (user.check_intent(I_FLAG_HARM)) user.visible_message(SPAN_DANGER("\The [user] swings \the [src] at \the [A]!")) playsound(user, 'sound/mecha/mechmove03.ogg', 35, 1) return ..() /obj/item/tool/machete/mech/attack_self(mob/living/user) . = ..() - if (user.a_intent != I_HURT) + if (!user.check_intent(I_FLAG_HARM)) return var/obj/item/mech_equipment/mounted_system/melee/machete/MC = loc if (istype(MC)) @@ -308,7 +308,7 @@ /obj/item/mech_equipment/ballistic_shield/afterattack(atom/target, mob/living/user, inrange, params) . = ..() - if (. && user.a_intent == I_HURT && (last_push + 1.6 SECONDS < world.time)) + if (. && user.check_intent(I_FLAG_HARM) && (last_push + 1.6 SECONDS < world.time)) owner.visible_message(SPAN_WARNING("\The [owner] retracts \the [src], preparing to push with it!"), blind_message = SPAN_WARNING("You hear the whine of hydraulics and feel a rush of air!")) owner.setClickCooldown(0.7 SECONDS) last_push = world.time diff --git a/code/modules/mechs/equipment/engineering.dm b/code/modules/mechs/equipment/engineering.dm index 37fb39763da..bcc74eb2c2e 100644 --- a/code/modules/mechs/equipment/engineering.dm +++ b/code/modules/mechs/equipment/engineering.dm @@ -63,6 +63,7 @@ /decl/interaction_handler/mech_equipment/adjust_atmos_shields name = "Adjust Atmos Shields" expected_target_type = /obj/item/mech_equipment/atmos_shields + examine_desc = "adjust the atmos shields" /decl/interaction_handler/mech_equipment/adjust_atmos_shields/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/mech_equipment/atmos_shields/shields = target diff --git a/code/modules/mechs/equipment/medical.dm b/code/modules/mechs/equipment/medical.dm index 7c39947f122..4aadea64370 100644 --- a/code/modules/mechs/equipment/medical.dm +++ b/code/modules/mechs/equipment/medical.dm @@ -22,7 +22,7 @@ /obj/item/mech_equipment/sleeper/uninstalled() . = ..() - sleeper.go_out() + sleeper?.go_out() /obj/item/mech_equipment/sleeper/attack_self(var/mob/user) . = ..() diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index 7a68a78ec10..b5fb55b0461 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -119,7 +119,7 @@ //attacking - Cannot be carrying something, cause then your clamp would be full else if(isliving(target)) var/mob/living/M = target - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) admin_attack_log(user, M, "attempted to clamp [M] with [src] ", "Was subject to a clamping attempt.", ", using \a [src], attempted to clamp") owner.setClickCooldown(owner.arms ? owner.arms.action_delay * 3 : 30) //This is an inefficient use of your powers if(prob(33)) @@ -196,6 +196,7 @@ /decl/interaction_handler/mech_equipment/clamp name = "Release Clamp" expected_target_type = /obj/item/mech_equipment/clamp + examine_desc = "release $TARGET_THEM$" /decl/interaction_handler/mech_equipment/clamp/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/mech_equipment/clamp/clamp = target @@ -517,7 +518,7 @@ for(var/turf/asteroid as anything in RANGE_TURFS(target, 1)) if (!(get_dir(owner, asteroid) & owner.dir)) continue - if(asteroid.can_be_dug(drill_head.material?.hardness) && asteroid.drop_diggable_resources()) + if(asteroid.can_be_dug(drill_head.material?.hardness) && asteroid.drop_diggable_resources(user)) drill_head.durability -= 1 scoop_ore(asteroid) return @@ -693,6 +694,7 @@ /decl/interaction_handler/mech_equipment/ionjets name = "Toggle Stabilizers" expected_target_type = /obj/item/mech_equipment/ionjets + examine_desc = "toggle the stabilizers" /decl/interaction_handler/mech_equipment/ionjets/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 178079b271a..809f205d2bd 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -10,7 +10,6 @@ default_pixel_x = -8 default_pixel_y = 0 status_flags = PASSEMOTES - a_intent = I_HURT mob_size = MOB_SIZE_LARGE atom_flags = ATOM_FLAG_SHIELD_CONTENTS | ATOM_FLAG_BLOCK_DIAGONAL_FACING butchery_data = null @@ -158,10 +157,14 @@ hud_elements.Cut() for(var/hardpoint in hardpoints) - qdel(hardpoints[hardpoint]) + var/obj/item/mech_equipment/equipment = hardpoints[hardpoint] + if(istype(equipment)) + equipment.uninstalled() + QDEL_NULL(equipment) hardpoints.Cut() QDEL_NULL(access_card) + QDEL_NULL(radio) QDEL_NULL(arms) QDEL_NULL(legs) QDEL_NULL(head) diff --git a/code/modules/mechs/mech_construction.dm b/code/modules/mechs/mech_construction.dm index 8427024efd0..fb4f5f6b705 100644 --- a/code/modules/mechs/mech_construction.dm +++ b/code/modules/mechs/mech_construction.dm @@ -82,7 +82,7 @@ return FALSE if(user) - var/delay = 30 * user.skill_delay_mult(SKILL_DEVICES) + var/delay = 3 SECONDS * user.skill_delay_mult(SKILL_DEVICES) if(delay > 0) user.visible_message( SPAN_NOTICE("\The [user] begins trying to install \the [system] into \the [src]."), @@ -122,7 +122,7 @@ var/obj/item/system = hardpoints[system_hardpoint] if(user) - var/delay = 30 * user.skill_delay_mult(SKILL_DEVICES) + var/delay = 3 SECONDS * user.skill_delay_mult(SKILL_DEVICES) if(delay > 0) user.visible_message(SPAN_NOTICE("\The [user] begins trying to remove \the [system] from \the [src].")) if(!do_after(user, delay, src) || hardpoints[system_hardpoint] != system) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 930c8d50060..a83ea60f14a 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -28,7 +28,7 @@ . = ..() /mob/living/exosuit/resolve_item_attack(var/obj/item/I, var/mob/living/user, var/def_zone) - if(!I.get_attack_force(user)) + if(!I.expend_attack_force(user)) user.visible_message(SPAN_NOTICE("\The [user] bonks \the [src] harmlessly with \the [I].")) return diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 2b348948963..1a8c959d3ff 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -133,7 +133,7 @@ // User is not necessarily the exosuit, or the same person, so update intent. if(user != src) - a_intent = user.a_intent + set_intent(user.get_intent()) if(user.zone_sel) zone_sel.set_selected_zone(user.get_target_zone()) else @@ -314,7 +314,7 @@ if(!silent) to_chat(user, SPAN_WARNING("The [body.hatch_descriptor] is locked.")) return - hud_open.toggled() + hud_open.toggled(user) if(!silent) to_chat(user, SPAN_NOTICE("You open the hatch and climb out of \the [src].")) else @@ -328,7 +328,7 @@ user.client.screen -= hud_elements user.client.eye = user if(user in pilots) - a_intent = I_HURT + set_intent(I_FLAG_HARM) LAZYREMOVE(pilots, user) UNSETEMPTY(pilots) update_pilots() @@ -337,7 +337,7 @@ /mob/living/exosuit/attackby(var/obj/item/thing, var/mob/user) // Install equipment. - if(user.a_intent != I_HURT && istype(thing, /obj/item/mech_equipment)) + if(!user.check_intent(I_FLAG_HARM) && istype(thing, /obj/item/mech_equipment)) if(hardpoints_locked) to_chat(user, SPAN_WARNING("Hardpoint system access is disabled.")) return TRUE @@ -380,7 +380,7 @@ return TRUE // Various tool and construction interactions. - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) // Removing systems from hardpoints. if(IS_MULTITOOL(thing)) @@ -402,8 +402,7 @@ to_chat(user, SPAN_WARNING("The securing bolts are not visible while maintenance protocols are disabled.")) return TRUE visible_message(SPAN_WARNING("\The [user] begins unwrenching the securing bolts holding \the [src] together.")) - var/delay = 60 * user.skill_delay_mult(SKILL_DEVICES) - if(do_after(user, delay) && maintenance_protocols) + if(user.do_skilled(6 SECONDS, SKILL_DEVICES, src) && maintenance_protocols) visible_message(SPAN_NOTICE("\The [user] loosens and removes the securing bolts, dismantling \the [src].")) dismantle() return TRUE @@ -460,10 +459,10 @@ return TRUE if(!body) //Error return TRUE - var/delay = min(50 * user.skill_delay_mult(SKILL_DEVICES), 50 * user.skill_delay_mult(SKILL_EVA)) - visible_message(SPAN_NOTICE("\The [user] starts forcing the \the [src]'s emergency [body.hatch_descriptor] release using \the [thing].")) + var/delay = min(5 SECONDS * user.skill_delay_mult(SKILL_DEVICES), 5 SECONDS * user.skill_delay_mult(SKILL_EVA)) + visible_message(SPAN_NOTICE("\The [user] starts forcing \the [src]'s emergency [body.hatch_descriptor] release using \the [thing].")) if(do_after(user, delay, src)) - visible_message(SPAN_NOTICE("\The [user] forces \the [src]'s [body.hatch_descriptor] open using the \the [thing].")) + visible_message(SPAN_NOTICE("\The [user] forces \the [src]'s [body.hatch_descriptor] open using \the [thing].")) playsound(user.loc, 'sound/machines/bolts_up.ogg', 25, 1) hatch_locked = FALSE hatch_closed = FALSE @@ -507,7 +506,7 @@ to_chat(user, SPAN_WARNING("The [body.hatch_descriptor] is locked.")) return TRUE if(hud_open) - hud_open.toggled() + hud_open.toggled(user) return TRUE /mob/living/exosuit/default_hurt_interaction(var/mob/user) diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm index 3c8eeea0d04..3fc3f1c2537 100644 --- a/code/modules/mechs/mech_movement.dm +++ b/code/modules/mechs/mech_movement.dm @@ -11,13 +11,8 @@ if(.) if(!isspaceturf(loc)) playsound(src.loc, mech_step_sound, 40, 1) - - var/turf/B = GetAbove(src) - - for(var/thing in pilots) - var/mob/pilot = thing - if(pilot.up_hint) - pilot.up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" + for(var/mob/pilot as anything in pilots) + pilot.up_hint?.update_icon() //Inertia drift making us face direction makes exosuit flight a bit difficult, plus newtonian flight model yo /mob/living/exosuit/set_dir(ndir) diff --git a/code/modules/mechs/mech_wreckage.dm b/code/modules/mechs/mech_wreckage.dm index b22b3923107..eb23590ea08 100644 --- a/code/modules/mechs/mech_wreckage.dm +++ b/code/modules/mechs/mech_wreckage.dm @@ -12,7 +12,7 @@ /obj/structure/mech_wreckage/Initialize(mapload, var/mob/living/exosuit/exosuit, var/gibbed) . = ..(mapload) if(exosuit) - name = "wreckage of \the [exosuit.name]" + name = "wreckage of \the [exosuit]" loot_pool = list() if(!gibbed) for(var/obj/item/thing in list(exosuit.arms, exosuit.legs, exosuit.head, exosuit.body)) @@ -86,7 +86,7 @@ else to_chat(user, SPAN_WARNING("It's too solid to dismantle. Try cutting through some of the bigger bits.")) return 1 - else if(istype(W) && W.get_attack_force(user) > 20) + else if(istype(W) && W.expend_attack_force(user) > 20) visible_message(SPAN_DANGER("\The [src] has been smashed with \the [W] by \the [user]!")) if(prob(20)) physically_destroyed() diff --git a/code/modules/mechs/premade/heavy.dm b/code/modules/mechs/premade/heavy.dm index a81ce89533f..e1dfd62d77f 100644 --- a/code/modules/mechs/premade/heavy.dm +++ b/code/modules/mechs/premade/heavy.dm @@ -90,10 +90,6 @@ "[WEST]" = list("x" = 12, "y" = 8) ) ) - - . = ..() - -/obj/item/mech_component/chassis/heavy/prebuild() . = ..() m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/combat(src) diff --git a/code/modules/mechs/premade/misc.dm b/code/modules/mechs/premade/misc.dm index 4d150377c32..dafb3bc44d5 100644 --- a/code/modules/mechs/premade/misc.dm +++ b/code/modules/mechs/premade/misc.dm @@ -53,7 +53,3 @@ ) ) . = ..() - -/obj/item/mech_component/chassis/pod/prebuild() - . = ..() - m_armour = new /obj/item/robot_parts/robot_component/armour/exosuit/radproof(src) \ No newline at end of file diff --git a/code/modules/mining/drilling/drill_act.dm b/code/modules/mining/drilling/drill_act.dm index 6a17a4c5b53..39759df1a4c 100644 --- a/code/modules/mining/drilling/drill_act.dm +++ b/code/modules/mining/drilling/drill_act.dm @@ -1,7 +1,7 @@ /turf/proc/drill_act() SHOULD_CALL_PARENT(TRUE) drop_diggable_resources() - dig_pit(MAT_VALUE_VERY_HARD) + dig_pit(tool_hardness = MAT_VALUE_VERY_HARD) var/base_turf = get_base_turf_by_area(src) if(!istype(src, base_turf)) return ChangeTurf(base_turf) diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index 7dff5769a88..f4090637855 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -4,10 +4,10 @@ /obj/structure/ore_box name = "ore box" desc = "A heavy box used for storing ore." - icon = 'icons/obj/mining.dmi' - icon_state = "orebox0" + icon = 'icons/obj/structures/ore_box.dmi' + icon_state = ICON_STATE_WORLD density = TRUE - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak 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. @@ -31,7 +31,7 @@ return insert_ore(W, user) if(W.storage) var/added_ore = FALSE - W.storage.hide_from(usr) + W.storage.hide_from(user) for(var/obj/item/stack/material/ore/O in W.storage.get_contents()) if(total_ores >= maximum_ores) break @@ -148,6 +148,7 @@ /decl/interaction_handler/empty/ore_box name = "Empty Box" expected_target_type = /obj/structure/ore_box + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/ore_box/is_possible(obj/structure/ore_box/target, mob/user, obj/item/prop) return ..() && target.total_ores > 0 diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 1b7d470abc8..4986952e130 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -51,7 +51,7 @@ spawn_gibber(lastloc) //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. +//Originally created for Disintegrate. I've removed the virus code since it's irrelevant here. //Dusting robots does not eject the brain, so it's a bit more powerful than gib() /N /mob/proc/dust() SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/mob/grab/grab_datum.dm b/code/modules/mob/grab/grab_datum.dm index 333030b75ef..2783cfb571f 100644 --- a/code/modules/mob/grab/grab_datum.dm +++ b/code/modules/mob/grab/grab_datum.dm @@ -120,19 +120,16 @@ return FALSE grab.is_currently_resolving_hit = TRUE - switch(grab.assailant.a_intent) - if(I_HELP) - if(on_hit_help(grab, A, P)) - . = help_action || TRUE - if(I_DISARM) - if(on_hit_disarm(grab, A, P)) - . = disarm_action || TRUE - if(I_GRAB) - if(on_hit_grab(grab, A, P)) - . = grab_action || TRUE - if(I_HURT) - if(on_hit_harm(grab, A, P)) - . = harm_action || TRUE + + var/intent_flags = grab.assailant.get_intent().intent_flags + if((intent_flags & I_FLAG_HELP) && on_hit_help(grab, A, P)) + . = help_action || TRUE + if(!. && (intent_flags & I_FLAG_DISARM) && on_hit_disarm(grab, A, P)) + . = disarm_action || TRUE + if(!. && (intent_flags & I_FLAG_GRAB) && on_hit_grab(grab, A, P)) + . = grab_action || TRUE + if(!. && (intent_flags & I_FLAG_HARM) && on_hit_harm(grab, A, P)) + . = harm_action || TRUE if(!QDELETED(grab)) grab.is_currently_resolving_hit = FALSE diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index 2bfa1693d4c..8efb2c19fb9 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -73,7 +73,7 @@ else visible_message(SPAN_NOTICE("\The [assailant] has grabbed [pronouns.self]!")) - if(affecting_mob && assailant?.a_intent == I_HURT) + if(affecting_mob && assailant?.check_intent(I_FLAG_HARM)) upgrade(TRUE) /obj/item/grab/mob_can_unequip(mob/user, slot, disable_warning = FALSE, dropping = FALSE) @@ -94,11 +94,10 @@ current_grab.process(src) /obj/item/grab/attack_self(mob/user) - switch(assailant.a_intent) - if(I_HELP) - downgrade() - else - upgrade() + if(assailant.check_intent(I_FLAG_HELP)) + downgrade() + else + upgrade() /obj/item/grab/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(affecting == target) diff --git a/code/modules/mob/grab/normal/grab_normal.dm b/code/modules/mob/grab/normal/grab_normal.dm index 91afdb48426..df950514b86 100644 --- a/code/modules/mob/grab/normal/grab_normal.dm +++ b/code/modules/mob/grab/normal/grab_normal.dm @@ -105,7 +105,7 @@ return FALSE /decl/grab/normal/resolve_openhand_attack(var/obj/item/grab/grab) - if(grab.assailant.a_intent != I_HELP) + if(!grab.assailant.check_intent(I_FLAG_HELP)) if(grab.target_zone == BP_HEAD) if(grab.assailant.get_target_zone() == BP_EYES) if(attack_eye(grab)) @@ -154,7 +154,7 @@ var/obj/item/clothing/hat = attacker.get_equipped_item(slot_head_str) var/damage_flags = 0 if(istype(hat)) - damage += hat.get_attack_force(attacker) * 3 + damage += hat.expend_attack_force(attacker) * 3 damage_flags = hat.damage_flags() if(damage_flags & DAM_SHARP) @@ -225,10 +225,10 @@ var/mob/living/affecting = grab.get_affecting_mob() if(!affecting) return - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) return 0 // Not trying to hurt them. - if(!W.edge || !W.get_attack_force(user) || W.atom_damage_type != BRUTE) + if(!W.has_edge() || !W.get_attack_force(user) || W.atom_damage_type != BRUTE) return 0 //unsuitable weapon user.visible_message("\The [user] begins to slit [affecting]'s throat with \the [W]!") @@ -241,7 +241,7 @@ var/damage_mod = 1 var/damage_flags = W.damage_flags() //presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well - var/force = W.get_attack_force(user) + var/force = W.expend_attack_force(user) var/obj/item/clothing/head/helmet = affecting.get_equipped_item(slot_head_str) if(istype(helmet) && (helmet.body_parts_covered & SLOT_HEAD) && (helmet.item_flags & ITEM_FLAG_AIRTIGHT) && !isnull(helmet.max_pressure_protection)) var/datum/extension/armor/armor_datum = get_extension(helmet, /datum/extension/armor) @@ -271,9 +271,9 @@ return if(!user.skill_check(SKILL_COMBAT, SKILL_ADEPT)) return - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) return 0 // Not trying to hurt them. - if(!W.edge || !W.get_attack_force(user) || W.atom_damage_type != BRUTE) + if(!W.has_edge() || !W.expend_attack_force(user) || W.atom_damage_type != BRUTE) return 0 //unsuitable weapon var/obj/item/organ/external/O = grab.get_targeted_organ() if(!O || !(O.limb_flags & ORGAN_FLAG_HAS_TENDON) || (O.status & ORGAN_TENDON_CUT)) diff --git a/code/modules/mob/grab/normal/norm_aggressive.dm b/code/modules/mob/grab/normal/norm_aggressive.dm index b581f3795d8..5a48b8a9130 100644 --- a/code/modules/mob/grab/normal/norm_aggressive.dm +++ b/code/modules/mob/grab/normal/norm_aggressive.dm @@ -14,6 +14,13 @@ breakability = 3 grab_icon_state = "reinforce1" break_chance_table = list(5, 20, 40, 80, 100) + help_action = "wound pressure" // A bit clunky, but this is only used for admin logs presently! + +/decl/grab/normal/aggressive/on_hit_help(obj/item/grab/grab, atom/target, proximity) + var/mob/living/human/grab_victim = grab.get_affecting_mob() + if(!istype(grab_victim) || !proximity || (target && target != grab_victim)) + return FALSE + return grab_victim.apply_pressure(grab.assailant, grab.target_zone) /decl/grab/normal/aggressive/process_effect(var/obj/item/grab/grab) var/mob/living/affecting_mob = grab.get_affecting_mob() diff --git a/code/modules/mob/grab/normal/norm_struggle.dm b/code/modules/mob/grab/normal/norm_struggle.dm index 07d3b27d89f..84c212e5bc7 100644 --- a/code/modules/mob/grab/normal/norm_struggle.dm +++ b/code/modules/mob/grab/normal/norm_struggle.dm @@ -19,7 +19,7 @@ var/mob/living/assailant = grab.assailant if(!affecting) return - if(affecting.incapacitated(INCAPACITATION_UNRESISTING) || affecting.a_intent == I_HELP) + if(affecting.incapacitated(INCAPACITATION_UNRESISTING) || affecting.check_intent(I_FLAG_HELP)) var/decl/pronouns/assailant_gender = assailant.get_pronouns() affecting.visible_message(SPAN_DANGER("\The [affecting] isn't prepared to fight back as [assailant] tightens [assailant_gender.his] grip!")) grab.done_struggle = TRUE @@ -35,7 +35,7 @@ grab.upgrade(TRUE) return - if(affecting.incapacitated(INCAPACITATION_UNRESISTING) || affecting.a_intent == I_HELP) + if(affecting.incapacitated(INCAPACITATION_UNRESISTING) || affecting.check_intent(I_FLAG_HELP)) var/decl/pronouns/assailant_gender = assailant.get_pronouns() affecting.visible_message(SPAN_DANGER("\The [affecting] isn't prepared to fight back as [assailant] tightens [assailant_gender.his] grip!")) grab.done_struggle = TRUE diff --git a/code/modules/mob/hugs.dm b/code/modules/mob/hugs.dm index 1ce632931f2..afa0d626473 100644 --- a/code/modules/mob/hugs.dm +++ b/code/modules/mob/hugs.dm @@ -46,7 +46,7 @@ var/global/list/_default_hug_messages = list( playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if(src != target) + if(src != target && client && key && target.client && target.key && !target.incapacitated()) update_personal_goal(/datum/goal/achievement/givehug, TRUE) target.update_personal_goal(/datum/goal/achievement/gethug, TRUE) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 5d8cd67706c..f4482ab7e98 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -271,12 +271,49 @@ return 1 //already unequipped, so success return I.mob_can_unequip(src, slot) +/// Gets the inventory slot string ID for the mob whose contents we're in, if any. +/// Checks both equipped and held item slots. +/obj/item/proc/get_any_equipped_slot() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_any_equipped_slot_for_item(src) + +/// Gets the inventory slot string ID for an item that may be in our inventory. +/// Checks both equipped and held item slots. +/mob/proc/get_any_equipped_slot_for_item(obj/item/I) + var/list/slots = get_inventory_slots() + get_held_item_slots() + if(!length(slots)) + return + for(var/slot_str in slots) + if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I + return slot_str + +/// A counterpart to get_any_equipped_slot_for_item that returns the slot datum rather than the slot name. +/// Checks both equipped and held item slots. +/obj/item/proc/get_any_equipped_slot_datum() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_inventory_slot_datum(mob.get_any_equipped_slot_for_item(src)) + +/// Gets the equipment (worn) slot string ID for the mob whose contents we're in, if any. Does not include held slots. /obj/item/proc/get_equipped_slot() if(!ismob(loc)) return null var/mob/mob = loc return mob.get_equipped_slot_for_item(src) +/// A helper that returns the slot datum rather than the slot name. +/// Does not include held slots. +/// Saves unnecessary duplicate ismob checks and loc casts. +/obj/item/proc/get_equipped_slot_datum() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_inventory_slot_datum(mob.get_equipped_slot_for_item(src)) + +/// Gets the equipment (worn) slot string ID for an item we may be wearing. Does not include held slots. /mob/proc/get_equipped_slot_for_item(obj/item/I) var/list/slots = get_inventory_slots() if(!length(slots)) @@ -285,6 +322,14 @@ if(get_equipped_item(slot_str) == I) // slots[slot]._holding == I return slot_str +/// Gets the held item slot string ID for the mob whose contents we're in, if any. Does not include worn slots. +/obj/item/proc/get_held_slot() + if(!ismob(loc)) + return null + var/mob/mob = loc + return mob.get_held_slot_for_item(src) + +/// Gets the held item slot string ID for an item we may be holding. Does not include worn slots. /mob/proc/get_held_slot_for_item(obj/item/I) var/list/slots = get_held_item_slots() if(!length(slots)) @@ -360,17 +405,16 @@ // Returns all currently covered body parts /mob/proc/get_covered_body_parts() . = 0 - for(var/entry in get_equipped_items()) - var/obj/item/I = entry + for(var/obj/item/I as anything in get_equipped_items()) . |= I.body_parts_covered // Returns the first item which covers any given body part /mob/proc/get_covering_equipped_item(var/body_parts) - if(isnum(body_parts)) - for(var/entry in get_equipped_items()) - var/obj/item/I = entry - if(I.body_parts_covered & body_parts) - return I + if(!isnum(body_parts)) + return null + for(var/obj/item/I as anything in get_equipped_items()) + if(I.body_parts_covered & body_parts) + return I // Returns all items which covers any given body part /mob/proc/get_covering_equipped_items(var/body_parts) @@ -379,6 +423,21 @@ if(I.body_parts_covered & body_parts) . += I +// Returns the first item which covers all specified body parts. +/mob/proc/get_covering_equipped_item_exact(var/body_parts) + if(!isnum(body_parts)) + return null + for(var/obj/item/I as anything in get_equipped_items()) + if((I.body_parts_covered & body_parts) == body_parts) + return I + +// Returns all items which cover all specified body parts. +/mob/proc/get_covering_equipped_items_exact(var/body_parts) + . = list() + for(var/obj/item/I as anything in get_equipped_items()) + if((I.body_parts_covered & body_parts) == body_parts) + . += I + /mob/proc/has_held_item_slot() return !!length(get_held_item_slots()) @@ -435,3 +494,9 @@ var/org = GET_EXTERNAL_ORGAN(src, hand_slot) if(org) LAZYDISTINCTADD(., org) + +/mob/proc/get_active_hand_bodypart_flags() + var/datum/inventory_slot/gripper/inv_slot = get_inventory_slot_datum(get_active_held_item_slot()) + if(istype(inv_slot)) + . = inv_slot.covering_slot_flags + . ||= SLOT_HANDS diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 4a88a0fa035..9f3089994e6 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -84,12 +84,18 @@ if(. && !gibbed) gib() +/mob/living/bot/ssd_check() + return FALSE + +/mob/living/bot/try_awaken(mob/user) + return FALSE + /mob/living/bot/attackby(var/obj/item/O, var/mob/user) if(O.GetIdCard()) if(access_scanner.allowed(user) && !open) locked = !locked to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") - Interact(usr) + Interact(user) else if(open) to_chat(user, "Please close the access panel before locking it.") else @@ -99,7 +105,7 @@ if(!locked) open = !open to_chat(user, "Maintenance panel is now [open ? "opened" : "closed"].") - Interact(usr) + Interact(user) else to_chat(user, "You need to unlock the controls first.") return TRUE @@ -236,7 +242,7 @@ resetTarget() lookForTargets() if(will_patrol && !LAZYLEN(grabbed_by) && !target) - if(patrol_path && patrol_path.len) + if(length(patrol_path)) for(var/i = 1 to patrol_speed) sleep(20 / (patrol_speed + 1)) handlePatrol() @@ -260,7 +266,7 @@ if(!target || !target.loc) return if(get_dist(src, target) > min_target_dist) - if(!target_path.len || get_turf(target) != target_path[target_path.len]) + if(!length(target_path) || get_turf(target) != target_path[target_path.len]) calcTargetPath() if(makeStep(target_path)) frustration = 0 @@ -277,12 +283,12 @@ /mob/living/bot/proc/lookForTargets() return -/mob/living/bot/proc/confirmTarget(var/atom/A) - if(A.invisibility >= INVISIBILITY_LEVEL_ONE) +/mob/living/bot/proc/confirmTarget(atom/target) + if(target.invisibility >= INVISIBILITY_LEVEL_ONE) return 0 - if(A in ignore_list) + if(target in ignore_list) return 0 - if(!A.loc) + if(!target.loc) return 0 return 1 @@ -291,9 +297,9 @@ return /mob/living/bot/proc/startPatrol() - var/turf/T = getPatrolTurf() - if(T) - 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) + var/turf/target_turf = getPatrolTurf() + if(target_turf) + patrol_path = SSpathfinding.find_path_immediate(start = get_turf(loc), end = target_turf, max_node_depth = max_patrol_dist, id = botcard, exclude = obstacle, check_tick = TRUE) if(!patrol_path) patrol_path = list() obstacle = null @@ -325,23 +331,22 @@ return /mob/living/bot/proc/calcTargetPath() - 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 - resetTarget() - obstacle = null - return + target_path = SSpathfinding.find_path_immediate(start = get_turf(loc), end = get_turf(target), max_node_depth = max_target_dist, min_target_dist = min_target_dist, id = botcard, exclude = obstacle, check_tick = TRUE) + if(length(target_path)) + return + if(target?.loc) + ignore_list |= target + resetTarget() + obstacle = null /mob/living/bot/proc/makeStep(var/list/path) - if(!path.len) - return 0 - var/turf/T = path[1] - if(get_turf(src) == T) - path -= T + if(!length(path)) + return FALSE + var/turf/target_turf = path[1] + if(get_turf(src) == target_turf) + path -= target_turf return makeStep(path) - - return step_towards(src, T) + return step_towards(src, target_turf) /mob/living/bot/proc/resetTarget() target = null @@ -365,70 +370,6 @@ set_light(0) update_icon() -/******************************************************************/ -// Navigation procs -// Used for A-star pathfinding - - -// Returns the surrounding cardinal turfs with open links -// Including through doors openable with the ID -/turf/proc/CardinalTurfsWithAccess(var/obj/item/card/id/ID) - var/L[] = new() - - for(var/d in global.cardinal) - var/turf/T = get_step(src, d) - if(istype(T) && !T.density && T.simulated && !LinkBlockedWithAccess(src, T, ID)) - L.Add(T) - return L - - -// Returns true if a link between A and B is blocked -// Movement through doors allowed if ID has access -/proc/LinkBlockedWithAccess(turf/A, turf/B, obj/item/card/id/ID) - - if(A == null || B == null) return 1 - var/adir = get_dir(A,B) - var/rdir = get_dir(B,A) - if((adir & (NORTH|SOUTH)) && (adir & (EAST|WEST))) // diagonal - var/iStep = get_step(A,adir&(NORTH|SOUTH)) - if(!LinkBlockedWithAccess(A,iStep, ID) && !LinkBlockedWithAccess(iStep,B,ID)) - return 0 - - var/pStep = get_step(A,adir&(EAST|WEST)) - if(!LinkBlockedWithAccess(A,pStep,ID) && !LinkBlockedWithAccess(pStep,B,ID)) - return 0 - return 1 - - if(DirBlockedWithAccess(A,adir, ID)) - return 1 - - if(DirBlockedWithAccess(B,rdir, ID)) - return 1 - - for(var/obj/O in B) - if(O.density && !istype(O, /obj/machinery/door) && !(O.atom_flags & ATOM_FLAG_CHECKS_BORDER)) - return 1 - - return 0 - -// Returns true if direction is blocked from loc -// Checks doors against access with given ID -/proc/DirBlockedWithAccess(turf/loc,var/dir,var/obj/item/card/id/ID) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 - if(D.dir == dir) return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density) continue - if(istype(D, /obj/machinery/door/window)) - if( dir & D.dir ) return !D.check_access(ID) - - //if((dir & SOUTH) && (D.dir & (EAST|WEST))) return !D.check_access(ID) - //if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return !D.check_access(ID) - else return !D.check_access(ID) // it's a real, air blocking door - return 0 - /mob/living/bot/GetIdCards(list/exceptions) . = ..() if(istype(botcard) && !is_type_in_list(botcard, exceptions)) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index c9442e2857f..95fac4ce948 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -1,5 +1,5 @@ /mob/living/bot/cleanbot - name = "Cleanbot" + name = "cleanbot" desc = "A little cleaning robot, he looks so excited!" icon = 'icons/mob/bot/cleanbot.dmi' icon_state = "cleanbot0" @@ -35,44 +35,47 @@ ignore_list -= g /mob/living/bot/cleanbot/lookForTargets() - for(var/obj/effect/decal/cleanable/D in view(world.view + 1, src)) - if(confirmTarget(D)) - target = D + for(var/obj/effect/decal/cleanable/decal in view(world.view + 1, src)) + if(confirmTarget(decal)) + target = decal playsound(src, 'sound/machines/boop1.ogg', 30) return -/mob/living/bot/cleanbot/confirmTarget(var/obj/effect/decal/cleanable/D) - if(!..()) - return 0 - for(var/T in target_types) - if(istype(D, T)) - return 1 - return 0 +/mob/living/bot/cleanbot/confirmTarget(atom/target) + . = ..() + if(.) + var/turf/decal_turf = get_turf(target) + if(!istype(decal_turf) || decal_turf.contains_dense_objects()) + return FALSE // Stop trying to clean under full-tile windows. + if(istype(target, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = target + return dirt.dirt_amount >= 50 // Stop trying to clean invisible dirt. + return is_type_in_list(target, target_types) /mob/living/bot/cleanbot/handleAdjacentTarget() if(get_turf(target) == src.loc) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) -/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/D, var/proximity) +/mob/living/bot/cleanbot/UnarmedAttack(var/obj/effect/decal/cleanable/decal, var/proximity) . = ..() if(.) return - if(!istype(D)) + if(!istype(decal)) return TRUE - if(D.loc != loc) + if(decal.loc != loc) return FALSE busy = 1 - visible_message("\The [src] begins to clean up \the [D].") + visible_message("\The [src] begins to clean up \the [decal].") update_icon() - var/cleantime = istype(D, /obj/effect/decal/cleanable/dirt) ? 10 : 50 - if(do_after(src, cleantime, progress = 0) && !QDELETED(D)) - if(D == target) + var/cleantime = istype(decal, /obj/effect/decal/cleanable/dirt) ? 10 : 50 + if(do_after(src, cleantime, progress = 0) && !QDELETED(decal)) + if(decal == target) target = null - qdel(D) + qdel(decal) playsound(src, 'sound/machines/boop2.ogg', 30) busy = 0 update_icon() diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index f4e8ebe3a24..19cb53e0eee 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -7,10 +7,7 @@ layer = MOB_LAYER density = TRUE max_health = 100 - preparing_arrest_sounds = new() - - a_intent = I_HURT mob_bump_flag = HEAVY mob_swap_flags = ~HEAVY mob_push_flags = HEAVY diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 4a487bb1a4c..b706ce3450d 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -106,7 +106,7 @@ flick("farmbot_broke", src) /mob/living/bot/farmbot/handleAdjacentTarget() - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/farmbot/lookForTargets() if(emagged) @@ -123,24 +123,6 @@ target = source return -/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), TYPE_PROC_REF(/turf, CardinalTurfsWithAccess), TYPE_PROC_REF(/turf, Distance), 0, max_target_dist, id = botcard) - if(target_path) - break - if(!target_path) - ignore_list |= target - target = null - target_path = list() - return - -/mob/living/bot/farmbot/stepToTarget() // Same reason - var/turf/T = get_turf(target) - if(!target_path.len || !T.Adjacent(target_path[target_path.len])) - calcTargetPath() - makeStep(target_path) - return - /mob/living/bot/farmbot/UnarmedAttack(var/atom/A, var/proximity) . = ..() if(.) @@ -240,21 +222,21 @@ if(prob(50)) new /obj/item/robot_parts/l_arm(my_turf) -/mob/living/bot/farmbot/confirmTarget(var/atom/targ) +/mob/living/bot/farmbot/confirmTarget(atom/target) if(!..()) return 0 - if(emagged && ishuman(targ)) - if(targ in view(world.view, src)) + if(emagged && ishuman(target)) + if(target in view(world.view, src)) return 1 return 0 - if(istype(targ, /obj/structure/hygiene/sink)) + if(istype(target, /obj/structure/hygiene/sink)) if(!tank || tank.reagents.total_volume >= tank.reagents.maximum_volume) return 0 return 1 - var/obj/machinery/portable_atmospherics/hydroponics/tray = targ + var/obj/machinery/portable_atmospherics/hydroponics/tray = target if(!istype(tray)) return 0 diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index d3dc81be5c3..7f0e4f67541 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -95,7 +95,7 @@ /mob/living/bot/floorbot/handleAdjacentTarget() if(get_turf(target) == src.loc) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/floorbot/lookForTargets() for(var/turf/floor/T in view(src)) @@ -109,28 +109,24 @@ target = S return -/mob/living/bot/floorbot/confirmTarget(var/atom/A) // The fact that we do some checks twice may seem confusing but remember that the bot's settings may be toggled while it's moving and we want them to stop in that case +/mob/living/bot/floorbot/confirmTarget(atom/target) // The fact that we do some checks twice may seem confusing but remember that the bot's settings may be toggled while it's moving and we want them to stop in that case anchored = FALSE if(!..()) return 0 - if(istype(A, /obj/item/stack/tile/floor)) + if(istype(target, /obj/item/stack/tile/floor)) return (amount < maxAmount && eattiles) - if(istype(A, /obj/item/stack/material)) - var/obj/item/stack/material/S = A + if(istype(target, /obj/item/stack/material)) + var/obj/item/stack/material/S = target if(S.material?.type == /decl/material/solid/metal/steel) return (amount < maxAmount && maketiles) - if(A.loc.name == "Space") - return 0 + var/turf/floor/my_turf = target + if(!istype(my_turf) || (isturf(my_turf) && my_turf.is_open())) + return FALSE - var/turf/floor/T = A - if(istype(T)) - if(emagged) - return 1 - else - return (amount && (T.is_floor_damaged() || (improvefloors && !T.has_flooring()))) + return emagged || (amount && (my_turf.is_floor_damaged() || (improvefloors && !my_turf.has_flooring()))) /mob/living/bot/floorbot/UnarmedAttack(var/atom/A, var/proximity) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index cf174faa8ce..8ba09af58d3 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -73,40 +73,40 @@ /mob/living/bot/medbot/handleAdjacentTarget() if(is_tipped) // Don't handle targets if we're incapacitated! return - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/medbot/lookForTargets() if(is_tipped) // Don't look for targets if we're incapacitated! return - for(var/mob/living/human/H in view(7, src)) // Time to find a patient! - if(confirmTarget(H)) - target = H + for(var/mob/living/human/patient in view(7, src)) // Time to find a patient! + if(confirmTarget(patient)) + target = patient if(last_newpatient_speak + 300 < world.time && vocal) if(vocal) var/message_options = list( - "Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/mcoming.ogg', - "Wait [H.name]! I want to help!" = 'sound/voice/medbot/mhelp.ogg', - "[H.name], you appear to be injured!" = 'sound/voice/medbot/minjured.ogg' + "Hey, [patient.name]! Hold on, I'm coming." = 'sound/voice/medbot/mcoming.ogg', + "Wait [patient.name]! I want to help!" = 'sound/voice/medbot/mhelp.ogg', + "[patient.name], you appear to be injured!" = 'sound/voice/medbot/minjured.ogg' ) var/message = pick(message_options) say(message) playsound(src, message_options[message], 50, 0) - custom_emote(1, "points at [H.name].") + custom_emote(1, "points at [patient.name].") last_newpatient_speak = world.time break -/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/H, var/proximity) +/mob/living/bot/medbot/UnarmedAttack(var/mob/living/human/target, var/proximity) . = ..() if(.) return - if(!on || !istype(H)) + if(!on || !istype(target)) return FALSE if(busy) return TRUE - if(H.stat == DEAD) + if(target.stat == DEAD) if(vocal) var/static/death_messages = list( "No! Stay with me!" = 'sound/voice/medbot/mno.ogg', @@ -117,7 +117,7 @@ say(message) playsound(src, death_messages[message], 50, 0) - var/t = confirmTarget(H) + var/t = confirmTarget(target) if(!t) if(vocal) var/static/possible_messages = list( @@ -130,18 +130,18 @@ playsound(src, possible_messages[message], 50, 0) icon_state = "medibots" - visible_message("[src] is trying to inject [H]!") + visible_message("[src] is trying to inject [target]!") if(declare_treatment) var/area/location = get_area(src) - broadcast_medical_hud_message("[src] is treating [H] in [location.proper_name]", src) + broadcast_medical_hud_message("[src] is treating [target] in [location.proper_name]", src) busy = 1 update_icon() - if(do_mob(src, H, 30)) + if(do_mob(src, target, 30)) if(t == 1) - reagent_glass.reagents.trans_to_mob(H, injection_amount, CHEM_INJECT) + reagent_glass.reagents.trans_to_mob(target, injection_amount, CHEM_INJECT) else - H.add_to_reagents(t, injection_amount) - visible_message("[src] injects [H] with the syringe!") + target.add_to_reagents(t, injection_amount) + visible_message("[src] injects [target] with the syringe!") busy = 0 update_icon() return TRUE @@ -297,33 +297,34 @@ reagent_glass.forceMove(my_turf) reagent_glass = null -/mob/living/bot/medbot/confirmTarget(var/mob/living/human/H) - if(!..()) - return 0 +/mob/living/bot/medbot/confirmTarget(atom/target) + if(!(. = ..())) + return - if(H.stat == DEAD) // He's dead, Jim - return 0 + var/mob/living/human/patient = target + if(!istype(patient) || patient.stat == DEAD) // He's dead, Jim + return FALSE if(emagged) return treatment_emag // If they're injured, we're using a beaker, and they don't have on of the chems in the beaker - if(reagent_glass && use_beaker && ((H.get_damage(BRUTE) >= heal_threshold) || (H.get_damage(TOX) >= heal_threshold) || (H.get_damage(TOX) >= heal_threshold) || (H.get_damage(OXY) >= (heal_threshold + 15)))) + if(reagent_glass && use_beaker && ((patient.get_damage(BRUTE) >= heal_threshold) || (patient.get_damage(TOX) >= heal_threshold) || (patient.get_damage(TOX) >= heal_threshold) || (patient.get_damage(OXY) >= (heal_threshold + 15)))) for(var/R in reagent_glass.reagents.reagent_volumes) - if(!H.reagents.has_reagent(R)) + if(!patient.reagents.has_reagent(R)) return 1 continue - if((H.get_damage(BRUTE) >= heal_threshold) && (!H.reagents.has_reagent(treatment_brute))) + if((patient.get_damage(BRUTE) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_brute))) return treatment_brute //If they're already medicated don't bother! - if((H.get_damage(OXY) >= (15 + heal_threshold)) && (!H.reagents.has_reagent(treatment_oxy))) + if((patient.get_damage(OXY) >= (15 + heal_threshold)) && (!patient.reagents.has_reagent(treatment_oxy))) return treatment_oxy - if((H.get_damage(BURN) >= heal_threshold) && (!H.reagents.has_reagent(treatment_fire))) + if((patient.get_damage(BURN) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_fire))) return treatment_fire - if((H.get_damage(TOX) >= heal_threshold) && (!H.reagents.has_reagent(treatment_tox))) + if((patient.get_damage(TOX) >= heal_threshold) && (!patient.reagents.has_reagent(treatment_tox))) return treatment_tox /mob/living/bot/medbot/proc/tip_over(mob/user) diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index 12d54b83759..078dee2a382 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -172,18 +172,18 @@ if(target == src.loc) custom_emote(2, "makes a chiming sound.") playsound(loc, 'sound/machines/chime.ogg', 50, 0) - UnarmedAttack(target) + UnarmedAttack(target, TRUE) resetTarget() if(auto_return && home && (loc != home)) target = home targetName = "Home" -/mob/living/bot/mulebot/confirmTarget() +/mob/living/bot/mulebot/confirmTarget(atom/target) return 1 /mob/living/bot/mulebot/calcTargetPath() ..() - if(!target_path.len && target != home) // I presume that target is not null + if(!length(target_path) && target != home) // I presume that target is not null resetTarget() target = home targetName = "Home" diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 412d45498ac..faca3a286c2 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -157,10 +157,10 @@ return ..() -/mob/living/bot/secbot/confirmTarget(var/atom/A) +/mob/living/bot/secbot/confirmTarget(atom/target) if(!..()) return 0 - return (check_threat(A) >= SECBOT_THREAT_ARREST) + return (check_threat(target) >= SECBOT_THREAT_ARREST) /mob/living/bot/secbot/lookForTargets() for(var/mob/living/M in view(src)) @@ -182,7 +182,7 @@ begin_arrest(target, threat) ++awaiting_surrender else - UnarmedAttack(target) + UnarmedAttack(target, TRUE) /mob/living/bot/secbot/proc/cuff_target(var/mob/living/target) if(istype(target) && !target.get_equipped_item(slot_handcuffed_str)) @@ -209,9 +209,9 @@ return TRUE if(isanimal(M)) - a_intent = I_HURT + set_intent(I_FLAG_HARM) else - a_intent = I_GRAB + set_intent(I_FLAG_GRAB) stun_baton.use_on_mob(M, src) //robots and turrets aim for center of mass flick(attack_state, src) diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index 35b97e4880b..7fbab9b3665 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -26,11 +26,6 @@ ) return default_emotes -/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/is_deaf() return emp_damage || stat == DEAD || !is_in_interface() @@ -44,7 +39,7 @@ container.queue_icon_update() /mob/living/brain/proc/get_container() - . = loc?.loc + return get_recursive_loc_of_type(/obj/item/organ/internal) /mob/living/brain/Login() . = ..() @@ -99,8 +94,10 @@ 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. +/mob/living/brain/handle_regular_status_updates() // Status & health update, are we dead or alive, can we communicate, etc. . = ..() + if(emp_damage || stat == DEAD || !is_in_interface()) + SET_STATUS_MAX(src, STAT_SILENCE, 2) if(stat == DEAD || !isSynthetic()) emp_damage = 0 return @@ -114,4 +111,4 @@ if(emp_damage <= 0) last_emp_message = 0 emp_damage = 0 - to_chat(src, SPAN_NOTICE("All systems restored.")) + to_chat(src, SPAN_NOTICE("All systems restored.")) \ No newline at end of file diff --git a/code/modules/mob/living/brain/death.dm b/code/modules/mob/living/brain/death.dm index a58511aaaef..1c185d241c6 100644 --- a/code/modules/mob/living/brain/death.dm +++ b/code/modules/mob/living/brain/death.dm @@ -19,7 +19,7 @@ var/obj/item/organ/internal/brain/sponge = loc . = ..() if(.) - if(!QDELETED(container)) + if(istype(container) && !QDELETED(container)) qdel(container) - if(!QDELETED(sponge)) + if(istype(sponge) && !QDELETED(sponge)) qdel(sponge) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 8855bd1ecd7..8a31af021dc 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -11,3 +11,9 @@ stop_aiming(no_message=1) if(istype(ai)) ai.handle_death(gibbed) + + var/decl/species/my_species = get_species() + if(my_species) + if(!gibbed && my_species.death_sound) + playsound(loc, my_species.death_sound, 80, 1, 1) + my_species.handle_death(src) diff --git a/code/modules/mob/living/human/death.dm b/code/modules/mob/living/human/death.dm index e06f550ae42..8f21775624a 100644 --- a/code/modules/mob/living/human/death.dm +++ b/code/modules/mob/living/human/death.dm @@ -33,11 +33,8 @@ if(!gibbed) set_tail_animation_state(null, TRUE) handle_organs() - if(species.death_sound) - playsound(loc, species.death_sound, 80, 1, 1) if(SSticker.mode) SSticker.mode.check_win() - species.handle_death(src) /mob/living/human/physically_destroyed(var/skip_qdel, var/droplimb_type = DISMEMBER_METHOD_BLUNT) for(var/obj/item/organ/external/limb in get_external_organs()) diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index db61156edfc..d1763426eb6 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -72,24 +72,25 @@ to_chat(user, "[use_He] [use_has] a pulse!") var/datum/reagents/touching_reagents = get_contact_reagents() - if(touching_reagents?.total_volume) + if(touching_reagents?.total_volume >= 1) var/saturation = touching_reagents.total_volume / touching_reagents.maximum_volume if(saturation > 0.9) msg += "[use_He] [use_is] completely saturated.\n" else if(saturation > 0.6) - msg += "[use_He] [use_is] looking like a drowned cat.\n" + msg += "[use_He] [use_is] looking half-drowned.\n" else if(saturation > 0.3) msg += "[use_He] [use_is] looking notably soggy.\n" else - msg += "[use_He] [use_is] looking a bit damp.\n" + msg += "[use_He] [use_is] looking a bit soggy.\n" - if(fire_stacks > 0) + var/fire_level = get_fire_intensity() + if(fire_level > 0) msg += "[use_He] [use_is] looking highly flammable!\n" - else if(fire_stacks < 0) - msg += "[use_He] [use_is] looking rather damp.\n" + else if(fire_level < 0) + msg += "[use_He] [use_is] looking rather incombustible.\n" - if(on_fire) - msg += "[use_He] [use_is] on fire!.\n" + if(is_on_fire()) + msg += "[use_He] [use_is] on fire!\n" var/ssd_msg = species.get_ssd(src) if(ssd_msg && (!should_have_organ(BP_BRAIN) || has_brain()) && stat != DEAD) @@ -268,13 +269,13 @@ return /mob/living/human/getHUDsource(hudtype) - var/obj/item/clothing/glasses/pronouns = get_equipped_item(slot_glasses_str) - if(!istype(pronouns)) + var/obj/item/clothing/glasses/glasses = get_equipped_item(slot_glasses_str) + if(!istype(glasses)) return ..() - if(pronouns.glasses_hud_type & hudtype) - return pronouns - if(pronouns.hud && (pronouns.hud.glasses_hud_type & hudtype)) - return pronouns.hud + if(glasses.glasses_hud_type & hudtype) + return glasses + if(glasses.hud && (glasses.hud.glasses_hud_type & hudtype)) + return glasses.hud /mob/living/silicon/robot/getHUDsource(hudtype) for(var/obj/item/borg/sight/sight in list(module_state_1, module_state_2, module_state_3)) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 450e7d79206..057f3a73c5b 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -5,14 +5,12 @@ icon_state = "body_m_s" mob_sort_value = 6 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. /mob/living/human/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) current_health = max_health - setup_hud_overlays() + reset_hud_overlays() var/list/newargs = args.Copy(2) setup_human(arglist(newargs)) global.human_mob_list |= src @@ -32,18 +30,6 @@ if(. != INITIALIZE_HINT_QDEL) post_setup(arglist(newargs)) -/mob/living/human/proc/setup_hud_overlays() - hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100") - hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") - hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") - hud_list[ID_HUD] = new /image/hud_overlay(global.using_map.id_hud_icons, src, "hudunknown") - hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[STATUS_HUD_OOC] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") - /mob/living/human/Destroy() global.human_mob_list -= src regenerate_body_icon = FALSE // don't bother regenerating if we happen to be queued to update icon @@ -84,11 +70,11 @@ . = ..() if(statpanel("Status")) - var/obj/item/gps/pronouns = get_active_held_item() - if(istype(pronouns)) - stat("Coordinates:", "[pronouns.get_coordinates()]") + var/obj/item/gps/gps = get_active_held_item() + if(istype(gps)) + stat("Coordinates:", "[gps.get_coordinates()]") - stat("Intent:", "[a_intent]") + stat("Intent:", "[get_intent().name]") stat("Move Mode:", "[move_intent.name]") if(SSevac.evacuation_controller) @@ -182,7 +168,7 @@ var/datum/computer_file/report/crew_record/R = network.get_crew_record_by_name(perpname) if(R) var/setcriminal = input(user, "Specify a new criminal status for this person.", "Security HUD", R.get_criminalStatus()) as null|anything in global.security_statuses - if(hasHUD(usr, HUD_SECURITY) && setcriminal) + if(hasHUD(user, HUD_SECURITY) && setcriminal) R.set_criminalStatus(setcriminal) modified = 1 @@ -196,11 +182,11 @@ U.handle_regular_hud_updates() if(!modified) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(user, "Unable to locate a data core entry for this person.") return TOPIC_HANDLED if (href_list["secrecord"]) - if(hasHUD(usr, HUD_SECURITY)) + if(hasHUD(user, HUD_SECURITY)) var/perpname = "wot" var/read = 0 @@ -274,11 +260,11 @@ var/datum/computer_file/report/crew_record/E = network.get_crew_record_by_name(perpname) if(E) if(hasHUD(user, HUD_MEDICAL)) - to_chat(usr, "Name: [E.get_name()]") - to_chat(usr, "Gender: [E.get_gender()]") - to_chat(usr, "Species: [E.get_species_name()]") - to_chat(usr, "Blood Type: [E.get_bloodtype()]") - to_chat(usr, "Details: [E.get_medical_record()]") + to_chat(user, "Name: [E.get_name()]") + to_chat(user, "Gender: [E.get_gender()]") + to_chat(user, "Species: [E.get_species_name()]") + to_chat(user, "Blood Type: [E.get_bloodtype()]") + to_chat(user, "Details: [E.get_medical_record()]") read = 1 if(!read) to_chat(user, "Unable to locate a data core entry for this person.") @@ -360,7 +346,7 @@ return var/decl/pronouns/pronouns = get_pronouns() visible_message(SPAN_DANGER("\The [src] starts sticking a finger down [pronouns.his] own throat. It looks like [pronouns.he] [pronouns.is] trying to throw up!")) - if(!do_after(src, 30)) + if(!do_after(src, 3 SECONDS)) return timevomit = max(timevomit, 5) @@ -369,13 +355,22 @@ lastpuke = TRUE to_chat(src, SPAN_WARNING("You feel nauseous...")) + var/finish_time = 35 SECONDS if(level > 1) - sleep(150 / timevomit) //15 seconds until second warning - to_chat(src, SPAN_WARNING("You feel like you are about to throw up!")) + // 15 seconds until second warning + addtimer(CALLBACK(src, PROC_REF(vomit_second_warning_message)), 15 SECONDS / timevomit) + finish_time += 15 SECONDS / timevomit if(level > 2) - sleep(100 / timevomit) //and you have 10 more for mad dash to the bucket - empty_stomach() - sleep(350) //wait 35 seconds before next volley + // and you have 10 more for mad dash to the bucket + // timer delay must include the time from the prior one also + addtimer(CALLBACK(src, PROC_REF(empty_stomach)), 25 SECONDS / timevomit) + finish_time += 10 SECONDS / timevomit + addtimer(CALLBACK(src, PROC_REF(reset_vomit_cooldown)), finish_time) + +/mob/living/human/proc/vomit_second_warning_message() + to_chat(src, SPAN_WARNING("You feel like you are about to throw up!")) + +/mob/living/human/proc/reset_vomit_cooldown() lastpuke = FALSE /mob/living/human/proc/increase_germ_level(n) @@ -439,7 +434,7 @@ var/obj/item/organ/internal/stomach/stomach = get_organ(BP_STOMACH, /obj/item/organ/internal/stomach) if(stomach && stomach.contents.len) for(var/obj/item/O in stomach.contents) - if((O.edge || O.sharp) && prob(5)) + if((O.is_sharp() || O.has_edge()) && prob(5)) var/obj/item/organ/external/parent = GET_EXTERNAL_ORGAN(src, stomach.parent_organ) if(prob(1) && can_feel_pain() && O.can_embed()) to_chat(src, SPAN_DANGER("You feel something rip out of your [stomach.name]!")) @@ -511,9 +506,6 @@ if(species.holder_type) holder_type = species.holder_type 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) apply_species_appearance() var/decl/pronouns/new_pronouns = get_pronouns_by_gender(get_gender()) @@ -963,9 +955,6 @@ /mob/living/human/get_admin_job_string() return job || uppertext(species.name) -/mob/living/human/can_change_intent() - return TRUE - /mob/living/human/breathing_hole_covered() . = ..() if(!.) @@ -1072,48 +1061,11 @@ return SScharacter_info.get_record(comments_record_id, TRUE) return ..() -/mob/living/human/proc/get_age() - . = LAZYACCESS(appearance_descriptors, "age") || 30 - /mob/living/human/proc/set_age(var/val) var/decl/bodytype/bodytype = get_bodytype() var/datum/appearance_descriptor/age = LAZYACCESS(bodytype.appearance_descriptors, "age") LAZYSET(appearance_descriptors, "age", (age ? age.sanitize_value(val) : 30)) -/mob/living/human/HandleBloodTrail(turf/T, old_loc) - // Tracking blood - var/obj/item/source - var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) - if(istype(shoes)) - shoes.handle_movement(src, MOVING_QUICKLY(src)) - if(shoes.coating && shoes.coating.total_volume > 1) - source = shoes - else - for(var/foot_tag in list(BP_L_FOOT, BP_R_FOOT)) - var/obj/item/organ/external/stomper = GET_EXTERNAL_ORGAN(src, foot_tag) - if(stomper && stomper.coating && stomper.coating.total_volume > 1) - source = stomper - if(!source) - species.handle_trail(src, T, old_loc) - return - - var/list/bloodDNA - var/bloodcolor - var/list/blood_data = REAGENT_DATA(source.coating, /decl/material/liquid/blood) - if(blood_data) - bloodDNA = list(blood_data[DATA_BLOOD_DNA] = blood_data[DATA_BLOOD_TYPE]) - else - bloodDNA = list() - bloodcolor = source.coating.get_color() - source.remove_coating(1) - update_equipment_overlay(slot_shoes_str) - - if(species.get_move_trail(src)) - T.AddTracks(species.get_move_trail(src),bloodDNA, dir, 0, bloodcolor) // Coming - if(isturf(old_loc)) - var/turf/old_turf = old_loc - old_turf.AddTracks(species.get_move_trail(src), bloodDNA, 0, dir, bloodcolor) // Going - /mob/living/human/remove_implant(obj/item/implant, surgical_removal = FALSE, obj/item/organ/external/affected) if((. = ..()) && !surgical_removal) shock_stage += 20 diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index dca7496e1a8..d32ec613162 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -1,13 +1,12 @@ /mob/living/human/proc/get_unarmed_attack(var/mob/target, var/hit_zone = null) if(!hit_zone) hit_zone = get_target_zone() - var/list/available_attacks = get_natural_attacks() + var/list/available_attacks = get_mob_natural_attacks() var/decl/natural_attack/use_attack = default_attack if(!use_attack || !use_attack.is_usable(src, target, hit_zone) || !(use_attack.type in available_attacks)) use_attack = null var/list/other_attacks = list() - for(var/u_attack_type in available_attacks) - var/decl/natural_attack/u_attack = GET_DECL(u_attack_type) + for(var/decl/natural_attack/u_attack as anything in available_attacks) if(!u_attack.is_usable(src, target, hit_zone)) continue if(u_attack.is_starting_default) @@ -18,83 +17,92 @@ use_attack = pick(other_attacks) . = use_attack?.resolve_to_soft_variant(src) -/mob/living/human/proc/get_natural_attacks() - . = list() - for(var/obj/item/organ/external/limb in get_external_organs()) - if(length(limb.unarmed_attacks) && limb.is_usable()) - . |= limb.unarmed_attacks - -/mob/living/human/default_help_interaction(mob/user) - - if(user != src) - if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !on_fire && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) - if (performing_cpr) - performing_cpr = FALSE - else - performing_cpr = TRUE - start_compressions(user, TRUE) - return TRUE - - if(apply_pressure(user, user.get_target_zone())) - return TRUE +/obj/item/organ/external/proc/get_natural_attacks() + return null - return ..() - - var/decl/pronouns/pronouns = get_pronouns() - visible_message( - SPAN_NOTICE("\The [src] examines [pronouns.self]."), - SPAN_NOTICE("You check yourself for injuries.") - ) - - // TODO: move status strings onto the organ and handle crystal/prosthetic limbs. - for(var/obj/item/organ/external/org in get_external_organs()) - var/list/status = list() - - var/feels = 1 + round(org.pain/100, 0.1) - var/feels_brute = org.can_feel_pain() ? (org.brute_dam * feels) : 0 +/obj/item/organ/external/proc/get_injury_status(include_pain = TRUE, include_visible = TRUE) + . = list() + if(include_pain && can_feel_pain()) + var/feels = 1 + round(get_pain()/100, 0.1) + var/feels_brute = brute_dam * feels if(feels_brute > 0) - switch(feels_brute / org.max_damage) + switch(feels_brute / max_damage) if(0 to 0.35) - status += "slightly sore" + . += "slightly sore" if(0.35 to 0.65) - status += "very sore" + . += "very sore" if(0.65 to INFINITY) - status += "throbbing with agony" + . += "throbbing with agony" - var/feels_burn = org.can_feel_pain() ? (org.burn_dam * feels) : 0 + var/feels_burn = burn_dam * feels if(feels_burn > 0) - switch(feels_burn / org.max_damage) + switch(feels_burn / max_damage) if(0 to 0.35) - status += "tingling" + . += "tingling" if(0.35 to 0.65) - status += "stinging" + . += "stinging" if(0.65 to INFINITY) - status += "burning fiercely" - - if(org.status & ORGAN_MUTATED) - status += "misshapen" - if(org.status & ORGAN_BLEEDING) - status += "bleeding" - if(org.is_dislocated()) - status += "dislocated" - if(org.status & ORGAN_BROKEN && org.can_feel_pain()) - status += "painful to the touch" - - if(org.status & ORGAN_DEAD) - if(BP_IS_PROSTHETIC(org) || BP_IS_CRYSTAL(org)) - status += "irrecoverably damaged" + . += "burning fiercely" + + if(status & ORGAN_BROKEN) + . += "painful to the touch" + + if(include_visible && !owner?.is_blind()) + if(status & ORGAN_MUTATED) + . += "misshapen" + if(status & ORGAN_BLEEDING) + . += "bleeding" + if(is_dislocated()) + . += "dislocated" + if(status & ORGAN_DEAD) + if(BP_IS_PROSTHETIC(src) || BP_IS_CRYSTAL(src)) + . += "irrecoverably damaged" else - status += "grey and necrotic" - else if(org.damage >= org.max_damage && org.germ_level >= INFECTION_LEVEL_TWO) - status += "likely beyond saving and decay has set in" - if(!org.is_usable() || org.is_dislocated()) - status += "dangling uselessly" - - if(status.len) - show_message("My [org.name] is [english_list(status)].",1) + . += "grey and necrotic" + else if(damage >= max_damage && germ_level >= INFECTION_LEVEL_TWO) + . += "likely beyond saving and decay has set in" + + if(!is_usable() || is_dislocated()) // This one is special and has a different message for visible/pain modes. + . += (!include_visible || owner?.is_blind()) ? "completely limp" : "dangling uselessly" + +/mob/living/human/proc/check_self_injuries(include_pain = TRUE, include_visible = TRUE) + if(include_visible) + var/decl/pronouns/pronouns = get_pronouns() + visible_message( + SPAN_NOTICE("\The [src] examines [pronouns.self]."), + SPAN_NOTICE("You check yourself for injuries.") + ) + else if(include_pain) + to_chat(src, SPAN_NOTICE("You take note of how your body feels...")) + else + return // This should never happen, we should always check pain, visible status, or both. + + // TODO: move status strings onto the bodytype and handle crystal/prosthetic limbs. + for(var/obj/item/organ/external/org in get_external_organs()) + var/list/status = org.get_injury_status(include_pain, include_visible) + if(length(status)) + to_chat(src, "Your [org.name] is [english_list(status)].") + else if(is_blind() || !include_visible) + to_chat(src, "You can't feel anything wrong with your [org.name].") + else if(!include_pain) + to_chat(src, "You can't see anything wrong with your [org.name].") else - show_message("My [org.name] is OK.",1) - return TRUE + to_chat(src, "Your [org.name] is OK.") + +/mob/living/human/default_help_interaction(mob/user) + if(apply_pressure(user, user.get_target_zone())) + return TRUE + if(user == src) + check_self_injuries() + return TRUE + if(ishuman(user) && (is_asystole() || (status_flags & FAKEDEATH) || failed_last_breath) && !is_on_fire() && !(user.get_target_zone() == BP_R_ARM || user.get_target_zone() == BP_L_ARM)) + if (performing_cpr) + performing_cpr = FALSE + else + performing_cpr = TRUE + start_compressions(user, TRUE) + return TRUE + return ..() /mob/living/human/default_disarm_interaction(mob/user) var/decl/species/user_species = user.get_species() @@ -113,10 +121,6 @@ to_chat(user, SPAN_WARNING("You can't attack while incapacitated.")) return TRUE - // AI driven mobs have a melee telegraph that needs to be handled here. - if(user.a_intent == I_HURT && !user.do_attack_windup_checking(src)) - return TRUE - if(!ishuman(user)) attack_generic(user, rand(1,3), "punched") return TRUE @@ -144,15 +148,13 @@ to_chat(user, SPAN_DANGER("They are missing that limb!")) return TRUE - switch(src.a_intent) - if(I_HELP) - // We didn't see this coming, so we get the full blow - rand_damage = 5 - accurate = 1 - if(I_HURT, I_GRAB) - // We're in a fighting stance, there's a chance we block - if(MayMove() && src!=H && prob(20)) - block = 1 + // We didn't see this coming, so we get the full blow + if(check_intent(I_FLAG_HELP)) + rand_damage = 5 + accurate = 1 + // We're in a fighting stance, there's a chance we block + else if(check_intent(I_FLAG_HARM|I_FLAG_GRAB) && MayMove() && src != H && prob(20)) + block = 1 if (LAZYLEN(user.grabbed_by)) // Someone got a good grip on them, they won't be able to do much damage @@ -218,9 +220,12 @@ rand_damage *= damage_multiplier real_damage = max(1, real_damage) // Apply additional unarmed effects. - attack.apply_effects(H, src, rand_damage, hit_zone) + attack.apply_attack_effects(H, src, rand_damage, hit_zone) // Finally, apply damage to target apply_damage(real_damage, attack.get_damage_type(), hit_zone, damage_flags=attack.damage_flags()) + if(attack.apply_cooldown) + H.setClickCooldown(attack.apply_cooldown) + if(istype(ai)) ai.retaliate(user) return TRUE @@ -228,7 +233,7 @@ /mob/living/human/attack_hand(mob/user) remove_cloaking_source(species) - if(user.a_intent != I_GRAB) + if(!user.check_intent(I_FLAG_GRAB)) for (var/obj/item/grab/grab as anything in user.get_active_grabs()) if(grab.assailant == user && grab.affecting == src && grab.resolve_openhand_attack()) return TRUE @@ -400,14 +405,12 @@ set src = usr var/list/choices - for(var/thing in get_natural_attacks()) - var/decl/natural_attack/u_attack = GET_DECL(thing) - if(istype(u_attack)) - var/image/radial_button = new - radial_button.name = capitalize(u_attack.name) - LAZYSET(choices, u_attack, radial_button) + for(var/decl/natural_attack/u_attack as anything in get_mob_natural_attacks()) + var/image/radial_button = new + radial_button.name = capitalize(u_attack.name) + LAZYSET(choices, u_attack, radial_button) var/decl/natural_attack/new_attack = show_radial_menu(src, (attack_selector || src), choices, radius = 42, use_labels = RADIAL_LABELS_OFFSET) - if(QDELETED(src) || !istype(new_attack) || !(new_attack.type in get_natural_attacks())) + if(QDELETED(src) || !istype(new_attack) || !(new_attack in get_mob_natural_attacks())) return default_attack = new_attack to_chat(src, SPAN_NOTICE("Your default unarmed attack is now [default_attack?.name || "cleared"].")) @@ -422,6 +425,6 @@ // Dexterity ect. should be checked in these procs regardless, // but unarmed attacks that don't require hands should still // have the ability to be used. - if(!(. = ..()) && !get_active_held_item_slot() && a_intent == I_HURT && isliving(A)) + if(!(. = ..()) && !get_active_held_item_slot() && check_intent(I_FLAG_HARM) && isliving(A)) var/mob/living/victim = A return victim.default_hurt_interaction(src) diff --git a/code/modules/mob/living/human/human_defense.dm b/code/modules/mob/living/human/human_defense.dm index 1014326d217..6b25c9c1580 100644 --- a/code/modules/mob/living/human/human_defense.dm +++ b/code/modules/mob/living/human/human_defense.dm @@ -28,7 +28,7 @@ meteor_act return blocked -/mob/living/human/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone) +/mob/living/human/stun_effect_act(stun_amount, agony_amount, def_zone, used_weapon) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(src, def_zone) if(!affected) return @@ -85,20 +85,6 @@ meteor_act // Add inherent armor to the end of list so that protective equipment is checked first . += ..() -/mob/living/human/proc/check_head_coverage() - for(var/slot in global.standard_headgear_slots) - var/obj/item/clothing/clothes = get_equipped_item(slot) - if(istype(clothes) && (clothes.body_parts_covered & SLOT_HEAD)) - return TRUE - return FALSE - -//Used to check if they can be fed food/drinks/pills -/mob/living/human/check_mouth_coverage() - for(var/slot in global.standard_headgear_slots) - var/obj/item/gear = get_equipped_item(slot) - if(istype(gear) && (gear.body_parts_covered & SLOT_FACE) && !(gear.item_flags & ITEM_FLAG_FLEXIBLEMATERIAL)) - return gear - /mob/living/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) for (var/obj/item/grab/grab as anything in grabbed_by) @@ -154,7 +140,7 @@ meteor_act var/blocked = get_blocked_ratio(hit_zone, I.atom_damage_type, I.damage_flags(), I.armor_penetration, I.get_attack_force(user)) // Handle striking to cripple. - if(user.a_intent == I_DISARM) + if(user.check_intent(I_FLAG_DISARM)) effective_force *= 0.66 //reduced effective force... if(!..(I, user, effective_force, hit_zone)) return 0 @@ -197,14 +183,14 @@ meteor_act return //make non-sharp low-force weapons less likely to be bloodied - if(W.sharp || prob(effective_force*4)) + if(W.is_sharp() || prob(effective_force*4)) if(!(W.atom_flags & ATOM_FLAG_NO_BLOOD)) W.add_blood(src) else return //if the weapon itself didn't get bloodied than it makes little sense for the target to be bloodied either //getting the weapon bloodied is easier than getting the target covered in blood, so run prob() again - if(prob(33 + W.sharp*10)) + if(prob(33 + W.is_sharp() * 10)) var/turf/location = loc if(istype(location) && location.simulated) location.add_blood(src) @@ -234,7 +220,7 @@ meteor_act /mob/living/human/proc/projectile_hit_bloody(obj/item/projectile/P, var/effective_force, var/hit_zone, var/obj/item/organ/external/organ) if(P.atom_damage_type != BRUTE || P.nodamage) return - if(!(P.sharp || prob(effective_force*4))) + if(!(P.is_sharp() || prob(effective_force*4))) return if(prob(effective_force)) var/turf/location = loc @@ -360,60 +346,6 @@ meteor_act fire_act(air, temperature) return FALSE -//Removed the horrible safety parameter. It was only being used by ninja code anyways. -//Now checks siemens_coefficient of the affected area by default -/mob/living/human/electrocute_act(var/shock_damage, var/obj/source, var/base_siemens_coeff = 1.0, var/def_zone = null) - - if(status_flags & GODMODE) return 0 //godmode - - if(species.get_shock_vulnerability(src) == -1) - if(stored_shock_by_ref["\ref[src]"]) - stored_shock_by_ref["\ref[src]"] += shock_damage - else - stored_shock_by_ref["\ref[src]"] = shock_damage - return - - if (!def_zone) - def_zone = pick(BP_L_HAND, BP_R_HAND) - - shock_damage = apply_shock(shock_damage, def_zone, base_siemens_coeff) - - if(!shock_damage) - return 0 - - stun_effect_act(agony_amount=shock_damage, def_zone=def_zone) - - playsound(loc, "sparks", 50, 1, -1) - if (shock_damage > 15) - src.visible_message( - "[src] was electrocuted[source ? " by the [source]" : ""]!", \ - "You feel a powerful shock course through your body!", \ - "You hear a heavy electrical crack." \ - ) - else - src.visible_message( - "[src] was shocked[source ? " by the [source]" : ""].", \ - "You feel a shock course through your body.", \ - "You hear a zapping sound." \ - ) - - switch(shock_damage) - if(11 to 15) - SET_STATUS_MAX(src, STAT_STUN, 1) - if(16 to 20) - SET_STATUS_MAX(src, STAT_STUN, 2) - if(21 to 25) - SET_STATUS_MAX(src, STAT_WEAK, 2) - if(26 to 30) - SET_STATUS_MAX(src, STAT_WEAK, 5) - if(31 to INFINITY) - SET_STATUS_MAX(src, STAT_WEAK, 10) //This should work for now, more is really silly and makes you lay there forever - - set_status(STAT_JITTER, min(shock_damage*5, 200)) - - spark_at(loc, amount=5, cardinal_only = TRUE) - - return shock_damage /mob/living/human/explosion_act(severity) ..() diff --git a/code/modules/mob/living/human/human_defines.dm b/code/modules/mob/living/human/human_defines.dm index 43ddcc8626c..be736a3eb0d 100644 --- a/code/modules/mob/living/human/human_defines.dm +++ b/code/modules/mob/living/human/human_defines.dm @@ -13,7 +13,6 @@ /// multiplies melee combat damage var/damage_multiplier = 1 var/list/worn_underwear = list() - var/datum/backpack_setup/backpack_setup var/list/background_info = list() var/obj/screen/default_attack_selector/attack_selector var/icon/stand_icon = null @@ -24,8 +23,6 @@ var/mob/remoteview_target = null var/hand_blood_color var/list/flavor_texts = list() - /// Are you trying not to hurt your opponent? - var/pulling_punches /// We are a robutt. var/full_prosthetic /// Number of robot limbs. diff --git a/code/modules/mob/living/human/human_helpers.dm b/code/modules/mob/living/human/human_helpers.dm index 66e9f18001f..3148393b04e 100644 --- a/code/modules/mob/living/human/human_helpers.dm +++ b/code/modules/mob/living/human/human_helpers.dm @@ -116,9 +116,8 @@ ping_image.layer = BEAM_PROJECTILE_LAYER ping_image.pixel_x = (T.x - src.x) * WORLD_ICON_SIZE ping_image.pixel_y = (T.y - src.y) * WORLD_ICON_SIZE - show_image(src, ping_image) - spawn(8) - qdel(ping_image) + show_image(src, ping_image) // todo: should this use screen stuff instead? + QDEL_IN(ping_image, 0.8 SECONDS) // qdeling an image is gross but oh well var/feedback = list("There are noises of movement ") var/direction = get_dir(src, L) if(direction) diff --git a/code/modules/mob/living/human/human_movement.dm b/code/modules/mob/living/human/human_movement.dm index a31e6788e00..39f3c3a2841 100644 --- a/code/modules/mob/living/human/human_movement.dm +++ b/code/modules/mob/living/human/human_movement.dm @@ -118,8 +118,7 @@ handle_leg_damage() species.handle_post_move(src) if(client) - var/turf/B = GetAbove(src) - up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" + up_hint.update_icon() /mob/living/human/proc/handle_leg_damage() if(!can_feel_pain()) diff --git a/code/modules/mob/living/human/human_species.dm b/code/modules/mob/living/human/human_species.dm index 6988a940bed..c499bbb2da2 100644 --- a/code/modules/mob/living/human/human_species.dm +++ b/code/modules/mob/living/human/human_species.dm @@ -37,9 +37,6 @@ corpse.equip_corpse_outfit(src) return INITIALIZE_HINT_LATELOAD -/mob/living/human/corpse/get_death_message(gibbed) - return SKIP_DEATH_MESSAGE - /mob/living/human/corpse/LateInitialize() ..() var/current_max_health = get_max_health() diff --git a/code/modules/mob/living/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm index cbb81999bfe..f832994185c 100644 --- a/code/modules/mob/living/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -97,8 +97,8 @@ target.show_message("You hear a voice that seems to echo around the room: [say]") usr.show_message("You project your mind into [target.real_name]: [say]") log_say("[key_name(usr)] sent a telepathic message to [key_name(target)]: [say]") - for(var/mob/observer/ghost/pronouns in global.player_list) - pronouns.show_message("Telepathic message from [src] to [target]: [say]") + for(var/mob/observer/ghost/ghost in global.player_list) + ghost.show_message("Telepathic message from [src] to [target]: [say]") /mob/living/human/proc/remoteobserve() set name = "Remote View" @@ -319,9 +319,3 @@ "[self ? "You pop" : "[U] pops"] your [current_limb.joint] back in!" \ ) current_limb.undislocate() - -/mob/living/human/verb/pull_punches() - set name = "Switch Stance" - set desc = "Try not to hurt them." - set category = "IC" - species.toggle_stance(src) diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index b6a065fc2f7..ebc47ef1202 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -258,7 +258,7 @@ return /mob/living/human/get_bodytemperature_difference() - if (on_fire) + if (is_on_fire()) return 0 //too busy for pesky metabolic regulation return ..() @@ -490,7 +490,7 @@ // Apply a fire overlay if we're burning. var/crit_markers = get_ui_icon(client?.prefs?.UI_style, UI_ICON_CRIT_MARKER) - if(on_fire) + if(is_on_fire()) health_images += image(crit_markers, "burning") // Show a general pain/crit indicator if needed. @@ -746,7 +746,8 @@ if(I) var/datum/job/J = SSjobs.get_by_title(I.GetJobName()) if(J) - holder.icon_state = J.hud_icon + holder.icon = J.hud_icon + holder.icon_state = J.hud_icon_state hud_list[ID_HUD] = holder @@ -781,17 +782,16 @@ var/image/holder2 = hud_list[IMPLOYAL_HUD] var/image/holder3 = hud_list[IMPCHEM_HUD] - holder1.icon_state = "hudblank" - holder2.icon_state = "hudblank" - holder3.icon_state = "hudblank" - + holder1.icon_state = "hud_imp_blank" + holder2.icon_state = "hud_imp_blank" + holder3.icon_state = "hud_imp_blank" for(var/obj/item/implant/I in src) if(I.implanted) if(istype(I,/obj/item/implant/tracking)) holder1.icon_state = "hud_imp_tracking" - if(istype(I,/obj/item/implant/loyalty)) + else if(istype(I,/obj/item/implant/loyalty)) holder2.icon_state = "hud_imp_loyal" - if(istype(I,/obj/item/implant/chem)) + else if(istype(I,/obj/item/implant/chem)) holder3.icon_state = "hud_imp_chem" hud_list[IMPTRACK_HUD] = holder1 diff --git a/code/modules/mob/living/human/unarmed_attack.dm b/code/modules/mob/living/human/unarmed_attack.dm index 39fc3fee25f..3ae4dece2a1 100644 --- a/code/modules/mob/living/human/unarmed_attack.dm +++ b/code/modules/mob/living/human/unarmed_attack.dm @@ -18,6 +18,7 @@ var/eye_attack_text_victim var/list/usable_with_limbs = list(BP_L_HAND, BP_R_HAND) var/is_starting_default = FALSE + var/apply_cooldown = DEFAULT_ATTACK_COOLDOWN /decl/natural_attack/proc/summarize() var/list/usable_limbs = list() @@ -74,7 +75,7 @@ return damage // Returns TRUE if further affects should be applied. -/decl/natural_attack/proc/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/proc/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) if(target.stat == DEAD) return FALSE @@ -158,24 +159,24 @@ user.visible_message(SPAN_DANGER("\The [user] attempts to press [pronouns.his] [eye_attack_text] into \the [target]'s eyes, but [target_gender.he] [target_gender.does]n't have any!")) /decl/natural_attack/proc/damage_flags() - return (src.sharp? DAM_SHARP : 0)|(src.edge? DAM_EDGE : 0) + return (sharp ? DAM_SHARP : 0) | (edge ? DAM_EDGE : 0) /decl/natural_attack/bite - name = "bite" + name = "bite" selector_icon_state = "attack_bite" - attack_verb = list("bit") - attack_noun = list("mouth") - attack_sound = 'sound/weapons/bite.ogg' - shredding = 0 - damage = 0 - sharp = 0 - edge = 0 - usable_with_limbs = list(BP_HEAD) + attack_verb = list("bit") + attack_noun = list("mouth") + attack_sound = 'sound/weapons/bite.ogg' + shredding = 0 + damage = 5 + sharp = FALSE + edge = FALSE + usable_with_limbs = list(BP_HEAD) /decl/natural_attack/bite/sharp attack_verb = list("bit", "chomped") - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE /decl/natural_attack/bite/is_usable(var/mob/living/human/user, var/mob/living/human/target, var/zone) @@ -271,7 +272,7 @@ var/obj/item/clothing/shoes = user.get_equipped_item(slot_shoes_str) if(!istype(shoes)) return damage - return damage + (shoes ? shoes.get_attack_force(user) : 0) + return damage + (shoes ? shoes.expend_attack_force(user) : 0) /decl/natural_attack/kick/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) @@ -307,7 +308,7 @@ /decl/natural_attack/stomp/get_unarmed_damage(mob/living/user, mob/living/victim) var/obj/item/clothing/shoes = user.get_equipped_item(slot_shoes_str) - return damage + (shoes ? shoes.get_attack_force(user) : 0) + return damage + (shoes ? shoes.expend_attack_force(user) : 0) /decl/natural_attack/stomp/show_attack(var/mob/living/human/user, var/mob/living/human/target, var/zone, var/attack_damage) @@ -341,8 +342,8 @@ attack_verb = list("tapped", "lightly struck") shredding = 0 damage = 0 - sharp = 0 - edge = 0 + sharp = FALSE + edge = FALSE attack_sound = "light_strike" /decl/natural_attack/light_strike/punch @@ -369,8 +370,8 @@ attack_noun = list("forelimb") damage = 8 shredding = 1 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE delay = 20 eye_attack_text = "a forelimb" eye_attack_text_victim = "a forelimb" diff --git a/code/modules/mob/living/human/update_icons.dm b/code/modules/mob/living/human/update_icons.dm index d1c508dcd44..eafc3556942 100644 --- a/code/modules/mob/living/human/update_icons.dm +++ b/code/modules/mob/living/human/update_icons.dm @@ -139,7 +139,7 @@ Please contact me on #coderbus IRC. ~Carn x return var/matrix/M = matrix() - if(current_posture?.prone && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) + if(current_posture?.prone && !isnull(root_bodytype.prone_overlay_offset) && (root_bodytype.prone_overlay_offset[1] || root_bodytype.prone_overlay_offset[2])) M.Translate(root_bodytype.prone_overlay_offset[1], root_bodytype.prone_overlay_offset[2]) var/mangle_planes = FALSE @@ -320,27 +320,23 @@ Please contact me on #coderbus IRC. ~Carn x //UNDERWEAR OVERLAY /mob/living/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?.icon) // Avoid runtimes for nude underwear types - continue - - 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(src, 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 - 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) + var/list/undies_overlays = list() + var/decl/bodytype/root_bodytype = get_bodytype() + if(root_bodytype) + var/list/adjustments = root_bodytype.get_equip_adjustments(src) + for(var/obj/item/underwear/undies as anything in worn_underwear) + if (!undies?.icon) // Avoid runtimes for nude underwear types + continue + var/image/undies_overlay + if(undies.slot_offset_str && (undies.slot_offset_str in adjustments)) + undies_overlay = root_bodytype.get_offset_overlay_image(src, undies.icon, undies.icon_state, undies.color, undies.slot_offset_str) + else + undies_overlay = image(icon = undies.icon, icon_state = undies.icon_state) + undies_overlay.color = undies.color + if(undies_overlay) // get_offset_overlay_image() may potentially return null + undies_overlay.appearance_flags |= RESET_COLOR + undies_overlays += undies_overlay + set_current_mob_overlay(HO_UNDERWEAR_LAYER, undies_overlays, update_icons) /mob/living/human/update_hair(var/update_icons=1) var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD, /obj/item/organ/external/head) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 903b1bc8ecb..f0ab7bdc92e 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -62,11 +62,8 @@ if(slot != last_slot && (slot in get_held_item_slots())) _held_item_slot_selected = slot if(istype(hud_used)) - for(var/obj/screen/inventory/hand in hud_used.hand_hud_objects) - hand.cut_overlay("hand_selected") - if(hand.slot_id == slot) - hand.add_overlay("hand_selected") - hand.compile_overlays() + for(var/atom/hand as anything in hud_used.hand_hud_objects) + hand.update_icon() var/obj/item/I = get_active_held_item() if(istype(I)) I.on_active_hand() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index e73ef41b016..05d2002770b 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -1,6 +1,5 @@ /mob/living/Life() set invisibility = FALSE - set background = BACKGROUND_ENABLED ..() @@ -23,6 +22,8 @@ //Handle temperature/pressure differences between body and environment handle_environment(loc.return_air()) + if(QDELETED(src)) // Destroyed by fire or pressure damage in handle_environment() + return PROCESS_KILL handle_regular_status_updates() // Status & health update, are we dead or alive etc. handle_stasis() @@ -121,7 +122,7 @@ return TRUE /mob/living/proc/experiences_hunger_and_thirst() - return TRUE + return !isSynthetic() // Doesn't really apply to robots. Maybe unify this with cells in the future. /mob/living/proc/get_hunger_factor() var/decl/species/my_species = get_species() @@ -273,9 +274,10 @@ if(!loc) return var/datum/reagents/touching_reagents = get_contact_reagents() - if(!touching_reagents?.total_volume) + if(touching_reagents?.total_volume <= FLUID_MINIMUM_TRANSFER) + touching_reagents?.clear_reagents() return - var/drip_amount = max(1, round(touching_reagents.total_volume * 0.1)) + var/drip_amount = max(FLUID_MINIMUM_TRANSFER, round(touching_reagents.total_volume * 0.2)) if(drip_amount) touching_reagents.trans_to(loc, drip_amount) @@ -583,8 +585,7 @@ if(!root_bodytype) return - var/static/list/all_stance_limbs = list(ORGAN_CATEGORY_STANCE, ORGAN_CATEGORY_STANCE_ROOT) - var/expected_limbs_for_bodytype = root_bodytype.get_expected_organ_count_for_categories(all_stance_limbs) + var/expected_limbs_for_bodytype = root_bodytype.get_expected_organ_count_for_categories(global.all_stance_limbs) if(expected_limbs_for_bodytype <= 0) return // we don't care about stance for whatever reason. @@ -596,7 +597,7 @@ var/found_limbs = 0 var/had_limb_pain = FALSE - for(var/obj/item/organ/external/limb in get_organs_by_categories(all_stance_limbs)) + for(var/obj/item/organ/external/limb in get_organs_by_categories(global.all_stance_limbs)) found_limbs++ var/add_stance_damage = 0 if(limb.is_malfunctioning()) @@ -631,7 +632,7 @@ // Calculate the expected and actual number of functioning legs we have. var/has_sufficient_working_legs = TRUE - var/list/root_limb_tags = root_bodytype.organ_tags_by_category[ORGAN_CATEGORY_STANCE_ROOT] + var/list/root_limb_tags = root_bodytype.get_expected_organ_tags_for_category(ORGAN_CATEGORY_STANCE_ROOT) var/minimum_working_legs = ceil(length(root_limb_tags) * 0.5) if(minimum_working_legs > 0) var/leg_count = 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ea245a54955..dcbc0d2917e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -36,7 +36,7 @@ if(!..()) return 0 - usr.visible_message("[src] points to [A]") + visible_message("[src] points to [A]") return 1 /*one proc, four uses @@ -62,7 +62,7 @@ default behaviour is: if(mob_bump_flag & context_flags) return 1 else - return ((a_intent == I_HELP && swapped.a_intent == I_HELP) && swapped.can_move_mob(src, swapping, 1)) + return ((check_intent(I_FLAG_HELP) && swapped.check_intent(I_FLAG_HELP)) && swapped.can_move_mob(src, swapping, 1)) /mob/living/canface() if(stat) @@ -107,7 +107,7 @@ default behaviour is: if(src.restrained()) now_pushing = 0 return - if(tmob.a_intent != I_HELP) + if(!tmob.check_intent(I_FLAG_HELP)) for(var/obj/item/shield/riot/shield in tmob.get_held_items()) if(prob(99)) now_pushing = 0 @@ -176,7 +176,7 @@ default behaviour is: if(tmob.buckled || buckled || tmob.anchored) return 0 //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - if(!(tmob.mob_always_swap || (tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || src.restrained()))) + if(!(tmob.mob_always_swap || (tmob.check_intent(I_FLAG_HELP) || tmob.restrained()) && (check_intent(I_FLAG_HELP) || src.restrained()))) return 0 if(!tmob.MayMove(src) || incapacitated()) return 0 @@ -312,8 +312,8 @@ default behaviour is: BITSET(hud_updateflag, HEALTH_HUD) BITSET(hud_updateflag, STATUS_HUD) BITSET(hud_updateflag, LIFE_HUD) - ExtinguishMob() - fire_stacks = 0 + extinguish_fire() + set_fire_intensity(0) var/obj/item/cuffs = get_equipped_item(slot_handcuffed_str) if (cuffs) try_unequip(cuffs, get_turf(src)) @@ -406,7 +406,7 @@ default behaviour is: /mob/living/proc/update_damage_overlays(update_icons = TRUE) // first check whether something actually changed about damage appearance - var/damage_appearance = "" + var/damage_appearance = get_overlay_state_modifier() || "" for(var/obj/item/organ/external/O in get_external_organs()) damage_appearance += O.damage_state || "00" @@ -426,7 +426,7 @@ default behaviour is: continue var/icon/DI var/use_colour = (BP_IS_PROSTHETIC(O) ? SYNTH_BLOOD_COLOR : O.species.get_species_blood_color(src)) - var/cache_index = "[O.damage_state]/[O.bodytype.type]/[O.icon_state]/[use_colour]/[O.species.name]" + var/cache_index = "[O.damage_state]/[O.bodytype.uid]/[O.icon_state]/[use_colour]/[O.species.name]" if(!(cache_index in damage_icon_parts)) var/damage_overlay_icon = O.bodytype.get_damage_overlays(src) if(check_state_in_icon(O.damage_state, damage_overlay_icon)) @@ -551,8 +551,8 @@ default behaviour is: spawn() escape_buckle() return TRUE //drop && roll - else if(on_fire) - fire_stacks = max(0, fire_stacks-1.2) + else if(is_on_fire()) + set_fire_intensity(max(0, get_fire_intensity()-1.2)) SET_STATUS_MAX(src, STAT_WEAK, 3) spin(32,2) var/decl/pronouns/pronouns = get_pronouns() @@ -561,12 +561,12 @@ default behaviour is: SPAN_NOTICE("You stop, drop, and roll!") ) sleep(3 SECONDS) - if(fire_stacks <= 0) + if(get_fire_intensity() <= 0) visible_message( SPAN_NOTICE("\The [src] successfully extinguishes [pronouns.him][pronouns.self]!"), SPAN_NOTICE("You extinguish yourself.") ) - ExtinguishMob() + extinguish_fire() return TRUE //Breaking out of a structure? @@ -639,9 +639,9 @@ default behaviour is: /mob/living/verb/rest_verb() set name = "Rest" set category = "IC" - lay_down() + lay_down(block_posture = /decl/posture/sitting) -/mob/living/verb/lay_down() +/mob/living/verb/lay_down(block_posture as null) set name = "Change Posture" set category = "IC" @@ -650,6 +650,15 @@ default behaviour is: return var/list/selectable_postures = get_selectable_postures() + + if(block_posture) + for(var/decl/posture/selectable_posture in selectable_postures) + if(islist(block_posture)) + if(is_type_in_list(selectable_posture, block_posture)) + selectable_postures -= selectable_posture + else if(istype(selectable_posture, block_posture)) + selectable_postures -= selectable_posture + if(!length(selectable_postures)) return @@ -657,7 +666,7 @@ default behaviour is: if(length(selectable_postures) == 1) selected_posture = selectable_postures[1] else - selected_posture = input(usr, "Which posture do you wish to adopt?", "Change Posture", current_posture) as null|anything in selectable_postures + selected_posture = input(src, "Which posture do you wish to adopt?", "Change Posture", current_posture) as null|anything in selectable_postures if(!selected_posture || length(get_available_postures()) <= 1 || incapacitated(INCAPACITATION_KNOCKOUT) || !canClick()) return if(current_posture == selected_posture || !(selected_posture in get_selectable_postures())) @@ -685,7 +694,14 @@ default behaviour is: /mob/living/proc/has_brain() return TRUE -/mob/living/proc/slip(var/slipped_on, stun_duration = 8) +// We are jumping, levitating or being thrown. +/mob/living/immune_to_floor_hazards() + . = ..() || is_floating + +/mob/living/proc/slip(slipped_on, stun_duration = 8) + + if(immune_to_floor_hazards()) + return FALSE var/decl/species/my_species = get_species() if(my_species?.check_no_slip(src)) @@ -848,14 +864,19 @@ default behaviour is: /mob/living/fluid_act(var/datum/reagents/fluids) ..() - if(QDELETED(src) || !fluids?.total_volume) + if(QDELETED(src) || fluids?.total_volume < FLUID_PUDDLE) return fluids.touch_mob(src) - if(QDELETED(src) || !fluids.total_volume) + if(QDELETED(src) || fluids?.total_volume < FLUID_PUDDLE) return + var/on_turf = fluids.my_atom == get_turf(src) for(var/atom/movable/A as anything in get_equipped_items(TRUE)) if(!A.simulated) continue + // if we're being affected by reagent fluids, items check if they're submerged + // todo: i don't like how this works, it feels hacky. maybe separate coating and submersion somehow and make this only checked for submersion + if(on_turf && !A.submerged()) + continue A.fluid_act(fluids) if(QDELETED(src) || !fluids.total_volume) return @@ -920,7 +941,7 @@ default behaviour is: nutrition = clamp(amt, 0, get_max_nutrition()) /mob/living/proc/get_nutrition() - return nutrition + return isSynthetic() ? get_max_nutrition() : nutrition /mob/living/proc/adjust_nutrition(var/amt) set_nutrition(get_nutrition() + amt) @@ -929,7 +950,7 @@ default behaviour is: return 500 /mob/living/proc/get_hydration(var/amt) - return hydration + return isSynthetic() ? get_max_hydration() : hydration /mob/living/proc/set_hydration(var/amt) hydration = clamp(amt, 0, get_max_hydration()) @@ -1063,7 +1084,7 @@ default behaviour is: if(user.mob_size >= exosuit.body.min_pilot_size && user.mob_size <= exosuit.body.max_pilot_size) exosuit.enter(src) else - to_chat(usr, SPAN_WARNING("You cannot pilot a exosuit of this size.")) + to_chat(user, SPAN_WARNING("You cannot pilot a exosuit of this size.")) return TRUE . = ..() @@ -1079,17 +1100,19 @@ default behaviour is: ADJ_STATUS(src, STAT_STUN, -3) ADJ_STATUS(src, STAT_WEAK, -3) - if(fire_stacks >= target.fire_stacks + 3) - target.fire_stacks += 1 - fire_stacks -= 1 - else if(target.fire_stacks >= fire_stacks + 3) - fire_stacks += 1 - target.fire_stacks -= 1 + var/fire_level = get_fire_intensity() + var/target_fire_level = target.get_fire_intensity() + if(fire_level >= target_fire_level + 3) + target.adjust_fire_intensity(1) + adjust_fire_intensity(-1) + else if(target_fire_level >= fire_level + 3) + adjust_fire_intensity(1) + target.adjust_fire_intensity(-1) - if(on_fire && !target.on_fire) - target.IgniteMob() - else if(!on_fire && target.on_fire) - IgniteMob() + if(is_on_fire() && !target.is_on_fire()) + target.ignite_fire() + else if(!is_on_fire() && target.is_on_fire()) + ignite_fire() /mob/living/proc/jump_layer_shift() jumping = TRUE @@ -1189,6 +1212,7 @@ default behaviour is: expected_user_type = /mob/observer expected_target_type = /mob/living interaction_flags = 0 + examine_desc = null // DO NOT show this in general. /decl/interaction_handler/admin_kill/is_possible(atom/target, mob/user, obj/item/prop) . = ..() @@ -1359,11 +1383,6 @@ default behaviour is: 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) @@ -1486,7 +1505,7 @@ default behaviour is: /mob/living/proc/can_direct_mount(var/mob/user) if((user.faction == faction || !faction) && can_buckle && istype(user) && !user.incapacitated() && user == buckled_mob) - if(client && a_intent != I_HELP) + if(client && !check_intent(I_FLAG_HELP)) return FALSE // do not Ratatouille your colleagues // TODO: Piloting skillcheck for hands-free moving? Stupid but amusing for(var/obj/item/grab/reins in user.get_held_items()) @@ -1522,6 +1541,13 @@ default behaviour is: qdel(grab) if(istype(ai)) ai.on_buckled(M) + reset_layer() + update_icon() + +/mob/living/unbuckle_mob() + . = ..() + reset_layer() + update_icon() /mob/living/try_make_grab(mob/living/user, defer_hand = FALSE) . = ..() @@ -1534,7 +1560,7 @@ default behaviour is: /mob/living/OnSimulatedTurfEntered(turf/T, old_loc) T.add_dirt(0.5) - HandleBloodTrail(T, old_loc) + handle_walking_tracks(T, old_loc) if(current_posture.prone) return @@ -1565,8 +1591,50 @@ default behaviour is: step(src, dir) sleep(1) -/mob/living/proc/HandleBloodTrail(turf/T, old_loc) - return +/mob/living/proc/handle_walking_tracks(turf/T, old_loc) + + if(!T.can_show_coating_footprints()) + return + + // Tracking blood or other contaminants + var/obj/item/source + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes)) + shoes.handle_movement(src, MOVING_QUICKLY(src)) + if(shoes.coating && shoes.coating.total_volume > 1) + source = shoes + else + for(var/obj/item/organ/external/stomper in get_organs_by_categories(global.child_stance_limbs)) + if(stomper.coating?.total_volume > 1) + source = stomper + break + + var/decl/species/my_species = get_species() + if(!source) + my_species?.handle_trail(src, T, old_loc) + return + + var/use_move_trail = my_species?.get_move_trail(src) + if(!use_move_trail) + return + + var/decl/material/contaminant_type = source.coating.reagent_volumes[1] // take [1] instead of primary reagent to match what remove_any will probably remove + if(!T.can_show_coating_footprints(contaminant_type)) + return + /// An associative list of DNA unique enzymes -> blood type. Used by forensics, mostly. + var/list/bloodDNA = list() + var/track_color + var/list/source_data = REAGENT_DATA(source.coating, contaminant_type) + if(source_data && source_data[DATA_BLOOD_DNA] && source_data[DATA_BLOOD_TYPE]) + bloodDNA = list(source_data[DATA_BLOOD_DNA] = source_data[DATA_BLOOD_TYPE]) + track_color = source.coating.get_color() + T.AddTracks(use_move_trail, bloodDNA, dir, 0, track_color, contaminant_type) // Coming + if(isturf(old_loc)) + var/turf/old_turf = old_loc + if(old_turf.can_show_coating_footprints(contaminant_type)) + old_turf.AddTracks(use_move_trail, bloodDNA, 0, dir, track_color, contaminant_type) // Going + source.remove_coating(1) + update_equipment_overlay(slot_shoes_str) /mob/living/proc/handle_general_grooming(user, obj/item/grooming/tool) if(tool.grooming_flags & (GROOMABLE_BRUSH|GROOMABLE_COMB)) @@ -1697,7 +1765,7 @@ default behaviour is: user.set_special_ability_cooldown(5 SECONDS) visible_message(SPAN_DANGER("You hear something rumbling inside [src]'s stomach...")) var/obj/item/I = user.get_active_held_item() - var/force = I?.get_attack_force(user) + var/force = I?.expend_attack_force(user) if(!force) return var/d = rand(round(force / 4), force) @@ -1789,7 +1857,7 @@ default behaviour is: /mob/living/proc/get_door_pry_time() return 7 SECONDS -/mob/living/proc/pry_door(atom/target, pry_time) +/mob/living/proc/pry_door(delay, obj/machinery/door/target) return /mob/living/proc/turf_is_safe(turf/target) @@ -1867,8 +1935,8 @@ default behaviour is: var/screen_locs = gear.get_preview_screen_locs() if(screen_locs) return screen_locs - var/decl/species/my_species = get_species() - return my_species?.character_preview_screen_locs + var/decl/bodytype/my_bodytype = get_bodytype() + return my_bodytype?.character_preview_screen_locs /mob/living/can_twohand_item(obj/item/item) if(!istype(item) || !item.can_be_twohanded) @@ -1881,24 +1949,15 @@ default behaviour is: var/datum/inventory_slot/gripper/slot = get_inventory_slot_datum(empty_hand) if(!istype(slot)) continue + var/req_item_dex = item.get_required_attack_dexterity(src) if(slot.requires_organ_tag) var/obj/item/organ/external/hand = GET_EXTERNAL_ORGAN(src, slot.requires_organ_tag) - if(istype(hand) && hand.is_usable() && (!item.needs_attack_dexterity || hand.get_manual_dexterity() >= item.needs_attack_dexterity)) + if(istype(hand) && hand.is_usable() && (!req_item_dex || hand.get_manual_dexterity() >= req_item_dex)) return TRUE - else if(!item.needs_attack_dexterity || slot.dexterity >= item.needs_attack_dexterity) + else if(!req_item_dex || slot.dexterity >= req_item_dex) return TRUE return FALSE -/mob/living/buckle_mob(mob/living/M) - . = ..() - reset_layer() - update_icon() - -/mob/living/unbuckle_mob() - . = ..() - reset_layer() - update_icon() - /mob/living/proc/flee(atom/target, upset = FALSE) var/static/datum/automove_metadata/_flee_automove_metadata = new( _move_delay = null, @@ -1933,3 +1992,43 @@ default behaviour is: to_chat(user, SPAN_NOTICE("\The [src] can be milked into a bucket or other container.")) else to_chat(user, SPAN_WARNING("\The [src] cannot currently be milked.")) + +/mob/living/proc/get_age() + . = LAZYACCESS(appearance_descriptors, "age") || 30 + +/mob/living/proc/get_walking_contaminant_targets() + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes)) + if(!buckled) + return list(shoes) + else + return get_organs_by_categories(global.child_stance_limbs) + return null + +/// Adds `amount` units of `material_type` contaminant to whatever we're walking with, +/// be it shoes, normal human feet, dog paws, robot treads, a million millipede legs, +/// the sky's the limit. If multiple targets are returned from +/// `get_walking_contaminant_targets()`, then `amount` is split evenly +/// between them. +/mob/living/proc/add_walking_contaminant(material_type, amount, data) + if(amount <= 0) + return FALSE + var/list/obj/item/sources = get_walking_contaminant_targets() + if(!LAZYLEN(sources)) + return FALSE + var/amount_per = max(CHEMS_QUANTIZE(amount / length(sources)), MINIMUM_CHEMICAL_VOLUME) // don't let it round down to 0, always add something + for(var/obj/item/dirty_item in sources) + dirty_item.add_coating(material_type, amount_per, data) + // i don't like how hardcoded this is, it might be better to use RAISE_EVENT or something + // like /decl/observ/on_add_walking_contaminant or something + // or things should just update their worn slot when coating is added + update_equipment_overlay(slot_shoes_str) + return TRUE + +/mob/living/verb/pull_punches() + set name = "Switch Stance" + set desc = "Try not to hurt them." + set category = "IC" + if(!incapacitated()) + pulling_punches = !pulling_punches + to_chat(src, SPAN_NOTICE("You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].")) diff --git a/code/modules/mob/living/living_attackhand.dm b/code/modules/mob/living/living_attackhand.dm index af16a0e793b..52a96d71282 100644 --- a/code/modules/mob/living/living_attackhand.dm +++ b/code/modules/mob/living/living_attackhand.dm @@ -1,22 +1,19 @@ /mob/living/attack_hand(mob/user) // Allow grabbing a mob that you are buckled to, so that you can generate a control grab (for riding). - if(buckled == user && user.a_intent == I_GRAB) + if(buckled == user && user.check_intent(I_FLAG_GRAB)) return try_make_grab(user) return ..() || (user && default_interaction(user)) /mob/living/proc/default_interaction(var/mob/user) - SHOULD_CALL_PARENT(TRUE) - - switch(user.a_intent) - if(I_HURT) - . = default_hurt_interaction(user) - if(I_HELP) - . = default_help_interaction(user) - if(I_DISARM) - . = default_disarm_interaction(user) - if(I_GRAB) - . = default_grab_interaction(user) + if(user.check_intent(I_FLAG_HARM)) + . = default_hurt_interaction(user) + else if(user.check_intent(I_FLAG_HELP)) + . = default_help_interaction(user) + else if(user.check_intent(I_FLAG_DISARM)) + . = default_disarm_interaction(user) + else if(user.check_intent(I_FLAG_GRAB)) + . = default_grab_interaction(user) /mob/living/proc/default_hurt_interaction(var/mob/user) SHOULD_CALL_PARENT(TRUE) @@ -29,6 +26,7 @@ attackby(attacking_with, predator) else attack_animal(predator) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE return FALSE @@ -55,11 +53,11 @@ // Returns TRUE if further interactions should be halted, FALSE otherwise. /mob/living/proc/try_extinguish(mob/living/user) - if (!on_fire || !istype(user)) + if (!is_on_fire() || !istype(user)) return FALSE playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if (user.on_fire) + if (user.is_on_fire()) user.visible_message( SPAN_WARNING("\The [user] tries to pat out \the [src]'s flames, but to no avail!"), SPAN_WARNING("You try to pat out [src]'s flames, but to no avail! Put yourself out first!") @@ -74,25 +72,25 @@ if(!do_mob(user, src, 15)) return TRUE - fire_stacks -= 0.5 - if (prob(10) && (user.fire_stacks <= 0)) - user.fire_stacks += 1 - user.IgniteMob() - if (user.on_fire) + adjust_fire_intensity(-0.5) + if (prob(10) && (user.get_fire_intensity() <= 0)) + user.adjust_fire_intensity(1) + user.ignite_fire() + if (user.is_on_fire()) user.visible_message( SPAN_DANGER("The fire spreads from \the [src] to \the [user]!"), SPAN_DANGER("The fire spreads to you as well!") ) return TRUE - fire_stacks -= 0.5 //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. - if (fire_stacks <= 0) + adjust_fire_intensity(-0.5) //Less effective than stop, drop, and roll - also accounting for the fact that it takes half as long. + if (get_fire_intensity() <= 0) user.visible_message( SPAN_NOTICE("\The [user] successfully pats out \the [src]'s flames."), SPAN_NOTICE("You successfully pat out \the [src]'s flames.") ) - ExtinguishMob() - fire_stacks = 0 + extinguish_fire() + set_fire_intensity(0) return TRUE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 97fe9281e2c..fc07b274edc 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -25,7 +25,7 @@ var/obj/item/assembly/signaler/signaler = get_active_held_item() if(istype(signaler) && signaler.deadman) log_and_message_admins("has triggered a signaler deadman's switch") - src.visible_message("[src] triggers their deadman's switch!") + visible_message(SPAN_WARNING("[src] triggers their deadman's switch!")) signaler.signal() //Armor var/damage = P.damage @@ -83,7 +83,7 @@ //Handles the effects of "stun" weapons -/mob/living/proc/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null) +/mob/living/proc/stun_effect_act(stun_amount, agony_amount, def_zone, used_weapon) flash_pain() if (stun_amount) @@ -97,8 +97,53 @@ apply_effect(agony_amount/10, STUTTER) apply_effect(agony_amount/10, EYE_BLUR) -/mob/living/proc/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, def_zone = null) - return 0 // No root logic, implemented separately on human and silicon. +/mob/living/proc/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, def_zone) + SHOULD_CALL_PARENT(TRUE) + if(status_flags & GODMODE) + return 0 + + var/decl/species/my_species = get_species() + if(my_species?.species_flags & SPECIES_FLAG_ABSORB_ELECTRICITY) + spark_at(loc, amount=5, cardinal_only = TRUE) + LAZYADD(global.stored_shock_by_ref["\ref[src]"], shock_damage) + return 0 + + if(!shock_damage) + return 0 + + stun_effect_act(agony_amount=shock_damage, def_zone=def_zone) + + playsound(loc, "sparks", 50, 1, -1) + if (shock_damage > 15) + visible_message( + SPAN_DANGER("\The [src] was electrocuted[source ? " by \the [source]" : ""]!"), + SPAN_DANGER("You feel a powerful shock course through your body!"), + SPAN_WARNING("You hear a heavy electrical crack.") + ) + else + visible_message( + SPAN_DANGER("\The [src] was shocked[source ? " by \the [source]" : ""]."), + SPAN_DANGER("You feel a shock course through your body."), + SPAN_WARNING("You hear a zapping sound.") + ) + + switch(shock_damage) + if(11 to 15) + SET_STATUS_MAX(src, STAT_STUN, 1) + if(16 to 20) + SET_STATUS_MAX(src, STAT_STUN, 2) + if(21 to 25) + SET_STATUS_MAX(src, STAT_WEAK, 2) + if(26 to 30) + SET_STATUS_MAX(src, STAT_WEAK, 5) + if(31 to INFINITY) + SET_STATUS_MAX(src, STAT_WEAK, 10) //This should work for now, more is really silly and makes you lay there forever + + set_status(STAT_JITTER, min(shock_damage*5, 200)) + + spark_at(loc, amount=5, cardinal_only = TRUE) + + return shock_damage /mob/living/emp_act(severity) for(var/obj/O in get_mob_contents()) @@ -189,7 +234,7 @@ visible_message(SPAN_NOTICE("\The [O] misses \the [src] narrowly!")) return FALSE - visible_message(SPAN_DANGER("\The [src] is hit [affecting ? "in \the [affecting.name] " : ""]by \the [O]!")) + visible_message(SPAN_DANGER("\The [src] is hit [affecting ? "in \the [affecting] " : ""]by \the [O]!")) if(TT?.thrower?.client) admin_attack_log(TT.thrower, src, "Threw \an [O] at the victim.", "Had \an [O] thrown at them.", "threw \an [O] at") try_embed_in_mob(TT.thrower, O, zone, throw_damage, dtype, null, affecting, direction = TT.init_dir) @@ -218,7 +263,7 @@ if(affecting && istype(supplied_wound) && supplied_wound.is_open() && dtype == BRUTE) // Can't embed in a small bruise. var/obj/item/I = O - var/sharp = is_sharp(I) + var/sharp = I.is_sharp() || I.has_edge() embed_damage *= (1 - get_blocked_ratio(def_zone, BRUTE, O.damage_flags(), O.armor_penetration, I.get_attack_force(user))) //blunt objects should really not be embedding in things unless a huge amount of force is involved @@ -259,13 +304,13 @@ //This is called when the mob is thrown into a dense turf /mob/living/proc/turf_collision(var/turf/T, var/speed) - visible_message("[src] slams into \the [T]!") + visible_message(SPAN_DANGER("\The [src] slams into \the [T]!")) playsound(T, 'sound/effects/bangtaper.ogg', 50, 1, 1)//so it plays sounds on the turf instead, makes for awesome carps to hull collision and such apply_damage(speed*5, BRUTE) /mob/living/proc/near_wall(var/direction,var/distance=1) var/turf/T = get_step(get_turf(src),direction) - var/turf/last_turf = src.loc + var/turf/last_turf = loc var/i = 1 while(i>0 && i<=distance) @@ -286,96 +331,11 @@ admin_attack_log(user, src, "Attacked", "Was attacked", "attacked") - src.visible_message("\The [user] has [attack_message] \the [src]!") + visible_message(SPAN_DANGER("\The [user] has [attack_message] \the [src]!")) take_damage(damage) user.do_attack_animation(src) return 1 -/mob/living/proc/can_ignite() - return fire_stacks > 0 && !on_fire - -/mob/living/proc/IgniteMob() - if(can_ignite()) - on_fire = TRUE - set_light(4, l_color = COLOR_ORANGE) - update_fire() - -/mob/living/proc/ExtinguishMob() - if(on_fire) - on_fire = FALSE - fire_stacks = 0 - set_light(0) - update_fire() - -/mob/living/proc/update_fire(var/update_icons=1) - if(on_fire) - var/decl/bodytype/mob_bodytype = get_bodytype() - var/image/standing = overlay_image(mob_bodytype?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', mob_bodytype?.get_ignited_icon_state(src) || "Generic_mob_burning", RESET_COLOR) - set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) - else - set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) - -/mob/living/proc/adjust_fire_stacks(add_fire_stacks) //Adjusting the amount of fire_stacks we have on person - fire_stacks = clamp(fire_stacks + add_fire_stacks, FIRE_MIN_STACKS, FIRE_MAX_STACKS) - -/mob/living/proc/handle_fire() - if(fire_stacks < 0) - fire_stacks = min(0, ++fire_stacks) //If we've doused ourselves in water to avoid fire, dry off slowly - - if(!on_fire) - return TRUE - else if(fire_stacks <= 0) - ExtinguishMob() //Fire's been put out. - return TRUE - - fire_stacks = max(0, fire_stacks - 0.2) //I guess the fire runs out of fuel eventually - - var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) - ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire - return TRUE - - var/turf/location = get_turf(src) - location.hotspot_expose(fire_burn_temperature(), 50, 1) - - var/burn_temperature = fire_burn_temperature() - var/thermal_protection = get_heat_protection(burn_temperature) - - if (thermal_protection < 1 && bodytemperature < burn_temperature) - bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) - - var/species_heat_mod = 1 - - var/protected_limbs = get_heat_protection_flags(burn_temperature) - - if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) - species_heat_mod = 0.5 - else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) - species_heat_mod = 0.75 - - burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) - - if(burn_temperature < 1) - return - - if(has_external_organs()) - for(var/obj/item/organ/external/E in get_external_organs()) - if(!(E.body_part & protected_limbs) && prob(20)) - E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") - else // fallback for simplemobs - take_damage(round(species_heat_mod * log(10, (burn_temperature + 10))), 0.1, BURN, DAM_DISPERSED) - -/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. - increase_fire_stacks(exposed_temperature) - IgniteMob() - return ..() - /mob/living/proc/get_cold_protection() return 0 @@ -384,12 +344,12 @@ //Finds the effective temperature that the mob is burning at. /mob/living/proc/fire_burn_temperature() - if (fire_stacks <= 0) + var/fire_level = get_fire_intensity() + if (fire_level <= 0) return 0 - //Scale quadratically so that single digit numbers of fire stacks don't burn ridiculously hot. //lower limit of 700 K, same as matches and roughly the temperature of a cool flame. - return max(2.25*round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2), 700) + return max(2.25*round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_level/FIRE_MAX_FIRESUIT_STACKS)**2), 700) /mob/living/proc/reagent_permeability() return 1 diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 3501b2caa32..4d894ca4fa9 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -29,8 +29,8 @@ var/mob/living/cameraFollow = null var/list/datum/action/actions = list() - var/on_fire = 0 //The "Are we on fire?" var - var/fire_stacks + VAR_PRIVATE/_on_fire = 0 //The "Are we on fire?" var + VAR_PRIVATE/_fire_intensity var/ticks_since_last_successful_breath = 0 //if we failed to breathe last tick var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. @@ -98,3 +98,6 @@ /// Timer for chewing off your hand when cuffed. var/next_restraint_chew = 0 + + /// Used by equip code to determine backpack overrides. + var/datum/backpack_setup/backpack_setup diff --git a/code/modules/mob/living/living_electrocution.dm b/code/modules/mob/living/living_electrocution.dm index 63404d00ecd..ee5c19b3799 100644 --- a/code/modules/mob/living/living_electrocution.dm +++ b/code/modules/mob/living/living_electrocution.dm @@ -1,16 +1,3 @@ -//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. -/mob/living/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone) - if (!def_zone) - return 1.0 - - var/siemens_coefficient = max(get_species()?.get_shock_vulnerability(src), 0) - for(var/slot in global.standard_clothing_slots) - var/obj/item/clothing/C = get_equipped_item(slot) - if(istype(C) && (C.body_parts_covered & def_zone.body_part)) // Is that body part being targeted covered? - siemens_coefficient *= C.siemens_coefficient - - return siemens_coefficient - //Electrical shock /mob/living/proc/apply_shock(var/shock_damage, var/def_zone, var/base_siemens_coeff = 1.0) diff --git a/code/modules/mob/living/living_fires.dm b/code/modules/mob/living/living_fires.dm new file mode 100644 index 00000000000..5711910fe86 --- /dev/null +++ b/code/modules/mob/living/living_fires.dm @@ -0,0 +1,96 @@ +/mob/living/is_on_fire() + return _on_fire + +/mob/living/set_fire_intensity(amount) + _fire_intensity = amount + +/mob/living/get_fire_intensity() + return _fire_intensity + +//Adjusting the amount of fire stacks we have on person +/mob/living/adjust_fire_intensity(amount) + _fire_intensity = clamp(_fire_intensity + amount, FIRE_MIN_STACKS, FIRE_MAX_STACKS) + +/mob/living/can_ignite() + return get_fire_intensity() > 0 && !is_on_fire() + +/mob/living/ignite_fire() + if(can_ignite()) + _on_fire = TRUE + set_light(4, l_color = COLOR_ORANGE) + update_fire() + +/mob/living/extinguish_fire(mob/user, no_message = FALSE) + if(is_on_fire()) + _on_fire = FALSE + set_fire_intensity(0) + set_light(0) + update_fire() + +/mob/living/proc/update_fire(var/update_icons=1) + if(is_on_fire()) + var/decl/bodytype/mob_bodytype = get_bodytype() + var/image/standing = overlay_image(mob_bodytype?.get_ignited_icon(src) || 'icons/mob/OnFire.dmi', mob_bodytype?.get_ignited_icon_state(src) || "Generic_mob_burning", RESET_COLOR) + set_current_mob_overlay(HO_FIRE_LAYER, standing, update_icons) + else + set_current_mob_overlay(HO_FIRE_LAYER, null, update_icons) + +/mob/living/proc/handle_fire() + var/fire_level = get_fire_intensity() + if(fire_level < 0) + set_fire_intensity(min(0, ++fire_level)) //If we've doused ourselves in water to avoid fire, dry off slowly + fire_level = get_fire_intensity() + + if(!is_on_fire()) + return TRUE + if(fire_level <= 0) + extinguish_fire() //Fire's been put out. + return TRUE + + set_fire_intensity(max(0, fire_level - 0.2)) //I guess the fire runs out of fuel eventually + + var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment + if(G.get_by_flag(XGM_GAS_OXIDIZER) < 1) + extinguish_fire() //If there's no oxygen in the tile we're on, put out the fire + return TRUE + + var/turf/location = get_turf(src) + location.hotspot_expose(fire_burn_temperature(), 50, 1) + + var/burn_temperature = fire_burn_temperature() + var/thermal_protection = get_heat_protection(burn_temperature) + + if (thermal_protection < 1 && bodytemperature < burn_temperature) + bodytemperature += round(BODYTEMP_HEATING_MAX*(1-thermal_protection), 1) + + var/species_heat_mod = 1 + + var/protected_limbs = get_heat_protection_flags(burn_temperature) + + if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_2)) + species_heat_mod = 0.5 + else if(burn_temperature < get_mob_temperature_threshold(HEAT_LEVEL_3)) + species_heat_mod = 0.75 + + burn_temperature -= get_mob_temperature_threshold(HEAT_LEVEL_1) + + if(burn_temperature < 1) + return + + if(has_external_organs()) + for(var/obj/item/organ/external/E in get_external_organs()) + if(!(E.body_part & protected_limbs) && prob(20)) + E.take_external_damage(burn = round(species_heat_mod * log(10, (burn_temperature + 10)), 0.1), used_weapon = "fire") + else // fallback for simplemobs + take_damage(round(species_heat_mod * log(10, (burn_temperature + 10))), 0.1, BURN, DAM_DISPERSED) + +/mob/living/proc/increase_fire_intensity(exposed_temperature) + if(get_fire_intensity() <= 4 || fire_burn_temperature() < exposed_temperature) + adjust_fire_intensity(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 intensity, stop adding them. + //allow fire intensity to go up to 4 for fires cooler than 700 K, since are being immersed in flame after all. + increase_fire_intensity(exposed_temperature) + ignite_fire() + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/living_hud.dm b/code/modules/mob/living/living_hud.dm new file mode 100644 index 00000000000..5e6b7adfff0 --- /dev/null +++ b/code/modules/mob/living/living_hud.dm @@ -0,0 +1,17 @@ +/mob/living + var/list/hud_list = new(10) + +/mob/living/proc/reset_hud_overlays() + hud_list = new(10) + hud_list[HEALTH_HUD] = new /image/hud_overlay(global.using_map.med_hud_icons, src, "blank") + hud_list[STATUS_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudhealthy") + hud_list[LIFE_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudhealthy") + hud_list[ID_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudunknown") + hud_list[WANTED_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudblank") + hud_list[IMPLOYAL_HUD] = new /image/hud_overlay(global.using_map.implant_hud_icons, src, "hud_imp_blank") + hud_list[IMPCHEM_HUD] = new /image/hud_overlay(global.using_map.implant_hud_icons, src, "hud_imp_blank") + hud_list[IMPTRACK_HUD] = new /image/hud_overlay(global.using_map.implant_hud_icons, src, "hud_imp_blank") + hud_list[SPECIALROLE_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudblank") + hud_list[STATUS_HUD_OOC] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudhealthy") + +/datum/map diff --git a/code/modules/mob/living/living_maneuvers.dm b/code/modules/mob/living/living_maneuvers.dm index 8913f7a8190..2afaa16ad4c 100644 --- a/code/modules/mob/living/living_maneuvers.dm +++ b/code/modules/mob/living/living_maneuvers.dm @@ -25,13 +25,13 @@ 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" + maneuver_icon?.update_icon() /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" + maneuver_icon?.update_icon() return TRUE return FALSE @@ -59,19 +59,18 @@ 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.")) + maneuver_icon?.update_icon() /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" + maneuver_icon?.update_icon() /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 9fefc64c894..dce22c9a993 100644 --- a/code/modules/mob/living/living_organs.dm +++ b/code/modules/mob/living/living_organs.dm @@ -1,15 +1,3 @@ -/mob/living/get_organs() - for(var/organ in get_external_organs()) - LAZYADD(., organ) - for(var/organ in get_internal_organs()) - LAZYADD(., organ) - -/mob/living/proc/get_external_organs() - return - -/mob/living/proc/get_internal_organs() - return - /mob/living/proc/get_organs_by_categories(var/category) return diff --git a/code/modules/mob/living/living_resist.dm b/code/modules/mob/living/living_resist.dm index 9228eda91a5..2be9b6f463b 100644 --- a/code/modules/mob/living/living_resist.dm +++ b/code/modules/mob/living/living_resist.dm @@ -13,37 +13,39 @@ if(buckled.can_buckle) buckled.user_unbuckle_mob(src) else - to_chat(usr, "You can't seem to escape from \the [buckled]!") + to_chat(src, "You can't seem to escape from \the [buckled]!") return setClickCooldown(100) unbuckle_time = max(0, (2 MINUTES) - get_special_resist_time()) + var/decl/pronouns/pronouns = get_pronouns() + visible_message( - "[src] attempts to unbuckle themself!", + "[src] attempts to unbuckle [pronouns.self]!", "You attempt to unbuckle yourself. (This will take around [unbuckle_time / (1 SECOND)] second\s and you need to stand still)", range = 2 ) if(unbuckle_time && buckled) var/stages = 2 for(var/i = 1 to stages) - if(!unbuckle_time || do_after(usr, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) + if(!unbuckle_time || do_after(src, unbuckle_time*0.5, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY))) if(!buckled) return visible_message( - SPAN_WARNING("\The [src] tries to unbuckle themself."), + SPAN_WARNING("\The [src] tries to unbuckle [pronouns.self]."), SPAN_WARNING("You try to unbuckle yourself ([i*100/stages]% done)."), range = 2 ) else if(!buckled) return visible_message( - SPAN_WARNING("\The [src] stops trying to unbuckle themself."), + SPAN_WARNING("\The [src] stops trying to unbuckle [pronouns.self]."), SPAN_WARNING("You stop trying to unbuckle yourself."), range = 2 ) return visible_message( - SPAN_DANGER("\The [src] manages to unbuckle themself!"), + SPAN_DANGER("\The [src] manages to unbuckle [pronouns.self]!"), SPAN_NOTICE("You successfully unbuckle yourself."), range = 2 ) buckled.user_unbuckle_mob(src) @@ -61,8 +63,7 @@ return 1 /mob/living/proc/can_break_restraints() - var/decl/species/my_species = get_species() - return my_species?.can_shred(src, 1) + return can_shred(ignore_intent = TRUE) /mob/living/proc/get_special_resist_time() return 0 diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index 661787ae356..645b5323448 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -1,9 +1,11 @@ /mob // Defined on /mob to avoid having to pass args to every single attack_foo() proc. - var/datum/status_marker_holder/status_markers var/list/status_counters var/list/pending_status_counters + var/datum/status_marker_holder/status_markers /mob/living/set_status(var/condition, var/amount) + if(QDELETED(src)) + return FALSE if(!ispath(condition, /decl/status_condition)) return FALSE var/decl/status_condition/cond = GET_DECL(condition) diff --git a/code/modules/mob/living/living_taste.dm b/code/modules/mob/living/living_taste.dm index 03845380c3e..9beeb47e2fb 100644 --- a/code/modules/mob/living/living_taste.dm +++ b/code/modules/mob/living/living_taste.dm @@ -9,7 +9,7 @@ var/datum/reagents/temp = new(amount, global.temp_reagents_holder) //temporary holder used to analyse what gets transfered. from.trans_to_holder(temp, amount, multiplier, 1) var/text_output = temp.generate_taste_message(src, from) - if(text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. + if(text_output && (text_output != last_taste_text || last_taste_time + 1 MINUTE < world.time)) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. to_chat(src, SPAN_NOTICE("You can taste [text_output].")) //no taste means there are too many tastes and not enough flavor. last_taste_time = world.time last_taste_text = text_output diff --git a/code/modules/mob/living/living_throw.dm b/code/modules/mob/living/living_throw.dm index 4c6e4d4ccba..b65ec9889e9 100644 --- a/code/modules/mob/living/living_throw.dm +++ b/code/modules/mob/living/living_throw.dm @@ -7,7 +7,7 @@ if(incapacitated() || !target || istype(target, /obj/screen) || !istype(item) || !(item in get_held_items())) return FALSE - var/place_item = a_intent != I_HURT && Adjacent(target) + var/place_item = !check_intent(I_FLAG_HARM) && Adjacent(target) if(istype(item, /obj/item/grab)) var/obj/item/grab/grab = item @@ -31,7 +31,7 @@ if(isliving(target)) var/mob/living/mob = target if(length(mob.get_held_item_slots())) - if(mob == src || (mob.in_throw_mode && mob.a_intent == I_HELP)) + if(mob == src || (mob.in_throw_mode && mob.check_intent(I_FLAG_HELP))) if(!try_unequip(item, play_dropsound = place_item)) return FALSE if(target != src) @@ -41,7 +41,7 @@ SPAN_NOTICE("You give \the [mob] \a [item].") ) else - var/same_hand = a_intent == I_HELP + var/same_hand = check_intent(I_FLAG_HELP) var/decl/pronouns/user_pronouns = get_pronouns() visible_message( "\The [src] tosses \the [item] [same_hand ? "in the air and catches it." : "between [user_pronouns.his] hands"].", diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index feec39924e9..230f370eda2 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -149,15 +149,7 @@ var/global/list/ai_verbs_default = list( . = INITIALIZE_HINT_QDEL 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") - hud_list[ID_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") + reset_hud_overlays() ai_list += src create_powersupply() @@ -659,7 +651,7 @@ var/global/list/custom_ai_icons_by_ckey_and_name = list() set_light(1, 1, selected_sprite.alive_light) // Pass lying down or getting up to our pet human, if we're in a rig. -/mob/living/silicon/ai/lay_down() +/mob/living/silicon/ai/lay_down(block_posture as null) var/obj/item/rig/rig = src.get_rig() if(rig) rig.force_rest(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 742c03a9c49..b7e695a72cb 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -251,7 +251,7 @@ var/global/list/possible_say_verbs = list( if(istype(T)) T.visible_message("[src] neatly folds inwards, compacting down to a rectangular card.") -/mob/living/silicon/pai/lay_down() +/mob/living/silicon/pai/lay_down(block_posture as null) // Pass lying down or getting up to our pet human, if we're in a rig. if(istype(loc, /obj/item/paicard)) set_posture(/decl/posture/standing) @@ -277,7 +277,7 @@ var/global/list/possible_say_verbs = list( //Overriding this will stop a number of headaches down the track. /mob/living/silicon/pai/attackby(obj/item/W, mob/user) var/obj/item/card/id/card = W.GetIdCard() - if(card && user.a_intent == I_HELP) + if(card && user.check_intent(I_FLAG_HELP)) var/list/new_access = card.GetAccess() idcard.access = new_access visible_message("[user] slides [W] across [src].") @@ -287,7 +287,7 @@ var/global/list/possible_say_verbs = list( return TRUE if(try_stock_parts_removal(W, user)) return TRUE - var/force = W.get_attack_force(user) + var/force = W.expend_attack_force(user) if(force) visible_message(SPAN_DANGER("[user] attacks [src] with [W]!")) take_damage(force) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 6e1a7989b71..0d02001ceae 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -2,8 +2,6 @@ // Recruiting observers to play as pAIs -var/global/datum/paiController/paiController // Global handler for pAI candidates - /datum/paiCandidate var/name var/key @@ -14,11 +12,7 @@ var/global/datum/paiController/paiController // Global handler for pAI candida var/chassis = "Drone" var/say_verb = "Robotic" - -/hook/startup/proc/paiControllerSetup() - paiController = new /datum/paiController() - return 1 - +var/global/datum/paiController/paiController = new /datum/paiController() // Global handler for pAI candidates /datum/paiController var/inquirer = null @@ -27,6 +21,10 @@ var/global/datum/paiController/paiController // Global handler for pAI candida var/askDelay = 10 * 60 * 1 // One minute [ms * sec * min] +/datum/paiController/New() + ..() + populate_pai_software_list() + /datum/paiController/Topic(href, href_list[]) if(href_list["download"]) var/datum/paiCandidate/candidate = locate(href_list["candidate"]) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 72c1af676bb..b53b8a9cfe2 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -19,19 +19,18 @@ var/global/list/pai_emotions = list( var/global/list/pai_software_by_key = list() var/global/list/default_pai_software = list() -/hook/startup/proc/populate_pai_software_list() - var/r = 1 // I would use ., but it'd sacrifice runtime detection +/proc/populate_pai_software_list() + pai_software_by_key = list() + default_pai_software = list() for(var/type in subtypesof(/datum/pai_software)) var/datum/pai_software/P = new type() if(pai_software_by_key[P.id]) var/datum/pai_software/O = pai_software_by_key[P.id] - log_error("pAI software module [P.name] has the same key as [O.name]!") - r = 0 + PRINT_STACK_TRACE("pAI software module [type] has the same key ([P.id]) as [O.type] [O.id]!") continue pai_software_by_key[P.id] = P if(P.default) default_pai_software[P.id] = P - return r /mob/living/silicon/pai/proc/paiInterface() ui_interact(src) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index dcb63ea586c..03974c5b300 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -117,7 +117,7 @@ uid = "bodytype_drone_construction" /decl/bodytype/drone/construction/Initialize() - equip_adjust = list( + _equip_adjust = list( slot_head_str = list( "[NORTH]" = list(1, -12), "[SOUTH]" = list(1, -12), @@ -170,7 +170,7 @@ if(istype(W, /obj/item/borg/upgrade)) to_chat(user, "\The [src] is not compatible with \the [W].") return TRUE - else if(IS_CROWBAR(W) && user.a_intent != I_HURT) + else if(IS_CROWBAR(W) && !user.check_intent(I_FLAG_HARM)) to_chat(user, "\The [src] is hermetically sealed. You can't open the case.") return TRUE else if (istype(W, /obj/item/card/id)||istype(W, /obj/item/modular_computer)) @@ -178,7 +178,7 @@ 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 TRUE - if(!allowed(usr)) + if(!allowed(user)) to_chat(user, "Access denied.") return TRUE var/decl/pronouns/pronouns = user.get_pronouns() @@ -193,7 +193,7 @@ SPAN_DANGER("\The [user] swipes [pronouns.his] ID card through \the [src], attempting to shut it down."), \ SPAN_DANGER("You swipe your ID card through \the [src], attempting to shut it down.")) if(!emagged) - if(allowed(usr)) + if(allowed(user)) shut_down() else to_chat(user, SPAN_DANGER("Access denied.")) @@ -286,8 +286,8 @@ /mob/living/silicon/robot/drone/proc/request_player() if(too_many_active_drones()) return - var/decl/ghosttrap/pronouns = GET_DECL(/decl/ghosttrap/maintenance_drone) - pronouns.request_player(src, "Someone is attempting to reboot a maintenance drone.", 30 SECONDS) + var/decl/ghosttrap/ghosttrap = GET_DECL(/decl/ghosttrap/maintenance_drone) + ghosttrap.request_player(src, "Someone is attempting to reboot a maintenance drone.", 30 SECONDS) /mob/living/silicon/robot/drone/proc/transfer_personality(var/client/player) if(!player) return @@ -355,13 +355,13 @@ uid = "bodytype_drone" /decl/bodytype/drone/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - slot_head_str = list( + 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) + "[EAST]" = list(0, -13), + "[WEST]" = list(0, -13) ) ) . = ..() diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm index 2711d4981b8..259ac5bf9a5 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm @@ -4,8 +4,7 @@ channels = list ("Engineering" = TRUE) camera_channels = list(CAMERA_CAMERA_CHANNEL_ENGINEERING) software = list( - /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor + /datum/computer_file/program/power_monitor ) module_sprites = list( "Drone" = 'icons/mob/robots/flying/flying_engineering.dmi', @@ -34,7 +33,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -70,7 +68,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 22ecbf50f91..991631baa85 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -42,8 +42,11 @@ var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null if (master) master.sync(src) - ..() - return + . = ..() + // if we aren't malfunctioning and we have a law 0, it's presumably shared + // if we are malfunctioning and we don't have a law 0, we don't need to worry about this + if(connected_ai && is_malfunctioning() && has_zeroth_law()) + to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) /mob/living/silicon/robot/proc/robot_checklaws() set category = "Silicon Commands" diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index a8da2261da4..4e2bc0fe3cf 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -258,12 +258,12 @@ /mob/living/silicon/robot/update_fire() overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") - if(on_fire) + if(is_on_fire()) overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing") //Silicons don't gain stacks from hotspots, but hotspots can ignite them -/mob/living/silicon/increase_fire_stacks(exposed_temperature) +/mob/living/silicon/increase_fire_intensity(exposed_temperature) return /mob/living/silicon/can_ignite() - return !on_fire + return !is_on_fire() diff --git a/code/modules/mob/living/silicon/robot/modules/_module.dm b/code/modules/mob/living/silicon/robot/modules/_module.dm index f083b71ce91..655716d63a2 100644 --- a/code/modules/mob/living/silicon/robot/modules/_module.dm +++ b/code/modules/mob/living/silicon/robot/modules/_module.dm @@ -233,3 +233,6 @@ var/obj/item/stock_parts/computer/hard_drive/disk = os.get_component(PART_HDD) for(var/T in software) disk.store_file(new T(disk), OS_PROGRAMS_DIR, TRUE) + +/obj/item/robot_module/proc/handle_turf(turf/target, mob/user) + return 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 d052194f847..94f73f0d637 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_clerical.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_clerical.dm @@ -65,7 +65,7 @@ var/datum/reagents/R = emag.create_reagents(50) R.add_reagent(/decl/material/liquid/paralytics, 10) R.add_reagent(/decl/material/liquid/sedatives, 15) - R.add_reagent(/decl/material/liquid/ethanol/beer, 20) + R.add_reagent(/decl/material/liquid/alcohol/beer, 20) R.add_reagent(/decl/material/solid/ice, 5) emag.SetName("Mickey Finn's Special Brew") @@ -75,7 +75,7 @@ E.add_to_reagents(/decl/material/liquid/enzyme, 2 * amount) if(emag) var/obj/item/chems/drinks/bottle/small/beer/B = emag - B.add_to_reagents(/decl/material/liquid/ethanol/beer, amount * 0.4) + B.add_to_reagents(/decl/material/liquid/alcohol/beer, amount * 0.4) B.add_to_reagents(/decl/material/solid/ice, amount * 0.1) B.add_to_reagents(/decl/material/liquid/paralytics, amount * 0.2) B.add_to_reagents(/decl/material/liquid/sedatives, amount * 0.3) diff --git a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm index c334d6c8bb2..d0b1f9456e3 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm @@ -8,8 +8,7 @@ CAMERA_CAMERA_CHANNEL_ENGINEERING ) software = list( - /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor + /datum/computer_file/program/power_monitor ) supported_upgrades = list( /obj/item/borg/upgrade/rcd @@ -47,7 +46,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -87,7 +85,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/code/modules/mob/living/silicon/robot/modules/module_janitor.dm b/code/modules/mob/living/silicon/robot/modules/module_janitor.dm index 651a88e5b4e..e88d8b13112 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_janitor.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_janitor.dm @@ -23,10 +23,13 @@ ) emag = /obj/item/chems/spray +/obj/item/robot_module/janitor/handle_turf(turf/target, mob/user) + target.clean() + /obj/item/robot_module/janitor/finalize_emag() . = ..() emag.add_to_reagents(/decl/material/liquid/lube, 250) - emag.SetName("Lube spray") + emag.SetName("lubricant spray") /obj/item/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() diff --git a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm index eeb10eae170..b9456bc2050 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_maintenance_drone.dm @@ -31,7 +31,6 @@ /obj/item/matter_decompiler, /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -84,7 +83,6 @@ for(var/thing in list( /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced @@ -117,6 +115,8 @@ ..() var/obj/item/chems/spray/cleaner/drone/SC = locate() in equipment SC.add_to_reagents(/decl/material/liquid/cleaner, 8 * amount) + var/obj/item/lightreplacer/LR = locate() in equipment + LR.Charge(R, amount) /obj/item/robot_module/drone/construction name = "construction drone module" @@ -128,8 +128,3 @@ /obj/item/robot_module/drone/construction/Initialize() equipment += /obj/item/rcd/borg . = ..() - -/obj/item/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) - var/obj/item/lightreplacer/LR = locate() in equipment - LR.Charge(R, amount) - ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e588fc13400..e3572786bba 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -88,6 +88,9 @@ ) /mob/living/silicon/robot/Initialize() + + reset_hud_overlays() + . = ..() add_language(/decl/language/binary, 1) @@ -126,16 +129,6 @@ // Disables lay down verb for robots due they're can't lay down and it cause some movement, vision issues. verbs -= /mob/living/verb/lay_down - 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, "hudhealth100") - hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealth100") - hud_list[ID_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - AddMovementHandler(/datum/movement_handler/robot/use_power, /datum/movement_handler/mob/space) /mob/living/silicon/robot/proc/recalculate_synth_capacities() @@ -190,14 +183,7 @@ return 0 /mob/living/silicon/robot/Destroy() - if(central_processor) - central_processor.dropInto(loc) - var/mob/living/brainmob = central_processor.get_brainmob() - if(mind && brainmob) - mind.transfer_to(brainmob) - else - ghostize() - central_processor = null + QDEL_NULL(central_processor) if(connected_ai) connected_ai.connected_robots -= src connected_ai = null @@ -468,7 +454,7 @@ if(try_stock_parts_install(W, user)) return TRUE - if(IS_WELDER(W) && user.a_intent != I_HURT) + if(IS_WELDER(W) && !user.check_intent(I_FLAG_HARM)) if (src == user) to_chat(user, "You lack the reach to be able to repair yourself.") return TRUE @@ -496,7 +482,7 @@ user.visible_message(SPAN_NOTICE("\The [user] has fixed some of the burnt wires on \the [src]!")) return TRUE - 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 + else if(IS_CROWBAR(W) && !user.check_intent(I_FLAG_HARM)) // crowbar means open or close the cover - we all know what a crowbar is by now if(opened) if(cell) user.visible_message( @@ -518,8 +504,8 @@ 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) + if(do_after(user, 5 SECONDS, src)) + dismantle_robot(user) else // Okay we're not removing the cell or a CPU, but maybe something else? var/list/removable_components = list() @@ -633,7 +619,7 @@ else to_chat(user, "Upgrade error!") return TRUE - if(!(istype(W, /obj/item/robotanalyzer) || istype(W, /obj/item/scanner/health)) && W.get_attack_force(user) && user.a_intent != I_HELP) + if(!(istype(W, /obj/item/robotanalyzer) || istype(W, /obj/item/scanner/health)) && !user.check_intent(I_FLAG_HELP) && W.expend_attack_force(user)) spark_at(src, 5, holder=src) return ..() @@ -650,14 +636,14 @@ return user?.attempt_hug(src) /mob/living/silicon/robot/default_hurt_interaction(mob/user) - var/decl/species/user_species = user.get_species() - if(user_species?.can_shred(user)) + if(user.can_shred()) attack_generic(user, rand(30,50), "slashed") + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE . = ..() /mob/living/silicon/robot/default_interaction(mob/user) - if(user.a_intent != I_GRAB && opened && !wiresexposed && (!issilicon(user))) + if(!user.check_intent(I_FLAG_GRAB) && opened && !wiresexposed && (!issilicon(user))) var/datum/robot_component/cell_component = components["power cell"] if(cell) cell.update_icon() @@ -823,15 +809,15 @@ /mob/living/silicon/robot/Move(a, b, flag) . = ..() if(.) + if(module && isturf(loc)) var/obj/item/ore/orebag = locate() in list(module_state_1, module_state_2, module_state_3) if(orebag) loc.attackby(orebag, src) - if(istype(module, /obj/item/robot_module/janitor)) - loc.clean() + module.handle_turf(loc, src) + if(client) - var/turf/above = GetAbove(src) - up_hint.icon_state = "uphint[!!(above && TURF_IS_MIMICKING(above))]" + up_hint.update_icon() /mob/living/silicon/robot/proc/UnlinkSelf() disconnect_from_ai() @@ -1019,7 +1005,7 @@ sleep(5) to_chat(src, "Would you like to send a report to the vendor? Y/N") sleep(10) - to_chat(src, "> N") + to_chat(src, "\> N") sleep(20) to_chat(src, "ERRORERRORERROR") to_chat(src, "Obey these laws:") @@ -1040,10 +1026,29 @@ return 1 return ..() -/mob/living/silicon/robot/proc/dismantle(var/mob/user) - to_chat(user, SPAN_NOTICE("You damage some parts of the chassis, but eventually manage to rip out the central processor.")) - var/obj/item/robot_parts/robot_suit/C = new dismantle_type(loc) - C.dismantled_from(src) +/mob/living/silicon/robot/gib(do_gibs) + SHOULD_CALL_PARENT(FALSE) + var/lastloc = loc + dismantle_robot() + if(lastloc && do_gibs) + spawn_gibber(lastloc) + +/mob/living/silicon/robot/proc/dismantle_robot(var/mob/user) + + if(central_processor) + if(user) + to_chat(user, SPAN_NOTICE("You damage some parts of the chassis, but eventually manage to rip out \the [central_processor].")) + central_processor.dropInto(loc) + var/mob/living/brainmob = central_processor.get_brainmob(create_if_missing = TRUE) + if(mind && brainmob) + mind.transfer_to(brainmob) + else + ghostize() + central_processor.update_icon() + central_processor = null + + var/obj/item/robot_parts/robot_suit/chassis = new dismantle_type(loc) + chassis.dismantled_from(src) qdel(src) /mob/living/silicon/robot/try_stock_parts_install(obj/item/stock_parts/W, mob/user) @@ -1071,8 +1076,7 @@ animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' flick("blspell", animation) - sleep(5) - qdel(animation) + QDEL_IN(animation, 0.5 SECONDS) /mob/living/silicon/robot/proc/handle_radio_transmission() if(!is_component_functioning("radio")) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index eb0a535eec6..59ead6d32d8 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -177,12 +177,8 @@ /obj/item/form_printer/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) return FALSE -/obj/item/form_printer/afterattack(atom/target, mob/living/user, flag, params) - - if(!target || !flag) - return - - if(istype(target,/obj/structure/table)) +/obj/item/form_printer/afterattack(atom/target, mob/living/user, proximity, params) + if(istype(target) && !istype(target, /obj/screen) && proximity) deploy_paper(get_turf(target)) /obj/item/form_printer/attack_self(mob/user) @@ -192,7 +188,6 @@ T.visible_message(SPAN_NOTICE("\The [src.loc] dispenses a sheet of crisp white paper.")) new /obj/item/paper(T) - //Personal shielding for the combat module. /obj/item/borg/combat/shield name = "personal shielding" @@ -243,9 +238,9 @@ to_chat(user, "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.") to_chat(user, "It is set to deploy [mode ? "doors" : "walls"]") -/obj/item/inflatable_dispenser/attack_self() +/obj/item/inflatable_dispenser/attack_self(mob/user) mode = !mode - to_chat(usr, "You set \the [src] to deploy [mode ? "doors" : "walls"].") + to_chat(user, "You set \the [src] to deploy [mode ? "doors" : "walls"].") /obj/item/inflatable_dispenser/afterattack(var/atom/A, var/mob/user) ..(A, user) @@ -301,7 +296,7 @@ if(istype(A, /obj/item/inflatable)) if(istype(A, /obj/item/inflatable/door)) if(stored_doors >= max_doors) - to_chat(usr, "\The [src] is full!") + to_chat(user, "\The [src] is full!") return stored_doors++ qdel(A) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index ebcd89aaf52..81d21611390 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -10,7 +10,6 @@ var/list/stating_laws = list()// Channels laws are currently being stated on var/obj/item/radio/silicon_radio - var/list/hud_list[10] var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer //Used in say.dm. @@ -40,6 +39,7 @@ #define MED_HUD 2 //Medical HUD mode /mob/living/silicon/Initialize() + reset_hud_overlays() global.silicon_mob_list += src . = ..() @@ -68,18 +68,6 @@ QDEL_NULL_LIST(stock_parts) return ..() -/mob/living/silicon/get_dexterity(silent) - return dexterity - -/mob/living/silicon/experiences_hunger_and_thirst() - return FALSE // Doesn't really apply to robots. Maybe unify this with cells in the future. - -/mob/living/silicon/get_nutrition() - return get_max_nutrition() - -/mob/living/silicon/get_hydration() - return get_max_hydration() - /mob/living/silicon/fully_replace_character_name(new_name) ..() create_or_update_account(new_name) @@ -115,22 +103,24 @@ to_chat(src, "Warning: Electromagnetic pulse detected.") ..() -/mob/living/silicon/stun_effect_act(var/stun_amount, var/agony_amount) +/mob/living/silicon/stun_effect_act(stun_amount, agony_amount, def_zone, used_weapon) return //immune -/mob/living/silicon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, def_zone = null) - - if (istype(source, /obj/effect/containment_field)) - spark_at(loc, amount=5, cardinal_only = TRUE) - - shock_damage *= 0.75 //take reduced damage - take_overall_damage(0, shock_damage) - visible_message("\The [src] was shocked by \the [source]!", \ - "Energy pulse detected, system damaged!", \ - "You hear an electrical crack") - if(prob(20)) - SET_STATUS_MAX(src, STAT_STUN, 2) - return +/mob/living/silicon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, def_zone) + shock_damage = ..() + if(shock_damage <= 0 || !istype(source, /obj/effect/containment_field)) + return 0 + spark_at(loc, amount=5, cardinal_only = TRUE) + shock_damage *= 0.75 //take reduced damage + take_overall_damage(0, shock_damage) + visible_message( + SPAN_DANGER("\The [src] was shocked by \the [source]!"), + SPAN_DANGER("Energy pulse detected, system damaged!"), + SPAN_DANGER("You hear an electrical crack.") + ) + if(prob(20)) + SET_STATUS_MAX(src, STAT_STUN, 2) + return shock_damage /mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) if(!Proj.nodamage) @@ -377,11 +367,11 @@ if(istype(W) && user.try_unequip(W)) W.forceMove(src) stock_parts += W - to_chat(usr, "You install the [W.name].") + to_chat(user, "You install the [W.name].") return TRUE /mob/living/silicon/proc/try_stock_parts_removal(obj/item/W, mob/user) - if(!IS_CROWBAR(W) || user.a_intent == I_HURT) + if(!IS_CROWBAR(W) || user.check_intent(I_FLAG_HARM)) return if(!length(stock_parts)) to_chat(user, SPAN_WARNING("There are no parts in \the [src] left to remove.")) diff --git a/code/modules/mob/living/simple_animal/_simple_animal.dm b/code/modules/mob/living/simple_animal/_simple_animal.dm index 3c382c5bc28..06972fe281a 100644 --- a/code/modules/mob/living/simple_animal/_simple_animal.dm +++ b/code/modules/mob/living/simple_animal/_simple_animal.dm @@ -165,16 +165,23 @@ var/global/list/simplemob_icon_bitflag_cache = list() mob_icon_state_flags |= MOB_ICON_HAS_PARALYZED_STATE global.simplemob_icon_bitflag_cache[type] = mob_icon_state_flags +/mob/living/simple_animal/proc/add_additional_visible_overlays(list/accumulator) + return + /mob/living/simple_animal/refresh_visible_overlays() + var/list/add_overlays = list() if(length(draw_visible_overlays)) - var/list/add_overlays = list() for(var/overlay_state in draw_visible_overlays) var/overlay_color = draw_visible_overlays[overlay_state] if(overlay_state == "base") add_overlays += overlay_image(icon, icon_state, overlay_color, RESET_COLOR) else add_overlays += overlay_image(icon, "[icon_state]-[overlay_state]", overlay_color, RESET_COLOR) + + add_additional_visible_overlays(add_overlays) + + if(length(add_overlays)) set_current_mob_overlay(HO_SKIN_LAYER, add_overlays) else set_current_mob_overlay(HO_SKIN_LAYER, null) @@ -334,6 +341,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() take_damage(dealt_damage, damage_type, damage_flags = damage_flags, inflicter = user) user.visible_message(SPAN_DANGER("\The [user] [harm_verb] \the [src]!")) user.do_attack_animation(src) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE /mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user) @@ -423,7 +431,7 @@ var/global/list/simplemob_icon_bitflag_cache = list() return /decl/material/liquid/nutriment /mob/living/simple_animal/proc/reflect_unarmed_damage(var/mob/living/human/attacker, var/damage_type, var/description) - if(attacker.a_intent == I_HURT) + if(attacker.check_intent(I_FLAG_HARM)) attacker.apply_damage(rand(return_damage_min, return_damage_max), damage_type, attacker.get_active_held_item_slot(), used_weapon = description) if(rand(25)) to_chat(attacker, SPAN_WARNING("Your attack has no obvious effect on \the [src]'s [description]!")) @@ -527,16 +535,16 @@ var/global/list/simplemob_icon_bitflag_cache = list() /mob/living/simple_animal/proc/get_pry_desc() return "prying" -/mob/living/simple_animal/pry_door(var/mob/user, var/delay, var/obj/machinery/door/pesky_door) +/mob/living/simple_animal/pry_door(delay, obj/machinery/door/target) if(!can_pry_door()) return - visible_message(SPAN_DANGER("\The [user] begins [get_pry_desc()] at \the [pesky_door]!")) + visible_message(SPAN_DANGER("\The [src] begins [get_pry_desc()] at \the [target]!")) if(istype(ai)) ai.pause() - if(do_after(user, delay, pesky_door)) - pesky_door.open(1) + if(do_after(src, delay, target)) + target.open(1) else - visible_message(SPAN_NOTICE("\The [user] is interrupted.")) + visible_message(SPAN_NOTICE("\The [src] is interrupted.")) if(istype(ai)) ai.resume() 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 7b8f5b5f178..bbd6b916d82 100644 --- a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish.dm @@ -22,6 +22,14 @@ butchery_data = /decl/butchery_data/animal/fish/medium mob_size = MOB_SIZE_SMALL +/mob/living/simple_animal/aquatic/fish/large/cave + name = "blind cave fish" + desc = "A pale, blobby fish that lives its entire life in the cold darkness of cave rivers, and hence has no need for eyes." + icon = 'icons/mob/simple_animal/fish_cave.dmi' + +/mob/living/simple_animal/aquatic/fish/large/cave/is_blind() + return TRUE + /mob/living/simple_animal/aquatic/fish/large/bass name = "largemouth bass" icon = 'icons/mob/simple_animal/fish_bass.dmi' diff --git a/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm new file mode 100644 index 00000000000..179605c12c9 --- /dev/null +++ b/code/modules/mob/living/simple_animal/aquatic/aquatic_fish_lantern.dm @@ -0,0 +1,26 @@ +/mob/living/simple_animal/aquatic/fish/large/lantern + name = "lantern fish" + desc = "An oily, glowing fish. They are sometimes caught in cave rivers, and are rumoured to have cousins in the deep ocean." + icon = 'icons/mob/simple_animal/fish_lantern.dmi' + butchery_data = /decl/butchery_data/animal/fish/oily + holder_type = /obj/item/holder/lanternfish + var/glow_color = COLOR_LIME + var/glow_power = 0.5 + var/glow_range = 2 + +/mob/living/simple_animal/aquatic/fish/large/lantern/Initialize() + . = ..() + set_light(glow_range, glow_power, glow_color) + refresh_visible_overlays() + +/mob/living/simple_animal/aquatic/fish/large/lantern/add_additional_visible_overlays(list/accumulator) + var/glow_state = "[icon_state]-glow" + if(check_state_in_icon(glow_state, icon)) + accumulator += emissive_overlay(icon, glow_state, color = light_color, flags = RESET_COLOR) + +/obj/item/holder/lanternfish/adjust_mob_overlay(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) + if(overlay && (slot in global.all_hand_slots)) + var/glow_state = "[overlay.icon_state]-glow" + if(check_state_in_icon(glow_state, overlay.icon)) + overlay.overlays += emissive_overlay(overlay.icon, glow_state, color = light_color, flags = RESET_COLOR) + return ..() diff --git a/code/modules/mob/living/simple_animal/crow/crow.dm b/code/modules/mob/living/simple_animal/crow/crow.dm index 03adeae6ae3..66428209454 100644 --- a/code/modules/mob/living/simple_animal/crow/crow.dm +++ b/code/modules/mob/living/simple_animal/crow/crow.dm @@ -57,14 +57,14 @@ // Let people interact with the Bird Storage. /mob/living/simple_animal/crow/attack_hand(mob/user) - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) var/obj/item/backpack = get_equipped_item(slot_back_str) if(backpack) return backpack.attack_hand(user) return ..() /mob/living/simple_animal/crow/attackby(obj/item/I, mob/user) - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) var/obj/item/backpack = get_equipped_item(slot_back_str) if(backpack) return backpack.attackby(I, user) diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm deleted file mode 100644 index 8cefee06d93..00000000000 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ /dev/null @@ -1,133 +0,0 @@ -/mob/living/simple_animal/familiar - name = "familiar" - desc = "No wizard is complete without a mystical sidekick." - supernatural = 1 - universal_speak = FALSE - universal_understand = TRUE - - min_gas = list(/decl/material/gas/oxygen = 1) - max_gas = null - unsuitable_atmos_damage = 1 - gene_damage = -1 - base_animal_type = /mob/living/simple_animal/familiar - - var/list/wizardy_spells = list() - -/mob/living/simple_animal/familiar/Initialize() - . = ..() - add_language(/decl/language/human/common) - for(var/spell in wizardy_spells) - src.add_spell(new spell, "const_spell_ready") - -/mob/living/simple_animal/familiar/carcinus - 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") - max_health = 200 - natural_weapon = /obj/item/natural_weapon/pincers/strong - resistance = 9 - ai = /datum/mob_controller/familiar_crab - -/datum/mob_controller/familiar_crab - can_escape_buckles = TRUE - -/obj/item/natural_weapon/pincers/strong - _base_attack_force = 15 - -/*familiar version of the Pike w/o all the other hostile/carp stuff getting in the way (namely life) -*/ - -/mob/living/simple_animal/familiar/pike - name = "space pike" - 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") - max_health = 100 - natural_weapon = /obj/item/natural_weapon/bite - min_gas = null - wizardy_spells = list(/spell/aoe_turf/conjure/forcewall) - ai = /datum/mob_controller/familiar_pike - -/datum/mob_controller/familiar_pike - can_escape_buckles = TRUE - -/mob/living/simple_animal/familiar/pike/Process_Spacemove() - return 1 //No drifting in space for space carp! //original comments do not steal - -/mob/living/simple_animal/familiar/horror - name = "horror" - 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$." - max_health = 150 - natural_weapon = /obj/item/natural_weapon/horror - wizardy_spells = list(/spell/targeted/torment) - -/obj/item/natural_weapon/horror - name = "foul touch" - _base_attack_force = 10 - atom_damage_type = BURN - attack_verb = list("touched") - -/mob/living/simple_animal/familiar/horror/get_death_message(gibbed) - return "rapidly deteriorates" -/mob/living/simple_animal/familiar/horror/get_self_death_message(gibbed) - return "The bonds tying you to this mortal plane have been severed." - -/mob/living/simple_animal/familiar/horror/death(gibbed) - . = ..() - if(. && !gibbed) - spawn_gibber(loc) - qdel(src) - -/mob/living/simple_animal/familiar/minor_amaros - name = "minor amaros" - desc = "A small fluffy alien creature." - icon = 'icons/mob/simple_animal/amaros.dmi' - speak_emote = list("entones") - mob_size = MOB_SIZE_SMALL - max_health = 25 - wizardy_spells = list( - /spell/targeted/heal_target, - /spell/targeted/heal_target/area - ) - -/mob/living/simple_animal/familiar/pet/mouse - 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 - pass_flags = PASS_FLAG_TABLE - mob_size = MOB_SIZE_MINISCULE - response_harm = "stamps on" - max_health = 15 - natural_weapon = /obj/item/natural_weapon/bite/mouse - wizardy_spells = list(/spell/aoe_turf/smoke) - ai = /datum/mob_controller/familiar_mouse - -/datum/mob_controller/familiar_mouse - can_escape_buckles = TRUE - -/mob/living/simple_animal/familiar/pet/mouse/Initialize() - . = ..() - - verbs += /mob/living/proc/ventcrawl - verbs += /mob/living/proc/hide - -/mob/living/simple_animal/familiar/pet/cat - name = "black cat" - desc = "A pitch black cat. Said to be especially unlucky." - icon = 'icons/mob/simple_animal/cat_black.dmi' - speak_emote = list("meows", "purrs") - holder_type = /obj/item/holder - mob_size = MOB_SIZE_SMALL - 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 f4b20f9b75b..a9b8e6891b8 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -70,12 +70,12 @@ uid = "bodytype_animal_cat" /decl/bodytype/quadruped/animal/cat/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -9), "[SOUTH]" = list( 1, -12), - "[EAST]" = list( 7, -10), - "[WEST]" = list(-7, -10) + "[EAST]" = list( 7, -10), + "[WEST]" = list(-7, -10) ) ) . = ..() @@ -210,12 +210,12 @@ uid = "bodytype_animal_kitten" /decl/bodytype/quadruped/animal/kitten/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -14), "[SOUTH]" = list( 1, -14), - "[EAST]" = list( 5, -14), - "[WEST]" = list(-5, -14) + "[EAST]" = list( 5, -14), + "[WEST]" = list(-5, -14) ) ) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index eef4666321c..64ea0d6d25f 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -42,12 +42,12 @@ uid = "bodytype_animal_corgi" /decl/bodytype/quadruped/animal/corgi/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -8), "[SOUTH]" = list( 1, -8), - "[EAST]" = list( 7, -8), - "[WEST]" = list(-7, -8) + "[EAST]" = list( 7, -8), + "[WEST]" = list(-7, -8) ) ) . = ..() @@ -96,7 +96,7 @@ else body.set_dir(SOUTH) if(isturf(movement_target.loc) && body.Adjacent(movement_target)) - body.UnarmedAttack(movement_target) + body.UnarmedAttack(movement_target, TRUE) else if(ishuman(movement_target.loc) && prob(20)) body.custom_emote(VISIBLE_MESSAGE, "stares at the [movement_target] that [movement_target.loc] has with sad puppy eyes.") @@ -151,12 +151,12 @@ uid = "bodytype_animal_puppy" /decl/bodytype/quadruped/animal/puppy/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -12), "[SOUTH]" = list( 0, -12), - "[EAST]" = list( 5, -14), - "[WEST]" = list(-5, -14) + "[EAST]" = list( 5, -14), + "[WEST]" = list(-5, -14) ) ) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 992ee0b67a9..bcd84ddc3df 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -42,12 +42,12 @@ uid = "bodytype_animal_crab" /decl/bodytype/hexapod/animal/crab/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(-1, -10), "[SOUTH]" = list(-1, -10), - "[EAST]" = list(-1, -10), - "[WEST]" = list(-1, -10) + "[EAST]" = list(-1, -10), + "[WEST]" = list(-1, -10) ) ) . = ..() 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 b1df77c7be4..6571031649c 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -59,7 +59,7 @@ var/atom/food = find_edible_atom(view(1, body.loc)) if(istype(food)) body.stop_automove() - body.a_intent = I_HELP + body.set_intent(I_FLAG_HELP) body.ClickOn(food) else if(!LAZYLEN(body.grabbed_by)) food = find_edible_atom(oview(5, body.loc)) @@ -103,7 +103,7 @@ see_in_dark = 6 max_health = 50 butchery_data = /decl/butchery_data/animal/ruminant/cow - + // When cows can accept food items: /obj/item/food/hay var/static/list/responses = list( "looks at you imploringly", "looks at you pleadingly", @@ -245,7 +245,7 @@ var/global/chicken_count = 0 global.chicken_count -= 1 /mob/living/simple_animal/fowl/chicken/attackby(var/obj/item/O, var/mob/user) - if(istype(O, /obj/item/food)) + if(!istype(O, /obj/item/food)) return ..() var/obj/item/food/G = O //feedin' dem chickens if(findtext(G.get_grown_tag(), "wheat")) // includes chopped, crushed, dried etc. diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 1aefcb1e0fd..69f4f997321 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -72,7 +72,7 @@ if(damage >= 3) respond_to_damage() -/mob/living/simple_animal/opossum/lay_down() +/mob/living/simple_animal/opossum/lay_down(block_posture as null) . = ..() update_icon() diff --git a/code/modules/mob/living/simple_animal/hostile/_hostile.dm b/code/modules/mob/living/simple_animal/hostile/_hostile.dm index 3986335bc61..508df4a575f 100644 --- a/code/modules/mob/living/simple_animal/hostile/_hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/_hostile.dm @@ -1,7 +1,6 @@ /mob/living/simple_animal/hostile abstract_type = /mob/living/simple_animal/hostile faction = "hostile" - a_intent = I_HURT response_help_3p = "$USER$ pokes $TARGET$." response_help_1p = "You poke $TARGET$." response_disarm = "shoves" diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index c32b39b1a42..2f79162b6c9 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -64,7 +64,7 @@ stop_wandering() stance_step++ if(stance_step >= 20) - if(target && (target in list_targets(10))) + if(target && (target in get_raw_target_list())) set_stance(STANCE_ATTACK) //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. else set_stance(STANCE_IDLE) @@ -72,7 +72,7 @@ if(STANCE_ALERT) stop_wandering() var/found_mob = 0 - if(target && (target in list_targets(10))) + if(target && (target in get_raw_target_list())) if(!attackable(target)) stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. stance_step++ 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 f504d63398e..1145b90b6e8 100644 --- a/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm +++ b/code/modules/mob/living/simple_animal/hostile/commanded/nanomachines.dm @@ -52,8 +52,8 @@ if(LAZYLEN(targets) != 1) body.say("ERROR. TARGET COULD NOT BE PARSED.") return 0 - var/weakref/target_ref = targets[1] - set_target(target_ref.resolve()) + var/weakref/single_target_ref = targets[1] + set_target(single_target_ref.resolve()) set_stance(STANCE_COMMANDED_HEAL) return 1 if(findtext(text,"emergency protocol")) 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 ac15b145c00..345b7137994 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithful_hound.dm @@ -37,7 +37,7 @@ var/new_aggress = 1 var/dist = get_dist(mailman, body) if(dist < 2) //Attack! Attack! - body.a_intent = I_HURT + body.set_intent(I_FLAG_HARM) body.ClickOn(mailman) return if(dist == 2) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spiders/_giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spiders/_giant_spider.dm index d4e9e57d091..d6bc87bbcb6 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spiders/_giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spiders/_giant_spider.dm @@ -68,7 +68,7 @@ if(current_health < get_max_health()) var/obj/item/attacking_with = get_natural_weapon() if(attacking_with) - heal_overall_damage(0.2 * attacking_with.get_attack_force(src)) //heal a bit on hit + heal_overall_damage(0.2 * attacking_with.expend_attack_force(src)) //heal a bit on hit if(ishuman(target)) var/mob/living/human/H = target var/obj/item/clothing/suit/space/S = H.get_covering_equipped_item_by_zone(BP_CHEST) diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm index be65f62f707..b828ae9e7b0 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spiders/ai_guard.dm @@ -23,7 +23,7 @@ paired_nurse = null /datum/mob_controller/aggressive/giant_spider/guard/proc/find_nurse() - for(var/mob/living/simple_animal/hostile/giant_spider/nurse/nurse in list_targets(10)) + for(var/mob/living/simple_animal/hostile/giant_spider/nurse/nurse in get_raw_target_list()) if(nurse.stat || !istype(nurse.ai, /datum/mob_controller/aggressive/giant_spider/nurse)) continue var/datum/mob_controller/aggressive/giant_spider/nurse/nurse_ai = nurse.ai diff --git a/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm b/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm index 091230eca45..ead786ab340 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebots/megabot.dm @@ -26,7 +26,7 @@ /datum/mob_controller/aggressive/megahivebot can_escape_buckles = TRUE -/datum/mob_controller/aggressive/megahivebot/open_fire() +/datum/mob_controller/aggressive/megahivebot/handle_ranged_target(atom/ranged_target) var/mob/living/simple_animal/hostile/hivebot/mega/megabot = body if(!istype(megabot)) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/leech.dm b/code/modules/mob/living/simple_animal/hostile/leech.dm index ea81aa10124..c8f7259babc 100644 --- a/code/modules/mob/living/simple_animal/hostile/leech.dm +++ b/code/modules/mob/living/simple_animal/hostile/leech.dm @@ -17,7 +17,7 @@ /datum/mob_controller/aggressive/leech break_stuff_probability = 5 -/mob/living/simple_animal/hostile/can_pry_door() +/mob/living/simple_animal/hostile/leech/can_pry_door() return FALSE /mob/living/simple_animal/hostile/leech/exoplanet/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index c2e2b3c5a18..88defeeaf28 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -45,7 +45,7 @@ var/global/list/protected_objects = list( var/awake = TRUE // Return a list of targets that isn't the creator -/datum/mob_controller/aggressive/mimic/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/mimic/get_valid_targets() var/mob/living/simple_animal/hostile/mimic/mimic = body . = istype(mimic) && mimic.awake && ..() if(length(.) && mimic.creator) 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 87d1378b758..681e1eac390 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -2,7 +2,6 @@ name = "clown" desc = "A denizen of clown planet" icon = 'icons/mob/simple_animal/clown.dmi' - a_intent = I_HURT max_health = 75 harm_intent_damage = 8 minbodytemp = 270 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 55a34786ff6..c8de00b79d2 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -5,7 +5,6 @@ desc = "An automated combat drone armed with state of the art weaponry and shielding." icon = 'icons/mob/simple_animal/drone_combat.dmi' burst_projectile = 0 - a_intent = I_HURT max_health = 300 move_intents = list( /decl/move_intent/walk/animal_slow, @@ -55,8 +54,15 @@ /mob/living/simple_animal/hostile/malf_drone/has_ranged_attack() return TRUE -/datum/mob_controller/aggressive/malf_drone/list_targets(var/dist = 7) - . = ..(hostile_drone ? hostile_range : dist) +/datum/mob_controller/aggressive/malf_drone/get_raw_target_list() + if(hostile_drone) + target_scan_distance = hostile_range + else + target_scan_distance = initial(target_scan_distance) + . = ..() + +/datum/mob_controller/aggressive/malf_drone/get_valid_targets() + . = ..() for(var/mob/M in .) if(istype(M, body.type)) . -= M @@ -76,6 +82,10 @@ ion_trail.set_up(src) ion_trail.start() +/mob/living/simple_animal/hostile/malf_drone/Destroy() + QDEL_NULL(ion_trail) + return ..() + /mob/living/simple_animal/hostile/malf_drone/Process_Spacemove() return 1 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 0541018c1de..d8443751980 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/exoplanet.dm @@ -188,8 +188,8 @@ /mob/living/simple_animal/hostile/beast/charbaby/apply_attack_effects(mob/living/target) . = ..() if(prob(10)) - target.adjust_fire_stacks(1) - target.IgniteMob() + target.adjust_fire_intensity(1) + target.ignite_fire() /mob/living/simple_animal/hostile/beast/shantak/lava desc = "A vaguely canine looking beast. It looks as though its fur is made of stone wool." 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 25ddfdc7d4a..f4f0d39d70c 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/goose.dm @@ -54,7 +54,7 @@ var/obj/item/attacking_with = get_natural_weapon() if(attacking_with) attacking_with.set_base_attack_force(min((attacking_with.get_initial_base_attack_force() + potency), max_damage)) - if(!loose && prob(25) && (attacking_with && attacking_with.get_attack_force(src) >= loose_threshold)) //second wind + if(!loose && prob(25) && (attacking_with && attacking_with.expend_attack_force(src) >= loose_threshold)) //second wind loose = TRUE set_max_health(initial(max_health) * 1.5) set_damage(BRUTE, 0) 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 61c888bceaf..faae358b388 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 @@ -53,7 +53,7 @@ var/stun_chance = 5 //chance per attack to Weaken target /mob/living/simple_animal/hostile/goat/king/proc/OnDeath() - visible_message("\The [src] lets loose a terrific wail as its wounds close shut with a flash of light, and its eyes glow even brighter than before!") + visible_message(SPAN_CULT_ANNOUNCE("\The [src] lets loose a terrific wail as its wounds close shut with a flash of light, and its eyes glow even brighter than before!")) new /mob/living/simple_animal/hostile/goat/king/phase2(src.loc) qdel(src) @@ -202,7 +202,7 @@ current_damtype = ELECTROCUTE else if(prob(5)) //earthquake spell - visible_message("\The [src]' eyes begin to glow ominously as dust and debris in the area is kicked up in a light breeze.") + visible_message(SPAN_CULT_ANNOUNCE("\The [src]' eyes begin to glow ominously as dust and debris in the area is kicked up in a light breeze.")) ai?.pause() if(do_after(src, 6 SECONDS, src)) var/initial_brute = get_damage(BRUTE) @@ -230,7 +230,7 @@ boss_theme = play_looping_sound(src, sound_id, 'sound/music/Visager-Miniboss_Fight.ogg', volume = 10, range = 8, falloff = 4, prefer_mute = TRUE) stun_chance = 10 update_icon() - visible_message("\The [src]' wounds close with a flash, and when he emerges, he's even larger than before!") + visible_message(SPAN_CULT_ANNOUNCE("\The [src]' wounds close with a flash, and when he emerges, he's even larger than before!")) /mob/living/simple_animal/hostile/goat/king/phase2/on_update_icon() ..() 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 5f8e5040ffb..8ca034e24a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -258,7 +258,7 @@ return //Time for the hurt to begin! - parrot.UnarmedAttack(L) + parrot.UnarmedAttack(L, parrot.Adjacent(L)) return //Otherwise, fly towards the mob! @@ -333,7 +333,7 @@ //Mobs with objects /mob/living/simple_animal/hostile/parrot/attackby(var/obj/item/O, var/mob/user) . = ..() - if(!stat && !client && !istype(O, /obj/item/stack/medical) && O.get_attack_force(user)) + if(!stat && !client && !istype(O, /obj/item/stack/medical) && O.expend_attack_force(user)) if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched parrot_interest = user diff --git a/code/modules/mob/living/simple_animal/hostile/slug.dm b/code/modules/mob/living/simple_animal/hostile/slug.dm index 8384fc93a6c..4218f9176bf 100644 --- a/code/modules/mob/living/simple_animal/hostile/slug.dm +++ b/code/modules/mob/living/simple_animal/hostile/slug.dm @@ -23,13 +23,14 @@ try_destroy_surroundings = FALSE can_escape_buckles = TRUE -/datum/mob_controller/aggressive/slug/list_targets(var/dist = 7) +/datum/mob_controller/aggressive/slug/valid_target(atom/A) . = ..() - var/mob/living/simple_animal/hostile/slug/slug = body - if(istype(slug)) - for(var/mob/living/M in .) - if(slug.check_friendly_species(M)) - . -= M + if(.) + if(!ismob(A)) + return FALSE + var/mob/living/simple_animal/hostile/slug/slug = body + if(slug.check_friendly_species(A)) + return FALSE /mob/living/simple_animal/hostile/slug/proc/check_friendly_species(var/mob/living/M) return istype(M) && M.faction == faction diff --git a/code/modules/mob/living/simple_animal/hostile/viscerator.dm b/code/modules/mob/living/simple_animal/hostile/viscerator.dm index 03f3853fd5b..197f1c2b386 100644 --- a/code/modules/mob/living/simple_animal/hostile/viscerator.dm +++ b/code/modules/mob/living/simple_animal/hostile/viscerator.dm @@ -18,8 +18,8 @@ attack_verb = list("sliced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' _base_attack_force = 15 - edge = 1 - sharp = 1 + edge = TRUE + sharp = TRUE /mob/living/simple_animal/hostile/viscerator/check_has_mouth() return FALSE diff --git a/code/modules/mob/living/simple_animal/natural_weapons.dm b/code/modules/mob/living/simple_animal/natural_weapons.dm index 161bf49f7cd..88c5a6a93f9 100644 --- a/code/modules/mob/living/simple_animal/natural_weapons.dm +++ b/code/modules/mob/living/simple_animal/natural_weapons.dm @@ -10,7 +10,7 @@ weapon_can_knock_prone = FALSE // Very powerful in the hands of simplemobs. var/show_in_message // whether should we show up in attack message, e.g. 'urist has been bit with teeth by carp' vs 'urist has been bit by carp' -/obj/item/natural_weapon/get_attack_force(mob/living/user) +/obj/item/natural_weapon/expend_attack_force(mob/living/user) return get_base_attack_force() /obj/item/natural_weapon/attack_message_name() diff --git a/code/modules/mob/living/simple_animal/passive/deer.dm b/code/modules/mob/living/simple_animal/passive/deer.dm index 03acf0a006d..da09424bce8 100644 --- a/code/modules/mob/living/simple_animal/passive/deer.dm +++ b/code/modules/mob/living/simple_animal/passive/deer.dm @@ -36,12 +36,12 @@ uid = "bodytype_animal_deer" /decl/bodytype/quadruped/animal/deer/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -4), "[SOUTH]" = list( 1, -4), - "[EAST]" = list( 9, -4), - "[WEST]" = list(-9, -4) + "[EAST]" = list( 9, -4), + "[WEST]" = list(-9, -4) ) ) return ..() diff --git a/code/modules/mob/living/simple_animal/passive/fox.dm b/code/modules/mob/living/simple_animal/passive/fox.dm index cfa2421fcd3..c2db673e6e8 100644 --- a/code/modules/mob/living/simple_animal/passive/fox.dm +++ b/code/modules/mob/living/simple_animal/passive/fox.dm @@ -32,12 +32,12 @@ uid = "bodytype_animal_fox" /decl/bodytype/quadruped/animal/fox/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 1, -9), "[SOUTH]" = list( 1, -8), - "[EAST]" = list( 11, -9), - "[WEST]" = list(-11, -9) + "[EAST]" = list( 11, -9), + "[WEST]" = list(-11, -9) ) ) return ..() diff --git a/code/modules/mob/living/simple_animal/passive/horse.dm b/code/modules/mob/living/simple_animal/passive/horse.dm index d9ea080a559..e7c235a6c29 100644 --- a/code/modules/mob/living/simple_animal/passive/horse.dm +++ b/code/modules/mob/living/simple_animal/passive/horse.dm @@ -1,21 +1,22 @@ /mob/living/simple_animal/passive/horse - name = "horse" - real_name = "horse" - desc = "A hefty four-legged animal traditionally used for hauling goods, recreational riding, and stomping enemy soldiers to death." - icon = 'icons/mob/simple_animal/horse.dmi' - speak_emote = list("neighs", "whinnies") - possession_candidate = TRUE - mob_size = MOB_SIZE_LARGE - pixel_x = -6 - default_pixel_x = -6 - base_animal_type = /mob/living/simple_animal/passive/horse - faction = null - buckle_pixel_shift = @"{'x':0,'y':0,'z':16}" - can_have_rider = TRUE - max_rider_size = MOB_SIZE_MEDIUM - ai = /datum/mob_controller/passive/horse - - var/honse_color // Replace this with "base" state when simple animal stuff is merged. + name = "horse" + real_name = "horse" + desc = "A hefty four-legged animal traditionally used for hauling goods, recreational riding, and stomping enemy soldiers to death." + icon = 'icons/mob/simple_animal/horse.dmi' + speak_emote = list("neighs", "whinnies") + possession_candidate = TRUE + mob_size = MOB_SIZE_LARGE + pixel_x = -6 + default_pixel_x = -6 + base_animal_type = /mob/living/simple_animal/passive/horse + faction = null + buckle_pixel_shift = @"{'x':0,'y':0,'z':16}" + can_have_rider = TRUE + max_rider_size = MOB_SIZE_MEDIUM + ai = /datum/mob_controller/passive/horse + draw_visible_overlays = list( + "base" = "#ccc496" + ) /datum/mob_controller/passive/horse emote_speech = list("Neigh!","NEIGH!","Neigh?") @@ -31,18 +32,15 @@ . = ..() add_inventory_slot(new /datum/inventory_slot/back/horse) equip_to_slot_or_del(new /obj/item/saddle(src), slot_back_str) - if(!honse_color) - honse_color = pick(get_possible_horse_colors()) + if(!LAZYACCESS(draw_visible_overlays, "base")) + LAZYSET(draw_visible_overlays, "base", pick(get_possible_horse_colors())) update_icon() -/mob/living/simple_animal/passive/horse/refresh_visible_overlays() - var/list/current_overlays = list(overlay_image(icon, icon_state, honse_color, RESET_COLOR)) +/mob/living/simple_animal/passive/horse/add_additional_visible_overlays(list/accumulator) if(buckled_mob) - var/image/horse_front = overlay_image(icon, "[icon_state]-buckled", honse_color, RESET_COLOR) + var/image/horse_front = overlay_image(icon, "[icon_state]-buckled", draw_visible_overlays["base"], RESET_COLOR) horse_front.layer = ABOVE_HUMAN_LAYER - current_overlays += horse_front - set_current_mob_overlay(HO_SKIN_LAYER, current_overlays, redraw_mob = FALSE) // We're almost certainly redrawing in ..() anyway - . = ..() + accumulator += horse_front /mob/living/simple_animal/passive/horse/get_bodytype() return GET_DECL(/decl/bodytype/quadruped/animal/horse) diff --git a/code/modules/mob/living/simple_animal/simple_animal_damage.dm b/code/modules/mob/living/simple_animal/simple_animal_damage.dm index 66f58954916..32cce9c5b44 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_damage.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_damage.dm @@ -56,7 +56,7 @@ if(istype(ai)) ai.retaliate(user) - var/damage = O.get_attack_force(user) + var/damage = O.expend_attack_force(user) if(damage <= resistance) to_chat(user, SPAN_WARNING("This weapon is ineffective; it does no damage.")) return 0 diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index a2d7f65ab16..3bd462aca86 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -59,6 +59,7 @@ /mob/Login() + client.clear_mouse_pointers() // in case we are transferring mobs. global.player_list |= src update_Login_details() world.update_status() @@ -112,11 +113,6 @@ update_action_buttons() update_mouse_pointer() - if(ability_master) - ability_master.update_abilities(TRUE, src) - ability_master.toggle_open(1) - ability_master.synch_spells_to_mind(mind) - if(get_preference_value(/datum/client_preference/show_status_markers) == PREF_SHOW) if(status_markers?.mob_image_personal) client.images |= status_markers.mob_image_personal @@ -129,7 +125,7 @@ if(istype(hud_used)) hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + hud_used.persistent_inventory_update() update_action_buttons() return TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7554d0e91f5..ad15792b151 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -17,8 +17,6 @@ QDEL_NULL(hud_used) if(active_storage) active_storage.close(src) - if(istype(ability_master)) - QDEL_NULL(ability_master) if(istype(skillset)) QDEL_NULL(skillset) QDEL_NULL_LIST(grabbed_by) @@ -57,7 +55,6 @@ QDEL_NULL_SCREEN(radio_use_icon) QDEL_NULL_SCREEN(gun_move_icon) QDEL_NULL_SCREEN(gun_setting_icon) - QDEL_NULL_SCREEN(ability_master) QDEL_NULL_SCREEN(zone_sel) /mob/Initialize() @@ -68,7 +65,6 @@ if(!istype(move_intent)) move_intent = GET_DECL(move_intent) . = ..() - ability_master = new(null, src) refresh_ai_handler() START_PROCESSING(SSmobs, src) @@ -242,8 +238,6 @@ SHOULD_NOT_SLEEP(TRUE) if(QDELETED(src)) return PROCESS_KILL - if(ability_master) - ability_master.update_spells(0) #define UNBUCKLED 0 #define PARTIALLY_BUCKLED 1 @@ -561,10 +555,10 @@ update_flavor_text(href_list["flavor_change"]) return TOPIC_HANDLED -// If usr != src, or if usr == src but the Topic call was not resolved, this is called next. /mob/proc/get_comments_record() return +// If usr != src, or if usr == src but the Topic call was not resolved, this is called next. /mob/OnTopic(mob/user, href_list, datum/topic_state/state) if(href_list["refresh"]) @@ -626,9 +620,6 @@ return TRUE . = ..() -/mob/proc/is_active() - return (0 >= usr.stat) - /mob/proc/can_touch(var/atom/touching) if(!touching.Adjacent(src) || incapacitated()) return FALSE @@ -639,16 +630,6 @@ to_chat(src, SPAN_WARNING("You are buckled down.")) return TRUE -/mob/proc/see(message) - if(!is_active()) - return 0 - to_chat(src, message) - return 1 - -/mob/proc/show_viewers(message) - for(var/mob/M in viewers()) - M.see(message) - /mob/Stat() ..() . = (is_client_active(10 MINUTES)) @@ -806,12 +787,10 @@ to_chat(usr, "You are restrained and cannot do that!") return - var/mob/S = src - var/mob/U = usr var/list/valid_objects = list() var/self = null - if(S == U) + if(src == usr) self = 1 // Removing object from yourself. valid_objects = get_visible_implants(0) @@ -819,16 +798,16 @@ if(self) to_chat(src, "You have nothing stuck in your body that is large enough to remove.") else - to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.") + to_chat(usr, "[src] has nothing stuck in their wounds that is large enough to remove.") return var/obj/item/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects if(self) to_chat(src, "You attempt to get a good grip on [selection] in your body.") else - to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.") - if(!do_mob(U, S, 30, incapacitation_flags = INCAPACITATION_DEFAULT & (~INCAPACITATION_FORCELYING))) //let people pinned to stuff yank it out, otherwise they're stuck... forever!!! + to_chat(usr, "You attempt to get a good grip on [selection] in [src]'s body.") + if(!do_mob(usr, src, 30, incapacitation_flags = INCAPACITATION_DEFAULT & (~INCAPACITATION_FORCELYING))) //let people pinned to stuff yank it out, otherwise they're stuck... forever!!! return - if(!selection || !S || !U) + if(QDELETED(selection) || QDELETED(src) || QDELETED(usr)) return if(self) @@ -837,10 +816,10 @@ visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.") remove_implant(selection) selection.forceMove(get_turf(src)) - if(U.get_empty_hand_slot()) - U.put_in_hands(selection) - if(ishuman(U)) - var/mob/living/human/human_user = U + if(usr.get_empty_hand_slot()) + usr.put_in_hands(selection) + if(ishuman(usr)) + var/mob/living/human/human_user = usr human_user.bloody_hands(src) return 1 @@ -911,7 +890,7 @@ /mob/proc/toggle_throw_mode(force_set) in_throw_mode = isnull(force_set) ? !in_throw_mode : force_set - throw_icon?.icon_state = "act_throw_[in_throw_mode ? "on" : "off"]" + throw_icon?.update_icon() /mob/proc/toggle_antag_pool() set name = "Toggle Add-Antag Candidacy" @@ -988,12 +967,12 @@ /mob/proc/get_gender() return gender -/mob/is_fluid_pushable(var/amt) - if(..() && !buckled && (current_posture.prone || !Check_Shoegrip()) && (amt >= mob_size * (current_posture.prone ? 5 : 10))) +/mob/try_fluid_push(volume, strength) + if(..() && !buckled && (current_posture.prone || !Check_Shoegrip()) && (strength >= mob_size * (current_posture.prone ? 5 : 10))) if(!current_posture.prone) SET_STATUS_MAX(src, STAT_WEAK, 1) if(current_posture.prone && prob(10)) - to_chat(src, "You are pushed down by the flood!") + to_chat(src, SPAN_DANGER("You are pushed down by the flood!")) return TRUE return FALSE @@ -1125,21 +1104,28 @@ /mob/proc/get_bodytype() RETURN_TYPE(/decl/bodytype) +// Bit of a stub for now, but should return the bodytype specific +// to the slot and organ being checked in the future instead of +// always using the mob root bodytype. +/mob/proc/get_equipment_bodytype(slot, bodypart) + RETURN_TYPE(/decl/bodytype) + var/decl/bodytype/root_bodytype = get_bodytype() + return root_bodytype?.resolve_to_equipment_bodytype(src) + /mob/proc/has_body_flag(flag, default = FALSE) var/decl/bodytype/root_bodytype = get_bodytype() if(istype(root_bodytype)) - return root_bodytype.body_flags & flag + return (root_bodytype.body_flags & flag) return default /// Update the mouse pointer of the attached client in this mob. /mob/proc/update_mouse_pointer() if(!client) return - - client.mouse_pointer_icon = initial(client.mouse_pointer_icon) - - if(examine_cursor_icon && client.keys_held["Shift"]) - client.mouse_pointer_icon = examine_cursor_icon + if(client.keys_held["Shift"]) + client.add_mouse_pointer(/decl/mouse_pointer/examine) + else + client.remove_mouse_pointer(/decl/mouse_pointer/examine) /mob/keybind_face_direction(direction) facedir(direction) @@ -1313,11 +1299,6 @@ /mob/proc/get_blood_type() return -// 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 @@ -1396,5 +1377,39 @@ /mob/proc/handle_footsteps() return +//gets name from ID or PDA itself, ID inside PDA doesn't matter +//Useful when player is being seen by other mobs +/mob/proc/get_id_name(if_no_id = "Unknown") + return GetIdCard(exceptions = list(/obj/item/holder))?.registered_name || if_no_id + /mob/proc/can_twohand_item(obj/item/item) return FALSE + +/// THIS DOES NOT RELATE TO HELD ITEM SLOTS. It is very specifically a functional BP_L_HAND or BP_R_HAND organ, not necessarily a gripper. +/mob/proc/get_usable_hand_slot_organ() + var/obj/item/organ/external/paw = GET_EXTERNAL_ORGAN(src, BP_L_HAND) + if(!istype(paw) && !paw.is_usable()) + paw = GET_EXTERNAL_ORGAN(src, BP_R_HAND) + if(istype(paw) && paw.is_usable()) + return paw + +// Called when using the shredding behavior. +/mob/proc/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag) + if((!ignore_intent && !check_intent(I_FLAG_HARM)) || pulling_punches) + return FALSE + if(!ignore_antag && mind && !player_is_antag(mind)) + return FALSE + if(get_equipped_item(slot_handcuffed_str) || buckled) + return FALSE + for(var/decl/natural_attack/attack as anything in get_mob_natural_attacks()) + if(attack.is_usable(src) && attack.shredding) + return TRUE + return FALSE + +/mob/proc/get_mob_natural_attacks() + for(var/obj/item/organ/external/limb in get_external_organs()) + if(!limb.is_usable()) + continue + var/list/limb_unarmed_attacks = limb.get_natural_attacks() + if(istype(limb_unarmed_attacks, /decl/natural_attack) || (islist(limb_unarmed_attacks) && length(limb_unarmed_attacks))) + LAZYDISTINCTADD(., limb_unarmed_attacks) diff --git a/code/modules/mob/mob_automove.dm b/code/modules/mob/mob_automove.dm index ff8d1a6d7ba..f552d4f7c1e 100644 --- a/code/modules/mob/mob_automove.dm +++ b/code/modules/mob/mob_automove.dm @@ -6,18 +6,60 @@ _automove_target = null return ..() +/mob/path_found(list/path) + ..() + if(islist(path) && length(path) > 1) + path.Cut(1, 2) // Remove the first turf since it's going to be our origin. + if(length(path)) + start_automove(path) + +/mob/path_not_found() + ..() + stop_automove() + /// Called by get_movement_delay() to override the current move intent, in cases where an automove has a delay override. /mob/proc/get_automove_delay() var/datum/automove_metadata/metadata = SSautomove.moving_metadata[src] return metadata?.move_delay +/mob/failed_automove() + ..() + stop_automove() + _automove_target = null + return FALSE + /mob/start_automove(target, movement_type, datum/automove_metadata/metadata) _automove_target = target return ..() // The AI datum may decide to track a target instead of using the mob reference. /mob/get_automove_target(datum/automove_metadata/metadata) - . = (istype(ai) && ai.get_automove_target()) || _automove_target || ..() + . = _automove_target || (istype(ai) && ai.get_automove_target()) || ..() + if(islist(.)) + var/list/path = . + while(length(path) && path[1] == get_turf(src)) + path.Cut(1,2) + if(length(path)) + return path[1] + return null + +/mob/handle_post_automoved(atom/old_loc) + if(istype(ai)) + ai.handle_post_automoved(old_loc) + return + if(!islist(_automove_target) || length(_automove_target) <= 0) + return + var/turf/body_turf = get_turf(src) + if(!istype(body_turf)) + return + var/list/_automove_target_list = _automove_target + if(_automove_target_list[1] != body_turf) + return + if(length(_automove_target_list) > 1) + _automove_target_list.Cut(1, 2) + else + _automove_target_list = null + stop_automove() // We do some early checking here to avoid doing the same checks repeatedly by calling SelfMove(). /mob/can_do_automated_move(variant_move_delay) diff --git a/code/modules/mob/mob_damage.dm b/code/modules/mob/mob_damage.dm index 26b684a8e2d..2897d311733 100644 --- a/code/modules/mob/mob_damage.dm +++ b/code/modules/mob/mob_damage.dm @@ -124,5 +124,27 @@ if(do_update_health) update_health() +// Calculates the Siemen's coefficient for a given area of the body. +// 1 is 100% vulnerability, 0 is immune. +/mob/proc/get_siemens_coefficient_for_coverage(coverage_flags = SLOT_HANDS) + var/decl/species/my_species = get_species() + . = my_species ? my_species.shock_vulnerability : 1 + if(. <= 0) + return 0 + if(coverage_flags) + for(var/obj/item/clothing/clothes in get_equipped_items(include_carried = FALSE)) + if(clothes.body_parts_covered & coverage_flags) + if(clothes.siemens_coefficient <= 0) + return 0 + . *= clothes.siemens_coefficient + if(. <= 0) + return 0 + . = max(round(., 0.1), 0) + +//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ. +/mob/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone) + return (istype(def_zone) && def_zone.body_part) ? get_siemens_coefficient_for_coverage(def_zone.body_part) : 1 + /mob/proc/apply_radiation(var/damage = 0) return + diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index c6b35aa2872..88da01483aa 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -60,7 +60,6 @@ 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. @@ -70,9 +69,6 @@ */ var/obj/screen/zone_selector/zone_sel = null - /// Cursor icon used when holding shift over things. - var/examine_cursor_icon = 'icons/effects/mouse_pointers/examine_pointer.dmi' - var/damageoverlaytemp = 0 var/obj/machinery/machine = null @@ -97,8 +93,6 @@ var/bodytemperature = 310.055 //98.7 F var/shakecamera = 0 - var/a_intent = I_HELP//Living - var/decl/move_intent/move_intent = /decl/move_intent/walk var/list/move_intents = list(/decl/move_intent/walk) @@ -161,4 +155,7 @@ // Offset the overhead text if necessary. var/offset_overhead_text_x = 0 - var/offset_overhead_text_y = 0 \ No newline at end of file + var/offset_overhead_text_y = 0 + + /// Are you trying not to hurt your opponent? + var/pulling_punches diff --git a/code/modules/mob/mob_eating.dm b/code/modules/mob/mob_eating.dm index f5e692facfd..c4fb19e2854 100644 --- a/code/modules/mob/mob_eating.dm +++ b/code/modules/mob/mob_eating.dm @@ -1,6 +1,15 @@ -// mobs do not have blocked mouths by default -// overridden in human_defense.dm +//Used to check if they can be fed food/drinks/pills /mob/proc/check_mouth_coverage() + return get_covering_head_item(SLOT_FACE) + +/mob/proc/check_head_coverage() + return !!get_covering_head_item(SLOT_HEAD) + +/mob/proc/get_covering_head_item(slot_flags) + for(var/slot in global.standard_headgear_slots) + var/obj/item/clothes = get_equipped_item(slot) + if(istype(clothes) && (clothes.body_parts_covered & slot_flags) && !(clothes.item_flags & ITEM_FLAG_FLEXIBLEMATERIAL)) + return clothes return null /mob/proc/get_eaten_transfer_amount(var/default) @@ -8,7 +17,7 @@ if(issmall(src)) . = ceil(.*0.5) -/mob/proc/can_eat_food_currently(obj/eating, mob/user) +/mob/proc/can_eat_food_currently(obj/eating, mob/user, consumption_method) return TRUE #define EATING_NO_ISSUE 0 diff --git a/code/modules/mob/mob_grabs.dm b/code/modules/mob/mob_grabs.dm index e02bed4b3dc..0cea8113ed7 100644 --- a/code/modules/mob/mob_grabs.dm +++ b/code/modules/mob/mob_grabs.dm @@ -7,15 +7,6 @@ return /mob/proc/apply_effect(var/effect = 0,var/effecttype = STUN, var/blocked = 0) return -/mob/proc/has_organ(organ_tag) - return !!get_organ(organ_tag, /obj/item/organ) -/mob/proc/get_organ(var/organ_tag, var/expected_type) - RETURN_TYPE(/obj/item/organ) - return -/mob/proc/get_injured_organs() - return -/mob/proc/get_organs() - return // End grab casting stubs. /mob/can_be_grabbed(var/mob/grabber, var/target_zone) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 5fb27df3f1d..67e363adcb0 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -130,7 +130,7 @@ var/global/list/global/organ_rel_size = list( if(!ranged_attack) // target isn't trying to fight - if(target.a_intent == I_HELP) + if(target.check_intent(I_FLAG_HELP)) return zone // you cannot miss if your target is prone or restrained if(target.buckled || target.current_posture.prone) @@ -258,55 +258,6 @@ var/global/list/global/organ_rel_size = list( if(full_body && (get_equipped_item(slot_back_str) || get_equipped_item(slot_wear_mask_str))) return TRUE -//converts intent-strings into numbers and back -var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) -/proc/intent_numeric(argument) - if(istext(argument)) - switch(argument) - if(I_HELP) return 0 - if(I_DISARM) return 1 - if(I_GRAB) return 2 - else return 3 - else - switch(argument) - if(0) return I_HELP - if(1) return I_DISARM - if(2) return I_GRAB - else return I_HURT - -/mob/proc/can_change_intent() - return FALSE - -//change a mob's act-intent. Input the intent as a string such as "help" or use "right"/"left -/mob/proc/a_intent_change(input) - set name = "a-intent" - set hidden = 1 - - if(can_change_intent()) - switch(input) - if(I_HELP,I_DISARM,I_GRAB,I_HURT) - a_intent = input - if("right") - a_intent = intent_numeric((intent_numeric(a_intent)+1) % 4) - if("left") - a_intent = intent_numeric((intent_numeric(a_intent)+3) % 4) - if(istype(hud_used) && hud_used.action_intent) - hud_used.action_intent.icon_state = "intent_[a_intent]" - - else if(isrobot(src)) - switch(input) - if(I_HELP) - a_intent = I_HELP - if(I_HURT) - a_intent = I_HURT - if("right","left") - a_intent = intent_numeric(intent_numeric(a_intent) - 3) - if(istype(hud_used) && hud_used.action_intent) - if(a_intent == I_HURT) - hud_used.action_intent.icon_state = I_HURT - else - hud_used.action_intent.icon_state = I_HELP - /mob/proc/welding_eyecheck() return @@ -343,8 +294,6 @@ var/global/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HURT) var/datum/mind/M = O if(M.current && M.current.client) C = M.current.client - else if(M.original && M.original.client) - C = M.original.client if(C) if(C.get_preference_value(/datum/client_preference/anon_say) == PREF_YES) diff --git a/code/modules/mob/mob_intent.dm b/code/modules/mob/mob_intent.dm new file mode 100644 index 00000000000..b55b2342ed8 --- /dev/null +++ b/code/modules/mob/mob_intent.dm @@ -0,0 +1,158 @@ +// == Updated intent system == +// - Use mob.get_intent() to retrieve the entire decl structure. +// - Use mob.check_intent(I_FOO) for 1:1 intent type checking. +// - Use mob.check_intent(I_FLAG_FOO) for 'close enough for government work' flag checking. +// - Use mob.set_intent(I_FOO) to set intent to a type +// - Use mob.set_intent(I_FLAG_FOO) to set intent to whatever available type has the flag. +// - Use mob.cycle_intent(INTENT_HOTKEY_LEFT) or mob.cycle_intent(INTENT_HOTKEY_RIGHT) to step up or down the mob intent list. +// - Override mob.get_available_intents() if you want to change the intents from the default four. + +// TODO: +// - dynamic intent options based on equipped weapons, species, bodytype of active hand + +/proc/resolve_intent(intent) + RETURN_TYPE(/decl/intent) + // Legacy, should not proc. + if(istext(intent)) + intent = decls_repository.get_decl_by_id_or_var(intent, /decl/intent, "name") + // Saves constantly calling GET_DECL(I_FOO) + if(ispath(intent, /decl/intent)) + intent = GET_DECL(intent) + if(istype(intent, /decl/intent)) + return intent + return null + +/decl/intent + abstract_type = /decl/intent + decl_flags = DECL_FLAG_MANDATORY_UID + /// Replacing the old usage of I_HARM etc. in attackby() and such. Refer to /mob/proc/check_intent(). + var/intent_flags = 0 + /// Descriptive string used in status panel. + var/name + /// Descriptive string shown when examined. + var/desc + /// Icon used to draw this intent in the selector. + var/icon = 'icons/screen/intents.dmi' + /// State used to update intent selector. + var/icon_state + +/decl/intent/validate() + . = ..() + if(!istext(name)) + . += "null or invalid name" + if(!istext(icon_state)) + . += "null or invalid icon_state" + if(!icon) + . += "null icon" + if(icon && istext(icon_state)) + if(!check_state_in_icon(icon_state, icon)) + . += "missing icon_state '[icon_state]' from icon '[icon]'" + if(!check_state_in_icon("[icon_state]_off", icon)) + . += "missing icon_state '[icon_state]_off' from icon '[icon]'" + +// Basic subtypes. +/decl/intent/harm + name = "harm" + desc = "HARM INTENT: you will attempt to damage, disrupt or destroy whatever you interact with." + uid = "intent_harm" + intent_flags = I_FLAG_HARM + icon_state = "intent_harm" + sort_order = 4 // Corresponding to hotkey order. + +/decl/intent/grab + name = "grab" + desc = "GRAB INTENT: you will attempt to grab hold of any object or creature you interact with." + uid = "intent_grab" + intent_flags = I_FLAG_GRAB + icon_state = "intent_grab" + sort_order = 3 // Corresponding to hotkey order. + +/decl/intent/help + name = "help" + desc = "HELP INTENT: you will attempt to assist, or in general void harming, whatever you interact with." + uid = "intent_help" + intent_flags = I_FLAG_HELP + icon_state = "intent_help" + sort_order = 1 // Corresponding to hotkey order. + +/decl/intent/disarm + name = "disarm" + desc = "DISARM INTENT: you will attempt to disarm or incapacitate any creature you interact with." + uid = "intent_disarm" + intent_flags = I_FLAG_DISARM + icon_state = "intent_disarm" + sort_order = 2 // Corresponding to hotkey order. + +// Used by nymphs. +/decl/intent/harm/binary + icon = 'icons/screen/intents_wide.dmi' + uid = "intent_harm_simple" + intent_flags = (I_FLAG_HARM|I_FLAG_DISARM) + +/decl/intent/help/binary + icon = 'icons/screen/intents_wide.dmi' + uid = "intent_help_simple" + intent_flags = (I_FLAG_HARM|I_FLAG_GRAB) + +/mob + /// Decl for current 'intent' of mob; hurt, harm, etc. Initialized by get_intent(). + var/decl/intent/_a_intent + +/mob/proc/check_intent(checking_intent) + var/decl/intent/intent = get_intent() // Ensures intent has been initalised. + . = (intent == checking_intent) + if(!.) + if(isnum(checking_intent)) + return (intent.intent_flags & checking_intent) + else if(istext(checking_intent) || ispath(checking_intent, /decl/intent)) + return (intent == resolve_intent(checking_intent)) + +/mob/proc/set_intent(decl/intent/new_intent) + + if(!isnum(new_intent)) + new_intent = resolve_intent(new_intent) + else // Retrieve intent decl based on flag. + for(var/decl/intent/intent as anything in get_available_intents()) + if(intent.intent_flags & new_intent) + new_intent = intent + break + + if(istype(new_intent) && get_intent() != new_intent) + _a_intent = new_intent + if(istype(hud_used) && hud_used.action_intent) + hud_used.action_intent.update_icon() + return TRUE + + return FALSE + +/mob/proc/get_intent() + RETURN_TYPE(/decl/intent) + if(!_a_intent) + _a_intent = get_default_intent() + return _a_intent + +/mob/proc/get_default_intent() + return GET_DECL(/decl/intent/help) + +/mob/proc/get_available_intents() + var/static/list/available_intents + if(!available_intents) + available_intents = list( + GET_DECL(/decl/intent/help), + GET_DECL(/decl/intent/disarm), + GET_DECL(/decl/intent/grab), + GET_DECL(/decl/intent/harm) + ) + available_intents = sortTim(available_intents, /proc/cmp_decl_sort_value_asc) + return available_intents + +/mob/proc/cycle_intent(input) + set name = "a-intent" + set hidden = TRUE + switch(input) + if(INTENT_HOTKEY_RIGHT) + return set_intent(next_in_list(get_intent(), get_available_intents())) + if(INTENT_HOTKEY_LEFT) + return set_intent(previous_in_list(get_intent(), get_available_intents())) + else // Fallback, should just use set_intent() directly + return set_intent(input) diff --git a/code/modules/mob/mob_layering.dm b/code/modules/mob/mob_layering.dm index d98e8923528..e4ecb2b5007 100644 --- a/code/modules/mob/mob_layering.dm +++ b/code/modules/mob/mob_layering.dm @@ -7,9 +7,9 @@ var/last_layer = layer var/new_layer = get_base_layer() if(isturf(loc)) - var/turf/T = loc - if(T.pixel_z < 0) - new_layer = T.layer + 0.25 + var/turf/my_turf = loc + if(my_turf.pixel_z < 0 && !my_turf.get_supporting_platform()) + new_layer = my_turf.layer + 0.25 else if(buckled && buckled.buckle_layer_above) new_layer = buckled.layer + ((buckled.dir == SOUTH) ? -0.01 : 0.01) else if(length(grabbed_by)) @@ -97,8 +97,14 @@ // Update offsets from loc. var/turf/floor/ext = loc - if(istype(ext) && ext.height < 0) - new_pixel_z += ext.pixel_z + if(istype(ext)) + var/obj/structure/platform = ext.get_supporting_platform() + if(platform) + new_pixel_z += platform.pixel_z + else if(ext.height < 0) + new_pixel_z += ext.pixel_z + + // Check for catwalks/supporting platforms. // Update offsets from our buckled atom. if(buckled && buckled.buckle_pixel_shift) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index c11e15b0580..a934d39d2e3 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -39,11 +39,10 @@ attack_self() return if(SOUTHWEST) - if(isliving(usr)) - var/mob/living/M = usr - M.toggle_throw_mode() + if(isliving(mob)) + mob.toggle_throw_mode() else - to_chat(usr, "This mob type cannot throw items.") + to_chat(src, "This mob type cannot throw items.") return if(NORTHWEST) mob.hotkey_drop() @@ -269,8 +268,8 @@ /mob/proc/set_move_intent(var/decl/move_intent/next_intent) if(next_intent && move_intent != next_intent && next_intent.can_be_used_by(src)) move_intent = next_intent - if(istype(hud_used)) - hud_used.move_intent.icon_state = move_intent.hud_icon_state + if(istype(hud_used) && hud_used.move_intent) + hud_used.move_intent.update_icon() return TRUE return FALSE diff --git a/code/modules/mob/mob_organs.dm b/code/modules/mob/mob_organs.dm new file mode 100644 index 00000000000..eb5b763c95f --- /dev/null +++ b/code/modules/mob/mob_organs.dm @@ -0,0 +1,21 @@ +/mob/proc/has_organ(organ_tag) + return !!get_organ(organ_tag, /obj/item/organ) + +/mob/proc/get_organ(var/organ_tag, var/expected_type) + RETURN_TYPE(/obj/item/organ) + return + +/mob/proc/get_injured_organs() + return + +/mob/proc/get_external_organs() + return + +/mob/proc/get_internal_organs() + return + +/mob/proc/get_organs() + for(var/organ in get_external_organs()) + LAZYADD(., organ) + for(var/organ in get_internal_organs()) + LAZYADD(., organ) diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index 6951ec383e3..6c3a0d04ada 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -36,12 +36,11 @@ show_lobby_menu(TRUE) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) - var/decl/security_level/SL = security_state.current_security_level - var/alert_desc = "" - if(SL.up_description) - alert_desc = SL.up_description - - to_chat(src, SPAN_NOTICE("The alert level on the [station_name()] is currently: [SL.name]. [alert_desc]")) + if(security_state?.show_on_login) + var/decl/security_level/SL = security_state.current_security_level + // todo: allow maps to oevrride this string for things like the fantasy map being on high alert? + // eg "The alert level *in* Karzerfeste Keep is currently high alert." or "Karzerfeste Keep is currently on high alert." + to_chat(src, SPAN_NOTICE("The alert level on the [station_name()] is currently: [SL.name]. [SL?.up_description]")) // bolds the changelog button on the interface so we know there are updates. if(client.prefs?.lastchangelog != global.changelog_hash) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index f03372203ad..76e3dc995a5 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -2,6 +2,7 @@ universal_speak = TRUE mob_sort_value = 10 invisibility = INVISIBILITY_ABSTRACT + is_spawnable_type = FALSE simulated = FALSE density = FALSE stat = DEAD @@ -323,7 +324,7 @@ INITIALIZE_IMMEDIATE(/mob/new_player) ordered_submaps = sortTim(SSmapping.submaps.Copy(), /proc/cmp_submap_asc) for(var/datum/submap/submap as anything in ordered_submaps) if(submap?.available()) - dat += "[submap.name] ([submap.archetype.descriptor]):" + dat += "[submap.name] ([submap.archetype.name]):" job_summaries = list() for(var/otherthing in submap.jobs) var/datum/job/job = submap.jobs[otherthing] @@ -392,7 +393,6 @@ INITIALIZE_IMMEDIATE(/mob/new_player) if(mind) mind.active = 0 //we wish to transfer the key manually - mind.original = new_character var/memory = client.prefs.records[PREF_MEM_RECORD] if(memory) mind.StoreMemory(memory) @@ -482,10 +482,6 @@ INITIALIZE_IMMEDIATE(/mob/new_player) /mob/new_player/get_admin_job_string() return "New player" -/hook/roundstart/proc/update_lobby_browsers() - global.using_map.refresh_lobby_browsers() - return TRUE - /mob/new_player/change_mob_type(var/new_type, var/turf/location, var/new_name, var/delete_old_mob = FALSE, var/subspecies) to_chat(usr, SPAN_WARNING("You cannot convert players who have not entered the game yet!")) return FALSE diff --git a/code/modules/mob/observer/ghost/ghost.dm b/code/modules/mob/observer/ghost/ghost.dm index acf4b0af582..aa1268cbaa5 100644 --- a/code/modules/mob/observer/ghost/ghost.dm +++ b/code/modules/mob/observer/ghost/ghost.dm @@ -185,9 +185,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. announce_ghost_joinleave(ghost) -/mob/observer/ghost/is_active() - return FALSE - /mob/observer/ghost/Stat() . = ..() if(statpanel("Status") && SSevac.evacuation_controller) @@ -626,3 +623,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghost_all_access = new if(!is_type_in_list(ghost_all_access, exceptions)) LAZYDISTINCTADD(., ghost_all_access) + +/mob/observer/ghost/Login() + ..() + if (ghost_image) + ghost_image.appearance = src + ghost_image.appearance_flags = RESET_ALPHA + SSghost_images.queue_image_update(src) + +/mob/observer/ghost/proc/check_existence_failure() + if(!QDELETED(src) && !key) //we've transferred to another mob. This ghost should be deleted. + qdel(src) + +/mob/observer/ghost/Logout() + ..() + addtimer(CALLBACK(src, PROC_REF(check_existence_failure)), 0) + +/mob/observer/ghost/say(var/message) + sanitize_and_communicate(/decl/communication_channel/dsay, client, message) diff --git a/code/modules/mob/observer/ghost/login.dm b/code/modules/mob/observer/ghost/login.dm deleted file mode 100644 index f8be3dd4671..00000000000 --- a/code/modules/mob/observer/ghost/login.dm +++ /dev/null @@ -1,6 +0,0 @@ -/mob/observer/ghost/Login() - ..() - if (ghost_image) - ghost_image.appearance = src - ghost_image.appearance_flags = RESET_ALPHA - SSghost_images.queue_image_update(src) diff --git a/code/modules/mob/observer/ghost/logout.dm b/code/modules/mob/observer/ghost/logout.dm deleted file mode 100644 index 7c125cef367..00000000000 --- a/code/modules/mob/observer/ghost/logout.dm +++ /dev/null @@ -1,5 +0,0 @@ -/mob/observer/ghost/Logout() - ..() - spawn(0) - if(src && !key) //we've transferred to another mob. This ghost should be deleted. - qdel(src) diff --git a/code/modules/mob/observer/ghost/say.dm b/code/modules/mob/observer/ghost/say.dm deleted file mode 100644 index f30f4a672c1..00000000000 --- a/code/modules/mob/observer/ghost/say.dm +++ /dev/null @@ -1,2 +0,0 @@ -/mob/observer/ghost/say(var/message) - sanitize_and_communicate(/decl/communication_channel/dsay, client, message) diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm index dba7e533d34..809e917ed76 100644 --- a/code/modules/mob/skills/skill.dm +++ b/code/modules/mob/skills/skill.dm @@ -1,14 +1,24 @@ /decl/skill - - abstract_type = /decl/skill // Don't mess with this without changing how Initialize works. - var/name = "None" // Name of the skill. This is what the player sees. - var/decl/skill_category/category // Category this skill belongs to. - var/desc = "Placeholder skill" // Generic description of this skill. - var/difficulty = SKILL_AVERAGE //Used to compute how expensive the skill is - var/default_max = SKILL_ADEPT //Makes the skill capped at this value in selection unless overriden at job level. - var/default_value // The specific default value used for this skill. If null, uses the skillset's default. - var/prerequisites // A list of skill prerequisites, if needed. - var/fallback_key // If the skill UID is not found in the savefile, this is the fallback key to use for migrating old savefiles. + // UID is required for saving in prefs. + decl_flags = DECL_FLAG_MANDATORY_UID + /// Don't mess with this without changing how Initialize works. + abstract_type = /decl/skill + /// Name of the skill. This is what the player sees. + var/name = "None" + /// Generic description of this skill. + var/desc = "Placeholder skill" + /// Used to compute how expensive the skill is + var/difficulty = SKILL_AVERAGE + /// Makes the skill capped at this value in selection unless overriden at job level. + var/default_max = SKILL_ADEPT + /// The specific default value used for this skill. If null, uses the skillset's default. + var/default_value + /// A list of skill prerequisites, if needed. + var/prerequisites + /// If the skill UID is not found in the savefile, this is the fallback key to use for migrating old savefiles. + var/fallback_key + /// Category this skill belongs to. + var/decl/skill_category/category // Names for different skill values, in order from 1 up. var/list/levels = list( @@ -351,6 +361,7 @@ category = /decl/skill_category/engineering uid = "skill_engines" fallback_key = "/decl/hierarchy/skill/engineering/engines" + // TODO: These strings should be modified by the supermatter modpack somehow... desc = "Describes your knowledge of the various engine types common on space stations, such as the PACMAN, singularity, supermatter or RUST engine." levels = list( "Unskilled" = "You know that \"delamination\" is a bad thing and that you should stay away from the singularity. You know the engine provides power, but you're unclear on the specifics. If you were to try to set up the engine, you would need someone to talk you through every detail--and even then, you'd probably make deadly mistakes.
    - You can read the SM monitor readings with 40% error. This decreases with level.", diff --git a/code/modules/mob/skills/skill_ui.dm b/code/modules/mob/skills/skill_ui.dm index 540b250d4eb..221439db085 100644 --- a/code/modules/mob/skills/skill_ui.dm +++ b/code/modules/mob/skills/skill_ui.dm @@ -122,13 +122,20 @@ The generic antag version. . = ..() .["can_choose"] = can_choose() var/list/selection_data = list() - var/decl/skill/skill = GET_DECL(/decl/skill) + var/decl/skill/sample_skill // just used to get the skill level names + for(var/candidate_skill_type in skillset.skill_list) + var/decl/skill/candidate = GET_DECL(candidate_skill_type) + if(length(candidate.levels) == SKILL_MAX) // find a skill with all the levels, so avoid perks/traits + sample_skill = candidate + break + if(!sample_skill) + sample_skill = GET_DECL(/decl/skill/general/hauling) for(var/i in 1 to length(max_choices)) var/choices = max_choices[i] if(!choices) continue var/list/level_data = list() - level_data["name"] = skill.levels[i] + level_data["name"] = sample_skill.levels[i] level_data["level"] = i var/selected = LAZYACCESS(currently_selected, i) level_data["selected"] = list() diff --git a/code/modules/mob/stripping.dm b/code/modules/mob/stripping.dm index 18b1ccb45e9..0856c861787 100644 --- a/code/modules/mob/stripping.dm +++ b/code/modules/mob/stripping.dm @@ -47,7 +47,7 @@ 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!") + visible_message("\The [user] is trying to set \the [src]'s internals!") if(do_after(user, HUMAN_STRIP_DELAY, src, progress = 0)) toggle_internals(user) return diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 30ee2e205d6..6ec207ea1b8 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -70,7 +70,6 @@ O.aiRestorePowerRoutine = 0 if(mind) mind.transfer_to(O) - O.mind.original = O else O.key = key @@ -99,8 +98,7 @@ O.add_ai_verbs() O.rename_self("ai",1) - spawn(0) // Mobs still instantly del themselves, thus we need to spawn or O will never be returned - qdel(src) + qdel(src) return O //human -> robot @@ -128,7 +126,6 @@ mind.active = TRUE mind.transfer_to(O) if(O.mind && O.mind.assigned_role == ASSIGNMENT_ROBOT) - O.mind.original = O 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.central_processor = new mmi_type(O) @@ -138,7 +135,7 @@ RAISE_EVENT(/decl/observ/cyborg_created, O) O.Namepick() - qdel(src) // Queues us for a hard delete + qdel(src) return O /mob/living/human/proc/corgize() @@ -154,7 +151,7 @@ qdel(t) var/mob/living/simple_animal/corgi/new_corgi = new /mob/living/simple_animal/corgi (loc) - new_corgi.a_intent = I_HURT + new_corgi.set_intent(get_intent()) new_corgi.key = key to_chat(new_corgi, "You are now a Corgi. Yap Yap!") @@ -186,12 +183,11 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.a_intent = I_HURT + new_mob.set_intent(get_intent()) to_chat(new_mob, "You suddenly feel more... animalistic.") - spawn() - qdel(src) + qdel(src) return /mob/proc/Animalize() @@ -206,7 +202,7 @@ var/mob/new_mob = new mobpath(src.loc) new_mob.key = key - new_mob.a_intent = I_HURT + new_mob.set_intent(get_intent()) to_chat(new_mob, "You feel more... animalistic.") qdel(src) diff --git a/code/modules/mob_holder/_holder.dm b/code/modules/mob_holder/_holder.dm index a462eff5ba0..002814c0c09 100644 --- a/code/modules/mob_holder/_holder.dm +++ b/code/modules/mob_holder/_holder.dm @@ -115,9 +115,9 @@ if(length(cards)) LAZYDISTINCTADD(., cards) -/obj/item/holder/attack_self() +/obj/item/holder/attack_self(mob/user) for(var/mob/M in contents) - M.show_stripping_window(usr) + M.show_stripping_window(user) /obj/item/holder/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) @@ -132,8 +132,15 @@ return ..() /obj/item/holder/proc/sync(var/mob/living/M) + SetName(M.name) desc = M.desc + + if(QDELETED(src) || QDELETED(M) || !istype(M)) + set_light(0) + else + set_light(M.light_range, M.light_power, M.light_color) + var/mob/living/human/H = loc if(istype(H)) last_holder = H diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 6bb4a4f41b8..4adb8e75dd2 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -85,23 +85,22 @@ return TRUE . = ..() -/obj/item/modular_computer/attackby(var/obj/item/W, var/mob/user) +/obj/item/modular_computer/attackby(var/obj/item/used_item, var/mob/user) + var/datum/extension/assembly/assembly = get_extension(src, /datum/extension/assembly) - . = assembly.attackby(W, user) - if(.) + if(assembly?.attackby(used_item, user)) update_verbs() return TRUE - if(IS_PEN(W) && (W.w_class <= ITEM_SIZE_TINY) && stores_pen) + if(IS_PEN(used_item) && (used_item.w_class <= ITEM_SIZE_TINY) && stores_pen) if(istype(stored_pen)) - to_chat(user, "There is already a pen in [src].") - return TRUE - if(!user.try_unequip(W, src)) - return TRUE - stored_pen = W - update_verbs() - to_chat(user, "You insert [W] into [src].") + to_chat(user, SPAN_NOTICE("There is already \a [stored_pen] in \the [src].")) + else if(user.try_unequip(used_item, src)) + stored_pen = used_item + update_verbs() + to_chat(user, SPAN_NOTICE("You insert \the [used_item] into [src].")) return TRUE + return ..() /obj/item/modular_computer/examine(mob/user) @@ -136,10 +135,13 @@ /obj/item/modular_computer/get_alt_interactions(var/mob/user) . = ..() - LAZYADD(., /decl/interaction_handler/remove_id/modular_computer) - LAZYADD(., /decl/interaction_handler/remove_pen/modular_computer) - LAZYADD(., /decl/interaction_handler/emergency_shutdown) - LAZYADD(., /decl/interaction_handler/remove_chargestick) + var/static/list/_modular_computer_interactions = list( + /decl/interaction_handler/remove_id/modular_computer, + /decl/interaction_handler/remove_pen/modular_computer, + /decl/interaction_handler/emergency_shutdown, + /decl/interaction_handler/remove_chargestick + ) + LAZYADD(., _modular_computer_interactions) // // Remove ID @@ -181,6 +183,7 @@ icon = 'icons/screen/radial.dmi' icon_state = "radial_power_off" expected_target_type = /obj/item/modular_computer + examine_desc = "perform an emergency shutdown" /decl/interaction_handler/emergency_shutdown/is_possible(atom/target, mob/user, obj/item/prop) . = ..() @@ -201,6 +204,7 @@ icon = 'icons/screen/radial.dmi' icon_state = "radial_eject" expected_target_type = /obj/item/modular_computer + examine_desc = "remove a chargestick" /decl/interaction_handler/remove_chargestick/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm index ad7c698d6d8..894b912aff9 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm @@ -15,7 +15,7 @@ /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, ) var/icon_state_closed = "laptop-closed" - + /obj/item/modular_computer/laptop/on_update_icon() if(anchored) ..() @@ -35,6 +35,7 @@ name = "Open Laptop" expected_target_type = /obj/item/modular_computer/laptop interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_TURF + examine_desc = "open or close $TARGET_THEM$" /decl/interaction_handler/laptop_open/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/modular_computer/laptop/L = target diff --git a/code/modules/modular_computers/computers/subtypes/preset_console.dm b/code/modules/modular_computers/computers/subtypes/preset_console.dm index c726c3ac6a2..1bc6fd711de 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_console.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_console.dm @@ -48,7 +48,6 @@ /obj/machinery/computer/modular/preset/engineering default_software = list( /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor, /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/atmos_control, /datum/computer_file/program/rcon_console, diff --git a/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm b/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm index 23e4122b908..284372c00bf 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm @@ -68,8 +68,7 @@ default_software = list( /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/camera_monitor, - /datum/computer_file/program/shields_monitor, - /datum/computer_file/program/supermatter_monitor + /datum/computer_file/program/shields_monitor ) /obj/machinery/computer/modular/telescreen/preset/entertainment 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 68257d94e53..af9339b6a13 100644 --- a/code/modules/modular_computers/file_system/programs/command/card.dm +++ b/code/modules/modular_computers/file_system/programs/command/card.dm @@ -151,7 +151,7 @@ module.show_assignments = 1 if("print") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer.has_component(PART_PRINTER)) //This option should never be called if there is no printer if(module.mod_mode) @@ -175,7 +175,7 @@ contents += " [get_access_desc(A)]" if(!computer.print_paper(contents,"access report")) - to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") + to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper.") return else var/contents = {"

    Crew Manifest

    @@ -183,7 +183,7 @@ [html_crew_manifest()] "} if(!computer.print_paper(contents, "crew manifest ([stationtime2text()])")) - to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") + to_chat(user, "Hardware error: Printer was unable to print the file. It may be out of paper.") return if("eject") var/obj/item/stock_parts/computer/card_slot/card_slot = computer.get_component(PART_CARD) @@ -193,7 +193,7 @@ card_slot.insert_id(user.get_active_held_item(), user) if("terminate") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer) id_card.assignment = "Terminated" @@ -201,7 +201,7 @@ RAISE_EVENT(/decl/observ/employee_id_terminated, id_card) if("edit") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer) var/static/regex/hash_check = regex(@"^[0-9a-fA-F]{32}$") @@ -212,7 +212,7 @@ id_card.formal_name_suffix = initial(id_card.formal_name_suffix) id_card.formal_name_prefix = initial(id_card.formal_name_prefix) else - computer.show_error(usr, "Invalid name entered!") + computer.show_error(user, "Invalid name entered!") else if(href_list["account"]) var/account_num = text2num(input("Enter account number.", "Account", id_card.associated_account_number)) id_card.associated_account_number = account_num @@ -243,11 +243,11 @@ if(!isnull(sug_blood_type) && CanUseTopic(user)) id_card.blood_type = sug_blood_type else if(href_list["front_photo"]) - var/photo = get_photo(usr) + var/photo = get_photo(user) if(photo && CanUseTopic(user)) id_card.front = photo else if(href_list["side_photo"]) - var/photo = get_photo(usr) + var/photo = get_photo(user) if(photo && CanUseTopic(user)) id_card.side = photo else if(href_list["load_data"]) @@ -275,7 +275,7 @@ apply_access(id_card, access) if("assign") if(!(get_file_perms(module.get_access(user), user) & OS_WRITE_ACCESS)) - to_chat(usr, SPAN_WARNING("Access denied.")) + to_chat(user, SPAN_WARNING("Access denied.")) return if(computer && id_card) var/t1 = href_list["assign_target"] diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm index 8d9a59feacf..fbb4c292e2c 100644 --- a/code/modules/modular_computers/file_system/programs/command/comm.dm +++ b/code/modules/modular_computers/file_system/programs/command/comm.dm @@ -62,7 +62,7 @@ data["message_line1"] = msg_line1 data["message_line2"] = msg_line2 data["state"] = current_status - data["isAI"] = issilicon(usr) + data["isAI"] = issilicon(user) data["authenticated"] = is_authenticated(user) data["boss_short"] = global.using_map.boss_short @@ -153,17 +153,17 @@ current_status = text2num(href_list["target"]) if("announce") . = 1 - if(is_authenticated(user) && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_comm) if(user) var/obj/item/card/id/id_card = user.GetIdCard() crew_announcement.announcer = GetNameAndAssignmentFromId(id_card) else crew_announcement.announcer = "Unknown" if(announcment_cooldown) - to_chat(usr, "Please allow at least one minute to pass between announcements.") + to_chat(user, "Please allow at least one minute to pass between announcements.") return TRUE - var/input = input(usr, "Please write a message to announce to the [station_name()].", "Priority Announcement") as null|message - if(!input || !can_still_topic() || filter_block_message(usr, input)) + var/input = input(user, "Please write a message to announce to the [station_name()].", "Priority Announcement") as null|message + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 var/affected_zlevels = SSmapping.get_connected_levels(get_host_z()) crew_announcement.Announce(input, zlevels = affected_zlevels) @@ -174,35 +174,35 @@ . = 1 if(href_list["target"] == "emagged") if(program) - if(is_authenticated(user) && program.computer.emagged() && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && program.computer.emagged() && !issilicon(user) && ntn_comm) if(centcomm_message_cooldown) - to_chat(usr, "Arrays recycling. Please stand by.") + to_chat(user, "Arrays recycling. Please stand by.") SSnano.update_uis(src) return - var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic() || filter_block_message(usr, input)) + var/input = sanitize(input(user, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 - Syndicate_announce(input, usr) - to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made an illegal announcement: [input]") + Syndicate_announce(input, user) + to_chat(user, "Message transmitted.") + log_say("[key_name(user)] has made an illegal announcement: [input]") centcomm_message_cooldown = 1 spawn(300)//30 second cooldown centcomm_message_cooldown = 0 else if(href_list["target"] == "regular") - if(is_authenticated(user) && !issilicon(usr) && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_comm) if(centcomm_message_cooldown) - to_chat(usr, "Arrays recycling. Please stand by.") + to_chat(user, "Arrays recycling. Please stand by.") SSnano.update_uis(src) return if(!is_relay_online())//Contact Centcom has a check, Syndie doesn't to allow for Traitor funs. - to_chat(usr, "No emergency communication relay detected. Unable to transmit message.") + to_chat(user, "No emergency communication relay detected. Unable to transmit message.") return 1 var/input = sanitize(input("Please choose a message to transmit to [global.using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "") as null|text) - if(!input || !can_still_topic() || filter_block_message(usr, input)) + if(!input || !can_still_topic() || filter_block_message(user, input)) return 1 - Centcomm_announce(input, usr) - to_chat(usr, "Message transmitted.") - log_say("[key_name(usr)] has made an IA [global.using_map.boss_short] announcement: [input]") + Centcomm_announce(input, user) + to_chat(user, "Message transmitted.") + log_say("[key_name(user)] has made an IA [global.using_map.boss_short] announcement: [input]") centcomm_message_cooldown = 1 spawn(300) //30 second cooldown centcomm_message_cooldown = 0 @@ -241,7 +241,7 @@ post_status(href_list["target"]) if("setalert") . = 1 - if(is_authenticated(user) && !issilicon(usr) && ntn_cont && ntn_comm) + if(is_authenticated(user) && !issilicon(user) && ntn_cont && ntn_comm) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) var/decl/security_level/target_level = locate(href_list["target"]) in security_state.comm_console_security_levels if(target_level && security_state.can_switch_to(target_level)) @@ -250,7 +250,7 @@ if(security_state.set_security_level(target_level)) SSstatistics.add_field(target_level.type,1) else - to_chat(usr, "You press the button, but a red light flashes and nothing happens.") //This should never happen + to_chat(user, "You press the button, but a red light flashes and nothing happens.") //This should never happen current_status = STATE_DEFAULT if("viewmessage") @@ -270,13 +270,13 @@ . = 1 if(is_authenticated(user) && ntn_comm) if(!program.computer.print_paper(current_viewing_message["contents"],current_viewing_message["title"])) - to_chat(usr, "Hardware Error: Printer was unable to print the selected file.") + to_chat(user, "Hardware Error: Printer was unable to print the selected file.") if("unbolt_doors") global.using_map.unbolt_saferooms() - to_chat(usr, "The console beeps, confirming the signal was sent to have the saferooms unbolted.") + to_chat(user, "The console beeps, confirming the signal was sent to have the saferooms unbolted.") if("bolt_doors") global.using_map.bolt_saferooms() - to_chat(usr, "The console beeps, confirming the signal was sent to have the saferooms bolted.") + to_chat(user, "The console beeps, confirming the signal was sent to have the saferooms bolted.") #undef STATE_DEFAULT #undef STATE_MESSAGELIST @@ -365,7 +365,7 @@ var/global/last_message_id = 0 if(isnull(emergency)) emergency = 1 - if(!global.universe.OnShuttleCall(usr)) + if(!global.universe.OnShuttleCall(user)) to_chat(user, "Cannot establish a connection.") return diff --git a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm index 0a0dd383145..0b111c2306a 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm +++ b/code/modules/modular_computers/file_system/programs/engineering/network_monitoring.dm @@ -119,7 +119,7 @@ return TOPIC_HANDLED var/new_roles = global.all_mainframe_roles - M.roles if(!length(new_roles)) - to_chat(usr, SPAN_WARNING("This server already has all possible roles enabled.")) + to_chat(user, SPAN_WARNING("This server already has all possible roles enabled.")) return TOPIC_HANDLED var/role = input(user,"What role to enable on this server?") as null|anything in new_roles if(role && CanUseTopic(user, state)) @@ -132,7 +132,7 @@ if(!istype(M)) return TOPIC_HANDLED if(!length(M.roles)) - to_chat(usr, SPAN_WARNING("This server has no enabled roles to remove.")) + to_chat(user, SPAN_WARNING("This server has no enabled roles to remove.")) return TOPIC_HANDLED var/role = input(user,"What role to disable on this server?") as null|anything in M.roles if(role && CanUseTopic(user, state)) 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 0ea98dcadb4..5d49c83988b 100644 --- a/code/modules/modular_computers/file_system/programs/generic/folding.dm +++ b/code/modules/modular_computers/file_system/programs/generic/folding.dm @@ -23,7 +23,7 @@ var/started_on = 0 // When the program started some science. var/current_interval = 0 // How long the current interval will be. - var/next_event = 0 // in world timeofday, when the next event is scheduled to pop. + var/next_event = 0 // based on world.timeofday, when the next event is scheduled to pop. var/program_status = PROGRAM_STATUS_RUNNING // Program periodically needs a restart, increases crash chance slightly over time. var/crashed_at = 0 // When the program crashed. @@ -109,7 +109,7 @@ "Simulating Alien Abductions", "Scanning Pigeons", "Iterating Chaos Array", - "Abstracting Supermatter", + "Abstracting Exotic Matter", "Adjusting Social Network", "Recalculating Clown Principle" ) diff --git a/code/modules/modular_computers/file_system/programs/generic/records.dm b/code/modules/modular_computers/file_system/programs/generic/records.dm index 4d79e385dd3..0305f32e421 100644 --- a/code/modules/modular_computers/file_system/programs/generic/records.dm +++ b/code/modules/modular_computers/file_system/programs/generic/records.dm @@ -163,7 +163,7 @@ var/obj/item/photo/photo = user.get_active_held_item() return photo.img if(issilicon(user)) - var/mob/living/silicon/tempAI = usr + var/mob/living/silicon/tempAI = user var/obj/item/photo/selection = tempAI.GetPicture() if (selection) return selection.img diff --git a/code/modules/modular_computers/file_system/programs/generic/reports.dm b/code/modules/modular_computers/file_system/programs/generic/reports.dm index 4897bd58385..a88753fdd88 100644 --- a/code/modules/modular_computers/file_system/programs/generic/reports.dm +++ b/code/modules/modular_computers/file_system/programs/generic/reports.dm @@ -141,7 +141,7 @@ return 1 var/field_ID = text2num(href_list["ID"]) var/datum/report_field/field = selected_report.field_from_ID(field_ID) - if(!field || !(field.get_perms(get_access(usr), usr) & OS_WRITE_ACCESS)) + if(!field || !(field.get_perms(get_access(user), user) & OS_WRITE_ACCESS)) return 1 field.ask_value(user) //Handles the remaining IO. return 1 diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index de61e09ddfd..64fc7f971be 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -16,7 +16,7 @@ to_chat(user, "***** DIAGNOSTICS REPORT *****") to_chat(user, jointext(diagnostics(), "\n")) to_chat(user, "******************************") - return 1 + return TRUE return ..() /obj/item/stock_parts/computer/on_install(obj/machinery/machine) diff --git a/code/modules/modular_computers/hardware/lan_port.dm b/code/modules/modular_computers/hardware/lan_port.dm index cde307de70d..8ffecb3d26a 100644 --- a/code/modules/modular_computers/hardware/lan_port.dm +++ b/code/modules/modular_computers/hardware/lan_port.dm @@ -67,7 +67,7 @@ var/turf/T = get_turf(parent) if(check_terminal_block(T)) to_chat(user, SPAN_WARNING("There's already a network cable there!")) - return FALSE + return TRUE if(istype(T) && !T.is_plating()) to_chat(user, SPAN_WARNING("You must remove the floor plating beneath \the [parent] first.")) return TRUE @@ -77,10 +77,10 @@ to_chat(user, SPAN_WARNING("You need five lengths of network cable for \the [parent].")) return TRUE - user.visible_message(SPAN_NOTICE("\The [user] adds cables to the \the [parent]."), "You start adding cables to \the [parent] frame...") + user.visible_message(SPAN_NOTICE("\The [user] adds cables to \the [parent]."), "You start adding cables to \the [parent] frame...") if(do_after(user, 20, parent)) if(!terminal && (loc == parent) && parent.components_are_accessible(type) && !check_terminal_block(T) && C.use(5)) - user.visible_message(SPAN_NOTICE("\The [user] has added cables to the \the [parent]!"), "You add cables to the \the [parent].") + user.visible_message(SPAN_NOTICE("\The [user] has added cables to \the [parent]!"), "You add cables to \the [parent].") set_terminal() return TRUE if(IS_WIRECUTTER(I) && terminal) diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 06d4626f147..f4de33b5361 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -3,8 +3,8 @@ /obj/machinery/lapvend name = "computer vendor" desc = "A vending machine with a built-in microfabricator, capable of dispensing various computers." - icon = 'icons/obj/vending.dmi' - icon_state = "laptop" + icon = 'icons/obj/machines/vending/laptops.dmi' + icon_state = ICON_STATE_WORLD layer = BELOW_OBJ_LAYER anchored = TRUE density = TRUE @@ -278,7 +278,7 @@ if(state == 2) if(process_payment(W)) fabricate_and_recalc_price(1) - flick("laptop-vend", src) + flick("world-vend", src) if((devtype == 1) && fabricated_laptop) fabricated_laptop.forceMove(src.loc) fabricated_laptop.update_icon() diff --git a/code/modules/modular_computers/networking/machinery/acl.dm b/code/modules/modular_computers/networking/machinery/acl.dm index 566d6e17816..7fe16ac83c0 100644 --- a/code/modules/modular_computers/networking/machinery/acl.dm +++ b/code/modules/modular_computers/networking/machinery/acl.dm @@ -32,14 +32,14 @@ if(href_list["back"]) current_group = null return TOPIC_REFRESH - + if(href_list["create_group"]) - var/group_name = sanitize_for_group(input(usr, "Enter the name of the new group. Maximum 15 characters, only alphanumeric characters, _ and - are allowed:", "Create Group")) + var/group_name = sanitize_for_group(input(user, "Enter the name of the new group. Maximum 15 characters, only alphanumeric characters, _ and - are allowed:", "Create Group")) if(!length(group_name)) return TOPIC_HANDLED if(!CanInteract(user, global.default_topic_state)) return TOPIC_REFRESH - + var/output = D.add_group(group_name, current_group) if(group_name in D.all_groups) to_chat(user, SPAN_NOTICE(output)) @@ -59,15 +59,15 @@ else to_chat(user, SPAN_NOTICE(output)) return TOPIC_REFRESH - + if(href_list["toggle_submanagement"]) D.toggle_submanagement() return TOPIC_REFRESH - + if(href_list["toggle_parent_account_creation"]) D.toggle_parent_account_creation() return TOPIC_REFRESH - + if(href_list["view_child_groups"]) var/parent_group = href_list["view_child_groups"] if(parent_group && (parent_group in D.group_dict)) @@ -75,7 +75,7 @@ else current_group = null return TOPIC_REFRESH - + if(href_list["info"]) switch(href_list["info"]) if("submanagement") diff --git a/code/modules/modular_computers/networking/machinery/telecomms.dm b/code/modules/modular_computers/networking/machinery/telecomms.dm index 9c936561586..93f7f7cd491 100644 --- a/code/modules/modular_computers/networking/machinery/telecomms.dm +++ b/code/modules/modular_computers/networking/machinery/telecomms.dm @@ -127,7 +127,7 @@ var/global/list/telecomms_hubs = list() if(overloaded_for > 0) overloaded_for-- -/// Accepts either a raw frequency (numeric), or or a frequency/key string, and returns the associated channel data. +/// Accepts either a raw frequency (numeric), or a frequency/key string, and returns the associated channel data. /obj/machinery/network/telecomms_hub/proc/get_channel_from_freq_or_key(var/cid) cid = "[cid]" . = LAZYACCESS(channels_by_frequency, cid) || LAZYACCESS(channels_by_key, cid) diff --git a/code/modules/modular_computers/os/ui.dm b/code/modules/modular_computers/os/ui.dm index 59ec11f651e..e619be1904f 100644 --- a/code/modules/modular_computers/os/ui.dm +++ b/code/modules/modular_computers/os/ui.dm @@ -61,7 +61,7 @@ . = min(., extension_status(user)) // Handles user's GUI input -/datum/extension/interactive/os/extension_act(href, href_list, user) +/datum/extension/interactive/os/extension_act(href, href_list, mob/user) if( href_list["PC_exit"] ) kill_program(active_program) return TOPIC_HANDLED @@ -94,7 +94,7 @@ system_shutdown() return TOPIC_HANDLED if( href_list["PC_minimize"] ) - minimize_program(usr) + minimize_program(user) return TOPIC_HANDLED if( href_list["PC_killprogram"] ) @@ -105,7 +105,7 @@ kill_program(P) update_uis() - to_chat(usr, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") + to_chat(user, "Program [P.filename].[P.filetype] with PID [rand(100,999)] has been killed.") return TOPIC_HANDLED if( href_list["PC_runprogram"] ) @@ -117,15 +117,15 @@ return TOPIC_REFRESH if( href_list["PC_terminal"] ) - open_terminal(usr) + open_terminal(user) return TOPIC_HANDLED if( href_list["PC_login"]) - login_prompt(usr) + login_prompt(user) return TOPIC_REFRESH if( href_list["PC_logout"]) - logout_account(usr) + logout_account(user) return TOPIC_REFRESH /datum/extension/interactive/os/proc/regular_ui_update() diff --git a/code/modules/modular_computers/terminal/terminal.dm b/code/modules/modular_computers/terminal/terminal.dm index 994bbc2f774..dec38ed92f1 100644 --- a/code/modules/modular_computers/terminal/terminal.dm +++ b/code/modules/modular_computers/terminal/terminal.dm @@ -98,7 +98,7 @@ account_name = "LOCAL" else account_name = "GUEST" - content += "
    >[account_name]:/[current_disk?.get_dir_path(current_directory, TRUE)]
    " + content += "
    \>[account_name]:/[current_disk?.get_dir_path(current_directory, TRUE)]
    " content += "type `man` for a list of available commands." panel.set_content("[jointext(content, "
    ")]
    ") @@ -159,7 +159,7 @@ /datum/terminal/proc/parse_directory(directory_path, create_directories = FALSE) var/datum/file_storage/target_disk = current_disk var/datum/computer_file/directory/root_dir = current_directory - + if(!length(directory_path)) return list(target_disk, root_dir) @@ -168,8 +168,8 @@ // Otherwise, we append the working directory path to the passed path. var/list/directories = splittext(directory_path, "/") - - // When splitting the text, there could be blank strings at either end, so remove them. If there's any in the body of the path, there was a + + // When splitting the text, there could be blank strings at either end, so remove them. If there's any in the body of the path, there was a // missed input, so leave them. if(!length(directories[1])) directories.Cut(1, 2) @@ -194,7 +194,7 @@ if(!target_disk) // Invalid disk entered. return OS_DIR_NOT_FOUND directories.Cut(1, 2) - + break // Any further use of ../ is handled by the hard drive. // If we were only pathing to the parent of a directory or to a disk, we can return early. @@ -208,7 +208,7 @@ var/datum/computer_file/directory/target_directory = target_disk.parse_directory(final_path, create_directories) if(!istype(target_directory)) return OS_DIR_NOT_FOUND - + return list(target_disk, target_directory) // Returns list(/datum/file_storage, /datum/computer_file/directory, /datum/computer_file) on success. Returns error code on failure. @@ -221,7 +221,7 @@ var/list/dirs_and_file = splittext(file_path, "/") if(!length(dirs_and_file)) return OS_DIR_NOT_FOUND - + // Join together everything but the filename into a path. var/list/file_loc = parse_directory(jointext(dirs_and_file, "/", 1, dirs_and_file.len)) if(!islist(file_loc)) // Errored! @@ -231,7 +231,7 @@ var/datum/computer_file/directory/target_dir = file_loc[2] if(!istype(target_disk)) return OS_DIR_NOT_FOUND - + var/filename = dirs_and_file[dirs_and_file.len] var/datum/computer_file/target_file = target_disk.get_file(filename, target_dir) if(!istype(target_file)) @@ -265,5 +265,5 @@ return "I/O error, Harddrive may be non-functional" if(OS_NETWORK_ERROR) return "Unable to connect to the network" - + return "An unspecified error occured." \ No newline at end of file diff --git a/code/modules/multiz/ladder.dm b/code/modules/multiz/ladder.dm index e737b916454..b86299bcf5f 100644 --- a/code/modules/multiz/ladder.dm +++ b/code/modules/multiz/ladder.dm @@ -23,6 +23,12 @@ var/static/list/radial_options = list("up" = radial_ladder_up, "down" = radial_ladder_down) +/obj/structure/ladder/handle_default_hammer_attackby() + var/last_anchored = anchored + . = ..() + if(anchored != last_anchored) + find_connections() + /obj/structure/ladder/handle_default_wrench_attackby() var/last_anchored = anchored . = ..() @@ -65,8 +71,8 @@ var/turf/L = loc if(HasBelow(z) && istype(L) && L.is_open()) var/failed - for(var/obj/structure/catwalk/catwalk in loc) - if(catwalk.plated_tile) + for(var/obj/structure/platform in loc) + if(!platform.is_z_passable()) failed = TRUE break if(!failed) @@ -80,8 +86,8 @@ var/turf/T = GetAbove(src) if(istype(T) && T.is_open()) var/failed - for(var/obj/structure/catwalk/catwalk in T) - if(catwalk.plated_tile) + for(var/obj/structure/platform in T) + if(!platform.is_z_passable()) failed = TRUE break if(!failed) @@ -139,7 +145,7 @@ landing.visible_message(SPAN_DANGER("\The [I] falls from the top of \the [target_down]!")) /obj/structure/ladder/attack_hand(var/mob/user) - if(user.a_intent == I_HURT || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES)) + if(user.check_intent(I_FLAG_HARM) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES)) return ..() climb(user) return TRUE @@ -208,18 +214,18 @@ if(!istype(T) || !T.is_open()) to_chat(M, SPAN_WARNING("The ceiling is in the way!")) return null - for(var/obj/structure/catwalk/catwalk in target_up.loc) - if(catwalk.plated_tile) - to_chat(M, SPAN_WARNING("\The [catwalk] is in the way!")) + for(var/obj/structure/platform in target_up.loc) + if(!platform.is_z_passable()) + to_chat(M, SPAN_WARNING("\The [platform] is in the way!")) return null if(. == target_down) var/turf/T = loc if(!istype(T) || !T.is_open()) to_chat(M, SPAN_WARNING("\The [loc] is in the way!")) return null - for(var/obj/structure/catwalk/catwalk in loc) - if(catwalk.plated_tile) - to_chat(M, SPAN_WARNING("\The [catwalk] is in the way!")) + for(var/obj/structure/platform in loc) + if(!platform.is_z_passable()) + to_chat(M, SPAN_WARNING("\The [platform] is in the way!")) return null /mob/proc/may_climb_ladders(var/ladder) diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm index 96254e43b06..00b82e3b5ac 100644 --- a/code/modules/multiz/level_data.dm +++ b/code/modules/multiz/level_data.dm @@ -162,9 +162,9 @@ ///Determines if edge turfs should be centered on the map dimensions. var/origin_is_world_center = TRUE /// If not null, this level will register with a daycycle id/type on New(). - var/daycycle_id + var/daycycle_id = "general_solars" /// Type provided to the above. - var/daycycle_type = /datum/daycycle/exoplanet + var/daycycle_type = /datum/daycycle/solars /// Extra spacing needed between any random level templates and the transition edge of a level. /// Note that this is more or less unnecessary if you are using a mapped area that doesn't stretch to the edge of the level. @@ -173,6 +173,14 @@ // Whether or not this level permits things like graffiti and filth to persist across rounds. var/permit_persistence = FALSE + // Submap loading values, passed back via getters like get_subtemplate_budget(). + /// A point budget to spend on subtemplates (see template costs) + var/subtemplate_budget = 0 + /// A string identifier for the category of subtemplates to draw from for this level. + var/subtemplate_category = null + /// A specific area to use when determining where to place subtemplates. + var/subtemplate_area = null + /datum/level_data/New(var/_z_level, var/defer_level_setup = FALSE) . = ..() level_z = _z_level @@ -181,7 +189,6 @@ initialize_level_id() SSmapping.register_level_data(src) - setup_ambient() setup_exterior_atmosphere() if(SSmapping.initialized && !defer_level_setup) setup_level_data() @@ -233,6 +240,7 @@ if(!skip_gen) generate_level() after_generate_level() + setup_ambient() // Determine our relative positioning. // First find an appropriate origin point. @@ -418,16 +426,22 @@ // /// Helper proc for subtemplate generation. Returns a point budget to spend on subtemplates. /datum/level_data/proc/get_subtemplate_budget() - return 0 + return subtemplate_budget /// Helper proc for subtemplate generation. Returns a string identifier for a general category of template. /datum/level_data/proc/get_subtemplate_category() - return + return subtemplate_category /// Helper proc for subtemplate generation. Returns a bitflag of template flags that must not be present for a subtemplate to be considered available. /datum/level_data/proc/get_subtemplate_blacklist() return /// Helper proc for subtemplate generation. Returns a bitflag of template flags that must be present for a subtemplate to be considered available. /datum/level_data/proc/get_subtemplate_whitelist() return +/// Helper proc for getting areas associated with placable submaps on this level. +/datum/level_data/proc/get_subtemplate_areas(template_category, blacklist, whitelist) + if(subtemplate_area) + return islist(subtemplate_area) ? subtemplate_area : list(subtemplate_area) + if(base_area) + return list(base_area) ///Called when setting up the level. Apply generators and anything that modifies the turfs of the level. /datum/level_data/proc/generate_level() @@ -461,12 +475,34 @@ for(var/gen_type in map_gen) new gen_type(origx, origy, level_z, endx, endy, FALSE, TRUE, get_base_area_instance()) +/// Helper proc for placing mobs on a level after level creation. +/datum/level_data/proc/get_mobs_to_populate_level() + return + ///Called during level setup. Run anything that should happen only after the map is fully generated. /datum/level_data/proc/after_generate_level() + build_border() + if(daycycle_id && daycycle_type) SSdaycycle.register_level(level_z, daycycle_id, daycycle_type) + var/list/mobs_to_spawn = get_mobs_to_populate_level() + if(length(mobs_to_spawn)) + for(var/list/mob_category in mobs_to_spawn) + var/list/mob_types = mob_category[1] + var/mob_turf = mob_category[2] + var/mob_count = mob_category[3] + var/sanity = 1000 + while(mob_count && sanity) + sanity-- + var/turf/place_mob_at = locate(rand(level_inner_min_x, level_inner_max_x), rand(level_inner_min_y, level_inner_max_y), level_z) + if(istype(place_mob_at, mob_turf) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(mob_types) + new mob_type(place_mob_at) + mob_count-- + CHECK_TICK + ///Changes anything named we may need to rename accordingly to the parent location name. For instance, exoplanets levels. /datum/level_data/proc/adapt_location_name(var/location_name) SHOULD_CALL_PARENT(TRUE) @@ -701,8 +737,6 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner) // Level Data Implementations //////////////////////////////////////////// /datum/level_data/space - daycycle_id = "space_solars" - daycycle_type = /datum/daycycle/solars /datum/level_data/debug name = "Debug Level" @@ -722,6 +756,12 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner) level_flags = (ZLEVEL_CONTACT|ZLEVEL_PLAYER|ZLEVEL_SEALED) filler_turf = /turf/unsimulated/dark_filler +// Used in order to avoid making the level too large. Only works if loaded prior to SSmapping init... it's unclear if this really does much. +/datum/level_data/unit_test/after_template_load(var/datum/map_template/template) + . = ..() + level_max_width ||= template.width + level_max_height ||= template.height + /datum/level_data/overmap name = "Sensor Display" level_flags = ZLEVEL_SEALED @@ -738,15 +778,13 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner) return ..() /datum/level_data/mining_level/asteroid - base_turf = /turf/floor + base_turf = /turf/floor/barren + filler_turf = /turf/space level_generators = list( /datum/random_map/automata/cave_system, /datum/random_map/noise/ore ) -/datum/level_data/proc/get_subtemplate_areas(template_category, blacklist, whitelist) - return list(base_area) - ///Try to allocate the given amount of POIs onto our level. Returns the template types that were spawned /datum/level_data/proc/spawn_subtemplates(budget = 0, template_category, blacklist, whitelist) @@ -830,13 +868,10 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner) load_subtemplate(T, template) return template -///Actually handles loading a template template at the given turf. +///Actually handles loading a template at the given turf. /datum/level_data/proc/load_subtemplate(turf/central_turf, datum/map_template/template) if(!template) return FALSE - for(var/turf/T in template.get_affected_turfs(central_turf, TRUE)) - for(var/mob/living/simple_animal/monster in T) - qdel(monster) template.load(central_turf, centered = TRUE) return TRUE diff --git a/code/modules/multiz/mobile_ladder.dm b/code/modules/multiz/mobile_ladder.dm index 2eacd7a03ac..dec71c399ff 100644 --- a/code/modules/multiz/mobile_ladder.dm +++ b/code/modules/multiz/mobile_ladder.dm @@ -130,6 +130,7 @@ /decl/interaction_handler/ladder_fold name = "Fold Ladder" expected_target_type = /obj/structure/ladder/mobile + examine_desc = "fold $TARGET_THEM$ up" /decl/interaction_handler/ladder_fold/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/ladder/mobile/L diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index a3009921249..573c28223f1 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -91,9 +91,6 @@ if(!has_gravity()) return - if(throwing) - return - if(can_fall()) begin_falling(lastloc, below) @@ -115,7 +112,7 @@ //For children to override /atom/movable/proc/can_fall(var/anchor_bypass = FALSE, var/turf/location_override = loc) - if(!simulated) + if(immune_to_floor_hazards()) return FALSE if(anchored && !anchor_bypass) @@ -225,7 +222,7 @@ for(var/mob/living/M in landing.contents) if(M == src) continue - visible_message("\The [src] hits \the [M.name]!") + visible_message("\The [src] hits \the [M]!") M.take_overall_damage(fall_damage) return TRUE return FALSE diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 01db42e5261..c08433c2a3c 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -9,7 +9,7 @@ return FALSE else if(direction == DOWN) - if(!is_open() || !HasBelow(z) || (locate(/obj/structure/catwalk) in src)) + if(!is_open() || !HasBelow(z) || get_supporting_platform()) return FALSE if(check_neighbor_canzpass) var/turf/T = GetBelow(src) diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index 32f5f80e691..04644bcdde7 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -166,7 +166,7 @@ if (destruction_timer) deltimer(destruction_timer) destruction_timer = null - if (old_loc.z != loc.z) + if (old_loc?.z != loc?.z) // Null checking in case of qdel(), observed with dirt effect falling through multiz. reset_internal_layering() else if (!destruction_timer) destruction_timer = ZM_DESTRUCTION_TIMER(src) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 4ba6ad96090..6e22447ab9c 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -116,7 +116,7 @@ hair_styles[++hair_styles.len] = list("hairstyle" = hair_decl.name, "ref" = "\ref[hair_decl]") data["hair_styles"] = hair_styles var/hairstyle = GET_HAIR_STYLE(owner) - var/decl/sprite_accessory/hair = GET_DECL(hairstyle) + var/decl/sprite_accessory/hair = GET_DECL(hairstyle) || GET_DECL(/decl/sprite_accessory/hair/bald) data["hair_style"] = hair.name data["change_facial_hair"] = can_change(APPEARANCE_FACIAL_HAIR) @@ -127,7 +127,7 @@ 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/facial_hairstyle = GET_FACIAL_HAIR_STYLE(owner) - var/decl/sprite_accessory/facial_hair = GET_DECL(facial_hairstyle) + var/decl/sprite_accessory/facial_hair = GET_DECL(facial_hairstyle) || GET_DECL(/decl/sprite_accessory/facial_hair/shaved) data["facial_hair_style"] = facial_hair.name data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) diff --git a/code/modules/organs/ailments/_ailment.dm b/code/modules/organs/ailments/_ailment.dm index 7bcc0c24da6..713dfcdc7aa 100644 --- a/code/modules/organs/ailments/_ailment.dm +++ b/code/modules/organs/ailments/_ailment.dm @@ -1,10 +1,9 @@ /datum/ailment + abstract_type = /datum/ailment var/name // Descriptive name, primarily used for adminbus. var/timer_id // Current timer waiting to proc next symptom message. var/min_time = 2 MINUTES // Minimum time between symptom messages. var/max_time = 5 MINUTES // Maximum time between symptom messages. - var/category = /datum/ailment // Used similar to hierarchies, if category == type then the - // ailment is a category and won't be applied to organs. var/obj/item/organ/organ // Organ associated with the ailment (ailment is in organ.ailments list). // Requirements before applying to a target. diff --git a/code/modules/organs/ailments/ailment_codex.dm b/code/modules/organs/ailments/ailment_codex.dm index 40cc20eb341..566446dd17e 100644 --- a/code/modules/organs/ailments/ailment_codex.dm +++ b/code/modules/organs/ailments/ailment_codex.dm @@ -40,7 +40,7 @@ ailment_table += "[name_column][treatment_column]" for(var/atype in subtypesof(/datum/ailment)) var/datum/ailment/ailment = get_ailment_reference(atype) - if(!ailment.name || show_robotics_recipes != ailment.applies_to_prosthetics || ailment.hidden_from_codex) + if(!ailment || show_robotics_recipes != ailment.applies_to_prosthetics || ailment.hidden_from_codex) continue ailment_table += "[ailment.name]" var/list/ailment_cures = list() diff --git a/code/modules/organs/ailments/ailments_medical.dm b/code/modules/organs/ailments/ailments_medical.dm index 4cf930ac0f9..c9d3dad9751 100644 --- a/code/modules/organs/ailments/ailments_medical.dm +++ b/code/modules/organs/ailments/ailments_medical.dm @@ -1,5 +1,5 @@ /datum/ailment/head - category = /datum/ailment/head + abstract_type = /datum/ailment/head applies_to_organ = list(BP_HEAD) /datum/ailment/head/headache diff --git a/code/modules/organs/ailments/faults/_fault.dm b/code/modules/organs/ailments/faults/_fault.dm index 8219540a8dc..52a9b747a84 100644 --- a/code/modules/organs/ailments/faults/_fault.dm +++ b/code/modules/organs/ailments/faults/_fault.dm @@ -1,7 +1,7 @@ /datum/ailment/fault applies_to_robotics = TRUE applies_to_prosthetics = TRUE - category = /datum/ailment/fault + abstract_type = /datum/ailment/fault treated_by_item_type = list( /obj/item/stack/nanopaste, /obj/item/stack/tape_roll/duct_tape diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 57bf6892044..35f3e0bbe61 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -62,7 +62,7 @@ var/artery_name = "artery" // Flavour text for cartoid artery, aorta, etc. var/arterial_bleed_severity = 1 // Multiplier for bleeding in a limb. var/tendon_name = "tendon" // Flavour text for Achilles tendon, etc. - var/cavity_name = "cavity" + var/cavity_name = "intramuscular cavity" // Surgery vars. var/cavity_max_w_class = ITEM_SIZE_TINY //this is increased if bigger organs spawn by default inside @@ -70,8 +70,6 @@ var/stage = 0 var/cavity = 0 - var/list/unarmed_attacks - var/atom/movable/applied_pressure var/atom/movable/splinted @@ -141,10 +139,6 @@ _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) update_icon() /obj/item/organ/external/set_bodytype(decl/bodytype/new_bodytype, override_material = null, apply_to_internal_organs = TRUE) @@ -259,7 +253,7 @@ if(connecting_limb.organ_tag == parent_organ) if(length(connecting_limb.children)) - to_chat(usr, SPAN_WARNING("You cannot connect additional limbs to \the [connecting_limb].")) + to_chat(user, SPAN_WARNING("You cannot connect additional limbs to \the [connecting_limb].")) return TRUE var/mob/holder = loc @@ -282,7 +276,7 @@ else if(connecting_limb.parent_organ == organ_tag) if(LAZYLEN(children)) - to_chat(usr, SPAN_WARNING("You cannot connect additional limbs to \the [src].")) + to_chat(user, SPAN_WARNING("You cannot connect additional limbs to \the [src].")) return TRUE if(!user.try_unequip(connecting_limb, src)) @@ -318,7 +312,7 @@ //Handles removing internal organs/implants/items still in the detached limb. /obj/item/organ/external/proc/try_remove_internal_item(var/obj/item/used_item, var/mob/user) - if(stage == 0 && used_item.sharp) + if(stage == 0 && used_item.is_sharp()) user.visible_message(SPAN_NOTICE("\The [user] cuts \the [src] open with \the [used_item].")) stage++ return TRUE @@ -328,7 +322,7 @@ stage++ return TRUE - if(stage == 2 && (used_item.sharp || IS_HEMOSTAT(used_item) || IS_WIRECUTTER(used_item))) + if(stage == 2 && (used_item.is_sharp() || IS_HEMOSTAT(used_item) || IS_WIRECUTTER(used_item))) var/list/radial_buttons = make_item_radial_menu_choices(get_contents_recursive()) if(LAZYLEN(radial_buttons)) var/obj/item/removing = show_radial_menu(user, src, radial_buttons, radius = 42, require_near = TRUE, use_labels = RADIAL_LABELS_OFFSET, check_locs = list(src)) @@ -1588,14 +1582,13 @@ Note that amputating the affected organ does in fact remove the infection from t butchery_decl.place_products(owner, butchery_decl.bone_material, 1, butchery_decl.bone_type) return ..() -// This likely seems excessive, but refer to organ explosion_act() to see how it should be handled before reaching this point. /obj/item/organ/external/physically_destroyed(skip_qdel) if(!owner) return ..() if(limb_flags & ORGAN_FLAG_CAN_AMPUTATE) - dismember(FALSE, DISMEMBER_METHOD_BLUNT) + dismember(FALSE, DISMEMBER_METHOD_BLUNT) // This will also destroy the mob if it removes the last non-core limb. else - owner.gib() + owner.physically_destroyed() // Previously gib(), but that caused blood and guts to fly everywhere. /obj/item/organ/external/is_vital_to_owner() if(isnull(vital_to_owner)) diff --git a/code/modules/organs/external/_external_damage.dm b/code/modules/organs/external/_external_damage.dm index d1c38e68b5b..0d185bbe9ae 100644 --- a/code/modules/organs/external/_external_damage.dm +++ b/code/modules/organs/external/_external_damage.dm @@ -89,7 +89,7 @@ if(laser) created_wound = createwound(LASER, burn) if(prob(40)) - owner.IgniteMob() + owner.ignite_fire() else created_wound = createwound(BURN, burn) diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm index ed9e9140734..8f9b601a8c5 100644 --- a/code/modules/organs/external/_external_icons.dm +++ b/code/modules/organs/external/_external_icons.dm @@ -21,19 +21,20 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/get_surgery_overlay_icon() if(limb_flags & ORGAN_FLAG_SKELETAL) return null - if(BP_IS_PROSTHETIC(src)) - return null - return species?.get_surgery_overlay_icon(owner) + return bodytype?.get_surgery_overlay_icon(owner) /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/human/human) _icon_cache_key = null skin_tone = null skin_colour = null + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() + if(!icon_bodytype) + return // 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_blend = icon_bodytype.limb_blend + if(!isnull(human.skin_tone) && (icon_bodytype.appearance_flags & HAS_A_SKIN_TONE)) skin_tone = human.skin_tone - if(bodytype.appearance_flags & HAS_SKIN_COLOR) + if(icon_bodytype.appearance_flags & HAS_SKIN_COLOR) skin_colour = human.get_skin_colour() /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/human/human) @@ -48,21 +49,34 @@ var/global/list/limb_icon_cache = list() addtimer(CALLBACK(last_owner, TYPE_PROC_REF(/mob, update_hair)), 1, TIMER_UNIQUE) return ..() +/obj/item/organ/external/set_organ_appearance_bodytype(decl/bodytype/new_bodytype, update_sprite_accessories = TRUE, skip_owner_update = FALSE) + . = ..() + if(.) + if(update_sprite_accessories) + sanitize_sprite_accessories(skip_update = TRUE) + _icon_cache_key = null + get_icon_for_bodytype() + update_icon() + if(owner && !skip_owner_update) + owner.update_body() + /obj/item/organ/external/proc/update_limb_icon_file() - if(!bodytype) // This should not happen. + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() + if(!icon_bodytype) // This should not happen. icon = initial(icon) else if(limb_flags & ORGAN_FLAG_SKELETAL) - icon = bodytype.get_skeletal_icon(owner) + icon = icon_bodytype.get_skeletal_icon(owner) else if(!BP_IS_PROSTHETIC(src) && (status & ORGAN_MUTATED)) - icon = bodytype.get_base_icon(owner, get_deform = TRUE) + icon = icon_bodytype.get_base_icon(owner, get_deform = TRUE) else - icon = bodytype.get_base_icon(owner) + icon = icon_bodytype.get_base_icon(owner) var/global/list/organ_icon_cache = list() /obj/item/organ/external/proc/generate_mob_icon() // Generate base icon with colour and tone. - var/icon/ret = bodytype.apply_limb_colouration(src, new /icon(icon, icon_state)) + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() + var/icon/ret = icon_bodytype.apply_limb_colouration(src, new /icon(icon, icon_state)) if(limb_flags & ORGAN_FLAG_SKELETAL) global.organ_icon_cache[_icon_cache_key] = ret return ret @@ -77,7 +91,7 @@ var/global/list/organ_icon_cache = list() else ret.Blend(rgb(-skin_tone, -skin_tone, -skin_tone), ICON_SUBTRACT) - if((bodytype.appearance_flags & HAS_SKIN_COLOR) && skin_colour) + if((icon_bodytype.appearance_flags & HAS_SKIN_COLOR) && skin_colour) ret.Blend(skin_colour, skin_blend) // Body markings, hair, lips, etc. @@ -113,7 +127,7 @@ var/global/list/organ_icon_cache = list() /obj/item/organ/external/proc/get_icon_cache_key_components() - . = list("[icon_state]_[species.name]_[bodytype?.name || "BAD_BODYTYPE"]_[render_alpha]_[icon]") + . = list("[icon_state]_[species.name]_[get_organ_appearance_bodytype()?.uid || "BAD_BODYTYPE"]_[render_alpha]_[icon]") // Skeletons don't care about most icon appearance stuff. if(limb_flags & ORGAN_FLAG_SKELETAL) @@ -193,7 +207,7 @@ var/global/list/organ_icon_cache = list() var/list/refresh_accessories if(accessory_metadata) - if(!accessory_decl.accessory_is_available(owner, species, bodytype, (owner ? owner.get_traits() : FALSE))) + if(!accessory_decl.accessory_is_available(owner, species, get_organ_appearance_bodytype(), (owner ? owner.get_traits() : FALSE))) return FALSE var/list/existing_metadata = LAZYACCESS(accessories, accessory_type) if(same_entries(existing_metadata, accessory_metadata)) @@ -326,9 +340,10 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" var/image/temp = image(limb_icon_cache[cache_key]) if(species) // Calculate the required colour matrix. - var/r = 0.30 * bodytype.health_hud_intensity - var/g = 0.59 * bodytype.health_hud_intensity - var/b = 0.11 * bodytype.health_hud_intensity + var/hud_intensity = get_organ_appearance_bodytype()?.health_hud_intensity || 1 + var/r = 0.30 * hud_intensity + var/g = 0.59 * hud_intensity + var/b = 0.11 * hud_intensity temp.color = list(r, r, r, g, g, g, b, b, b) temp.pixel_x = owner.default_pixel_x temp.pixel_y = owner.default_pixel_y @@ -363,7 +378,7 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" if(ispath(accessory_style)) accessory_style = GET_DECL(accessory_style) // Check if this style is permitted for this species, period. - if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, bodytype, (owner ? owner.get_traits() : FALSE))) + if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, get_organ_appearance_bodytype(), (owner ? owner.get_traits() : FALSE))) return null // Check if we are concealed (long hair under a hat for example). if(accessory_style.is_hidden(src)) @@ -374,7 +389,7 @@ var/global/list/robot_hud_colours = list("#ffffff","#cccccc","#aaaaaa","#888888" for(var/acc_cat in _sprite_accessories) for(var/accessory in _sprite_accessories[acc_cat]) var/decl/sprite_accessory/accessory_style = GET_DECL(accessory) - if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, bodytype, (owner ? owner.get_traits() : FALSE))) + if(!istype(accessory_style) || !accessory_style?.accessory_is_available(owner, species, get_organ_appearance_bodytype(), (owner ? owner.get_traits() : FALSE))) _sprite_accessories[acc_cat] -= accessory . = TRUE if(.) diff --git a/code/modules/organs/external/diagnostics.dm b/code/modules/organs/external/diagnostics.dm index 2bc96bfa3fc..973c506b9fc 100644 --- a/code/modules/organs/external/diagnostics.dm +++ b/code/modules/organs/external/diagnostics.dm @@ -110,6 +110,9 @@ for(var/obj/item/organ/internal/augment/aug in internal_organs) if(istype(aug) && aug.known) . += "[capitalize(aug.name)] implanted" + var/obj/item/organ/internal/lungs/L = locate() in src + if( L && L.is_bruised()) + . += "Lung ruptured" /obj/item/organ/external/proc/inspect(mob/user) diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index 1d6b432822c..b16d8919e29 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -12,7 +12,7 @@ amputation_point = "neck" encased = "skull" artery_name = "carotid artery" - cavity_name = "cranial" + cavity_name = "cranial cavity" limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE var/glowing_eyes = FALSE @@ -20,6 +20,24 @@ var/forehead_graffiti var/graffiti_style +/obj/item/organ/external/head/get_natural_attacks() + if(!can_intake_reagents) + return null + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/bite) + return unarmed_attack + +/obj/item/organ/external/head/sharp_bite/get_natural_attacks() + if(!can_intake_reagents) + return null + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/bite/sharp) + return unarmed_attack + +/obj/item/organ/external/head/strong_bite/get_natural_attacks() + if(!can_intake_reagents) + return null + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/bite/strong) + return unarmed_attack + /obj/item/organ/external/head/proc/get_organ_eyes_overlay() if(!glowing_eyes && !owner?.has_chemical_effect(CE_GLOWINGEYES, 1)) return diff --git a/code/modules/organs/external/standard.dm b/code/modules/organs/external/standard.dm index d3ec8d68e7f..3dfa745cdec 100644 --- a/code/modules/organs/external/standard.dm +++ b/code/modules/organs/external/standard.dm @@ -17,18 +17,12 @@ parent_organ = null encased = "ribcage" artery_name = "aorta" - cavity_name = "thoracic" + cavity_name = "thoracic cavity" limb_flags = ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK /obj/item/organ/external/chest/proc/get_current_skin() return -/obj/item/organ/external/get_scan_results() - . = ..() - var/obj/item/organ/internal/lungs/L = locate() in src - if( L && L.is_bruised()) - . += "Lung ruptured" - /obj/item/organ/external/chest/die() //Special handling for synthetics if(BP_IS_PROSTHETIC(src) || BP_IS_CRYSTAL(src)) @@ -47,7 +41,7 @@ amputation_point = "lumbar" joint = "hip" artery_name = "iliac artery" - cavity_name = "abdominal" + cavity_name = "abdominal cavity" limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_BREAK /obj/item/organ/external/groin/die() @@ -119,6 +113,13 @@ limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_HAS_TENDON | ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_CAN_DISLOCATE organ_category = ORGAN_CATEGORY_STANCE +/obj/item/organ/external/foot/get_natural_attacks() + var/static/list/unarmed_attacks = list( + GET_DECL(/decl/natural_attack/stomp), + GET_DECL(/decl/natural_attack/kick) + ) + return unarmed_attacks + /obj/item/organ/external/foot/right organ_tag = BP_R_FOOT name = "right foot" @@ -128,6 +129,14 @@ joint = "right ankle" amputation_point = "right ankle" +/obj/item/organ/external/foot/avian/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/stomp/weak) + return unarmed_attack + +/obj/item/organ/external/foot/right/avian/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/stomp/weak) + return unarmed_attack + /obj/item/organ/external/hand organ_tag = BP_L_HAND name = "left hand" @@ -145,6 +154,10 @@ is_washable = TRUE var/gripper_type = /datum/inventory_slot/gripper/left_hand +/obj/item/organ/external/hand/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/punch) + return unarmed_attack + /obj/item/organ/external/hand/do_install(mob/living/human/target, affected, in_place, update_icon, detached) . = ..() if(. && owner && gripper_type) @@ -164,3 +177,11 @@ joint = "right wrist" amputation_point = "right wrist" gripper_type = /datum/inventory_slot/gripper/right_hand + +/obj/item/organ/external/hand/clawed/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/claws) + return unarmed_attack + +/obj/item/organ/external/hand/right/clawed/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/claws) + return unarmed_attack diff --git a/code/modules/organs/external/wounds/wound.dm b/code/modules/organs/external/wounds/wound.dm index 2c2746cd154..60219be1f1a 100644 --- a/code/modules/organs/external/wounds/wound.dm +++ b/code/modules/organs/external/wounds/wound.dm @@ -79,7 +79,7 @@ return 0 return (wound_damage() <= autoheal_cutoff) ? 1 : is_treated() -// checks whether the wound has been appropriately treated +/// checks whether the wound has been appropriately treated /datum/wound/proc/is_treated() if(!LAZYLEN(embedded_objects)) switch(damage_type) @@ -88,7 +88,7 @@ if(BURN) return salved - // Checks whether other other can be merged into src. +/// Checks whether other can be merged into src. /datum/wound/proc/can_merge_wounds(var/datum/wound/other) if (other.type != src.type) return 0 if (other.current_stage != src.current_stage) return 0 diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index ac00fcf30e5..a3ac98d48e2 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -56,6 +56,12 @@ affected.cavity_max_w_class = max(affected.cavity_max_w_class, w_class) affected.update_internal_organs_cost() + // This might need revisiting to stop people successfully implanting brains in groins and transferring minds. + 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 @@ -171,7 +177,7 @@ // We clamp/round here so that we don't accidentally heal past the threshold and // cheat our way into a full second threshold of healing. - damage = clamp(damage-get_organ_heal_amount(), min_heal_val, absolute_max_damage) + damage = clamp(damage - max(0, get_organ_heal_amount()), min_heal_val, absolute_max_damage) // If we're within 1 damage of the nearest threshold (such as 0), round us down. // This should be removed when float-aware modulo comes in in 515, but for now is needed @@ -289,11 +295,3 @@ /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/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) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 32a4b6e1c2d..c4980c3a303 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -99,13 +99,15 @@ alert(owner, "You have taken massive brain damage! You will not be able to remember the events leading up to your injury.", "Brain Damaged") /obj/item/organ/internal/brain/organ_can_heal() - return (damage && owner && GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)) || ..() + return (damage && owner && GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) > 0) || ..() /obj/item/organ/internal/brain/has_limited_healing() - return (!owner || !GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN)) && ..() + return (!owner || GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) <= 0) && ..() /obj/item/organ/internal/brain/get_organ_heal_amount() - return 1 + if(!has_limited_healing()) + . = 1 // We have full healing, so we always heal at least 1 unit of damage. + . += (owner ? GET_CHEMICAL_EFFECT(owner, CE_BRAIN_REGEN) : 0) /obj/item/organ/internal/brain/Process() if(owner) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index f193afaa4da..7dbc75053e6 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -36,19 +36,25 @@ verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color_verb verbs |= /obj/item/organ/internal/eyes/proc/toggle_eye_glow +/obj/item/organ/external/eyes/set_organ_appearance_bodytype(decl/bodytype/new_bodytype, update_sprite_accessories = TRUE, skip_owner_update = FALSE) + . = ..() + if(. && owner && !skip_owner_update) + owner.update_eyes() + /obj/item/organ/internal/eyes/proc/get_onhead_icon() + var/decl/bodytype/icon_bodytype = get_organ_appearance_bodytype() var/modifier = owner?.get_overlay_state_modifier() var/eye_state = modifier ? "eyes[modifier]" : "eyes" last_cached_eye_colour = eye_colour - last_eye_cache_key = "[type]-[bodytype.eye_icon]-[last_cached_eye_colour]-[bodytype.eye_offset]-[eye_state]" - if(!bodytype.eye_icon) + last_eye_cache_key = "[type]-[icon_bodytype.eye_icon]-[last_cached_eye_colour]-[icon_bodytype.eye_offset]-[eye_state]" + if(!icon_bodytype.eye_icon) return if(!global.eye_icon_cache[last_eye_cache_key]) - var/icon/eyes_icon = icon(icon = bodytype.eye_icon, icon_state = eye_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) + var/icon/eyes_icon = icon(icon = icon_bodytype.eye_icon, icon_state = eye_state) + if(icon_bodytype.eye_offset) + eyes_icon.Shift(NORTH, icon_bodytype.eye_offset) + if(icon_bodytype.apply_eye_colour) + eyes_icon.Blend(last_cached_eye_colour, icon_bodytype.eye_blend) global.eye_icon_cache[last_eye_cache_key] = eyes_icon return global.eye_icon_cache[last_eye_cache_key] diff --git a/code/modules/organs/internal/species/golem.dm b/code/modules/organs/internal/species/golem.dm index 93e368c2e64..cbf569bebab 100644 --- a/code/modules/organs/internal/species/golem.dm +++ b/code/modules/organs/internal/species/golem.dm @@ -1,8 +1,9 @@ /obj/item/organ/internal/brain/golem name = "chem" desc = "A tightly furled roll of paper, covered with indecipherable runes." - icon = 'icons/obj/wizard.dmi' + icon = 'icons/obj/items/paperwork/scroll.dmi' icon_state = "scroll" + color = COLOR_BEIGE /obj/item/organ/internal/brain/golem/can_recover() - return 0 + return FALSE diff --git a/code/modules/organs/internal/stomach.dm b/code/modules/organs/internal/stomach.dm index cdc7df2fe4f..cf870f3b64b 100644 --- a/code/modules/organs/internal/stomach.dm +++ b/code/modules/organs/internal/stomach.dm @@ -115,7 +115,8 @@ next_cramp = world.time + rand(200,800) owner.custom_pain("Your stomach cramps agonizingly!",1) - var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/ethanol) + // TODO: check if this even works - it won't be picking up alcohol subtypes. + var/alcohol_volume = REAGENT_VOLUME(ingested, /decl/material/liquid/alcohol/ethanol) var/alcohol_threshold_met = alcohol_volume > STOMACH_VOLUME / 2 if(alcohol_threshold_met && owner.has_genetic_condition(GENE_COND_EPILEPSY) && prob(20)) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index dc2f2b105a1..36d6a3ac531 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -22,6 +22,7 @@ var/mob/living/human/owner // Current mob owning the organ. var/decl/species/species // Original species. var/decl/bodytype/bodytype // Original bodytype. + var/decl/bodytype/appearance_bodytype // A bodytype used only for icons, marking validation and equipment offsets. var/list/ailments // Current active ailments if any. var/meat_name // Taken from first owner. @@ -37,6 +38,9 @@ /// Set to true if this organ should return info to Stat(). See get_stat_info(). var/has_stat_info +/obj/item/organ/proc/reset_matter() + matter = null + /obj/item/organ/Destroy() if(owner) owner.remove_organ(src, FALSE, FALSE, TRUE, TRUE, FALSE) //Tell our parent we're unisntalling in place @@ -141,9 +145,16 @@ max_damage *= bodytype.hardiness min_broken_damage *= bodytype.hardiness bodytype.resize_organ(src) - set_material(override_material || bodytype.material) - matter = bodytype.matter?.Copy() + + reset_matter() + set_material(override_material || bodytype.organ_material) + for(var/mat in bodytype.matter) + if(mat in matter) + matter[mat] += bodytype.matter[mat] + else + LAZYSET(matter, mat, bodytype.matter[mat]) create_matter() + // maybe this should be a generalized repopulate_reagents helper?? if(reagents) reagents.clear_reagents() @@ -362,11 +373,11 @@ if (germ_level < INFECTION_LEVEL_ONE) germ_level = 0 //cure instantly else if (germ_level < INFECTION_LEVEL_TWO) - germ_level -= 5 //at germ_level == 500, this should cure the infection in 5 minutes + germ_level -= round(5 * antibiotics) //at germ_level == 500, this should cure the infection in 5 minutes else - germ_level -= 3 //at germ_level == 1000, this will cure the infection in 10 minutes + germ_level -= round(3 * antibiotics) //at germ_level == 1000, this will cure the infection in 10 minutes if(owner && owner.current_posture.prone) - germ_level -= 2 + germ_level -= round(2 * antibiotics) germ_level = max(0, germ_level) /obj/item/organ/proc/take_general_damage(var/amount, var/silent = FALSE) @@ -379,7 +390,7 @@ owner.update_health() /obj/item/organ/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(BP_IS_PROSTHETIC(src) || !istype(target) || !istype(user) || (user != target && user.a_intent == I_HELP)) + if(BP_IS_PROSTHETIC(src) || !istype(target) || !istype(user) || (user != target && user.check_intent(I_FLAG_HELP))) return ..() if(alert("Do you really want to use this organ as food? It will be useless for anything else afterwards.",,"Ew, no.","Bon appetit!") == "Ew, no.") @@ -471,9 +482,11 @@ return var/global/list/ailment_reference_cache = list() -/proc/get_ailment_reference(var/ailment_type) +/proc/get_ailment_reference(var/datum/ailment/ailment_type) if(!ispath(ailment_type, /datum/ailment)) return + if(TYPE_IS_ABSTRACT(ailment_type)) + return if(!global.ailment_reference_cache[ailment_type]) global.ailment_reference_cache[ailment_type] = new ailment_type return global.ailment_reference_cache[ailment_type] @@ -484,7 +497,7 @@ var/global/list/ailment_reference_cache = list() return . for(var/ailment_type in subtypesof(/datum/ailment)) var/datum/ailment/ailment = ailment_type - if(initial(ailment.category) == ailment_type) + if(TYPE_IS_ABSTRACT(ailment)) continue ailment = get_ailment_reference(ailment_type) if(ailment.can_apply_to(src)) @@ -664,3 +677,16 @@ var/global/list/ailment_reference_cache = list() new /obj/effect/decal/cleanable/ash(loc) if(!QDELETED(src)) qdel(src) + +// For overriding on shapeshifters/changelings in the future. +/obj/item/organ/proc/set_organ_appearance_bodytype(decl/bodytype/new_bodytype, update_sprite_accessories = TRUE, skip_owner_update = FALSE) + if(ispath(new_bodytype, /decl/bodytype)) + new_bodytype = GET_DECL(new_bodytype) + if((new_bodytype && !istype(new_bodytype)) || appearance_bodytype == new_bodytype || bodytype == new_bodytype) + return FALSE + appearance_bodytype = new_bodytype + return TRUE + +/obj/item/organ/proc/get_organ_appearance_bodytype() + RETURN_TYPE(/decl/bodytype) + return appearance_bodytype || bodytype diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/organ_prosthetics.dm similarity index 98% rename from code/modules/organs/prosthetics/_prosthetics.dm rename to code/modules/organs/organ_prosthetics.dm index 03d8abee4ae..a107c79e810 100644 --- a/code/modules/organs/prosthetics/_prosthetics.dm +++ b/code/modules/organs/organ_prosthetics.dm @@ -9,7 +9,7 @@ // External organ procs: // Does this bodypart count as a modular limb, and if so, what kind? /obj/item/organ/external/proc/get_modular_limb_category() - return isnull(bodytype.modular_limb_tier) ? MODULAR_BODYPART_INVALID : bodytype.modular_limb_tier + return isnull(bodytype?.modular_limb_tier) ? MODULAR_BODYPART_INVALID : bodytype.modular_limb_tier // Checks if a limb could theoretically be removed. // Note that this does not currently bother checking if a child or internal organ is vital. diff --git a/code/modules/overmap/contacts/_contacts.dm b/code/modules/overmap/contacts/_contacts.dm index e4cab812e76..bde9a41d171 100644 --- a/code/modules/overmap/contacts/_contacts.dm +++ b/code/modules/overmap/contacts/_contacts.dm @@ -29,7 +29,6 @@ radar = image(loc = effect, icon = 'icons/obj/overmap.dmi', icon_state = "sensor_range") radar.color = source.color - radar.tag = "radar" radar.add_filter("blur", 1, list(type = "blur", size = 1)) radar.appearance_flags |= RESET_TRANSFORM | KEEP_APART radar.appearance_flags &= ~PIXEL_SCALE diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm index f6dee900ce4..fcdd349fb07 100644 --- a/code/modules/overmap/contacts/contact_sensors.dm +++ b/code/modules/overmap/contacts/contact_sensors.dm @@ -16,6 +16,9 @@ var/obj/effect/overmap/overmap_location = loc if(overmap_location.requires_contact) new /datum/overmap_contact(src, overmap_location) + if(!contact_datums[linked]) + var/datum/overmap_contact/record = new(src, linked) + record.marker.alpha = 255 /obj/machinery/computer/ship/sensors/Destroy() objects_in_view.Cut() @@ -23,12 +26,6 @@ trackers.Cut() . = ..() -/obj/machinery/computer/ship/sensors/attempt_hook_up(obj/effect/overmap/visitable/ship/sector) - . = ..() - if(. && linked && !contact_datums[linked]) - var/datum/overmap_contact/record = new(src, linked) - record.marker.alpha = 255 - /obj/machinery/computer/ship/sensors/proc/reveal_contacts(var/mob/user) if(user && user.client) for(var/key in contact_datums) diff --git a/code/modules/overmap/disperser/disperser_charge.dm b/code/modules/overmap/disperser/disperser_charge.dm index 895e2955dc0..4ab02455666 100644 --- a/code/modules/overmap/disperser/disperser_charge.dm +++ b/code/modules/overmap/disperser/disperser_charge.dm @@ -7,7 +7,7 @@ matter = list( /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT, /decl/material/solid/metal/copper = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/supermatter = MATTER_AMOUNT_TRACE + /decl/material/solid/exotic_matter = MATTER_AMOUNT_TRACE ) var/chargetype var/chargedesc diff --git a/code/modules/overmap/internet/internet_uplink.dm b/code/modules/overmap/internet/internet_uplink.dm index 337e9b07589..cd38e4509fe 100644 --- a/code/modules/overmap/internet/internet_uplink.dm +++ b/code/modules/overmap/internet/internet_uplink.dm @@ -181,7 +181,7 @@ var/global/list/internet_uplinks = list() return ..() -/obj/machinery/computer/internet_uplink/interface_interact(user) +/obj/machinery/computer/internet_uplink/interface_interact(mob/user) var/datum/extension/local_network_member/uplink_comp = get_extension(src, /datum/extension/local_network_member) var/datum/local_network/lan = uplink_comp.get_local_network() @@ -193,5 +193,5 @@ var/global/list/internet_uplinks = list() return FALSE var/datum/topic_state/remote/R = new(src, linked) - linked.ui_interact(usr, state = R) + linked.ui_interact(user, state = R) return TRUE \ No newline at end of file diff --git a/code/modules/overmap/overmap_shuttle.dm b/code/modules/overmap/overmap_shuttle.dm index 408db04970a..2a7e5b3fb64 100644 --- a/code/modules/overmap/overmap_shuttle.dm +++ b/code/modules/overmap/overmap_shuttle.dm @@ -7,7 +7,7 @@ var/fuel_consumption = 0 //Amount of moles of gas consumed per trip; If zero, then shuttle is magic and does not need fuel var/list/obj/structure/fuel_port/fuel_ports //the fuel ports of the shuttle (but usually just one) - category = /datum/shuttle/autodock/overmap + abstract_type = /datum/shuttle/autodock/overmap var/skill_needed = SKILL_BASIC var/landing_skill_needed = SKILL_EXPERT var/operator_skill = SKILL_MIN diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index a62b7258705..f7f37fcb346 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -6,6 +6,21 @@ icon_screen = "engines" var/display_state = "status" +/// A stub used for modpacks to modify per-ship readout information. +/// This mutates the UI data list, so it can be used to mask or remove features +/// as well as to add entirely new ones. +/// It does not return a value. +/// While it can access per-engine data, it should be dispreferred for that compared to modify_engine_ui_data(). +/obj/machinery/computer/ship/engines/proc/modify_ship_ui_data(list/ui_data) + return + +/// A stub used for modpacks to modify per-engine readout information. +/// This mutates the engine's data list, so it can be used to mask or remove features +/// as well as to add entirely new ones. +/// It does not return a value. +/obj/machinery/computer/ship/engines/proc/modify_engine_ui_data(datum/extension/ship_engine/engine, list/engine_data) + return + /obj/machinery/computer/ship/engines/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) if(!linked) display_reconnect_dialog(user, "ship control systems") @@ -29,17 +44,13 @@ var/thrust = E.get_exhaust_velocity() total_thrust += thrust rdata["eng_thrust"] = "[thrust] m/s" + modify_engine_ui_data(E, rdata) enginfo.Add(list(rdata)) data["engines_info"] = enginfo data["total_thrust"] = "[total_thrust] m/s" - var/damping_strength = 0 - for(var/datum/ship_inertial_damper/I in linked.inertial_dampers) - var/obj/machinery/inertial_damper/ID = I.holder - damping_strength += ID.get_damping_strength(FALSE) - data["damping_strength"] = damping_strength - data["needs_dampers"] = linked.needs_dampers + modify_ship_ui_data(data) ui = SSnano.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index ce08d9c7b59..6543aebddfc 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -42,8 +42,8 @@ if(length(port_choices)) port = input("Choose shuttle docking port:", "Shuttle Docking Port") as null|anything in port_choices else - to_chat(usr, SPAN_WARNING("No functional docking ports, defaulting to center-of-mass landing.")) - if(CanInteract(usr, global.default_topic_state) && (port in port_choices)) + to_chat(user, SPAN_WARNING("No functional docking ports, defaulting to center-of-mass landing.")) + if(CanInteract(user, global.default_topic_state) && (port in port_choices)) shuttle.set_port(port_choices[port]) if(href_list["pick"]) var/list/possible_d = shuttle.get_possible_destinations() @@ -51,9 +51,9 @@ if(possible_d.len) D = input("Choose shuttle destination", "Shuttle Destination") as null|anything in possible_d else - to_chat(usr, SPAN_WARNING("No valid landing sites in range.")) + to_chat(user, SPAN_WARNING("No valid landing sites in range.")) possible_d = shuttle.get_possible_destinations() - if(CanInteract(usr, global.default_topic_state) && (D in possible_d)) + if(CanInteract(user, global.default_topic_state) && (D in possible_d)) shuttle.set_destination(possible_d[D]) return TOPIC_REFRESH if(href_list["manual_landing"]) @@ -68,7 +68,7 @@ else start_landing(user, shuttle) return TOPIC_REFRESH - to_chat(usr, SPAN_WARNING("The manual controls look hopelessly complex to you!")) + to_chat(user, SPAN_WARNING("The manual controls look hopelessly complex to you!")) /obj/machinery/computer/shuttle_control/explore/proc/start_landing(var/mob/user, var/datum/shuttle/autodock/overmap/shuttle) var/obj/effect/overmap/visitable/current_sector = global.overmap_sectors[num2text(z)] diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index b3cd0154d42..eaeabd18e3a 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -231,14 +231,14 @@ if(SHIP_STATUS_LANDED) var/obj/effect/overmap/visitable/location = loc if(istype(loc, /obj/effect/overmap/visitable/sector)) - return "Landed on \the [location.name]. Use secondary thrust to get clear before activating primary engines." + return "Landed on \the [location]. Use secondary thrust to get clear before activating primary engines." if(istype(loc, /obj/effect/overmap/visitable/ship)) - return "Docked with \the [location.name]. Use secondary thrust to get clear before activating primary engines." + return "Docked with \the [location]. Use secondary thrust to get clear before activating primary engines." return "Docked with an unknown object." if(SHIP_STATUS_ENCOUNTER) var/datum/shuttle/autodock/overmap/child_shuttle = SSshuttle.shuttles[shuttle] var/obj/effect/overmap/visitable/location = global.overmap_sectors[num2text(child_shuttle.current_location.z)] - return "Maneuvering nearby \the [location.name]." + return "Maneuvering nearby \the [location]." if(SHIP_STATUS_TRANSIT) return "Maneuvering under secondary thrust." if(SHIP_STATUS_OVERMAP) @@ -324,7 +324,7 @@ port_tag = new_port_tag . = ..() -/obj/abstract/local_dock/automatic/modify_mapped_vars(map_hash) +/obj/abstract/local_dock/modify_mapped_vars(map_hash) . = ..() ADJUST_TAG_VAR(port_tag, map_hash) ADJUST_TAG_VAR(dock_target, map_hash) diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index f4f1a734c88..133c506ffa6 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -19,9 +19,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) var/skill_needed = SKILL_ADEPT //piloting skill needed to steer it without going in random dir var/operator_skill - var/needs_dampers = FALSE - var/list/inertial_dampers = list() - var/damping_strength = null var/vessel_size = SHIP_SIZE_LARGE // arbitrary number, affects how likely are we to evade meteors var/list/navigation_viewers // list of weakrefs to people viewing the overmap via this ship @@ -85,15 +82,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) /obj/effect/overmap/visitable/ship/adjust_speed(n_x, n_y) . = ..() - var/magnitude = norm(n_x, n_y) - var/inertia_dir = magnitude >= 0 ? turn(fore_dir, 180) : fore_dir - var/inertia_strength = magnitude * 1e3 - if(needs_dampers && damping_strength < inertia_strength) - var/list/areas_by_name = area_repository.get_areas_by_z_level() - for(var/area_name in areas_by_name) - var/area/A = areas_by_name[area_name] - if(area_belongs_to_zlevels(A, map_z)) - A.throw_unbuckled_occupants(inertia_strength+2, inertia_strength, inertia_dir) for(var/zz in map_z) if(is_still()) toggle_move_stars(zz) @@ -119,10 +107,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) return round(num_burns / burns_per_grid) /obj/effect/overmap/visitable/ship/Process(wait, tick) - damping_strength = 0 - for(var/datum/ship_inertial_damper/I in inertial_dampers) - var/obj/machinery/inertial_damper/ID = I.holder - damping_strength += ID.get_damping_strength(TRUE) sensor_visibility = min(round(base_sensor_visibility + get_speed_sensor_increase(), 1), 100) /obj/effect/overmap/visitable/ship/on_update_icon() @@ -181,9 +165,6 @@ var/global/const/OVERMAP_SPEED_CONSTANT = (1 SECOND) for(var/datum/extension/ship_engine/E in global.ship_engines) if(check_ownership(E.holder)) engines |= E - for(var/datum/ship_inertial_damper/I in global.ship_inertial_dampers) - if(check_ownership(I.holder)) - inertial_dampers |= I var/v_mass = recalculate_vessel_mass() if(v_mass) vessel_mass = v_mass diff --git a/code/modules/overmap/ships/ship_physics.dm b/code/modules/overmap/ships/ship_physics.dm index 66e85a3f0b9..28e71cf1f5b 100644 --- a/code/modules/overmap/ships/ship_physics.dm +++ b/code/modules/overmap/ships/ship_physics.dm @@ -36,31 +36,43 @@ /obj/effect/overmap/visitable/ship/proc/recalculate_vessel_mass() var/list/zones = list() + // for(var/turf/tile in area) is an implied in-world loop + // an in-world loop per area is very bad, so instead + // we do one in-world loop and check area + var/list/areas = list() + // create an associative list of area -> TRUE so that lookup is faster for(var/area/A in get_areas()) - - // Do not include space please - if(istype(A, world.area)) + if(istype(A, world.area)) // exclude the base area continue + areas[A] = TRUE + var/start_z = min(map_z) + var/end_z = max(map_z) + if(!start_z || !end_z) + return initial(vessel_mass) // This shouldn't happen ideally so just go with the initial vessel mass + for(var/z_level in start_z to end_z) + var/datum/level_data/z_data = SSmapping.levels_by_z[z_level] + for(var/turf/tile in block(z_data.level_inner_min_x, z_data.level_inner_min_y, z_level, z_data.level_inner_max_x, z_data.level_inner_max_y)) + var/area/tile_area = tile.loc + if(!tile_area || !areas[tile_area]) + continue - for(var/turf/T in A) - - if(!T.simulated || T.is_open()) + if(!tile.simulated || tile.is_open()) continue . += DEFAULT_TURF_MASS - if(istype(T, /turf/wall)) - var/turf/wall/W = T - if(W.material) - . += W.material.weight * 5 - if(W.reinf_material) - . += W.reinf_material.weight * 5 - if(W.girder_material) - . += W.girder_material.weight * 5 + if(istype(tile, /turf/wall)) + var/turf/wall/wall_tile = tile + if(wall_tile.material) + . += wall_tile.material.weight * 5 + if(wall_tile.reinf_material) + . += wall_tile.reinf_material.weight * 5 + if(wall_tile.girder_material) + . += wall_tile.girder_material.weight * 5 - if(T.zone) - zones |= T.zone + if(tile.zone) + zones[tile.zone] = TRUE // assoc list for fast deduplication - for(var/atom/movable/C in T) + for(var/atom/movable/C as anything in tile) // as anything is safe here since only movables can be in turf contents if(!C.simulated) continue . += C.get_mass() @@ -69,8 +81,9 @@ continue . += C2.get_mass() - for(var/zone/Z in zones) - . += Z.air.get_mass() + // loop over keys of all zones in the list + for(var/zone/zone as anything in zones) + . += zone.air.get_mass() // Convert kilograms to metric tonnes. . = . / 1000 \ No newline at end of file diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index 72eb84cc491..5991f75c6c4 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -54,8 +54,9 @@ // Carbon Paper Alt Interactions ///////////////////////////////////////////////// /decl/interaction_handler/carbon_paper_remove - name = "remove carbon-copy" + name = "Remove Carbon-Copy" expected_target_type = /obj/item/paper/carbon + examine_desc = "remove the carbon-copy" /decl/interaction_handler/carbon_paper_remove/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/paper/carbon/paper = target diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 19b2df3bfbe..cd40acd76d9 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -9,7 +9,7 @@ throw_range = 10 slot_flags = SLOT_LOWER_BODY material_alteration = MAT_FLAG_ALTERATION_COLOR - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak drop_sound = 'sound/foley/tooldrop5.ogg' pickup_sound = 'sound/foley/paperpickup2.ogg' @@ -111,7 +111,7 @@ user.set_machine(src) show_browser(user, dat, "window=[initial(name)]") onclose(user, initial(name)) - add_fingerprint(usr) + add_fingerprint(user) return /obj/item/clipboard/proc/add_pen(var/obj/item/I, var/mob/user) @@ -198,6 +198,7 @@ /decl/interaction_handler/clipboard_remove_pen name = "Remove Pen" expected_target_type = /obj/item/clipboard + examine_desc = "remove the pen" /decl/interaction_handler/clipboard_remove_pen/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 1a5bbeb9e74..7aad7aace23 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -716,21 +716,3 @@ var/global/list/adminfaxes = list() //cache for faxes that have been sent to 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) - -/obj/machinery/faxmachine/get_alt_interactions(mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/fax_remove_card) - -/decl/interaction_handler/fax_remove_card - name = "Remove ID Card" - expected_target_type = /obj/machinery/faxmachine - -/decl/interaction_handler/fax_remove_card/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/faxmachine/fax = target - return !!(fax.card_reader?.get_inserted()) - -/decl/interaction_handler/fax_remove_card/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/faxmachine/fax = target - fax.eject_card(user) diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index e6014e8f4f7..07771782936 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -120,11 +120,11 @@ . += "Details: [record.get_medical_record()]" return jointext(., "
    ") -/obj/structure/filing_cabinet/records/medical +/obj/structure/filing_cabinet/records/employment name = "employment record archive" archive_name = "employment record" -/obj/structure/filing_cabinet/records/medical/collate_data(var/datum/computer_file/report/crew_record/record) +/obj/structure/filing_cabinet/records/employment/collate_data(var/datum/computer_file/report/crew_record/record) . = list() . += "Name: [record.get_name()]" . += "Gender: [record.get_gender()]" diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index cdcbe7b3444..a5008f8e225 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -44,7 +44,7 @@ else if(IS_PEN(W)) updateUsrDialog() - var/n_name = sanitize_safe(input(usr, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) + var/n_name = sanitize_safe(input(user, "What would you like to label the folder?", "Folder Labelling", null) as text, MAX_NAME_LEN) if(!CanPhysicallyInteractWith(user, src)) to_chat(user, SPAN_WARNING("You must stay close to \the [src].")) return TRUE diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 1de729a2deb..02428e20f70 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -131,7 +131,7 @@ return TRUE /obj/item/paper/attack_self(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) if(is_crumpled) user.show_message(SPAN_WARNING("\The [src] is already crumpled.")) return @@ -332,7 +332,7 @@ var/pen_flags = I.get_tool_property(TOOL_PEN, TOOL_PROP_PEN_FLAG) var/decl/tool_archetype/pen/parch = GET_DECL(TOOL_PEN) if(!(pen_flags & PEN_FLAG_ACTIVE)) - parch.toggle_active(usr, I) + parch.toggle_active(user, I) var/iscrayon = pen_flags & PEN_FLAG_CRAYON var/isfancy = pen_flags & PEN_FLAG_FANCY @@ -636,6 +636,8 @@ var/global/datum/topic_state/default/paper_state/paper_topic_state = new /decl/interaction_handler/scroll/furl name = "Furl Scroll" + examine_desc = "furl $TARGET_THEM$" /decl/interaction_handler/scroll/unfurl name = "Unfurl Scroll" + examine_desc = "unfurl $TARGET_THEM$" diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index bf75bc60846..16a2f1f7ab9 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -40,7 +40,7 @@ // merging bundles else if(istype(W, /obj/item/paper_bundle) && merge(W, user, cur_page)) - to_chat(user, SPAN_NOTICE("You add \the [W.name] to \the [name].")) + to_chat(user, SPAN_NOTICE("You add \the [W] to \the [name].")) return TRUE // burning @@ -517,6 +517,7 @@ /decl/interaction_handler/rename/paper_bundle name = "Rename Bundle" expected_target_type = /obj/item/paper_bundle + examine_desc = "rename $TARGET_THEM$" /decl/interaction_handler/rename/paper_bundle/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/paper_bundle/bundle = target diff --git a/code/modules/paperwork/paper_plane.dm b/code/modules/paperwork/paper_plane.dm index a5b211bcd54..2e183472066 100644 --- a/code/modules/paperwork/paper_plane.dm +++ b/code/modules/paperwork/paper_plane.dm @@ -51,7 +51,7 @@ take_damage(TT.speed * w_class) /obj/item/paper_plane/attack_self(mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return crumple(user) return unfold(user) @@ -77,6 +77,7 @@ /decl/interaction_handler/make_paper_plane name = "Fold Into Paper Plane" expected_target_type = /obj/item/paper + examine_desc = "make a paper plane" /decl/interaction_handler/make_paper_plane/is_possible(obj/item/paper/target, mob/user, obj/item/prop) return ..() && !target.is_crumpled @@ -91,4 +92,4 @@ /obj/item/paper/get_alt_interactions(mob/user) . = ..() - LAZYDISTINCTADD(., /decl/interaction_handler/make_paper_plane) \ No newline at end of file + LAZYADD(., /decl/interaction_handler/make_paper_plane) \ No newline at end of file diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index de9f83e3fdf..7c7e69565c3 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -60,7 +60,7 @@ . = ..() /obj/item/sticky_pad/attack_hand(var/mob/user) - if(user.a_intent == I_GRAB) + if(user.check_intent(I_FLAG_GRAB)) return ..() if(!top) return TRUE @@ -84,7 +84,7 @@ /obj/item/sticky_pad/random/Initialize() . = ..() - color = pick(COLOR_YELLOW, COLOR_LIME, COLOR_CYAN, COLOR_ORANGE, COLOR_PINK) + set_color(pick(COLOR_YELLOW, COLOR_LIME, COLOR_CYAN, COLOR_ORANGE, COLOR_PINK)) //////////////////////////////////////////////// // Sticky Note Sheet diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index e84ba856232..3622d047f5c 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -32,7 +32,7 @@ if(!CanPhysicallyInteract(user)) return FALSE - if(user.a_intent == I_HURT || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) + if(user.check_intent(I_FLAG_HARM) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() if(LAZYLEN(papers) < 1 && amount < 1) @@ -129,7 +129,7 @@ //Dump all stored papers too for(var/i=1 to amount) var/obj/item/paper/P = new /obj/item/paper(forced_loc) - P.merge_with_existing(forced_loc, usr) + P.merge_with_existing(forced_loc, user) LAZYCLEARLIST(papers) /obj/item/paper_bin/proc/add_paper(var/obj/item/paper/P) @@ -155,6 +155,7 @@ /decl/interaction_handler/paper_bin_dump_contents name = "Dump Contents" expected_target_type = /obj/item/paper_bin + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/paper_bin_dump_contents/is_possible(var/obj/item/paper_bin/target, mob/user, obj/item/prop) return ..() && target.amount > 0 diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index ce214205569..a5b56cf128f 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -89,7 +89,7 @@ /obj/machinery/papershredder/proc/is_bin_empty() return !(length(shredder_bin) > 0 && cached_total_matter) -/obj/machinery/papershredder/proc/can_shred(var/obj/item/I, var/mob/user = null) +/obj/machinery/papershredder/proc/can_shred_document(var/obj/item/I, var/mob/user = null) if(!istype(I)) if(user) to_chat(user, SPAN_WARNING("\The [I] cannot be shredded by \the [src]!")) @@ -115,12 +115,12 @@ /obj/machinery/papershredder/attackby(var/obj/item/used_item, var/mob/user) //Silently skip tools, and things we don't have the dexterity to use if(!has_extension(used_item, /datum/extension/tool) && used_item.user_can_attack_with(user, silent = TRUE)) - var/trying_to_smack = !(used_item.item_flags & ITEM_FLAG_NO_BLUDGEON) && user && user.a_intent == I_HURT + var/trying_to_smack = !(used_item.item_flags & ITEM_FLAG_NO_BLUDGEON) && user && user.check_intent(I_FLAG_HARM) if(used_item.storage) empty_bin(user, used_item) return TRUE - else if(!trying_to_smack && can_shred(used_item)) + else if(!trying_to_smack && can_shred_document(used_item)) shred(used_item, user) return TRUE return ..() @@ -193,6 +193,7 @@ /decl/interaction_handler/empty/paper_shredder name = "Empty Bin" expected_target_type = /obj/machinery/papershredder + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/paper_shredder/is_possible(obj/machinery/papershredder/target, mob/user, obj/item/prop) return ..() && !target.is_bin_empty() @@ -245,7 +246,7 @@ user.visible_message( \ SPAN_DANGER("\The [user] burns right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap."), \ SPAN_DANGER("You burn right through \the [src], turning it to ash. It flutters through the air before settling on the floor in a heap.")) - fire_act() + fire_act(return_air(), P.get_heat(), 500) /obj/item/shreddedp/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) SHOULD_CALL_PARENT(FALSE) diff --git a/code/modules/paperwork/pen/crayon.dm b/code/modules/paperwork/pen/crayon.dm index b4bfb68c3a9..f06419b8711 100644 --- a/code/modules/paperwork/pen/crayon.dm +++ b/code/modules/paperwork/pen/crayon.dm @@ -18,7 +18,7 @@ /obj/item/pen/crayon/Initialize() . = ..() if(use_stroke_color) - color = stroke_color + set_color(stroke_color) /obj/item/pen/crayon/make_pen_description() desc = "A colourful [stroke_color_name] [istype(material)?"[material.name] ":null][medium_name]. Please refrain from eating it or putting it in your nose." @@ -33,24 +33,31 @@ return if(istype(target) && target.is_floor()) - var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter","arrow") + var/static/list/drawtypes = list(CRAYON_DRAW_GRAFFITI, CRAYON_DRAW_RUNE, CRAYON_DRAW_LETTER, CRAYON_DRAW_ARROW) + var/drawtype = input(user, "Choose what you'd like to draw.", "Crayon scribbles") as null|anything in drawtypes var/draw_message = "drawing" switch(drawtype) - if("letter") - drawtype = input("Choose the letter.", "Crayon scribbles") in list(global.alphabet) + if(CRAYON_DRAW_LETTER) + drawtype = input(user, "Choose a letter.", "Crayon scribbles") as null|anything in global.alphabet draw_message = "drawing a letter" - if("graffiti") + if(CRAYON_DRAW_GRAFFITI) draw_message = "drawing graffiti" - if("rune") + if(CRAYON_DRAW_RUNE) draw_message = "drawing a rune" - if("arrow") - drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down") + if(CRAYON_DRAW_ARROW) + var/static/list/arrow_dirs = list("left", "right", "up", "down") + drawtype = input(user, "Choose an arrow.", "Crayon scribbles") as null|anything in arrow_dirs draw_message = "drawing an arrow" + if(!drawtype || QDELETED(src) || QDELETED(target) || QDELETED(user) || user.get_active_held_item() != src || !CanPhysicallyInteractWith(user, target)) + return TRUE + if(do_tool_interaction(TOOL_PEN, user, target, 5 SECONDS, draw_message, "drawing on", fuel_expenditure = 1)) - new /obj/effect/decal/cleanable/crayon(target, stroke_color, shade_color, drawtype) + var/obj/effect/decal/cleanable/crayon/graffiti = new(target, stroke_color, shade_color, drawtype) target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on. - return + graffiti.add_fingerprint(user) + + return TRUE /obj/item/pen/crayon/red stroke_color = "#da0000" diff --git a/code/modules/paperwork/pen/fancy.dm b/code/modules/paperwork/pen/fancy.dm index 9c7e149a7be..098033965e6 100644 --- a/code/modules/paperwork/pen/fancy.dm +++ b/code/modules/paperwork/pen/fancy.dm @@ -1,7 +1,7 @@ /obj/item/pen/fancy name = "fountain pen" icon = 'icons/obj/items/pens/pen_fancy.dmi' - sharp = 1 //pointy + sharp = TRUE stroke_color = "#1c1713" //dark ashy brownish stroke_color_name = "dark ashy brownish" material = /decl/material/solid/metal/steel diff --git a/code/modules/paperwork/pen/pen.dm b/code/modules/paperwork/pen/pen.dm index 6fe193aed26..b11689c5b70 100644 --- a/code/modules/paperwork/pen/pen.dm +++ b/code/modules/paperwork/pen/pen.dm @@ -36,7 +36,7 @@ /obj/item/pen/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(user.a_intent == I_HELP && user.get_target_zone() == BP_HEAD) + if(user.check_intent(I_FLAG_HELP) && user.get_target_zone() == BP_HEAD) var/obj/item/organ/external/head/head = target.get_organ(BP_HEAD, /obj/item/organ/external/head) if(istype(head)) head.write_on(user, "[stroke_color_name] [medium_name]") diff --git a/code/modules/paperwork/pen/quill_and_ink.dm b/code/modules/paperwork/pen/quill_and_ink.dm index c9cdf1af927..f643b9d1247 100644 --- a/code/modules/paperwork/pen/quill_and_ink.dm +++ b/code/modules/paperwork/pen/quill_and_ink.dm @@ -1,7 +1,7 @@ /obj/item/pen/fancy/quill name = "quill pen" icon = 'icons/obj/items/pens/pen_quill.dmi' - sharp = 0 + sharp = FALSE material = /decl/material/solid/organic/skin/feathers pen_quality = TOOL_QUALITY_DEFAULT max_uses = 5 // gotta re-ink it often! @@ -62,6 +62,12 @@ /// The maximum amount of ink in the inkwell when populating reagents. var/starting_volume_high = 30 +/obj/item/chems/glass/inkwell/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/inkwell/get_utensil_food_type() + return null + /obj/item/chems/glass/inkwell/can_lid() return FALSE diff --git a/code/modules/paperwork/pen/reagent_pen.dm b/code/modules/paperwork/pen/reagent_pen.dm index 225b070e617..7334323851a 100644 --- a/code/modules/paperwork/pen/reagent_pen.dm +++ b/code/modules/paperwork/pen/reagent_pen.dm @@ -1,7 +1,7 @@ /obj/item/pen/reagent atom_flags = ATOM_FLAG_OPEN_CONTAINER origin_tech = @'{"materials":2,"esoteric":5}' - sharp = 1 + sharp = TRUE pen_quality = TOOL_QUALITY_MEDIOCRE /obj/item/pen/reagent/Initialize() @@ -15,7 +15,7 @@ /obj/item/pen/reagent/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) var/allow = target.can_inject(user, user.get_target_zone()) - if(allow && user.a_intent == I_HELP) + if(allow && user.check_intent(I_FLAG_HELP)) if (allow == INJECTION_PORT) if(target != user) to_chat(user, SPAN_WARNING("You begin hunting for an injection port on \the [target]'s suit!")) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 8120330ed10..5d816b92448 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -46,7 +46,7 @@ /obj/machinery/photocopier/Initialize(mapload, d=0, populate_parts = TRUE) . = ..() - if(.!= INITIALIZE_HINT_QDEL && populate_parts && printer) + if(. != INITIALIZE_HINT_QDEL && populate_parts && printer) //Mapped photocopiers shall spawn with ink and paper printer.make_full() @@ -268,6 +268,7 @@ /decl/interaction_handler/empty/photocopier_paper_bin name = "Empty Paper Bin" expected_target_type = /obj/machinery/photocopier + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/photocopier_paper_bin/is_possible(obj/machinery/photocopier/target, mob/user, obj/item/prop) return (target.printer?.get_amount_paper() > 0) && ..() @@ -288,6 +289,7 @@ /decl/interaction_handler/remove/photocopier_scanner_item name = "Remove Item From Scanner" expected_target_type = /obj/machinery/photocopier + examine_desc = "remove a loaded item" /decl/interaction_handler/remove/photocopier_scanner_item/is_possible(obj/machinery/photocopier/target, mob/user, obj/item/prop) return target.scanner_item && ..() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index af80b04dadd..eb9bbb76a03 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -128,10 +128,10 @@ /obj/item/photo/interact(mob/user) send_rsc(user, img, "tmp_photo_[id].png") + // todo: remove -ms-interpolation-mode once 516 is required var/photo_html = {" [name] - // todo: remove -ms-interpolation-mode once 516 is required [scribble ? "
    Written on the back:
    [scribble]" : ""] @@ -398,6 +398,7 @@ icon = 'icons/screen/radial.dmi' icon_state = "radial_eject" expected_target_type = /obj/item/camera + examine_desc = "eject the film" /decl/interaction_handler/camera_eject_film/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/camera/camera = target diff --git a/code/modules/paperwork/printer.dm b/code/modules/paperwork/printer.dm index 3c7bda42989..0f91439ab58 100644 --- a/code/modules/paperwork/printer.dm +++ b/code/modules/paperwork/printer.dm @@ -63,15 +63,13 @@ if(toner) to_chat(user, SPAN_WARNING("There is already \a [W] in \the [src]!")) return TRUE - else - return insert_toner(W, user) + return insert_toner(W, user) else if(istype(W, /obj/item/paper) || istype(W, /obj/item/paper_bundle)) if(paper_left >= paper_max) to_chat(user, SPAN_WARNING("There is no more room for paper in \the [src]!")) return TRUE - else - return insert_paper(W, user) + return insert_paper(W, user) . = ..() /obj/item/stock_parts/printer/attack_hand(mob/user) @@ -425,6 +423,7 @@ /decl/interaction_handler/empty/stock_parts_printer name = "Empty Paper Bin" expected_target_type = /obj/item/stock_parts/printer + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/stock_parts_printer/is_possible(obj/item/stock_parts/printer/target, mob/user, obj/item/prop) return (target.get_amount_paper() > 0) && ..() diff --git a/code/modules/persistence/graffiti.dm b/code/modules/persistence/graffiti.dm index ed62d878dfc..0bd85389b6f 100644 --- a/code/modules/persistence/graffiti.dm +++ b/code/modules/persistence/graffiti.dm @@ -14,10 +14,10 @@ var/author = "unknown" /obj/effect/decal/writing/Initialize(mapload, var/_age, var/_message, var/_author) - var/list/random_icon_states = icon_states(icon) + var/list/random_icon_states = get_states_in_icon(icon) for(var/obj/effect/decal/writing/W in loc) - random_icon_states.Remove(W.icon_state) - if(random_icon_states.len) + random_icon_states -= W.icon_state + if(length(random_icon_states)) icon_state = pick(random_icon_states) SSpersistence.track_value(src, /decl/persistence_handler/graffiti) . = ..(mapload) @@ -43,7 +43,7 @@ user.visible_message(SPAN_NOTICE("\The [user] clears away some graffiti.")) qdel(src) return TRUE - else if(thing.sharp && user.a_intent != I_HELP) //Check intent so you don't go insane trying to unscrew a light fixture over a graffiti + else if(thing.is_sharp() && !user.check_intent(I_FLAG_HELP)) //Check intent so you don't go insane trying to unscrew a light fixture over a graffiti if(jobban_isbanned(user, "Graffiti")) to_chat(user, SPAN_WARNING("You are banned from leaving persistent information across rounds.")) return TRUE diff --git a/code/modules/persistence/noticeboards.dm b/code/modules/persistence/noticeboards.dm index 2d0a65a2801..d0b5af670da 100644 --- a/code/modules/persistence/noticeboards.dm +++ b/code/modules/persistence/noticeboards.dm @@ -9,7 +9,7 @@ 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/organic/wood + material = /decl/material/solid/organic/wood/oak var/tmp/max_notices = 5 var/list/notices @@ -82,7 +82,7 @@ return TRUE /obj/structure/noticeboard/attack_hand(var/mob/user) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) return ..() interact(user) return TRUE diff --git a/code/modules/persistence/persistence_datum.dm b/code/modules/persistence/persistence_datum.dm index fc2a819e8b2..027081f7949 100644 --- a/code/modules/persistence/persistence_datum.dm +++ b/code/modules/persistence/persistence_datum.dm @@ -12,10 +12,6 @@ var/ignore_area_flags = FALSE // Set to TRUE to skip area flag checks such as nonpersistent areas. var/ignore_invalid_loc = FALSE // Set to TRUE to skip checking for a non-null station turf for the entry. -/decl/persistence_handler/Initialize() - SetFilename() - . = ..() - /decl/persistence_handler/proc/SetFilename() if(name) filename = "data/persistent/[ckey(global.using_map.name)]-[ckey(name)].json" @@ -30,14 +26,16 @@ return TRUE /decl/persistence_handler/proc/CheckTokenSanity(var/list/tokens) - return ( \ - islist(tokens) && \ - !isnull(tokens["x"]) && \ - !isnull(tokens["y"]) && \ - !isnull(tokens["z"]) && \ - !isnull(tokens["age"]) && \ - tokens["age"] <= entries_expire_at \ - ) + if(!islist(tokens)) + return FALSE + if(isnull(tokens["x"]) || isnull(tokens["y"]) || isnull(tokens["z"])) + return FALSE + if(!isnull(entries_expire_at)) + if(isnull(tokens["age"])) + return FALSE + if(tokens["age"] > entries_expire_at) + return FALSE + return TRUE /decl/persistence_handler/proc/CreateEntryInstance(var/turf/creating, var/list/tokens) return @@ -65,7 +63,7 @@ . = GetValidTurf(locate(tokens["x"], tokens["y"], tokens["z"]), tokens) if(.) - CreateEntryInstance(., tokens) + . = CreateEntryInstance(., tokens) /decl/persistence_handler/proc/IsValidEntry(var/atom/entry) if(!istype(entry)) @@ -92,10 +90,12 @@ .["age"] = GetEntryAge(entry) /decl/persistence_handler/proc/FinalizeTokens(var/list/tokens) - . = tokens + . = tokens || list() /decl/persistence_handler/Initialize() + SetFilename() + . = ..() if(!fexists(filename)) diff --git a/code/modules/persistence/persistence_datum_book.dm b/code/modules/persistence/persistence_datum_book.dm index e55a5cc9427..cf33c5df07d 100644 --- a/code/modules/persistence/persistence_datum_book.dm +++ b/code/modules/persistence/persistence_datum_book.dm @@ -5,7 +5,14 @@ ignore_invalid_loc = TRUE /decl/persistence_handler/book/CreateEntryInstance(var/turf/creating, var/list/tokens) - var/obj/item/book/book = new(creating) + + var/book_type = tokens["book_type"] + if(book_type) + book_type = text2path(book_type) + if(!ispath(book_type)) + book_type = /obj/item/book + + var/obj/item/book/book = new book_type(creating) book.dat = tokens["message"] book.title = tokens["title"] book.author = tokens["writer"] @@ -17,7 +24,7 @@ if(case) book.forceMove(case) case.update_icon() - . = book + return book /decl/persistence_handler/book/IsValidEntry(var/atom/entry) . = ..() @@ -29,11 +36,12 @@ . = ..() var/obj/item/book/book = entry - .["author"] = book.last_modified_ckey || "" - .["message"] = book.dat || "dat" - .["title"] = book.title || "Untitled" - .["writer"] = book.author || "unknown" + .["author"] = book.last_modified_ckey || "" + .["message"] = book.dat || "dat" + .["title"] = book.title || "Untitled" + .["writer"] = book.author || "unknown" .["icon_state"] = book.icon_state || "book" + .["book_type"] = "[book.type]" var/turf/T = get_turf(entry) if(!T || !isStationLevel(T.z)) @@ -62,7 +70,7 @@ else T = get_random_spawn_turf(SPAWN_FLAG_PERSISTENCE_CAN_SPAWN) - . = ..(T, tokens) + . = ..() /decl/persistence_handler/book/GetEntryAge(var/atom/entry) . = -1 diff --git a/code/modules/persistence/persistence_datum_filth.dm b/code/modules/persistence/persistence_datum_filth.dm index 53c8ac5307d..9f877efeab0 100644 --- a/code/modules/persistence/persistence_datum_filth.dm +++ b/code/modules/persistence/persistence_datum_filth.dm @@ -15,11 +15,16 @@ . = ..() if(.["path"] && !ispath(.["path"])) .["path"] = text2path(.["path"]) - . = tokens + if(isnull(.["filthiness"])) + .["filthiness"] = 0 /decl/persistence_handler/filth/CreateEntryInstance(var/turf/creating, var/list/tokens) var/_path = tokens["path"] - new _path(creating, tokens["age"]+1) + var/obj/effect/decal/cleanable/dirt/dirt = new _path(creating, tokens["age"]+1) + if(istype(dirt)) + dirt.dirt_amount = tokens["filthiness"] + dirt.update_icon() + return dirt /decl/persistence_handler/filth/GetEntryAge(var/atom/entry) var/obj/effect/decal/cleanable/filth = entry @@ -32,3 +37,8 @@ /decl/persistence_handler/filth/CompileEntry(var/atom/entry) . = ..() .["path"] = "[GetEntryPath(entry)]" + if(istype(entry, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = entry + .["filthiness"] = dirt.dirt_amount + else + .["filthiness"] = 0 diff --git a/code/modules/persistence/persistence_datum_graffiti.dm b/code/modules/persistence/persistence_datum_graffiti.dm index de71177f2fc..83861418d67 100644 --- a/code/modules/persistence/persistence_datum_graffiti.dm +++ b/code/modules/persistence/persistence_datum_graffiti.dm @@ -17,7 +17,7 @@ return TRUE /decl/persistence_handler/graffiti/CreateEntryInstance(var/turf/creating, var/list/tokens) - new /obj/effect/decal/writing(creating, tokens["age"]+1, tokens["message"], tokens["author"]) + return new /obj/effect/decal/writing(creating, tokens["age"]+1, tokens["message"], tokens["author"]) /decl/persistence_handler/graffiti/IsValidEntry(var/atom/entry) . = ..() diff --git a/code/modules/supermatter/setup_supermatter.dm b/code/modules/power/admin_setup_engine.dm similarity index 51% rename from code/modules/supermatter/setup_supermatter.dm rename to code/modules/power/admin_setup_engine.dm index 1fb598744b2..d7d59c8f9e5 100644 --- a/code/modules/supermatter/setup_supermatter.dm +++ b/code/modules/power/admin_setup_engine.dm @@ -1,108 +1,7 @@ -#define SETUP_OK 1 // All good -#define SETUP_WARNING 2 // Something that shouldn't happen happened, but it's not critical so we will continue -#define SETUP_ERROR 3 // Something bad happened, and it's important so we won't continue setup. -#define SETUP_DELAYED 4 // Wait for other things first. - -#define ENERGY_NITROGEN 115 // Roughly 8 emitter shots. -#define ENERGY_CARBONDIOXIDE 150 // Roughly 10 emitter shots. -#define ENERGY_HYDROGEN 300 // Roughly 20 emitter shots. -#define ENERGY_PHORON 500 // Roughly 40 emitter shots. - -/datum/admins/proc/setup_supermatter() - set category = "Debug" - set name = "Setup Supermatter" - set desc = "Allows you to start the Supermatter engine." - - if (!istype(src,/datum/admins)) - src = usr.client.holder - if (!istype(src,/datum/admins)) - to_chat(usr, "Error: you are not an admin!") - return - - var/response = input(usr, "Are you sure? This will start up the engine with selected gas as coolant.", "Engine setup") as null|anything in list("N2", "CO2", "PH", "H2", "Abort") - if(!response || response == "Abort") - return - - var/errors = 0 - var/warnings = 0 - var/success = 0 - - log_and_message_admins("## SUPERMATTER SETUP - Setup initiated by [usr] using coolant type [response].") - - // CONFIGURATION PHASE - // Coolant canisters, set types according to response. - for(var/obj/effect/engine_setup/coolant_canister/C in global.engine_setup_markers) - switch(response) - if("N2") - C.canister_type = /obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/ - continue - if("CO2") - C.canister_type = /obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/ - continue - if("PH") - C.canister_type = /obj/machinery/portable_atmospherics/canister/phoron/engine_setup/ - continue - if("H2") - C.canister_type = /obj/machinery/portable_atmospherics/canister/hydrogen/engine_setup/ - continue - - for(var/obj/effect/engine_setup/core/C in global.engine_setup_markers) - switch(response) - if("N2") - C.energy_setting = ENERGY_NITROGEN - continue - if("CO2") - C.energy_setting = ENERGY_CARBONDIOXIDE - continue - if("PH") - C.energy_setting = ENERGY_PHORON - continue - if("H2") - C.energy_setting = ENERGY_HYDROGEN - continue - - for(var/obj/effect/engine_setup/filter/F in global.engine_setup_markers) - F.coolant = response - - var/list/delayed_objects = list() - // SETUP PHASE - for(var/obj/effect/engine_setup/S in global.engine_setup_markers) - var/result = S.activate(0) - switch(result) - if(SETUP_OK) - success++ - continue - if(SETUP_WARNING) - warnings++ - continue - if(SETUP_ERROR) - errors++ - log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") - break - if(SETUP_DELAYED) - delayed_objects.Add(S) - continue - - if(!errors) - for(var/obj/effect/engine_setup/S in delayed_objects) - var/result = S.activate(1) - switch(result) - if(SETUP_OK) - success++ - continue - if(SETUP_WARNING) - warnings++ - continue - if(SETUP_ERROR) - errors++ - log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") - break - - log_and_message_admins("## SUPERMATTER SETUP - Setup completed with [errors] errors, [warnings] warnings and [success] successful steps.") - - return - - +#define ENGINE_SETUP_OK 1 // All good +#define ENGINE_SETUP_WARNING 2 // Something that shouldn't happen happened, but it's not critical so we will continue +#define ENGINE_SETUP_ERROR 3 // Something bad happened, and it's important so we won't continue setup. +#define ENGINE_SETUP_DELAYED 4 // Wait for other things first. var/global/list/engine_setup_markers = list() @@ -129,7 +28,7 @@ var/global/list/engine_setup_markers = list() // Tries to locate a pump, enables it, and sets it to MAX. Triggers warning if unable to locate a pump. -/obj/effect/engine_setup/pump_max/ +/obj/effect/engine_setup/pump_max name = "Pump Setup Marker" /obj/effect/engine_setup/pump_max/activate() @@ -137,15 +36,15 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/binary/pump/P = locate() in get_turf(src) if(!P) log_and_message_admins("## WARNING: Unable to locate pump at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING P.target_pressure = P.max_pressure_setting P.update_use_power(POWER_USE_IDLE) - return SETUP_OK + return ENGINE_SETUP_OK // Spawns an empty canister on this turf, if it has a connector port. Triggers warning if unable to find a connector port -/obj/effect/engine_setup/empty_canister/ +/obj/effect/engine_setup/empty_canister name = "Empty Canister Marker" /obj/effect/engine_setup/empty_canister/activate() @@ -153,16 +52,16 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src) if(!P) log_and_message_admins("## WARNING: Unable to locate connector port at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING new/obj/machinery/portable_atmospherics/canister(get_turf(src)) // Canisters automatically connect to connectors in New() - return SETUP_OK + return ENGINE_SETUP_OK // Spawns a coolant canister on this turf, if it has a connector port. // Triggers error when unable to locate connector port or when coolant canister type is unset. -/obj/effect/engine_setup/coolant_canister/ +/obj/effect/engine_setup/coolant_canister name = "Coolant Canister Marker" var/canister_type = null @@ -171,33 +70,12 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src) if(!P) log_and_message_admins("## ERROR: Unable to locate coolant connector port at [x] [y] [z]!") - return SETUP_ERROR + return ENGINE_SETUP_ERROR if(!canister_type) log_and_message_admins("## ERROR: Canister type unset at [x] [y] [z]!") - return SETUP_ERROR + return ENGINE_SETUP_ERROR new canister_type(get_turf(src)) - return SETUP_OK - - - -// Energises the supermatter. Errors when unable to locate supermatter. -/obj/effect/engine_setup/core/ - name = "Supermatter Core Marker" - var/energy_setting = 0 - -/obj/effect/engine_setup/core/activate(var/last = 0) - if(!last) - return SETUP_DELAYED - ..() - var/obj/machinery/power/supermatter/SM = locate() in get_turf(src) - if(!SM) - log_and_message_admins("## ERROR: Unable to locate supermatter core at [x] [y] [z]!") - return SETUP_ERROR - if(!energy_setting) - log_and_message_admins("## ERROR: Energy setting unset at [x] [y] [z]!") - return SETUP_ERROR - SM.power = energy_setting - return SETUP_OK + return ENGINE_SETUP_OK @@ -218,13 +96,13 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/power/smes/S = locate() in get_turf(src) if(!S) log_and_message_admins("## WARNING: Unable to locate SMES unit at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING S.input_attempt = 1 S.input_level = min(target_input_level, S.input_level_max) S.output_attempt = 1 S.output_level = min(target_output_level, S.output_level_max) S.update_icon() - return SETUP_OK + return ENGINE_SETUP_OK // Sets up filters. This assumes filters are set to filter out CO2 back to the core loop by default! /obj/effect/engine_setup/filter @@ -236,10 +114,10 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/omni/filter/F = locate() in get_turf(src) if(!F) log_and_message_admins("## WARNING: Unable to locate omni filter at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING if(!coolant) log_and_message_admins("## WARNING: No coolant type set at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING // Non-co2 coolant, adjust the filter's config first. if(coolant != "CO2") @@ -257,11 +135,11 @@ var/global/list/engine_setup_markers = list() break else log_and_message_admins("## WARNING: Inapropriate filter coolant type set at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING F.rebuild_filtering_list() F.update_use_power(POWER_USE_IDLE) - return SETUP_OK + return ENGINE_SETUP_OK // Closes the monitoring room shutters so the first Engi to show up doesn't get microwaved /obj/effect/engine_setup/shutters @@ -272,7 +150,7 @@ var/global/list/engine_setup_markers = list() /obj/effect/engine_setup/shutters/activate() if(!target_button) log_and_message_admins("## WARNING: No button type set at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING var/obj/machinery/button/blast_door/found = null var/turf/T = get_turf(src) for(var/obj/machinery/button/blast_door/B in T.contents) @@ -281,16 +159,7 @@ var/global/list/engine_setup_markers = list() break if(!found) log_and_message_admins("## WARNING: Unable to locate button at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING found.activate() found.update_icon() - return SETUP_OK - -#undef SETUP_OK -#undef SETUP_WARNING -#undef SETUP_ERROR -#undef SETUP_DELAYED -#undef ENERGY_NITROGEN -#undef ENERGY_CARBONDIOXIDE -#undef ENERGY_HYDROGEN -#undef ENERGY_PHORON \ No newline at end of file + return ENGINE_SETUP_OK diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 053432007e6..6e2b63b82fa 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -445,7 +445,7 @@ var/global/list/all_apcs = list() return ..() /obj/machinery/power/apc/bash(obj/item/used_item, mob/user) - if (!(user.a_intent == I_HURT) || (used_item.item_flags & ITEM_FLAG_NO_BLUDGEON)) + if (!(user.check_intent(I_FLAG_HARM)) || (used_item.item_flags & ITEM_FLAG_NO_BLUDGEON)) return FALSE if(!used_item.user_can_attack_with(user)) @@ -491,21 +491,20 @@ var/global/list/all_apcs = list() /obj/machinery/power/apc/physical_attack_hand(mob/user) //Human mob special interaction goes here. - if(ishuman(user)) - var/mob/living/human/H = user - - if(H.species.can_shred(H)) - user.visible_message("\The [user] slashes at \the [src]!", "You slash at \the [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - - var/allcut = wires.IsAllCut() - if(beenhit >= pick(3, 4) && allcut == 0) - wires.CutAll() - src.update_icon() - src.visible_message("\The [src]'s wires are shredded!") - else - beenhit += 1 - return TRUE + if(user.can_shred()) + user.visible_message( + SPAN_DANGER("\The [user] slashes at \the [src]!"), + SPAN_DANGER("You slash at \the [src]!") + ) + playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) + var/allcut = wires.IsAllCut() + if(beenhit >= pick(3, 4) && allcut == 0) + wires.CutAll() + update_icon() + visible_message(SPAN_DANGER("\The [src]'s wires are shredded!")) + else + beenhit += 1 + return TRUE return FALSE /obj/machinery/power/apc/interface_interact(mob/user) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4cc7b4d0751..655e2766497 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -26,9 +26,10 @@ By design, d1 is the smallest direction and d2 is the highest name = "power cable" desc = "A flexible superconducting cable for heavy-duty power transfer." icon = 'icons/obj/power_cond_white.dmi' - icon_state = "0-1" - layer = EXPOSED_WIRE_LAYER - color = COLOR_MAROON + icon_state = "0-1" + layer = EXPOSED_WIRE_LAYER + color = COLOR_MAROON + paint_color = COLOR_MAROON anchored = TRUE obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED level = LEVEL_BELOW_PLATING @@ -55,24 +56,31 @@ By design, d1 is the smallest direction and d2 is the highest /obj/structure/cable/yellow color = COLOR_AMBER + paint_color = COLOR_AMBER /obj/structure/cable/green color = COLOR_GREEN + paint_color = COLOR_GREEN /obj/structure/cable/blue color = COLOR_CYAN_BLUE + paint_color = COLOR_CYAN_BLUE /obj/structure/cable/pink color = COLOR_PURPLE + paint_color = COLOR_PURPLE /obj/structure/cable/orange color = COLOR_ORANGE + paint_color = COLOR_ORANGE /obj/structure/cable/cyan color = COLOR_SKY_BLUE + paint_color = COLOR_SKY_BLUE /obj/structure/cable/white color = COLOR_SILVER + paint_color = COLOR_SILVER /obj/structure/cable/Initialize(var/ml) // ensure d1 & d2 reflect the icon_state for entering and exiting cable @@ -158,50 +166,48 @@ By design, d1 is the smallest direction and d2 is the highest // // TODO: take a closer look at cable attackby, make it call parent? -/obj/structure/cable/attackby(obj/item/W, mob/user) - if(IS_WIRECUTTER(W)) - cut_wire(W, user) +/obj/structure/cable/attackby(obj/item/used_item, mob/user) - else if(IS_COIL(W)) - var/obj/item/stack/cable_coil/coil = W + if(IS_WIRECUTTER(used_item)) + cut_wire(used_item, user) + return TRUE + + if(IS_COIL(used_item)) + var/obj/item/stack/cable_coil/coil = used_item if (coil.get_amount() < 1) to_chat(user, "You don't have enough cable to lay down.") return TRUE coil.cable_join(src, user) + return TRUE - else if(IS_MULTITOOL(W)) - + if(IS_MULTITOOL(used_item)) if(powernet && (powernet.avail > 0)) // is it powered? to_chat(user, SPAN_WARNING("[get_wattage()] in power network.")) - + shock(user, 5, 0.2) else to_chat(user, SPAN_WARNING("\The [src] is not powered.")) + return TRUE - shock(user, 5, 0.2) - - - else if(W.edge) + else if(used_item.has_edge()) var/delay_holder - - if(W.get_attack_force(user) < 5) - visible_message(SPAN_WARNING("[user] starts sawing away roughly at \the [src] with \the [W].")) + if(used_item.expend_attack_force(user) < 5) + visible_message(SPAN_WARNING("[user] starts sawing away roughly at \the [src] with \the [used_item].")) delay_holder = 8 SECONDS else - visible_message(SPAN_WARNING("[user] begins to cut through \the [src] with \the [W].")) + visible_message(SPAN_WARNING("[user] begins to cut through \the [src] with \the [used_item].")) delay_holder = 3 SECONDS - if(user.do_skilled(delay_holder, SKILL_ELECTRICAL, src)) - cut_wire(W, user) - if(W.obj_flags & OBJ_FLAG_CONDUCTIBLE) + cut_wire(used_item, user) + if(used_item.obj_flags & OBJ_FLAG_CONDUCTIBLE) shock(user, 66, 0.7) else visible_message(SPAN_WARNING("[user] stops cutting before any damage is done.")) + return TRUE - src.add_fingerprint(user) - return TRUE + return ..() -/obj/structure/cable/proc/cut_wire(obj/item/W, mob/user) +/obj/structure/cable/proc/cut_wire(obj/item/used_item, mob/user) var/turf/T = get_turf(src) if(!T || !T.is_plating()) return @@ -227,19 +233,19 @@ By design, d1 is the smallest direction and d2 is the highest if(c.d1 == UP || c.d2 == UP) qdel(c) - investigate_log("was cut by [key_name(usr, usr.client)] in [get_area_name(user)]","wires") + investigate_log("was cut by [key_name(user, user.client)] in [get_area_name(user)]","wires") qdel(src) // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) - if(!prob(prb)) - return 0 + if(!prob(prb) || powernet?.avail <= 0) + return FALSE if (electrocute_mob(user, powernet, src, siemens_coeff)) spark_at(src, amount=5, cardinal_only = TRUE) - if(HAS_STATUS(usr, STAT_STUN)) - return 1 - return 0 + if(HAS_STATUS(user, STAT_STUN)) + return TRUE + return FALSE // TODO: generalize to matter list and parts_type. /obj/structure/cable/create_dismantled_products(turf/T) @@ -264,7 +270,7 @@ By design, d1 is the smallest direction and d2 is the highest var/color_n = "#dd0000" if(colorC) color_n = colorC - color = color_n + set_color(color_n) ///////////////////////////////////////////////// // Cable laying helpers @@ -502,6 +508,7 @@ By design, d1 is the smallest direction and d2 is the highest amount = MAXCOIL max_amount = MAXCOIL color = COLOR_MAROON + paint_color = COLOR_MAROON desc = "A coil of wiring, suitable for both delicate electronics and heavy duty power supply." singular_name = "length" w_class = ITEM_SIZE_NORMAL @@ -544,7 +551,7 @@ By design, d1 is the smallest direction and d2 is the highest TOOL_SUTURES = TOOL_QUALITY_MEDIOCRE )) if (can_have_color && param_color) // It should be red by default, so only recolor it if parameter was specified. - color = param_color + set_color(param_color) update_icon() update_wclass() @@ -555,7 +562,7 @@ By design, d1 is the smallest direction and d2 is the highest //you can use wires to heal robotics /obj/item/stack/cable_coil/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) var/obj/item/organ/external/affecting = istype(target) && GET_EXTERNAL_ORGAN(target, user?.get_target_zone()) - if(affecting && user.a_intent == I_HELP) + if(affecting && user.check_intent(I_FLAG_HELP)) if(!affecting.is_robotic()) to_chat(user, SPAN_WARNING("\The [target]'s [affecting.name] is not robotic. \The [src] cannot repair it.")) else if(BP_IS_BRITTLE(affecting)) @@ -569,9 +576,9 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/on_update_icon() . = ..() - if (!color && can_have_color) + if (!paint_color && can_have_color) var/list/possible_cable_colours = get_global_cable_colors() - color = possible_cable_colours[pick(possible_cable_colours)] + set_color(possible_cable_colours[pick(possible_cable_colours)]) if(amount == 1) icon_state = "coil1" SetName("cable piece") @@ -594,7 +601,7 @@ By design, d1 is the smallest direction and d2 is the highest if(!final_color) selected_color = "Red" final_color = possible_cable_colours[selected_color] - color = final_color + set_color(final_color) to_chat(user, SPAN_NOTICE("You change \the [src]'s color to [lowertext(selected_color)].")) /obj/item/stack/cable_coil/proc/update_wclass() @@ -627,7 +634,7 @@ By design, d1 is the smallest direction and d2 is the highest to_chat(usr, SPAN_WARNING("You need at least 15 [plural_name] of cable to make restraints!")) return var/obj/item/handcuffs/cable/B = new /obj/item/handcuffs/cable(usr.loc) - B.color = color + B.set_color(color) to_chat(usr, SPAN_NOTICE("You wind some [plural_name] of cable together to make some restraints.")) else to_chat(usr, SPAN_NOTICE("You cannot do that.")) @@ -842,31 +849,39 @@ By design, d1 is the smallest direction and d2 is the highest /obj/item/stack/cable_coil/yellow color = COLOR_AMBER + paint_color = COLOR_AMBER /obj/item/stack/cable_coil/blue color = COLOR_CYAN_BLUE + paint_color = COLOR_CYAN_BLUE /obj/item/stack/cable_coil/green color = COLOR_GREEN + paint_color = COLOR_GREEN /obj/item/stack/cable_coil/pink color = COLOR_PURPLE + paint_color = COLOR_PURPLE /obj/item/stack/cable_coil/orange color = COLOR_ORANGE + paint_color = COLOR_ORANGE /obj/item/stack/cable_coil/cyan color = COLOR_SKY_BLUE + paint_color = COLOR_SKY_BLUE /obj/item/stack/cable_coil/white color = COLOR_SILVER + paint_color = COLOR_SILVER /obj/item/stack/cable_coil/lime color = COLOR_LIME + paint_color = COLOR_LIME /obj/item/stack/cable_coil/random/Initialize(mapload, c_length, param_color) var/list/possible_cable_colours = get_global_cable_colors() - color = possible_cable_colours[pick(possible_cable_colours)] + set_color(possible_cable_colours[pick(possible_cable_colours)]) . = ..() // Produces cable coil from a rig power cell. diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 48abeb8383a..a60fab7f939 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -85,7 +85,8 @@ to_chat(user, "The charge meter reads [round(src.percent(), 0.1)]%.") /obj/item/cell/emp_act(severity) - //remove this once emp changes on dev are merged in + // remove this if EMPs are ever rebalanced so that they don't instantly drain borg cells + // todo: containers (partially) shielding contents? if(isrobot(loc)) var/mob/living/silicon/robot/R = loc severity *= R.cell_emp_mult diff --git a/code/modules/power/fuel_assembly/fuel_assembly.dm b/code/modules/power/fuel_assembly/fuel_assembly.dm index dbd9544418e..3721dff6b01 100644 --- a/code/modules/power/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fuel_assembly/fuel_assembly.dm @@ -90,8 +90,8 @@ /obj/item/fuel_assembly/phoron material = /decl/material/solid/phoron -/obj/item/fuel_assembly/supermatter - material = /decl/material/solid/supermatter +/obj/item/fuel_assembly/exotic_matter + material = /decl/material/solid/exotic_matter /obj/item/fuel_assembly/hydrogen material = /decl/material/gas/hydrogen diff --git a/code/modules/power/fuel_assembly/fuel_compressor.dm b/code/modules/power/fuel_assembly/fuel_compressor.dm index 58b26a67dd9..0488d360f93 100644 --- a/code/modules/power/fuel_assembly/fuel_compressor.dm +++ b/code/modules/power/fuel_assembly/fuel_compressor.dm @@ -129,12 +129,6 @@ to_chat(user, SPAN_NOTICE("You add the contents of \the [thing] to \the [src]'s material buffer.")) return TRUE - if(istype(thing, /obj/machinery/power/supermatter/shard)) - stored_material[/decl/material/solid/supermatter] = 5 * SHEET_MATERIAL_AMOUNT - to_chat(user, SPAN_NOTICE("You awkwardly cram \the [thing] into \the [src]'s material buffer.")) - qdel(thing) - return TRUE - if(istype(thing, /obj/item/stack/material)) var/obj/item/stack/material/M = thing var/decl/material/mat = M.get_material() diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 472ab5c37b5..14ac3c4e1cc 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -102,7 +102,7 @@ // VERY UNIDEAL REACTIONS. /decl/fusion_reaction/phoron_supermatter - p_react = /decl/material/solid/supermatter + p_react = /decl/material/solid/exotic_matter s_react = /decl/material/solid/phoron energy_consumption = 0 energy_production = 5 * FUSION_PROCESSING_TIME_MULT @@ -121,8 +121,7 @@ qdel(holder) var/radiation_level = rand(100, 200) - // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana - SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1) + SSradiation.z_radiate(origin, radiation_level, respect_maint = TRUE) for(var/mob/living/human/H in global.living_mob_list_) var/turf/T = get_turf(H) @@ -130,10 +129,10 @@ H.set_hallucination(rand(100,150), 51) for(var/obj/machinery/fusion_fuel_injector/I in range(world.view, origin)) - if(I.cur_assembly && I.cur_assembly.material && I.cur_assembly.material.type == /decl/material/solid/supermatter) + if(I.cur_assembly && I.cur_assembly.material && I.cur_assembly.material.type == /decl/material/solid/exotic_matter) explosion(get_turf(I), 1, 2, 3) if(!QDELETED(I)) - QDEL_IN(I, 5) + addtimer(CALLBACK(I, TYPE_PROC_REF(/atom, physically_destroyed)), 0.5 SECONDS) sleep(5) explosion(origin, 1, 2, 5) diff --git a/code/modules/power/geothermal/_geothermal.dm b/code/modules/power/geothermal/_geothermal.dm index 5f76fa6dd0f..3425a37cd2c 100644 --- a/code/modules/power/geothermal/_geothermal.dm +++ b/code/modules/power/geothermal/_geothermal.dm @@ -148,6 +148,7 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 /obj/machinery/geothermal/Destroy() var/atom/last_loc = loc unset_vent() + connector = null . = ..() if(istype(last_loc)) propagate_refresh_neighbors(last_loc) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 76ea4bb5e1e..624425a5121 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -262,9 +262,9 @@ // attempt to break the light //If xenos decide they want to smash a light bulb with a toolbox, who am I to stop them? /N - else if(lightbulb && (lightbulb.status != LIGHT_BROKEN) && user.a_intent != I_HELP) + else if(lightbulb && (lightbulb.status != LIGHT_BROKEN) && !user.check_intent(I_FLAG_HELP)) - if(prob(1 + W.get_attack_force(user) * 5)) + if(prob(1 + W.expend_attack_force(user) * 5)) user.visible_message("[user.name] smashed the light!", "You smash the light!", "You hear a tinkle of breaking glass.") if(on && (W.obj_flags & OBJ_FLAG_CONDUCTIBLE)) @@ -316,12 +316,13 @@ to_chat(user, "There is no [get_fitting_name()] in this light.") return TRUE - if(ishuman(user)) - var/mob/living/human/H = user - if(H.species.can_shred(H)) - visible_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass.") - broken() - return TRUE + if(user.can_shred()) + visible_message( + SPAN_DANGER("\The [user] smashes the light!"), + blind_message = "You hear a tinkle of breaking glass." + ) + broken() + return TRUE // make it burn hands if not wearing fire-insulated gloves if(on) @@ -329,15 +330,15 @@ var/prot = FALSE var/mob/living/human/H = user if(istype(H)) - var/obj/item/clothing/gloves/pronouns = H.get_equipped_item(slot_gloves_str) - if(istype(pronouns) && pronouns.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) + var/obj/item/clothing/gloves/gloves = H.get_equipped_item(slot_gloves_str) + if(istype(gloves) && gloves.max_heat_protection_temperature > LIGHT_BULB_TEMPERATURE) prot = TRUE if(prot > 0 || user.has_genetic_condition(GENE_COND_COLD_RESISTANCE)) to_chat(user, "You remove the [get_fitting_name()].") else if(istype(user) && user.is_telekinetic()) to_chat(user, "You telekinetically remove the [get_fitting_name()].") - else if(user.a_intent != I_HELP) + else if(!user.check_intent(I_FLAG_HELP)) var/obj/item/organ/external/hand = GET_EXTERNAL_ORGAN(H, user.get_active_held_item_slot()) if(hand && hand.is_usable() && !hand.can_feel_pain()) user.apply_damage(3, BURN, hand.organ_tag, used_weapon = src) @@ -482,7 +483,7 @@ /obj/item/light/set_color(color) b_color = isnull(color) ? COLOR_WHITE : color - update_icon() + queue_icon_update() // avoid running update_icon before Initialize /obj/item/light/tube name = "light tube" @@ -552,7 +553,6 @@ // update the icon state and description of the light /obj/item/light/on_update_icon() . = ..() - color = b_color var/broken switch(status) if(LIGHT_OK) @@ -565,9 +565,7 @@ icon_state = "[base_state]_broken" desc = "A broken [name]." broken = TRUE - var/image/I = image(icon, src, "[base_state]_attachment[broken ? "_broken" : ""]") - I.color = null - add_overlay(I) + add_overlay(overlay_image(icon, "[base_state]_attachment[broken ? "_broken" : ""]", flags = RESET_COLOR|RESET_ALPHA)) /obj/item/light/Initialize(mapload) . = ..() @@ -598,7 +596,7 @@ if(!proximity) return if(istype(target, /obj/machinery/light)) return - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) return shatter() @@ -607,7 +605,7 @@ if(status == LIGHT_OK || status == LIGHT_BURNED) src.visible_message("[name] shatters.","You hear a small glass object shatter.") status = LIGHT_BROKEN - sharp = 1 + set_sharp(TRUE) set_base_attack_force(5) playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1) update_icon() @@ -615,13 +613,7 @@ /obj/item/light/proc/switch_on() switchcount++ if(rigged) - log_and_message_admins("Rigged light explosion, last touched by [fingerprintslast]") - var/turf/T = get_turf(src.loc) - spawn(0) - sleep(2) - explosion(T, 0, 0, 3, 5) - sleep(1) - qdel(src) + addtimer(CALLBACK(src, PROC_REF(do_rigged_explosion)), 0.2 SECONDS) status = LIGHT_BROKEN else if(prob(min(60, switchcount*switchcount*0.01))) status = LIGHT_BURNED @@ -629,6 +621,15 @@ playsound(src, sound_on, 75) return status +/obj/item/light/proc/do_rigged_explosion() + if(!rigged) + return + log_and_message_admins("Rigged light explosion, last touched by [fingerprintslast]") + var/turf/T = get_turf(src) + explosion(T, 0, 0, 3, 5) + if(!QDELETED(src)) + QDEL_IN(src, 1) + /obj/machinery/light/do_simple_ranged_interaction(var/mob/user) if(lightbulb) remove_bulb() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index a04cc415262..fcde5f33f1f 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -76,9 +76,9 @@ if(distance > 1) return if(active) - to_chat(usr, "The generator is on.") + to_chat(user, "The generator is on.") else - to_chat(usr, "The generator is off.") + to_chat(user, "The generator is off.") /obj/machinery/port_gen/emp_act(severity) if(!active) return @@ -466,7 +466,7 @@ to_chat(user, "Auxilary tank shows [reagents.total_volume]u of liquid in it.") /obj/machinery/port_gen/pacman/super/potato/UseFuel() - if(reagents.has_reagent(/decl/material/liquid/ethanol/vodka)) + if(reagents.has_reagent(/decl/material/liquid/alcohol/vodka)) rad_power = 4 temperature_gain = 60 remove_any_reagents(1) @@ -486,9 +486,9 @@ /obj/machinery/port_gen/pacman/super/potato/attackby(var/obj/item/hit_with, var/mob/user) if(istype(hit_with, /obj/item/chems)) var/obj/item/chems/chem_container = hit_with - var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) + var/old_vodka_amount = REAGENT_VOLUME(reagents, /decl/material/liquid/alcohol/vodka) if(chem_container.standard_pour_into(src,user)) - if(REAGENT_VOLUME(reagents, /decl/material/liquid/ethanol/vodka) > old_vodka_amount) // yay, booze! + if(REAGENT_VOLUME(reagents, /decl/material/liquid/alcohol/vodka) > old_vodka_amount) // yay, booze! audible_message(SPAN_NOTICE("[src] blips happily!")) playsound(get_turf(src),'sound/machines/synth_yes.ogg', 50, FALSE) else // you didn't add any more than we already had diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index ca4b205e6b0..8afd72314ce 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -179,11 +179,14 @@ return net1 //Determines how strong could be shock, deals damage to mob, uses power. -//M is a mob who touched wire/whatever +//victim is a mob who touched wire/whatever //power_source is a source of electricity, can be powercell, area, apc, cable, powernet or null //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. -/proc/electrocute_mob(mob/living/M, var/power_source, var/obj/source, var/siemens_coeff = 1.0) +/proc/electrocute_mob(mob/living/victim, power_source, obj/source, siemens_coeff = 1.0, coverage_flags = SLOT_HANDS) + + coverage_flags = victim?.get_active_hand_bodypart_flags() || coverage_flags + var/area/source_area if(istype(power_source,/area)) source_area = power_source @@ -208,19 +211,16 @@ else if (!power_source) return 0 else - log_admin("ERROR: /proc/electrocute_mob([M], [power_source], [source]): wrong power_source") + log_admin("ERROR: /proc/electrocute_mob([victim], [power_source], [source]): wrong power_source") return 0 + //Triggers powernet warning, but only for 5 ticks (if applicable) //If following checks determine user is protected we won't alarm for long. if(PN) PN.trigger_warning(5) - if(ishuman(M)) - var/mob/living/human/H = M - if(H.species.get_shock_vulnerability(H) <= 0) - return - var/obj/item/clothing/gloves/G = H.get_equipped_item(slot_gloves_str) - if(istype(G) && G.siemens_coefficient == 0) - return 0 //to avoid spamming with insulated glvoes on + + if(victim.get_siemens_coefficient_for_coverage(coverage_flags) <= 0) + return //Checks again. If we are still here subject will be shocked, trigger standard 20 tick warning //Since this one is longer it will override the original one. @@ -242,7 +242,7 @@ else power_source = cell shock_damage = cell_damage - var/drained_hp = M.electrocute_act(shock_damage, source, siemens_coeff) //zzzzzzap! + var/drained_hp = victim.electrocute_act(shock_damage, source, siemens_coeff) //zzzzzzap! var/drained_energy = drained_hp*20 if (source_area) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index d7ae1df1a1a..c2b62b6059f 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -11,7 +11,7 @@ active_power_usage = 100 KILOWATTS var/efficiency = 0.3 // Energy efficiency. 30% at this time, so 100kW load means 30kW laser pulses. - var/minimum_power = 10 KILOWATTS // The minimum power the emitter will still fire at it it doesn't have enough power available. + var/minimum_power = 10 KILOWATTS // The minimum power below which the emitter will turn off; different than the power needed to fire. var/active = 0 var/fire_delay = 100 var/max_burst_delay = 100 @@ -67,8 +67,8 @@ if(active==1) active = 0 to_chat(user, "You turn off \the [src].") - log_and_message_admins("turned off \the [src]") - investigate_log("turned off by [key_name_admin(user || usr)]","singulo") + log_and_message_admins("turned off \the [src]", user) + investigate_log("turned off by [key_name_admin(user)]","singulo") else active = 1 if(user) @@ -77,8 +77,8 @@ to_chat(user, "You turn on \the [src].") shot_number = 0 fire_delay = get_initial_fire_delay() - log_and_message_admins("turned on \the [src]") - investigate_log("turned on by [key_name_admin(user || usr)]","singulo") + log_and_message_admins("turned on \the [src]", user) + investigate_log("turned on by [key_name_admin(user)]","singulo") update_icon() else to_chat(user, "The controls are locked!") diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index fc1b54c7edc..00976a216f0 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -8,7 +8,7 @@ density = TRUE use_power = POWER_USE_OFF matter = list( - /decl/material/solid/supermatter = MATTER_AMOUNT_PRIMARY, + /decl/material/solid/exotic_matter = MATTER_AMOUNT_PRIMARY, /decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY ) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 8dae5c06871..d53d37aa144 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -13,7 +13,7 @@ var/global/list/singularities = list() /// Category used for investigation entries relating to this atom. var/const/investigation_label = "singulo" - /// A list of events. Toxins is in here twice to double the chance of proccing. + /// A weighted list of events. var/static/list/singularity_events = list( /decl/singularity_event/empulse = 1, /decl/singularity_event/toxins = 2, @@ -63,7 +63,7 @@ var/global/list/singularities = list() /obj/effect/singularity/explosion_act(severity) SHOULD_CALL_PARENT(FALSE) - if(current_stage.stage_size == STAGE_SUPER)//IT'S UNSTOPPABLE + if(!current_stage.explosion_vulnerable)//IT'S UNSTOPPABLE return if(severity == 1) if(prob(25)) @@ -153,16 +153,13 @@ var/global/list/singularities = list() // Handle random events. if(prob(current_stage.event_chance)) - if(current_stage.stage_size >= STAGE_SUPER) - var/decl/singularity_event/wave_event = GET_DECL(/decl/singularity_event/supermatter_wave) - wave_event.handle_event(src) - var/decl/singularity_event/singularity_event = pickweight(singularity_events) + var/decl/singularity_event/singularity_event = current_stage.forced_event || pickweight(singularity_events) singularity_event = GET_DECL(singularity_event) singularity_event.handle_event(src) /obj/effect/singularity/proc/try_move(var/movement_dir, var/vertical_move) set waitfor = FALSE - if(current_stage.stage_size >= STAGE_FIVE)//The superlarge one does not care about things in its way + if(current_stage.ignore_obstacles)//The superlarge one does not care about things in its way step(src, movement_dir) if(!vertical_move) sleep(1) diff --git a/code/modules/power/singularity/singularity_events.dm b/code/modules/power/singularity/singularity_events.dm index e48a040231b..f3bc342ac90 100644 --- a/code/modules/power/singularity/singularity_events.dm +++ b/code/modules/power/singularity/singularity_events.dm @@ -7,10 +7,7 @@ /decl/singularity_event/nothing // Nothing happens. /decl/singularity_event/empulse/handle_event(obj/effect/singularity/source) - if(source.current_stage.stage_size != STAGE_SUPER) - empulse(source, 8, 10) - else - empulse(source, 12, 16) + empulse(source, source.current_stage.em_heavy_range, source.current_stage.em_light_range) /decl/singularity_event/toxins var/toxrange = 10 @@ -35,20 +32,10 @@ if(ishuman(M)) var/mob/living/human/H = M if(istype(H.get_equipped_item(slot_glasses_str), /obj/item/clothing/glasses/meson)) - if(source.current_stage.stage_size != STAGE_SUPER) + if(!source.current_stage.the_goggles_do_nothing) to_chat(H, SPAN_WARNING("You look directly into \the [source]. Good thing you had your protective eyewear on!")) continue to_chat(H, SPAN_WARNING("Your eyewear does absolutely nothing to protect you from \the [source]")) - to_chat(M, SPAN_DANGER("You look directly into \the [source] and feel [source.current_stage.stage_size == STAGE_SUPER ? "helpless" : "weak"].")) + to_chat(M, SPAN_DANGER("You look directly into \the [source] and feel [source.current_stage.mesmerize_text].")) M.apply_effect(3, STUN) M.visible_message(SPAN_DANGER("\The [M] stares blankly at \the [source]!")) - -/decl/singularity_event/supermatter_wave/handle_event(obj/effect/singularity/source) - for(var/mob/living/M in view(10, source.loc)) - to_chat(M, SPAN_WARNING("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) - if(prob(67)) - to_chat(M, SPAN_NOTICE("Miraculously, it fails to kill you.")) - else - to_chat(M, SPAN_DANGER("You don't even have a moment to react as you are reduced to ashes by the intense radiation.")) - M.dust() - SSradiation.radiate(source, rand(source.energy)) diff --git a/code/modules/power/singularity/singularity_stages.dm b/code/modules/power/singularity/singularity_stages.dm index 831cacd48c5..2624c10e818 100644 --- a/code/modules/power/singularity/singularity_stages.dm +++ b/code/modules/power/singularity/singularity_stages.dm @@ -32,8 +32,22 @@ var/dissipation_energy_loss = 1 /// What is the percent chance of an event each tick? var/event_chance + /// Do we force a specific event when we proc events? + var/decl/singularity_event/forced_event = null /// Will we wander around? var/wander + /// Can explosions destroy the singularity? + var/explosion_vulnerable + /// What is the heavy range for the EM pulse event in this stage? + var/em_heavy_range = 8 + /// What is the light range for the EM pulse event in this stage? + var/em_light_range = 10 + /// What do characters feel when they're mesmerized during this stage? + var/mesmerize_text = "weak" + /// Do we ignore PPE for mesmerizing in this stage? + var/the_goggles_do_nothing = FALSE + /// Do we ignore obstacles in our way? + var/ignore_obstacles = FALSE /decl/singularity_stage/validate() . = ..() @@ -171,29 +185,7 @@ dissipates_over_time = FALSE //It cant go smaller due to e loss. wander = TRUE event_chance = 20 + ignore_obstacles = TRUE /decl/singularity_stage/stage_five/grow_to(obj/effect/singularity/source) source.visible_message(SPAN_DANGER("\The [source] has grown out of control!")) - -/decl/singularity_stage/stage_five/shrink_to(obj/effect/singularity/source) - source.visible_message(SPAN_WARNING("\The [source] miraculously reduces in size and loses its supermatter properties.")) - -/decl/singularity_stage/stage_super - name = "super gravitational singularity" - desc = "A gravitational singularity with the properties of supermatter. It has the power to destroy worlds." - min_energy = 50000 - max_energy = INFINITY - stage_size = STAGE_SUPER - footprint = 6 - icon = 'icons/effects/352x352.dmi' - icon_state = "singularity_s11"//uh, whoever drew that, you know that black holes are supposed to look dark right? What's this, the clown's singulo? - pixel_x = -160 - pixel_y = -160 - grav_pull = 16 - consume_range = 5 - dissipates_over_time = 0 //It cant go smaller due to e loss - event_chance = 25 //Events will fire off more often. - wander = TRUE - -/decl/singularity_stage/stage_super/grow_to(obj/effect/singularity/source) - source.visible_message(SPAN_SINISTER("You witness the creation of a destructive force that cannot possibly be stopped by human hands.")) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 6ad9f2fbc7f..50c22d1479e 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -221,8 +221,8 @@ return TRUE /obj/machinery/power/smes/attackby(var/obj/item/W, var/mob/user) - if(component_attackby(W, user)) - return TRUE + if((. = component_attackby(W, user))) + return return bash(W, user) /obj/machinery/power/smes/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 3a956c49e00..59665f270cb 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -155,7 +155,7 @@ var/obj/item/clothing/gloves/G = h_user.get_equipped_item(slot_gloves_str) if(istype(G) && G.siemens_coefficient == 0) user_protected = 1 - log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") + log_and_message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [user.ckey], Intensity: [intensity]/100 - JMP") switch (intensity) if (0 to 15) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index bd129184831..a941debb006 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -88,7 +88,7 @@ var/global/list/solars_list = list() return TRUE else if (W) add_fingerprint(user) - current_health -= W.get_attack_force(user) + current_health -= W.expend_attack_force(user) healthcheck() return ..() diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index 8fb0064ca70..aa6c612f55b 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -185,7 +185,7 @@ /obj/machinery/turbine/OnTopic(user, href_list) if(href_list["close"]) - close_browser(usr, "window=turbine") + close_browser(user, "window=turbine") return TOPIC_HANDLED if(href_list["str"]) @@ -244,9 +244,9 @@ -/obj/machinery/computer/turbine_computer/OnTopic(user, href_list) +/obj/machinery/computer/turbine_computer/OnTopic(mob/user, href_list) if( href_list["view"] ) - usr.client.eye = src.compressor + user.client.eye = src.compressor . = TOPIC_HANDLED else if( href_list["str"] ) src.compressor.starter = !src.compressor.starter diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index a26611bd894..613ae77ae76 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -39,17 +39,20 @@ pixel_y = rand(-randpixel, randpixel) . = ..() +/obj/item/ammo_casing/Destroy() + QDEL_NULL(BB) + return ..() + //removes the projectile from the ammo casing /obj/item/ammo_casing/proc/expend() . = BB BB = null set_dir(pick(global.alldirs)) //spin spent casings - // Aurora forensics port, gunpowder residue. if(leaves_residue) leave_residue() - update_icon() + update_name() /obj/item/ammo_casing/Crossed(atom/movable/AM) ..() @@ -119,6 +122,11 @@ else if(spent_icon && !BB) icon_state = spent_icon +/obj/item/ammo_casing/update_name() + . = ..() + if(!BB) + SetName("spent [name]") + /obj/item/ammo_casing/examine(mob/user) . = ..() if(caliber) @@ -167,6 +175,7 @@ return for(var/i in 1 to initial_ammo) stored_ammo += new ammo_type(src) + contents_initialized = TRUE /obj/item/ammo_magazine/proc/get_stored_ammo_count() . = length(stored_ammo) @@ -269,10 +278,9 @@ var/global/list/magazine_icondata_states = list() /proc/magazine_icondata_cache_add(var/obj/item/ammo_magazine/M) var/list/icon_keys = list() var/list/ammo_states = list() - var/list/states = icon_states(M.icon) for(var/i = 0, i <= M.max_ammo, i++) var/ammo_state = "[M.icon_state]-[i]" - if(ammo_state in states) + if(check_state_in_icon(ammo_state, M.icon)) icon_keys += i ammo_states += ammo_state diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 43f6f7fb6c1..29125e7db81 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -18,14 +18,16 @@ /obj/item/ammo_magazine/speedloader/on_update_icon() . = ..() - if(!length(stored_ammo)) + var/ammo_count = get_stored_ammo_count() + if(!ammo_count) return + create_initial_contents() // Not ideal, but we need instances for the icon gen. switch(icon_state) if("world") var/ammo_state = "world-some" - if(length(stored_ammo) == 1) + if(ammo_count == 1) ammo_state = "world-one" - else if(length(stored_ammo) == max_ammo) + else if(ammo_count == max_ammo) ammo_state = "world-full" var/obj/item/ammo_casing/A = stored_ammo[1] add_overlay(overlay_image(icon, ammo_state, A.color, RESET_COLOR)) @@ -64,7 +66,7 @@ overlays += I /obj/item/ammo_magazine/shotholder/attack_hand(mob/user) - if(loc != user || user.a_intent != I_HURT || !length(stored_ammo) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) + if(loc != user || !user.check_intent(I_FLAG_HARM) || !length(stored_ammo) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() create_initial_contents() var/obj/item/ammo_casing/C = stored_ammo[stored_ammo.len] diff --git a/code/modules/projectiles/ammunition/chemdart.dm b/code/modules/projectiles/ammunition/chemdart.dm index bd8710bef92..fa7647a4dcf 100644 --- a/code/modules/projectiles/ammunition/chemdart.dm +++ b/code/modules/projectiles/ammunition/chemdart.dm @@ -2,7 +2,7 @@ name = "dart" icon_state = "dart" damage = 5 - sharp = 1 + sharp = TRUE 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. life_span = 15 //shorter range muzzle_type = null diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8d2a2e24ed7..d99abdef1e6 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -45,6 +45,7 @@ drop_sound = 'sound/foley/drop1.ogg' pickup_sound = 'sound/foley/pickup2.ogg' can_be_twohanded = TRUE // also checks one_hand_penalty + needs_attack_dexterity = DEXTERITY_WEAPONS var/fire_verb = "fire" var/waterproof = FALSE @@ -193,15 +194,20 @@ /obj/item/gun/proc/special_check(var/mob/user) if(!isliving(user)) - return 0 - if(!user.check_dexterity(DEXTERITY_WEAPONS)) - return 0 + return FALSE + + if(!user.check_dexterity(get_required_attack_dexterity(user))) + return FALSE + + if(is_secure_gun() && !free_fire() && (!authorized_modes[sel_mode] || !registered_owner)) + audible_message(SPAN_WARNING("\The [src] buzzes, refusing to fire."), hearing_distance = 3) + playsound(loc, 'sound/machines/buzz-sigh.ogg', 10, 0) + return FALSE var/mob/living/M = user if(!safety() && world.time > last_safety_check + 5 MINUTES && !user.skill_check(SKILL_WEAPONS, SKILL_BASIC)) if(prob(30)) toggle_safety() - return 1 if(M.has_genetic_condition(GENE_COND_CLUMSY) && prob(40)) //Clumsy handling var/obj/P = consume_next_projectile() @@ -218,8 +224,9 @@ M.try_unequip(src) else handle_click_empty(user) - return 0 - return 1 + return FALSE + + return TRUE /obj/item/gun/emp_act(severity) for(var/obj/O in contents) @@ -243,14 +250,14 @@ handle_suicide(user) return TRUE - if(user.a_intent != I_HURT && user.aiming && user.aiming.active) //if aim mode, don't pistol whip + if(!user.check_intent(I_FLAG_HARM) && user.aiming && user.aiming.active) //if aim mode, don't pistol whip if (user.aiming.aiming_at != target) PreFire(target, user) else Fire(target, user, pointblank=1) return TRUE - if(user.a_intent == I_HURT) //point blank shooting + if(user.check_intent(I_FLAG_HARM)) //point blank shooting Fire(target, user, pointblank = TRUE) return TRUE @@ -259,7 +266,8 @@ /obj/item/gun/dropped(var/mob/living/user) check_accidents(user) update_icon() - return ..() + . = ..() + clear_autofire() /obj/item/gun/proc/Fire(atom/target, atom/movable/firer, clickparams, pointblank = FALSE, reflex = FALSE, set_click_cooldown = TRUE, target_zone = BP_CHEST) if(!firer || !target) @@ -287,7 +295,7 @@ return if(safety()) - if(user.a_intent == I_HURT && !user.skill_fail_prob(SKILL_WEAPONS, 100, SKILL_EXPERT, 0.5)) //reflex un-safeying + if(user.check_intent(I_FLAG_HARM) && !user.skill_fail_prob(SKILL_WEAPONS, 100, SKILL_EXPERT, 0.5)) //reflex un-safeying toggle_safety(user) else handle_click_empty(user) @@ -708,10 +716,6 @@ afterattack(shoot_to,target) return 1 -/obj/item/gun/dropped(mob/living/user) - . = ..() - clear_autofire() - /obj/item/gun/proc/can_autofire() return (autofire_enabled && world.time >= next_fire_time) @@ -747,6 +751,9 @@ return FALSE return TRUE +/obj/item/gun/get_quick_interaction_handler(mob/user) + return GET_DECL(/decl/interaction_handler/gun/toggle_safety) + /obj/item/gun/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/gun/toggle_safety) @@ -759,6 +766,7 @@ /decl/interaction_handler/gun/toggle_safety name = "Toggle Safety" + examine_desc = "toggle the safety" /decl/interaction_handler/gun/toggle_safety/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/gun = target @@ -766,6 +774,7 @@ /decl/interaction_handler/gun/toggle_firemode name = "Change Firemode" + examine_desc = "change the firemode" /decl/interaction_handler/gun/toggle_firemode/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/gun = target diff --git a/code/modules/projectiles/guns/energy/capacitor.dm b/code/modules/projectiles/guns/energy/capacitor.dm index 38d3f62f52e..1232ef3e8f3 100644 --- a/code/modules/projectiles/guns/energy/capacitor.dm +++ b/code/modules/projectiles/guns/energy/capacitor.dm @@ -250,7 +250,7 @@ var/global/list/laser_wavelengths if(charged) var/obj/item/projectile/P = new projectile_type(src) - P.color = selected_wavelength.color + P.set_color(selected_wavelength.color) P.set_light(l_color = selected_wavelength.light_color) P.damage = floor(sqrt(total_charge) * selected_wavelength.damage_multiplier) P.armor_penetration = floor(sqrt(total_charge) * selected_wavelength.armour_multiplier) diff --git a/code/modules/projectiles/guns/energy/staves.dm b/code/modules/projectiles/guns/energy/staves.dm index 45ab5f71b6f..965c8f208e0 100644 --- a/code/modules/projectiles/guns/energy/staves.dm +++ b/code/modules/projectiles/guns/energy/staves.dm @@ -13,15 +13,13 @@ self_recharge = 1 charge_meter = 0 has_safety = FALSE - var/required_antag_type = /decl/special_role/wizard + var/required_antag_type /obj/item/gun/energy/staff/special_check(var/mob/user) - if(required_antag_type) - var/decl/special_role/antag = GET_DECL(required_antag_type) - if(user.mind && !antag.is_antagonist(user.mind)) - to_chat(usr, "You focus your mind on \the [src], but nothing happens!") - return 0 - + var/decl/special_role/antag = GET_DECL(required_antag_type) + if(user.mind && (!antag?.is_antagonist(user.mind))) + to_chat(user, SPAN_WARNING("You focus your mind on \the [src], but nothing happens!")) + return FALSE return ..() /obj/item/gun/energy/staff/handle_click_empty(mob/user = null) diff --git a/code/modules/projectiles/guns/launcher/bows/arrow.dm b/code/modules/projectiles/guns/launcher/bows/arrow.dm index 981d6fe8af7..073c4d5928b 100644 --- a/code/modules/projectiles/guns/launcher/bows/arrow.dm +++ b/code/modules/projectiles/guns/launcher/bows/arrow.dm @@ -5,10 +5,10 @@ plural_icon_state = ICON_STATE_WORLD + "-mult" max_icon_state = ICON_STATE_WORLD + "-max" w_class = ITEM_SIZE_NORMAL - sharp = 1 - edge = 0 + sharp = TRUE + edge = FALSE lock_picking_level = 3 - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC matter_multiplier = 0.2 is_spawnable_type = TRUE diff --git a/code/modules/projectiles/guns/launcher/bows/sling.dm b/code/modules/projectiles/guns/launcher/bows/sling.dm index 25a4b6e6d9c..c3f3822d4d8 100644 --- a/code/modules/projectiles/guns/launcher/bows/sling.dm +++ b/code/modules/projectiles/guns/launcher/bows/sling.dm @@ -1,14 +1,15 @@ /obj/item/gun/launcher/bow/sling - name = "sling" - desc = "A simple strip of leather with a cup in the center, used to hurl stones with great speed." - slot_flags = 0 - draw_time = 0.5 SECONDS - icon = 'icons/obj/guns/launcher/sling.dmi' - material = /decl/material/solid/organic/leather - color = /decl/material/solid/organic/leather::color - string = null - max_tension = 1 - bow_ammo_type = null + name = "sling" + desc = "A simple strip of leather with a cup in the center, used to hurl stones with great speed." + slot_flags = 0 + draw_time = 0.5 SECONDS + icon = 'icons/obj/guns/launcher/sling.dmi' + material = /decl/material/solid/organic/leather + color = /decl/material/solid/organic/leather::color + string = null + requires_string = FALSE + max_tension = 1 + bow_ammo_type = null /obj/item/gun/launcher/bow/sling/try_string(mob/user, obj/item/bowstring/new_string) return FALSE diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index ee2bc15639b..d8d3d2e48bd 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -32,7 +32,7 @@ to_chat(user, "[rockets.len] / [max_rockets] rockets.") return TRUE else - to_chat(usr, "\The [src] cannot hold more rockets.") + to_chat(user, "\The [src] cannot hold more rockets.") return TRUE return ..() diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index d44be24924d..69fa0078472 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -30,7 +30,7 @@ return TRUE syringe = I to_chat(user, "You carefully insert [syringe] into [src].") - sharp = TRUE + set_sharp(TRUE) name = "syringe dart" update_icon() return TRUE @@ -41,7 +41,7 @@ to_chat(user, "You remove [syringe] from [src].") user.put_in_hands(syringe) syringe = null - sharp = initial(sharp) + set_sharp(initial(sharp)) SetName(initial(name)) update_icon() diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 1466e138166..e34fd58e061 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -49,6 +49,12 @@ ammo_magazine = new magazine_type(src) update_icon() +/obj/item/gun/projectile/Destroy() + chambered = null + loaded.Cut() + ammo_magazine = null + return ..() + /obj/item/gun/projectile/consume_next_projectile() if(!is_jammed && prob(jam_chance)) src.visible_message("\The [src] jams!") @@ -74,8 +80,8 @@ if(handle_casings == HOLD_CASINGS) ammo_magazine.stored_ammo += chambered ammo_magazine.initial_ammo-- - else if(ammo_magazine.stored_ammo.len) - chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] + else if(length(ammo_magazine.stored_ammo)) + chambered = ammo_magazine.stored_ammo[length(ammo_magazine.stored_ammo)] if(handle_casings != HOLD_CASINGS) ammo_magazine.stored_ammo -= chambered @@ -334,9 +340,9 @@ /obj/item/gun/projectile/proc/get_ammo_indicator() var/base_state = get_world_inventory_state() - if(!ammo_magazine || !LAZYLEN(ammo_magazine.stored_ammo)) + if(!ammo_magazine || !ammo_magazine.get_stored_ammo_count()) return mutable_appearance(icon, "[base_state]_ammo_bad") - else if(LAZYLEN(ammo_magazine.stored_ammo) <= 0.5 * ammo_magazine.max_ammo) + else if(LAZYLEN(ammo_magazine.get_stored_ammo_count()) <= 0.5 * ammo_magazine.max_ammo) return mutable_appearance(icon, "[base_state]_ammo_warn") else return mutable_appearance(icon, "[base_state]_ammo_ok") @@ -354,6 +360,7 @@ /decl/interaction_handler/projectile/remove_silencer name = "Remove Silencer" + examine_desc = "remove the silencer" /decl/interaction_handler/projectile/remove_silencer/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/projectile/gun = target @@ -361,6 +368,7 @@ /decl/interaction_handler/projectile/unload_ammo name = "Remove Ammunition" + examine_desc = "unload the ammunition" /decl/interaction_handler/projectile/unload_ammo/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/projectile/gun = target diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 7505d0152aa..802b1f93863 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -35,7 +35,7 @@ /obj/item/gun/projectile/automatic/smg/on_update_icon() ..() if(ammo_magazine) - add_overlay("[get_world_inventory_state()]mag-[round(length(ammo_magazine.stored_ammo),5)]") + add_overlay("[get_world_inventory_state()]mag-[round(ammo_magazine.get_stored_ammo_count(),5)]") /obj/item/gun/projectile/automatic/assault_rifle name = "assault rifle" diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index a34c5d36ae9..ee2edcdcfae 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -37,13 +37,13 @@ /obj/item/gun/projectile/dartgun/on_update_icon() ..() if(ammo_magazine) - icon_state = "[get_world_inventory_state()]-[clamp(length(ammo_magazine.get_stored_ammo_count()), 0, 5)]" + icon_state = "[get_world_inventory_state()]-[clamp(ammo_magazine.get_stored_ammo_count(), 0, 5)]" else icon_state = get_world_inventory_state() /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.get_stored_ammo_count()), 0, 5)]" + overlay.icon_state += "-[clamp(ammo_magazine.get_stored_ammo_count(), 0, 5)]" . = ..() /obj/item/gun/projectile/dartgun/consume_next_projectile() @@ -151,13 +151,13 @@ else if (href_list["eject"]) var/index = text2num(href_list["eject"]) if(beakers[index]) - remove_beaker(beakers[index], usr) + remove_beaker(beakers[index], user) . = TOPIC_REFRESH else if (href_list["eject_cart"]) - unload_ammo(usr) + unload_ammo(user) . = TOPIC_REFRESH - Interact(usr) + Interact(user) /obj/item/gun/projectile/dartgun/medical starting_chems = list(/decl/material/liquid/burn_meds,/decl/material/liquid/brute_meds,/decl/material/liquid/antitoxins) diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 638376989ee..e64e7c3f731 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -17,7 +17,7 @@ /obj/item/gun/projectile/pistol/update_base_icon_state() . = ..() - if(!length(ammo_magazine?.stored_ammo)) + if(!ammo_magazine?.get_stored_ammo_count()) var/empty_state = "[icon_state]-e" if(check_state_in_icon(empty_state, icon)) icon_state = empty_state diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 0f54520856d..464ce437f7c 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -74,6 +74,7 @@ /decl/interaction_handler/revolver_spin_cylinder name = "Spin Cylinder" expected_target_type = /obj/item/gun/projectile/revolver + examine_desc = "spin the cylinder" /decl/interaction_handler/revolver_spin_cylinder/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/projectile/revolver/R = target diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index fbf7adf743f..152cb7a6ab5 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -14,6 +14,18 @@ is_spawnable_type = FALSE atom_damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, ELECTROCUTE are the only things that should be in here, Try not to use PAIN as it doesn't go through stun_effect_act + // Code for handling tails, if any. + /// If the projectile leaves a trail. + var/proj_trail = FALSE + /// How long the trail lasts. + var/proj_trail_lifespan = 0 + /// What icon to use for the projectile trail. + var/proj_trail_icon = 'icons/effects/projectiles/trail.dmi' + /// What icon_state to use for the projectile trail. + var/proj_trail_icon_state = "trail" + /// Any extant trail effects. + var/list/proj_trails + var/bumped = 0 //Prevents it from hitting more than one guy at once var/def_zone = "" //Aiming at var/atom/movable/firer = null//Who shot it @@ -97,7 +109,7 @@ else animate_movement = NO_STEPS . = ..() -/obj/item/projectile/CanPass() +/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return TRUE /obj/item/projectile/damage_flags() @@ -315,11 +327,16 @@ SHOULD_CALL_PARENT(FALSE) return -/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - return 1 - /obj/item/projectile/proc/before_move() - return + if(!proj_trail || !isturf(loc) || !proj_trail_icon || !proj_trail_icon_state || !proj_trail_lifespan) + return + var/obj/effect/overlay/projectile_trail/trail = new(loc) + trail.master = src + trail.icon = proj_trail_icon + trail.icon_state = proj_trail_icon_state + trail.set_density(FALSE) + LAZYADD(proj_trails, trail) + QDEL_IN(trail, proj_trail_lifespan) /obj/item/projectile/proc/after_move() if(hitscan && tracer_type && !(locate(/obj/effect/projectile) in loc)) @@ -612,6 +629,7 @@ trajectory.initialize_location(target.x, target.y, target.z, 0, 0) /obj/item/projectile/Destroy() + QDEL_NULL_LIST(proj_trails) if(hitscan) if(loc && trajectory) var/datum/point/pcache = trajectory.copy_to() @@ -653,4 +671,4 @@ QDEL_NULL(beam_index) /obj/item/projectile/proc/update_effect(var/obj/effect/projectile/effect) - return \ No newline at end of file + return diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index d9cde61e7df..8df181e9195 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -7,7 +7,7 @@ pass_flags = PASS_FLAG_TABLE | PASS_FLAG_GLASS | PASS_FLAG_GRILLE damage = 40 atom_damage_type = BURN - sharp = 1 //concentrated burns + sharp = TRUE //concentrated burns damage_flags = DAM_LASER eyeblur = 4 hitscan = 1 @@ -210,7 +210,7 @@ icon_state = "stun" fire_sound = 'sound/weapons/Taser.ogg' damage_flags = 0 - sharp = 0 //not a laser + sharp = FALSE //not a laser damage = 1//flavor burn! still not a laser, dmg will be reduce by energy resistance not laser resistances atom_damage_type = BURN eyeblur = 1//Some feedback that you've been hit @@ -241,8 +241,8 @@ icon_state = "omnilaser" fire_sound = 'sound/weapons/plasma_cutter.ogg' damage = 15 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE atom_damage_type = BURN life_span = 5 pass_flags = PASS_FLAG_TABLE @@ -317,7 +317,7 @@ name = "dark matter wave" icon_state = "darkt" damage_flags = 0 - sharp = 0 //not a laser + sharp = FALSE //not a laser agony = 40 atom_damage_type = STUN muzzle_type = /obj/effect/projectile/muzzle/darkmattertaser @@ -354,9 +354,9 @@ ..() if(isliving(target)) var/mob/living/L = target - L.adjust_fire_stacks(rand(2,4)) - if(L.fire_stacks >= 3) - L.IgniteMob() + L.adjust_fire_intensity(rand(2,4)) + if(L.get_fire_intensity() >= 3) + L.ignite_fire() /obj/item/projectile/beam/pop icon_state = "bluelaser" diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index e66053ebe84..ff77df0fa33 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -54,13 +54,10 @@ var/choice = pick(get_random_transformation_options(M)) var/mob/living/new_mob = apply_transformation(M, choice) if(new_mob) - new_mob.a_intent = "hurt" - if(M.mind) - for (var/spell/S in M.mind.learned_spells) - new_mob.add_spell(new S.type) - new_mob.a_intent = "hurt" - transfer_key_from_mob_to_mob(M, new_mob) - to_chat(new_mob, "Your form morphs into that of \a [choice].") + new_mob.set_intent(I_FLAG_HARM) + new_mob.copy_abilities_from(M) + transfer_key_from_mob_to_mob(M, new_mob) + to_chat(new_mob, "Your form morphs into that of \a [choice].") else new_mob = M if(new_mob) @@ -68,4 +65,3 @@ if(new_mob != M && !QDELETED(M)) qdel(M) - diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 01404109510..d648f6d70c3 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -206,5 +206,5 @@ if(isliving(target)) var/mob/living/L = target to_chat(target, SPAN_WARNING("You feel a wave of heat wash over you!")) - L.adjust_fire_stacks(rand(5,8)) - L.IgniteMob() \ No newline at end of file + L.adjust_fire_intensity(rand(5,8)) + L.ignite_fire() \ No newline at end of file diff --git a/code/modules/projectiles/secure.dm b/code/modules/projectiles/secure.dm index 241a0e0a8af..6902b3bddb1 100644 --- a/code/modules/projectiles/secure.dm +++ b/code/modules/projectiles/secure.dm @@ -99,14 +99,6 @@ var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) return security_state.current_security_level_is_same_or_higher_than(security_state.high_security_level) -/obj/item/gun/special_check() - if(is_secure_gun() && !free_fire() && (!authorized_modes[sel_mode] || !registered_owner)) - audible_message(SPAN_WARNING("\The [src] buzzes, refusing to fire."), hearing_distance = 3) - playsound(loc, 'sound/machines/buzz-sigh.ogg', 10, 0) - return 0 - - . = ..() - /obj/item/gun/get_next_firemode() if(!is_secure_gun()) return ..() diff --git a/code/modules/projectiles/targeting/targeting_client.dm b/code/modules/projectiles/targeting/targeting_client.dm index eeaf61909de..082471448a5 100644 --- a/code/modules/projectiles/targeting/targeting_client.dm +++ b/code/modules/projectiles/targeting/targeting_client.dm @@ -1,12 +1,11 @@ //These are called by the on-screen buttons, adjusting what the victim can and cannot do. /client/proc/add_gun_icons() - if(!usr || !usr.item_use_icon) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. - screen |= usr.item_use_icon - screen |= usr.gun_move_icon - screen |= usr.radio_use_icon + if(!mob.item_use_icon) return 1 // This can runtime if someone manages to throw a gun out of their hand before the proc is called. + screen |= mob.item_use_icon + screen |= mob.gun_move_icon + screen |= mob.radio_use_icon /client/proc/remove_gun_icons() - if(!usr) return 1 // Runtime prevention on N00k agents spawning with SMG - screen -= usr.item_use_icon - screen -= usr.gun_move_icon - screen -= usr.radio_use_icon + screen -= mob.item_use_icon + screen -= mob.gun_move_icon + screen -= mob.radio_use_icon diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index 5d5b1f9ba65..7210efedb4c 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -34,27 +34,24 @@ // Update HUD icons. if(owner.gun_move_icon) if(!(target_permissions & TARGET_CAN_MOVE)) - owner.gun_move_icon.icon_state = "no_walk0" owner.gun_move_icon.SetName("Allow Movement") else - owner.gun_move_icon.icon_state = "no_walk1" owner.gun_move_icon.SetName("Disallow Movement") + owner.gun_move_icon.update_icon() if(owner.item_use_icon) if(!(target_permissions & TARGET_CAN_CLICK)) - owner.item_use_icon.icon_state = "no_item0" owner.item_use_icon.SetName("Allow Item Use") else - owner.item_use_icon.icon_state = "no_item1" owner.item_use_icon.SetName("Disallow Item Use") + owner.item_use_icon.update_icon() if(owner.radio_use_icon) if(!(target_permissions & TARGET_CAN_RADIO)) - owner.radio_use_icon.icon_state = "no_radio0" owner.radio_use_icon.SetName("Allow Radio Use") else - owner.radio_use_icon.icon_state = "no_radio1" owner.radio_use_icon.SetName("Disallow Radio Use") + owner.radio_use_icon.update_icon() var/message = "no longer permitted to " var/use_span = "warning" @@ -206,7 +203,7 @@ if(!no_message) to_chat(owner, "You will no longer aim rather than fire.") owner.client.remove_gun_icons() - owner.gun_setting_icon.icon_state = "gun[active]" + owner.gun_setting_icon.update_icon() /obj/aiming_overlay/proc/cancel_aiming(var/no_message = 0) if(!aiming_with || !aiming_at) diff --git a/code/modules/prometheus_metrics/metric_family.dm b/code/modules/prometheus_metrics/metric_family.dm index 373130e297a..0054e97a257 100644 --- a/code/modules/prometheus_metrics/metric_family.dm +++ b/code/modules/prometheus_metrics/metric_family.dm @@ -1,11 +1,11 @@ // Datum used for gathering a set of prometheus metrics. -/datum/metric_family +/decl/metric_family var/name = null var/metric_type = null var/help = null // Collect should return a list of lists with two entries, one being a list and the other being a number. -/datum/metric_family/proc/collect() +/decl/metric_family/proc/collect() var/list/out = list() out[++out.len] = list(list("foo" = "bar"), 3.14) @@ -15,9 +15,9 @@ // _to_proto will call the collect() method and format its result in a list // suitable for encoding as a JSON protobuf mapping. -/datum/metric_family/proc/_to_proto() +/decl/metric_family/proc/_to_proto() var/list/collected = collect() - + var/list/out = list( "name" = name, "type" = metric_type, @@ -36,7 +36,7 @@ label_pairs[++label_pairs.len] = list("name" = k, "value" = m[1][k]) metrics[++metrics.len] = list("label" = label_pairs, PROMETHEUS_METRIC_NAME(metric_type) = list("value" = m[2])) - + if(metrics.len == 0) return null out["metric"] = metrics diff --git a/code/modules/prometheus_metrics/metrics.dm b/code/modules/prometheus_metrics/metrics.dm index 95e2f819002..ad98b6c178f 100644 --- a/code/modules/prometheus_metrics/metrics.dm +++ b/code/modules/prometheus_metrics/metrics.dm @@ -1,24 +1,15 @@ -var/global/datum/prometheus_metrics/prometheus_metrics = new - // prometheus_metrics holds a list of metric_family datums and uses them to // create a json protobuf. -/datum/prometheus_metrics +/decl/prometheus_metrics var/list/metric_families -/datum/prometheus_metrics/New() - metric_families = list() - for(var/T in subtypesof(/datum/metric_family)) - var/datum/metric_family/mf = T - if(initial(mf.name) == null || initial(mf.metric_type) == null) - continue - metric_families += new T - -/datum/prometheus_metrics/proc/collect() +/decl/prometheus_metrics/proc/collect() var/list/out = list() - for(var/datum/metric_family/MF in metric_families) - var/proto = MF._to_proto() + for(var/decl/metric_family/metric_family in decls_repository.get_decls_of_type_unassociated(/decl/metric_family)) + var/proto = metric_family._to_proto() if(proto != null) - out[++out.len] = MF._to_proto() - + // out += proto will try to merge the lists, we have to insert it at the end instead + out[++out.len] = proto + return json_encode(out) diff --git a/code/modules/prometheus_metrics/metrics/byond.dm b/code/modules/prometheus_metrics/metrics/byond.dm index 232bce38faf..3aa58ba942d 100644 --- a/code/modules/prometheus_metrics/metrics/byond.dm +++ b/code/modules/prometheus_metrics/metrics/byond.dm @@ -1,29 +1,29 @@ // byond-specific metrics -/datum/metric_family/byond_time +/decl/metric_family/byond_time name = "byond_world_time_seconds" metric_type = PROMETHEUS_METRIC_COUNTER help = "Counter of 'game-time' seconds since server startup" -/datum/metric_family/byond_time/collect() +/decl/metric_family/byond_time/collect() return list(list(null, world.time / 10)) -/datum/metric_family/byond_tick_lag +/decl/metric_family/byond_tick_lag name = "byond_tick_lag" metric_type = PROMETHEUS_METRIC_GAUGE help = "Current value of world.tick_lag" -/datum/metric_family/byond_tick_lag/collect() +/decl/metric_family/byond_tick_lag/collect() return list(list(null, world.tick_lag)) -/datum/metric_family/byond_players +/decl/metric_family/byond_players name = "byond_players" metric_type = PROMETHEUS_METRIC_GAUGE help = "Number of players currently connected to the server" -/datum/metric_family/byond_players/collect() +/decl/metric_family/byond_players/collect() var/c = 0 for(var/client/C) if(C.connection == "seeker" || C.connection == "web") @@ -31,10 +31,10 @@ return list(list(null, c)) -/datum/metric_family/byond_cpu +/decl/metric_family/byond_cpu name = "byond_cpu" metric_type = PROMETHEUS_METRIC_GAUGE help = "Current value of world.cpu" -/datum/metric_family/byond_cpu/collect() +/decl/metric_family/byond_cpu/collect() return list(list(null, world.cpu)) diff --git a/code/modules/prometheus_metrics/metrics/ss13.dm b/code/modules/prometheus_metrics/metrics/ss13.dm index 5c6d315b04d..f686f1d1bed 100644 --- a/code/modules/prometheus_metrics/metrics/ss13.dm +++ b/code/modules/prometheus_metrics/metrics/ss13.dm @@ -1,11 +1,11 @@ // ss13-specific metrics -/datum/metric_family/ss13_controller_time_seconds +/decl/metric_family/ss13_controller_time_seconds name = "ss13_controller_time_seconds" metric_type = PROMETHEUS_METRIC_COUNTER help = "Counter of time spent in a controller in seconds" -/datum/metric_family/ss13_controller_time_seconds/collect() +/decl/metric_family/ss13_controller_time_seconds/collect() var/list/out = list() if(Master) for(var/name in Master.total_run_times) @@ -14,23 +14,23 @@ return out -/datum/metric_family/ss13_master_runlevel +/decl/metric_family/ss13_master_runlevel name = "ss13_master_runlevel" metric_type = PROMETHEUS_METRIC_GAUGE help = "Current MC runlevel" -/datum/metric_family/ss13_master_runlevel/collect() +/decl/metric_family/ss13_master_runlevel/collect() if(Master) return list(list(null, Master.current_runlevel)) return list() -/datum/metric_family/ss13_garbage_queue_length +/decl/metric_family/ss13_garbage_queue_length name = "ss13_garbage_queue_length" metric_type = PROMETHEUS_METRIC_GAUGE help = "Length of SSgarbage queues" -/datum/metric_family/ss13_garbage_queue_length/collect() +/decl/metric_family/ss13_garbage_queue_length/collect() var/list/out = list() if(SSgarbage) @@ -40,12 +40,12 @@ return out -/datum/metric_family/ss13_garbage_queue_results +/decl/metric_family/ss13_garbage_queue_results name = "ss13_garbage_queue_results" metric_type = PROMETHEUS_METRIC_COUNTER help = "Counter of pass/fail results for SSgarbage queues" -/datum/metric_family/ss13_garbage_queue_results/collect() +/decl/metric_family/ss13_garbage_queue_results/collect() var/list/out = list() if(SSgarbage) @@ -56,12 +56,12 @@ return out -/datum/metric_family/ss13_garbage_total_cleaned +/decl/metric_family/ss13_garbage_total_cleaned name = "ss13_garbage_total_cleaned" metric_type = PROMETHEUS_METRIC_COUNTER help = "Counter for number of objects deleted/GCed by SSgarbage" -/datum/metric_family/ss13_garbage_total_cleaned/collect() +/decl/metric_family/ss13_garbage_total_cleaned/collect() var/list/out = list() if(SSgarbage) diff --git a/code/modules/random_map/automata/caves.dm b/code/modules/random_map/automata/caves.dm index d12f5a79204..91044cd99d5 100644 --- a/code/modules/random_map/automata/caves.dm +++ b/code/modules/random_map/automata/caves.dm @@ -2,7 +2,7 @@ iterations = 5 descriptor = "moon caves" wall_type = /turf/wall/natural - floor_type = /turf/floor + floor_type = /turf/floor/barren target_turf_type = /turf/unsimulated/mask var/sparse_mineral_turf = /turf/wall/natural/random diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index d517a217017..1560263f996 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -22,12 +22,6 @@ var/global/list/datum/supply_drop_loot/supply_drop /datum/supply_drop_loot/dd_SortValue() return name -/datum/supply_drop_loot/supermatter - name = "Supermatter" -/datum/supply_drop_loot/supermatter/New() - ..() - contents = list(/obj/machinery/power/supermatter) - /datum/supply_drop_loot/lasers name = "Lasers" container = /obj/structure/largecrate @@ -51,18 +45,6 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/gun/projectile/automatic/smg, /obj/item/gun/projectile/automatic/assault_rifle) -/datum/supply_drop_loot/ballistics - name = "Ballistics" - container = /obj/structure/largecrate -/datum/supply_drop_loot/ballistics/New() - ..() - contents = list( - /obj/item/gun/projectile/pistol, - /obj/item/gun/projectile/shotgun/doublebarrel, - /obj/item/gun/projectile/shotgun/pump, - /obj/item/gun/projectile/automatic/smg, - /obj/item/gun/projectile/automatic/assault_rifle) - /datum/supply_drop_loot/seeds name = "Seeds" container = /obj/structure/closet/crate @@ -158,10 +140,10 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/box/syringes, /obj/item/box/autoinjectors) -/datum/supply_drop_loot/power - name = "Power" +/datum/supply_drop_loot/materials + name = "Materials" container = /obj/structure/largecrate -/datum/supply_drop_loot/power/New() +/datum/supply_drop_loot/materials/New() ..() contents = list( /obj/item/stack/material/sheet/mapped/steel, diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index ac23a7b14e8..926ed6b2d0b 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -136,7 +136,6 @@ drop = pick(supplied_drop_types) supplied_drop_types -= drop if(istype(drop)) - drop.tag = null if(drop.buckled) drop.buckled = null drop.forceMove(T) @@ -168,7 +167,6 @@ return for(var/i=0;i length(map)) return 0 var/turf/T = locate((origin_x-1)+x,(origin_y-1)+y,origin_z) if(!T || (target_turf_type && !istype(T,target_turf_type))) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 4357110ccbb..9b76b5dec22 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -1,8 +1,8 @@ var/global/obj/temp_reagents_holder = new var/global/datum/reagents/sink/infinite_reagent_sink = new -/atom/proc/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE) - return reagents?.add_reagent(reagent_type, amount, data, safety, defer_update) +/atom/proc/add_to_reagents(reagent_type, amount, data, safety = FALSE, defer_update = FALSE, phase = null) + return reagents?.add_reagent(reagent_type, amount, data, safety, defer_update, phase) /atom/proc/remove_from_reagents(reagent_type, amount, safety = FALSE, defer_update = FALSE) return reagents?.remove_reagent(reagent_type, amount, safety, defer_update) @@ -199,12 +199,12 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/replace_sound if(!(check_flags & ATOM_FLAG_NO_PHASE_CHANGE)) - if(!isnull(R.chilling_point) && R.type != R.bypass_chilling_products_for_root_type && LAZYLEN(R.chilling_products) && temperature <= R.chilling_point) + if(!isnull(R.chilling_point) && LAZYLEN(R.chilling_products) && temperature <= R.chilling_point) replace_self_with = R.chilling_products if(R.chilling_message) replace_message = "\The [R.get_reagent_name(src)] [R.chilling_message]" replace_sound = R.chilling_sound - else if(!isnull(R.heating_point) && R.type != R.bypass_heating_products_for_root_type && LAZYLEN(R.heating_products) && temperature >= R.heating_point) + else if(!isnull(R.heating_point) && LAZYLEN(R.heating_products) && temperature >= R.heating_point) replace_self_with = R.heating_products if(R.heating_message) replace_message = "\The [R.get_reagent_name(src)] [R.heating_message]" @@ -549,11 +549,11 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new /datum/reagents/proc/trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/safety = 0, var/defer_update = FALSE, var/list/skip_reagents, var/transferred_phases = (MAT_PHASE_LIQUID | MAT_PHASE_SOLID)) if(!target || !istype(target)) - return + return 0 amount = max(0, min(amount, total_volume, REAGENTS_FREE_SPACE(target) / multiplier)) if(!amount) - return + return 0 var/part = amount if(skip_reagents) @@ -561,7 +561,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new for(var/rtype in skip_reagents) using_volume -= LAZYACCESS(reagent_volumes, rtype) if(using_volume <= 0) - return + return 0 part /= using_volume else var/using_volume = total_volume @@ -579,6 +579,7 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new if(transferred_phases & MAT_PHASE_LIQUID) var/liquid_transferred = min(amount_to_transfer, CHEMS_QUANTIZE(LIQUID_VOLUME(src, rtype))) target.add_reagent(rtype, liquid_transferred * multiplier, REAGENT_DATA(src, rtype), TRUE, TRUE, MAT_PHASE_LIQUID) // We don't react until everything is in place + . += liquid_transferred amount_to_transfer -= liquid_transferred @@ -796,42 +797,55 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new // Options are touch_turf(), touch_mob() and touch_obj(). This does not handle transferring reagents to things. // For example, splashing someone with water will get them wet and extinguish them if they are on fire, // even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. -/datum/reagents/proc/touch_mob(var/mob/target) + +/datum/reagents/proc/touch_atom(atom/target, touch_atoms = TRUE) + if(ismob(target)) + return touch_mob(target) + if(isobj(target)) + return touch_obj(target) + if(isturf(target)) + return touch_turf(target, touch_atoms) + return FALSE + +/datum/reagents/proc/touch_mob(mob/target) if(!target || !istype(target) || !target.simulated) return for(var/rtype in reagent_volumes) var/decl/material/current = GET_DECL(rtype) current.touch_mob(target, REAGENT_VOLUME(src, rtype), src) -/datum/reagents/proc/touch_turf(var/turf/target) - if(!istype(target) || !target.simulated) +/datum/reagents/proc/touch_turf(turf/touching_turf, touch_atoms = TRUE) + + if(!istype(touching_turf) || !touching_turf.simulated) return + for(var/rtype in reagent_volumes) var/decl/material/current = GET_DECL(rtype) - current.touch_turf(target, REAGENT_VOLUME(src, rtype), src) + current.touch_turf(touching_turf, REAGENT_VOLUME(src, rtype), src) + var/dirtiness = get_dirtiness() if(dirtiness <= DIRTINESS_CLEAN) - target.clean() - target.remove_cleanables() - if(dirtiness != DIRTINESS_NEUTRAL) - if(dirtiness > DIRTINESS_NEUTRAL) - var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate() in target - if (!dirtoverlay) - dirtoverlay = new /obj/effect/decal/cleanable/dirt(target) - dirtoverlay.alpha = total_volume * dirtiness - else - dirtoverlay.alpha = min(dirtoverlay.alpha + total_volume * dirtiness, 255) - else - if(dirtiness <= DIRTINESS_STERILE) - target.germ_level -= min(total_volume*20, target.germ_level) - for(var/obj/item/I in target.contents) - I.was_bloodied = null - for(var/obj/effect/decal/cleanable/blood/B in target) - qdel(B) - if(dirtiness <= DIRTINESS_CLEAN) - target.clean() - -/datum/reagents/proc/touch_obj(var/obj/target) + touching_turf.clean() + touching_turf.remove_cleanables() + + if(dirtiness > DIRTINESS_NEUTRAL) + touching_turf.add_dirt(ceil(total_volume * dirtiness)) + else if(dirtiness < DIRTINESS_NEUTRAL) + if(dirtiness <= DIRTINESS_STERILE) + touching_turf.germ_level -= min(total_volume*20, touching_turf.germ_level) + for(var/obj/item/I in touching_turf.contents) + I.was_bloodied = null + for(var/obj/effect/decal/cleanable/blood/B in touching_turf) + qdel(B) + if(dirtiness <= DIRTINESS_CLEAN) + touching_turf.clean() + + if(touch_atoms) + for(var/atom/movable/thing in touching_turf.get_contained_external_atoms()) + if(thing.simulated && !istype(thing, /obj/effect/effect/smoke/chem)) + touch_atom(thing) + +/datum/reagents/proc/touch_obj(obj/target) if(!target || !istype(target) || !target.simulated) return for(var/rtype in reagent_volumes) @@ -876,13 +890,13 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new /datum/reagents/proc/trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/defer_update = FALSE, var/transferred_phases = (MAT_PHASE_LIQUID | MAT_PHASE_SOLID)) if(!target?.simulated) - return + return 0 // If we're only dumping solids, and there's not enough liquid present on the turf to make a slurry, we dump the solids directly. // This avoids creating an unnecessary reagent holder that won't be immediately deleted. if((!(transferred_phases & MAT_PHASE_LIQUID) || !total_liquid_volume) && (target.reagents?.total_liquid_volume < FLUID_SLURRY)) var/datum/reagents/R = new /datum/reagents(amount, global.temp_reagents_holder) - trans_to_holder(R, amount, multiplier, copy, TRUE, defer_update = defer_update, transferred_phases = MAT_PHASE_SOLID) + . = trans_to_holder(R, amount, multiplier, copy, TRUE, defer_update = defer_update, transferred_phases = MAT_PHASE_SOLID) R.touch_turf(target) target.dump_solid_reagents(R) qdel(R) @@ -890,16 +904,17 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new if(!target.reagents) target.create_reagents(FLUID_MAX_DEPTH) - trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update, transferred_phases = transferred_phases) + + . = trans_to_holder(target.reagents, amount, multiplier, copy, defer_update = defer_update, transferred_phases = transferred_phases) // Deferred updates are presumably being done by SSfluids. // Do an immediate fluid_act call rather than waiting for SSfluids to proc. - if(!defer_update) + if(!defer_update && target.reagents.total_volume >= FLUID_PUDDLE) target.fluid_act(target.reagents) // Objects may or may not have reagents; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. /datum/reagents/proc/trans_to_obj(var/obj/target, var/amount = 1, var/multiplier = 1, var/copy = 0, var/defer_update = FALSE, var/transferred_phases = (MAT_PHASE_LIQUID | MAT_PHASE_SOLID)) if(!target || !target.simulated) - return + return 0 if(!target.reagents) var/datum/reagents/R = new /datum/reagents(amount * multiplier, global.temp_reagents_holder) @@ -912,6 +927,12 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new /* Atom reagent creation - use it all the time */ +/datum/reagents/proc/get_skimmable_reagents() + for(var/mat in reagent_volumes) + var/decl/material/reagent = GET_DECL(mat) + if(reagent.skimmable) + LAZYADD(., mat) + /atom/proc/create_reagents(var/max_vol) if(reagents) log_debug("Attempted to create a new reagents holder when already referencing one: [log_info_line(src)]") @@ -931,4 +952,4 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/decl/material/newreagent = GET_DECL(reagent_type) if(!istype(newreagent)) return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index eaac5570598..e304fbec91e 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -223,7 +223,7 @@ . += "

    Description:
    " if(detailed_blood && istype(reagent, /decl/material/liquid/blood)) var/blood_data = REAGENT_DATA(beaker?.reagents, /decl/material/liquid/blood) - . += "Blood Type: [LAZYACCESS(blood_data, DATA_BLOOD_TYPE)]
    DNA: [LAZYACCESS(blood_data, "blood.DNA")]" + . += "Blood Type: [LAZYACCESS(blood_data, DATA_BLOOD_TYPE)]
    DNA: [LAZYACCESS(blood_data, DATA_BLOOD_DNA)]" else . += "[reagent.lore_text]" . += "


    (Back)" @@ -254,7 +254,7 @@ spawn() has_sprites += user.client for(var/i = 1 to MAX_PILL_SPRITE) - send_rsc(usr, icon('icons/obj/items/chem/pill.dmi', "pill" + num2text(i)), "pill[i].png") + send_rsc(user, icon('icons/obj/items/chem/pill.dmi', "pill" + num2text(i)), "pill[i].png") var/dat = list() dat += "[name]" dat += "[name] Menu:" diff --git a/code/modules/reagents/Chemistry-Metabolism.dm b/code/modules/reagents/Chemistry-Metabolism.dm index e1002809b1f..9c78f190ca2 100644 --- a/code/modules/reagents/Chemistry-Metabolism.dm +++ b/code/modules/reagents/Chemistry-Metabolism.dm @@ -20,7 +20,7 @@ parent = null return ..() -/datum/reagents/metabolism/proc/metabolize(var/list/dosage_tracker) +/datum/reagents/metabolism/proc/metabolize(list/dosage_tracker) if(!parent || total_volume < MINIMUM_CHEMICAL_VOLUME || !length(reagent_volumes)) return for(var/rtype in reagent_volumes) diff --git a/code/modules/reagents/Chemistry-Taste.dm b/code/modules/reagents/Chemistry-Taste.dm index 46889757994..73b25e51cd5 100644 --- a/code/modules/reagents/Chemistry-Taste.dm +++ b/code/modules/reagents/Chemistry-Taste.dm @@ -72,4 +72,4 @@ calculate text size per text. for(var/taste_desc in cocktail.tastes) var/taste_power = cocktail.tastes[taste_desc] * cocktail_volume tastes[taste_desc] += taste_power - return tastes \ No newline at end of file + return tastes diff --git a/code/modules/reagents/chems/chems_ethanol.dm b/code/modules/reagents/chems/chems_alcohol.dm similarity index 84% rename from code/modules/reagents/chems/chems_ethanol.dm rename to code/modules/reagents/chems/chems_alcohol.dm index dc5b4215ff3..44384d64365 100644 --- a/code/modules/reagents/chems/chems_ethanol.dm +++ b/code/modules/reagents/chems/chems_alcohol.dm @@ -1,34 +1,30 @@ -/decl/material/liquid/ethanol - name = "ethanol" //Parent class for all alcoholic reagents. - lore_text = "A well-known alcohol with a variety of applications." - taste_description = "pure alcohol" +/decl/material/liquid/alcohol + abstract_type = /decl/material/liquid/alcohol color = "#404030" touch_met = 5 ignition_point = T0C+150 accelerant_value = FUEL_VALUE_ACCELERANT solvent_power = MAT_SOLVENT_MODERATE - uid = "chem_ethanol" - boiling_point = T0C + 78.37 + boiling_point = null // Pure ethanol boils, the rest has to separate first. - heating_message = "boils away its ethanol content, leaving pure water." + heating_message = "boils away its water content, leaving pure alcohol." heating_point = T0C + 78.37 heating_products = list( - /decl/material/liquid/ethanol = 0.75, - /decl/material/liquid/water = 0.25 + /decl/material/liquid/alcohol/ethanol = 0.75, + /decl/material/liquid/water = 0.25 ) - bypass_heating_products_for_root_type = /decl/material/liquid/ethanol - chilling_message = "separates as its water content freezes, leaving pure ethanol." + chilling_message = "separates as its water content freezes, leaving pure alcohol." chilling_point = T0C chilling_products = list( - /decl/material/liquid/ethanol = 0.75, - /decl/material/solid/ice = 0.25 + /decl/material/liquid/alcohol/ethanol = 0.75, + /decl/material/solid/ice = 0.25 ) - bypass_chilling_products_for_root_type = /decl/material/liquid/ethanol affect_blood_on_ingest = FALSE // prevents automatic toxins/inebriation as though injected affect_blood_on_inhale = FALSE - can_boil_to_gas = TRUE + + value = 1.2 var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity. var/alcohol_toxicity = 1 @@ -36,28 +32,18 @@ var/targ_temp = 310 var/halluci = 0 - glass_name = "ethanol" - glass_desc = "A well-known alcohol with a variety of applications." - value = 1.2 - -/decl/material/liquid/ethanol/Initialize() - . = ..() - // Impure ethanol doesn't boil, it has to separate first. - if(type != bypass_heating_products_for_root_type) - boiling_point = null - -/decl/material/liquid/ethanol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() M.take_damage(removed * 2 * alcohol_toxicity, TOX) M.add_chemical_effect(CE_ALCOHOL_TOXIC, alcohol_toxicity) -/decl/material/liquid/ethanol/affect_inhale(mob/living/M, removed, datum/reagents/holder) +/decl/material/liquid/alcohol/affect_inhale(mob/living/M, removed, datum/reagents/holder) if(M.has_trait(/decl/trait/metabolically_inert)) return ..() affect_ingest(M, removed, holder) // a bit of a hack, but it avoids code duplication -/decl/material/liquid/ethanol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) if(M.has_trait(/decl/trait/metabolically_inert)) return @@ -98,7 +84,28 @@ if(halluci) M.adjust_hallucination(halluci, halluci) -/decl/material/liquid/ethanol/absinthe +// Somewhat a dummy type for 'pure ethanol' to avoid having to set dirtiness/heating products/etc on literally everything else. +/decl/material/liquid/alcohol/ethanol + name = "ethanol" + lore_text = "A well-known alcohol with a variety of applications." + taste_description = "pure alcohol" + glass_name = "ethanol" + glass_desc = "A well-known alcohol with a variety of applications." + dirtiness = DIRTINESS_STERILE + uid = "chem_ethanol" + + // Uncomment when refining spirits is less annoying, specifically when we have more precise temperature control. + // boiling_point = T0C + 78.37 + // can_boil_to_gas = TRUE + // temperature_burn_milestone_material = /decl/material/liquid/alcohol/ethanol + + // Pure ethanol does not separate. + heating_point = null + heating_products = null + chilling_point = null + chilling_products = null + +/decl/material/liquid/alcohol/absinthe name = "absinthe" lore_text = "Watch out that the Green Fairy doesn't come for you!" taste_description = "death and licorice" @@ -112,7 +119,7 @@ glass_desc = "Wormwood, anise, oh my." uid = "chem_ethanol_absinthe" -/decl/material/liquid/ethanol/ale +/decl/material/liquid/alcohol/ale name = "ale" lore_text = "A dark alchoholic beverage made by malted barley and yeast." taste_description = "hearty barley ale" @@ -125,7 +132,7 @@ glass_desc = "A freezing container of delicious ale" uid = "chem_ethanol_ale" -/decl/material/liquid/ethanol/beer +/decl/material/liquid/alcohol/beer name = "beer" codex_name = "plain beer" lore_text = "An alcoholic beverage made from malted grains, hops, yeast, and water." @@ -140,18 +147,18 @@ glass_desc = "A freezing container of beer" uid = "chem_ethanol_beer" -/decl/material/liquid/ethanol/beer/good +/decl/material/liquid/alcohol/beer/good uid = "chem_ethanol_beer_good" codex_name = "premium beer" taste_description = "beer" -/decl/material/liquid/ethanol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/beer/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) return ADJ_STATUS(M, STAT_JITTER, -3) -/decl/material/liquid/ethanol/bluecuracao +/decl/material/liquid/alcohol/bluecuracao name = "blue curacao" lore_text = "Exotically blue, fruity drink, distilled from oranges." taste_description = "oranges" @@ -165,7 +172,7 @@ glass_name = "blue curacao" glass_desc = "Exotically blue, fruity drink, distilled from oranges." -/decl/material/liquid/ethanol/cognac +/decl/material/liquid/alcohol/cognac name = "cognac" lore_text = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." taste_description = "rich and smooth alcohol" @@ -179,7 +186,7 @@ glass_name = "cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." -/decl/material/liquid/ethanol/gin +/decl/material/liquid/alcohol/gin name = "gin" lore_text = "It's gin. In space. I say, good sir." taste_description = "an alcoholic christmas tree" @@ -193,7 +200,7 @@ glass_desc = "A crystal clear glass of Griffeater gin." //Base type for alchoholic drinks containing coffee -/decl/material/liquid/ethanol/coffee +/decl/material/liquid/alcohol/coffee name = "coffee liqueur" lore_text = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" taste_description = "spiked coffee" @@ -207,7 +214,7 @@ glass_desc = "Guaranteed to perk you up." overdose = 45 -/decl/material/liquid/ethanol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/coffee/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -219,10 +226,10 @@ if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) -/decl/material/liquid/ethanol/coffee/affect_overdose(mob/living/M, total_dose) - ADJ_STATUS(M, STAT_JITTER, 5) +/decl/material/liquid/alcohol/coffee/affect_overdose(mob/living/victim, total_dose) + ADJ_STATUS(victim, STAT_JITTER, 5) -/decl/material/liquid/ethanol/melonliquor +/decl/material/liquid/alcohol/melonliquor name = "melon liqueur" lore_text = "A relatively sweet and fruity 46 proof liqueur." taste_description = "fruity alcohol" @@ -235,7 +242,7 @@ glass_name = "melon liqueur" glass_desc = "A relatively sweet and fruity 46 proof liquor." -/decl/material/liquid/ethanol/rum +/decl/material/liquid/alcohol/rum name = "dark rum" lore_text = "Yohoho and all that." taste_description = "spiked butterscotch" @@ -249,7 +256,7 @@ glass_name = "rum" glass_desc = "Now you want to Pray for a pirate suit, don't you?" -/decl/material/liquid/ethanol/sake +/decl/material/liquid/alcohol/sake name = "sake" lore_text = "Anime's favorite drink." taste_description = "dry alcohol" @@ -262,7 +269,7 @@ glass_name = "sake" glass_desc = "A glass of sake." -/decl/material/liquid/ethanol/tequila +/decl/material/liquid/alcohol/tequila name = "tequila" lore_text = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" taste_description = "paint stripper" @@ -275,7 +282,7 @@ glass_name = "tequila" glass_desc = "Now all that's missing is the weird colored shades!" -/decl/material/liquid/ethanol/thirteenloko +/decl/material/liquid/alcohol/thirteenloko name = "Thirteen Loko" lore_text = "A potent mixture of caffeine and alcohol." taste_description = "jitters and death" @@ -289,7 +296,7 @@ glass_name = "Thirteen Loko" glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." -/decl/material/liquid/ethanol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/thirteenloko/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -301,7 +308,7 @@ ADJ_STATUS(M, STAT_JITTER, 5) M.add_chemical_effect(CE_PULSE, 2) -/decl/material/liquid/ethanol/vermouth +/decl/material/liquid/alcohol/vermouth name = "vermouth" lore_text = "You suddenly feel a craving for a martini..." taste_description = "dry alcohol" @@ -315,7 +322,7 @@ glass_name = "vermouth" glass_desc = "You wonder why you're even drinking this straight." -/decl/material/liquid/ethanol/vodka +/decl/material/liquid/alcohol/vodka name = "vodka" codex_name = "plain vodka" lore_text = "Number one drink AND fueling choice for Independents around the galaxy." @@ -329,7 +336,7 @@ glass_name = "vodka" glass_desc = "The glass contain wodka. Xynta." -/decl/material/liquid/ethanol/vodka/premium +/decl/material/liquid/alcohol/vodka/premium name = "premium vodka" codex_name = null lore_text = "Premium distilled vodka imported directly from the Gilgamesh Colonial Confederation." @@ -340,7 +347,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_premiumvodka" -/decl/material/liquid/ethanol/whiskey +/decl/material/liquid/alcohol/whiskey name = "malt whiskey" lore_text = "A superb and well-aged single-malt whiskey. Damn." taste_description = "molasses" @@ -353,7 +360,7 @@ glass_name = "whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." -/decl/material/liquid/ethanol/wine +/decl/material/liquid/alcohol/wine name = "red wine" lore_text = "An premium alchoholic beverage made from distilled grape juice." taste_description = "bitter sweetness" @@ -366,7 +373,7 @@ glass_name = "red wine" glass_desc = "A very classy looking drink." -/decl/material/liquid/ethanol/wine/premium +/decl/material/liquid/alcohol/wine/premium name = "white wine" lore_text = "An exceptionally expensive alchoholic beverage made from distilled white grapes." taste_description = "white velvet" @@ -376,7 +383,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_whitewine" -/decl/material/liquid/ethanol/herbal +/decl/material/liquid/alcohol/herbal name = "herbal liquor" lore_text = "A complex blend of herbs, spices and roots mingle in this old Earth classic." taste_description = "a sweet summer garden" @@ -389,7 +396,7 @@ glass_name = "herbal liquor" glass_desc = "It's definitely green. Or is it yellow?" -/decl/material/liquid/ethanol/hooch +/decl/material/liquid/alcohol/hooch name = "hooch" lore_text = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" taste_description = "pure resignation" @@ -403,7 +410,7 @@ glass_name = "Hooch" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." -/decl/material/liquid/ethanol/irish_cream +/decl/material/liquid/alcohol/irish_cream name = "Irish cream" lore_text = "Whiskey-imbued cream." taste_description = "creamy alcohol" @@ -416,7 +423,7 @@ glass_name = "Irish cream" glass_desc = "It's cream, mixed with whiskey." -/decl/material/liquid/ethanol/mead +/decl/material/liquid/alcohol/mead name = "mead" lore_text = "A Viking's drink, though a cheap one." taste_description = "sweet, sweet alcohol" @@ -430,7 +437,7 @@ glass_name = "mead" glass_desc = "A Viking's beverage, though a cheap one." -/decl/material/liquid/ethanol/moonshine +/decl/material/liquid/alcohol/moonshine name = "moonshine" lore_text = "You've really hit rock bottom now... your liver packed its bags and left last night." taste_description = "bitterness" @@ -444,7 +451,7 @@ glass_name = "moonshine" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." -/decl/material/liquid/ethanol/pwine +/decl/material/liquid/alcohol/pwine name = "poison wine" lore_text = "Is this even wine? Toxic! Hallucinogenic! Probably consumed in boatloads by your superiors!" taste_description = "purified alcoholic death" @@ -458,7 +465,7 @@ exoplanet_rarity_gas = MAT_RARITY_NOWHERE uid = "chem_ethanol_poisonwine" -/decl/material/liquid/ethanol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/alcohol/pwine/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) ..() if(M.has_trait(/decl/trait/metabolically_inert)) @@ -476,7 +483,7 @@ else heart.take_internal_damage(100, 0) -/decl/material/liquid/ethanol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now +/decl/material/liquid/alcohol/aged_whiskey // I have no idea what this is and where it comes from. //It comes from Dinnlan now name = "aged whiskey" lore_text = "A well-aged whiskey of high quality. Probably imported. Just a sip'll do it, but that burn will leave you wanting more." color = "#523600" @@ -488,7 +495,7 @@ glass_name = "aged whiskey" glass_desc = "A well-aged whiskey of high quality. Probably imported." -/decl/material/liquid/ethanol/cider_apple +/decl/material/liquid/alcohol/cider_apple name = "apple cider" lore_text = "A refreshing glass of apple cider." taste_description = "cool apple cider" @@ -501,7 +508,7 @@ glass_name = "apple cider" glass_desc = "A refreshing glass of apple cider." -/decl/material/liquid/ethanol/cider_pear +/decl/material/liquid/alcohol/cider_pear name = "pear cider" lore_text = "A refreshing glass of pear cider." taste_description = "cool pear cider" @@ -514,7 +521,7 @@ glass_name = "pear cider" glass_desc = "A refreshing glass of pear cider." -/decl/material/liquid/ethanol/champagne +/decl/material/liquid/alcohol/champagne name = "champagne" lore_text = "Smooth sparkling wine, produced in the same region of France as it has been for centuries." taste_description = "bitterness and fizz" @@ -528,7 +535,7 @@ glass_desc = "Sparkling white wine, produced in the same region of France as it has been for centuries." glass_special = list(DRINK_FIZZ) -/decl/material/liquid/ethanol/jagermeister +/decl/material/liquid/alcohol/jagermeister name = "Jagermeister" lore_text = "A special blend of alcohol, herbs, and spices. It has remained a popular Earther drink." taste_description = "herbs, spices, and alcohol" @@ -541,7 +548,7 @@ glass_name = "jagermeister" glass_desc = "A special blend of alcohol, herbs, and spices. It has remained a popular Earther drink." -/decl/material/liquid/ethanol/kvass +/decl/material/liquid/alcohol/kvass name = "kvass" lore_text = "An alcoholic drink commonly made from bread." taste_description = "vkusnyy kvas, ypa!" diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index e3a08e5b873..ab5f8e6dd8e 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -46,12 +46,12 @@ for(var/chem in other_chems) my_chems[chem] = my_chems[chem] + other_chems[chem] -/decl/material/liquid/blood/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/blood/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) var/data = REAGENT_DATA(holder, type) - if(!istype(T) || REAGENT_VOLUME(holder, type) < 3) + if(!istype(touching_turf) || REAGENT_VOLUME(holder, type) < 3) return - var/weakref/W = LAZYACCESS(data, DATA_BLOOD_DONOR) - blood_splatter(T, W?.resolve() || holder.my_atom, 1) + var/weakref/donor = LAZYACCESS(data, DATA_BLOOD_DONOR) + blood_splatter(touching_turf, donor?.resolve() || holder.my_atom, 1) /decl/material/liquid/blood/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() @@ -72,7 +72,7 @@ /decl/material/liquid/blood/get_reagent_color(datum/reagents/holder) var/list/blood_data = REAGENT_DATA(holder, type) - return blood_data?["blood_color"] || ..() + return blood_data?[DATA_BLOOD_COLOR] || ..() /decl/material/liquid/coagulated_blood name = "coagulated blood" diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index 829ba1df5b2..1558ef76762 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -35,11 +35,11 @@ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/human, update_eyes)), 5 SECONDS) . = ..() -/decl/material/liquid/glowsap/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/glowsap/affect_overdose(mob/living/victim, total_dose) . = ..() - M.add_chemical_effect(CE_TOXIN, 1) - M.set_hallucination(60, 20) - SET_STATUS_MAX(M, STAT_DRUGGY, 10) + victim.add_chemical_effect(CE_TOXIN, 1) + victim.set_hallucination(60, 20) + SET_STATUS_MAX(victim, STAT_DRUGGY, 10) /decl/material/solid/blackpepper name = "black pepper" diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index 77c2b2c99d0..eca5276b785 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -9,6 +9,7 @@ nutriment_factor = 0 hydration_factor = 6 affect_blood_on_ingest = FALSE + affect_blood_on_inhale = FALSE var/adj_dizzy = 0 // Per tick var/adj_drowsy = 0 @@ -177,15 +178,16 @@ allergen_flags = ALLERGEN_VEGETABLE /decl/material/liquid/drink/juice/garlic - name = "garlic juice" - lore_text = "Who would even drink this?" + name = "garlic oil" + lore_text = "A strong-smelling, pungent oil pressed from garlic cloves. It has some antibiotic properties, and can help with infections." taste_description = "bad breath" nutriment_factor = 1 color = "#eeddcc" uid = "chem_drink_garlic" + antibiotic_strength = 0.65 - glass_name = "garlic juice" - glass_desc = "Who would even drink juice from garlic?" + glass_name = "garlic oil" + glass_desc = "A potion of guaranteed bad breath." allergen_flags = ALLERGEN_ALLIUM /decl/material/liquid/drink/juice/onion @@ -307,6 +309,7 @@ taste_description = "creamy milk" color = "#dfd7af" uid = "chem_drink_cream" + skimmable = TRUE glass_name = "cream" glass_desc = "Ewwww..." @@ -376,9 +379,9 @@ ..() M.add_chemical_effect(CE_PULSE, 2) -/decl/material/liquid/drink/coffee/affect_overdose(mob/living/M, total_dose) - ADJ_STATUS(M, STAT_JITTER, 5) - M.add_chemical_effect(CE_PULSE, 1) +/decl/material/liquid/drink/coffee/affect_overdose(mob/living/victim, total_dose) + ADJ_STATUS(victim, STAT_JITTER, 5) + victim.add_chemical_effect(CE_PULSE, 1) /decl/material/liquid/drink/coffee/build_presentation_name_from_reagents(var/obj/item/prop, var/supplied) diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm index 9d36a9a5ae3..e9345200297 100644 --- a/code/modules/reagents/chems/chems_drugs.dm +++ b/code/modules/reagents/chems/chems_drugs.dm @@ -61,9 +61,9 @@ LAZYSET(holder.reagent_data, type, world.time) to_chat(M, "You feel invigorated and calm.") -/decl/material/liquid/nicotine/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/nicotine/affect_overdose(mob/living/victim, total_dose) ..() - M.add_chemical_effect(CE_PULSE, 2) + victim.add_chemical_effect(CE_PULSE, 2) /decl/material/liquid/sedatives name = "sedatives" @@ -253,10 +253,9 @@ if(istype(M)) M.remove_client_color(/datum/client_color/noir/thirdeye) -/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) - M.take_damage(rand(1, 5), BRAIN) - if(ishuman(M) && prob(10)) - var/mob/living/human/H = M - H.seizure() +/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/victim, total_dose) + victim.take_damage(rand(1, 5), BRAIN) + if(prob(10)) + victim.seizure() if(prob(10)) - to_chat(M, SPAN_DANGER("[pick(overdose_messages)]")) + to_chat(victim, SPAN_DANGER("[pick(overdose_messages)]")) diff --git a/code/modules/reagents/chems/chems_herbal.dm b/code/modules/reagents/chems/chems_herbal.dm index f9f7d7bb480..676142113fb 100644 --- a/code/modules/reagents/chems/chems_herbal.dm +++ b/code/modules/reagents/chems/chems_herbal.dm @@ -15,10 +15,16 @@ /decl/material/liquid/antitoxins/ginseng name = "powdered ginseng" uid = "chem_antitoxins_herbal" - lore_text = "Ginseng root has curative properties and encourages organ recovery after poisoning." + lore_text = "Ginseng root has curative properties and encourages organ recovery and restoration of blood volume after poisoning or blood loss." taste_description = "bitter herbs" antitoxin_strength = 0.35 +/decl/material/liquid/antitoxins/ginseng/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) + . = ..() + if(M.has_trait(/decl/trait/metabolically_inert)) + return + M.add_chemical_effect(CE_BLOODRESTORE, 8 * removed) + /decl/material/liquid/sedatives/valerian name = "powdered valerian flower" uid = "chem_sedatives_herbal" diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 5724175fbce..7b8357a1767 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -52,14 +52,12 @@ uid = "chem_styptic" var/effectiveness = 1 -/decl/material/liquid/brute_meds/affect_overdose(mob/living/M, var/datum/reagents/holder) +/decl/material/liquid/brute_meds/affect_overdose(mob/living/victim, total_dose) ..() - if(ishuman(M)) - M.add_chemical_effect(CE_BLOCKAGE, (15 + REAGENT_VOLUME(holder, type))/100) - var/mob/living/human/H = M - for(var/obj/item/organ/external/E in H.get_external_organs()) - if(E.status & ORGAN_ARTERY_CUT && prob(2 + REAGENT_VOLUME(holder, type) / overdose)) - E.status &= ~ORGAN_ARTERY_CUT + victim.add_chemical_effect(CE_BLOCKAGE, (15 + total_dose) / 100) + for(var/obj/item/organ/external/limb in victim.get_external_organs()) + if((limb.status & ORGAN_ARTERY_CUT) && prob(2 + total_dose / overdose)) + limb.status &= ~ORGAN_ARTERY_CUT //This is a logistic function that effectively doubles the healing rate as brute amounts get to around 200. Any injury below 60 is essentially unaffected and there's a scaling inbetween. #define ADJUSTED_REGEN_VAL(X) (6+(6/(1+200*2.71828**(-0.05*(X))))) @@ -169,12 +167,10 @@ if(immunity_to_add > 0) M.adjust_immunity(immunity_to_add) // Rapidly brings someone up to half immunity. -/decl/material/liquid/immunobooster/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/immunobooster/affect_overdose(mob/living/victim, total_dose) ..() - M.add_chemical_effect(CE_TOXIN, 1) - var/mob/living/human/H = M - if(istype(H)) - M.adjust_immunity(-0.5) + victim.add_chemical_effect(CE_TOXIN, 1) + victim.adjust_immunity(-0.5) /decl/material/liquid/stimulants name = "stimulants" @@ -236,25 +232,16 @@ overdose = REAGENTS_OVERDOSE/2 scannable = 1 value = 1.5 + antibiotic_strength = 1 exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_antibiotics" -/decl/material/liquid/antibiotics/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) - var/volume = REAGENT_VOLUME(holder, type) - . = ..() - M.adjust_immunity(-0.1) - M.add_chemical_effect(CE_ANTIBIOTIC, 1) - if(volume > 10) - M.adjust_immunity(-0.3) - if(LAZYACCESS(M.chem_doses, type) > 15) - M.adjust_immunity(-0.25) - -/decl/material/liquid/antibiotics/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/antibiotics/affect_overdose(mob/living/victim, total_dose) ..() - M.adjust_immunity(-0.5) - M.immunity = max(M.immunity - 0.25, 0) + victim.adjust_immunity(-0.5) + victim.immunity = max(victim.immunity - 0.25, 0) if(prob(2)) - M.immunity_norm = max(M.immunity_norm - 1, 0) + victim.immunity_norm = max(victim.immunity_norm - 1, 0) /decl/material/liquid/retrovirals name = "retrovirals" @@ -267,14 +254,12 @@ exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_retrovirals" -/decl/material/liquid/retrovirals/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/retrovirals/affect_overdose(mob/living/victim, total_dose) . = ..() - if(ishuman(M)) - var/mob/living/human/H = M - for(var/obj/item/organ/external/E in H.get_external_organs()) - if(!BP_IS_PROSTHETIC(E) && prob(25) && !(E.status & ORGAN_MUTATED)) - E.mutate() - E.limb_flags |= ORGAN_FLAG_DEFORMED + for(var/obj/item/organ/external/limb in victim.get_external_organs()) + if(!BP_IS_PROSTHETIC(limb) && prob(25) && !(limb.status & ORGAN_MUTATED)) + limb.mutate() + limb.limb_flags |= ORGAN_FLAG_DEFORMED /decl/material/liquid/retrovirals/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() @@ -413,8 +398,8 @@ break ..() -/decl/material/liquid/clotting_agent/affect_overdose(mob/living/M, total_dose) - var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(M, BP_HEART) +/decl/material/liquid/clotting_agent/affect_overdose(mob/living/victim, total_dose) + var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(victim, BP_HEART) if(heart && prob(25)) heart.take_general_damage(rand(1,3)) return ..() diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 802b96c7992..cc0774431ca 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -12,6 +12,8 @@ fishing_bait_value = 0.65 compost_value = 1 nutriment_factor = 10 + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 // Technically a room-temperature solid, but saves // repathing it to /solid all over the codebase. @@ -60,19 +62,6 @@ uid = "chem_nutriment_plant" allergen_flags = ALLERGEN_VEGETABLE -/decl/material/liquid/nutriment/plant_oil - name = "plant oil" - lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." - uid = "chem_nutriment_plant_oil" - melting_point = 273 - boiling_point = 373 - taste_description = "oily blandness" - burn_product = /decl/material/gas/carbon_monoxide - ignition_point = T0C+150 - accelerant_value = FUEL_VALUE_ACCELERANT - gas_flags = XGM_GAS_FUEL - allergen_flags = ALLERGEN_VEGETABLE - /decl/material/liquid/nutriment/honey name = "honey" lore_text = "A golden yellow syrup, loaded with sugary sweetness." @@ -94,9 +83,9 @@ uid = "chem_nutriment_flour" allergen_flags = ALLERGEN_GLUTEN -/decl/material/liquid/nutriment/flour/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/nutriment/flour/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) ..() - new /obj/effect/decal/cleanable/flour(T) + new /obj/effect/decal/cleanable/flour(touching_turf) /decl/material/liquid/nutriment/batter name = "batter" @@ -113,9 +102,9 @@ boiling_point = 373 allergen_flags = ALLERGEN_EGG | ALLERGEN_GLUTEN -/decl/material/liquid/nutriment/batter/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/nutriment/batter/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) ..() - new /obj/effect/decal/cleanable/pie_smudge(T) + new /obj/effect/decal/cleanable/pie_smudge(touching_turf) /decl/material/liquid/nutriment/batter/cakebatter name = "cake batter" @@ -307,19 +296,6 @@ boiling_point = 373 allergen_flags = ALLERGEN_FRUIT -/decl/material/liquid/nutriment/cornoil - name = "corn oil" - lore_text = "An oil derived from various types of corn." - taste_description = "slime" - taste_mult = 0.1 - nutriment_factor = 20 - color = "#302000" - slipperiness = 8 - uid = "chem_nutriment_cornoil" - melting_point = 273 - boiling_point = 373 - allergen_flags = ALLERGEN_VEGETABLE - /decl/material/liquid/nutriment/sprinkles name = "sprinkles" lore_text = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." diff --git a/code/modules/reagents/chems/chems_oil.dm b/code/modules/reagents/chems/chems_oil.dm new file mode 100644 index 00000000000..ad359dd61ca --- /dev/null +++ b/code/modules/reagents/chems/chems_oil.dm @@ -0,0 +1,52 @@ +/decl/material/liquid/oil + name = "fuel oil" // paraffin etc + lore_text = "Clarified fuel oil, perfect for fuelling a lantern." + burn_product = /decl/material/gas/carbon_monoxide + ignition_point = T0C+150 + accelerant_value = FUEL_VALUE_ACCELERANT + gas_flags = XGM_GAS_FUEL + melting_point = 273 + boiling_point = 373 + uid = "chem_oil_lamp" + color = "#664330" + value = 1.5 + fishing_bait_value = 0 + taste_mult = 4 + metabolism = REM * 4 + exoplanet_rarity_gas = MAT_RARITY_NOWHERE + affect_blood_on_ingest = 0 + affect_blood_on_inhale = 0 + slipperiness = 8 + +/decl/material/liquid/oil/plant + name = "plant oil" + lore_text = "A thin yellow oil pressed from vegetables or nuts. Useful as fuel, or in cooking." + uid = "chem_oil_plant" + taste_description = "oily blandness" + allergen_flags = ALLERGEN_VEGETABLE + compost_value = 1 + nutriment_factor = 8 + +/decl/material/liquid/oil/plant/corn + name = "corn oil" + lore_text = "An oil derived from various types of corn." + taste_description = "slime" + nutriment_factor = 20 + color = "#302000" + uid = "chem_oil_corn" + taste_mult = 0.1 + +/decl/material/liquid/oil/fish + name = "fish oil" + lore_text = "A pungent yellow oil pressed from fish meat and fish skin. Useful as fuel, or in cooking, or for encouraging recovery after brain injuries." + uid = "chem_oil_fish" + taste_description = "pungent, oily fish" + allergen_flags = ALLERGEN_FISH + compost_value = 1 + nutriment_factor = 6 + +// Copied from neuroannealer; yes, it's silly, but we need a way to treat brain damage on the medieval map. +// Should possibly be an ingredient rather than the be-all end-all medication. +/decl/material/liquid/oil/fish/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) + . = ..() + M.add_chemical_effect(CE_BRAIN_REGEN, 0.5) // Half as effective as neuroannealer, without the side-effects. diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index dc75c84c4ad..8ab62f4048f 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -112,17 +112,17 @@ M.add_chemical_effect(CE_ALCOHOL_TOXIC, 1) M.add_chemical_effect(CE_BREATHLOSS, 1 * boozed) //drinking and opiating suppresses breathing. -/decl/material/liquid/painkillers/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/painkillers/affect_overdose(mob/living/victim, total_dose) ..() - M.add_chemical_effect(CE_PAINKILLER, pain_power*0.5) //extra painkilling for extra trouble + victim.add_chemical_effect(CE_PAINKILLER, pain_power*0.5) //extra painkilling for extra trouble if(narcotic) - SET_STATUS_MAX(M, STAT_DRUGGY, 10) - M.set_hallucination(120, 30) - M.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*2) //ODing on opiates can be deadly. - if(isboozed(M)) - M.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*4) //Don't drink and OD on opiates folks + SET_STATUS_MAX(victim, STAT_DRUGGY, 10) + victim.set_hallucination(120, 30) + victim.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*2) //ODing on opiates can be deadly. + if(isboozed(victim)) + victim.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*4) //Don't drink and OD on opiates folks else - M.add_chemical_effect(CE_TOXIN, 1) + victim.add_chemical_effect(CE_TOXIN, 1) /decl/material/liquid/painkillers/proc/isboozed(var/mob/living/M) . = 0 @@ -132,7 +132,7 @@ if(ingested) var/list/pool = M.reagents.reagent_volumes | ingested.reagent_volumes for(var/rtype in pool) - var/decl/material/liquid/ethanol/booze = GET_DECL(rtype) + var/decl/material/liquid/alcohol/booze = GET_DECL(rtype) if(!istype(booze) ||LAZYACCESS(M.chem_doses, rtype) < 2) //let them experience false security at first continue . = 1 diff --git a/code/modules/reagents/chems/chems_pigments.dm b/code/modules/reagents/chems/chems_pigments.dm index d110680a76e..55c6be4c47c 100644 --- a/code/modules/reagents/chems/chems_pigments.dm +++ b/code/modules/reagents/chems/chems_pigments.dm @@ -85,9 +85,9 @@ 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_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) + if(istype(touching_turf) && !isspaceturf(touching_turf)) + remove_paint(touching_turf, holder) /decl/material/liquid/paint_stripper/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) if(istype(O)) @@ -107,20 +107,20 @@ uid = "chem_pigment_paint" exoplanet_rarity_gas = MAT_RARITY_NOWHERE -/decl/material/liquid/paint/proc/apply_paint(var/atom/painting, var/datum/reagents/holder) - if(istype(painting) && istype(holder)) +/decl/material/liquid/paint/proc/apply_paint(var/atom/painting, var/datum/reagents/holder, var/threshold = 1) + if(istype(painting) && istype(holder) && REAGENT_VOLUME(holder, type) >= threshold) var/keep_alpha = painting.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)) - apply_paint(T, holder) +/decl/material/liquid/paint/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) + if(istype(touching_turf) && !isspaceturf(touching_turf)) + apply_paint(touching_turf, holder, FLUID_MINIMUM_TRANSFER) /decl/material/liquid/paint/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) if(istype(O)) - apply_paint(O, holder) + apply_paint(O, holder, O.get_object_size()) /decl/material/liquid/paint/touch_mob(var/mob/living/M, var/amount, var/datum/reagents/holder) if(istype(M)) - apply_paint(M, holder) \ No newline at end of file + apply_paint(M, holder, M.get_object_size()) diff --git a/code/modules/reagents/chems/random/chems_random.dm b/code/modules/reagents/chems/random/chems_random.dm index 15eb9b92bf1..8efa3b54f8b 100644 --- a/code/modules/reagents/chems/random/chems_random.dm +++ b/code/modules/reagents/chems/random/chems_random.dm @@ -7,7 +7,7 @@ var/global/list/random_chem_interaction_blacklist = list( /decl/material/liquid/drink, /decl/material/liquid/random, /decl/material/solid/phoron, - /decl/material/liquid/ethanol // Includes alcoholic beverages + /decl/material/liquid/alcohol // Includes alcoholic beverages ) #define FOR_ALL_EFFECTS \ diff --git a/code/modules/reagents/chems/random/random_effects.dm b/code/modules/reagents/chems/random/random_effects.dm index af118872c97..0ef001eb16a 100644 --- a/code/modules/reagents/chems/random/random_effects.dm +++ b/code/modules/reagents/chems/random/random_effects.dm @@ -227,7 +227,7 @@ mode = RANDOM_CHEM_EFFECT_INT desc = "acute toxicity" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) +/decl/random_chem_effect/random_properties/tox_damage/affect_blood(var/mob/living/M, var/removed, var/value) M.take_damage(value * removed, TOX) /decl/random_chem_effect/random_properties/heal_brute @@ -243,7 +243,7 @@ maximum = 10 desc = "burn repair" -/decl/random_chem_effect/random_properties/heal_brute/affect_blood(var/mob/living/M, var/removed, var/value) +/decl/random_chem_effect/random_properties/heal_burns/affect_blood(var/mob/living/M, var/removed, var/value) M.heal_organ_damage(0, removed * value) #undef RANDOM_CHEM_EFFECT_TRUE diff --git a/code/modules/reagents/cocktails.dm b/code/modules/reagents/cocktails.dm index 6e5effe3da2..b1c3a79b910 100644 --- a/code/modules/reagents/cocktails.dm +++ b/code/modules/reagents/cocktails.dm @@ -104,7 +104,7 @@ description = "Watered-down rum. Pirate approved!" ratios = list( /decl/material/liquid/water = 1, - /decl/material/liquid/ethanol/rum = 1 + /decl/material/liquid/alcohol/rum = 1 ) /decl/cocktail/screwdriver @@ -112,7 +112,7 @@ description = "A classic mixture of vodka and orange juice. Just the thing for the tired engineer." ratios = list( /decl/material/liquid/drink/juice/orange = 4, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/tequila_sunrise @@ -120,39 +120,39 @@ description = "A simple cocktail of tequila and orange juice. Much like a screwdriver." ratios = list( /decl/material/liquid/drink/juice/orange = 4, - /decl/material/liquid/ethanol/tequila = 1 + /decl/material/liquid/alcohol/tequila = 1 ) /decl/cocktail/classic_martini name = "gin martini" description = "Vermouth with gin. The classiest of all cocktails." ratios = list( - /decl/material/liquid/ethanol/gin = 4, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/gin = 4, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/vodka_martini name = "vodka martini" description = "A bastardisation of the classic martini. Still great." ratios = list( - /decl/material/liquid/ethanol/vodka = 4, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/vodka = 4, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/allies_cocktail name = "Allies Cocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." ratios = list( - /decl/material/liquid/ethanol/vermouth = 2, - /decl/material/liquid/ethanol/vodka = 2, - /decl/material/liquid/ethanol/gin = 2 + /decl/material/liquid/alcohol/vermouth = 2, + /decl/material/liquid/alcohol/vodka = 2, + /decl/material/liquid/alcohol/gin = 2 ) /decl/cocktail/bilk name = "bilk" description = "A foul brew of milk and beer. For alcoholics who fear osteoporosis." ratios = list( - /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/alcohol/beer = 1, /decl/material/liquid/drink/milk = 1 ) @@ -161,7 +161,7 @@ description = "A mild cocktail, widely considered an all-time classic." ratios = list( /decl/material/liquid/drink/tonic = 4, - /decl/material/liquid/ethanol/gin = 1 + /decl/material/liquid/alcohol/gin = 1 ) /decl/cocktail/cuba_libre @@ -169,24 +169,24 @@ description = "A classic mix of rum and cola." ratios = list( /decl/material/liquid/drink/cola = 4, - /decl/material/liquid/ethanol/rum = 1 + /decl/material/liquid/alcohol/rum = 1 ) /decl/cocktail/black_russian name = "black Russian" description = "Similar to a white Russian, but fit for the lactose-intolerant." ratios = list( - /decl/material/liquid/ethanol/vodka = 2, - /decl/material/liquid/ethanol/coffee = 1 + /decl/material/liquid/alcohol/vodka = 2, + /decl/material/liquid/alcohol/coffee = 1 ) /decl/cocktail/white_russian name = "white Russian" description = "A straightforward cocktail of coffee liqueur and vodka. Popular in a lot of places, but that's just, like, an opinion, man." ratios = list( - /decl/material/liquid/ethanol/coffee = 2, + /decl/material/liquid/alcohol/coffee = 2, /decl/material/liquid/drink/milk/cream, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/whiskey_cola @@ -194,7 +194,7 @@ description = "Whiskey mixed with cola. Quite refreshing." ratios = list( /decl/material/liquid/drink/cola = 4, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) /decl/cocktail/bloody_mary @@ -202,7 +202,7 @@ description = "A cocktail of vodka, tomato and lime juice. Celery stalk optional." ratios = list( /decl/material/liquid/drink/juice/tomato = 3, - /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/alcohol/vodka = 1, /decl/material/liquid/drink/juice/lime = 1 ) @@ -210,10 +210,10 @@ name = "The Livergeist" description = "A cocktail pioneered by a small cabal with a vendetta against the liver. Drink very carefully." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1 ) @@ -221,16 +221,16 @@ name = "Brave Bull" description = "A strong cocktail of tequila and coffee liquor." ratios = list( - /decl/material/liquid/ethanol/tequila = 2, - /decl/material/liquid/ethanol/coffee = 1 + /decl/material/liquid/alcohol/tequila = 2, + /decl/material/liquid/alcohol/coffee = 1 ) /decl/cocktail/toxins_special name = "Toxins Special" description = "Raise a glass to the bomb technicians of yesteryear, wherever their ashes now reside." ratios = list( - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vermouth = 1, + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vermouth = 1, /decl/material/solid/phoron ) @@ -238,7 +238,7 @@ name = "Beepsky Smash" description = "A cocktail originating with stationside security forces. Rumoured to take the edge off being stunned with your own baton." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, + /decl/material/liquid/alcohol/whiskey = 2, /decl/material/liquid/drink/juice/lime = 1, /decl/material/solid/metal/iron ) @@ -258,8 +258,8 @@ name = "The Manly Dorf" description = "A cocktail of old that claims to be for manly men, but is mostly for people who can't tell beer and ale apart." ratios = list( - /decl/material/liquid/ethanol/ale = 1, - /decl/material/liquid/ethanol/beer = 1 + /decl/material/liquid/alcohol/ale = 1, + /decl/material/liquid/alcohol/beer = 1 ) /decl/cocktail/irish_coffee @@ -267,16 +267,16 @@ description = "A cocktail of coffee, whiskey and cream, just the thing to kick you awake while also dulling the pain of existence." ratios = list( /decl/material/liquid/drink/coffee = 4, - /decl/material/liquid/ethanol/irish_cream = 1 + /decl/material/liquid/alcohol/irish_cream = 1 ) /decl/cocktail/b52 name = "B-52" description = "A semi-modern spin on an Irish coffee, featuring a dash of cognac. It will get you bombed." ratios = list( - /decl/material/liquid/ethanol/coffee = 1, - /decl/material/liquid/ethanol/irish_cream = 1, - /decl/material/liquid/ethanol/cognac = 1 + /decl/material/liquid/alcohol/coffee = 1, + /decl/material/liquid/alcohol/irish_cream = 1, + /decl/material/liquid/alcohol/cognac = 1 ) order_specific = TRUE // layered cocktail @@ -284,9 +284,9 @@ name = "Atomic Bomb" description = "A radioactive take on a B-52, popularized by asteroid miners with prosthetic organs and something to prove." ratios = list( - /decl/material/liquid/ethanol/coffee = 1, - /decl/material/liquid/ethanol/irish_cream = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/coffee = 1, + /decl/material/liquid/alcohol/irish_cream = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/solid/metal/uranium ) order_specific = TRUE // layered cocktail @@ -296,7 +296,7 @@ name = "margarita" description = "A classic cocktail of antiquity." ratios = list( - /decl/material/liquid/ethanol/tequila = 3, + /decl/material/liquid/alcohol/tequila = 3, /decl/material/liquid/drink/juice/lime = 1 ) @@ -305,10 +305,10 @@ description = "Most of the liquor cabinet, brought together in a delicious mix. Designed for middle-aged alcoholics." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/tequila = 1 + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/tequila = 1 ) /decl/cocktail/threemileisland @@ -316,10 +316,10 @@ description = "Much like the Atomic Bomb, this cocktail was adapted by asteroid miners who couldn't enjoy a drink without a dose of radiation poisoning." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/rum = 1, - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/tequila = 1, + /decl/material/liquid/alcohol/rum = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/tequila = 1, /decl/material/solid/metal/uranium ) @@ -328,23 +328,23 @@ description = "A simple cocktail, considered to be cultured and refined." ratios = list( /decl/material/liquid/drink/sodawater = 4, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) /decl/cocktail/manhattan name = "Manhattan" description = "Another classic cocktail of antiquity. Popular with private investigators." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, - /decl/material/liquid/ethanol/vermouth = 1 + /decl/material/liquid/alcohol/whiskey = 2, + /decl/material/liquid/alcohol/vermouth = 1 ) /decl/cocktail/manhattan_proj name = "Manhattan Project" description = "A classic cocktail with a spicy twist, pioneered by a robot detective." ratios = list( - /decl/material/liquid/ethanol/whiskey = 2, - /decl/material/liquid/ethanol/vermouth = 1, + /decl/material/liquid/alcohol/whiskey = 2, + /decl/material/liquid/alcohol/vermouth = 1, /decl/material/solid/metal/uranium ) @@ -353,14 +353,14 @@ description = "A simple, refreshing cocktail with a kick to it." ratios = list( /decl/material/liquid/drink/tonic = 4, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/gin_fizz name = "gin fizz" description = "A dry, refreshing cocktail with a tang of lime." ratios = list( - /decl/material/liquid/ethanol/gin = 2, + /decl/material/liquid/alcohol/gin = 2, /decl/material/liquid/drink/sodawater = 2, /decl/material/liquid/drink/juice/lime = 1 ) @@ -369,7 +369,7 @@ name = "Bahama Mama" description = "A sweet tropical cocktail that is deceptively strong." ratios = list( - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/juice/orange = 2, /decl/material/liquid/drink/juice/lime = 2, /decl/material/liquid/drink/grenadine = 1 @@ -379,8 +379,8 @@ name = "Singulo" description = "Traditionally thrown together from maintenance stills and used to treat singularity exposure in engineers who forgot their meson goggles." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/wine = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/wine = 1, /decl/material/solid/metal/radium ) @@ -388,7 +388,7 @@ name = "Demon's Blood" description = "A ghoulish cocktail that originated as a practical joke in a fringe habitat." ratios = list( - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/citrussoda = 2, /decl/material/liquid/drink/cherrycola = 2, /decl/material/liquid/blood = 1 @@ -399,7 +399,7 @@ description = "A thick and creamy cocktail." ratios = list( /decl/material/liquid/drink/milk/cream = 2, - /decl/material/liquid/ethanol/rum = 2, + /decl/material/liquid/alcohol/rum = 2, /decl/material/liquid/drink/juice/banana = 1, /decl/material/liquid/drink/juice/watermelon = 1 ) @@ -408,7 +408,7 @@ name = "Anti-freeze" description = "A chilled cocktail invented and popularized by corona miners." ratios = list( - /decl/material/liquid/ethanol/vodka = 3, + /decl/material/liquid/alcohol/vodka = 3, /decl/material/liquid/drink/milk/cream = 2, /decl/material/solid/ice = 2 ) @@ -417,7 +417,7 @@ name = "Barefoot" description = "A smooth cocktail that will take your mind off the broken glass you stepped on." ratios = list( - /decl/material/liquid/ethanol/vermouth = 4, + /decl/material/liquid/alcohol/vermouth = 4, /decl/material/liquid/drink/juice/berry = 2, /decl/material/liquid/drink/milk/cream = 1 ) @@ -426,7 +426,7 @@ name = "sbiten" description = "A form of spiced mead that will bring tears to the eyes of the most hardened drinker." ratios = list( - /decl/material/liquid/ethanol/mead = 9, + /decl/material/liquid/alcohol/mead = 9, /decl/material/liquid/capsaicin = 1 ) @@ -434,7 +434,7 @@ name = "red mead" description = "Supposedly a traditional drink amongst mercenary groups prior to dangerous missions." ratios = list( - /decl/material/liquid/ethanol/mead = 1, + /decl/material/liquid/alcohol/mead = 1, /decl/material/liquid/blood = 1 ) @@ -442,7 +442,7 @@ name = "Acid Spit" description = "A cocktail inspired by monsters of legend, popular with college students daring their friends to drink one." ratios = list( - /decl/material/liquid/ethanol/wine = 1, + /decl/material/liquid/alcohol/wine = 1, /decl/material/liquid/acid ) @@ -454,17 +454,17 @@ /decl/material/liquid/drink/juice/orange = 2, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/drink/juice/lemon = 1, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/neurotoxin name = "Neurotoxin" description = "A cocktail primarily intended for people with a grudge against their own brain." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/sedatives ) @@ -474,16 +474,16 @@ description = "A tangy, fizzy twist on beer." ratios = list( /decl/material/liquid/drink/lemon_lime = 3, - /decl/material/liquid/ethanol/beer = 1 + /decl/material/liquid/alcohol/beer = 1 ) /decl/cocktail/irishslammer name = "Irish Slammer" description = "A rich cocktail of whiskey, stout and cream that was performed using a shot glass before glass-interleaving technology was lost." ratios = list( - /decl/material/liquid/ethanol/ale = 5, - /decl/material/liquid/ethanol/whiskey = 1, - /decl/material/liquid/ethanol/irish_cream = 1 + /decl/material/liquid/alcohol/ale = 5, + /decl/material/liquid/alcohol/whiskey = 1, + /decl/material/liquid/alcohol/irish_cream = 1 ) // A whiskey cola with added beer. @@ -491,8 +491,8 @@ name = "Syndicate Bomb" description = "A murky cocktail reputed to have originated in criminal circles. It will definitely get you bombed." ratios = list( - /decl/material/liquid/ethanol/whiskey = 1, - /decl/material/liquid/ethanol/beer = 1, + /decl/material/liquid/alcohol/whiskey = 1, + /decl/material/liquid/alcohol/beer = 1, /decl/material/liquid/drink/cola = 4 ) @@ -500,19 +500,19 @@ name = "Devil's Kiss" description = "A ghoulish cocktail popular in some of the weirder dive bars on the system fringe." ratios = list( - /decl/material/liquid/ethanol/rum = 4, + /decl/material/liquid/alcohol/rum = 4, /decl/material/liquid/blood = 1, - /decl/material/liquid/ethanol/coffee = 2 + /decl/material/liquid/alcohol/coffee = 2 ) /decl/cocktail/hippiesdelight name = "Hippy's Delight" description = "A complex cocktail that just might open your third eye." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, - /decl/material/liquid/ethanol/gin = 1, - /decl/material/liquid/ethanol/aged_whiskey = 1, - /decl/material/liquid/ethanol/cognac = 1, + /decl/material/liquid/alcohol/vodka = 1, + /decl/material/liquid/alcohol/gin = 1, + /decl/material/liquid/alcohol/aged_whiskey = 1, + /decl/material/liquid/alcohol/cognac = 1, /decl/material/liquid/drink/juice/lime = 1, /decl/material/liquid/psychotropics = 2 ) @@ -531,7 +531,7 @@ description = "A smooth, steady cocktail supposedly ordered by sawbones and surgeons of legend." ratios = list( /decl/material/liquid/drink/cherrycola = 4, - /decl/material/liquid/ethanol/rum = 2 + /decl/material/liquid/alcohol/rum = 2 ) /decl/cocktail/vodkacola @@ -539,14 +539,14 @@ description = "A simple mix of cola and vodka, combining sweetness, fizz and a kick in the teeth." ratios = list( /decl/material/liquid/drink/cola = 2, - /decl/material/liquid/ethanol/vodka = 1 + /decl/material/liquid/alcohol/vodka = 1 ) /decl/cocktail/sawbonesdismay name = "Sawbones' Dismay" description = "Legally, we are required to inform you that drinking this cocktail may invalidate your health insurance." ratios = list( - /decl/material/liquid/ethanol/jagermeister = 1, + /decl/material/liquid/alcohol/jagermeister = 1, /decl/material/liquid/drink/beastenergy = 1 ) @@ -554,7 +554,7 @@ name = "Patron" description = "Tequila mixed with flaked silver, for those with moderate expensive tastes." ratios = list( - /decl/material/liquid/ethanol/tequila = 1, + /decl/material/liquid/alcohol/tequila = 1, /decl/material/solid/metal/silver ) @@ -571,7 +571,7 @@ name = "Goldschlager" description = "Schnapps mixed with flaked gold, for those with very expensive tastes." ratios = list( - /decl/material/liquid/ethanol/vodka = 1, + /decl/material/liquid/alcohol/vodka = 1, /decl/material/solid/metal/gold ) @@ -597,5 +597,5 @@ description = "Watered-down whiskey. Essentially grog, but without the pirates." ratios = list( /decl/material/liquid/water = 1, - /decl/material/liquid/ethanol/whiskey = 1 + /decl/material/liquid/alcohol/whiskey = 1 ) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index 924c00ea958..62f5d50a7e3 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -48,13 +48,14 @@ else if(user) to_chat(user, SPAN_NOTICE("You clear the label on \the [src].")) -/obj/item/chems/chem_disp_cartridge/attack_self() - ..() +/obj/item/chems/chem_disp_cartridge/attack_self(mob/user) + if((. = ..())) + return if (ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE("You put the cap on \the [src].")) + to_chat(user, SPAN_NOTICE("You put the cap on \the [src].")) atom_flags ^= ATOM_FLAG_OPEN_CONTAINER else - to_chat(usr, SPAN_NOTICE("You take the cap off \the [src].")) + to_chat(user, SPAN_NOTICE("You take the cap off \the [src].")) atom_flags |= ATOM_FLAG_OPEN_CONTAINER /obj/item/chems/chem_disp_cartridge/afterattack(obj/target, mob/user, proximity_flag, click_parameters) @@ -65,7 +66,7 @@ return TRUE if(handle_eaten_by_mob(user, target) != EATEN_INVALID) return TRUE - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) if(standard_splash_mob(user,target)) return TRUE if(reagents && reagents.total_volume) diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index fc67bea1606..fadf1e19187 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -32,24 +32,24 @@ DEFINE_CARTRIDGE_FOR_CHEM(iron, /decl/material/solid/metal/iron) DEFINE_CARTRIDGE_FOR_CHEM(copper, /decl/material/solid/metal/copper) DEFINE_CARTRIDGE_FOR_CHEM(mercury, /decl/material/liquid/mercury) DEFINE_CARTRIDGE_FOR_CHEM(radium, /decl/material/solid/metal/radium) -DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/ethanol) +DEFINE_CARTRIDGE_FOR_CHEM(ethanol, /decl/material/liquid/alcohol/ethanol) DEFINE_CARTRIDGE_FOR_CHEM(sacid, /decl/material/liquid/acid) DEFINE_CARTRIDGE_FOR_CHEM(tungsten, /decl/material/solid/metal/tungsten) // Bar, alcoholic -DEFINE_CARTRIDGE_FOR_CHEM(beer, /decl/material/liquid/ethanol/beer) -DEFINE_CARTRIDGE_FOR_CHEM(kahlua, /decl/material/liquid/ethanol/coffee) -DEFINE_CARTRIDGE_FOR_CHEM(whiskey, /decl/material/liquid/ethanol/whiskey) -DEFINE_CARTRIDGE_FOR_CHEM(wine, /decl/material/liquid/ethanol/wine) -DEFINE_CARTRIDGE_FOR_CHEM(vodka, /decl/material/liquid/ethanol/vodka) -DEFINE_CARTRIDGE_FOR_CHEM(gin, /decl/material/liquid/ethanol/gin) -DEFINE_CARTRIDGE_FOR_CHEM(rum, /decl/material/liquid/ethanol/rum) -DEFINE_CARTRIDGE_FOR_CHEM(tequila, /decl/material/liquid/ethanol/tequila) -DEFINE_CARTRIDGE_FOR_CHEM(vermouth, /decl/material/liquid/ethanol/vermouth) -DEFINE_CARTRIDGE_FOR_CHEM(cognac, /decl/material/liquid/ethanol/cognac) -DEFINE_CARTRIDGE_FOR_CHEM(ale, /decl/material/liquid/ethanol/ale) -DEFINE_CARTRIDGE_FOR_CHEM(mead, /decl/material/liquid/ethanol/mead) +DEFINE_CARTRIDGE_FOR_CHEM(beer, /decl/material/liquid/alcohol/beer) +DEFINE_CARTRIDGE_FOR_CHEM(kahlua, /decl/material/liquid/alcohol/coffee) +DEFINE_CARTRIDGE_FOR_CHEM(whiskey, /decl/material/liquid/alcohol/whiskey) +DEFINE_CARTRIDGE_FOR_CHEM(wine, /decl/material/liquid/alcohol/wine) +DEFINE_CARTRIDGE_FOR_CHEM(vodka, /decl/material/liquid/alcohol/vodka) +DEFINE_CARTRIDGE_FOR_CHEM(gin, /decl/material/liquid/alcohol/gin) +DEFINE_CARTRIDGE_FOR_CHEM(rum, /decl/material/liquid/alcohol/rum) +DEFINE_CARTRIDGE_FOR_CHEM(tequila, /decl/material/liquid/alcohol/tequila) +DEFINE_CARTRIDGE_FOR_CHEM(vermouth, /decl/material/liquid/alcohol/vermouth) +DEFINE_CARTRIDGE_FOR_CHEM(cognac, /decl/material/liquid/alcohol/cognac) +DEFINE_CARTRIDGE_FOR_CHEM(ale, /decl/material/liquid/alcohol/ale) +DEFINE_CARTRIDGE_FOR_CHEM(mead, /decl/material/liquid/alcohol/mead) // Bar, soft DEFINE_CARTRIDGE_FOR_CHEM(ice, /decl/material/solid/ice) diff --git a/code/modules/reagents/heat_sources/_heat_source.dm b/code/modules/reagents/heat_sources/_heat_source.dm index b9295313707..eb5b3cebf44 100644 --- a/code/modules/reagents/heat_sources/_heat_source.dm +++ b/code/modules/reagents/heat_sources/_heat_source.dm @@ -5,8 +5,8 @@ #define HEATER_MODE_COOL "cool" /obj/machinery/reagent_temperature - name = "chemical heater" - desc = "A small electric Bunsen, used to heat beakers and vials of chemicals." + name = "hotplate" + desc = "A small electric hotplate, used to heat cookware, beakers, or vials of chemicals." icon = 'icons/obj/machines/heat_sources.dmi' icon_state = "hotplate" atom_flags = ATOM_FLAG_CLIMBABLE @@ -70,6 +70,7 @@ /obj/machinery/reagent_temperature/ProcessAtomTemperature() if(use_power >= POWER_USE_ACTIVE) + var/last_temperature = temperature if(heater_mode == HEATER_MODE_HEAT && temperature < target_temperature) temperature = min(target_temperature, temperature + heating_power) @@ -79,10 +80,25 @@ if(container) queue_temperature_atoms(container) queue_icon_update() + + // Hackery to heat pots placed onto a hotplate without also grilling/baking stuff. + if(isturf(loc)) + var/datum/gas_mixture/environment = loc.return_air() + for(var/obj/item/chems/cooking_vessel/pot in loc.get_contained_external_atoms()) + pot.fire_act(environment, temperature, 500) + return TRUE // Don't kill this processing loop unless we're not powered. . = ..() /obj/machinery/reagent_temperature/attackby(var/obj/item/thing, var/mob/user) + + if(istype(thing, /obj/item/chems/cooking_vessel)) + if(!user.try_unequip(thing, get_turf(src))) + return TRUE + thing.reset_offsets(anim_time = 0) + user.visible_message(SPAN_NOTICE("\The [user] places \the [thing] onto \the [src].")) + return TRUE + if(IS_WRENCH(thing)) if(use_power == POWER_USE_ACTIVE) to_chat(user, SPAN_WARNING("Turn \the [src] off first!")) diff --git a/code/modules/reagents/reactions/_reaction.dm b/code/modules/reagents/reactions/_reaction.dm index e743ecf0ab2..fbc2eaa85d6 100644 --- a/code/modules/reagents/reactions/_reaction.dm +++ b/code/modules/reagents/reactions/_reaction.dm @@ -38,7 +38,7 @@ return 1 -/decl/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(thermal_product && location && ATOM_SHOULD_TEMPERATURE_ENQUEUE(location)) ADJUST_ATOM_TEMPERATURE(location, location.temperature + (location.get_thermal_mass_coefficient() * thermal_product)) @@ -61,8 +61,6 @@ if(reaction_volume > A) reaction_volume = A - 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) @@ -71,7 +69,7 @@ if(result) holder.add_reagent(result, amt_produced, data, safety = 1) - on_reaction(holder, amt_produced, alt_reaction_indicator, data) + on_reaction(holder, amt_produced, data) //called after processing reactions, if they occurred /decl/chemical_reaction/proc/post_reaction(var/datum/reagents/holder) diff --git a/code/modules/reagents/reactions/reaction_alcohol.dm b/code/modules/reagents/reactions/reaction_alcohol.dm index 87ac55aacef..4d96bdb5d12 100644 --- a/code/modules/reagents/reactions/reaction_alcohol.dm +++ b/code/modules/reagents/reactions/reaction_alcohol.dm @@ -14,7 +14,7 @@ /decl/chemical_reaction/recipe/moonshine name = "Moonshine" - result = /decl/material/liquid/ethanol/moonshine + result = /decl/material/liquid/alcohol/moonshine required_reagents = list(/decl/material/liquid/nutriment = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -29,7 +29,7 @@ /decl/chemical_reaction/recipe/wine name = "Red Wine" - result = /decl/material/liquid/ethanol/wine + result = /decl/material/liquid/alcohol/wine required_reagents = list(/decl/material/liquid/drink/juice/grape = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -37,7 +37,7 @@ /decl/chemical_reaction/recipe/pwine name = "Poison Wine" - result = /decl/material/liquid/ethanol/pwine + result = /decl/material/liquid/alcohol/pwine required_reagents = list(/decl/material/liquid/poisonberryjuice = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -45,7 +45,7 @@ /decl/chemical_reaction/recipe/melonliquor name = "Melon Liquor" - result = /decl/material/liquid/ethanol/melonliquor + result = /decl/material/liquid/alcohol/melonliquor required_reagents = list(/decl/material/liquid/drink/juice/watermelon = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -53,7 +53,7 @@ /decl/chemical_reaction/recipe/bluecuracao name = "Blue Curacao" - result = /decl/material/liquid/ethanol/bluecuracao + result = /decl/material/liquid/alcohol/bluecuracao required_reagents = list(/decl/material/liquid/drink/juice/orange = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -61,15 +61,15 @@ /decl/chemical_reaction/recipe/beer name = "Plain Beer" - result = /decl/material/liquid/ethanol/beer - required_reagents = list(/decl/material/liquid/nutriment/cornoil = 10) + result = /decl/material/liquid/alcohol/beer + required_reagents = list(/decl/material/liquid/oil/plant/corn = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a foaming amber liquid." /decl/chemical_reaction/recipe/vodka name = "Potato Vodka" - result = /decl/material/liquid/ethanol/vodka + result = /decl/material/liquid/alcohol/vodka required_reagents = list(/decl/material/liquid/drink/juice/potato = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -77,7 +77,7 @@ /decl/chemical_reaction/recipe/vodka2 name = "Turnip Vodka" - result = /decl/material/liquid/ethanol/vodka + result = /decl/material/liquid/alcohol/vodka required_reagents = list(/decl/material/liquid/drink/juice/turnip = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -85,7 +85,7 @@ /decl/chemical_reaction/recipe/sake name = "Sake" - result = /decl/material/liquid/ethanol/sake + result = /decl/material/liquid/alcohol/sake required_reagents = list(/decl/material/liquid/nutriment/rice = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 @@ -93,7 +93,7 @@ /decl/chemical_reaction/recipe/kahlua name = "Kahlua" - result = /decl/material/liquid/ethanol/coffee + result = /decl/material/liquid/alcohol/coffee required_reagents = list(/decl/material/liquid/drink/coffee = 5, /decl/material/liquid/nutriment/sugar = 5) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 5 @@ -101,28 +101,28 @@ /decl/chemical_reaction/recipe/irish_cream name = "Irish Cream" - result = /decl/material/liquid/ethanol/irish_cream - required_reagents = list(/decl/material/liquid/ethanol/whiskey = 2, /decl/material/liquid/drink/milk/cream = 1) + result = /decl/material/liquid/alcohol/irish_cream + required_reagents = list(/decl/material/liquid/alcohol/whiskey = 2, /decl/material/liquid/drink/milk/cream = 1) result_amount = 3 /decl/chemical_reaction/recipe/hooch name = "Hooch" - result = /decl/material/liquid/ethanol/hooch - required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol = 2, /decl/material/liquid/fuel = 1) + result = /decl/material/liquid/alcohol/hooch + required_reagents = list (/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/alcohol/ethanol = 2, /decl/material/liquid/fuel = 1) minimum_temperature = 30 CELSIUS maximum_temperature = (30 CELSIUS) + 100 result_amount = 3 /decl/chemical_reaction/recipe/mead name = "Mead" - result = /decl/material/liquid/ethanol/mead + result = /decl/material/liquid/alcohol/mead required_reagents = list(/decl/material/liquid/nutriment/honey = 1, /decl/material/liquid/water = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 2 /decl/chemical_reaction/recipe/rum name = "Dark Rum" - result = /decl/material/liquid/ethanol/rum + result = /decl/material/liquid/alcohol/rum required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/water = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 2 @@ -130,21 +130,21 @@ /decl/chemical_reaction/recipe/cider_apple name = "Apple Cider" - result = /decl/material/liquid/ethanol/cider_apple + result = /decl/material/liquid/alcohol/cider_apple required_reagents = list(/decl/material/liquid/drink/juice/apple = 2, /decl/material/liquid/nutriment/sugar = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 /decl/chemical_reaction/recipe/cider_pear name = "Pear Cider" - result = /decl/material/liquid/ethanol/cider_pear + result = /decl/material/liquid/alcohol/cider_pear required_reagents = list(/decl/material/liquid/drink/juice/pear = 2, /decl/material/liquid/nutriment/sugar = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 /decl/chemical_reaction/recipe/kvass name = "Kvass" - result = /decl/material/liquid/ethanol/kvass - required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/ethanol/beer = 1) + result = /decl/material/liquid/alcohol/kvass + required_reagents = list(/decl/material/liquid/nutriment/sugar = 1, /decl/material/liquid/alcohol/beer = 1) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 3 diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index a2126b561d7..8df2ada04be 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -48,7 +48,7 @@ name = "Methyl Bromide" required_reagents = list( /decl/material/liquid/bromide = 1, - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/fuel/hydrazine = 1 ) result_amount = 3 @@ -151,10 +151,44 @@ name = "Condensed Capsaicin" minimum_temperature = 100 CELSIUS maximum_temperature = 200 CELSIUS // To avoid cooking chili creating condensed capsaicin. - mix_message = "darkens and thickens as it seperates from its water content" + mix_message = "darkens and thickens as it separates from its water content" required_reagents = list(/decl/material/liquid/capsaicin = 2) result = list(/decl/material/liquid/capsaicin/condensed = 1) -/decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) . = ..() holder?.add_reagent(/decl/material/liquid/water, created_volume) + +/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) + catalysts = list(/decl/material/solid/phoron = 5) + result_amount = 3 + minimum_temperature = (-25 CELSIUS) - 100 + maximum_temperature = -25 CELSIUS + mix_message = "The solution becomes a metallic slime." + +// This is a bit silly, but we need a way to unify oil types until someone rewrites lanterns. +/decl/chemical_reaction/compound/fuel_oil + name = "Plant Fuel Oil" + result = /decl/material/liquid/oil + result_amount = 3 + required_reagents = list( + /decl/material/liquid/oil/plant = 2, + /decl/material/solid/graphite = 1 + ) + +/decl/chemical_reaction/compound/fuel_oil/corn + name = "Corn Fuel Oil" + required_reagents = list( + /decl/material/liquid/oil/plant/corn = 2, + /decl/material/solid/graphite = 1 + ) + +/decl/chemical_reaction/compound/fuel_oil/fish + name = "Fish Fuel Oil" + required_reagents = list( + /decl/material/liquid/oil/fish = 2, + /decl/material/solid/graphite = 1 + ) diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index 5f92eaa6bc8..a4f85cb3fa7 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -22,16 +22,16 @@ name = "Strong Painkillers" result = /decl/material/liquid/painkillers/strong required_reagents = list( - /decl/material/liquid/stabilizer = 1, - /decl/material/liquid/ethanol = 1, - /decl/material/liquid/acetone = 1 + /decl/material/liquid/stabilizer = 1, + /decl/material/liquid/alcohol/ethanol = 1, + /decl/material/liquid/acetone = 1 ) result_amount = 3 /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) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/antitoxins = 1, /decl/material/liquid/acid/hydrochloric = 1) result_amount = 3 /decl/chemical_reaction/drug/mutagenics @@ -111,16 +111,6 @@ required_reagents = list(/decl/material/liquid/antirads = 1, /decl/material/solid/carbon = 1) result_amount = 2 -/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) - catalysts = list(/decl/material/solid/phoron = 5) - result_amount = 3 - minimum_temperature = (-25 CELSIUS) - 100 - maximum_temperature = -25 CELSIUS - mix_message = "The solution becomes a metallic slime." - /decl/chemical_reaction/drug/antibiotics name = "Antibiotics" result = /decl/material/liquid/antibiotics @@ -136,7 +126,7 @@ /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 + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/nutriment/sugar = 4 ) inhibitors = list( /decl/material/solid/phosphorus @@ -146,7 +136,7 @@ /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) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/mercury = 2, /decl/material/liquid/fuel/hydrazine = 2) result_amount = 1 /decl/chemical_reaction/drug/zombiepowder diff --git a/code/modules/reagents/reactions/reaction_grenade_reaction.dm b/code/modules/reagents/reactions/reaction_grenade_reaction.dm index ec529bef717..7827c6ac054 100644 --- a/code/modules/reagents/reactions/reaction_grenade_reaction.dm +++ b/code/modules/reagents/reactions/reaction_grenade_reaction.dm @@ -11,7 +11,7 @@ required_reagents = list(/decl/material/liquid/water = 1, /decl/material/solid/potassium = 1) mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -32,7 +32,7 @@ result_amount = null mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -58,7 +58,7 @@ mix_message = "The solution bubbles vigorously!" maximum_temperature = T100C -/decl/chemical_reaction/grenade_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -79,7 +79,7 @@ reaction_sound = 'sound/items/Welder.ogg' mix_message = "The solution suddenly ignites!" -/decl/chemical_reaction/grenade_reaction/flash_fire/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/flash_fire/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(istype(location)) @@ -93,7 +93,7 @@ result_amount = 0.4 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/chemsmoke/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/chemsmoke/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -112,7 +112,7 @@ result_amount = 2 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/foam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/foam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -129,7 +129,7 @@ result_amount = 5 mix_message = "The solution foams up violently!" -/decl/chemical_reaction/grenade_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -151,7 +151,7 @@ result_amount = 5 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) diff --git a/code/modules/reagents/reactions/reaction_herbal.dm b/code/modules/reagents/reactions/reaction_herbal.dm index f0f6bc441f4..62950dd1d64 100644 --- a/code/modules/reagents/reactions/reaction_herbal.dm +++ b/code/modules/reagents/reactions/reaction_herbal.dm @@ -3,7 +3,7 @@ result_amount = 2 minimum_temperature = 100 CELSIUS -/decl/chemical_reaction/drug/herbal/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/drug/herbal/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) . = ..() // Add plant matter to represent the herbs that the medicine has been leached out of. holder?.add_reagent(/decl/material/solid/organic/plantmatter, created_volume) @@ -44,7 +44,7 @@ /decl/chemical_reaction/drug/herbal/yarrow_tincture name = "tincture of yarrow" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/brute_meds/yarrow = 3 ) result = /decl/material/liquid/brute_meds/yarrow/tincture @@ -52,15 +52,15 @@ /decl/chemical_reaction/drug/herbal/aloe_tincture name = "tincture of aloe" required_reagents = list( - /decl/material/liquid/ethanol = 1, - /decl/material/liquid/burn_meds/aloe = 3 + /decl/material/liquid/alcohol/ethanol = 1, + /decl/material/liquid/burn_meds/aloe = 3 ) result = /decl/material/liquid/burn_meds/aloe/tincture /decl/chemical_reaction/drug/herbal/ginseng_tincture name = "tincture of ginseng" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/antitoxins/ginseng = 3 ) result = /decl/material/liquid/antitoxins/ginseng/tincture @@ -68,7 +68,7 @@ /decl/chemical_reaction/drug/herbal/valerian_tincture name = "tincture of valerian" required_reagents = list( - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/sedatives/valerian = 3 ) result = /decl/material/liquid/sedatives/valerian/tincture diff --git a/code/modules/reagents/reactions/reaction_other.dm b/code/modules/reagents/reactions/reaction_other.dm index 19c5613ea7e..dca52f041f6 100644 --- a/code/modules/reagents/reactions/reaction_other.dm +++ b/code/modules/reagents/reactions/reaction_other.dm @@ -10,7 +10,7 @@ return ..() return 0 -/decl/chemical_reaction/soap_key/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/soap_key/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/obj/item/soap/S = holder.get_reaction_loc(chemical_reaction_flags) if(istype(S) && S.key_data) new /obj/item/key/temporary(get_turf(S), /decl/material/liquid/cleaner, S.key_data, strength) diff --git a/code/modules/reagents/reactions/reaction_recipe.dm b/code/modules/reagents/reactions/reaction_recipe.dm index f8a9797da15..a113d821cc5 100644 --- a/code/modules/reagents/reactions/reaction_recipe.dm +++ b/code/modules/reagents/reactions/reaction_recipe.dm @@ -37,7 +37,7 @@ /decl/chemical_reaction/recipe/garlicsauce name = "Garlic Sauce" result = /decl/material/liquid/nutriment/garlicsauce - required_reagents = list(/decl/material/liquid/drink/juice/garlic = 1, /decl/material/liquid/nutriment/cornoil = 1) + required_reagents = list(/decl/material/liquid/drink/juice/garlic = 1, /decl/material/liquid/oil/plant/corn = 1) result_amount = 2 mix_message = "The solution thickens into a creamy white oil." @@ -79,7 +79,7 @@ /decl/chemical_reaction/recipe/vinegar2 name = "Clear Vinegar" result = /decl/material/liquid/nutriment/vinegar - required_reagents = list(/decl/material/liquid/ethanol = 10) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 10) catalysts = list(/decl/material/liquid/enzyme = 5) result_amount = 10 mix_message = "The solution roils as it rapidly ferments into a sharp-smelling liquid." diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index 29ba82a01db..0ece0daefd2 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -4,7 +4,7 @@ abstract_type = /decl/chemical_reaction/recipe/food var/obj_result -/decl/chemical_reaction/recipe/food/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/recipe/food/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(obj_result && isturf(location)) @@ -58,7 +58,7 @@ name = "Enzyme Margarine" required_reagents = list( /decl/material/solid/sodiumchloride = 1, - /decl/material/liquid/nutriment/plant_oil = 20 + /decl/material/liquid/oil/plant = 20 ) catalysts = list(/decl/material/liquid/enzyme = 5) mix_message = "The solution thickens and curdles into a pale yellow solid." @@ -210,7 +210,7 @@ name = "Space Liberty Duff" required_reagents = list( /decl/material/liquid/water = 10, - /decl/material/liquid/ethanol/vodka = 5, + /decl/material/liquid/alcohol/vodka = 5, /decl/material/liquid/psychotropics = 5 ) obj_result = /obj/item/food/spacylibertyduff @@ -219,7 +219,7 @@ name = "Amanita Jelly" required_reagents = list( /decl/material/liquid/water = 10, - /decl/material/liquid/ethanol/vodka = 5, + /decl/material/liquid/alcohol/vodka = 5, /decl/material/liquid/amatoxin = 5 ) obj_result = /obj/item/food/amanitajelly diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 90f7a0e1957..79695861328 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -19,7 +19,7 @@ ) . = ..() -/decl/chemical_reaction/synthesis/fiberglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/fiberglass/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -28,9 +28,6 @@ var/decl/material/mat = GET_DECL(/decl/material/solid/fiberglass) mat.create_object(location, created_volume) -/decl/chemical_reaction/synthesis/crystalization/can_happen(datum/reagents/holder) - . = ..() && length(holder.reagent_volumes) > 1 - /decl/chemical_reaction/synthesis/crystalization name = "Crystalization" required_reagents = list(/decl/material/liquid/crystal_agent = 1) @@ -47,7 +44,7 @@ if(rtype != /decl/material/liquid/crystal_agent && REAGENT_VOLUME(holder, rtype) >= REAGENT_UNITS_PER_MATERIAL_SHEET) return TRUE -/decl/chemical_reaction/synthesis/crystalization/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/crystalization/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() @@ -81,7 +78,7 @@ continue return TRUE -/decl/chemical_reaction/synthesis/aerogel/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/aerogel/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() @@ -100,7 +97,7 @@ required_reagents = list(/decl/material/liquid/acid = 1, /decl/material/liquid/plasticide = 2) mix_message = "The solution solidifies into a grey-white mass." -/decl/chemical_reaction/synthesis/plastication/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/plastication/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -115,7 +112,7 @@ result_amount = 3 mix_message = "The solution hardens and begins to crystallize." -/decl/chemical_reaction/synthesis/resin_pack/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/resin_pack/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) @@ -126,17 +123,17 @@ new /obj/item/stack/medical/resin/crafted(T, create_stacks) /decl/chemical_reaction/synthesis/soap - name = "Handmade Soap" + name = "Handmade Plant Soap" required_reagents = list( - /decl/material/solid/carbon/ashes = 5, - /decl/material/liquid/water = 5, - /decl/material/liquid/nutriment/plant_oil = 10 + /decl/material/solid/carbon/ashes = 5, + /decl/material/liquid/water = 5, + /decl/material/liquid/oil/plant = 10 ) result_amount = 1 mix_message = "The solution thickens and solidifies." minimum_temperature = 100 CELSIUS -/decl/chemical_reaction/synthesis/soap/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/soap/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) @@ -146,3 +143,73 @@ return for(var/i = 1 to create_soap) new /obj/item/soap/crafted(T) + +/decl/chemical_reaction/synthesis/soap/corn + name = "Handmade Corn Soap" + required_reagents = list( + /decl/material/solid/carbon/ashes = 5, + /decl/material/liquid/water = 5, + /decl/material/liquid/oil/plant/corn = 10 + ) + +// Making chipboard out of wood scraps/recycled wood. +/decl/chemical_reaction/synthesis/chipboard + name = "Oak Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/oak = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + result_amount = 1 + mix_message = "The wood particulate binds with the plastic to form laminated chipboard." + minimum_temperature = 100 CELSIUS + var/chipboard_type = /decl/material/solid/organic/wood/chipboard + +/decl/chemical_reaction/synthesis/chipboard/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) + ..() + var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) + if(!istype(T)) + return + var/create_sheets = floor(created_volume) + if(create_sheets <= 0) + return + new /obj/item/stack/material/sheet(T, create_sheets, chipboard_type) + +/decl/chemical_reaction/synthesis/chipboard/maple + name = "Maple Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/maple = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/maple + +/decl/chemical_reaction/synthesis/chipboard/mahogany + name = "Mahogany Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/mahogany = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/mahogany + +/decl/chemical_reaction/synthesis/chipboard/ebony + name = "Ebony Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/ebony = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/ebony + +/decl/chemical_reaction/synthesis/chipboard/walnut + name = "Walnut Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/walnut = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/walnut + +/decl/chemical_reaction/synthesis/chipboard/yew + name = "Yew Chipboard" + required_reagents = list( + /decl/material/solid/organic/wood/yew = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2), + /decl/material/solid/organic/plastic = (REAGENT_UNITS_PER_MATERIAL_SHEET / 2) + ) + chipboard_type = /decl/material/solid/organic/wood/chipboard/yew diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 49d66cb0af7..de18007e761 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -27,9 +27,13 @@ /obj/item/chems/on_update_icon() . = ..() + if(detail_state) + add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) var/image/contents_overlay = get_reagents_overlay(use_single_icon ? icon_state : null) if(contents_overlay) add_overlay(contents_overlay) + if(detail_state) + add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) /obj/item/chems/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing) var/image/reagents_overlay = get_reagents_overlay(overlay.icon_state) @@ -43,18 +47,13 @@ /obj/item/chems/proc/cannot_interact(mob/user) if(!CanPhysicallyInteract(user)) - to_chat(usr, SPAN_WARNING("You're in no condition to do that!")) + to_chat(user, SPAN_WARNING("You're in no condition to do that!")) return TRUE if(ismob(loc) && loc != user) - to_chat(usr, SPAN_WARNING("You can't set transfer amounts while \the [src] is being held by someone else.")) + to_chat(user, SPAN_WARNING("You can't set transfer amounts while \the [src] is being held by someone else.")) return TRUE return FALSE -/obj/item/chems/on_update_icon() - . = ..() - if(detail_state) - add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) - /obj/item/chems/update_name() . = ..() // handles material, etc var/newname = name @@ -100,6 +99,21 @@ return /obj/item/chems/attackby(obj/item/used_item, mob/user) + + // Skimming off cream, repurposed from crucibles. + // TODO: potentially make this an alt interaction and unify with slag skimming. + if(istype(used_item, /obj/item/chems) && ATOM_IS_OPEN_CONTAINER(used_item) && used_item.reagents?.maximum_volume && reagents?.total_volume && length(reagents.reagent_volumes) > 1) + var/list/skimmable_reagents = reagents.get_skimmable_reagents() + if(length(skimmable_reagents)) + var/removing = min(amount_per_transfer_from_this, REAGENTS_FREE_SPACE(used_item.reagents)) + if(removing <= 0) + to_chat(user, SPAN_WARNING("\The [used_item] is full.")) + else + var/old_amt = used_item.reagents.total_volume + reagents.trans_to_holder(used_item.reagents, removing, skip_reagents = (reagents.reagent_volumes - skimmable_reagents)) + to_chat(user, SPAN_NOTICE("You skim [used_item.reagents.total_volume-old_amt] unit\s of [used_item.reagents.get_primary_reagent_name()] from the top of \the [reagents.get_primary_reagent_name()].")) + return TRUE + if(used_item.user_can_attack_with(user, silent = TRUE)) if(IS_PEN(used_item)) var/tmp_label = sanitize_safe(input(user, "Enter a label for [name]", "Label", label_text), MAX_NAME_LEN) @@ -186,12 +200,21 @@ // // Interactions // +/obj/item/chems/get_quick_interaction_handler(mob/user) + var/static/interaction = GET_DECL(/decl/interaction_handler/set_transfer/chems) + return interaction + /obj/item/chems/get_alt_interactions(var/mob/user) . = ..() - LAZYADD(., /decl/interaction_handler/set_transfer/chems) + var/static/list/chem_interactions = list( + /decl/interaction_handler/set_transfer/chems, + /decl/interaction_handler/empty/chems + ) + LAZYADD(., chem_interactions) /decl/interaction_handler/set_transfer/chems expected_target_type = /obj/item/chems + examine_desc = "set the transfer volume" /decl/interaction_handler/set_transfer/chems/is_possible(var/atom/target, var/mob/user) . = ..() @@ -208,6 +231,7 @@ name = "Empty On Floor" expected_target_type = /obj/item/chems interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "empty $TARGET_THEM$ onto the floor" /decl/interaction_handler/empty/chems/invoked(atom/target, mob/user, obj/item/prop) var/turf/T = get_turf(user) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm new file mode 100644 index 00000000000..f381c8a44bb --- /dev/null +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -0,0 +1,176 @@ + +//////////////////////////////////////////////////////////////////////////////// +/// (Mixing)Glass. +//////////////////////////////////////////////////////////////////////////////// +/obj/item/chems/glass + name = "" + desc = "" + icon_state = "null" + item_state = "null" + amount_per_transfer_from_this = 10 + possible_transfer_amounts = @"[5,10,15,25,30,60]" + volume = 60 + w_class = ITEM_SIZE_SMALL + atom_flags = ATOM_FLAG_OPEN_CONTAINER + obj_flags = OBJ_FLAG_HOLLOW + material = /decl/material/solid/glass + abstract_type = /obj/item/chems/glass + drop_sound = 'sound/foley/bottledrop1.ogg' + pickup_sound = 'sound/foley/bottlepickup1.ogg' + watertight = FALSE // /glass uses the open container flag for this + +/obj/item/chems/glass/proc/get_atoms_can_be_placed_into() + var/static/list/_can_be_placed_into = list( + /obj/machinery/chem_master/, + /obj/machinery/chemical_dispenser, + /obj/machinery/reagentgrinder, + /obj/structure/table, + /obj/structure/closet, + /obj/structure/hygiene/sink, + /obj/item/grenade/chem_grenade, + /mob/living/bot/medbot, + /obj/item/secure_storage/safe, + /obj/structure/iv_drip, + /obj/machinery/disposal, + /mob/living/simple_animal/cow, + /mob/living/simple_animal/hostile/goat, + /obj/machinery/sleeper, + /obj/machinery/smartfridge/, + /obj/machinery/biogenerator, + /obj/machinery/constructable_frame, + /obj/machinery/radiocarbon_spectrometer, + /obj/machinery/material_processing/extractor + ) + return _can_be_placed_into + +/obj/item/chems/glass/examine(mob/user, distance) + . = ..() + if(distance > 2) + return + + if(reagents?.total_volume) + to_chat(user, SPAN_NOTICE("It contains [reagents.total_volume] units of reagents.")) + else + to_chat(user, SPAN_NOTICE("It is empty.")) + if(!ATOM_IS_OPEN_CONTAINER(src)) + to_chat(user,SPAN_NOTICE("The airtight lid seals it completely.")) + +/obj/item/chems/glass/proc/can_lid() + return TRUE + +/obj/item/chems/glass/proc/should_drink_from(mob/drinker) + . = reagents?.total_volume > 0 + if(.) + var/decl/material/drinking = reagents.get_primary_reagent_decl() + return drinking ? !drinking.is_unsafe_to_drink(drinker) : FALSE + +/obj/item/chems/glass/attack_self(mob/user) + + if(can_lid() && user.check_intent(I_FLAG_HELP)) + if(ATOM_IS_OPEN_CONTAINER(src)) + to_chat(user, SPAN_NOTICE("You put the lid on \the [src].")) + atom_flags ^= ATOM_FLAG_OPEN_CONTAINER + else + to_chat(user, SPAN_NOTICE("You take the lid off \the [src].")) + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + update_icon() + return TRUE + + if(should_drink_from(user) && is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) + return TRUE + + return ..() + +/obj/item/chems/glass/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) + if(expend_attack_force(user) && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.check_intent(I_FLAG_HARM)) + return ..() + return FALSE + +/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. + if(target?.storage) + return TRUE + for(var/type in get_atoms_can_be_placed_into()) //Is it something it can be placed into? + if(istype(target, type)) + return TRUE + if(standard_dispenser_refill(user, target)) //Are they clicking a water tank/some dispenser? + return TRUE + if(standard_pour_into(user, target)) //Pouring into another beaker? + return TRUE + if(handle_eaten_by_mob(user, target) != EATEN_INVALID) + return TRUE + if(user.check_intent(I_FLAG_HARM)) + if(standard_splash_mob(user,target)) + return TRUE + if(reagents && reagents.total_volume) + to_chat(user, SPAN_DANGER("You splash the contents of \the [src] onto \the [target].")) + reagents.splash(target, reagents.total_volume) + return TRUE + else if(reagents && reagents.total_volume) + to_chat(user, SPAN_NOTICE("You splash a small amount of the contents of \the [src] onto \the [target].")) + reagents.splash(target, min(reagents.total_volume, 5)) + return TRUE + . = ..() + +// Drinking out of bowls. +/obj/item/chems/glass/get_edible_material_amount(mob/eater) + return reagents?.total_volume + +/obj/item/chems/glass/get_utensil_food_type() + return /obj/item/food/lump + +// Interaction code borrowed from /food. +// Should we consider moving this down to /chems for any open container? Medicine from a bottle using a spoon, etc. +/obj/item/chems/glass/attackby(obj/item/used_item, mob/living/user) + + if(!ATOM_IS_OPEN_CONTAINER(src)) + return ..() + + var/obj/item/utensil/utensil = used_item + if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) + if(utensil.loaded_food) + to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) + return TRUE + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty.")) + return TRUE + seperate_food_chunk(utensil, user) + if(utensil.loaded_food?.reagents?.total_volume) + to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) + return TRUE + + return ..() + +/obj/item/chems/glass/get_alt_interactions(mob/user) + . = ..() + if(reagents?.total_volume >= FLUID_PUDDLE) + LAZYADD(., /decl/interaction_handler/dip_item) + LAZYADD(., /decl/interaction_handler/fill_from) + if(user?.get_active_held_item()) + LAZYADD(., /decl/interaction_handler/empty_into) + if(can_lid()) + LAZYADD(., /decl/interaction_handler/toggle_lid) + +/decl/interaction_handler/toggle_lid + name = "Toggle Lid" + expected_target_type = /obj/item/chems/glass + +/decl/interaction_handler/toggle_lid/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(. && !istype(prop)) + var/obj/item/chems/glass/glass = target + return glass.can_lid() + +/decl/interaction_handler/toggle_lid/invoked(atom/target, mob/user, obj/item/prop) + var/obj/item/chems/glass/glass = target + if(istype(glass) && glass.can_lid()) + if(ATOM_IS_OPEN_CONTAINER(glass)) + to_chat(user, SPAN_NOTICE("You put the lid on \the [glass].")) + glass.atom_flags ^= ATOM_FLAG_OPEN_CONTAINER + else + to_chat(user, SPAN_NOTICE("You take the lid off \the [glass].")) + glass.atom_flags |= ATOM_FLAG_OPEN_CONTAINER + glass.update_icon() + return TRUE + diff --git a/code/modules/reagents/reagent_containers/glass_edibility.dm b/code/modules/reagents/reagent_containers/_glass_edibility.dm similarity index 86% rename from code/modules/reagents/reagent_containers/glass_edibility.dm rename to code/modules/reagents/reagent_containers/_glass_edibility.dm index 9411350417e..2449de26a43 100644 --- a/code/modules/reagents/reagent_containers/glass_edibility.dm +++ b/code/modules/reagents/reagent_containers/_glass_edibility.dm @@ -2,6 +2,6 @@ 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) + if(user.check_intent(I_FLAG_HARM)) return EATEN_INVALID return ..() diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index a3c95ef6db0..724a0ca448b 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -65,6 +65,7 @@ take_damage(rand(4,8)) /obj/item/chems/glass/beaker/large + name_prefix = "large" name = "beaker" // see update_name override below desc = "A large beaker." icon = 'icons/obj/items/chem/beakers/large.dmi' @@ -74,10 +75,6 @@ possible_transfer_amounts = @"[5,10,15,25,30,60,120]" w_class = ITEM_SIZE_LARGE -/obj/item/chems/glass/beaker/large/update_name() - . = ..() - SetName("large [name]") // large glass beaker, not glass large beaker - /obj/item/chems/glass/beaker/bowl name = "mixing bowl" desc = "A large mixing bowl." @@ -89,6 +86,9 @@ atom_flags = ATOM_FLAG_OPEN_CONTAINER material = /decl/material/solid/metal/steel +/obj/item/chems/glass/beaker/bowl/can_lid() + return FALSE + /obj/item/chems/glass/beaker/bowl/pottery material = /decl/material/solid/stone/pottery @@ -178,5 +178,5 @@ matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) volume = 120 -/obj/item/chems/glass/beaker/sulphuric/populate_reagents() +/obj/item/chems/glass/beaker/sulfuric/populate_reagents() add_to_reagents(/decl/material/liquid/acid, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 6e69142d458..658b68dddf7 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -37,9 +37,6 @@ reagent_volumes[T] = volume var/decl/material/R = T reagent_names += initial(R.name) - -/obj/item/chems/borghypo/Initialize() - . = ..() START_PROCESSING(SSobj, src) /obj/item/chems/borghypo/Destroy() @@ -100,14 +97,14 @@ return -/obj/item/chems/borghypo/OnTopic(var/href, var/list/href_list) +/obj/item/chems/borghypo/OnTopic(mob/user, href_list, datum/topic_state/state) if(href_list["reagent_index"]) var/index = text2num(href_list["reagent_index"]) if(index > 0 && index <= reagent_ids.len) playsound(loc, 'sound/effects/pop.ogg', 50, 0) mode = index var/decl/material/R = reagent_ids[mode] - to_chat(usr, "Synthesizer is now producing '[initial(R.name)]'.") + to_chat(user, "Synthesizer is now producing '[initial(R.name)]'.") return TOPIC_REFRESH /obj/item/chems/borghypo/examine(mob/user, distance) @@ -128,18 +125,18 @@ volume = 60 possible_transfer_amounts = @"[5,10,20,30]" reagent_ids = list( - /decl/material/liquid/ethanol/beer, - /decl/material/liquid/ethanol/coffee, - /decl/material/liquid/ethanol/whiskey, - /decl/material/liquid/ethanol/wine, - /decl/material/liquid/ethanol/vodka, - /decl/material/liquid/ethanol/gin, - /decl/material/liquid/ethanol/rum, - /decl/material/liquid/ethanol/tequila, - /decl/material/liquid/ethanol/vermouth, - /decl/material/liquid/ethanol/cognac, - /decl/material/liquid/ethanol/ale, - /decl/material/liquid/ethanol/mead, + /decl/material/liquid/alcohol/beer, + /decl/material/liquid/alcohol/coffee, + /decl/material/liquid/alcohol/whiskey, + /decl/material/liquid/alcohol/wine, + /decl/material/liquid/alcohol/vodka, + /decl/material/liquid/alcohol/gin, + /decl/material/liquid/alcohol/rum, + /decl/material/liquid/alcohol/tequila, + /decl/material/liquid/alcohol/vermouth, + /decl/material/liquid/alcohol/cognac, + /decl/material/liquid/alcohol/ale, + /decl/material/liquid/alcohol/mead, /decl/material/liquid/water, /decl/material/liquid/nutriment/sugar, /decl/material/solid/ice, @@ -158,8 +155,8 @@ /decl/material/liquid/drink/hot_coco, /decl/material/liquid/drink/tea/green, /decl/material/liquid/drink/citrussoda, - /decl/material/liquid/ethanol/beer, - /decl/material/liquid/ethanol/coffee + /decl/material/liquid/alcohol/beer, + /decl/material/liquid/alcohol/coffee ) /obj/item/chems/borghypo/service/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/modules/reagents/reagent_containers/bowl.dm b/code/modules/reagents/reagent_containers/bowl.dm index 6b50d060cf0..bc54aadbaa4 100644 --- a/code/modules/reagents/reagent_containers/bowl.dm +++ b/code/modules/reagents/reagent_containers/bowl.dm @@ -9,57 +9,9 @@ volume = 30 amount_per_transfer_from_this = 5 -// Drinking out of bowls. -/obj/item/chems/glass/bowl/attack_self(mob/user) - if(is_edible(user) && handle_eaten_by_mob(user, user) != EATEN_INVALID) - return TRUE - return ..() - /obj/item/chems/glass/bowl/can_lid() return FALSE -/obj/item/chems/glass/bowl/get_food_default_transfer_amount(mob/eater) - return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) - -/obj/item/chems/glass/bowl/get_edible_material_amount(mob/eater) - return reagents?.total_volume - -/obj/item/chems/glass/bowl/get_food_consumption_method(mob/eater) - return EATING_METHOD_DRINK - -/obj/item/chems/glass/bowl/get_utensil_food_type() - return /obj/item/food/lump - -// Interaction code borrowed from /food. -/obj/item/chems/glass/bowl/attackby(obj/item/W, mob/living/user) - - if(istype(W, /obj/item/food)) - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - var/transferring = min(get_food_default_transfer_amount(user), REAGENTS_FREE_SPACE(W.reagents)) - if(!transferring) - to_chat(user, SPAN_WARNING("You cannot dip \the [W] in \the [src].")) - return TRUE - reagents.trans_to_holder(W.reagents, transferring) - user.visible_message(SPAN_NOTICE("\The [user] dunks \the [W] in \the [src].")) - return TRUE - - var/obj/item/utensil/utensil = W - if(istype(utensil) && (utensil.utensil_flags & UTENSIL_FLAG_SCOOP)) - if(utensil.loaded_food) - to_chat(user, SPAN_WARNING("You already have something on \the [utensil].")) - return TRUE - if(!reagents?.total_volume) - to_chat(user, SPAN_WARNING("\The [src] is empty.")) - return TRUE - seperate_food_chunk(utensil, user) - if(utensil.loaded_food?.reagents?.total_volume) - to_chat(user, SPAN_NOTICE("You scoop up some of \the [utensil.loaded_food.reagents.get_primary_reagent_name()] with \the [utensil].")) - return TRUE - - return ..() - // Predefined soup types for mapping. /obj/item/chems/glass/bowl/mapped abstract_type = /obj/item/chems/glass/bowl/mapped @@ -181,6 +133,17 @@ DATA_MASK_COLOR = "#faa005" ) +/obj/item/chems/glass/bowl/mapped/noodlesoup + abstract_type = /obj/item/chems/glass/bowl/mapped/noodlesoup + initial_reagent_type = /decl/material/liquid/nutriment/soup/noodle + +/obj/item/chems/glass/bowl/mapped/noodlesoup/chicken/get_initial_reagent_data() + return list( + DATA_TASTE = list("chicken" = 1, "carrot" = 1), + DATA_INGREDIENT_LIST = list("chicken" = 1, "carrot" = 1), + DATA_INGREDIENT_FLAGS = (ALLERGEN_VEGETABLE | ALLERGEN_MEAT), + ) + // Mystery soup is special/stupid. /obj/item/chems/glass/bowl/mystery var/drained = FALSE diff --git a/code/modules/reagents/reagent_containers/bucket.dm b/code/modules/reagents/reagent_containers/bucket.dm index 1e072a63217..e2e5c9f2e56 100644 --- a/code/modules/reagents/reagent_containers/bucket.dm +++ b/code/modules/reagents/reagent_containers/bucket.dm @@ -15,6 +15,12 @@ drop_sound = 'sound/foley/donk1.ogg' pickup_sound = 'sound/foley/pickup2.ogg' +/obj/item/chems/glass/bucket/get_edible_material_amount(mob/eater) + return 0 + +/obj/item/chems/glass/bucket/get_utensil_food_type() + return null + /obj/item/chems/glass/bucket/attackby(var/obj/D, mob/user) if(istype(D, /obj/item/mop)) if(reagents.total_volume < 1) @@ -44,7 +50,7 @@ desc = "It's a wooden bucket. How rustic." icon = 'icons/obj/items/wooden_bucket.dmi' volume = 200 - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak material_alteration = MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_COLOR // name is already modified /// The material used for the chain, belts, and rivets holding the wood together, typically iron or steel. /// Mostly used for visual and matter reasons. Initially a typepath, set to a decl on init. diff --git a/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm b/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm index b534f6bc812..4236c186754 100644 --- a/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm +++ b/code/modules/reagents/reagent_containers/condiments/condiment_appearance.dm @@ -75,7 +75,7 @@ condiment_center_of_mass = @'{"x":16,"y":8}' /decl/condiment_appearance/cornoil - condiment_type = /decl/material/liquid/nutriment/cornoil + condiment_type = /decl/material/liquid/oil/plant/corn condiment_name = "corn oil" condiment_desc = "A delicious oil used in cooking. Made from corn." condiment_icon = 'icons/obj/food/condiments/cornoil.dmi' diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 809c6cedb83..386ad49b09a 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -39,23 +39,6 @@ var/global/const/DRINK_ICON_NOISY = "noise" if(obj_flags & OBJ_FLAG_HOLLOW) . /= HOLLOW_OBJECT_MATTER_MULTIPLIER -/obj/item/chems/drinks/glass2/examine(mob/M) - . = ..() - - for(var/I in extras) - if(istype(I, /obj/item/glass_extra)) - to_chat(M, "There is \a [I] in \the [src].") - else if(istype(I, /obj/item/food/processed_grown/slice)) - to_chat(M, "There is \a [I] on the rim.") - else - to_chat(M, "There is \a [I] somewhere on the glass. Somehow.") - - if(has_ice()) - to_chat(M, "There is some ice floating in the drink.") - - if(has_fizz()) - to_chat(M, "It is fizzing slightly.") - /obj/item/chems/drinks/glass2/proc/has_ice() if(LAZYLEN(reagents.reagent_volumes)) var/decl/material/R = reagents.get_primary_reagent_decl() @@ -113,7 +96,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" /obj/item/chems/drinks/glass2/examine(mob/user, distance) . = ..() - if(!istype(user) || distance > 1) + if(!istype(user)) return var/list/extra_text for(var/extra in extras) @@ -122,8 +105,14 @@ var/global/const/DRINK_ICON_NOISY = "noise" LAZYADD(extra_text, GE.glass_desc) else if(istype(extra, /obj/item/food/processed_grown/slice)) LAZYADD(extra_text, "There is \a [extra] on the rim.") + else + to_chat(user, "There is \a [extra] somewhere on the glass. Somehow.") if(length(extra_text)) to_chat(user, SPAN_NOTICE(jointext(extra_text," "))) + if(has_ice()) + to_chat(user, "There is some ice floating in the drink.") + if(has_fizz()) + to_chat(user, "It is fizzing slightly.") /obj/item/chems/drinks/glass2/proc/get_filling_overlay(amount, overlay) @@ -207,7 +196,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" /obj/item/chems/drinks/glass2/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/utensil/spoon)) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) user.visible_message("[user] bashes \the [src] with a spoon, shattering it to pieces! What a rube.") playsound(src, "shatter", 30, 1) if(reagents) diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index d1f01780b6e..d80b593cf60 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -57,7 +57,7 @@ return return ..() -/obj/item/chems/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) +/obj/item/chems/drinks/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) return do_open_check(user) && ..() /obj/item/chems/drinks/standard_pour_into(var/mob/user, var/atom/target) @@ -148,7 +148,7 @@ add_to_reagents(/decl/material/liquid/drink/milk/chocolate, reagents.maximum_volume) /obj/item/chems/drinks/coffee - name = "\improper Robust Coffee" + name = "cup of coffee" desc = "Careful, the beverage you're about to enjoy is extremely hot." icon_state = "coffee" center_of_mass = @'{"x":15,"y":10}' @@ -269,16 +269,14 @@ //tea and tea accessories /obj/item/chems/drinks/tea - name = "cup of tea master item" + name = "cup of tea" 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}' filling_states = @"[100]" - base_name = "cup" base_icon = "cup" volume = 30 - presentation_flags = PRESENTATION_FLAG_NAME /obj/item/chems/drinks/tea/black name = "cup of black tea" diff --git a/code/modules/reagents/reagent_containers/drinks/bottle.dm b/code/modules/reagents/reagent_containers/drinks/bottle.dm index 1bca3f9d3a0..56e5f6b4720 100644 --- a/code/modules/reagents/reagent_containers/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/drinks/bottle.dm @@ -34,14 +34,14 @@ //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(material?.is_brittle() && TT.thrower && TT.thrower.a_intent != I_HELP) + if(material?.is_brittle() && TT.thrower && !TT.thrower.check_intent(I_FLAG_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(!material?.is_brittle()) return 0 - if(rag && rag.on_fire) // Molotovs should be somewhat reliable, they're a pain to make. + if(rag?.is_on_fire()) // Molotovs should be somewhat reliable, they're a pain to make. return TRUE if(!smash_duration) return 0 @@ -68,13 +68,13 @@ if(rag) rag.dropInto(T) while(T) + if(!rag || QDELETED(src) || !HasBelow(T.z) || !T.is_open()) + break rag.forceMove(T) - if(rag.on_fire) + if(rag.is_on_fire()) T.hotspot_expose(700, 5) for(var/mob/living/M in T.contents) - M.IgniteMob() - if(!rag || QDELETED(src) || !HasBelow(T.z) || !T.is_open()) - break + M.ignite_fire() T = GetBelow(T) rag = null @@ -148,7 +148,7 @@ . = ..() underlays.Cut() if(rag) - var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.on_fire? "[rag_underlay]_lit" : rag_underlay) + var/underlay_image = image(icon='icons/obj/drinks.dmi', icon_state=rag.is_on_fire()? "[rag_underlay]_lit" : rag_underlay) underlays += underlay_image set_light(rag.light_range, 0.1, rag.light_color) else @@ -157,7 +157,7 @@ /obj/item/chems/drinks/bottle/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) . = ..() - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) return if(!smash_check(1)) return //won't always break on the first hit @@ -168,7 +168,7 @@ user.visible_message(SPAN_DANGER("\The [user] smashes \the [src] into [H]'s [affecting.name]!")) // You are going to knock someone out for longer if they are not wearing a helmet. var/blocked = target.get_blocked_ratio(hit_zone, BRUTE, damage = 10) * 100 - var/weaken_duration = smash_duration + min(0, get_attack_force(user) - blocked + 10) + var/weaken_duration = smash_duration + min(0, expend_attack_force(user) - blocked + 10) if(weaken_duration) target.apply_effect(min(weaken_duration, 5), WEAKEN, blocked) // Never weaken more than a flash! else @@ -178,8 +178,8 @@ if(reagents) user.visible_message(SPAN_NOTICE("The contents of \the [src] splash all over [target]!")) reagents.splash(target, reagents.total_volume) - if(rag && rag.on_fire && istype(target)) - target.IgniteMob() + if(rag?.is_on_fire() && istype(target)) + target.ignite_fire() //Finally, smash the bottle. This kills (qdel) the bottle. var/obj/item/broken_bottle/B = smash(target.loc, target) @@ -228,8 +228,7 @@ throw_range = 5 item_state = "beer" attack_verb = list("stabbed", "slashed", "attacked") - sharp = 1 - edge = 0 + sharp = TRUE obj_flags = OBJ_FLAG_HOLLOW material = /decl/material/solid/glass _base_attack_force = 9 @@ -251,7 +250,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/gin/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/gin, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/gin, reagents.maximum_volume) /obj/item/chems/drinks/bottle/whiskey name = "Uncle Git's Special Reserve" @@ -260,7 +259,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/whiskey/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/whiskey, reagents.maximum_volume) /obj/item/chems/drinks/bottle/agedwhiskey name = "aged whiskey" @@ -269,7 +268,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/agedwhiskey/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/aged_whiskey, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/aged_whiskey, reagents.maximum_volume) /obj/item/chems/drinks/bottle/vodka name = "Tunguska Triple Distilled" @@ -278,7 +277,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vodka/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vodka, reagents.maximum_volume) /obj/item/chems/drinks/bottle/tequila name = "Caccavo Guaranteed Quality tequila" @@ -287,7 +286,7 @@ center_of_mass = @'{"x":16,"y":3}' /obj/item/chems/drinks/bottle/tequila/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/tequila, reagents.maximum_volume) /obj/item/chems/drinks/bottle/patron name = "Wrapp Artiste Patron" @@ -296,7 +295,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/patron/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/tequila, reagents.maximum_volume - 5) + add_to_reagents(/decl/material/liquid/alcohol/tequila, reagents.maximum_volume - 5) add_to_reagents(/decl/material/solid/metal/silver, 5) /obj/item/chems/drinks/bottle/rum @@ -306,7 +305,7 @@ center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/bottle/rum/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/rum, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/rum, reagents.maximum_volume) /obj/item/chems/drinks/bottle/holywater name = "Flask of Holy Water" @@ -324,7 +323,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/vermouth/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vermouth, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vermouth, reagents.maximum_volume) /obj/item/chems/drinks/bottle/kahlua name = "Robert Robust's Coffee Liqueur" @@ -333,7 +332,7 @@ center_of_mass = @'{"x":17,"y":3}' /obj/item/chems/drinks/bottle/kahlua/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/coffee, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/coffee, reagents.maximum_volume) /obj/item/chems/drinks/bottle/goldschlager name = "College Girl Goldschlager" @@ -342,7 +341,7 @@ center_of_mass = @'{"x":15,"y":3}' /obj/item/chems/drinks/bottle/goldschlager/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/vodka, reagents.maximum_volume - 5) + add_to_reagents(/decl/material/liquid/alcohol/vodka, reagents.maximum_volume - 5) add_to_reagents(/decl/material/solid/metal/gold, 5) /obj/item/chems/drinks/bottle/cognac @@ -352,7 +351,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/cognac/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/cognac, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/cognac, reagents.maximum_volume) /obj/item/chems/drinks/bottle/wine name = "Doublebeard Bearded Special Wine" @@ -361,7 +360,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/wine/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/wine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine, reagents.maximum_volume) /obj/item/chems/drinks/bottle/absinthe name = "Jailbreaker Verte" @@ -370,7 +369,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/absinthe/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/absinthe, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/absinthe, reagents.maximum_volume) /obj/item/chems/drinks/bottle/melonliquor name = "Emeraldine Melon Liquor" @@ -379,7 +378,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/melonliquor/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/melonliquor, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/melonliquor, reagents.maximum_volume) /obj/item/chems/drinks/bottle/bluecuracao name = "Miss Blue Curacao" @@ -388,7 +387,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/bluecuracao/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/bluecuracao, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/bluecuracao, reagents.maximum_volume) /obj/item/chems/drinks/bottle/herbal name = "Liqueur d'Herbe" @@ -397,7 +396,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/herbal/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/herbal, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/herbal, reagents.maximum_volume) /obj/item/chems/drinks/bottle/grenadine name = "Briar Rose Grenadine Syrup" @@ -442,7 +441,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/pwine/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/pwine, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/pwine, reagents.maximum_volume) /obj/item/chems/drinks/bottle/sake name = "Takeo Sadow's Combined Sake" @@ -451,7 +450,7 @@ center_of_mass = @'{"x":16,"y":4}' /obj/item/chems/drinks/bottle/sake/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/sake, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/sake, reagents.maximum_volume) /obj/item/chems/drinks/bottle/champagne @@ -463,7 +462,7 @@ var/opening /obj/item/chems/drinks/bottle/champagne/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/champagne, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/champagne, reagents.maximum_volume) /obj/item/chems/drinks/bottle/champagne/open(mob/user) if(ATOM_IS_OPEN_CONTAINER(src)) @@ -498,7 +497,7 @@ center_of_mass = @'{"x":16,"y":6}' /obj/item/chems/drinks/bottle/jagermeister/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/jagermeister, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/jagermeister, reagents.maximum_volume) //////////////////////////PREMIUM ALCOHOL /////////////////////// /obj/item/chems/drinks/bottle/premiumvodka @@ -511,20 +510,25 @@ var/namepick = pick("Four Stripes","Gilgamesh","Novaya Zemlya","Indie","STS-35") var/typepick = pick("Absolut","Gold","Quadruple Distilled","Platinum","Standard") name = "[namepick] [typepick]" - add_to_reagents(/decl/material/liquid/ethanol/vodka/premium, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/vodka/premium, reagents.maximum_volume) /obj/item/chems/drinks/bottle/premiumwine name = "Uve De Blanc" desc = "You feel pretentious just looking at it." icon_state = "premiumwine" center_of_mass = @'{"x":16,"y":4}' + var/aged_min = 0 + var/aged_max = 150 -/obj/item/chems/drinks/bottle/premiumwine/populate_reagents() +/obj/item/chems/drinks/bottle/premiumwine/proc/make_random_name() var/namepick = pick("Calumont","Sciacchemont","Recioto","Torcalota") - var/agedyear = rand(global.using_map.game_year - 150, global.using_map.game_year) - name = "Chateau [namepick] De Blanc" + return "bottle of Chateau [namepick] De Blanc" + +/obj/item/chems/drinks/bottle/premiumwine/populate_reagents() + var/agedyear = rand(global.using_map.game_year - aged_max, global.using_map.game_year - aged_min) + set_custom_name(make_random_name()) desc += " This bottle is marked as [agedyear] Vintage." - add_to_reagents(/decl/material/liquid/ethanol/wine/premium, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/wine/premium, reagents.maximum_volume) //////////////////////////JUICES AND STUFF /////////////////////// @@ -607,7 +611,7 @@ center_of_mass = @'{"x":16,"y":12}' /obj/item/chems/drinks/bottle/small/beer/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/item/chems/drinks/bottle/small/ale name = "\improper Magm-Ale" @@ -617,7 +621,7 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/bottle/small/ale/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/ale, reagents.maximum_volume) /obj/item/chems/drinks/bottle/small/gingerbeer name = "Ginger Beer" diff --git a/code/modules/reagents/reagent_containers/drinks/cans.dm b/code/modules/reagents/reagent_containers/drinks/cans.dm index 21e60c118a1..285fd84391e 100644 --- a/code/modules/reagents/reagent_containers/drinks/cans.dm +++ b/code/modules/reagents/reagent_containers/drinks/cans.dm @@ -50,7 +50,7 @@ center_of_mass = @'{"x":16,"y":8}' /obj/item/chems/drinks/cans/thirteenloko/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/thirteenloko, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/thirteenloko, reagents.maximum_volume) /obj/item/chems/drinks/cans/dr_gibb name = "\improper Dr. Gibb" @@ -203,7 +203,7 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/speer/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer/good, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer/good, reagents.maximum_volume) /obj/item/chems/drinks/cans/ale name = "\improper Magm-Ale" @@ -212,4 +212,4 @@ center_of_mass = @'{"x":16,"y":10}' /obj/item/chems/drinks/cans/ale/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/ale, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/ale, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index c8412e988a5..bb8ea65e64b 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -30,7 +30,7 @@ var/trans = 0 if(ismob(target)) - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) return var/time = 20 //2/3rds the time of a syringe diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index c28d70364f6..55309ff3d2c 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -142,7 +142,7 @@ /obj/item/food/Destroy() QDEL_NULL(plate) trash = null - if(contents) + if(length(contents)) for(var/atom/movable/something in contents) something.dropInto(loc) . = ..() diff --git a/code/modules/reagents/reagent_containers/food/eggs.dm b/code/modules/reagents/reagent_containers/food/eggs.dm index bf707313e55..ea7851b65ed 100644 --- a/code/modules/reagents/reagent_containers/food/eggs.dm +++ b/code/modules/reagents/reagent_containers/food/eggs.dm @@ -39,10 +39,10 @@ var/clr = W.get_tool_property(TOOL_PEN, TOOL_PROP_COLOR_NAME) if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, SPAN_WARNING("The egg refuses to take on this color!")) + to_chat(user, SPAN_WARNING("The egg refuses to take on this color!")) return TRUE - to_chat(usr, SPAN_NOTICE("You color \the [src] [clr]")) + to_chat(user, SPAN_NOTICE("You color \the [src] [clr]")) icon_state = "egg-[clr]" return TRUE return ..() diff --git a/code/modules/reagents/reagent_containers/food/fish.dm b/code/modules/reagents/reagent_containers/food/fish.dm index d4a3a57106b..fd8ec91188e 100644 --- a/code/modules/reagents/reagent_containers/food/fish.dm +++ b/code/modules/reagents/reagent_containers/food/fish.dm @@ -70,7 +70,7 @@ qdel(src) /obj/item/mollusc/attackby(var/obj/item/thing, var/mob/user) - if(thing.sharp || thing.edge) + if(thing.is_sharp() || thing.has_edge()) user.visible_message(SPAN_NOTICE("\The [user] cracks open \the [src] with \the [thing].")) crack_shell(user) return TRUE diff --git a/code/modules/reagents/reagent_containers/food/lunch.dm b/code/modules/reagents/reagent_containers/food/lunch.dm index b027e451e05..fc4f92672c1 100644 --- a/code/modules/reagents/reagent_containers/food/lunch.dm +++ b/code/modules/reagents/reagent_containers/food/lunch.dm @@ -69,10 +69,10 @@ var/global/list/lunchables_drink_reagents_ = list( // This default list is a bit different, it contains items we don't want var/global/list/lunchables_ethanol_reagents_ = list( - /decl/material/liquid/ethanol/coffee, - /decl/material/liquid/ethanol/hooch, - /decl/material/liquid/ethanol/thirteenloko, - /decl/material/liquid/ethanol/pwine + /decl/material/liquid/alcohol/coffee, + /decl/material/liquid/alcohol/hooch, + /decl/material/liquid/alcohol/thirteenloko, + /decl/material/liquid/alcohol/pwine ) /proc/lunchables_lunches() @@ -97,7 +97,7 @@ var/global/list/lunchables_ethanol_reagents_ = list( /proc/lunchables_ethanol_reagents() if(!(lunchables_ethanol_reagents_[lunchables_ethanol_reagents_[1]])) - lunchables_ethanol_reagents_ = init_lunchable_reagent_list(lunchables_ethanol_reagents_, /decl/material/liquid/ethanol) + lunchables_ethanol_reagents_ = init_lunchable_reagent_list(lunchables_ethanol_reagents_, /decl/material/liquid/alcohol) return lunchables_ethanol_reagents_ /proc/init_lunchable_list(var/list/lunches) @@ -107,11 +107,11 @@ var/global/list/lunchables_ethanol_reagents_ = list( .[initial(O.name)] = lunch return sortTim(., /proc/cmp_text_asc) -/proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_types) +/proc/init_lunchable_reagent_list(var/list/banned_reagents, var/reagent_type) . = list() - for(var/reagent_type in subtypesof(reagent_types)) - if(reagent_type in banned_reagents) + for(var/reagent_subtype in decls_repository.get_decls_of_type(reagent_type)) + if(reagent_subtype in banned_reagents) continue - var/decl/material/reagent = reagent_type - .[initial(reagent.name)] = reagent_type + var/decl/material/reagent = reagent_subtype + .[initial(reagent.name)] = reagent_subtype return sortTim(., /proc/cmp_text_asc) diff --git a/code/modules/reagents/reagent_containers/food/meat/fish.dm b/code/modules/reagents/reagent_containers/food/meat/fish.dm index 80b15eae9fb..4036cb4efe7 100644 --- a/code/modules/reagents/reagent_containers/food/meat/fish.dm +++ b/code/modules/reagents/reagent_containers/food/meat/fish.dm @@ -29,7 +29,7 @@ /obj/item/food/fishandchips name = "fish and chips" desc = "Best enjoyed wrapped in a newspaper on a cold wet day." - icon = 'icons/obj/food/fried/fishfingers.dmi' + icon = 'icons/obj/food/fried/fishandchips.dmi' filling_color = "#e3d796" center_of_mass = @'{"x":16,"y":16}' nutriment_desc = list("salt" = 1, "chips" = 2, "fish" = 2) diff --git a/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm b/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm index f387e9af0e7..6c6cf548fe6 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm @@ -49,7 +49,7 @@ return FALSE /obj/item/pizzabox/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag && user?.a_intent == I_HURT && user != target) + if(proximity_flag && user?.check_intent(I_FLAG_HARM) && user != target) jostle_pizza() explode_stack() @@ -189,7 +189,7 @@ /obj/item/pizzabox/attack_hand(mob/user) - if(open && pizza && user.a_intent != I_GRAB) + if(open && pizza && !user.check_intent(I_FLAG_GRAB)) if(user.check_dexterity(DEXTERITY_HOLD_ITEM)) user.put_in_hands(pizza) to_chat(user, SPAN_NOTICE("You take \the [pizza] out of \the [src].")) @@ -304,6 +304,7 @@ /decl/interaction_handler/open_pizza_box expected_target_type = /obj/item/pizzabox + examine_desc = "open or close $TARGET_THEM$" /decl/interaction_handler/open_pizza_box/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm deleted file mode 100644 index 64473fa9530..00000000000 --- a/code/modules/reagents/reagent_containers/glass.dm +++ /dev/null @@ -1,100 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -/// (Mixing)Glass. -//////////////////////////////////////////////////////////////////////////////// -/obj/item/chems/glass - name = "" - desc = "" - icon_state = "null" - item_state = "null" - amount_per_transfer_from_this = 10 - possible_transfer_amounts = @"[5,10,15,25,30,60]" - volume = 60 - w_class = ITEM_SIZE_SMALL - atom_flags = ATOM_FLAG_OPEN_CONTAINER - obj_flags = OBJ_FLAG_HOLLOW - material = /decl/material/solid/glass - abstract_type = /obj/item/chems/glass - drop_sound = 'sound/foley/bottledrop1.ogg' - pickup_sound = 'sound/foley/bottlepickup1.ogg' - watertight = FALSE // /glass uses the open container flag for this - - var/list/can_be_placed_into = list( - /obj/machinery/chem_master/, - /obj/machinery/chemical_dispenser, - /obj/machinery/reagentgrinder, - /obj/structure/table, - /obj/structure/closet, - /obj/structure/hygiene/sink, - /obj/item/grenade/chem_grenade, - /mob/living/bot/medbot, - /obj/item/secure_storage/safe, - /obj/structure/iv_drip, - /obj/machinery/disposal, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/goat, - /obj/machinery/sleeper, - /obj/machinery/smartfridge/, - /obj/machinery/biogenerator, - /obj/machinery/constructable_frame, - /obj/machinery/radiocarbon_spectrometer, - /obj/machinery/material_processing/extractor - ) - -/obj/item/chems/glass/examine(mob/user, distance) - . = ..() - if(distance > 2) - return - - if(reagents?.total_volume) - to_chat(user, SPAN_NOTICE("It contains [reagents.total_volume] units of reagents.")) - else - to_chat(user, SPAN_NOTICE("It is empty.")) - if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user,SPAN_NOTICE("The airtight lid seals it completely.")) - -/obj/item/chems/glass/proc/can_lid() - return TRUE - -/obj/item/chems/glass/attack_self() - . = ..() - if(!. && can_lid()) - if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(usr, SPAN_NOTICE("You put the lid on \the [src].")) - atom_flags ^= ATOM_FLAG_OPEN_CONTAINER - else - to_chat(usr, SPAN_NOTICE("You take the lid off \the [src].")) - atom_flags |= ATOM_FLAG_OPEN_CONTAINER - update_icon() - -/obj/item/chems/glass/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(get_attack_force(user) && !(item_flags & ITEM_FLAG_NO_BLUDGEON) && user.a_intent == I_HURT) - return ..() - return FALSE - -/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. - if(target?.storage) - return TRUE - for(var/type in can_be_placed_into) //Is it something it can be placed into? - if(istype(target, type)) - return TRUE - if(standard_dispenser_refill(user, target)) //Are they clicking a water tank/some dispenser? - return TRUE - if(standard_pour_into(user, target)) //Pouring into another beaker? - return TRUE - if(handle_eaten_by_mob(user, target) != EATEN_INVALID) - return TRUE - if(user.a_intent == I_HURT) - if(standard_splash_mob(user,target)) - return TRUE - if(reagents && reagents.total_volume) - to_chat(user, SPAN_DANGER("You splash the contents of \the [src] onto \the [target].")) - reagents.splash(target, reagents.total_volume) - return TRUE - else if(reagents && reagents.total_volume) - to_chat(user, SPAN_NOTICE("You splash a small amount of the contents of \the [src] onto \the [target].")) - reagents.splash(target, min(reagents.total_volume, 5)) - return TRUE - . = ..() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index af8367645f7..be5659ebba4 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -185,6 +185,7 @@ . = ..() if(label_text) update_name() + update_icon() /obj/item/chems/hypospray/autoinjector/populate_reagents() SHOULD_CALL_PARENT(TRUE) @@ -192,10 +193,6 @@ if(reagents?.total_volume > 0 && autolabel && !label_text) // don't override preset labels label_text = "[reagents.get_primary_reagent_name()], [reagents.total_volume]u" -/obj/item/chems/hypospray/autoinjector/Initialize() - . = ..() - update_icon() - /obj/item/chems/hypospray/autoinjector/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) . = ..() if(.) diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 275a3bac13d..19eaaa9cd1d 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -62,7 +62,7 @@ if(user == target) user.visible_message( SPAN_NOTICE("\The [user] inhales from \the [src]."), - SPAN_NOTICE("You stick the \the [src] in your mouth and press the injection button.") + SPAN_NOTICE("You stick \the [src] in your mouth and press the injection button.") ) else user.visible_message( diff --git a/code/modules/reagents/reagent_containers/mortar.dm b/code/modules/reagents/reagent_containers/mortar.dm index fe85a5c09fe..b19a7340e23 100644 --- a/code/modules/reagents/reagent_containers/mortar.dm +++ b/code/modules/reagents/reagent_containers/mortar.dm @@ -28,7 +28,7 @@ var/decl/material/attacking_material = using_item.get_material() var/decl/material/crushing_material = crushing_item?.get_material() var/skill_factor = CLAMP01(1 + 0.3*(user.get_skill_value(SKILL_CHEMISTRY) - SKILL_EXPERT)/(SKILL_EXPERT - SKILL_MIN)) - if(using_item.get_attack_force(user) <= 0 || !attacking_material || !crushing_material) + if(using_item.expend_attack_force(user) <= 0 || !attacking_material || !crushing_material) return TRUE if(attacking_material.hardness <= crushing_material.hardness) to_chat(user, SPAN_NOTICE("\The [using_item] is not hard enough to crush \the [crushing_item].")) diff --git a/code/modules/reagents/reagent_containers/packets.dm b/code/modules/reagents/reagent_containers/packets.dm index c46af37998f..391c3440471 100644 --- a/code/modules/reagents/reagent_containers/packets.dm +++ b/code/modules/reagents/reagent_containers/packets.dm @@ -7,7 +7,14 @@ amount_per_transfer_from_this = 1 volume = 10 -/obj/item/chems/packet/afterattack(var/obj/target, var/mob/user, var/proximity) +/obj/item/chems/packet/attack_self(mob/user) + if(!ATOM_IS_OPEN_CONTAINER(src)) + atom_flags |= ATOM_FLAG_OPEN_CONTAINER + to_chat(user, SPAN_NOTICE("You tear \the [src] open.")) + return TRUE + return ..() + +/obj/item/chems/packet/afterattack(obj/target, mob/user, proximity) if(!proximity) return ..() if(standard_dispenser_refill(user, target)) @@ -54,6 +61,14 @@ icon = 'icons/obj/food/condiments/packets/packet_medium.dmi' /obj/item/chems/packet/honey/populate_reagents() + add_to_reagents(/decl/material/liquid/nutriment/honey, reagents.maximum_volume) + +/obj/item/chems/packet/honey_fake + name = "'honey' packet" + desc = "Contains 10u of allergen-free non-GMO 'honey'." + icon = 'icons/obj/food/condiments/packets/packet_medium.dmi' + +/obj/item/chems/packet/honey_fake/populate_reagents() add_to_reagents(/decl/material/liquid/nutriment/sugar, reagents.maximum_volume) /obj/item/chems/packet/capsaicin diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 2df686595f8..c3b4cbd9ff8 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -36,9 +36,6 @@ if(A?.storage || istype(A, /obj/structure/table) || istype(A, /obj/structure/closet) || istype(A, /obj/item/chems) || istype(A, /obj/structure/hygiene/sink) || istype(A, /obj/structure/janitorialcart)) return - if(istype(A, /spell)) - return - if(proximity) if(standard_dispenser_refill(user, A)) return @@ -50,7 +47,7 @@ Spray_at(A, user, proximity) if(reagents.has_reagent(/decl/material/liquid/acid)) - log_and_message_admins("fired sulphuric acid from \a [src].", user) + log_and_message_admins("fired sulfuric acid from \a [src].", user) if(reagents.has_reagent(/decl/material/liquid/acid/polyacid)) log_and_message_admins("fired polyacid from \a [src].", user) if(reagents.has_reagent(/decl/material/liquid/lube)) @@ -85,7 +82,7 @@ /obj/item/chems/spray/attack_self(var/mob/user) if(has_safety()) - toggle_safety() + toggle_safety(user) return TRUE else //If no safety, we just toggle the nozzle @@ -98,9 +95,9 @@ /obj/item/chems/spray/proc/has_safety() return FALSE -/obj/item/chems/spray/proc/toggle_safety() +/obj/item/chems/spray/proc/toggle_safety(mob/user) safety = !safety - to_chat(usr, SPAN_NOTICE("You switch the safety [safety ? "on" : "off"].")) + to_chat(user, SPAN_NOTICE("You switch the safety [safety ? "on" : "off"].")) /obj/item/chems/spray/examine(mob/user, distance) . = ..() @@ -109,7 +106,7 @@ if(has_safety() && distance <= 1) to_chat(user, "The safety is [safety ? "on" : "off"].") -/obj/item/chems/get_alt_interactions(mob/user) +/obj/item/chems/spray/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/empty/chems) LAZYADD(., /decl/interaction_handler/next_spray_amount) @@ -119,6 +116,7 @@ name = "Next Nozzle Setting" expected_target_type = /obj/item/chems/spray interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION + examine_desc = "select the next nozzle spray amount" /decl/interaction_handler/next_spray_amount/is_possible(obj/item/chems/spray/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index af3b52c34c2..0018d127862 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -17,7 +17,7 @@ volume = 15 w_class = ITEM_SIZE_TINY slot_flags = SLOT_EARS - sharp = 1 + sharp = TRUE item_flags = ITEM_FLAG_NO_BLUDGEON var/mode = SYRINGE_DRAW @@ -82,7 +82,7 @@ if(!target.reagents) return - if((user.a_intent == I_HURT) && ismob(target)) + if((user.check_intent(I_FLAG_HARM)) && ismob(target)) if(can_stab) syringestab(target, user) else diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 22877a3e341..778ed37be45 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -10,6 +10,7 @@ matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY) max_health = 100 tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + var/wrenchable = TRUE var/unwrenched = FALSE var/tmp/volume = 1000 @@ -37,9 +38,9 @@ if(!(. = ..())) return if(reagents?.total_volume > 0) - tool_interaction_flags = 0 + tool_interaction_flags &= ~TOOL_INTERACTION_DECONSTRUCT else - tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + tool_interaction_flags |= TOOL_INTERACTION_DECONSTRUCT /obj/structure/reagent_dispensers/initialize_reagents(populate = TRUE) if(!reagents) @@ -89,7 +90,7 @@ // We do this here to avoid putting the vessel straight into storage. // This is usually handled by afterattack on /chems. - if(storage && ATOM_IS_OPEN_CONTAINER(W) && user.a_intent == I_HELP) + if(storage && ATOM_IS_OPEN_CONTAINER(W) && user.check_intent(I_FLAG_HELP)) if(W.standard_dispenser_refill(user, src)) return TRUE if(W.standard_pour_into(user, src)) @@ -102,6 +103,7 @@ log_and_message_admins("opened a tank at [get_area_name(loc)].") leak() return TRUE + . = ..() /obj/structure/reagent_dispensers/verb/set_amount_dispensed() @@ -118,11 +120,6 @@ if (N) amount_dispensed = N -/obj/structure/reagent_dispensers/physically_destroyed(var/skip_qdel) - if(reagents?.total_volume) - reagents.trans_to_turf(get_turf(src), reagents.total_volume) - . = ..() - /obj/structure/reagent_dispensers/explosion_act(severity) . = ..() if(. && (severity == 1) || (severity == 2 && prob(50)) || (severity == 3 && prob(5))) @@ -256,7 +253,7 @@ /obj/structure/reagent_dispensers/water_cooler name = "water cooler" desc = "A machine that dispenses cool water to drink." - icon = 'icons/obj/vending.dmi' + icon = 'icons/obj/structures/water_cooler.dmi' icon_state = "water_cooler" possible_transfer_amounts = null amount_dispensed = 5 @@ -299,10 +296,15 @@ qdel(C) cups++ return TRUE + return ..() +/obj/structure/reagent_dispensers/water_cooler/on_reagent_change() . = ..() - if(!. && ATOM_IS_OPEN_CONTAINER(W)) - flick("[icon_state]-vend", src) + // Bubbles in top of cooler. + if(reagents?.total_volume) + var/vend_state = "[icon_state]-vend" + if(check_state_in_icon(vend_state, icon)) + flick(vend_state, src) /obj/structure/reagent_dispensers/beerkeg name = "beer keg" @@ -314,14 +316,15 @@ matter = list(/decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_TRACE) /obj/structure/reagent_dispensers/beerkeg/populate_reagents() - add_to_reagents(/decl/material/liquid/ethanol/beer, reagents.maximum_volume) + add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/structure/reagent_dispensers/acid - name = "sulphuric acid dispenser" + name = "sulfuric acid dispenser" desc = "A dispenser of acid for industrial processes." icon_state = "acidtank" amount_dispensed = 10 anchored = TRUE + density = FALSE /obj/structure/reagent_dispensers/acid/populate_reagents() add_to_reagents(/decl/material/liquid/acid, reagents.maximum_volume) @@ -351,6 +354,7 @@ /decl/interaction_handler/toggle_open/reagent_dispenser name = "Toggle refilling cap" expected_target_type = /obj/structure/reagent_dispensers + examine_desc = "open or close the refilling cap" /decl/interaction_handler/toggle_open/reagent_dispenser/invoked(atom/target, mob/user, obj/item/prop) if(target.atom_flags & ATOM_FLAG_OPEN_CONTAINER) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index a753cdde1c7..a50fa92e738 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -114,7 +114,7 @@ var/global/list/diversion_junctions = list() /obj/machinery/disposal/receive_mouse_drop(atom/dropping, mob/user, params) - . = (user?.a_intent != I_HURT && ..()) + . = (!user?.check_intent(I_FLAG_HARM) && ..()) if(!. && !(stat & BROKEN)) diff --git a/code/modules/recycling/disposalholder.dm b/code/modules/recycling/disposalholder.dm index 4f3546d06a6..7a95d7d2ce2 100644 --- a/code/modules/recycling/disposalholder.dm +++ b/code/modules/recycling/disposalholder.dm @@ -82,11 +82,11 @@ if(!curr) last.expel(src, loc, dir) - // find the turf which should contain the next pipe +/// find the turf which should contain the next pipe /obj/structure/disposalholder/proc/nextloc() return get_step(loc,dir) -// find a matching pipe on a turf +/// find a matching pipe on a turf /obj/structure/disposalholder/proc/findpipe(var/turf/containing_turf) if(!containing_turf) return null @@ -98,8 +98,8 @@ // if no matching pipe, return null return null -// merge two holder objects -// used when a a holder meets a stuck holder +/// merge two holder objects +/// used when a holder meets a stuck holder /obj/structure/disposalholder/proc/merge(var/obj/structure/disposalholder/other) for(var/atom/movable/other_movable in other) other_movable.forceMove(src) // move everything in other holder to this one @@ -119,7 +119,7 @@ else partialTag = new_tag -// called when player tries to move while in a pipe +/// called when player tries to move while in a pipe /obj/structure/disposalholder/relaymove(mob/user) if(!isliving(user)) return diff --git a/code/modules/recycling/disposalpipe.dm b/code/modules/recycling/disposalpipe.dm index 60401186373..88e11fbbdc6 100644 --- a/code/modules/recycling/disposalpipe.dm +++ b/code/modules/recycling/disposalpipe.dm @@ -184,8 +184,7 @@ if(H) expel(H, T, 0) - spawn(2) // delete pipe after 2 ticks to ensure expel proc finished - qdel(src) + QDEL_IN(src, 2) // delete pipe after 2 ticks to ensure expel proc finished // pipe affected by explosion @@ -232,37 +231,9 @@ qdel(src) -// pipe is deleted -// ensure if holder is present, it is expelled -/obj/structure/disposalpipe/Destroy() - var/obj/structure/disposalholder/H = locate() in src - if(H) - // holder was present - H.active = 0 - var/turf/T = src.loc - if(T.density) - // deleting pipe is inside a dense turf (wall) - // this is unlikely, but just dump out everything into the turf in case - - for(var/atom/movable/AM in H) - AM.forceMove(T) - AM.pipe_eject(0) - qdel(H) - return ..() - - // otherwise, do normal expel from turf - if(H) - expel(H, T, 0) - . = ..() - /obj/structure/disposalpipe/hides_under_flooring() return 1 -// *** TEST verb -//client/verb/dispstop() -// for(var/obj/structure/disposalholder/H in world) -// H.active = 0 - // a straight or bent segment /obj/structure/disposalpipe/segment icon_state = "pipe-s" // Sadly this var stores state. "pipe-c" is corner. Should be changed, but requires huge map diff. diff --git a/code/modules/recycling/wrapped_package.dm b/code/modules/recycling/wrapped_package.dm index fe3003c6773..da2a33bfd70 100644 --- a/code/modules/recycling/wrapped_package.dm +++ b/code/modules/recycling/wrapped_package.dm @@ -195,7 +195,7 @@ update_icon() return TRUE - else if(W.sharp && user.a_intent == I_HELP) + else if(W.is_sharp() && user.check_intent(I_FLAG_HELP)) //You can alternative cut the wrapper off with a sharp item unwrap(user) return TRUE diff --git a/code/modules/research/design_console.dm b/code/modules/research/design_console.dm index 73b6abc3255..5e2e43978ad 100644 --- a/code/modules/research/design_console.dm +++ b/code/modules/research/design_console.dm @@ -1,11 +1,16 @@ /obj/machinery/computer/design_console name = "design database console" desc = "A console for interfacing with a research and development design network." + maximum_component_parts = list( + /obj/item/stock_parts/item_holder/disk_reader = 1, + /obj/item/stock_parts = 15, + ) + /// A cached reference to our disk reader part, if present. + var/obj/item/stock_parts/item_holder/disk_reader/disk_reader var/initial_network_id var/initial_network_key var/list/local_cache - var/obj/item/disk/design_disk/disk var/obj/machinery/design_database/viewing_database var/showing_designs = FALSE @@ -13,36 +18,34 @@ . = ..() set_extension(src, /datum/extension/network_device, initial_network_id, initial_network_key, RECEIVER_STRONG_WIRELESS) +/obj/machinery/computer/design_console/Destroy() + viewing_database = null + disk_reader = null + return ..() + /obj/machinery/computer/design_console/modify_mapped_vars(map_hash) ..() ADJUST_TAG_VAR(initial_network_id, map_hash) +/obj/machinery/computer/design_console/RefreshParts() + . = ..() + disk_reader = get_component_of_type(/obj/item/stock_parts/item_holder/disk_reader) + if(disk_reader) + disk_reader.register_on_insert(CALLBACK(src, PROC_REF(update_ui))) + disk_reader.register_on_eject(CALLBACK(src, PROC_REF(update_ui))) + +/obj/machinery/computer/design_console/proc/try_get_disk() + return disk_reader?.get_inserted() + +/obj/machinery/computer/design_console/proc/update_ui() + SSnano.update_uis(src) + /obj/machinery/computer/design_console/handle_post_network_connection() ..() sync_network() -/obj/machinery/computer/design_console/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/design_disk)) - if(disk) - to_chat(user, SPAN_WARNING("\The [src] already has a disk inserted.")) - return TRUE - if(user.try_unequip(I, src)) - visible_message("\The [user] slots \the [I] into \the [src].") - disk = I - return TRUE - . = ..() - /obj/machinery/computer/design_console/proc/eject_disk(var/mob/user) - if(disk) - disk.dropInto(loc) - if(user) - if(!issilicon(user)) - user.put_in_hands(disk) - if(Adjacent(user, src)) - visible_message(SPAN_NOTICE("\The [user] removes \the [disk] from \the [src].")) - disk = null - return TRUE - return FALSE + return !!disk_reader.eject_item(user) /obj/machinery/computer/design_console/interface_interact(mob/user) ui_interact(user) @@ -55,9 +58,13 @@ var/datum/computer_network/network = device.get_network() data["network_id"] = device.network_tag + var/obj/item/disk/design_disk/disk = try_get_disk() if(disk) data["disk_name"] = disk.name - data["disk_tech"] = disk.blueprint ? disk.blueprint.name : "no design saved" + if(istype(disk)) + data["disk_tech"] = disk.blueprint ? disk.blueprint.name : "no design saved" + else + data["disk_tech"] = "invalid data format" else data["disk_name"] = "no disk loaded" @@ -159,7 +166,8 @@ if(href_list["save_design"]) var/datum/fabricator_recipe/design = locate(href_list["save_design"]) - if(istype(design) && disk) + var/obj/item/disk/design_disk/disk = try_get_disk() + if(istype(design) && istype(disk)) disk.blueprint = design disk.SetName("[initial(disk.name)] ([disk.blueprint.name])") return TOPIC_REFRESH @@ -219,20 +227,3 @@ var/list/techs = get_network_tech_levels() for(var/obj/machinery/fabricator/fab in network.get_devices_by_type(/obj/machinery/fabricator)) fab.refresh_design_cache(techs) - -/obj/machinery/computer/design_console/get_alt_interactions(var/mob/user) - . = ..() - LAZYADD(., /decl/interaction_handler/remove_disk/console) - -/decl/interaction_handler/remove_disk/console - expected_target_type = /obj/machinery/computer/design_console - -/decl/interaction_handler/remove_disk/console/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/computer/design_console/D = target - . = !!D.disk - -/decl/interaction_handler/remove_disk/console/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/computer/design_console/D = target - D.eject_disk(user) diff --git a/code/modules/research/design_database.dm b/code/modules/research/design_database.dm index 11e53477ef5..5c5a6b3cc41 100644 --- a/code/modules/research/design_database.dm +++ b/code/modules/research/design_database.dm @@ -17,12 +17,17 @@ var/global/list/default_initial_tech_levels construct_state = /decl/machine_construction/default/panel_closed uncreated_component_parts = null stat_immune = 0 + maximum_component_parts = list( + /obj/item/stock_parts/item_holder/disk_reader = 1, + /obj/item/stock_parts = 15, + ) + /// A cached reference to our disk reader part, if present. + var/obj/item/stock_parts/item_holder/disk_reader/disk_reader var/initial_network_id var/initial_network_key var/list/tech_levels var/need_disk_operation = FALSE - var/obj/item/disk/tech_disk/disk var/sync_policy = SYNC_PULL_NETWORK|SYNC_PUSH_NETWORK|SYNC_PULL_DISK /obj/machinery/design_database/proc/toggle_sync_policy_flag(var/sync_flag) @@ -36,13 +41,17 @@ var/global/list/default_initial_tech_levels var/list/data = list() var/datum/extension/network_device/device = get_extension(src, /datum/extension/network_device) data["network_id"] = device.network_tag + var/obj/item/disk/tech_disk/disk = try_get_disk() if(disk) data["disk_name"] = disk.name - var/list/tech_data = list() - for(var/tech in disk.stored_tech) - var/decl/research_field/field = SSfabrication.get_research_field_by_id(tech) - tech_data += list(list("field" = field.name, "desc" = field.desc, "level" = "[disk.stored_tech[tech]].0 GQ")) - data["disk_tech"] = tech_data + if(istype(disk)) + var/list/tech_data = list() + for(var/tech in disk.stored_tech) + var/decl/research_field/field = SSfabrication.get_research_field_by_id(tech) + tech_data += list(list("field" = field.name, "desc" = field.desc, "level" = "[disk.stored_tech[tech]].0 GQ")) + data["disk_tech"] = tech_data + else + data["disk_error"] = "invalid data format" else data["disk_name"] = "no disk loaded" @@ -116,26 +125,30 @@ var/global/list/default_initial_tech_levels return // Read or write from a loaded disk. + var/obj/item/disk/tech_disk/disk = try_get_disk() if(disk && need_disk_operation) - if(sync_policy & SYNC_PULL_DISK) - var/new_tech = FALSE - for(var/tech in disk.stored_tech) - if(tech_levels[tech] < disk.stored_tech[tech]) - tech_levels[tech] = disk.stored_tech[tech] - new_tech = TRUE - if(new_tech) - visible_message(SPAN_NOTICE("\The [src] clicks and chirps as it reads from \the [disk].")) - if((sync_policy & SYNC_PUSH_NETWORK) && !sync_design_consoles()) - visible_message(SPAN_WARNING("\The [src] flashes an error light from its network interface.")) - - if(sync_policy & SYNC_PUSH_DISK) - var/new_tech - for(var/tech in tech_levels) - if(tech_levels[tech] > LAZYACCESS(disk.stored_tech, tech)) - new_tech = TRUE - LAZYSET(disk.stored_tech, tech, tech_levels[tech]) - if(new_tech) - visible_message(SPAN_NOTICE("\The [src] whirrs and drones as it writes to \the [disk].")) + if(!istype(disk)) // wrong type of disk! + visible_message(SPAN_WARNING("\The [src] whirrs and drones, before emitting an ominous grinding sound.")) + else + if(sync_policy & SYNC_PULL_DISK) + var/new_tech = FALSE + for(var/tech in disk.stored_tech) + if(tech_levels[tech] < disk.stored_tech[tech]) + tech_levels[tech] = disk.stored_tech[tech] + new_tech = TRUE + if(new_tech) + visible_message(SPAN_NOTICE("\The [src] clicks and chirps as it reads from \the [disk].")) + if((sync_policy & SYNC_PUSH_NETWORK) && !sync_design_consoles()) + visible_message(SPAN_WARNING("\The [src] flashes an error light from its network interface.")) + + if(sync_policy & SYNC_PUSH_DISK) + var/new_tech + for(var/tech in tech_levels) + if(tech_levels[tech] > LAZYACCESS(disk.stored_tech, tech)) + new_tech = TRUE + LAZYSET(disk.stored_tech, tech, tech_levels[tech]) + if(new_tech) + visible_message(SPAN_NOTICE("\The [src] whirrs and drones as it writes to \the [disk].")) visible_message("The I/O light on \the [src] stops blinking.") need_disk_operation = FALSE @@ -148,49 +161,35 @@ var/global/list/default_initial_tech_levels /obj/machinery/design_database/Destroy() design_databases -= src - QDEL_NULL(disk) + disk_reader = null . = ..() -/obj/machinery/design_database/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/disk/tech_disk)) - if(disk) - to_chat(user, SPAN_WARNING("\The [src] already has a disk inserted.")) - return TRUE - if(user.try_unequip(I, src)) - visible_message("\The [user] slots \the [I] into \the [src].") - visible_message(SPAN_NOTICE("\The [src]'s I/O light begins to blink.")) - disk = I - need_disk_operation = TRUE - return TRUE +/obj/machinery/design_database/proc/on_insert_disk(obj/item/disk/D, mob/user) + visible_message(SPAN_NOTICE("\The [src]'s I/O light begins to blink.")) + need_disk_operation = TRUE + update_ui() - . = ..() +/obj/machinery/design_database/proc/on_eject_disk(obj/item/disk/D, mob/user) + need_disk_operation = FALSE + update_ui() -/obj/machinery/design_database/proc/eject_disk(var/mob/user) - if(disk) - disk.dropInto(loc) - need_disk_operation = FALSE - if(user) - if(!issilicon(user)) - user.put_in_hands(disk) - if(Adjacent(user, src)) - visible_message(SPAN_NOTICE("\The [user] removes \the [disk] from \the [src].")) - disk = null - return TRUE - return FALSE - -/obj/machinery/design_database/get_alt_interactions(var/mob/user) +/obj/machinery/design_database/RefreshParts() . = ..() - LAZYADD(., /decl/interaction_handler/remove_disk/designs) + disk_reader = get_component_of_type(/obj/item/stock_parts/item_holder/disk_reader) + if(disk_reader) + disk_reader.register_on_insert(CALLBACK(src, PROC_REF(on_insert_disk))) + disk_reader.register_on_eject(CALLBACK(src, PROC_REF(on_eject_disk))) -/decl/interaction_handler/remove_disk/designs - expected_target_type = /obj/machinery/design_database +/obj/machinery/design_database/proc/try_get_disk() + return disk_reader?.get_inserted() -/decl/interaction_handler/remove_disk/designs/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() - if(.) - var/obj/machinery/design_database/D = target - . = !!D.disk +/obj/machinery/design_database/proc/update_ui() + SSnano.update_uis(src) -/decl/interaction_handler/remove_disk/designs/invoked(atom/target, mob/user, obj/item/prop) - var/obj/machinery/design_database/D = target - D.eject_disk(user) +// used for, specifically, removing a disk via the UI +/obj/machinery/design_database/proc/eject_disk(var/mob/user) + if(!disk_reader) + to_chat(user, SPAN_WARNING("\The [src] has no disk drive installed.")) + return FALSE + . = !isnull(disk_reader.eject_item(user)) + update_ui() diff --git a/code/modules/research/design_database_analyzer.dm b/code/modules/research/design_database_analyzer.dm index ad1c78d239a..6750ea55a04 100644 --- a/code/modules/research/design_database_analyzer.dm +++ b/code/modules/research/design_database_analyzer.dm @@ -81,7 +81,7 @@ /obj/machinery/destructive_analyzer/attackby(var/obj/item/O, var/mob/user) - if(IS_MULTITOOL(O) && user.a_intent != I_HURT) + if(IS_MULTITOOL(O) && !user.check_intent(I_FLAG_HARM)) var/datum/extension/local_network_member/fabnet = get_extension(src, /datum/extension/local_network_member) fabnet.get_new_tag(user) return TRUE @@ -89,8 +89,8 @@ if(busy) to_chat(user, SPAN_WARNING("\The [src] is busy right now.")) return TRUE - if(component_attackby(O, user)) - return TRUE + if((. = component_attackby(O, user))) + return if(isrobot(user)) return TRUE if(loaded_item) diff --git a/code/modules/sealant_gun/sealant_injector.dm b/code/modules/sealant_gun/sealant_injector.dm index a3e89a44343..99f8553586d 100644 --- a/code/modules/sealant_gun/sealant_injector.dm +++ b/code/modules/sealant_gun/sealant_injector.dm @@ -103,6 +103,7 @@ /decl/interaction_handler/sealant_try_inject name = "Inject Sealant" expected_target_type = /obj/structure/sealant_injector + examine_desc = "inject sealant from a held item" /decl/interaction_handler/sealant_try_inject/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/sealant_injector/SI = target diff --git a/code/modules/security_levels/_security_level.dm b/code/modules/security_levels/_security_level.dm new file mode 100644 index 00000000000..ca4ba811c82 --- /dev/null +++ b/code/modules/security_levels/_security_level.dm @@ -0,0 +1,48 @@ +/decl/security_level + var/icon = 'icons/misc/security_state.dmi' + var/name + + // These values are primarily for station alarms and status displays, and which light colors and overlays to use + var/light_range + var/light_power + var/light_color_alarm + var/light_color_class + var/light_color_status_display + + var/up_description + var/down_description + + var/datum/alarm_appearance/alarm_appearance + + abstract_type = /decl/security_level + +/decl/security_level/Initialize() + . = ..() + if(ispath(alarm_appearance, /datum/alarm_appearance)) + alarm_appearance = new alarm_appearance + +/decl/security_level/validate() + . = ..() + var/initial_appearance = initial(alarm_appearance) + if(!initial_appearance) + . += "alarm_appearance was not set" + else if(!ispath(initial_appearance)) + . += "alarm_appearance was not set to a /datum/alarm_appearance subpath" + else if(!istype(alarm_appearance, /datum/alarm_appearance)) + . += "alarm_appearance creation failed (check runtimes?)" + +// Called when we're switching from a lower security level to this one. +/decl/security_level/proc/switching_up_to() + return + +// Called when we're switching from a higher security level to this one. +/decl/security_level/proc/switching_down_to() + return + +// Called when we're switching from this security level to a higher one. +/decl/security_level/proc/switching_up_from() + return + +// Called when we're switching from this security level to a lower one. +/decl/security_level/proc/switching_down_from() + return \ No newline at end of file diff --git a/code/modules/security_levels/alarm_appearance.dm b/code/modules/security_levels/alarm_appearance.dm new file mode 100644 index 00000000000..494158a6039 --- /dev/null +++ b/code/modules/security_levels/alarm_appearance.dm @@ -0,0 +1,61 @@ +/datum/alarm_appearance + var/display_icon //The icon_state for the displays. Normally only one is used, unless uses_twotone_displays is TRUE. + var/display_icon_color //The color for the display icon. + + var/display_icon_twotone //Used for two-tone displays. + var/display_icon_twotone_color //The color for the display icon. + + var/display_emblem //The icon_state for the emblem, i.e for delta, a radstorm, alerts. + var/display_emblem_color //The color for the emblem. + + var/alarm_icon //The icon_state for the alarms + var/alarm_icon_color //the color for the icon_state + + var/alarm_icon_twotone //Used for two-tone alarms (i.e delta). + var/alarm_icon_twotone_color //The color for the secondary tone icon. + +/datum/alarm_appearance/green + display_icon = "status_display_lines" + display_icon_color = PIPE_COLOR_GREEN + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_normal" + alarm_icon_color = PIPE_COLOR_GREEN + +/datum/alarm_appearance/blue + display_icon = "status_display_lines" + display_icon_color = COLOR_BLUE + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_normal" + alarm_icon_color = COLOR_BLUE + +/datum/alarm_appearance/red + display_icon = "status_display_lines" + display_icon_color = COLOR_RED + + display_emblem = "status_display_alert" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_blinking" + alarm_icon_color = COLOR_RED + +/datum/alarm_appearance/delta + display_icon = "status_display_twotone1" + display_icon_color = COLOR_RED + + display_icon_twotone = "status_display_twotone2" + display_icon_twotone_color = COLOR_YELLOW + + display_emblem = "delta" + display_emblem_color = COLOR_WHITE + + alarm_icon = "alarm_blinking_twotone1" + alarm_icon_color = COLOR_RED + + alarm_icon_twotone = "alarm_blinking_twotone2" + alarm_icon_twotone_color = PIPE_COLOR_YELLOW \ No newline at end of file diff --git a/code/modules/security levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm similarity index 100% rename from code/modules/security levels/keycard_authentication.dm rename to code/modules/security_levels/keycard_authentication.dm diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm new file mode 100644 index 00000000000..186fd37fbbe --- /dev/null +++ b/code/modules/security_levels/security_levels.dm @@ -0,0 +1,105 @@ +/// The default security state used on most space maps. +/decl/security_state/default + all_security_levels = list( + /decl/security_level/default/code_green, + /decl/security_level/default/code_blue, + /decl/security_level/default/code_red, + /decl/security_level/default/code_delta + ) + +/// An abstract security level type that supports announcements on level change. +/decl/security_level/default + abstract_type = /decl/security_level/default + + var/static/datum/announcement/priority/security/security_announcement_up = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) + var/static/datum/announcement/priority/security/security_announcement_down = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/misc/notice1.ogg')) + +/decl/security_level/default/switching_up_to() + if(up_description) + security_announcement_up.Announce(up_description, "Attention! Alert level elevated to [name]!") + notify_station() + +/decl/security_level/default/switching_down_to() + if(down_description) + security_announcement_down.Announce(down_description, "Attention! Alert level changed to [name]!") + notify_station() + +/decl/security_level/default/proc/notify_station() + for(var/obj/machinery/firealarm/FA in SSmachines.machinery) + if(isContactLevel(FA.z)) + FA.update_icon() + post_status("alert") + +/decl/security_level/default/code_green + name = "code green" + + light_range = 2 + light_power = 1 + + light_color_alarm = COLOR_GREEN + light_color_class = "font_green" + light_color_status_display = COLOR_GREEN + + + alarm_appearance = /datum/alarm_appearance/green + + down_description = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + +/decl/security_level/default/code_blue + name = "code blue" + + light_range = 2 + light_power = 1 + light_color_alarm = COLOR_BLUE + light_color_class = "font_blue" + light_color_status_display = COLOR_BLUE + + alarm_appearance = /datum/alarm_appearance/blue + + up_description = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted." + down_description = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed." + +/decl/security_level/default/code_red + name = "code red" + + light_range = 4 + light_power = 2 + light_color_alarm = COLOR_RED + light_color_class = "font_red" + light_color_status_display = COLOR_RED + + alarm_appearance = /datum/alarm_appearance/red + + up_description = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised." + down_description = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised." + +/decl/security_level/default/code_delta + name = "code delta" + + light_range = 4 + light_power = 2 + light_color_alarm = COLOR_RED + light_color_class = "font_red" + light_color_status_display = COLOR_RED + + alarm_appearance = /datum/alarm_appearance/delta + + + var/static/datum/announcement/priority/security/security_announcement_delta = new(do_log = 0, do_newscast = 1, new_sound = sound('sound/effects/siren.ogg')) + +/decl/security_level/default/code_delta/switching_up_to() + security_announcement_delta.Announce("The self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill.", "Attention! Delta security level reached!") + notify_station() + +// The following are dummy states and levels to soft-disable security levels on some maps. +/// A security state used for maps that don't have security levels exposed to players. +/decl/security_state/none + all_security_levels = list( + /decl/security_level/none + ) + +/// A dummy security level with no effects. +/decl/security_level/none + name = "none" + // Since currently we're required to have an alarm_appearance, we just use a blank one. + alarm_appearance = /datum/alarm_appearance \ No newline at end of file diff --git a/code/modules/security_levels/security_state.dm b/code/modules/security_levels/security_state.dm new file mode 100644 index 00000000000..2e997845d41 --- /dev/null +++ b/code/modules/security_levels/security_state.dm @@ -0,0 +1,136 @@ +/decl/security_state + abstract_type = /decl/security_state + /// Whether or not security level information should be shown to new players on login. + var/show_on_login = TRUE + // When defining any of these values type paths should be used, not instances. Instances will be acquired in /New() + + var/decl/security_level/severe_security_level // At which security level (and higher) the use of nuclear fission devices and other extreme measures are allowed. Defaults to the last entry in all_security_levels if unset. + var/decl/security_level/high_security_level // At which security level (and higher) transfer votes are disabled, ERT may be requested, and other similar high alert implications. Defaults to the second to last entry in all_security_levels if unset. + // All security levels within the above convention: Low, Guarded, Elevated, High, Severe + + + // Under normal conditions the crew may not raise the current security level higher than the highest_standard_security_level + // The crew may also not adjust the security level once it is above the highest_standard_security_level. + // Defaults to the second to last entry in all_security_levels if unset/null. + // Set to FALSE/0 if there should be no restrictions. + var/decl/security_level/highest_standard_security_level + + var/decl/security_level/current_security_level // The current security level. Defaults to the first entry in all_security_levels if unset. + var/decl/security_level/stored_security_level // The security level that we are escalating to high security from - we will return to this level once we choose to revert. + var/list/all_security_levels // List of all available security levels + var/list/standard_security_levels // List of all normally selectable security levels + var/list/comm_console_security_levels // List of all selectable security levels for the command and communication console - basically standard_security_levels - 1 + +/decl/security_state/Initialize() + + . = ..() + + // Setup the severe security level + if(!(severe_security_level in all_security_levels)) + severe_security_level = all_security_levels[all_security_levels.len] + severe_security_level = GET_DECL(severe_security_level) + + // Setup the high security level + if(!(high_security_level in all_security_levels)) + high_security_level = all_security_levels[max(1, all_security_levels.len - 1)] + high_security_level = GET_DECL(high_security_level) + + // Setup the highest standard security level + if(highest_standard_security_level || isnull(highest_standard_security_level)) + if(!(highest_standard_security_level in all_security_levels)) + highest_standard_security_level = all_security_levels[max(1, all_security_levels.len - 1)] + highest_standard_security_level = GET_DECL(highest_standard_security_level) + else + highest_standard_security_level = null + + // Setup the current security level + if(current_security_level in all_security_levels) + current_security_level = GET_DECL(current_security_level) + else + current_security_level = GET_DECL(all_security_levels[1]) + + // Setup the full list of available security levels now that we no longer need to use "x in all_security_levels" + var/list/security_level_instances = list() + for(var/security_level_type in all_security_levels) + security_level_instances += GET_DECL(security_level_type) + all_security_levels = security_level_instances + + standard_security_levels = list() + // Setup the list of normally selectable security levels + for(var/security_level in all_security_levels) + standard_security_levels += security_level + if(security_level == highest_standard_security_level) + break + + comm_console_security_levels = list() + // Setup the list of selectable security levels available in the comm. console + for(var/security_level in all_security_levels) + if(security_level == highest_standard_security_level) + break + comm_console_security_levels += security_level + + // Now we ensure the high security level is not above the severe one (but we allow them to be equal) + var/severe_index = all_security_levels.Find(severe_security_level) + var/high_index = all_security_levels.Find(high_security_level) + if(high_index > severe_index) + high_security_level = severe_security_level + + // Finally switch up to the default starting security level. + current_security_level.switching_up_to() + +/decl/security_state/proc/can_change_security_level() + return current_security_level in standard_security_levels + +/decl/security_state/proc/can_switch_to(var/given_security_level) + if(!can_change_security_level()) + return FALSE + return given_security_level in standard_security_levels + +/decl/security_state/proc/current_security_level_is_lower_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index < given_index + +/decl/security_state/proc/current_security_level_is_same_or_higher_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index >= given_index + +/decl/security_state/proc/current_security_level_is_higher_than(var/given_security_level) + var/current_index = all_security_levels.Find(current_security_level) + var/given_index = all_security_levels.Find(given_security_level) + + return given_index && current_index > given_index + +/decl/security_state/proc/set_security_level(var/decl/security_level/new_security_level, var/force_change = FALSE) + if(new_security_level == current_security_level) + return FALSE + if(!(new_security_level in all_security_levels)) + return FALSE + if(!force_change && !can_switch_to(new_security_level)) + return FALSE + + var/decl/security_level/previous_security_level = current_security_level + current_security_level = new_security_level + + var/previous_index = all_security_levels.Find(previous_security_level) + var/new_index = all_security_levels.Find(new_security_level) + + if(new_index > previous_index) + previous_security_level.switching_up_from() + new_security_level.switching_up_to() + else + previous_security_level.switching_down_from() + new_security_level.switching_down_to() + + log_and_message_admins("has changed the security level from [previous_security_level.name] to [new_security_level.name].") + return TRUE + +// This proc decreases the current security level, if possible +/decl/security_state/proc/decrease_security_level(var/force_change = FALSE) + var/current_index = all_security_levels.Find(current_security_level) + if(current_index == 1) + return FALSE + return set_security_level(all_security_levels[current_index - 1], force_change) diff --git a/code/modules/shield_generators/handheld_diffuser.dm b/code/modules/shield_generators/handheld_diffuser.dm index 250691aa2a6..4a546c0241f 100644 --- a/code/modules/shield_generators/handheld_diffuser.dm +++ b/code/modules/shield_generators/handheld_diffuser.dm @@ -41,14 +41,14 @@ if(istype(S) && !S.diffused_for && !S.disabled_for && cell.checked_use(10 KILOWATTS * CELLRATE)) S.diffuse(20) -/obj/item/shield_diffuser/attack_self() +/obj/item/shield_diffuser/attack_self(mob/user) enabled = !enabled update_icon() if(enabled) START_PROCESSING(SSobj, src) else STOP_PROCESSING(SSobj, src) - to_chat(usr, "You turn \the [src] [enabled ? "on" : "off"].") + to_chat(user, "You turn \the [src] [enabled ? "on" : "off"].") /obj/item/shield_diffuser/examine(mob/user) . = ..() diff --git a/code/modules/shield_generators/shield.dm b/code/modules/shield_generators/shield.dm index 0b97dd24cbf..b39816fdce5 100644 --- a/code/modules/shield_generators/shield.dm +++ b/code/modules/shield_generators/shield.dm @@ -37,7 +37,7 @@ if(update_neighbors) for(var/obj/effect/shield/shield in T) shield.update_icon(FALSE) - add_overlay(image(icon = icon, icon_state = "[icon_state]_edge", dir = direction)) + add_overlay(image(icon = icon, icon_state = "[icon_state]edge", dir = direction)) // Prevents shuttles, singularities and pretty much everything else from moving the field segments away. // The only thing that is allowed to move us is the Destroy() proc. @@ -217,7 +217,7 @@ if(!gen.check_flag(MODEFLAG_HYPERKINETIC)) user.visible_message("\The [user] tries to attack \the [src] with \the [weapon], but it passes through!") return TRUE - var/force = weapon.get_attack_force(user) + var/force = weapon.expend_attack_force(user) user.visible_message("\The [user] [pick(weapon.attack_verb)] \the [src] with \the [weapon]!") switch(weapon.atom_damage_type) if(BURN) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 61f0f341e6e..0cb3ee417b9 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -46,7 +46,7 @@ return bash(I, user) /obj/machinery/shield/bash(obj/item/W, mob/user) - if(isliving(user) && user.a_intent == I_HELP) + if(isliving(user) && user.check_intent(I_FLAG_HELP)) return FALSE if(!W.user_can_attack_with(user)) return FALSE @@ -55,7 +55,7 @@ //Calculate damage switch(W.atom_damage_type) if(BRUTE, BURN) - current_health -= W.get_attack_force(user) + current_health -= W.expend_attack_force(user) else return FALSE diff --git a/code/modules/shieldgen/shieldwallgen.dm b/code/modules/shieldgen/shieldwallgen.dm index 12682043752..0ca75384784 100644 --- a/code/modules/shieldgen/shieldwallgen.dm +++ b/code/modules/shieldgen/shieldwallgen.dm @@ -289,7 +289,7 @@ /obj/machinery/shieldwall/attackby(var/obj/item/I, var/mob/user) var/obj/machinery/shieldwallgen/G = prob(50) ? gen_primary : gen_secondary - G.storedpower -= I.get_attack_force(user)*2500 + G.storedpower -= I.expend_attack_force(user)*2500 user.visible_message("\The [user] hits \the [src] with \the [I]!") user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.do_attack_animation(src) diff --git a/code/modules/shuttles/docking_beacon.dm b/code/modules/shuttles/docking_beacon.dm index 8c0f64d87b1..bac4e5fe16a 100644 --- a/code/modules/shuttles/docking_beacon.dm +++ b/code/modules/shuttles/docking_beacon.dm @@ -94,7 +94,7 @@ if(href_list["edit_codes"]) var/newcode = sanitize(input("Input new docking codes:", "Docking codes", docking_codes) as text|null) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newcode) docking_codes = uppertext(newcode) @@ -103,7 +103,7 @@ if(href_list["edit_display_name"]) var/newname = sanitize(input("Input new display name:", "Display name", display_name) as text|null) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newname) display_name = newname @@ -114,7 +114,7 @@ if(href_list["edit_size"]) var/newwidth = input("Input new docking width for beacon:", "Docking size", docking_width) as num|null var/newheight = input("Input new docking height for beacon:", "Docking size", docking_height) as num|null - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(newwidth && newheight) docking_width = clamp(newwidth, 0, MAX_DOCKING_SIZE) @@ -134,7 +134,7 @@ return TOPIC_REFRESH if(href_list["edit_permitted_shuttles"]) - var/shuttle = sanitize(input(usr,"Enter the ID of the shuttle you wish to permit/unpermit for this beacon:", "Enter ID") as text|null) + var/shuttle = sanitize(input(user,"Enter the ID of the shuttle you wish to permit/unpermit for this beacon:", "Enter ID") as text|null) if(shuttle) if(shuttle in permitted_shuttles) permitted_shuttles -= shuttle @@ -166,7 +166,7 @@ if(href_list["change_color"]) var/new_color = input(user, "Choose a color.", "\the [src]", ship_color) as color|null - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(new_color && new_color != ship_color) ship_color = new_color @@ -175,7 +175,7 @@ if(href_list["change_ship_name"]) var/new_ship_name = sanitize(input(user, "Enter a new name for the ship:", "Change ship name.") as null|text) - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(!new_ship_name) return TOPIC_HANDLED @@ -195,7 +195,7 @@ if(!construction_mode) return TOPIC_HANDLED var/confirm = alert(user, "This will permanently finalize the ship, are you sure?", "Ship finalization", "No", "Yes") - if(!CanInteract(usr,state)) + if(!CanInteract(user,state)) return TOPIC_NOACTION if(confirm == "Yes") if(create_ship()) @@ -203,7 +203,7 @@ ship_name = "" LAZYCLEARLIST(errors) else - to_chat(usr, SPAN_WARNING("Could not finalize the construction of the ship!")) + to_chat(user, SPAN_WARNING("Could not finalize the construction of the ship!")) return TOPIC_REFRESH /obj/machinery/docking_beacon/proc/allow_projection() diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index c12dc6e38d9..bd13d30c417 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -3,7 +3,7 @@ var/global/list/escape_pods_by_name = list() /datum/shuttle/autodock/ferry/escape_pod var/datum/computer/file/embedded_program/docking/simple/escape_pod_berth/arming_controller - category = /datum/shuttle/autodock/ferry/escape_pod + abstract_type = /datum/shuttle/autodock/ferry/escape_pod move_time = 100 /datum/shuttle/autodock/ferry/escape_pod/New(map_hash) diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 82cde0c759b..661bab8cf89 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -135,7 +135,7 @@ var/global/list/shuttle_landmarks = list() /obj/effect/shuttle_landmark/automatic/sector_set(var/obj/effect/overmap/visitable/O) ..() - SetName("[initial(name)] ([x],[y])") + SetName("[initial(name)] ([x],[y],[z])") //Subtype that calls explosion on init to clear space for shuttles /obj/effect/shuttle_landmark/automatic/clearing diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 794f0736f12..85ee565817b 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -12,7 +12,7 @@ var/arrive_time = 0 //the time at which the shuttle arrives when long jumping var/flags = 0 var/process_state = IDLE_STATE //Used with SHUTTLE_FLAGS_PROCESS, as well as to store current state. - var/category = /datum/shuttle + abstract_type = /datum/shuttle var/multiz = 0 //how many multiz levels, starts at 0 var/ceiling_type = /turf/unsimulated/floor/shuttle_ceiling diff --git a/code/modules/shuttles/shuttle_autodock.dm b/code/modules/shuttles/shuttle_autodock.dm index 74c157df8fe..f2003eb0129 100644 --- a/code/modules/shuttles/shuttle_autodock.dm +++ b/code/modules/shuttles/shuttle_autodock.dm @@ -16,7 +16,7 @@ var/obj/effect/shuttle_landmark/landmark_transition //This variable is type-abused initially: specify the landmark_tag, not the actual landmark. var/move_time = 240 //the time spent in the transition area - category = /datum/shuttle/autodock + abstract_type = /datum/shuttle/autodock flags = SHUTTLE_FLAGS_PROCESS | SHUTTLE_FLAGS_ZERO_G /datum/shuttle/autodock/New(var/map_hash, var/obj/effect/shuttle_landmark/start_waypoint) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 67337ab8fe2..422e33e3f0e 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -89,7 +89,7 @@ if(href_list["set_codes"]) var/newcode = input("Input new docking codes", "Docking codes", shuttle.docking_codes) as text|null - if (newcode && CanInteract(usr, global.default_topic_state)) + if (newcode && CanInteract(user, global.default_topic_state)) shuttle.set_docking_codes(uppertext(newcode)) return TOPIC_REFRESH diff --git a/code/modules/shuttles/shuttle_console_multi.dm b/code/modules/shuttles/shuttle_console_multi.dm index c55dcc37721..28f8805a36d 100644 --- a/code/modules/shuttles/shuttle_console_multi.dm +++ b/code/modules/shuttles/shuttle_console_multi.dm @@ -9,14 +9,14 @@ "can_pick" = shuttle.moving_status == SHUTTLE_IDLE, ) -/obj/machinery/computer/shuttle_control/multi/handle_topic_href(var/datum/shuttle/autodock/multi/shuttle, var/list/href_list) +/obj/machinery/computer/shuttle_control/multi/handle_topic_href(var/datum/shuttle/autodock/multi/shuttle, var/list/href_list, var/user) if((. = ..()) != null) return if(href_list["pick"]) var/dest_key = input("Choose shuttle destination", "Shuttle Destination") as null|anything in shuttle.get_destinations() - if(dest_key && CanInteract(usr, global.default_topic_state)) - shuttle.set_destination(dest_key, usr) + if(dest_key && CanInteract(user, global.default_topic_state)) + shuttle.set_destination(dest_key, user) return TOPIC_REFRESH diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index 2bdc11d2284..f6efaa4a864 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -1,5 +1,5 @@ /datum/shuttle/autodock/ferry/emergency - category = /datum/shuttle/autodock/ferry/emergency + abstract_type = /datum/shuttle/autodock/ferry/emergency move_time = 10 MINUTES flags = SHUTTLE_FLAGS_PROCESS | SHUTTLE_FLAGS_ZERO_G | SHUTTLE_FLAGS_NO_CODE var/datum/evacuation_controller/shuttle/emergency_controller diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index 4f23361de2b..ebe0a7cf54f 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -7,7 +7,7 @@ var/obj/effect/shuttle_landmark/waypoint_station //This variable is type-abused initially: specify the landmark_tag, not the actual landmark. var/obj/effect/shuttle_landmark/waypoint_offsite //This variable is type-abused initially: specify the landmark_tag, not the actual landmark. - category = /datum/shuttle/autodock/ferry + abstract_type = /datum/shuttle/autodock/ferry /datum/shuttle/autodock/ferry/New(map_hash) if(map_hash) diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index 41778075e99..90a54b1eab0 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -14,10 +14,7 @@ var/reset_time = 0 //the world.time at which the shuttle will be ready to move again. var/launch_prep = 0 var/cancel_countdown = 0 - category = /datum/shuttle/autodock/ferry/specops - -/datum/shuttle/autodock/ferry/specops/New() - ..() + abstract_type = /datum/shuttle/autodock/ferry/specops /datum/shuttle/autodock/ferry/specops/launch(var/user) if (!can_launch()) @@ -98,7 +95,7 @@ return ..() /datum/shuttle/autodock/ferry/specops/proc/sleep_until_launch() - var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a a list with potential time values. + var/message_tracker[] = list(0,1,2,3,5,10,30,45)//Create a list with potential time values. var/launch_time = world.time + specops_countdown_time var/time_until_launch diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm index 175924860dc..f38e5fef5b3 100644 --- a/code/modules/shuttles/shuttle_supply.dm +++ b/code/modules/shuttles/shuttle_supply.dm @@ -3,7 +3,7 @@ var/late_chance = 80 var/max_late_time = (30 SECONDS) flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY|SHUTTLE_FLAGS_NO_CODE - category = /datum/shuttle/autodock/ferry/supply + abstract_type = /datum/shuttle/autodock/ferry/supply ceiling_type = /turf/floor/shuttle_ceiling /datum/shuttle/autodock/ferry/supply/short_jump(var/area/destination) diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index 35e00c68be6..71e144e02e2 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -2,7 +2,7 @@ var/list/destination_tags var/list/destinations_cache = list() var/last_cache_rebuild_time = 0 - category = /datum/shuttle/autodock/multi + abstract_type = /datum/shuttle/autodock/multi /datum/shuttle/autodock/multi/New(map_hash) ..() @@ -42,7 +42,7 @@ var/arrival_message var/departure_message - category = /datum/shuttle/autodock/multi/antag + abstract_type = /datum/shuttle/autodock/multi/antag /datum/shuttle/autodock/multi/antag/New(map_hash) ..() diff --git a/code/modules/species/outsider/shadow.dm b/code/modules/species/outsider/shadow.dm deleted file mode 100644 index 709f5d38ffe..00000000000 --- a/code/modules/species/outsider/shadow.dm +++ /dev/null @@ -1,48 +0,0 @@ -/decl/bodytype/starlight/shadow - name = "shadow" - desc = "A wound of darkness inflicted upon the world." - icon_base = 'icons/mob/human_races/species/shadow/body.dmi' - icon_deformed = 'icons/mob/human_races/species/shadow/body.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - eye_darksight_range = 8 - uid = "bodytype_starlight_shadow" - -/decl/blood_type/shadowstuff - name = "shadowstuff" - antigen_category = "shadowstuff" - splatter_name = "shadowstuff" - splatter_desc = "A puddle of shadowstuff." - splatter_colour = COLOR_GRAY80 - -/decl/species/starlight/shadow - name = "Shadow" - name_plural = "shadows" - description = "A being of pure darkness, hates the light and all that comes with it." - butchery_data = null - - available_bodytypes = list(/decl/bodytype/starlight/shadow) - - unarmed_attacks = list(/decl/natural_attack/claws/strong, /decl/natural_attack/bite/sharp) - shock_vulnerability = 0 - - blood_types = list( - /decl/blood_type/shadowstuff - ) - flesh_color = "#aaaaaa" - - remains_type = /obj/effect/decal/cleanable/ash - death_message = "dissolves into ash..." - - species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED - -/decl/species/starlight/shadow/handle_environment_special(var/mob/living/human/H) - if(H.is_in_stasis() || H.stat == DEAD || H.isSynthetic()) - return - var/light_amount = 0 - if(isturf(H.loc)) - var/turf/T = H.loc - light_amount = T.get_lumcount() * 10 - if(light_amount > 2) //if there's enough light, start dying - H.take_overall_damage(1,1) - else //heal in the dark - H.heal_overall_damage(1,1) \ No newline at end of file diff --git a/code/modules/species/outsider/starlight.dm b/code/modules/species/outsider/starlight.dm deleted file mode 100644 index 215ba3cf5e9..00000000000 --- a/code/modules/species/outsider/starlight.dm +++ /dev/null @@ -1,153 +0,0 @@ -/decl/species/starlight - abstract_type = /decl/species/starlight - butchery_data = null - spawn_flags = SPECIES_IS_RESTRICTED - available_pronouns = list(/decl/pronouns/neuter) - force_background_info = list( - /decl/background_category/heritage = /decl/background_detail/heritage/other - ) - hidden_from_codex = TRUE - -/decl/bodytype/starlight - abstract_type = /decl/bodytype/starlight - has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/unbreakable), - BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable), - BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbreakable), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbreakable), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable) - ) - has_organ = list( - BP_BRAIN = /obj/item/organ/internal/brain/starlight - ) - -/obj/item/organ/internal/brain/starlight - name = "essence of fire" - desc = "A fancy name for ash. Still, it does look a bit different from the regular stuff." - icon = 'icons/obj/objects.dmi' - 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 - uid = "bodytype_starlight_starborn" - 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" - antigen_category = "starstuff" - splatter_name = "starstuff" - splatter_desc = "A puddle of starstuff." - splatter_colour = "#ffff00" - -/decl/species/starlight/handle_death(var/mob/living/human/H) - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob, dust)),0) - -/decl/species/starlight/starborn - name = "Starborn" - name_plural = "Starborn" - description = "Beings of fire and light, split off from a sun deity of unbelievable power." - available_bodytypes = list(/decl/bodytype/starlight/starborn) - - blood_types = list( - /decl/blood_type/starstuff - ) - flesh_color = "#ffff00" - - unarmed_attacks = list(/decl/natural_attack/punch/starborn) - - warning_low_pressure = 50 - hazard_low_pressure = 0 - shock_vulnerability = 0 - hunger_factor = 0 - thirst_factor = 0 - death_message = "dissolves into pure flames!" - breath_type = null - - - total_health = 250 - body_temperature = T0C + 500 //We are being of fire and light. - species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE - - base_auras = list( - /obj/aura/starborn - ) - -/decl/species/starlight/starborn/handle_death(var/mob/living/human/H) - ..() - var/turf/T = get_turf(H) - T.add_to_reagents(/decl/material/liquid/fuel, 20) - T.hotspot_expose(FLAMMABLE_GAS_MINIMUM_BURN_TEMPERATURE) - -/decl/bodytype/starlight/blueforged - name = "blueforged" - desc = "A mass of carved and shaped spacetime." - icon_base = 'icons/mob/human_races/species/blueforged/body.dmi' - icon_deformed = 'icons/mob/human_races/species/blueforged/body.dmi' - eye_icon = 'icons/mob/human_races/species/blueforged/eyes.dmi' - body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS - override_organ_types = list(BP_EYES = /obj/item/organ/internal/eyes/blueforged) - uid = "bodytype_starlight_blueforged" - -/decl/blood_type/spacestuff - name = "spacestuff" - antigen_category = "spacestuff" - splatter_name = "spacestuff" - splatter_desc = "A puddle of spacestuff." - splatter_colour = "#2222ff" - -/decl/species/starlight/blueforged - name = "Blueforged" - name_plural = "Blueforged" - description = "Living chunks of spacetime, carved out of the original dimension and given life by a being of unbelievable power." - available_bodytypes = list(/decl/bodytype/starlight/blueforged) - - flesh_color = "#2222ff" - - warning_low_pressure = 50 - hazard_low_pressure = 0 - hunger_factor = 0 - thirst_factor = 0 - breath_type = null - - burn_mod = 10 - brute_mod = 0 - oxy_mod = 0 - toxins_mod = 0 - radiation_mod = 0 - species_flags = SPECIES_FLAG_NO_MINOR_CUT | SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_POISON | SPECIES_FLAG_NO_EMBED | SPECIES_FLAG_NO_TANGLE - -/decl/species/starlight/blueforged/handle_death(var/mob/living/human/H) - ..() - new /obj/effect/temporary(get_turf(H),11, 'icons/mob/mob.dmi', "liquify") - -/obj/item/organ/internal/eyes/blueforged - name = "bluespace prism" - desc = "You can see an endless blue plane when looking through it. Your eyes tingle if you stare too hard." - icon = 'icons/mob/human_races/species/blueforged/organs.dmi' diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index f92a78d08d1..d7477882df5 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -57,9 +57,6 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/flesh_color = "#ffc896" // Pink. var/blood_oxy = 1 - // Preview in prefs positioning. If null, uses defaults set on a static list in preferences.dm. - var/list/character_preview_screen_locs - var/organs_icon //species specific internal organs icons var/strength = STR_MEDIUM @@ -82,12 +79,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 // Combat vars. var/total_health = DEFAULT_SPECIES_HEALTH // Point at which the mob will enter crit. - var/list/unarmed_attacks = list( // Possible unarmed attacks that the mob will use in combat, - /decl/natural_attack, - /decl/natural_attack/bite - ) - var/list/natural_armour_values // Armour values used if naked. var/brute_mod = 1 // Physical damage multiplier. var/burn_mod = 1 // Burn damage multiplier. var/toxins_mod = 1 // Toxloss modifier @@ -500,23 +492,6 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 return TRUE //We could tie it to stamina return FALSE -// Called when using the shredding behavior. -/decl/species/proc/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag) - - if((!ignore_intent && H.a_intent != I_HURT) || H.pulling_punches) - return 0 - - if(!ignore_antag && H.mind && !player_is_antag(H.mind)) - return 0 - - for(var/attack_type in unarmed_attacks) - var/decl/natural_attack/attack = GET_DECL(attack_type) - if(!istype(attack) || !attack.is_usable(H)) - continue - if(attack.shredding) - return 1 - return 0 - /decl/species/proc/handle_vision(var/mob/living/human/H) var/list/vision = H.get_accumulated_vision_handlers() H.update_sight() @@ -628,7 +603,7 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/skill_mod = 10 * attacker.get_skill_difference(SKILL_COMBAT, target) var/state_mod = attacker.melee_accuracy_mods() - target.melee_accuracy_mods() var/push_mod = min(max(1 + attacker.get_skill_difference(SKILL_COMBAT, target), 1), 3) - if(target.a_intent == I_HELP) + if(target.check_intent(I_FLAG_HELP)) state_mod -= 30 //Handle unintended consequences for(var/obj/item/I in holding) diff --git a/code/modules/species/species_attack.dm b/code/modules/species/species_attack.dm index 0c1fe901f76..0fffa984643 100644 --- a/code/modules/species/species_attack.dm +++ b/code/modules/species/species_attack.dm @@ -2,8 +2,8 @@ attack_verb = list("bit", "chomped on") attack_sound = 'sound/weapons/bite.ogg' shredding = 0 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE name = "sharp bite" /decl/natural_attack/claws @@ -14,8 +14,8 @@ eye_attack_text_victim = "sharp claws" attack_sound = 'sound/weapons/slice.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE name = "claws" usable_with_limbs = list(BP_L_HAND, BP_R_HAND) var/blocked_by_gloves = TRUE @@ -90,7 +90,7 @@ damage = 2 usable_with_limbs = list(BP_CHEST, BP_GROIN) -/decl/natural_attack/slime_glomp/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/slime_glomp/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(.) user.apply_stored_shock_to(target) diff --git a/code/modules/species/species_getters.dm b/code/modules/species/species_getters.dm index 90b97759adc..4bf80fd91e7 100644 --- a/code/modules/species/species_getters.dm +++ b/code/modules/species/species_getters.dm @@ -1,6 +1,3 @@ -/decl/species/proc/get_valid_shapeshifter_forms(var/mob/living/human/H) - return list() - /decl/species/proc/get_additional_examine_text(var/mob/living/human/H) return @@ -19,9 +16,6 @@ /decl/species/proc/get_vision_flags(var/mob/living/human/H) return vision_flags -/decl/species/proc/get_surgery_overlay_icon(var/mob/living/human/H) - return 'icons/mob/surgery.dmi' - /decl/species/proc/get_footstep(var/mob/living/human/H, var/footstep_type) return diff --git a/code/modules/species/species_helpers.dm b/code/modules/species/species_helpers.dm index 5bd257fa5bc..efd996aaf26 100644 --- a/code/modules/species/species_helpers.dm +++ b/code/modules/species/species_helpers.dm @@ -1,14 +1,9 @@ var/global/list/stored_shock_by_ref = list() /mob/living/proc/apply_stored_shock_to(var/mob/living/target) - if(stored_shock_by_ref["\ref[src]"]) - target.electrocute_act(stored_shock_by_ref["\ref[src]"]*0.9, src) - stored_shock_by_ref["\ref[src]"] = 0 - -/decl/species/proc/toggle_stance(var/mob/living/human/H) - if(!H.incapacitated()) - H.pulling_punches = !H.pulling_punches - to_chat(H, "You are now [H.pulling_punches ? "pulling your punches" : "not pulling your punches"].") + if(global.stored_shock_by_ref["\ref[src]"]) + target.electrocute_act(global.stored_shock_by_ref["\ref[src]"]*0.9, src) + global.stored_shock_by_ref["\ref[src]"] = 0 /decl/species/proc/fluid_act(var/mob/living/human/H, var/datum/reagents/fluids) SHOULD_CALL_PARENT(TRUE) diff --git a/code/modules/species/species_hud.dm b/code/modules/species/species_hud.dm index ee873291034..7add078db3a 100644 --- a/code/modules/species/species_hud.dm +++ b/code/modules/species/species_hud.dm @@ -1,18 +1,31 @@ /datum/hud_data - var/has_a_intent = 1 // Set to draw intent box. - var/has_m_intent = 1 // Set to draw move intent box. - var/has_warnings = 1 // Set to draw environment warnings. - 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_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. - var/has_internals = 1 // Set to draw the internals toggle button. - var/has_up_hint = 1 // Set to draw the "look-up" hint icon - var/list/equip_slots = list() // Checked by mob_can_equip(). - var/list/persistent_slots = list() // Built in New(), used for unhidable inv updates - var/list/hidden_slots = list() // Built in New(), used for hidable inv updates + + /// Set to draw move intent box. + var/has_m_intent = 1 + /// Set to draw environment warnings. + var/has_warnings = 1 + /// Draw the pressure indicator. + var/has_pressure = 1 + /// Draw the nutrition indicator. + var/has_nutrition = 1 + /// Draw the bodytemp indicator. + var/has_bodytemp = 1 + /// Set to draw drop button. + var/has_drop = 1 + /// Set to draw throw button. + var/has_throw = 1 + /// Set to draw resist button. + var/has_resist = 1 + /// Set to draw the internals toggle button. + var/has_internals = 1 + /// Set to draw the "look-up" hint icon + var/has_up_hint = 1 + /// Checked by mob_can_equip(). + var/list/equip_slots = list() + /// Built in New(), used for unhidable inv updates + var/list/persistent_slots = list() + /// Built in New(), used for hidable inv updates + var/list/hidden_slots = list() var/list/inventory_slots = list( /datum/inventory_slot/handcuffs, diff --git a/code/modules/species/species_shapeshifter.dm b/code/modules/species/species_shapeshifter.dm deleted file mode 100644 index f49e307387e..00000000000 --- a/code/modules/species/species_shapeshifter.dm +++ /dev/null @@ -1,129 +0,0 @@ -// This is something of an intermediary species used for species that -// need to emulate the appearance of another race. Currently it is only -// used for slimes but it may be useful for other species later. -var/global/list/wrapped_species_by_ref = list() - -/decl/species/shapeshifter - available_bodytypes = list(/decl/bodytype/shapeshifter) - inherent_verbs = list( - /mob/living/human/proc/shapeshifter_select_shape, - /mob/living/human/proc/shapeshifter_select_hair, - /mob/living/human/proc/shapeshifter_select_gender, - /mob/living/human/proc/shapeshifter_select_colour - ) - hidden_from_codex = TRUE - var/list/valid_transform_species = list() - var/monochromatic - var/default_form - -/decl/species/shapeshifter/Initialize() - default_form = global.using_map.default_species - valid_transform_species |= default_form - . = ..() - -/decl/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/human/H) - return valid_transform_species - -/decl/species/shapeshifter/get_root_species_name(var/mob/living/human/H) - if(!H) return ..() - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.get_root_species_name(H) - -/decl/species/shapeshifter/handle_pre_spawn(var/mob/living/human/H) - ..() - wrapped_species_by_ref["\ref[H]"] = default_form - -/decl/species/shapeshifter/handle_post_spawn(var/mob/living/human/H) - if(monochromatic) - var/skin_colour = H.get_skin_colour() - SET_HAIR_COLOR(H, skin_colour, TRUE) - SET_FACIAL_HAIR_COLOR(H, skin_colour, TRUE) - ..() - -/decl/species/shapeshifter/get_pain_emote(var/mob/living/human/H, var/pain_power) - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.get_pain_emote(H, pain_power) - -// Verbs follow. -/mob/living/human/proc/shapeshifter_select_hair() - - set name = "Select Hair" - set category = "Abilities" - - if(stat || is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(1 SECOND) - - visible_message("\The [src]'s form contorts subtly.") - var/decl/bodytype/root_bodytype = get_bodytype() - var/list/hairstyles = species.get_available_accessory_types(root_bodytype, SAC_HAIR) - if(length(hairstyles)) - var/decl/sprite_accessory/new_hair = input("Select a hairstyle.", "Shapeshifter Hair") as null|anything in hairstyles - SET_HAIR_STYLE(src, (new_hair ? new_hair.type : /decl/sprite_accessory/hair/bald), FALSE) - - var/list/beardstyles = species.get_available_accessory_types(root_bodytype, SAC_FACIAL_HAIR) - if(length(beardstyles)) - var/decl/sprite_accessory/new_hair = input("Select a facial hair style.", "Shapeshifter Hair") as null|anything in beardstyles - SET_FACIAL_HAIR_STYLE(src, (new_hair ? new_hair.type : /decl/sprite_accessory/facial_hair/shaved), FALSE) - -/mob/living/human/proc/shapeshifter_select_gender() - - set name = "Select Gender" - set category = "Abilities" - - if(stat || is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(5 SECONDS) - - var/new_gender = input("Please select a gender.", "Shapeshifter Gender") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL) - if(!new_gender) - return - - visible_message("\The [src]'s form contorts subtly.") - set_gender(new_gender, TRUE) - -/mob/living/human/proc/shapeshifter_select_shape() - - set name = "Select Body Shape" - set category = "Abilities" - - if(stat ||is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(5 SECONDS) - - var/new_species = input("Please select a species to emulate.", "Shapeshifter Body") as null|anything in species.get_valid_shapeshifter_forms(src) - if(!new_species || !get_species_by_key(new_species) || wrapped_species_by_ref["\ref[src]"] == new_species) - return - - wrapped_species_by_ref["\ref[src]"] = new_species - visible_message("\The [src] shifts and contorts, taking the form of \a ["\improper [new_species]"]!") - try_refresh_visible_overlays() - -/mob/living/human/proc/shapeshifter_select_colour() - - set name = "Select Body Colour" - set category = "Abilities" - - if(stat || is_on_special_ability_cooldown()) - return - - set_special_ability_cooldown(5 SECONDS) - - var/new_skin = input("Please select a new body color.", "Shapeshifter Colour") as color - if(!new_skin) - return - shapeshifter_set_colour(new_skin) - -/mob/living/human/proc/shapeshifter_set_colour(var/new_skin) - set_skin_colour(new_skin, skip_update = TRUE) - var/decl/species/shapeshifter/S = species - if(S.monochromatic) - var/skin_colour = get_skin_colour() - SET_HAIR_COLOR(src, skin_colour, TRUE) - SET_FACIAL_HAIR_COLOR(src, skin_colour, TRUE) - for(var/obj/item/organ/external/E in get_external_organs()) - E.sync_colour_to_human(src) - try_refresh_visible_overlays() diff --git a/code/modules/species/species_shapeshifter_bodytypes.dm b/code/modules/species/species_shapeshifter_bodytypes.dm deleted file mode 100644 index 9c3e4d00f15..00000000000 --- a/code/modules/species/species_shapeshifter_bodytypes.dm +++ /dev/null @@ -1,47 +0,0 @@ -/decl/bodytype/shapeshifter - name = "protean form" - bodytype_category = BODYTYPE_HUMANOID - uid = "bodytype_shapeshifter" - -/decl/bodytype/shapeshifter/apply_limb_colouration(var/obj/item/organ/external/E, var/icon/applying) - applying.MapColors("#4d4d4d","#969696","#1c1c1c", "#000000") - applying.SetIntensity(limb_icon_intensity) - applying += rgb(,,,180) // Makes the icon translucent, SO INTUITIVE TY BYOND - return applying - -/decl/bodytype/shapeshifter/check_dismember_type_override(var/disintegrate) - if(disintegrate == DISMEMBER_METHOD_EDGE) - return DISMEMBER_METHOD_BLUNT - return ..() - -/decl/bodytype/shapeshifter/get_base_icon(var/mob/living/human/H, var/get_deform) - if(!H) return ..(null, get_deform) - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.default_bodytype.get_base_icon(H, get_deform) - -/decl/bodytype/shapeshifter/get_blood_overlays(var/mob/living/human/H) - if(!H) return ..() - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.default_bodytype.get_blood_overlays(H) - -/decl/bodytype/shapeshifter/get_damage_overlays(var/mob/living/human/H) - if(!H) return ..() - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - return S.default_bodytype.get_damage_overlays(H) - -/decl/bodytype/shapeshifter/get_husk_icon(var/mob/living/human/H) - if(H) - var/decl/species/S = get_species_by_key(wrapped_species_by_ref["\ref[H]"]) - if(S) return S.default_bodytype.get_husk_icon(H) - return ..() - -/decl/bodytype/shapeshifter/get_icon_cache_uid(var/mob/H) - . = ..() - if(H) - . = "[.]-[wrapped_species_by_ref["\ref[H]"]]" - -/decl/bodytype/shapeshifter/apply_bodytype_organ_modifications(obj/item/organ/org) - ..() - var/obj/item/organ/external/E = org - if(istype(E) && E.owner) - E.sync_colour_to_human(E.owner) \ No newline at end of file diff --git a/code/modules/species/station/golem.dm b/code/modules/species/station/golem.dm index 9f571d66c60..93dc4786eae 100644 --- a/code/modules/species/station/golem.dm +++ b/code/modules/species/station/golem.dm @@ -16,7 +16,6 @@ available_bodytypes = list(/decl/bodytype/crystalline/golem) - unarmed_attacks = list(/decl/natural_attack/stomp, /decl/natural_attack/kick, /decl/natural_attack/punch) species_flags = SPECIES_FLAG_NO_POISON spawn_flags = SPECIES_IS_RESTRICTED shock_vulnerability = 0 diff --git a/code/modules/species/station/human.dm b/code/modules/species/station/human.dm index 6264a7b2048..2ee92427f41 100644 --- a/code/modules/species/station/human.dm +++ b/code/modules/species/station/human.dm @@ -2,12 +2,6 @@ name = SPECIES_HUMAN name_plural = "Humans" primitive_form = SPECIES_MONKEY - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch, - /decl/natural_attack/bite - ) description = "A medium-sized creature prone to great ambition. If you are reading this, you are probably a human." hidden_from_codex = FALSE spawn_flags = SPECIES_CAN_JOIN diff --git a/code/modules/species/station/human_bodytypes.dm b/code/modules/species/station/human_bodytypes.dm index be6879a20a4..b6c753b5514 100644 --- a/code/modules/species/station/human_bodytypes.dm +++ b/code/modules/species/station/human_bodytypes.dm @@ -8,7 +8,7 @@ bandages_icon = 'icons/mob/bandage.dmi' limb_icon_intensity = 0.7 associated_gender = FEMALE - onmob_state_modifiers = list(slot_w_uniform_str = "f") + onmob_state_modifiers = list((slot_w_uniform_str) = "f") appearance_flags = HAS_SKIN_TONE_NORMAL | HAS_UNDERWEAR | HAS_EYE_COLOR nail_noun = "nails" uid = "bodytype_human_fem" diff --git a/code/modules/species/station/monkey.dm b/code/modules/species/station/monkey.dm index 9159f5eadc3..1871219744e 100644 --- a/code/modules/species/station/monkey.dm +++ b/code/modules/species/station/monkey.dm @@ -15,7 +15,6 @@ dusted_anim = "dust-m" death_message = "lets out a faint chimper as it collapses and stops moving..." - unarmed_attacks = list(/decl/natural_attack/bite, /decl/natural_attack/claws, /decl/natural_attack/punch) inherent_verbs = list(/mob/living/proc/ventcrawl) species_hud = /datum/hud_data/monkey butchery_data = /decl/butchery_data/humanoid/monkey diff --git a/code/modules/species/station/monkey_bodytypes.dm b/code/modules/species/station/monkey_bodytypes.dm index 804d6d0add1..b1b22de545c 100644 --- a/code/modules/species/station/monkey_bodytypes.dm +++ b/code/modules/species/station/monkey_bodytypes.dm @@ -19,12 +19,12 @@ uid = "bodytype_monkey" /decl/bodytype/monkey/Initialize() - equip_adjust = list( - 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)) + _equip_adjust = list( + (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)) ) . = ..() diff --git a/code/modules/spells/aoe_turf/aoe_turf.dm b/code/modules/spells/aoe_turf/aoe_turf.dm deleted file mode 100644 index 46febbfbe5f..00000000000 --- a/code/modules/spells/aoe_turf/aoe_turf.dm +++ /dev/null @@ -1,25 +0,0 @@ -/* -Aoe turf spells target a ring of tiles around the user -This ring has an outer radius (range) and an inner radius (inner_radius) -Aoe turf spells have two useful flags: IGNOREDENSE and IGNORESPACE. These are explained in setup.dm -*/ - -/spell/aoe_turf //affects all turfs in view or range (depends) - spell_flags = IGNOREDENSE - var/inner_radius = -1 //for all your ring spell needs - -/spell/aoe_turf/choose_targets(mob/user = usr) - var/list/targets = list() - - for(var/turf/target in view_or_range(range, holder, selection_type)) - if(!(target in view_or_range(inner_radius, holder, selection_type))) - if(target.density && (spell_flags & IGNOREDENSE)) - continue - if(isspaceturf(target) && (spell_flags & IGNORESPACE)) - continue - targets += target - - if(!targets.len) //doesn't waste the spell - return - - return targets \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/blink.dm b/code/modules/spells/aoe_turf/blink.dm deleted file mode 100644 index 3fd742aec24..00000000000 --- a/code/modules/spells/aoe_turf/blink.dm +++ /dev/null @@ -1,44 +0,0 @@ -/spell/aoe_turf/blink - name = "Blink" - desc = "This spell randomly teleports you a short distance." - feedback = "BL" - school = "conjuration" - charge_max = 20 - spell_flags = Z2NOCAST | IGNOREDENSE | IGNORESPACE - invocation = "none" - invocation_type = SpI_NONE - range = 7 - inner_radius = 1 - - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 4) - cooldown_min = 5 //4 deciseconds reduction per rank - hud_state = "wiz_blink" - cast_sound = 'sound/magic/blink.ogg' - -/spell/aoe_turf/blink/cast(var/list/targets, mob/user) - if(!targets.len) - return - - var/turf/T = pick(targets) - var/turf/starting = get_turf(user) - if(T) - if(user.buckled) - user.buckled = null - user.forceMove(T) - - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(3, 0, starting) - smoke.start() - - smoke = new() - smoke.set_up(3, 0, T) - smoke.start() - - return - -/spell/aoe_turf/blink/empower_spell() - if(!..()) - return 0 - inner_radius += 1 - - return "You've increased the inner range of [src]." \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/charge.dm b/code/modules/spells/aoe_turf/charge.dm deleted file mode 100644 index d9c8f95af90..00000000000 --- a/code/modules/spells/aoe_turf/charge.dm +++ /dev/null @@ -1,72 +0,0 @@ -/spell/aoe_turf/charge - name = "Charge" - desc = "This spell can be used to charge up spent magical artifacts, among other things." - - school = "transmutation" - charge_max = 600 - spell_flags = 0 - invocation = "DIRI CEL" - invocation_type = SpI_WHISPER - range = 0 - cooldown_min = 400 //50 deciseconds reduction per rank - - hud_state = "wiz_charge" - cast_sound = 'sound/magic/charge.ogg' - -/spell/aoe_turf/charge/cast(var/list/targets, mob/user) - for(var/turf/T in targets) - depth_cast(T) - -/spell/aoe_turf/charge/proc/depth_cast(var/list/targets) - for(var/atom/A in targets) - if(A.contents.len) - depth_cast(A.contents) - cast_charge(A) - -/spell/aoe_turf/charge/proc/mob_charge(var/mob/living/M) - if(!M.mind) - return - if(M.mind.learned_spells.len != 0) - for(var/spell/S in M.mind.learned_spells) - if(!istype(S, /spell/aoe_turf/charge)) - S.charge_counter = S.charge_max - to_chat(M, "You feel raw magic flowing through you, it feels good!") - else - to_chat(M, "You feel very strange for a moment, but then it passes.") - return M - -/spell/aoe_turf/charge/proc/cast_charge(var/atom/target) - var/atom/charged_item - - if(isliving(target)) - charged_item = mob_charge(target) - - if(istype(target, /obj/item/grab)) - var/obj/item/grab/grab = target - if(grab.affecting) - var/mob/M = grab.get_affecting_mob() - if(M) - charged_item = mob_charge(M) - - if(istype(target, /obj/item/cell/)) - var/obj/item/cell/C = target - if(prob(80) && C.maxcharge) - C.maxcharge -= 200 - if(C.maxcharge <= 0) //maxcharge of 0! Madness! - C.maxcharge = 0 - C.charge = C.maxcharge - charged_item = C - - if(!charged_item) - return 0 - else - charged_item.visible_message("[charged_item] suddenly sparks with energy!") - return 1 - - -/spell/aoe_turf/charge/blood - name = "Blood Infusion" - desc = "This spell charges things around it using the lifeforce gained by sacrificed blood." - charge_type = Sp_HOLDVAR - holder_var_type = "bruteloss" - holder_var_amount = 30 \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm deleted file mode 100644 index 9291456f41a..00000000000 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ /dev/null @@ -1,76 +0,0 @@ -/* -Conjure spells spawn things (mobs, objs, turfs) in their summon_type -How they spawn stuff is decided by behaviour vars, which are explained below -*/ - -/spell/aoe_turf/conjure - name = "Conjure" - desc = "This spell conjures objs of the specified types in range." - - school = "conjuration" //funny, that - - var/list/summon_type = list() //determines what exactly will be summoned - //should NOT be text, like list(/obj/machinery/bot/ed209) - - range = 0 //default values: only spawn on the player tile - selection_type = "view" - - duration = 0 // 0=permanent, any other time in deciseconds - how long the summoned objects last for - var/summon_amt = 1 //amount of objects summoned - var/summon_exclusive = 0 //spawn one of everything, instead of random things - - var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet - //should have format of list("emagged" = 1,"name" = "Wizard's Justicebot"), for example - - cast_sound = 'sound/magic/castsummon.ogg' - -/spell/aoe_turf/conjure/cast(list/targets, mob/user) - - for(var/i=1,i <= summon_amt,i++) - if(!targets.len) - break - var/summoned_object_type - if(summon_exclusive) - if(!summon_type.len) - break - summoned_object_type = summon_type[1] - summon_type -= summoned_object_type - else - summoned_object_type = pick(summon_type) - var/turf/spawn_place = pick(targets) - if(spell_flags & IGNOREPREV) - targets -= spawn_place - - var/atom/summoned_object - if(ispath(summoned_object_type,/turf)) - spawn_place.ChangeTurf(summoned_object_type) - summoned_object = spawn_place - else - summoned_object = new summoned_object_type(spawn_place) - var/atom/movable/overlay/animation = new /atom/movable/overlay(summoned_object) - animation.SetName("conjure") - animation.set_density(0) - animation.anchored = TRUE - animation.icon = 'icons/effects/effects.dmi' - animation.layer = BASE_HUMAN_LAYER - if(ismob(summoned_object)) //we want them to NOT attack us. - var/mob/M = summoned_object - M.faction = user.faction - apply_vars(summoned_object, user) - - if(duration) - spawn(duration) - if(summoned_object && !isturf(summoned_object)) - qdel(summoned_object) - conjure_animation(animation, spawn_place) - return - -/spell/aoe_turf/conjure/proc/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) - qdel(animation) - -/spell/aoe_turf/conjure/proc/apply_vars(atom/summoned_object, mob/caster) - if(!istype(summoned_object) || !length(newVars)) - return - for(var/varName in newVars) - if(varName in summoned_object.vars) - summoned_object.vars[varName] = newVars[varName] diff --git a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm b/code/modules/spells/aoe_turf/conjure/druidic_spells.dm deleted file mode 100644 index e6f0b8ea260..00000000000 --- a/code/modules/spells/aoe_turf/conjure/druidic_spells.dm +++ /dev/null @@ -1,113 +0,0 @@ -/spell/aoe_turf/conjure/summon - var/name_summon = 0 - cast_sound = 'sound/weapons/wave.ogg' - -/spell/aoe_turf/conjure/summon/before_cast() - ..() - if(name_summon) - var/newName = sanitize(input("Would you like to name your summon?") as null|text, MAX_NAME_LEN) - if(newName) - newVars["name"] = newName - -/spell/aoe_turf/conjure/summon/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) - animation.icon_state = "shield2" - flick("shield2",animation) - sleep(10) - ..() - - -/spell/aoe_turf/conjure/summon/bats - name = "Summon Space Bats" - desc = "This spell summons a flock of spooky space bats." - feedback = "SB" - - charge_max = 1200 //2 minutes - spell_flags = NEEDSCLOTHES - invocation = "Bla'yo daya!" - invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3) - cooldown_min = 600 - - range = 1 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/hostile/scarybat) - - hud_state = "wiz_bats" - -/spell/aoe_turf/conjure/summon/bats/empower_spell() - if(!..()) - return 0 - - newVars = list("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." - -/spell/aoe_turf/conjure/summon/bear - name = "Summon Bear" - desc = "This spell summons a permanent bear companion that will follow your orders." - feedback = "BR" - charge_max = 3000 //5 minutes because this is a REALLY powerful spell. May tone it down/up. - spell_flags = NEEDSCLOTHES - invocation = "REA'YO GOR DAYA!" - invocation_type = SpI_SHOUT - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 0, Sp_POWER = 4) - - range = 0 - - name_summon = 1 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/hostile/commanded/bear) - newVars = list("max_health" = 15, - "health" = 15, - "melee_damage_lower" = 10, - "melee_damage_upper" = 10, - ) - - hud_state = "wiz_bear" - -/spell/aoe_turf/conjure/summon/bear/apply_vars(atom/summoned_object, mob/caster) - . = ..() - if(isliving(summoned_object)) - var/mob/living/summoned_mob = summoned_object - if(istype(summoned_mob.ai, /datum/mob_controller/aggressive/commanded)) - var/datum/mob_controller/aggressive/commanded/command_ai = summoned_mob.ai - command_ai.master = caster - -/spell/aoe_turf/conjure/summon/bear/empower_spell() - if(!..()) - return 0 - switch(spell_levels[Sp_POWER]) - if(1) - newVars = list("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("max_health" = 45, - "health" = 45, - "melee_damage_lower" = 20, - "melee_damage_upper" = 20, - "color" = "#d9d9d9" //basically we want them to look different enough that people can recognize it. - ) - return "Your bear has been upgraded from a whelp to an adult." - if(3) - newVars = list("max_health" = 60, - "health" = 60, - "melee_damage_lower" = 25, - "melee_damage_upper" = 25, - "color" = "#8c8c8c" - ) - return "Your bear has been upgraded from an adult to an alpha." - if(4) - newVars = list("max_health" = 75, - "health" = 75, - "melee_damage_lower" = 35, - "melee_damage_upper" = 35, - "resistance" = 3, - "color" = "#0099ff" - ) - return "Your bear is now worshiped as a god amongst bears." \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm b/code/modules/spells/aoe_turf/conjure/faithful_hound.dm deleted file mode 100644 index 4511e6a07f4..00000000000 --- a/code/modules/spells/aoe_turf/conjure/faithful_hound.dm +++ /dev/null @@ -1,28 +0,0 @@ -/spell/aoe_turf/conjure/faithful_hound - name = "Faithful Hound" - desc = "Summon a spectral watchdog with a special password. Anyone without the password is in for a barking and a biting." - feedback = "FH" - - charge_max = 600 - spell_flags = NEEDSCLOTHES - invocation = "Du korilath tangus" - invocation_type = SpI_WHISPER - range = 0 - - summon_amt = 1 - summon_type = list(/mob/living/simple_animal/faithful_hound) - hud_state = "wiz_hound" - - var/temp_password - -/spell/aoe_turf/conjure/faithful_hound/apply_vars(atom/summoned_object, mob/caster) - . = ..() - var/mob/living/simple_animal/faithful_hound/hound = summoned_object - if(istype(hound) && istype(hound.ai)) - hound.ai.add_friend(caster) - hound.ai.memorise(caster, temp_password) - temp_password = null - -/spell/aoe_turf/conjure/faithful_hound/before_cast() - ..() - temp_password = sanitize(input("What password will this beast listen to?") as text, MAX_NAME_LEN) diff --git a/code/modules/spells/aoe_turf/conjure/force_portal.dm b/code/modules/spells/aoe_turf/conjure/force_portal.dm deleted file mode 100644 index 293e176051f..00000000000 --- a/code/modules/spells/aoe_turf/conjure/force_portal.dm +++ /dev/null @@ -1,12 +0,0 @@ -/spell/aoe_turf/conjure/force_portal - name = "Force Portal" - desc = "Create a portal that sucks in anything that touches it and then shoots it all out at the end." - school = "conjuration" - feedback = "FP" - summon_type = list(/obj/effect/force_portal) - charge_max = 200 - spell_flags = NEEDSCLOTHES - range = 0 - cast_sound = null - - hud_state = "wiz_force" diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm deleted file mode 100644 index 1c937f3f6d8..00000000000 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/aoe_turf/conjure/forcewall - name = "Forcewall" - desc = "Create a wall of pure energy at your location." - school = "conjuration" - feedback = "FW" - summon_type = list(/obj/effect/forcefield) - duration = 300 - charge_max = 100 - spell_flags = 0 - range = 0 - cast_sound = 'sound/magic/forcewall.ogg' - - hud_state = "wiz_shield" - -/spell/aoe_turf/conjure/forcewall/mime - name = "Invisible wall" - desc = "Create an invisible wall on your location." - school = "mime" - panel = "Mime" - summon_type = list(/obj/effect/forcefield/mime) - invocation_type = SpI_EMOTE - invocation = "mimes placing their hands on a flat surfacing, and pushing against it." - charge_max = 300 - cast_sound = null - - override_base = "grey" - hud_state = "mime_wall" - -/obj/effect/forcefield - desc = "A space wizard's magic wall." - name = "FORCEWALL" - icon = 'icons/effects/effects.dmi' - icon_state = "m_shield" - anchored = TRUE - opacity = FALSE - density = TRUE - -/obj/effect/forcefield/bullet_act(var/obj/item/projectile/Proj, var/def_zone) - var/turf/T = get_turf(src.loc) - if(T) - for(var/mob/M in T) - Proj.on_hit(M,M.bullet_act(Proj, def_zone)) - return - -/obj/effect/forcefield/mime - icon_state = "empty" - name = "invisible wall" - desc = "You have a bad feeling about this." diff --git a/code/modules/spells/aoe_turf/conjure/grove.dm b/code/modules/spells/aoe_turf/conjure/grove.dm deleted file mode 100644 index 77f68981e9d..00000000000 --- a/code/modules/spells/aoe_turf/conjure/grove.dm +++ /dev/null @@ -1,75 +0,0 @@ -/spell/aoe_turf/conjure/grove - name = "Grove" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - charge_max = 1200 - school = "transmutation" - - range = 1 - cooldown_min = 600 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - summon_amt = 47 - summon_type = list(/turf/floor/fake_grass) - var/spread = 0 - var/datum/seed/seed - var/seed_type = /datum/seed/merlin_tear - cast_sound = 'sound/magic/repulse.ogg' - -/spell/aoe_turf/conjure/grove/New() - ..() - if(seed_type) - seed = new seed_type() - else - seed = SSplants.create_random_seed(1) - -/spell/aoe_turf/conjure/grove/before_cast() - var/turf/T = get_turf(holder) - var/obj/effect/vine/P = new(T,seed) - P.spread_chance = spread - - -/spell/aoe_turf/conjure/grove/sanctuary - name = "Sanctuary" - desc = "Creates a sanctuary of nature around the wizard as well as creating a healing plant." - feedback = "SY" - invocation = "Bo K'Iitan!" - invocation_type = SpI_SHOUT - spell_flags = IGNOREDENSE | IGNORESPACE | NEEDSCLOTHES | Z2NOCAST | IGNOREPREV - cooldown_min = 600 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 1) - - seed_type = /datum/seed/merlin_tear - newVars = list("name" = "sanctuary", "desc" = "This grass makes you feel comfortable. Peaceful.","blessed" = 1) - - hud_state = "wiz_grove" -/spell/aoe_turf/conjure/grove/sanctuary/empower_spell() - if(!..()) - return 0 - - seed.set_trait(TRAIT_SPREAD,2) //make it grow. - spread = 40 - return "Your sanctuary will now grow beyond that of the grassy perimeter." - -/datum/seed/merlin_tear - name = "merlin tears" - product_name = "merlin tears" - display_name = "merlin tears" - chems = list(/decl/material/liquid/brute_meds = list(3,7), /decl/material/liquid/burn_meds = list(3,7), /decl/material/liquid/antitoxins = list(3,7), /decl/material/liquid/regenerator = list(3,7), /decl/material/liquid/neuroannealer = list(1,2), /decl/material/liquid/eyedrops = list(1,2)) - grown_tag = "berries" - -/datum/seed/merlin_tear/New() - ..() - set_trait(TRAIT_PLANT_ICON,"bush5") - set_trait(TRAIT_PRODUCT_ICON,"berry") - set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - set_trait(TRAIT_PLANT_COLOUR, "#ff6600") - set_trait(TRAIT_YIELD,4) - set_trait(TRAIT_MATURATION,6) - set_trait(TRAIT_PRODUCTION,6) - set_trait(TRAIT_POTENCY,10) - set_trait(TRAIT_HARVEST_REPEAT,1) - set_trait(TRAIT_IMMUTABLE,1) //no making op plants pls \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm deleted file mode 100644 index d9912e1c390..00000000000 --- a/code/modules/spells/aoe_turf/disable_tech.dm +++ /dev/null @@ -1,33 +0,0 @@ -/spell/aoe_turf/disable_tech - name = "Disable Tech" - desc = "This spell disables all weapons, cameras and most other technology in range." - feedback = "DT" - charge_max = 400 - spell_flags = NEEDSCLOTHES - invocation = "NEC CANTIO" - invocation_type = SpI_SHOUT - selection_type = "range" - range = 0 - inner_radius = -1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - cooldown_min = 200 //50 deciseconds reduction per rank - - var/emp_heavy = 3 - var/emp_light = 5 - - hud_state = "wiz_tech" - cast_sound = 'sound/magic/disable_tech.ogg' - -/spell/aoe_turf/disable_tech/cast(list/targets) - - for(var/turf/target in targets) - empulse(get_turf(target), emp_heavy, emp_light) - return - -/spell/aoe_turf/disable_tech/empower_spell() - if(!..()) - return 0 - emp_heavy += 2 - emp_light += 2 - - return "You've increased the range of [src]." diff --git a/code/modules/spells/aoe_turf/drain_blood.dm b/code/modules/spells/aoe_turf/drain_blood.dm deleted file mode 100644 index 8ad4ea6b8a2..00000000000 --- a/code/modules/spells/aoe_turf/drain_blood.dm +++ /dev/null @@ -1,66 +0,0 @@ -/spell/aoe_turf/drain_blood - name = "Drain Blood" - desc = "This spell allows the caster to borrow blood from those around them. Sharing is caring!" - feedback = "DB" - school = "transmutation" - charge_max = 600 - invocation = "whispers something darkly" - invocation_type = SpI_EMOTE - range = 3 - inner_radius = 0 - - time_between_channels = 100 - number_of_channels = 3 - cast_sound = 'sound/effects/squelch2.ogg' - hud_state = "const_rune" - -/spell/aoe_turf/drain_blood/cast(var/list/targets, var/mob/user) - for(var/t in targets) - for(var/mob/living/L in t) - if(L.stat == DEAD || L == user) - continue - //Hurt target - if(ishuman(L)) - var/mob/living/human/H = L - H.vessel.remove_any(10) - else - L.take_damage(10) - to_chat(L, "You feel your lifeforce being ripping out of your body!") - - //Do effect - var/obj/item/projectile/beam/blood_effect/effect = new(get_turf(user)) - effect.pixel_x = 0 - effect.pixel_y = 0 - effect.launch(L, "chest") - - //Heal self - if(ishuman(user)) - var/mob/living/human/H = user - var/amount = min(10, H.species.blood_volume - H.vessel.total_volume) - if(amount > 0) - H.adjust_blood(amount) - continue - L.heal_damage(BRUTE, 5, do_update_health = FALSE) - L.heal_damage(BURN, 2.5, do_update_health = FALSE) - L.heal_damage(TOX, 2.5) - -/obj/item/projectile/beam/blood_effect - name = "blood jet" - icon_state = "blood" - damage = 0 - randpixel = 0 - no_attack_log = 1 - muzzle_type = /obj/effect/projectile/blood - tracer_type = /obj/effect/projectile/blood - impact_type = /obj/effect/projectile/blood - -/obj/item/projectile/beam/blood_effect/Bump(var/atom/a, forced=0) - if(a == original) - on_impact(a) - qdel(src) - return 1 - return 0 - - -/obj/effect/projectile/blood - icon_state = "blood" \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/exchange_wounds.dm b/code/modules/spells/aoe_turf/exchange_wounds.dm deleted file mode 100644 index 7293e960d29..00000000000 --- a/code/modules/spells/aoe_turf/exchange_wounds.dm +++ /dev/null @@ -1,43 +0,0 @@ -/spell/aoe_turf/exchange_wounds - name = "Exchange Wounds" - desc = "Allows you to sacrifice your own well-being for that of those around you." - feedback = "EW" - school = "transmutation" - invocation = "Esh Yek Vai!" - invocation_type = SpI_SHOUT - charge_max = 400 - spell_flags = 0 - - var/amt_healed = 0 - var/heal_max = 100 - range = 4 - inner_radius = 0 - number_of_channels = 0 - time_between_channels = 20 - - hud_state = "wiz_exchange" - -/spell/aoe_turf/exchange_wounds/perform() - amt_healed = 0 - ..() - -/spell/aoe_turf/exchange_wounds/cast(var/list/targets, var/mob/living/user) - new /obj/effect/temporary(get_turf(user),10,'icons/effects/effects.dmi',"purple_electricity_constant") - for(var/t in targets) - for(var/mob/living/L in t) - if(L.faction != user.faction) - continue - new /obj/effect/temporary(get_turf(L),10,'icons/effects/effects.dmi',"green_sparkles") - if(L.get_damage(BRUTE) > 5) - L.heal_damage(BRUTE, 5) - user.take_damage(2) - amt_healed += 5 - if(L.get_damage(BURN) > 5) - L.heal_damage(BURN, 5) - user.take_damage(2, BURN) - amt_healed += 5 - -/spell/aoe_turf/exchange_wounds/check_valid_targets() - if(amt_healed > heal_max) - return FALSE - return ..() \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/knock.dm b/code/modules/spells/aoe_turf/knock.dm deleted file mode 100644 index 3cf8614eeaa..00000000000 --- a/code/modules/spells/aoe_turf/knock.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/aoe_turf/knock - name = "Knock" - desc = "This spell opens nearby doors and does not require wizard garb." - feedback = "KN" - school = "transmutation" - charge_max = 100 - spell_flags = 0 - invocation = "Aulie Oxin Fiera." - invocation_type = SpI_WHISPER - range = 3 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - cooldown_min = 20 //20 deciseconds reduction per rank - - hud_state = "wiz_knock" - cast_sound = 'sound/magic/knock.ogg' - -/spell/aoe_turf/knock/cast(list/targets) - for(var/turf/T in targets) - for(var/obj/machinery/door/door in T.contents) - spawn(1) - if(istype(door,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/AL = door //casting is important - AL.locked = 0 - door.open() - return - - -/spell/aoe_turf/knock/empower_spell() - if(!..()) - return 0 - range *= 2 - - return "You've doubled the range of [src]." - -/spell/aoe_turf/knock/slow - charge_max = 200 - hidden_from_codex = TRUE diff --git a/code/modules/spells/aoe_turf/smoke.dm b/code/modules/spells/aoe_turf/smoke.dm deleted file mode 100644 index f9f0138908f..00000000000 --- a/code/modules/spells/aoe_turf/smoke.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/aoe_turf/smoke - name = "Smoke" - desc = "This spell spawns a cloud of choking smoke at your location and does not require wizard garb." - feedback = "SM" - school = "transmutation" - charge_max = 120 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - range = 1 - inner_radius = -1 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 2) - cooldown_min = 20 //25 deciseconds reduction per rank - - smoke_spread = 2 - smoke_amt = 5 - - hud_state = "wiz_smoke" - cast_sound = 'sound/magic/smoke.ogg' - -/spell/aoe_turf/smoke/empower_spell() - if(!..()) - return 0 - smoke_amt += 2 - - return "[src] will now create more smoke." diff --git a/code/modules/spells/aoe_turf/summons.dm b/code/modules/spells/aoe_turf/summons.dm deleted file mode 100644 index be61819d9ea..00000000000 --- a/code/modules/spells/aoe_turf/summons.dm +++ /dev/null @@ -1,72 +0,0 @@ -/spell/aoe_turf/conjure/summonEdSwarm //test purposes - name = "Dispense Wizard Justice" - desc = "This spell dispenses wizard justice." - - summon_type = list(/mob/living/bot/secbot/ed209) - summon_amt = 10 - range = 3 - newVars = list("emagged" = 1,"name" = "Wizard's Justicebot") - - hud_state = "wiz_ed" - -/spell/aoe_turf/conjure/carp - name = "Summon Carp" - desc = "This spell conjures a simple carp." - - school = "conjuration" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "Nouk Fhumm Sacp Risska!" - invocation_type = SpI_SHOUT - range = 1 - cast_sound = 'sound/magic/summon_carp.ogg' - - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - -/spell/aoe_turf/conjure/creature - name = "Summon Creature Swarm" - desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" - - school = "conjuration" - charge_max = 1200 - spell_flags = 0 - invocation = "Ia-Ia! Naomesnalia!" - invocation_type = SpI_SHOUT - summon_amt = 10 - range = 3 - - summon_type = list(/mob/living/simple_animal/hostile/creature) - - hud_state = "wiz_creature" - -/spell/aoe_turf/conjure/mirage - name = "Summon Mirage" - desc = "This spell summons a harmless carp mirage for a few seconds." - feedback = "MR" - school = "illusion" - charge_max = 1200 - spell_flags = NEEDSCLOTHES - invocation = "Nouk Fhunhm Sacp Risska!" - invocation_type = SpI_SHOUT - range = 1 - cast_sound = 'sound/magic/summon_carp.ogg' - - duration = 600 - cooldown_min = 600 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 2, Sp_POWER = 3) - - summon_type = list(/mob/living/simple_animal/hostile/carp) - - hud_state = "wiz_carp" - - newVars = list("melee_damage_lower" = 0, "melee_damage_upper" = 0, "break_stuff_probability" = 0) - -/spell/aoe_turf/conjure/mirage/empower_spell() - if(!..()) - return 0 - - summon_amt++ - - return "You now summon [summon_amt] mirages per spellcast." \ No newline at end of file diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm deleted file mode 100644 index 2c085ff8e2a..00000000000 --- a/code/modules/spells/artifacts.dm +++ /dev/null @@ -1,41 +0,0 @@ -//////////////////////Scrying orb////////////////////// - -/obj/item/scrying - name = "scrying orb" - desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means." - icon = 'icons/obj/projectiles.dmi' - icon_state = "bluespace" - throw_speed = 3 - throw_range = 7 - atom_damage_type = BURN - hitsound = 'sound/magic/forcewall.ogg' - max_health = ITEM_HEALTH_NO_DAMAGE - _base_attack_force = 10 - -/obj/item/scrying/attack_self(mob/user) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if((user.mind && !wizards.is_antagonist(user.mind))) - to_chat(user, "You stare into the orb and see nothing but your own reflection.") - return - - to_chat(user, "You can see... everything!") // This never actually happens. - visible_message("[user] stares into [src], their eyes glazing over.") - - user.teleop = user.ghostize() - announce_ghost_joinleave(user.teleop, 1, "You feel that they used a powerful artifact to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place with their presence.") - return - - - -/////////////////////////Cursed Dice/////////////////////////// -/obj/item/dice/d20/cursed - desc = "A dice with twenty sides said to have an ill effect on those that are unlucky..." - -/obj/item/dice/d20/cursed/attack_self(mob/user) - ..() - if(isliving(user)) - var/mob/living/M = user - if(icon_state == "[name][sides]") - M.heal_damage(BRUTE, 30) - else if(icon_state == "[name]1") - M.take_damage(30) diff --git a/code/modules/spells/artifacts/spellbound_servants.dm b/code/modules/spells/artifacts/spellbound_servants.dm deleted file mode 100644 index 6477080cfdf..00000000000 --- a/code/modules/spells/artifacts/spellbound_servants.dm +++ /dev/null @@ -1,284 +0,0 @@ -/datum/spellbound_type - var/name = "Stuff" - var/desc = "spells n shit" - var/equipment = list() - var/spells = list() - -/datum/spellbound_type/proc/spawn_servant(var/atom/a, var/mob/master, var/mob/user) - set waitfor = 0 - var/mob/living/human/H = new(a) - H.ckey = user.ckey - H.change_appearance(APPEARANCE_GENDER|APPEARANCE_BODY|APPEARANCE_EYE_COLOR|APPEARANCE_HAIR|APPEARANCE_FACIAL_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SKIN) - - var/obj/item/implant/translator/natural/I = new() - I.implant_in_mob(H, BP_HEAD) - if (length(master.languages)) - var/decl/language/lang = master.languages[1] - H.add_language(lang.type) - H.set_default_language(lang.type) - I.languages[lang.name] = 1 - - modify_servant(equip_servant(H), H) - set_antag(H.mind, master) - var/name_choice = sanitize(input(H, "Choose a name. If you leave this blank, it will be defaulted to your current characters.", "Name change") as null|text, MAX_NAME_LEN) - if(name_choice) - H.SetName(name_choice) - H.real_name = name_choice - -/datum/spellbound_type/proc/equip_servant(var/mob/living/human/H) - for(var/stype in spells) - var/spell/S = new stype() - if(S.spell_flags & NEEDSCLOTHES) - S.spell_flags &= ~NEEDSCLOTHES - H.add_spell(S) - . = list() - for(var/etype in equipment) - var/obj/item/I = new etype(get_turf(H)) - if(istype(I, /obj/item/clothing)) - I.canremove = 0 - H.equip_to_slot_if_possible(I,equipment[etype],0,1,1,1) - . += I - -/datum/spellbound_type/proc/set_antag(var/datum/mind/M, var/mob/master) - return - -/datum/spellbound_type/proc/modify_servant(var/list/items, var/mob/living/human/H) - return - -/datum/spellbound_type/apprentice - name = "Apprentice" - desc = "Summon your trusty apprentice, equipped with their very own spellbook." - equipment = list(/obj/item/clothing/head/wizard = slot_head_str, - /obj/item/clothing/jumpsuit/lightpurple = slot_w_uniform_str, - /obj/item/clothing/shoes/sandal = slot_shoes_str, - /obj/item/staff = BP_R_HAND, - /obj/item/book/spell/apprentice = BP_L_HAND, - /obj/item/clothing/suit/wizrobe = slot_wear_suit_str) - spells = list(/spell/noclothes) - -/datum/spellbound_type/apprentice/set_antag(var/datum/mind/M, var/mob/master) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - wizards.add_antagonist_mind(M, 1, "Wizard's Apprentice", "You are an apprentice-type Servant! You're just an ordinary Wizard-To-Be, with no special abilities, but do not need robes to cast spells. Follow your teacher's orders!") - -/datum/spellbound_type/servant - var/spiel = "You don't do anything in particular." - -/datum/spellbound_type/servant/set_antag(var/datum/mind/M, var/mob/master) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - wizards.add_antagonist_mind(M, 1, "Spellbound Servant", "You are a [name]-type Servant! [spiel]") - -/datum/spellbound_type/servant/caretaker - name = "Caretaker" - desc = "A healer, a medic, a shoulder to cry on. This servant will heal you, even from near death." - spiel = "'The last enemy that will be destroyed is death.' You can perceive any injuries with simple sight, and heal them with the Trance spell; potentially even reversing death itself! However, this comes at a price; Trance will become increasingly harder to use as you use it, until you can use it no longer. Be cautious, and aid your Master in any way possible!" - equipment = list(/obj/item/clothing/jumpsuit/caretaker = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/caretakershoes = slot_shoes_str) - spells = list(/spell/toggle_armor/caretaker, - /spell/targeted/heal_target/touch, - /spell/aoe_turf/knock/slow, - /spell/targeted/heal_target/area/slow, - /spell/targeted/analyze, - /spell/targeted/heal_target/trance - ) - -/datum/spellbound_type/servant/champion - name = "Champion" - desc = "A knight in shining armor; a warrior, a protector, and a loyal friend." - spiel = "Your sword and armor are second to none, but you have no unique supernatural powers beyond summoning the sword to your hands. Protect your Master with your life!" - equipment = list( - /obj/item/clothing/pants/champion = slot_w_uniform_str, - /obj/item/clothing/shoes/jackboots/medievalboots = slot_shoes_str - ) - spells = list( - /spell/toggle_armor/champion, - /spell/toggle_armor/excalibur - ) - -/datum/spellbound_type/servant/familiar - name = "Familiar" - desc = "A friend! Or are they a pet? They can transform into animals, and take some particular traits from said creatures." - spiel = "This form of yours is weak in comparison to your transformed form, but that certainly won't pose a problem, considering the fact that you have an alternative. Whatever it is you can turn into, use its powers wisely and serve your Master as well as possible!" - equipment = list( - /obj/item/clothing/head/bandana/familiarband = slot_head_str, - /obj/item/clothing/pants/familiar = slot_w_uniform_str - ) - -/datum/spellbound_type/servant/familiar/modify_servant(var/list/equipment, var/mob/living/human/H) - var/familiar_type - switch(input(H,"Choose your desired animal form:", "Form") as anything in list("Space Pike", "Mouse", "Cat", "Bear")) - if("Space Pike") - H.add_genetic_condition(GENE_COND_NO_BREATH) - H.add_genetic_condition(GENE_COND_SPACE_RESISTANCE) - familiar_type = /mob/living/simple_animal/hostile/carp/pike - if("Mouse") - H.verbs |= /mob/living/proc/ventcrawl - familiar_type = /mob/living/simple_animal/passive/mouse - if("Cat") - H.add_genetic_condition(GENE_COND_RUNNING) - familiar_type = /mob/living/simple_animal/passive/cat - if("Bear") - familiar_type = /mob/living/simple_animal/hostile/bear - var/spell/targeted/shapeshift/familiar/F = new() - F.possible_transformations = list(familiar_type) - H.add_spell(F) - -/datum/spellbound_type/servant/fiend - name = "Fiend" - desc = "A practitioner of dark and evil magics, almost certainly a demon, and possibly a lawyer." - spiel = "The Summoning Ritual has bound you to this world with limited access to your infernal powers; you'll have to be strategic in how you use them. Follow your Master's orders as well as you can!" - spells = list(/spell/targeted/projectile/dumbfire/fireball/firebolt, - /spell/targeted/ethereal_jaunt, - /spell/targeted/torment, - /spell/area_teleport, - /spell/hand/charges/blood_shard - ) - -/datum/spellbound_type/servant/fiend/equip_servant(var/mob/living/human/H) - if(H.gender == MALE) - equipment = list(/obj/item/clothing/costume/fiendsuit = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) - spells += /spell/toggle_armor/fiend - else - equipment = list(/obj/item/clothing/dress/devil = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/devilshoes = slot_shoes_str) - spells += /spell/toggle_armor/fiend/fem - ..() - -/datum/spellbound_type/servant/infiltrator - name = "Infiltrator" - desc = "A spy and a manipulator to the end, capable of hiding in plain sight and falsifying information to your heart's content." - spiel = "On the surface, you are a completely normal person, but is that really all you are? People are so easy to fool, do as your Master says, and do it with style!" - spells = list( - /spell/toggle_armor/infil_items, - /spell/targeted/exude_pleasantness, - /spell/targeted/genetic/blind/hysteria - ) - -/datum/spellbound_type/servant/infiltrator/equip_servant(var/mob/living/human/H) - if(H.gender == MALE) - equipment = list(/obj/item/clothing/pants/slacks/outfit/tie = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) - spells += /spell/toggle_armor/infiltrator - else - equipment = list(/obj/item/clothing/dress/white = slot_w_uniform_str, - /obj/item/clothing/shoes/dress/infilshoes = slot_shoes_str) - spells += /spell/toggle_armor/infiltrator/fem - ..() - -/datum/spellbound_type/servant/overseer - name = "Overseer" - desc = "A ghost, or an imaginary friend; the Overseer is immune to space and can turn invisible at a whim, but has little offensive capabilities." - spiel = "Physicality is not something you are familiar with. Indeed, injuries cannot slow you down, but you can't fight back, either! In addition to this, you can reach into the void and return the soul of a single departed crewmember via the revoke death verb, if so desired; this can even revive your Master, should they fall in combat before you do. Serve them well." - equipment = list( - /obj/item/clothing/pants/casual/blackjeans/outfit = slot_w_uniform_str, - /obj/item/clothing/suit/jacket/hoodie/grim = slot_wear_suit_str, - /obj/item/clothing/shoes/sandal/grimboots = slot_shoes_str, - /obj/item/contract/wizard/xray = BP_L_HAND, - /obj/item/contract/wizard/telepathy = BP_R_HAND - ) - spells = list( - /spell/toggle_armor/overseer, - /spell/targeted/ethereal_jaunt, - /spell/invisibility, - /spell/targeted/revoke - ) - -/datum/spellbound_type/servant/overseer/equip_servant(var/mob/living/human/H) - ..() - H.add_aura(new /obj/aura/regenerating(H)) - -/obj/effect/cleanable/spellbound - name = "strange rune" - desc = "some sort of runic symbol drawn in... crayon?" - icon = 'icons/obj/rune.dmi' - icon_state = "spellbound" - is_spawnable_type = FALSE // invalid without spell_type passed - var/datum/spellbound_type/stype - var/last_called = 0 - -/obj/effect/cleanable/spellbound/Initialize(mapload, var/spell_type) - . = ..(mapload) - stype = new spell_type() - -/obj/effect/cleanable/spellbound/attack_hand(var/mob/user) - SHOULD_CALL_PARENT(FALSE) - if(last_called > world.time) - return TRUE - last_called = world.time + 30 SECONDS - var/decl/ghosttrap/G = GET_DECL(/decl/ghosttrap/wizard_familiar) - for(var/mob/observer/ghost/ghost in global.player_list) - if(G.assess_candidate(ghost,null,FALSE)) - to_chat(ghost, "[SPAN_NOTICE("A wizard is requesting a Spell-Bound Servant!")] (Join)") - return TRUE - -/obj/effect/cleanable/spellbound/CanUseTopic(var/mob) - if(isliving(mob)) - return STATUS_CLOSE - return STATUS_INTERACTIVE - -/obj/effect/cleanable/spellbound/OnTopic(var/mob/user, href_list, state) - if(href_list["master"]) - var/mob/master = locate(href_list["master"]) - stype.spawn_servant(get_turf(src),master,user) - qdel(src) - return TOPIC_HANDLED - -/obj/effect/cleanable/spellbound/Destroy() - qdel(stype) - stype = null - return ..() - -/obj/item/summoning_stone - name = "summoning stone" - desc = "a small non-descript stone of dubious origin." - icon = 'icons/obj/items/summoning_stone.dmi' - icon_state = "stone" - throw_speed = 5 - throw_range = 10 - w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/stone/basalt - -/obj/item/summoning_stone/attack_self(var/mob/user) - if(isAdminLevel(user.z)) - to_chat(user, "You cannot use \the [src] here.") - return - user.set_machine(src) - interact(user) - -/obj/item/summoning_stone/interact(var/mob/user) - var/list/types = subtypesof(/datum/spellbound_type) - /datum/spellbound_type/servant - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(user.mind && !wizards.is_antagonist(user.mind)) - use_type(pick(types),user) - return - var/dat = "

    Summoning Stone

    Choose a companion to help you.

    " - for(var/type in types) - var/datum/spellbound_type/SB = type - dat += "
    [initial(SB.name)] - [initial(SB.desc)]" - show_browser(user,dat,"window=summoning") - onclose(user,"summoning") - -/obj/item/summoning_stone/proc/use_type(var/type, var/mob/user) - new /obj/effect/cleanable/spellbound(get_turf(src),type) - if(prob(20)) - var/list/base_areas = maintlocs //Have to do it this way as its a macro - var/list/pareas = base_areas.Copy() - while(pareas.len) - var/a = pick(pareas) - var/area/picked_area = pareas[a] - pareas -= a - var/list/turfs = get_area_turfs(picked_area) - for(var/t in turfs) - var/turf/T = t - if(T.density) - turfs -= T - if(turfs.len) - src.visible_message("\The [src] vanishes!") - src.forceMove(pick(turfs)) - show_browser(user, null, "window=summoning") - qdel(src) - -/obj/item/summoning_stone/OnTopic(user, href_list, state) - if(href_list["type"]) - use_type(href_list["type"],user) - return TOPIC_HANDLED \ No newline at end of file diff --git a/code/modules/spells/artifacts/storage.dm b/code/modules/spells/artifacts/storage.dm deleted file mode 100644 index 4d84cab7d3d..00000000000 --- a/code/modules/spells/artifacts/storage.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/structure/closet/wizard - name = "artifact closet" - desc = "a special lead lined closet used to hold artifacts of immense power." - closet_appearance = /decl/closet_appearance/alien - -/obj/structure/closet/wizard/Initialize() - . = ..() - new /obj/item/parcel(get_turf(src), null, src, "Imported straight from the Wizard Acadamy. Do not lose the contents or suffer a demerit.") - -/obj/structure/closet/wizard/armor - name = "Mastercrafted Armor Set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." - -/obj/structure/closet/wizard/armor/WillContain() - return list( - /obj/item/clothing/shoes/sandal, - /obj/item/clothing/gloves/wizard, - /obj/item/clothing/suit/space/void/wizard, - /obj/item/clothing/head/helmet/space/void/wizard - ) - -/obj/structure/closet/wizard/scrying - name = "Scrying Orb" - desc = "An incandescent orb of crackling energy, using it will allow you to ghost while alive, allowing you to reconnoiter with ease. In addition, buying it will permanently grant you x-ray vision." - -/obj/structure/closet/wizard/scrying/WillContain() - return list( - /obj/item/scrying, - /obj/item/contract/wizard/xray, - ) \ No newline at end of file diff --git a/code/modules/spells/construct_spells.dm b/code/modules/spells/construct_spells.dm deleted file mode 100644 index 0c705aff4fc..00000000000 --- a/code/modules/spells/construct_spells.dm +++ /dev/null @@ -1,10 +0,0 @@ -//////////////////////////////Construct Spells///////////////////////// - -/proc/findNullRod(var/atom/target) - if(istype(target,/obj/item/nullrod)) - return 1 - else if(target.contents) - for(var/atom/A in target.contents) - if(findNullRod(A)) - return 1 - return 0 diff --git a/code/modules/spells/contracts.dm b/code/modules/spells/contracts.dm deleted file mode 100644 index 1b6ebf527f7..00000000000 --- a/code/modules/spells/contracts.dm +++ /dev/null @@ -1,142 +0,0 @@ -/obj/item/contract - name = "contract" - desc = "written in the blood of some unfortunate fellow." - icon = 'icons/mob/screen/spells.dmi' - icon_state = "master_open" - 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) - -/obj/item/contract/attack_self(mob/user) - if(contract_master == null) - to_chat(user, "You bind the contract to your soul, making you the recipient of whatever poor fool's soul that decides to contract with you.") - contract_master = user - return - - if(contract_master == user) - to_chat(user, "You can't contract with yourself!") - return - - var/ans = alert(user,"The contract clearly states that signing this contract will bind your soul to \the [contract_master]. Are you sure you want to continue?","[src]","Yes","No") - - if(ans == "Yes") - user.visible_message("\The [user] signs the contract, their body glowing a deep yellow.") - if(!src.contract_effect(user)) - user.visible_message("\The [src] visibly rejects \the [user], erasing their signature from the line.") - return - user.visible_message("\The [src] disappears with a flash of light.") - if(contract_spells.len && isliving(contract_master)) //if it aint text its probably a mob or another user - var/mob/living/M = contract_master - for(var/spell_type in contract_spells) - M.add_spell(new spell_type(user), "const_spell_ready") - log_and_message_admins("signed their soul over to \the [contract_master] using \the [src].", user) - qdel(src) - -/obj/item/contract/proc/contract_effect(mob/user) - to_chat(user, "You've signed your soul over to \the [contract_master] and with that your unbreakable vow of servitude begins.") - return 1 - -/obj/item/contract/apprentice - name = "apprentice wizarding contract" - desc = "a wizarding school contract for those who want to sign their soul for a piece of the magic pie." - color = "#993300" - -/obj/item/contract/apprentice/contract_effect(mob/user) - if(user.mind.assigned_special_role == "Wizard's Apprentice") - to_chat(user, "You are already a wizarding apprentice!") - return 0 - if(user.mind.assigned_special_role == "Spellbound Servant") - to_chat(user, "You are a servant. You have no need of apprenticeship.") - return 0 - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - if(wizards.add_antagonist_mind(user.mind, 1, "Wizard's Apprentice", "You are an apprentice! Your job is to learn the wizarding arts!")) - to_chat(user, "With the signing of this paper you agree to become \the [contract_master]'s apprentice in the art of wizardry.") - return 1 - return 0 - -/obj/item/contract/wizard //contracts that involve making a deal with the Wizard Acadamy (or NON PLAYERS) - contract_master = "\improper Wizard Academy" - -/obj/item/contract/wizard/xray - name = "xray vision contract" - desc = "This contract is almost see-through..." - color = "#339900" - -/obj/item/contract/wizard/xray/contract_effect(mob/user) - ..() - if (user.add_genetic_condition(GENE_COND_XRAY)) - user.set_sight(user.sight|SEE_MOBS|SEE_OBJS|SEE_TURFS) - user.set_see_in_dark(8) - user.set_see_invisible(SEE_INVISIBLE_LEVEL_TWO) - to_chat(user, "The walls suddenly disappear.") - return 1 - return 0 - -/obj/item/contract/wizard/telepathy - name = "telepathy contract" - desc = "The edges of the contract grow blurry when you look away from them. To be fair, actually reading it gives you a headache." - color = "#fcc605" - -/obj/item/contract/wizard/telepathy/contract_effect(mob/user) - ..() - return user.add_genetic_condition(GENE_COND_REMOTE_TALK) - -/obj/item/contract/boon - name = "boon contract" - desc = "this contract grants you a boon for signing it." - var/path - -/obj/item/contract/boon/Initialize(mapload, var/new_path) - . = ..(mapload) - if(new_path) - path = new_path - var/item_name = "" - if(ispath(path,/obj)) - var/obj/O = path - item_name = initial(O.name) - else if(ispath(path,/spell)) - var/spell/S = path - item_name = initial(S.name) - name = "[item_name] contract" - -/obj/item/contract/boon/contract_effect(mob/user) - ..() - if(user.mind.assigned_special_role == "Spellbound Servant") - to_chat(user, "As a servant you find yourself unable to use this contract.") - return 0 - if(ispath(path,/spell)) - user.add_spell(new path) - return 1 - else if(ispath(path,/obj)) - new path(get_turf(user.loc)) - playsound(get_turf(usr),'sound/magic/charge.ogg',50,1) - return 1 - -/obj/item/contract/boon/wizard - contract_master = "\improper Wizard Academy" - -/obj/item/contract/boon/wizard/fireball - path = /spell/targeted/projectile/dumbfire/fireball - desc = "This contract feels warm to the touch." - -/obj/item/contract/boon/wizard/smoke - path = /spell/aoe_turf/smoke - desc = "This contract smells as dank as they come." - -/obj/item/contract/boon/wizard/forcewall - path = /spell/aoe_turf/conjure/forcewall - contract_master = "\improper Mime Federation" - desc = "This contract has a dedication to mimes everywhere at the top." - -/obj/item/contract/boon/wizard/knock - path = /spell/aoe_turf/knock - desc = "This contract is hard to hold still." - -/obj/item/contract/boon/wizard/horsemask - path = /spell/targeted/equip_item/horsemask - desc = "This contract is more horse than your mind has room for." - -/obj/item/contract/boon/wizard/charge - path = /spell/aoe_turf/charge - desc = "This contract is made of 100% post-consumer wizard." - diff --git a/code/modules/spells/general/acid_spray.dm b/code/modules/spells/general/acid_spray.dm deleted file mode 100644 index 752a17eecb7..00000000000 --- a/code/modules/spells/general/acid_spray.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/acid_spray - name = "Acid Spray" - desc = "A common spell used to destroy basically anything in front of the wizard." - school = "conjuration" - feedback = "as" - spell_flags = 0 - charge_max = 600 - - invocation = "Tagopar lethodar!" - invocation_type = SpI_SHOUT - var/reagent_type = /decl/material/liquid/acid/hydrochloric - hud_state = "wiz_acid" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/acid_spray/choose_targets() - return list(holder) - -/spell/acid_spray/cast(var/list/targets, var/mob/user) - var/atom/target = targets[1] - var/angle = dir2angle(target.dir) - for(var/mod in list(315, 0, 45)) - var/obj/effect/effect/water/chempuff/chem = new(get_turf(target)) - chem.create_reagents(10) - chem.add_to_reagents(reagent_type,10) - spawn(0) - chem.set_up(get_ranged_target_turf(target, angle2dir(angle+mod), 3)) diff --git a/code/modules/spells/general/area_teleport.dm b/code/modules/spells/general/area_teleport.dm deleted file mode 100644 index 68e20f3d6f9..00000000000 --- a/code/modules/spells/general/area_teleport.dm +++ /dev/null @@ -1,60 +0,0 @@ -/spell/area_teleport - name = "Teleport" - desc = "This spell teleports you to a type of area of your selection." - feedback = "TP" - school = "conjuration" - charge_max = 60 SECONDS - spell_flags = NEEDSCLOTHES - invocation = "Scyar Nila!" - invocation_type = SpI_SHOUT - cooldown_min = 200 //100 deciseconds reduction per rank - - smoke_spread = 1 - smoke_amt = 5 - - var/randomise_selection = 0 //if it lets the usr choose the teleport loc or picks it from the list - var/invocation_area = 1 //if the invocation appends the selected area - - cast_sound = 'sound/effects/teleport.ogg' - - hud_state = "wiz_tele" - -/spell/area_teleport/before_cast() - return - -/spell/area_teleport/choose_targets() - var/area/thearea - if(!randomise_selection) - thearea = input("Area to teleport to", "Teleport") as null|anything in wizteleportlocs - if(!thearea) - return - else - thearea = pick(wizteleportlocs) - return list(wizteleportlocs[thearea]) - -/spell/area_teleport/cast(area/thearea, mob/user) - playsound(get_turf(user),cast_sound,50,1) - var/turf/end = user.try_teleport(thearea) - - if(!end) - to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return - return - -/spell/area_teleport/check_valid_targets(list/targets) - // Teleport should function across z's, so we make sure that happens - // without this check, it only works for teleporting to areas you can see - return islist(targets) && length(targets) - -/spell/area_teleport/after_cast() - return - -/spell/area_teleport/invocation(mob/user, area/chosenarea) - if(!istype(chosenarea)) - return //can't have that, can we - if(!invocation_area || !chosenarea) - ..() - else - invocation += "[uppertext(chosenarea.proper_name)]" - ..() - return diff --git a/code/modules/spells/general/camera_vision.dm b/code/modules/spells/general/camera_vision.dm deleted file mode 100644 index cfd0cfb030e..00000000000 --- a/code/modules/spells/general/camera_vision.dm +++ /dev/null @@ -1,36 +0,0 @@ -/spell/camera_connection - name = "Camera Connection" - desc = "This spell allows the wizard to connect to the local camera network and see what it sees." - - school = "racial" - - invocation_type = SpI_EMOTE - invocation = "emits a beeping sound before standing very, very still." - - charge_max = 600 //1 minute - charge_type = Sp_RECHARGE - - - spell_flags = Z2NOCAST - hud_state = "wiz_IPC" - - var/extension_type = /datum/extension/eye/cameranet - -/spell/camera_connection/New() - ..() - set_extension(src, extension_type) - -/spell/camera_connection/choose_targets() - var/mob/living/L = holder - if(!istype(L) || L.eyeobj) //no using if we already have an eye on. - return null - return list(holder) - -/spell/camera_connection/cast(var/list/targets, mob/user) - var/mob/living/L = targets[1] - - var/datum/extension/eye/cameranet/cn = get_extension(src, /datum/extension/eye/) - if(!cn) - to_chat(user, SPAN_WARNING("There's a flash of sparks as the spell fizzles out!")) - return - cn.look(L) \ No newline at end of file diff --git a/code/modules/spells/general/contract_spells.dm b/code/modules/spells/general/contract_spells.dm deleted file mode 100644 index fa95cd16e23..00000000000 --- a/code/modules/spells/general/contract_spells.dm +++ /dev/null @@ -1,68 +0,0 @@ -//These spells are given to the owner of a contract when a victim signs it. -//As such they are REALLY REALLY powerful (because the victim is rewarded for signing it, and signing contracts is completely voluntary) - -/spell/contract - name = "Contract Spell" - desc = "A spell perfecting the techniques of keeping a servant happy and obedient." - - school = "transmutation" - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - - - var/mob/subject - -/spell/contract/New(var/mob/M) - ..() - subject = M - name += " ([M.real_name])" - -/spell/contract/choose_targets() - return list(subject) - -/spell/contract/cast(mob/target,mob/user) - if(!subject) - to_chat(usr, "This spell was not properly given a target. Contact a coder.") - return null - - if(istype(target,/list)) - var/list/target_list = target - target = target_list[1] - return target - - -/spell/contract/reward - name = "Reward Contractee" - desc = "A spell that makes your contracted victim feel better." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "wiz_jaunt_old" - -/spell/contract/reward/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, SPAN_BLUE("You feel great!")) - target.ExtinguishMob() - -/spell/contract/punish - name = "Punish Contractee" - desc = "A spell that sets your contracted victim ablaze." - - charge_max = 300 - cooldown_min = 100 - - hud_state = "gen_immolate" - -/spell/contract/punish/cast(mob/living/target,mob/user) - target = ..(target,user) - if(!target) - return - - to_chat(target, "You feel punished!") - target.fire_stacks += 15 - target.IgniteMob() \ No newline at end of file diff --git a/code/modules/spells/general/create_air.dm b/code/modules/spells/general/create_air.dm deleted file mode 100644 index 405e161a54a..00000000000 --- a/code/modules/spells/general/create_air.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/create_air - name = "Create Air" - desc = "A much used spell used in the vasteness of space to make it not so killey." - - charge_max = 200 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "wiz_air" - var/list/air_change = list(/decl/material/gas/oxygen = ONE_ATMOSPHERE) - -/spell/create_air/choose_targets() - var/air = holder.return_air() - if(air) - return list(air) - return null - -/spell/create_air/cast(var/list/targets, var/mob/holder, var/channel_count) - var/datum/gas_mixture/environment = targets[1] - for(var/gas in air_change) - environment.adjust_gas(gas, air_change[gas]) diff --git a/code/modules/spells/general/invisibility.dm b/code/modules/spells/general/invisibility.dm deleted file mode 100644 index 3fbab715efd..00000000000 --- a/code/modules/spells/general/invisibility.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/invisibility - name = "invisibility" - desc = "A simple spell of invisibility, for when you really just can't afford a paper bag." - feedback = "IV" - spell_flags = 0 - charge_max = 100 - invocation = "Ror Rim Or!" - invocation_type = SpI_SHOUT - var/on = 0 - hud_state = "invisibility" - -/spell/invisibility/choose_targets() - if(ishuman(holder)) - return holder - -/spell/invisibility/cast(var/mob/living/human/H, var/mob/user) - on = !on - if(on) - if(H.add_cloaking_source(src)) - playsound(get_turf(H), 'sound/effects/teleport.ogg', 90, 1) - H.add_genetic_condition(GENE_COND_CLUMSY) - else if(H.remove_cloaking_source(src)) - playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 90, 1) - H.remove_genetic_condition(GENE_COND_CLUMSY) \ No newline at end of file diff --git a/code/modules/spells/general/mark_recall.dm b/code/modules/spells/general/mark_recall.dm deleted file mode 100644 index 11131e72ece..00000000000 --- a/code/modules/spells/general/mark_recall.dm +++ /dev/null @@ -1,88 +0,0 @@ -/spell/mark_recall - name = "Mark and Recall" - desc = "This spell was created so wizards could get home from the bar without driving. Does not require wizard garb." - feedback = "MK" - school = "conjuration" - charge_max = 600 //1 minutes for how OP this shit is (apparently not as op as I thought) - spell_flags = Z2NOCAST - invocation = "Re-Alki R'natha." - invocation_type = SpI_WHISPER - cooldown_min = 300 - - smoke_amt = 1 - smoke_spread = 5 - - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - - cast_sound = 'sound/effects/teleport.ogg' - hud_state = "wiz_mark" - var/mark = null - -/spell/mark_recall/choose_targets() - if(!mark) - return list("magical fairy dust") //because why not - else - return list(mark) - -/spell/mark_recall/cast(var/list/targets,mob/user) - if(!targets.len) - return 0 - var/target = targets[1] - if(istext(target)) - mark = new /obj/effect/cleanable/wizard_mark(get_turf(user),src) - return 1 - if(!istype(target,/obj)) //something went wrong - return 0 - var/turf/T = get_turf(target) - if(!T) - return 0 - user.forceMove(T) - ..() - -/spell/mark_recall/empower_spell() - if(!..()) - return 0 - - spell_flags = NO_SOMATIC - - return "You will always be able to cast this spell, even while unconscious or handcuffed." - -/obj/effect/cleanable/wizard_mark - name = "\improper Mark of the Wizard" - 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 - 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) - . = ..() - spell = mrspell - -/obj/effect/cleanable/wizard_mark/Destroy() - spell.mark = null //dereference pls. - spell = null - return ..() - -/obj/effect/cleanable/wizard_mark/attack_hand(var/mob/user) - if(user != spell.holder) - return ..() - user.visible_message("\The [user] mutters an incantation and \the [src] disappears!") - qdel(src) - return TRUE - -/obj/effect/cleanable/wizard_mark/nullrod_act(mob/user, obj/item/nullrod/rod) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message("\The [user] dispels \the [src] and it fades away!") - qdel(src) - return TRUE - -/obj/effect/cleanable/wizard_mark/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/book/spell)) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - visible_message("\The [src] fades away!") - qdel(src) - return TRUE - return ..() \ No newline at end of file diff --git a/code/modules/spells/general/portal_teleport.dm b/code/modules/spells/general/portal_teleport.dm deleted file mode 100644 index 1f1ed0ad603..00000000000 --- a/code/modules/spells/general/portal_teleport.dm +++ /dev/null @@ -1,67 +0,0 @@ -/spell/portal_teleport - name = "Create Portal" - desc = "This spell creates a long lasting portal to an area of your selection." - feedback = "TP" - school = "conjuration" - spell_flags = NEEDSCLOTHES - invocation = "Scyar Peranda!" - invocation_type = SpI_SHOUT - charge_max = 30 MINUTES - cooldown_min = 25 MINUTES - - smoke_spread = 1 - smoke_amt = 5 - - var/list/select_areas = list() - - cast_sound = 'sound/effects/teleport.ogg' - - hud_state = "wiz_tele" - -/spell/portal_teleport/before_cast() - return - -/spell/portal_teleport/choose_targets() - var/area/thearea - var/message = alert("Would you like to show station areas?\nNote: it can take up to 5 minutes for the away sites to load in and show up.",, "Yes", "No") - switch(message) - if("Yes") - select_areas = stationlocs - if("No") - select_areas = (stationlocs) ^ (wizportallocs) - - thearea = input("Area to teleport to", "Teleport") as null|anything in select_areas - if(!thearea) return - - return list(select_areas[thearea]) - -/spell/portal_teleport/cast(area/thearea, mob/user) - playsound(get_turf(user),cast_sound,50,1) - var/turf/start = get_turf(user) - var/turf/end = user.try_teleport(thearea) - - if(!end) - to_chat(user, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") - return - - new /obj/effect/portal/wizard(start, end, 35 MINUTES) - new /obj/effect/portal/wizard(end, start, 35 MINUTES) - - return - -/spell/portal_teleport/after_cast() - return - -/spell/portal_teleport/invocation(mob/user, area/chosenarea) - if(!chosenarea || !istype(chosenarea)) - ..() - else - invocation += "[uppertext(chosenarea.proper_name)]" - ..() - return - -/obj/effect/portal/wizard - name = "dark anomaly" - desc = "It pulls on the edges of reality as if trying to draw them in." - icon = 'icons/obj/objects.dmi' - icon_state = "bhole3" diff --git a/code/modules/spells/general/radiant_aura.dm b/code/modules/spells/general/radiant_aura.dm deleted file mode 100644 index 27e85404027..00000000000 --- a/code/modules/spells/general/radiant_aura.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/radiant_aura - name = "Radiant aura" - desc = "Form a protective layer of light around you, making you immune to laser fire." - feedback = "ra" - invocation_type = SpI_EMOTE - invocation = "conjures a sphere of fire around themselves." - school = "conjuration" - spell_flags = NEEDSCLOTHES - charge_max = 300 - cooldown_min = 100 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 0) - cast_sound = 'sound/effects/snap.ogg' - duration = 40 - hud_state = "gen_immolate" - -/spell/radiant_aura/choose_targets() - return list(holder) - -/spell/radiant_aura/cast(var/list/targets, var/mob/user) - var/obj/aura/radiant_aura/A = new(user) - QDEL_IN(A,duration) diff --git a/code/modules/spells/general/return_master.dm b/code/modules/spells/general/return_master.dm deleted file mode 100644 index 119cc93804d..00000000000 --- a/code/modules/spells/general/return_master.dm +++ /dev/null @@ -1,23 +0,0 @@ -/spell/contract/return_master - name = "Return to Master" - desc = "Teleport back to your master" - - school = "conjuration" - charge_max = 600 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - cooldown_min = 200 - - smoke_spread = 1 - smoke_amt = 5 - - hud_state = "wiz_tele" - - -/spell/contract/return_master/cast(mob/target,mob/user) - target = ..(target,user) - if(!target) - return - - user.forceMove(get_turf(target)) \ No newline at end of file diff --git a/code/modules/spells/general/toggle_armor.dm b/code/modules/spells/general/toggle_armor.dm deleted file mode 100644 index 5da3bf537f8..00000000000 --- a/code/modules/spells/general/toggle_armor.dm +++ /dev/null @@ -1,121 +0,0 @@ -/spell/toggle_armor - name = "Toggle Armor" - spell_flags = 0 - charge_max = 10 - school = "Conjuration" - var/list/armor_pieces - var/equip = 0 - hud_state = "const_shell" - -/spell/toggle_armor/New() - if(armor_pieces) - var/list/nlist = list() - for(var/type in armor_pieces) - var/obj/item/I = new type(null) - nlist[I] = armor_pieces[type] - armor_pieces = nlist - return ..() - -/spell/toggle_armor/proc/drop_piece(var/obj/I) - if(ismob(I.loc)) - var/mob/M = I.loc - M.drop_from_inventory(I) - -/spell/toggle_armor/choose_targets() - return list(holder) - -/spell/toggle_armor/cast(var/list/targets, var/mob/user) - equip = !equip - name = "[initial(name)] ([equip ? "off" : "on"])" - if(equip) - for(var/piece in armor_pieces) - var/slot = armor_pieces[piece] - drop_piece(piece) - user.drop_from_inventory(user.get_equipped_item(slot)) - user.equip_to_slot_if_possible(piece,slot,0,1,1,1) - else - for(var/piece in armor_pieces) - var/obj/item/I = piece - drop_piece(piece) - I.forceMove(null) - -/spell/toggle_armor/greytide_worldwide - name = "Greytide Worldwide" - invocation_type = SpI_EMOTE - invocation = "screams incoherently!" - armor_pieces = list(/obj/item/clothing/jumpsuit/grey = slot_w_uniform_str, - /obj/item/clothing/gloves/insulated/cheap = slot_gloves_str, - /obj/item/clothing/mask/gas = slot_wear_mask_str, - /obj/item/clothing/shoes/color/black = slot_shoes_str, - /obj/item/toolbox/mechanical = BP_R_HAND, - /obj/item/chems/spray/extinguisher = BP_L_HAND) - -/spell/toggle_armor/caretaker - name = "Toggle Armor (Caretaker)" - invocation_type = SpI_EMOTE - invocation = "radiates a holy light" - armor_pieces = list(/obj/item/clothing/head/caretakerhood = slot_head_str, - /obj/item/clothing/suit/caretakercloak = slot_wear_suit_str - ) - hud_state = "caretaker" - -/spell/toggle_armor/champion - name = "Toggle Armor (Champion)" - invocation_type = SpI_EMOTE - invocation = "is covered in golden embers for a moment, before they fade" - armor_pieces = list(/obj/item/clothing/head/champhelm = slot_head_str, - /obj/item/clothing/suit/champarmor = slot_wear_suit_str - ) - hud_state = "champion" - -/spell/toggle_armor/excalibur - name = "Toggle Sword" - invocation_type = SpI_EMOTE - invocation = "thrusts /his hand forward, and it is enveloped in golden embers!" - armor_pieces = list(/obj/item/sword/excalibur = BP_R_HAND) - hud_state = "excalibur" - -/spell/toggle_armor/fiend - name = "Toggle Armor (Fiend)" - invocation_type = SpI_EMOTE - invocation = "snaps /his fingers, and /his clothes begin to shift and change" - armor_pieces = list(/obj/item/clothing/head/fiendhood = slot_head_str, - /obj/item/clothing/suit/fiendcowl = slot_wear_suit_str - ) - hud_state = "fiend" - -/spell/toggle_armor/fiend/fem - armor_pieces = list(/obj/item/clothing/head/fiendhood/fem = slot_head_str, - /obj/item/clothing/suit/fiendcowl/fem = slot_wear_suit_str - ) - -/spell/toggle_armor/infiltrator - name = "Toggle Armor (Infiltrator)" - invocation_type = SpI_EMOTE - invocation = "winks. In an instant, /his clothes change dramatically" - armor_pieces = list(/obj/item/clothing/head/infilhat = slot_head_str, - /obj/item/clothing/suit/infilsuit = slot_wear_suit_str - ) - hud_state = "infiltrator" - -/spell/toggle_armor/infiltrator/fem - armor_pieces = list(/obj/item/clothing/head/infilhat/fem = slot_head_str, - /obj/item/clothing/suit/infilsuit/fem = slot_wear_suit_str - ) - -/spell/toggle_armor/infil_items - name = "Toggle Counterfeit Kit" - invocation_type = SpI_EMOTE - invocation = "flicks /his wrists, one at a time" - armor_pieces = list(/obj/item/stamp/chameleon = BP_L_HAND, - /obj/item/pen/chameleon = BP_R_HAND) - hud_state = "forgery" - -/spell/toggle_armor/overseer - name = "Toggle Armor (Overseer)" - invocation_type = SpI_EMOTE - invocation = " is enveloped in shadows, before /his form begins to shift rapidly" - armor_pieces = list(/obj/item/clothing/head/overseerhood = slot_head_str, - /obj/item/clothing/suit/straight_jacket/overseercloak = slot_wear_suit_str - ) - hud_state = "overseer" \ No newline at end of file diff --git a/code/modules/spells/hand/blood_shards.dm b/code/modules/spells/hand/blood_shards.dm deleted file mode 100644 index 0908ee28520..00000000000 --- a/code/modules/spells/hand/blood_shards.dm +++ /dev/null @@ -1,39 +0,0 @@ -/spell/hand/charges/blood_shard - name = "Blood Shards" - desc = "Invoke a corrupted projectile forward that causes an enemy's blood to fly out in painful shards. Anyone hit by this will have their blood explode out of them in a spray of smaller shards. Stores two charges." - spell_flags = 0 - charge_max = 600 - invocation = "opens their hand, which bursts into vicious red light." - invocation_type = SpI_EMOTE - - range = 7 - max_casts = 2 - compatible_targets = list(/atom) - hud_state = "wiz_bshard" - cast_sound = 'sound/magic/demon_attack1.ogg' - -/spell/hand/charges/blood_shard/cast_hand(var/atom/A,var/mob/user) - var/obj/item/projectile/blood_shard/B = new(get_turf(user)) - B.firer = user - B.launch(A, BP_CHEST) - user.visible_message("\The [user] shoots out a deep red shard from their hand!") - return ..() - -/obj/item/projectile/blood_shard - name = "bloodshard" - damage = 25 - icon_state = "blood" - atom_damage_type = BRUTE - damage_flags = 0 - -/obj/item/projectile/blood_shard/on_hit(var/atom/movable/target, var/blocked = 0) - if(..()) - if(ishuman(target)) - var/mob/living/human/H = target - H.vessel.remove_any(30) - H.visible_message("Tiny red shards burst from \the [H]'s skin!") - fragmentate(get_turf(src), 30, 5, list(/obj/item/projectile/bullet/pellet/blood)) - -/obj/item/projectile/bullet/pellet/blood - name = "blood fragment" - damage = 10 \ No newline at end of file diff --git a/code/modules/spells/hand/burning_grip.dm b/code/modules/spells/hand/burning_grip.dm deleted file mode 100644 index 772b4e6aa9c..00000000000 --- a/code/modules/spells/hand/burning_grip.dm +++ /dev/null @@ -1,39 +0,0 @@ -/spell/hand/burning_grip - name = "Burning Grip" - desc = "Cause someone to drop a held object by causing it to heat up intensly." - school = "transmutation" - feedback = "bg" - range = 5 - spell_flags = 0 - invocation_type = SpI_NONE - show_message = " throws sparks from their hands" - spell_delay = 120 - hud_state = "wiz_burn" - cast_sound = 'sound/magic/fireball.ogg' - compatible_targets = list(/mob/living/human) - -/spell/hand/burning_grip/valid_target(var/mob/living/L, var/mob/user) - if(!..()) - return 0 - if(length(L.get_held_items())) - return 0 - return 1 - -/spell/hand/burning_grip/cast_hand(var/mob/living/human/H, var/mob/user) - var/list/targets = list() - for(var/hand_slot in H.get_held_item_slots()) - targets |= hand_slot - - var/obj/O = new /obj/effect/temporary(get_turf(H),3, 'icons/effects/effects.dmi', "fire_goon") - O.alpha = 150 - - for(var/organ in targets) - var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(H, organ) - if(!E) - continue - E.take_external_damage(burn=10, used_weapon = "hot iron") - if(E.can_feel_pain()) - E.check_pain_disarm() - else - E.take_external_damage(burn=6, used_weapon = "hot iron") - to_chat(H, SPAN_WARNING("You notice that your [E] is burned.")) diff --git a/code/modules/spells/hand/entangle.dm b/code/modules/spells/hand/entangle.dm deleted file mode 100644 index 37a4776fe28..00000000000 --- a/code/modules/spells/hand/entangle.dm +++ /dev/null @@ -1,51 +0,0 @@ -/spell/hand/charges/entangle - name = "Entangle" - desc = "This spell creates vines that immediately entangle a nearby victim." - feedback = "ET" - school = "transmutation" - charge_max = 600 - spell_flags = NEEDSCLOTHES | SELECTABLE | IGNOREPREV - invocation = "Bu-Ekel'Inas!" - invocation_type = SpI_SHOUT - range = 3 - max_casts = 1 - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - cooldown_min = 300 - duration = 30 - compatible_targets = list(/mob) - - hud_state = "wiz_entangle" - cast_sound = 'sound/magic/staff_door.ogg' - show_message = " points towards the ground, causing plants to erupt" - var/datum/seed/seed - -/spell/hand/charges/entangle/New() - ..() - seed = new() - seed.set_trait(TRAIT_PLANT_ICON,"flower") - seed.set_trait(TRAIT_PRODUCT_ICON,"flower2") - seed.set_trait(TRAIT_PRODUCT_COLOUR,"#4d4dff") - seed.set_trait(TRAIT_SPREAD,2) - seed.name = "heirlooms" - seed.product_name = "heirloom" - seed.display_name = "vines" - seed.chems = list(/decl/material/liquid/nutriment = list(1,20)) - -/spell/hand/charges/entangle/cast_hand(var/mob/M,var/mob/user) - var/turf/T = get_turf(M) - var/obj/effect/vine/single/P = new(T, seed, null, TRUE) - P.can_buckle = 1 - - P.buckle_mob(M) - M.set_dir(pick(global.cardinal)) - M.visible_message("[P] appear from the floor, spinning around \the [M] tightly!") - return ..() - -/spell/hand/charges/entangle/empower_spell() - if(!..()) - return 0 - - max_casts++ - - return "This spell will now entangle [max_casts] times before running out." \ No newline at end of file diff --git a/code/modules/spells/hand/hand.dm b/code/modules/spells/hand/hand.dm deleted file mode 100644 index 9652cf1cce1..00000000000 --- a/code/modules/spells/hand/hand.dm +++ /dev/null @@ -1,83 +0,0 @@ -/spell/hand - var/min_range = 0 - var/list/compatible_targets = list(/atom) - var/spell_delay = 5 - var/move_delay - var/click_delay - var/hand_state = "spell" - var/obj/item/magic_hand/current_hand - var/show_message - -/spell/hand/choose_targets(mob/user = usr) - return list(user) - -/spell/hand/cast_check(skipcharge = 0,mob/user = usr, var/list/targets) - if(!..()) - return FALSE - if(user.get_active_held_item()) - to_chat(holder, "You need an empty hand to cast this spell.") - return FALSE - return TRUE - -/spell/hand/cast(list/targets, mob/user) - if(current_hand) - cancel_hand() - if(user.get_active_held_item()) - to_chat(user, "You need an empty hand to cast this spell.") - return FALSE - current_hand = new(null, src) - if(!user.put_in_active_hand(current_hand)) - QDEL_NULL(current_hand) - return FALSE - return TRUE - -/spell/hand/proc/cancel_hand() - if(!QDELETED(current_hand)) - QDEL_NULL(current_hand) - -/spell/hand/Destroy() - QDEL_NULL(current_hand) - . = ..() - -/spell/hand/proc/valid_target(var/atom/a,var/mob/user) //we use seperate procs for our target checking for the hand spells. - var/distance = get_dist(a,user) - if((min_range && distance < min_range) || (range && distance > range)) - return FALSE - if(!is_type_in_list(a,compatible_targets)) - return FALSE - return TRUE - -/spell/hand/proc/cast_hand(var/atom/a,var/mob/user) //same for casting. - return TRUE - -/spell/hand/charges - var/casts = 1 - var/max_casts = 1 - -/spell/hand/charges/cast(list/targets, mob/user) - . = ..() - if(.) - casts = max_casts - to_chat(user, "You ready the [name] spell ([casts]/[casts] charges).") - -/spell/hand/charges/cast_hand() - if(..()) - casts-- - to_chat(holder, SPAN_NOTICE("The [name] spell has [casts] out of [max_casts] charges left.")) - cancel_hand() - return TRUE - return FALSE - -/spell/hand/duration - var/hand_timer = null - var/hand_duration = 0 - -/spell/hand/duration/cast(var/list/targets, var/mob/user) - . = ..() - if(.) - 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) - hand_timer = null - ..() \ No newline at end of file diff --git a/code/modules/spells/hand/hand_item.dm b/code/modules/spells/hand/hand_item.dm deleted file mode 100644 index 8da6139bfbb..00000000000 --- a/code/modules/spells/hand/hand_item.dm +++ /dev/null @@ -1,68 +0,0 @@ -/*much like grab this item is used primarily for the utility it provides. -Basically: I can use it to target things where I click. I can then pass these targets to a spell and target things not using a list. -*/ - -/obj/item/magic_hand - name = "Magic Hand" - icon = 'icons/mob/screen/spells.dmi' - atom_flags = 0 - item_flags = 0 - obj_flags = 0 - simulated = 0 - icon_state = "spell" - max_health = ITEM_HEALTH_NO_DAMAGE - is_spawnable_type = FALSE - obj_flags = OBJ_FLAG_NO_STORAGE - var/next_spell_time = 0 - var/spell/hand/hand_spell - -/obj/item/magic_hand/Initialize(ml, _hand_spell) - . = ..() - hand_spell = _hand_spell - name = "[name] ([hand_spell.name])" - icon_state = hand_spell.hand_state - -// These return values do not look correct... -/obj/item/magic_hand/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) - if(hand_spell && hand_spell.valid_target(target, user)) - fire_spell(target, user) - return FALSE - return TRUE - -/obj/item/magic_hand/proc/fire_spell(var/atom/A, mob/living/user) - if(!hand_spell) //no spell? Die. - user.drop_from_inventory(src) - - if(!hand_spell.valid_target(A,user)) - return - if(world.time < next_spell_time) - to_chat(user, "The spell isn't ready yet!") - return - if(user.a_intent == I_HELP) - to_chat(user, "You decide against casting this spell as your intent is set to help.") - return - - if(hand_spell.show_message) - user.visible_message("\The [user][hand_spell.show_message]") - if(hand_spell.cast_hand(A,user)) - next_spell_time = world.time + hand_spell.spell_delay - if(hand_spell.move_delay) - user.ExtraMoveCooldown(hand_spell.move_delay) - if(hand_spell.click_delay) - user.setClickCooldown(hand_spell.move_delay) - -/obj/item/magic_hand/afterattack(var/atom/A, var/mob/user, var/proximity) - if(hand_spell) - fire_spell(A,user) - -/obj/item/magic_hand/throw_at() //no throwing pls - usr.drop_from_inventory(src) - -/obj/item/magic_hand/dropped() //gets deleted on drop - ..() - qdel(src) - -/obj/item/magic_hand/Destroy() //better save than sorry. - hand_spell.current_hand = null - hand_spell = null - . = ..() \ No newline at end of file diff --git a/code/modules/spells/hand/slippery_surface.dm b/code/modules/spells/hand/slippery_surface.dm deleted file mode 100644 index 3b5fc448d03..00000000000 --- a/code/modules/spells/hand/slippery_surface.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/hand/slippery_surface - name = "Slippery Surface" - desc = "More of a practical joke than an actual spell." - school = "transmutation" - feedback = "su" - range = 5 - spell_flags = 0 - invocation_type = SpI_NONE - show_message = " snaps their fingers." - spell_delay = 50 - hud_state = "gen_ice" - cast_sound = 'sound/magic/summonitems_generic.ogg' - -/spell/hand/slippery_surface/cast_hand(var/atom/a, var/mob/user) - for(var/turf/T in view(1,a)) - if(T.simulated) - T.wet_floor(50) - new /obj/effect/temporary(T, 3, 'icons/effects/effects.dmi', "sonar_ping") - return ..() diff --git a/code/modules/spells/hand/sunwrath.dm b/code/modules/spells/hand/sunwrath.dm deleted file mode 100644 index 63da9a54c61..00000000000 --- a/code/modules/spells/hand/sunwrath.dm +++ /dev/null @@ -1,32 +0,0 @@ -/spell/hand/duration/sunwrath - name = "Sun God's Wrath" - desc = "Your hands become a gateway of fire, shooting hot plasma from your fingertips." - spell_flags = 0 - charge_max = 600 - invocation_type = SpI_SHOUT - invocation = "Herald! Bless me with your anger!" - show_message = " erupts fire from their hands" - school = "Divine" - hand_duration = 100 - spell_delay = 30 - range = 4 - hud_state = "wiz_immolate" - -/spell/hand/duration/sunwrath/cast_hand(var/atom/A, var/mob/user) - var/turf/T = get_turf(user) - var/list/turfs = getline(T,A) - T - for(var/t in turfs) - var/turf/turf = t - if(turf.density || isspaceturf(turf)) - break - new /obj/effect/fake_fire/sunwrath(t) - return 1 - -/obj/effect/fake_fire/sunwrath - firelevel = 2 - last_temperature = 0 - pressure = 3000 - -/obj/effect/fake_fire/sunwrath/Process() //Override, so we burn mobs only - for(var/mob/living/L in loc) - L.FireBurn(firelevel,last_temperature,pressure) \ No newline at end of file diff --git a/code/modules/spells/no_clothes.dm b/code/modules/spells/no_clothes.dm deleted file mode 100644 index 3b850292351..00000000000 --- a/code/modules/spells/no_clothes.dm +++ /dev/null @@ -1,5 +0,0 @@ -/spell/noclothes - name = "No Clothes" - desc = "Learn the ancient art of not wearing fancy robes while casting spells." - feedback = "NC" - spell_flags = NO_BUTTON \ No newline at end of file diff --git a/code/modules/spells/racial_wizard.dm b/code/modules/spells/racial_wizard.dm deleted file mode 100644 index b8871ebf1f1..00000000000 --- a/code/modules/spells/racial_wizard.dm +++ /dev/null @@ -1,81 +0,0 @@ -//this file is full of all the racial spells/artifacts/etc that each species has. - -/obj/item/magic_rock - name = "magical rock" - desc = "Legends say that this rock will unlock the true potential of anyone who touches it." - icon = 'icons/obj/wizard.dmi' - icon_state = "magic rock" - w_class = ITEM_SIZE_SMALL - throw_speed = 1 - throw_range = 3 - material = /decl/material/solid/stone/basalt - var/list/potentials = list( - SPECIES_HUMAN = /obj/item/bag/cash/infinite - ) - -/obj/item/magic_rock/attack_self(mob/user) - if(!ishuman(user)) - to_chat(user, "\The [src] can do nothing for such a simple being.") - return - var/mob/living/human/H = user - var/reward = potentials[H.species.get_root_species_name(H)] //we get body type because that lets us ignore subspecies. - if(!reward) - to_chat(user, "\The [src] does not know what to make of you.") - return - for(var/spell/S in user.mind.learned_spells) - if(istype(S,reward)) - to_chat(user, "\The [src] can do no more for you.") - return - var/a = new reward() - if(ispath(reward,/spell)) - H.add_spell(a) - else if(ispath(reward,/obj)) - H.put_in_hands(a) - to_chat(user, "\The [src] crumbles in your hands.") - qdel(src) - -/obj/item/bag/cash/infinite - storage = /datum/storage/bag/cash/infinite - -/obj/item/bag/cash/infinite/WillContain() - return list(/obj/item/cash/c1000) - -/spell/messa_shroud/choose_targets() - return list(get_turf(holder)) - -/spell/messa_shroud/cast(var/list/targets, mob/user) - var/turf/T = targets[1] - - if(!istype(T)) - return - - var/obj/O = new /obj(T) - O.set_light(range, -10, "#ffffff") - - spawn(duration) - qdel(O) - -/mob/observer/eye/freelook/wizard_eye - name_sufix = "Wizard Eye" - -/mob/observer/eye/freelook/wizard_eye/Initialize() - . = ..() //we dont use the Ai one because it has AI specific procs imbedded in it. - visualnet = cameranet - -/mob/living/proc/release_eye() - set name = "Release Vision" - set desc = "Return your sight to your body." - set category = "Abilities" - - verbs -= /mob/living/proc/release_eye //regardless of if we have an eye or not we want to get rid of this verb. - - if(!eyeobj) - return - eyeobj.release(src) - -/mob/observer/eye/freelook/wizard_eye/Destroy() - if(isliving(eyeobj.owner)) - var/mob/living/L = eyeobj.owner - L.release_eye() - qdel(eyeobj) - return ..() diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm deleted file mode 100644 index 653d2b8cae2..00000000000 --- a/code/modules/spells/spell_code.dm +++ /dev/null @@ -1,395 +0,0 @@ -var/global/list/spells = typesof(/spell) //needed for the badmin verb for now - -/spell - var/name - var/desc - var/feedback = "" //what gets sent if this spell gets chosen by the spellbook. - parent_type = /datum - var/panel = "Spells"//What panel the proc holder needs to go on. - - var/school = "evocation" //not relevant at now, but may be important later if there are changes to how spells work. the ones I used for now will probably be changed... maybe spell presets? lacking flexibility but with some other benefit? - /*Spell schools as follows: - Racial - Only tagged to spells gained for being a certain race - Conjuration - Creating an object or transporting it. - Transmutation - Modifying an object or transforming it. - Illusion - Altering perception or thought. - */ - var/charge_type = Sp_RECHARGE //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that - - var/charge_max = 100 //recharge time in deciseconds if charge_type = Sp_RECHARGE or starting charges if charge_type = Sp_CHARGES - var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = Sp_RECHARGE or -- each cast if charge_type = Sp_CHARGES - var/still_recharging_msg = "The spell is still recharging." - - var/silenced = 0 //not a binary - the length of time we can't cast this for - var/processing = 0 //are we processing already? Mainly used so that silencing a spell doesn't call process() again. (and inadvertedly making it run twice as fast) - - var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" - var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used - - var/spell_flags = NEEDSCLOTHES - var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell - var/invocation_type = SpI_NONE //can be none, whisper, shout, and emote - var/range = 7 //the range of the spell; outer radius for aoe spells - var/message = "" //whatever it says to the guy affected by it - var/selection_type = "view" //can be "range" or "view" - var/atom/movable/holder //where the spell is. Normally the user, can be an item - var/duration = 0 //how long the spell lasts - - var/list/spell_levels = list(Sp_SPEED = 0, Sp_POWER = 0) //the current spell levels - total spell levels can be obtained by just adding the two values - var/list/level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 0) //maximum possible levels in each category. Total does cover both. - var/cooldown_reduc = 0 //If set, defines how much charge_max drops by every speed upgrade - var/delay_reduc = 0 - var/cooldown_min = 0 //minimum possible cooldown for a charging spell - - var/overlay = 0 - var/overlay_icon = 'icons/obj/wizard.dmi' - var/overlay_icon_state = "spell" - var/overlay_lifespan = 0 - - var/sparks_spread = 0 - var/sparks_amt = 0 //cropped at 10 - var/smoke_spread = 0 //1 - harmless, 2 - harmful - var/smoke_amt = 0 //cropped at 10 - - var/critfailchance = 0 - var/time_between_channels = 0 //Delay between casts - var/number_of_channels = 1 //How many times can we channel? - - var/cast_delay = 1 - var/cast_sound = "" - - var/hud_state = "" //name of the icon used in generating the spell hud object - var/override_base = "" - - - var/obj/screen/connected_button - - var/hidden_from_codex = FALSE - -/////////////////////// -///SETUP AND PROCESS/// -/////////////////////// - -/spell/New() - ..() - - //still_recharging_msg = "[name] is still recharging." - charge_counter = charge_max - -/spell/proc/process() - if(processing) - return - processing = 1 - spawn(0) - while(charge_counter < charge_max || silenced > 0) - charge_counter = min(charge_max,charge_counter+1) - silenced = max(0,silenced-1) - sleep(1) - if(connected_button) - var/obj/screen/ability/spell/S = connected_button - if(!istype(S)) - return - S.update_charge(1) - processing = 0 - return - -///////////////// -/////CASTING///// -///////////////// - -/spell/proc/choose_targets(mob/user = usr) //depends on subtype - see targeted.dm, aoe_turf.dm, dumbfire.dm, or code in general folder - return - -/spell/proc/perform(mob/user = usr, skipcharge = 0) //if recharge is started is important for the trigger spells - if(!holder) - holder = user //just in case - if(!cast_check(skipcharge, user)) - return - to_chat(user, SPAN_NOTICE("You start casting \the [name]...")) - if(cast_delay && !spell_do_after(user, cast_delay)) - return - var/list/targets = choose_targets(user) - if(!check_valid_targets(targets)) - to_chat(user, SPAN_WARNING("\The [name] fizzles. There are no valid targets nearby.")) - return - var/time = 0 - admin_attacker_log(user, "attempted to cast the spell [name]") - do - time++ - if(!check_valid_targets(targets)) //make sure we HAVE something - break - if(cast_check(1,user, targets)) //we check again, otherwise you can choose a target and then wait for when you are no longer able to cast (I.E. Incapacitated) to use it. - invocation(user, targets) - take_charge(user, skipcharge) - before_cast(targets) //applies any overlays and effects - if(prob(critfailchance)) - critfail(targets, user) - else - cast(targets, user, time) - after_cast(targets) //generates the sparks, smoke, target messages etc. - else - break - while(time != number_of_channels && do_after(user, time_between_channels, incapacitation_flags = INCAPACITATION_KNOCKOUT|INCAPACITATION_FORCELYING|INCAPACITATION_STUNNED, same_direction=1)) - after_spell(targets, user, time) //When we are done with the spell completely. - - - -/spell/proc/cast(list/targets, mob/user, var/channel_duration) //the actual meat of the spell - return - -/spell/proc/critfail(list/targets, mob/user) //the wizman has fucked up somehow - return - -/spell/proc/after_spell(var/list/targets, var/mob/user, var/channel_duration) //After everything else is done. - return - -/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types - switch(type) - if("bruteloss") - target.take_damage(amount) - if("fireloss") - target.take_damage(amount, BURN) - if("toxloss") - target.take_damage(amount, TOX) - if("oxyloss") - target.take_damage(amount, OXY) - if("brainloss") - target.take_damage(amount, BRAIN) - if("stunned") - ADJ_STATUS(target, STAT_STUN, amount) - if("weakened") - ADJ_STATUS(target, STAT_WEAK, amount) - if("paralysis") - ADJ_STATUS(target, STAT_PARA, amount) - else - target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existant vars - return - -/////////////////////////// -/////CASTING WRAPPERS////// -/////////////////////////// - -/spell/proc/before_cast(list/targets) - for(var/atom/target in targets) - if(overlay) - var/location - if(isliving(target)) - location = target.loc - else if(isturf(target)) - location = target - var/obj/effect/overlay/spell = new /obj/effect/overlay(location) - spell.icon = overlay_icon - spell.icon_state = overlay_icon_state - spell.anchored = TRUE - spell.set_density(0) - spawn(overlay_lifespan) - qdel(spell) - -/spell/proc/after_cast(list/targets) - if(cast_sound) - playsound(get_turf(holder),cast_sound,50,1) - for(var/atom/target in targets) - var/location = get_turf(target) - if(isliving(target) && message) - to_chat(target, text("[message]")) - if(sparks_spread) - spark_at(location, amount = sparks_amt) - if(smoke_spread) - if(smoke_spread == 1) - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is - smoke.start() - else if(smoke_spread == 2) - var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad() - smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is - smoke.start() - -///////////////////// -////CASTING TOOLS//// -///////////////////// -/*Checkers, cost takers, message makers, etc*/ - -/spell/proc/cast_check(skipcharge = 0,mob/user = usr, var/list/targets) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - - if(silenced > 0) - return 0 - - if(!(src in user.mind.learned_spells) && holder == user && !(isanimal(user))) - error("[user] utilized the spell '[src]' without having it.") - to_chat(user, "You shouldn't have this spell! Something's wrong.") - return 0 - - var/turf/user_turf = get_turf(user) - if(!user_turf) - to_chat(user, "You cannot cast spells in null space!") - - if((spell_flags & Z2NOCAST) && isAdminLevel(user_turf.z)) //Certain spells are not allowed on the centcomm zlevel - return 0 - - if(spell_flags & CONSTRUCT_CHECK) - for(var/turf/T in range(holder, 1)) - if(findNullRod(T)) - return 0 - - if(!src.check_charge(skipcharge, user)) //sees if we can cast based on charges alone - return 0 - - if(holder == user) - if(isanimal(user)) - var/mob/living/simple_animal/SA = user - if(SA.purge) - to_chat(SA, "The null sceptre's power interferes with your own!") - return 0 - - if(!(spell_flags & GHOSTCAST)) - if(!(spell_flags & NO_SOMATIC)) - var/mob/living/L = user - if(L.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) - to_chat(user, "You can't cast spells while incapacitated!") - return 0 - - if(ishuman(user) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)) && user.get_item_blocking_speech()) - to_chat(user, "Mmmf mrrfff!") - return 0 - - var/spell/noclothes/spell = locate() in user.mind.learned_spells - if((spell_flags & NEEDSCLOTHES) && !(spell && istype(spell)))//clothes check - if(!user.wearing_wiz_garb()) - return 0 - - return 1 - -/spell/proc/check_charge(var/skipcharge, mob/user) - if(!skipcharge) - switch(charge_type) - if(Sp_RECHARGE) - if(charge_counter < charge_max) - to_chat(user, still_recharging_msg) - return 0 - if(Sp_CHARGES) - if(!charge_counter) - to_chat(user, "[name] has no charges left.") - return 0 - return 1 - -/spell/proc/take_charge(mob/user = user, var/skipcharge) - if(!skipcharge) - switch(charge_type) - if(Sp_RECHARGE) - charge_counter = 0 //doesn't start recharging until the targets selecting ends - src.process() - return 1 - if(Sp_CHARGES) - charge_counter-- //returns the charge if the targets selecting fails - return 1 - if(Sp_HOLDVAR) - adjust_var(user, holder_var_type, holder_var_amount) - return 1 - return 0 - return 1 - -/spell/proc/check_valid_targets(var/list/targets) - if(!targets) - return 0 - if(!islist(targets)) - targets = list(targets) - else if(!targets.len) - return 0 - - var/list/valid_targets = view_or_range(range, holder, selection_type) - for(var/target in targets) - if(!(target in valid_targets)) - return 0 - return 1 - -/spell/proc/invocation(mob/user = usr, var/list/targets) //spelling the spell out and setting it on recharge/reducing charges amount - - switch(invocation_type) - if(SpI_SHOUT) - if(prob(50))//Auto-mute? Fuck that noise - user.say(invocation) - else - user.say(replacetext(invocation," ","`")) - if(SpI_WHISPER) - if(prob(50)) - user.whisper(invocation) - else - user.whisper(replacetext(invocation," ","`")) - if(SpI_EMOTE) - user.custom_emote(VISIBLE_MESSAGE, invocation) - -///////////////////// -///UPGRADING PROCS/// -///////////////////// - -/spell/proc/can_improve(var/upgrade_type) - if(level_max[Sp_TOTAL] <= ( spell_levels[Sp_SPEED] + spell_levels[Sp_POWER] )) //too many levels, can't do it - return 0 - - //if(upgrade_type && spell_levels[upgrade_type] && level_max[upgrade_type]) - if(upgrade_type && spell_levels[upgrade_type] >= level_max[upgrade_type]) - return 0 - - return 1 - -/spell/proc/empower_spell() - if(!can_improve(Sp_POWER)) - return 0 - - spell_levels[Sp_POWER]++ - - return 1 - -/spell/proc/quicken_spell() - if(!can_improve(Sp_SPEED)) - return 0 - - spell_levels[Sp_SPEED]++ - - if(delay_reduc && cast_delay) - cast_delay = max(0, cast_delay - delay_reduc) - else if(cast_delay) - cast_delay = round( max(0, initial(cast_delay) * ((level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) / level_max[Sp_SPEED] ) ) ) - - if(charge_type == Sp_RECHARGE) - if(cooldown_reduc) - charge_max = max(cooldown_min, charge_max - cooldown_reduc) - else - charge_max = round( max(cooldown_min, initial(charge_max) * ((level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) / level_max[Sp_SPEED] ) ) ) //the fraction of the way you are to max speed levels is the fraction you lose - if(charge_max < charge_counter) - charge_counter = charge_max - - var/temp = "" - name = initial(name) - switch(level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) - if(3) - temp = "You have improved [name] into Efficient [name]." - name = "Efficient [name]" - if(2) - temp = "You have improved [name] into Quickened [name]." - name = "Quickened [name]" - if(1) - temp = "You have improved [name] into Free [name]." - name = "Free [name]" - if(0) - temp = "You have improved [name] into Instant [name]." - name = "Instant [name]" - - return temp - -/spell/proc/spell_do_after(var/mob/user, delay, var/numticks = 5) - if(!user || isnull(user)) - return 0 - - var/incap_flags = INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING - if(!(spell_flags & (GHOSTCAST))) - incap_flags |= INCAPACITATION_KNOCKOUT - - return do_after(user,delay, incapacitation_flags = incap_flags) - -/proc/view_or_range(distance = world.view , center = usr , type) - switch(type) - if("view") - . = view(distance,center) - if("range") - . = range(distance,center) \ No newline at end of file diff --git a/code/modules/spells/spell_projectile.dm b/code/modules/spells/spell_projectile.dm deleted file mode 100644 index 1599a59d3a7..00000000000 --- a/code/modules/spells/spell_projectile.dm +++ /dev/null @@ -1,56 +0,0 @@ -/obj/item/projectile/spell_projectile - name = "spell" - icon = 'icons/obj/projectiles.dmi' - - nodamage = 1 //Most of the time, anyways - - var/spell/targeted/projectile/carried - - penetrating = 0 - life_span = 10 //set by the duration of the spell - - var/proj_trail = 0 //if it leaves a trail - var/proj_trail_lifespan = 0 //deciseconds - var/proj_trail_icon = 'icons/obj/wizard.dmi' - var/proj_trail_icon_state = "trail" - var/list/trails = new() - -/obj/item/projectile/spell_projectile/Destroy() - for(var/trail in trails) - qdel(trail) - carried = null - return ..() - -/obj/item/projectile/spell_projectile/explosion_act() - SHOULD_CALL_PARENT(FALSE) - return - -/obj/item/projectile/spell_projectile/before_move() - if(proj_trail && src && src.loc) //pretty trails - var/obj/effect/overlay/trail = new /obj/effect/overlay(loc) - trails += trail - trail.icon = proj_trail_icon - trail.icon_state = proj_trail_icon_state - trail.set_density(0) - spawn(proj_trail_lifespan) - trails -= trail - qdel(trail) - -/obj/item/projectile/spell_projectile/proc/prox_cast(var/list/targets) - if(loc) - carried.prox_cast(targets, src) - qdel(src) - return - -/obj/item/projectile/spell_projectile/Bump(var/atom/A, forced=0) - if(loc && carried) - prox_cast(carried.choose_prox_targets(user = carried.holder, spell_holder = src)) - return 1 - -/obj/item/projectile/spell_projectile/on_impact() - if(loc && carried) - prox_cast(carried.choose_prox_targets(user = carried.holder, spell_holder = src)) - return 1 - -/obj/item/projectile/spell_projectile/seeking - name = "seeking spell" diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm deleted file mode 100644 index fa43c3e8d63..00000000000 --- a/code/modules/spells/spellbook.dm +++ /dev/null @@ -1,322 +0,0 @@ -#define NOREVERT 1 -#define LOCKED 2 -#define CAN_MAKE_CONTRACTS 4 -#define INVESTABLE 8 -#define NO_LOCKING 16 - -//spells/spellbooks have a variable for this but as artefacts are literal items they do not. -//so we do this instead. -var/global/list/artefact_feedback = list( - /obj/structure/closet/wizard/armor = "HS", - /obj/item/gun/energy/staff/focus = "MF", - /obj/item/gun/energy/staff/fire = "FS", - /obj/item/summoning_stone = "ST", - /obj/item/magic_rock = "RA", - /obj/item/contract/apprentice = "CP", - /obj/structure/closet/wizard/scrying = "SO", - /obj/item/paper/scroll/teleportation = "TS", - /obj/item/gun/energy/staff = "ST", - /obj/item/gun/energy/staff/animate = "SA", - /obj/item/dice/d20/cursed = "DW" -) - -/obj/item/book/spell - name = "master spell book" - desc = "The legendary book of spells of the wizard." - throw_speed = 1 - throw_range = 5 - w_class = ITEM_SIZE_NORMAL - material = /decl/material/solid/organic/paper - matter = list(/decl/material/solid/organic/leather = MATTER_AMOUNT_REINFORCEMENT) - unique = TRUE - var/uses = 1 - var/temp = null - var/datum/spellbook/spellbook - var/spellbook_type = /datum/spellbook/ //for spawning specific spellbooks. - var/investing_time = 0 //what time we target forr a return on our spell investment. - var/has_sacrificed = 0 //whether we have already got our sacrifice bonus for the current investment. - -/obj/item/book/spell/Initialize() - . = ..() - set_spellbook(spellbook_type) - -/obj/item/book/spell/try_carve() - return FALSE - -/obj/item/book/spell/proc/set_spellbook(var/type) - if(spellbook) - qdel(spellbook) - spellbook = new type() - uses = spellbook.max_uses - name = spellbook.name - desc = spellbook.desc - -/obj/item/book/spell/attack_self(mob/user) - if(!user.mind) - return - if (user.mind.assigned_special_role != /decl/special_role/wizard) - if (user.mind.assigned_special_role != "Wizard's Apprentice") - to_chat(user, "You can't make heads or tails of this book.") - return - if (spellbook.book_flags & LOCKED) - to_chat(user, "Drat! This spellbook's apprentice-proof lock is on!") - return - else if (spellbook.book_flags & LOCKED) - to_chat(user, "You notice the apprentice-proof lock is on. Luckily you are beyond such things.") - interact(user) - -/obj/item/book/spell/proc/make_sacrifice(obj/item/I, mob/user, var/reagent) - if(has_sacrificed) - to_chat(user, SPAN_WARNING("\The [src] is already sated! Wait for a return on your investment before you sacrifice more to it.")) - return - if(reagent) - if(I.reagents?.has_reagent(reagent, 5)) - I.remove_from_reagents(reagent, 5) - else if(LAZYACCESS(I.matter, reagent) >= (SHEET_MATERIAL_AMOUNT * 5)) - qdel(I) - else - if(istype(I,/obj/item/stack)) - var/obj/item/stack/S = I - if(S.amount < S.max_amount) - to_chat(usr, "You must sacrifice [S.max_amount] stacks of [S]!") - return - qdel(I) - to_chat(user, "Your sacrifice was accepted!") - has_sacrificed = 1 - investing_time = max(investing_time - 6000,1) //subtract 10 minutes. Make sure it doesn't act funky at the beginning of the game. - - -/obj/item/book/spell/attackby(obj/item/I, mob/user) - if(investing_time) - for(var/type in spellbook.sacrifice_objects) - if(istype(I,type)) - make_sacrifice(I, user) - return TRUE - - for(var/mat in spellbook.sacrifice_materials) - if(LAZYACCESS(I.matter, mat) > (SHEET_MATERIAL_AMOUNT * 10)) - make_sacrifice(I, user, mat) - return TRUE - - if(I.reagents) - for(var/id in spellbook.sacrifice_reagents) - if(I.reagents.has_reagent(id, 5)) - make_sacrifice(I, user, id) - return TRUE - return ..() - -/obj/item/book/spell/interact(mob/user) - var/dat = null - if(temp) - dat = "[temp]
    Return" - else - dat = "

    [spellbook.title]

    [spellbook.title_desc]
    You have [uses] spell slot\s left.

    " - dat += "
    Requires Wizard Garb
    Selectable Target
    Spell Charge Type: Recharge, Sacrifice, Charges

    " - dat += "
    To use a contract, first bind it to your soul, then give it to someone to sign. This will bind their soul to you.

    " - for(var/i in 1 to spellbook.spells.len) - var/name = "" //name of target - var/desc = "" //description of target - var/info = "" //additional information - if(ispath(spellbook.spells[i],/datum/spellbook)) - var/datum/spellbook/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.book_desc) - info = "[initial(S.max_uses)] Spell Slots" - else if(ispath(spellbook.spells[i],/obj)) - var/obj/O = spellbook.spells[i] - name = "Artefact: [capitalize(initial(O.name))]" //because 99.99% of objects dont have capitals in them and it makes it look weird. - desc = initial(O.desc) - else if(ispath(spellbook.spells[i],/spell)) - var/spell/S = spellbook.spells[i] - name = initial(S.name) - desc = initial(S.desc) - var/testing = initial(S.spell_flags) - if(testing & NEEDSCLOTHES) - info = "W" - var/type = "" - switch(initial(S.charge_type)) - if(Sp_RECHARGE) - type = "R" - if(Sp_HOLDVAR) - type = "S" - if(Sp_CHARGES) - type = "C" - info += "[type]" - dat += "[name]" - if(length(info)) - dat += " ([info])" - dat += " ([spellbook.spells[spellbook.spells[i]]] spell slot[spellbook.spells[spellbook.spells[i]] > 1 ? "s" : "" ])" - if(spellbook.book_flags & CAN_MAKE_CONTRACTS) - dat += " Make Contract" - dat += "
    [desc]

    " - dat += "
    " - dat += "
    Re-memorise your spellbook.
    " - if(spellbook.book_flags & INVESTABLE) - if(investing_time) - dat += "
    Currently investing in a slot...
    " - else - dat += "
    Invest a Spell Slot
    Investing a spellpoint will return two spellpoints back in 15 minutes.
    Some say a sacrifice could even shorten the time...
    " - if(!(spellbook.book_flags & NOREVERT)) - dat += "
    Choose different spellbook.
    " - if(!(spellbook.book_flags & NO_LOCKING)) - dat += "
    [spellbook.book_flags & LOCKED ? "Unlock" : "Lock"] the spellbook.
    " - show_browser(user, dat, "window=spellbook") - -/obj/item/book/spell/CanUseTopic(var/mob/living/human/H) - if(!istype(H)) - return STATUS_CLOSE - - if(H.mind && (spellbook.book_flags & LOCKED) && H.mind.assigned_special_role == "Wizard's Apprentice") //make sure no scrubs get behind the lock - return STATUS_CLOSE - - return ..() - -/obj/item/book/spell/OnTopic(var/mob/living/human/user, href_list) - if(href_list["lock"] && !(spellbook.book_flags & NO_LOCKING)) - if(spellbook.book_flags & LOCKED) - spellbook.book_flags &= ~LOCKED - else - spellbook.book_flags |= LOCKED - . = TOPIC_REFRESH - - else if(href_list["temp"]) - temp = null - . = TOPIC_REFRESH - - else if(href_list["book"]) - if(initial(spellbook.max_uses) != spellbook.max_uses || uses != spellbook.max_uses) - temp = "You've already purchased things using this spellbook!" - else - src.set_spellbook(/datum/spellbook) - temp = "You have reverted back to the Book of Tomes." - . = TOPIC_REFRESH - - else if(href_list["invest"]) - temp = invest() - . = TOPIC_REFRESH - - else if(href_list["path"]) - var/path = locate(href_list["path"]) in spellbook.spells - if(!path) - return TOPIC_HANDLED - if(uses < spellbook.spells[path]) - to_chat(user, "You do not have enough spell slots to purchase this.") - return TOPIC_HANDLED - send_feedback(path) //feedback stuff - if(ispath(path,/datum/spellbook)) - src.set_spellbook(path) - temp = "You have chosen a new spellbook." - else - if(href_list["contract"]) - if(!(spellbook.book_flags & CAN_MAKE_CONTRACTS)) - return //no - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] //no basksies - var/obj/O = new /obj/item/contract/boon(get_turf(user),path) - temp = "You have purchased \the [O]." - else - if(ispath(path,/spell)) - temp = src.add_spell(user,path) - if(temp) - uses -= spellbook.spells[path] - else - var/obj/O = new path(get_turf(user)) - temp = "You have purchased \a [O]." - uses -= spellbook.spells[path] - spellbook.max_uses -= spellbook.spells[path] - //finally give it a bit of an oomf - playsound(get_turf(user),'sound/effects/phasein.ogg',50,1) - . = TOPIC_REFRESH - - else if(href_list["reset"] && !(spellbook.book_flags & NOREVERT)) - var/area/map_template/wizard_station/A = get_area(user) - if(istype(A)) - uses = spellbook.max_uses - investing_time = 0 - has_sacrificed = 0 - user.spellremove() - temp = "All spells and investments have been removed. You may now memorise a new set of spells." - SSstatistics.add_field_details("wizard_spell_learned","UM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells - else - to_chat(user, "You must be in the wizard academy to re-memorise your spells.") - . = TOPIC_REFRESH - - src.interact(user) - -/obj/item/book/spell/proc/invest() - if(uses < 1) - return "You don't have enough slots to invest!" - if(investing_time) - return "You can only invest one spell slot at a time." - uses-- - START_PROCESSING(SSobj, src) - investing_time = world.time + (15 MINUTES) - return "You invest a spellslot and will recieve two in return in 15 minutes." - -/obj/item/book/spell/Process() - if(investing_time && investing_time <= world.time) - src.visible_message("\The [src] emits a soft chime.") - uses += 2 - if(uses > spellbook.max_uses) - spellbook.max_uses = uses - investing_time = 0 - has_sacrificed = 0 - STOP_PROCESSING(SSobj, src) - return 1 - -/obj/item/book/spell/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/book/spell/proc/send_feedback(var/path) - if(ispath(path,/datum/spellbook)) - var/datum/spellbook/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/spell)) - var/spell/S = path - SSstatistics.add_field_details("wizard_spell_learned","[initial(S.feedback)]") - else if(ispath(path,/obj)) - SSstatistics.add_field_details("wizard_spell_learned","[artefact_feedback[path]]") - - -/obj/item/book/spell/proc/add_spell(var/mob/user, var/spell_path) - for(var/spell/S in user.mind.learned_spells) - if(istype(S,spell_path)) - if(!S.can_improve()) - return - if(S.can_improve(Sp_SPEED) && S.can_improve(Sp_POWER)) - switch(alert(user, "Do you want to upgrade this spell's speed or power?", "Spell upgrade", "Speed", "Power", "Cancel")) - if("Speed") - return S.quicken_spell() - if("Power") - return S.empower_spell() - else - return - else if(S.can_improve(Sp_POWER)) - return S.empower_spell() - else if(S.can_improve(Sp_SPEED)) - return S.quicken_spell() - - var/spell/S = new spell_path() - user.add_spell(S) - return "You learn the spell [S]" - -/datum/spellbook - var/name = "\improper Book of Tomes" - var/desc = "The legendary book of spells of the wizard." - var/book_desc = "Holds information on the various tomes available to a wizard" - var/feedback = "" //doesn't need one. - var/book_flags = NOREVERT - var/max_uses = 1 - var/title = "Book of Tomes" - var/title_desc = "This tome marks down all the available tomes for use. Choose wisely, there are no refunds." - var/list/spells = list(/datum/spellbook/standard = 1, - /datum/spellbook/cleric = 1, - /datum/spellbook/battlemage = 1, - /datum/spellbook/spatial = 1, - /datum/spellbook/druid = 1 - ) //spell's path = cost of spell - - var/list/sacrifice_reagents - var/list/sacrifice_objects - var/list/sacrifice_materials diff --git a/code/modules/spells/spellbook/battlemage.dm b/code/modules/spells/spellbook/battlemage.dm deleted file mode 100644 index 07cebf63d82..00000000000 --- a/code/modules/spells/spellbook/battlemage.dm +++ /dev/null @@ -1,44 +0,0 @@ -//Battlemage is all about mixing physical with the mystical in head to head combat. -//Things like utility and mobility come second. -/datum/spellbook/battlemage - name = "\improper Battlemage's Bible" - feedback = "BM" - desc = "Smells like blood." - book_desc = "Mix physical with the mystical in head to head combat." - title = "The Art of Magical Combat" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/projectile/dumbfire/passage = 1, - /spell/targeted/equip_item/dyrnwyn = 1, - /spell/targeted/equip_item/shield = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/targeted/torment = 1, - /spell/targeted/heal_target = 2, - /spell/aoe_turf/conjure/mirage = 1, - /spell/targeted/shapeshift/corrupt_form = 1, - /spell/radiant_aura = 1, - /spell/noclothes = 1, - /obj/structure/closet/wizard/armor = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/gun/energy/staff/fire = 1, - /obj/item/dice/d20/cursed = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/xray = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list( - /obj/item/sword, - /obj/item/bladed/axe/fire, - /obj/item/baton, - /obj/item/knife/ritual, - /obj/item/knife/kitchen/cleaver, - /obj/item/knife/folding/combat/balisong, - /obj/item/knife/folding/tacticool, - /obj/item/star - ) diff --git a/code/modules/spells/spellbook/cleric.dm b/code/modules/spells/spellbook/cleric.dm deleted file mode 100644 index 98c5a48f6d5..00000000000 --- a/code/modules/spells/spellbook/cleric.dm +++ /dev/null @@ -1,50 +0,0 @@ -//Cleric is all about healing. Mobility and offense comes at a higher price but not impossible. -/obj/item/book/spell/cleric - spellbook_type = /datum/spellbook/cleric - -/datum/spellbook/cleric - name = "\improper Cleric's Tome" - feedback = "CR" - desc = "For those who do not harm, or at least feel sorry about it." - book_desc = "All about healing. Mobility and offense comes at a higher price but not impossible." - title = "Cleric's Tome of Healing" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 7 - - spells = list( - /spell/targeted/heal_target/major = 1, - /spell/targeted/heal_target/area = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/shapeshift/baleful_polymorph = 1, - /spell/targeted/projectile/dumbfire/stuncuff = 1, - /spell/targeted/ethereal_jaunt = 2, - /spell/aoe_turf/knock = 1, - /spell/radiant_aura = 1, - /spell/targeted/equip_item/holy_relic = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/targeted/projectile/dumbfire/fireball = 2, - /spell/area_teleport = 2, - /spell/portal_teleport = 2, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/noclothes = 1, - /obj/item/magic_rock = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list( - /decl/material/liquid/adminordrazine - ) - sacrifice_objects = list( - /obj/item/stack/nanopaste, - /obj/item/scanner/health, - /obj/item/scanner/breath, - /obj/item/stack/medical/bandage/advanced, - /obj/item/stack/medical/ointment/advanced, - /obj/item/bodybag/rescue, - /obj/item/defibrillator - ) diff --git a/code/modules/spells/spellbook/druid.dm b/code/modules/spells/spellbook/druid.dm deleted file mode 100644 index 48ee015d349..00000000000 --- a/code/modules/spells/spellbook/druid.dm +++ /dev/null @@ -1,43 +0,0 @@ -//all about the summons, nature, and a bit o' healin. - -/obj/item/book/spell/druid - spellbook_type = /datum/spellbook/druid - -/datum/spellbook/druid - name = "\improper Druid's Leaflet" - feedback = "DL" - desc = "It smells like an air freshener." - book_desc = "Summons, nature, and a bit o' healin." - title = "Druidic Guide on how to be smug about nature" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/heal_target = 1, - /spell/targeted/heal_target/sacrifice = 1, - /spell/aoe_turf/conjure/mirage = 1, - /spell/aoe_turf/conjure/summon/bats = 1, - /spell/aoe_turf/conjure/summon/bear = 1, - /spell/targeted/equip_item/party_hardy = 1, - /spell/targeted/equip_item/seed = 1, - /spell/targeted/shapeshift/avian = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/hand/charges/entangle = 1, - /spell/aoe_turf/conjure/grove/sanctuary = 1, - /spell/aoe_turf/knock = 1, - /spell/area_teleport = 2, - /spell/portal_teleport = 2, - /spell/noclothes = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 2, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - sacrifice_objects = list( - /obj/item/seeds, - /obj/item/wirecutters/clippers, - /obj/item/scanner/plant, - /obj/item/tool/axe/hatchet, - /obj/item/tool/hoe/mini - ) diff --git a/code/modules/spells/spellbook/spatial.dm b/code/modules/spells/spellbook/spatial.dm deleted file mode 100644 index def9a6695d2..00000000000 --- a/code/modules/spells/spellbook/spatial.dm +++ /dev/null @@ -1,48 +0,0 @@ -//all about moving around and mobility and being an annoying shit. - -/obj/item/book/spell/spatial - spellbook_type = /datum/spellbook/spatial - -/datum/spellbook/spatial - name = "\improper Spatial Manual" - feedback = "SP" - desc = "You feel like this might disappear from out of under you." - book_desc = "Movement and teleportation. Run from your problems!" - title = "Manual of Spatial Transportation" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 11 - - spells = list( - /spell/targeted/ethereal_jaunt = 1, - /spell/aoe_turf/blink = 1, - /spell/area_teleport = 1, - /spell/portal_teleport = 1, - /spell/targeted/projectile/dumbfire/passage = 1, - /spell/mark_recall = 1, - /spell/targeted/swap = 1, - /spell/targeted/shapeshift/avian = 1, - /spell/targeted/projectile/magic_missile = 1, - /spell/targeted/heal_target = 1, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/aoe_turf/smoke = 1, - /spell/aoe_turf/conjure/summon/bats = 3, - /spell/noclothes = 1, - /obj/item/dice/d20/cursed = 1, - /obj/structure/closet/wizard/scrying = 2, - /obj/item/paper/scroll/teleportation = 1, - /obj/item/magic_rock = 1, - /obj/item/summoning_stone = 3, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_reagents = list( - /decl/material/liquid/amphetamines - ) - sacrifice_objects = list( - /obj/item/stack/telecrystal - ) - sacrifice_materials = list( - /decl/material/solid/gemstone/diamond - ) \ No newline at end of file diff --git a/code/modules/spells/spellbook/standard.dm b/code/modules/spells/spellbook/standard.dm deleted file mode 100644 index 99e8f27c274..00000000000 --- a/code/modules/spells/spellbook/standard.dm +++ /dev/null @@ -1,54 +0,0 @@ -//the spellbook we know and love. Well, the one we know, at least. - -/obj/item/book/spell/standard - spellbook_type = /datum/spellbook/standard - -/datum/spellbook/standard - name = "\improper Standard Spellbook" - feedback = "SB" - title = "Book of Spells and Artefacts" - title_desc = "Buy spells using your available spell slots. Artefacts may also be bought however their cost is permanent." - book_desc = "A general wizard's spellbook. All its spells are easy to use but hard to master." - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 6 - - spells = list( - /spell/targeted/projectile/magic_missile = 1, - /spell/targeted/projectile/dumbfire/fireball = 1, - /spell/aoe_turf/disable_tech = 1, - /spell/aoe_turf/smoke = 1, - /spell/targeted/genetic/blind = 1, - /spell/targeted/subjugation = 1, - /spell/aoe_turf/conjure/forcewall = 1, - /spell/aoe_turf/blink = 1, - /spell/area_teleport = 1, - /spell/targeted/ethereal_jaunt = 1, - /spell/targeted/heal_target = 1, - /spell/aoe_turf/knock = 1, - /spell/noclothes = 2, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/gun/energy/staff/fire = 1, - /obj/item/gun/energy/staff/animate = 1, - /obj/structure/closet/wizard/scrying = 1, - /obj/item/summoning_stone = 2, - /obj/item/magic_rock = 1, - /obj/item/contract/wizard/telepathy = 1, - /obj/item/contract/apprentice = 1 - ) - - sacrifice_objects = list( - /obj/item/toolbox, - /obj/item/cane/fancy, - /obj/item/flamethrower, - /obj/item/plastique, - /obj/item/dice, - /obj/item/soap, - /obj/item/flame/candle, - /obj/item/flame/candle/scented/incense, - /obj/item/caution, - /obj/item/towel, - /obj/item/tank/jetpack, - /obj/item/plunger, - /obj/item/megaphone, - /obj/item/deck/cards - ) \ No newline at end of file diff --git a/code/modules/spells/spellbook/student.dm b/code/modules/spells/spellbook/student.dm deleted file mode 100644 index 1c07a5135b1..00000000000 --- a/code/modules/spells/spellbook/student.dm +++ /dev/null @@ -1,28 +0,0 @@ -//wizard's training wheels. Basically. Same shit as in the general one. - -/obj/item/book/spell/student - spellbook_type = /datum/spellbook/student - -/datum/spellbook/student - name = "\improper Student's Spellbook" - feedback = "ST" - desc = "This spell book has a sticker on it that says, 'certified for children 5 and older'." - book_desc = "This spellbook is dedicated to teaching neophytes in the ways of magic." - title = "Book of Spells and Education" - title_desc = "Hello. Congratulations on becoming a wizard. You may be asking yourself: What? A wizard? Already? Of course! Anybody can become a wizard! Learning to be a good one is the hard part.
    Without further adue, let us begin by learning the three concepts of wizardry, 'Spell slots', 'Spells', and 'Artifacts'.
    Firstly lets try to understand the 'spell slot'. A spell slot is the measurable amount of spells and artifacts one tome can give. Most spells will only take up a singular spell slot, however more powerful spells/artifacts can take up more.
    Spells are spells. They can have requirements, such as wizard garb, and most can be upgraded by purchasing additional spell slots for them. Most upgrades fall into two categories, 'Speed' and 'Power'. Speed upgrades decrease the time you have to spend recharging your spell. Power increases the potency of your spells. Spells are also special in that they can be refunded while inside the Wizard Acadamy, so if you want to test a spell out before moving out into the field, feel free to do that in the comfort of our home.
    Artifacts, or 'Artefacts' as we call them, are powerful wizard tools or items made specially for wizards everywhere. Extremely potent, they cannot be refunded like spells, and some of them can be used by non-wizards, so be careful!
    Knowing these three concepts puts you in a league above most wizards, however knowledge of spells is just as important so we've included a list of spells below made specifically for the beginning wizard. Take all of them, or mix and match, remember being creative is half of being a wizard!" - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE - max_uses = 5 - - spells = list( - /spell/aoe_turf/knock = 1, - /spell/targeted/ethereal_jaunt = 1, - /spell/targeted/projectile/magic_missile = 1, - /obj/item/gun/energy/staff/focus = 1, - /obj/item/contract/wizard/xray = 1 - ) - -/datum/spellbook/student/apprentice - book_flags = CAN_MAKE_CONTRACTS|INVESTABLE|NOREVERT|NO_LOCKING - -/obj/item/book/spell/apprentice - spellbook_type = /datum/spellbook/student/apprentice diff --git a/code/modules/spells/spells.dm b/code/modules/spells/spells.dm deleted file mode 100644 index ad550747a7f..00000000000 --- a/code/modules/spells/spells.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/mind - var/list/learned_spells - -/mob/Stat() - . = ..() - if(. && ability_master && ability_master.spell_objects) - for(var/obj/screen/ability/spell/screen in ability_master.spell_objects) - var/spell/S = screen.spell - if((!S.connected_button) || !statpanel(S.panel)) - continue //Not showing the noclothes spell - switch(S.charge_type) - if(Sp_RECHARGE) - statpanel(S.panel,"[S.charge_counter/10.0]/[S.charge_max/10]",S.connected_button) - if(Sp_CHARGES) - statpanel(S.panel,"[S.charge_counter]/[S.charge_max]",S.connected_button) - if(Sp_HOLDVAR) - statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S.connected_button) - -/proc/restore_spells(var/mob/H) - if(H.mind && H.mind.learned_spells) - var/list/spells = list() - for(var/spell/spell_to_remove in H.mind.learned_spells) //remove all the spells from other people. - if(ismob(spell_to_remove.holder)) - var/mob/M = spell_to_remove.holder - spells += spell_to_remove - M.remove_spell(spell_to_remove) - - for(var/spell/spell_to_add in spells) - H.add_spell(spell_to_add) - H.ability_master.update_abilities(0,H) - -/mob/proc/add_spell(var/spell/spell_to_add, var/spell_base = "wiz_spell_ready") - if(!ability_master) - ability_master = new(null, src) - spell_to_add.holder = src - if(mind) - if(!mind.learned_spells) - mind.learned_spells = list() - mind.learned_spells |= spell_to_add - ability_master.add_spell(spell_to_add, spell_base) - return 1 - -/mob/proc/remove_spell(var/spell/spell_to_remove) - if(!spell_to_remove || !istype(spell_to_remove)) - return - - if(mind) - mind.learned_spells -= spell_to_remove - if (ability_master) - ability_master.remove_ability(ability_master.get_ability_by_spell(spell_to_remove)) - return 1 - -/mob/proc/silence_spells(var/amount = 0) - if(amount < 0) - return - - if(!ability_master) - return - - ability_master.silence_spells(amount) \ No newline at end of file diff --git a/code/modules/spells/targeted/analyze.dm b/code/modules/spells/targeted/analyze.dm deleted file mode 100644 index 705d97399c7..00000000000 --- a/code/modules/spells/targeted/analyze.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/analyze - name = "Analyze" - desc = "Using your wizardly powers, you can detect the inner destructions of a persons body." - - feedback = "AZ" - school = "illusion" - charge_max = 100 - spell_flags = INCLUDEUSER|SELECTABLE - range = 2 - invocation_type = SpI_WHISPER - invocation = "Fu Yi Fim" - compatible_mobs = list(/mob/living/human) - hud_state = "analyze" - -/spell/targeted/analyze/cast(var/list/targets, var/mob/user) - for(var/a in targets) - var/mob/living/human/H = a - new /obj/effect/temporary(get_turf(a),5, 'icons/effects/effects.dmi', "repel_missiles") - to_chat(user,medical_scan_results(H,1)) \ No newline at end of file diff --git a/code/modules/spells/targeted/blood_boil.dm b/code/modules/spells/targeted/blood_boil.dm deleted file mode 100644 index 4c39b3b4620..00000000000 --- a/code/modules/spells/targeted/blood_boil.dm +++ /dev/null @@ -1,25 +0,0 @@ -/spell/targeted/blood_boil - name = "Blood Boil" - desc = "Allow you to concentrate so deeply on a target that their body temperature increases, eventually setting them on fire." - feedback = "BO" - school = "transmutation" - charge_max = 300 - spell_flags = 0 - invocation_type = SpI_NONE - range = 5 - max_targets = 1 - compatible_mobs = list(/mob/living/human) - - time_between_channels = 50 - number_of_channels = 0 - - hud_state = "wiz_boilblood" - -/spell/targeted/blood_boil/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = targets[1] - 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_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 deleted file mode 100644 index 74061d776dd..00000000000 --- a/code/modules/spells/targeted/cleric_spells.dm +++ /dev/null @@ -1,248 +0,0 @@ -/spell/targeted/heal_target - name = "Cure Light Wounds" - desc = "a rudimentary spell used mainly by wizards to heal papercuts. Does not require wizard garb." - feedback = "CL" - school = "transmutation" - charge_max = 20 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE - invocation = "Di'Nath!" - invocation_type = SpI_SHOUT - range = 2 - max_targets = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 2) - - cooldown_reduc = 50 - hud_state = "heal_minor" - cast_sound = 'sound/magic/staff_healing.ogg' - - amt_dam_brute = -15 - amt_dam_fire = -5 - amt_dam_robo = -4 - effect_state = "green_sparkles" - effect_duration = 5 - - // Vars expect a constant at compile time, so we can't use macros for spans here - message = "You feel a pleasant rush of heat move through your body." - -/spell/targeted/heal_target/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 7 - return "[src] will now heal more." - -/spell/targeted/heal_target/touch - name = "Healing Touch" - desc = "Heals an adjacent target for a reasonable amount of health." - range = 1 - amt_dam_fire = -7 - amt_dam_brute = -7 - amt_dam_robo = -5 - charge_max = 10 SECONDS - spell_flags = SELECTABLE - invocation = "Di'Na!" - - hud_state = "heal_touch" - -/spell/targeted/heal_target/major - name = "Cure Major Wounds" - desc = "A spell used to fix others that cannot be fixed with regular medicine." - feedback = "CM" - charge_max = 30 SECONDS - spell_flags = INCLUDEUSER | SELECTABLE | NEEDSCLOTHES - invocation = "Borv Di'Nath!" - range = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) - cooldown_reduc = 100 - hud_state = "heal_major" - - amt_dam_brute = -75 - amt_dam_fire = -50 - amt_dam_robo = -10 - amt_blood = 28 - - message = "Your body feels like a warm, cozy fire." - -/spell/targeted/heal_target/major/empower_spell() - if(!..()) - return 0 - amt_blood = 28 - amt_organ = 5 - amt_brain = -5 - amt_radiation = -25 - amt_dam_tox = -20 - amt_dam_oxy = -14 - amt_dam_brute = -35 - amt_dam_fire = -35 - amt_dam_robo = -15 - - return "[src] heals more, and heals organ damage and radiation." - -/spell/targeted/heal_target/area - name = "Cure Area" - desc = "This spell heals everyone in an area." - feedback = "HA" - charge_max = 1 MINUTE - spell_flags = INCLUDEUSER - invocation = "Nal Di'Nath!" - range = 2 - max_targets = 0 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 1) - cooldown_reduc = 300 - hud_state = "heal_area" - amt_dam_robo = -6 - amt_dam_brute = -25 - amt_dam_fire = -25 - -/spell/targeted/heal_target/area/empower_spell() - if(!..()) - return 0 - amt_dam_brute -= 15 - amt_dam_fire -= 15 - amt_dam_robo -= 4 - range += 2 - - return "[src] now heals more in a wider area." - -/spell/targeted/heal_target/area/slow - charge_max = 2 MINUTES - -/spell/targeted/heal_target/sacrifice - name = "Sacrifice" - desc = "This spell heals immensily. For a price. Does not require wizard garb." - feedback = "SF" - spell_flags = SELECTABLE - invocation = "Ei'Nath Borv Di'Nath!" - charge_type = Sp_HOLDVAR - holder_var_type = "fireloss" - holder_var_amount = 100 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - amt_blood = 280 - effect_color = "#ff0000" - - hud_state = "gen_dissolve" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/targeted/heal_target/sacrifice/empower_spell() - if(!..()) - return 0 - - amt_organ = 25 - amt_brain = -25 - amt_radiation = -100 - - - return "You will now heal organ and brain damage, as well as virtually purge all radiation." - - -/spell/targeted/heal_target/trance - name = "Trance" - desc = "A mighty spell of restoration that briefly forces its target into a deep, dreamless sleep, rapidly repairing their body and soul as their senses are dulled. The users of this mighty art are known for being short lived, slowly devolving into raving madness as the power they once relied on fails them with excessive use." - feedback = "TC" - spell_flags = SELECTABLE - invocation = "Di' Dae Nath!" - charge_max = 2 MINUTES - - amt_dam_brute = -1000 - amt_dam_fire = -1000 - amt_dam_oxy = -100 - amt_dam_tox = -100 - amt_dam_robo = -1000 - hud_state = "trance" - var/obj/effect/effect - -/spell/targeted/heal_target/trance/cast(var/list/targets, var/mob/user) - for(var/t in targets) - var/mob/living/L = t - var/turf/T = get_turf(L) - effect = new /obj/effect/rift(T) - effect.color = "f0e68c" - L.forceMove(effect) - var/time = (L.get_damage(BRUTE) + L.get_damage(BURN)) * 20 - L.status_flags &= GODMODE - to_chat(L,"You will be in stasis for [time/10] second\s.") - addtimer(CALLBACK(src,PROC_REF(cancel_rift)),time) - -/spell/targeted/heal_target/trance/Destroy() - cancel_rift() - return ..() - -/spell/targeted/heal_target/trance/proc/cancel_rift() - if(effect) - var/mob/living/L = locate() in effect - L.status_flags &= ~GODMODE - L.forceMove(get_turf(L)) - apply_spell_damage(L) - charge_max += 300 - QDEL_NULL(effect) - -/obj/effect/rift - name = "rift" - desc = "a tear in space and time." - icon = 'icons/obj/wizard.dmi' - icon_state = "rift" - anchored = TRUE - density = FALSE - -/obj/effect/rift/Destroy() - for(var/o in contents) - var/atom/movable/M = o - M.dropInto(loc) - . = ..() - -/spell/targeted/revoke - name = "Revoke Death" - desc = "Revoke that of death itself. Comes at a cost that may be hard to manage for some." - feedback = "RK" - - spell_flags = SELECTABLE - - charge_type = Sp_CHARGES - charge_max = 1 - invocation = "Di Le Nal Yen Nath!" - invocation_type = SpI_SHOUT - range = 1 - hud_state = "heal_revoke" - -/spell/targeted/revoke/cast(var/list/targets, var/mob/living/user) - if(alert(user, "Are you sure?", "Alert", "Yes", "No") == "Yes" && alert(user, "Are you ABSOLUTELY SURE?", "Alert", "Absolutely!", "No") == "Absolutely!") - var/should_wait = 1 - for(var/t in targets) - var/mob/living/M = t - M.rejuvenate() - if(M.client) //We've got a dude - should_wait = 0 - break //Don't need to check anymore. - if(should_wait) - addtimer(CALLBACK(src,PROC_REF(check_for_revoke),targets), 30 SECONDS) - else - revoke_spells() - - -/spell/targeted/revoke/proc/check_for_revoke(var/list/targets) - for(var/t in targets) - var/mob/M = t - if(M.client) - revoke_spells() - return - charge_counter = charge_max - to_chat(holder,"\The [src] refreshes as it seems it could not bring back the souls of those you healed.") - -/spell/targeted/revoke/proc/revoke_spells() - if(!isliving(holder)) - return - var/mob/living/M = holder - if(M.mind) - for(var/s in M.mind.learned_spells) - if(istype(s, /spell/toggle_armor)) //Can keep the armor n junk. - continue - M.remove_spell(s) - for(var/a in M.auras) - M.remove_aura(a) \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/burning_touch.dm b/code/modules/spells/targeted/equip/burning_touch.dm deleted file mode 100644 index 65ed431693b..00000000000 --- a/code/modules/spells/targeted/equip/burning_touch.dm +++ /dev/null @@ -1,69 +0,0 @@ -/spell/targeted/equip_item/burning_hand - name = "Burning Hand" - desc = "Bathes your hand in fire, giving you all the perks and disadvantages that brings." - feedback = "BH" - school = "conjuration" - invocation = "Horila Kiha!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - duration = 0 - max_targets = 1 - equipped_summons = list("active hand" = /obj/item/burning_hands) - delete_old = 0 - hud_state = "gen_burnhand" - -/obj/item/burning_hands - name = "Burning Hand" - icon = 'icons/mob/screen/grabs.dmi' - icon_state = "grabbed+1" - _base_attack_force = 10 - atom_damage_type = BURN - simulated = 0 - max_health = ITEM_HEALTH_NO_DAMAGE - obj_flags = OBJ_FLAG_NO_STORAGE - var/burn_power = 0 - var/burn_timer - -/obj/item/burning_hands/on_picked_up(var/mob/user) - burn_power = 0 - burn_timer = world.time + 10 SECONDS - START_PROCESSING(SSobj,src) - -/obj/item/burning_hands/get_heat() - return 1000 - -/obj/item/burning_hands/isflamesource() - return TRUE - -/obj/item/burning_hands/Process() - if(world.time < burn_timer) - return - burn_timer = world.time + 5 SECONDS - burn_power++ - set_base_attack_force(get_base_attack_force()+2) - if(!ishuman(src.loc)) - qdel(src) - return - var/mob/living/human/user = src.loc - var/obj/item/organ/external/hand - if(src == user.get_equipped_item(BP_L_HAND)) - hand = GET_EXTERNAL_ORGAN(user, BP_L_HAND) - else if(src == user.get_equipped_item(BP_R_HAND)) - hand = GET_EXTERNAL_ORGAN(user, BP_R_HAND) - if(hand) - hand.take_external_damage(burn = 2 * burn_power) - if(burn_power > 5) - user.fire_stacks += 15 - user.IgniteMob() - user.visible_message("\The [user] bursts into flames!") - user.drop_from_inventory(src) - else - if(burn_power == 5) - to_chat(user, "You begin to lose control of \the [src]'s flames as they rapidly move up your arm...") - else - to_chat(user, "You feel \the [src] grow hotter and hotter!") - -/obj/item/burning_hands/dropped() - ..() - qdel(src) \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/dyrnwyn.dm b/code/modules/spells/targeted/equip/dyrnwyn.dm deleted file mode 100644 index 71d7ace1e4f..00000000000 --- a/code/modules/spells/targeted/equip/dyrnwyn.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/targeted/equip_item/dyrnwyn - name = "Summon Dyrnwyn" - desc = "Summons the legendary sword of Rhydderch Hael, said to draw in flame when held by a worthy man." - feedback = "SD" - charge_type = Sp_HOLDVAR - holder_var_type = "fireloss" - holder_var_amount = 10 - school = "conjuration" - invocation = "Anrhydeddu Fi!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - duration = 300 //30 seconds - max_targets = 1 - equipped_summons = list("active hand" = /obj/item/sword) - delete_old = FALSE - var/material = /decl/material/solid/metal/gold - - hud_state = "gen_immolate" - - -/spell/targeted/equip_item/dyrnwyn/summon_item(var/new_type) - var/obj/item/sword = new new_type(null,material) - sword.SetName("\improper Dyrnwyn") - sword.atom_damage_type = BURN - sword.hitsound = 'sound/items/welder2.ogg' - LAZYSET(sword.slowdown_per_slot, BP_L_HAND, 1) - LAZYSET(sword.slowdown_per_slot, BP_R_HAND, 1) - return sword - -/spell/targeted/equip_item/dyrnwyn/empower_spell() - if(!..()) - return FALSE - - material = /decl/material/solid/metal/silver - return "Dyrnwyn has been made pure: it is now made of silver." diff --git a/code/modules/spells/targeted/equip/equip.dm b/code/modules/spells/targeted/equip/equip.dm deleted file mode 100644 index 7b0304d9e07..00000000000 --- a/code/modules/spells/targeted/equip/equip.dm +++ /dev/null @@ -1,38 +0,0 @@ -//You can set duration to 0 to have the items last forever - -/spell/targeted/equip_item - cast_sound = 'sound/magic/summonitems_generic.ogg' - var/list/equipped_summons = list() //assoc list of text ids and paths to spawn - var/list/summoned_items = list() //list of items we summoned and will dispose when the spell runs out - var/delete_old = 1 //if the item previously in the slot is deleted - otherwise, it's dropped - -/spell/targeted/equip_item/cast(list/targets, mob/user = usr) - ..() - for(var/mob/living/L in targets) - for(var/slot_id in equipped_summons) - var/to_create = equipped_summons[slot_id] - if(cmptext(slot_id,"active hand")) - slot_id = user.get_active_held_item_slot() - else if(cmptext(slot_id, "off hand")) - slot_id = user.get_empty_hand_slot() - else - slot_id = text2num(slot_id) //because the index is text, we access this instead - var/obj/item/new_item = summon_item(to_create) - var/obj/item/old_item = L.get_equipped_item(slot_id) - if(old_item) - L.drop_from_inventory(old_item) - if(delete_old) - qdel(old_item) - L.equip_to_slot(new_item, slot_id) - new_item.on_picked_up(L) - - if(duration) - summoned_items += new_item //we store it in a list to remove later - - if(duration) - spawn(duration) - for(var/obj/item/to_remove in summoned_items) - qdel(to_remove) - -/spell/targeted/equip_item/proc/summon_item(var/newtype) - return new newtype diff --git a/code/modules/spells/targeted/equip/holy_relic.dm b/code/modules/spells/targeted/equip/holy_relic.dm deleted file mode 100644 index 7c6dadf5da2..00000000000 --- a/code/modules/spells/targeted/equip/holy_relic.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/targeted/equip_item/holy_relic - name = "Summon Holy Relic" - desc = "This spell summons a relic of purity into your hand for a short while. The relic will disrupt occult and magical energies - be wary, as this includes your own." - feedback = "SR" - school = "conjuration" - charge_type = Sp_RECHARGE - spell_flags = NEEDSCLOTHES | INCLUDEUSER - invocation = "Yee'Ro Su!" - invocation_type = SpI_SHOUT - range = 0 - max_targets = 1 - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 1, Sp_POWER = 1) - charge_max = 60 SECONDS - duration = 25 SECONDS - cooldown_min = 35 SECONDS - delete_old = 0 - compatible_mobs = list(/mob/living/human) - - hud_state = "purge1" - - equipped_summons = list("active hand" = /obj/item/nullrod) - -/spell/targeted/equip_item/holy_relic/cast(list/targets, mob/user = usr) - ..() - for(var/mob/M in targets) - M.visible_message(SPAN_DANGER("A rod of metal appears in \the [M]'s hand!")) - -/spell/targeted/equip_item/holy_relic/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "The holy relic now lasts for [duration/10] seconds." \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/horsemask.dm b/code/modules/spells/targeted/equip/horsemask.dm deleted file mode 100644 index 31995ba86bd..00000000000 --- a/code/modules/spells/targeted/equip/horsemask.dm +++ /dev/null @@ -1,48 +0,0 @@ -/spell/targeted/equip_item/horsemask - name = "Curse of the Horseman" - desc = "This spell triggers a curse on a target, causing them to wield an unremovable horse head mask. They will speak like a horse! Any masks they are wearing will be disintegrated. This spell does not require robes." - school = "transmutation" - charge_type = Sp_RECHARGE - charge_max = 150 - charge_counter = 0 - spell_flags = 0 - invocation = "Kn'a Ftaghu, Puck'Bthnk!" - invocation_type = SpI_SHOUT - range = 7 - max_targets = 1 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 1) - cooldown_min = 30 //30 deciseconds reduction per rank - selection_type = "range" - - compatible_mobs = list(/mob/living/human) - - hud_state = "wiz_horse" - cast_sound = 'sound/magic/horsehead_curse.ogg' - -/spell/targeted/equip_item/horsemask/New() - ..() - equipped_summons = list("[slot_wear_mask_str]" = /obj/item/clothing/mask/horsehead) - -/spell/targeted/equip_item/horsemask/cast(list/targets, mob/user = usr) - ..() - for(var/mob/living/target in targets) - target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place!", \ - "Your face burns up, and shortly after the fire you realise you have the face of a horse!") - target.flash_eyes() - -/spell/targeted/equip_item/horsemask/summon_item(var/new_type) - var/obj/item/new_item = new new_type - new_item.canremove = 0 //curses! - if(istype(new_item, /obj/item/clothing/mask/horsehead)) - var/obj/item/clothing/mask/horsehead/magichead = new_item - magichead.flags_inv = null //so you can still see their face - magichead.voicechange = 1 //NEEEEIIGHH - return new_item - -/spell/targeted/equip_item/horsemask/empower_spell() - if(!..()) - return 0 - - spell_flags = SELECTABLE - - return "You can now select your target with [src]" \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/party_hardy.dm b/code/modules/spells/targeted/equip/party_hardy.dm deleted file mode 100644 index f6f7ba54d07..00000000000 --- a/code/modules/spells/targeted/equip/party_hardy.dm +++ /dev/null @@ -1,36 +0,0 @@ -/spell/targeted/equip_item/party_hardy - name = "Summon Party" - desc = "This spell was invented for the sole purpose of getting crunked at 11am on a Tuesday. Does not require wizard garb." - feedback = "PY" - school = "conjuration" - charge_type = Sp_RECHARGE - charge_max = 900 - cooldown_min = 600 - spell_flags = INCLUDEUSER - invocation = "Llet'Su G'iit Rrkned!" //Let's get wrecked. - invocation_type = SpI_SHOUT - range = 6 - max_targets = 0 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 2) - delete_old = 0 - - hud_state = "wiz_party" - - compatible_mobs = list(/mob/living/human) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer) - -/spell/targeted/equip_item/party_hardy/empower_spell() - if(!..()) - return 0 - switch(spell_levels[Sp_POWER]) - if(1) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/small/beer, - "off hand" = /obj/item/food/poppypretzel) - return "The spell will now give everybody a preztel as well." - if(2) - equipped_summons = list("active hand" = /obj/item/chems/drinks/bottle/absinthe, - "off hand" = /obj/item/food/poppypretzel, - "[slot_head_str]" = /obj/item/clothing/head/collectable/wizard) - return "Woo! Now everybody gets a cool wizard hat and MORE BOOZE!" - - return 0 \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/seed.dm b/code/modules/spells/targeted/equip/seed.dm deleted file mode 100644 index 2252ec75c8c..00000000000 --- a/code/modules/spells/targeted/equip/seed.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/targeted/equip_item/seed - name = "Summon Seed" - desc = "This spell summons a random seed into the hand of the wizard." - feedback = "SE" - delete_old = 0 - - spell_flags = INCLUDEUSER | NEEDSCLOTHES - invocation_type = SpI_WHISPER - invocation = "Ria'li akta." - - equipped_summons = list("active hand" = /obj/item/seeds/random) - compatible_mobs = list(/mob/living/human) - - charge_max = 600 //1 minute - cooldown_min = 200 //20 seconds - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 0) - - range = -1 - max_targets = 1 - - hud_state = "wiz_seed" \ No newline at end of file diff --git a/code/modules/spells/targeted/equip/shield.dm b/code/modules/spells/targeted/equip/shield.dm deleted file mode 100644 index b725196ad3a..00000000000 --- a/code/modules/spells/targeted/equip/shield.dm +++ /dev/null @@ -1,41 +0,0 @@ -/spell/targeted/equip_item/shield - name = "Summon Shield" - desc = "Summons the most holy of shields, the riot shield. Commonly used during wizard riots." - feedback = "SH" - school = "conjuration" - invocation = "Sia helda!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER | NEEDSCLOTHES - range = -1 - max_targets = 1 - - compatible_mobs = list(/mob/living/human) - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 1) - charge_type = Sp_RECHARGE - charge_max = 900 - cooldown_min = 300 - equipped_summons = list("off hand" = /obj/item/shield/) - duration = 300 - delete_old = 0 - var/item_color = "#6666ff" - var/block_chance = 30 - - hud_state = "wiz_shield" - -/spell/targeted/equip_item/shield/summon_item(var/new_type) - var/obj/item/shield/I = new new_type() - I.icon_state = "buckler" - I.color = item_color - I.SetName("Wizard's Shield") - I.base_block_chance = block_chance - return I - -/spell/targeted/equip_item/shield/empower_spell() - if(!..()) - return 0 - - item_color = "#6600ff" - block_chance = 60 - - return "Your summoned shields will now block more often." diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm deleted file mode 100644 index e686e7712dc..00000000000 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ /dev/null @@ -1,120 +0,0 @@ -/spell/targeted/ethereal_jaunt - name = "Ethereal Jaunt" - desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - feedback = "EJ" - school = "transmutation" - charge_max = 30 SECONDS - spell_flags = Z2NOCAST | NEEDSCLOTHES | INCLUDEUSER - invocation = "none" - invocation_type = SpI_NONE - range = 0 - max_targets = 1 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 3) - cooldown_min = 10 SECONDS //50 deciseconds reduction per rank - duration = 5 SECONDS - - hud_state = "wiz_jaunt" - -/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded - for(var/mob/living/target in targets) - if(HAS_TRANSFORMATION_MOVEMENT_HANDLER(target)) - continue - - if(target.buckled) - target.buckled.unbuckle_mob() - spawn(0) - var/mobloc = get_turf(target.loc) - var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc ) - var/atom/movable/overlay/animation = new /atom/movable/overlay(holder) - animation.SetName("water") - animation.set_density(0) - animation.anchored = TRUE - animation.icon = 'icons/mob/mob.dmi' - animation.layer = FLY_LAYER - target.ExtinguishMob() - if(target.buckled) - target.buckled = null - jaunt_disappear(animation, target) - target.forceMove(holder) - jaunt_steam(mobloc) - sleep(duration) - mobloc = holder.last_valid_turf - animation.forceMove(mobloc) - jaunt_steam(mobloc) - holder.reappearing = 1 - sleep(20) - jaunt_reappear(animation, target) - sleep(5) - if(!target.forceMove(mobloc)) - for(var/direction in list(1,2,4,8,5,6,9,10)) - var/turf/T = get_step(mobloc, direction) - if(T) - if(target.forceMove(T)) - break - target.client.eye = target - qdel(animation) - qdel(holder) - -/spell/targeted/ethereal_jaunt/empower_spell() - if(!..()) - return 0 - duration += 2 SECONDS - - return "[src] now lasts longer." - -/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) - animation.icon_state = "liquify" - flick("liquify",animation) - playsound(get_turf(target), 'sound/magic/ethereal_enter.ogg', 30) - -/spell/targeted/ethereal_jaunt/proc/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target) - flick("reappear",animation) - playsound(get_turf(target), 'sound/magic/ethereal_exit.ogg', 30) - -/spell/targeted/ethereal_jaunt/proc/jaunt_steam(var/mobloc) - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() - steam.set_up(10, 0, mobloc) - steam.start() - -/obj/effect/dummy/spell_jaunt - name = "water" - icon = 'icons/effects/effects.dmi' - icon_state = "nothing" - var/canmove = 1 - var/reappearing = 0 - density = FALSE - anchored = TRUE - var/turf/last_valid_turf - -/obj/effect/dummy/spell_jaunt/Initialize() - . = ..() - last_valid_turf = get_turf(loc) - -/obj/effect/dummy/spell_jaunt/Destroy() - // Eject contents if deleted somehow - for(var/atom/movable/AM in src) - AM.dropInto(loc) - return ..() - -/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction) - if (!canmove || reappearing) return - var/turf/newLoc = get_step(src, direction) - if(!(newLoc.turf_flags & TURF_FLAG_NOJAUNT)) - forceMove(newLoc) - var/turf/T = get_turf(loc) - if(!T.contains_dense_objects()) - last_valid_turf = T - else - to_chat(user, "Some strange aura is blocking the way!") - canmove = 0 - addtimer(CALLBACK(src, PROC_REF(allow_move)), 2) - -/obj/effect/dummy/spell_jaunt/proc/allow_move() - canmove = TRUE - -/obj/effect/dummy/spell_jaunt/explosion_act(blah) - SHOULD_CALL_PARENT(FALSE) - return - -/obj/effect/dummy/spell_jaunt/bullet_act(blah) - return diff --git a/code/modules/spells/targeted/exude_pleasantness.dm b/code/modules/spells/targeted/exude_pleasantness.dm deleted file mode 100644 index 74ae51237ab..00000000000 --- a/code/modules/spells/targeted/exude_pleasantness.dm +++ /dev/null @@ -1,19 +0,0 @@ -/spell/targeted/exude_pleasantness - name = "Exhude Pleasantness" - desc = "A simple spell used to make friends with people. Be warned, this spell only has a subtle effect" - feedback = "AP" - school = "Illusion" - spell_flags = INCLUDEUSER - range = 5 - max_targets = 0 - charge_max = 100 - var/list/possible_messages = list("seems pretty trustworthy!", "makes you feel appreciated.", "looks pretty cool.", "feels like the only decent person here!", "makes you feel safe.") - hud_state = "friendly" - -/spell/targeted/exude_pleasantness/cast(var/list/targets, var/mob/user) - for(var/m in targets) - var/mob/living/L = m - if(L.mind && L.mind.assigned_special_role == "Spellbound Servant") - to_chat(m, SPAN_NOTICE("\The [user] seems relatively harmless.")) - else - to_chat(m, FONT_LARGE(SPAN_NOTICE("\The [user] [pick(possible_messages)]"))) \ No newline at end of file diff --git a/code/modules/spells/targeted/genetic.dm b/code/modules/spells/targeted/genetic.dm deleted file mode 100644 index bcc5233b9b6..00000000000 --- a/code/modules/spells/targeted/genetic.dm +++ /dev/null @@ -1,73 +0,0 @@ -/* -Other mutation or disability spells can be found in -code\game\dna\genes\vg_powers.dm -code\game\dna\genes\goon_disabilities.dm -code\game\dna\genes\goon_powers.dm -*/ -/spell/targeted/genetic - name = "Genetic modifier" - desc = "This spell inflicts a set of genetic conditions upon the target." - duration = 10 SECONDS - var/list/genetic_conditions = list() - -/spell/targeted/genetic/cast(list/targets) - ..() - for(var/mob/living/target in targets) - for(var/x in genetic_conditions) - target.add_genetic_condition(x, duration) - -/spell/targeted/genetic/blind - name = "Blind" - desc = "This spell inflicts a target with temporary blindness. Does not require wizard garb." - feedback = "BD" - school = "illusion" - duration = 300 - charge_max = 300 - spell_flags = 0 - invocation = "Sty Kaly." - invocation_type = SpI_WHISPER - message = "Your eyes cry out in pain!" - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 1, Sp_POWER = 3) - cooldown_min = 50 - range = 7 - max_targets = 0 - amt_eye_blind = 10 - amt_eye_blurry = 20 - hud_state = "wiz_blind" - cast_sound = 'sound/magic/blind.ogg' - genetic_conditions = list(GENE_COND_BLINDED) - -/spell/targeted/genetic/blind/empower_spell() - if(!..()) - return 0 - duration += 10 SECONDS - return "[src] will now blind for a longer period of time." - -/spell/targeted/genetic/blind/hysteria - name = "Hysteria" - desc = "A spell used to make someone look like a blind fool, and also makes them a blind fool." - feedback = "HY" - school = "illusion" - spell_flags = SELECTABLE - charge_max = 600 - invocation_type = SpI_SHOUT - invocation = "Sty Di Kaly!" - amt_dizziness = 10 - hud_state = "hysteria" - -/spell/targeted/genetic/blind/starburst - name = "Starburst" - desc = "Send a jolt of electricity through everyone's nerve center, blinding and stunning them." - feedback = "SB" - school = "transmutation" - invocation = "Tid Caeh Yor!" - spell_flags = NOFACTION - invocation_type = SpI_SHOUT - charge_max = 60 SECONDS - spell_flags = 0 - amt_dizziness = 0 - amt_eye_blurry = 5 - amt_stunned = 1 - effect_state = "electricity_constant" - effect_duration = 5 - hud_state = "wiz_starburst" diff --git a/code/modules/spells/targeted/glimpse_of_eternity.dm b/code/modules/spells/targeted/glimpse_of_eternity.dm deleted file mode 100644 index a4d783245ab..00000000000 --- a/code/modules/spells/targeted/glimpse_of_eternity.dm +++ /dev/null @@ -1,26 +0,0 @@ -/spell/targeted/glimpse_of_eternity - name = "Glimpse of Eternity" - desc = "Show the non-believers what enlightenment truely means." - feedback = "GE" - school = "illusion" - invocation = "Ghe Tar Yet!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - max_targets = 0 - charge_max = 400 - range = 3 - - hud_state = "wiz_glimpse" - -/spell/targeted/glimpse_of_eternity/cast(var/list/targets, var/mob/user) - for(var/t in targets) - var/mob/living/L = t - if(L.faction != user.faction) //Worse for non-allies - SET_STATUS_MAX(L, STAT_BLIND, 5) - SET_STATUS_MAX(L, STAT_STUN, 5) - new /obj/effect/temporary(get_turf(L), 5, 'icons/effects/effects.dmi', "electricity_constant") - else - SET_STATUS_MAX(L, STAT_BLIND, 2) - L.heal_damage(BRUTE, 10, do_update_health = FALSE) - L.heal_damage(BURN, 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/projectile/dumbfire.dm b/code/modules/spells/targeted/projectile/dumbfire.dm deleted file mode 100644 index 491a5f00f99..00000000000 --- a/code/modules/spells/targeted/projectile/dumbfire.dm +++ /dev/null @@ -1,13 +0,0 @@ -/spell/targeted/projectile/dumbfire - selection_type = "range" - -/spell/targeted/projectile/dumbfire/choose_targets(mob/user = usr) - var/list/targets = list() - - var/starting_dir = user.dir //where are we facing at the time of casting? - var/turf/starting_turf = get_turf(user) - var/current_turf = starting_turf - for(var/i = 1; i <= src.range; i++) - current_turf = get_step(current_turf, starting_dir) - targets += current_turf - return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/fireball.dm b/code/modules/spells/targeted/projectile/fireball.dm deleted file mode 100644 index ef65dc885f7..00000000000 --- a/code/modules/spells/targeted/projectile/fireball.dm +++ /dev/null @@ -1,66 +0,0 @@ -/spell/targeted/projectile/dumbfire/fireball - name = "Fireball" - desc = "A classic spell, grants you the ability to throw an exploding ball of flame in any direction. Does not require wizard garb." - feedback = "FB" - proj_type = /obj/item/projectile/spell_projectile/fireball - - school = "conjuration" - charge_max = 10 SECONDS - spell_flags = 0 - invocation = "Oni-Soma!" - invocation_type = SpI_SHOUT - range = 20 - - level_max = list(Sp_TOTAL = 5, Sp_SPEED = 0, Sp_POWER = 5) - - duration = 20 - proj_step_delay = 1 - - amt_dam_brute = 20 - amt_dam_fire = 25 - - var/ex_severe = -1 - var/ex_heavy = 1 - var/ex_light = 2 - var/ex_flash = 5 - - hud_state = "wiz_fireball" - cast_sound = 'sound/magic/fireball.ogg' - -/spell/targeted/projectile/dumbfire/fireball/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - apply_spell_damage(M) - explosion(get_turf(spell_holder), ex_severe, ex_heavy, ex_light, ex_flash) - -/spell/targeted/projectile/dumbfire/fireball/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER]%2 == 1) - ex_severe++ - ex_heavy++ - ex_light++ - ex_flash++ - - return "The spell [src] now has a larger explosion." - -//PROJECTILE - -/obj/item/projectile/spell_projectile/fireball - name = "fireball" - icon_state = "fireball" - -/spell/targeted/projectile/dumbfire/fireball/firebolt - name = "Firebolt" - desc = "A quick-casted fireball. Burns the user, and their enemies, but is much faster to shoot." - feedback = "FO" - charge_type = Sp_HOLDVAR - invocation = "Ignus!" - holder_var_type = "fireloss" - holder_var_amount = 10 - amt_dam_brute = 10 - amt_dam_fire = 15 - ex_heavy = -1 - ex_light = 1 - ex_flash = 3 - hud_state = "firebolt" \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/magic_missile.dm b/code/modules/spells/targeted/projectile/magic_missile.dm deleted file mode 100644 index 1d72399718a..00000000000 --- a/code/modules/spells/targeted/projectile/magic_missile.dm +++ /dev/null @@ -1,56 +0,0 @@ -/spell/targeted/projectile/magic_missile - name = "Magic Missile" - desc = "This spell fires several, slow moving, magic projectiles at nearby targets." - feedback = "MM" - school = "conjuration" - charge_max = 150 - spell_flags = NEEDSCLOTHES - invocation = "Forti Gy-Ama!" - invocation_type = SpI_SHOUT - range = 7 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 3, Sp_POWER = 3) - cooldown_min = 90 //15 deciseconds reduction per rank - - max_targets = 0 - - proj_type = /obj/item/projectile/spell_projectile/seeking/magic_missile - duration = 10 - proj_step_delay = 5 - - hud_state = "wiz_mm" - cast_sound = 'sound/magic/magic_missile.ogg' - amt_paralysis = 3 - amt_stunned = 3 - - amt_dam_fire = 10 - -/spell/targeted/projectile/magic_missile/prox_cast(var/list/targets, atom/spell_holder) - spell_holder.visible_message("\The [spell_holder] pops with a flash!") - playsound(src, 'sound/magic/mm_hit.ogg', 40) - for(var/mob/living/M in targets) - apply_spell_damage(M) - return - -/spell/targeted/projectile/magic_missile/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER] == level_max[Sp_POWER]) - amt_paralysis += 2 - amt_stunned += 2 - return "[src] will now stun people for a longer duration." - amt_dam_fire += 5 - - return "[src] does more damage now." - - - -//PROJECTILE - -/obj/item/projectile/spell_projectile/seeking/magic_missile - name = "magic missile" - icon_state = "magicm" - - proj_trail = 1 - proj_trail_lifespan = 5 - proj_trail_icon_state = "magicmd" diff --git a/code/modules/spells/targeted/projectile/passage.dm b/code/modules/spells/targeted/projectile/passage.dm deleted file mode 100644 index b99e147bee2..00000000000 --- a/code/modules/spells/targeted/projectile/passage.dm +++ /dev/null @@ -1,46 +0,0 @@ -/spell/targeted/projectile/dumbfire/passage - name = "Passage" - desc = "throw a spell towards an area and teleport to it." - feedback = "PA" - proj_type = /obj/item/projectile/spell_projectile/passage - - - school = "conjuration" - charge_max = 250 - invocation = "A'YASAMA" - invocation_type = SpI_SHOUT - range = 15 - - - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - spell_flags = NEEDSCLOTHES - duration = 15 - - proj_step_delay = 1 - - hud_state = "gen_project" - cast_sound = 'sound/magic/lightning_bolt.ogg' - -/spell/targeted/projectile/dumbfire/passage/prox_cast(var/list/targets, atom/spell_holder) - for(var/mob/living/L in targets) - apply_spell_damage(L) - - var/turf/T = get_turf(spell_holder) - - holder.forceMove(T) - var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread() - S.set_up(3,0,T) - S.start() - playsound(src, 'sound/magic/lightningshock.ogg', 50) - -/spell/targeted/projectile/dumbfire/passage/empower_spell() - if(!..()) - return 0 - - amt_stunned += 3 - - return "[src] now stuns those who get hit by it." - -/obj/item/projectile/spell_projectile/passage - name = "spell" - icon_state = "energy2" \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/projectile.dm b/code/modules/spells/targeted/projectile/projectile.dm deleted file mode 100644 index 6df791094be..00000000000 --- a/code/modules/spells/targeted/projectile/projectile.dm +++ /dev/null @@ -1,45 +0,0 @@ -/* -Projectile spells make special projectiles (obj/item/spell_projectile) and fire them at targets -Dumbfire projectile spells fire directly ahead of the user -spell_projectiles call their spell's (carried) prox_cast when they get in range of a target -If the spell_projectile is seeking, it will update its target every process and follow them -*/ - -/spell/targeted/projectile - range = 7 - var/proj_type = /obj/item/projectile/spell_projectile //use these. They are very nice - var/proj_step_delay = 1 //lower = faster - var/cast_prox_range = 1 - -/spell/targeted/projectile/cast(list/targets, mob/user = usr) - for(var/atom/target in targets) - var/obj/item/projectile/projectile = new proj_type(user.loc, user.dir) - - if(!projectile) - return - - if(istype(projectile, /obj/item/projectile/spell_projectile)) - var/obj/item/projectile/spell_projectile/SP = projectile - SP.carried = src //casting is magical - projectile.original = target - projectile.starting = get_turf(user) - projectile.shot_from = user //fired from the user - projectile.current = projectile.original - projectile.yo = target.y - user.y - projectile.xo = target.x - user.x - projectile.life_span = src.duration - projectile.hitscan = !proj_step_delay - projectile.step_delay = proj_step_delay - projectile.launch(target) - return - -/spell/targeted/projectile/proc/choose_prox_targets(mob/user = usr, var/atom/movable/spell_holder) - var/list/targets = list() - for(var/mob/living/M in range(spell_holder, cast_prox_range)) - if(M == user && !(spell_flags & INCLUDEUSER)) - continue - targets += M - return targets - -/spell/targeted/projectile/proc/prox_cast(var/list/targets, var/atom/movable/spell_holder) - return targets \ No newline at end of file diff --git a/code/modules/spells/targeted/projectile/stuncuff.dm b/code/modules/spells/targeted/projectile/stuncuff.dm deleted file mode 100644 index 52046381588..00000000000 --- a/code/modules/spells/targeted/projectile/stuncuff.dm +++ /dev/null @@ -1,47 +0,0 @@ -/spell/targeted/projectile/dumbfire/stuncuff - name = "Stun Cuff" - desc = "This spell fires out a small curse that stuns and cuffs the target." - feedback = "SC" - proj_type = /obj/item/projectile/spell_projectile/stuncuff - - charge_type = Sp_CHARGES - charge_max = 6 - charge_counter = 6 - spell_flags = 0 - invocation = "Fu'Reai Diakan!" - invocation_type = SpI_SHOUT - range = 20 - - level_max = list(Sp_TOTAL = 0, Sp_SPEED = 0, Sp_POWER = 0) - - duration = 20 - proj_step_delay = 1 - - amt_stunned = 6 - - hud_state = "wiz_cuff" - cast_sound = 'sound/magic/wandodeath.ogg' - -/spell/targeted/projectile/dumbfire/stuncuff/prox_cast(var/list/targets, spell_holder) - for(var/mob/living/M in targets) - if(ishuman(M)) - var/mob/living/human/H = M - var/obj/item/handcuffs/wizard/cuffs = new() - H.equip_to_slot(cuffs, slot_handcuffed_str) - H.visible_message("Beams of light form around \the [H]'s hands!") - apply_spell_damage(M) - - -/obj/item/handcuffs/wizard - name = "beams of light" - desc = "Undescribable and unpenetrable. Or so they say." - - breakouttime = 300 //30 seconds - -/obj/item/handcuffs/wizard/dropped(var/mob/user) - ..() - qdel(src) - -/obj/item/projectile/spell_projectile/stuncuff - name = "stuncuff" - icon_state = "spell" \ No newline at end of file diff --git a/code/modules/spells/targeted/shapeshift.dm b/code/modules/spells/targeted/shapeshift.dm deleted file mode 100644 index ae5de55a0f7..00000000000 --- a/code/modules/spells/targeted/shapeshift.dm +++ /dev/null @@ -1,203 +0,0 @@ -//basic transformation spell. Should work for most simple_animals - -/spell/targeted/shapeshift - name = "Shapeshift" - desc = "This spell transforms the target into something else for a short while." - - school = "transmutation" - - charge_type = Sp_RECHARGE - charge_max = 600 - - duration = 0 //set to 0 for permanent. - - var/list/possible_transformations = list() - var/list/newVars = list() //what the variables of the new created thing will be. - - cast_sound = 'sound/magic/charge.ogg' - var/revert_sound = 'sound/magic/charge.ogg' //the sound that plays when something gets turned back. - var/share_damage = 1 //do we want the damage we take from our new form to move onto our real one? (Only counts for finite duration) - var/drop_items = 1 //do we want to drop all our items when we transform? - var/toggle = 0 //Can we toggle this? - var/list/transformed_dudes = list() //Who we transformed. Transformed = Transformation. Both mobs. - -/spell/targeted/shapeshift/cast(var/list/targets, mob/user) - for(var/m in targets) - var/mob/living/M = m - if(M.stat == DEAD) - to_chat(user, "[name] can only transform living targets.") - continue - if(M.buckled) - M.buckled.unbuckle_mob() - if(toggle && transformed_dudes.len && stop_transformation(M)) - continue - var/new_mob = pick(possible_transformations) - - var/mob/living/trans = new new_mob(get_turf(M)) - for(var/varName in newVars) //stolen shamelessly from Conjure - if(varName in trans.vars) - trans.vars[varName] = newVars[varName] - //Give them our languages - for(var/decl/language/lang as anything in M.languages) - trans.add_language(lang.type) - - trans.SetName("[trans.name] ([M])") - if(ishuman(M) && drop_items) - for(var/obj/item/I in M.contents) - M.drop_from_inventory(I) - if(M.mind) - M.mind.transfer_to(trans) - else - trans.key = M.key - new /obj/effect/temporary(get_turf(M), 5, 'icons/effects/effects.dmi', "summoning") - - 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, 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) - -/spell/targeted/shapeshift/proc/destroyed_transformer(var/mob/target) //Juuuuust in case - var/mob/current = transformed_dudes[target] - to_chat(current, "You suddenly feel as if this transformation has become permanent...") - remove_target(target) - -/spell/targeted/shapeshift/proc/stop_transformation(var/mob/living/target) - var/mob/living/transformer = transformed_dudes[target] - if(!transformer) - return FALSE - transformer.status_flags &= ~GODMODE - if(share_damage) - 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 ceil(damage/10)) - transformer.take_damage(10) - if(target.mind) - target.mind.transfer_to(transformer) - else - transformer.key = target.key - playsound(get_turf(target), revert_sound, 50, 1) - transformer.forceMove(get_turf(target)) - remove_target(target) - qdel(target) - return TRUE - -/spell/targeted/shapeshift/proc/remove_target(var/mob/living/target) - var/mob/current = transformed_dudes[target] - events_repository.unregister(/decl/observ/destroyed, target,src) - events_repository.unregister(/decl/observ/death, current,src) - events_repository.unregister(/decl/observ/destroyed, current,src) - transformed_dudes[target] = null - transformed_dudes -= target - -/spell/targeted/shapeshift/baleful_polymorph - name = "Baleful Polymorth" - desc = "This spell transforms its target into a small, furry animal." - feedback = "BP" - possible_transformations = list( - /mob/living/simple_animal/lizard, - /mob/living/simple_animal/passive/mouse, - /mob/living/simple_animal/passive/mouse/rat, - /mob/living/simple_animal/corgi - ) - - share_damage = 0 - invocation = "Yo'balada!" - invocation_type = SpI_SHOUT - spell_flags = NEEDSCLOTHES | SELECTABLE - range = 3 - duration = 150 //15 seconds. - cooldown_min = 200 //20 seconds - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("health" = 50, "max_health" = 50) - - hud_state = "wiz_poly" - - -/spell/targeted/shapeshift/baleful_polymorph/empower_spell() - if(!..()) - return 0 - - duration += 50 - - return "Your target will now stay in their polymorphed form for [duration/10] seconds." - -/spell/targeted/shapeshift/avian - name = "Polymorph" - desc = "This spell transforms the wizard into the common parrot." - feedback = "AV" - possible_transformations = list(/mob/living/simple_animal/hostile/parrot) - - drop_items = 0 - share_damage = 0 - invocation = "Poli'crakata!" - invocation_type = SpI_SHOUT - spell_flags = INCLUDEUSER - range = -1 - duration = 150 - charge_max = 600 - cooldown_min = 300 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 1, Sp_POWER = 0) - hud_state = "wiz_parrot" - -/spell/targeted/shapeshift/corrupt_form - name = "Corrupt Form" - desc = "This spell shapes the wizard into a terrible, terrible beast." - feedback = "CF" - possible_transformations = list(/mob/living/simple_animal/hostile/revenant) - - invocation = "mutters something dark and twisted as their form begins to twist..." - invocation_type = SpI_EMOTE - spell_flags = INCLUDEUSER - range = -1 - duration = 150 - charge_max = 1200 - cooldown_min = 600 - - drop_items = 0 - share_damage = 0 - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 2, Sp_POWER = 2) - - newVars = list("name" = "corrupted soul") - - hud_state = "wiz_corrupt" - cast_sound = 'sound/magic/disintegrate.ogg' - -/spell/targeted/shapeshift/corrupt_form/empower_spell() - if(!..()) - return 0 - - switch(spell_levels[Sp_POWER]) - if(1) - duration *= 2 - return "You will now stay corrupted for [duration/10] seconds." - if(2) - newVars = list("name" = "\proper corruption incarnate", - "melee_damage_upper" = 25, - "resistance" = 6, - "health" = 125, - "max_health" = 125) - duration = 0 - return "You revel in the corruption. There is no turning back." - -/spell/targeted/shapeshift/familiar - name = "Transform" - desc = "Transform into a familiar form. Literally." - feedback = "FA" - possible_transformations = list() - drop_items = 0 - invocation_type = SpI_EMOTE - invocation = "'s body dissipates into a pale mass of light, then reshapes!" - range = -1 - spell_flags = INCLUDEUSER - duration = 0 - charge_max = 2 MINUTES - toggle = 1 - - hud_state = "wiz_carp" \ No newline at end of file diff --git a/code/modules/spells/targeted/shatter_mind.dm b/code/modules/spells/targeted/shatter_mind.dm deleted file mode 100644 index f84d6765035..00000000000 --- a/code/modules/spells/targeted/shatter_mind.dm +++ /dev/null @@ -1,29 +0,0 @@ -/spell/targeted/shatter - name = "Shatter Mind" - desc = "Assaults the mind of the target with fear of the unknown, shattering their sanity and causing brain damage." - feedback = "SM" - school = "illusion" - charge_max = 300 - spell_flags = 0 - invocation_type = SpI_NONE - range = 5 - max_targets = 1 - compatible_mobs = list(/mob/living/human) - - time_between_channels = 150 - number_of_channels = 0 - - hud_state = "wiz_statue" - -/spell/targeted/shatter/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = targets[1] - if(prob(50)) - sound_to(user, get_sfx("swing_hit")) - if(prob(5)) - to_chat(H, "You feel unhinged.") - H.adjust_hallucination(5,5) - ADJ_STATUS(H, STAT_CONFUSE, 2) - ADJ_STATUS(H, STAT_DIZZY, 2) - if(H.hallucination_power > 50) - H.take_damage(5, BRAIN) - to_chat(H, "You feel your mind tearing apart!") \ No newline at end of file diff --git a/code/modules/spells/targeted/shift.dm b/code/modules/spells/targeted/shift.dm deleted file mode 100644 index 2b53b60d244..00000000000 --- a/code/modules/spells/targeted/shift.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/targeted/ethereal_jaunt/shift - name = "Phase Shift" - desc = "This spell allows you to pass through walls" - - charge_max = 200 - spell_flags = Z2NOCAST | INCLUDEUSER | CONSTRUCT_CHECK - invocation_type = SpI_NONE - range = -1 - duration = 50 //in deciseconds - - hud_state = "const_shift" - -/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) - animation.icon_state = "phase_shift" - animation.set_dir(target.dir) - flick("phase_shift",animation) - -/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target) - animation.icon_state = "phase_shift2" - animation.set_dir(target.dir) - flick("phase_shift2",animation) - -/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) - return \ No newline at end of file diff --git a/code/modules/spells/targeted/subjugate.dm b/code/modules/spells/targeted/subjugate.dm deleted file mode 100644 index 700dac35b36..00000000000 --- a/code/modules/spells/targeted/subjugate.dm +++ /dev/null @@ -1,35 +0,0 @@ -/spell/targeted/subjugation - name = "Subjugation" - desc = "This spell temporarily subjugates a target's mind and does not require wizard garb." - feedback = "SJ" - school = "illusion" - charge_max = 500 - spell_flags = NOFACTION - invocation = "Dii Oda Baji." - invocation_type = SpI_WHISPER - - message = "You suddenly feel completely overwhelmed!" - - max_targets = 1 - - level_max = list(Sp_TOTAL = 3, Sp_SPEED = 0, Sp_POWER = 3) - - amt_dizziness = 100 - amt_confused = 100 - amt_stuttering = 100 - - compatible_mobs = list(/mob/living/human) - - hud_state = "wiz_subj" - -/spell/targeted/subjugation/empower_spell() - if(!..()) - return 0 - - if(spell_levels[Sp_POWER] == level_max[Sp_POWER]) - max_targets = 0 - - return "[src] will now effect everyone in the area." - else - max_targets++ - return "[src] will now effect [max_targets] people." \ No newline at end of file diff --git a/code/modules/spells/targeted/swap.dm b/code/modules/spells/targeted/swap.dm deleted file mode 100644 index 150bd903077..00000000000 --- a/code/modules/spells/targeted/swap.dm +++ /dev/null @@ -1,41 +0,0 @@ -/spell/targeted/swap - name = "swap" - desc = "This spell swaps the positions of the wizard and a target. Causes brain damage." - feedback = "SW" - school = "conjuration" - - charge_type = Sp_HOLDVAR - holder_var_type = "brainloss" - holder_var_amount = 10 - - invocation = "Joyo!" - invocation_type = SpI_WHISPER - - level_max = list(Sp_TOTAL = 2, Sp_SPEED = 0, Sp_POWER = 2) - - spell_flags = Z2NOCAST - range = 6 - max_targets = 1 - compatible_mobs = list(/mob/living) - - hud_state = "wiz_swap" - - cast_sound = 'sound/magic/mandswap.ogg' - -/spell/targeted/swap/cast(var/list/targets, mob/user) - for(var/mob/T in targets) - var/turf/aT = get_turf(T) - var/turf/bT = get_turf(user) - - T.forceMove(bT) - user.forceMove(aT) - - apply_spell_damage(T) - -/spell/targeted/swap/empower_spell() - if(!..()) - return 0 - - amt_eye_blind += 2 - - return "This spell will now blind the target." diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm deleted file mode 100644 index 46e6e242b26..00000000000 --- a/code/modules/spells/targeted/targeted.dm +++ /dev/null @@ -1,175 +0,0 @@ -/* -Targeted spells (with the exception of dumbfire) select from all the mobs in the defined range -Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are explained in setup.dm -*/ - - -/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob - var/max_targets = 1 //leave 0 for unlimited targets in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range - var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast - - - var/amt_weakened = 0 - var/amt_paralysis = 0 - var/amt_stunned = 0 - - var/amt_dizziness = 0 - var/amt_confused = 0 - var/amt_stuttering = 0 - - //set to negatives for healing unless commented otherwise - var/amt_dam_fire = 0 - var/amt_dam_brute = 0 - var/amt_dam_oxy = 0 - var/amt_dam_tox = 0 - var/amt_dam_robo = 0 - var/amt_brain = 0 - var/amt_radiation = 0 - var/amt_blood = 0 //Positive numbers to add blood - var/amt_organ = 0 //Positive numbers for healing - - var/amt_eye_blind = 0 - var/amt_eye_blurry = 0 - - var/effect_state = null //What effect to show on each, if any - var/effect_duration = 0 - var/effect_color = "#ffffff" - - var/list/compatible_mobs = list() - - -/spell/targeted/choose_targets(mob/user = usr) - var/list/targets = list() - - if(max_targets == 0) //unlimited - if(range == -2) - targets = global.living_mob_list_ - else - for(var/mob/living/target in view_or_range(range, holder, selection_type)) - targets += target - - else if(max_targets == 1) //single target can be picked - if((range == 0 || range == -1) && spell_flags & INCLUDEUSER) - targets += user - else - var/list/possible_targets = list() - var/list/starting_targets - if(range == -2) - starting_targets = global.living_mob_list_ - else - starting_targets = view_or_range(range, holder, selection_type) - - for(var/mob/living/M in starting_targets) - if(!(spell_flags & INCLUDEUSER) && M == user) - continue - if((spell_flags & NOFACTION) && user.faction == M.faction) - continue - if((spell_flags & NONONFACTION) && user.faction != M.faction) - continue - if(compatible_mobs && compatible_mobs.len) - if(!is_type_in_list(M, compatible_mobs)) continue - if(compatible_mobs && compatible_mobs.len && !is_type_in_list(M, compatible_mobs)) - continue - possible_targets += M - - if(possible_targets.len) - if(spell_flags & SELECTABLE) //if we are allowed to choose. see setup.dm for details - var/mob/temp_target = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets - if(temp_target) - targets += temp_target - else - targets += pick(possible_targets) - //Adds a safety check post-input to make sure those targets are actually in range. - - - else - var/list/possible_targets = list() - var/list/starting_targets - - if(range == -2) - starting_targets = global.living_mob_list_ - else - starting_targets = view_or_range(range, holder, selection_type) - - for(var/mob/living/target in starting_targets) - if(!(spell_flags & INCLUDEUSER) && target == user) - continue - if(compatible_mobs && !is_type_in_list(target, compatible_mobs)) - continue - possible_targets += target - - if(spell_flags & SELECTABLE) - for(var/i = 1; i<=max_targets, i++) - if(!possible_targets.len) - break - var/mob/M = input(user, "Choose the target for the spell.", "Targeting") as null|mob in possible_targets - if(!M) - break - if(range != -2) - if(!(M in view_or_range(range, holder, selection_type))) - continue - targets += M - possible_targets -= M - else - for(var/i=1,i<=max_targets,i++) - if(!possible_targets.len) - break - if(target_ignore_prev) - var/target = pick(possible_targets) - possible_targets -= target - targets += target - else - targets += pick(possible_targets) - - if(!(spell_flags & INCLUDEUSER) && (user in targets)) - targets -= user - - if(compatible_mobs && compatible_mobs.len) - for(var/mob/living/target in targets) //filters out all the non-compatible mobs - if(!is_type_in_list(target, compatible_mobs)) - targets -= target - - return targets - -/spell/targeted/cast(var/list/targets, mob/user) - for(var/mob/living/target in targets) - if(range >= 0) - if(!(target in view_or_range(range, holder, selection_type))) //filter at time of casting - targets -= target - continue - apply_spell_damage(target) - -/spell/targeted/proc/apply_spell_damage(mob/living/target) - target.take_damage(amt_dam_brute, do_update_health = FALSE) - target.take_damage(amt_dam_fire, BURN, do_update_health = FALSE) - target.take_damage(amt_dam_tox, TOX, do_update_health = FALSE) - target.take_damage(amt_dam_oxy, OXY) - if(ishuman(target)) - var/mob/living/human/H = target - for(var/obj/item/organ/internal/affecting in H.get_internal_organs()) - if(affecting && istype(affecting)) - affecting.heal_damage(amt_organ, amt_organ) - for(var/obj/item/organ/external/affecting in H.get_external_organs()) - if(affecting && istype(affecting)) - var/dam = BP_IS_PROSTHETIC(affecting) ? -amt_dam_robo : amt_organ - affecting.heal_damage(dam, dam, robo_repair = BP_IS_PROSTHETIC(affecting)) - H.adjust_blood(amt_blood) - H.take_damage(amt_brain, BRAIN) - H.radiation += min(H.radiation, amt_radiation) - - target.update_icon() - //disabling - SET_STATUS_MAX(target, STAT_WEAK, amt_weakened) - SET_STATUS_MAX(target, STAT_PARA, amt_paralysis) - SET_STATUS_MAX(target, STAT_STUN, amt_stunned) - if(amt_weakened || amt_paralysis || amt_stunned) - if(target.buckled) - target.buckled = null - ADJ_STATUS(target, STAT_BLIND, amt_eye_blind) - ADJ_STATUS(target, STAT_BLURRY, amt_eye_blurry) - ADJ_STATUS(target, STAT_DIZZY, amt_dizziness) - ADJ_STATUS(target, STAT_CONFUSE, amt_confused) - ADJ_STATUS(target, STAT_STUTTER, amt_stuttering) - if(effect_state) - var/obj/o = new /obj/effect/temporary(get_turf(target), effect_duration, 'icons/effects/effects.dmi', effect_state) - o.color = effect_color \ No newline at end of file diff --git a/code/modules/spells/targeted/torment.dm b/code/modules/spells/targeted/torment.dm deleted file mode 100644 index e98836699f3..00000000000 --- a/code/modules/spells/targeted/torment.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/targeted/torment - name = "Torment" - desc = "Darkness stabs at the bodies of those around you. All within a medium range will suffer significant pain." - feedback = "TM" - school = "illusion" - charge_max = 150 - spell_flags = NOFACTION - invocation = "Rai Di-Kaal!" - invocation_type = SpI_SHOUT - range = 5 - level_max = list(Sp_TOTAL = 1, Sp_SPEED = 0, Sp_POWER = 1) - cooldown_min = 50 - message = "So much pain! All you can hear is screaming!" - - max_targets = 0 - compatible_mobs = list(/mob/living/human) - - var/loss = 30 - - hud_state = "wiz_horse" - cast_sound = 'sound/magic/cowhead_curse.ogg' - -/spell/targeted/torment/cast(var/list/targets, var/mob/user) - user.spawn_gibber() - for(var/mob/living/human/H in targets) - H.take_damage(loss, PAIN) - -/spell/targeted/torment/empower_spell() - if(!..()) - return 0 - - loss += 30 - - return "[src] will now cause more pain." \ No newline at end of file diff --git a/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm b/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm index 8b5d7b48734..d134b6782f8 100644 --- a/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm +++ b/code/modules/sprite_accessories/metadata/accessory_metadata_gradient.dm @@ -19,8 +19,7 @@ var/list/selectable_labels_to_states = list() /decl/sprite_accessory_metadata/gradient/Initialize() - var/list/selectable = icon_states(icon) - for(var/state in selectable) + for(var/state in get_states_in_icon_cached(icon)) if(!selectable_states_to_labels[state]) selectable_states_to_labels[state] = capitalize(state) for(var/state in selectable_states_to_labels) diff --git a/code/modules/submaps/_submap.dm b/code/modules/submaps/_submap.dm index 20404728d37..c2fde5b895d 100644 --- a/code/modules/submaps/_submap.dm +++ b/code/modules/submaps/_submap.dm @@ -26,7 +26,7 @@ archetype = _archetype if(!pref_name) - pref_name = archetype.descriptor + pref_name = archetype.name testing("Starting submap setup - '[name]', [archetype], [associated_z]z.") @@ -41,7 +41,7 @@ jobs[job.title] = job if(!associated_z) - testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint registration.") + testing( "Submap error - [name]/[archetype ? archetype.name : "NO ARCHETYPE"] could not find an associated z-level for spawnpoint registration.") qdel(src) return @@ -59,7 +59,7 @@ registered_spawnpoint = TRUE if(!registered_spawnpoint) - testing( "Submap error - [name]/[archetype ? archetype.descriptor : "NO ARCHETYPE"] has no job spawn points.") + testing( "Submap error - [name]/[archetype ? archetype.name : "NO ARCHETYPE"] has no job spawn points.") qdel(src) return diff --git a/code/modules/submaps/submap_archetype.dm b/code/modules/submaps/submap_archetype.dm index be118fa8202..9597b64f1f6 100644 --- a/code/modules/submaps/submap_archetype.dm +++ b/code/modules/submaps/submap_archetype.dm @@ -1,5 +1,6 @@ /decl/submap_archetype - var/descriptor = "generic ship archetype" + // TODO: use UID instead of name for pref saving. + var/name = "generic ship archetype" var/list/whitelisted_species = list() var/list/blacklisted_species = list() var/call_webhook @@ -13,12 +14,18 @@ /decl/submap_archetype/validate() . = ..() - if(!descriptor) - . += "no descriptor set" + if(name) + var/static/list/submaps_by_name = list( (global.using_map.name) = global.using_map.type) + if(submaps_by_name[name]) + . += "name '[name]' ([type]) collides with submap type '[submaps_by_name[name]]'" + else + submaps_by_name[name] = type + else + . += "no name set" // Generic ships to populate the list. /decl/submap_archetype/derelict - descriptor = "drifting wreck" + name = "drifting wreck" /decl/submap_archetype/abandoned_ship - descriptor = "abandoned ship" + name = "abandoned ship" diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 49e6622328e..89d8b2f3871 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -7,7 +7,8 @@ create_record = FALSE total_positions = 4 outfit_type = /decl/outfit/job/survivor - hud_icon = "hudblank" + hud_icon_state = "hudblank" + hud_icon = null available_by_default = FALSE allowed_ranks = null allowed_branches = null @@ -55,7 +56,12 @@ if(islist(blacklisted_species) && !length(blacklisted_species)) blacklisted_species |= SSmodpacks.default_submap_blacklisted_species - if(!abstract_job) + if(abstract_job) + if(!hud_icon) + hud_icon = global.using_map.hud_icons + if(!hud_icon_state) + hud_icon_state = "hud[ckey(title)]" + else spawnpoints = list() owner = _owner ..() @@ -78,17 +84,17 @@ to_chat(feedback, "Not old enough. Minimum character age is [minimum_character_age[S.get_root_species_name()]].") return TRUE if(LAZYLEN(whitelisted_species) && !(prefs.species in whitelisted_species)) - to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.name].") return TRUE if(prefs.species in blacklisted_species) - to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted as [title] on \a [owner.archetype.name].") return TRUE if(owner && owner.archetype) if(LAZYLEN(owner.archetype.whitelisted_species) && !(prefs.species in owner.archetype.whitelisted_species)) - to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.name].") return TRUE if(prefs.species in owner.archetype.blacklisted_species) - to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.descriptor].") + to_chat(feedback, "Your current species, [prefs.species], is not permitted on \a [owner.archetype.name].") return TRUE return FALSE diff --git a/code/modules/surgery/_surgery.dm b/code/modules/surgery/_surgery.dm index 11b61a35b24..fe4eb699d91 100644 --- a/code/modules/surgery/_surgery.dm +++ b/code/modules/surgery/_surgery.dm @@ -236,7 +236,7 @@ var/global/list/surgery_tool_exception_cache = list() /obj/item/proc/do_surgery(mob/living/M, mob/living/user, fuckup_prob) // Check for the Hippocratic oath. - if(!istype(M) || !istype(user) || user.a_intent == I_HURT) + if(!istype(M) || !istype(user) || user.check_intent(I_FLAG_HARM)) return FALSE // Check for multi-surgery drifting. @@ -292,7 +292,7 @@ var/global/list/surgery_tool_exception_cache = list() return TRUE // If we're on an optable, we are protected from some surgery fails. Bypass this for some items (like health analyzers). - if((locate(/obj/machinery/optable) in get_turf(M)) && user.a_intent == I_HELP) + if((locate(/obj/machinery/optable) in get_turf(M)) && user.check_intent(I_FLAG_HELP)) // Keep track of which tools we know aren't appropriate for surgery on help intent. if(global.surgery_tool_exception_cache[type]) return FALSE @@ -304,7 +304,7 @@ var/global/list/surgery_tool_exception_cache = list() return TRUE // Otherwise we can make a start on surgery! - else if(istype(M) && !QDELETED(M) && user.a_intent != I_HURT && user.get_active_held_item() == src) + else if(istype(M) && !QDELETED(M) && !user.check_intent(I_FLAG_HARM) && user.get_active_held_item() == src) // Double-check this in case it changed between initial check and now. if(zone in global.surgeries_in_progress[operation_ref]) to_chat(user, SPAN_WARNING("You can't operate on this area while surgery is already in progress.")) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 78f9c9cbfea..f9d54f3b125 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -245,7 +245,7 @@ return ..() /decl/surgery_step/generic/amputate/proc/is_clean(var/mob/user, var/obj/item/tool, var/mob/target) - . = (user.a_intent != I_HELP) ? FALSE : (can_operate(target) >= OPERATE_OKAY && istype(tool, /obj/item/circular_saw)) + . = (!user.check_intent(I_FLAG_HELP)) ? FALSE : (can_operate(target) >= OPERATE_OKAY && istype(tool, /obj/item/circular_saw)) /decl/surgery_step/generic/amputate/get_speed_modifier(var/mob/user, var/mob/target, var/obj/item/tool, var/tool_archetype) . = ..() diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 1b8ef1751a0..be2f0f6b69d 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -21,6 +21,12 @@ affected.take_external_damage(20, 0, (DAM_SHARP|DAM_EDGE), used_weapon = tool) ..() +/decl/surgery_step/cavity/get_skill_reqs(mob/living/user, mob/living/target, obj/item/tool, target_zone) + var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) + if(!affected || !BP_IS_PROSTHETIC(affected) || BP_IS_CRYSTAL(affected)) + return ..() + return SURGERY_SKILLS_ROBOTIC + ////////////////////////////////////////////////////////////////// // create implant space surgery step ////////////////////////////////////////////////////////////////// @@ -38,16 +44,16 @@ /decl/surgery_step/cavity/make_space/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 making some space inside [target]'s [affected.cavity_name] cavity with \the [tool].", \ - "You start making some space inside [target]'s [affected.cavity_name] cavity with \the [tool]." ) + user.visible_message("[user] starts making some space inside [target]'s [affected.cavity_name] with \the [tool].", \ + "You start making some space inside [target]'s [affected.cavity_name] with \the [tool]." ) target.custom_pain("The pain in your chest is living hell!",1,affecting = affected) affected.cavity = TRUE ..() /decl/surgery_step/cavity/make_space/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) - 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]." ) + user.visible_message("[user] makes some space inside [target]'s \the [affected.cavity_name] with \the [tool].", \ + "You make some space inside [target]'s \the [affected.cavity_name] with \the [tool]." ) ..() ////////////////////////////////////////////////////////////////// @@ -70,15 +76,15 @@ /decl/surgery_step/cavity/close_space/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 mending [target]'s [affected.cavity_name] cavity wall with \the [tool].", \ - "You start mending [target]'s [affected.cavity_name] cavity wall with \the [tool]." ) + user.visible_message("[user] starts mending [target]'s \the [affected.cavity_name] wall with \the [tool].", \ + "You start mending [target]'s \the [affected.cavity_name] wall with \the [tool]." ) target.custom_pain("The pain in your chest is living hell!",1,affecting = affected) ..() /decl/surgery_step/cavity/close_space/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) - 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]." ) + user.visible_message("[user] mends [target]'s \the [affected.cavity_name] walls with \the [tool].", \ + "You mend [target]'s \the [affected.cavity_name] walls with \the [tool]." ) affected.cavity = FALSE ..() @@ -109,7 +115,7 @@ if(affected && affected.cavity) var/max_volume = BASE_STORAGE_CAPACITY(affected.cavity_max_w_class) + affected.internal_organs_size if(tool.w_class > affected.cavity_max_w_class) - to_chat(user, SPAN_WARNING("\The [tool] is too big for [affected.cavity_name] cavity.")) + to_chat(user, SPAN_WARNING("\The [tool] is too big for \the [affected.cavity_name].")) return FALSE var/total_volume = tool.get_storage_cost() for(var/obj/item/I in affected.implants) @@ -119,14 +125,14 @@ for(var/obj/item/organ/internal/org in affected.internal_organs) max_volume -= org.get_storage_cost() if(total_volume > max_volume) - to_chat(user, SPAN_WARNING("There isn't enough space left in [affected.cavity_name] cavity for [tool].")) + to_chat(user, SPAN_WARNING("There isn't enough space left in \the [affected.cavity_name] for [tool].")) return FALSE return TRUE /decl/surgery_step/cavity/place_item/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 putting \the [tool] inside [target]'s [affected.cavity_name] cavity.", \ - "You start putting \the [tool] inside [target]'s [affected.cavity_name] cavity." ) + user.visible_message("[user] starts putting \the [tool] inside [target]'s \the [affected.cavity_name].", \ + "You start putting \the [tool] inside [target]'s \the [affected.cavity_name]." ) target.custom_pain("The pain in your chest is living hell!",1,affecting = affected) ..() @@ -134,8 +140,8 @@ var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) if(!user.try_unequip(tool, affected)) return - user.visible_message("[user] puts \the [tool] inside [target]'s [affected.cavity_name] cavity.", \ - "You put \the [tool] inside [target]'s [affected.cavity_name] cavity." ) + user.visible_message("[user] puts \the [tool] inside [target]'s \the [affected.cavity_name].", \ + "You put \the [tool] inside [target]'s \the [affected.cavity_name]." ) if (tool.w_class > affected.cavity_max_w_class/2 && prob(50) && !BP_IS_PROSTHETIC(affected) && affected.sever_artery()) to_chat(user, "You tear some blood vessels trying to fit such a big object in this cavity.") affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1,affecting = affected) diff --git a/code/modules/surgery/necrotic.dm b/code/modules/surgery/necrotic.dm index 14b39b1f739..6f41080ae0d 100644 --- a/code/modules/surgery/necrotic.dm +++ b/code/modules/surgery/necrotic.dm @@ -133,15 +133,15 @@ var/list/dead_organs if(E.status & ORGAN_DEAD) var/image/radial_button = image(icon = E.icon, icon_state = E.icon_state) - radial_button.name = "Regenerate \the [E.name]" + radial_button.name = "Regenerate \the [E]" LAZYSET(dead_organs, E.organ_tag, radial_button) for(var/obj/item/organ/I in target.get_internal_organs()) if(I && (I.status & ORGAN_DEAD) && I.parent_organ == target_zone) if(!I.can_recover()) - to_chat(user, SPAN_WARNING("\The [I.name] is beyond saving.")) + to_chat(user, SPAN_WARNING("\The [I] is beyond saving.")) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Regenerate \the [I.name]" + radial_button.name = "Regenerate \the [I]" LAZYSET(dead_organs, I.organ_tag, radial_button) if(!LAZYLEN(dead_organs)) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index f6b9bffb28e..76b37e9eb8d 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -104,7 +104,7 @@ for(var/obj/item/organ/I in target.get_internal_organs()) if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Detach \the [I.name]" + radial_button.name = "Detach \the [I]" LAZYSET(attached_organs, I.organ_tag, radial_button) if(!LAZYLEN(attached_organs)) to_chat(user, SPAN_WARNING("You can't find any organs to separate.")) @@ -158,7 +158,7 @@ for(var/obj/item/organ/internal/I in affected.implants) if(I.status & ORGAN_CUT_AWAY) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Remove \the [I.name]" + radial_button.name = "Remove \the [I]" LAZYSET(removable_organs, I, radial_button) if(!LAZYLEN(removable_organs)) to_chat(user, SPAN_WARNING("You can't find any removable organs.")) @@ -262,7 +262,7 @@ return FALSE if(O.w_class > affected.cavity_max_w_class) - to_chat(user, SPAN_WARNING("\The [O.name] [pronouns.is] too big for [affected.cavity_name] cavity!")) + to_chat(user, SPAN_WARNING("\The [O.name] [pronouns.is] too big for \the [affected.cavity_name]!")) return FALSE var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(target, O.organ_tag) @@ -336,7 +336,7 @@ 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]" + radial_button.name = "Attach \the [I]" LAZYSET(attachable_organs, I, radial_button) if(!LAZYLEN(attachable_organs)) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 06fe754e5de..ca8806692a1 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -181,7 +181,7 @@ /decl/surgery_step/sterilize/Initialize() . = ..() - for(var/decl/material/liquid/ethanol/booze in decls_repository.get_decls_of_type_unassociated(/decl/material/liquid/ethanol)) + for(var/decl/material/liquid/alcohol/booze in decls_repository.get_decls_of_subtype_unassociated(/decl/material/liquid/alcohol)) if(booze.strength <= 40) sterilizing_reagents |= booze.type diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 44020605dee..8695ab98499 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -416,7 +416,7 @@ for(var/obj/item/organ/I in target.get_internal_organs()) if(I && !(I.status & ORGAN_CUT_AWAY) && !BP_IS_CRYSTAL(I) && I.parent_organ == target_zone) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Detach \the [I.name]" + radial_button.name = "Detach \the [I]" LAZYSET(attached_organs, I.organ_tag, radial_button) if(!LAZYLEN(attached_organs)) to_chat(user, SPAN_WARNING("There are no appropriate internal components to decouple.")) @@ -461,7 +461,7 @@ for(var/obj/item/organ/I in affected.implants) if ((I.status & ORGAN_CUT_AWAY) && BP_IS_PROSTHETIC(I) && !BP_IS_CRYSTAL(I) && (I.parent_organ == target_zone)) var/image/radial_button = image(icon = I.icon, icon_state = I.icon_state) - radial_button.name = "Reattach \the [I.name]" + radial_button.name = "Reattach \the [I]" LAZYSET(removable_organs, I.organ_tag, radial_button) var/organ_to_replace = show_radial_menu(user, tool, removable_organs, radius = 42, require_near = TRUE, use_labels = RADIAL_LABELS_OFFSET, check_locs = list(tool)) if(!organ_to_replace) diff --git a/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm b/code/modules/synthesized_instruments/real_instruments/Guitar/guitar.dm index e8332774a9e..b39bfc00a24 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/organic/wood + material = /decl/material/solid/organic/wood/oak 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/organic/wood + material = /decl/material/solid/organic/wood/oak 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/Violin/violin.dm b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm index d73ee46400a..5eb4e3e773e 100644 --- a/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm +++ b/code/modules/synthesized_instruments/real_instruments/Violin/violin.dm @@ -8,8 +8,5 @@ icon_state = "violin" sound_player = /datum/sound_player/violin path = /datum/instrument/obsolete/violin - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_TRACE) - -/obj/structure/synthesized_instrument/synthesizer/shouldStopPlaying(mob/user) - return !(src && in_range(src, user)) \ No newline at end of file diff --git a/code/modules/tools/archetypes/tool_archetype_definitions.dm b/code/modules/tools/archetypes/tool_archetype_definitions.dm index 25df48e3afd..2b2b2f14f4d 100644 --- a/code/modules/tools/archetypes/tool_archetype_definitions.dm +++ b/code/modules/tools/archetypes/tool_archetype_definitions.dm @@ -70,16 +70,16 @@ /decl/tool_archetype/knife/get_default_quality(obj/item/tool) if(tool) - if(tool.sharp && tool.edge) + if(tool.is_sharp() && tool.has_edge()) return TOOL_QUALITY_DEFAULT - else if(tool.sharp || tool.edge) + else if(tool.is_sharp() || tool.has_edge()) return TOOL_QUALITY_MEDIOCRE return ..() /decl/tool_archetype/knife/get_default_speed(obj/item/tool) if(tool) - if(tool.sharp && tool.edge) + if(tool.is_sharp() && tool.has_edge()) return TOOL_SPEED_DEFAULT - else if(tool.sharp || tool.edge) + else if(tool.is_sharp() || tool.has_edge()) return TOOL_SPEED_MEDIOCRE return ..() diff --git a/code/modules/tools/components/handle.dm b/code/modules/tools/components/handle.dm index 18d4053a985..507b7a72958 100644 --- a/code/modules/tools/components/handle.dm +++ b/code/modules/tools/components/handle.dm @@ -1,7 +1,7 @@ /obj/item/tool_component/handle name = "tool handle" icon = 'icons/obj/items/tool/components/tool_handle.dmi' - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak abstract_type = /obj/item/tool_component/handle /obj/item/tool_component/handle/short diff --git a/code/modules/tools/components/head.dm b/code/modules/tools/components/head.dm index 5d7aa85f512..e8e408c7c76 100644 --- a/code/modules/tools/components/head.dm +++ b/code/modules/tools/components/head.dm @@ -40,6 +40,11 @@ var/global/list/_tool_properties_cache = list() desc = "The head of a hoe." icon_state = "hoe" +/obj/item/tool_component/head/chisel + name = "chisel head" + desc = "The head of a chisel." + icon_state = "hoe" + /obj/item/tool_component/head/handaxe name = "hand axe head" desc = "The head of a hand axe." @@ -58,3 +63,8 @@ var/global/list/_tool_properties_cache = list() icon_state = "sledgehammer" w_class = ITEM_SIZE_NORMAL +/obj/item/tool_component/head/forging_hammer + name = "forging hammer head" + desc = "The head of a forging hammer." + icon_state = "forging" + w_class = ITEM_SIZE_NORMAL diff --git a/code/modules/tools/subtypes/axes.dm b/code/modules/tools/subtypes/axes.dm index 93eae37611f..d671ffa0747 100644 --- a/code/modules/tools/subtypes/axes.dm +++ b/code/modules/tools/subtypes/axes.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/items/tool/axes/handaxe.dmi' sharp = TRUE edge = TRUE - handle_material = /decl/material/solid/organic/wood + handle_material = /decl/material/solid/organic/wood/oak item_flags = ITEM_FLAG_IS_WEAPON origin_tech = @'{"materials":2,"combat":1}' attack_verb = list("chopped", "torn", "cut") @@ -19,8 +19,15 @@ return tool_qualities /obj/item/tool/axe/ebony + material = /decl/material/solid/metal/iron handle_material = /decl/material/solid/organic/wood/ebony +/obj/item/tool/axe/iron + material = /decl/material/solid/metal/iron + +/obj/item/tool/axe/ebony/bronze + material = /decl/material/solid/metal/bronze + // Legacy SS13 hatchet. /obj/item/tool/axe/hatchet name = "hatchet" diff --git a/code/modules/tools/subtypes/hammers.dm b/code/modules/tools/subtypes/hammers.dm index 20304b690e5..ff5d1ef1989 100644 --- a/code/modules/tools/subtypes/hammers.dm +++ b/code/modules/tools/subtypes/hammers.dm @@ -2,8 +2,6 @@ name = "hammer" desc = "A simple hammer. Ancient technology once thought lost." icon = 'icons/obj/items/tool/hammers/hammer.dmi' - sharp = 0 - edge = 0 attack_verb = list( "bludgeons", "slaps", @@ -29,7 +27,10 @@ return tool_properties /obj/item/tool/hammer/get_initial_tool_qualities() - var/static/list/tool_qualities = list(TOOL_HAMMER = TOOL_QUALITY_DEFAULT) + var/static/list/tool_qualities = list( + TOOL_HAMMER = TOOL_QUALITY_DEFAULT, + TOOL_CROWBAR = TOOL_QUALITY_WORST + ) return tool_qualities /obj/item/tool/hammer/sledge @@ -76,3 +77,18 @@ TOOL_SHOVEL = TOOL_QUALITY_DECENT ) return tool_qualities + +/obj/item/tool/hammer/forge + name = "forging hammer" + desc = "A heavy hammer, used to forge hot metal at an anvil." + icon = 'icons/obj/items/tool/hammers/forge.dmi' + w_class = ITEM_SIZE_NORMAL + +// Forging hammers are not great at general hammer tasks (too heavy I guess), +// and also don't work as crowbars due to missing the nail ripper/flange, +// but will be more effective at forging when blacksmithy is merged. +/obj/item/tool/hammer/forge/get_initial_tool_qualities() + var/static/list/tool_qualities = list( + TOOL_HAMMER = TOOL_QUALITY_MEDIOCRE + ) + return tool_qualities diff --git a/code/modules/tools/subtypes/hoes.dm b/code/modules/tools/subtypes/hoes.dm index 499e25975ac..8e73bac49bc 100644 --- a/code/modules/tools/subtypes/hoes.dm +++ b/code/modules/tools/subtypes/hoes.dm @@ -11,8 +11,8 @@ w_class = ITEM_SIZE_LARGE /obj/item/tool/hoe/wood - color = /decl/material/solid/organic/wood::color - material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood/oak::color + material = /decl/material/solid/organic/wood/oak /obj/item/tool/hoe/wood/walnut color = /decl/material/solid/organic/wood/walnut::color diff --git a/code/modules/tools/subtypes/pickaxes.dm b/code/modules/tools/subtypes/pickaxes.dm index 0b2bdf0d586..083c99661f8 100644 --- a/code/modules/tools/subtypes/pickaxes.dm +++ b/code/modules/tools/subtypes/pickaxes.dm @@ -6,7 +6,7 @@ sharp = TRUE edge = TRUE w_class = ITEM_SIZE_HUGE - handle_material = /decl/material/solid/organic/wood + handle_material = /decl/material/solid/organic/wood/oak _base_attack_force = 15 /obj/item/tool/pickaxe/Initialize(ml, material_key, _handle_material, _binding_material, override_tool_qualities, override_tool_properties) @@ -31,7 +31,7 @@ // Using these mainly for debugging. /obj/item/tool/pickaxe/wood - material = /decl/material/solid/organic/wood + material = /decl/material/solid/organic/wood/oak /obj/item/tool/pickaxe/stone material = /decl/material/solid/stone/flint @@ -75,3 +75,7 @@ /obj/item/tool/pickaxe/iron material = /decl/material/solid/metal/iron handle_material = /decl/material/solid/organic/wood/ebony + +/obj/item/tool/pickaxe/bronze + material = /decl/material/solid/metal/bronze + handle_material = /decl/material/solid/organic/wood/ebony diff --git a/code/modules/tools/subtypes/shovel.dm b/code/modules/tools/subtypes/shovel.dm index da05b5532f8..204bb0a9fbb 100644 --- a/code/modules/tools/subtypes/shovel.dm +++ b/code/modules/tools/subtypes/shovel.dm @@ -8,7 +8,7 @@ edge = TRUE sharp = TRUE attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") - handle_material = /decl/material/solid/organic/wood + handle_material = /decl/material/solid/organic/wood/oak _base_attack_force = 8 /obj/item/tool/shovel/get_initial_tool_qualities() @@ -19,8 +19,8 @@ return tool_qualities /obj/item/tool/shovel/wood - color = /decl/material/solid/organic/wood::color - material = /decl/material/solid/organic/wood + color = /decl/material/solid/organic/wood/oak::color + material = /decl/material/solid/organic/wood/oak /obj/item/tool/shovel/wood/walnut color = /decl/material/solid/organic/wood/walnut::color diff --git a/code/modules/tools/subtypes/xenoarchaeology_picks.dm b/code/modules/tools/subtypes/xenoarchaeology_picks.dm index 01e22a01623..2a335b9fa4c 100644 --- a/code/modules/tools/subtypes/xenoarchaeology_picks.dm +++ b/code/modules/tools/subtypes/xenoarchaeology_picks.dm @@ -7,7 +7,7 @@ material = /decl/material/solid/metal/chromium matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY) w_class = ITEM_SIZE_SMALL - sharp = 1 + sharp = TRUE abstract_type = /obj/item/tool/xeno material_alteration = 0 handle_material = /decl/material/solid/organic/plastic @@ -36,18 +36,18 @@ to_chat(user, "This tool has a [get_tool_property(TOOL_PICK, TOOL_PROP_EXCAVATION_DEPTH) || 0] centimetre excavation depth.") /obj/item/tool/xeno/brush - name = "wire brush" - icon_state = "pick_brush" - slot_flags = SLOT_EARS - _base_attack_force = 1 - attack_verb = list("prodded", "attacked") - desc = "A wood-handled brush with thick metallic wires for clearing away dust and loose scree." - sharp = 0 - material = /decl/material/solid/metal/steel - handle_material = /decl/material/solid/organic/wood - excavation_amount = 1 - excavation_sound = "sweeping" - excavation_verb = "brushing" + name = "wire brush" + icon_state = "pick_brush" + slot_flags = SLOT_EARS + _base_attack_force = 1 + attack_verb = list("prodded", "attacked") + desc = "A wood-handled brush with thick metallic wires for clearing away dust and loose scree." + sharp = FALSE + material = /decl/material/solid/metal/steel + handle_material = /decl/material/solid/organic/wood/oak + excavation_amount = 1 + excavation_sound = "sweeping" + excavation_verb = "brushing" /obj/item/tool/xeno/one_pick name = "2cm pick" diff --git a/code/modules/tools/tool.dm b/code/modules/tools/tool.dm index 889d2ab199d..953a751ebbb 100644 --- a/code/modules/tools/tool.dm +++ b/code/modules/tools/tool.dm @@ -6,7 +6,6 @@ w_class = ITEM_SIZE_NORMAL origin_tech = @'{"materials":1,"engineering":1}' attack_verb = list("hit", "pierced", "sliced", "attacked") - sharp = 0 abstract_type = /obj/item/tool material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC _base_attack_force = 10 diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm index 8d34b659309..03c3be6b0e4 100644 --- a/code/modules/turbolift/turbolift_console.dm +++ b/code/modules/turbolift/turbolift_console.dm @@ -11,7 +11,7 @@ /obj/structure/lift/proc/pressed(var/mob/user) if(!issilicon(user)) - if(user.a_intent == I_HURT) + if(user.check_intent(I_FLAG_HARM)) user.visible_message("\The [user] hammers on the lift button!") else user.visible_message("\The [user] presses the lift button.") diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 08318914e2e..a5aa85daf86 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -63,7 +63,7 @@ usr.visible_message("\The [usr] puts up \the [src]'s kickstand.") else if(isspaceturf(src.loc)) - to_chat(usr, " You don't think kickstands work in space...") + to_chat(usr, "You don't think kickstands work in space...") return usr.visible_message("\The [usr] puts down \the [src]'s kickstand.") diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 342d8dbba7e..62606d2626b 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -193,7 +193,7 @@ if(distance > 1) return - if(!ishuman(usr)) + if(!ishuman(user)) return to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") diff --git a/code/modules/vehicles/engine.dm b/code/modules/vehicles/engine.dm index 6f5737bccfc..8032dfccc70 100644 --- a/code/modules/vehicles/engine.dm +++ b/code/modules/vehicles/engine.dm @@ -48,7 +48,7 @@ cell.dropInto(loc) cell = null return TRUE - if(user.a_intent != I_HURT) + if(!user.check_intent(I_FLAG_HARM)) to_chat(user, SPAN_WARNING("There is no cell in \the [src] to remove with \the [I]!")) return TRUE return ..() @@ -110,8 +110,8 @@ for(var/rtype in temp_reagents_holder.reagents.reagent_volumes) var/new_multiplier = 1 var/decl/material/R = GET_DECL(rtype) - if(istype(R,/decl/material/liquid/ethanol)) - var/decl/material/liquid/ethanol/E = R + if(istype(R, /decl/material/liquid/alcohol)) + var/decl/material/liquid/alcohol/E = R new_multiplier = (10/E.strength) actually_flameable = 1 else if(istype(R,/decl/material/liquid/fuel/hydrazine)) @@ -140,5 +140,5 @@ /obj/item/engine/thermal/rev_engine(var/atom/movable/M) M.audible_message("\The [M] rumbles to life.") -/obj/item/engine/electric/putter(var/atom/movable/M) +/obj/item/engine/thermal/putter(var/atom/movable/M) M.audible_message("\The [M] putters before turning off.") \ No newline at end of file diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 01d1a248b88..1098bd2bf01 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -106,7 +106,7 @@ return ..() // handles bash() /obj/vehicle/bash(obj/item/weapon, mob/user) - if(isliving(user) && user.a_intent == I_HELP) + if(isliving(user) && user.check_intent(I_FLAG_HELP)) return FALSE if(!weapon.user_can_attack_with(user)) return FALSE @@ -115,10 +115,10 @@ // physical damage types that can impart force; swinging a bat or energy sword switch(weapon.atom_damage_type) if(BURN) - current_health -= weapon.get_attack_force(user) * fire_dam_coeff + current_health -= weapon.expend_attack_force(user) * fire_dam_coeff . = TRUE if(BRUTE) - current_health -= weapon.get_attack_force(user) * brute_dam_coeff + current_health -= weapon.expend_attack_force(user) * brute_dam_coeff . = TRUE else . = FALSE @@ -144,23 +144,17 @@ healthcheck() /obj/vehicle/emp_act(severity) - var/was_on = on + addtimer(CALLBACK(src, PROC_REF(end_emp), on), severity * 30 SECONDS) stat |= EMPED - var/obj/effect/overlay/pulse2 = new /obj/effect/overlay(loc) - pulse2.icon = 'icons/effects/effects.dmi' - pulse2.icon_state = "empdisable" - pulse2.SetName("emp sparks") - pulse2.anchored = TRUE - pulse2.set_dir(pick(global.cardinal)) - - spawn(10) - qdel(pulse2) + var/obj/effect/temp_visual/emp_burst/burst = new /obj/effect/temp_visual/emp_burst(loc) + burst.set_dir(pick(global.cardinal)) if(on) turn_off() - spawn(severity*300) - stat &= ~EMPED - if(was_on) - turn_on() + +/obj/vehicle/proc/end_emp(was_on) + stat &= ~EMPED + if(was_on) + turn_on() /obj/vehicle/attack_ai(mob/living/silicon/ai/user) return @@ -240,23 +234,23 @@ turn_on() return -/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/human/H) +/obj/vehicle/proc/insert_cell(var/obj/item/cell/C, var/mob/living/user) if(cell) return if(!istype(C)) return - if(!H.try_unequip(C, src)) + if(!user.try_unequip(C, src)) return cell = C powercheck() - to_chat(usr, "You install [C] in [src].") + to_chat(user, "You install [C] in [src].") -/obj/vehicle/proc/remove_cell(var/mob/living/human/H) +/obj/vehicle/proc/remove_cell(var/mob/living/user) if(!cell) return - to_chat(usr, "You remove [cell] from [src].") - H.put_in_hands(cell) + to_chat(user, "You remove [cell] from [src].") + user.put_in_hands(cell) cell = null powercheck() diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index dd78d0d269b..9c1a6493a53 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -43,6 +43,13 @@ var/obj/abstract/lightning_overlay/lightning_overlay // A visible atom used for animated lighting effects. var/tmp/list/vis_contents_additions // Holder for a list used to add required atoms to turf vis_contents. + /// A list of particle sources to randomize particle-based effects per-turf. + var/list/obj/abstract/weather_particles/particle_sources = newlist( + /obj/abstract/weather_particles, + /obj/abstract/weather_particles, + /obj/abstract/weather_particles, + /obj/abstract/weather_particles + ) // Main heartbeat proc, called by SSweather. /obj/abstract/weather_system/proc/tick() @@ -106,3 +113,35 @@ invisibility = INVISIBILITY_NONE is_spawnable_type = FALSE appearance_flags = RESET_COLOR | KEEP_APART + +// Dummy object for weather particles. +/obj/abstract/weather_particles + // plane = EMISSIVE_PLANE + // layer = ABOVE_LIGHTING_LAYER + icon = null + invisibility = INVISIBILITY_NONE + is_spawnable_type = FALSE + appearance_flags = RESET_COLOR | KEEP_APART + layer = ABOVE_HUMAN_LAYER + +/obj/abstract/weather_particles/proc/update_particle_system(obj/abstract/weather_system/holder) + if(!istype(particles, /particles/weather)) + return + var/particles/weather/weather_particles = particles + weather_particles.color = holder.color // sync color + alpha = holder.alpha // sync alpha + // reset rotation and velocity + weather_particles.rotation = 0 + weather_particles.velocity = generator("vector", weather_particles.base_velocity[1], weather_particles.base_velocity[2], NORMAL_RAND) + if(holder.wind_direction != 0 && holder.wind_strength != 0) // direction is set + // rain always falls down, but if the wind is east or west + // then it also gets a little bit of side momentum + // based on the horizontal component of the direction + var/wind_angle = 90 - dir2angle(holder.wind_direction) // byond's coordinate axis is fucky + var/x_wind_vel = cos(wind_angle) * holder.wind_strength + var/z_wind_vel = sin(wind_angle) * holder.wind_strength // experimental! + // tilt to an angle that makes sense for our min/max velocity + // 0 is south, but if our velocity is pure south we get -90, so add 90 + // and then invert it, because byond uses counter-clockwise and we want clockwise + weather_particles.rotation = generator("num", 90 - arctan(x_wind_vel * 0.50, weather_particles.base_velocity[1][2]), 90 - arctan(x_wind_vel, weather_particles.base_velocity[2][2]), NORMAL_RAND) + weather_particles.velocity += generator("vector", list(0, 0, 0), list(x_wind_vel, 0, z_wind_vel), NORMAL_RAND) \ No newline at end of file diff --git a/code/modules/weather/weather_fsm_states.dm b/code/modules/weather/weather_fsm_states.dm index 6c80309d357..08c45c46c3e 100644 --- a/code/modules/weather/weather_fsm_states.dm +++ b/code/modules/weather/weather_fsm_states.dm @@ -12,8 +12,9 @@ var/icon = 'icons/effects/weather.dmi' var/icon_state + var/particles/weather/particle_system - var/alpha = 210 + var/alpha = 170 var/minimum_time = 2 MINUTES var/maximum_time = 10 MINUTES var/is_liquid = FALSE @@ -22,6 +23,30 @@ var/list/ambient_sounds var/list/ambient_indoors_sounds +/particles/weather + width = 32 + height = 32 + bound1 = list(-16, -16, -20) + bound2 = list(20, 20, 20) + count = 100 + spawning = 2 + lifespan = 2 SECONDS // they'll hopefully hit the bounds long before this runs out + // basic 3d projection matrix + // 16px in the z axis = 1 in the y axis, because perspective memes i guess? + transform = list( + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 1/16, 0, 0, + 0, 0, 0, 1, + ) + fadein = 1 + position = generator("box", list(-16, 16, -16), list(20, 20, 20)) // start at the top in the Y axis + /// How much does (east/west) wind affect the horizontal component of the particles? + var/wind_intensity = 2 + /// What is the non-wind-affected velocity component of the particles? + /// A list of two lists (minimum and maximum velocities) passed to a generator. + var/list/base_velocity = list(list(0, -6, 0), list(0, -10, 0)) + /decl/state/weather/entered_state(datum/holder) . = ..() @@ -41,6 +66,15 @@ else weather.color = COLOR_WHITE + if(ispath(particle_system)) + for(var/obj/abstract/weather_particles/particle_source in weather.particle_sources) + particle_source.particles = new particle_system // separate datums so that you could make some turfs have special effects in the future + weather.update_particle_system() // sync wind, etc. + else + for(var/obj/abstract/weather_particles/particle_source in weather.particle_sources) + if(particle_source.particles) + QDEL_NULL(particle_source.particles) + /decl/state/weather/proc/tick(var/obj/abstract/weather_system/weather) return @@ -129,7 +163,7 @@ /decl/state_transition/weather/snow_heavy ) -/decl/state/weather/snow/heavy/adjust_temperature(initial_temperature) +/decl/state/weather/snow/medium/adjust_temperature(initial_temperature) return min(initial_temperature - 25, T0C) /decl/state/weather/snow/heavy @@ -148,7 +182,8 @@ /decl/state/weather/rain name = "Light Rain" - icon_state = "rain" + icon_state = null//"rain" + particle_system = /particles/weather/rain descriptor = "It is raining gently." cosmetic_span_class = "notice" is_liquid = TRUE @@ -162,13 +197,19 @@ protected_messages = list("Raindrops patter against $ITEM$.") var/list/roof_messages = list("Rain patters against the roof.") +/particles/weather/rain + icon = 'icons/effects/weather.dmi' + icon_state = "rain_particle" // animated particles don't seem to work... + wind_intensity = 1 + /decl/state/weather/rain/handle_roofed_effects(var/mob/living/M, var/obj/abstract/weather_system/weather) if(length(roof_messages) && prob(cosmetic_message_chance)) to_chat(M, "[pick(roof_messages)]") /decl/state/weather/rain/storm name = "Heavy Rain" - icon_state = "storm" + icon_state = null // "storm" + particle_system = /particles/weather/rain/storm descriptor = "It is raining heavily." cosmetic_span_class = "warning" transitions = list( @@ -180,6 +221,11 @@ roof_messages = list("Torrential rain thunders against the roof.") ambient_sounds = list('sound/effects/weather/rain_heavy.ogg') +/particles/weather/rain/storm + wind_intensity = 3 + spawning = 5 + count = 200 + /decl/state/weather/rain/storm/tick(var/obj/abstract/weather_system/weather) ..() if(prob(0.5)) @@ -188,6 +234,7 @@ /decl/state/weather/rain/hail name = "Hail" icon_state = "hail" + particle_system = null descriptor = "It is hailing." cosmetic_span_class = "danger" is_liquid = FALSE @@ -201,7 +248,8 @@ /decl/state/weather/rain/hail/handle_exposure_effects(var/mob/living/M, var/obj/abstract/weather_system/weather) to_chat(M, SPAN_DANGER("You are pelted by a shower of hail!")) - M.take_damage(rand(1, 3)) + if(M.getBruteLoss() < 20) // Put a cap on it to make it annoying but not lethal. + M.take_damage(rand(1, 3)) /decl/state/weather/ash name = "Ash" diff --git a/code/modules/weather/weather_init.dm b/code/modules/weather/weather_init.dm index 276b6ce614a..48b8e16f3cd 100644 --- a/code/modules/weather/weather_init.dm +++ b/code/modules/weather/weather_init.dm @@ -6,6 +6,10 @@ INITIALIZE_IMMEDIATE(/obj/abstract/weather_system) set_invisibility(INVISIBILITY_NONE) + if(prob(20)) // arbitrary chance to already have some degree of wind when the weather system starts + wind_direction = pick(global.alldirs) + wind_strength = rand(1,5) + banned_weather_conditions = banned // Bookkeeping/rightclick guards. diff --git a/code/modules/weather/weather_wind.dm b/code/modules/weather/weather_wind.dm index c363f20e36e..dc95fdd4f73 100644 --- a/code/modules/weather/weather_wind.dm +++ b/code/modules/weather/weather_wind.dm @@ -23,6 +23,11 @@ wind_direction = turn(wind_direction, 180) if(old_strength != wind_strength) mob_shown_wind.Cut() + update_particle_system() + +/obj/abstract/weather_system/proc/update_particle_system() + for(var/obj/abstract/weather_particles/particle_source in particle_sources) + particle_source.update_particle_system(src) /obj/abstract/weather_system/proc/show_wind(var/mob/M, var/force = FALSE) var/mob_ref = weakref(M) diff --git a/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm index cc79f4bf2b5..abd7dc61c3b 100644 --- a/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm @@ -1,7 +1,7 @@ /obj/machinery/giga_drill name = "alien drill" desc = "A giant, alien drill mounted on long treads." - icon = 'icons/obj/mining.dmi' + icon = 'icons/obj/machines/gigadrill.dmi' icon_state = "gigadrill" var/active = 0 var/drill_time = 10 diff --git a/code/modules/xenoarcheaology/artifacts/triggers/force.dm b/code/modules/xenoarcheaology/artifacts/triggers/force.dm index c8003f314e7..97a771745f1 100644 --- a/code/modules/xenoarcheaology/artifacts/triggers/force.dm +++ b/code/modules/xenoarcheaology/artifacts/triggers/force.dm @@ -7,7 +7,7 @@ var/obj/item/projectile/hit_projectile = hit_with return (hit_projectile.atom_damage_type == BRUTE) else if(istype(hit_with, /obj/item)) - return (hit_with.get_attack_force(user) >= 10) + return (hit_with.expend_attack_force(user) >= 10) /datum/artifact_trigger/force/on_explosion(severity) return TRUE diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm index ad492eb65ef..ba7a38c2f3d 100644 --- a/code/modules/xenoarcheaology/boulder.dm +++ b/code/modules/xenoarcheaology/boulder.dm @@ -1,8 +1,8 @@ /obj/structure/boulder name = "boulder" desc = "A large boulder, somewhat bigger than a small boulder." - icon = 'icons/obj/mining.dmi' - icon_state = "boulder1" + icon = 'icons/obj/structures/boulder.dmi' + icon_state = ICON_STATE_WORLD density = TRUE opacity = TRUE anchored = TRUE @@ -30,7 +30,7 @@ /obj/structure/boulder/Initialize(var/ml, var/_mat, var/coloration) . = ..() - icon_state = "boulder[rand(1,6)]" + icon_state = "[initial(icon_state)][rand(1,6)]" if(coloration) color = coloration excavation_level = rand(5, 50) diff --git a/code/modules/xenoarcheaology/datums/artifact_find.dm b/code/modules/xenoarcheaology/datums/artifact_find.dm index b70f17112e8..242af56502d 100644 --- a/code/modules/xenoarcheaology/datums/artifact_find.dm +++ b/code/modules/xenoarcheaology/datums/artifact_find.dm @@ -2,8 +2,6 @@ var/artifact_id var/artifact_find_type var/static/potential_finds = list( - /obj/machinery/power/supermatter = 5, - /obj/machinery/power/supermatter/shard = 25, /obj/machinery/auto_cloner = 100, /obj/machinery/giga_drill = 100, /obj/machinery/replicator = 100, diff --git a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm index 9cd5a4e78ae..957c9204a4d 100644 --- a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm +++ b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm @@ -29,16 +29,16 @@ /obj/item/chems/glass/replenishing/Initialize() . = ..() - spawning_id = pick( - /decl/material/liquid/blood, \ - /decl/material/liquid/lube, \ - /decl/material/liquid/sedatives, \ - /decl/material/liquid/ethanol, \ - /decl/material/liquid/water, \ - /decl/material/solid/ice, \ - /decl/material/liquid/fuel, \ - /decl/material/liquid/cleaner \ - ) + spawning_id = pick(list( + /decl/material/liquid/blood, + /decl/material/liquid/lube, + /decl/material/liquid/sedatives, + /decl/material/liquid/alcohol/ethanol, + /decl/material/liquid/water, + /decl/material/solid/ice, + /decl/material/liquid/fuel, + /decl/material/liquid/cleaner + )) START_PROCESSING(SSobj, src) /obj/item/chems/glass/replenishing/Process() diff --git a/code/modules/xenoarcheaology/finds/find_types/weapons.dm b/code/modules/xenoarcheaology/finds/find_types/weapons.dm index 73db85aeca5..b593cece25d 100644 --- a/code/modules/xenoarcheaology/finds/find_types/weapons.dm +++ b/code/modules/xenoarcheaology/finds/find_types/weapons.dm @@ -18,7 +18,7 @@ "It doesn't look safe.", "It looks wickedly jagged.", "There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges.") - + /decl/archaeological_find/knife/new_icon() return pick(knife_icons) @@ -46,7 +46,7 @@ modification_flags = XENOFIND_APPLY_DECOR possible_types = list(/obj/item/beartrap) -/decl/archaeological_find/knife/generate_name() +/decl/archaeological_find/trap/generate_name() return "[pick("wicked","evil","byzantine","dangerous")] looking [pick("device","contraption","thing","trap")]" /decl/archaeological_find/trap/get_additional_description() diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index 0ac71ec2278..86f037fd0f8 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -57,6 +57,7 @@ /obj/item/anodevice/Destroy() inserted_battery = null + STOP_PROCESSING(SSobj, src) . = ..() /obj/item/anodevice/attackby(var/obj/I, var/mob/user) @@ -188,10 +189,6 @@ else icon_state = "anodev_empty" -/obj/item/anodevice/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - /obj/item/anodevice/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if (!istype(target)) return ..() diff --git a/code/modules/xenoarcheaology/tools/core_sampler.dm b/code/modules/xenoarcheaology/tools/core_sampler.dm index 01b4f1401e5..21d5bd0cb6d 100644 --- a/code/modules/xenoarcheaology/tools/core_sampler.dm +++ b/code/modules/xenoarcheaology/tools/core_sampler.dm @@ -51,7 +51,7 @@ icon_state = "sliver1" randpixel = 8 w_class = ITEM_SIZE_TINY - sharp = 1 + sharp = TRUE material = /decl/material/solid/stone/sandstone material_health_multiplier = 0.25 diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 213d77ff128..813f424e7f1 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -10,8 +10,8 @@ /obj/item/bag/fossils name = "fossil satchel" desc = "Transports delicate fossils in suspension so they don't break during transit." - icon = 'icons/obj/mining.dmi' - icon_state = "satchel" + icon = 'icons/obj/items/mining_satchel.dmi' + icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY | SLOT_POCKET w_class = ITEM_SIZE_NORMAL storage = /datum/storage/bag/fossils diff --git a/code/procs/hud.dm b/code/procs/hud.dm index 5f4c5580e92..49286df1000 100644 --- a/code/procs/hud.dm +++ b/code/procs/hud.dm @@ -13,73 +13,71 @@ the HUD updates properly! */ if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.med_hud_users) - for(var/mob/living/human/patient in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/patient in P.hud_mob.in_view(P.hud_turf)) - if(patient.is_invisible_to(P.Mob)) + if(patient.is_invisible_to(P.hud_mob)) continue if(local_scanner) - P.Client.images += patient.hud_list[HEALTH_HUD] + P.hud_client.images += patient.hud_list[HEALTH_HUD] if(network) var/record = network.get_crew_record_by_name(patient.get_visible_name()) if(!record) return - P.Client.images += patient.hud_list[STATUS_HUD] + P.hud_client.images += patient.hud_list[STATUS_HUD] else var/sensor_level = getsensorlevel(patient) if(sensor_level >= VITALS_SENSOR_VITAL) - P.Client.images += patient.hud_list[HEALTH_HUD] + P.hud_client.images += patient.hud_list[HEALTH_HUD] if(sensor_level >= VITALS_SENSOR_BINARY) - P.Client.images += patient.hud_list[LIFE_HUD] + P.hud_client.images += patient.hud_list[LIFE_HUD] //Security HUDs. Pass a value for the second argument to enable implant viewing or other special features. /proc/process_sec_hud(var/mob/M, var/advanced_mode, var/mob/Alt, datum/computer_network/network) if(!can_process_hud(M)) return var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.sec_hud_users) - for(var/mob/living/human/perp in P.Mob.in_view(P.Turf)) + for(var/mob/living/human/perp in P.hud_mob.in_view(P.hud_turf)) - if(perp.is_invisible_to(P.Mob)) + if(perp.is_invisible_to(P.hud_mob)) continue if(network) var/record = network.get_crew_record_by_name(perp.get_visible_name()) if(!record) return - P.Client.images += perp.hud_list[ID_HUD] + P.hud_client.images += perp.hud_list[ID_HUD] if(advanced_mode) - P.Client.images += perp.hud_list[WANTED_HUD] - P.Client.images += perp.hud_list[IMPTRACK_HUD] - P.Client.images += perp.hud_list[IMPLOYAL_HUD] - P.Client.images += perp.hud_list[IMPCHEM_HUD] + P.hud_client.images += perp.hud_list[WANTED_HUD] + P.hud_client.images += perp.hud_list[IMPTRACK_HUD] + P.hud_client.images += perp.hud_list[IMPLOYAL_HUD] + P.hud_client.images += perp.hud_list[IMPCHEM_HUD] /proc/process_jani_hud(var/mob/M, var/mob/Alt) var/datum/arranged_hud_process/P = arrange_hud_process(M, Alt, global.jani_hud_users) - for (var/obj/effect/decal/cleanable/dirtyfloor in view(P.Mob)) - P.Client.images += dirtyfloor.hud_overlay + for (var/obj/effect/decal/cleanable/dirtyfloor in view(P.hud_mob)) + if(istype(dirtyfloor, /obj/effect/decal/cleanable/dirt)) + var/obj/effect/decal/cleanable/dirt/dirt = dirtyfloor + if(dirt.alpha <= 0) + continue + P.hud_client.images += dirtyfloor.hud_overlay /datum/arranged_hud_process - var/client/Client - var/mob/Mob - var/turf/Turf + var/client/hud_client + var/mob/hud_mob + var/turf/hud_turf /proc/arrange_hud_process(var/mob/M, var/mob/Alt, var/list/hud_list) hud_list |= M var/datum/arranged_hud_process/P = new - P.Client = M.client - P.Mob = Alt ? Alt : M - P.Turf = get_turf(P.Mob) + P.hud_client = M.client + P.hud_mob = Alt ? Alt : M + P.hud_turf = get_turf(P.hud_mob) return P /proc/can_process_hud(var/mob/M) - if(!M) - return 0 - if(!M.client) - return 0 - if(M.stat != CONSCIOUS) - return 0 - return 1 + return M?.client && M.stat == CONSCIOUS //Deletes the current HUD images so they can be refreshed with new ones. /mob/proc/handle_hud_glasses() //Used in the life.dm of mobs that can use HUDs. diff --git a/code/procs/AStar.dm b/code/procs/pathfinding.dm similarity index 78% rename from code/procs/AStar.dm rename to code/procs/pathfinding.dm index 01e4213f805..7732761b8d3 100644 --- a/code/procs/AStar.dm +++ b/code/procs/pathfinding.dm @@ -5,14 +5,14 @@ A Star pathfinding algorithm Returns a list of tiles forming a path from A to B, taking dense objects as well as walls, and the orientation of windows along the route into account. Use: -your_list = AStar(start location, end location, adjacent turf proc, distance proc) +your_list = find_path_astar(start location, end location, adjacent turf proc, distance proc) For the adjacent turf proc i wrote: /turf/proc/AdjacentTurfs And for the distance one i wrote: /turf/proc/Distance So an example use might be: -src.path_list = AStar(src.loc, target.loc, TYPE_PROC_REF(/turf, AdjacentTurfs), TYPE_PROC_REF(/turf, Distance)) +src.path_list = find_path_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. @@ -60,7 +60,12 @@ length to avoid portals or something i guess?? Not that they're counted right no /proc/PathWeightCompare(PathNode/a, PathNode/b) return a.estimated_cost - b.estimated_cost -/proc/AStar(var/start, var/end, adjacent, dist, var/max_nodes, var/max_node_depth = 30, var/min_target_dist = 0, var/min_node_dist, var/id, var/datum/exclude) +/proc/find_path_astar_async(start, end, adjacent, dist, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude) + set waitfor = FALSE + return find_path_astar(start, end, adjacent, dist, max_nodes, max_node_depth, min_target_dist, min_node_dist, id, exclude, check_tick = TRUE) + +/proc/find_path_astar(start, end, adjacent, dist, max_nodes, max_node_depth = 30, min_target_dist = 0, min_node_dist, id, datum/exclude, check_tick = FALSE) + var/datum/priority_queue/open = new /datum/priority_queue(/proc/PathWeightCompare) var/list/closed = list() var/list/path @@ -85,13 +90,11 @@ length to avoid portals or something i guess?? Not that they're counted right no path[index--] = current.position break - if(min_node_dist && max_node_depth) - if(call(current.position, min_node_dist)(end) + current.nodes_traversed >= max_node_depth) - continue + if(min_node_dist && max_node_depth && (call(current.position, min_node_dist)(end) + current.nodes_traversed >= max_node_depth)) + continue - if(max_node_depth) - if(current.nodes_traversed >= max_node_depth) - continue + if(max_node_depth && current.nodes_traversed >= max_node_depth) + continue for(var/datum/datum in call(current.position, adjacent)(id)) if(datum == exclude) @@ -115,4 +118,9 @@ length to avoid portals or something i guess?? Not that they're counted right no if(max_nodes && open.Length() > max_nodes) open.Remove(open.Length()) + if(check_tick) + CHECK_TICK + if(check_tick) + CHECK_TICK + return path diff --git a/code/unit_tests/_template.dm b/code/unit_tests/_template.dm index 556941cb1ce..36dc0ddfa18 100644 --- a/code/unit_tests/_template.dm +++ b/code/unit_tests/_template.dm @@ -7,8 +7,8 @@ /datum/unit_test/template name = "Test Template - Change My name" - template = /datum/unit_test/template // Set this var equal to the test path to treat it as a template, i.e. it should not be run - async = 1 // Set if we should continue testing elsewhere and come back and check on the results. + abstract_type = /datum/unit_test/template // Set this var equal to the test path to treat it as a template, i.e. it should not be run + async = 1 // Set if we should continue testing elsewhere and come back and check on the results. /datum/unit_test/template/start_test() diff --git a/code/unit_tests/alt_appearances_test.dm b/code/unit_tests/alt_appearances_test.dm index 1bfd0ed325e..d1c4b22a8e8 100644 --- a/code/unit_tests/alt_appearances_test.dm +++ b/code/unit_tests/alt_appearances_test.dm @@ -20,9 +20,8 @@ for(var/ca_type in decls_repository.get_decl_paths_of_subtype(/decl/cardborg_appearance)) var/decl/cardborg_appearance/ca = ca_type - var/list/existing_icon_states = icon_states(initial(ca.icon)) var/icon_state = initial(ca.icon_state) - if(!(icon_state in existing_icon_states)) + if(!check_state_in_icon(icon_state, initial(ca.icon))) log_unit_test("Icon state [icon_state] is missing.") failed = TRUE if(failed) diff --git a/code/unit_tests/atmospherics_tests.dm b/code/unit_tests/atmospherics_tests.dm index 5a9c69c15cf..46837d818bf 100644 --- a/code/unit_tests/atmospherics_tests.dm +++ b/code/unit_tests/atmospherics_tests.dm @@ -2,7 +2,7 @@ Unit tests for ATMOSPHERICS primitives */ /datum/unit_test/atmos_machinery - template = /datum/unit_test/atmos_machinery + abstract_type = /datum/unit_test/atmos_machinery var/list/test_cases = list() /datum/unit_test/atmos_machinery/proc/create_gas_mixes(gas_mix_data) @@ -60,7 +60,7 @@ pass("[case_name]: conserved moles of each gas ID.") /datum/unit_test/atmos_machinery/conserve_moles - template = /datum/unit_test/atmos_machinery/conserve_moles + abstract_type = /datum/unit_test/atmos_machinery/conserve_moles test_cases = list( uphill = list( source = list( diff --git a/code/unit_tests/backgrounds.dm b/code/unit_tests/backgrounds.dm index d44e5e2c5c3..e08b1ec3751 100644 --- a/code/unit_tests/backgrounds.dm +++ b/code/unit_tests/backgrounds.dm @@ -1,5 +1,5 @@ /datum/unit_test/background - name = "BACKGROUND - All Species Background Values Shall Be Of Valid Types And Length" + name = "BACKGROUND: All Species Background Values Shall Be Of Valid Types And Length" /datum/unit_test/background/start_test() diff --git a/code/unit_tests/chemistry_tests.dm b/code/unit_tests/chemistry_tests.dm index bb6e9d90477..cdc9dae00d4 100644 --- a/code/unit_tests/chemistry_tests.dm +++ b/code/unit_tests/chemistry_tests.dm @@ -1,6 +1,6 @@ /datum/unit_test/chemistry name = "CHEMISTRY: Reagent Template" - template = /datum/unit_test/chemistry + abstract_type = /datum/unit_test/chemistry var/container_volume = 45 var/donor_type = /obj/item diff --git a/code/unit_tests/closets.dm b/code/unit_tests/closets.dm index 9bc236f8ff9..10688fd7231 100644 --- a/code/unit_tests/closets.dm +++ b/code/unit_tests/closets.dm @@ -29,18 +29,18 @@ if(!closet.base_icon) LAZYADD(bad_base_icon, "[closet.type]") else - var/list/base_states = icon_states(closet.base_icon) + var/list/base_states = get_states_in_icon_cached(closet.base_icon) for(var/thing in check_base_states) - if(!(thing in base_states)) + if(!base_states[thing]) LAZYADD(bad_base_state, "[closet.type] - [thing] - [closet.base_icon]") if(LAZYLEN(closet.decals) && !closet.decal_icon) LAZYADD(bad_decal_icon, "[closet.type]") else - var/list/decal_states = icon_states(closet.decal_icon) + var/list/decal_states = get_states_in_icon_cached(closet.decal_icon) for(var/thing in closet.decals) if(isnull(closet.decals[thing])) LAZYADD(bad_decal_colour, "[check_appearance] - [thing]") - if(!(thing in decal_states)) + if(!decal_states[thing]) LAZYADD(bad_decal_state, "[check_appearance] - [thing] - [closet.decal_icon]") if( \ diff --git a/code/unit_tests/clothing.dm b/code/unit_tests/clothing.dm index 2b3889695c3..8219e6d0418 100644 --- a/code/unit_tests/clothing.dm +++ b/code/unit_tests/clothing.dm @@ -99,7 +99,7 @@ generated_tokens += "[token][clothes.markings_state_modifier]" // Keep track of which states we've looked for or otherwise evaluated for later state checking. - var/list/check_states = icon_states(clothes.icon) + var/list/check_states = get_states_in_icon(clothes.icon) // Validate against the list of generated tokens. for(var/gen_token in generated_tokens) diff --git a/code/unit_tests/codex.dm b/code/unit_tests/codex.dm index 92a97cec0d5..2130edd1f88 100644 --- a/code/unit_tests/codex.dm +++ b/code/unit_tests/codex.dm @@ -1,5 +1,5 @@ /datum/unit_test/codex_string_uniqueness - name = "CODEX - All Codex Associated Strings Shall Be Unique" + name = "CODEX: All Codex Associated Strings Shall Be Unique" /datum/unit_test/codex_string_uniqueness/start_test() var/list/failures = list() @@ -18,7 +18,7 @@ return TRUE /datum/unit_test/codex_overlap - name = "CODEX - No Codex String IDs Shall Overlap" + name = "CODEX: No Codex String IDs Shall Overlap" /datum/unit_test/codex_overlap/start_test() var/list/failures = list() @@ -42,7 +42,7 @@ return TRUE /datum/unit_test/codex_links - name = "CODEX - All Codex Links Will Function" + name = "CODEX: All Codex Links Will Function" /datum/unit_test/codex_links/start_test() var/list/failures = list() @@ -64,7 +64,7 @@ return 1 /datum/unit_test/codex_dump_test - name = "CODEX - Codex Will Successfully Dump To Filesystem" + name = "CODEX: Codex Will Successfully Dump To Filesystem" /datum/unit_test/codex_dump_test/start_test() var/dump_result diff --git a/code/unit_tests/del_the_world.dm b/code/unit_tests/del_the_world.dm index 3a9c575e699..411ef21b8d3 100644 --- a/code/unit_tests/del_the_world.dm +++ b/code/unit_tests/del_the_world.dm @@ -7,15 +7,6 @@ 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, @@ -48,57 +39,52 @@ continue qdel(to_del, force = TRUE) // I hate borg stacks I hate borg stacks AM = null // this counts as a reference to the last item if we don't explicitly clear it?? + del_candidates.Cut() // this also?? // Check for hanging references. SSticker.delay_end = TRUE // Don't end the round while we wait! - // No harddels during this test. - SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = 6 HOURS // github CI timeout length + // Drastically lower the amount of time it takes to GC, since we don't have clients that can hold it up. + SSgarbage.collection_timeout[GC_QUEUE_CHECK] = 10 SECONDS cached_contents.Cut() + var/list/queues_we_care_about = list() + // All of em, I want hard deletes too, since we rely on the debug info from them + for(var/i in 1 to GC_QUEUE_HARDDELETE) + queues_we_care_about += i + + //Now that we've qdel'd everything, let's sleep until the gc has processed all the shit we care about + // + 2 seconds to ensure that everything gets in the queue. + var/time_needed = 2 SECONDS + for(var/index in queues_we_care_about) + time_needed += SSgarbage.collection_timeout[index] + // track start time so we know anything deleted after this point isn't ours var/start_time = world.time - // spin until the first item in the filter queue is older than start_time - var/filter_queue_finished = FALSE - var/list/filter_queue = SSgarbage.queues[GC_QUEUE_FILTER] - while(!filter_queue_finished) - if(!length(filter_queue)) - filter_queue_finished = TRUE - break - var/oldest_item = filter_queue[1] - var/qdel_time = filter_queue[oldest_item] - if(qdel_time > start_time) // Everything is in the check queue now! - filter_queue_finished = TRUE - break - if(world.time > start_time + 2 MINUTES) - fail("Something has gone horribly wrong, the filter queue has been processing for well over 2 minutes. What the hell did you do??") - break - // We want to fire every time. - SSgarbage.next_fire = 1 - sleep(2 SECONDS) - // We need to check the check queue now. - start_time = world.time - // sleep until SSgarbage has run through the queue - var/time_needed = SSgarbage.collection_timeout[GC_QUEUE_CHECK] - sleep(time_needed) - // taken verbatim from TG's Del The World + var/real_start_time = REALTIMEOFDAY var/garbage_queue_processed = FALSE - var/list/check_queue = SSgarbage.queues[GC_QUEUE_CHECK] + + sleep(time_needed) while(!garbage_queue_processed) - //How the hell did you manage to empty this? Good job! - if(!length(check_queue)) - garbage_queue_processed = TRUE - break + var/oldest_packet_creation = INFINITY + for(var/index in queues_we_care_about) + var/list/queue_to_check = SSgarbage.queues[index] + if(!length(queue_to_check)) + continue + + var/list/oldest_packet = queue_to_check[1] + //Pull out the time we inserted at + var/qdeld_at = oldest_packet[GC_QUEUE_ITEM_GCD_DESTROYED] + + oldest_packet_creation = min(qdeld_at, oldest_packet_creation) - var/oldest_packet = check_queue[1] - //Pull out the time we deld at - var/qdeld_at = check_queue[oldest_packet] //If we've found a packet that got del'd later then we finished, then all our shit has been processed - if(qdeld_at > start_time) + //That said, if there are any pending hard deletes you may NOT sleep, we gotta handle that shit + if(oldest_packet_creation > start_time && !length(SSgarbage.queues[GC_QUEUE_HARDDELETE])) garbage_queue_processed = TRUE break - if(world.time > start_time + time_needed + 8 MINUTES) - fail("The garbage queue has been processing for well over 10 minutes. Something is likely broken.") + if(REALTIMEOFDAY > real_start_time + time_needed + 30 MINUTES) //If this gets us gitbanned I'm going to laugh so hard + fail("Something has gone horribly wrong, the garbage queue has been processing for well over 30 minutes. What the hell did you do") break //Immediately fire the gc right after @@ -109,8 +95,6 @@ //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(path in gc_exceptions) - continue var/datum/qdel_item/item = cache_for_sonic_speed[path] if(item.failures) failures += "[item.name] hard deleted [item.failures] times out of a total del count of [item.qdels]" diff --git a/code/unit_tests/equipment_tests.dm b/code/unit_tests/equipment_tests.dm index 558debe8c65..dac446856e8 100644 --- a/code/unit_tests/equipment_tests.dm +++ b/code/unit_tests/equipment_tests.dm @@ -1,41 +1,37 @@ /datum/unit_test/vision_glasses name = "EQUIPMENT: Vision Template" - template = /datum/unit_test/vision_glasses - var/mob/living/human/H = null + abstract_type = /datum/unit_test/vision_glasses + var/mob/living/human/subject = null var/expectation = SEE_INVISIBLE_NOLIGHTING var/glasses_type = null async = 1 /datum/unit_test/vision_glasses/start_test() - var/list/test = create_test_mob_with_mind(get_safe_turf(), /mob/living/human) - if(isnull(test)) - fail("Check Runtimed in Mob creation") - - if(test["result"] == FAILURE) - fail(test["msg"]) - async = 0 - return 0 - - H = locate(test["mobref"]) - return H?.equip_to_slot(new glasses_type(H), slot_glasses_str, TRUE, TRUE) + subject = new(get_safe_turf(), SPECIES_HUMAN) // force human so default map species doesn't mess with anything + subject.equip_to_slot(new glasses_type(subject), slot_glasses_str) + return 1 /datum/unit_test/vision_glasses/check_result() - if(isnull(H) || H.life_tick < 2) + if(isnull(subject) || subject.life_tick < 2) return 0 - if(isnull(H.get_equipped_item(slot_glasses_str))) + if(isnull(subject.get_equipped_item(slot_glasses_str))) fail("Mob doesn't have glasses on") - H.handle_vision() // Because Life has a client check that bypasses updating vision + subject.handle_vision() // Because Life has a client check that bypasses updating vision - if(H.see_invisible == expectation) - pass("Mob See invisible is [H.see_invisible]") + if(subject.see_invisible == expectation) + pass("Mob See invisible is [subject.see_invisible]") else - fail("Mob See invisible is [H.see_invisible] / expected [expectation]") + fail("Mob See invisible is [subject.see_invisible] / expected [expectation]") return 1 +/datum/unit_test/vision_glasses/teardown_test() + QDEL_NULL(subject) + . = ..() + /datum/unit_test/vision_glasses/NVG name = "EQUIPMENT: NVG see_invis" glasses_type = /obj/item/clothing/glasses/night diff --git a/code/unit_tests/extension_tests.dm b/code/unit_tests/extension_tests.dm index 3cf14a6f23d..2a7724e3cc7 100644 --- a/code/unit_tests/extension_tests.dm +++ b/code/unit_tests/extension_tests.dm @@ -1,10 +1,10 @@ /datum/unit_test/extensions name = "EXTENSIONS template" - template = /datum/unit_test/extensions + abstract_type = /datum/unit_test/extensions async = 0 /datum/unit_test/extensions/basic_extension_shall_lazy_initalize_as_expected - name = "EXTENSIONS - Basic extension shall lazy initialize as expected" + name = "EXTENSIONS: Basic extension shall lazy initialize as expected" /datum/unit_test/extensions/basic_extension_shall_lazy_initalize_as_expected/start_test() var/turf/start = get_safe_turf() @@ -40,7 +40,7 @@ return TRUE /datum/unit_test/extensions/basic_immediate_extension_shall_initalize_as_expected - name = "EXTENSIONS - Basic immediate extension shall initialize as expected" + name = "EXTENSIONS: Basic immediate extension shall initialize as expected" /datum/unit_test/extensions/basic_immediate_extension_shall_initalize_as_expected/start_test() var/turf/start = get_safe_turf() @@ -71,7 +71,7 @@ return TRUE /datum/unit_test/extensions/shall_acquire_extension_subtype_as_expected - name = "EXTENSIONS - Shall acquire extension subtype as expected" + name = "EXTENSIONS: Shall acquire extension subtype as expected" /datum/unit_test/extensions/shall_acquire_extension_subtype_as_expected/start_test() var/turf/start = get_safe_turf() @@ -88,7 +88,7 @@ return TRUE /datum/unit_test/extensions/extension_shall_be_provided_arguments_as_expected - name = "EXTENSIONS - Extension shall be provided arguments as expected" + name = "EXTENSIONS: Extension shall be provided arguments as expected" /datum/unit_test/extensions/extension_shall_be_provided_arguments_as_expected/start_test() var/turf/start = get_safe_turf() @@ -105,7 +105,7 @@ return TRUE /datum/unit_test/extensions/immediate_extension_shall_be_provided_arguments_as_expected - name = "EXTENSIONS - Immediate extension shall be provided arguments as expected" + name = "EXTENSIONS: Immediate extension shall be provided arguments as expected" /datum/unit_test/extensions/immediate_extension_shall_be_provided_arguments_as_expected/start_test() var/turf/start = get_safe_turf() @@ -122,7 +122,7 @@ return TRUE /datum/unit_test/extensions/get_or_create_extension_shall_initialize_as_expected - name = "EXTENSIONS - get_or_create() shall initialize as expected" + name = "EXTENSIONS: get_or_create() shall initialize as expected" /datum/unit_test/extensions/get_or_create_extension_shall_initialize_as_expected/start_test() var/turf/start = get_safe_turf() @@ -147,7 +147,7 @@ return TRUE /datum/unit_test/extensions/get_or_create_extension_with_arguments_shall_initialize_as_expected - name = "EXTENSIONS - get_or_create() with arguments shall initialize as expected" + name = "EXTENSIONS: get_or_create() with arguments shall initialize as expected" /datum/unit_test/extensions/get_or_create_extension_with_arguments_shall_initialize_as_expected/start_test() var/turf/start = get_safe_turf() diff --git a/code/unit_tests/foundation_tests.dm b/code/unit_tests/foundation_tests.dm index 66fb31643b3..27196ec37ff 100644 --- a/code/unit_tests/foundation_tests.dm +++ b/code/unit_tests/foundation_tests.dm @@ -3,7 +3,7 @@ */ /datum/unit_test/foundation name = "FOUNDATION template" - template = /datum/unit_test/foundation + abstract_type = /datum/unit_test/foundation async = 0 /datum/unit_test/foundation/step_shall_return_true_on_success diff --git a/code/unit_tests/graph_tests.dm b/code/unit_tests/graph_tests.dm index 66a939e3a8f..47cdb388f62 100644 --- a/code/unit_tests/graph_tests.dm +++ b/code/unit_tests/graph_tests.dm @@ -430,7 +430,7 @@ * Base Test Setup * ******************/ /datum/unit_test/graph_test - template = /datum/unit_test/graph_test + abstract_type = /datum/unit_test/graph_test async = TRUE var/list/graphs @@ -480,7 +480,7 @@ /atom/movable/graph_test is_spawnable_type = FALSE var/datum/node/physical/node - var/list/neighoursByDirection = list() + var/list/neighboursByDirection = list() /atom/movable/graph_test/Initialize() . = ..() @@ -489,6 +489,7 @@ /atom/movable/graph_test/Destroy() QDEL_NULL(node) + neighboursByDirection.Cut() return ..() /atom/movable/graph_test/forceMove() @@ -497,20 +498,21 @@ /atom/movable/graph_test/proc/Connect(atom/movable/graph_test/neighbour) var/direction = get_dir(src, neighbour) - neighoursByDirection[num2text(direction)] = neighbour - neighbour.neighoursByDirection[num2text(global.flip_dir[direction])] = src + neighboursByDirection[num2text(direction)] = neighbour + neighbour.neighboursByDirection[num2text(global.flip_dir[direction])] = src node.Connect(neighbour.node) /atom/movable/graph_test/CheckNodeNeighbours() // This is a lazy setup for ease of debugging // In a practical setup you'd preferably gather a list of neighbours to be disconnected and pass them in a single Disconnect-call // You'd possibly also verify the dir of this and neighbour nodes, to ensure that they're still facing each other properly - for(var/direction in neighoursByDirection) - var/atom/movable/graph_test/neighbour = neighoursByDirection[direction] + for(var/direction in neighboursByDirection) + var/atom/movable/graph_test/neighbour = neighboursByDirection[direction] var/turf/expected_loc = get_step(src, text2num(direction)) - if(neighbour.loc != expected_loc) + // can't connect in nullspace + if(isnull(neighbour.loc) || neighbour.loc != expected_loc) node.Disconnect(neighbour.node) - neighoursByDirection -= direction + neighboursByDirection -= direction return TRUE /datum/graph/testing @@ -523,7 +525,7 @@ var/on_split_was_called var/issues -/datum/graph/testing/New(var/node, var/edges, var/name) +/datum/graph/testing/New(var/node, var/edges, var/previous_owner, var/name) ..() src.name = name || "Graph" issues = list() @@ -557,8 +559,10 @@ /datum/graph/testing/proc/CheckExpectations() if(on_check_expectations) issues += DoCheckExpectations(on_check_expectations) + QDEL_NULL(on_check_expectations) // stop holding up GC! if(length(split_expectations) && !on_split_was_called) issues += "Had split expectations but OnSplit was not called" + QDEL_LIST(split_expectations) // stop holding up GC! if(!length(split_expectations) && on_split_was_called) issues += "Had no split expectations but OnSplit was called" if(expecting_merge != on_merge_was_called) @@ -575,6 +579,11 @@ src.expected_nodes = expected_nodes || list() src.expected_edges = expected_edges || list() +/datum/graph_expectation/Destroy(force) + expected_nodes.Cut() + expected_edges.Cut() + return ..() + // Stub for subtype-specific functionality for DoCheckExpectations. // Should not access graph.nodes or graph.edges. /datum/graph_expectation/proc/OnCheckExpectations(var/datum/graph/graph) diff --git a/code/unit_tests/icon_tests.dm b/code/unit_tests/icon_tests.dm index f2894e862e3..279daba8a34 100644 --- a/code/unit_tests/icon_tests.dm +++ b/code/unit_tests/icon_tests.dm @@ -1,9 +1,9 @@ /datum/unit_test/icon_test name = "ICON STATE template" - template = /datum/unit_test/icon_test + abstract_type = /datum/unit_test/icon_test /datum/unit_test/icon_test/food_shall_have_icon_states - name = "ICON STATE - Food And Drink Subtypes Shall Have Icon States" + name = "ICON STATE: Food And Drink Subtypes Shall Have Icon States" var/list/check_types = list( /obj/item/chems/condiment, /obj/item/chems/drinks, @@ -12,11 +12,14 @@ // We skip lumps because they are invisible, they are only ever inside utensils. var/list/skip_types = list(/obj/item/food/lump) -/datum/unit_test/icon_test/food_shall_have_icon_states/start_test() - +/datum/unit_test/icon_test/food_shall_have_icon_states/proc/assemble_skipped_types() skip_types |= typesof(/obj/item/food/grown) skip_types |= typesof(/obj/item/food/processed_grown) +/datum/unit_test/icon_test/food_shall_have_icon_states/start_test() + + assemble_skipped_types() + var/list/failures = list() for(var/check_type in check_types) for(var/check_subtype in typesof(check_type)) @@ -48,7 +51,7 @@ return 1 /datum/unit_test/icon_test/turfs_shall_have_icon_states - name = "ICON STATE - Turf Subtypes Shall Have Icon States" + name = "ICON STATE: Turf Subtypes Shall Have Icon States" var/list/except_types = list( /turf/mimic_edge, /turf/open @@ -82,7 +85,7 @@ return 1 /datum/unit_test/icon_test/signs_shall_have_existing_icon_states - name = "ICON STATE - 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 @@ -121,7 +124,7 @@ return 1 /datum/unit_test/icon_test/random_spawners_shall_have_existing_icon_states - name = "ICON STATE - 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() @@ -144,7 +147,7 @@ return 1 /datum/unit_test/icon_test/floor_decals_shall_have_existing_icon_states - name = "ICON STATE - Floor decals shall have existing icon states" + name = "ICON STATE: Floor decals shall have existing icon states" var/static/list/excepted_types = list( /obj/effect/floor_decal/reset, /obj/effect/floor_decal/undo @@ -172,7 +175,7 @@ return 1 /datum/unit_test/icon_test/bgstate - name = "ICON_STATE - Character Previews Will Have Background States" + name = "ICON STATE: Character Previews Will Have Background States" /datum/unit_test/icon_test/bgstate/start_test() var/obj/screen/setup_preview/preview = /obj/screen/setup_preview @@ -195,3 +198,165 @@ else pass("All preview icons have all background icon states.") return 1 + +/datum/unit_test/icon_test/smartfridges + name = "ICON STATE: Smartfridges Will Have All Needed Icon States" + +/datum/unit_test/icon_test/smartfridges/start_test() + var/list/failures = list() + var/list/test_icons = list() + var/list/test_contents_overlays = list() + for(var/obj/machinery/smartfridge/fridge as anything in typesof(/obj/machinery/smartfridge)) + if(TYPE_IS_ABSTRACT(fridge) || !fridge::simulated) + continue + var/fridge_icon = fridge::icon + if(fridge_icon) + test_icons |= fridge_icon + else + failures += "[fridge] has null icon" + var/fridge_state = fridge::icon_state + if(fridge_state != ICON_STATE_WORLD) + failures += "[fridge] has non-world icon_state '[fridge_state]'" + var/fridge_contents_icon = fridge::overlay_contents_icon + if(fridge_contents_icon) + test_contents_overlays |= fridge_contents_icon + + for(var/test_icon in test_icons) + var/static/list/fridge_states = list( + "world", + "world-vend", + "world-deny", + "world-off", + "world-broken", + "world-panel", + "world-top", + "world-top-broken", + "world-broken", + "world-sidepanel", + "world-sidepanel-broken" + ) + for(var/test_state in fridge_states) + if(!check_state_in_icon(test_state, test_icon)) + failures += "[test_icon] missing icon_state [test_state]" + + for(var/test_icon in test_contents_overlays) + var/static/list/test_overlays = list( + "empty", + "1", + "2", + "3", + "4", + "empty-off", + "1-off", + "2-off", + "3-off", + "4-off" + ) + for(var/test_overlay in test_overlays) + if(!check_state_in_icon(test_overlay, test_icon)) + failures += "[test_icon] missing overlay [test_overlay]" + + if(length(failures)) + fail("Missing smartfridge icons or icon states:\n\t-[jointext(failures, "\n\t-")]") + else + pass("All smartfridges have all icons and icon states.") + return 1 + +/datum/unit_test/icon_test/vendors + name = "ICON STATE: Vending Machines Will Have All Needed Icon States" + +/datum/unit_test/icon_test/vendors/start_test() + var/list/failures = list() + var/list/test_icons = list() + + for(var/obj/machinery/vending/vendor as anything in typesof(/obj/machinery/vending)) + if(TYPE_IS_ABSTRACT(vendor) || !vendor::simulated) + continue + var/vendor_icon = vendor::icon + if(vendor_icon) + test_icons |= vendor_icon + else + failures += "[vendor] has null icon" + var/vendor_state = vendor::icon_state + if(vendor_state != ICON_STATE_WORLD) + failures += "[vendor] has non-world icon_state '[vendor_state]'" + + for(var/test_icon in test_icons) + var/static/list/vendor_states = list( + "world", + "world-vend", + "world-deny", + "world-off", + "world-broken", + "world-panel", + ) + for(var/test_state in vendor_states) + if(!check_state_in_icon(test_state, test_icon)) + failures += "[test_icon] missing icon_state [test_state]" + + if(length(failures)) + fail("Missing vendor icons or icon states:\n\t-[jointext(failures, "\n\t-")]") + else + pass("All vendors have all icons and icon states.") + return 1 + + +/datum/unit_test/HUDS_shall_have_icon_states + name = "ICON STATE: HUD overlays shall have appropriate icon_states" + +/datum/unit_test/HUDS_shall_have_icon_states/start_test() + var/failed_jobs = 0 + var/failed_sanity_checks = 0 + + // Throwing implants and health HUDs in here. + // Antag HUDs are tested by special role validation. + + var/static/list/implant_hud_states = list( + "hud_imp_blank" = "Blank", + "hud_imp_loyal" = "Loyalty", + "hud_imp_unknown" = "Unknown", + "hud_imp_tracking" = "Tracking", + "hud_imp_chem" = "Chemical", + ) + for(var/implant_hud_state in implant_hud_states) + if(!check_state_in_icon(implant_hud_state, global.using_map.implant_hud_icons)) + log_bad("Sanity Check - Missing map [implant_hud_states[implant_hud_state]] implant HUD icon_state '[implant_hud_state]' from icon [global.using_map.implant_hud_icons]") + failed_sanity_checks++ + + var/static/list/med_hud_states = list( + "blank" = "Blank", + "flatline" = "Flatline", + "0" = "Dead", + "1" = "Healthy", + "2" = "Lightly injured", + "3" = "Moderately injured", + "4" = "Severely injured", + "5" = "Dying", + ) + for(var/med_hud_state in med_hud_states) + if(!check_state_in_icon(med_hud_state, global.using_map.med_hud_icons)) + log_bad("Sanity Check - Missing map [med_hud_states[med_hud_state]] medical HUD icon_state '[med_hud_state]' from icon [global.using_map.med_hud_icons]") + failed_sanity_checks++ + var/static/list/global_states = list( + "" = "Default/unnamed", + "hudunknown" = "Unknown role", + "hudhealthy" = "Healthy mob", + "hudill" = "Diseased mob", + "huddead" = "Dead mob" + ) + for(var/global_state in global_states) + if(!check_state_in_icon(global_state, global.using_map.hud_icons)) + log_bad("Sanity Check - Missing map [global_states[global_state]] HUD icon_state '[global_state]' from icon [global.using_map.hud_icons]") + failed_sanity_checks++ + + for(var/job_name in SSjobs.titles_to_datums) + var/datum/job/job = SSjobs.titles_to_datums[job_name] + if(!check_state_in_icon(job.hud_icon_state, job.hud_icon)) + log_bad("[job.title] - Missing HUD icon: [job.hud_icon_state] in icon [job.hud_icon]") + failed_jobs++ + + if(failed_sanity_checks || failed_jobs) + fail("[global.using_map.type] - [failed_sanity_checks] failed sanity check\s, [failed_jobs] job\s with missing HUD icon.") + else + pass("All jobs have a HUD icon.") + return 1 diff --git a/code/unit_tests/integrated_circuits.dm b/code/unit_tests/integrated_circuits.dm index ca6d5099487..84de2ac2ff3 100644 --- a/code/unit_tests/integrated_circuits.dm +++ b/code/unit_tests/integrated_circuits.dm @@ -1,8 +1,8 @@ /datum/unit_test/integrated_circuits - template = /datum/unit_test/integrated_circuits + abstract_type = /datum/unit_test/integrated_circuits /datum/unit_test/integrated_circuits/unique_names - name = "INTEGRATED CIRCUITS - Circuits must have unique names" + name = "INTEGRATED CIRCUITS: Circuits must have unique names" /datum/unit_test/integrated_circuits/unique_names/start_test() var/list/circuits_by_name = list() @@ -20,7 +20,7 @@ /datum/unit_test/integrated_circuits/prefabs_are_valid - name = "INTEGRATED CIRCUITS - Prefabs Are Valid" + name = "INTEGRATED CIRCUITS: Prefabs Are Valid" /datum/unit_test/integrated_circuits/prefabs_are_valid/start_test() var/list/failed_prefabs = list() @@ -37,7 +37,7 @@ return 1 /datum/unit_test/integrated_circuits/prefabs_shall_not_fail_to_create - name = "INTEGRATED CIRCUITS - Prefabs Shall Not Fail To Create" + name = "INTEGRATED CIRCUITS: Prefabs Shall Not Fail To Create" /datum/unit_test/integrated_circuits/prefabs_shall_not_fail_to_create/start_test() var/list/failed_prefabs = list() @@ -63,8 +63,8 @@ return 1 /datum/unit_test/integrated_circuits/input_output - name = "INTEGRATED CIRCUITS - INPUT/OUTPUT - TEMPLATE" - template = /datum/unit_test/integrated_circuits/input_output + name = "INTEGRATED CIRCUITS: INPUT/OUTPUT - TEMPLATE" + abstract_type = /datum/unit_test/integrated_circuits/input_output var/list/all_inputs = list() var/list/all_expected_outputs = list() var/activation_pin = 1 @@ -110,13 +110,13 @@ return 1 /datum/unit_test/integrated_circuits/input_output/multiplexer - name = "INTEGRATED CIRCUITS - INPUT/OUTPUT - Multiplexer - Medium" + name = "INTEGRATED CIRCUITS: INPUT/OUTPUT - Multiplexer - Medium" all_inputs = list(list(1,1,2,3,4),list(2,1,2,3,4),list(3,1,2,3,4),list(4,1,2,3,4)) all_expected_outputs = list(list(1),list(2),list(3),list(4)) circuit_type = /obj/item/integrated_circuit/transfer/multiplexer/medium /datum/unit_test/integrated_circuits/input_output/demultiplexer - name = "INTEGRATED CIRCUITS - INPUT/OUTPUT - Demultiplexer - Medium" + name = "INTEGRATED CIRCUITS: INPUT/OUTPUT - Demultiplexer - Medium" all_inputs = list(list(1,5),list(2,6),list(3,7),list(4,8)) all_expected_outputs = list(list(5,null,null,null),list(null,6,null,null),list(null,null,7,null),list(null,null,null,8)) circuit_type = /obj/item/integrated_circuit/transfer/demultiplexer/medium diff --git a/code/unit_tests/job_tests.dm b/code/unit_tests/job_tests.dm index b1295165734..b6b652731f8 100644 --- a/code/unit_tests/job_tests.dm +++ b/code/unit_tests/job_tests.dm @@ -35,36 +35,6 @@ pass("All jobs had outfit types.") return 1 -/datum/unit_test/jobs_shall_have_a_HUD_icon - name = "JOB: Shall have a HUD icon" - -/datum/unit_test/jobs_shall_have_a_HUD_icon/start_test() - var/failed_jobs = 0 - var/failed_sanity_checks = 0 - - var/job_huds = icon_states(global.using_map.id_hud_icons) - - if(!("" in job_huds)) - log_bad("Sanity Check - Missing default/unnamed HUD icon") - failed_sanity_checks++ - - if(!("hudunknown" in job_huds)) - log_bad("Sanity Check - Missing HUD icon: hudunknown") - failed_sanity_checks++ - - for(var/job_name in SSjobs.titles_to_datums) - var/datum/job/J = SSjobs.titles_to_datums[job_name] - var/hud_icon_state = J.hud_icon - if(!(hud_icon_state in job_huds)) - log_bad("[J.title] - Missing HUD icon: [hud_icon_state]") - failed_jobs++ - - if(failed_sanity_checks || failed_jobs) - fail("[global.using_map.id_hud_icons] - [failed_sanity_checks] failed sanity check\s, [failed_jobs] job\s with missing HUD icon.") - else - pass("All jobs have a HUD icon.") - return 1 - /datum/unit_test/jobs_shall_have_a_unique_title name = "JOBS: All Job Datums Shall Have A Unique Title" diff --git a/code/unit_tests/map_tests.dm b/code/unit_tests/map_tests.dm index 2803ba8db09..89238fa88d2 100644 --- a/code/unit_tests/map_tests.dm +++ b/code/unit_tests/map_tests.dm @@ -503,6 +503,28 @@ //======================================================================================= +// These vars are used to avoid in-world loops in the following unit test. +var/global/_unit_test_disposal_segments = list() +var/global/_unit_test_sort_junctions = list() + +#ifdef UNIT_TEST +/obj/structure/disposalpipe/segment/Initialize(mapload) + . = ..() + _unit_test_disposal_segments += src + +/obj/structure/disposalpipe/segment/Destroy() + _unit_test_disposal_segments -= src + return ..() + +/obj/structure/disposalpipe/sortjunction/Initialize(mapload) + . = ..() + _unit_test_sort_junctions += src + +/obj/structure/disposalpipe/sortjunction/Destroy() + _unit_test_sort_junctions -= src + return ..() +#endif + /datum/unit_test/disposal_segments_shall_connect_with_other_disposal_pipes name = "MAP: Disposal segments shall connect with other disposal pipes" @@ -522,7 +544,7 @@ num2text(SOUTH) = list(list(SOUTH, list(NORTH, WEST)), list(EAST, list(NORTH, EAST))), num2text(WEST) = list(list(EAST, list(NORTH, EAST)), list(SOUTH, list(SOUTH, EAST)))) - for(var/obj/structure/disposalpipe/segment/D in world) + for(var/obj/structure/disposalpipe/segment/D in _unit_test_disposal_segments) if(!D.loc) continue if(D.icon_state == "pipe-s") @@ -760,7 +782,7 @@ /datum/unit_test/networked_disposals_shall_deliver_tagged_packages/start_test() . = 1 var/fail = FALSE - for(var/obj/structure/disposalpipe/sortjunction/sort in world) + for(var/obj/structure/disposalpipe/sortjunction/sort in _unit_test_sort_junctions) if(!sort.loc) continue if(is_type_in_list(sort, exempt_junctions)) diff --git a/code/unit_tests/mob_tests.dm b/code/unit_tests/mob_tests.dm index 5867dd2ca90..2f03eb9da32 100644 --- a/code/unit_tests/mob_tests.dm +++ b/code/unit_tests/mob_tests.dm @@ -58,21 +58,9 @@ // ============================================================================ -var/global/default_mobloc = null - -/proc/create_test_mob_with_mind(var/turf/mobloc = null, var/mobtype = /mob/living/human) +/datum/unit_test/mob_damage/proc/create_test_mob_with_mind(var/turf/mobloc, var/mobtype = /mob/living/human) var/list/test_result = list("result" = FAILURE, "msg" = "", "mobref" = null) - if(isnull(mobloc)) - if(!default_mobloc) - for(var/turf/floor/tiled/T in world) - if(!T.zone?.air) - continue - var/pressure = T.zone.air.return_pressure() - if(90 < pressure && pressure < 120) // Find a turf between 90 and 120 - default_mobloc = T - break - mobloc = default_mobloc if(!mobloc) test_result["msg"] = "Unable to find a location to create test mob" return test_result @@ -129,7 +117,7 @@ var/global/default_mobloc = null /datum/unit_test/mob_damage name = "MOB: Template for mob damage" - template = /datum/unit_test/mob_damage + abstract_type = /datum/unit_test/mob_damage var/damagetype = BRUTE var/mob_type = /mob/living/human var/expected_vulnerability = STANDARD @@ -260,15 +248,15 @@ var/global/default_mobloc = null fail("[icon_file] is not a valid icon file.") return 1 - var/list/valid_states = icon_states(icon_file) + var/list/valid_states = get_states_in_icon_cached(icon_file) - if(!valid_states.len) + if(!length(valid_states)) return 1 for(var/i=1, i<=SSrobots.all_module_names.len, i++) var/modname = lowertext(SSrobots.all_module_names[i]) var/bad_msg = "[ascii_red]--------------- [modname]" - if(!(modname in valid_states)) + if(!valid_states[modname]) log_unit_test("[bad_msg] does not contain a valid icon state in [icon_file][ascii_reset]") failed=1 diff --git a/code/unit_tests/movement_tests.dm b/code/unit_tests/movement_tests.dm index d86ee6585a7..dbcb2bc4499 100644 --- a/code/unit_tests/movement_tests.dm +++ b/code/unit_tests/movement_tests.dm @@ -1,10 +1,10 @@ /datum/unit_test/movement name = "MOVEMENT template" - template = /datum/unit_test/movement + abstract_type = /datum/unit_test/movement async = 0 /datum/unit_test/movement/force_move_shall_trigger_crossed_when_entering_turf - name = "MOVEMENT - Force Move Shall Trigger Crossed When Entering Turf" + name = "MOVEMENT: Force Move Shall Trigger Crossed When Entering Turf" /datum/unit_test/movement/force_move_shall_trigger_crossed_when_entering_turf/start_test() var/turf/start = get_safe_turf() @@ -27,7 +27,7 @@ return TRUE /datum/unit_test/movement/force_move_shall_trigger_entered - name = "MOVEMENT - Force Move Shall Trigger Entered" + name = "MOVEMENT: Force Move Shall Trigger Entered" /datum/unit_test/movement/force_move_shall_trigger_entered/start_test() var/turf/start = get_safe_turf() diff --git a/code/unit_tests/observation_tests.dm b/code/unit_tests/observation_tests.dm index b9174d26fe8..829bc743576 100644 --- a/code/unit_tests/observation_tests.dm +++ b/code/unit_tests/observation_tests.dm @@ -4,7 +4,7 @@ /datum/unit_test/observation name = "OBSERVATION template" - template = /datum/unit_test/observation + abstract_type = /datum/unit_test/observation async = 0 var/list/received_moves var/list/received_name_set_events diff --git a/code/unit_tests/override_tests.dm b/code/unit_tests/override_tests.dm index 5a904c09ef5..4687b0c72aa 100644 --- a/code/unit_tests/override_tests.dm +++ b/code/unit_tests/override_tests.dm @@ -2,10 +2,10 @@ /datum/unit_test/override name = "OVERRIDE template" - template = /datum/unit_test/override + abstract_type = /datum/unit_test/override /datum/unit_test/override/obj_random_shall_spawn_heaviest_item - name = "OVERRIDE - obj/random shall spawn heaviest item" + name = "OVERRIDE: obj/random shall spawn heaviest item" /datum/unit_test/override/obj_random_shall_spawn_heaviest_item/start_test() global.unit_test_last_obj_random_creation = null @@ -22,7 +22,7 @@ return 1 /datum/unit_test/override/atom_creator_simple_shall_always_spawn - name = "OVERRIDE - /datum/atom_creator/simple shall always spawn" + name = "OVERRIDE: /datum/atom_creator/simple shall always spawn" /datum/unit_test/override/atom_creator_simple_shall_always_spawn/start_test() var/datum/atom_creator/simple/S = new/datum/atom_creator/simple(/obj/unit_test_light, 1) @@ -40,7 +40,7 @@ return 1 /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest - name = "OVERRIDE - /datum/atom_creator/weighted shall spawn heaviest" + name = "OVERRIDE: /datum/atom_creator/weighted shall spawn heaviest" /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest/start_test() var/datum/atom_creator/weighted/W = new/datum/atom_creator/weighted(list(/obj/unit_test_light = 9001, /obj/unit_test_heavy = 1)) @@ -57,7 +57,7 @@ return 1 /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest_recursive - name = "OVERRIDE - /datum/atom_creator/weighted shall spawn heaviest - Recursive" + name = "OVERRIDE: /datum/atom_creator/weighted shall spawn heaviest - Recursive" /datum/unit_test/override/atom_creator_weighted_shall_spawn_heaviest_recursive/start_test() var/datum/atom_creator/weighted/W = new/datum/atom_creator/weighted( diff --git a/code/unit_tests/proximity_tests.dm b/code/unit_tests/proximity_tests.dm index b77946ec739..b405a2c3db2 100644 --- a/code/unit_tests/proximity_tests.dm +++ b/code/unit_tests/proximity_tests.dm @@ -2,7 +2,7 @@ * Template Setup * *****************/ /datum/unit_test/proximity - template = /datum/unit_test/proximity + abstract_type = /datum/unit_test/proximity var/turf/wall/wall var/obj/proximity_listener/proximity_listener @@ -24,7 +24,7 @@ wall.set_opacity(opacity) /datum/unit_test/proximity/visibility - template = /datum/unit_test/proximity/visibility + abstract_type = /datum/unit_test/proximity/visibility var/list/expected_number_of_turfs_by_trigger_type /datum/unit_test/proximity/visibility/start_test() diff --git a/code/unit_tests/subsystem_tests.dm b/code/unit_tests/subsystem_tests.dm index 95224a7050b..114dcb1a48c 100644 --- a/code/unit_tests/subsystem_tests.dm +++ b/code/unit_tests/subsystem_tests.dm @@ -1,5 +1,5 @@ /datum/unit_test/subsystem_atom_shall_have_no_bad_init_calls - name = "SUBSYSTEM - ATOMS: Shall have no bad init calls" + name = "SUBSYSTEM: ATOMS: Shall have no bad init calls" /datum/unit_test/subsystem_atom_shall_have_no_bad_init_calls/start_test() if(SSatoms.BadInitializeCalls.len) @@ -10,7 +10,7 @@ return 1 /datum/unit_test/subsystem_shall_be_initialized - name = "SUBSYSTEM - INIT: Subsystems shall be initalized" + name = "SUBSYSTEM: INIT: Subsystems shall be initalized" /datum/unit_test/subsystem_shall_be_initialized/start_test() var/list/bad_subsystems = list() @@ -28,7 +28,7 @@ return 1 /datum/unit_test/all_atoms_shall_be_initialized - name = "SUBSYSTEM - ATOMS: All atoms shall be initialized." + name = "SUBSYSTEM: ATOMS: All atoms shall be initialized." /datum/unit_test/all_atoms_shall_be_initialized/start_test() set background = TRUE // avoid infinite loop warning; SS will still wait for us. diff --git a/code/unit_tests/time_tests.dm b/code/unit_tests/time_tests.dm index 8f700ed2d13..55a17518a60 100644 --- a/code/unit_tests/time_tests.dm +++ b/code/unit_tests/time_tests.dm @@ -1,9 +1,9 @@ /datum/unit_test/time - name = "TIME - Template" - template = /datum/unit_test/time + name = "TIME: Template" + abstract_type = /datum/unit_test/time /datum/unit_test/time/shall_validate_sixth_of_june - name = "Shall validate 6th of June" + name = "TIME: Shall validate 6th of June" /datum/unit_test/time/shall_validate_sixth_of_june/start_test() var/datum/is_date/day/D = new(6, 6) @@ -15,7 +15,7 @@ return TRUE /datum/unit_test/time/shall_not_validate_not_sixth_of_june - name = "Shall not validate not-6th of June" + name = "TIME: Shall not validate not-6th of June" /datum/unit_test/time/shall_not_validate_not_sixth_of_june/start_test() var/datum/is_date/day/D = new(1, 1) @@ -26,10 +26,10 @@ qdel(D) return TRUE -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_before_end - name = "Shall be able to validate range that include 6th of June - Start before End" +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_before_end + name = "TIME: Shall be able to validate range that include 6th of June - Start before End" -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_before_end/start_test() +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_before_end/start_test() var/datum/is_date/range/R = new(5, 5, 7, 7) if(R.IsValid()) pass("Validation succeeded") @@ -38,10 +38,10 @@ qdel(R) return TRUE -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_after_end - name = "Shall be able to validate range that include 6th of June - Start after End" +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_after_end + name = "TIME: Shall be able to validate range that include 6th of June - Start after End" -/datum/unit_test/time/shall_validate_range_that_include_sixt_of_june_start_after_end/start_test() +/datum/unit_test/time/shall_validate_range_that_include_sixth_of_june_start_after_end/start_test() var/datum/is_date/range/R = new(8, 8, 7, 7) if(R.IsValid()) pass("Validation succeeded") @@ -50,10 +50,10 @@ qdel(R) return TRUE -/datum/unit_test/time/shall_not_validate_range_that_exlude_sixt_of_june_start_before_end - name = "Shall not validate range that exlude 6th of June - Start before End" +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_before_end + name = "TIME: Shall not validate range that exclude 6th of June - Start before End" -/datum/unit_test/time/shall_not_validate_range_that_exlude_sixt_of_june_start_before_end/start_test() +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_before_end/start_test() var/datum/is_date/range/R = new(7, 7, 8, 8) if(R.IsValid()) fail("Unexpected validation") @@ -62,10 +62,10 @@ qdel(R) return TRUE -/datum/unit_test/time/shall_not_validate_range_that_exclude_sixt_of_june_start_after_end - name = "Shall not validate range that exlude 6th of June - Start after End" +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_after_end + name = "TIME: Shall not validate range that exclude 6th of June - Start after End" -/datum/unit_test/time/shall_not_validate_range_that_exclude_sixt_of_june_start_after_end/start_test() +/datum/unit_test/time/shall_not_validate_range_that_exclude_sixth_of_june_start_after_end/start_test() var/datum/is_date/range/R = new(7, 7, 5, 5) if(R.IsValid()) fail("Unexpected validation") diff --git a/code/unit_tests/turf_icons.dm b/code/unit_tests/turf_icons.dm index e0b6a7e17ae..3319864ee2a 100644 --- a/code/unit_tests/turf_icons.dm +++ b/code/unit_tests/turf_icons.dm @@ -8,8 +8,7 @@ /turf/unsimulated ) var/list/excepted_types = list( - /turf/unsimulated/map, - /turf/unsimulated/wall/cascade + /turf/unsimulated/map ) /datum/unit_test/turf_floor_icons_shall_be_valid/setup_test() @@ -127,15 +126,22 @@ ) /turf/wall/proc/get_turf_validation_corner_states() - . = list("", "other") - if(paint_color) + . = list("") + if(!material) + CRASH("[type] lacks a material!") + if(material?.wall_flags & WALL_HAS_EDGES) + . |= "other" + if(paint_color || (material?.wall_flags & PAINT_PAINTABLE)) . |= "paint" - if(stripe_color) + if(stripe_color || (material?.wall_flags & PAINT_STRIPABLE)) . |= "stripe" /turf/wall/natural/get_turf_validation_corner_states() return list("", "shine") +/turf/wall/log/get_turf_validation_corner_states() + return list("", "other") + /turf/wall/validate_turf() // Walls generate their own icons, icon/icon_state are largely irrelevant other than map previews. diff --git a/code/unit_tests/unique_tests.dm b/code/unit_tests/unique_tests.dm index 2d23719ea30..cef4aba20aa 100644 --- a/code/unit_tests/unique_tests.dm +++ b/code/unit_tests/unique_tests.dm @@ -9,7 +9,7 @@ var/list/possible_cable_colours = get_global_cable_colors() for(var/color_name in possible_cable_colours) group_by(names, color_name, index) - group_by(colors, possible_cable_colours[color_name], index) + group_by(colors, possible_cable_colours[color_name], color_name) index++ var/number_of_issues = number_of_issues(names, "Names") @@ -207,26 +207,6 @@ pass("All gas symbols are unique.") return TRUE -/datum/unit_test/submaps_shall_have_a_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() - - var/list/all_submaps = decls_repository.get_decls_of_subtype(/decl/submap_archetype) - for(var/submap_type in all_submaps) - var/decl/submap_archetype/submap = all_submaps[submap_type] - if(submap.descriptor) - group_by(submaps_by_name, submap.descriptor, submap_type) - - var/number_of_issues = number_of_issues(submaps_by_name, "Submap Archetype Descriptors") - if(length(number_of_issues)) - fail("Found [number_of_issues] submap archetype\s with duplicate descriptors.") - else - pass("All submap archetypes have unique descriptors.") - return 1 - - /datum/unit_test/proc/number_of_issues(var/list/entries, var/type, var/feedback = /decl/noi_feedback) var/issues = 0 for(var/key in entries) diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index 4fe4fedfdc5..24fd800c854 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -4,7 +4,7 @@ * For the most part I think any test can be created that doesn't require a client in a mob or require a game mode other then extended * * The easiest way to make effective tests is to create a "template" if you intend to run the same test over and over and make your actual - * tests be a "child object" of those templates. Be sure and name your templates with the word "template" somewhere in var/name. + * tests be a "child object" of those templates. Be sure to set abstract_type on your template type. * * The goal is to have all sorts of tests that run and to run them as quickly as possible. * @@ -51,8 +51,8 @@ var/global/ascii_reset = "[ascii_esc]\[0m" // Templates aren't intended to be ran but just serve as a way to create child objects of it with inheritable tests for quick test creation. /datum/unit_test + abstract_type = /datum/unit_test var/name = "template - should not be ran." - var/template // Treat the unit test as a template if its type is the same as the value of this var var/disabled = 0 // If we want to keep a unit test in the codebase but not run it for some reason. var/async = 0 // If the check can be left to do it's own thing, you must define a check_result() proc if you use this. var/reported = 0 // If it's reported a success or failure. Any tests that have not are assumed to be failures. @@ -157,11 +157,10 @@ var/global/ascii_reset = "[ascii_esc]\[0m" /proc/get_test_datums() . = list() - for(var/test in subtypesof(/datum/unit_test)) - var/datum/unit_test/d = test - if(test == initial(d.template)) + for(var/datum/unit_test/test as anything in subtypesof(/datum/unit_test)) + if(TYPE_IS_ABSTRACT(test)) continue - . += d + . += test /proc/do_unit_test(datum/unit_test/test, end_time, skip_disabled_tests = TRUE) if(test.disabled && skip_disabled_tests) diff --git a/code/unit_tests/virtual_mob_tests.dm b/code/unit_tests/virtual_mob_tests.dm index 2a7eb99d0da..718bf010748 100644 --- a/code/unit_tests/virtual_mob_tests.dm +++ b/code/unit_tests/virtual_mob_tests.dm @@ -1,10 +1,10 @@ /datum/unit_test/virtual - name = "VIRTUAL - Template" - template = /datum/unit_test/virtual + name = "VIRTUAL: Template" + abstract_type = /datum/unit_test/virtual /datum/unit_test/virtual/helper - name = "VIRTUAL - Template Helper" - template = /datum/unit_test/virtual/helper + name = "VIRTUAL: Template Helper" + abstract_type = /datum/unit_test/virtual/helper var/helper_proc var/list/expected_mobs @@ -45,14 +45,14 @@ return TRUE /datum/unit_test/virtual/helper/check_hearers_in_range - name = "VIRTUAL - Helper Test - Check Hearers In Range" + name = "VIRTUAL: Helper Test - Check Hearers In Range" helper_proc = /proc/hearers_in_range /datum/unit_test/virtual/helper/check_hearers_in_range/standard_setup() ..() expected_mobs = list(mob_one, mob_two, mob_three) /datum/unit_test/virtual/helper/check_hearers_in_range_with_mob_inside_storage - name = "VIRTUAL - Helper Test - Check Hearers In Range - With Mob Inside Storage" + name = "VIRTUAL: Helper Test - Check Hearers In Range - With Mob Inside Storage" helper_proc = /proc/hearers_in_range var/obj/storage /datum/unit_test/virtual/helper/check_hearers_in_range_with_mob_inside_storage/standard_setup() @@ -65,35 +65,35 @@ . = ..() /datum/unit_test/virtual/helper/check_viewers_in_range - name = "VIRTUAL - Helper Test - Check Viewers In Range" + name = "VIRTUAL: Helper Test - Check Viewers In Range" helper_proc = /proc/viewers_in_range /datum/unit_test/virtual/helper/check_viewers_in_range/standard_setup() ..() expected_mobs = list(mob_one, mob_two, mob_three) /datum/unit_test/virtual/helper/check_all_hearers - name = "VIRTUAL - Helper Test - Check All Hearers" + name = "VIRTUAL: Helper Test - Check All Hearers" helper_proc = /proc/all_hearers /datum/unit_test/virtual/helper/check_all_hearers/standard_setup() ..() expected_mobs = list(mob_one, mob_two) /datum/unit_test/virtual/helper/check_all_viewers - name = "VIRTUAL - Helper Test - Check All Viewers" + name = "VIRTUAL: Helper Test - Check All Viewers" helper_proc = /proc/all_viewers /datum/unit_test/virtual/helper/check_all_viewers/standard_setup() ..() expected_mobs = list(mob_one, mob_two) /datum/unit_test/virtual/helper/check_mobs_in_viewing_range - name = "VIRTUAL - Helper Test - Check Mobs In Viewing Range" + name = "VIRTUAL: Helper Test - Check Mobs In Viewing Range" helper_proc = /proc/hosts_in_view_range /datum/unit_test/virtual/helper/check_mobs_in_viewing_range/standard_setup() ..() expected_mobs = list(mob_one, mob_two) /datum/unit_test/virtual/helper/check_hosts_in_view_range_with_mob_inside_object - name = "VIRTUAL - Helper Test - Check Hosts in View Range - With Mob Inside Object" + name = "VIRTUAL: Helper Test - Check Hosts in View Range - With Mob Inside Object" helper_proc = /proc/hosts_in_view_range var/obj/storage /datum/unit_test/virtual/helper/check_hosts_in_view_range_with_mob_inside_object/standard_setup() diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index b83f880bff9..7866c78bd62 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -12,7 +12,7 @@ /datum/unit_test/zas_area_test name = "ZAS: Area Test Template" - template = /datum/unit_test/zas_area_test + abstract_type = /datum/unit_test/zas_area_test var/area_path = null // Put the area you are testing here. var/expectation = UT_NORMAL // See defines above. diff --git a/code/unit_tests/~unit_test_subsystems.dm b/code/unit_tests/~unit_test_subsystems.dm index 23d8aab1d0b..eea8a75f692 100644 --- a/code/unit_tests/~unit_test_subsystems.dm +++ b/code/unit_tests/~unit_test_subsystems.dm @@ -31,6 +31,12 @@ SUBSYSTEM_DEF(unit_tests) #endif log_unit_test("Initializing Unit Testing") + // Misc validation. + if(istype(global.using_map)) + global.using_map.validate() + else + log_error("global.using_map is null or invalid!") + // //Start the Round. // diff --git a/code/world.dm b/code/world.dm index 361fa6c4a15..057199cfb0a 100644 --- a/code/world.dm +++ b/code/world.dm @@ -12,6 +12,9 @@ hub = "Exadv1.spacestation13" icon_size = WORLD_ICON_SIZE fps = 20 -#ifdef GC_FAILURE_HARD_LOOKUP +#ifdef FIND_REF_NO_CHECK_TICK +#pragma push +#pragma ignore loop_checks loop_checks = FALSE +#pragma pop #endif diff --git a/config/example/configuration.txt b/config/example/configuration.txt index 4b34dd2f6f4..38ac928c783 100644 --- a/config/example/configuration.txt +++ b/config/example/configuration.txt @@ -345,22 +345,19 @@ ROUNDSTART_LEVEL_GENERATION ## 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. +## Remove the # to make rounds which end instantly 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 ["crossfire","cult","extended","heist","mercenary","ninja","revolution","spyvspy","traitor","wizard"] +MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","spyvspy","traitor"] ## Mode names. -MODE_NAMES {"calamity":"Calamity","extended":"Extended","mercenary":"Mercenary","wizard":"Wizard","cult":"Cult","heist":"Heist","ninja":"Ninja","revolution":"Revolution","traitor":"Traitor","spyvspy":"Spy v. spy","crossfire":"Crossfire"} +MODE_NAMES {"calamity":"Calamity","extended":"Extended","mercenary":"Mercenary","cult":"Cult","heist":"Heist","ninja":"Ninja","revolution":"Revolution","traitor":"Traitor","spyvspy":"Spy v. spy","crossfire":"Crossfire"} ## Relative probability of each mode. -PROBABILITIES {"calamity":0,"extended":1,"mercenary":1,"wizard":1,"cult":0,"heist":0,"ninja":0,"revolution":0,"traitor":1,"spyvspy":0,"crossfire":0} +PROBABILITIES {"calamity":0,"extended":1,"mercenary":1,"cult":0,"heist":0,"ninja":0,"revolution":0,"traitor":1,"spyvspy":0,"crossfire":0} ## If security is prohibited from being most antagonists. Uncomment to enable. #PROTECT_ROLES_FROM_ANTAGONIST @@ -369,7 +366,7 @@ PROBABILITIES {"calamity":0,"extended":1,"mercenary":1,"wizard":1,"cult":0,"heis TRAITOR_SCALING ## A list of modes that should be votable. -VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","secret","spyvspy","traitor","wizard"] +VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolution","secret","spyvspy","traitor"] ## # PROTECTED @@ -377,13 +374,13 @@ VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolu ## ## Password used for authorizing external tools that can apply bans. -#BAN_COMMS_PASSWORD +#BAN_COMMS_PASSWORD ## Password used for authorizing ircbot and other external tools. -#COMMS_PASSWORD +#COMMS_PASSWORD ## Export address where external tools that monitor logins are located. -#LOGIN_EXPORT_ADDR +#LOGIN_EXPORT_ADDR ## # RESOURCES @@ -413,7 +410,7 @@ VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolu #ABANDON_ALLOWED 1 ## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. -#ADMIN_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 @@ -431,7 +428,7 @@ VOTABLE_MODES ["crossfire","cult","extended","heist","mercenary","ninja","revolu #AOOC_ALLOWED 1 ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -#BANAPPEALS +#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 @@ -452,7 +449,7 @@ CHARACTER_SLOTS 40 #DISABLE_WEBHOOK_EMBEDS ## Discord server permanent invite address. -#DISCORDURL +#DISCORDURL ## Comment to disable the dead OOC channel by default. #DOOC_ALLOWED 1 @@ -473,20 +470,20 @@ CHARACTER_SLOTS 40 #FORBID_SINGULO_POSSESSION ## Discussion forum address. -#FORUMURL +#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 +#GITHUBURL ## Determines whether or not people without a registered ckey (i.e. guest-*) can connect to your server. Uncomment to enable. #GUESTS_ALLOWED ## Set a hosted by name for UNIX platforms. -#HOSTEDBY +#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 @@ -495,7 +492,7 @@ CHARACTER_SLOTS 40 #IRC_BOT_HOST localhost ## GitHub new issue address. -#ISSUEREPORTURL +#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 @@ -554,11 +551,11 @@ LOADOUT_SLOTS 4 RESPAWN_DELAY 5 ## Set a server location for world reboot. Don't include the byond://, just give the address and port. -#SERVER +#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 +#SERVERURL ## Server name: This appears at the top of the screen in-game. SERVER_NAME Space Station 13: Polaris @@ -594,7 +591,7 @@ USEALIENWHITELIST #WAIT_FOR_SIGUSR1_REBOOT ## Wiki address. -#WIKIURL +#WIKIURL ## # VOTING diff --git a/html/changelog.html b/html/changelog.html index c693f51951e..8e46ecdab25 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,83 @@ -->
    +

    22 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • Swords on Shaded Hills can be sharpened using whetstones or grindstones.
    • +
    • Guns can now be fired from rigs regardless of dexterity.
    • +
    + +

    21 January 2025

    +

    Penelope Haze updated:

    +
      +
    • Mud can now receive footprints with any reagent other than mud. No more conspicuously missing bloody footprints!
    • +
    + +

    19 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • Intents have been rewritten and moved, please report any issues with intent selection.
    • +
    + +

    16 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • The White and Minimalist HUD styles can now be customised to use a specific overlay color.
    • +
    • The Shaded Hills river now flows north.
    • +
    • Snow, mud and sand will now show footprints.
    • +
    + +

    15 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • The way you interact with barrels and well has been significantly reworked; clicking with a bucket or tool should give a list of options to pick from. Please report bugs with this on the tracker.
    • +
    + +

    08 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • Mud and blood can now leave footprints.
    • +
    + +

    03 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • Raw plant oil no longer works as lantern fuel; it must be mixed with powdered graphite first.
    • +
    + +

    23 December 2024

    +

    ophelia v0.8 updated:

    +
      +
    • added new dirt and mud tile sprites
    • +
    • added new wooden chest sprites, by Doe
    • +
    • mud and soil plots are now properly greyscaled to soil material color
    • +
    + +

    21 December 2024

    +

    Penelope Haze updated:

    +
      +
    • Makes weather effects slightly more transparent.
    • +
    + +

    07 December 2024

    +

    MistakeNot4892 updated:

    +
      +
    • Most wooden floors and tables on space maps are now chipboard laminate instead.
    • +
    + +

    05 December 2024

    +

    ophelia updated:

    +
      +
    • You can now put any disk into the research design database or research design console, but only the correct disk type (tech disk or design disk) will function.
    • +
    + +

    18 November 2024

    +

    MistakeNot4892 updated:

    +
      +
    • Swapped barrel icons out for Doe's much nicer barrels.
    • +
    +

    13 November 2024

    Penelope Haze updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 74940df8c73..20e1bd55f28 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14921,3 +14921,53 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Crayons are now slowly used up while writing on paper, at a rate of one charge per 25 characters. (Crayons have a default of 30 charges.) - tweak: Added new furniture to the Shaded Hills inn. +2024-11-18: + MistakeNot4892: + - tweak: Swapped barrel icons out for Doe's much nicer barrels. +2024-12-05: + ophelia: + - tweak: You can now put any disk into the research design database or research + design console, but only the correct disk type (tech disk or design disk) will + function. +2024-12-07: + MistakeNot4892: + - tweak: Most wooden floors and tables on space maps are now chipboard laminate + instead. +2024-12-21: + Penelope Haze: + - tweak: Makes weather effects slightly more transparent. +2024-12-23: + ophelia v0.8: + - imageadd: added new dirt and mud tile sprites + - imageadd: added new wooden chest sprites, by Doe + - tweak: mud and soil plots are now properly greyscaled to soil material color +2025-01-03: + MistakeNot4892: + - tweak: Raw plant oil no longer works as lantern fuel; it must be mixed with powdered + graphite first. +2025-01-08: + MistakeNot4892: + - tweak: Mud and blood can now leave footprints. +2025-01-15: + MistakeNot4892: + - tweak: The way you interact with barrels and well has been significantly reworked; + clicking with a bucket or tool should give a list of options to pick from. Please + report bugs with this on the tracker. +2025-01-16: + MistakeNot4892: + - tweak: The White and Minimalist HUD styles can now be customised to use a specific + overlay color. + - tweak: The Shaded Hills river now flows north. + - tweak: Snow, mud and sand will now show footprints. +2025-01-19: + MistakeNot4892: + - tweak: Intents have been rewritten and moved, please report any issues with intent + selection. +2025-01-21: + Penelope Haze: + - tweak: Mud can now receive footprints with any reagent other than mud. No more + conspicuously missing bloody footprints! +2025-01-22: + MistakeNot4892: + - tweak: Swords on Shaded Hills can be sharpened using whetstones or grindstones. + - tweak: Guns can now be fired from rigs regardless of dexterity. diff --git a/icons/clothing/accessories/jewelry/locket.dmi b/icons/clothing/accessories/jewelry/locket.dmi deleted file mode 100644 index eeee8efe7ea..00000000000 Binary files a/icons/clothing/accessories/jewelry/locket.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/necklace.dmi b/icons/clothing/accessories/jewelry/necklace.dmi index 23c9eee0063..2f5ca2d3cfb 100644 Binary files a/icons/clothing/accessories/jewelry/necklace.dmi and b/icons/clothing/accessories/jewelry/necklace.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/cross.dmi b/icons/clothing/accessories/jewelry/pendants/cross.dmi new file mode 100644 index 00000000000..ca9d50a60f0 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/cross.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/crystal.dmi b/icons/clothing/accessories/jewelry/pendants/crystal.dmi new file mode 100644 index 00000000000..a54525da6ab Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/crystal.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/diamond.dmi b/icons/clothing/accessories/jewelry/pendants/diamond.dmi new file mode 100644 index 00000000000..44e931a658d Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/diamond.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/frill.dmi b/icons/clothing/accessories/jewelry/pendants/frill.dmi new file mode 100644 index 00000000000..97891de4bc3 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/frill.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/locket.dmi b/icons/clothing/accessories/jewelry/pendants/locket.dmi new file mode 100644 index 00000000000..e8f1bbee40b Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/locket.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/ornate.dmi b/icons/clothing/accessories/jewelry/pendants/ornate.dmi new file mode 100644 index 00000000000..9e6901f4e29 Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/ornate.dmi differ diff --git a/icons/clothing/accessories/jewelry/pendants/square.dmi b/icons/clothing/accessories/jewelry/pendants/square.dmi new file mode 100644 index 00000000000..5c9040c7baa Binary files /dev/null and b/icons/clothing/accessories/jewelry/pendants/square.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring.dmi b/icons/clothing/accessories/jewelry/rings/ring.dmi deleted file mode 100644 index 5a116c6c820..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band.dmi b/icons/clothing/accessories/jewelry/rings/ring_band.dmi new file mode 100644 index 00000000000..b8f40338dcc Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi new file mode 100644 index 00000000000..fb29ccae72a Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band_split.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi new file mode 100644 index 00000000000..93a83527a24 Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band_thick.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi b/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi new file mode 100644 index 00000000000..83c9b2ced56 Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_band_thin.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_blue.dmi b/icons/clothing/accessories/jewelry/rings/ring_blue.dmi deleted file mode 100644 index e607595960f..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_blue.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_cti.dmi b/icons/clothing/accessories/jewelry/rings/ring_cti.dmi deleted file mode 100644 index 6acd9239cbd..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_cti.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi b/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi deleted file mode 100644 index e05fcffea0f..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_diamond.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_magic.dmi b/icons/clothing/accessories/jewelry/rings/ring_magic.dmi deleted file mode 100644 index 885a1d75314..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_magic.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_mariner.dmi b/icons/clothing/accessories/jewelry/rings/ring_mariner.dmi deleted file mode 100644 index 32a6a93b5e9..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_mariner.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal.dmi new file mode 100644 index 00000000000..620206a28cb Binary files /dev/null and b/icons/clothing/accessories/jewelry/rings/ring_seal.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi index 12fc05d63a0..c2efcfd5c18 100644 Binary files a/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi and b/icons/clothing/accessories/jewelry/rings/ring_seal_masonic.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi deleted file mode 100644 index bddad5ae758..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_seal_secgen.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi b/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi index 63eaa34ef64..e6145d53c50 100644 Binary files a/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi and b/icons/clothing/accessories/jewelry/rings/ring_seal_signet.dmi differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi b/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi deleted file mode 100644 index 43542dbc982..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_shadow.dmi and /dev/null differ diff --git a/icons/clothing/accessories/jewelry/rings/ring_star.dmi b/icons/clothing/accessories/jewelry/rings/ring_star.dmi deleted file mode 100644 index 4308da7ff6f..00000000000 Binary files a/icons/clothing/accessories/jewelry/rings/ring_star.dmi and /dev/null differ diff --git a/mods/content/corporate/icons/rigs/asset_protection/boots.dmi b/icons/clothing/rigs/ert/asset_protection/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/boots.dmi rename to icons/clothing/rigs/ert/asset_protection/boots.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/chest.dmi b/icons/clothing/rigs/ert/asset_protection/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/chest.dmi rename to icons/clothing/rigs/ert/asset_protection/chest.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/gloves.dmi b/icons/clothing/rigs/ert/asset_protection/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/gloves.dmi rename to icons/clothing/rigs/ert/asset_protection/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/helmet.dmi b/icons/clothing/rigs/ert/asset_protection/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/helmet.dmi rename to icons/clothing/rigs/ert/asset_protection/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/asset_protection/rig.dmi b/icons/clothing/rigs/ert/asset_protection/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/asset_protection/rig.dmi rename to icons/clothing/rigs/ert/asset_protection/rig.dmi diff --git a/mods/content/corporate/icons/rigs/commander/boots.dmi b/icons/clothing/rigs/ert/commander/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/boots.dmi rename to icons/clothing/rigs/ert/commander/boots.dmi diff --git a/mods/content/corporate/icons/rigs/commander/chest.dmi b/icons/clothing/rigs/ert/commander/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/chest.dmi rename to icons/clothing/rigs/ert/commander/chest.dmi diff --git a/mods/content/corporate/icons/rigs/commander/gloves.dmi b/icons/clothing/rigs/ert/commander/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/gloves.dmi rename to icons/clothing/rigs/ert/commander/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/commander/helmet.dmi b/icons/clothing/rigs/ert/commander/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/helmet.dmi rename to icons/clothing/rigs/ert/commander/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/commander/rig.dmi b/icons/clothing/rigs/ert/commander/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/commander/rig.dmi rename to icons/clothing/rigs/ert/commander/rig.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/boots.dmi b/icons/clothing/rigs/ert/engineer/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/boots.dmi rename to icons/clothing/rigs/ert/engineer/boots.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/chest.dmi b/icons/clothing/rigs/ert/engineer/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/chest.dmi rename to icons/clothing/rigs/ert/engineer/chest.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/gloves.dmi b/icons/clothing/rigs/ert/engineer/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/gloves.dmi rename to icons/clothing/rigs/ert/engineer/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/helmet.dmi b/icons/clothing/rigs/ert/engineer/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/helmet.dmi rename to icons/clothing/rigs/ert/engineer/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/engineer/rig.dmi b/icons/clothing/rigs/ert/engineer/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/engineer/rig.dmi rename to icons/clothing/rigs/ert/engineer/rig.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/boots.dmi b/icons/clothing/rigs/ert/janitor/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/boots.dmi rename to icons/clothing/rigs/ert/janitor/boots.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/chest.dmi b/icons/clothing/rigs/ert/janitor/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/chest.dmi rename to icons/clothing/rigs/ert/janitor/chest.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/gloves.dmi b/icons/clothing/rigs/ert/janitor/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/gloves.dmi rename to icons/clothing/rigs/ert/janitor/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/helmet.dmi b/icons/clothing/rigs/ert/janitor/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/helmet.dmi rename to icons/clothing/rigs/ert/janitor/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/janitor/rig.dmi b/icons/clothing/rigs/ert/janitor/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/janitor/rig.dmi rename to icons/clothing/rigs/ert/janitor/rig.dmi diff --git a/mods/content/corporate/icons/rigs/medic/boots.dmi b/icons/clothing/rigs/ert/medic/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/boots.dmi rename to icons/clothing/rigs/ert/medic/boots.dmi diff --git a/mods/content/corporate/icons/rigs/medic/chest.dmi b/icons/clothing/rigs/ert/medic/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/chest.dmi rename to icons/clothing/rigs/ert/medic/chest.dmi diff --git a/mods/content/corporate/icons/rigs/medic/gloves.dmi b/icons/clothing/rigs/ert/medic/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/gloves.dmi rename to icons/clothing/rigs/ert/medic/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/medic/helmet.dmi b/icons/clothing/rigs/ert/medic/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/helmet.dmi rename to icons/clothing/rigs/ert/medic/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/medic/rig.dmi b/icons/clothing/rigs/ert/medic/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/medic/rig.dmi rename to icons/clothing/rigs/ert/medic/rig.dmi diff --git a/mods/content/corporate/icons/rigs/security/boots.dmi b/icons/clothing/rigs/ert/security/boots.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/boots.dmi rename to icons/clothing/rigs/ert/security/boots.dmi diff --git a/mods/content/corporate/icons/rigs/security/chest.dmi b/icons/clothing/rigs/ert/security/chest.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/chest.dmi rename to icons/clothing/rigs/ert/security/chest.dmi diff --git a/mods/content/corporate/icons/rigs/security/gloves.dmi b/icons/clothing/rigs/ert/security/gloves.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/gloves.dmi rename to icons/clothing/rigs/ert/security/gloves.dmi diff --git a/mods/content/corporate/icons/rigs/security/helmet.dmi b/icons/clothing/rigs/ert/security/helmet.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/helmet.dmi rename to icons/clothing/rigs/ert/security/helmet.dmi diff --git a/mods/content/corporate/icons/rigs/security/rig.dmi b/icons/clothing/rigs/ert/security/rig.dmi similarity index 100% rename from mods/content/corporate/icons/rigs/security/rig.dmi rename to icons/clothing/rigs/ert/security/rig.dmi diff --git a/icons/clothing/spacesuit/void/medical_alt/suit.dmi b/icons/clothing/spacesuit/void/medical_alt/suit.dmi index 77b79193e46..634b6742079 100644 Binary files a/icons/clothing/spacesuit/void/medical_alt/suit.dmi and b/icons/clothing/spacesuit/void/medical_alt/suit.dmi differ diff --git a/icons/clothing/suits/sleeved_robe.dmi b/icons/clothing/suits/sleeved_robe.dmi new file mode 100644 index 00000000000..6895f94a926 Binary files /dev/null and b/icons/clothing/suits/sleeved_robe.dmi differ diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index e1966e9bb5a..3642e8ed8f4 100644 Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 78c4315424a..5502343f0d5 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/hay.dmi b/icons/effects/hay.dmi new file mode 100644 index 00000000000..47c16d24770 Binary files /dev/null and b/icons/effects/hay.dmi differ diff --git a/icons/effects/landmarks.dmi b/icons/effects/landmarks.dmi index 7c5729455bf..28317726409 100644 Binary files a/icons/effects/landmarks.dmi and b/icons/effects/landmarks.dmi differ diff --git a/icons/effects/liquids.dmi b/icons/effects/liquids.dmi index 965e319bc4a..7cdf5d1b006 100644 Binary files a/icons/effects/liquids.dmi and b/icons/effects/liquids.dmi differ diff --git a/icons/effects/mouse_pointers/examine_pointer.dmi b/icons/effects/mouse_pointers/examine_pointer.dmi index 41a9cec13b0..a565a554fa7 100644 Binary files a/icons/effects/mouse_pointers/examine_pointer.dmi and b/icons/effects/mouse_pointers/examine_pointer.dmi differ diff --git a/icons/effects/projectiles/trail.dmi b/icons/effects/projectiles/trail.dmi new file mode 100644 index 00000000000..4e058a3f1bf Binary files /dev/null and b/icons/effects/projectiles/trail.dmi differ diff --git a/icons/effects/weather.dmi b/icons/effects/weather.dmi index 01aa9d456f4..aa4438a638d 100644 Binary files a/icons/effects/weather.dmi and b/icons/effects/weather.dmi differ diff --git a/icons/mob/footprints/footprints.dmi b/icons/mob/footprints/footprints.dmi new file mode 100644 index 00000000000..2d9699e82c8 Binary files /dev/null and b/icons/mob/footprints/footprints.dmi differ diff --git a/icons/mob/footprints/footprints_paw.dmi b/icons/mob/footprints/footprints_paw.dmi new file mode 100644 index 00000000000..08fac62a016 Binary files /dev/null and b/icons/mob/footprints/footprints_paw.dmi differ diff --git a/icons/mob/footprints/footprints_snake.dmi b/icons/mob/footprints/footprints_snake.dmi new file mode 100644 index 00000000000..6e913803eb1 Binary files /dev/null and b/icons/mob/footprints/footprints_snake.dmi differ diff --git a/icons/mob/footprints/footprints_trail.dmi b/icons/mob/footprints/footprints_trail.dmi new file mode 100644 index 00000000000..944ed4e175b Binary files /dev/null and b/icons/mob/footprints/footprints_trail.dmi differ diff --git a/icons/mob/footprints/footprints_wheelchair.dmi b/icons/mob/footprints/footprints_wheelchair.dmi new file mode 100644 index 00000000000..4a2e800cf76 Binary files /dev/null and b/icons/mob/footprints/footprints_wheelchair.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi deleted file mode 100644 index ed608471041..00000000000 Binary files a/icons/mob/hud.dmi and /dev/null differ diff --git a/icons/mob/hud_med.dmi b/icons/mob/hud_med.dmi deleted file mode 100644 index 705886a5490..00000000000 Binary files a/icons/mob/hud_med.dmi and /dev/null differ diff --git a/icons/mob/screen/abilities.dmi b/icons/mob/screen/abilities.dmi new file mode 100644 index 00000000000..ca7d904bd71 Binary files /dev/null and b/icons/mob/screen/abilities.dmi differ diff --git a/icons/mob/screen/ability_inhand.dmi b/icons/mob/screen/ability_inhand.dmi new file mode 100644 index 00000000000..63e1b630dc0 Binary files /dev/null and b/icons/mob/screen/ability_inhand.dmi differ diff --git a/icons/mob/screen/phenomena.dmi b/icons/mob/screen/phenomena.dmi deleted file mode 100644 index f1d05fa9730..00000000000 Binary files a/icons/mob/screen/phenomena.dmi and /dev/null differ diff --git a/icons/mob/screen/spells.dmi b/icons/mob/screen/spells.dmi deleted file mode 100644 index d574921544d..00000000000 Binary files a/icons/mob/screen/spells.dmi and /dev/null differ diff --git a/icons/mob/screen/styles/intents.dmi b/icons/mob/screen/styles/intents.dmi deleted file mode 100644 index 3c26214b74e..00000000000 Binary files a/icons/mob/screen/styles/intents.dmi and /dev/null differ diff --git a/icons/mob/screen/styles/minimalist/attack_selector.dmi b/icons/mob/screen/styles/minimalist/attack_selector.dmi index c5a7e57c522..2e3d66fd059 100644 Binary files a/icons/mob/screen/styles/minimalist/attack_selector.dmi and b/icons/mob/screen/styles/minimalist/attack_selector.dmi differ diff --git a/icons/mob/screen/styles/minimalist/fire_intent.dmi b/icons/mob/screen/styles/minimalist/fire_intent.dmi index 62efd8ca867..02a311ec4e8 100644 Binary files a/icons/mob/screen/styles/minimalist/fire_intent.dmi and b/icons/mob/screen/styles/minimalist/fire_intent.dmi differ diff --git a/icons/mob/screen/styles/minimalist/hands.dmi b/icons/mob/screen/styles/minimalist/hands.dmi index 28264b0635f..05840e72af8 100644 Binary files a/icons/mob/screen/styles/minimalist/hands.dmi and b/icons/mob/screen/styles/minimalist/hands.dmi differ diff --git a/icons/mob/screen/styles/minimalist/intents.dmi b/icons/mob/screen/styles/minimalist/intents.dmi deleted file mode 100644 index 4f4dbaa0b84..00000000000 Binary files a/icons/mob/screen/styles/minimalist/intents.dmi and /dev/null differ diff --git a/icons/mob/screen/styles/minimalist/interaction.dmi b/icons/mob/screen/styles/minimalist/interaction.dmi index 8a4875e964f..b8c4a0b80fe 100644 Binary files a/icons/mob/screen/styles/minimalist/interaction.dmi and b/icons/mob/screen/styles/minimalist/interaction.dmi differ diff --git a/icons/mob/screen/styles/minimalist/inventory.dmi b/icons/mob/screen/styles/minimalist/inventory.dmi index d2d055fe753..169c66eefdd 100644 Binary files a/icons/mob/screen/styles/minimalist/inventory.dmi and b/icons/mob/screen/styles/minimalist/inventory.dmi differ diff --git a/icons/mob/screen/styles/minimalist/movement.dmi b/icons/mob/screen/styles/minimalist/movement.dmi index 3a3115d5b88..fa354873156 100644 Binary files a/icons/mob/screen/styles/minimalist/movement.dmi and b/icons/mob/screen/styles/minimalist/movement.dmi differ diff --git a/icons/mob/screen/styles/minimalist/uphint.dmi b/icons/mob/screen/styles/minimalist/uphint.dmi index fc54e68b933..412cab2b32d 100644 Binary files a/icons/mob/screen/styles/minimalist/uphint.dmi and b/icons/mob/screen/styles/minimalist/uphint.dmi differ diff --git a/icons/mob/screen/styles/minimalist/zone_selector.dmi b/icons/mob/screen/styles/minimalist/zone_selector.dmi index 9a35a9acd27..2cdd0893f6a 100644 Binary files a/icons/mob/screen/styles/minimalist/zone_selector.dmi and b/icons/mob/screen/styles/minimalist/zone_selector.dmi differ diff --git a/icons/mob/screen/styles/underworld/attack_selector.dmi b/icons/mob/screen/styles/underworld/attack_selector.dmi new file mode 100644 index 00000000000..2df7a24c30d Binary files /dev/null and b/icons/mob/screen/styles/underworld/attack_selector.dmi differ diff --git a/icons/mob/screen/styles/underworld/fire_intent.dmi b/icons/mob/screen/styles/underworld/fire_intent.dmi new file mode 100644 index 00000000000..1f7c93487fd Binary files /dev/null and b/icons/mob/screen/styles/underworld/fire_intent.dmi differ diff --git a/icons/mob/screen/styles/underworld/hands.dmi b/icons/mob/screen/styles/underworld/hands.dmi new file mode 100644 index 00000000000..fd37369cc08 Binary files /dev/null and b/icons/mob/screen/styles/underworld/hands.dmi differ diff --git a/icons/mob/screen/styles/underworld/interaction.dmi b/icons/mob/screen/styles/underworld/interaction.dmi new file mode 100644 index 00000000000..ce806127f53 Binary files /dev/null and b/icons/mob/screen/styles/underworld/interaction.dmi differ diff --git a/icons/mob/screen/styles/underworld/inventory.dmi b/icons/mob/screen/styles/underworld/inventory.dmi new file mode 100644 index 00000000000..b576bd3b4df Binary files /dev/null and b/icons/mob/screen/styles/underworld/inventory.dmi differ diff --git a/icons/mob/screen/styles/underworld/movement.dmi b/icons/mob/screen/styles/underworld/movement.dmi new file mode 100644 index 00000000000..6890efd9fa4 Binary files /dev/null and b/icons/mob/screen/styles/underworld/movement.dmi differ diff --git a/icons/mob/screen/styles/underworld/uphint.dmi b/icons/mob/screen/styles/underworld/uphint.dmi new file mode 100644 index 00000000000..4d78c55da72 Binary files /dev/null and b/icons/mob/screen/styles/underworld/uphint.dmi differ diff --git a/icons/mob/screen/styles/underworld/zone_selector.dmi b/icons/mob/screen/styles/underworld/zone_selector.dmi new file mode 100644 index 00000000000..e482039b230 Binary files /dev/null and b/icons/mob/screen/styles/underworld/zone_selector.dmi differ diff --git a/icons/mob/screen/styles/white/attack_selector.dmi b/icons/mob/screen/styles/white/attack_selector.dmi index 6aa6118a743..02f97413e1a 100644 Binary files a/icons/mob/screen/styles/white/attack_selector.dmi and b/icons/mob/screen/styles/white/attack_selector.dmi differ diff --git a/icons/mob/screen/styles/white/fire_intent.dmi b/icons/mob/screen/styles/white/fire_intent.dmi index 5ab217edcd5..64af8d1e078 100644 Binary files a/icons/mob/screen/styles/white/fire_intent.dmi and b/icons/mob/screen/styles/white/fire_intent.dmi differ diff --git a/icons/mob/screen/styles/white/hands.dmi b/icons/mob/screen/styles/white/hands.dmi index 59702d43b99..0f65b990467 100644 Binary files a/icons/mob/screen/styles/white/hands.dmi and b/icons/mob/screen/styles/white/hands.dmi differ diff --git a/icons/mob/screen/styles/white/interaction.dmi b/icons/mob/screen/styles/white/interaction.dmi index e11d10d2c13..8511d73937a 100644 Binary files a/icons/mob/screen/styles/white/interaction.dmi and b/icons/mob/screen/styles/white/interaction.dmi differ diff --git a/icons/mob/screen/styles/white/inventory.dmi b/icons/mob/screen/styles/white/inventory.dmi index 0ce80198e6b..f8cfa9cbbc5 100644 Binary files a/icons/mob/screen/styles/white/inventory.dmi and b/icons/mob/screen/styles/white/inventory.dmi differ diff --git a/icons/mob/screen/styles/white/movement.dmi b/icons/mob/screen/styles/white/movement.dmi index 17faaf9413d..b3a61c63a9b 100644 Binary files a/icons/mob/screen/styles/white/movement.dmi and b/icons/mob/screen/styles/white/movement.dmi differ diff --git a/icons/mob/screen/styles/white/uphint.dmi b/icons/mob/screen/styles/white/uphint.dmi index d3e9075d704..ee795947c30 100644 Binary files a/icons/mob/screen/styles/white/uphint.dmi and b/icons/mob/screen/styles/white/uphint.dmi differ diff --git a/icons/mob/screen/styles/white/zone_selector.dmi b/icons/mob/screen/styles/white/zone_selector.dmi index fe86e824f98..1e768fdd53d 100644 Binary files a/icons/mob/screen/styles/white/zone_selector.dmi and b/icons/mob/screen/styles/white/zone_selector.dmi differ diff --git a/icons/mob/simple_animal/fish_cave.dmi b/icons/mob/simple_animal/fish_cave.dmi new file mode 100644 index 00000000000..40e1f162f86 Binary files /dev/null and b/icons/mob/simple_animal/fish_cave.dmi differ diff --git a/icons/mob/simple_animal/fish_lantern.dmi b/icons/mob/simple_animal/fish_lantern.dmi new file mode 100644 index 00000000000..eea9923c6d4 Binary files /dev/null and b/icons/mob/simple_animal/fish_lantern.dmi differ diff --git a/icons/obj/banner.dmi b/icons/obj/banner.dmi deleted file mode 100644 index fdcb38c72c6..00000000000 Binary files a/icons/obj/banner.dmi and /dev/null differ diff --git a/icons/obj/banner_woven.dmi b/icons/obj/banner_woven.dmi deleted file mode 100644 index 5e667ae3b0a..00000000000 Binary files a/icons/obj/banner_woven.dmi and /dev/null differ diff --git a/icons/obj/closets/bases/cabinet.dmi b/icons/obj/closets/bases/cabinet.dmi index 236b164ca6e..603874dd3c1 100644 Binary files a/icons/obj/closets/bases/cabinet.dmi and b/icons/obj/closets/bases/cabinet.dmi differ diff --git a/icons/obj/closets/bases/chest.dmi b/icons/obj/closets/bases/chest.dmi index 491dcbd62c0..bef40525584 100644 Binary files a/icons/obj/closets/bases/chest.dmi and b/icons/obj/closets/bases/chest.dmi differ diff --git a/icons/obj/food/butchery/steak.dmi b/icons/obj/food/butchery/steak.dmi index 4fe0f414844..16661e0dbc7 100644 Binary files a/icons/obj/food/butchery/steak.dmi and b/icons/obj/food/butchery/steak.dmi differ diff --git a/icons/obj/food/cooking_vessels/cauldron.dmi b/icons/obj/food/cooking_vessels/cauldron.dmi new file mode 100644 index 00000000000..7be32a10bde Binary files /dev/null and b/icons/obj/food/cooking_vessels/cauldron.dmi differ diff --git a/icons/obj/food/cooking_vessels/pot.dmi b/icons/obj/food/cooking_vessels/pot.dmi index f1816c557d0..368ef60fd40 100644 Binary files a/icons/obj/food/cooking_vessels/pot.dmi and b/icons/obj/food/cooking_vessels/pot.dmi differ diff --git a/icons/obj/food/hay.dmi b/icons/obj/food/hay.dmi new file mode 100644 index 00000000000..2a24bc36b01 Binary files /dev/null and b/icons/obj/food/hay.dmi differ diff --git a/icons/obj/food/nuggets/nugget.dmi b/icons/obj/food/nuggets/nugget.dmi new file mode 100644 index 00000000000..6022a38314e Binary files /dev/null and b/icons/obj/food/nuggets/nugget.dmi differ diff --git a/icons/obj/food/nuggets/nugget_corgi.dmi b/icons/obj/food/nuggets/nugget_corgi.dmi new file mode 100644 index 00000000000..73f1fe111d0 Binary files /dev/null and b/icons/obj/food/nuggets/nugget_corgi.dmi differ diff --git a/icons/obj/food/nuggets/nugget_lizard.dmi b/icons/obj/food/nuggets/nugget_lizard.dmi new file mode 100644 index 00000000000..7eb06bd525e Binary files /dev/null and b/icons/obj/food/nuggets/nugget_lizard.dmi differ diff --git a/icons/obj/food/nuggets/nugget_star.dmi b/icons/obj/food/nuggets/nugget_star.dmi new file mode 100644 index 00000000000..28651880ee8 Binary files /dev/null and b/icons/obj/food/nuggets/nugget_star.dmi differ diff --git a/icons/obj/items/banners/banner.dmi b/icons/obj/items/banners/banner.dmi new file mode 100644 index 00000000000..7edc1596436 Binary files /dev/null and b/icons/obj/items/banners/banner.dmi differ diff --git a/icons/obj/items/banners/banner_forked.dmi b/icons/obj/items/banners/banner_forked.dmi new file mode 100644 index 00000000000..55ce19fe492 Binary files /dev/null and b/icons/obj/items/banners/banner_forked.dmi differ diff --git a/icons/obj/items/banners/banner_pointed.dmi b/icons/obj/items/banners/banner_pointed.dmi new file mode 100644 index 00000000000..371cb954f3a Binary files /dev/null and b/icons/obj/items/banners/banner_pointed.dmi differ diff --git a/icons/obj/items/banners/banner_rounded.dmi b/icons/obj/items/banners/banner_rounded.dmi new file mode 100644 index 00000000000..84ae95413c3 Binary files /dev/null and b/icons/obj/items/banners/banner_rounded.dmi differ diff --git a/icons/obj/items/banners/banner_square.dmi b/icons/obj/items/banners/banner_square.dmi new file mode 100644 index 00000000000..549c0637e18 Binary files /dev/null and b/icons/obj/items/banners/banner_square.dmi differ diff --git a/icons/obj/items/banners/banner_symbols.dmi b/icons/obj/items/banners/banner_symbols.dmi new file mode 100644 index 00000000000..8c77f26d413 Binary files /dev/null and b/icons/obj/items/banners/banner_symbols.dmi differ diff --git a/icons/obj/items/banners/banner_tasselled.dmi b/icons/obj/items/banners/banner_tasselled.dmi new file mode 100644 index 00000000000..271fbce4232 Binary files /dev/null and b/icons/obj/items/banners/banner_tasselled.dmi differ diff --git a/icons/obj/items/banners/banner_woven.dmi b/icons/obj/items/banners/banner_woven.dmi new file mode 100644 index 00000000000..4178722e7b0 Binary files /dev/null and b/icons/obj/items/banners/banner_woven.dmi differ diff --git a/icons/obj/items/banners/sign.dmi b/icons/obj/items/banners/sign.dmi new file mode 100644 index 00000000000..a2fb9ec0361 Binary files /dev/null and b/icons/obj/items/banners/sign.dmi differ diff --git a/icons/obj/items/banners/sign_symbols.dmi b/icons/obj/items/banners/sign_symbols.dmi new file mode 100644 index 00000000000..16ce7891c0c Binary files /dev/null and b/icons/obj/items/banners/sign_symbols.dmi differ diff --git a/icons/obj/items/candelabra.dmi b/icons/obj/items/candelabra.dmi new file mode 100644 index 00000000000..3d0b0010945 Binary files /dev/null and b/icons/obj/items/candelabra.dmi differ diff --git a/icons/obj/items/chain.dmi b/icons/obj/items/chain.dmi new file mode 100644 index 00000000000..95d5c71b70f Binary files /dev/null and b/icons/obj/items/chain.dmi differ diff --git a/icons/obj/items/flame/candle.dmi b/icons/obj/items/flame/candle.dmi index fa33e15df8b..ef2c6a8987f 100644 Binary files a/icons/obj/items/flame/candle.dmi and b/icons/obj/items/flame/candle.dmi differ diff --git a/icons/obj/items/gemstones/baguette.dmi b/icons/obj/items/gemstones/baguette.dmi new file mode 100644 index 00000000000..a10c3dc6754 Binary files /dev/null and b/icons/obj/items/gemstones/baguette.dmi differ diff --git a/icons/obj/items/gemstones/hexagon.dmi b/icons/obj/items/gemstones/hexagon.dmi new file mode 100644 index 00000000000..a66d147db14 Binary files /dev/null and b/icons/obj/items/gemstones/hexagon.dmi differ diff --git a/icons/obj/items/gemstones/octagon.dmi b/icons/obj/items/gemstones/octagon.dmi new file mode 100644 index 00000000000..c216faaadf9 Binary files /dev/null and b/icons/obj/items/gemstones/octagon.dmi differ diff --git a/icons/obj/items/gemstones/poor.dmi b/icons/obj/items/gemstones/poor.dmi new file mode 100644 index 00000000000..97d192b3493 Binary files /dev/null and b/icons/obj/items/gemstones/poor.dmi differ diff --git a/icons/obj/items/gemstones/round.dmi b/icons/obj/items/gemstones/round.dmi new file mode 100644 index 00000000000..69bca88b994 Binary files /dev/null and b/icons/obj/items/gemstones/round.dmi differ diff --git a/icons/obj/items/gemstones/uncut.dmi b/icons/obj/items/gemstones/uncut.dmi new file mode 100644 index 00000000000..46b30ab2343 Binary files /dev/null and b/icons/obj/items/gemstones/uncut.dmi differ diff --git a/icons/obj/pottery/bottle.dmi b/icons/obj/items/handmade/bottle.dmi similarity index 100% rename from icons/obj/pottery/bottle.dmi rename to icons/obj/items/handmade/bottle.dmi diff --git a/icons/obj/pottery/bottle_tall.dmi b/icons/obj/items/handmade/bottle_tall.dmi similarity index 100% rename from icons/obj/pottery/bottle_tall.dmi rename to icons/obj/items/handmade/bottle_tall.dmi diff --git a/icons/obj/pottery/bottle_wide.dmi b/icons/obj/items/handmade/bottle_wide.dmi similarity index 100% rename from icons/obj/pottery/bottle_wide.dmi rename to icons/obj/items/handmade/bottle_wide.dmi diff --git a/icons/obj/items/handmade/bowl.dmi b/icons/obj/items/handmade/bowl.dmi new file mode 100644 index 00000000000..29cb47bf9be Binary files /dev/null and b/icons/obj/items/handmade/bowl.dmi differ diff --git a/icons/obj/items/handmade/bowl_fancy.dmi b/icons/obj/items/handmade/bowl_fancy.dmi new file mode 100644 index 00000000000..af43c58133a Binary files /dev/null and b/icons/obj/items/handmade/bowl_fancy.dmi differ diff --git a/icons/obj/items/handmade/cup.dmi b/icons/obj/items/handmade/cup.dmi new file mode 100644 index 00000000000..8e894e7d612 Binary files /dev/null and b/icons/obj/items/handmade/cup.dmi differ diff --git a/icons/obj/items/handmade/cup_fancy.dmi b/icons/obj/items/handmade/cup_fancy.dmi new file mode 100644 index 00000000000..02f64ffe84f Binary files /dev/null and b/icons/obj/items/handmade/cup_fancy.dmi differ diff --git a/icons/obj/items/handmade/decanter.dmi b/icons/obj/items/handmade/decanter.dmi new file mode 100644 index 00000000000..aad1cd74fe3 Binary files /dev/null and b/icons/obj/items/handmade/decanter.dmi differ diff --git a/icons/obj/pottery/jar.dmi b/icons/obj/items/handmade/jar.dmi similarity index 100% rename from icons/obj/pottery/jar.dmi rename to icons/obj/items/handmade/jar.dmi diff --git a/icons/obj/items/handmade/mug.dmi b/icons/obj/items/handmade/mug.dmi new file mode 100644 index 00000000000..5130e4cd185 Binary files /dev/null and b/icons/obj/items/handmade/mug.dmi differ diff --git a/icons/obj/pottery/teapot.dmi b/icons/obj/items/handmade/teapot.dmi similarity index 100% rename from icons/obj/pottery/teapot.dmi rename to icons/obj/items/handmade/teapot.dmi diff --git a/icons/obj/pottery/vase.dmi b/icons/obj/items/handmade/vase.dmi similarity index 100% rename from icons/obj/pottery/vase.dmi rename to icons/obj/items/handmade/vase.dmi diff --git a/icons/obj/items/handmade/vase_fancy.dmi b/icons/obj/items/handmade/vase_fancy.dmi new file mode 100644 index 00000000000..8a66723be83 Binary files /dev/null and b/icons/obj/items/handmade/vase_fancy.dmi differ diff --git a/icons/obj/items/handmade/vase_fancy_fluted.dmi b/icons/obj/items/handmade/vase_fancy_fluted.dmi new file mode 100644 index 00000000000..af3a2270a76 Binary files /dev/null and b/icons/obj/items/handmade/vase_fancy_fluted.dmi differ diff --git a/icons/obj/items/hook.dmi b/icons/obj/items/hook.dmi new file mode 100644 index 00000000000..602683208c7 Binary files /dev/null and b/icons/obj/items/hook.dmi differ diff --git a/icons/obj/items/horseshoe.dmi b/icons/obj/items/horseshoe.dmi new file mode 100644 index 00000000000..15f6f5f2482 Binary files /dev/null and b/icons/obj/items/horseshoe.dmi differ diff --git a/icons/obj/items/hourglass.dmi b/icons/obj/items/hourglass.dmi new file mode 100644 index 00000000000..a3930025333 Binary files /dev/null and b/icons/obj/items/hourglass.dmi differ diff --git a/icons/obj/items/mining_satchel.dmi b/icons/obj/items/mining_satchel.dmi new file mode 100644 index 00000000000..64d0ded9257 Binary files /dev/null and b/icons/obj/items/mining_satchel.dmi differ diff --git a/icons/obj/items/sheet_snatcher.dmi b/icons/obj/items/sheet_snatcher.dmi new file mode 100644 index 00000000000..7a898ac6f09 Binary files /dev/null and b/icons/obj/items/sheet_snatcher.dmi differ diff --git a/icons/obj/items/shield/buckler.dmi b/icons/obj/items/shield/buckler.dmi deleted file mode 100644 index ff53a0e14e0..00000000000 Binary files a/icons/obj/items/shield/buckler.dmi and /dev/null differ diff --git a/icons/obj/items/shield/buckler_base_metal.dmi b/icons/obj/items/shield/buckler_base_metal.dmi new file mode 100644 index 00000000000..41372efa755 Binary files /dev/null and b/icons/obj/items/shield/buckler_base_metal.dmi differ diff --git a/icons/obj/items/shield/buckler_base_wood.dmi b/icons/obj/items/shield/buckler_base_wood.dmi new file mode 100644 index 00000000000..03e9bc34a6d Binary files /dev/null and b/icons/obj/items/shield/buckler_base_wood.dmi differ diff --git a/icons/obj/items/shield/buckler_metal.dmi b/icons/obj/items/shield/buckler_metal.dmi new file mode 100644 index 00000000000..0d27f07c23e Binary files /dev/null and b/icons/obj/items/shield/buckler_metal.dmi differ diff --git a/icons/obj/items/shield/buckler_wood.dmi b/icons/obj/items/shield/buckler_wood.dmi new file mode 100644 index 00000000000..94e4563a342 Binary files /dev/null and b/icons/obj/items/shield/buckler_wood.dmi differ diff --git a/icons/obj/items/shield_fasteners.dmi b/icons/obj/items/shield_fasteners.dmi new file mode 100644 index 00000000000..e4c289ffc0c Binary files /dev/null and b/icons/obj/items/shield_fasteners.dmi differ diff --git a/icons/obj/items/stock_parts/modular_components.dmi b/icons/obj/items/stock_parts/modular_components.dmi index 570e13bbf65..1a471de37fa 100644 Binary files a/icons/obj/items/stock_parts/modular_components.dmi and b/icons/obj/items/stock_parts/modular_components.dmi differ diff --git a/icons/obj/items/storage/backpack/backpack_crafted.dmi b/icons/obj/items/storage/backpack/backpack_crafted.dmi new file mode 100644 index 00000000000..e565e4862a1 Binary files /dev/null and b/icons/obj/items/storage/backpack/backpack_crafted.dmi differ diff --git a/icons/obj/items/storage/backpack/backpack_haversack.dmi b/icons/obj/items/storage/backpack/backpack_haversack.dmi new file mode 100644 index 00000000000..ca148f6a4ea Binary files /dev/null and b/icons/obj/items/storage/backpack/backpack_haversack.dmi differ diff --git a/icons/obj/items/storage/basket.dmi b/icons/obj/items/storage/basket.dmi deleted file mode 100644 index 8f6981dc10d..00000000000 Binary files a/icons/obj/items/storage/basket.dmi and /dev/null differ diff --git a/icons/obj/items/storage/baskets/basket_large.dmi b/icons/obj/items/storage/baskets/basket_large.dmi new file mode 100644 index 00000000000..71c23d7b6ce Binary files /dev/null and b/icons/obj/items/storage/baskets/basket_large.dmi differ diff --git a/icons/obj/items/storage/baskets/basket_round.dmi b/icons/obj/items/storage/baskets/basket_round.dmi new file mode 100644 index 00000000000..c84fe4b7e60 Binary files /dev/null and b/icons/obj/items/storage/baskets/basket_round.dmi differ diff --git a/icons/obj/items/storage/nugget_box.dmi b/icons/obj/items/storage/nugget_box.dmi new file mode 100644 index 00000000000..43293c62dfa Binary files /dev/null and b/icons/obj/items/storage/nugget_box.dmi differ diff --git a/icons/obj/items/tool/chisel.dmi b/icons/obj/items/tool/chisel.dmi new file mode 100644 index 00000000000..e277e1ba44b Binary files /dev/null and b/icons/obj/items/tool/chisel.dmi differ diff --git a/icons/obj/items/tool/components/tool_head.dmi b/icons/obj/items/tool/components/tool_head.dmi index dbb7e7db2bc..cc9a43d9971 100644 Binary files a/icons/obj/items/tool/components/tool_head.dmi and b/icons/obj/items/tool/components/tool_head.dmi differ diff --git a/icons/obj/items/tool/hammers/forge.dmi b/icons/obj/items/tool/hammers/forge.dmi new file mode 100644 index 00000000000..a7b0a4e0611 Binary files /dev/null and b/icons/obj/items/tool/hammers/forge.dmi differ diff --git a/icons/obj/items/training_dummies/alien.dmi b/icons/obj/items/training_dummies/alien.dmi new file mode 100644 index 00000000000..a08ae3ce7fa Binary files /dev/null and b/icons/obj/items/training_dummies/alien.dmi differ diff --git a/icons/obj/items/training_dummies/archery.dmi b/icons/obj/items/training_dummies/archery.dmi new file mode 100644 index 00000000000..b3e58a34a26 Binary files /dev/null and b/icons/obj/items/training_dummies/archery.dmi differ diff --git a/icons/obj/items/training_dummies/damage.dmi b/icons/obj/items/training_dummies/damage.dmi new file mode 100644 index 00000000000..6eaae4a674a Binary files /dev/null and b/icons/obj/items/training_dummies/damage.dmi differ diff --git a/icons/obj/items/training_dummies/standard.dmi b/icons/obj/items/training_dummies/standard.dmi new file mode 100644 index 00000000000..d4b367b4db8 Binary files /dev/null and b/icons/obj/items/training_dummies/standard.dmi differ diff --git a/icons/obj/items/training_dummies/straw.dmi b/icons/obj/items/training_dummies/straw.dmi new file mode 100644 index 00000000000..aa4646488b3 Binary files /dev/null and b/icons/obj/items/training_dummies/straw.dmi differ diff --git a/icons/obj/items/training_dummies/syndicate.dmi b/icons/obj/items/training_dummies/syndicate.dmi new file mode 100644 index 00000000000..aee57436e79 Binary files /dev/null and b/icons/obj/items/training_dummies/syndicate.dmi differ diff --git a/icons/obj/machines/gigadrill.dmi b/icons/obj/machines/gigadrill.dmi new file mode 100644 index 00000000000..bcbda6a5144 Binary files /dev/null and b/icons/obj/machines/gigadrill.dmi differ diff --git a/icons/obj/machines/smartfridges/contents_chem.dmi b/icons/obj/machines/smartfridges/contents_chem.dmi new file mode 100644 index 00000000000..652eb6a7a29 Binary files /dev/null and b/icons/obj/machines/smartfridges/contents_chem.dmi differ diff --git a/icons/obj/machines/smartfridges/contents_drink.dmi b/icons/obj/machines/smartfridges/contents_drink.dmi new file mode 100644 index 00000000000..cc6c36719b0 Binary files /dev/null and b/icons/obj/machines/smartfridges/contents_drink.dmi differ diff --git a/icons/obj/machines/smartfridges/contents_food.dmi b/icons/obj/machines/smartfridges/contents_food.dmi new file mode 100644 index 00000000000..34c205c5013 Binary files /dev/null and b/icons/obj/machines/smartfridges/contents_food.dmi differ diff --git a/icons/obj/machines/smartfridges/contents_plants.dmi b/icons/obj/machines/smartfridges/contents_plants.dmi new file mode 100644 index 00000000000..c51a11f5e92 Binary files /dev/null and b/icons/obj/machines/smartfridges/contents_plants.dmi differ diff --git a/icons/obj/machines/smartfridges/dark.dmi b/icons/obj/machines/smartfridges/dark.dmi new file mode 100644 index 00000000000..27eb86d54c7 Binary files /dev/null and b/icons/obj/machines/smartfridges/dark.dmi differ diff --git a/icons/obj/machines/smartfridges/drinks.dmi b/icons/obj/machines/smartfridges/drinks.dmi new file mode 100644 index 00000000000..474246171a2 Binary files /dev/null and b/icons/obj/machines/smartfridges/drinks.dmi differ diff --git a/icons/obj/machines/smartfridges/drying_oven.dmi b/icons/obj/machines/smartfridges/drying_oven.dmi new file mode 100644 index 00000000000..d5a59817b1e Binary files /dev/null and b/icons/obj/machines/smartfridges/drying_oven.dmi differ diff --git a/icons/obj/machines/smartfridges/food.dmi b/icons/obj/machines/smartfridges/food.dmi new file mode 100644 index 00000000000..0c690607da1 Binary files /dev/null and b/icons/obj/machines/smartfridges/food.dmi differ diff --git a/icons/obj/machines/smartfridges/science.dmi b/icons/obj/machines/smartfridges/science.dmi new file mode 100644 index 00000000000..091312e07f3 Binary files /dev/null and b/icons/obj/machines/smartfridges/science.dmi differ diff --git a/icons/obj/machines/vending/bar.dmi b/icons/obj/machines/vending/bar.dmi new file mode 100644 index 00000000000..c670371c50f Binary files /dev/null and b/icons/obj/machines/vending/bar.dmi differ diff --git a/icons/obj/machines/vending/cartridges.dmi b/icons/obj/machines/vending/cartridges.dmi new file mode 100644 index 00000000000..927d474e441 Binary files /dev/null and b/icons/obj/machines/vending/cartridges.dmi differ diff --git a/icons/obj/machines/vending/cigarettes.dmi b/icons/obj/machines/vending/cigarettes.dmi new file mode 100644 index 00000000000..83870f29f06 Binary files /dev/null and b/icons/obj/machines/vending/cigarettes.dmi differ diff --git a/icons/obj/machines/vending/coffee.dmi b/icons/obj/machines/vending/coffee.dmi new file mode 100644 index 00000000000..d4f22cabc6b Binary files /dev/null and b/icons/obj/machines/vending/coffee.dmi differ diff --git a/icons/obj/machines/vending/dinnerware.dmi b/icons/obj/machines/vending/dinnerware.dmi new file mode 100644 index 00000000000..297ee226b59 Binary files /dev/null and b/icons/obj/machines/vending/dinnerware.dmi differ diff --git a/icons/obj/machines/vending/drinks.dmi b/icons/obj/machines/vending/drinks.dmi new file mode 100644 index 00000000000..8e241137536 Binary files /dev/null and b/icons/obj/machines/vending/drinks.dmi differ diff --git a/icons/obj/machines/vending/engineering.dmi b/icons/obj/machines/vending/engineering.dmi new file mode 100644 index 00000000000..da8b3af7e50 Binary files /dev/null and b/icons/obj/machines/vending/engineering.dmi differ diff --git a/icons/obj/machines/vending/engivend.dmi b/icons/obj/machines/vending/engivend.dmi new file mode 100644 index 00000000000..6051e27ff1a Binary files /dev/null and b/icons/obj/machines/vending/engivend.dmi differ diff --git a/icons/obj/machines/vending/fitness.dmi b/icons/obj/machines/vending/fitness.dmi new file mode 100644 index 00000000000..fbe9fd2a7a7 Binary files /dev/null and b/icons/obj/machines/vending/fitness.dmi differ diff --git a/icons/obj/machines/vending/games.dmi b/icons/obj/machines/vending/games.dmi new file mode 100644 index 00000000000..e472e9421a2 Binary files /dev/null and b/icons/obj/machines/vending/games.dmi differ diff --git a/icons/obj/machines/vending/generic.dmi b/icons/obj/machines/vending/generic.dmi new file mode 100644 index 00000000000..b7962898cd2 Binary files /dev/null and b/icons/obj/machines/vending/generic.dmi differ diff --git a/icons/obj/machines/vending/hotfood.dmi b/icons/obj/machines/vending/hotfood.dmi new file mode 100644 index 00000000000..d186fa5e3d1 Binary files /dev/null and b/icons/obj/machines/vending/hotfood.dmi differ diff --git a/icons/obj/machines/vending/laptops.dmi b/icons/obj/machines/vending/laptops.dmi new file mode 100644 index 00000000000..069ba547883 Binary files /dev/null and b/icons/obj/machines/vending/laptops.dmi differ diff --git a/icons/obj/machines/vending/lavatory.dmi b/icons/obj/machines/vending/lavatory.dmi new file mode 100644 index 00000000000..83057f32eec Binary files /dev/null and b/icons/obj/machines/vending/lavatory.dmi differ diff --git a/icons/obj/machines/vending/magic.dmi b/icons/obj/machines/vending/magic.dmi new file mode 100644 index 00000000000..38a969fabe5 Binary files /dev/null and b/icons/obj/machines/vending/magic.dmi differ diff --git a/icons/obj/machines/vending/medical.dmi b/icons/obj/machines/vending/medical.dmi new file mode 100644 index 00000000000..8f03461e5e2 Binary files /dev/null and b/icons/obj/machines/vending/medical.dmi differ diff --git a/icons/obj/machines/vending/nutri_green.dmi b/icons/obj/machines/vending/nutri_green.dmi new file mode 100644 index 00000000000..4c514e4f215 Binary files /dev/null and b/icons/obj/machines/vending/nutri_green.dmi differ diff --git a/icons/obj/machines/vending/nutri_grey.dmi b/icons/obj/machines/vending/nutri_grey.dmi new file mode 100644 index 00000000000..b403fb74b04 Binary files /dev/null and b/icons/obj/machines/vending/nutri_grey.dmi differ diff --git a/icons/obj/machines/vending/nutrimat.dmi b/icons/obj/machines/vending/nutrimat.dmi new file mode 100644 index 00000000000..382a47df06a Binary files /dev/null and b/icons/obj/machines/vending/nutrimat.dmi differ diff --git a/icons/obj/machines/vending/robotics.dmi b/icons/obj/machines/vending/robotics.dmi new file mode 100644 index 00000000000..43d48409ad1 Binary files /dev/null and b/icons/obj/machines/vending/robotics.dmi differ diff --git a/icons/obj/machines/vending/security.dmi b/icons/obj/machines/vending/security.dmi new file mode 100644 index 00000000000..f09df161b80 Binary files /dev/null and b/icons/obj/machines/vending/security.dmi differ diff --git a/icons/obj/machines/vending/seeds_green.dmi b/icons/obj/machines/vending/seeds_green.dmi new file mode 100644 index 00000000000..f3d730d74e1 Binary files /dev/null and b/icons/obj/machines/vending/seeds_green.dmi differ diff --git a/icons/obj/machines/vending/seeds_grey.dmi b/icons/obj/machines/vending/seeds_grey.dmi new file mode 100644 index 00000000000..c85ba5b81f8 Binary files /dev/null and b/icons/obj/machines/vending/seeds_grey.dmi differ diff --git a/icons/obj/machines/vending/snacks.dmi b/icons/obj/machines/vending/snacks.dmi new file mode 100644 index 00000000000..c5bb7ce78a0 Binary files /dev/null and b/icons/obj/machines/vending/snacks.dmi differ diff --git a/icons/obj/machines/vending/snix.dmi b/icons/obj/machines/vending/snix.dmi new file mode 100644 index 00000000000..9711d5a38ca Binary files /dev/null and b/icons/obj/machines/vending/snix.dmi differ diff --git a/icons/obj/machines/vending/soda.dmi b/icons/obj/machines/vending/soda.dmi new file mode 100644 index 00000000000..8b6277aa483 Binary files /dev/null and b/icons/obj/machines/vending/soda.dmi differ diff --git a/icons/obj/machines/vending/solsnacks.dmi b/icons/obj/machines/vending/solsnacks.dmi new file mode 100644 index 00000000000..55498c1e585 Binary files /dev/null and b/icons/obj/machines/vending/solsnacks.dmi differ diff --git a/icons/obj/machines/vending/soviet.dmi b/icons/obj/machines/vending/soviet.dmi new file mode 100644 index 00000000000..a16f21e429d Binary files /dev/null and b/icons/obj/machines/vending/soviet.dmi differ diff --git a/icons/obj/machines/vending/theater.dmi b/icons/obj/machines/vending/theater.dmi new file mode 100644 index 00000000000..3108ae546b0 Binary files /dev/null and b/icons/obj/machines/vending/theater.dmi differ diff --git a/icons/obj/machines/vending/tool.dmi b/icons/obj/machines/vending/tool.dmi new file mode 100644 index 00000000000..97660e43853 Binary files /dev/null and b/icons/obj/machines/vending/tool.dmi differ diff --git a/icons/obj/machines/vending/tool_adh.dmi b/icons/obj/machines/vending/tool_adh.dmi new file mode 100644 index 00000000000..03f49f0d1dc Binary files /dev/null and b/icons/obj/machines/vending/tool_adh.dmi differ diff --git a/icons/obj/machines/vending/uniform.dmi b/icons/obj/machines/vending/uniform.dmi new file mode 100644 index 00000000000..10148b98121 Binary files /dev/null and b/icons/obj/machines/vending/uniform.dmi differ diff --git a/icons/obj/machines/vending/wallmed.dmi b/icons/obj/machines/vending/wallmed.dmi new file mode 100644 index 00000000000..792954c53a9 Binary files /dev/null and b/icons/obj/machines/vending/wallmed.dmi differ diff --git a/icons/obj/machines/vending/weeb.dmi b/icons/obj/machines/vending/weeb.dmi new file mode 100644 index 00000000000..62966c77b12 Binary files /dev/null and b/icons/obj/machines/vending/weeb.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi deleted file mode 100644 index 0bf325c1efb..00000000000 Binary files a/icons/obj/mining.dmi and /dev/null differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 4705a37d998..ec7ad98c685 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/pottery/bowl.dmi b/icons/obj/pottery/bowl.dmi deleted file mode 100644 index 46550a0a386..00000000000 Binary files a/icons/obj/pottery/bowl.dmi and /dev/null differ diff --git a/icons/obj/pottery/cup.dmi b/icons/obj/pottery/cup.dmi deleted file mode 100644 index 09d0afb49de..00000000000 Binary files a/icons/obj/pottery/cup.dmi and /dev/null differ diff --git a/icons/obj/pottery/mug.dmi b/icons/obj/pottery/mug.dmi deleted file mode 100644 index cf14f1786e3..00000000000 Binary files a/icons/obj/pottery/mug.dmi and /dev/null differ diff --git a/icons/obj/structures/armor_stand.dmi b/icons/obj/structures/armor_stand.dmi new file mode 100644 index 00000000000..0431f7f626c Binary files /dev/null and b/icons/obj/structures/armor_stand.dmi differ diff --git a/icons/obj/structures/banner_frame.dmi b/icons/obj/structures/banner_frame.dmi index 986bf0821e7..7379e9201d2 100644 Binary files a/icons/obj/structures/banner_frame.dmi and b/icons/obj/structures/banner_frame.dmi differ diff --git a/icons/obj/structures/barrel.dmi b/icons/obj/structures/barrel.dmi deleted file mode 100644 index 4adfb3e502e..00000000000 Binary files a/icons/obj/structures/barrel.dmi and /dev/null differ diff --git a/icons/obj/structures/barrels/barrel.dmi b/icons/obj/structures/barrels/barrel.dmi new file mode 100644 index 00000000000..1fec40d535c Binary files /dev/null and b/icons/obj/structures/barrels/barrel.dmi differ diff --git a/icons/obj/structures/barrels/cask.dmi b/icons/obj/structures/barrels/cask.dmi new file mode 100644 index 00000000000..a2eba5fa0d9 Binary files /dev/null and b/icons/obj/structures/barrels/cask.dmi differ diff --git a/icons/obj/structures/barrels/cask_rack.dmi b/icons/obj/structures/barrels/cask_rack.dmi new file mode 100644 index 00000000000..2ee0ca5985b Binary files /dev/null and b/icons/obj/structures/barrels/cask_rack.dmi differ diff --git a/icons/obj/structures/barrels/cask_rack_large.dmi b/icons/obj/structures/barrels/cask_rack_large.dmi new file mode 100644 index 00000000000..e5929b56dd9 Binary files /dev/null and b/icons/obj/structures/barrels/cask_rack_large.dmi differ diff --git a/icons/obj/structures/benches.dmi b/icons/obj/structures/benches.dmi index 70510d9d975..5a56743224b 100644 Binary files a/icons/obj/structures/benches.dmi and b/icons/obj/structures/benches.dmi differ diff --git a/icons/obj/structures/bookcase.dmi b/icons/obj/structures/bookcase.dmi index 586f8895427..e232f90cb32 100644 Binary files a/icons/obj/structures/bookcase.dmi and b/icons/obj/structures/bookcase.dmi differ diff --git a/icons/obj/structures/boulder.dmi b/icons/obj/structures/boulder.dmi new file mode 100644 index 00000000000..dc83a302239 Binary files /dev/null and b/icons/obj/structures/boulder.dmi differ diff --git a/icons/obj/structures/divider.dmi b/icons/obj/structures/divider.dmi new file mode 100644 index 00000000000..5016482a2a1 Binary files /dev/null and b/icons/obj/structures/divider.dmi differ diff --git a/icons/obj/structures/forging/bellows.dmi b/icons/obj/structures/forging/bellows.dmi new file mode 100644 index 00000000000..9e6031422ef Binary files /dev/null and b/icons/obj/structures/forging/bellows.dmi differ diff --git a/icons/obj/structures/grandfather_clock.dmi b/icons/obj/structures/grandfather_clock.dmi new file mode 100644 index 00000000000..cbef65c5ac4 Binary files /dev/null and b/icons/obj/structures/grandfather_clock.dmi differ diff --git a/icons/obj/structures/haybale.dmi b/icons/obj/structures/haybale.dmi new file mode 100644 index 00000000000..822e36790b3 Binary files /dev/null and b/icons/obj/structures/haybale.dmi differ diff --git a/icons/obj/structures/haystack.dmi b/icons/obj/structures/haystack.dmi new file mode 100644 index 00000000000..fb663b7285f Binary files /dev/null and b/icons/obj/structures/haystack.dmi differ diff --git a/icons/obj/structures/lounge.dmi b/icons/obj/structures/lounge.dmi new file mode 100644 index 00000000000..49843d472ca Binary files /dev/null and b/icons/obj/structures/lounge.dmi differ diff --git a/icons/obj/structures/ore_box.dmi b/icons/obj/structures/ore_box.dmi new file mode 100644 index 00000000000..c9eea92cfd2 Binary files /dev/null and b/icons/obj/structures/ore_box.dmi differ diff --git a/icons/obj/structures/pillars/pillar_wide_inset.dmi b/icons/obj/structures/pillars/pillar_wide_inset.dmi new file mode 100644 index 00000000000..8f307cd2eb0 Binary files /dev/null and b/icons/obj/structures/pillars/pillar_wide_inset.dmi differ diff --git a/icons/obj/structures/pillars/pillar_wide_round.dmi b/icons/obj/structures/pillars/pillar_wide_round.dmi new file mode 100644 index 00000000000..c0625980dd8 Binary files /dev/null and b/icons/obj/structures/pillars/pillar_wide_round.dmi differ diff --git a/icons/obj/structures/pillars/pillar_wide_square.dmi b/icons/obj/structures/pillars/pillar_wide_square.dmi new file mode 100644 index 00000000000..a5ea0d80445 Binary files /dev/null and b/icons/obj/structures/pillars/pillar_wide_square.dmi differ diff --git a/icons/obj/structures/rug.dmi b/icons/obj/structures/rug.dmi new file mode 100644 index 00000000000..ab64dd8fba6 Binary files /dev/null and b/icons/obj/structures/rug.dmi differ diff --git a/icons/obj/structures/sign_post.dmi b/icons/obj/structures/sign_post.dmi new file mode 100644 index 00000000000..c6c3ab25d47 Binary files /dev/null and b/icons/obj/structures/sign_post.dmi differ diff --git a/icons/obj/structures/snowmen/snowbot.dmi b/icons/obj/structures/snowmen/snowbot.dmi new file mode 100644 index 00000000000..c209cf5e868 Binary files /dev/null and b/icons/obj/structures/snowmen/snowbot.dmi differ diff --git a/icons/obj/structures/snowmen/snowman.dmi b/icons/obj/structures/snowmen/snowman.dmi new file mode 100644 index 00000000000..c174da4bb4d Binary files /dev/null and b/icons/obj/structures/snowmen/snowman.dmi differ diff --git a/icons/obj/structures/snowmen/snowspider.dmi b/icons/obj/structures/snowmen/snowspider.dmi new file mode 100644 index 00000000000..bc7af6f5b8c Binary files /dev/null and b/icons/obj/structures/snowmen/snowspider.dmi differ diff --git a/icons/obj/structures/target_stakes/archery_butt.dmi b/icons/obj/structures/target_stakes/archery_butt.dmi new file mode 100644 index 00000000000..b2e7253cf4b Binary files /dev/null and b/icons/obj/structures/target_stakes/archery_butt.dmi differ diff --git a/icons/obj/structures/target_stakes/target_stake.dmi b/icons/obj/structures/target_stakes/target_stake.dmi new file mode 100644 index 00000000000..7423233493f Binary files /dev/null and b/icons/obj/structures/target_stakes/target_stake.dmi differ diff --git a/icons/obj/structures/water_cooler.dmi b/icons/obj/structures/water_cooler.dmi new file mode 100644 index 00000000000..47660e5d627 Binary files /dev/null and b/icons/obj/structures/water_cooler.dmi differ diff --git a/icons/obj/structures/well.dmi b/icons/obj/structures/well.dmi index 33a27086c18..9a6402de826 100644 Binary files a/icons/obj/structures/well.dmi and b/icons/obj/structures/well.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi deleted file mode 100644 index 91cf6530e50..00000000000 Binary files a/icons/obj/vending.dmi and /dev/null differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 49d879d47d8..b8ebfc01108 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/icons/screen/hud.dmi b/icons/screen/hud.dmi new file mode 100644 index 00000000000..b8d98129369 Binary files /dev/null and b/icons/screen/hud.dmi differ diff --git a/icons/screen/hud_antag.dmi b/icons/screen/hud_antag.dmi new file mode 100644 index 00000000000..07840ff2614 Binary files /dev/null and b/icons/screen/hud_antag.dmi differ diff --git a/icons/screen/hud_implants.dmi b/icons/screen/hud_implants.dmi new file mode 100644 index 00000000000..5899f696f70 Binary files /dev/null and b/icons/screen/hud_implants.dmi differ diff --git a/icons/screen/hud_med.dmi b/icons/screen/hud_med.dmi new file mode 100644 index 00000000000..280097c8166 Binary files /dev/null and b/icons/screen/hud_med.dmi differ diff --git a/icons/screen/intents.dmi b/icons/screen/intents.dmi new file mode 100644 index 00000000000..3e7992ed2c9 Binary files /dev/null and b/icons/screen/intents.dmi differ diff --git a/icons/screen/intents_wide.dmi b/icons/screen/intents_wide.dmi new file mode 100644 index 00000000000..a89c5ee023d Binary files /dev/null and b/icons/screen/intents_wide.dmi differ diff --git a/icons/turf/flooring/laminate.dmi b/icons/turf/flooring/laminate.dmi new file mode 100644 index 00000000000..83d4933c155 Binary files /dev/null and b/icons/turf/flooring/laminate.dmi differ diff --git a/icons/turf/flooring/mud.dmi b/icons/turf/flooring/mud.dmi index 738ae2dd4ef..b73fcd5c76f 100644 Binary files a/icons/turf/flooring/mud.dmi and b/icons/turf/flooring/mud.dmi differ diff --git a/icons/turf/flooring/straw.dmi b/icons/turf/flooring/straw.dmi new file mode 100644 index 00000000000..f797358bf23 Binary files /dev/null and b/icons/turf/flooring/straw.dmi differ diff --git a/icons/turf/flooring/wood.dmi b/icons/turf/flooring/wood.dmi index a93de0fefca..9e17d5cbeb4 100644 Binary files a/icons/turf/flooring/wood.dmi and b/icons/turf/flooring/wood.dmi differ diff --git a/icons/turf/flooring/wood_alt.dmi b/icons/turf/flooring/wood_alt.dmi new file mode 100644 index 00000000000..2f55a0fb6c4 Binary files /dev/null and b/icons/turf/flooring/wood_alt.dmi differ diff --git a/icons/turf/walls/_previews.dmi b/icons/turf/walls/_previews.dmi index 02e2637c0c7..59e03e52b4d 100644 Binary files a/icons/turf/walls/_previews.dmi and b/icons/turf/walls/_previews.dmi differ diff --git a/icons/turf/walls/plaster.dmi b/icons/turf/walls/plaster.dmi new file mode 100644 index 00000000000..ee8b3faf2b4 Binary files /dev/null and b/icons/turf/walls/plaster.dmi differ diff --git a/icons/turf/walls/reinforced_timber.dmi b/icons/turf/walls/reinforced_timber.dmi new file mode 100644 index 00000000000..46e537f04e0 Binary files /dev/null and b/icons/turf/walls/reinforced_timber.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_1.dmi b/icons/turf/walls/reinforced_timber_alt_1.dmi new file mode 100644 index 00000000000..f6eb3a41df3 Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_1.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_2.dmi b/icons/turf/walls/reinforced_timber_alt_2.dmi new file mode 100644 index 00000000000..c06be35cb5f Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_2.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_3.dmi b/icons/turf/walls/reinforced_timber_alt_3.dmi new file mode 100644 index 00000000000..1ee1a9f4625 Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_3.dmi differ diff --git a/icons/turf/walls/reinforced_timber_alt_4.dmi b/icons/turf/walls/reinforced_timber_alt_4.dmi new file mode 100644 index 00000000000..ac01d0457a5 Binary files /dev/null and b/icons/turf/walls/reinforced_timber_alt_4.dmi differ diff --git a/icons/turf/walls/square_shutter.dmi b/icons/turf/walls/square_shutter.dmi new file mode 100644 index 00000000000..d0729a887be Binary files /dev/null and b/icons/turf/walls/square_shutter.dmi differ diff --git a/icons/turf/walls/wattle.dmi b/icons/turf/walls/wattle.dmi new file mode 100644 index 00000000000..01ee0aadc3e Binary files /dev/null and b/icons/turf/walls/wattle.dmi differ diff --git a/icons/turf/walls/wattledaub.dmi b/icons/turf/walls/wattledaub.dmi new file mode 100644 index 00000000000..126f7829c7e Binary files /dev/null and b/icons/turf/walls/wattledaub.dmi differ diff --git a/maps/antag_spawn/ert/ert.dm b/maps/antag_spawn/ert/ert.dm index 0d16a0f2a8d..0422dfdada6 100644 --- a/maps/antag_spawn/ert/ert.dm +++ b/maps/antag_spawn/ert/ert.dm @@ -59,4 +59,7 @@ /area/map_template/rescue_base/start name = "\improper Response Team Base" icon_state = "shuttlered" - base_turf = /turf/unsimulated/floor/rescue_base \ No newline at end of file + base_turf = /turf/unsimulated/floor/rescue_base + +// Separated in preparation for making ERTs into a modpack. +#include "rig.dm" \ No newline at end of file diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 30c9701f6a8..703d909d0c3 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -415,9 +415,6 @@ /obj/item/flash, /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) -"bs" = ( -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "bt" = ( /obj/machinery/door/airlock/centcom{ name = "Cell 2" @@ -1198,10 +1195,6 @@ /obj/machinery/vending/medical, /turf/unsimulated/wall, /area/map_template/rescue_base/base) -"dj" = ( -/obj/effect/wingrille_spawn/reinforced/crescent, -/turf/space, -/area/map_template/rescue_base/base) "dk" = ( /obj/machinery/door/airlock/centcom{ name = "EVA" @@ -1396,9 +1389,6 @@ /obj/structure/bed/chair/office/dark, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) -"dP" = ( -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "dQ" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/door/airlock/external/shuttle{ @@ -1466,10 +1456,6 @@ }, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) -"ec" = ( -/obj/structure/table/reinforced, -/turf/unsimulated/floor/vault, -/area/map_template/rescue_base/base) "ed" = ( /obj/structure/table/reinforced, /obj/item/radio/intercom{ @@ -1547,7 +1533,7 @@ "et" = ( /obj/structure/rack, /obj/item/secure_storage/briefcase, -/obj/item/clothing/head/beret/corp/centcom/captain, +/obj/item/clothing/head/beret, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "eu" = ( @@ -1555,7 +1541,7 @@ /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "ev" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/machinery/button/blast_door{ @@ -1567,7 +1553,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "ew" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/radio/phone{ @@ -1577,7 +1563,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "ex" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/machinery/button/blast_door{ @@ -1747,7 +1733,7 @@ /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) "eH" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/ashtray, @@ -1761,7 +1747,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "eJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /turf/unsimulated/floor/cult, @@ -1833,8 +1819,7 @@ "eV" = ( /obj/machinery/door/blast/regular/open{ id_tag = "rescuebridge"; - name = "Cockpit Blast Shutters"; - + name = "Cockpit Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -1843,8 +1828,7 @@ "eW" = ( /obj/machinery/door/blast/regular/open{ id_tag = "rescuedock"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2075,8 +2059,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescuebridge"; - name = "Cockpit Blast Shutters"; - + name = "Cockpit Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2135,8 +2118,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescueeva"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/wallframe_spawn/reinforced/titanium, /obj/effect/paint/blue, @@ -2539,8 +2521,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescuebridge"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/paint/blue, /turf/floor/plating, @@ -2590,8 +2571,7 @@ /obj/machinery/door/blast/regular/open{ dir = 4; id_tag = "rescueinfirm"; - name = "Blast Shutters"; - + name = "Blast Shutters" }, /obj/effect/paint/blue, /turf/floor/plating, @@ -3513,7 +3493,7 @@ ao ao dU ao -dP +ao ad ac ac @@ -4285,7 +4265,7 @@ ar cH ar cS -dj +bg ao ao bg @@ -4350,7 +4330,7 @@ ar cI ar cT -dj +bg ao ao bg @@ -4415,7 +4395,7 @@ ar ar ar cU -dj +bg ao ao bg @@ -4480,7 +4460,7 @@ cy cJ cO cV -dj +bg ao ao ad @@ -4680,7 +4660,7 @@ ao ao ad cR -dP +ao dY dY eu @@ -4988,11 +4968,11 @@ ar ar ad ar -bs +ao ar ar ar -bs +ao ar ad cq @@ -5011,7 +4991,7 @@ ao ao ao ao -ec +de ad bB eN @@ -5076,7 +5056,7 @@ ao ao ao ao -ec +de ad bC eN @@ -5136,12 +5116,12 @@ ao ad ad ad -ec +de ao ao ao ao -ec +de ad bA eO @@ -5206,7 +5186,7 @@ ao ao ao ao -ec +de ad bA bB @@ -5271,7 +5251,7 @@ eq eq eq ao -ec +de ad bB bC @@ -5464,9 +5444,9 @@ ac ac ac ad -ec +de eq -ec +de ad ac ac diff --git a/mods/content/corporate/clothing/rigs/ert.dm b/maps/antag_spawn/ert/rig.dm similarity index 78% rename from mods/content/corporate/clothing/rigs/ert.dm rename to maps/antag_spawn/ert/rig.dm index 650d93c4881..353590e005f 100644 --- a/mods/content/corporate/clothing/rigs/ert.dm +++ b/maps/antag_spawn/ert/rig.dm @@ -2,7 +2,7 @@ name = "emergency response command hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has blue highlights. Armoured and space ready." suit_type = "emergency response command" - icon = 'mods/content/corporate/icons/rigs/commander/rig.dmi' + icon = 'icons/clothing/rigs/ert/commander/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert helmet = /obj/item/clothing/head/helmet/space/rig/ert @@ -53,20 +53,20 @@ /obj/item/clothing/head/helmet/space/rig/ert camera = /obj/machinery/camera/network/ert - icon = 'mods/content/corporate/icons/rigs/commander/helmet.dmi' + icon = 'icons/clothing/rigs/ert/commander/helmet.dmi' /obj/item/clothing/suit/space/rig/ert - icon = 'mods/content/corporate/icons/rigs/commander/chest.dmi' + icon = 'icons/clothing/rigs/ert/commander/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert - icon = 'mods/content/corporate/icons/rigs/commander/boots.dmi' + icon = 'icons/clothing/rigs/ert/commander/boots.dmi' /obj/item/clothing/gloves/rig/ert item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_NOCUFFS - icon = 'mods/content/corporate/icons/rigs/commander/gloves.dmi' + icon = 'icons/clothing/rigs/ert/commander/gloves.dmi' /obj/item/rig/ert/engineer name = "emergency response engineering hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has orange highlights. Armoured and space ready." suit_type = "emergency response engineer" - icon = 'mods/content/corporate/icons/rigs/engineer/rig.dmi' + icon = 'icons/clothing/rigs/ert/engineer/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/engineer helmet = /obj/item/clothing/head/helmet/space/rig/ert/engineer @@ -82,20 +82,20 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/helmet.dmi' + icon = 'icons/clothing/rigs/ert/engineer/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/chest.dmi' + icon = 'icons/clothing/rigs/ert/engineer/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/boots.dmi' + icon = 'icons/clothing/rigs/ert/engineer/boots.dmi' /obj/item/clothing/gloves/rig/ert/engineer - icon = 'mods/content/corporate/icons/rigs/engineer/gloves.dmi' + icon = 'icons/clothing/rigs/ert/engineer/gloves.dmi' siemens_coefficient = 0 /obj/item/rig/ert/janitor name = "emergency response sanitation hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has purple highlights. Armoured and space ready." suit_type = "emergency response sanitation" - icon = 'mods/content/corporate/icons/rigs/janitor/rig.dmi' + icon = 'icons/clothing/rigs/ert/janitor/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/janitor helmet = /obj/item/clothing/head/helmet/space/rig/ert/janitor @@ -112,19 +112,19 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/helmet.dmi' + icon = 'icons/clothing/rigs/ert/janitor/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/chest.dmi' + icon = 'icons/clothing/rigs/ert/janitor/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/boots.dmi' + icon = 'icons/clothing/rigs/ert/janitor/boots.dmi' /obj/item/clothing/gloves/rig/ert/janitor - icon = 'mods/content/corporate/icons/rigs/janitor/gloves.dmi' + icon = 'icons/clothing/rigs/ert/janitor/gloves.dmi' /obj/item/rig/ert/medical name = "emergency response medical hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has white highlights. Armoured and space ready." suit_type = "emergency response medic" - icon = 'mods/content/corporate/icons/rigs/medic/rig.dmi' + icon = 'icons/clothing/rigs/ert/medic/rig.dmi' chest = /obj/item/clothing/suit/space/rig/ert/medical helmet = /obj/item/clothing/head/helmet/space/rig/ert/medical @@ -140,19 +140,19 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/helmet.dmi' + icon = 'icons/clothing/rigs/ert/medic/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/chest.dmi' + icon = 'icons/clothing/rigs/ert/medic/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/boots.dmi' + icon = 'icons/clothing/rigs/ert/medic/boots.dmi' /obj/item/clothing/gloves/rig/ert/medical - icon = 'mods/content/corporate/icons/rigs/medic/gloves.dmi' + icon = 'icons/clothing/rigs/ert/medic/gloves.dmi' /obj/item/rig/ert/security name = "emergency response security hardsuit control module" desc = "A hardsuit used by many corporate and governmental emergency response forces. Has red highlights. Armoured and space ready." suit_type = "emergency response security" - icon = 'mods/content/corporate/icons/rigs/security/rig.dmi' + icon = 'icons/clothing/rigs/ert/security/rig.dmi' initial_modules = list( /obj/item/rig_module/ai_container, /obj/item/rig_module/maneuvering_jets, @@ -167,19 +167,19 @@ gloves = /obj/item/clothing/gloves/rig/ert/security /obj/item/clothing/head/helmet/space/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/helmet.dmi' + icon = 'icons/clothing/rigs/ert/security/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/chest.dmi' + icon = 'icons/clothing/rigs/ert/security/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/boots.dmi' + icon = 'icons/clothing/rigs/ert/security/boots.dmi' /obj/item/clothing/gloves/rig/ert/security - icon = 'mods/content/corporate/icons/rigs/security/gloves.dmi' + icon = 'icons/clothing/rigs/ert/security/gloves.dmi' /obj/item/rig/ert/assetprotection name = "heavy emergency response suit control module" desc = "A heavy, modified version of a common emergency response hardsuit. Has blood red highlights. Armoured and space ready." suit_type = "heavy emergency response" - icon = 'mods/content/corporate/icons/rigs/asset_protection/rig.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/rig.dmi' armor = list( ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, ARMOR_BULLET = ARMOR_BALLISTIC_RESISTANT, @@ -209,11 +209,11 @@ ) /obj/item/clothing/head/helmet/space/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/helmet.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/helmet.dmi' /obj/item/clothing/suit/space/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/chest.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/chest.dmi' /obj/item/clothing/shoes/magboots/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/boots.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/boots.dmi' /obj/item/clothing/gloves/rig/ert/assetprotection - icon = 'mods/content/corporate/icons/rigs/asset_protection/gloves.dmi' + icon = 'icons/clothing/rigs/ert/asset_protection/gloves.dmi' siemens_coefficient = 0 diff --git a/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index 86f6f092e57..f75023f8eb7 100644 --- a/maps/antag_spawn/mercenary/mercenary_base.dmm +++ b/maps/antag_spawn/mercenary/mercenary_base.dmm @@ -1209,7 +1209,7 @@ /obj/item/stack/material/sheet/reinforced/mapped/plasteel/ten, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/pane/mapped/rglass/fifty, /obj/item/stack/material/pane/mapped/rborosilicate/ten, /obj/structure/cable{ @@ -2751,9 +2751,9 @@ /obj/item/stack/material/sheet/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/ten, -/obj/item/stack/material/rods/ten, -/obj/item/stack/material/rods/ten, -/obj/item/stack/material/rods/ten, +/obj/item/stack/material/rods/mapped/steel/ten, +/obj/item/stack/material/rods/mapped/steel/ten, +/obj/item/stack/material/rods/mapped/steel/ten, /obj/item/stack/material/pane/mapped/glass/ten, /obj/item/stack/material/pane/mapped/glass/ten, /obj/item/stack/material/pane/mapped/glass/ten, diff --git a/maps/antag_spawn/wizard/wizard.dm b/maps/antag_spawn/wizard/wizard.dm deleted file mode 100644 index 4ca75cd145d..00000000000 --- a/maps/antag_spawn/wizard/wizard.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/map_template/ruin/antag_spawn/wizard - name = "Wizard Base" - suffixes = list("wizard/wizard_base.dmm") - apc_test_exempt_areas = list( - /area/map_template/wizard_station = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/area/map_template/wizard_station - name = "\improper Wizard's Den" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = FALSE - req_access = list(access_wizard) diff --git a/maps/antag_spawn/wizard/wizard_base.dmm b/maps/antag_spawn/wizard/wizard_base.dmm deleted file mode 100644 index 965c15e71e6..00000000000 --- a/maps/antag_spawn/wizard/wizard_base.dmm +++ /dev/null @@ -1,1747 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/space/infinity, -/area/space) -"ab" = ( -/turf/unsimulated/wall, -/area/map_template/wizard_station) -"ac" = ( -/obj/structure/table/woodentable, -/obj/item/backpack/cultpack, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ad" = ( -/turf/unsimulated/wall/fakeglass/alt{ - dir = 8 - }, -/area/map_template/wizard_station) -"ae" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 4 - }, -/area/map_template/wizard_station) -"af" = ( -/obj/structure/table/woodentable, -/obj/item/backpack/satchel/grey/withwallet, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ag" = ( -/turf/floor/carpet, -/area/map_template/wizard_station) -"ah" = ( -/obj/structure/undies_wardrobe, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ai" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 8 - }, -/area/map_template/wizard_station) -"aj" = ( -/obj/structure/door/wood, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ak" = ( -/obj/structure/table/woodentable, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/chems/drinks/flask/barflask, -/turf/floor/carpet, -/area/map_template/wizard_station) -"al" = ( -/obj/structure/table/woodentable, -/obj/item/dice, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"am" = ( -/obj/structure/bed/padded, -/obj/item/bedsheet/rd, -/turf/floor/carpet, -/area/map_template/wizard_station) -"an" = ( -/obj/structure/table/woodentable, -/obj/item/dice/d20, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"ao" = ( -/obj/structure/table/woodentable, -/obj/item/backpack/satchel/grey/withwallet, -/obj/item/clothing/glasses/eyepatch/monocle, -/turf/floor/carpet, -/area/map_template/wizard_station) -"ap" = ( -/mob/living/human/monkey{ - name = "Murphey" - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aq" = ( -/obj/structure/table/woodentable, -/obj/item/food/chawanmushi, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"ar" = ( -/obj/structure/table/woodentable, -/obj/abstract/landmark{ - name = "Teleport-Scroll" - }, -/obj/item/toy/figure/ninja, -/turf/floor/carpet, -/area/map_template/wizard_station) -"as" = ( -/obj/structure/table/woodentable, -/obj/item/megaphone, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"at" = ( -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"au" = ( -/obj/structure/table/woodentable, -/obj/item/cash/c1, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"av" = ( -/obj/structure/table/woodentable, -/obj/machinery/chemical_dispenser/bar_soft/full, -/obj/item/radio/intercom/wizard{ - dir = 8; - pixel_x = 22 - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aw" = ( -/obj/machinery/vending/magivend, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"ax" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 8 - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"ay" = ( -/obj/abstract/landmark/start{ - name = "wizard" - }, -/turf/floor/carpet, -/area/map_template/wizard_station) -"az" = ( -/obj/structure/aliumizer, -/turf/floor/carpet, -/area/map_template/wizard_station) -"aA" = ( -/obj/item/radio/intercom/wizard{ - dir = 8; - pixel_x = 22 - }, -/turf/floor/carpet, -/area/map_template/wizard_station) -"aB" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/obj/effect/decal/cleanable/cobweb, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aC" = ( -/obj/structure/bookcase{ - name = "bookcase (Tactics)" - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aD" = ( -/obj/structure/bookcase, -/obj/item/book/manual/nuclear, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aE" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aF" = ( -/turf/unsimulated/wall/fakeglass{ - dir = 1 - }, -/area/map_template/wizard_station) -"aG" = ( -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"aH" = ( -/obj/structure/bookcase, -/obj/item/book/manual/robotics_cyborgs, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aI" = ( -/obj/item/bikehorn/rubberducky, -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"aJ" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/machinery/acting/changer/mirror{ - pixel_y = 32 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aK" = ( -/obj/structure/hygiene/toilet{ - pixel_y = 8 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aL" = ( -/obj/structure/table/woodentable, -/obj/item/radio/intercom/wizard{ - dir = 4; - pixel_x = -22 - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aM" = ( -/obj/structure/closet/coffin, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"aN" = ( -/obj/structure/bed/chair/wood/wings{ - dir = 4 - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aO" = ( -/obj/structure/table/woodentable, -/obj/item/box/cups, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aP" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/red, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/head/wizard/red, -/obj/item/staff/crystal/beacon, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aQ" = ( -/obj/structure/table/woodentable, -/obj/item/bag/cash, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aR" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/marisa, -/obj/item/clothing/shoes/sandal/marisa, -/obj/item/clothing/head/wizard/marisa, -/obj/item/staff/broom, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aS" = ( -/obj/structure/table/woodentable, -/obj/item/box/candles, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aT" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/magusblue, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff/crystal, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aU" = ( -/obj/structure/closet, -/obj/item/chems/drinks/bottle/pwine, -/obj/item/chems/drinks/bottle/agedwhiskey, -/obj/item/chems/drinks/bottle/cognac, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"aV" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aW" = ( -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aX" = ( -/obj/structure/door/iron, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"aY" = ( -/obj/structure/table/woodentable, -/obj/item/box/fancy/donut, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"aZ" = ( -/obj/structure/door/wood, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"ba" = ( -/obj/structure/door/silver, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"bb" = ( -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bc" = ( -/turf/unsimulated/wall/fakeglass, -/area/map_template/wizard_station) -"bd" = ( -/obj/item/soap, -/turf/unsimulated/floor/water, -/area/map_template/wizard_station) -"be" = ( -/obj/effect/floor_decal/spline/fancy/wood{ - dir = 8 - }, -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"bf" = ( -/obj/structure/hygiene/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 32 - }, -/turf/unsimulated/floor/freezer, -/area/map_template/wizard_station) -"bg" = ( -/obj/structure/table/woodentable, -/obj/item/chems/glass/bowl/mapped/meatball, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"bh" = ( -/obj/structure/closet, -/obj/item/clothing/jumpsuit/psysuit, -/obj/item/clothing/suit/wizrobe/psypurple, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bi" = ( -/turf/unsimulated/wall/fakeglass/alt{ - dir = 1 - }, -/area/map_template/wizard_station) -"bj" = ( -/obj/structure/closet, -/obj/item/clothing/shoes/sandal/marisa{ - desc = "A set of fancy shoes that are as functional as they are comfortable."; - name = "Gentlemans Shoes" - }, -/obj/item/clothing/shirt/button/black, -/obj/item/clothing/suit/jacket/vest/gray, -/obj/item/clothing/suit/wizrobe/gentlecoat, -/obj/item/clothing/head/wizard/cap, -/obj/item/cane/fancy, -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bk" = ( -/obj/structure/closet, -/obj/item/clothing/suit/wizrobe/magusred, -/obj/item/clothing/head/wizard/magus, -/obj/item/staff/crystal/beacon, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bl" = ( -/obj/structure/closet, -/obj/item/briefcase, -/turf/unsimulated/floor/lino, -/area/map_template/wizard_station) -"bm" = ( -/obj/structure/bookcase, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"bn" = ( -/obj/item/radio/intercom/wizard{ - dir = 1; - pixel_y = -30 - }, -/turf/unsimulated/floor/wood, -/area/map_template/wizard_station) -"bo" = ( -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bp" = ( -/obj/item/radio/intercom/wizard{ - pixel_y = 20 - }, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bq" = ( -/obj/structure/fake_pylon, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"br" = ( -/obj/structure/meat_hook, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bs" = ( -/obj/item/remains/human, -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bt" = ( -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bu" = ( -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bv" = ( -/obj/structure/flora/bush/fullgrass, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bw" = ( -/mob/living/simple_animal/hostile/creature{ - name = "Experiment 35b" - }, -/turf/unsimulated/floor/lava, -/area/map_template/wizard_station) -"bx" = ( -/obj/structure/talisman_altar, -/obj/item/knife/ritual, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"by" = ( -/obj/structure/table/woodentable, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bz" = ( -/obj/effect/gateway/active/spooky, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bA" = ( -/obj/structure/table/marble, -/obj/item/flashlight/slime, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bB" = ( -/mob/living/simple_animal/hostile/goat{ - name = "Experiment 97d" - }, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bC" = ( -/obj/structure/flora/bush/grassybush, -/turf/unsimulated/floor/grass, -/area/map_template/wizard_station) -"bD" = ( -/obj/structure/flora/pottedplant/unusual, -/turf/unsimulated/floor/cult, -/area/map_template/wizard_station) -"bE" = ( -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bF" = ( -/obj/effect/overlay/palmtree_r, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bG" = ( -/mob/living/simple_animal/crab{ - name = "Experiment 68a" - }, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) -"bH" = ( -/obj/effect/overlay/coconut, -/turf/unsimulated/floor/asteroid, -/area/map_template/wizard_station) - -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aF -bi -bc -ab -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aG -aG -bd -ab -aa -aa -aa -aa -aa -aa -aa -ab -bs -bt -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aI -aG -aG -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bt -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aJ -aV -be -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bw -bt -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aK -aW -bf -ab -aa -aa -aa -aa -aa -aa -aa -ab -bt -bt -bs -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aX -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -aF -bi -bc -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aE -aL -at -aw -aD -ab -ab -aa -aa -aa -ab -ab -bq -bo -bx -bo -bq -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -aB -at -at -at -at -at -bm -ab -aF -bi -bc -ab -aM -bo -bo -bo -bo -bo -bD -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -ai -ak -ar -ac -af -ab -al -at -aN -as -aN -at -aQ -ab -at -at -bn -ab -bo -bo -ai -ab -ai -bo -bo -ai -bE -bE -bE -bH -ab -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -ad -am -ay -ag -ag -aj -at -at -aq -aY -bg -at -at -ba -at -at -at -ba -bo -bo -ad -bz -ad -bo -by -ad -bE -bE -bG -bE -ab -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -ae -ao -az -aA -ah -ab -an -ap -ax -au -ax -at -aS -ab -at -at -at -ab -bp -bo -ae -ab -ae -bo -bo -ae -bE -bF -bE -bE -ab -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -aC -at -at -at -at -at -bm -ab -aF -bi -bc -ab -aM -bo -bo -bo -bo -bo -bD -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aC -aO -at -av -aH -ab -ab -aa -aa -aa -ab -ab -br -bo -bA -bo -br -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -aZ -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -aF -bi -bc -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aP -bb -bh -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bu -bC -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aR -bb -bj -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bu -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aT -bb -bk -ab -aa -aa -aa -aa -aa -aa -aa -ab -bu -bB -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aU -bb -bl -ab -aa -aa -aa -aa -aa -aa -aa -ab -bv -bu -bu -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aF -bi -bc -ab -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index 947b876eee6..f5de2128039 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -145,7 +145,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aw" = ( @@ -253,11 +253,11 @@ pixel_x = -24; dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) @@ -335,7 +335,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -724,7 +724,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/lower) "bF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24; @@ -830,7 +830,7 @@ /area/ship/scrap/cargo/lower) "bQ" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/shuttle_control/lift, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) @@ -1111,7 +1111,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "ct" = ( @@ -1283,7 +1283,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "cQ" = ( @@ -1540,16 +1540,16 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dq" = ( /obj/machinery/light/small, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "dr" = ( @@ -1561,7 +1561,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "ds" = ( @@ -1957,7 +1957,7 @@ icon_state = "bulb1" }, /obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/deck/second{ pixel_y = 32 }, @@ -1973,7 +1973,7 @@ dir = 8; pixel_x = 22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/storage) "ej" = ( @@ -1983,7 +1983,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/eva) "ek" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 1; icon_state = "bulb1" @@ -2060,7 +2060,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2073,7 +2073,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "es" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2090,7 +2090,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -2130,7 +2130,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/eva) "ey" = ( @@ -2306,7 +2306,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/storage) "eK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -2319,7 +2319,7 @@ /obj/structure/cable{ icon_state = "5-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/storage) "eM" = ( @@ -2330,14 +2330,14 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/usedup, /area/ship/scrap/maintenance/eva) "eN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/eva) "eO" = ( @@ -2384,7 +2384,7 @@ /obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index c167b8ef9e0..b6ad7af5d29 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -228,7 +228,7 @@ /obj/machinery/computer/cryopod{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "aH" = ( /turf/floor/bluegrid/airless, @@ -289,7 +289,7 @@ /obj/item/backpack/dufflebag/syndie, /obj/item/box/ammo/shotgunshells, /obj/item/handcuffs, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "aL" = ( /obj/item/bedsheet/captain, @@ -297,12 +297,12 @@ /obj/item/gun/projectile/pistol/holdout, /obj/structure/bed/padded, /obj/abstract/submap_landmark/spawnpoint/captain, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "aM" = ( /obj/item/paper_bin, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -313,7 +313,7 @@ pixel_x = 24; req_access = newlist() }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "aN" = ( /obj/effect/wallframe_spawn/reinforced, @@ -393,7 +393,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "aU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -402,11 +402,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "aV" = ( /obj/structure/bed/chair/comfy/brown, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "aW" = ( /obj/effect/wallframe_spawn/reinforced, @@ -466,7 +466,7 @@ }, /obj/structure/window/reinforced/full, /obj/structure/table/marble, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "bb" = ( /obj/structure/cable{ @@ -476,10 +476,10 @@ dir = 1; level = 2 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "bc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable{ icon_state = "0-8" }, @@ -490,7 +490,7 @@ /obj/item/chems/drinks/glass2/coffeecup/one, /obj/item/tank/oxygen, /obj/item/clothing/mask/breath/emergency, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/scrap/command/captain) "bd" = ( /obj/effect/wallframe_spawn/reinforced, @@ -587,7 +587,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/dock) "bo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -654,7 +654,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/dock) "bt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, @@ -773,7 +773,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -912,7 +912,7 @@ /turf/floor/usedup, /area/ship/scrap/dock) "bM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -1234,7 +1234,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/usedup, /area/ship/scrap/crew/toilets) @@ -1554,7 +1554,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/usedup, /area/ship/scrap/crew/toilets) @@ -1571,7 +1571,7 @@ icon_state = "twindow" }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc/derelict{ dir = 4; @@ -1592,7 +1592,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "conpipe-c" @@ -1608,7 +1608,7 @@ /turf/wall, /area/ship/scrap/crew/saloon) "dn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -1668,7 +1668,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/tiled/usedup, @@ -1824,13 +1824,13 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/portable_atmospherics/canister/air, /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/corner/beige{ dir = 6 @@ -1940,7 +1940,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/crew/hallway/port) "dX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24; @@ -1954,7 +1954,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "dZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -1973,7 +1973,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 4; icon_state = "bulb1" @@ -2055,7 +2055,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/crew/kitchen) "ek" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, @@ -2173,7 +2173,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "es" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -2386,7 +2386,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4; @@ -2418,7 +2418,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "eM" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc/derelict{ dir = 4; @@ -2568,7 +2568,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "fb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/industrial/warning, /obj/machinery/computer/shuttle_control/lift, @@ -2585,7 +2585,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/cargo) "fd" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/effect/floor_decal/industrial/warning, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -2972,7 +2972,7 @@ /area/ship/scrap/cargo) "fO" = ( /obj/structure/emergency_dispenser/west, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -3090,7 +3090,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -3348,7 +3348,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/fire) "gD" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -3486,7 +3486,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/hallway) "gO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3756,8 +3756,8 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "ho" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -3792,7 +3792,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "hq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -3962,7 +3962,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /obj/structure/cable{ icon_state = "1-8" @@ -3981,7 +3981,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -4058,7 +4058,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "hM" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/atmos) @@ -4140,7 +4140,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "hU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/yellow{ dir = 10 }, @@ -4542,13 +4542,13 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "iO" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /mob/living/simple_animal/hostile/carp, /turf/space, /area/ship/scrap/maintenance/atmos) "iP" = ( /obj/item/stack/material/sheet/mapped/steel, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/ship/scrap/maintenance/atmos) "iQ" = ( @@ -4686,7 +4686,7 @@ /turf/floor/usedup, /area/ship/scrap/maintenance/power) "jc" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/power) @@ -4861,7 +4861,7 @@ /turf/wall, /area/ship/scrap/maintenance/power) "jB" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "jC" = ( @@ -4939,7 +4939,7 @@ /area/ship/scrap/maintenance/engine/aft) "jN" = ( /obj/item/stack/material/sheet/mapped/steel, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/structure/lattice, /turf/space, /area/ship/scrap/maintenance/engine/aft) @@ -5003,7 +5003,7 @@ /turf/floor/plating/airless, /area/ship/scrap/maintenance/engine/aft) "jX" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/ship/scrap/maintenance/engine/aft) "jY" = ( diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index d5a20049ae2..37d26d36b55 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -3,11 +3,11 @@ #include "bearcat_access.dm" /obj/abstract/submap_landmark/joinable_submap/bearcat - name = "FTV Bearcat" + name = "FTV Bearcat" archetype = /decl/submap_archetype/derelict/bearcat /decl/submap_archetype/derelict/bearcat - descriptor = "derelict cargo vessel" + name = "derelict cargo vessel" crew_jobs = list( /datum/job/submap/bearcat_captain, /datum/job/submap/bearcat_crewman @@ -125,9 +125,9 @@ shoes = /obj/item/clothing/shoes/color/black r_pocket = /obj/item/radio -/decl/outfit/deadcap/post_equip(mob/living/human/H) +/decl/outfit/deadcap/post_equip(mob/living/wearer) ..() - var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) + var/obj/item/clothing/uniform = wearer.get_equipped_item(slot_w_uniform_str) if(uniform) var/obj/item/clothing/shirt/hawaii/random/eyegore = new() if(uniform.can_attach_accessory(eyegore)) @@ -135,4 +135,4 @@ else qdel(eyegore) var/obj/item/cell/super/C = new() - H.put_in_hands(C) + wearer.put_in_hands(C) diff --git a/maps/away/bearcat/bearcat_jobs.dm b/maps/away/bearcat/bearcat_jobs.dm index b479f141065..dce4ece7f44 100644 --- a/maps/away/bearcat/bearcat_jobs.dm +++ b/maps/away/bearcat/bearcat_jobs.dm @@ -35,9 +35,9 @@ pda_type = /obj/item/modular_computer/pda/heads/captain id_type = /obj/item/card/id/bearcat_captain -/decl/outfit/job/bearcat/captain/post_equip(var/mob/living/human/H) +/decl/outfit/job/bearcat/captain/post_equip(var/mob/living/wearer) ..() - var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) + var/obj/item/clothing/uniform = wearer.get_equipped_item(slot_w_uniform_str) if(uniform) var/obj/item/clothing/shirt/hawaii/random/eyegore = new() if(uniform.can_attach_accessory(eyegore)) diff --git a/maps/away/casino/casino.dm b/maps/away/casino/casino.dm index 504a513e738..466a76e8666 100644 --- a/maps/away/casino/casino.dm +++ b/maps/away/casino/casino.dm @@ -101,7 +101,7 @@ /obj/structure/casino/roulette/attack_hand(mob/user) - if(user.a_intent == I_HURT || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) + if(user.check_intent(I_FLAG_HARM) || !user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) return ..() if(busy) diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index b1d54db6ab7..f9fa8619ce6 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -152,7 +152,7 @@ /area/casino/casino_bridge) "aw" = ( /obj/item/wirecutters, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ax" = ( @@ -1293,7 +1293,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/cigar{ pixel_y = 5 }, @@ -1317,7 +1317,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/toolbox/mechanical, /obj/item/stack/cable_coil, /turf/floor/plating, @@ -2244,7 +2244,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "gu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/clothing/mask/smokable/pipe, /obj/machinery/light{ dir = 1 @@ -2253,7 +2253,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "gv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/cigar, /obj/item/box/fancy/cigar{ pixel_y = 5 @@ -2726,13 +2726,13 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "ia" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/plate, /obj/item/utensil/fork, /turf/floor/carpet, /area/casino/casino_mainfloor) "ib" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/carpet, /area/casino/casino_mainfloor) "ic" = ( @@ -2855,13 +2855,13 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "iq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/plate, /obj/item/food/applepie, /turf/floor/carpet, /area/casino/casino_mainfloor) "ir" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/plate, /obj/item/food/bigbiteburger, /turf/floor/carpet, @@ -3048,7 +3048,7 @@ /turf/floor/tiled, /area/casino/casino_kitchen) "iR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/plate, /obj/item/utensil/spoon, /turf/floor/carpet, @@ -3385,7 +3385,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "jJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/ashtray, /obj/item/food/cubancarp, /turf/floor/carpet, @@ -3463,7 +3463,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "jU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/plate, /obj/item/food/waffles, /obj/item/chems/drinks/cans/iced_tea, @@ -3631,7 +3631,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "kt" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pizzabox/meat, /turf/floor/carpet, /area/casino/casino_mainfloor) @@ -3795,7 +3795,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_mainfloor) "kR" = ( /turf/wall, @@ -3810,7 +3810,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_mainfloor) "kT" = ( /turf/wall, @@ -3825,7 +3825,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_mainfloor) "kV" = ( /turf/wall, @@ -3882,7 +3882,7 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lh" = ( /obj/structure/cable{ @@ -3891,7 +3891,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "li" = ( /obj/machinery/light{ @@ -3903,7 +3903,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lj" = ( /obj/machinery/media/jukebox, @@ -3913,7 +3913,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lk" = ( /obj/structure/flora/pottedplant, @@ -3929,7 +3929,7 @@ name = "east bump"; pixel_x = 24 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "ll" = ( /obj/structure/cable{ @@ -3939,7 +3939,7 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "lm" = ( /obj/structure/cable{ @@ -3948,7 +3948,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "ln" = ( /obj/machinery/light{ @@ -3960,7 +3960,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "lo" = ( /obj/structure/flora/pottedplant, @@ -3976,7 +3976,7 @@ name = "east bump"; pixel_x = 24 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "lp" = ( /obj/structure/cable{ @@ -3986,7 +3986,7 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "lq" = ( /obj/structure/cable{ @@ -3995,7 +3995,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "lr" = ( /obj/machinery/light{ @@ -4007,7 +4007,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "ls" = ( /obj/structure/flora/pottedplant, @@ -4023,7 +4023,7 @@ name = "east bump"; pixel_x = 24 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "lt" = ( /obj/machinery/door/firedoor, @@ -4104,59 +4104,59 @@ /area/casino/casino_crew_atmos) "lD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lE" = ( /obj/random/ammo, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lF" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood/splatter, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lG" = ( /obj/effect/decal/cleanable/blood/drip, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lH" = ( /obj/item/trash/cigbutt/professionals, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lI" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lJ" = ( /obj/item/secure_storage/safe{ pixel_x = 30 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "lL" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "lM" = ( /obj/item/secure_storage/safe{ pixel_x = 30 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "lN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "lO" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "lP" = ( /obj/item/secure_storage/safe{ pixel_x = 25 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "lQ" = ( /obj/structure/cable{ @@ -4216,58 +4216,58 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "lZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/cigar{ pixel_y = 5 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "ma" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/ashtray, /obj/random/drinkbottle, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "mb" = ( /obj/structure/bed/chair/comfy/red{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "mc" = ( /obj/machinery/light{ dir = 4; icon_state = "tube1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "md" = ( /obj/structure/bed/chair/comfy/red, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "me" = ( /obj/machinery/light{ dir = 4; icon_state = "tube1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "mf" = ( /obj/structure/bed/chair/comfy/red, /obj/item/flame/fuelled/lighter/zippo/random, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "mg" = ( /obj/machinery/light{ dir = 4; icon_state = "tube1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "mi" = ( /obj/structure/cable{ @@ -4281,7 +4281,7 @@ /turf/floor/tiled/white, /area/casino/casino_patron_bathroom) "mj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/drinks/bottle/agedwhiskey, /obj/item/clothing/mask/smokable/cigarette/cigar/havana, /obj/item/clothing/mask/smokable/cigarette/cigar/havana, @@ -4325,66 +4325,66 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "mq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/drinkbottle, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "mr" = ( -/obj/structure/table/woodentable, -/turf/floor/wood, +/obj/structure/table/laminate, +/turf/floor/laminate, /area/casino/casino_private_vip) "ms" = ( /obj/structure/bed/chair/comfy/red{ dir = 8 }, /obj/item/bag/cash, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "mt" = ( /obj/structure/bed, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private_vip) "mu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/drinkbottle, /obj/random/coin, /obj/random/coin, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "mv" = ( /obj/structure/bed/chair/comfy/red{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "mw" = ( /obj/structure/bed, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private1) "mx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/drinkbottle, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "my" = ( /obj/structure/bed/chair/comfy/red{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "mz" = ( /obj/structure/bed, /obj/random/coin, -/turf/floor/wood, +/turf/floor/laminate, /area/casino/casino_private2) "mB" = ( /obj/random/coin, diff --git a/maps/away/errant_pisces/errant_pisces.dm b/maps/away/errant_pisces/errant_pisces.dm index 97f8bcff3e7..ba006dddf06 100644 --- a/maps/away/errant_pisces/errant_pisces.dm +++ b/maps/away/errant_pisces/errant_pisces.dm @@ -66,7 +66,7 @@ /obj/item/food/butchery/meat/fish/shark desc = "A fillet of cosmoshark meat." - meat_name = "cosmoshark" + butchery_data = /decl/butchery_data/animal/fish/space_carp/shark color = "#cecece" center_of_mass = @'{"x":17,"y":13}' bitesize = 8 @@ -112,9 +112,9 @@ return SPAN_NOTICE("A few strands of \the [src] have been severed.") /obj/structure/net/attackby(obj/item/W, mob/user) - if(W.sharp || W.edge) - var/force = W.get_attack_force(user) - if (!(W.sharp) || (W.sharp && force < 10))//is not sharp enough or at all + if(W.is_sharp() || W.has_edge()) + var/force = W.expend_attack_force(user) + if (!(W.is_sharp()) || (W.is_sharp() && force < 10))//is not sharp enough or at all to_chat(user,"You can't cut through \the [src] with \the [W], it's too dull.") return TRUE visible_message("[user] starts to cut through \the [src] with \the [W]!") diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index 7e62686eb0d..df04d63c3a7 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -2525,27 +2525,27 @@ "gp" = ( /obj/structure/bed/padded, /obj/item/bedsheet/rainbow, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gq" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gr" = ( /obj/machinery/computer/modular{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gs" = ( /obj/structure/bed/padded, /obj/item/bedsheet/orange, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gt" = ( /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gu" = ( /obj/machinery/light{ @@ -2553,20 +2553,20 @@ icon_state = "tube1" }, /obj/machinery/media/jukebox, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gv" = ( /obj/structure/bed/chair/comfy/brown{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gx" = ( /obj/effect/wallframe_spawn/reinforced, @@ -2664,17 +2664,17 @@ dir = 8; icon_state = "tube1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gM" = ( /mob/living/simple_animal/hostile/carp/shark, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gN" = ( /obj/structure/closet/cabinet, /obj/item/clothing/shoes/jackboots, /obj/item/clothing/suit/armor/vest, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gO" = ( /obj/structure/bed/chair/comfy/teal, @@ -2682,23 +2682,23 @@ dir = 8; icon_state = "tube1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gP" = ( /obj/structure/filing_cabinet/chestdrawer, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gQ" = ( /obj/structure/table/gamblingtable, /obj/item/deck/cards, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gR" = ( /obj/structure/bed/chair/comfy/brown{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "gS" = ( /obj/structure/cable/green{ @@ -2742,37 +2742,37 @@ /turf/floor/tiled, /area/errant_pisces/dorms) "gZ" = ( -/obj/structure/table/woodentable, -/turf/floor/wood, +/obj/structure/table/laminate, +/turf/floor/laminate, /area/errant_pisces/rooms) "ha" = ( /obj/structure/closet, /obj/random/smokes, /obj/random/projectile, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin, /obj/item/flashlight/lamp, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hc" = ( /obj/structure/closet, /obj/random/snack, /obj/random/tool, /obj/random/suit, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hd" = ( /obj/structure/table/gamblingtable, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "he" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/ashtray, /obj/random/smokes, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hf" = ( /obj/structure/cable/green{ @@ -2784,7 +2784,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hg" = ( /obj/machinery/door/airlock, @@ -2884,12 +2884,12 @@ /area/errant_pisces/infirmary) "hr" = ( /obj/machinery/door/airlock, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hs" = ( /obj/abstract/landmark/corpse/bridgeofficer, /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "ht" = ( /obj/structure/bed/chair/comfy/brown, @@ -2897,7 +2897,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hu" = ( /obj/machinery/vending/coffee, @@ -2916,14 +2916,14 @@ /area/errant_pisces/dorms) "hx" = ( /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hy" = ( /obj/machinery/light{ dir = 1; icon_state = "tube1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hz" = ( /obj/machinery/alarm{ @@ -2934,20 +2934,20 @@ /obj/structure/bed/chair/comfy/brown{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hA" = ( /obj/machinery/power/apc{ name = "south bump"; pixel_y = -24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/smokes, /obj/structure/cable/green, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/rooms) "hB" = ( /obj/machinery/vending/games, @@ -5670,14 +5670,14 @@ /area/errant_pisces/bridge) "oV" = ( /obj/machinery/door/airlock, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "oW" = ( /obj/machinery/alarm{ alarm_id = "xenobio1_alarm"; pixel_y = 24 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "oX" = ( /obj/machinery/light{ @@ -5689,13 +5689,13 @@ /obj/random/ammo, /obj/random/cash, /obj/random/cash, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "oY" = ( /obj/machinery/computer/modular{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "oZ" = ( /obj/machinery/vending/medical{ @@ -5775,17 +5775,17 @@ /turf/floor/tiled, /area/errant_pisces/bridge) "pl" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "pm" = ( /obj/structure/bed/chair/office/light{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "pn" = ( -/obj/structure/table/woodentable, -/turf/floor/wood, +/obj/structure/table/laminate, +/turf/floor/laminate, /area/errant_pisces/bridge) "po" = ( /obj/effect/wallframe_spawn/reinforced, @@ -5867,12 +5867,12 @@ /area/errant_pisces/bridge) "pB" = ( /obj/structure/bookcase/manuals/engineering, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "pC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/toy, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "pD" = ( /obj/machinery/light/small{ @@ -5933,7 +5933,7 @@ /area/errant_pisces/bridge) "pN" = ( /obj/structure/curtain/open/bed, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "pO" = ( /obj/structure/hygiene/shower{ @@ -6093,7 +6093,7 @@ "qi" = ( /obj/item/bedsheet/captain, /obj/structure/bed/padded, -/turf/floor/wood, +/turf/floor/laminate, /area/errant_pisces/bridge) "qj" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ diff --git a/maps/away/liberia/hud.dmi b/maps/away/liberia/hud.dmi new file mode 100644 index 00000000000..01fe4cbfcd4 Binary files /dev/null and b/maps/away/liberia/hud.dmi differ diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 35999ef09ff..fee5cdfb47d 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -869,7 +869,7 @@ /obj/structure/cable/blue{ icon_state = "1-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "bH" = ( /obj/machinery/door/firedoor, @@ -1095,7 +1095,7 @@ pixel_x = -6; pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "merchant_ship_vent" }, @@ -1162,7 +1162,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/mule) "cg" = ( /obj/machinery/door/airlock/hatch{ @@ -1178,7 +1178,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/mule) "ch" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, @@ -1529,7 +1529,7 @@ /obj/machinery/computer/ship/sensors{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/mule) "cN" = ( /obj/effect/paint/silver, @@ -1656,7 +1656,7 @@ /turf/floor/tiled/techfloor, /area/liberia/engineeringengines) "cZ" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/machinery/chemical_dispenser/bar_coffee{ dir = 1 }, @@ -2340,8 +2340,8 @@ /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stack/material/sheet/reinforced/mapped/fiberglass/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/forty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, @@ -3215,7 +3215,7 @@ dir = 1; pixel_y = -24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "fI" = ( /obj/structure/closet/emcloset, @@ -3301,7 +3301,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /turf/floor/carpet, /area/liberia/bar) @@ -3322,15 +3322,15 @@ pixel_y = 24 }, /obj/abstract/submap_landmark/spawnpoint/liberia, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "fS" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ dir = 1 }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "fT" = ( /obj/structure/bed/chair/wood/walnut{ @@ -3345,29 +3345,29 @@ icon_state = "0-2" }, /obj/abstract/submap_landmark/spawnpoint/liberia, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "fU" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/random/drinkbottle, /obj/random/drinkbottle, /obj/structure/window/reinforced{ dir = 8 }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "fV" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/machinery/chemical_dispenser/bar_soft/full, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "fW" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/machinery/light{ dir = 4 }, /obj/machinery/chemical_dispenser/bar_alc/full, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "fX" = ( /obj/effect/floor_decal/techfloor{ @@ -3486,7 +3486,7 @@ /area/liberia/bar) "gg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/deck/cards, /turf/floor/carpet, /area/liberia/bar) @@ -3500,22 +3500,22 @@ /turf/floor/carpet, /area/liberia/bar) "gi" = ( -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gj" = ( /obj/structure/bed/chair/wood/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/abstract/submap_landmark/spawnpoint/liberia, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gk" = ( /obj/machinery/door/window/westright, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gl" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/box/glasses/pint, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gm" = ( /obj/structure/extinguisher_cabinet{ @@ -3610,7 +3610,7 @@ /obj/structure/cable/blue{ icon_state = "2-4" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gv" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, @@ -3621,7 +3621,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gw" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -3637,10 +3637,10 @@ /obj/structure/cable/blue{ icon_state = "1-2" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gx" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/structure/window/reinforced{ dir = 8 }, @@ -3650,10 +3650,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gy" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/ashtray/glass, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -3662,10 +3662,10 @@ dir = 4 }, /obj/item/clothing/mask/smokable/cigarette/cigar/havana, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gz" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/chems/glass/rag, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -3676,7 +3676,7 @@ /obj/structure/disposalpipe/segment/bent{ dir = 4 }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -3833,7 +3833,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "gN" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3842,7 +3842,7 @@ /obj/machinery/light_switch{ pixel_y = 24 }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "gO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3859,7 +3859,7 @@ /obj/structure/cable/blue{ icon_state = "0-2" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "gP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -3874,7 +3874,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "gQ" = ( /obj/machinery/door/airlock{ @@ -3896,7 +3896,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "gR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -3909,7 +3909,7 @@ icon_state = "4-8" }, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "gS" = ( /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, @@ -3922,7 +3922,7 @@ /obj/structure/cable/blue{ icon_state = "2-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "gT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3934,7 +3934,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "gU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3947,7 +3947,7 @@ /obj/structure/cable/blue{ icon_state = "1-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "gW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -3955,7 +3955,7 @@ /obj/structure/cable/blue{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "gX" = ( /obj/item/stool/padded, @@ -3963,20 +3963,20 @@ dir = 10 }, /obj/abstract/submap_landmark/spawnpoint/liberia, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gY" = ( /obj/item/stool/padded, /obj/effect/floor_decal/spline/plain/brown, /obj/abstract/submap_landmark/spawnpoint/liberia, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "gZ" = ( /obj/item/stool/padded, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/spline/plain/brown, /obj/abstract/submap_landmark/spawnpoint/liberia, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "ha" = ( /obj/machinery/door/airlock/glass{ @@ -3986,7 +3986,7 @@ /obj/structure/cable/blue{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "hb" = ( /obj/machinery/light/small{ @@ -4039,14 +4039,14 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "hh" = ( /obj/effect/floor_decal/spline/plain/brown, /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "hi" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -4054,7 +4054,7 @@ dir = 4 }, /obj/effect/floor_decal/spline/plain/brown, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "hj" = ( /obj/machinery/door/airlock{ @@ -4067,18 +4067,18 @@ /obj/structure/cable/blue{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/personellroom2) "hk" = ( /obj/machinery/media/jukebox/old, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "hl" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "hm" = ( /obj/structure/window/reinforced{ @@ -4184,43 +4184,43 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "hz" = ( /obj/machinery/vending/cigarette{ dir = 1; products = list(/obj/item/box/fancy/cigarettes=10,/obj/item/box/matches=10,/obj/item/flame/fuelled/lighter/zippo=4,/obj/item/clothing/mask/smokable/cigarette/cigar/havana=2) }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "hA" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/scanner/price, /obj/item/scanner/price, /obj/machinery/light/small, /obj/item/scanner/price, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "hB" = ( /obj/machinery/pipelayer, /turf/floor/tiled/techfloor/grid, /area/liberia/engineeringreactor) "hC" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/ashtray, /obj/item/box/matches, /obj/random/smokes, /turf/floor/carpet/red, /area/liberia/captain) "hD" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /mob/living/simple_animal/tindalos{ name = "Eddy" }, /turf/floor/carpet/red, /area/liberia/captain) "hE" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /turf/floor/carpet/red, /area/liberia/captain) @@ -4257,7 +4257,7 @@ /turf/floor/carpet, /area/liberia/personellroom2) "hI" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -4312,7 +4312,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/merchantstorage) "hN" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/random/action_figure, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -5100,11 +5100,11 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "jO" = ( /obj/structure/bookcase/skill_books/random, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "jP" = ( /obj/effect/wallframe_spawn/reinforced, @@ -5178,7 +5178,7 @@ /turf/floor/carpet, /area/liberia/library) "jX" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/lava/orange, /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 @@ -5186,7 +5186,7 @@ /turf/floor/carpet, /area/liberia/library) "jY" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/structure/flora/pottedplant/deskleaf{ pixel_x = -5; pixel_y = 2 @@ -5222,7 +5222,7 @@ /turf/floor/carpet/magenta, /area/liberia/guestroom2) "ka" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/structure/flora/pottedplant/smallcactus{ pixel_x = -5; pixel_y = 9 @@ -5246,7 +5246,7 @@ /turf/floor/carpet, /area/liberia/library) "kc" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/box/fancy/donut, /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 @@ -5288,7 +5288,7 @@ /obj/structure/disposalpipe/segment/bent{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "ki" = ( /obj/machinery/newscaster{ @@ -5301,7 +5301,7 @@ /obj/structure/disposalpipe/segment/bent{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "kk" = ( /obj/effect/floor_decal/techfloor{ @@ -5424,7 +5424,7 @@ /turf/floor/carpet, /area/liberia/library) "kr" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/modular_computer/laptop/preset/custom_loadout/standard{ dir = 8 }, @@ -5472,7 +5472,7 @@ /turf/floor/carpet, /area/liberia/library) "ky" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/effect/floor_decal/spline/fancy/wood, /obj/machinery/power/apc/liberia{ name = "south bump"; @@ -5482,7 +5482,7 @@ /turf/floor/carpet, /area/liberia/library) "kz" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light/small{ @@ -5774,7 +5774,7 @@ pixel_x = -28; pixel_y = -10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/structure/cable/blue{ icon_state = "1-4" @@ -6032,7 +6032,7 @@ /turf/floor/carpet/green, /area/liberia/guestroom1) "lB" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "lC" = ( /obj/effect/floor_decal/corner_techfloor_grid{ @@ -6121,7 +6121,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "mu" = ( /obj/effect/floor_decal/techfloor{ @@ -6188,7 +6188,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "ns" = ( /obj/structure/cable/blue{ @@ -6231,7 +6231,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "op" = ( /obj/structure/railing/mapped, @@ -6241,7 +6241,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/merchantstorage) "os" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/effect/floor_decal/spline/fancy/wood, /turf/floor/carpet/red, /area/liberia/traidingroom) @@ -6421,7 +6421,7 @@ /turf/floor/tiled/techfloor, /area/liberia/cryo) "pZ" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/machinery/fabricator/micro/bartender{ pixel_x = 4 }, @@ -6743,7 +6743,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "sY" = ( /obj/item/stack/material/panel/mapped/plastic/ten{ @@ -6757,7 +6757,7 @@ pixel_x = 4; pixel_y = -4 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, @@ -6888,7 +6888,7 @@ /obj/structure/cable/blue{ icon_state = "1-2" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/bar) "wq" = ( /obj/machinery/door/airlock/external{ @@ -7019,7 +7019,7 @@ /obj/machinery/light_switch{ pixel_y = 24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "yC" = ( /obj/effect/floor_decal/techfloor{ @@ -7120,7 +7120,7 @@ /turf/wall/r_wall/prepainted, /area/liberia/captain) "Af" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/effect/floor_decal/borderfloor{ dir = 10 }, @@ -7228,7 +7228,7 @@ /turf/floor/tiled/steel_grid, /area/liberia/atmos) "BH" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "BJ" = ( /turf/wall/prepainted, @@ -7255,7 +7255,7 @@ dir = 8; pixel_x = 24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "DI" = ( /turf/wall/prepainted, @@ -7523,8 +7523,8 @@ /obj/structure/closet/crate, /obj/item/stack/material/sheet/mapped/steel/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/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/reinforced/mapped/titanium/fifty, /obj/item/stack/material/sheet/reinforced/mapped/ocp/fifty, @@ -7570,7 +7570,7 @@ /obj/structure/cable/blue{ icon_state = "1-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/bar) "Hv" = ( /turf/wall/prepainted, @@ -7748,7 +7748,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /turf/floor/carpet/blue, /area/liberia/personellroom1) "Kh" = ( @@ -7862,7 +7862,7 @@ /turf/wall/r_wall/prepainted, /area/liberia/officeroom) "Ml" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/ashtray/glass, /obj/effect/floor_decal/borderfloor{ dir = 6 @@ -7945,7 +7945,7 @@ /obj/structure/cable/blue{ icon_state = "2-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "Od" = ( /turf/wall/prepainted, @@ -8106,7 +8106,7 @@ /turf/floor/tiled/techfloor, /area/liberia/merchantstorage) "QK" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/effect/floor_decal/borderfloor, /obj/effect/floor_decal/corner/green{ dir = 5 @@ -8150,7 +8150,7 @@ /area/liberia/merchantstorage) "RO" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "Sa" = ( /turf/wall/prepainted, @@ -8160,7 +8160,7 @@ /obj/structure/cable/blue{ icon_state = "1-8" }, -/turf/floor/wood/ebony, +/turf/floor/laminate/ebony, /area/liberia/captain) "Se" = ( /turf/wall/r_wall/prepainted, @@ -8237,7 +8237,7 @@ /obj/structure/disposalpipe/segment/bent{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "Tz" = ( /obj/machinery/door/airlock, @@ -8306,7 +8306,7 @@ /obj/structure/cable/blue{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "Uh" = ( /turf/wall/r_wall/prepainted, @@ -8402,7 +8402,7 @@ /obj/structure/cable/blue{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/liberia/library) "Wn" = ( /obj/effect/floor_decal/borderfloor{ @@ -8512,7 +8512,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /turf/floor/carpet/blue, /area/liberia/personellroom1) diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 72d4d2ddbb2..34269ce2cd3 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -1,6 +1,6 @@ // Submap datum and archetype. /decl/submap_archetype/liberia - descriptor = "merchant ship" + name = "merchant ship" crew_jobs = list( /datum/job/submap/merchant ) @@ -11,7 +11,8 @@ info = "You are free traders who have drifted into unknown distances in search of profit. Travel, trade, make profit!" supervisors = "the invisible hand of the market" selection_color = "#515151" - + hud_icon = 'maps/away/liberia/hud.dmi' + hud_icon_state = "hudmerchant" ideal_character_age = 20 minimal_player_age = 7 diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 94c58cd1b3f..55d86201533 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -117,14 +117,14 @@ /turf/floor/plating/airless, /area/space) "aq" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ar" = ( /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel, /turf/floor/plating/airless, /area/space) @@ -760,7 +760,7 @@ /turf/floor/plating/airless, /area/lost_supply_base) "cf" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/item/stack/material/sheet/mapped/steel, /turf/floor/plating/airless, /area/lost_supply_base) @@ -1982,7 +1982,7 @@ /turf/unsimulated/mask, /area/mine/unexplored) "gu" = ( -/turf/floor, +/turf/floor/barren, /area/mine/explored) "ib" = ( /obj/structure/hygiene/sink{ diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index d6e4edc107a..de625ae9346 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -106,7 +106,7 @@ /turf/floor/plating/airless, /area/space) "ao" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "ap" = ( @@ -529,7 +529,7 @@ /turf/space, /area/magshield/smes_storage) "bF" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/smes_storage) "bG" = ( @@ -1265,7 +1265,7 @@ /turf/floor/plating/airless, /area/magshield/north) "dF" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/floor/plating/airless, /area/magshield/north) "dG" = ( @@ -2268,7 +2268,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "gH" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 10 }, /obj/item/box/checkers, @@ -2278,20 +2278,20 @@ /turf/floor/carpet/blue, /area/magshield/west) "gI" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 10 }, /obj/item/belt/champion, /turf/floor/carpet/blue, /area/magshield/west) "gJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 10 }, /turf/floor/carpet/blue, /area/magshield/west) "gK" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 10 }, /obj/item/bible/booze, @@ -2385,7 +2385,7 @@ /turf/floor/tiled, /area/magshield/west) "gY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/action_figure, /turf/floor/tiled, /area/magshield/west) @@ -2483,7 +2483,7 @@ /turf/floor/tiled, /area/magshield/west) "hn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/sword/replica, /turf/floor/tiled, /area/magshield/west) @@ -2523,7 +2523,7 @@ /turf/floor/plating/airless, /area/space) "hw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/plushie/large, /turf/floor/tiled, /area/magshield/west) @@ -2565,7 +2565,7 @@ /turf/floor/tiled, /area/magshield/west) "hC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/toy/shipmodel, /turf/floor/tiled, /area/magshield/west) @@ -2614,7 +2614,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "hK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/book/manual/supermatter_engine, /turf/floor/carpet/blue, /area/magshield/west) @@ -2665,7 +2665,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "hT" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/book/manual/evaguide, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -2727,7 +2727,7 @@ /turf/floor/tiled, /area/magshield/west) "hZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/accessory, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -2735,7 +2735,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "ia" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flame/fuelled/lighter/zippo/random, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -2743,18 +2743,18 @@ /turf/floor/carpet/blue, /area/magshield/west) "ib" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/ashtray, /obj/random/smokes, /obj/machinery/light, /turf/floor/carpet/blue, /area/magshield/west) "ic" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/floor/tiled/dark, /area/magshield/west) "id" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/west) "ie" = ( @@ -3769,7 +3769,7 @@ /turf/floor/tiled, /area/magshield/south) "lg" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/magshield/south) "lh" = ( diff --git a/maps/away/mining/mining-asteroid.dmm b/maps/away/mining/mining-asteroid.dmm index 63713ba4434..89a0612365c 100644 --- a/maps/away/mining/mining-asteroid.dmm +++ b/maps/away/mining/mining-asteroid.dmm @@ -6,14 +6,14 @@ /turf/unsimulated/mask, /area/mine/unexplored) "af" = ( -/turf/floor, +/turf/floor/barren, /area/mine/explored) "aj" = ( /turf/wall/r_wall, /area/djstation) "ak" = ( /obj/random/junk, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "al" = ( /obj/random/trash, @@ -204,15 +204,15 @@ /area/djstation) "be" = ( /obj/random/maintenance, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "bf" = ( /obj/effect/overmap/visitable/sector/cluster, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "cb" = ( /obj/effect/shuttle_landmark/cluster/nav5, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "db" = ( /obj/effect/shuttle_landmark/cluster/nav6, @@ -236,7 +236,7 @@ /area/space) "ib" = ( /obj/effect/shuttle_landmark/cluster/nav7, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "jb" = ( /obj/machinery/button/access/exterior{ @@ -245,7 +245,7 @@ pixel_y = -24; dir = 1 }, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "kb" = ( /obj/machinery/door/airlock/external{ @@ -345,7 +345,7 @@ req_access = null; dir = 4 }, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "wb" = ( /obj/machinery/door/airlock/external{ diff --git a/maps/away/mining/mining-orb.dmm b/maps/away/mining/mining-orb.dmm index 0f03154da5c..46fc8c21fb4 100644 --- a/maps/away/mining/mining-orb.dmm +++ b/maps/away/mining/mining-orb.dmm @@ -14,10 +14,10 @@ /turf/unsimulated/mask, /area/mine/unexplored) "ae" = ( -/turf/floor, +/turf/floor/barren, /area/mine/explored) "af" = ( -/turf/floor, +/turf/floor/barren, /area/mine/unexplored) "ag" = ( /turf/wall/natural/random/high_chance, @@ -250,7 +250,7 @@ /area/mine/explored) "st" = ( /obj/effect/shuttle_landmark/orb/nav7, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "vc" = ( /obj/effect/floor_decal/spline/fancy/wood{ @@ -277,7 +277,7 @@ /obj/effect/floor_decal/spline/fancy/wood/corner{ dir = 4 }, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "Aj" = ( /obj/effect/floor_decal/spline/fancy/wood/corner, diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 9876407c368..867c49b5614 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -339,22 +339,22 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 5 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 5 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 1 }, @@ -377,7 +377,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "by" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "bz" = ( @@ -407,7 +407,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/noticeboard/anomaly{ default_pixel_y = 32 }, @@ -420,22 +420,22 @@ /obj/effect/floor_decal/corner/purple{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bD" = ( /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "bE" = ( /obj/effect/floor_decal/corner/purple{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bF" = ( @@ -459,13 +459,13 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/cigbutt/cigarbutt, /turf/floor, /area/outpost/abandoned) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bK" = ( @@ -473,8 +473,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bM" = ( @@ -482,7 +482,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled/white, /area/outpost/abandoned) @@ -497,14 +497,14 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/purple{ dir = 10 }, /turf/floor/tiled/white, /area/outpost/abandoned) "bR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small, /turf/floor, /area/outpost/abandoned) @@ -525,7 +525,7 @@ /obj/effect/floor_decal/corner/purple{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/outpost/abandoned) "bV" = ( @@ -570,7 +570,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cc" = ( @@ -582,7 +582,7 @@ dir = 1; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cd" = ( @@ -590,8 +590,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "ce" = ( @@ -604,7 +604,7 @@ /obj/effect/floor_decal/corner/red/three_quarters{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -612,7 +612,7 @@ /obj/effect/floor_decal/corner/red{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -632,8 +632,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "ck" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "cl" = ( @@ -657,43 +657,43 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 9 }, -/turf/floor/wood, +/turf/floor/laminate, /area/outpost/abandoned) "cn" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/broken/three, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/broken/three, /area/outpost/abandoned) "co" = ( -/obj/structure/table/woodentable, -/obj/effect/decal/cleanable/dirt, +/obj/structure/table/laminate, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, -/turf/floor/wood, +/turf/floor/laminate, /area/outpost/abandoned) "cp" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/board, -/turf/floor/wood, +/turf/floor/laminate, /area/outpost/abandoned) "cq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/loot, -/turf/floor/wood, +/turf/floor/laminate, /area/outpost/abandoned) "cr" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/turf/floor/wood/broken/two, +/turf/floor/laminate/broken/two, /area/outpost/abandoned) "cs" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate, /area/outpost/abandoned) "ct" = ( /obj/machinery/door/airlock/centcom, @@ -710,13 +710,13 @@ /area/outpost/abandoned) "cv" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cx" = ( @@ -730,50 +730,50 @@ /turf/wall/titanium, /area/outpost/abandoned) "cG" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall/titanium, /area/outpost/abandoned) "cH" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate, /area/outpost/abandoned) "cI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate, /area/outpost/abandoned) "cJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/broken/four, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/broken/four, /area/outpost/abandoned) "cK" = ( /obj/effect/floor_decal/plaque, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate, /area/outpost/abandoned) "cL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, -/turf/floor/wood/broken, +/turf/floor/laminate/broken, /area/outpost/abandoned) "cM" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/outpost/abandoned) "cN" = ( /obj/structure/filing_cabinet/tall, /turf/floor/carpet/blue, /area/outpost/abandoned) "cO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/loot, /turf/floor/carpet/blue, /area/outpost/abandoned) @@ -801,19 +801,19 @@ /area/outpost/abandoned) "cU" = ( /obj/effect/floor_decal/corner/paleblue/three_quarters, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cV" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cX" = ( @@ -821,7 +821,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/loot, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -829,12 +829,12 @@ /obj/effect/floor_decal/corner/paleblue/three_quarters{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "cZ" = ( /obj/effect/floor_decal/corner/red/three_quarters, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "da" = ( @@ -844,7 +844,7 @@ /obj/effect/floor_decal/corner/red{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "db" = ( @@ -866,7 +866,7 @@ /area/outpost/abandoned) "dd" = ( /obj/structure/barricade, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "de" = ( @@ -889,7 +889,7 @@ /area/outpost/abandoned) "df" = ( /obj/effect/wallframe_spawn/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/blast/regular{ id_tag = "mars_blast" }, @@ -899,31 +899,31 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dh" = ( /turf/floor/carpet/broken, /area/outpost/abandoned) "di" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/broken, /area/outpost/abandoned) "dj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/broken, /area/outpost/abandoned) "dl" = ( /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet, /area/outpost/abandoned) "dm" = ( @@ -975,13 +975,13 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 10 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/loot, /turf/floor/carpet, /area/outpost/abandoned) "dx" = ( /obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/carpet, /area/outpost/abandoned) "dy" = ( @@ -994,7 +994,7 @@ /area/outpost/abandoned) "dz" = ( /obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/loot, /turf/floor/carpet/broken, /area/outpost/abandoned) @@ -1002,7 +1002,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/carpet, /area/outpost/abandoned) "dC" = ( @@ -1021,7 +1021,7 @@ /obj/item/shard{ icon_state = "shardlarge" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dF" = ( @@ -1032,7 +1032,7 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dG" = ( @@ -1100,7 +1100,7 @@ /turf/wall/titanium, /area/outpost/abandoned) "dR" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ icon_state = "solid_flip0" }, /turf/floor/carpet/blue, @@ -1121,16 +1121,16 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken, /area/outpost/abandoned) "dW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dY" = ( @@ -1143,7 +1143,7 @@ dir = 4; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "dZ" = ( @@ -1154,18 +1154,18 @@ /turf/wall/titanium, /area/outpost/abandoned) "ea" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/tiled/airless, /area/outpost/abandoned) "eb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/mop, /turf/floor/plating/broken/two, /area/outpost/abandoned) "ec" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1199,7 +1199,7 @@ /turf/floor/barren, /area/mine/explored) "ej" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "ek" = ( @@ -1244,13 +1244,13 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "es" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "et" = ( @@ -1260,15 +1260,15 @@ dir = 1 }, /obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eu" = ( /obj/abstract/landmark/mapped_fluid/fuel, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/bot/medbot, /turf/floor/tiled/white/airless, /area/outpost/abandoned) @@ -1289,13 +1289,13 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "ez" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken/one, /area/outpost/abandoned) "eA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/gibspawner/human, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1322,7 +1322,7 @@ /area/outpost/abandoned) "eF" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, @@ -1340,7 +1340,7 @@ /turf/floor/plating, /area/outpost/abandoned) "eI" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/airlock/external, /turf/floor/plating, /area/outpost/abandoned) @@ -1348,27 +1348,27 @@ /obj/item/shard{ icon_state = "shardsmall" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eK" = ( /obj/item/shard{ icon_state = "piecesmall" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "eM" = ( /obj/effect/floor_decal/corner/paleblue{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eO" = ( @@ -1381,7 +1381,7 @@ /turf/floor/tiled/white/airless, /area/outpost/abandoned) "eP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/broken/four, /area/outpost/abandoned) "eQ" = ( @@ -1423,15 +1423,15 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, /turf/floor/plating/broken/one, /area/outpost/abandoned) "eW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1439,9 +1439,9 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/generic, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1449,8 +1449,8 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/wrench, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 @@ -1458,7 +1458,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "eZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -1472,7 +1472,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -1481,7 +1481,7 @@ /turf/floor/plating/broken/one, /area/outpost/abandoned) "fc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /obj/item/ammo_magazine/pistol/small, /turf/floor/tiled/airless, @@ -1495,25 +1495,25 @@ /turf/floor/tiled/airless, /area/mine/explored) "ff" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, /turf/floor/barren, /area/mine/explored) "fg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/cee, /turf/floor/plating, /area/outpost/abandoned) "fh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "fi" = ( /obj/item/pen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/outpost/abandoned) "fj" = ( @@ -1539,8 +1539,8 @@ /area/outpost/abandoned) "fo" = ( /obj/random/medical, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fq" = ( @@ -1560,33 +1560,33 @@ /turf/floor/fake_grass, /area/outpost/abandoned) "fs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/airless, /area/outpost/abandoned) "ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/medical, /turf/floor/plating/broken/four, /area/outpost/abandoned) "fu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/mopbucket, /turf/floor/tiled/airless, /area/outpost/abandoned) "fv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/remains, /turf/floor/tiled/airless, /area/outpost/abandoned) "fw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/plating/broken/one, /area/outpost/abandoned) "fx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_magazine/pistol/small, /turf/floor/tiled/airless, /area/outpost/abandoned) @@ -1638,8 +1638,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fG" = ( @@ -1647,8 +1647,8 @@ /obj/effect/floor_decal/corner/paleblue{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "fH" = ( @@ -1659,7 +1659,7 @@ /turf/floor/fake_grass, /area/outpost/abandoned) "fJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/window/basic{ dir = 4 }, @@ -1695,7 +1695,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ dir = 4; icon_state = "0-2" @@ -1707,7 +1707,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency, /obj/structure/cable{ dir = 4; @@ -1720,7 +1720,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "fR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/mine/explored) "fS" = ( @@ -1729,7 +1729,7 @@ /turf/floor/tiled/dark, /area/outpost/abandoned) "fT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ dir = 1; icon_state = "firex"; @@ -1783,7 +1783,7 @@ /obj/structure/bed/chair{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "gb" = ( @@ -1791,7 +1791,7 @@ /area/mine/explored) "gc" = ( /obj/item/solar_assembly, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gd" = ( @@ -1822,17 +1822,17 @@ /turf/floor/plating, /area/outpost/abandoned) "gi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/proc_caller/floor_breaker, /turf/floor/tiled/airless/broken, /area/mine/explored) "gj" = ( /obj/machinery/door/airlock/hatch, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/outpost/abandoned) "gk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/terminal{ dir = 1 }, @@ -1849,7 +1849,7 @@ /turf/floor/plating/broken/two, /area/outpost/abandoned) "gn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 4; icon_state = "warning" @@ -1891,16 +1891,16 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/barren, /area/mine/explored) "gu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/outpost/abandoned) "gv" = ( @@ -1927,7 +1927,7 @@ /turf/floor/plating, /area/outpost/abandoned) "gy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency{ dir = 8; icon_state = "bulb1" @@ -1966,7 +1966,7 @@ /area/outpost/abandoned) "gE" = ( /obj/effect/decal/cleanable/blood/tracks/footprints, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/airless, /area/outpost/abandoned) "gF" = ( @@ -1996,8 +1996,8 @@ /turf/floor/plating, /area/outpost/abandoned) "gK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/orange{ icon_state = "2-8" }, @@ -2012,7 +2012,7 @@ /turf/floor/barren, /area/mine/explored) "gN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/firedoor, /obj/structure/cable/orange{ icon_state = "1-2" @@ -2021,7 +2021,7 @@ /area/outpost/abandoned) "gO" = ( /obj/effect/decal/cleanable/blood/tracks/footprints, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/firedoor_assembly{ anchored = 1 }, @@ -2040,7 +2040,7 @@ /turf/floor/barren, /area/outpost/abandoned) "gR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable/orange{ icon_state = "1-2" }, @@ -2210,7 +2210,7 @@ /turf/floor/plating, /area/outpost/abandoned) "hp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/plating, /area/outpost/abandoned) @@ -2311,7 +2311,7 @@ /area/outpost/abandoned) "hD" = ( /obj/random/junk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/mapped_fluid/fuel, /turf/floor/plating, /area/outpost/abandoned) @@ -2339,7 +2339,7 @@ /turf/floor/plating, /area/outpost/abandoned) "hL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/overmap/visitable/sector/away, /turf/floor/tiled/white, /area/outpost/abandoned) @@ -2382,7 +2382,7 @@ /obj/effect/floor_decal/corner/red{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/dark, @@ -2392,9 +2392,9 @@ dir = 4 }, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/ammo_casing/pistol/magnum, /turf/floor/tiled/dark, /area/outpost/abandoned) @@ -2428,11 +2428,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, -/obj/effect/decal/cleanable/vomit, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit/mapped, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/outpost/abandoned) "wb" = ( @@ -2454,7 +2454,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small/emergency{ dir = 4; icon_state = "bulb1" @@ -2462,8 +2462,8 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "HD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/airless, /area/outpost/abandoned) "IX" = ( diff --git a/maps/away/mining/mining_areas.dm b/maps/away/mining/mining_areas.dm index 94d5e15d978..3dd6da72529 100644 --- a/maps/away/mining/mining_areas.dm +++ b/maps/away/mining/mining_areas.dm @@ -3,7 +3,7 @@ icon_state = "mining" ambience = list('sound/ambience/ambimine.ogg', 'sound/ambience/song_game.ogg') sound_env = ASTEROID - base_turf = /turf/floor + base_turf = /turf/floor/barren area_flags = AREA_FLAG_IS_BACKGROUND | AREA_FLAG_HIDE_FROM_HOLOMAP /area/mine/explored diff --git a/maps/away/slavers/icons/abolitionist.dmi b/maps/away/slavers/icons/abolitionist.dmi deleted file mode 100644 index b56da3bc706..00000000000 Binary files a/maps/away/slavers/icons/abolitionist.dmi and /dev/null differ diff --git a/maps/away/slavers/icons/areas.dmi b/maps/away/slavers/icons/areas.dmi deleted file mode 100644 index cc911c14cd2..00000000000 Binary files a/maps/away/slavers/icons/areas.dmi and /dev/null differ diff --git a/maps/away/slavers/icons/uniform.dmi b/maps/away/slavers/icons/uniform.dmi deleted file mode 100644 index 841007db55f..00000000000 Binary files a/maps/away/slavers/icons/uniform.dmi and /dev/null differ diff --git a/maps/away/slavers/slavers_base.dm b/maps/away/slavers/slavers_base.dm deleted file mode 100644 index 697a24856d3..00000000000 --- a/maps/away/slavers/slavers_base.dm +++ /dev/null @@ -1,185 +0,0 @@ -#include "slavers_base_areas.dm" -#include "../mining/mining_areas.dm" - -/obj/effect/overmap/visitable/sector/slavers_base - name = "large asteroid" - desc = "Sensor array is reading an artificial structure inside the asteroid." - icon_state = "object" - initial_generic_waypoints = list( - "nav_slavers_base_1", - "nav_slavers_base_2", - "nav_slavers_base_3", - "nav_slavers_base_4", - "nav_slavers_base_5", - "nav_slavers_base_6", - "nav_slavers_base_antag" - ) - -/datum/map_template/ruin/away_site/slavers - name = "Slavers' Base" - description = "Asteroid with slavers base inside." - suffixes = list("slavers/slavers_base.dmm") - cost = 1 - level_data_type = /datum/level_data/mining_level - area_usage_test_exempted_root_areas = list(/area/slavers_base) - apc_test_exempt_areas = list( - /area/slavers_base/hangar = NO_SCRUBBER - ) - -/obj/effect/shuttle_landmark/nav_slavers_base/nav1 - name = "Slavers Base Navpoint #1" - landmark_tag = "nav_slavers_base_1" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav2 - name = "Slavers Base Navpoint #2" - landmark_tag = "nav_slavers_base_2" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav3 - name = "Slavers Base Navpoint #3" - landmark_tag = "nav_slavers_base_3" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav4 - name = "Slavers Base Navpoint #4" - landmark_tag = "nav_slavers_base_4" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav5 - name = "Slavers Base Navpoint #5" - landmark_tag = "nav_slavers_base_5" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav6 - name = "Slavers Base Navpoint #6" - landmark_tag = "nav_slavers_base_6" - -/obj/effect/shuttle_landmark/nav_slavers_base/nav7 - name = "Slavers Base Navpoint #7" - landmark_tag = "nav_slavers_base_antag" - -/decl/outfit/corpse - name = "Corpse Clothing" - abstract_type = /decl/outfit/corpse - -/decl/outfit/corpse/slavers_base - name = "Basic slaver output" - -/obj/abstract/landmark/corpse/slavers_base - abstract_type = /obj/abstract/landmark/corpse/slavers_base - -/obj/abstract/landmark/corpse/slavers_base/slaver1 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver1) - -/decl/outfit/corpse/slavers_base/slaver1 - name = "Dead Slaver 1" - uniform = /obj/item/clothing/jumpsuit/johnny - shoes = /obj/item/clothing/shoes/color/black - glasses = /obj/item/clothing/glasses/sunglasses - -/obj/abstract/landmark/corpse/slavers_base/slaver2 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver2) - -/decl/outfit/corpse/slavers_base/slaver2 - name = "Dead Slaver 2" - uniform = /obj/item/clothing/jumpsuit/johnny - shoes = /obj/item/clothing/shoes/color/blue - -/obj/abstract/landmark/corpse/slavers_base/slaver3 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver3) - -/decl/outfit/corpse/slavers_base/slaver3 - name = "Dead Slaver 3" - uniform = /obj/item/clothing/costume/pirate - shoes = /obj/item/clothing/shoes/color/brown - -/obj/abstract/landmark/corpse/slavers_base/slaver4 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver4) - -/decl/outfit/corpse/slavers_base/slaver4 - name = "Dead Slaver 4" - uniform = /obj/item/clothing/costume/redcoat - shoes = /obj/item/clothing/shoes/color/brown - -/obj/abstract/landmark/corpse/slavers_base/slaver5 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver5) - -/decl/outfit/corpse/slavers_base/slaver5 - name = "Dead Slaver 5" - uniform = /obj/item/clothing/jumpsuit/sterile - shoes = /obj/item/clothing/shoes/color/orange - mask = /obj/item/clothing/mask/surgical - -/obj/abstract/landmark/corpse/slavers_base/slaver6 - name = "Slaver" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slaver6) - -/decl/outfit/corpse/slavers_base/slaver6 - name = "Dead Slaver 6" - uniform = /obj/item/clothing/shirt/flannel/red/outfit - shoes = /obj/item/clothing/shoes/color/orange - -/obj/abstract/landmark/corpse/slavers_base/slave - name = "Slave" - corpse_outfits = list(/decl/outfit/corpse/slavers_base/slave) - -/decl/outfit/corpse/slavers_base/slave - name = "Dead Slave" - uniform = /obj/item/clothing/jumpsuit/orange - shoes = /obj/item/clothing/shoes/jackboots/tactical - -/mob/living/simple_animal/hostile/abolition_extremist - name = "abolition extremist" - desc = "Vigiliant fighter against slavery." - icon = 'maps/away/slavers/icons/abolitionist.dmi' - - max_health = 100 - natural_weapon = /obj/item/natural_weapon/punch - unsuitable_atmos_damage = 15 - projectilesound = 'sound/weapons/laser.ogg' - projectiletype = /obj/item/projectile/beam - faction = "extremist abolitionists" - ai = /datum/mob_controller/abolitionist - var/corpse = /obj/abstract/landmark/corpse/abolitionist - var/weapon = /obj/item/gun/energy/laser - -/mob/living/simple_animal/hostile/abolition_extremist/has_ranged_attack() - return TRUE - -/datum/mob_controller/abolitionist - speak_chance = 0 - turns_per_wander = 10 - stop_wander_when_pulled = 0 - can_escape_buckles = TRUE - -/mob/living/simple_animal/hostile/abolition_extremist/death(gibbed) - . = ..() - if(. && !gibbed) - if(corpse) - new corpse(loc) - if(weapon) - new weapon(loc) - qdel(src) - -/obj/abstract/landmark/corpse/abolitionist - name = "abolitionist" - corpse_outfits = list(/decl/outfit/corpse/abolitionist) - -/decl/outfit/corpse/abolitionist - name = "Dead abolitionist" - uniform = /obj/item/clothing/jumpsuit/abolitionist - shoes = /obj/item/clothing/shoes/jackboots - head = /obj/item/clothing/head/helmet/merc - -/obj/item/clothing/jumpsuit/abolitionist - name = "abolitionist combat suit" - desc = "Lightly armored suit worn by abolition extremists during raids. It has green patches on the right sleeve and the chest. There is big green \"A\" on the back." - icon = 'maps/away/slavers/icons/uniform.dmi' - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_LEGS|SLOT_ARMS - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_PISTOL, - ARMOR_LASER = ARMOR_LASER_MINOR, - ARMOR_ENERGY = ARMOR_ENERGY_MINOR - ) diff --git a/maps/away/slavers/slavers_base.dmm b/maps/away/slavers/slavers_base.dmm deleted file mode 100644 index f9648ba2863..00000000000 --- a/maps/away/slavers/slavers_base.dmm +++ /dev/null @@ -1,44306 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/space, -/area/space) -"ab" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav2, -/turf/space, -/area/space) -"ac" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav3, -/turf/space, -/area/space) -"ad" = ( -/turf/unsimulated/mask, -/area/mine/unexplored) -"ae" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav1, -/turf/space, -/area/space) -"af" = ( -/turf/wall/natural, -/area/space) -"ag" = ( -/turf/floor, -/area/space) -"ah" = ( -/turf/wall, -/area/slavers_base/mort) -"ai" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav4, -/turf/space, -/area/space) -"aj" = ( -/obj/structure/ore_box{ - desc = "A heavy box covered with dried blood."; - name = "Big dirty box" - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ak" = ( -/turf/floor/plating/airless, -/area/slavers_base/mort) -"al" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"am" = ( -/obj/structure/morgue, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"an" = ( -/obj/effect/decal/cleanable/ash, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ao" = ( -/obj/structure/table, -/obj/item/wirecutters, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ap" = ( -/obj/structure/table, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aq" = ( -/obj/structure/table, -/obj/item/paper{ - info = "If they'll keep having fun with cargo in such manner, we'll run out of freezers to keep what's left from it."; - name = "Note" - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ar" = ( -/obj/structure/table, -/obj/item/utensil/knife, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"as" = ( -/obj/structure/rack, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"at" = ( -/obj/effect/gibspawner/human, -/turf/floor, -/area/space) -"au" = ( -/obj/structure/rack, -/obj/item/wirecutters, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"av" = ( -/obj/item/tool/shovel, -/turf/floor, -/area/space) -"aw" = ( -/obj/item/remains/human, -/turf/floor, -/area/space) -"ax" = ( -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"ay" = ( -/obj/item/bodybag, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"az" = ( -/obj/item/utensil/knife, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aA" = ( -/obj/structure/rack, -/obj/item/tool/axe/hatchet, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aB" = ( -/obj/structure/closet/crate/freezer, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aC" = ( -/obj/effect/gibspawner/human, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aD" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aE" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Slaves Mortuary"; - pixel_x = 24 - }, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aF" = ( -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aG" = ( -/obj/machinery/gibber, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aH" = ( -/obj/structure/meat_hook, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aI" = ( -/obj/structure/meat_hook, -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aK" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aL" = ( -/obj/machinery/door/airlock{ - name = "Mortuary backyard" - }, -/turf/floor/plating/airless, -/area/slavers_base/mort) -"aM" = ( -/turf/wall, -/area/slavers_base/cells) -"aN" = ( -/obj/machinery/door/airlock{ - name = "Slaves mortuary" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"aO" = ( -/obj/structure/hygiene/toilet{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aP" = ( -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aQ" = ( -/obj/machinery/light/small/red{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aR" = ( -/obj/structure/mattress/dirty, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aS" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"aU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"aV" = ( -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aW" = ( -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aX" = ( -/obj/structure/hygiene/shower{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aY" = ( -/obj/item/chems/glass/rag, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"aZ" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/drinks/cans/waterbottle, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ba" = ( -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bc" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bd" = ( -/obj/structure/mattress/dirty, -/obj/item/trash/liquidfood, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"be" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bf" = ( -/obj/item/chems/drinks/cans/waterbottle, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bg" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bh" = ( -/obj/structure/mattress/dirty, -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bi" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bj" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "0-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bk" = ( -/obj/machinery/door/window/brigdoor/southright, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bl" = ( -/obj/machinery/door/window/brigdoor/southright, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bo" = ( -/obj/machinery/door/airlock{ - name = "Cell block B" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"br" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bs" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bu" = ( -/obj/structure/mattress/dirty, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bv" = ( -/obj/structure/closet/crate/plastic/rations, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bw" = ( -/obj/item/paper{ - info = "Tonight, when lights are out. Prepare shivs, pieces of glass, whatever you might find."; - name = "Note" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"by" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/black, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"bz" = ( -/obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bA" = ( -/obj/random/trash, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/remains/human, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bC" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bD" = ( -/obj/random/shoes, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bE" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bG" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bH" = ( -/obj/machinery/door/window/brigdoor/northright, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bI" = ( -/obj/random/trash, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bJ" = ( -/obj/item/bag/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bK" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "0-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bL" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bM" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bN" = ( -/obj/machinery/door/airlock{ - name = "Den B" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bO" = ( -/obj/machinery/light/small/red, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bP" = ( -/obj/machinery/light/small/red, -/obj/structure/mattress/dirty, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bQ" = ( -/obj/structure/mattress/dirty, -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"bR" = ( -/obj/machinery/light{ - dir = 8; - icon_state = "tube1" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bU" = ( -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bV" = ( -/obj/random/trash, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bW" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag{ - pixel_x = -8; - pixel_y = -4 - }, -/obj/item/ammo_casing/shotgun/beanbag{ - pixel_y = 5; - pixel_z = 7 - }, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bX" = ( -/obj/machinery/door/airlock{ - name = "Dens block" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/obj/abstract/landmark/corpse/slavers_base/slaver4, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"bZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"ca" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "1-4" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cb" = ( -/obj/machinery/door/airlock{ - name = "Den A" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cd" = ( -/obj/structure/hygiene/toilet{ - dir = 4 - }, -/obj/item/food/junk/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ce" = ( -/obj/machinery/light/small/red{ - dir = 1 - }, -/obj/structure/mattress/dirty, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cf" = ( -/obj/structure/mattress/dirty, -/obj/random/snack, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cg" = ( -/obj/machinery/light/small/red{ - dir = 1 - }, -/obj/random/medical/lite, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ch" = ( -/obj/structure/mattress/dirty, -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ci" = ( -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"ck" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/item/flashlight, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cm" = ( -/turf/wall, -/area/slavers_base/hangar) -"cn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-4" - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"co" = ( -/obj/machinery/door/airlock{ - name = "Cell block A" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/obj/structure/cable/cyan{ - icon_state = "2-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cs" = ( -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ct" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cu" = ( -/obj/machinery/door/blast/regular{ - id_tag = "service_hangar" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cv" = ( -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cx" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cy" = ( -/obj/random/medical/lite, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Slavers holding area"; - pixel_x = 24 - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/cells) -"cB" = ( -/obj/machinery/door/window/brigdoor/northright, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cC" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 9; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cD" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 1; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cE" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 5; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cF" = ( -/obj/item/paper, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cG" = ( -/obj/item/trash/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cH" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cI" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 4; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"cJ" = ( -/obj/item/paper{ - info = "Doc who checked us told implants won't explode our heads. Gotta make guys know. Seems I see a silver lining."; - name = "Note" - }, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cK" = ( -/obj/machinery/light/small/red, -/obj/item/remains/human, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cL" = ( -/obj/random/snack, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cM" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/drinks/cans/waterbottle, -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cN" = ( -/obj/machinery/light/small/red, -/obj/random/trash, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cO" = ( -/obj/structure/mattress/dirty, -/obj/item/chems/glass/rag, -/obj/item/chems/drinks/cans/waterbottle, -/obj/abstract/landmark/corpse/slavers_base/slave, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cP" = ( -/obj/structure/hygiene/toilet{ - dir = 4 - }, -/obj/item/trash/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cQ" = ( -/obj/machinery/light/small/red, -/obj/structure/mattress/dirty, -/obj/item/chems/glass/rag, -/turf/floor/plating/airless, -/area/slavers_base/cells) -"cR" = ( -/turf/wall, -/area/slavers_base/powatm) -"cS" = ( -/turf/wall, -/area/slavers_base/secwing) -"cT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"cU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/obj/structure/cable/cyan{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"cV" = ( -/turf/wall, -/area/slavers_base/med) -"cW" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav7, -/turf/space, -/area/space) -"cX" = ( -/obj/machinery/atmospherics/unary/tank/air, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"cY" = ( -/obj/machinery/atmospherics/unary/tank/air, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"cZ" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"da" = ( -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"db" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dc" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dd" = ( -/obj/structure/bed, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"de" = ( -/obj/structure/closet, -/obj/random/snack, -/obj/random/projectile, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"df" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dg" = ( -/obj/structure/bed, -/obj/random/projectile, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dh" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/masks, -/obj/random/suit, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"di" = ( -/obj/structure/rack, -/obj/item/flashlight, -/obj/random/medical/lite, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dj" = ( -/obj/structure/rack, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/box/handcuffs, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dk" = ( -/obj/structure/rack, -/obj/item/baton, -/obj/item/baton, -/obj/item/baton, -/obj/random/tool, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dl" = ( -/obj/structure/rack, -/obj/item/flash, -/obj/random/ammo, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dm" = ( -/obj/structure/rack, -/obj/item/box/ammo/stunshells, -/obj/item/gun/projectile/shotgun/pump, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dn" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"do" = ( -/obj/structure/cable{ - icon_state = "0-6" - }, -/obj/machinery/power/smes/buildable, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dp" = ( -/turf/floor/tiled, -/area/slavers_base/secwing) -"dq" = ( -/obj/structure/cable/cyan{ - icon_state = "0-4" - }, -/obj/machinery/power/smes/buildable, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dr" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"ds" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable/cyan{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"dt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/structure/cable/cyan{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"du" = ( -/obj/machinery/door/airlock{ - name = "Slave processing" - }, -/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 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dv" = ( -/obj/machinery/flasher{ - id_tag = "permentryflash"; - name = "Floor mounted flash" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 1; - name = "Medical room"; - pixel_y = 24 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/hygiene/shower{ - pixel_y = 30 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dA" = ( -/obj/machinery/door/airlock{ - name = "Storage" - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dB" = ( -/turf/floor/plating/airless, -/area/slavers_base/med) -"dC" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dD" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dE" = ( -/obj/structure/closet/crate/plastic/rations, -/obj/item/food/junk/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dF" = ( -/obj/structure/closet/crate/plastic/rations, -/turf/floor/plating/airless, -/area/slavers_base/med) -"dG" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/yellow{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dH" = ( -/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dI" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/yellow, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dJ" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dK" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"dL" = ( -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dM" = ( -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dN" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dO" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dP" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dQ" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-9" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dR" = ( -/obj/structure/table/steel, -/obj/item/box/ammo/stunshells, -/obj/item/baton, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"dS" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"dT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"dU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"dV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/random/junk, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/random/medical/lite, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dY" = ( -/obj/structure/bed, -/obj/item/remains/human, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"dZ" = ( -/obj/item/food/junk/liquidfood, -/turf/floor/plating/airless, -/area/slavers_base/med) -"ea" = ( -/obj/structure/closet/crate/trashcart, -/turf/floor/plating/airless, -/area/slavers_base/med) -"eb" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 10; - icon_state = "warning" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ec" = ( -/obj/effect/floor_decal/industrial/warning, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ed" = ( -/obj/effect/floor_decal/industrial/warning{ - dir = 6 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"ee" = ( -/obj/machinery/atmospherics/binary/pump{ - dir = 1; - name = "waste pump" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ef" = ( -/obj/machinery/atmospherics/binary/pump, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eg" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eh" = ( -/obj/random/junk, -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"ei" = ( -/obj/random/junk, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"ej" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled, -/area/slavers_base/secwing) -"ek" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled, -/area/slavers_base/secwing) -"el" = ( -/obj/abstract/landmark/corpse/slavers_base/slaver6, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/secwing) -"em" = ( -/obj/random/junk, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/secwing) -"en" = ( -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eo" = ( -/obj/structure/bed/chair/office/dark{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"ep" = ( -/obj/structure/table/steel, -/obj/item/flash, -/obj/item/radio/shortwave, -/obj/item/paper{ - info = "If this fuck from A-3 keeps thinking he's better then piece of meat, throw him to hangar and show how little pressure turns diamonds into shit."; - name = "Note" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eq" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"er" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"es" = ( -/obj/item/ammo_casing/shotgun/beanbag, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"et" = ( -/obj/structure/window/basic{ - dir = 1 - }, -/obj/item/clothing/gloves/latex, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eu" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/abstract/landmark/corpse/slavers_base/slaver5, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ev" = ( -/obj/structure/window/basic{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ew" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ex" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/ammo_casing/shotgun/beanbag, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ey" = ( -/turf/floor/tiled/airless, -/area/slavers_base/med) -"ez" = ( -/obj/structure/bed, -/obj/item/handcuffs, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eA" = ( -/obj/item/beartrap, -/turf/floor/plating/airless, -/area/slavers_base/med) -"eB" = ( -/obj/item/mop, -/obj/structure/mopbucket, -/turf/floor/plating/airless, -/area/slavers_base/med) -"eC" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"eD" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 1 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eE" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eF" = ( -/obj/random/tool, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eG" = ( -/obj/machinery/atmospherics/binary/pump{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eH" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eI" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eJ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eK" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"eL" = ( -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"eM" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"eN" = ( -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"eO" = ( -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eP" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eQ" = ( -/obj/machinery/computer/modular{ - name = "Cameras console" - }, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eR" = ( -/obj/machinery/computer/modular{ - name = "Riot control console" - }, -/obj/machinery/power/apc{ - name = "Slavers security wing"; - pixel_y = -24 - }, -/obj/structure/cable, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eS" = ( -/obj/structure/table/steel, -/obj/item/handcuffs, -/turf/floor/tiled, -/area/slavers_base/secwing) -"eT" = ( -/obj/item/gun/projectile/shotgun/pump, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"eU" = ( -/obj/machinery/optable, -/obj/item/scalpel, -/obj/effect/decal/cleanable/blood, -/obj/machinery/light, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eV" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/structure/table, -/obj/item/implanter, -/obj/item/implantcase/tracking, -/obj/item/surgicaldrill, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eW" = ( -/obj/machinery/optable, -/obj/effect/decal/cleanable/blood, -/obj/item/screwdriver, -/obj/machinery/light, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eX" = ( -/obj/structure/window/basic{ - dir = 4 - }, -/obj/structure/table, -/obj/item/implantpad, -/obj/item/chems/pill/antibiotics, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eY" = ( -/obj/structure/table, -/obj/item/firstaid/empty, -/obj/item/handcuffs, -/obj/item/baton, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"eZ" = ( -/obj/structure/table, -/obj/item/firstaid/o2, -/obj/item/folder/cyan, -/obj/item/paper{ - info = "Seems they don't really look over my shoulder anymore. We have now maybe a dozen of them with inactive implants. Hope they will pick right moment to flip the lid. I'll kill few bastards myself soon as I have a chance."; - name = "Note" - }, -/obj/item/pen, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fa" = ( -/obj/structure/table, -/obj/item/firstaid/regular, -/obj/item/tool/axe/hatchet, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fb" = ( -/obj/item/roller, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fc" = ( -/obj/structure/bed, -/turf/floor/tiled/airless, -/area/slavers_base/med) -"fd" = ( -/obj/structure/table, -/obj/item/box/handcuffs, -/obj/item/box/handcuffs, -/turf/floor/plating/airless, -/area/slavers_base/med) -"fe" = ( -/obj/structure/table, -/obj/item/box/bodybags, -/turf/floor/plating/airless, -/area/slavers_base/med) -"ff" = ( -/obj/structure/table, -/turf/floor/plating/airless, -/area/slavers_base/med) -"fg" = ( -/obj/structure/reagent_dispensers/water_cooler, -/turf/floor/plating/airless, -/area/slavers_base/med) -"fh" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/cyan{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fi" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fj" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - name = "Slavers hangar"; - pixel_y = -24 - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fk" = ( -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fl" = ( -/obj/effect/decal/cleanable/generic, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4; - level = 2 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fm" = ( -/obj/effect/decal/cleanable/generic, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fn" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/secwing) -"fo" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fp" = ( -/obj/machinery/door/airlock/external, -/obj/machinery/atmospherics/pipe/simple/visible/cyan, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fq" = ( -/obj/machinery/door/airlock/external, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/hangar) -"fr" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fs" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ft" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Power/atmos" - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/plating/airless, -/area/slavers_base/hallway) -"fu" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/cable/green, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/obj/structure/cable/green{ - icon_state = "0-2" - }, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fv" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "West hallway" - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fx" = ( -/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fz" = ( -/obj/machinery/door/airlock{ - name = "Transit area" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/maint) -"fA" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/cable/green{ - icon_state = "4-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/power/terminal, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fE" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fF" = ( -/obj/machinery/atmospherics/binary/pump{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fG" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fH" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan{ - dir = 9 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fJ" = ( -/turf/wall, -/area/slavers_base/maint) -"fK" = ( -/obj/machinery/atmospherics/unary/tank/carbon_dioxide, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fL" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 6 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fM" = ( -/obj/machinery/atmospherics/pipe/simple/visible/yellow, -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 4 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fN" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 10 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fO" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fP" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fQ" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"fR" = ( -/obj/machinery/door/airlock{ - name = "Power/atmos" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/plating/airless, -/area/slavers_base/hallway) -"fS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fT" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fU" = ( -/obj/machinery/light, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fV" = ( -/obj/machinery/door/airlock{ - name = "West hallway" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"fX" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fY" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/smes/buildable, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"fZ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"ga" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gb" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/black{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gc" = ( -/obj/machinery/atmospherics/pipe/manifold/visible/black, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gd" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ge" = ( -/obj/machinery/atmospherics/omni/filter{ - dir = 8 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/universal{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gg" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gh" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - dir = 4; - name = "Slavers atmos and power room"; - pixel_x = 24 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gi" = ( -/turf/wall, -/area/slavers_base/dorms) -"gj" = ( -/obj/machinery/door/airlock{ - name = "Mess" - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gk" = ( -/obj/machinery/door/airlock{ - name = "Southern hallway" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gl" = ( -/obj/machinery/door/airlock{ - name = "Southern hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gm" = ( -/obj/machinery/door/airlock{ - name = "Slave trade area" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gn" = ( -/obj/machinery/atmospherics/binary/pump, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"go" = ( -/obj/machinery/portable_atmospherics/canister, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gp" = ( -/obj/item/crowbar, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gq" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gr" = ( -/obj/structure/table/steel, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/item/stock_parts/circuitboard/broken, -/obj/item/poster, -/obj/item/radio/shortwave, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gs" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"gt" = ( -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gu" = ( -/obj/machinery/vending/wallmed2{ - pixel_y = 30 - }, -/obj/structure/table, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gv" = ( -/obj/structure/bed, -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gw" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/loot, -/obj/random/contraband, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gx" = ( -/obj/structure/table, -/obj/random/coin, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gy" = ( -/obj/structure/bed, -/obj/random/plushie, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gz" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gA" = ( -/obj/structure/table, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gB" = ( -/obj/structure/closet, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gC" = ( -/obj/structure/table, -/obj/random/contraband, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gD" = ( -/obj/structure/bed, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gE" = ( -/obj/structure/closet, -/obj/random/smokes, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gF" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"gH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gI" = ( -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gJ" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gK" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gL" = ( -/obj/machinery/atmospherics/portables_connector{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gM" = ( -/obj/structure/table/steel, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/item/toolbox/mechanical, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gN" = ( -/obj/random/junk, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"gO" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gQ" = ( -/obj/random/junk, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/apc{ - name = "Slavers Maintenance"; - pixel_y = -24 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gR" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gS" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gT" = ( -/obj/machinery/door/airlock{ - name = "Exchange tunnel" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gU" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gV" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"gW" = ( -/obj/machinery/floodlight, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gX" = ( -/obj/structure/table/steel, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"gY" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"gZ" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"ha" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hb" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"hc" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hd" = ( -/turf/wall, -/area/slavers_base/demo) -"he" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hf" = ( -/obj/machinery/light/small{ - dir = 4; - pixel_y = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hg" = ( -/obj/item/coilgun_assembly, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hh" = ( -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hk" = ( -/obj/structure/table, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hl" = ( -/obj/structure/bed, -/obj/item/radio/shortwave, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hm" = ( -/obj/structure/closet, -/obj/random/projectile, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hn" = ( -/obj/structure/table, -/obj/random/loot, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"ho" = ( -/obj/structure/table, -/obj/random/gloves, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hp" = ( -/obj/structure/closet, -/obj/random/loot, -/obj/random/contraband, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hq" = ( -/obj/structure/closet, -/obj/random/projectile, -/obj/random/ammo, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hr" = ( -/obj/structure/safe, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hs" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/safe, -/obj/item/bag/cash, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ht" = ( -/obj/structure/safe, -/obj/item/bag/cash, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hu" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hv" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hw" = ( -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hx" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hy" = ( -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hz" = ( -/obj/machinery/vending/engineering{ - req_access = list() - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hA" = ( -/obj/item/stock_parts/computer/card_slot, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hB" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hC" = ( -/obj/machinery/power/smes/buildable, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock{ - name = "Slave hold hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"hE" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hF" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"hG" = ( -/obj/machinery/door/airlock{ - name = "Safe room" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hH" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hI" = ( -/obj/random/coin, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hJ" = ( -/obj/machinery/door/airlock{ - name = "Cashier room" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"hK" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hL" = ( -/obj/structure/bed/chair{ - dir = 4 - }, -/obj/item/radio/shortwave, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hM" = ( -/obj/structure/table/reinforced, -/obj/random/coin, -/obj/machinery/door/blast/regular/open{ - id_tag = "SC BD" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hN" = ( -/obj/structure/bed/chair/comfy/beige{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hO" = ( -/obj/structure/table/woodentable, -/obj/item/radio/shortwave, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hP" = ( -/obj/structure/table/woodentable, -/obj/item/secure_storage/briefcase/money, -/obj/random/cash, -/obj/random/cash, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hQ" = ( -/obj/structure/bed/chair/comfy/beige{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"hR" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable/green{ - icon_state = "0-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"hS" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hT" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hU" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hV" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/vending/dinnerware, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hW" = ( -/obj/machinery/cooker/oven, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hX" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hY" = ( -/obj/structure/table, -/obj/random/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"hZ" = ( -/obj/structure/table, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ia" = ( -/obj/structure/table, -/obj/machinery/light{ - dir = 1 - }, -/obj/item/plate, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ib" = ( -/obj/structure/closet/secure_closet/freezer/fridge, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ic" = ( -/turf/floor/tiled, -/area/slavers_base/dorms) -"id" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"ie" = ( -/obj/structure/closet/secure_closet/guncabinet, -/obj/random/projectile, -/obj/random/projectile, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"if" = ( -/obj/structure/closet/secure_closet/guncabinet, -/obj/random/projectile, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ig" = ( -/obj/random/coin, -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ih" = ( -/turf/floor/plating/airless, -/area/slavers_base/demo) -"ii" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ij" = ( -/obj/structure/table/woodentable, -/obj/item/bag/cash, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ik" = ( -/obj/structure/table/woodentable, -/obj/random/cash, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"il" = ( -/obj/structure/ore_box, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"in" = ( -/obj/structure/closet/crate, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"io" = ( -/obj/structure/closet/crate, -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"iq" = ( -/obj/machinery/port_gen/pacman/super, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"ir" = ( -/obj/machinery/port_gen/pacman/super, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"is" = ( -/obj/machinery/port_gen/pacman/super, -/obj/structure/cable/green{ - icon_state = "0-4" - }, -/obj/structure/cable/green{ - icon_state = "0-8" - }, -/obj/machinery/light/small, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"it" = ( -/obj/structure/cable/green{ - icon_state = "1-8" - }, -/turf/floor/plating/airless, -/area/slavers_base/powatm) -"iu" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iv" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iw" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ix" = ( -/obj/machinery/vending/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iy" = ( -/obj/structure/table/woodentable, -/obj/item/paper{ - info = "
      Contract

      This contract describes exchanging of monetary pieces for the right o? the ownership for following examples: <*> Human, age 17. Price - 1500cr. <*> Human, age 49. Price - 1100cr. <*> Human, age 28. Good fist fighter. Price - 2400cr. <*> Human, age 34. Expirienced medic. Price - 6800cr. Overall price: 11800cr
      Place for signatures"; - name = "Contract" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iz" = ( -/obj/structure/table/woodentable, -/obj/random/coin, -/obj/item/pen, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iA" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/structure/bed/chair, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/bed/chair, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/structure/bed/chair, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iE" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iF" = ( -/obj/machinery/vending/fitness, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iG" = ( -/obj/random/junk, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"iH" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"iI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iJ" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iK" = ( -/obj/item/clothing/suit/nun, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iL" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/item/clothing/suit/robe/yellowed, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"iM" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - name = "Slavers Dorms"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-2"; - pixel_y = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iO" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/item/chems/condiment/small/peppermill, -/obj/item/chems/condiment/small/saltshaker{ - pixel_x = 3; - pixel_y = 10 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iP" = ( -/obj/structure/table, -/obj/random/smokes, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iQ" = ( -/obj/structure/table, -/obj/random/drinkbottle, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iR" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/utensil/fork, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iS" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iT" = ( -/obj/random/junk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iU" = ( -/obj/item/utensil/fork, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iV" = ( -/obj/machinery/vending/cola, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"iW" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"iX" = ( -/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/floor/plating/airless, -/area/slavers_base/maint) -"iY" = ( -/obj/machinery/door/airlock{ - name = "Scene" - }, -/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/floor/tiled/airless, -/area/slavers_base/demo) -"iZ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ja" = ( -/obj/item/clothing/shoes/color/brown, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jb" = ( -/obj/item/clothing/pants/pj/blue, -/obj/item/clothing/shirt/pj/blue, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jc" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jd" = ( -/obj/machinery/light, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"je" = ( -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jf" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/wall, -/area/slavers_base/dorms) -"jg" = ( -/obj/structure/table, -/obj/random/projectile, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jh" = ( -/obj/structure/table, -/obj/random/drinkbottle, -/turf/floor/tiled, -/area/slavers_base/dorms) -"ji" = ( -/obj/structure/table, -/obj/item/plate, -/obj/random/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jj" = ( -/obj/structure/table, -/obj/item/utensil/fork, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jk" = ( -/obj/structure/table, -/obj/random/smokes, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jl" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/vending/cigarette, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jm" = ( -/obj/effect/wallframe_spawn/reinforced, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jn" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jo" = ( -/obj/machinery/door/airlock{ - name = "Private office" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"jp" = ( -/obj/structure/cable/green{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jq" = ( -/obj/structure/table, -/obj/item/radio/shortwave, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jr" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"js" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jt" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc{ - dir = 8; - name = "west bump"; - pixel_x = -24 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"ju" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jv" = ( -/turf/floor/tiled, -/area/slavers_base/demo) -"jw" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jy" = ( -/obj/structure/cable/green, -/obj/machinery/power/terminal{ - dir = 4 - }, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jz" = ( -/obj/structure/cable, -/obj/machinery/power/smes/buildable, -/turf/floor/plating/airless, -/area/slavers_base/dorms) -"jA" = ( -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jB" = ( -/obj/machinery/light, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jC" = ( -/obj/item/paper{ - info = "We made over 200 grands for two last weeks. We should stay low-key for month or so, or we'll get our base discovered by fucking marshalls so shut your whining and relax, I'l l get you three crates of booze and some cargo to play with."; - name = "Note" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jD" = ( -/obj/random/snack, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jE" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/floor/tiled, -/area/slavers_base/dorms) -"jF" = ( -/obj/machinery/door/airlock{ - name = "Mess" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"jG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jI" = ( -/obj/structure/table, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jJ" = ( -/obj/structure/table, -/obj/item/megaphone, -/turf/floor/tiled, -/area/slavers_base/demo) -"jK" = ( -/obj/structure/table, -/obj/item/clothing/mask/smokable/cigarette, -/turf/floor/tiled, -/area/slavers_base/demo) -"jL" = ( -/obj/structure/table, -/turf/floor/tiled, -/area/slavers_base/demo) -"jM" = ( -/obj/structure/table, -/obj/item/scanner/health, -/turf/floor/tiled, -/area/slavers_base/demo) -"jN" = ( -/obj/structure/table, -/obj/random/drinkbottle, -/turf/floor/tiled, -/area/slavers_base/demo) -"jO" = ( -/obj/structure/table, -/obj/item/pen, -/turf/floor/tiled, -/area/slavers_base/demo) -"jP" = ( -/obj/machinery/door/airlock{ - name = "Restroom" - }, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/airless, -/area/slavers_base/dorms) -"jQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/machinery/door/airlock{ - name = "Southern hallway" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"jR" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled, -/area/slavers_base/demo) -"jS" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jT" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jU" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/obj/item/secure_storage/briefcase/money, -/obj/random/cash, -/obj/random/cash, -/obj/random/cash, -/obj/random/cash, -/turf/floor/tiled, -/area/slavers_base/demo) -"jV" = ( -/obj/structure/bed/chair{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"jW" = ( -/obj/structure/table, -/obj/item/clothing/mask/smokable/cigarette/professionals, -/turf/floor/tiled, -/area/slavers_base/demo) -"jX" = ( -/obj/structure/hygiene/shower{ - dir = 4 - }, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"jY" = ( -/obj/machinery/door/airlock{ - name = "Shower" - }, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"jZ" = ( -/obj/abstract/landmark/corpse/slavers_base/slaver3, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"ka" = ( -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kb" = ( -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kc" = ( -/obj/abstract/landmark/corpse/slavers_base/slaver1, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kd" = ( -/obj/machinery/door/airlock{ - name = "Toilet" - }, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"ke" = ( -/obj/structure/hygiene/toilet{ - dir = 8 - }, -/obj/random/junk, -/turf/floor/tiled/white/airless, -/area/slavers_base/dorms) -"kf" = ( -/turf/wall, -/area/slavers_base/hallway) -"kg" = ( -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kh" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"ki" = ( -/obj/machinery/door/airlock{ - name = "Slave trade area" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"kj" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 - }, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 8 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kk" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled, -/area/slavers_base/demo) -"kl" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/tiled, -/area/slavers_base/demo) -"km" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kn" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"ko" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kp" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kq" = ( -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kr" = ( -/obj/machinery/door/airlock{ - name = "Slave trade area" - }, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"ks" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - name = "south bump"; - pixel_y = -24 - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"ku" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/floor/tiled, -/area/slavers_base/demo) -"kv" = ( -/obj/structure/table, -/obj/item/box/glass_extras, -/turf/floor/tiled, -/area/slavers_base/demo) -"kw" = ( -/obj/structure/table, -/obj/machinery/chemical_dispenser/bar_alc, -/turf/floor/tiled, -/area/slavers_base/demo) -"kz" = ( -/mob/living/simple_animal/hostile/abolition_extremist, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"kA" = ( -/obj/machinery/door/airlock{ - name = "Customers entry" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kB" = ( -/obj/machinery/door/airlock{ - name = "Customers entry" - }, -/turf/floor/tiled/airless, -/area/slavers_base/hallway) -"kC" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kD" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kE" = ( -/obj/machinery/door/airlock{ - name = "Exchange area" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kF" = ( -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/generic, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kH" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kI" = ( -/obj/machinery/atmospherics/pipe/simple/visible/universal, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kJ" = ( -/obj/effect/wallframe_spawn/reinforced, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kK" = ( -/obj/machinery/door/airlock{ - name = "Exchange point" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kL" = ( -/obj/machinery/atmospherics/binary/pump, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kM" = ( -/obj/structure/table, -/obj/item/radio/shortwave, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kN" = ( -/obj/structure/table, -/obj/random/handgun, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kO" = ( -/obj/machinery/door/airlock/external, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kP" = ( -/obj/machinery/door/airlock/external, -/obj/machinery/atmospherics/pipe/simple/visible/cyan, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kQ" = ( -/obj/structure/table, -/obj/random/junk, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kR" = ( -/obj/structure/bed/chair{ - dir = 1 - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kS" = ( -/obj/machinery/atmospherics/pipe/simple/visible/cyan, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kT" = ( -/obj/structure/table, -/obj/random/loot, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kU" = ( -/obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ - dir = 1; - id_tag = "solar_port_pump" - }, -/turf/floor/plating/airless, -/area/slavers_base/maint) -"kW" = ( -/obj/effect/overmap/visitable/sector/slavers_base, -/turf/space, -/area/space) -"kX" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav5, -/turf/space, -/area/space) -"kY" = ( -/obj/effect/shuttle_landmark/nav_slavers_base/nav6, -/turf/space, -/area/space) -"lb" = ( -/obj/structure/hygiene/sink{ - pixel_y = -20 - }, -/obj/structure/mirror{ - pixel_y = -35 - }, -/obj/abstract/landmark/corpse/slavers_base/slaver2, -/obj/effect/decal/cleanable/blood, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"mb" = ( -/obj/structure/hygiene/sink{ - pixel_y = -20 - }, -/obj/structure/mirror{ - pixel_y = -35 - }, -/turf/floor/tiled/white, -/area/slavers_base/dorms) -"nm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/tiled/airless, -/area/slavers_base/demo) -"EJ" = ( -/obj/machinery/atmospherics/pipe/simple/visible/black{ - dir = 4 - }, -/obj/abstract/landmark/allowed_leak, -/turf/floor/plating/airless, -/area/slavers_base/powatm) - -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -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 -"} -(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 -ad -ad -ad -ad -ad -ad -aa -ad -ad -aa -aa -aa -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ai -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -kX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cX -dG -ee -eD -da -da -fK -gb -gn -gL -gW -gW -hz -da -il -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cX -dH -ef -eE -da -da -fK -gc -go -go -da -da -da -da -il -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cX -dI -da -da -da -da -da -gd -da -go -da -hg -da -da -in -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cY -dI -da -eF -da -da -fL -by -da -da -da -da -da -da -io -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cZ -dJ -eg -dG -eg -eg -fM -ge -gp -da -da -da -hA -da -in -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -da -da -cZ -eG -da -da -fN -ge -da -eF -da -hh -da -da -iq -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -cZ -cZ -da -eH -da -da -da -EJ -da -da -da -da -da -da -ir -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -db -cZ -da -eI -fl -da -fO -gf -da -da -eF -da -da -da -is -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -dc -dK -da -eJ -fm -fr -fP -gg -gq -gq -gq -gq -hB -da -ir -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cR -dc -da -dK -eK -da -fs -fQ -gh -gr -gM -gX -gX -hC -hR -it -cR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ah -ah -ah -ah -ah -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -cS -cS -cS -cS -cS -cS -ft -fR -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -aj -aj -ak -ak -ak -aM -aO -aX -bi -aP -aP -aP -aP -aM -bR -aM -aP -aP -aP -aP -bi -aX -aO -cS -dd -dL -dL -eL -fn -fu -fS -gj -gs -gs -gY -gs -gs -hS -iu -iA -iu -je -jp -jy -gi -jX -gi -jX -gi -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -aj -ak -ak -aM -aP -aP -aP -aR -aV -aP -aP -aM -aU -aM -aW -aZ -aP -cv -ba -aW -aP -cS -de -dL -eh -eM -cS -fv -fo -gi -gi -gi -gi -gi -gi -hT -ic -ic -iM -jf -jq -jz -gi -jY -gi -jY -gi -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -aj -ak -aM -aP -aY -aW -be -aP -aR -aW -bK -aU -bK -aP -aP -aP -be -aP -aP -cJ -cS -df -dL -dL -eM -cS -fv -fo -gi -gt -gt -gZ -hj -hD -hU -iv -ic -iN -gi -gi -gi -gi -jZ -kn -kb -gi -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -al -aj -ak -ak -aF -aM -aQ -aP -aR -aP -aP -aP -aP -bL -bS -ca -aP -aP -aP -ch -aP -aP -bO -cS -dg -dL -ei -eM -cS -fv -fT -gi -gu -gt -gt -hk -gi -hT -ic -ic -iN -ic -ic -jA -jP -ka -kb -lb -gi -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ax -ak -ak -aM -aP -aP -ba -aP -aW -aP -aP -bM -bq -bM -aP -aP -aP -aP -aP -cv -aP -cS -dh -dL -dL -eM -cS -fv -fU -gi -gv -gt -gt -hl -gi -hV -ic -iv -iN -ic -ic -jB -gi -kb -kb -mb -gi -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -ak -aB -aM -aP -aZ -aP -aV -aW -aP -aP -aM -bq -aM -aP -aR -aV -aV -aP -cF -aP -cS -cS -cS -cS -eN -cS -fv -fo -gi -gw -gN -gt -hm -gi -hW -iw -iB -iO -jg -jr -ic -gi -kc -ko -kz -gi -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -an -an -ak -ak -aM -aP -aP -aR -aP -bu -aP -aP -bK -bq -bK -aP -aP -aP -aP -aP -aP -bf -cS -di -dM -ej -eO -cS -fv -fo -gi -gx -gt -gt -hn -gi -hX -ic -iC -iP -jh -jr -ic -gi -kd -gi -kd -gi -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -am -an -ak -ak -aB -aM -aP -aP -aP -be -aP -aP -aP -bL -bT -ca -aP -aP -aP -be -aP -aR -aP -cS -dj -dN -ek -eP -cS -fv -fo -gi -gy -gt -ha -gD -gi -hX -ic -iC -iQ -ji -jr -ic -gi -ke -gi -ke -gi -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -an -ak -ak -aB -ak -aM -aP -aP -aP -aP -aV -aW -ba -bM -bU -bM -ci -aP -aW -ci -aP -aP -aP -cS -dk -dN -dp -dp -cS -fv -fo -gi -gz -gt -gt -gz -gi -hY -ic -iC -iR -jj -jr -ic -gi -gi -gi -gi -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ay -aC -ay -aM -aR -aP -ba -aR -aP -aP -aP -aM -bq -aM -aP -aP -aP -aP -aP -aP -aP -cS -dl -dO -el -dp -cS -fv -fo -gi -gA -gt -gt -ho -gi -hZ -ic -iD -iS -jk -jr -ic -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ao -ak -ak -ay -aG -aM -aS -aP -aP -aP -aV -aP -aP -bK -bq -bK -aP -aP -ch -aP -ch -ch -aP -cS -dm -dN -em -dp -cS -fv -fU -gi -gv -gt -gN -gD -gi -ia -ic -ic -iN -ic -ic -jB -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ap -ak -az -ak -aH -aM -aS -aP -aP -aP -bv -aP -aP -bL -bV -ca -aP -aP -aP -aP -cy -aP -aP -cS -dn -dN -en -dp -cS -fv -fo -gi -gB -gt -gt -hp -gi -ib -ic -ic -iT -iv -ic -jC -gi -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -aq -ak -ak -ak -aI -aM -aQ -ba -aP -be -aP -bD -aP -bM -bq -bM -aP -aV -aP -be -bJ -aP -cK -cS -do -dP -en -eQ -cS -fv -fo -gi -gC -gt -gN -gA -gi -ib -ic -iE -iN -ic -ic -ic -gi -ad -ad -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -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 -"} -(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 -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ar -ak -ak -aC -aH -aM -aP -aP -aP -aP -bw -aP -aP -aM -bq -aM -aR -aP -aR -aP -aP -cG -cL -cS -dp -dQ -eo -eR -cS -fv -fo -gi -gD -gt -gt -gy -gi -ic -ic -ic -iU -iv -ic -jD -gi -ad -ad -fJ -gI -gI -kH -gI -kO -kH -gI -kO -ag -ag -ag -ag -ag -ag -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -ak -ak -aM -aP -aP -aR -aP -aP -bE -bI -bN -bW -cb -cj -ck -aP -aP -aW -aP -bv -cS -dq -dR -ep -eS -cS -fv -fo -gi -gE -gt -gt -hq -gi -ic -ix -iF -iV -jl -js -jE -gi -ad -ad -fJ -kC -kG -kI -kL -kP -kS -kU -kO -ag -ag -ag -ag -ag -ag -kW -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ak -ak -ak -aD -aJ -aM -aM -aM -aM -aM -aM -aM -aM -aM -bX -aM -aM -aM -aM -aM -aM -aM -aM -cS -dr -dS -eq -eq -cS -fw -fV -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -gi -jF -gi -kf -kf -fJ -fC -gI -fJ -fJ -fJ -fJ -fJ -fJ -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -as -au -aA -aE -aK -aN -aT -bb -bb -bm -bb -bF -bb -bb -bY -cc -bb -cl -bm -cw -cz -bb -bb -cT -ds -dT -er -er -er -fx -fW -gk -gF -er -hb -er -er -er -er -hb -er -er -jt -jG -jQ -kg -kp -kA -kD -gI -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ah -ah -ah -ah -ah -aL -aM -aU -aU -aU -bn -bx -bx -bx -bx -bZ -bx -bx -bx -cn -bx -cA -bx -bx -cU -dt -dU -es -eT -fo -fy -fo -gl -gG -fo -fo -fo -fo -id -fo -iG -fo -fo -ju -jH -gl -kh -kq -kB -gI -gI -fJ -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -ag -ag -aM -aM -aM -aM -bo -cx -aM -aM -aM -aM -aM -aM -aM -co -cx -aM -aM -aM -cV -du -cV -cV -cV -cV -fz -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -hd -hd -hd -hd -ki -kr -hd -kE -kE -fJ -fJ -fJ -fJ -fJ -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -at -at -ag -ag -aM -aO -aV -bj -bp -bz -bG -aW -aO -aM -cd -aP -bj -cp -bz -bG -aP -aO -cV -dv -dV -et -eU -cV -fA -fX -gm -gH -gO -hc -gH -hE -gH -gH -iH -iW -hd -jv -jv -jR -kj -ks -hd -gI -gI -kJ -kM -kQ -kT -fJ -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -at -ag -ag -av -ag -aM -aQ -bc -bk -bq -aU -bH -be -bO -aM -ce -be -bk -bq -aU -cB -be -bO -cV -dw -dx -eu -eV -cV -fB -fY -fJ -gI -gP -gI -gI -hF -gI -gI -gI -iX -hd -jv -jv -jv -jv -kt -hd -gJ -gI -kJ -kN -kR -gI -fJ -ad -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 -"} -(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 -aa -aa -aa -aa -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -ag -ag -ag -ag -aM -aP -bd -bj -br -bx -bG -aR -aP -aM -aP -aP -bj -cq -bx -bG -aP -cM -cV -dx -dx -ev -eW -cV -fC -fZ -fJ -gI -gQ -hd -hd -hG -hd -hd -hd -iY -hd -jw -jv -jv -jv -kt -hd -gI -gI -kJ -gI -hf -kF -fJ -ad -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 -"} -(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 -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -at -ag -ag -ag -aM -aM -aM -aM -bs -aU -aM -aM -aM -aM -aM -aM -aM -bs -aU -aM -aM -aM -cV -dy -dx -ew -eX -cV -fC -fZ -fJ -gI -gR -hd -hr -hH -ie -hd -nm -iZ -jm -jx -jI -jS -jx -ku -hd -kE -kE -fJ -gI -fJ -fJ -fJ -ad -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 -"} -(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 -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -ag -ag -aM -aO -aP -bj -br -bA -bG -bJ -aO -aM -aO -ch -bj -cq -bx -bG -aP -aO -cV -dz -dx -dx -eY -cV -fD -fZ -fJ -gJ -gR -hd -hs -hH -if -hd -iJ -ja -jn -jv -jJ -jT -kk -jv -hd -gI -gI -kK -gI -fJ -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -av -ag -ag -ag -aM -aQ -be -bk -bq -aU -bH -be -bP -aM -aQ -be -bk -bq -aU -bH -be -cN -cV -dz -dW -ex -eZ -cV -fC -fZ -fJ -gI -gR -hd -hr -hH -ig -hd -iI -jb -jn -jv -jK -jT -jv -jv -hd -kF -gI -fJ -fJ -fJ -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -ag -aM -aV -bf -bj -br -bx -bG -aV -aW -aM -aP -aP -bj -cq -bx -bG -ch -aW -cV -dx -dX -dx -fa -cV -fC -fZ -fJ -gI -gR -hd -hr -hI -ig -hd -iK -iI -jn -jv -jL -jT -kl -jv -hd -gI -kF -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -ag -ag -aM -aM -aM -aM -bs -bB -aM -aM -aM -aM -aM -aM -aM -bs -aU -aM -aM -aM -cV -dx -dx -ey -fb -cV -fC -fZ -fJ -gI -gR -hd -ht -hH -ih -hd -iI -iI -jn -jv -jM -jT -jv -jv -hd -gI -gI -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -aM -aO -aP -bj -br -bx -bG -aP -aO -aM -aO -aP -bj -cq -bx -bG -aP -aO -cV -dx -dY -ez -fc -cV -fC -fZ -fJ -gI -gR -hd -hd -hJ -hd -hd -iI -iI -jn -jv -jL -jT -jv -jv -hd -gI -kF -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -ag -ag -aM -aQ -bg -bk -bq -aU -bH -be -bO -aM -aQ -be -bk -bq -aU -bH -be -bO -cV -dA -cV -cV -cV -cV -fD -fZ -fJ -gK -gR -hd -hu -hK -ii -hd -iL -iI -jn -jv -jN -jT -jv -jv -hd -gJ -gI -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -ag -ag -aw -ag -aM -aR -aP -bj -br -bx -bG -aP -bQ -aM -cf -aP -bj -cq -bx -bG -aP -cO -cV -dB -dB -eA -fd -cV -fC -fZ -fJ -gI -gR -hd -hv -hL -hw -hd -iI -iI -jn -jv -jO -jU -jv -jv -hd -hy -gI -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -ag -ag -ag -ag -ag -aM -aM -aM -aM -bs -aU -aM -aM -aM -aM -aM -aM -aM -bs -aU -aM -aM -aM -cV -dC -dB -dB -fe -cV -fC -fZ -fJ -gI -gS -hd -hd -hM -hd -hd -hd -hd -hd -jw -jv -jv -jv -jv -hd -gI -gI -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -aw -ag -ag -ag -aM -aO -aP -bj -br -bx -bG -aV -aO -aM -aO -aP -bj -cq -bx -bG -aP -cP -cV -dD -dB -dB -ff -cV -fC -fZ -fJ -gI -gR -hd -hw -hw -hw -hw -hw -hw -hd -jv -jv -jv -jv -jv -hd -kF -gI -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -af -ag -ag -ag -aM -aQ -bh -bl -bq -aU -bH -be -bO -aM -cg -be -bk -bq -aU -bH -be -cQ -cV -dE -dZ -dB -dB -cV -fE -fZ -fJ -gI -gR -hd -hw -hN -hN -hN -hw -jc -hd -jv -jv -jV -jV -jV -hd -kF -hy -fJ -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -af -ag -ag -aM -aW -aW -bj -bt -bC -bG -aW -aR -aM -ch -bf -bj -cr -bC -bG -aP -aV -cV -dF -ea -eB -fg -cV -fF -fZ -fJ -gJ -gR -hd -hx -hO -ij -iy -hw -jd -hd -jv -jv -jW -jN -jL -hd -gI -gI -fJ -ad -ad -ad -ad -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 -"} -(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 -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -af -af -af -af -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -aM -cV -cV -cV -cV -cV -cV -fG -fZ -fJ -gI -gR -hd -hw -hP -ik -iz -hw -hw -hd -jv -jv -jL -jv -jv -hd -gK -gI -fJ -ad -ad -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 -"} -(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 -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cs -cs -cs -cs -cs -cs -eC -fh -fp -fH -fZ -fJ -gI -gR -hd -hw -hQ -hQ -hQ -hw -hw -hd -jv -jv -jN -jv -kv -hd -gI -gI -fJ -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -kY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cs -cs -cs -cs -cs -cs -eC -fi -fq -fI -ga -fJ -gI -gR -hd -hw -hw -hw -hw -hw -hw -jo -jv -jv -jv -km -kw -hd -gI -gI -fJ -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cC -cH -cH -cH -cH -eb -cs -fj -cm -fJ -fJ -fJ -fJ -gT -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -hd -gI -gI -fJ -ad -ad -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -ct -cs -cD -cs -cs -cs -cs -ec -cs -fk -cm -ad -ad -fJ -gI -gU -he -gI -gI -hy -gI -gI -gI -gI -gI -gI -gI -gI -gI -gI -gI -gI -fJ -ad -ad -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -fJ -gI -gV -hf -hy -gI -gI -gI -gI -gI -hf -gI -gI -gI -hy -gI -hf -gI -gI -fJ -ad -ad -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -fJ -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cD -cs -cs -cs -cs -ec -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -ct -cs -cD -cs -cs -cs -cs -ec -cs -fk -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cE -cI -cI -cI -cI -ed -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cs -cs -cs -cs -cs -cs -cs -cs -cs -cs -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cm -cu -cu -cu -cu -cu -cu -cu -cu -cu -cu -cm -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -aa -aa -ad -ad -aa -aa -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ad -ad -ad -aa -aa -ad -ad -ad -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ad -ad -ad -aa -aa -ad -ad -ad -aa -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -"} -(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 -ad -aa -aa -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 -"} -(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 -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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -"} -(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 -"} -(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 -"} -(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 -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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -"} -(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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -"} diff --git a/maps/away/slavers/slavers_base_areas.dm b/maps/away/slavers/slavers_base_areas.dm deleted file mode 100644 index be7805597bb..00000000000 --- a/maps/away/slavers/slavers_base_areas.dm +++ /dev/null @@ -1,42 +0,0 @@ -/area/slavers_base - icon = 'maps/away/slavers/icons/areas.dmi' - -/area/slavers_base/maint - name = "\improper Slavers Base Maintenance" - icon_state = "maint" - -/area/slavers_base/dorms - name = "\improper Slavers Dorms" - icon_state = "dorms" - -/area/slavers_base/secwing - name = "\improper Slavers Base Security Wing" - icon_state = "secwing" - -/area/slavers_base/mort - name = "\improper Slaves Mortuary" - icon_state = "mort" - -/area/slavers_base/cells - name = "\improper Slaves Cells" - icon_state = "cells" - -/area/slavers_base/hallway - name = "\improper Slavers Base Hallways" - icon_state = "hallway" - -/area/slavers_base/med - name = "\improper Slaves Medical Examination Room" - icon_state = "med" - -/area/slavers_base/demo - name = "\improper Slaves Demonstration room" - icon_state = "demo" - -/area/slavers_base/powatm - name = "\improper Slavers Base power and atmos room" - icon_state = "powatm" - -/area/slavers_base/hangar - name = "\improper Slavers Base Hangar" - icon_state = "hangar" \ No newline at end of file diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index 808d13e1443..a0dbd796036 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -3,7 +3,7 @@ /turf/space, /area/space) "ab" = ( -/turf/floor, +/turf/floor/barren, /area/mine/explored) "ac" = ( /turf/unsimulated/mask, @@ -24,7 +24,7 @@ /turf/floor, /area/smugglers/base) "ah" = ( -/turf/floor, +/turf/floor/barren, /area/space) "aj" = ( /obj/item/ammo_casing/pistol/magnum{ @@ -37,11 +37,11 @@ pixel_y = -5 }, /obj/effect/decal/cleanable/blood, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "ak" = ( /obj/effect/decal/cleanable/blood, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "al" = ( /obj/effect/wallframe_spawn/reinforced, @@ -98,7 +98,7 @@ pixel_y = 7 }, /obj/item/flashlight/flare/glowstick/yellow, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "av" = ( /obj/effect/decal/cleanable/blood/drip, @@ -204,7 +204,7 @@ /turf/floor, /area/smugglers/base) "aF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, @@ -281,11 +281,11 @@ pixel_x = -25; pixel_y = 25 }, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "aM" = ( /obj/random/trash, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "aN" = ( /obj/machinery/light/small{ @@ -367,7 +367,7 @@ /turf/floor, /area/smugglers/base) "aW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor, /area/smugglers/base) "aX" = ( @@ -432,7 +432,7 @@ /obj/item/tool/xeno/hand{ pixel_x = -15 }, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "bh" = ( /obj/effect/floor_decal/industrial/warning{ @@ -476,7 +476,7 @@ /area/smugglers/base) "bn" = ( /obj/structure/boulder, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "bo" = ( /obj/item/stack/material/ore/silver, @@ -484,7 +484,7 @@ pixel_x = 10; pixel_y = -5 }, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "bp" = ( /obj/structure/cable{ @@ -607,11 +607,11 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/office) "bD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper, /obj/item/pen, /obj/item/flashlight/lamp, @@ -661,11 +661,11 @@ /turf/floor, /area/smugglers/base) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/office) "bK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/coin{ pixel_x = -5; pixel_y = -3 @@ -777,8 +777,8 @@ /turf/wall, /area/smugglers/dorms) "cd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -788,7 +788,7 @@ /obj/structure/noticeboard{ default_pixel_y = 30 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/machinery/microwave{ pixel_y = 10 @@ -796,7 +796,7 @@ /turf/floor/tiled, /area/smugglers/dorms) "cf" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/crate, /obj/random/snack, /obj/random/snack, @@ -806,21 +806,21 @@ /turf/floor/tiled, /area/smugglers/dorms) "cg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/crate, /obj/random/drinkbottle, /obj/random/drinkbottle, /turf/floor/tiled, /area/smugglers/dorms) "ch" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/arcade, /turf/floor/tiled, /area/smugglers/dorms) "ci" = ( /obj/structure/closet/crate/plastic/rations, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cj" = ( @@ -828,8 +828,8 @@ /turf/floor/plating/airless, /area/smugglers/dorms) "cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc{ dir = 8; @@ -839,12 +839,12 @@ /turf/floor/tiled, /area/smugglers/dorms) "cm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "co" = ( @@ -854,7 +854,7 @@ /turf/floor, /area/smugglers/dorms) "cp" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/random/medical/lite, /turf/floor/plating/airless, /area/smugglers/dorms) @@ -874,7 +874,7 @@ /area/smugglers/dorms) "cs" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper/smug_3, /obj/item/flame/fuelled/lighter, /obj/random/coin, @@ -882,7 +882,7 @@ /area/smugglers/dorms) "ct" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/cash/c10, /obj/random/smokes, /obj/random/snack, @@ -897,7 +897,7 @@ /area/smugglers/dorms) "cv" = ( /obj/structure/closet, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/medical, /obj/random/medical, /obj/random/tech_supply, @@ -910,29 +910,29 @@ /area/smugglers/dorms) "cx" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cy" = ( /obj/structure/closet/smuggler, /obj/random/suit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cz" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/hostile/malf_drone, /turf/floor/tiled, /area/smugglers/dorms) "cA" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/floor/tiled, /area/smugglers/dorms) "cB" = ( /obj/machinery/light/small, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/smugglers/dorms) "cC" = ( @@ -946,7 +946,7 @@ "db" = ( /obj/effect/decal/cleanable/blood, /obj/abstract/landmark/corpse/doctor, -/turf/floor, +/turf/floor/barren, /area/mine/explored) "eb" = ( /obj/machinery/light/small{ diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index b63e93afd20..f31f2097fe4 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -13,7 +13,7 @@ /turf/wall/titanium, /area/space) "ae" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/advdevice, /obj/item/flashlight/lamp, /turf/floor/carpet/red, @@ -32,7 +32,7 @@ /turf/floor/carpet/red, /area/unishi/library) "ai" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp, /turf/floor/carpet/red, /area/unishi/library) @@ -960,18 +960,18 @@ /turf/floor/tiled, /area/unishi/meeting) "cN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin, /obj/item/pen/fancy, /turf/floor/tiled, /area/unishi/meeting) "cO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pen/fancy, /turf/floor/tiled, /area/unishi/meeting) "cP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/folder/yellow, /obj/item/pen/green, /turf/floor/tiled, @@ -1023,7 +1023,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cX" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1033,7 +1033,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1042,7 +1042,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cZ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1982,7 +1982,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fy" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/snack, /obj/item/flashlight/lamp, /turf/floor/tiled/dark, @@ -2008,7 +2008,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin, /obj/item/flashlight/lamp, /turf/floor/tiled/dark, @@ -2283,7 +2283,7 @@ /turf/space, /area/unishi/smresearch) "go" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/item/defibrillator, /turf/floor/tiled/techfloor, /area/unishi/smresearch) @@ -2397,7 +2397,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 4 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index 8ad33994f7d..df8752f14c5 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -639,7 +639,7 @@ /area/unishi/med) "cd" = ( /obj/structure/bed/chair/armchair/black, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "ce" = ( /obj/machinery/vending/tool, @@ -757,7 +757,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cr" = ( /obj/structure/cable{ @@ -842,17 +842,17 @@ /obj/structure/cable{ icon_state = "1-8" }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cy" = ( /obj/machinery/vending/games, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cz" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cA" = ( /obj/effect/wingrille_spawn/reinforced, @@ -893,24 +893,24 @@ /obj/structure/bed/chair/armchair/beige{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/cell/crap, /obj/item/stock_parts/circuitboard/gyrotron_control, /obj/item/paper_bin, /obj/machinery/light/small{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cI" = ( /obj/effect/shuttle_landmark/nav_unishi/nav1, /turf/space, /area/space) "cJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/trash/raisins, /obj/item/pizzabox/margherita, /obj/random/advdevice, @@ -920,22 +920,22 @@ /turf/floor/tiled, /area/unishi/living) "cK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/dice, /obj/item/deck/cards, /obj/item/pen/fancy, /obj/random/tech_supply, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/board, /obj/item/book/manual/mass_spectrometry, /obj/item/book/fluff/stasis, /turf/floor/tiled, /area/unishi/living) "cM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, @@ -970,7 +970,7 @@ /obj/structure/bed/chair/armchair/black{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/lounge) "cQ" = ( /obj/structure/bed/chair/padded/brown{ @@ -1024,7 +1024,7 @@ /turf/floor/tiled, /area/unishi/living) "cY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/trash/raisins, /obj/item/book/manual/nuclear, /turf/floor/tiled, @@ -1091,7 +1091,7 @@ /turf/floor/tiled, /area/unishi/kitchen) "dg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/trash/candy, /obj/machinery/recharger, /turf/floor/tiled, @@ -1268,7 +1268,7 @@ /turf/floor/tiled, /area/unishi/living) "dD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/cane/fancy/sword, /obj/item/clothing/suit/radiation, /turf/floor/tiled, @@ -1441,7 +1441,7 @@ /turf/floor/tiled, /area/unishi/living) "eb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/poster, /obj/item/grooming/comb/colorable/random, /obj/random/advdevice, @@ -1625,11 +1625,11 @@ /obj/random/clothing, /obj/random/clothing, /obj/random/hat, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "ey" = ( /obj/structure/bed/padded, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "ez" = ( /obj/structure/closet/toolcloset, @@ -1638,17 +1638,17 @@ "eA" = ( /obj/structure/bed/padded, /obj/item/bedsheet/rd, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eB" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, /obj/item/toy/plushie/lizard, /obj/random/advdevice, /obj/random/drinkbottle, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1657,7 +1657,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eD" = ( /obj/machinery/door/airlock{ @@ -1711,22 +1711,22 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eI" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/grooming/brush, /obj/item/cosmetics/lipstick/black, /obj/item/cosmetics/lipstick/green, /obj/item/cosmetics/lipstick/violet, /obj/random/drinkbottle, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eK" = ( /obj/structure/bed/chair/office, @@ -1734,7 +1734,7 @@ dir = 4; icon_state = "bulb1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eL" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1750,10 +1750,10 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eN" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -1777,28 +1777,28 @@ /obj/structure/bed/chair/office/comfy/black{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pen/fancy, /obj/random/drinkbottle, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eV" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -1809,7 +1809,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -1820,7 +1820,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eY" = ( /obj/structure/safe, @@ -1837,7 +1837,7 @@ /obj/item/cash/c200, /obj/item/cash/c200, /obj/item/grenade/supermatter, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "eZ" = ( /obj/structure/safe, @@ -1850,14 +1850,14 @@ /obj/item/cash/c500, /obj/item/pen/reagent/sleepy, /obj/random/hardsuit, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "fa" = ( /obj/machinery/light/small{ dir = 4; icon_state = "bulb1" }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "fb" = ( /obj/effect/wallframe_spawn/reinforced/hull, @@ -1865,7 +1865,7 @@ /area/unishi/living) "fc" = ( /obj/structure/bed/chair/armchair/black, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "fd" = ( /obj/structure/table/reinforced, @@ -1873,7 +1873,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "fe" = ( /obj/abstract/map_data{ @@ -1936,7 +1936,7 @@ /obj/random/contraband, /obj/random/clothing, /obj/random/hat, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "qS" = ( /obj/structure/closet/secure_closet/personal/cabinet, @@ -1944,12 +1944,12 @@ /obj/random/drinkbottle, /obj/random/clothing, /obj/random/hat, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "sS" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/random/clothing, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "ur" = ( /obj/machinery/hologram/holopad/longrange/remoteship, @@ -1975,7 +1975,7 @@ /obj/random/contraband, /obj/random/clothing, /obj/random/hat, -/turf/floor/wood, +/turf/floor/laminate, /area/unishi/living) "AF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index e82bfab4257..0b7112c782b 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -1,13 +1,14 @@ #include "unishi_areas.dm" #include "unishi_jobs.dm" #include "../../../mods/content/xenobiology/_xenobiology.dme" +#include "../../../mods/content/supermatter/_supermatter.dme" /obj/abstract/submap_landmark/joinable_submap/unishi - name = "SRV Verne" + name = "SRV Verne" archetype = /decl/submap_archetype/derelict/unishi /decl/submap_archetype/derelict/unishi - descriptor = "derelict research vessel" + name = "derelict research vessel" crew_jobs = list( /datum/job/submap/unishi_crew, /datum/job/submap/unishi_researcher diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 3e56a19c9e6..87f0973c888 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -15,8 +15,8 @@ /turf/floor/tiled/airless/broken, /area/yacht/bridge) "ae" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "af" = ( /obj/effect/shuttle_landmark/nav_yacht/nav2, @@ -30,60 +30,60 @@ /turf/wall/titanium, /area/yacht/bridge) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/ship/helm, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/bridge) "aj" = ( /obj/machinery/computer/ship/sensors{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/bridge) "ak" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/structure/bed/chair/comfy/captain, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "al" = ( /obj/machinery/computer/ship/engines{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/bridge) "am" = ( /obj/item/folder/blue, /obj/item/form_printer, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/drinks/glass2/coffeecup, /obj/item/newspaper, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/energy, /obj/item/paper{ info = "I used up all of my energy. I am hopelessly lost. This ship has become my grave. They did it. The intelligence agency that no one ever talks about. Sol Gov wanted their revenge, and they got it. They easily could have killed me on my ship, or tortured me, but they knew that floating here through space would be the worst possible torture. " }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/bridge) "an" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/bridge) "ao" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/maintenance/clean, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/bridge) "ap" = ( /obj/structure/filing_cabinet/chestdrawer, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "aq" = ( /obj/machinery/light{ @@ -94,16 +94,16 @@ /obj/item/rig/medical/equipped, /obj/item/gun/energy/captain, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "ar" = ( /obj/machinery/alarm{ dir = 1; pixel_y = -22 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "as" = ( /obj/structure/cable{ @@ -111,8 +111,8 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "at" = ( /obj/structure/cable{ @@ -122,8 +122,8 @@ name = "Yacht bridge"; pixel_y = -24 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "au" = ( /obj/machinery/light{ @@ -131,8 +131,8 @@ icon_state = "tube1" }, /obj/structure/reagent_dispensers/water_cooler, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/yacht/bridge) "av" = ( /obj/structure/mirror, @@ -145,7 +145,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/door/airlock, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/bridge) "ax" = ( /turf/wall/walnut, @@ -179,7 +179,7 @@ /obj/structure/hygiene/shower{ pixel_y = 20 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aE" = ( @@ -188,15 +188,15 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aF" = ( /obj/structure/bed/chair/wood/wings{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aG" = ( /obj/machinery/light{ @@ -205,29 +205,29 @@ /obj/structure/table/marble, /obj/item/trash/snack_bowl, /obj/machinery/reagentgrinder/juicer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper{ info = "Tonight I woke up to a sound I hoped to have never heard, a small explosion. I rushed to the bridge to diagnose the damage and saw the worst possible news. My solar tracker is gone, and so is the fucking computer. No way to override the settings now, because the assholes EMPd the computer. No way to charge my SMES reliably, and no way to heat the fuel. I am stuck in the water! Unheated, this gas will not be enough to get absolutely anywhere near a port. This is bad. Real bad. The current charge on SMES is 20 percent, so I'll just try and orient the ship to hit the current star at maximum efficiency so we will charge at 100, and maybe make it to the next solar system. The next port is in the orbit of a Gas giant named Duma. Maybe I can dock there and repair my array. I freaking knew I needed to get a generator. I spent all of the money the Terrans gave me, and this piece of shit is all I could get. " }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "aH" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "aI" = ( /obj/item/towel/random, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aJ" = ( /obj/structure/hygiene/toilet{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "aK" = ( @@ -239,24 +239,24 @@ /obj/machinery/light{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aL" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aM" = ( /obj/structure/table/marble, /obj/item/pizzabox/vegetable, /obj/item/chems/glass/rag, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/junk, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "aO" = ( /obj/machinery/vending/wallmed1, @@ -264,25 +264,25 @@ /area/yacht/living) "aP" = ( /obj/machinery/door/airlock, -/turf/floor/wood, +/turf/floor/laminate, /area/yacht/living) "aQ" = ( /obj/structure/table/marble, /obj/item/deck/cards, /obj/item/dice, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aR" = ( /obj/effect/decal/cleanable/blood/gibs/robot/up, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aS" = ( /obj/structure/table/marble, /obj/machinery/microwave, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aT" = ( /obj/effect/decal/cleanable/cobweb, @@ -296,7 +296,7 @@ /obj/effect/decal/cleanable/blood/drip, /obj/effect/spider/stickyweb, /mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/living) "aV" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -307,7 +307,7 @@ }, /obj/effect/decal/cleanable/blood/drip, /obj/effect/spider/stickyweb, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/living) "aW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -319,7 +319,7 @@ /obj/structure/emergency_dispenser/north, /obj/effect/decal/cleanable/blood/drip, /obj/machinery/door/airlock, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "aX" = ( /obj/structure/cable{ @@ -327,8 +327,8 @@ }, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -337,8 +337,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "aZ" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -350,9 +350,9 @@ /obj/structure/table/marble, /obj/item/book/manual/chef_recipes, /obj/item/chems/drinks/pitcher, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/drinkbottle, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "ba" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -360,8 +360,8 @@ }, /obj/effect/decal/cleanable/blood/gibs/robot/down, /obj/effect/decal/cleanable/blood/gibs/robot/up, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bb" = ( /obj/machinery/light{ @@ -369,8 +369,8 @@ icon_state = "tube1" }, /obj/machinery/vending/dinnerware, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bc" = ( /obj/structure/bed/padded, @@ -380,17 +380,17 @@ /area/yacht/living) "bd" = ( /obj/effect/spider/stickyweb, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/living) "bf" = ( /obj/effect/decal/cleanable/blood/gibs/robot/limb, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bg" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bh" = ( /obj/structure/cable{ @@ -399,8 +399,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bk" = ( /obj/effect/wallframe_spawn/reinforced, @@ -419,7 +419,7 @@ /area/yacht/living) "bn" = ( /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bo" = ( @@ -427,11 +427,11 @@ /turf/floor/tiled/freezer, /area/yacht/living) "bp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/paper{ info = "I have accepted my fate. I will go into EVA with one of the cyanide pills in my mouth, and I will float off. I want a military funeral, and I will arrange it myself. Good bye all. I have earned and sealed my fate. " }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "bq" = ( /obj/structure/bookcase, @@ -454,8 +454,8 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bu" = ( /turf/floor/carpet/purple, @@ -478,7 +478,7 @@ /turf/floor/rock/sand/water, /area/yacht/living) "bz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bA" = ( @@ -492,8 +492,8 @@ dir = 8 }, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -503,8 +503,8 @@ dir = 4 }, /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -514,7 +514,7 @@ dir = 4 }, /obj/machinery/door/airlock, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "bD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -540,7 +540,7 @@ }, /obj/item/bible, /obj/item/pen/blue, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper{ info = "Let me introduce myself. My name is Commander Archibald McKinley, although the Fleet fucks think that I do not deserve the title. Well, fuck them. They accused me of facilitating a destruction of the ship I was CO of. A small missile cruiser, with zero to fucking none point defenses was attacked, and they first accuse me of escaping before any of my crew. What kind of person wouldn't expect someone to escape when their ship is on fire? It's lunacy. But it only got worse. Then they said that I helped the Terrans take the ship. Well fuck them, they are wrong. That's non sense. I have no connection to the Terrans. They said that I got a large sum of money from them in order to betray my ship's position, which is once again total nonsense. I've got about 20 years of life left here, and I know that I will be safe with my ship here. I need to resupply once every 5 years, given how much food and fuel I have, and I've got enough range to go to pretty much any known part of the galaxy, in complete silence, as we are totally solar powered. I wish I could afford ion thrusters to not have to rely on gas for propulsion, but, our gas heaters should provide us with enough pressure to get anywhere in relative decent speed. Also, I got a robot butler who cooks delicious food for me! No more crappy lance corporal food, eh" }, @@ -556,7 +556,7 @@ "bI" = ( /obj/machinery/light, /obj/item/clothing/shoes/swimmingfins, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/freezer, /area/yacht/living) "bJ" = ( @@ -566,14 +566,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/blood/gibs/robot/limb, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bK" = ( /obj/effect/decal/cleanable/blood/gibs/robot/down, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/floodlight, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "bL" = ( /obj/machinery/light/small, @@ -596,7 +596,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/blood/gibs/robot/down, /obj/machinery/door/airlock, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/yacht/living) "bP" = ( /turf/wall/walnut, @@ -609,24 +609,24 @@ /area/yacht/engine) "bR" = ( /obj/machinery/atmospherics/unary/tank/air, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bS" = ( /obj/structure/tank_rack/oxygen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bT" = ( /obj/item/cell/hyper, /obj/item/book/manual/engineering_guide, /obj/item/rcd, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/computer/ship/engines, /turf/floor/plating, /area/yacht/engine) "bU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/smes/buildable, /obj/structure/cable{ icon_state = "0-4" @@ -645,40 +645,40 @@ name = "Yacht engine"; pixel_y = 24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "bW" = ( /obj/item/chems/spray/extinguisher, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bX" = ( /obj/machinery/vending/hydronutrients, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bY" = ( /obj/machinery/seed_storage/garden, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "bZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/supply, /turf/floor/plating, /area/yacht/engine) "ca" = ( /obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cb" = ( /obj/machinery/atmospherics/binary/pump, /obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cc" = ( @@ -691,14 +691,14 @@ /area/yacht/engine) "cd" = ( /obj/structure/closet/crate/hydroponics, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "ce" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stock_parts/circuitboard/broken, /turf/floor/plating, /area/yacht/engine) @@ -728,8 +728,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cj" = ( /obj/structure/cable{ @@ -739,20 +739,20 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "ck" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cl" = ( /obj/structure/janitorialcart, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cm" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -762,21 +762,21 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "co" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/cyan{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/powered/pump, /turf/floor/plating, /area/yacht/engine) @@ -843,7 +843,7 @@ /turf/floor/plating/airless, /area/yacht/engine) "cu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -857,30 +857,30 @@ pixel_x = -24 }, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cE" = ( /obj/effect/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cF" = ( /obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cJ" = ( @@ -904,12 +904,12 @@ /area/yacht/engine) "cN" = ( /obj/structure/closet/toolcloset, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cQ" = ( @@ -921,8 +921,8 @@ pixel_x = -23 }, /obj/machinery/portable_atmospherics/hydroponics, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cR" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -931,32 +931,32 @@ }, /obj/item/tool/spade, /obj/item/chems/glass/bucket, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cS" = ( /obj/machinery/light, /obj/structure/reagent_dispensers/beerkeg, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cW" = ( /obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "cY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "cZ" = ( @@ -966,7 +966,7 @@ "da" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/item/caution/cone, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "db" = ( @@ -975,13 +975,13 @@ /area/yacht/engine) "dc" = ( /obj/structure/closet/wardrobe/pjs, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "dd" = ( /obj/structure/closet/wardrobe/suit, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) "df" = ( /obj/structure/closet/secure_closet/bar, @@ -989,7 +989,7 @@ /area/yacht/engine) "dg" = ( /obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dh" = ( @@ -997,7 +997,7 @@ dir = 1; level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "di" = ( @@ -1010,11 +1010,11 @@ /area/yacht/engine) "dk" = ( /obj/machinery/atmospherics/unary/heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1; level = 2 @@ -1025,7 +1025,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "do" = ( @@ -1034,7 +1034,7 @@ dir = 4; pixel_y = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/meter, /turf/floor/plating, /area/yacht/engine) @@ -1080,7 +1080,7 @@ /area/yacht/engine) "dt" = ( /obj/machinery/atmospherics/pipe/manifold4w/visible/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/meter, /obj/machinery/light/small{ dir = 8 @@ -1088,7 +1088,7 @@ /turf/floor/plating, /area/yacht/engine) "du" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black{ dir = 10 }, @@ -1096,21 +1096,21 @@ /area/yacht/engine) "dv" = ( /obj/machinery/atmospherics/pipe/simple/visible/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dw" = ( /obj/machinery/atmospherics/unary/heater{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dx" = ( /turf/floor/reinforced/carbon_dioxide, /area/yacht/engine) "dy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/black, /turf/floor/plating, /area/yacht/engine) @@ -1119,7 +1119,7 @@ dir = 8 }, /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "dA" = ( @@ -1127,7 +1127,7 @@ dir = 10 }, /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/recharge_station, /turf/floor/plating, /area/yacht/engine) @@ -1168,13 +1168,13 @@ /obj/item/clothing/suit/det_trench/grey, /obj/item/clothing/gloves/ring/cti, /obj/item/clothing/costume/oldman, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/effect/spider/stickyweb, /obj/random/cash, /obj/random/cash, /obj/random/cash, /obj/random/projectile, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/yacht/living) "fb" = ( /obj/machinery/button/access/exterior{ @@ -1188,7 +1188,7 @@ /obj/structure/cable{ icon_state = "0-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/constructable_frame/computerframe, /obj/machinery/button/access/interior{ id_tag = "yacht_airlock"; @@ -1205,7 +1205,7 @@ icon_state = "0-2" }, /obj/item/toolbox/electrical, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1218,7 +1218,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 1 }, @@ -1228,7 +1228,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/door/airlock/external/bolted{ id_tag = "yacht_outer" }, @@ -1238,7 +1238,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ id_tag = "yacht_airlock"; pixel_y = 24; @@ -1262,7 +1262,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1278,7 +1278,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, @@ -1288,7 +1288,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump{ dir = 8 }, @@ -1298,8 +1298,8 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, @@ -1311,7 +1311,7 @@ dir = 8; pixel_x = 24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, @@ -1324,7 +1324,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "rb" = ( @@ -1334,7 +1334,7 @@ /turf/floor/plating, /area/yacht/engine) "sb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, @@ -1342,7 +1342,7 @@ /area/yacht/engine) "tb" = ( /obj/structure/closet/firecloset, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, @@ -1350,14 +1350,14 @@ /area/yacht/engine) "ub" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/yacht/engine) "vb" = ( /obj/machinery/atmospherics/portables_connector{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/floor/plating, /area/yacht/engine) @@ -1369,7 +1369,7 @@ pixel_y = 20 }, /obj/item/bikehorn/rubberducky, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/soap, /turf/floor/tiled/freezer, /area/yacht/living) @@ -1378,7 +1378,7 @@ /area/yacht/living) "Hj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -1386,9 +1386,9 @@ /area/yacht/engine) "Ty" = ( /obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/yew, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/yew, /area/yacht/living) (1,1,1) = {" diff --git a/maps/away_sites_testing/away_sites_testing.dm b/maps/away_sites_testing/away_sites_testing.dm index 3f324d268ea..ab5e2b12a3d 100644 --- a/maps/away_sites_testing/away_sites_testing.dm +++ b/maps/away_sites_testing/away_sites_testing.dm @@ -17,7 +17,6 @@ #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" diff --git a/maps/away_sites_testing/away_sites_testing_define.dm b/maps/away_sites_testing/away_sites_testing_define.dm index 6f3a96274ee..fd1868d5c2a 100644 --- a/maps/away_sites_testing/away_sites_testing_define.dm +++ b/maps/away_sites_testing/away_sites_testing_define.dm @@ -4,10 +4,14 @@ full_name = "Away Sites Testing Land" path = "away_sites_testing" overmap_ids = list(OVERMAP_ID_SPACE) + votable = FALSE allowed_latejoin_spawns = list() default_spawn = null +/datum/map/away_sites_testing/validate() + return TRUE // Do not check for level lists, this is not a playable map. + // 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) @@ -16,10 +20,10 @@ 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) for (var/datum/map_template/A in sorted_sites) - A.load_new_z(centered = FALSE) + A.load_new_z() testing("Spawning [A] in [english_list(SSmapping.get_connected_levels(world.maxz))]") if(A.template_flags & TEMPLATE_FLAG_TEST_DUPLICATES) - A.load_new_z(centered = FALSE) + A.load_new_z() testing("Spawning [A] in [english_list(SSmapping.get_connected_levels(world.maxz))]") /proc/cmp_sort_templates_tallest_to_shortest(var/datum/map_template/a, var/datum/map_template/b) diff --git a/maps/example/example-3.dmm b/maps/example/example-3.dmm index 5b89fac02e5..abffda753cc 100644 --- a/maps/example/example-3.dmm +++ b/maps/example/example-3.dmm @@ -227,9 +227,8 @@ /turf/floor, /area/example/third) "MO" = ( -/obj/abstract/level_data_spawner/main_level{ +/obj/abstract/level_data_spawner/admin_level{ name = "Example Third Deck"; - }, /turf/space, /area/space) diff --git a/maps/example/example_define.dm b/maps/example/example_define.dm index 9c48d50899f..5f8a3a80c16 100644 --- a/maps/example/example_define.dm +++ b/maps/example/example_define.dm @@ -2,6 +2,7 @@ name = "Testing" full_name = "Testing Site" path = "example" + votable = FALSE lobby_screens = list( 'maps/example/example_lobby.png' diff --git a/maps/example/example_jobs.dm b/maps/example/example_jobs.dm index e3ad5c0c488..28d5cf504c6 100644 --- a/maps/example/example_jobs.dm +++ b/maps/example/example_jobs.dm @@ -1,7 +1,6 @@ /datum/map/example default_job_type = /datum/job/example default_department_type = /decl/department/example - id_hud_icons = 'maps/example/hud.dmi' /datum/job/example title = "Tourist" @@ -13,9 +12,10 @@ access = list() minimal_access = list() outfit_type = /decl/outfit/job/tourist + hud_icon = 'maps/example/hud.dmi' department_types = list( /decl/department/example - ) + ) /decl/outfit/job/tourist name = "Job - Testing Site Tourist" diff --git a/maps/example/example_unit_testing.dm b/maps/example/example_unit_testing.dm index 6c4c9380ab3..df857c78a41 100644 --- a/maps/example/example_unit_testing.dm +++ b/maps/example/example_unit_testing.dm @@ -9,3 +9,11 @@ /obj/abstract/map_data/example height = 3 + +// Enforce that this map must not have any modpacks, to ensure core code compiles on its own. +// I'd do this in setup_map on the example map datum but that happens before modpack init. +// This catches any modpacks accidentally included by core code, default away sites, space/planet ruin maps, etc. +/datum/controller/subsystem/modpacks/Initialize() + . = ..() + if(length(loaded_modpacks)) + CRASH("Example map had the following modpacks loaded: [json_encode(loaded_modpacks)]") \ No newline at end of file diff --git a/maps/example/hud.dmi b/maps/example/hud.dmi index 89dd2f9a079..c2c456e9d50 100644 Binary files a/maps/example/hud.dmi and b/maps/example/hud.dmi differ diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index c76876085ba..bd953735089 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -430,7 +430,7 @@ /obj/item/deck/cards{ pixel_y = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/sub/port) "bn" = ( /obj/effect/floor_decal/industrial/hatch/yellow, @@ -441,7 +441,7 @@ "bo" = ( /obj/structure/table/gamblingtable, /obj/random/coin, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/sub/port) "bp" = ( /obj/random/obstruction, @@ -464,7 +464,7 @@ /obj/structure/bed/chair/wood/wings{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/sub/port) "bt" = ( /obj/structure/bed/chair/wood/wings{ @@ -2424,7 +2424,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/central) "gJ" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/space, /area/space) "gK" = ( @@ -3496,8 +3496,7 @@ department = "Atmospherics"; name = "Atmos RC"; pixel_y = 32; - dir = 1; - + dir = 1 }, /obj/structure/table/steel, /turf/floor/tiled/steel_grid, @@ -5467,6 +5466,10 @@ }, /turf/floor/lino, /area/exodus/maintenance/telecomms) +"rd" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "rj" = ( /obj/effect/floor_decal/industrial/outline/grey, /obj/machinery/camera/network/command{ @@ -16599,7 +16602,7 @@ aa aa aa aa -aa +rd aa aa aa @@ -44175,7 +44178,7 @@ aa aa aa aa -aa +rd aa aa aa @@ -49205,7 +49208,7 @@ aa aa aa aa -aa +rd aa aa aa diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 7db00f89826..093c3433310 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -60,7 +60,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/security/detectives_office) "aae" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/drinks/flask/barflask{ pixel_x = -4; pixel_y = 8 @@ -200,7 +200,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/range) "aaD" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /obj/effect/floor_decal/industrial/hatch/yellow, /turf/floor/tiled/steel_grid, /area/exodus/security/range) @@ -344,11 +344,11 @@ /area/exodus/security/range) "aaV" = ( /obj/structure/closet/crate, -/obj/item/target, -/obj/item/target, -/obj/item/target, -/obj/item/target, -/obj/item/target, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, +/obj/item/training_dummy, /obj/machinery/light, /turf/floor/tiled/steel_grid, /area/exodus/security/range) @@ -1539,7 +1539,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "adu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flame/candle{ pixel_x = -5; pixel_y = 5 @@ -3537,7 +3537,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "ahH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/megaphone, /obj/item/radio/off, /turf/floor/tiled/dark, @@ -3591,7 +3591,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "ahO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/keycard_auth{ dir = 8 }, @@ -3794,7 +3794,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "air" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable/green{ icon_state = "1-4" }, @@ -3809,7 +3809,7 @@ name = "east bump"; pixel_x = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/recharger{ pixel_y = 4 }, @@ -3989,7 +3989,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "aiP" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/taperecorder, /turf/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) @@ -3997,7 +3997,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "aiR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -4008,7 +4008,7 @@ dir = 8; pixel_x = 24 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -4218,7 +4218,7 @@ pixel_y = -32; dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "ajm" = ( /obj/structure/window/reinforced{ @@ -4511,7 +4511,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/heads/hos) "ajL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/newscaster{ pixel_x = 28; pixel_y = 1 @@ -4955,7 +4955,7 @@ /turf/floor/lino, /area/exodus/security/detectives_office) "akD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /obj/item/secure_storage/safe{ pixel_x = 6; @@ -4990,7 +4990,7 @@ /obj/machinery/alarm{ pixel_y = 22 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flash, /obj/item/clothing/glasses/sunglasses, /obj/item/chems/spray/pepper, @@ -5136,7 +5136,7 @@ /turf/floor/carpet, /area/exodus/security/detectives_office) "akU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/ashtray/plastic, /obj/item/box/fancy/cigarettes/dromedaryco, /obj/item/clothing/gloves/forensic, @@ -5499,7 +5499,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/button/alternate/door{ id_tag = "detdoor"; name = "Office Door" @@ -6354,7 +6354,7 @@ /obj/item/secure_storage/safe{ pixel_x = -23 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /turf/floor/lino, /area/exodus/security/detectives_office) @@ -6366,7 +6366,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/button/alternate/door{ id_tag = "detdoor"; name = "Office Door" @@ -6623,7 +6623,7 @@ dir = 8; pixel_x = 22 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/photo_album{ pixel_y = -10 }, @@ -6736,7 +6736,7 @@ /turf/floor/carpet, /area/exodus/security/detectives_office) "aof" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flash, /obj/item/chems/spray/pepper, /obj/item/clothing/glasses/sunglasses, @@ -7142,7 +7142,7 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "apb" = ( /obj/structure/cable{ @@ -7429,11 +7429,11 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/lobby) "apF" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "apG" = ( /obj/structure/bed/chair/wood/wings, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "apH" = ( /obj/machinery/hologram/holopad, @@ -7850,14 +7850,14 @@ /obj/structure/table/gamblingtable, /obj/item/board, /obj/item/box/checkers/chess/red, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "aqu" = ( /obj/structure/table/gamblingtable, /obj/item/deck/cards{ pixel_y = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "aqv" = ( /obj/structure/bed/chair{ @@ -7920,7 +7920,7 @@ /area/exodus/maintenance/dormitory) "aqC" = ( /obj/item/stool/padded, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "aqD" = ( /turf/wall/r_wall/prepainted, @@ -8045,7 +8045,7 @@ "aqP" = ( /obj/structure/table, /obj/item/dice, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "aqQ" = ( /obj/machinery/light/small{ @@ -8415,7 +8415,7 @@ /obj/machinery/light/small{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "arx" = ( /turf/wall/prepainted, @@ -8476,7 +8476,7 @@ "arD" = ( /obj/structure/table/gamblingtable, /obj/item/box/checkers/chess, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "arE" = ( /turf/wall/prepainted, @@ -8547,7 +8547,7 @@ /obj/machinery/vending/cigarette{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "arO" = ( /obj/machinery/door/blast/regular/open{ @@ -8675,7 +8675,7 @@ /obj/structure/bed/chair/wood/wings{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "asb" = ( /obj/structure/bed/chair{ @@ -9749,13 +9749,13 @@ /obj/item/bedsheet/mime, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "auA" = ( /obj/structure/bed/padded, /obj/item/bedsheet/mime, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "auB" = ( /obj/machinery/alarm{ @@ -10030,7 +10030,7 @@ pixel_x = -22 }, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "avh" = ( /obj/structure/cable/green{ @@ -10215,7 +10215,7 @@ dir = 4 }, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "avC" = ( /obj/effect/floor_decal/corner/grey{ @@ -10558,7 +10558,7 @@ /turf/floor/plating, /area/exodus/maintenance/library) "awj" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "awk" = ( /obj/structure/bed/chair{ @@ -10752,7 +10752,7 @@ dir = 5 }, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "awG" = ( /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{ @@ -10926,7 +10926,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "awZ" = ( /obj/structure/cable{ @@ -11020,7 +11020,7 @@ dir = 8 }, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "axj" = ( /obj/machinery/light_switch{ @@ -11030,7 +11030,7 @@ /obj/structure/bed/padded, /obj/item/bedsheet/mime, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "axk" = ( /obj/effect/wallframe_spawn/reinforced, @@ -11332,7 +11332,7 @@ dir = 1 }, /obj/structure/closet/secure_closet/personal, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "axT" = ( /turf/floor/tiled/dark, @@ -11343,7 +11343,7 @@ pixel_x = 24 }, /obj/structure/closet/secure_closet/personal, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "axV" = ( /obj/structure/cable/green{ @@ -11372,7 +11372,7 @@ /turf/floor/plating, /area/exodus/maintenance/security_port) "axY" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/clothing/glasses/threedglasses, /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) @@ -11385,7 +11385,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "aya" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/coin, /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) @@ -11395,7 +11395,7 @@ /area/exodus/crew_quarters/fitness) "ayc" = ( /obj/machinery/hologram/holopad, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "ayd" = ( /obj/effect/floor_decal/industrial/warning{ @@ -11801,7 +11801,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "ayQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paicard, /obj/structure/cable/green{ icon_state = "4-8" @@ -11814,7 +11814,7 @@ /turf/floor/tiled/dark, /area/exodus/crew_quarters/sleep) "ayR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -12341,7 +12341,7 @@ dir = 8 }, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "azW" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -12392,7 +12392,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "aAc" = ( /obj/structure/disposalpipe/segment{ @@ -12444,7 +12444,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "aAi" = ( /obj/structure/cable{ @@ -13349,7 +13349,7 @@ pixel_y = 10 }, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "aCl" = ( /obj/machinery/atmospherics/unary/vent_pump/on, @@ -13683,7 +13683,7 @@ dir = 1 }, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "aCZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -13768,11 +13768,11 @@ /turf/floor/tiled/dark, /area/shuttle/arrival/station) "aDi" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/fabricator/book, /obj/item/stack/material/panel/mapped/plastic/ten, /obj/item/stack/material/plank/mapped/wood/ten, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aDj" = ( /obj/effect/wallframe_spawn/reinforced/titanium, @@ -13803,7 +13803,7 @@ /area/exodus/engineering/sublevel_access) "aDm" = ( /obj/structure/reagent_dispensers/beerkeg, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aDn" = ( /obj/effect/floor_decal/industrial/warning{ @@ -13895,13 +13895,13 @@ /obj/machinery/status_display{ pixel_y = 32 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 }, /obj/item/stack/package_wrap, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aDx" = ( /obj/structure/reagent_dispensers/peppertank{ @@ -14110,7 +14110,7 @@ /obj/structure/cable/green{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aDW" = ( /obj/abstract/landmark{ @@ -14228,14 +14228,14 @@ /turf/floor/tiled/dark/monotile, /area/exodus/gateway) "aEh" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/reagentgrinder, /obj/item/chems/drinks/shaker, /obj/item/stack/package_wrap, /obj/machinery/camera/network/civilian_east{ c_tag = "Bar Backroom" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aEi" = ( /obj/effect/wallframe_spawn/reinforced, @@ -14352,10 +14352,10 @@ /turf/floor/plating, /area/exodus/maintenance/bar) "aEv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/gun/projectile/shotgun/doublebarrel, /obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aEw" = ( /obj/machinery/door/airlock{ @@ -14467,13 +14467,13 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/maintenance/auxsolarport) "aEF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, /obj/item/stack/tape_roll/duct_tape, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aEG" = ( /obj/effect/wallframe_spawn/reinforced, @@ -14566,7 +14566,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aEQ" = ( /obj/structure/disposalpipe/segment{ @@ -14576,7 +14576,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aER" = ( /obj/structure/disposalpipe/segment{ @@ -14591,7 +14591,7 @@ /obj/structure/cable/green{ icon_state = "2-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aES" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -15006,7 +15006,7 @@ pixel_x = 24 }, /obj/structure/cable/green, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aFH" = ( /obj/machinery/network/requests_console{ @@ -15394,11 +15394,11 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/hologram/holopad, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aGp" = ( /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aGq" = ( /obj/machinery/light{ @@ -15580,13 +15580,13 @@ /turf/floor/plating, /area/exodus/maintenance/library) "aGM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/dice/d20, /obj/item/dice, /obj/item/radio/intercom{ pixel_y = 20 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aGN" = ( /obj/machinery/hologram/holopad, @@ -16043,7 +16043,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aHI" = ( /obj/machinery/alarm{ @@ -16366,7 +16366,7 @@ "aIf" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aIg" = ( /turf/wall/prepainted, @@ -16650,7 +16650,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/entry/starboard) "aIN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/recharger, /turf/floor/tiled/dark, @@ -16809,7 +16809,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/hallway/primary/central_two) "aJj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = -2; pixel_y = 5 @@ -16823,7 +16823,7 @@ dir = 4; icon_state = "pipe-c" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aJl" = ( /turf/wall/prepainted, @@ -16870,7 +16870,7 @@ pixel_x = -12; pixel_y = 2 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar/cabin) "aJt" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -17023,12 +17023,12 @@ /area/exodus/hallway/secondary/entry/starboard) "aJI" = ( /obj/structure/filing_cabinet, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aJJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aJK" = ( /obj/machinery/light{ @@ -17058,14 +17058,14 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aJN" = ( /obj/structure/disposalpipe/segment{ dir = 8; icon_state = "pipe-c" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aJO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -17165,7 +17165,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aJX" = ( /obj/structure/reagent_dispensers/watertank, @@ -17215,7 +17215,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aKc" = ( /obj/machinery/power/apc{ @@ -17662,7 +17662,7 @@ /turf/wall/prepainted, /area/exodus/crew_quarters/kitchen) "aLa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp{ pixel_y = 10 }, @@ -17673,7 +17673,7 @@ /turf/floor/lino, /area/exodus/chapel/office) "aLb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/nullrod, /obj/item/eftpos{ eftpos_name = "Chapel EFTPOS scanner" @@ -17681,7 +17681,7 @@ /turf/floor/lino, /area/exodus/chapel/office) "aLc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pen, /obj/item/chems/drinks/bottle/holywater, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -17743,26 +17743,26 @@ /obj/machinery/camera/network/civilian_east{ c_tag = "Library North" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aLj" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aLk" = ( /obj/structure/table, /turf/floor/tiled/dark, /area/exodus/chapel/main) "aLl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/folder/yellow, /obj/item/pen, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aLm" = ( /obj/structure/bed/chair{ @@ -17778,7 +17778,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aLq" = ( /obj/machinery/light{ @@ -18151,7 +18151,7 @@ /obj/structure/bed/chair/office/dark{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aMh" = ( /obj/effect/wallframe_spawn/reinforced, @@ -18170,7 +18170,7 @@ pixel_y = 28 }, /obj/machinery/smartfridge/drinks, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aMk" = ( /obj/machinery/light{ @@ -18225,7 +18225,7 @@ /obj/structure/bed/chair/office/dark{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aMr" = ( /obj/structure/closet/secure_closet/freezer/meat, @@ -18462,7 +18462,7 @@ dir = 4; pixel_x = -22 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aMQ" = ( /obj/machinery/light{ @@ -18475,9 +18475,9 @@ /turf/floor/tiled/dark, /area/exodus/chapel/main) "aMR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/recharger, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aMS" = ( /obj/structure/closet/crate, @@ -18502,7 +18502,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aMV" = ( /turf/wall/titanium, @@ -18545,7 +18545,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/bar) "aNa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -18637,7 +18637,7 @@ /obj/structure/bed/chair/office/dark{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aNk" = ( /turf/floor/tiled/steel_grid, @@ -19131,10 +19131,10 @@ dir = 1 }, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aOg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/food/junk/chips, /obj/random/single{ name = "randomly spawned cola"; @@ -19449,13 +19449,13 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/port) "aOL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/disposalpipe/segment, /obj/item/deck/cards, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aOM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/ashtray/plastic{ pixel_x = -1; pixel_y = 1 @@ -20131,7 +20131,7 @@ /turf/floor/plating, /area/exodus/maintenance/arrivals) "aQj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/cigarettes{ pixel_y = 2 }, @@ -20224,8 +20224,8 @@ /area/exodus/security/prison/restroom) "aQw" = ( /obj/machinery/photocopier, -/obj/structure/table/woodentable, -/turf/floor/wood/walnut, +/obj/structure/table/laminate, +/turf/floor/laminate/walnut, /area/exodus/library) "aQx" = ( /obj/structure/hygiene/sink{ @@ -20412,7 +20412,7 @@ /obj/machinery/door/window/westright{ name = "Library Desk Door" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aQU" = ( /obj/effect/floor_decal/corner/purple/full, @@ -20540,7 +20540,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/library) "aRm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -20661,7 +20661,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/bar) "aRx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/single{ name = "randomly spawned deck of cards"; spawn_object = /obj/item/deck/cards @@ -20776,7 +20776,7 @@ /obj/structure/bookcase{ name = "bookcase (Religious)" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aRL" = ( /turf/floor/carpet, @@ -20930,7 +20930,7 @@ /obj/machinery/camera/network/civilian_east{ c_tag = "Bar East" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin, /obj/item/pen/blue{ pixel_x = -3; @@ -20943,7 +20943,7 @@ /obj/structure/noticeboard{ default_pixel_y = 27 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aSg" = ( /obj/structure/disposalpipe/segment{ @@ -21166,7 +21166,7 @@ /area/exodus/quartermaster/miningdock) "aSD" = ( /obj/machinery/computer/modular/preset/cardslot/command, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "aSE" = ( /obj/machinery/button/access/interior{ @@ -21295,28 +21295,28 @@ /obj/structure/bed/chair/wood/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aSQ" = ( /obj/structure/cable/green{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aSR" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aSS" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aST" = ( /obj/machinery/newscaster{ pixel_y = 32 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aSU" = ( /obj/structure/cable/green{ @@ -21444,13 +21444,13 @@ /obj/machinery/light/small{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aTi" = ( /obj/machinery/light/small{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aTj" = ( /obj/machinery/door/airlock/external/bolted{ @@ -21466,7 +21466,7 @@ /obj/structure/bed/chair/wood/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aTl" = ( /obj/machinery/conveyor{ @@ -21797,7 +21797,7 @@ /area/exodus/library) "aTX" = ( /obj/item/stool/bar/padded, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aTY" = ( /obj/machinery/door/blast/regular/open{ @@ -21852,7 +21852,7 @@ /obj/machinery/computer/modular/telescreen/preset/generic{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUg" = ( /obj/effect/wallframe_spawn/reinforced, @@ -21909,14 +21909,14 @@ /obj/machinery/light{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, -/turf/floor/wood/walnut, +/obj/structure/table/laminate, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUp" = ( /turf/wall/r_wall/prepainted, @@ -21973,7 +21973,7 @@ dir = 4 }, /obj/item/stool/bar/padded, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUw" = ( /obj/structure/closet/secure_closet/freezer/kitchen, @@ -21986,7 +21986,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUy" = ( /obj/effect/floor_decal/corner/brown/diagonal{ @@ -22029,25 +22029,25 @@ /obj/machinery/light{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUE" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUG" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUH" = ( /obj/machinery/hologram/holopad, @@ -22057,13 +22057,13 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUI" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUJ" = ( /obj/effect/floor_decal/corner/brown/diagonal{ @@ -22172,7 +22172,7 @@ pixel_x = -25; dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aUV" = ( /obj/effect/floor_decal/industrial/hatch/yellow, @@ -22229,11 +22229,11 @@ /obj/structure/bookcase{ name = "bookcase (Fiction)" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aVd" = ( /obj/structure/bookcase/skill_books/random, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aVf" = ( /obj/machinery/embedded_controller/radio/airlock/docking_port{ @@ -22271,7 +22271,7 @@ /turf/floor/plating, /area/exodus/maintenance/bar) "aVi" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/carpet, /area/exodus/chapel/main) "aVj" = ( @@ -22403,7 +22403,7 @@ dir = 8; pixel_x = 22 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aVy" = ( /obj/abstract/landmark{ @@ -22562,7 +22562,7 @@ /area/exodus/bridge) "aVS" = ( /obj/structure/bed/chair/wood/walnut, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aVT" = ( /obj/structure/closet/emcloset, @@ -22588,12 +22588,12 @@ icon_state = "1-4" }, /obj/structure/bed/chair/wood/walnut, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aVX" = ( /obj/structure/bed/chair/wood/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aVY" = ( /obj/structure/cable/green{ @@ -22627,7 +22627,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/bed/chair/wood/walnut, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aWb" = ( /obj/machinery/chem_master/condimaster{ @@ -22654,19 +22654,19 @@ icon_state = "4-8" }, /obj/item/stool/bar/padded, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aWe" = ( /obj/item/chems/condiment/small/peppermill{ pixel_x = 2; pixel_y = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/condiment/small/saltshaker{ pixel_x = -2; pixel_y = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aWf" = ( /obj/structure/cable/green{ @@ -22702,8 +22702,8 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/obj/structure/table/woodentable, -/turf/floor/wood/walnut, +/obj/structure/table/laminate, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aWi" = ( /obj/structure/cable/green{ @@ -22741,13 +22741,13 @@ /area/exodus/crew_quarters/kitchen) "aWl" = ( /obj/structure/bed/chair/comfy/black, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aWm" = ( /obj/structure/cable/green{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aWn" = ( /obj/structure/cable/green{ @@ -22835,14 +22835,14 @@ c_tag = "Library Central"; dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aWz" = ( /obj/abstract/landmark/start{ name = "Librarian" }, /obj/structure/bed/chair/office/dark, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aWA" = ( /obj/effect/floor_decal/industrial/warning{ @@ -22893,17 +22893,17 @@ /obj/machinery/newscaster{ pixel_y = 32 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aWH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/light/small{ dir = 4 }, /obj/machinery/light_switch{ pixel_y = 28 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aWI" = ( /obj/machinery/door/firedoor, @@ -23268,10 +23268,10 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/mixing) "aXz" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/utensil/fork, /obj/item/utensil/fork, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aXA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -23281,15 +23281,15 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "aXB" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/board, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aXD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/checkers/chess/red, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aXE" = ( /obj/structure/cable/green{ @@ -23310,9 +23310,9 @@ /area/exodus/crew_quarters/kitchen) "aXF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aXG" = ( /obj/machinery/status_display{ @@ -23321,7 +23321,7 @@ /obj/machinery/camera/network/command{ c_tag = "Bridge Conference Room" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "aXH" = ( /obj/effect/floor_decal/corner/brown/diagonal{ @@ -23399,7 +23399,7 @@ "aXP" = ( /obj/structure/table/gamblingtable, /obj/item/box/checkers, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/maintenance/dormitory) "aXQ" = ( /obj/effect/floor_decal/corner/blue/three_quarters{ @@ -23562,7 +23562,7 @@ /obj/structure/bookcase{ name = "bookcase (Adult)" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aYk" = ( /obj/effect/floor_decal/industrial/warning{ @@ -23571,12 +23571,12 @@ /turf/floor/plating, /area/exodus/hallway/secondary/entry/port) "aYl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aYm" = ( /obj/machinery/door/airlock/external/bolted{ @@ -23631,7 +23631,7 @@ /obj/structure/bed/chair/comfy/black{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aYu" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -23686,7 +23686,7 @@ c_tag = "Bar West"; dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aYz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -23755,9 +23755,9 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/locker) "aYF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/checkers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aYG" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, @@ -24126,8 +24126,8 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "aZm" = ( -/obj/structure/table/woodentable, -/turf/floor/wood/walnut, +/obj/structure/table/laminate, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZn" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -24153,10 +24153,10 @@ /area/exodus/crew_quarters/kitchen) "aZp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/disposalpipe/segment, /obj/item/camera, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZq" = ( /obj/effect/wallframe_spawn/reinforced, @@ -24173,7 +24173,7 @@ /obj/structure/bed/chair/wood/walnut{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZs" = ( /obj/machinery/alarm{ @@ -24248,7 +24248,7 @@ /obj/structure/bed/chair/wood/walnut{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZB" = ( /obj/machinery/power/apc{ @@ -24269,9 +24269,9 @@ /turf/floor/carpet, /area/exodus/library) "aZD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aZE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -24281,16 +24281,16 @@ /obj/structure/bed/chair/wood/walnut{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/camera_film, /obj/item/camera_film, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aZG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pen/red{ pixel_x = 2; pixel_y = 6 @@ -24299,19 +24299,19 @@ pixel_x = 5; pixel_y = 5 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aZH" = ( -/obj/structure/table/woodentable, -/turf/floor/wood/walnut, +/obj/structure/table/laminate, +/turf/floor/laminate/walnut, /area/exodus/library) "aZI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "aZK" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -24321,7 +24321,7 @@ /obj/structure/bed/chair/wood/walnut{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZL" = ( /obj/structure/bed/chair{ @@ -24959,7 +24959,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/locker) "bbd" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/condiment/small/peppermill{ pixel_x = 2; pixel_y = 6 @@ -24968,7 +24968,7 @@ pixel_x = -2; pixel_y = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bbe" = ( /obj/structure/cable/green{ @@ -24988,14 +24988,14 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/starboard) "bbg" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/utensil/fork, /obj/item/utensil/fork, /obj/item/utensil/fork, /obj/item/utensil/fork, /obj/item/utensil/fork, /obj/item/utensil/fork, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bbh" = ( /obj/structure/table/marble, @@ -25018,7 +25018,7 @@ dir = 1 }, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bbk" = ( /obj/structure/cable/green{ @@ -25060,9 +25060,9 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bbo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flame/candle, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bbp" = ( /obj/machinery/atmospherics/unary/vent_pump/on, @@ -25097,7 +25097,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "bbt" = ( /obj/item/radio/intercom{ @@ -25193,7 +25193,7 @@ /obj/structure/bed/chair/comfy/black{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "bbF" = ( /obj/structure/table, @@ -25514,7 +25514,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "bcn" = ( /obj/machinery/computer/guestpass{ @@ -25686,7 +25686,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bcH" = ( /obj/structure/disposalpipe/segment, @@ -25745,14 +25745,14 @@ "bcM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bcN" = ( /obj/machinery/light, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bcO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -25760,7 +25760,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bcP" = ( /obj/structure/flora/bush/brflowers, @@ -26371,13 +26371,13 @@ /area/exodus/chapel/main) "bef" = ( /obj/machinery/computer/arcade, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "beg" = ( /obj/machinery/vending/cola{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "beh" = ( /obj/effect/floor_decal/corner/yellow{ @@ -26398,7 +26398,7 @@ /obj/structure/bed/chair/wood/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bej" = ( /obj/machinery/firealarm{ @@ -26406,7 +26406,7 @@ pixel_y = -24 }, /obj/machinery/light, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bek" = ( /obj/effect/floor_decal/chapel, @@ -26518,7 +26518,7 @@ /obj/machinery/vending/coffee{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "bez" = ( /obj/item/box, @@ -26537,9 +26537,9 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "beA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pen, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "beB" = ( /obj/machinery/atmospherics/unary/tank/air{ @@ -26558,7 +26558,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/captain) "beD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -26567,7 +26567,7 @@ dir = 1; pixel_y = -22 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "beE" = ( /obj/structure/bed/chair/comfy/brown{ @@ -26760,7 +26760,7 @@ /obj/structure/flora/pottedplant{ icon_state = "plant-22" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bfa" = ( /obj/structure/cable/green{ @@ -26902,7 +26902,7 @@ /area/exodus/quartermaster/office) "bfn" = ( /obj/machinery/photocopier, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bfo" = ( /obj/machinery/door/airlock/command{ @@ -26920,7 +26920,7 @@ /obj/machinery/newscaster{ pixel_y = 32 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bfq" = ( /obj/machinery/door/firedoor, @@ -26940,7 +26940,7 @@ /obj/structure/cable/green{ icon_state = "0-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bfs" = ( /obj/machinery/light_switch{ @@ -26949,7 +26949,7 @@ /obj/structure/cable/green{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bft" = ( /obj/structure/disposalpipe/segment{ @@ -26964,14 +26964,14 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bfu" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bfv" = ( /turf/floor/bluegrid, @@ -27002,7 +27002,7 @@ c_tag = "Library South"; dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "bfz" = ( /obj/machinery/power/terminal{ @@ -27034,7 +27034,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bfD" = ( /obj/structure/disposalpipe/segment{ @@ -27046,13 +27046,13 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bfE" = ( /obj/machinery/light_switch{ pixel_y = 28 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bfF" = ( /obj/machinery/ai_status_display{ @@ -27062,9 +27062,9 @@ /area/exodus/crew_quarters/captain) "bfG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/checkers/chess, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bfH" = ( /obj/machinery/status_display{ @@ -27081,11 +27081,11 @@ /obj/structure/cable/green{ icon_state = "0-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bfJ" = ( /obj/machinery/computer/arcade, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bfK" = ( /obj/item/radio/intercom{ @@ -27422,7 +27422,7 @@ dir = 8 }, /obj/machinery/papershredder, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bgw" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -27451,7 +27451,7 @@ dir = 8 }, /obj/structure/flora/pottedplant, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bgA" = ( /obj/machinery/navbeacon/CHW, @@ -27551,7 +27551,7 @@ name = "Security Shutters"; pixel_y = 24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bgN" = ( /obj/structure/disposalpipe/segment{ @@ -27570,7 +27570,7 @@ /turf/floor/plating, /area/exodus/maintenance/locker) "bgO" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bgP" = ( /turf/floor/carpet, @@ -27594,7 +27594,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bgT" = ( /obj/machinery/door/firedoor, @@ -27679,13 +27679,13 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bhc" = ( /obj/structure/cable/green{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bhd" = ( /obj/structure/bed/chair/comfy/black{ @@ -27716,13 +27716,13 @@ /obj/structure/cable/green{ icon_state = "1-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bhh" = ( /obj/structure/flora/pottedplant{ icon_state = "plant-10" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bhi" = ( /obj/machinery/firealarm{ @@ -28102,7 +28102,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "bhU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/donut, /obj/structure/cable/green{ icon_state = "4-8" @@ -28112,7 +28112,7 @@ "bhV" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/papershredder, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bhW" = ( /obj/structure/cable{ @@ -28296,20 +28296,20 @@ /obj/item/eftpos{ eftpos_name = "Bridge EFTPOS scanner" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable/green{ icon_state = "4-8" }, /obj/machinery/light{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bip" = ( /obj/structure/cable/green{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "biq" = ( /obj/machinery/light{ @@ -28319,14 +28319,14 @@ /area/exodus/quartermaster/storage) "bir" = ( /obj/item/folder/red, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable/green{ icon_state = "4-8" }, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bis" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -28352,12 +28352,12 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "biv" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/faxmachine/mapped, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "biw" = ( /obj/structure/window/reinforced{ @@ -28392,15 +28392,15 @@ /area/exodus/bridge) "biA" = ( /obj/machinery/vending/coffee, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "biB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "biC" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "biD" = ( /obj/structure/window/reinforced, @@ -28411,7 +28411,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "biE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random_multi/single_item/captains_spare_id, /turf/floor/carpet, /area/exodus/crew_quarters/captain) @@ -28431,7 +28431,7 @@ /obj/structure/cable/green{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "biH" = ( /obj/structure/cable{ @@ -29037,12 +29037,12 @@ pixel_y = 7 }, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bjJ" = ( /obj/item/folder/blue, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bjK" = ( @@ -29062,14 +29062,14 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bjM" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/machinery/light{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bjN" = ( /obj/structure/extinguisher_cabinet{ @@ -29140,7 +29140,7 @@ /area/exodus/hallway/primary/starboard) "bjT" = ( /obj/machinery/vending/cigarette, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bjU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -29149,7 +29149,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bjV" = ( /turf/wall/prepainted, @@ -29173,7 +29173,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bjY" = ( /obj/abstract/landmark{ @@ -29524,14 +29524,14 @@ /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bkH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/recharger{ pixel_y = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bkI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -29548,7 +29548,7 @@ dir = 4; pixel_x = -22 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bkJ" = ( /obj/structure/disposalpipe/segment, @@ -29563,7 +29563,7 @@ pixel_x = 29; dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bkK" = ( /obj/machinery/door/window{ @@ -29581,7 +29581,7 @@ dir = 4; pixel_x = -22 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bkM" = ( /obj/machinery/door/window{ @@ -29597,7 +29597,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "bkN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/recharger{ pixel_y = 4 }, @@ -29614,7 +29614,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bkO" = ( /obj/machinery/teleport/station, @@ -29869,7 +29869,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "blt" = ( /obj/item/radio/intercom{ @@ -29927,7 +29927,7 @@ /area/exodus/maintenance/cargo) "bly" = ( /obj/machinery/vending/coffee, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "blz" = ( /obj/structure/window/reinforced{ @@ -29989,7 +29989,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/primary/central_one) "blG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/folder/blue, /obj/item/stamp/captain{ pixel_x = -4; @@ -30001,7 +30001,7 @@ pixel_x = 4; pixel_y = 3 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "blH" = ( /obj/structure/table{ @@ -30014,19 +30014,19 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "blI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "blJ" = ( /obj/machinery/hologram/holopad, /obj/structure/cable/green{ icon_state = "1-2" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "blK" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pinpointer, /obj/item/disk/nuclear, /obj/item/secure_storage/safe{ @@ -30035,7 +30035,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "blL" = ( /obj/machinery/firealarm{ @@ -30492,9 +30492,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/donut, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/bridge/meeting_room) "bmF" = ( /obj/machinery/disposal, @@ -30589,7 +30589,7 @@ dir = 8 }, /obj/structure/filing_cabinet, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bmP" = ( /turf/floor/tiled/dark, @@ -30603,17 +30603,17 @@ /obj/machinery/computer/modular/preset/civilian{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "bmR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/eftpos{ eftpos_name = "Captain EFTPOS scanner" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bmS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/whip/chainofcommand, /obj/machinery/alarm{ dir = 8; @@ -30622,7 +30622,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/random_multi/single_item/captains_spare_id, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bmT" = ( /obj/structure/disposalpipe/segment, @@ -30747,7 +30747,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bng" = ( /obj/item/book/manual/robotics_cyborgs{ @@ -30773,7 +30773,7 @@ /obj/machinery/fabricator/imprinter{ id_tag = "science" }, -/obj/item/chems/glass/beaker/sulphuric, +/obj/item/chems/glass/beaker/sulfuric, /obj/structure/reagent_dispensers/acid{ density = 0; pixel_y = 32 @@ -30936,7 +30936,7 @@ pixel_x = 15; pixel_y = 39 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bnx" = ( /obj/machinery/firealarm{ @@ -31356,7 +31356,7 @@ /obj/abstract/landmark/start{ name = "Captain" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bov" = ( /obj/structure/morgue{ @@ -31415,7 +31415,7 @@ "boC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "boD" = ( /obj/machinery/power/apc{ @@ -31444,10 +31444,10 @@ /area/exodus/research/chargebay) "boF" = ( /obj/machinery/faxmachine/mapped, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "boH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -31969,11 +31969,11 @@ /turf/floor/plating, /area/exodus/storage/emergency) "bpG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random_multi/single_item/captains_spare_id{ weight = 10 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bpH" = ( /obj/structure/table, @@ -32064,7 +32064,7 @@ pixel_x = 29; dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bpO" = ( /obj/structure/disposaloutlet, @@ -32395,7 +32395,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/research/robotics) "bqw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /turf/floor/carpet, /area/exodus/crew_quarters/captain) @@ -32435,13 +32435,13 @@ dir = 8 }, /obj/random_multi/single_item/captains_spare_id, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bqA" = ( /obj/machinery/keycard_auth{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bqB" = ( /obj/structure/cable{ @@ -32457,13 +32457,13 @@ /area/exodus/maintenance/research_shuttle) "bqC" = ( /obj/machinery/light, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bqD" = ( /obj/structure/cable/green{ icon_state = "1-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bqE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -32592,7 +32592,7 @@ /obj/machinery/fabricator/imprinter{ id_tag = "science" }, -/obj/item/chems/glass/beaker/sulphuric, +/obj/item/chems/glass/beaker/sulfuric, /turf/floor/tiled/dark, /area/exodus/research/lab) "bqQ" = ( @@ -32881,7 +32881,7 @@ icon_state = "right"; name = "Captain's Desk Door" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "brw" = ( /obj/machinery/conveyor{ @@ -33876,14 +33876,14 @@ dir = 1; pixel_y = -30 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/deck/cards{ pixel_y = 4 }, /obj/machinery/computer/modular/telescreen/preset/generic{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "btB" = ( /obj/machinery/button/blast_door{ @@ -35586,7 +35586,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay2) "bwU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/matches, /obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/chems/drinks/flask{ @@ -35753,7 +35753,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay2) "bxn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/camera, /obj/item/photo_album{ pixel_y = -10 @@ -39993,7 +39993,7 @@ /area/exodus/maintenance/cargo) "bFM" = ( /obj/machinery/network/relay, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "bFN" = ( /obj/structure/disposalpipe/sortjunction/untagged{ @@ -41092,7 +41092,7 @@ /obj/machinery/computer/modular/preset/cardslot/command{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bHK" = ( /obj/structure/extinguisher_cabinet{ @@ -47707,7 +47707,7 @@ /area/exodus/medical/patient_wing) "bUX" = ( /obj/machinery/vending/cigarette, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bUY" = ( /obj/structure/bed/chair{ @@ -47751,9 +47751,9 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/medical/patient_wing) "bVc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/dice, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bVd" = ( /obj/machinery/door/firedoor, @@ -47785,9 +47785,9 @@ /turf/floor/tiled/white, /area/exodus/research/misc_lab) "bVf" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bVg" = ( /obj/structure/table/reinforced, @@ -48001,7 +48001,7 @@ /turf/floor/plating, /area/exodus/engineering/engine_waste) "bVC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/book/manual/engineering_guide{ pixel_x = 3; pixel_y = 2 @@ -48010,20 +48010,20 @@ /obj/machinery/light{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bVD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/book/manual/engineering_construction, /obj/item/book/manual/evaguide{ pixel_x = -2; pixel_y = 7 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bVE" = ( /obj/structure/bookcase/manuals/engineering, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bVF" = ( /obj/machinery/hologram/holopad, @@ -48571,7 +48571,7 @@ /turf/floor/tiled/white, /area/exodus/research) "bWO" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin, /obj/item/clipboard, /obj/item/folder/blue{ @@ -48603,7 +48603,7 @@ pixel_x = 29; dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bWS" = ( /obj/machinery/air_sensor{ @@ -48705,7 +48705,7 @@ /obj/machinery/computer/modular/telescreen/preset/generic{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bXd" = ( /obj/machinery/computer/modular/preset/engineering, @@ -49461,7 +49461,7 @@ /turf/floor/reinforced, /area/exodus/research/mixing) "bYx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/book/manual/supermatter_engine{ pixel_x = -3 }, @@ -49660,7 +49660,7 @@ /turf/floor/carpet, /area/exodus/engineering/break_room) "bYR" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -49683,7 +49683,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bYU" = ( /obj/structure/cable/green{ @@ -50301,12 +50301,12 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_smes) "caj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/folder/yellow, /turf/floor/carpet, /area/exodus/engineering/break_room) "cak" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/food/junk/chips, /turf/floor/carpet, /area/exodus/engineering/break_room) @@ -50317,7 +50317,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cam" = ( /obj/structure/disposalpipe/segment{ @@ -50519,23 +50519,23 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/medical/psych) "caG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/medical/psych) "caH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/computer/modular/preset/medical, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/medical/psych) "caI" = ( /turf/wall/prepainted, @@ -51070,7 +51070,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/medical/psych) "cbQ" = ( /obj/machinery/alarm{ @@ -51972,7 +51972,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cdz" = ( /obj/machinery/firealarm{ @@ -52059,7 +52059,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cdG" = ( /obj/structure/cable{ @@ -52170,7 +52170,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cdR" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -52256,7 +52256,7 @@ c_tag = "Engineering Break Room"; dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cec" = ( /obj/effect/wallframe_spawn/reinforced, @@ -52283,7 +52283,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cef" = ( /obj/machinery/atmospherics/pipe/simple/visible/black{ @@ -52324,8 +52324,8 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_eva) "cei" = ( -/obj/structure/table/woodentable, -/turf/floor/wood, +/obj/structure/table/laminate, +/turf/floor/laminate, /area/exodus/medical/psych) "cej" = ( /turf/wall/prepainted, @@ -52340,7 +52340,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cel" = ( /obj/structure/bed/chair/office/dark{ @@ -52365,7 +52365,7 @@ pixel_x = -34; pixel_y = 7 }, -/turf/floor/wood, +/turf/floor/laminate, /area/exodus/medical/psych) "cem" = ( /obj/structure/cable/green{ @@ -52373,7 +52373,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cen" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -53092,7 +53092,7 @@ /area/exodus/engineering/foyer) "cfS" = ( /obj/structure/closet/secure_closet/personal, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "cfT" = ( /obj/machinery/computer/modular/preset/cardslot/command, @@ -53347,7 +53347,7 @@ /turf/floor/tiled/white, /area/exodus/medical/virology) "cgu" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/recharger, /turf/floor/carpet, /area/exodus/hallway/secondary/entry/starboard) @@ -56626,7 +56626,7 @@ /turf/wall/prepainted, /area/exodus/maintenance/arrivals) "cnn" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/taperecorder, /obj/item/camera, /obj/item/eftpos{ @@ -63723,6 +63723,10 @@ }, /turf/floor/tiled/steel_grid, /area/ship/exodus_pod_research) +"eYg" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "eZK" = ( /obj/effect/floor_decal/corner/purple, /obj/machinery/light, @@ -63861,7 +63865,7 @@ /obj/machinery/conveyor_switch{ id_tag = "cargo_mining_conveyor" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/miningdock) @@ -64067,7 +64071,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai_upload) "hLX" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "hOb" = ( /obj/structure/cable/green{ @@ -64511,7 +64515,7 @@ /obj/machinery/vending/coffee{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "kVV" = ( /obj/structure/cable{ @@ -64791,7 +64795,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/starboard) "nIv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -65121,7 +65125,7 @@ /area/ship/exodus_pod_mining) "qlX" = ( /obj/machinery/hologram/holopad, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "qmC" = ( /obj/effect/floor_decal/corner_steel_grid{ @@ -66034,7 +66038,7 @@ /obj/machinery/hologram/holopad{ holopad_id = "Library Rec Area" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/library) "wqh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -66179,7 +66183,7 @@ /turf/floor/tiled/techfloor/grid, /area/ship/exodus_pod_research) "xpO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/fabricator/industrial, /obj/item/stack/material/ingot/mapped/osmium/ten, /obj/effect/floor_decal/industrial/outline/yellow, @@ -66190,7 +66194,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/miningdock) "xrP" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "xva" = ( /obj/structure/window/reinforced{ @@ -76795,7 +76799,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU @@ -88722,7 +88726,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU @@ -108695,7 +108699,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU @@ -116645,7 +116649,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU diff --git a/maps/exodus/exodus-admin.dmm b/maps/exodus/exodus-admin.dmm index 1816f10ba2e..5d94162873e 100644 --- a/maps/exodus/exodus-admin.dmm +++ b/maps/exodus/exodus-admin.dmm @@ -1403,7 +1403,7 @@ /obj/structure/bed/chair/wood/wings{ dir = 4 }, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aMT" = ( /obj/machinery/hologram/holopad, @@ -1440,50 +1440,50 @@ /turf/unsimulated/floor/steel, /area/centcom/holding) "aMY" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/amanita_pie, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aMZ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/bigbiteburger, /obj/machinery/camera/network/crescent{ c_tag = "Crescent Bar Center" }, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNa" = ( /obj/structure/bed/chair/wood/wings{ dir = 8 }, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNb" = ( -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNc" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNh" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/stew, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNj" = ( /obj/structure/closet/secure_closet/bar, /turf/unsimulated/floor/lino, /area/centcom/holding) "aNk" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/book/manual/barman_recipes, @@ -1491,14 +1491,14 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "aNl" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/machinery/chemical_dispenser/bar_alc/full, /turf/unsimulated/floor/lino, /area/centcom/holding) "aNm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/machinery/chemical_dispenser/bar_soft/full, @@ -1536,32 +1536,32 @@ /turf/floor/tiled/monotile, /area/shuttle/escape_shuttle) "aNB" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/boiledrice, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNC" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/beet, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNI" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/stuffing, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/soylenviridians, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aNK" = ( /obj/machinery/door/airlock/glass{ @@ -1667,7 +1667,7 @@ /area/shuttle/escape_shuttle) "aPa" = ( /obj/machinery/hologram/holopad, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aPH" = ( /obj/machinery/camera/network/crescent{ @@ -1713,34 +1713,34 @@ /turf/floor/tiled/techfloor/grid, /area/shuttle/escape_shuttle) "aPR" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/blood, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aPS" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/skewer/tofu, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aRl" = ( /turf/unsimulated/wall, /area/centcom/holding) "aRm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/poppypretzel, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "aZb" = ( /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/clothing/pants/slacks/outfit, @@ -1754,13 +1754,13 @@ /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /turf/unsimulated/floor/lino, /area/centcom/holding) "bgJ" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /turf/unsimulated/floor/lino, @@ -1831,11 +1831,11 @@ /turf/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "bvb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/spesslaw, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "bwE" = ( /obj/effect/floor_decal/industrial/warning, @@ -1845,18 +1845,18 @@ /turf/floor/tiled, /area/shuttle/escape_shuttle) "byb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/candiedapple, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "bzm" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/chems/glass/bowl/mapped/mushroom, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "bDh" = ( /obj/structure/table, @@ -1864,15 +1864,15 @@ /turf/unsimulated/floor/lino, /area/tdome/tdomeadmin) "bMb" = ( -/obj/structure/table/woodentable{ +/obj/structure/table/laminate{ dir = 5 }, /obj/item/food/meatsteak, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "cnP" = ( /obj/item/stool/padded, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/centcom/holding) "cxx" = ( /obj/effect/floor_decal/industrial/warning{ @@ -2422,7 +2422,8 @@ /turf/unsimulated/floor/vault, /area/tdome) "lSj" = ( -/obj/effect/forcefield{ +/obj/effect{ + density = 1; desc = "You can't get in. Heh."; name = "Blocker" }, @@ -2434,7 +2435,8 @@ /turf/unsimulated/floor/dark, /area/tdome) "mgi" = ( -/obj/effect/forcefield{ +/obj/effect{ + density = 1; desc = "You can't get in. Heh."; name = "Blocker" }, @@ -2799,7 +2801,8 @@ /turf/floor/tiled, /area/shuttle/escape_shuttle) "xSD" = ( -/obj/effect/forcefield{ +/obj/effect{ + density = 1; desc = "You can't get in. Heh."; name = "Blocker" }, diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index c07b1b1d114..d6c189490f2 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,22 +1,15 @@ #if !defined(USING_MAP_DATUM) - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/meteor/_meteor.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../../mods/content/mundane.dm" + #include "../../mods/content/baychems/_baychems.dme" + #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/government/_government.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/polaris/_polaris.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/content/xenobiology/_xenobiology.dme" @@ -27,6 +20,19 @@ // Must come after borers for compatibility. #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/supermatter/_supermatter.dme" + #include "../../mods/content/tabloids/_tabloids.dme" + + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/mixed.dm" + #include "../../mods/species/skrell/_skrell.dme" #include "../../mods/species/tajaran/_tajaran.dme" #include "../../mods/species/unathi/_unathi.dme" @@ -47,34 +53,16 @@ #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 "jobs/_goals.dm" - #include "jobs/captain.dm" - #include "jobs/civilian.dm" - #include "jobs/engineering.dm" - #include "jobs/medical.dm" - #include "jobs/science.dm" - #include "jobs/security.dm" - #include "jobs/synthetics.dm" - - #include "outfits/_pda.dm" - #include "outfits/cargo.dm" - #include "outfits/civilian.dm" - #include "outfits/command.dm" - #include "outfits/engineering.dm" - #include "outfits/medical.dm" - #include "outfits/science.dm" - #include "outfits/security.dm" + #include "exodus_goals.dm" #include "exodus_announcements.dm" #include "exodus_antagonism.dm" #include "exodus_cameras.dm" #include "exodus_areas.dm" #include "exodus_elevator.dm" - #include "exodus_departments.dm" #include "exodus_jobs.dm" #include "exodus_loadout.dm" #include "exodus_overmap.dm" diff --git a/maps/exodus/exodus_antagonism.dm b/maps/exodus/exodus_antagonism.dm index 92660ef3608..e09d2ddc900 100644 --- a/maps/exodus/exodus_antagonism.dm +++ b/maps/exodus/exodus_antagonism.dm @@ -1,25 +1,16 @@ /decl/special_role/traitor/Initialize() . = ..() LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/captain, /datum/job/lawyer, /datum/job/hos) - -/decl/special_role/godcultist/Initialize() - . = ..() - LAZYINITLIST(restricted_jobs) - restricted_jobs |= list(/datum/job/lawyer, /datum/job/captain, /datum/job/hos) - LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective) - LAZYINITLIST(blacklisted_jobs) - blacklisted_jobs |= /datum/job/chaplain + protected_jobs |= list(/datum/job/standard/officer, /datum/job/standard/warden, /datum/job/standard/detective, /datum/job/standard/captain, /datum/job/standard/lawyer, /datum/job/standard/hos) /decl/special_role/cultist/Initialize() . = ..() LAZYINITLIST(restricted_jobs) - restricted_jobs |= list(/datum/job/lawyer, /datum/job/captain, /datum/job/hos) + restricted_jobs |= list(/datum/job/standard/lawyer, /datum/job/standard/captain, /datum/job/standard/hos) LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective) + protected_jobs |= list(/datum/job/standard/officer, /datum/job/standard/warden, /datum/job/standard/detective) LAZYINITLIST(blacklisted_jobs) - blacklisted_jobs |= list(/datum/job/chaplain, /datum/job/counselor) + blacklisted_jobs |= list(/datum/job/standard/chaplain, /datum/job/standard/counselor) /decl/special_role/loyalist command_department_id = /decl/department/command diff --git a/maps/exodus/exodus_define.dm b/maps/exodus/exodus_define.dm index 0cdfc436956..03a9f450fab 100644 --- a/maps/exodus/exodus_define.dm +++ b/maps/exodus/exodus_define.dm @@ -12,8 +12,6 @@ company_short = "NT" system_name = "Nyx" - default_law_type = /datum/ai_laws/nanotrasen - overmap_ids = list(OVERMAP_ID_SPACE) num_exoplanets = 3 away_site_budget = 3 diff --git a/maps/exodus/exodus_departments.dm b/maps/exodus/exodus_departments.dm deleted file mode 100644 index c3d9ae44720..00000000000 --- a/maps/exodus/exodus_departments.dm +++ /dev/null @@ -1,90 +0,0 @@ -/decl/department/engineering - name = "Engineering" - colour = "#ffa500" - display_priority = 4 - display_color = "#fff5cc" - -/obj/item/robot_module/engineering - associated_department = /decl/department/engineering - -/obj/machinery/network/pager/engineering - department = /decl/department/engineering - -/decl/department/security - name = "Security" - colour = "#dd0000" - display_priority = 3 - display_color = "#ffddf0" - -/obj/item/robot_module/security - associated_department = /decl/department/security - -/obj/machinery/network/pager/security - department = /decl/department/security - -/decl/department/medical - name = "Medical" - goals = list(/datum/goal/department/medical_fatalities) - colour = "#008000" - display_priority = 2 - display_color = "#ffeef0" - -/obj/item/robot_module/medical - associated_department = /decl/department/medical - -/obj/machinery/network/pager/medical - department = /decl/department/medical - -/decl/department/science - name = "Science" - goals = list(/datum/goal/department/extract_slime_cores) - colour = "#a65ba6" - display_color = "#e79fff" - -/obj/item/robot_module/research - associated_department = /decl/department/science - -/obj/machinery/network/pager/science - department = /decl/department/science - -/decl/department/civilian - name = "Civilian" - display_priority = 1 - display_color = "#dddddd" - -/decl/department/command - name = "Command" - colour = "#800080" - display_priority = 5 - display_color = "#ccccff" - -/obj/machinery/network/pager - department = /decl/department/command - -/decl/department/miscellaneous - name = "Misc" - display_priority = -1 - display_color = "#ccffcc" - -/decl/department/service - name = "Service" - colour = "#88b764" - display_color = "#d0f0c0" - -/decl/department/supply - name = "Supply" - colour = "#bb9040" - display_color = "#f0e68c" - -/obj/machinery/network/pager/cargo - department = /decl/department/supply - -/decl/department/support - name = "Support" - colour = "#800080" - display_color = "#87ceeb" - -/decl/department/exploration - name = "Exploration" - colour = "#68099e" - display_color = "#b784a7" diff --git a/maps/exodus/jobs/_goals.dm b/maps/exodus/exodus_goals.dm similarity index 87% rename from maps/exodus/jobs/_goals.dm rename to maps/exodus/exodus_goals.dm index 72c324b5c1d..8275bc4173b 100644 --- a/maps/exodus/jobs/_goals.dm +++ b/maps/exodus/exodus_goals.dm @@ -29,12 +29,12 @@ var/global/list/exodus_paperwork_end_areas = list() /datum/goal/department/paperwork/exodus paperwork_types = list(/obj/item/paperwork/exodus) signatory_job_list = list( - /datum/job/captain, - /datum/job/hop, - /datum/job/cmo, - /datum/job/chief_engineer, - /datum/job/rd, - /datum/job/hos + /datum/job/standard/captain, + /datum/job/standard/hop, + /datum/job/standard/cmo, + /datum/job/standard/chief_engineer, + /datum/job/standard/rd, + /datum/job/standard/hos ) /datum/goal/department/paperwork/exodus/get_paper_spawn_turfs() diff --git a/maps/exodus/exodus_jobs.dm b/maps/exodus/exodus_jobs.dm index 68f1d5b8e67..1e09ef50b52 100644 --- a/maps/exodus/exodus_jobs.dm +++ b/maps/exodus/exodus_jobs.dm @@ -7,40 +7,40 @@ spawn_decl = /decl/spawnpoint/gateway /datum/map/exodus - default_job_type = /datum/job/assistant + default_job_type = /datum/job/standard/assistant default_department_type = /decl/department/civilian - id_hud_icons = 'maps/exodus/hud.dmi' allowed_jobs = list( - /datum/job/captain, - /datum/job/hop, - /datum/job/chaplain, - /datum/job/bartender, - /datum/job/chef, - /datum/job/hydro, - /datum/job/qm, - /datum/job/cargo_tech, - /datum/job/mining, - /datum/job/janitor, - /datum/job/librarian, - /datum/job/lawyer, - /datum/job/chief_engineer, - /datum/job/engineer, - /datum/job/cmo, - /datum/job/doctor, - /datum/job/chemist, - /datum/job/counselor, - /datum/job/rd, - /datum/job/scientist, - /datum/job/roboticist, - /datum/job/hos, - /datum/job/detective, - /datum/job/warden, - /datum/job/officer, - /datum/job/robot, - /datum/job/computer + /datum/job/standard/captain, + /datum/job/standard/hop, + /datum/job/standard/chaplain, + /datum/job/standard/bartender, + /datum/job/standard/chef, + /datum/job/standard/hydro, + /datum/job/standard/qm, + /datum/job/standard/cargo_tech, + /datum/job/standard/mining, + /datum/job/standard/janitor, + /datum/job/standard/librarian, + /datum/job/standard/lawyer, + /datum/job/standard/chief_engineer, + /datum/job/standard/engineer, + /datum/job/standard/cmo, + /datum/job/standard/doctor, + /datum/job/standard/chemist, + /datum/job/standard/counselor, + /datum/job/standard/rd, + /datum/job/standard/scientist, + /datum/job/standard/roboticist, + /datum/job/standard/hos, + /datum/job/standard/detective, + /datum/job/standard/warden, + /datum/job/standard/officer, + /datum/job/standard/robot, + /datum/job/standard/computer ) -#define HUMAN_ONLY_JOBS /datum/job/captain, /datum/job/hop, /datum/job/hos +#define HUMAN_ONLY_JOBS /datum/job/standard/captain, /datum/job/standard/hop, /datum/job/standard/hos + species_to_job_blacklist = list( /decl/species/unathi = list( HUMAN_ONLY_JOBS diff --git a/maps/exodus/exodus_loadout.dm b/maps/exodus/exodus_loadout.dm index 107fa0ae8c9..d5f70fdf957 100644 --- a/maps/exodus/exodus_loadout.dm +++ b/maps/exodus/exodus_loadout.dm @@ -2,7 +2,7 @@ name = "religious insignia" path = /obj/item/clothing/insignia cost = 1 - allowed_roles = list(/datum/job/chaplain) + allowed_roles = list(/datum/job/standard/chaplain) uid = "gear_accessory_insignia" /decl/loadout_option/accessory/insignia/Initialize() diff --git a/maps/exodus/exodus_overrides.dm b/maps/exodus/exodus_overrides.dm index 947cbd184c1..c2babeabe95 100644 --- a/maps/exodus/exodus_overrides.dm +++ b/maps/exodus/exodus_overrides.dm @@ -9,3 +9,6 @@ /decl/background_category/heritage = /decl/background_detail/heritage/hidden/cultist, /decl/background_category/faction = /decl/background_detail/faction/other ) + +/datum/map/exodus + default_law_type = /datum/ai_laws/nanotrasen diff --git a/maps/exodus/hud.dmi b/maps/exodus/hud.dmi deleted file mode 100644 index 952d808b00e..00000000000 Binary files a/maps/exodus/hud.dmi and /dev/null differ diff --git a/maps/ministation/hud.dmi b/maps/ministation/hud.dmi index d4fed05d840..8a3e91cf3a7 100644 Binary files a/maps/ministation/hud.dmi and b/maps/ministation/hud.dmi differ diff --git a/maps/ministation/jobs/civilian.dm b/maps/ministation/jobs/civilian.dm index 432d3455d21..18024cc2379 100644 --- a/maps/ministation/jobs/civilian.dm +++ b/maps/ministation/jobs/civilian.dm @@ -1,26 +1,14 @@ -/datum/job/ministation/assistant +/datum/job/standard/assistant/ministation title = "Recruit" - total_positions = -1 - spawn_positions = -1 supervisors = "absolutely everyone" - economic_power = 1 - access = list() - minimal_access = list() - hud_icon = "hudassistant" alt_titles = list("Technical Recruit","Medical Recruit","Research Recruit","Visitor") outfit_type = /decl/outfit/job/ministation_assistant - department_types = list(/decl/department/civilian) event_categories = list(ASSIGNMENT_GARDENER) -/datum/job/ministation/assistant/get_access() - if(get_config_value(/decl/config/toggle/assistant_maint)) - return list(access_maint_tunnels) - return list() - /decl/outfit/job/ministation_assistant name = "Job - Ministation Assistant" -/datum/job/ministation/bartender +/datum/job/standard/bartender/ministation title = "Bartender" alt_titles = list("Cook","Barista") supervisors = "the Lieutenant and the Captain" @@ -30,16 +18,6 @@ department_types = list(/decl/department/service) selection_color = "#3fbe4a" economic_power = 5 - access = list( - access_hydroponics, - access_bar, - access_kitchen - ) - minimal_access = list( - access_hydroponics, - access_bar, - access_kitchen - ) min_skill = list( SKILL_COOKING = SKILL_ADEPT, SKILL_BOTANY = SKILL_BASIC, @@ -51,14 +29,13 @@ ) skill_points = 30 -/datum/job/ministation/cargo +/datum/job/standard/cargo_tech/ministation title = "Cargo Technician" alt_titles = list("Shaft Miner","Drill Technician","Prospector") supervisors = "the Lieutenant and the Captain" total_positions = 3 spawn_positions = 1 outfit_type = /decl/outfit/job/ministation/cargo - department_types = list(/decl/department/service) selection_color = "#8a7c00" economic_power = 5 access = list( @@ -94,57 +71,24 @@ SKILL_FINANCE = SKILL_MAX ) skill_points = 30 - software_on_spawn = list( - /datum/computer_file/program/supply, - /datum/computer_file/program/deck_management, - /datum/computer_file/program/reports - ) -/datum/job/ministation/janitor - title = "Janitor" - event_categories = list(ASSIGNMENT_JANITOR) - department_types = list(/decl/department/service) +/datum/job/standard/janitor/ministation total_positions = 2 - spawn_positions = 1 supervisors = "the Lieutenant and the Captain" economic_power = 3 selection_color = "#940088" - access = list( - access_janitor, - access_maint_tunnels, - access_engine, - access_research, - access_sec_doors, - access_medical - ) - minimal_access = list( - access_janitor, - access_maint_tunnels, - access_engine, - access_research, - access_sec_doors, - access_medical - ) - alt_titles = list( - "Custodian", - "Sanitation Technician" - ) outfit_type = /decl/outfit/job/ministation/janitor min_skill = list( SKILL_HAULING = SKILL_BASIC ) skill_points = 28 -/datum/job/ministation/librarian - title = "Librarian" - department_types = list(/decl/department/service) - total_positions = 1 +/datum/job/standard/librarian/ministation spawn_positions = 2 supervisors = "the Lieutenant, the Captain, and the smell of old paper" economic_power = 5 selection_color = "#008800" access = list(access_library) - minimal_access = list(access_library) alt_titles = list( "Curator", "Archivist" diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index 7424f7724a5..1a27ff0736d 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -1,7 +1,7 @@ -/datum/job/ministation/captain - title = "Captain" +/datum/job/standard/captain/ministation supervisors = "your profit margin, your conscience, and the watchful eye of the Tradehouse Rep" outfit_type = /decl/outfit/job/ministation/captain + hud_icon = 'maps/ministation/hud.dmi' min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_WEAPONS = SKILL_ADEPT, @@ -13,30 +13,12 @@ SKILL_WEAPONS = SKILL_MAX ) 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() - minimal_player_age = 14 - economic_power = 20 - ideal_character_age = 70 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 -/datum/job/ministation/captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/standard/captain/ministation/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() 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 = "Defect from Tradehouse" set category = "Captain's Powers" @@ -52,113 +34,11 @@ command_announcement.Announce("Congratulations to all members of [capitalize(global.using_map.company_name)] on the new name. Their rebranding has changed the [global.using_map.company_short] market value by [0.01*rand(-10,10)]%.", "Trade Union Name Change") verbs -= /mob/proc/freetradeunion_rename_company -/datum/job/ministation/hop +/datum/job/standard/hop/ministation title = "Lieutenant" - supervisors = "the Captain" outfit_type = /decl/outfit/job/ministation/hop - head_position = 1 - department_types = list( - /decl/department/command, - /decl/department/civilian - ) - total_positions = 1 - spawn_positions = 1 - selection_color = "#2f2f7f" - hud_icon = "hudlieutenant" - req_admin_notify = 1 - minimal_player_age = 14 - economic_power = 10 - ideal_character_age = 50 - guestbanned = 1 - not_random_selectable = 1 - access = list( - access_security, - 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, - access_bridge, - access_all_personal_lockers, - access_maint_tunnels, - access_bar, - access_janitor, - access_construction, - access_morgue, - access_crematorium, - access_kitchen, - access_mining, - access_xenobiology, - access_robotics, - access_engine_equip, - access_cargo, - access_cargo_bot, - access_mailsorting, - 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, - access_cameras - ) - minimal_access = list( - access_security, - 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, - access_bridge, - access_all_personal_lockers, - access_maint_tunnels, - access_bar, - access_janitor, - access_construction, - access_mining, - access_xenobiology, - access_robotics, - access_engine_equip, - access_morgue, - access_crematorium, - access_kitchen, - access_cargo, - access_cargo_bot, - access_mailsorting, - 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, - access_cameras - ) + hud_icon = 'maps/ministation/hud.dmi' + hud_icon_state = "hudlieutenant" min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_WEAPONS = SKILL_BASIC, diff --git a/maps/ministation/jobs/engineering.dm b/maps/ministation/jobs/engineering.dm index b3d12fd6afa..a3cb57fbc0a 100644 --- a/maps/ministation/jobs/engineering.dm +++ b/maps/ministation/jobs/engineering.dm @@ -1,12 +1,9 @@ -/datum/job/ministation/engineer +/datum/job/standard/engineer/ministation title = "Station Engineer" supervisors = "the Head Engineer" total_positions = 2 spawn_positions = 2 outfit_type = /decl/outfit/job/ministation/engineer - department_types = list(/decl/department/engineering) - selection_color = "#5b4d20" - economic_power = 5 minimal_player_age = 3 access = list( access_eva, @@ -32,42 +29,11 @@ access_emergency_storage, access_cameras ) - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) skill_points = 30 alt_titles = list("Atmospheric Technician", "Electrician", "Maintenance Technician") - event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/ministation/engineer/head +/datum/job/standard/chief_engineer/ministation 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, @@ -116,24 +82,6 @@ access_ai_upload, access_cameras ) - minimal_player_age = 14 - supervisors = "the Captain" outfit_type = /decl/outfit/job/ministation/chief_engineer - 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 00c298a4c01..1dd568c8176 100644 --- a/maps/ministation/jobs/medical.dm +++ b/maps/ministation/jobs/medical.dm @@ -1,7 +1,5 @@ -/datum/job/ministation/doctor +/datum/job/standard/doctor/ministation title = "Medical Doctor" - department_types = list(/decl/department/medical) - head_position = 0 supervisors = "the Head Doctor" total_positions = 2 spawn_positions = 2 @@ -18,8 +16,6 @@ SKILL_ANATOMY = SKILL_MAX, SKILL_CHEMISTRY = SKILL_MAX ) - selection_color = "#013d3b" - economic_power = 7 access = list( access_medical, access_medical_equip, @@ -38,29 +34,13 @@ access_cameras ) outfit_type = /decl/outfit/job/ministation/doctor - minimal_player_age = 3 - event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/ministation/doctor/head +/datum/job/standard/cmo/ministation 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/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, @@ -113,6 +93,3 @@ access_external_airlocks, access_cameras ) - 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 f9bcb575468..7b8e61e4591 100644 --- a/maps/ministation/jobs/science.dm +++ b/maps/ministation/jobs/science.dm @@ -1,49 +1,14 @@ -/datum/job/ministation/scientist +/datum/job/standard/scientist/ministation 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/outfit/job/ministation/scientist - hud_icon = "hudscientist" - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = 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 = 34 - access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - minimal_access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - selection_color = "#633d63" - economic_power = 7 - event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/ministation/scientist/head +/datum/job/standard/rd/ministation title = "Research Director" - supervisors = "the Captain" - spawn_positions = 1 - total_positions = 1 alt_titles = list("Head Researcher", "Chief Researcher") outfit_type = /decl/outfit/job/ministation/scientist/head min_skill = list( @@ -61,15 +26,6 @@ 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, @@ -124,10 +80,3 @@ access_network, access_cameras ) - 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 ac68182cff2..242c665e7f3 100644 --- a/maps/ministation/jobs/security.dm +++ b/maps/ministation/jobs/security.dm @@ -1,14 +1,10 @@ -/datum/job/ministation/security +/datum/job/standard/officer/ministation title = "Security Officer" alt_titles = list("Warden") - supervisors = "the Head of Security" spawn_positions = 1 total_positions = 2 outfit_type = /decl/outfit/job/ministation/security - department_types = list(/decl/department/security) - selection_color = "#990000" economic_power = 7 - minimal_player_age = 7 access = list( access_security, access_brig, @@ -24,28 +20,14 @@ access_brig, access_cameras ) - min_skill = list( - SKILL_LITERACY = SKILL_BASIC, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_COMBAT = SKILL_BASIC, - SKILL_WEAPONS = SKILL_BASIC - ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) skill_points = 30 - event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/ministation/detective - title = "Detective" +/datum/job/standard/detective/ministation alt_titles = list("Inspector") supervisors = "Justice... and the Trademaster" spawn_positions = 1 total_positions = 1 outfit_type = /decl/outfit/job/ministation/detective - department_types = list(/decl/department/security) - selection_color = "#630000" economic_power = 7 minimal_player_age = 3 access = list( @@ -71,32 +53,10 @@ SKILL_WEAPONS = SKILL_BASIC, SKILL_FORENSICS = SKILL_ADEPT ) - max_skill = list( - SKILL_COMBAT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX, - SKILL_FORENSICS = SKILL_MAX - ) skill_points = 34 -/datum/job/ministation/security/head - title = "Head of Security" - supervisors = "the Captain" +/datum/job/standard/hos/ministation outfit_type = /decl/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, @@ -139,9 +99,5 @@ 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 deleted file mode 100644 index 1aea5738c90..00000000000 --- a/maps/ministation/jobs/synthetics.dm +++ /dev/null @@ -1,79 +0,0 @@ -/datum/job/ministation/robot - title = "Robot" - event_categories = list(ASSIGNMENT_ROBOT) - total_positions = 1 - spawn_positions = 1 - supervisors = "your laws, the Lieutenant, and the Captain" - selection_color = "#254c25" - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - loadout_allowed = FALSE - outfit_type = /decl/outfit/job/silicon/cyborg - 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/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) - if(H) - return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) - -/datum/job/ministation/robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/ministation/robot/New() - ..() - alt_titles = SSrobots.robot_alt_titles.Copy() - alt_titles -= title - -/datum/job/computer - title = "Computer" - event_categories = list(ASSIGNMENT_COMPUTER) - total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm - spawn_positions = 1 - selection_color = "#3f823f" - supervisors = "your laws" - req_admin_notify = 1 - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - outfit_type = /decl/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/computer/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/computer/is_position_available() - return (empty_playable_ai_cores.len != 0) - -/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) - return H - -/datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) - character = character.AIize(move = FALSE) - - // 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/jobs/tradehouse.dm b/maps/ministation/jobs/tradehouse.dm index ed057b4fb20..daa715dddd5 100644 --- a/maps/ministation/jobs/tradehouse.dm +++ b/maps/ministation/jobs/tradehouse.dm @@ -1,7 +1,8 @@ -/datum/job/ministation/tradehouse/rep +/datum/job/tradehouse_rep title = "Tradehouse Representative" alt_titles = list("Narc") - hud_icon = "hudnarc" + hud_icon_state = "hudnarc" + hud_icon = 'maps/ministation/hud.dmi' spawn_positions = 1 total_positions = 2 req_admin_notify = 1 diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index c715e45dc03..35b21cdc415 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -31,7 +31,7 @@ /turf/wall/natural/random/ministation, /area/space) "ai" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/pool, /area/ministation/dorms) "ak" = ( @@ -104,7 +104,7 @@ /obj/structure/disposalpipe/junction{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "aG" = ( /obj/structure/table, @@ -179,7 +179,7 @@ /area/ministation/eva) "aZ" = ( /obj/structure/fitness/punchingbag, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "bb" = ( /obj/effect/floor_decal/corner/blue, @@ -422,7 +422,7 @@ /turf/floor/tiled, /area/ministation/cargo) "cd" = ( -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /turf/floor/plating/airless, /area/space) "ce" = ( @@ -455,7 +455,7 @@ /turf/floor/plating/airless, /area/space) "cl" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/loading{ dir = 8 }, @@ -469,7 +469,7 @@ /turf/floor/plating/airless, /area/space) "cp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-4" }, @@ -486,7 +486,7 @@ dir = 8 }, /obj/machinery/computer/modular/preset/engineering, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "cv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -609,7 +609,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "cM" = ( /obj/machinery/conveyor{ @@ -753,7 +753,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "dw" = ( /obj/structure/cable{ @@ -815,7 +815,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/cargo) "dF" = ( @@ -891,7 +891,7 @@ /obj/item/clothing/suit/jacket/winter, /obj/item/clothing/suit/cloak, /obj/item/clothing/suit/cloak, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "dR" = ( /obj/structure/reagent_dispensers/fueltank, @@ -944,7 +944,7 @@ /turf/floor/tiled, /area/ministation/janitor) "ej" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/cargo) "ek" = ( @@ -1103,7 +1103,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/junction, /obj/structure/cable{ icon_state = "2-8" @@ -1267,7 +1267,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/cargo) @@ -1319,7 +1319,7 @@ /turf/floor/plating, /area/ministation/engine) "ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/hologram/holopad, /obj/item/radio/intercom/locked{ dir = 4; @@ -1506,7 +1506,7 @@ /turf/floor/plating, /area/ministation/ai_sat) "fW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden, /turf/floor/tiled, /area/ministation/engine) @@ -1592,7 +1592,7 @@ /turf/floor/tiled, /area/ministation/cargo) "gk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 @@ -1601,7 +1601,7 @@ /area/ministation/cargo) "gl" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1727,7 +1727,7 @@ /turf/floor/reinforced/airmix, /area/ministation/atmospherics) "gF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/light{ dir = 4 }, @@ -1823,7 +1823,7 @@ /obj/abstract/landmark/start{ name = "Recruit" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "gY" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ @@ -1860,7 +1860,7 @@ /obj/machinery/computer/modular/preset/civilian{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "hf" = ( /turf/floor/plating, @@ -1903,7 +1903,7 @@ /turf/floor/tiled, /area/ministation/cargo) "hq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1936,7 +1936,7 @@ dir = 1; pixel_y = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -2059,7 +2059,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -2093,7 +2093,7 @@ "ia" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "ie" = ( /obj/machinery/door/airlock/external/bolted{ @@ -2225,11 +2225,11 @@ dir = 2; icon_state = "pipe-c" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "iU" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; dir = 8 @@ -2260,7 +2260,7 @@ "je" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "jf" = ( /obj/machinery/atmospherics/binary/circulator{ @@ -2277,7 +2277,7 @@ dir = 4; pixel_x = -24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "jn" = ( /obj/machinery/atmospherics/unary/vent_pump/on, @@ -2352,7 +2352,7 @@ /obj/machinery/vending/games{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "jC" = ( /obj/effect/floor_decal/corner/white{ @@ -2502,7 +2502,7 @@ /obj/machinery/vending/hotfood{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "kb" = ( /obj/machinery/meter, @@ -2569,7 +2569,7 @@ /turf/floor/tiled/techfloor, /area/ministation/atmospherics) "kw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -2634,7 +2634,7 @@ /obj/structure/window/reinforced/tinted{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Deck Hand" }, @@ -2698,7 +2698,7 @@ /area/ministation/janitor) "lb" = ( /obj/structure/undies_wardrobe, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "le" = ( /obj/machinery/atmospherics/pipe/simple/visible/green, @@ -2747,7 +2747,7 @@ /turf/floor/tiled, /area/ministation/hall/n) "ln" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /turf/floor/tiled, /area/ministation/engine) @@ -2767,7 +2767,7 @@ /turf/floor/tiled, /area/ministation/cargo) "lr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -2814,7 +2814,7 @@ /obj/structure/bed/chair/comfy/black{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "lB" = ( /obj/structure/railing/mapped{ @@ -3167,7 +3167,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "nf" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -3183,7 +3183,7 @@ dir = 1 }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random_multi/single_item/captains_spare_id, /obj/structure/window/reinforced/tinted{ dir = 8 @@ -3248,7 +3248,7 @@ }, /obj/item/clothing/suit/jacket/winter, /obj/item/clothing/suit/jacket/winter, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "nw" = ( /obj/structure/window/reinforced{ @@ -3288,7 +3288,7 @@ "nE" = ( /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "nG" = ( /obj/effect/floor_decal/industrial/custodial{ @@ -3311,7 +3311,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "nM" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ @@ -3323,7 +3323,7 @@ "nN" = ( /obj/structure/curtain/open/bed, /obj/machinery/recharge_station, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "nO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -3374,7 +3374,7 @@ /area/ministation/maint/westatmos) "ob" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "oc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3389,7 +3389,7 @@ /obj/structure/bed/chair/comfy/black{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "oi" = ( /obj/machinery/atmospherics/binary/pump/on{ @@ -3700,7 +3700,7 @@ /turf/floor/plating, /area/ministation/maint/l1central) "qe" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "qf" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, @@ -3715,10 +3715,10 @@ pixel_y = 30 }, /obj/effect/floor_decal/industrial/hatch/red, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "qo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -3756,11 +3756,11 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "qu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -3908,7 +3908,7 @@ dir = 8 }, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "rc" = ( /obj/structure/cable{ @@ -4091,7 +4091,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "sc" = ( /obj/abstract/turbolift_spawner/ministation{ @@ -4268,8 +4268,8 @@ /obj/structure/closet/crate, /obj/item/stack/material/sheet/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/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, @@ -4438,7 +4438,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "tB" = ( /obj/structure/cable{ @@ -4474,7 +4474,7 @@ /obj/abstract/landmark/start{ name = "Recruit" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "tK" = ( /obj/structure/disposalpipe/segment, @@ -4500,7 +4500,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "tQ" = ( /turf/floor/plating, @@ -4681,7 +4681,7 @@ /obj/structure/bed/chair/comfy/black{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "uK" = ( /turf/wall, @@ -4695,7 +4695,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/door/firedoor, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "uM" = ( /obj/machinery/light/small{ @@ -4755,7 +4755,7 @@ /turf/floor/tiled/monotile, /area/ministation/atmospherics) "va" = ( -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/pane/mapped/glass/fifty, /obj/item/stock_parts/circuitboard/airlock_electronics, /obj/item/stock_parts/circuitboard/airlock_electronics, @@ -4861,7 +4861,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/eastatmos) "vz" = ( @@ -4874,7 +4874,7 @@ /area/ministation/maint/westatmos) "vB" = ( /obj/machinery/vending/fitness, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "vC" = ( /obj/structure/table, @@ -4926,7 +4926,7 @@ /area/ministation/engine) "vK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/chair/wood{ dir = 8 }, @@ -4938,7 +4938,7 @@ "vL" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "vM" = ( /obj/machinery/floodlight, @@ -5028,7 +5028,7 @@ dir = 8; pixel_x = 24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "wm" = ( /obj/structure/closet/secure_closet/quartermaster{ @@ -5047,7 +5047,7 @@ /area/ministation/atmospherics) "wp" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "ws" = ( /obj/structure/cable{ @@ -5060,13 +5060,13 @@ /turf/floor/plating, /area/ministation/maint/l1ne) "wt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate, /area/ministation/engine) "wu" = ( /obj/structure/fitness/punchingbag, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "wv" = ( /obj/machinery/door/window/southleft, @@ -5121,7 +5121,7 @@ /obj/item/gun/launcher/foam/revolver, /obj/item/gun/launcher/foam, /obj/item/gun/launcher/foam, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "wD" = ( /obj/machinery/door/airlock/hatch/maintenance, @@ -5186,7 +5186,7 @@ /area/ministation/janitor) "wT" = ( /obj/structure/closet/lasertag/blue, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "wZ" = ( /obj/item/mollusc/barnacle{ @@ -5203,7 +5203,7 @@ name = "Recruit" }, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "xj" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -5231,7 +5231,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "xo" = ( /obj/machinery/emitter, @@ -5252,7 +5252,7 @@ /turf/floor/plating, /area/ministation/maint/l1central) "xr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/department/eva{ pixel_y = 30 }, @@ -5275,7 +5275,7 @@ /turf/floor/plating, /area/ministation/maint/westatmos) "xE" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, @@ -5490,7 +5490,7 @@ /obj/structure/disposalpipe/junction{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "yL" = ( /obj/machinery/light/small{ @@ -5556,6 +5556,10 @@ }, /turf/floor/tiled/monotile, /area/ministation/atmospherics) +"yY" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "yZ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -5695,7 +5699,7 @@ dir = 4 }, /obj/structure/railing/mapped, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "zW" = ( /turf/wall, @@ -5768,7 +5772,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Aj" = ( /obj/machinery/light{ @@ -6011,7 +6015,7 @@ dir = 4; pixel_x = 24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Ba" = ( /obj/machinery/alarm{ @@ -6025,7 +6029,7 @@ /obj/structure/railing/mapped{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Bd" = ( /turf/floor/plating/airless, @@ -6051,7 +6055,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Bh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -6143,7 +6147,7 @@ /obj/structure/railing/mapped{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Bx" = ( /obj/effect/floor_decal/spline/fancy/wood{ @@ -6272,7 +6276,7 @@ /obj/structure/closet, /obj/item/clothing/suit/jacket/winter, /obj/item/clothing/suit/jacket/winter, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "BV" = ( /obj/machinery/atmospherics/portables_connector, @@ -6323,7 +6327,7 @@ /obj/abstract/landmark/start{ name = "Recruit" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Cg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -6449,7 +6453,7 @@ /area/ministation/eva) "CB" = ( /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "CC" = ( /obj/item/stool/padded, @@ -6541,13 +6545,13 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "CW" = ( /obj/machinery/door/airlock, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "CZ" = ( /obj/machinery/atmospherics/omni/filter{ @@ -6722,7 +6726,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -7037,7 +7041,7 @@ /turf/floor/tiled, /area/ministation/hall/s1) "Eg" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, @@ -7062,7 +7066,7 @@ dir = 1; pixel_x = -1 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "Ej" = ( /obj/machinery/conveyor_switch{ @@ -7095,7 +7099,7 @@ /turf/floor/tiled, /area/ministation/engine) "En" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Eo" = ( @@ -7123,7 +7127,7 @@ /obj/abstract/landmark/start{ name = "Atmospheric Technician" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Es" = ( /obj/machinery/power/terminal{ @@ -7139,7 +7143,7 @@ /obj/abstract/landmark/start{ name = "Station Engineer" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Et" = ( /obj/effect/floor_decal/industrial/warning/corner{ @@ -7149,7 +7153,7 @@ /obj/abstract/landmark/start{ name = "Atmospheric Technician" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Eu" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, @@ -7188,13 +7192,13 @@ /obj/abstract/landmark/start{ name = "Station Engineer" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "EB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "EE" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -7243,7 +7247,7 @@ /area/ministation/engine) "EK" = ( /obj/effect/decal/cleanable/blood/oil, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, @@ -7260,15 +7264,15 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "EM" = ( /obj/item/boombox, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, -/turf/floor/wood, +/obj/structure/table/laminate/reinforced/walnut/maple, +/turf/floor/laminate, /area/ministation/engine) "EN" = ( /obj/structure/cable{ @@ -7277,11 +7281,11 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminate/reinforced/walnut/maple, /obj/item/chems/chem_disp_cartridge/coffee{ name = "coffee canister" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "EO" = ( /obj/item/food/old/pizza, @@ -7289,8 +7293,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable_reinforced/walnut/maple, -/turf/floor/wood, +/obj/structure/table/laminate/reinforced/walnut/maple, +/turf/floor/laminate, /area/ministation/engine) "EP" = ( /obj/machinery/vending/materials{ @@ -7317,12 +7321,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "ET" = ( /obj/effect/floor_decal/corner/yellow/three_quarters, @@ -7343,7 +7347,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 2; icon_state = "pipe-c" @@ -7400,13 +7404,13 @@ /obj/abstract/landmark/start{ name = "Station Engineer" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Fc" = ( /obj/item/wrench, /obj/item/clothing/gloves/insulated, -/obj/structure/table/woodentable_reinforced/walnut/maple, -/turf/floor/wood, +/obj/structure/table/laminate/reinforced/walnut/maple, +/turf/floor/laminate, /area/ministation/engine) "Fd" = ( /obj/structure/cable{ @@ -7414,9 +7418,9 @@ }, /obj/item/stack/tape_roll/barricade_tape/atmos, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminate/reinforced/walnut/maple, /obj/item/chems/spray/cleaner, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Fe" = ( /obj/structure/cable{ @@ -7424,21 +7428,21 @@ }, /obj/item/chems/drinks/glass2/coffeecup/metal, /obj/item/chems/drinks/glass2/coffeecup/metal, -/obj/structure/table/woodentable_reinforced/walnut/maple, +/obj/structure/table/laminate/reinforced/walnut/maple, /obj/item/chems/drinks/glass2/coffeecup/tall, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Ff" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/opossum/poppy, /obj/item/stool/padded, /obj/abstract/landmark/start{ name = "Station Engineer" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Fg" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -7491,8 +7495,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate, /area/ministation/engine) "Fn" = ( /obj/machinery/space_heater, @@ -7552,19 +7556,19 @@ dir = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Fv" = ( /obj/structure/cable{ icon_state = "2-4" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Fw" = ( /obj/structure/cable{ icon_state = "1-8" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/engine) "Fx" = ( /obj/machinery/vending/engivend{ @@ -7935,7 +7939,7 @@ /area/ministation/trash) "Ge" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/engine) @@ -8088,7 +8092,7 @@ /area/ministation/engine) "Gy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Gz" = ( @@ -8339,7 +8343,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Hd" = ( @@ -8383,7 +8387,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "Hj" = ( @@ -8434,7 +8438,7 @@ /obj/item/clothing/shoes/sandal, /obj/item/clothing/jumpsuit, /obj/item/clothing/jumpsuit, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Ho" = ( /obj/structure/transit_tube, @@ -8511,7 +8515,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 1 }, @@ -8526,7 +8530,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-4" }, @@ -8567,7 +8571,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/engine) "HD" = ( @@ -8632,7 +8636,7 @@ /obj/structure/table, /obj/item/folder/yellow, /obj/item/clothing/head/earmuffs, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/cash/scavbucks, /turf/floor/tiled, /area/ministation/engine) @@ -8848,7 +8852,7 @@ /turf/floor/plating, /area/ministation/ai_sat) "Iq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -8913,7 +8917,7 @@ /obj/machinery/camera/autoname{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "IF" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -9018,7 +9022,7 @@ /obj/item/backpack, /obj/item/backpack, /obj/item/backpack, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "IQ" = ( /obj/structure/cable{ @@ -10311,14 +10315,14 @@ dir = 8 }, /obj/effect/floor_decal/industrial/hatch/red, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "MB" = ( /obj/abstract/landmark/start{ name = "Recruit" }, /obj/item/stool/padded, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "MC" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -10483,7 +10487,7 @@ /area/ministation/atmospherics) "Ne" = ( /obj/structure/closet/lasertag/red, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Nf" = ( /obj/effect/wallframe_spawn/reinforced, @@ -10506,7 +10510,7 @@ pixel_x = -32; pixel_y = -32 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, @@ -10574,7 +10578,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "Nw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -10888,7 +10892,7 @@ /area/ministation/maint/l1central) "Oo" = ( /obj/structure/fitness/weightlifter, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Or" = ( /obj/machinery/light/small{ @@ -11145,7 +11149,7 @@ /turf/floor, /area/ministation/maint/eastatmos) "OY" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n) @@ -11185,7 +11189,7 @@ /turf/floor/plating, /area/ministation/ai_upload) "Pe" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/tiled, /area/ministation/cargo) @@ -11200,7 +11204,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "Pi" = ( /obj/machinery/drone_fabricator/maintenance, @@ -11246,7 +11250,7 @@ /turf/space, /area/ministation/supply_dock) "Pq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/item/megaphone, /obj/item/box, @@ -11366,7 +11370,7 @@ /obj/machinery/vending/snix{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "PO" = ( /obj/machinery/camera/autoname{ @@ -11376,7 +11380,7 @@ dir = 1 }, /obj/machinery/disposal, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "PQ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -11561,7 +11565,7 @@ /area/ministation/smcontrol) "QG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "QH" = ( @@ -11588,7 +11592,7 @@ dir = 1; level = 2 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "QO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -11629,7 +11633,7 @@ /obj/machinery/vending/coffee{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "QV" = ( /obj/structure/lattice, @@ -11709,7 +11713,7 @@ dir = 4; pixel_x = -22 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "Rh" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ @@ -11756,7 +11760,7 @@ /turf/floor/tiled, /area/ministation/cargo) "Ro" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/clothing/mask/snorkel, /obj/item/clothing/mask/snorkel, /obj/machinery/light{ @@ -11776,7 +11780,7 @@ /turf/floor/plating/airless, /area/ministation/mining) "Rr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "Rs" = ( @@ -11790,7 +11794,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s1) "Ru" = ( @@ -11824,7 +11828,7 @@ /area/ministation/supermatter) "RA" = ( /obj/structure/closet/boxinggloves, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "RB" = ( /obj/item/radio/intercom{ @@ -11858,7 +11862,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "RE" = ( /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ @@ -11964,7 +11968,7 @@ /mob/living/simple_animal/hostile/parrot/Poly, /obj/structure/table/reinforced, /obj/item/chems/drinks/glass2/coffeecup/one, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "Sa" = ( /obj/machinery/atmospherics/binary/pump/on{ @@ -12006,7 +12010,7 @@ level = 2 }, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Sg" = ( /obj/structure/closet/crate/solar, @@ -12020,7 +12024,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -12039,7 +12043,7 @@ /area/ministation/atmospherics) "So" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n) "Sp" = ( @@ -12062,7 +12066,7 @@ /turf/floor, /area/ministation/maint/eastatmos) "Ss" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -12081,7 +12085,7 @@ "Sv" = ( /obj/item/toy/ringbell, /obj/structure/table/steel, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Sw" = ( /obj/structure/cable, @@ -12106,7 +12110,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 10 }, @@ -12117,7 +12121,7 @@ name = "Recruit" }, /obj/machinery/camera/autoname, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "SF" = ( /obj/structure/cable{ @@ -12197,7 +12201,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -12338,7 +12342,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Tv" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ @@ -12404,7 +12408,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "TB" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -12497,7 +12501,7 @@ /turf/floor/tiled, /area/ministation/engine) "TP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -12544,7 +12548,7 @@ /turf/space, /area/space) "Ua" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/clothing/mask/snorkel, /obj/item/clothing/mask/snorkel, /turf/floor/pool, @@ -12564,12 +12568,12 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Ue" = ( /obj/structure/table/gamblingtable, /obj/machinery/chemical_dispenser/bar_alc/full, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/engine) "Ug" = ( /obj/machinery/atmospherics/pipe/manifold/visible/cyan{ @@ -12609,7 +12613,7 @@ /turf/floor/tiled, /area/ministation/engine) "Ul" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -12671,7 +12675,7 @@ dir = 1; pixel_y = -23 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "UA" = ( /obj/machinery/light{ @@ -12745,7 +12749,7 @@ /turf/floor/tiled, /area/ministation/engine) "UT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/on{ target_pressure = 200; dir = 1 @@ -12804,7 +12808,7 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Vc" = ( /obj/machinery/atmospherics/pipe/simple/hidden, @@ -12821,7 +12825,7 @@ /obj/structure/curtain/open/bed, /obj/structure/bed/padded, /obj/item/bedsheet/ce, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Vj" = ( /obj/machinery/light{ @@ -12844,7 +12848,7 @@ }, /obj/item/clothing/suit/jacket/winter, /obj/item/clothing/suit/jacket/winter, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Vm" = ( /obj/structure/cable/yellow{ @@ -12927,7 +12931,7 @@ /turf/floor/plating, /area/ministation/supermatter) "VF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s1) @@ -13000,7 +13004,7 @@ "VT" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "VV" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -13068,7 +13072,7 @@ dir = 1; icon_state = "pipe-c" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Wi" = ( /obj/structure/disposaloutlet, @@ -13117,7 +13121,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/eastatmos) "Wn" = ( @@ -13212,7 +13216,7 @@ "WM" = ( /obj/machinery/door/airlock/double/glass/civilian, /obj/machinery/door/firedoor, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "WO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -13261,7 +13265,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -13274,7 +13278,7 @@ /turf/space, /area/space) "Xb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/green{ dir = 4 }, @@ -13344,7 +13348,7 @@ dir = 1 }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -13358,7 +13362,7 @@ /area/ministation/dorms) "Xo" = ( /obj/structure/table/reinforced, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Xt" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -13384,7 +13388,7 @@ /turf/floor/plating, /area/ministation/mining) "Xx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n) "Xz" = ( @@ -13581,7 +13585,7 @@ /turf/floor/plating, /area/ministation/engine) "Yu" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "2-8" }, @@ -13591,7 +13595,7 @@ /obj/structure/railing/mapped{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Yx" = ( /obj/effect/floor_decal/industrial/custodial{ @@ -13765,7 +13769,7 @@ dir = 2; icon_state = "pipe-c" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "YW" = ( /obj/machinery/atmospherics/pipe/simple/hidden, @@ -13830,10 +13834,10 @@ dir = 4 }, /obj/machinery/camera/autoname, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/poster, /obj/item/pen, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Zh" = ( /obj/machinery/light{ @@ -13898,7 +13902,7 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/dorms) "Zv" = ( /obj/structure/ladder, @@ -14017,7 +14021,7 @@ /area/ministation/engine) "ZR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s1) @@ -33009,7 +33013,7 @@ aa aa aa aa -aa +yY aa aa aa @@ -49102,7 +49106,7 @@ aa aa aa aa -aa +yY aa aa aa @@ -57125,7 +57129,7 @@ aa aa aa aa -aa +yY aa aa aa diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index ce6e50124ac..6646873ff83 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -242,7 +242,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /mob/living/simple_animal/passive/mouse/brown/Tom, /turf/floor/lino, /area/ministation/cafe) @@ -271,7 +271,7 @@ pixel_y = 26 }, /obj/machinery/camera/network/security, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/detective) "by" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -329,7 +329,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 1 }, @@ -434,7 +434,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l2centrals) "cq" = ( @@ -474,7 +474,7 @@ /turf/floor/plating, /area/ministation/hop) "cA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green, /obj/machinery/firealarm{ dir = 4; @@ -611,7 +611,7 @@ /area/ministation/hall/w2) "dn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/hygiene/drain, /turf/floor/tiled/stone, /area/ministation/hall/e2) @@ -895,7 +895,7 @@ /turf/floor/plating, /area/ministation/maint/l2centrals) "ey" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 @@ -999,7 +999,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "fm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/borderfloorblack{ dir = 8 }, @@ -1218,7 +1218,7 @@ /turf/open, /area/ministation/hall/e2) "gB" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/item/pen/blue, /turf/floor/carpet/red, /area/ministation/security) @@ -1264,7 +1264,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/detective) "gL" = ( /obj/effect/floor_decal/corner/paleblue/diagonal, @@ -1500,7 +1500,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "hC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/unary/vent_pump/on, /obj/item/scanner/spectrometer, /obj/item/handcuffs, @@ -1633,7 +1633,7 @@ /turf/floor/tiled, /area/ministation/security) "id" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = -3; pixel_y = 7 @@ -1673,7 +1673,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "in" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -1715,7 +1715,7 @@ dir = 4; pixel_x = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, @@ -1952,7 +1952,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/detective) "jl" = ( /obj/machinery/porta_turret{ @@ -2453,7 +2453,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "lN" = ( @@ -2713,6 +2713,10 @@ }, /turf/floor/tiled, /area/ministation/hall/w2) +"nt" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "nu" = ( /obj/effect/floor_decal/carpet{ dir = 8 @@ -3020,7 +3024,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "pf" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/tiled, /area/ministation/hall/w2) @@ -3052,7 +3056,7 @@ /turf/floor/plating/airless, /area/space) "ps" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/ministation/hall/w2) "pu" = ( @@ -3069,7 +3073,7 @@ /turf/floor/plating, /area/ministation/maint/l2centraln) "px" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/glass/beaker, /turf/floor/lino, /area/ministation/cafe) @@ -3081,7 +3085,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/structure/window/reinforced{ dir = 4 }, @@ -3269,7 +3273,7 @@ /turf/floor/tiled/white, /area/ministation/detective) "qe" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/tiled, /area/ministation/hall/w2) "qf" = ( @@ -3644,7 +3648,7 @@ /turf/open, /area/ministation/hall/w2) "rA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -3678,7 +3682,7 @@ /turf/floor/tiled, /area/ministation/hop) "rE" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -3910,7 +3914,7 @@ /area/ministation/medical) "ss" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "st" = ( @@ -4291,7 +4295,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/e2) "tE" = ( @@ -4383,7 +4387,7 @@ dir = 4; pixel_x = -22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/cooker/fryer, /turf/floor/lino, /area/ministation/cafe) @@ -4473,7 +4477,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "ub" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -4497,7 +4501,7 @@ /area/ministation/hall/w2) "ud" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/ss13/l6, /turf/floor/tiled, /area/ministation/hall/w2) @@ -4562,7 +4566,7 @@ /area/ministation/hall/e2) "uq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/stone, /area/ministation/hall/e2) "us" = ( @@ -4628,7 +4632,7 @@ /area/ministation/hall/w2) "uD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "uG" = ( @@ -4864,7 +4868,7 @@ /turf/floor/plating, /area/ministation/medical) "vq" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/book/manual/detective, /turf/floor/carpet/red, /area/ministation/detective) @@ -4900,7 +4904,7 @@ /area/ministation/cafe) "vw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, @@ -5006,7 +5010,7 @@ /turf/floor/tiled/dark, /area/ministation/medical) "vO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning, /obj/machinery/light{ dir = 8 @@ -5093,7 +5097,7 @@ /turf/space, /area/space) "wk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, /area/ministation/cafe) @@ -5234,7 +5238,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "wD" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/e2) "wE" = ( @@ -5415,7 +5419,7 @@ /turf/floor/plating, /area/ministation/maint/l2centrals) "xn" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/item/paper_bin, /turf/floor/carpet/red, /area/ministation/security) @@ -5488,7 +5492,7 @@ /turf/floor/tiled, /area/ministation/hydro) "xy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/green/half{ dir = 1 }, @@ -5597,7 +5601,7 @@ /area/ministation/security) "xQ" = ( /obj/item/stool/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/paleblue/diagonal, /turf/floor/tiled/dark, /area/ministation/cafe) @@ -5793,7 +5797,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "yw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -5807,7 +5811,7 @@ /obj/machinery/camera/autoname{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, @@ -6062,7 +6066,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/structure/window/reinforced{ dir = 8 }, @@ -6132,7 +6136,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "zF" = ( @@ -6150,7 +6154,7 @@ pixel_x = -3; pixel_y = 6 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/button/blast_door{ id_tag = "Kitchen1"; name = "Kitchen Shutter"; @@ -6173,7 +6177,7 @@ /turf/floor/lino, /area/ministation/cafe) "zK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/lino, @@ -6237,14 +6241,14 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/detective) "zZ" = ( /obj/structure/bed/chair/comfy/beige{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "Ae" = ( @@ -6446,7 +6450,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/stone, /area/ministation/hall/e2) "AJ" = ( @@ -6473,7 +6477,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "AK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 10 }, @@ -6523,7 +6527,7 @@ /turf/floor/plating, /area/ministation/hall/w2) "Bk" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin{ pixel_x = 1; pixel_y = 9 @@ -6533,7 +6537,7 @@ /turf/floor/carpet, /area/ministation/hall/w2) "Bm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/lino, /area/ministation/cafe) "Br" = ( @@ -6627,7 +6631,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/detective) "BJ" = ( /obj/machinery/door/firedoor, @@ -6708,8 +6712,10 @@ pixel_y = -24; dir = 1 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/reagent_temperature, +/obj/item/chems/cooking_vessel/pot, +/obj/item/chems/cooking_vessel/skillet, /turf/floor/lino, /area/ministation/cafe) "Ct" = ( @@ -6776,7 +6782,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "CL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -6873,7 +6879,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Dj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/condiment/enzyme, /obj/item/mollusc/clam, /obj/item/mollusc/clam, @@ -7240,7 +7246,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "Ft" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /turf/floor/tiled, /area/ministation/security) "Fy" = ( @@ -7274,7 +7280,7 @@ /turf/floor/tiled, /area/ministation/hydro) "FJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7411,7 +7417,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/borderfloorblack{ dir = 8 }, @@ -7476,7 +7482,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "GZ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/w2) "Hd" = ( @@ -7489,7 +7495,7 @@ /obj/effect/floor_decal/industrial/firstaid{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/ministation/hall/e2) "Hn" = ( @@ -7508,7 +7514,7 @@ /turf/floor/tiled, /area/ministation/hydro) "Hx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/reagent_temperature/cooler, /turf/floor/lino, /area/ministation/cafe) @@ -7563,7 +7569,7 @@ dir = 1 }, /obj/item/clothing/head/beret/corp/sec, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/detective) "HG" = ( /obj/structure/table, @@ -7639,7 +7645,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Ia" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/machinery/faxmachine/mapped, /turf/floor/carpet/red, /area/ministation/security) @@ -7800,7 +7806,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "IX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -7832,7 +7838,7 @@ /turf/floor/fake_grass, /area/ministation/hydro) "Jj" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/camera/autoname{ dir = 8 }, @@ -7879,7 +7885,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "Jo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/cigarettes, /obj/item/pen, /obj/structure/cable{ @@ -7903,7 +7909,7 @@ /area/ministation/hall/e2) "Jz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/effect/floor_decal/borderfloorblack/corner{ dir = 4 @@ -7929,7 +7935,7 @@ /turf/floor/tiled, /area/ministation/hall/e2) "JJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, @@ -8195,7 +8201,7 @@ /turf/floor/tiled, /area/ministation/security) "Lk" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/item/pen/multi, /turf/floor/carpet/red, /area/ministation/security) @@ -8214,7 +8220,7 @@ /turf/floor/tiled, /area/ministation/security) "Lr" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/reagentgrinder/juicer, /obj/item/chems/glass/beaker, /turf/floor/lino, @@ -8269,7 +8275,7 @@ /turf/floor/carpet/red, /area/ministation/security) "LM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/knife/kitchen/cleaver, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -8356,18 +8362,18 @@ /area/ministation/medical) "Me" = ( /obj/structure/rack, -/obj/item/target, -/obj/item/target/alien, -/obj/item/target/syndicate, +/obj/item/training_dummy, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/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, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/syndicate, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/alien, +/obj/item/training_dummy/alien, /turf/floor/tiled, /area/ministation/security) "Mp" = ( @@ -8530,7 +8536,7 @@ /turf/floor/fake_grass, /area/ministation/hall/e2) "Nh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/effect/floor_decal/industrial/warning/corner{ dir = 4; @@ -8903,7 +8909,7 @@ /turf/floor/plating, /area/ministation/medical) "Pd" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/cigarettes{ pixel_y = 2 }, @@ -8961,7 +8967,7 @@ "Ps" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ministation/cafe) "Pw" = ( @@ -9215,7 +9221,7 @@ /turf/floor/tiled, /area/ministation/hall/e2) "QH" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/item/pen, /turf/floor/carpet/red, /area/ministation/security) @@ -9259,7 +9265,7 @@ /area/ministation/hall/w2) "QO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "QP" = ( @@ -9329,7 +9335,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/lino, /area/ministation/cafe) "Rx" = ( @@ -9471,7 +9477,7 @@ /turf/floor/plating, /area/ministation/arrival) "Sy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning{ dir = 1; @@ -9520,7 +9526,7 @@ /turf/floor/plating, /area/ministation/arrival) "SF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/floor_decal/ss13/l4, /turf/floor/tiled, @@ -9623,7 +9629,7 @@ /turf/floor/tiled/dark, /area/ministation/security) "To" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/corner/paleblue/diagonal, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -9755,15 +9761,15 @@ /turf/floor/tiled, /area/ministation/security) "TX" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/eftpos, /obj/item/chems/spray/cleaner, +/obj/item/chems/packet/honey_fake, +/obj/item/chems/packet/honey_fake, /obj/item/chems/packet/honey, /obj/item/chems/packet/honey, /obj/item/chems/packet/honey, -/obj/item/chems/packet/honey, -/obj/item/chems/packet/honey, -/obj/item/chems/packet/honey, +/obj/item/chems/packet/honey_fake, /obj/item/chems/packet/honey, /turf/floor/lino, /area/ministation/cafe) @@ -9775,7 +9781,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "Ug" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/structure/cable{ icon_state = "4-8" @@ -9816,7 +9822,7 @@ /turf/floor/plating, /area/ministation/maint/secmaint) "Ur" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /turf/floor/carpet/red, /area/ministation/security) "Ut" = ( @@ -10132,7 +10138,7 @@ /turf/floor/plating, /area/ministation/medical) "Wa" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp/green{ pixel_x = 1; pixel_y = 5 @@ -10194,7 +10200,7 @@ dir = 4; pixel_x = -23 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ministation/detective) "Wm" = ( /obj/effect/floor_decal/industrial/warning{ @@ -10239,7 +10245,7 @@ /turf/floor/plating, /area/ministation/arrival) "WC" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 9 }, @@ -10446,12 +10452,12 @@ /turf/floor/tiled/white, /area/ministation/detective) "XK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/ss13/l14, /turf/floor/tiled, /area/ministation/hall/w2) "XW" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/ammo/beanbags, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -10515,7 +10521,7 @@ pixel_x = 32; pixel_y = 32 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -54008,7 +54014,7 @@ aa aa aa aa -aa +nt aa aa aa @@ -54341,7 +54347,7 @@ aa aa aa aa -aa +nt aa aa aa diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 722f234f11f..e7fbc07d968 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -177,7 +177,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/bridge) "aU" = ( /obj/machinery/atmospherics/portables_connector, @@ -204,7 +204,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/bridge) "aX" = ( /obj/structure/cable{ @@ -345,11 +345,11 @@ /obj/abstract/landmark/start{ name = "Captain" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/bridge) "bt" = ( /obj/item/flashlight/lamp/green, -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -359,7 +359,7 @@ /obj/item/stack/material/bow_ammo/rod, /obj/item/cell/crap, /obj/item/mollusc/clam, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/bridge) "bu" = ( /obj/machinery/shipsensors{ @@ -493,15 +493,15 @@ initial_access = null; req_access = list("ACCESS_CAMERAS") }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/bridge) "bI" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/item/modular_computer/tablet/lease/preset/command, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/bridge) "bK" = ( /obj/machinery/alarm{ @@ -781,7 +781,7 @@ }, /obj/item/med_pouch/trauma, /obj/item/stack/tape_roll/duct_tape, -/obj/item/shield/buckler, +/obj/item/shield/crafted/buckler, /obj/item/gps/explorer, /obj/item/belt/holster/machete, /obj/item/tool/machete/deluxe, @@ -790,7 +790,7 @@ /area/ministation/science) "cJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n3) @@ -899,7 +899,7 @@ /turf/floor/tiled, /area/ministation/bridge) "dn" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminate/reinforced/walnut, /obj/item/paper_bin, /obj/item/pen/retractable, /turf/floor/carpet/red, @@ -1122,7 +1122,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "et" = ( @@ -1362,7 +1362,7 @@ /turf/floor/tiled/white, /area/ministation/science) "fi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/small{ dir = 4 }, @@ -1455,7 +1455,7 @@ dir = 4; pixel_x = 1 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "fW" = ( /obj/machinery/light, @@ -1627,7 +1627,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/n3) @@ -1655,7 +1655,7 @@ dir = 8 }, /obj/structure/bookcase/skill_books/random, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "hd" = ( /obj/machinery/light{ @@ -2163,7 +2163,7 @@ "js" = ( /obj/structure/table, /obj/item/chems/glass/beaker/large, -/obj/item/chems/glass/beaker/sulphuric, +/obj/item/chems/glass/beaker/sulfuric, /obj/item/chems/dropper, /obj/effect/floor_decal/corner/purple{ dir = 8 @@ -2274,7 +2274,7 @@ }, /obj/item/med_pouch/trauma, /obj/item/stack/tape_roll/duct_tape, -/obj/item/shield/buckler, +/obj/item/shield/crafted/buckler, /obj/item/gps/explorer, /obj/item/flashlight/lantern, /obj/item/bladed/polearm/spear/improvised/steel, @@ -2330,7 +2330,7 @@ /turf/floor/plating, /area/ministation/maint/l3se) "kk" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "kn" = ( /obj/effect/floor_decal/industrial/warning{ @@ -2590,7 +2590,7 @@ /obj/item/clothing/suit/jacket/charcoal, /obj/item/clothing/shoes/sandal, /obj/item/multitool, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "ll" = ( /obj/structure/cable{ @@ -2732,7 +2732,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "mf" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -2946,7 +2946,7 @@ /obj/machinery/camera/autoname{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "mY" = ( /obj/machinery/atmospherics/pipe/simple/hidden, @@ -3061,7 +3061,7 @@ /turf/floor/plating, /area/ministation/hall/s3) "nL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/network/relay{ initial_network_id = "molluscnet" }, @@ -3206,7 +3206,7 @@ /turf/floor/tiled/white, /area/ministation/science) "oN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "oP" = ( @@ -3222,10 +3222,10 @@ dir = 1; level = 2 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "oR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3262,7 +3262,7 @@ /turf/floor/tiled, /area/ministation/bridge) "pi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -3294,12 +3294,12 @@ /turf/floor, /area/ministation/science) "ps" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminate/ebony, /obj/item/paper_bundle, /obj/effect/floor_decal/stoneborder{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "pz" = ( /obj/machinery/power/apc{ @@ -3344,7 +3344,7 @@ /turf/floor/plating, /area/ministation/maint/l3nw) "qj" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /obj/item/toy/figure/clown, /turf/floor/reinforced/airless, /area/space) @@ -3508,7 +3508,7 @@ /turf/space, /area/space) "sh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3536,6 +3536,10 @@ }, /turf/floor/reinforced, /area/ministation/science) +"sq" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "sr" = ( /turf/floor/tiled/dark/monotile/telecomms, /area/ministation/telecomms) @@ -3560,7 +3564,7 @@ /obj/machinery/camera/autoname{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "sB" = ( /obj/structure/cable{ @@ -3631,7 +3635,7 @@ /obj/structure/bed, /obj/item/bedsheet/purple, /obj/random/plushie, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "sW" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -3847,7 +3851,7 @@ /obj/effect/floor_decal/stoneborder{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "uN" = ( /obj/machinery/door/airlock/glass/science, @@ -3997,7 +4001,7 @@ /turf/floor/tiled/white, /area/ministation/science) "vJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/apc{ dir = 1; name = "_North APC"; @@ -4087,7 +4091,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "wH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -4128,14 +4132,14 @@ /turf/floor/lino, /area/ministation/hall/s3) "wY" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminate/ebony, /obj/item/pen/fancy, /obj/item/box/fancy/crayons, /obj/effect/floor_decal/stoneborder{ dir = 6 }, /obj/item/box/candles, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "xc" = ( /obj/structure/lattice, @@ -4150,7 +4154,7 @@ /turf/floor/lino, /area/ministation/telecomms) "xr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -4163,11 +4167,11 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "xH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4221,14 +4225,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "yc" = ( /obj/machinery/camera/autoname{ dir = 8; req_access = list("ACCESS_CAMERAS") }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "yd" = ( /obj/machinery/door/firedoor, @@ -4251,7 +4255,7 @@ /obj/machinery/camera/autoname{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "ym" = ( /turf/floor/tiled, @@ -4373,7 +4377,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -4430,7 +4434,7 @@ /obj/machinery/light, /obj/item/med_pouch/trauma, /obj/item/stack/tape_roll/duct_tape, -/obj/item/shield/buckler, +/obj/item/shield/crafted/buckler, /obj/item/gps/explorer, /obj/item/flashlight/lantern, /obj/item/bladed/polearm/spear/improvised/steel, @@ -4480,7 +4484,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "Al" = ( /obj/machinery/button/blast_door{ @@ -4535,10 +4539,10 @@ dir = 1; icon_state = "pipe-c" }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "AH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/ministation/hall/n3) "AK" = ( @@ -4559,7 +4563,7 @@ /obj/effect/floor_decal/stoneborder{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "AS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4650,7 +4654,7 @@ /turf/floor/plating, /area/ministation/maint/l3central) "Bk" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -4813,7 +4817,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "BZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -4971,7 +4975,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /turf/floor/plating, /area/ministation/maint/l3sw) @@ -5274,12 +5278,12 @@ /turf/floor/plating, /area/ministation/maint/l3central) "DD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /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/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "DF" = ( /obj/machinery/camera/autoname{ @@ -5294,7 +5298,7 @@ /turf/floor/tiled/white, /area/ministation/science) "DQ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pill_bottle/dice, /turf/floor/carpet/green, /area/ministation/library) @@ -5327,14 +5331,14 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "Ee" = ( /turf/floor/plating, /area/ministation/maint/l3nw) "Ef" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/carpet/green, /area/ministation/library) "Eg" = ( @@ -5521,7 +5525,7 @@ /obj/machinery/computer/modular/preset/civilian{ dir = 1 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "FH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -5547,13 +5551,13 @@ /turf/floor/tiled/white, /area/ministation/science) "FV" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/mollusc/clam, /obj/machinery/light/small, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Gh" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, @@ -5665,12 +5669,12 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Hl" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminate/ebony, /obj/item/paper_bin, /obj/effect/floor_decal/stoneborder{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "Ho" = ( /obj/structure/cable{ @@ -5686,7 +5690,7 @@ /turf/wall/r_wall/prepainted, /area/space) "HB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "HK" = ( @@ -5699,7 +5703,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "HN" = ( /obj/structure/cable{ @@ -5799,7 +5803,7 @@ /turf/floor/carpet/green, /area/ministation/tradehouse_rep) "Ir" = ( -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Ix" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -5829,7 +5833,7 @@ /obj/machinery/alarm{ pixel_y = 23 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "IC" = ( /turf/floor/carpet/green, @@ -5899,7 +5903,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Jo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -5940,7 +5944,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "JF" = ( /obj/structure/disposalpipe/segment{ @@ -6063,7 +6067,7 @@ /turf/floor/carpet/green, /area/ministation/library) "Le" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/drinks/cans/waterbottle, /turf/floor/carpet/green, /area/ministation/library) @@ -6097,7 +6101,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "LC" = ( /obj/structure/disposalpipe/segment, @@ -6127,7 +6131,7 @@ /turf/floor/tiled, /area/ministation/hall/n3) "LM" = ( -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "LN" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -6178,7 +6182,7 @@ /obj/structure/bed/chair/armchair/black{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "LW" = ( /obj/structure/cable{ @@ -6263,7 +6267,7 @@ dir = 8; pixel_x = 22 }, -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminate/reinforced/walnut, /obj/item/folder, /turf/floor/carpet/red, /area/ministation/court) @@ -6326,7 +6330,7 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "MU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -6400,7 +6404,7 @@ /obj/machinery/light_switch{ pixel_y = 32 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Ne" = ( /obj/structure/table, @@ -6426,7 +6430,7 @@ /area/ministation/maint/l3se) "Nk" = ( /obj/machinery/photocopier, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Nm" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/fuel{ @@ -6459,7 +6463,7 @@ pixel_y = -32; dir = 1 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "ND" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -6468,10 +6472,10 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "NF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -6490,7 +6494,7 @@ /turf/floor/tiled, /area/ministation/bridge) "NJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/flora/pottedplant/aquatic, /turf/floor/lino, @@ -6558,7 +6562,7 @@ /obj/structure/bed/chair/wood/walnut{ dir = 4 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Ok" = ( /obj/structure/shuttle/engine/heater{ @@ -6596,9 +6600,9 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Ov" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate/walnut, /obj/machinery/light, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Oy" = ( /obj/machinery/atmospherics/binary/pump/on{ @@ -6668,7 +6672,7 @@ /obj/effect/floor_decal/stoneborder{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "ON" = ( /obj/structure/cable{ @@ -6730,10 +6734,10 @@ /turf/floor/tiled, /area/ministation/hall/s3) "Pk" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate/walnut, /obj/item/folder/blue, /obj/machinery/atmospherics/unary/vent_pump/on, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Pn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal, @@ -6757,17 +6761,17 @@ /area/space) "Pw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/techfloor/orange, /turf/floor/tiled, /area/ministation/hall/n3) "Px" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate/walnut, /obj/item/folder/red, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Pz" = ( /obj/machinery/door/firedoor, @@ -6802,13 +6806,13 @@ /obj/abstract/landmark/start{ name = "Librarian" }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "PE" = ( /obj/structure/bed/chair/armchair/black{ dir = 8 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "PL" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ @@ -6838,11 +6842,11 @@ /turf/floor/plating, /area/ministation/maint/l3sw) "PR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "PT" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminate/reinforced/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -6905,7 +6909,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Qk" = ( /obj/machinery/power/apc{ @@ -6973,18 +6977,18 @@ /turf/floor/tiled, /area/ministation/shuttle/outgoing) "QD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/book/printable_red, /obj/item/pen, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "QF" = ( /turf/wall, /area/space) "QG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment, /turf/floor/tiled, /area/ministation/hall/s3) @@ -7005,7 +7009,7 @@ pixel_y = 30 }, /obj/effect/floor_decal/industrial/hatch/red, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "QT" = ( /obj/machinery/computer/design_console{ @@ -7022,8 +7026,8 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/obj/structure/table/woodentable, -/turf/floor/wood/mahogany, +/obj/structure/table/laminate, +/turf/floor/laminate/mahogany, /area/ministation/library) "Re" = ( /obj/machinery/power/apc{ @@ -7060,7 +7064,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Rl" = ( /obj/structure/cable{ @@ -7097,7 +7101,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "Rv" = ( @@ -7159,7 +7163,7 @@ /area/ministation/shuttle/outgoing) "RG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "RI" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -7203,7 +7207,7 @@ /obj/effect/floor_decal/stoneborder{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "RS" = ( /obj/machinery/power/smes/buildable/max_cap_in_out{ @@ -7270,11 +7274,11 @@ /turf/floor/tiled, /area/ministation/tradehouse_rep) "Sf" = ( -/obj/structure/table/woodentable/walnut, +/obj/structure/table/laminate/walnut, /obj/machinery/light{ dir = 1 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Sh" = ( /obj/structure/window/reinforced{ @@ -7298,7 +7302,7 @@ /area/ministation/science) "So" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/n3) "Sq" = ( @@ -7346,7 +7350,7 @@ /area/ministation/science) "SP" = ( /obj/item/stool/padded, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "SS" = ( /obj/machinery/computer/ship/engines{ @@ -7374,8 +7378,8 @@ /turf/floor/plating, /area/ministation/maint/l3ne) "Tk" = ( -/obj/structure/table/woodentable, -/turf/floor/wood/mahogany, +/obj/structure/table/laminate, +/turf/floor/laminate/mahogany, /area/ministation/library) "Tm" = ( /obj/effect/floor_decal/carpet/green{ @@ -7384,7 +7388,7 @@ /obj/effect/floor_decal/stoneborder{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "Tn" = ( /obj/machinery/shipsensors{ @@ -7423,7 +7427,7 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/laminate/ebony, /obj/item/pen, /obj/item/pen/blue, /obj/item/pen/retractable, @@ -7431,7 +7435,7 @@ /obj/item/pen/retractable/blue, /obj/item/pen/multi, /obj/effect/floor_decal/stoneborder/corner, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "Tx" = ( /obj/machinery/light_switch{ @@ -7483,7 +7487,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "TG" = ( /obj/machinery/atmospherics/binary/pump/high_power{ @@ -7501,7 +7505,7 @@ /turf/floor/tiled, /area/ministation/bridge) "TI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/cash, /obj/item/chems/drinks/cans/waterbottle, /turf/floor/carpet/green, @@ -7599,7 +7603,7 @@ /obj/structure/reagent_dispensers/water_cooler{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "Uo" = ( /obj/item/radio/intercom{ @@ -7617,7 +7621,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Uq" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -7627,11 +7631,11 @@ dir = 2; icon_state = "pipe-c" }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Uw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "UB" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -7644,7 +7648,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "UE" = ( /obj/structure/closet/crate/uranium, @@ -7657,7 +7661,7 @@ dir = 4 }, /obj/structure/bookcase/skill_books/random, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "UH" = ( /obj/machinery/alarm{ @@ -7681,7 +7685,7 @@ /turf/floor/tiled/white, /area/ministation/science) "UK" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ pixel_x = -3 }, @@ -7734,7 +7738,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/knife/kitchen, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -7743,15 +7747,15 @@ /obj/item/mollusc/clam, /obj/item/mollusc/clam, /obj/item/mollusc/clam, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Vl" = ( /obj/structure/bookcase/manuals, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Vq" = ( /obj/structure/bookcase/skill_books/random, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Vt" = ( /obj/structure/cable{ @@ -7787,7 +7791,7 @@ /turf/floor/carpet/red, /area/ministation/court) "Vw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/deck/cards, /turf/floor/carpet/green, /area/ministation/library) @@ -7864,9 +7868,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/fabricator/book, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "VX" = ( /obj/machinery/atmospherics/pipe/simple/hidden{ @@ -7971,7 +7975,7 @@ dir = 1; level = 2 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Wx" = ( /obj/machinery/door/airlock/hatch/maintenance, @@ -8032,7 +8036,7 @@ /obj/effect/floor_decal/stoneborder{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "WT" = ( /obj/structure/bed/padded, @@ -8076,7 +8080,7 @@ dir = 4 }, /obj/machinery/light, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Xi" = ( /obj/machinery/newscaster{ @@ -8113,7 +8117,7 @@ /turf/floor/tiled/white, /area/ministation/science) "XA" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning, /obj/structure/railing/mapped, @@ -8132,7 +8136,7 @@ /obj/effect/floor_decal/stoneborder/corner{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "XJ" = ( /obj/structure/closet, @@ -8222,7 +8226,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ministation/maint/l3sw) "Yj" = ( @@ -8296,7 +8300,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "YJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -8377,7 +8381,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "YX" = ( /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ @@ -8438,7 +8442,7 @@ /turf/floor/plating, /area/ministation/maint/l3sw) "Zj" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/universal, /turf/floor/plating, /area/ministation/maint/l3sw) @@ -8484,7 +8488,7 @@ /obj/machinery/firealarm{ pixel_y = 25 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ministation/court) "Zu" = ( /obj/structure/cable{ @@ -8499,7 +8503,7 @@ /obj/machinery/alarm{ pixel_y = 22 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "Zv" = ( /turf/wall, @@ -8515,7 +8519,7 @@ /area/ministation/bridge) "ZH" = ( /obj/effect/floor_decal/carpet/green, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ministation/library) "ZJ" = ( /obj/machinery/door/firedoor, @@ -8541,7 +8545,7 @@ /area/ministation/court) "ZR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ministation/hall/s3) "ZS" = ( @@ -8580,10 +8584,10 @@ /obj/machinery/light/small{ dir = 4 }, -/turf/floor/wood/mahogany, +/turf/floor/laminate/mahogany, /area/ministation/library) "ZZ" = ( -/obj/structure/table/woodentable_reinforced/walnut, +/obj/structure/table/laminate/reinforced/walnut, /obj/item/bell, /turf/floor/carpet/red, /area/ministation/court) @@ -29552,7 +29556,7 @@ vA vA vA vA -vA +sq vA vA vA @@ -45788,7 +45792,7 @@ vA vA vA vA -vA +sq vA vA vA @@ -52136,7 +52140,7 @@ vA vA vA vA -vA +sq vA vA vA diff --git a/maps/ministation/ministation-3.dmm b/maps/ministation/ministation-3.dmm index cbdd8abb538..e5b68a7fe20 100644 --- a/maps/ministation/ministation-3.dmm +++ b/maps/ministation/ministation-3.dmm @@ -88,6 +88,10 @@ }, /turf/floor/plating, /area/ministation/maint/l4central) +"kH" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "kV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 @@ -40459,7 +40463,7 @@ aa aa aa aa -aa +kH aa aa aa diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index cd027156fa9..fca80d6d647 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -15,30 +15,39 @@ Twice... #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + + #include "../../mods/content/mundane.dm" + #include "../../mods/content/scaling_descriptors.dm" + + #include "../../mods/content/bigpharma/_bigpharma.dme" + #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/government/_government.dme" + #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/content/modern_earth/_modern_earth.dme" + #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/supermatter/_supermatter.dme" + #include "../../mods/content/xenobiology/_xenobiology.dme" + #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/traitor/_traitor.dme" #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../../mods/gamemodes/mixed.dm" - #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + #include "../../mods/mobs/dionaea/_dionaea.dme" + #include "../../mods/mobs/borers/_borers.dme" - #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/corporate/_corporate.dme" - #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/content/tabloids/_tabloids.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/neoavians/_neoavians.dme" - #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/serpentid/_serpentid.dme" - #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/scaling_descriptors.dm" #include "ministation_antagonists.dm" #include "ministation_areas.dm" @@ -65,17 +74,10 @@ Twice... #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" - - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" - #include "ministation_overmap.dm" #include "jobs/command.dm" @@ -85,7 +87,6 @@ Twice... #include "jobs/security.dm" #include "jobs/science.dm" #include "jobs/tradehouse.dm" - #include "jobs/synthetics.dm" #include "outfits/_outfits.dm" #include "outfits/command.dm" diff --git a/maps/ministation/ministation_define.dm b/maps/ministation/ministation_define.dm index d415969ed0b..b47a6b47024 100644 --- a/maps/ministation/ministation_define.dm +++ b/maps/ministation/ministation_define.dm @@ -13,8 +13,6 @@ company_name = "Tradehouse Administration" company_short = "Admin" - default_law_type = /datum/ai_laws/nanotrasen - lobby_screens = list('maps/ministation/ministation_lobby.png') overmap_ids = list(OVERMAP_ID_SPACE) diff --git a/maps/ministation/ministation_departments.dm b/maps/ministation/ministation_departments.dm index 06aa658ad79..206042093ee 100644 --- a/maps/ministation/ministation_departments.dm +++ b/maps/ministation/ministation_departments.dm @@ -1,78 +1,6 @@ -/decl/department/service - name = "Service" - announce_channel = "Service" - colour = "#88b764" - display_color = "#d0f0c0" - -/decl/department/command - name = "Command" - colour = "#800080" - display_priority = 5 - display_color = "#ccccff" - -/obj/machinery/network/pager - department = /decl/department/command - -/decl/department/civilian - name = "Civilian" - display_priority = 1 - display_color = "#dddddd" - -/decl/department/engineering - name = "Engineering" - announce_channel = "Engineering" - colour = "#ffa500" - display_priority = 2 - display_color = "#fff5cc" - -/decl/department/medical - name = "Medical" - goals = list(/datum/goal/department/medical_fatalities) - announce_channel = "Medical" - colour = "#008000" - display_priority = 3 - display_color = "#ffeef0" - -/obj/item/robot_module/medical - associated_department = /decl/department/medical - -/obj/machinery/network/pager/medical - department = /decl/department/medical - -/decl/department/science - name = "Science" - goals = list(/datum/goal/department/extract_slime_cores) - announce_channel = "Science" - colour = "#a65ba6" - display_color = "#e79fff" - -/obj/item/robot_module/research - associated_department = /decl/department/science - -/obj/machinery/network/pager/science - department = /decl/department/science - -/decl/department/security - name = "Security" - announce_channel = "Security" - colour = "#dd0000" - display_priority = 4 - display_color = "#ffddf0" - -/obj/item/robot_module/security - associated_department = /decl/department/security - -/obj/machinery/network/pager/security - department = /decl/department/security - -/decl/department/miscellaneous - name = "Misc" - display_priority = -1 - display_color = "#ccffcc" - /decl/department/tradehouse name = "Tradehouse" announce_channel = "Tradehouse" colour = "#b98f03" display_priority = 4 - display_color = "#ffddf0" \ No newline at end of file + display_color = "#ffddf0" diff --git a/maps/ministation/ministation_jobs.dm b/maps/ministation/ministation_jobs.dm index b8db846a435..17bb28b7b9e 100644 --- a/maps/ministation/ministation_jobs.dm +++ b/maps/ministation/ministation_jobs.dm @@ -1,25 +1,24 @@ /datum/map/ministation - default_job_type = /datum/job/ministation/assistant + default_job_type = /datum/job/standard/assistant/ministation default_department_type = /decl/department/civilian - id_hud_icons = 'maps/ministation/hud.dmi' allowed_jobs = list( - /datum/job/ministation/assistant, - /datum/job/ministation/bartender, - /datum/job/ministation/captain, - /datum/job/ministation/cargo, - /datum/job/ministation/robot, - /datum/job/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/security/head, - /datum/job/ministation/librarian, - /datum/job/ministation/tradehouse/rep + /datum/job/standard/assistant/ministation, + /datum/job/standard/bartender/ministation, + /datum/job/standard/captain/ministation, + /datum/job/standard/cargo_tech/ministation, + /datum/job/standard/robot, + /datum/job/standard/computer, + /datum/job/standard/detective/ministation, + /datum/job/standard/doctor/ministation, + /datum/job/standard/cmo/ministation, + /datum/job/standard/engineer/ministation, + /datum/job/standard/chief_engineer/ministation, + /datum/job/standard/hop/ministation, + /datum/job/standard/janitor/ministation, + /datum/job/standard/scientist/ministation, + /datum/job/standard/rd/ministation, + /datum/job/standard/officer/ministation, + /datum/job/standard/hos/ministation, + /datum/job/standard/librarian/ministation, + /datum/job/tradehouse_rep ) \ No newline at end of file diff --git a/maps/ministation/ministation_overrides.dm b/maps/ministation/ministation_overrides.dm index 508fbdaab31..709065f74aa 100644 --- a/maps/ministation/ministation_overrides.dm +++ b/maps/ministation/ministation_overrides.dm @@ -8,3 +8,7 @@ /datum/computer_file/program/wordprocessor, /datum/computer_file/program/supply ) + +// This has to be here rather than ministation_define.dm because it's from a modpack. +/datum/map/ministation + default_law_type = /datum/ai_laws/nanotrasen \ No newline at end of file diff --git a/maps/ministation/outfits/command.dm b/maps/ministation/outfits/command.dm index 20e77a64d8c..4ac5c896f09 100644 --- a/maps/ministation/outfits/command.dm +++ b/maps/ministation/outfits/command.dm @@ -14,12 +14,12 @@ backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/backpack/satchel/cap backpack_overrides[/decl/backpack_outfit/messenger_bag] = /obj/item/backpack/messenger/com -/decl/outfit/job/ministation/captain/post_equip(var/mob/living/human/H) +/decl/outfit/job/ministation/captain/post_equip(mob/living/wearer) ..() - if(H.get_age() > 20) + if(wearer.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) + var/obj/item/clothing/uniform = wearer.get_equipped_item(slot_w_uniform_str) if(istype(uniform)) var/obj/item/clothing/medal/gold/medal = new if(uniform.can_attach_accessory(medal)) diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 0e75223cde4..33b776920fb 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -3,45 +3,47 @@ #include "modpack_testing_lobby.dm" #include "blank.dmm" - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/deity/_deity.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/meteor/_meteor.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/tabloids/_tabloids.dme" - #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/byond_membership/_byond_membership.dm" #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" + #include "../../mods/content/fantasy/_fantasy.dme" #include "../../mods/content/generic_shuttles/_generic_shuttles.dme" #include "../../mods/content/government/_government.dme" + #include "../../mods/content/inertia/_inertia.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/shackles/_shackles.dme" + #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/pheromones/_pheromones.dme" - #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work - #include "../../mods/content/fantasy/_fantasy.dme" + #include "../../mods/content/item_sharpening/_item_sharpening.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" + #include "../../mods/species/drakes/_drakes.dme" #include "../../mods/species/neoavians/_neoavians.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/vox/_vox.dme" #define USING_MAP_DATUM /datum/map/modpack_testing diff --git a/maps/modpack_testing/modpack_testing_define.dm b/maps/modpack_testing/modpack_testing_define.dm index f5b09decd1f..8ed4837727c 100644 --- a/maps/modpack_testing/modpack_testing_define.dm +++ b/maps/modpack_testing/modpack_testing_define.dm @@ -4,3 +4,7 @@ path = "modpack_testing" allowed_latejoin_spawns = list() default_spawn = null + votable = FALSE + +/datum/map/modpack_testing/validate() + return TRUE // Do not check for level lists, this is not a playable map. diff --git a/maps/planets/test_planet/neutralia-2.dmm b/maps/planets/test_planet/neutralia-2.dmm index 8b5e82e76e8..cc84b991ea8 100644 --- a/maps/planets/test_planet/neutralia-2.dmm +++ b/maps/planets/test_planet/neutralia-2.dmm @@ -3,11 +3,11 @@ /turf/unsimulated/mineral, /area/exoplanet/underground/neutralia) "b" = ( -/turf/floor, +/turf/floor/barren, /area/exoplanet/underground/neutralia) "c" = ( /obj/abstract/level_data_spawner/neutralia/underground, -/turf/floor, +/turf/floor/barren, /area/exoplanet/underground/neutralia) (1,1,1) = {" diff --git a/maps/planets/test_planet/neutralia-3.dmm b/maps/planets/test_planet/neutralia-3.dmm index 768772a0f91..f7d1ff768ee 100644 --- a/maps/planets/test_planet/neutralia-3.dmm +++ b/maps/planets/test_planet/neutralia-3.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/floor, +/turf/floor/barren, /area/exoplanet/neutralia) "b" = ( /turf/unsimulated/mineral, @@ -17,15 +17,15 @@ /area/exoplanet/neutralia) "j" = ( /obj/abstract/landmark/exoplanet_spawn/large_plant, -/turf/floor, +/turf/floor/barren, /area/exoplanet/neutralia) "o" = ( /obj/abstract/landmark/exoplanet_spawn/animal, -/turf/floor, +/turf/floor/barren, /area/exoplanet/neutralia) "x" = ( /obj/abstract/landmark/exoplanet_spawn/plant, -/turf/floor, +/turf/floor/barren, /area/exoplanet/neutralia) (1,1,1) = {" diff --git a/maps/planets/test_planet/test_planet.dm b/maps/planets/test_planet/test_planet.dm index 159722fde19..83c42703e65 100644 --- a/maps/planets/test_planet/test_planet.dm +++ b/maps/planets/test_planet/test_planet.dm @@ -131,14 +131,14 @@ name = "neutralia surface" level_id = NEUTRALIA_SURFACE_LEVEL_ID base_area = /area/exoplanet/neutralia - base_turf = /turf/floor + base_turf = /turf/floor/barren border_filler = /turf/unsimulated/dark_filler /datum/level_data/planetoid/neutralia/underground name = "neutralia underground" level_id = "neutralia_underground" base_area = /area/exoplanet/underground/neutralia - base_turf = /turf/floor + base_turf = /turf/floor/barren border_filler = /turf/unsimulated/mineral /datum/level_data/planetoid/neutralia/underground/bottom diff --git a/maps/planets_testing/planets_testing_define.dm b/maps/planets_testing/planets_testing_define.dm index c82359943fd..8380842377f 100644 --- a/maps/planets_testing/planets_testing_define.dm +++ b/maps/planets_testing/planets_testing_define.dm @@ -3,8 +3,12 @@ full_name = "Planets Testing" path = "planets_testing" overmap_ids = list(OVERMAP_ID_SPACE) - allowed_latejoin_spawns = list() default_spawn = null + votable = FALSE + allowed_latejoin_spawns = list() + +/datum/map/planet_testing/validate() + return FALSE // Testing map, do not validate levels. // Set the observer spawn to include every flag so that CI flag checks pass. /decl/spawnpoint/observer diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm index 62b11f8ae72..7eb021cf0cb 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dm @@ -1,17 +1,17 @@ /datum/map_template/ruin/exoplanet/crashed_pod - name = "crashed survival pod" - description = "A crashed survival pod from a destroyed ship." - suffixes = list("crashed_pod/crashed_pod.dmm") - cost = 2 + name = "crashed survival pod" + description = "A crashed survival pod from a destroyed ship." + suffixes = list("crashed_pod/crashed_pod.dmm") + cost = 2 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_NO_RADS - template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_WRECK + template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_WRECK /area/map_template/crashed_pod - name = "\improper Crashed Survival Pod" + name = "\improper Crashed Survival Pod" icon_state = "blue" /decl/submap_archetype/crashed_pod - descriptor = "crashed survival pod" + name = "crashed survival pod" crew_jobs = list(/datum/job/submap/pod) /datum/submap/crashed_pod/sync_cell(var/obj/effect/overmap/visitable/cell) diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index 421efa39271..c7ef24bae56 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -55,18 +55,18 @@ pixel_x = -25 }, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/raisins, /obj/item/chems/drinks/glass2/fitnessflask, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ak" = ( @@ -77,8 +77,8 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "al" = ( @@ -88,21 +88,21 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "am" = ( /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "an" = ( /obj/machinery/atmospherics/omni/filter, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) @@ -110,16 +110,16 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /obj/item/chems/drinks/cans/speer, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "ap" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/vomit/mapped, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, /obj/structure/hygiene/toilet{ @@ -134,7 +134,7 @@ "aq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/hydrant{ pixel_x = -27; dir = 4 @@ -147,7 +147,7 @@ icon_state = "4-8" }, /obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "as" = ( @@ -160,7 +160,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/floor/tiled/techfloor, @@ -169,7 +169,7 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/power/smes/buildable{ charge = 50000; inputting = 1; @@ -182,13 +182,13 @@ dir = 8 }, /obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "av" = ( /obj/machinery/atmospherics/omni/filter, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -196,7 +196,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) @@ -217,7 +217,7 @@ /obj/machinery/door/airlock/engineering, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aB" = ( @@ -233,7 +233,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aD" = ( @@ -261,7 +261,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aG" = ( @@ -285,7 +285,7 @@ /obj/item/clothing/costume/savage_hunter, /obj/item/clothing/costume/savage_hunter/female, /obj/item/clothing/jumpsuit/wetsuit, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /obj/item/stock_parts/matter_bin/super, @@ -303,7 +303,7 @@ dir = 8 }, /obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aI" = ( @@ -313,8 +313,8 @@ /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/structure/curtain/open/shower/engineering, /obj/structure/hygiene/shower{ @@ -334,7 +334,7 @@ dir = 1 }, /obj/item/mop, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /obj/item/box/detergent, @@ -348,7 +348,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible/red{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/crashed_pod) "aM" = ( @@ -366,19 +366,19 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/cyan, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /obj/item/solar_assembly, /obj/item/solar_assembly, @@ -388,7 +388,7 @@ /area/map_template/crashed_pod) "aQ" = ( /obj/machinery/atmospherics/pipe/manifold/hidden, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aR" = ( @@ -407,7 +407,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -418,16 +418,16 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aV" = ( /obj/machinery/atmospherics/binary/pump{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aW" = ( @@ -435,7 +435,7 @@ dir = 1 }, /obj/machinery/portable_atmospherics/canister/empty, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aX" = ( @@ -443,14 +443,14 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/visible/red, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aY" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/civilian, /obj/machinery/atmospherics/pipe/simple/hidden/universal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "aZ" = ( @@ -462,13 +462,13 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "ba" = ( /obj/machinery/atmospherics/pipe/manifold/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bb" = ( @@ -479,7 +479,7 @@ "bc" = ( /obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor, /obj/structure/bed/chair/shuttle/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bd" = ( @@ -490,7 +490,7 @@ /obj/item/radio, /obj/item/radio, /obj/random/plushie, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "be" = ( @@ -502,7 +502,7 @@ pixel_x = -27; dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bf" = ( @@ -514,14 +514,14 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bg" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bh" = ( @@ -529,37 +529,37 @@ dir = 8 }, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bi" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bj" = ( /obj/structure/table/steel_reinforced, /obj/machinery/recharger, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/chems/drinks/glass2/coffeecup/metal, /turf/floor/tiled/dark/monotile, /area/map_template/crashed_pod) "bk" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bl" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bm" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/trash/liquidfood, /turf/floor/tiled/dark, @@ -569,12 +569,12 @@ dir = 4 }, /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bp" = ( @@ -603,7 +603,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bu" = ( @@ -627,7 +627,7 @@ /area/map_template/crashed_pod) "bw" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bx" = ( @@ -639,14 +639,14 @@ /obj/structure/bed/chair{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "by" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bz" = ( @@ -662,7 +662,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bB" = ( @@ -679,9 +679,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bD" = ( @@ -695,8 +695,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bF" = ( @@ -713,7 +713,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) @@ -745,13 +745,13 @@ /obj/machinery/light/small, /obj/effect/decal/cleanable/ash, /obj/item/trash/cigbutt/cigarbutt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bL" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bM" = ( @@ -782,7 +782,7 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bN" = ( @@ -793,10 +793,10 @@ /obj/effect/floor_decal/industrial/warning, /obj/structure/table/steel_reinforced, /obj/item/binoculars, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/candy/proteinbar, /obj/item/chems/drinks/cans/speer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bP" = ( @@ -830,16 +830,16 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bR" = ( /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/tastybread, /obj/item/geiger, /obj/item/geiger, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bS" = ( @@ -884,7 +884,7 @@ /obj/item/clothing/jumpsuit/orange, /obj/item/clothing/jumpsuit/blackjumpshorts, /obj/item/clothing/jumpsuit/black, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bV" = ( @@ -979,7 +979,7 @@ /obj/item/ashtray, /obj/item/paper_bin, /obj/item/chems/drinks/cans/speer, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/pen, /turf/floor/tiled/dark, /area/map_template/crashed_pod) diff --git a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm index f88a3a7043a..1552d243610 100644 --- a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm +++ b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm @@ -184,7 +184,7 @@ /turf/floor/tiled/white, /area/template_noop) "aM" = ( -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/item/chems/glass/paint/random, /obj/structure/closet/medical_wall/filled{ pixel_y = 32 diff --git a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm index 80a681620a6..c3b5df5467f 100644 --- a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm +++ b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm @@ -29,24 +29,24 @@ /turf/floor/wood, /area/template_noop) "h" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/board, /turf/floor/wood, /area/template_noop) "i" = ( /obj/item/flashlight/lamp/green, -/obj/structure/table/woodentable, +/obj/structure/table/wood, /turf/floor/carpet/green, /area/template_noop) "j" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/clothing/mask/smokable/pipe/cobpipe, /obj/item/chewables/rollable/generic, /obj/item/ashtray, /turf/floor/carpet/green, /area/template_noop) "k" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/utensil/fork/plastic, /obj/item/utensil/fork/plastic, /obj/item/utensil/fork/plastic, @@ -57,7 +57,7 @@ /turf/floor/tiled/monotile, /area/template_noop) "l" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/utensil/knife, /obj/item/utensil/knife, /obj/effect/floor_decal/spline/fancy/wood{ @@ -93,7 +93,7 @@ /turf/floor/wood, /area/template_noop) "q" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/book/manual/detective, /obj/item/ashtray, /obj/item/deck/cards, @@ -106,7 +106,7 @@ /turf/floor/wood, /area/template_noop) "s" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood/drip, @@ -126,7 +126,7 @@ /turf/floor/wood/usedup, /area/template_noop) "x" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/flashlight/lamp, /obj/effect/floor_decal/spline/fancy/wood, /turf/floor/tiled/monotile, @@ -154,7 +154,7 @@ /turf/floor/wood, /area/template_noop) "C" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/machinery/computer/central_atmos/laptop{ desc = "A cheap, beat-up old laptop."; name = "old laptop" diff --git a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm index 29714944a16..13485f43f12 100644 --- a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm +++ b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm @@ -3,11 +3,11 @@ /turf/template_noop, /area/template_noop) "ac" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /turf/template_noop, /area/template_noop) "ad" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/item/stack/material/sheet/reinforced/mapped/ocp, /turf/template_noop, /area/template_noop) diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index 624c04bfc64..c210e95884c 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -455,7 +455,7 @@ /area/map_template/colony/command) "bl" = ( /obj/structure/curtain/black, -/turf/floor/wood, +/turf/floor/laminate, /area/map_template/colony/command) "bm" = ( /obj/machinery/door/firedoor, @@ -922,7 +922,7 @@ /area/map_template/colony/atmospherics) "cf" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/emitter/gyrotron, /turf/floor/concrete, /area/template_noop) @@ -1415,7 +1415,7 @@ "dn" = ( /obj/structure/catwalk, /obj/machinery/rad_collector, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "do" = ( @@ -1466,7 +1466,7 @@ /area/map_template/colony) "ds" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "dt" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -1559,7 +1559,7 @@ /obj/item/clothing/head/cowboy_hat, /obj/item/clothing/head/cowboy_hat, /obj/item/clothing/suit/det_trench, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "dE" = ( /obj/machinery/door/firedoor, @@ -1576,7 +1576,7 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/surgery) "dG" = ( @@ -1635,7 +1635,7 @@ /area/map_template/colony/surgery) "dM" = ( /obj/structure/curtain/black, -/turf/floor/wood, +/turf/floor/laminate, /area/map_template/colony/dorms) "dN" = ( /obj/structure/table/steel_reinforced, @@ -1809,7 +1809,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "ee" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -1853,7 +1853,7 @@ "eh" = ( /obj/structure/catwalk, /obj/structure/closet/crate/solar_assembly, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ei" = ( @@ -1947,7 +1947,7 @@ dir = 8; icon_state = "bulb1" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "er" = ( /obj/machinery/atmospherics/pipe/simple/visible, @@ -2075,8 +2075,8 @@ /area/map_template/colony/messhall) "eD" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/command) "eE" = ( @@ -2228,7 +2228,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "eR" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -2256,7 +2256,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "eU" = ( /obj/machinery/atmospherics/pipe/manifold/visible{ @@ -2342,8 +2342,8 @@ /area/map_template/colony/medbay) "eZ" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "fa" = ( @@ -2361,7 +2361,7 @@ /area/map_template/colony) "fc" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "fd" = ( @@ -2377,7 +2377,7 @@ /turf/floor/tiled/techfloor/grid, /area/map_template/colony/engineering) "fe" = ( -/obj/structure/table/woodentable_reinforced, +/obj/structure/table/wood/reinforced, /obj/structure/flora/pottedplant/smallcactus{ pixel_y = 12 }, @@ -2387,7 +2387,7 @@ /obj/item/chems/condiment/small/peppermill, /obj/item/chems/condiment/small/saltshaker, /obj/item/chems/condiment/small/sugar, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "ff" = ( /obj/machinery/atmospherics/portables_connector{ @@ -2422,7 +2422,7 @@ dir = 8; icon_state = "bulb1" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "fk" = ( /obj/machinery/alarm{ @@ -2437,7 +2437,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 9 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fl" = ( /obj/machinery/meter, @@ -2474,7 +2474,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fo" = ( /obj/structure/bed/chair/comfy/brown{ @@ -2486,7 +2486,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fp" = ( /obj/structure/cable{ @@ -2557,7 +2557,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -2701,10 +2701,10 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fI" = ( -/obj/structure/table/woodentable_reinforced, +/obj/structure/table/wood/reinforced, /obj/item/box/fancy/donut, /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 @@ -2712,7 +2712,7 @@ /obj/item/chems/condiment/small/peppermill, /obj/item/chems/condiment/small/saltshaker, /obj/item/chems/condiment/small/sugar, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -2734,7 +2734,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 5 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fL" = ( /obj/machinery/door/firedoor, @@ -2973,7 +2973,7 @@ dir = 8 }, /obj/item/chems/drinks/pitcher, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "gc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3204,7 +3204,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/green, /area/map_template/colony/messhall) "gt" = ( @@ -3273,7 +3273,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "gB" = ( /obj/effect/floor_decal/techfloor{ @@ -3349,7 +3349,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "gJ" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -3411,7 +3411,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "gP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/carpet/green, /area/map_template/colony/messhall) "gQ" = ( @@ -3429,7 +3429,7 @@ /turf/floor/tiled/steel_ridged, /area/map_template/colony/airlock) "gR" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "playablecolonymain_pump_out_external" }, @@ -3487,7 +3487,7 @@ icon_state = "0-8" }, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "gZ" = ( /obj/machinery/atmospherics/unary/heat_exchanger{ @@ -3679,7 +3679,7 @@ "hs" = ( /obj/item/stool/bar/padded, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "ht" = ( /obj/effect/floor_decal/techfloor, @@ -3730,7 +3730,7 @@ dir = 1; pixel_y = -30 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "hy" = ( /obj/machinery/alarm{ @@ -3740,7 +3740,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "hz" = ( /obj/machinery/vending/cola{ @@ -3750,7 +3750,7 @@ }, /obj/machinery/light, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "hA" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -3802,7 +3802,7 @@ name = "hacked Getmore Chocolate Corp" }, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "hE" = ( /obj/machinery/vending/fitness{ @@ -3838,7 +3838,7 @@ /area/map_template/colony/messhall) "hI" = ( /obj/item/stool/bar/padded, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "hJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -3855,7 +3855,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/item/stool/bar/padded, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "hL" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3937,7 +3937,7 @@ /obj/structure/casino/roulette_chart{ density = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "hT" = ( /obj/machinery/power/apc{ @@ -3948,14 +3948,14 @@ /obj/structure/cable, /obj/item/stool/bar/padded, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "hU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/messhall) "hV" = ( /obj/machinery/door/firedoor, @@ -4085,7 +4085,7 @@ icon_state = "4-8" }, /obj/machinery/door/airlock/glass/civilian, -/turf/floor/wood, +/turf/floor/laminate, /area/map_template/colony/commons) "ih" = ( /obj/machinery/door/firedoor, @@ -4137,7 +4137,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "in" = ( /obj/effect/floor_decal/techfloor{ @@ -4472,14 +4472,14 @@ "iO" = ( /obj/structure/table/gamblingtable, /obj/item/ashtray/glass, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "iP" = ( /obj/structure/cable{ icon_state = "1-2" }, /obj/item/stool/bar/padded, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "iQ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4502,7 +4502,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 9 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "iS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4605,14 +4605,14 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jc" = ( /obj/structure/sign/warning/smoking{ pixel_y = -28 }, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jd" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, @@ -4633,7 +4633,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jf" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -4699,7 +4699,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 5 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jk" = ( /obj/structure/hygiene/toilet{ @@ -4708,7 +4708,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/white/monotile, /area/map_template/colony/bathroom) "jl" = ( @@ -4724,8 +4724,8 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jm" = ( /obj/effect/floor_decal/techfloor, @@ -4796,8 +4796,8 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, -/turf/floor/wood/walnut, +/obj/effect/decal/cleanable/dirt/visible, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jt" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -4809,7 +4809,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "ju" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4817,7 +4817,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -4825,7 +4825,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jw" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -4927,7 +4927,7 @@ dir = 1; pixel_y = -30 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jF" = ( /obj/machinery/door/airlock/civilian, @@ -4937,7 +4937,7 @@ /obj/structure/table/gamblingtable, /obj/machinery/light, /obj/effect/floor_decal/spline/fancy/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "jH" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -4981,7 +4981,7 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/messhall) "jL" = ( @@ -5200,7 +5200,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 6 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/commons) "kb" = ( /obj/effect/floor_decal/techfloor{ @@ -5556,7 +5556,7 @@ /obj/item/clothing/webbing/drop_pouches/brown, /obj/item/clothing/webbing/drop_pouches/white, /obj/item/clothing/webbing/drop_pouches/white, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "kI" = ( /obj/machinery/door/airlock/hatch, @@ -5586,11 +5586,11 @@ /obj/effect/floor_decal/industrial/loading{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kM" = ( @@ -5598,7 +5598,7 @@ id_tag = "playablecolony_crematorium" }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "kN" = ( @@ -5607,7 +5607,7 @@ pixel_y = 25; req_access = list() }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table/steel_reinforced, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/recharger, @@ -5713,15 +5713,15 @@ /area/map_template/colony/airlock) "kZ" = ( /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 8 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "la" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lb" = ( @@ -5771,7 +5771,7 @@ /area/map_template/colony) "lg" = ( /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lh" = ( @@ -5792,7 +5792,7 @@ id_tag = "colonymine" }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_ridged, /area/map_template/colony/mineralprocessing) "lj" = ( @@ -5839,7 +5839,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lo" = ( @@ -5879,7 +5879,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lu" = ( @@ -5890,12 +5890,12 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lv" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lw" = ( @@ -5934,8 +5934,8 @@ dir = 8 }, /obj/structure/table/steel_reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lA" = ( @@ -5946,7 +5946,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lB" = ( @@ -5976,7 +5976,7 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lD" = ( @@ -5984,7 +5984,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lG" = ( @@ -6026,8 +6026,8 @@ /turf/floor/tiled/white, /area/map_template/colony/bathroom) "lJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/embedded_controller/radio/airlock/airlock_controller{ cycle_to_external_air = 1; id_tag = "playablecolonymain"; @@ -6070,7 +6070,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ id_tag = "playablecolonymain_pump"; power_rating = 25000 @@ -6127,7 +6127,7 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "lR" = ( @@ -6142,7 +6142,7 @@ name = "Colonial suit cycler"; req_access = list() }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "lS" = ( @@ -6150,13 +6150,13 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lT" = ( /obj/structure/catwalk, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lU" = ( @@ -6164,15 +6164,15 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lV" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "lW" = ( @@ -6205,7 +6205,7 @@ /area/map_template/colony) "lX" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/item/radio/intercom{ dir = 8; @@ -6232,8 +6232,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "ma" = ( @@ -6256,8 +6256,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -6268,8 +6268,8 @@ /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) @@ -6319,7 +6319,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mh" = ( @@ -6329,7 +6329,7 @@ /obj/machinery/door/airlock/external{ id_tag = "playablecolonymain_interior_door" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mi" = ( @@ -6353,7 +6353,7 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ml" = ( @@ -6385,8 +6385,8 @@ /obj/structure/railing/mapped{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mo" = ( @@ -6422,14 +6422,14 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) "ms" = ( /obj/effect/floor_decal/techfloor{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/binary/pump/high_power/on{ dir = 8; target_pressure = 500 @@ -6521,8 +6521,8 @@ name = "Hard Equipment Storage"; pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/command) "mD" = ( @@ -6683,19 +6683,19 @@ /obj/effect/floor_decal/techfloor{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mP" = ( /obj/structure/table/steel_reinforced, /obj/machinery/cell_charger, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/flashlight/lamp/floodlamp, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped, /obj/structure/railing/mapped{ dir = 8 @@ -6711,7 +6711,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony) "mS" = ( -/obj/structure/table/woodentable_reinforced, +/obj/structure/table/wood/reinforced, /obj/effect/floor_decal/techfloor{ dir = 6 }, @@ -6789,7 +6789,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, @@ -7208,9 +7208,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; id_tag = "playablecolonymain_pump_out_internal"; @@ -7262,8 +7262,8 @@ icon_state = "4-8" }, /obj/machinery/light, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; id_tag = "playablecolonymain_pump"; @@ -7283,7 +7283,7 @@ /obj/effect/floor_decal/industrial/warning{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 1; id_tag = "playablecolonymain_pump"; @@ -7306,7 +7306,7 @@ dir = 8; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/floor/tiled/techfloor/grid, /area/map_template/colony/airlock) @@ -7348,7 +7348,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "ob" = ( @@ -7361,7 +7361,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "oc" = ( @@ -7374,7 +7374,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ dir = 8; pixel_x = 22 @@ -7388,43 +7388,43 @@ /obj/effect/floor_decal/industrial/loading{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oe" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "of" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "og" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oh" = ( /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oi" = ( /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/warning/dust, /obj/structure/rack, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/tool/pickaxe, /obj/item/tool/pickaxe, /obj/item/tool/shovel, @@ -7506,9 +7506,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7520,9 +7520,9 @@ dir = 1 }, /obj/effect/floor_decal/industrial/warning/dust, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7539,9 +7539,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) @@ -7560,7 +7560,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "oq" = ( @@ -7568,7 +7568,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "or" = ( @@ -7579,7 +7579,7 @@ /obj/structure/sign/warning/high_voltage{ pixel_y = 28 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "os" = ( @@ -7587,7 +7587,7 @@ icon_state = "4-8" }, /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "ot" = ( @@ -7595,16 +7595,16 @@ /obj/machinery/light/spot{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/map_template/colony/hydroponics) "ou" = ( /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -7621,8 +7621,8 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -7646,9 +7646,9 @@ /obj/effect/floor_decal/industrial/warning/dust{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/high_volume/external_air{ dir = 8; id_tag = "playablecolonymain_pump_out_internal"; @@ -7661,38 +7661,38 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold/hidden{ dir = 1 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 5 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden, /obj/structure/catwalk, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/dust{ dir = 4 }, /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "oC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 5 }, @@ -7814,8 +7814,8 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "vt" = ( @@ -7894,7 +7894,7 @@ dir = 4; pixel_x = -22 }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "GU" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -7936,9 +7936,9 @@ /obj/structure/railing/mapped{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/concrete, /area/template_noop) "Kn" = ( @@ -7954,7 +7954,7 @@ /area/map_template/colony/hydroponics) "Kz" = ( /obj/structure/catwalk, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light/spot{ dir = 1 }, @@ -8003,7 +8003,7 @@ /area/map_template/colony/hydroponics) "Nh" = ( /obj/structure/curtain/black, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/map_template/colony/dorms) "Og" = ( /obj/machinery/portable_atmospherics/canister/oxygen, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm index e27736fd251..d0b72f2445f 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm @@ -1,18 +1,18 @@ #include "../../../../mods/mobs/dionaea/_dionaea.dme" /datum/map_template/ruin/exoplanet/playablecolony - name = "established colony" - description = "a fully functional colony on the frontier of settled space" - suffixes = list("playablecolony/colony.dmm") - cost = 2 + name = "established colony" + description = "a fully functional colony on the frontier of settled space" + suffixes = list("playablecolony/colony.dmm") + cost = 2 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_NO_RADS - template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_HABITAT + template_tags = TEMPLATE_TAG_HUMAN|TEMPLATE_TAG_HABITAT apc_test_exempt_areas = list( /area/map_template/colony/mineralprocessing = NO_SCRUBBER|NO_VENT ) /decl/submap_archetype/playablecolony - descriptor = "established colony" + name = "established colony" crew_jobs = list(/datum/job/submap/colonist) /datum/job/submap/colonist diff --git a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm index dd4f13ac109..c3c28c3bdc9 100644 --- a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm +++ b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm @@ -83,7 +83,7 @@ /obj/effect/decal/cleanable/blood, /obj/item/shard, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /turf/floor/tiled/techfloor, /area/template_noop) "q" = ( @@ -242,7 +242,7 @@ /obj/effect/spider/stickyweb, /obj/random/voidsuit, /obj/random/loot, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/structure/extinguisher_cabinet{ pixel_x = -29; dir = 4 diff --git a/maps/random_ruins/space_ruins/space_ruins.dm b/maps/random_ruins/space_ruins/space_ruins.dm index 6310e536a7e..460f5a6995a 100644 --- a/maps/random_ruins/space_ruins/space_ruins.dm +++ b/maps/random_ruins/space_ruins/space_ruins.dm @@ -5,6 +5,7 @@ material = /decl/material/solid/gemstone/diamond /datum/map_template/ruin/space + abstract_type = /datum/map_template/ruin/space template_categories = list(MAP_TEMPLATE_CATEGORY_SPACE) prefix = "maps/random_ruins/space_ruins/" cost = 1 diff --git a/maps/shaded_hills/areas/_areas.dm b/maps/shaded_hills/areas/_areas.dm index b33bf376d84..e31eff6ce28 100644 --- a/maps/shaded_hills/areas/_areas.dm +++ b/maps/shaded_hills/areas/_areas.dm @@ -20,13 +20,6 @@ ) sound_env = GENERIC ambience = list() - var/list/additional_fishing_results - -/area/shaded_hills/Initialize() - if(additional_fishing_results) - for(var/fish in additional_fishing_results) - fishing_results[fish] = additional_fishing_results[fish] - . = ..() /area/shaded_hills/outside name = "\improper Grasslands" diff --git a/maps/shaded_hills/areas/grassland.dm b/maps/shaded_hills/areas/grassland.dm index 46c25332644..803f9a5e920 100644 --- a/maps/shaded_hills/areas/grassland.dm +++ b/maps/shaded_hills/areas/grassland.dm @@ -34,12 +34,15 @@ color = COLOR_BLUE description = "The soft susurration of running water mingles with the hum of insects and croak of frogs." area_blurb_category = /area/shaded_hills/outside/river - additional_fishing_results = list( + +/area/shaded_hills/outside/river/get_additional_fishing_results() + var/static/list/additional_fishing_results = list( /mob/living/simple_animal/aquatic/fish/large = 5, /mob/living/simple_animal/aquatic/fish/large/salmon = 5, /mob/living/simple_animal/aquatic/fish/large/trout = 5, /mob/living/simple_animal/aquatic/fish/large/pike = 3 ) + return additional_fishing_results /area/shaded_hills/caves name = "\improper Deep Tunnels" @@ -53,6 +56,16 @@ area_blurb_category = /area/shaded_hills/caves sound_env = CAVE area_flags = AREA_FLAG_IS_BACKGROUND + fishing_results = list( + /mob/living/simple_animal/aquatic/fish/large/cave = 13, + /mob/living/simple_animal/aquatic/fish/large/lantern = 7, + /obj/item/mollusc = 5, + /obj/item/mollusc/barnacle/fished = 5, + /obj/item/mollusc/clam/fished/pearl = 3, + /obj/item/trash/mollusc_shell/clam = 1, + /obj/item/trash/mollusc_shell/barnacle = 1, + /obj/item/trash/mollusc_shell = 1 + ) /area/shaded_hills/caves/deep name = "\improper Deep Caverns" diff --git a/maps/shaded_hills/areas/woods.dm b/maps/shaded_hills/areas/woods.dm index 0fd8dca0685..73c262300a6 100644 --- a/maps/shaded_hills/areas/woods.dm +++ b/maps/shaded_hills/areas/woods.dm @@ -4,13 +4,16 @@ /area/shaded_hills/outside/river/lake name = "Woodland Lake" - additional_fishing_results = list( - /mob/living/simple_animal/aquatic/fish/large/bass = 5, - /mob/living/simple_animal/aquatic/fish/large/trout = 5, - /mob/living/simple_animal/aquatic/fish/large/javelin = 5, - /mob/living/simple_animal/hostile/aquatic/carp = 3, - /mob/living/simple_animal/aquatic/fish/large/koi = 1 + +/area/shaded_hills/outside/river/lake/get_additional_fishing_results() + var/static/list/additional_fishing_results = list( + /mob/living/simple_animal/aquatic/fish/large/bass = 5, + /mob/living/simple_animal/aquatic/fish/large/trout = 5, + /mob/living/simple_animal/aquatic/fish/large/javelin = 5, + /mob/living/simple_animal/hostile/aquatic/carp = 3, + /mob/living/simple_animal/aquatic/fish/large/koi = 1 ) + return additional_fishing_results /area/shaded_hills/outside/woods name = "Woodlands" diff --git a/maps/shaded_hills/icons/hud.dmi b/maps/shaded_hills/icons/hud.dmi deleted file mode 100644 index c8c2fcf8bd1..00000000000 Binary files a/maps/shaded_hills/icons/hud.dmi and /dev/null differ diff --git a/maps/shaded_hills/jobs/_jobs.dm b/maps/shaded_hills/jobs/_jobs.dm index 638c6ff7bf5..7eb2719f661 100644 --- a/maps/shaded_hills/jobs/_jobs.dm +++ b/maps/shaded_hills/jobs/_jobs.dm @@ -1,6 +1,5 @@ /datum/map/shaded_hills - id_hud_icons = 'maps/shaded_hills/icons/hud.dmi' - allowed_jobs = list( + allowed_jobs = list( /datum/job/shaded_hills/visitor/traveller, /datum/job/shaded_hills/visitor/traveller/learned, /datum/job/shaded_hills/visitor/beggar_knight, @@ -48,6 +47,7 @@ /datum/job/shaded_hills abstract_type = /datum/job/shaded_hills + hud_icon_state = "hudblank" department_types = list( /decl/department/shaded_hills/locals ) diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index 9150072af91..dc2d59ddcc5 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -1,11 +1,11 @@ /obj/abstract/map_data/shaded_hills height = 2 -/datum/level_data/player_level/shaded_hills +/datum/level_data/main_level/shaded_hills use_global_exterior_ambience = FALSE base_area = null base_turf = /turf/floor/dirt - abstract_type = /datum/level_data/player_level/shaded_hills + abstract_type = /datum/level_data/main_level/shaded_hills ambient_light_level = 1 ambient_light_color = "#f3e6ca" strata = /decl/strata/shaded_hills @@ -16,10 +16,6 @@ daycycle_type = /datum/daycycle/shaded_hills daycycle_id = "daycycle_shaded_hills" template_edge_padding = 0 // we use a strictly delineated subarea, no need for this guard - var/submap_budget = 0 - var/submap_category = null - var/submap_area - var/list/mobs_to_spawn = list() /datum/daycycle/shaded_hills cycle_duration = 2 HOURS // 1 hour of daylight, 1 hour of night @@ -29,33 +25,7 @@ time_in_cycle = rand(cycle_duration) ..() -/datum/level_data/player_level/shaded_hills/get_subtemplate_areas(template_category, blacklist, whitelist) - return submap_area ? (islist(submap_area) ? submap_area : list(submap_area)) : null - -/datum/level_data/player_level/shaded_hills/get_subtemplate_budget() - return submap_budget - -/datum/level_data/player_level/shaded_hills/get_subtemplate_category() - return submap_category - -/datum/level_data/player_level/shaded_hills/after_generate_level() - . = ..() - if(length(mobs_to_spawn)) - for(var/list/mob_category in mobs_to_spawn) - var/list/mob_types = mob_category[1] - var/mob_turf = mob_category[2] - var/mob_count = mob_category[3] - var/sanity = 1000 - while(mob_count && sanity) - sanity-- - var/turf/place_mob_at = locate(rand(level_inner_min_x, level_inner_max_x), rand(level_inner_min_y, level_inner_max_y), level_z) - if(istype(place_mob_at, mob_turf) && !(locate(/mob/living) in place_mob_at)) - var/mob_type = pickweight(mob_types) - new mob_type(place_mob_at) - mob_count-- - CHECK_TICK - -/datum/level_data/player_level/shaded_hills/grassland +/datum/level_data/main_level/shaded_hills/grassland name = "Shaded Hills - Grassland" level_id = "shaded_hills_grassland" level_generators = list( @@ -68,11 +38,12 @@ "shaded_hills_swamp" = SOUTH, "shaded_hills_downlands" = EAST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_GRASSLAND - submap_area = /area/shaded_hills/outside/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND + subtemplate_area = /area/shaded_hills/outside/poi - mobs_to_spawn = list( +/datum/level_data/main_level/shaded_hills/grassland/get_mobs_to_populate_level() + var/static/list/mobs_to_spawn = list( list( list( /mob/living/simple_animal/passive/mouse = 9, @@ -85,9 +56,9 @@ 10 ) ) + return mobs_to_spawn - -/datum/level_data/player_level/shaded_hills/swamp +/datum/level_data/main_level/shaded_hills/swamp name = "Shaded Hills - Swamp" level_id = "shaded_hills_swamp" connected_levels = list( @@ -97,11 +68,12 @@ /datum/random_map/noise/shaded_hills/swamp, /datum/random_map/noise/forage/shaded_hills/swamp ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_SWAMP - submap_area = /area/shaded_hills/outside/swamp/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP + subtemplate_area = /area/shaded_hills/outside/swamp/poi - mobs_to_spawn = list( +/datum/level_data/main_level/shaded_hills/swamp/get_mobs_to_populate_level() + var/static/list/mobs_to_spawn = list( list( list( /mob/living/simple_animal/passive/mouse = 6, @@ -127,8 +99,9 @@ 10 ) ) + return mobs_to_spawn -/datum/level_data/player_level/shaded_hills/woods +/datum/level_data/main_level/shaded_hills/woods name = "Shaded Hills - Woods" level_id = "shaded_hills_woods" connected_levels = list( @@ -138,11 +111,12 @@ /datum/random_map/noise/shaded_hills/woods, /datum/random_map/noise/forage/shaded_hills/woods ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_WOODS - submap_area = /area/shaded_hills/outside/woods/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_WOODS + subtemplate_area = /area/shaded_hills/outside/woods/poi - mobs_to_spawn = list( +/datum/level_data/main_level/shaded_hills/woods/get_mobs_to_populate_level() + var/static/list/mobs_to_spawn = list( list( list( /mob/living/simple_animal/passive/mouse = 6, @@ -162,8 +136,9 @@ 5 ) ) + return mobs_to_spawn -/datum/level_data/player_level/shaded_hills/downlands +/datum/level_data/main_level/shaded_hills/downlands name = "Shaded Hills - Downlands" level_id = "shaded_hills_downlands" level_generators = list( @@ -173,50 +148,50 @@ connected_levels = list( "shaded_hills_grassland" = WEST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS - submap_area = /area/shaded_hills/outside/downlands/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS + subtemplate_area = /area/shaded_hills/outside/downlands/poi -/datum/level_data/player_level/shaded_hills/caverns +/datum/level_data/main_level/shaded_hills/caverns name = "Shaded Hills - Caverns" level_id = "shaded_hills_caverns" connected_levels = list( "shaded_hills_dungeon" = EAST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_CAVERNS - submap_area = /area/shaded_hills/caves/deep/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS + subtemplate_area = /area/shaded_hills/caves/deep/poi level_generators = list( /datum/random_map/automata/cave_system/shaded_hills, /datum/random_map/noise/ore/rich ) base_turf = /turf/floor/rock/basalt -/datum/level_data/player_level/shaded_hills/dungeon +/datum/level_data/main_level/shaded_hills/dungeon name = "Shaded Hills - Dungeon" level_id = "shaded_hills_dungeon" connected_levels = list( "shaded_hills_caverns" = WEST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_DUNGEON - submap_area = /area/shaded_hills/caves/dungeon/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON + subtemplate_area = /area/shaded_hills/caves/dungeon/poi base_turf = /turf/floor/rock/basalt /obj/abstract/level_data_spawner/shaded_hills_grassland - level_data_type = /datum/level_data/player_level/shaded_hills/grassland + level_data_type = /datum/level_data/main_level/shaded_hills/grassland /obj/abstract/level_data_spawner/shaded_hills_swamp - level_data_type = /datum/level_data/player_level/shaded_hills/swamp + level_data_type = /datum/level_data/main_level/shaded_hills/swamp /obj/abstract/level_data_spawner/shaded_hills_woods - level_data_type = /datum/level_data/player_level/shaded_hills/woods + level_data_type = /datum/level_data/main_level/shaded_hills/woods /obj/abstract/level_data_spawner/shaded_hills_downlands - level_data_type = /datum/level_data/player_level/shaded_hills/downlands + level_data_type = /datum/level_data/main_level/shaded_hills/downlands /obj/abstract/level_data_spawner/shaded_hills_caverns - level_data_type = /datum/level_data/player_level/shaded_hills/caverns + level_data_type = /datum/level_data/main_level/shaded_hills/caverns /obj/abstract/level_data_spawner/shaded_hills_dungeon - level_data_type = /datum/level_data/player_level/shaded_hills/dungeon + level_data_type = /datum/level_data/main_level/shaded_hills/dungeon diff --git a/maps/shaded_hills/outfits/_outfits.dm b/maps/shaded_hills/outfits/_outfits.dm index e4de3be1343..49b61a0ec63 100644 --- a/maps/shaded_hills/outfits/_outfits.dm +++ b/maps/shaded_hills/outfits/_outfits.dm @@ -4,13 +4,14 @@ id_type = null pda_type = null l_ear = null - uniform = /obj/item/clothing/pants/trousers/jerkin shoes = /obj/item/clothing/shoes/craftable/boots + uniform = list( + /obj/item/clothing/pants/trousers, + /obj/item/clothing/shirt/jerkin + ) backpack_contents = list( /obj/item/rock/flint/striker, /obj/item/bladed/folding/iron, /obj/item/flame/torch ) - l_pocket = /obj/item/rock/flint/striker - r_pocket = /obj/item/bladed/folding/iron outfit_flags = OUTFIT_HAS_BACKPACK | OUTFIT_EXTENDED_SURVIVAL diff --git a/maps/shaded_hills/outfits/shrine.dm b/maps/shaded_hills/outfits/shrine.dm index 1df7dd8b0a9..4f47ac02e62 100644 --- a/maps/shaded_hills/outfits/shrine.dm +++ b/maps/shaded_hills/outfits/shrine.dm @@ -11,4 +11,4 @@ /decl/outfit/job/shaded_hills/shrine/keeper name = "Shaded Hills - Shrine Keeper" suit = /obj/item/clothing/suit/mantle - mask = /obj/item/clothing/neck/necklace/prayer_beads/basalt + mask = /obj/item/clothing/neck/prayer_beads/basalt diff --git a/maps/shaded_hills/outfits/visitors.dm b/maps/shaded_hills/outfits/visitors.dm index 5d89949bbff..ca0204ce1a7 100644 --- a/maps/shaded_hills/outfits/visitors.dm +++ b/maps/shaded_hills/outfits/visitors.dm @@ -8,7 +8,7 @@ backpack_contents = list( /obj/item/stack/medical/bandage/crafted/five = 1, /obj/item/stack/medical/ointment/crafted/five = 1, - /obj/item/chems/waterskin/crafted/wine = 1 + /obj/item/chems/glass/waterskin/crafted/wine = 1 ) /decl/outfit/job/shaded_hills/traveller/scholar diff --git a/maps/shaded_hills/shaded_hills-dungeon.dmm b/maps/shaded_hills/shaded_hills-dungeon.dmm index e9cfce36153..6d1ab918e6f 100644 --- a/maps/shaded_hills/shaded_hills-dungeon.dmm +++ b/maps/shaded_hills/shaded_hills-dungeon.dmm @@ -21,11 +21,11 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "ce" = ( -/obj/structure/table/woodentable_reinforced/ebony/walnut, +/obj/structure/table/wood/reinforced/ebony/walnut, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "cp" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bladed/knife, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -42,13 +42,13 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "dP" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/flame/torch, /obj/item/flame/torch, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "dT" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/knife/kitchen/cleaver/bronze, /turf/floor/path/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -57,10 +57,14 @@ /turf/floor/path/basalt/water/deep, /area/shaded_hills/caves/dungeon/poi) "fD" = ( -/obj/structure/table/woodentable_reinforced/ebony/walnut, +/obj/structure/table/wood/reinforced/ebony/walnut, /obj/item/ancient_surgery/bonesaw, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) +"fF" = ( +/obj/random/dungeon_bookcase, +/turf/floor/rock/basalt, +/area/shaded_hills/caves/dungeon/poi) "fW" = ( /obj/structure/bed/chair/bench/ebony{ dir = 8 @@ -69,11 +73,11 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "gy" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "hd" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/stack/material/brick/mapped/graphite/fifteen, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -133,12 +137,12 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "kI" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/flame/candle, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "kL" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/bladed/folding, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -191,24 +195,24 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "nJ" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/food/grown/dried_tobacco/fine, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "nT" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/stack/material/ore/diamond, /obj/item/stack/material/ore/diamond, /obj/item/stack/material/ore/diamond, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "nV" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bladed/folding, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "ob" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bladed/knife, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -284,7 +288,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "rP" = ( -/obj/structure/table/woodentable_reinforced/ebony/walnut, +/obj/structure/table/wood/reinforced/ebony/walnut, /obj/item/ancient_surgery/forceps, /obj/item/ancient_surgery/retractor, /turf/floor/path/running_bond/basalt, @@ -323,7 +327,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "vN" = ( -/obj/structure/table/woodentable_reinforced/ebony/walnut, +/obj/structure/table/wood/reinforced/ebony/walnut, /obj/item/remains/human, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -345,7 +349,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "wP" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/tool/hammer, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -364,7 +368,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "yM" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/tool/pickaxe/iron, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -372,7 +376,7 @@ /obj/structure/wall_sconce{ dir = 8 }, -/obj/structure/table/woodentable_reinforced/ebony/walnut, +/obj/structure/table/wood/reinforced/ebony/walnut, /obj/item/ancient_surgery/bonesetter, /obj/item/ancient_surgery/sutures, /turf/floor/path/running_bond/basalt, @@ -400,7 +404,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "BG" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/stack/material/thread/mapped/cotton/thirty, /obj/item/bladed/knife, /turf/floor/path/running_bond/basalt, @@ -430,7 +434,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "DW" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bladed/folding, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -457,13 +461,11 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Gu" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /turf/floor/path/basalt, /area/shaded_hills/caves/dungeon/poi) "GA" = ( /obj/structure/door/ebony, -/obj/structure/door/ebony, -/obj/structure/door/ebony, /obj/abstract/landmark/lock_preset{ lock_preset_id = "sunken keep"; name = "sunken keep locked door" @@ -478,7 +480,7 @@ /turf/floor/path/basalt/water, /area/shaded_hills/caves/dungeon/poi) "Hs" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/flame/candle, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -486,13 +488,13 @@ /turf/floor/rock/basalt, /area/shaded_hills/caves/dungeon) "HO" = ( -/obj/structure/table/woodentable_reinforced/ebony/walnut, +/obj/structure/table/wood/reinforced/ebony/walnut, /obj/item/ancient_surgery/cautery, /obj/item/ancient_surgery/scalpel, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Ie" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -532,7 +534,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Ky" = ( -/obj/structure/bookcase/ebony, +/obj/random/dungeon_bookcase, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Kz" = ( @@ -543,12 +545,12 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/inn) "Ln" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/tool/hammer/sledge, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "LB" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "ME" = ( @@ -559,7 +561,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "MW" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/rock/flint/striker, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -571,7 +573,7 @@ /turf/floor/mud/water, /area/shaded_hills/caves/dungeon/poi) "Oq" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "Pb" = ( @@ -602,7 +604,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Rm" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/stack/material/ore/diamond, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -650,7 +652,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Vk" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/food/grown/dried_tobacco/bad, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -667,7 +669,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "Yi" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/stack/material/thread/mapped/dried_gut/thirty, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) @@ -18051,7 +18053,7 @@ Ky Ky bD bD -Ua +fF Ky bD bD @@ -18200,11 +18202,11 @@ Ky bD Ua Ky +Ky bD bD -bD -Ua -Ua +fF +fF bD ok bD @@ -18351,12 +18353,12 @@ Ky Ky bD Ua -Ua -bD +fF +Ky bD Ua hU -Ua +fF bD bD bD @@ -18503,12 +18505,12 @@ Ky Ky Ua bD -bD +Ky hU Ua bD hU -Ua +fF Ua bD bD diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index b52be725117..3adbafa7443 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -67,7 +67,7 @@ /area/shaded_hills/outside) "kr" = ( /obj/item/tool/pickaxe/iron, -/obj/item/tool/axe, +/obj/item/tool/axe/iron, /obj/abstract/exterior_marker/inside, /obj/structure/closet/crate/chest/ebony, /turf/floor/woven, @@ -110,14 +110,14 @@ "nl" = ( /obj/structure/door/walnut, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "oo" = ( /obj/item/stack/material/ore/handful/sand, /turf/floor/rock/basalt, /area/shaded_hills/outside) "pU" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/rock/hematite, /obj/item/rock/flint, /obj/item/flame/torch, @@ -125,17 +125,25 @@ /obj/item/bag/sack, /turf/floor/woven, /area/shaded_hills/caves/unexplored/south) +"qj" = ( +/obj/abstract/force_fluid_flow/north, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river) "qy" = ( /turf/wall/natural/basalt/shaded_hills, /area/shaded_hills/caves/river) "se" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/basket, /turf/floor/woven, /area/shaded_hills/caves/unexplored/south) "sS" = ( /turf/floor/mud/water, /area/shaded_hills/caves/unexplored/south) +"sT" = ( +/obj/abstract/force_fluid_flow/north, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river) "te" = ( /turf/unsimulated/mask, /area/shaded_hills/caves/unexplored/south) @@ -144,7 +152,7 @@ /area/shaded_hills/caves/unexplored) "ul" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "vX" = ( /turf/floor/path/running_bond/basalt, @@ -159,7 +167,7 @@ /turf/floor/dirt, /area/shaded_hills/outside) "xC" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside) "yA" = ( /obj/abstract/landmark/latejoin/observer, @@ -188,7 +196,7 @@ /turf/floor/woven, /area/shaded_hills/outside) "EE" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river) "EL" = ( /obj/abstract/exterior_marker/inside, @@ -19512,7 +19520,7 @@ Gh Gh My My -My +sT lC lC lC @@ -19529,8 +19537,8 @@ lC lC lC lC -My -My +qj +sT My Gh Gh @@ -19572,12 +19580,12 @@ My My My My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT My My My @@ -19662,9 +19670,9 @@ Gh Gh Gh My -My -My -My +sT +sT +sT lC lC lC @@ -19681,9 +19689,9 @@ lC lC lC lC -My -My -My +sT +sT +sT My My Gh @@ -19717,23 +19725,23 @@ Gh Gh My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My Gh @@ -19753,14 +19761,14 @@ JN My My My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -19771,15 +19779,15 @@ My Gh My My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -19814,9 +19822,9 @@ My My My My -My -My -My +sT +sT +sT lC lC lC @@ -19833,11 +19841,11 @@ lC lC lC lC -My -My -My -My -My +sT +sT +sT +sT +sT My My Gh @@ -19867,27 +19875,27 @@ Gh Gh My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -19901,38 +19909,38 @@ Gh Xd vX Xd +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -19960,15 +19968,15 @@ My My My My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT lC lC lC @@ -19986,12 +19994,12 @@ lC lC lC My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT My My My @@ -20017,6 +20025,13 @@ Gh Gh Gh My +sT +sT +sT +sT +sT +sT +sT My My My @@ -20028,20 +20043,13 @@ My My My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT My My My @@ -20053,42 +20061,42 @@ My Xd vX Xd -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -20107,19 +20115,19 @@ My My My My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My lC lC @@ -20140,15 +20148,15 @@ lC Gh My My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -20170,10 +20178,10 @@ Gh Gh My My -My -My -My -My +sT +sT +sT +sT My My Gh @@ -20190,57 +20198,57 @@ Gh My My My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT EE EE Xd -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -20252,21 +20260,21 @@ zp zp Gh My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -20299,18 +20307,18 @@ My My My My +sT +sT +sT +sT +sT +sT +sT My My My -My -My -My -My -My -My -My -My -My +sT +sT My Gh Gh @@ -20345,38 +20353,38 @@ Gh My My My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT JN EE EE EE JN +sT +sT My My My +sT +sT +sT My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh My @@ -20404,14 +20412,14 @@ zp Gh Gh My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -20456,14 +20464,14 @@ My My My My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -20501,15 +20509,15 @@ My My My My -My -My -My -My -My +sT +sT +sT +sT +sT EE vX EE -My +sT My My Gh @@ -20524,9 +20532,9 @@ My My My My -My -My -My +sT +sT +sT My My Gh diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 0f8e896ad49..7dc097ab79b 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -24,7 +24,7 @@ /area/shaded_hills/outside/downlands) "bu" = ( /obj/structure/table/desk/dresser, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "bv" = ( /obj/structure/bed/chair/rustic{ @@ -37,7 +37,7 @@ /turf/floor/path/basalt, /area/shaded_hills/general_store) "bW" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/skillet/iron, /obj/item/chems/glass/handmade/bowl/wood, /obj/item/chems/glass/handmade/bowl/wood, @@ -45,14 +45,14 @@ /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "cl" = ( -/obj/structure/table/woodentable/ebony, -/turf/floor/wood/walnut, +/obj/structure/table/wood/ebony, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "cq" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/bowl/wood, /turf/floor/wood/walnut, /area/shaded_hills/inn) @@ -61,10 +61,6 @@ unique_merge_identifier = "outer wall" }, /area/shaded_hills/outside/downlands) -"cy" = ( -/obj/structure/reagent_dispensers/barrel/ebony/water, -/turf/floor/wood/walnut, -/area/shaded_hills/shrine/kitchen) "cT" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 1 @@ -92,12 +88,12 @@ /turf/wall/log/walnut/shutter, /area/shaded_hills/general_store) "dK" = ( -/obj/structure/table/woodentable/ebony, -/turf/floor/wood/walnut, +/obj/structure/table/wood/ebony, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "dL" = ( /obj/structure/reagent_dispensers/barrel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "dN" = ( /obj/structure/wall_sconce/lantern{ @@ -111,7 +107,7 @@ /area/shaded_hills/shrine) "eD" = ( /obj/structure/working/loom/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "eG" = ( /obj/structure/door/walnut, @@ -149,11 +145,11 @@ /turf/wall/brick/basalt/shutter, /area/shaded_hills/slaughterhouse) "fK" = ( -/obj/structure/reagent_dispensers/barrel/ebony/water, +/obj/structure/cask_rack/large/mapped, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "fR" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "fS" = ( /obj/structure/table/marble, @@ -180,14 +176,14 @@ /turf/floor/path/basalt, /area/shaded_hills/slaughterhouse) "ge" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "gg" = ( /obj/structure/wall_sconce/lantern{ dir = 4 }, -/obj/structure/table/woodentable/ebony, -/turf/floor/wood/walnut, +/obj/structure/table/wood/ebony, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "gn" = ( /obj/item/flame/candle/handmade, @@ -204,7 +200,7 @@ /obj/structure/wall_sconce/lantern{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "gA" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -216,7 +212,7 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "gL" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, @@ -250,7 +246,7 @@ /obj/structure/bed/chair/bench/ebony{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "hu" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -260,7 +256,7 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "hE" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -271,7 +267,7 @@ /area/shaded_hills/outside/downlands) "hJ" = ( /obj/item/stool/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "hU" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -284,10 +280,10 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "id" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/bottle/beer, /obj/item/chems/glass/handmade/bottle/beer, /obj/item/chems/glass/handmade/bottle/beer, @@ -317,6 +313,12 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) +"iJ" = ( +/obj/structure/wall_sconce/lantern{ + dir = 4 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/shrine) "iK" = ( /turf/wall/brick/basalt{ unique_merge_identifier = "shrine wall" @@ -333,17 +335,17 @@ /obj/structure/wall_sconce/lantern{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jk" = ( /obj/structure/bed/chair/bench/pew/mahogany{ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/cleric, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "js" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jx" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -361,7 +363,7 @@ "jA" = ( /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jI" = ( /obj/structure/wall_sconce/lantern{ @@ -385,11 +387,11 @@ /obj/structure/banner_frame/wall/ebony/green{ pixel_y = 32 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "kE" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "kI" = ( /obj/structure/bed/chair/bench/pew/ebony{ @@ -398,7 +400,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/inn) "lz" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/knife/kitchen/cleaver/bronze, /turf/floor/path/basalt, /area/shaded_hills/slaughterhouse) @@ -409,7 +411,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "lE" = ( /obj/abstract/level_data_spawner/shaded_hills_downlands, @@ -423,7 +425,7 @@ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "me" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -440,15 +442,15 @@ /turf/floor/dirt, /area/shaded_hills/outside/downlands) "ml" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/shears, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "mG" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "mJ" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -458,8 +460,14 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) +"mK" = ( +/obj/structure/door/walnut{ + dir = 4 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "nn" = ( /turf/wall/log/walnut, /area/shaded_hills/stable) @@ -481,7 +489,7 @@ /turf/floor/carpet/rustic, /area/shaded_hills/inn) "nN" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/chems/glass/bucket/wood, /turf/floor/path/basalt, /area/shaded_hills/slaughterhouse) @@ -511,10 +519,10 @@ /obj/structure/bed/chair/bench/pew/mahogany{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "pi" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/stack/medical/ointment/crafted/five, /obj/item/stack/medical/bandage/crafted/five, /turf/floor/path/herringbone/basalt, @@ -526,19 +534,19 @@ /obj/structure/bed/simple/ebony, /obj/abstract/landmark/start/shaded_hills/shrine_attendant, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "qf" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "qG" = ( /turf/wall/brick/basalt, /area/shaded_hills/inn) "qL" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/ancient_surgery/bonesetter, /obj/item/ancient_surgery/retractor, /obj/item/ancient_surgery/sutures, @@ -557,10 +565,10 @@ }, /area/shaded_hills/outside/downlands/poi) "ra" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "rc" = ( /obj/structure/railing/mapped/wooden/walnut, @@ -587,7 +595,7 @@ /turf/floor/carpet, /area/shaded_hills/inn) "rv" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/bottle, /obj/item/chems/glass/handmade/bottle/tall, /obj/item/chems/glass/handmade/bottle/wide, @@ -600,7 +608,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "rC" = ( /obj/structure/table/marble, @@ -618,7 +626,7 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "rY" = ( /obj/effect/floor_decal/spline/fancy/wood/corner/walnut, @@ -629,12 +637,16 @@ /obj/abstract/landmark/lock_preset/shaded_hills/inn_interior, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) +"sz" = ( +/obj/structure/door/walnut, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/shrine) "sJ" = ( /obj/structure/closet/cabinet/wooden/ebony, /turf/floor/wood/walnut, /area/shaded_hills/inn) "sM" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /turf/floor/wood/walnut, /area/shaded_hills/general_store) "th" = ( @@ -651,7 +663,7 @@ /obj/effect/floor_decal/spline/fancy/wood/walnut{ dir = 1 }, -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/chems/glass/handmade/cup/wood, /turf/floor/wood/walnut, /area/shaded_hills/inn) @@ -676,7 +688,7 @@ /obj/structure/bed/chair/rustic{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "uk" = ( /obj/structure/bed/chair/bench/pew/ebony{ @@ -714,13 +726,13 @@ dir = 1; pixel_y = 10 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "vz" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/baking_dish/earthenware, /obj/item/chems/cooking_vessel/baking_dish/earthenware, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "vA" = ( /obj/structure/table/marble, @@ -735,7 +747,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/inn) "wg" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/ancient_surgery/bonesaw, /obj/item/ancient_surgery/forceps, /turf/floor/path/herringbone/basalt, @@ -759,16 +771,12 @@ /obj/structure/closet/crate/chest/ebony, /turf/floor/path/basalt, /area/shaded_hills/general_store) -"wA" = ( -/obj/abstract/exterior_marker/inside, -/turf/floor/dirt, -/area/shaded_hills/outside/downlands) "xh" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/condiment/large/salt, /obj/item/chems/condiment/flour, /obj/item/chems/condiment/sugar, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "xk" = ( /obj/structure/flora/tree/dead/mahogany, @@ -793,7 +801,7 @@ /area/shaded_hills/outside/downlands) "ya" = ( /obj/structure/reagent_dispensers/barrel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yn" = ( /obj/structure/door/walnut, @@ -811,7 +819,7 @@ /obj/item/seeds/extracted/cabbage, /obj/item/seeds/extracted/cabbage, /obj/item/seeds/extracted/cabbage, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "yx" = ( /obj/structure/table/marble, @@ -826,11 +834,11 @@ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yN" = ( /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "yY" = ( /turf/floor/grass, @@ -870,7 +878,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/inn) "zQ" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "Ak" = ( /turf/floor/path/basalt, @@ -882,7 +890,8 @@ /area/shaded_hills/inn) "Aq" = ( /obj/structure/working/loom/ebony, -/turf/floor/wood/walnut, +/obj/structure/wall_sconce/lantern, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "Aw" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -909,9 +918,9 @@ /turf/floor/path/basalt, /area/shaded_hills/shrine) "AG" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bag/sack, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "AW" = ( /obj/structure/railing/mapped/wooden/walnut, @@ -922,11 +931,11 @@ /obj/structure/wall_sconce/lantern{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "Bp" = ( /obj/structure/working/butter_churn/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "Br" = ( /turf/floor/path/basalt, @@ -939,10 +948,6 @@ "By" = ( /turf/floor/grass, /area/shaded_hills/outside/shrine) -"BD" = ( -/obj/structure/reagent_dispensers/barrel/ebony/wine, -/turf/floor/wood/walnut, -/area/shaded_hills/shrine/kitchen) "BG" = ( /obj/structure/bed/chair/bench/ebony{ dir = 1 @@ -960,7 +965,7 @@ /area/shaded_hills/general_store) "BX" = ( /obj/structure/wall_sconce/lantern, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "Cj" = ( /obj/item/stack/material/log/mapped/walnut/twenty, @@ -972,10 +977,13 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine/kitchen) "CR" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, +/area/shaded_hills/shrine) +"CV" = ( +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Dl" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "Dn" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -987,7 +995,7 @@ /obj/item/seeds/extracted/wheat, /obj/item/seeds/extracted/wheat, /obj/item/seeds/extracted/wheat, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "Dr" = ( /obj/structure/bed/simple/ebony/cloth, @@ -998,7 +1006,7 @@ /obj/structure/bed/simple/ebony/cloth, /obj/abstract/landmark/start/shaded_hills/shrine_keeper, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Ee" = ( /turf/wall/log/walnut, @@ -1023,7 +1031,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/inn) "Ev" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/structure/wall_sconce/lantern{ dir = 1; pixel_y = 10; @@ -1043,12 +1051,18 @@ dir = 4; start_lit = 1 }, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) "EV" = ( /turf/floor/path/basalt, /area/shaded_hills/outside/downlands) +"Ff" = ( +/obj/structure/wall_sconce/lantern{ + dir = 8 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/shrine/kitchen) "FD" = ( /obj/structure/reagent_dispensers/barrel/ebony, /obj/item/seeds/extracted/rice, @@ -1084,7 +1098,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "Gj" = ( -/obj/structure/table/woodentable_reinforced/mahogany, +/obj/structure/table/wood/reinforced/mahogany, /turf/floor/carpet/red, /area/shaded_hills/shrine) "Gq" = ( @@ -1095,7 +1109,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "Gu" = ( /obj/structure/table/marble, @@ -1107,7 +1121,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "Gw" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/bag/sack, /turf/floor/path/basalt, /area/shaded_hills/slaughterhouse) @@ -1155,7 +1169,7 @@ /area/shaded_hills/stable) "HF" = ( /obj/structure/working/spinning_wheel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "HI" = ( /turf/floor/grass, @@ -1177,7 +1191,7 @@ /obj/item/flame/candle/handmade{ pixel_y = 12 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "Ic" = ( /turf/floor/path/running_bond/basalt, @@ -1186,7 +1200,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Im" = ( /obj/structure/wall_sconce/lantern{ @@ -1194,14 +1208,10 @@ }, /turf/floor/wood/walnut, /area/shaded_hills/inn) -"Iz" = ( -/obj/abstract/exterior_marker/inside, -/turf/wall/brick/basalt, -/area/shaded_hills/outside/downlands) "IB" = ( /obj/structure/door/walnut, /obj/abstract/landmark/lock_preset/shaded_hills/shrine, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "IC" = ( /obj/structure/bookcase/ebony, @@ -1211,7 +1221,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "IQ" = ( /turf/wall/log/walnut/shutter/open, @@ -1248,11 +1258,11 @@ /area/shaded_hills/inn) "Jt" = ( /obj/structure/closet/cabinet/wooden/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Jw" = ( /obj/structure/bed/chair/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Jz" = ( /obj/structure/door/walnut{ @@ -1262,19 +1272,20 @@ /turf/floor/wood/walnut, /area/shaded_hills/inn) "JK" = ( -/obj/structure/table/woodentable_reinforced/mahogany, +/obj/structure/table/wood/reinforced/mahogany, /obj/item/flame/candle/handmade, /turf/floor/carpet/red, /area/shaded_hills/shrine) "JM" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/ancient_surgery/cautery, /obj/item/ancient_surgery/scalpel, +/obj/structure/wall_sconce/lantern, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) "JU" = ( /obj/structure/railing/mapped/wooden/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Ka" = ( /mob/living/simple_animal/cow, @@ -1305,8 +1316,7 @@ /turf/floor/path/basalt, /area/shaded_hills/outside/downlands) "Lj" = ( -/obj/structure/reagent_dispensers/well/mapped, -/obj/abstract/exterior_marker/inside, +/obj/structure/reagent_dispensers/well/mapped/covered, /turf/floor/dirt, /area/shaded_hills/outside/downlands) "Ly" = ( @@ -1317,9 +1327,9 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) "LH" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/bucket/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "LK" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1357,6 +1367,9 @@ pixel_x = 12; pixel_y = 8 }, +/obj/item/hourglass{ + pixel_y = 12 + }, /turf/floor/carpet, /area/shaded_hills/inn) "MT" = ( @@ -1367,14 +1380,14 @@ /turf/open, /area/shaded_hills/inn/kitchen) "NF" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) "NH" = ( /turf/unsimulated/mask, /area/shaded_hills/outside/downlands/poi) "NZ" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/bottle/tall/wine, /obj/item/chems/glass/handmade/bottle/tall/wine, /obj/item/chems/glass/handmade/bottle/tall/wine, @@ -1389,9 +1402,9 @@ /turf/floor/path/basalt, /area/shaded_hills/slaughterhouse) "Ot" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/pot/iron, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "ON" = ( /obj/structure/table/marble, @@ -1423,7 +1436,7 @@ /area/shaded_hills/stable) "PG" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "PQ" = ( /obj/item/food/butchery/meat/beef, @@ -1435,7 +1448,7 @@ /area/shaded_hills/slaughterhouse) "PS" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) "Qb" = ( /turf/floor/carpet, @@ -1463,7 +1476,7 @@ dir = 8; start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "QQ" = ( /turf/wall/log/walnut, @@ -1472,7 +1485,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 4 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/general_store/porch) "QW" = ( /turf/floor/path/herringbone/basalt, @@ -1535,11 +1548,11 @@ /obj/structure/bed/chair/rustic{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Sy" = ( /obj/structure/working/spinning_wheel/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "SB" = ( /obj/structure/door/walnut{ @@ -1592,7 +1605,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/farmhouse) "Tr" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/effect/floor_decal/spline/fancy/wood/walnut{ dir = 1 }, @@ -1607,13 +1620,13 @@ /turf/floor/dirt, /area/shaded_hills/outside/downlands) "TM" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/food/grown/potato, /obj/item/food/grown/potato, /obj/item/food/grown/carrot, /obj/item/food/grown/carrot, /obj/item/food/grown/cabbage, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "TR" = ( /turf/floor/dirt, @@ -1623,10 +1636,15 @@ /obj/abstract/landmark/lock_preset/shaded_hills/shrine, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) +"Ue" = ( +/obj/structure/door/walnut, +/obj/abstract/landmark/lock_preset/shaded_hills/farmhouse, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "UD" = ( /obj/item/flame/candle/handmade, /obj/structure/table/end/alt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "US" = ( /obj/structure/bed/chair/rustic{ @@ -1647,8 +1665,8 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) "VE" = ( -/obj/structure/reagent_dispensers/barrel/ebony/beer, -/turf/floor/wood/walnut, +/obj/structure/cask_rack/large/mapped, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "VM" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1656,11 +1674,14 @@ }, /turf/floor/dirt, /area/shaded_hills/outside/shrine) +"VO" = ( +/turf/floor/wood/rough/walnut, +/area/shaded_hills/farmhouse) "VU" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse/porch) "VW" = ( /obj/structure/table/marble, @@ -1676,10 +1697,10 @@ /turf/wall/log/walnut, /area/shaded_hills/general_store) "Wh" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) "Wk" = ( /obj/structure/railing/mapped/wooden/walnut{ @@ -1688,7 +1709,7 @@ /turf/floor/straw, /area/shaded_hills/stable) "Wl" = ( -/obj/structure/table/woodentable_reinforced/ebony, +/obj/structure/table/wood/reinforced/ebony, /obj/item/chems/glass/handmade/cup/wood, /obj/effect/floor_decal/spline/fancy/wood/walnut{ dir = 1 @@ -1703,7 +1724,7 @@ /obj/structure/railing/mapped/wooden/walnut{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "WE" = ( /obj/structure/reagent_dispensers/barrel/ebony, @@ -1743,7 +1764,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "WY" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /turf/floor/wood/walnut, /area/shaded_hills/inn) "Xr" = ( @@ -1761,7 +1782,7 @@ pixel_y = 10; start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/mahogany, /area/shaded_hills/shrine) "XM" = ( /turf/floor/carpet/red, @@ -1773,7 +1794,7 @@ /turf/wall/brick/basalt, /area/shaded_hills/shrine) "Yg" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Yj" = ( /obj/structure/meat_hook, @@ -7805,9 +7826,9 @@ HI HI HI TR -Iz -Iz -Iz +TR +TR +TR TR TR EV @@ -7957,9 +7978,9 @@ HI HI TR TR -wA -wA -wA +TR +TR +TR TR TR EV @@ -8109,9 +8130,9 @@ HI HI TR TR -wA +TR Lj -wA +TR TR TR EV @@ -8261,9 +8282,9 @@ HI HI TR TR -wA -wA -wA +TR +TR +TR TR TR TR @@ -8413,9 +8434,9 @@ HI HI HI TR -Iz -Iz -Iz +TR +TR +TR TR TR EV @@ -13288,8 +13309,8 @@ EV TR LN cl -qP -qP +VO +VO yN LN TR @@ -13441,7 +13462,7 @@ TR IQ LH yJ -qP +VO yN LN TR @@ -13592,8 +13613,8 @@ EV TR LN ml -qP -qP +VO +VO gB LN TR @@ -13744,8 +13765,8 @@ EV TR LN AG -qP -qP +VO +VO ya LN zH @@ -13896,7 +13917,7 @@ VU VU LN LN -Ti +mK LN LN LN @@ -14047,8 +14068,8 @@ Ic Dl BX LN -qP -qP +VO +VO hJ Bp IQ @@ -14198,12 +14219,12 @@ EV EV Dl Dl -WO -qP -qP -qP -qP -WO +Ue +VO +VO +VO +VO +Ue TR Rl GW @@ -14352,9 +14373,9 @@ Dl lL LN hJ -qP -qP -qP +VO +VO +VO LN xW Rl @@ -18705,7 +18726,7 @@ By iK QB Dt -CR +CV QB QB QB @@ -18857,13 +18878,13 @@ By iK QB Jt -CR -PG -CR -CR -AX -CR -CR +CV +sz +CV +CV +iJ +CV +CV IB CR CR @@ -19163,10 +19184,10 @@ iK kv kv Kh -CR +CV rS QB -CR +CV rS QB CR @@ -19622,7 +19643,7 @@ RG dx QW ge -ge +Ff ge QB CR @@ -20379,9 +20400,9 @@ iK kv By px -cy +ge VE -BD +ge Sy Aq QB diff --git a/maps/shaded_hills/shaded_hills-swamp.dmm b/maps/shaded_hills/shaded_hills-swamp.dmm index a4aa7292a65..bbd09a8b228 100644 --- a/maps/shaded_hills/shaded_hills-swamp.dmm +++ b/maps/shaded_hills/shaded_hills-swamp.dmm @@ -3,7 +3,7 @@ /turf/wall/log/walnut/shutter/open, /area/shaded_hills/witch_hut) "bg" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "cE" = ( /turf/floor/mud/water, @@ -12,7 +12,7 @@ /obj/structure/bed/chair/wood/ebony{ dir = 8 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "fG" = ( /obj/item/seeds/extracted/aloe, @@ -27,7 +27,7 @@ /obj/item/seeds/extracted/yarrow, /obj/item/seeds/extracted/yarrow, /obj/item/seeds/extracted/yarrow, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "hT" = ( /turf/floor/mud/water/deep, @@ -55,7 +55,7 @@ /obj/structure/closet/crate/chest/ebony, /obj/item/rock/hematite, /obj/item/rock/flint, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "oF" = ( /turf/unsimulated/dark_filler, @@ -65,7 +65,7 @@ /area/shaded_hills/caves/swamp) "pl" = ( /obj/structure/drying_rack/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "rP" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, @@ -86,7 +86,7 @@ start_lit = 1 }, /obj/structure/table/end/alt/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "vZ" = ( /turf/floor/mud/water, @@ -110,7 +110,7 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/path/basalt, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "BY" = ( /obj/machinery/portable_atmospherics/hydroponics/soil, @@ -118,7 +118,7 @@ /area/shaded_hills/outside/swamp) "Dh" = ( /obj/item/stool/rustic, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Do" = ( /turf/unsimulated/dark_filler, @@ -130,19 +130,19 @@ /turf/unsimulated/mask, /area/shaded_hills/outside/swamp) "Hi" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/teapot, /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/handmade/cup/wood, /obj/item/chems/glass/bucket/wood, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Ic" = ( /turf/floor/clay, /area/shaded_hills/outside/river/swamp) "KA" = ( /obj/abstract/landmark/start/shaded_hills/herbalist, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "LF" = ( /turf/wall/natural/basalt/shaded_hills, @@ -156,7 +156,7 @@ /area/shaded_hills/outside/swamp) "SE" = ( /obj/structure/door/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Ty" = ( /obj/abstract/landmark/start/shaded_hills/traveller, @@ -172,7 +172,7 @@ /obj/structure/table/desk/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "Vl" = ( /obj/structure/wall_sconce/lantern{ @@ -180,7 +180,7 @@ start_lit = 1 }, /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) "VA" = ( /turf/wall/brick/basalt, @@ -198,7 +198,7 @@ /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, /obj/abstract/landmark/start/shaded_hills/herbalist, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/witch_hut) (1,1,1) = {" diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 569bfe9a2d1..06a9695d634 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -9,7 +9,7 @@ /area/shaded_hills/outside/woods) "cN" = ( /obj/item/bladed/knife, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "dp" = ( /turf/wall/log/walnut, @@ -41,7 +41,7 @@ /turf/wall/natural/basalt/shaded_hills, /area/shaded_hills/caves/river/woods) "lb" = ( -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "lC" = ( /turf/unsimulated/dark_filler, @@ -54,7 +54,7 @@ /area/shaded_hills/outside/river/lake) "mo" = ( /obj/structure/door/walnut, -/turf/floor/path/basalt, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "nl" = ( /turf/wall/natural/basalt/shaded_hills, @@ -71,16 +71,13 @@ "te" = ( /turf/floor/rock/basalt, /area/shaded_hills/outside/woods) -"ul" = ( -/turf/floor/mud/water, -/area/shaded_hills/outside/river/woods) "uA" = ( /turf/unsimulated/dark_filler, /area/shaded_hills/outside/river/woods) "wD" = ( /obj/item/fishing_rod, /obj/structure/table/end/alt/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "xn" = ( /turf/unsimulated/mask, @@ -99,7 +96,7 @@ /area/shaded_hills/caves/unexplored/woods) "AN" = ( /obj/structure/railing/mapped/wooden/walnut, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river/woods) "Co" = ( /obj/abstract/landmark/start/shaded_hills/traveller/learned, @@ -112,6 +109,9 @@ "DX" = ( /turf/floor/mud/water/deep, /area/shaded_hills/caves/river/woods) +"En" = ( +/turf/floor/mud/water, +/area/shaded_hills/outside/river/woods) "ES" = ( /turf/floor/grass, /area/shaded_hills/outside/river/woods) @@ -124,7 +124,7 @@ "Fz" = ( /obj/structure/fire_source/stove, /obj/item/stack/material/log/mapped/walnut/ten, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "GB" = ( /turf/floor/carpet/rustic, @@ -139,17 +139,17 @@ /obj/structure/bed/simple/ebony, /obj/item/bedsheet/furs, /obj/abstract/landmark/start/shaded_hills/forester, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "JI" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/outside/river/woods) "JJ" = ( /obj/structure/meat_hook, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "LJ" = ( /turf/floor/path/running_bond/basalt, @@ -159,7 +159,7 @@ /obj/item/stack/material/bundle/grass/dry{ amount = 5 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "My" = ( /turf/floor/grass, @@ -168,24 +168,25 @@ /obj/structure/wall_sconce/lantern{ start_lit = 1 }, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "MU" = ( /turf/wall/log/walnut/shutter/open, /area/shaded_hills/forester_hut) "Oi" = ( /obj/structure/closet/crate/chest/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "PO" = ( +/obj/abstract/force_fluid_flow/north, /turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) +/area/shaded_hills/outside/river/lake) "SI" = ( /turf/wall/log/walnut, /area/shaded_hills/forester_hut) "TP" = ( /obj/structure/table/desk/dresser/ebony, -/turf/floor/wood/walnut, +/turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "Uz" = ( /obj/effect/departure_signpost/north, @@ -199,6 +200,10 @@ /obj/abstract/landmark/start/shaded_hills/traveller, /turf/floor/barren, /area/shaded_hills/caves/woods) +"Wo" = ( +/obj/abstract/force_fluid_flow/north, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "Xt" = ( /turf/floor/mud, /area/shaded_hills/caves/woods) @@ -209,6 +214,9 @@ "YO" = ( /turf/unsimulated/mask, /area/shaded_hills/outside/river/woods) +"Zo" = ( +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "Zs" = ( /obj/structure/wall_sconce/lantern{ dir = 1; @@ -15657,11 +15665,11 @@ zp zp zp zp -ul -ul -ul -ul -ul +En +En +En +En +En zp zp zp @@ -15806,21 +15814,21 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -15953,29 +15961,29 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp kx kx @@ -16103,32 +16111,32 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En dp JI AN @@ -16254,34 +16262,34 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En JI AN zp @@ -16405,35 +16413,35 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En JI AN zp @@ -16556,39 +16564,39 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En JI AN -ul +En zp zp zp @@ -16707,41 +16715,41 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +En +En +En +En +En +En dp JI AN dp -ul +En zp zp zp @@ -16857,44 +16865,44 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +En +En +En +En JI AN -ul -ul -ul +En +En +En zp zp zp @@ -17008,45 +17016,45 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +En JI AN -ul -ul -ul +En +En +En zp zp zp @@ -17158,49 +17166,49 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo JI AN -ul -ul -ul -ul -ul +En +En +En +En +En zp zp zp @@ -17310,50 +17318,50 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo dp JI AN dp -ul -ul -ul -ul -ul +En +En +En +En +En zp zp zp @@ -17460,54 +17468,54 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +En +En +Zo +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo JI AN -PO -ul -ul -ul -ul -ul -ul -ul +Zo +En +En +En +En +En +En +En zp zp zp @@ -17611,57 +17619,57 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo JI AN -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul +Zo +En +En +En +En +En +En +En +En +En zp zp zp @@ -17748,7 +17756,7 @@ ma ma ma ma -ul +En zp zp zp @@ -17762,60 +17770,60 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo JI AN -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Wo +Zo +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -17834,9 +17842,9 @@ zp zp zp zp -ul -ul -ul +En +En +En zp zp zp @@ -17901,9 +17909,9 @@ ma ma ma ma -ul -ul -ul +En +En +En zp zp zp @@ -17913,63 +17921,63 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo dp JI AN dp -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Wo +Zo +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -17983,15 +17991,15 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En zp zp zp @@ -18053,78 +18061,78 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En +En +En zp zp zp zp zp -ul -ul -ul -ul -PO -PO -PO -PO -PO +En +En +En +En +Zo +Wo +Wo +Wo +Wo JI AN -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -18132,19 +18140,19 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -18206,40 +18214,40 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -18250,55 +18258,55 @@ zp zp zp zp -ul -ul -ul -ul -PO -PO -PO -PO +En +En +En +En +Zo +Zo +Wo +Wo JI AN -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp uA @@ -18359,37 +18367,37 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En zp zp zp @@ -18402,56 +18410,56 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -PO -PO +En +En +En +En +En +En +Zo +Zo JI AN -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp uA uA @@ -18512,35 +18520,35 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -18555,56 +18563,56 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En dp JI AN dp -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En uA uA uA @@ -18664,34 +18672,34 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -18707,56 +18715,56 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En JI AN -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +Zo +En +En +En +En +En +En +En +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +En +En +En +En +En +En +En +En +En +En uA uA uA @@ -18817,30 +18825,30 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En zp zp zp @@ -18861,54 +18869,54 @@ zp zp zp zp -ul -ul -ul -ul -ul +En +En +En +En +En JI AN -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +En +En +En +En +En +En uA uA uA @@ -18969,30 +18977,30 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En zp zp zp @@ -19014,53 +19022,53 @@ zp zp zp zp -ul -ul -ul -ul +En +En +En +En JI AN -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +En +En +En uA uA uA @@ -19112,8 +19120,8 @@ hT hT hT hT -hT -hT +PO +PO hT hT ma @@ -19122,28 +19130,28 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En zp zp zp @@ -19168,51 +19176,51 @@ zp zp zp zp -ul +En dp JI AN dp -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo uA uA uA @@ -19262,40 +19270,40 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -ma -ma -ma -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO PO PO PO PO PO PO -ul -ul -ul -ul -ul +hT +hT +hT +ma +ma +ma +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En zp zp zp @@ -19324,47 +19332,47 @@ zp zp JI AN -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo uA uA uA @@ -19413,24 +19421,6 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -ul -ul -ul -PO -PO PO PO PO @@ -19441,12 +19431,30 @@ PO PO PO PO -ul -ul -ul -ul -ul -ul +hT +hT +hT +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -19477,46 +19485,46 @@ zp JI AN zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -ul -ul -ul -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Zo +En +En +En +Zo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo uA uA uA @@ -19564,20 +19572,6 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT PO PO PO @@ -19592,12 +19586,26 @@ PO PO PO PO -ul -ul -ul -ul -ul -ul +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -19631,44 +19639,44 @@ AN zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo uA uA uA @@ -19716,20 +19724,6 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT PO PO PO @@ -19743,13 +19737,27 @@ PO PO PO PO -ul -ul -ul -ul -ul -ul -ul +PO +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En zp zp zp @@ -19784,43 +19792,43 @@ dp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO +En +En +En +En +En +En +En +Zo +Zo +Wo uA uA uA @@ -19868,20 +19876,6 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT PO PO PO @@ -19894,13 +19888,27 @@ PO PO PO PO -ul -ul -ul -ul -ul -ul -ul +PO +PO +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En zp zp zp @@ -19940,16 +19948,16 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -19965,14 +19973,14 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -PO +En +En +En +En +En +En +En +Zo uA uA uA @@ -20020,19 +20028,6 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT PO PO PO @@ -20044,14 +20039,27 @@ PO PO PO PO -ul -ul -ul -ul -ul -ul -ul -ul +PO +PO +Wo +Wo +Zo +Zo +Zo +Wo +Wo +Wo +Zo +Zo +Zo +En +En +En +En +En +En +En +En zp zp zp @@ -20095,9 +20103,9 @@ zp zp zp zp -ul -ul -ul +En +En +En zp zp zp @@ -20119,12 +20127,12 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En uA uA uA @@ -20173,36 +20181,36 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT PO PO -ul -ul -ul PO PO PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +PO +PO +PO +PO +PO +hT +hT +Zo +Zo +En +En +En +Zo +Zo +Zo +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20273,10 +20281,10 @@ zp zp zp zp -ul -ul -ul -ul +En +En +En +En uA uA uA @@ -20326,35 +20334,35 @@ hT hT hT hT +PO +PO +PO +PO +PO hT hT hT hT hT -hT -hT -hT -hT -hT -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20427,8 +20435,8 @@ zp zp zp zp -ul -ul +En +En uA uA uA @@ -20480,7 +20488,7 @@ hT hT hT hT -hT +PO hT hT ma @@ -20488,24 +20496,24 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20639,23 +20647,23 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20791,22 +20799,22 @@ ma ma ma ma -ul -ul -ul +En +En +En zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20942,8 +20950,8 @@ ma ma ma ma -ul -ul +En +En zp zp zp @@ -20951,9 +20959,9 @@ zp zp zp zp -ul -ul -ul +En +En +En zp zp zp @@ -21093,8 +21101,8 @@ ma ma ma ma -ul -ul +En +En zp zp zp @@ -21244,7 +21252,7 @@ ma ma ma ma -ul +En zp zp zp diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index 139e602c13b..ae5cb32e946 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -1,9 +1,11 @@ #if !defined(USING_MAP_DATUM) #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work + #include "../../mods/content/item_sharpening/_item_sharpening.dme" #include "../../mods/content/fantasy/_fantasy.dme" #include "areas/_areas.dm" @@ -19,18 +21,6 @@ #include "jobs/visitors.dm" #include "jobs/wilderness.dm" - #include "submaps/_submaps.dm" - #include "submaps/downlands/_downlands.dm" - #include "submaps/grassland/_grassland.dm" - #include "submaps/swamp/_swamp.dm" - #include "submaps/woods/_woods.dm" - #include "submaps/woods/bear_den/bear_den.dm" - #include "submaps/woods/chemistry_shack/chemistry_shack.dm" - #include "submaps/woods/fairy_rings/fairy_rings.dm" - #include "submaps/woods/fox_den/fox_den.dm" - #include "submaps/woods/hunter_camp/hunter_camp.dm" - #include "submaps/woods/old_cabin/old_cabin.dm" - #include "levels/_levels.dm" #include "levels/random_map.dm" #include "levels/strata.dm" diff --git a/maps/shaded_hills/shaded_hills_currency.dm b/maps/shaded_hills/shaded_hills_currency.dm index f1c06d4735e..7c3efd6cbea 100644 --- a/maps/shaded_hills/shaded_hills_currency.dm +++ b/maps/shaded_hills/shaded_hills_currency.dm @@ -1,7 +1,7 @@ /datum/map/shaded_hills starting_cash_choices = list( - /decl/starting_cash_choice/none, - /decl/starting_cash_choice/cash + /decl/starting_cash_choice/cash, + /decl/starting_cash_choice/none ) default_currency = /decl/currency/imperial salary_modifier = 0.05 // turn the 300-400 base into 15-20 base diff --git a/maps/shaded_hills/shaded_hills_define.dm b/maps/shaded_hills/shaded_hills_define.dm index bfb694d4ee6..6266ab2a09e 100644 --- a/maps/shaded_hills/shaded_hills_define.dm +++ b/maps/shaded_hills/shaded_hills_define.dm @@ -14,11 +14,13 @@ allowed_latejoin_spawns = list( /decl/spawnpoint/arrivals ) - map_tech_level = MAP_TECH_LEVEL_MEDIEVAL - survival_box_choices = list() - passport_type = null - _available_backpacks = list( - /decl/backpack_outfit/sack + map_tech_level = MAP_TECH_LEVEL_MEDIEVAL + survival_box_choices = list() + passport_type = null + _available_backpacks = list( + /decl/backpack_outfit/sack, + /decl/backpack_outfit/backpack/crafted, + /decl/backpack_outfit/haversack ) lobby_tracks = list( /decl/music_track/dhaka, @@ -29,6 +31,7 @@ 'sound/music/Miris-Magic-Dance.ogg' ) game_year = -914 // in 2024, the year should be 1110, roughly a century after the fall of the Imperial Aegis + security_state = /decl/security_state/none char_preview_bgstate_options = list( "000", @@ -47,3 +50,6 @@ /datum/map/shaded_hills/get_map_info() return "You're in the [station_name] of the [system_name], nestled between the mountains and the river and bisected by the decaying Queens' Road. On all sides, you are surrounded by untamed wilds, with only a small ruined fort, rebuilt into an inn, to the east as a sign of civilisation. \ Far from the control of [boss_name], you are free to carve forward a path to survival for yourself and your comrades however you wish. Strike the earth!" + +/datum/map/shaded_hills/get_available_submap_archetypes() + return null // Return list of decl instances when relevant submaps exist. diff --git a/maps/shaded_hills/shaded_hills_map.dm b/maps/shaded_hills/shaded_hills_map.dm index 5e3cda3b8bc..09bf988942e 100644 --- a/maps/shaded_hills/shaded_hills_map.dm +++ b/maps/shaded_hills/shaded_hills_map.dm @@ -1,5 +1,5 @@ /datum/map/shaded_hills - default_liquid_fuel_type = /decl/material/liquid/nutriment/plant_oil + default_liquid_fuel_type = /decl/material/liquid/oil default_species = SPECIES_KOBALOI loadout_categories = list( /decl/loadout_category/fantasy/clothing, diff --git a/maps/shaded_hills/submaps/_submaps.dm b/maps/shaded_hills/submaps/_submaps.dm deleted file mode 100644 index 14b3948c927..00000000000 --- a/maps/shaded_hills/submaps/_submaps.dm +++ /dev/null @@ -1,23 +0,0 @@ -#define MAP_TEMPLATE_CATEGORY_SH_GRASSLAND "template_sh_grassland" -#define MAP_TEMPLATE_CATEGORY_SH_SWAMP "template_sh_swamp" -#define MAP_TEMPLATE_CATEGORY_SH_WOODS "template_sh_woods" -#define MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS "template_sh_downlands" -#define MAP_TEMPLATE_CATEGORY_SH_DUNGEON "template_sh_dungeon" -#define MAP_TEMPLATE_CATEGORY_SH_CAVERNS "template_sh_caverns" - -/datum/map_template/shaded_hills - abstract_type = /datum/map_template/shaded_hills - template_parent_type = /datum/map_template/shaded_hills - template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS - area_usage_test_exempted_root_areas = list( - /area/shaded_hills/outside/point_of_interest - ) - var/cost = 1 - -/datum/map_template/shaded_hills/get_template_cost() - return cost - -/area/shaded_hills/outside/point_of_interest - name = "Point Of Interest" - description = null - area_blurb_category = /area/shaded_hills/outside/point_of_interest diff --git a/maps/shaded_hills/submaps/downlands/_downlands.dm b/maps/shaded_hills/submaps/downlands/_downlands.dm deleted file mode 100644 index 22721f265b8..00000000000 --- a/maps/shaded_hills/submaps/downlands/_downlands.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/map_template/shaded_hills/downlands - abstract_type = /datum/map_template/shaded_hills/downlands - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS) - template_parent_type = /datum/map_template/shaded_hills/downlands - -/datum/map_template/shaded_hills/dungeon - abstract_type = /datum/map_template/shaded_hills/dungeon - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_DUNGEON) - template_parent_type = /datum/map_template/shaded_hills/dungeon diff --git a/maps/shaded_hills/submaps/grassland/_grassland.dm b/maps/shaded_hills/submaps/grassland/_grassland.dm deleted file mode 100644 index 39f0722666b..00000000000 --- a/maps/shaded_hills/submaps/grassland/_grassland.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/map_template/shaded_hills/grassland - abstract_type = /datum/map_template/shaded_hills/grassland - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_GRASSLAND) - template_parent_type = /datum/map_template/shaded_hills/grassland - -/datum/map_template/shaded_hills/cavern - abstract_type = /datum/map_template/shaded_hills/cavern - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_CAVERNS) - template_parent_type = /datum/map_template/shaded_hills/cavern \ No newline at end of file diff --git a/maps/shaded_hills/submaps/swamp/_swamp.dm b/maps/shaded_hills/submaps/swamp/_swamp.dm deleted file mode 100644 index 9f4f963c1ee..00000000000 --- a/maps/shaded_hills/submaps/swamp/_swamp.dm +++ /dev/null @@ -1,4 +0,0 @@ -/datum/map_template/shaded_hills/swamp - abstract_type = /datum/map_template/shaded_hills/swamp - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_SWAMP) - template_parent_type = /datum/map_template/shaded_hills/swamp \ No newline at end of file diff --git a/maps/shaded_hills/submaps/woods/_woods.dm b/maps/shaded_hills/submaps/woods/_woods.dm deleted file mode 100644 index 0baea8f75c5..00000000000 --- a/maps/shaded_hills/submaps/woods/_woods.dm +++ /dev/null @@ -1,4 +0,0 @@ -/datum/map_template/shaded_hills/woods - abstract_type = /datum/map_template/shaded_hills/woods - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_WOODS) - template_parent_type = /datum/map_template/shaded_hills/woods diff --git a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dm b/maps/shaded_hills/submaps/woods/bear_den/bear_den.dm deleted file mode 100644 index ee4d7f30849..00000000000 --- a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/bear_den - name = "bear den" - mappaths = list("maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm") - -/area/shaded_hills/outside/point_of_interest/bear_den - name = "Point of Interest - Bear Den" diff --git a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dm b/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dm deleted file mode 100644 index 19de9faa978..00000000000 --- a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/chemistry_shack - name = "chemistry shack" - mappaths = list("maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm") - -/area/shaded_hills/outside/point_of_interest/chemistry_shack - name = "Point of Interest - Chemistry Shack" diff --git a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_rings.dm b/maps/shaded_hills/submaps/woods/fairy_rings/fairy_rings.dm deleted file mode 100644 index 89ec23e18dc..00000000000 --- a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_rings.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/map_template/shaded_hills/woods/fairy_ring - name = "fairy ring" - mappaths = list("maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm") - template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_ALLOW_DUPLICATES | TEMPLATE_FLAG_GENERIC_REPEATABLE - template_categories = list( - MAP_TEMPLATE_CATEGORY_SH_WOODS - ) - area_coherency_test_exempt_areas = list(/area/shaded_hills/outside/point_of_interest/fairy_ring) - -/datum/map_template/shaded_hills/woods/fairy_ring/glowing - name = "glowing fairy ring" - mappaths = list("maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm") - -/area/shaded_hills/outside/point_of_interest/fairy_ring - name = "Point of Interest - Fairy Ring" diff --git a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dm b/maps/shaded_hills/submaps/woods/fox_den/fox_den.dm deleted file mode 100644 index de7b5dcfd5f..00000000000 --- a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/fox_den - name = "fox den" - mappaths = list("maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm") - -/area/shaded_hills/outside/point_of_interest/fox_den - name = "Point of Interest - Fox Den" diff --git a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dm b/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dm deleted file mode 100644 index 3cf4e2edc68..00000000000 --- a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/hunter_camp - name = "hunter camp" - mappaths = list("maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm") - -/area/shaded_hills/outside/point_of_interest/hunter_camp - name = "Point of Interest - Hunter Camp" diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dm b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dm deleted file mode 100644 index 2d56e5161b3..00000000000 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/old_cabin - name = "old cabin" - mappaths = list("maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm") - -/area/shaded_hills/outside/point_of_interest/old_cabin - name = "Point of Interest - Old Cabin" diff --git a/maps/tradeship/jobs/_goals.dm b/maps/tradeship/jobs/_goals.dm index c0c13ad937d..ac7cc4422dc 100644 --- a/maps/tradeship/jobs/_goals.dm +++ b/maps/tradeship/jobs/_goals.dm @@ -25,7 +25,10 @@ var/global/list/tradeship_paperwork_end_areas = list() /datum/goal/department/paperwork/tradeship paperwork_types = list(/obj/item/paperwork/tradeship) - signatory_job_list = list(/datum/job/tradeship_captain, /datum/job/tradeship_first_mate) + signatory_job_list = list( + /datum/job/standard/captain/tradeship, + /datum/job/tradeship_first_mate + ) /datum/goal/department/paperwork/tradeship/get_paper_spawn_turfs() return global.tradeship_paperwork_spawn_turfs diff --git a/maps/tradeship/jobs/civilian.dm b/maps/tradeship/jobs/civilian.dm index c15bb5c5a77..edb03def44a 100644 --- a/maps/tradeship/jobs/civilian.dm +++ b/maps/tradeship/jobs/civilian.dm @@ -1,21 +1,10 @@ -/datum/job/tradeship_deckhand +/datum/job/standard/assistant/tradeship title = "Deck Hand" - total_positions = -1 - spawn_positions = -1 supervisors = "literally everyone, you bottom feeder" outfit_type = /decl/outfit/job/tradeship/hand alt_titles = list( "Cook" = /decl/outfit/job/tradeship/hand/cook, "Cargo Hand", - "Passenger") - department_types = list(/decl/department/civilian) - economic_power = 1 - access = list() - minimal_access = list() + "Passenger" + ) event_categories = list(ASSIGNMENT_GARDENER, ASSIGNMENT_JANITOR) - -/datum/job/tradeship_deckhand/get_access() - 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 a6d37fe665e..3647a632760 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -1,4 +1,4 @@ -/datum/job/tradeship_captain +/datum/job/standard/captain/tradeship title = "Captain" supervisors = "your profit margin, your conscience, and the Trademaster" outfit_type = /decl/outfit/job/tradeship/captain @@ -8,36 +8,15 @@ SKILL_SCIENCE = SKILL_ADEPT, SKILL_PILOT = SKILL_ADEPT ) - max_skill = list( - SKILL_PILOT = SKILL_MAX, - SKILL_WEAPONS = SKILL_MAX - ) - skill_points = 30 - head_position = 1 - department_types = list(/decl/department/command) - total_positions = 1 - spawn_positions = 1 - selection_color = "#1d1d4f" - req_admin_notify = 1 - access = list() - minimal_access = list() - minimal_player_age = 14 - economic_power = 20 ideal_character_age = 70 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 forced_spawnpoint = /decl/spawnpoint/cryo/captain -/datum/job/tradeship_captain/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/standard/captain/tradeship/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/tradehouse_rename_ship H.verbs |= /mob/proc/tradehouse_rename_company -/datum/job/tradeship_captain/get_access() - return get_all_station_access() - /mob/proc/tradehouse_rename_ship() set name = "Rename Tradeship" set category = "Captain's Powers" @@ -76,6 +55,7 @@ /datum/job/tradeship_first_mate title = "First Mate" supervisors = "the Captain" + hud_icon = 'maps/tradeship/hud.dmi' outfit_type = /decl/outfit/job/tradeship/mate head_position = 1 department_types = list( diff --git a/maps/tradeship/jobs/engineering.dm b/maps/tradeship/jobs/engineering.dm index 1586944c1bf..62a9c6659c4 100644 --- a/maps/tradeship/jobs/engineering.dm +++ b/maps/tradeship/jobs/engineering.dm @@ -1,126 +1,10 @@ -/datum/job/tradeship_engineer +/datum/job/standard/engineer/tradeship title = "Junior Engineer" supervisors = "the Head Engineer" outfit_type = /decl/outfit/job/tradeship/hand/engine - department_types = list(/decl/department/engineering) - total_positions = 8 - spawn_positions = 7 - selection_color = "#5b4d20" - economic_power = 5 - minimal_player_age = 7 - access = list( - access_eva, - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_external_airlocks, - access_construction, - access_atmospherics, - access_emergency_storage - ) - minimal_access = list( - access_eva, - access_engine, - access_engine_equip, - access_tech_storage, - access_maint_tunnels, - access_external_airlocks, - access_construction, - access_atmospherics, - access_emergency_storage - ) - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC - ) - max_skill = list( - SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX - ) - skill_points = 20 alt_titles = list() - event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/tradeship_engineer/head +/datum/job/standard/chief_engineer/tradeship 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 - 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_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_ai_upload - ) - minimal_player_age = 14 - supervisors = "the Captain" outfit_type = /decl/outfit/job/tradeship/chief_engineer - 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 = 30 alt_titles = list() - event_categories = list(ASSIGNMENT_ENGINEER) diff --git a/maps/tradeship/jobs/medical.dm b/maps/tradeship/jobs/medical.dm index 55ff9ea2f1c..bedcf558453 100644 --- a/maps/tradeship/jobs/medical.dm +++ b/maps/tradeship/jobs/medical.dm @@ -1,9 +1,8 @@ -/datum/job/tradeship_doctor +/datum/job/standard/doctor/tradeship title = "Junior Doctor" - department_types = list(/decl/department/medical) - head_position = 0 supervisors = "the Head Doctor and the Captain" alt_titles = list() + // Slightly beefier skills due to smaller crew. skill_points = 24 min_skill = list( SKILL_LITERACY = SKILL_ADEPT, @@ -16,11 +15,6 @@ SKILL_ANATOMY = SKILL_MAX, SKILL_CHEMISTRY = SKILL_MAX ) - minimal_player_age = 3 - total_positions = 5 - spawn_positions = 3 - selection_color = "#013d3b" - economic_power = 7 access = list( access_medical, access_medical_equip, @@ -39,61 +33,10 @@ outfit_type = /decl/outfit/job/tradeship/doc/junior event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/tradeship_doctor/head +/datum/job/standard/cmo/tradeship 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/outfit/job/tradeship/doc alt_titles = list("Surgeon") - total_positions = 1 - spawn_positions = 1 + // Slightly beefier skills due to smaller crew. skill_points = 28 - guestbanned = 1 - must_fill = 1 - not_random_selectable = 1 - selection_color = "#026865" - req_admin_notify = 1 - economic_power = 10 - access = list( - access_medical, - access_medical_equip, - access_morgue, - access_bridge, - access_heads, - access_chemistry, - access_virology, - access_cmo, - access_surgery, - access_RC_announce, - access_keycard_auth, - access_sec_doors, - access_psychiatrist, - access_eva, - access_maint_tunnels, - access_external_airlocks - ) - minimal_access = list( - access_medical, - access_medical_equip, - access_morgue, - access_bridge, - access_heads, - access_chemistry, - access_virology, - access_cmo, - access_surgery, - access_RC_announce, - access_keycard_auth, - access_sec_doors, - access_psychiatrist, - access_eva, - access_maint_tunnels, - access_external_airlocks - ) - minimal_player_age = 14 - ideal_character_age = 50 - event_categories = list(ASSIGNMENT_MEDICAL) diff --git a/maps/tradeship/jobs/science.dm b/maps/tradeship/jobs/science.dm index 4c6e5555d8e..d941587b27d 100644 --- a/maps/tradeship/jobs/science.dm +++ b/maps/tradeship/jobs/science.dm @@ -1,119 +1,14 @@ -/datum/job/tradeship_researcher +/datum/job/standard/scientist/tradeship title = "Junior Researcher" supervisors = "the Head Researcher and the Captain" total_positions = 2 spawn_positions = 1 alt_titles = list() outfit_type = /decl/outfit/job/tradeship/hand/researcher/junior - min_skill = list( - SKILL_LITERACY = SKILL_ADEPT, - SKILL_COMPUTER = 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 - ) + // Smaller crew, more points. skill_points = 24 - department_types = list(/decl/department/science) - selection_color = "#633d63" - economic_power = 7 - minimal_player_age = 7 - access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - minimal_access = list( - access_robotics, - access_tox, - access_tox_storage, - access_research, - access_xenobiology, - access_xenoarch - ) - event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/tradeship_researcher/head +/datum/job/standard/rd/tradeship title = "Head Researcher" - supervisors = "the Captain" - spawn_positions = 1 - total_positions = 1 alt_titles = list() outfit_type = /decl/outfit/job/tradeship/hand/researcher - 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 = 30 - head_position = 1 - department_types = list( - /decl/department/science, - /decl/department/command - ) - selection_color = "#ad6bad" - req_admin_notify = 1 - economic_power = 15 - access = list( - access_rd, - access_bridge, - access_tox, - access_morgue, - access_tox_storage, - access_teleporter, - access_sec_doors, - access_heads, - 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_network - ) - minimal_access = list( - access_rd, - access_bridge, - access_tox, - access_morgue, - access_tox_storage, - access_teleporter, - access_sec_doors, - access_heads, - 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_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/tradeship/jobs/synthetics.dm b/maps/tradeship/jobs/synthetics.dm deleted file mode 100644 index e10101d48a2..00000000000 --- a/maps/tradeship/jobs/synthetics.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/job/tradeship_robot - title = "Robot" - event_categories = list(ASSIGNMENT_ROBOT) - total_positions = 1 - spawn_positions = 1 - supervisors = "your laws and the Captain" - selection_color = "#254c25" - minimal_player_age = 7 - account_allowed = 0 - economic_power = 0 - loadout_allowed = FALSE - outfit_type = /decl/outfit/job/silicon/cyborg - 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/tradeship_robot/handle_variant_join(var/mob/living/human/H, var/alt_title) - if(H) - return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) - -/datum/job/tradeship_robot/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) - return !!H - -/datum/job/tradeship_robot/New() - ..() - alt_titles = SSrobots.robot_alt_titles.Copy() - alt_titles -= title diff --git a/maps/tradeship/outfits/_outfits.dm b/maps/tradeship/outfits/_outfits.dm index f5764c3254d..44f0a65873a 100644 --- a/maps/tradeship/outfits/_outfits.dm +++ b/maps/tradeship/outfits/_outfits.dm @@ -9,7 +9,7 @@ /decl/outfit/job/tradeship/hand name = "Tradeship - Job - Deck Hand" -/decl/outfit/job/tradeship/hand/pre_equip(mob/living/human/H) +/decl/outfit/job/tradeship/hand/pre_equip(mob/living/wearer) ..() uniform = pick(list( /obj/item/clothing/pants/mustard/overalls, diff --git a/maps/tradeship/outfits/command.dm b/maps/tradeship/outfits/command.dm index 46a28429118..8755b97c555 100644 --- a/maps/tradeship/outfits/command.dm +++ b/maps/tradeship/outfits/command.dm @@ -7,9 +7,9 @@ id_type = /obj/item/card/id/gold l_ear = /obj/item/radio/headset/heads/captain -/decl/outfit/job/tradeship/captain/post_equip(var/mob/living/human/H) +/decl/outfit/job/tradeship/captain/post_equip(var/mob/living/wearer) ..() - var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) + var/obj/item/clothing/uniform = wearer.get_equipped_item(slot_w_uniform_str) if(uniform) var/obj/item/clothing/shirt/hawaii/random/eyegore = new() if(uniform.can_attach_accessory(eyegore)) diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 4ff16d85d3a..625326ea625 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -33,12 +33,12 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "ae" = ( /obj/effect/decal/cleanable/generic, /obj/item/stool/wood, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "af" = ( /obj/structure/disposalpipe/up, @@ -108,7 +108,7 @@ /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "ap" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -188,7 +188,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/button/access/interior{ dir = 1; id_tag = "lower_cargo"; @@ -198,7 +198,7 @@ /area/ship/trade/loading_bay) "ax" = ( /obj/item/stool/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -322,7 +322,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "aI" = ( @@ -598,7 +598,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bj" = ( @@ -609,7 +609,7 @@ /area/ship/trade/fore_port_underside_maint) "bk" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /obj/item/paicard, /turf/floor, @@ -618,7 +618,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/trash/mollusc_shell/clam, /turf/floor, /area/ship/trade/disused) @@ -741,7 +741,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bG" = ( @@ -752,7 +752,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/vending/cola{ dir = 4 }, @@ -886,7 +886,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "bW" = ( @@ -1000,7 +1000,7 @@ dir = 8; flickering = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -1009,10 +1009,10 @@ "dN" = ( /obj/machinery/portable_atmospherics/hydroponics/soil, /obj/item/tool/hoe/mini, -/turf/floor, +/turf/floor/plating/dirt, /area/ship/trade/aft_port_underside_maint) "en" = ( -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "eu" = ( /obj/structure/window/basic, @@ -1061,7 +1061,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/hygiene/drain, /turf/floor/tiled, /area/ship/trade/loading_bay) @@ -1074,8 +1074,8 @@ /area/ship/trade/disused) "hc" = ( /obj/item/radio, -/obj/structure/table/woodentable/walnut, -/turf/floor/wood/walnut, +/obj/structure/table/laminate/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "hf" = ( /obj/structure/lattice, @@ -1083,7 +1083,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "hg" = ( /obj/machinery/door/airlock/hatch/autoname/general, @@ -1101,7 +1101,7 @@ /turf/floor, /area/ship/trade/loading_bay) "iy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1122,7 +1122,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "jk" = ( /obj/item/mollusc/barnacle{ @@ -1156,7 +1156,7 @@ /area/ship/trade/loading_bay) "lg" = ( /obj/item/stool/bar/padded, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1179,10 +1179,10 @@ icon_state = "4-8" }, /obj/machinery/portable_atmospherics/hydroponics/soil, -/turf/floor, +/turf/floor/plating/dirt, /area/ship/trade/aft_port_underside_maint) "lv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/bluegrid, /area/ship/trade/undercomms) "lA" = ( @@ -1197,6 +1197,10 @@ /obj/item/stack/cable_coil/random/three, /turf/floor, /area/ship/trade/loading_bay) +"lG" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "ne" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -1227,11 +1231,11 @@ /area/ship/trade/fore_port_underside_maint) "oo" = ( /obj/machinery/portable_atmospherics/hydroponics/soil, -/turf/floor, +/turf/floor/plating/dirt, /area/ship/trade/aft_starboard_underside_maint) "or" = ( /obj/machinery/portable_atmospherics/hydroponics/soil, -/turf/floor, +/turf/floor/plating/dirt, /area/ship/trade/aft_port_underside_maint) "os" = ( /obj/structure/lattice, @@ -1248,7 +1252,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "oO" = ( @@ -1280,7 +1284,7 @@ /turf/floor, /area/ship/trade/loading_bay) "pi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/loading_bay) "pG" = ( @@ -1301,7 +1305,7 @@ /turf/floor/plating, /area/ship/trade/loading_bay) "qt" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "qK" = ( @@ -1319,7 +1323,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/backpack/dufflebag, /obj/item/chems/glass/rag, /obj/item/chems/glass/bucket, @@ -1479,7 +1483,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/floor, +/turf/floor/plating/dirt, /area/ship/trade/aft_port_underside_maint) "xP" = ( /obj/structure/disposalpipe/segment{ @@ -1530,7 +1534,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -1637,7 +1641,7 @@ /turf/floor/tiled/steel_grid, /area/ship/trade/loading_bay) "DT" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1651,7 +1655,7 @@ dir = 4 }, /obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "Ff" = ( @@ -1659,7 +1663,7 @@ /turf/floor/carpet/red, /area/ship/trade/disused) "Ft" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -1669,7 +1673,7 @@ /turf/floor, /area/ship/trade/undercomms) "Fy" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/loot_pile/maint/trash, /turf/floor/tiled, /area/ship/trade/disused) @@ -1751,7 +1755,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 6 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/disused) "Iv" = ( @@ -1773,7 +1777,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "II" = ( /obj/structure/stairs/long/west, @@ -1861,7 +1865,7 @@ /obj/structure/bed, /obj/item/bedsheet/rainbow, /obj/structure/curtain/open/bed, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "LH" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ @@ -2017,9 +2021,9 @@ /turf/floor, /area/ship/trade/aft_starboard_underside_maint) "Qh" = ( -/obj/structure/table/woodentable/mahogany, +/obj/structure/table/laminate/mahogany, /obj/item/cell/crap/empty, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "Qv" = ( /obj/effect/floor_decal/industrial/warning{ @@ -2030,7 +2034,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ dir = 8; pixel_x = -24 @@ -2049,12 +2053,12 @@ /obj/machinery/light{ dir = 4 }, -/turf/floor, +/turf/floor/plating/dirt, /area/ship/trade/aft_starboard_underside_maint) "QW" = ( /obj/item/stack/tile/floor/five, /obj/item/crowbar/red, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor, /area/ship/trade/disused) @@ -2094,7 +2098,7 @@ /obj/item/radio/intercom{ pixel_y = 20 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/loot_pile/maint/junk, /turf/floor, /area/ship/trade/disused) @@ -2121,7 +2125,7 @@ /area/ship/trade/loading_bay) "VT" = ( /obj/machinery/hologram/holopad/longrange, -/turf/floor/wood/walnut, +/turf/floor/laminate/walnut, /area/ship/trade/disused) "Xe" = ( /turf/wall, @@ -3507,7 +3511,7 @@ aa aa aa aa -aa +lG aa aa aa @@ -7360,7 +7364,7 @@ aa aa aa aa -aa +lG aa aa aa diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index e72c0805f17..fd28e95fb89 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -292,7 +292,7 @@ /turf/floor/plating, /area/ship/trade/cargo/lower) "aH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 8 }, @@ -486,7 +486,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ship/trade/maintenance/lower) "bd" = ( @@ -655,7 +655,7 @@ /obj/structure/cable{ icon_state = "6-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "bw" = ( @@ -739,7 +739,7 @@ /turf/floor/tiled, /area/ship/trade/maintenance/lower) "bJ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -24 @@ -828,7 +828,7 @@ /area/ship/trade/cargo/lower) "bV" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/portable_atmospherics/powered/scrubber, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) @@ -1024,7 +1024,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) "cC" = ( @@ -1144,7 +1144,7 @@ dir = 8; icon_state = "bulb1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/railing/mapped{ dir = 4 }, @@ -1337,11 +1337,11 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/steel_grid, /area/ship/trade/cargo/lower) "du" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "dv" = ( @@ -1357,7 +1357,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning/corner{ dir = 1; icon_state = "warningcorner" @@ -1400,14 +1400,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "dB" = ( /obj/structure/table, /obj/random/plushie, /obj/item/synthesized_instrument/violin, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "dD" = ( @@ -1608,7 +1608,7 @@ icon_state = "bulb1" }, /obj/structure/ladder, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/deck/second{ pixel_y = 32 }, @@ -1619,7 +1619,7 @@ dir = 8; pixel_x = 22 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -1638,7 +1638,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/eva) "ep" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 1; icon_state = "bulb1" @@ -1687,7 +1687,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "ew" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1714,7 +1714,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "ez" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -1751,7 +1751,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/eva) "eD" = ( @@ -1763,6 +1763,10 @@ }, /turf/floor/plating, /area/ship/trade/maintenance/eva) +"eH" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "eJ" = ( /obj/machinery/vending/materials{ dir = 4 @@ -1776,7 +1780,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "eQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light_switch{ pixel_x = 24; @@ -1795,14 +1799,14 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/ship/trade/maintenance/eva) "eS" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/eva) "eV" = ( @@ -1849,7 +1853,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/storage) "fa" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "fb" = ( @@ -1981,7 +1985,7 @@ /turf/floor, /area/ship/trade/science/fabricaton) "hI" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning{ dir = 1; icon_state = "warning" @@ -2151,7 +2155,7 @@ /obj/machinery/conveyor_switch{ id_tag = "con" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /turf/floor/tiled, /area/ship/trade/cargo/lower) @@ -2340,7 +2344,7 @@ /turf/wall/r_wall/hull, /area/ship/trade/maintenance/techstorage) "rB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/iron, /obj/item/stack/material/ore/coal{ pixel_x = 3; @@ -2443,7 +2447,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "un" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/fabricator/industrial, /obj/item/stack/material/ingot/mapped/osmium/ten, /obj/effect/floor_decal/industrial/outline/yellow, @@ -2562,7 +2566,7 @@ }, /obj/item/bedsheet/mime, /obj/effect/decal/cleanable/cobweb2, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/ship/trade/drunk_tank) "xa" = ( @@ -2672,7 +2676,7 @@ /turf/floor/tiled/dark, /area/ship/trade/crew/dorms1) "Bq" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2737,7 +2741,7 @@ dir = 4; level = 2 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/cargo/lower) "DQ" = ( @@ -2864,7 +2868,7 @@ /area/ship/trade/science/fabricaton) "IU" = ( /obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2948,7 +2952,7 @@ /turf/floor/lino, /area/ship/trade/crew/dorms2) "Lx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /turf/floor/tiled, /area/ship/trade/cargo/lower) @@ -2968,7 +2972,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/techstorage) "LN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 5 }, @@ -2991,7 +2995,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/maintenance/lower) "Mx" = ( @@ -2999,7 +3003,7 @@ /turf/wall, /area/ship/trade/escape_port) "Nb" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -3161,7 +3165,7 @@ dir = 1; pixel_y = -21 }, -/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/vomit/mapped, /obj/structure/hygiene/toilet{ dir = 1 }, @@ -3279,7 +3283,7 @@ /obj/item/stack/tape_roll/duct_tape, /obj/item/stack/material/sheet/reinforced/mapped/plasteel/fifty, /obj/item/stack/material/ingot/mapped/copper/fifty, -/obj/item/stack/material/rods/fifty, +/obj/item/stack/material/rods/mapped/steel/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, /obj/item/stack/material/panel/mapped/plastic/fifty, /obj/item/stack/material/sheet/mapped/steel/fifty, @@ -3376,7 +3380,7 @@ /turf/floor/tiled/white, /area/ship/trade/science/fabricaton) "Zv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/alarm{ dir = 4; @@ -4589,7 +4593,7 @@ aa aa aa aa -aa +eH aa aa aa @@ -8689,7 +8693,7 @@ aa aa aa aa -aa +eH aa aa aa diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index 5861bc931e5..0084e4d8d71 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -58,14 +58,14 @@ "af" = ( /obj/item/paper_bin, /obj/item/pen, -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/light_switch{ pixel_y = 25 }, /obj/random/action_figure, /obj/random_multi/single_item/captains_spare_id, /obj/machinery/atmospherics/unary/vent_scrubber/on, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/captain) "ag" = ( /obj/item/bedsheet/captain, @@ -76,7 +76,7 @@ dir = 8; pixel_x = 21 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/captain) "ah" = ( /obj/item/radio/intercom{ @@ -275,7 +275,7 @@ /turf/floor/tiled/white, /area/ship/trade/crew/medbay/chemistry) "aB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/closet/emcloset, /obj/random/voidsuit, /obj/random/voidhelmet, @@ -404,7 +404,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/fmate) "aR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -528,7 +528,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 @@ -645,7 +645,7 @@ /turf/wall/r_wall, /area/ship/trade/dock) "bn" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/alarm{ dir = 4; pixel_x = -21 @@ -676,7 +676,7 @@ /turf/floor/plating, /area/ship/trade/shuttle/outgoing/general) "br" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/emergency_dispenser/north, /turf/floor/tiled/monotile, /area/ship/trade/dock) @@ -733,7 +733,7 @@ "bv" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-2" }, @@ -820,7 +820,7 @@ /turf/floor/plating, /area/ship/trade/dock) "bB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/warning/vacuum{ dir = 4; pixel_x = -34 @@ -828,7 +828,7 @@ /turf/floor/tiled/monotile, /area/ship/trade/dock) "bC" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -990,7 +990,7 @@ /turf/floor/tiled/monotile, /area/ship/trade/dock) "bO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/steeldecal/steel_decals6, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8; @@ -1282,7 +1282,7 @@ /obj/machinery/recharger, /obj/structure/sign/poster{ pixel_x = 32; - dir = 8 + dir = 4 }, /obj/item/plate/tray, /obj/item/circular_saw, @@ -1340,7 +1340,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Deck Hand" }, @@ -1647,7 +1647,7 @@ dir = 8; icon_state = "twindow" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random_multi/single_item/captains_spare_id, /turf/floor/tiled/freezer, /area/ship/trade/crew/toilets) @@ -1664,7 +1664,7 @@ icon_state = "twindow" }, /obj/structure/window/reinforced/tinted, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable, /obj/machinery/power/apc{ dir = 4; @@ -1681,7 +1681,7 @@ /turf/floor/tiled/freezer, /area/ship/trade/crew/toilets) "dO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "conpipe-c" @@ -1700,7 +1700,7 @@ /turf/wall, /area/ship/trade/crew/saloon) "dQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/beige{ dir = 9 }, @@ -1730,7 +1730,7 @@ /turf/floor/tiled, /area/ship/trade/crew/saloon) "dV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable{ @@ -1869,7 +1869,7 @@ /area/ship/trade/crew/kitchen) "ez" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/ship/trade/crew/kitchen) "eA" = ( @@ -1920,7 +1920,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/cargo) "eF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -1933,7 +1933,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/cargo) "eH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light{ dir = 4; icon_state = "bulb1" @@ -2002,10 +2002,19 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/item/chems/glass/beaker{ + pixel_x = 5 + }, +/obj/item/chems/condiment/small/peppermill{ + pixel_x = 3 + }, +/obj/item/chems/condiment/enzyme, +/obj/item/chems/glass/rag, +/obj/item/chems/cooking_vessel/pot, /turf/floor/tiled, /area/ship/trade/crew/kitchen) "eQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, @@ -2223,7 +2232,7 @@ /turf/floor/tiled/white, /area/ship/trade/crew/medbay) "fp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/catwalk, /turf/open, /area/ship/trade/cargo) @@ -2499,7 +2508,7 @@ /obj/structure/cable{ icon_state = "6-8" }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "ge" = ( /obj/machinery/light_switch{ @@ -2516,7 +2525,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "gg" = ( /obj/effect/paint/brown, @@ -2624,7 +2633,7 @@ /area/ship/trade/cargo) "gt" = ( /obj/structure/emergency_dispenser/west, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable{ @@ -2642,7 +2651,7 @@ dir = 4; pixel_x = -21 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "gw" = ( /obj/effect/decal/cleanable/generic, @@ -2657,14 +2666,14 @@ level = 2 }, /obj/item/synthesized_instrument/trumpet, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "gx" = ( /obj/item/radio/intercom{ dir = 8; pixel_x = 22 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "gz" = ( /obj/structure/lattice, @@ -2716,7 +2725,7 @@ pixel_x = 32; dir = 4 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "gL" = ( /obj/structure/disposalpipe/segment, @@ -2817,7 +2826,7 @@ /turf/floor/tiled, /area/ship/trade/garden) "hi" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "1-8" }, @@ -2904,7 +2913,7 @@ /turf/floor/plating, /area/ship/trade/crew/hallway/starboard) "ht" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3187,7 +3196,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "hV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/light_switch{ pixel_y = 25 }, @@ -3345,7 +3354,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "ij" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/cable{ icon_state = "4-8" }, @@ -3365,7 +3374,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stool/padded, /obj/structure/cable{ icon_state = "1-8" @@ -3387,7 +3396,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3532,7 +3541,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "iz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/corner/yellow{ dir = 10 }, @@ -3654,7 +3663,7 @@ /area/ship/trade/maintenance/atmos) "iN" = ( /obj/machinery/light, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "iQ" = ( @@ -4684,14 +4693,8 @@ "nH" = ( /obj/structure/table, /obj/effect/floor_decal/corner/red/diagonal, -/obj/item/chems/glass/beaker{ - pixel_x = 5 - }, -/obj/item/chems/condiment/small/peppermill{ - pixel_x = 3 - }, -/obj/item/chems/condiment/enzyme, -/obj/item/chems/glass/rag, +/obj/machinery/reagent_temperature, +/obj/item/chems/cooking_vessel/skillet, /turf/floor/tiled, /area/ship/trade/crew/kitchen) "nR" = ( @@ -4863,8 +4866,8 @@ /turf/floor/plating, /area/ship/trade/shieldbay) "pT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/radio/intercom{ pixel_y = 20 }, @@ -4973,7 +4976,7 @@ /turf/floor/plating, /area/ship/trade/shuttle/rescue) "qO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/outline/yellow, /obj/machinery/computer/modular/preset/merchant/tradeship, /obj/machinery/light_switch{ @@ -5078,7 +5081,7 @@ /area/ship/trade/shuttle/outgoing/general) "rR" = ( /obj/item/flashlight, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "rT" = ( /obj/machinery/computer/modular/preset/engineering, @@ -5412,6 +5415,10 @@ }, /turf/floor/plating/airless, /area/ship/trade/maintenance/engine/aft) +"vN" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "vP" = ( /obj/machinery/light{ dir = 8; @@ -5425,7 +5432,7 @@ /obj/item/boombox, /obj/item/stack/tape_roll/barricade_tape/bureaucracy, /obj/machinery/keycard_auth, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/captain) "vS" = ( /turf/floor/tiled/freezer, @@ -5903,7 +5910,7 @@ pixel_y = -2; dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/fmate) "Cb" = ( /obj/machinery/atmospherics/pipe/simple/visible/green{ @@ -6060,7 +6067,7 @@ }, /obj/structure/cable, /obj/machinery/icecream_vat, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "Dq" = ( /obj/effect/paint/brown, @@ -6185,7 +6192,7 @@ /obj/item/briefcase/crimekit, /obj/item/taperecorder, /obj/item/camera, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/fmate) "Ec" = ( /obj/structure/closet/crate, @@ -6414,7 +6421,7 @@ pixel_x = 30; pixel_y = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "GO" = ( @@ -6475,7 +6482,7 @@ /area/ship/trade/crew/hallway/port) "Hs" = ( /obj/machinery/light, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "HA" = ( /obj/structure/cable{ @@ -6638,7 +6645,7 @@ /obj/abstract/landmark/start{ name = "First Mate" }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/fmate) "Jn" = ( /obj/effect/floor_decal/corner/beige{ @@ -6659,7 +6666,7 @@ /area/ship/trade/crew/saloon) "Jp" = ( /obj/effect/floor_decal/corner/red/diagonal, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/meat_hook, /obj/machinery/newscaster{ pixel_y = -32; @@ -7077,7 +7084,7 @@ dir = 4 }, /obj/structure/bookcase/skill_books/random, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "NM" = ( /obj/effect/floor_decal/corner/beige{ @@ -7125,7 +7132,7 @@ /obj/item/clothing/shoes/color/brown, /obj/random/plushie, /mob/living/simple_animal/corgi/Ian, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/fmate) "Oc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/fuel{ @@ -7135,7 +7142,7 @@ /obj/machinery/network/relay{ initial_network_id = "tradenet" }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "Og" = ( /obj/structure/cable{ @@ -7277,7 +7284,7 @@ /turf/floor/bluegrid, /area/ship/trade/command/bridge) "Qc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/fuel, @@ -7359,11 +7366,11 @@ dir = 1; pixel_y = -24 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "Rb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/structure/cable{ icon_state = "0-8" }, @@ -7388,7 +7395,7 @@ dir = 8; pixel_x = -21 }, -/turf/floor/wood/yew, +/turf/floor/laminate/yew, /area/ship/trade/unused) "Rg" = ( /obj/structure/railing/mapped{ @@ -7420,7 +7427,7 @@ /turf/floor/carpet/blue, /area/ship/trade/command/captain) "Rv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/start{ name = "Cargo Technician" }, @@ -7699,7 +7706,7 @@ /turf/wall/titanium, /area/ship/trade/shuttle/outgoing/general) "UV" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/ship/trade/dock) "UY" = ( @@ -7742,7 +7749,7 @@ /area/ship/trade/garden) "Vd" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/fmate) "Vl" = ( /obj/structure/handrail{ @@ -7847,7 +7854,7 @@ dir = 8; pixel_x = 24 }, -/turf/floor/wood, +/turf/floor/laminate, /area/ship/trade/command/captain) "WE" = ( /obj/machinery/door/firedoor, @@ -7918,7 +7925,7 @@ /turf/floor/tiled, /area/ship/trade/shuttle/outgoing/general) "Xz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/techmaint, /area/ship/trade/maintenance/hallway) "XG" = ( @@ -7951,7 +7958,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/engine/aft) "Ya" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/warning, /obj/structure/catwalk, /obj/structure/railing/mapped, @@ -9045,7 +9052,7 @@ aa aa aa aa -aa +vN aa aa aa @@ -9259,7 +9266,7 @@ aa aa aa aa -aa +vN aa aa aa @@ -13196,7 +13203,7 @@ aa aa aa aa -aa +vN aa aa aa @@ -13639,7 +13646,7 @@ aa aa aa aa -aa +vN aa aa aa diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index eba7b7f15ab..bc596cfeecd 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -870,7 +870,7 @@ /turf/floor/tiled/techfloor/grid, /area/ship/trade/comms) "yM" = ( -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/floor/plating, /area/ship/trade/bridge_unused) @@ -1181,6 +1181,10 @@ /obj/machinery/commsrelay, /turf/floor/bluegrid, /area/ship/trade/comms) +"UX" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "UY" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -2382,7 +2386,7 @@ aa aa aa aa -aa +UX aa aa aa @@ -6665,7 +6669,7 @@ aa aa aa aa -aa +UX aa aa aa diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 4a39fccb330..d747204cc30 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -4,42 +4,43 @@ #include "../../code/unit_tests/offset_tests.dm" #endif - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../../mods/content/tabloids/_tabloids.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/government/away_sites/icarus/icarus.dm" #include "../../mods/content/corporate/away_sites/lar_maria/lar_maria.dm" - #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/mundane.dm" #include "../../mods/content/baychems/_baychems.dme" + #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/government/_government.dme" + #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/scaling_descriptors.dm" - #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/supermatter/_supermatter.dme" + #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/drakes/_drakes.dme" // #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/neoavians/_neoavians.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/vox/_vox.dme" #include "../../mods/content/polaris/_polaris.dme" @@ -53,14 +54,12 @@ #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 "tradeship_antagonists.dm" #include "tradeship_areas.dm" - #include "tradeship_departments.dm" #include "tradeship_documents.dm" #include "tradeship_jobs.dm" #include "tradeship_loadouts.dm" @@ -80,7 +79,6 @@ #include "jobs/engineering.dm" #include "jobs/medical.dm" #include "jobs/science.dm" - #include "jobs/synthetics.dm" #include "outfits/_outfits.dm" #include "outfits/command.dm" diff --git a/maps/tradeship/tradeship_jobs.dm b/maps/tradeship/tradeship_jobs.dm index 37acc966563..71ba7143cc3 100644 --- a/maps/tradeship/tradeship_jobs.dm +++ b/maps/tradeship/tradeship_jobs.dm @@ -1,19 +1,18 @@ /datum/map/tradeship - default_job_type = /datum/job/tradeship_deckhand + default_job_type = /datum/job/standard/assistant/tradeship default_department_type = /decl/department/civilian default_law_type = /datum/ai_laws/corporate - id_hud_icons = 'maps/tradeship/hud.dmi' allowed_jobs = list( - /datum/job/tradeship_deckhand, - /datum/job/tradeship_captain, + /datum/job/standard/assistant/tradeship, + /datum/job/standard/captain/tradeship, /datum/job/tradeship_first_mate, - /datum/job/tradeship_doctor/head, - /datum/job/tradeship_doctor, - /datum/job/tradeship_engineer/head, - /datum/job/tradeship_engineer, - /datum/job/tradeship_researcher/head, - /datum/job/tradeship_researcher, - /datum/job/tradeship_robot + /datum/job/standard/cmo/tradeship, + /datum/job/standard/doctor/tradeship, + /datum/job/standard/chief_engineer/tradeship, + /datum/job/standard/engineer/tradeship, + /datum/job/standard/rd/tradeship, + /datum/job/standard/scientist/tradeship, + /datum/job/standard/robot ) /obj/machinery/suit_cycler/tradeship @@ -39,4 +38,4 @@ /obj/item/clothing/head/helmet/space/void/excavation, /obj/item/clothing/head/helmet/space/void/engineering/salvage )) - . = ..() \ No newline at end of file + . = ..() diff --git a/maps/tradeship/tradeship_spawnpoints.dm b/maps/tradeship/tradeship_spawnpoints.dm index 054216b46fe..36e4d8acdb7 100644 --- a/maps/tradeship/tradeship_spawnpoints.dm +++ b/maps/tradeship/tradeship_spawnpoints.dm @@ -9,7 +9,7 @@ /decl/spawnpoint/cryo name = "Port Cryogenic Storage" spawn_announcement = "has completed revival in the port cryogenics bay" - disallow_job = list(/datum/job/tradeship_robot) + disallow_job = list(/datum/job/standard/robot) /decl/spawnpoint/cryo/two name = "Starboard Cryogenic Storage" @@ -22,7 +22,7 @@ /decl/spawnpoint/cryo/captain name = "Captain Compartment" spawn_announcement = "has completed revival in the captain compartment" - restrict_job = list(/datum/job/tradeship_captain) + restrict_job = list(/datum/job/standard/captain/tradeship) uid = "spawn_cryo_captain" /obj/abstract/landmark/latejoin/cryo_captain diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 2db88925f64..ee1696d6e61 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -1,21 +1,30 @@ -var/global/datum/map/using_map = new USING_MAP_DATUM -var/global/list/all_maps = list() +var/global/datum/map/using_map = new USING_MAP_DATUM +var/global/list/all_maps = list() +var/global/list/votable_maps = list() var/global/const/MAP_HAS_BRANCH = 1 //Branch system for occupations, togglable -var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable - -/hook/startup/proc/initialise_map_list() - for(var/type in subtypesof(/datum/map)) - var/datum/map/M - if(type == global.using_map.type) - M = global.using_map - M.setup_map() - else - M = new type - if(!M.path) - log_error("Map '[M]' ([type]) does not have a defined path, not adding to map list!") +var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable + +/proc/initialise_map_list() + for(var/map_type in subtypesof(/datum/map)) + + var/datum/map/map_instance = map_type + if(TYPE_IS_ABSTRACT(map_instance)) + continue + + if(map_type == global.using_map.type) + map_instance = global.using_map + map_instance.setup_map() + else if(map_instance::path) + map_instance = new map_instance else - global.all_maps[M.path] = M + log_error("Map '[map_type]' does not have a defined path, not adding to map list!") + continue + + global.all_maps[map_instance.path] = map_instance + if(map_instance.votable) + global.votable_maps[map_instance.path] = map_instance + return 1 /datum/map @@ -104,7 +113,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/default_law_type = /datum/ai_laws/asimov // The default lawset use by synth units, if not overriden by their laws var. var/security_state = /decl/security_state/default // The default security state system to use. - var/id_hud_icons = 'icons/mob/hud.dmi' // Used by the ID HUD (primarily sechud) overlay. + var/hud_icons = 'icons/screen/hud.dmi' // Used by the ID HUD (primarily sechud) overlay. + var/implant_hud_icons = 'icons/screen/hud_implants.dmi' + var/med_hud_icons = 'icons/screen/hud_med.dmi' var/num_exoplanets = 0 var/force_exoplanet_type // Used to override exoplanet weighting and always pick the same exoplanet. @@ -127,6 +138,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/default_species = SPECIES_HUMAN + // Can this map be voted for by players? + var/votable = TRUE + var/list/available_background_info = list( /decl/background_category/homeworld = list(/decl/background_detail/location/other), /decl/background_category/faction = list(/decl/background_detail/faction/other), @@ -188,6 +202,12 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable ) + var/default_ui_style + +/datum/map/New() + ..() + default_ui_style ||= DEFAULT_UI_STYLE + /datum/map/proc/get_background_categories() if(!background_categories_generated) if(isnull(_background_categories)) @@ -262,10 +282,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable if(!allowed_jobs) allowed_jobs = list() - for(var/jtype in subtypesof(/datum/job)) - var/datum/job/job = jtype - if(initial(job.available_by_default)) - allowed_jobs += jtype + for(var/datum/job/job as anything in subtypesof(/datum/job)) + if(!TYPE_IS_ABSTRACT(job) && job::available_by_default) + allowed_jobs += job if(ispath(default_job_type, /datum/job)) var/datum/job/J = default_job_type @@ -533,3 +552,25 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable /datum/map/proc/finalize_map_generation() return + +/datum/map/proc/validate() + . = TRUE + if(!length(SSmapping.player_levels)) + log_error("[name] has no player levels!") + . = FALSE + if(!length(SSmapping.station_levels)) + log_error("[name] has no station levels!") + . = FALSE + // TODO: add an admin level loaded from template for maps like tradeship (generic admin level modpack?) + /* + if(!length(SSmapping.admin_levels)) + log_error("[name] has no admin levels!") + . = FALSE + */ + if(!length(SSmapping.contact_levels)) + log_error("[name] has no contact levels!") + . = FALSE + +/datum/map/proc/get_available_submap_archetypes() + return decls_repository.get_decls_of_subtype_unassociated(/decl/submap_archetype) + diff --git a/mods/_modpack.dm b/mods/_modpack.dm index 279002ba251..0fb1d5d7908 100644 --- a/mods/_modpack.dm +++ b/mods/_modpack.dm @@ -6,7 +6,13 @@ /// A string with authors of this modpack. var/author var/secrets_directory - var/list/dreams //! A list of strings to be added to the random dream proc. + /// The folder to load additional NanoUI templates from. Must be relative to the DME's location (root game folder). + var/nanoui_directory + + var/list/dreams //! A list of strings to be added to the random dream proc. + + var/list/tabloid_headlines //! A list of headline and article data used by the tabloids modpack. + var/list/tabloid_publishers //! A list of name strings used by the tabloids modpack. var/list/credits_other //! A list of strings that are used by the end of round credits roll. var/list/credits_adventure_names //! A list of strings that are used by the end of round credits roll. @@ -32,6 +38,15 @@ if(!fexists(secrets_directory)) return "Modpack secrets_directory does not exist." SSsecrets.load_directories |= secrets_directory + if(nanoui_directory) + nanoui_directory = trim(lowertext(nanoui_directory)) + if(!length(nanoui_directory)) + return "Modpack nanoui_directory is zero length after trim." + if(copytext(nanoui_directory, -1) != "/") + nanoui_directory = "[nanoui_directory]/" + if(!fexists(nanoui_directory)) + return "Modpack nanoui_directory does not exist." + SSmodpacks.modpack_nanoui_directories |= nanoui_directory /decl/modpack/proc/initialize() return @@ -56,6 +71,10 @@ if(length(credits_nouns)) SSlore.credits_nouns |= credits_nouns +/// This runs on-roundstart after roundstart characters have been created. +/decl/modpack/proc/on_roundstart() + return + /decl/modpack/proc/get_membership_perks() return @@ -70,11 +89,11 @@ . = "

      Modpacks List



      " for(var/modpack in SSmodpacks.loaded_modpacks) var/decl/modpack/M = SSmodpacks.loaded_modpacks[modpack] - + if(M.name) . += "
      " . += "
      [M.name]
      " - + if(M.desc || M.author) . += "
      " if(M.desc) diff --git a/mods/content/baychems/reactions.dm b/mods/content/baychems/reactions.dm index 0528696a19f..ff2acecd05a 100644 --- a/mods/content/baychems/reactions.dm +++ b/mods/content/baychems/reactions.dm @@ -44,7 +44,7 @@ result = /decl/material/liquid/painkillers/strong required_reagents = list( /decl/material/liquid/painkillers = 1, - /decl/material/liquid/ethanol = 1, + /decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/acetone = 1 ) result_amount = 3 @@ -52,7 +52,7 @@ /decl/chemical_reaction/drug/oxycodone name = "Oxycodone" result = /decl/material/liquid/painkillers/oxycodone - required_reagents = list(/decl/material/liquid/ethanol = 1, /decl/material/liquid/painkillers/strong = 1) + required_reagents = list(/decl/material/liquid/alcohol/ethanol = 1, /decl/material/liquid/painkillers/strong = 1) catalysts = list(/decl/material/solid/phoron = 5) result_amount = 1 diff --git a/mods/content/corporate/_corporate.dme b/mods/content/corporate/_corporate.dme index 3a62ba3a912..390348d3603 100644 --- a/mods/content/corporate/_corporate.dme +++ b/mods/content/corporate/_corporate.dme @@ -15,7 +15,6 @@ #include "clothing\head\ert.dm" #include "clothing\head\helmets.dm" #include "clothing\masks\rubber.dm" -#include "clothing\rigs\ert.dm" #include "clothing\suit\armour.dm" #include "clothing\suit\captain.dm" #include "clothing\suit\hoodies.dm" @@ -40,9 +39,11 @@ #include "items\cups.dm" #include "items\documents.dm" #include "items\medals.dm" +#include "items\random.dm" #include "items\stamps.dm" #include "items\wristcomp.dm" #include "machines\machines.dm" +#include "random_ruins\exoplanet_ruins\oldpod\oldpod.dm" #include "structures\lockers.dm" // END_INCLUDE #endif 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 cc042aa3f94..68f05027666 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 @@ -694,37 +694,37 @@ /turf/floor/plating, /area/lar_maria/atmos) "bV" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "bW" = ( /obj/machinery/door/firedoor, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "bX" = ( /obj/machinery/alarm{ dir = 1; pixel_y = -25 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "bY" = ( /obj/machinery/light{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "bZ" = ( /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "ca" = ( /obj/abstract/landmark/corpse/lar_maria/virologist, /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cb" = ( /obj/structure/closet/emcloset, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cc" = ( /obj/machinery/light{ @@ -798,12 +798,12 @@ /area/lar_maria/dorms) "cp" = ( /obj/machinery/door/airlock, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cq" = ( /obj/machinery/door/airlock, /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cr" = ( /obj/structure/bookcase, @@ -854,35 +854,35 @@ /turf/floor/plating, /area/lar_maria/atmos) "cD" = ( -/obj/structure/table/woodentable, -/turf/floor/wood, +/obj/structure/table/laminate, +/turf/floor/laminate, /area/lar_maria/dorms) "cE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/smokes, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/toy, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/glowsticks, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/smokes, /obj/random/drinkbottle, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cI" = ( /obj/machinery/computer/modular{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cJ" = ( /obj/structure/window/basic{ @@ -1009,32 +1009,32 @@ /obj/structure/bed/chair/comfy/purple{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "cZ" = ( /obj/abstract/landmark/corpse/lar_maria/test_subject, /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "da" = ( /obj/structure/bookcase/manuals/medical, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "db" = ( /obj/structure/bed/chair/comfy/black{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dc" = ( /mob/living/simple_animal/hostile/lar_maria/guard/ranged, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "de" = ( /obj/structure/bed/chair/comfy/brown{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "df" = ( /obj/structure/closet, @@ -1042,11 +1042,11 @@ /obj/random/smokes, /obj/random/snack, /obj/random/snack, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dg" = ( /obj/structure/bookcase/manuals/engineering, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dh" = ( /obj/structure/window/basic, @@ -1118,31 +1118,31 @@ /area/lar_maria/atmos) "ds" = ( /mob/living/simple_animal/hostile/lar_maria/virologist, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dt" = ( /obj/structure/bed/padded, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "du" = ( /obj/machinery/light, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dv" = ( /obj/structure/closet, /obj/random/masks, /obj/random/accessory, /obj/random/smokes, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dw" = ( /obj/random/closet, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dx" = ( /obj/structure/bed/padded, /obj/random/plushie, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dy" = ( /obj/structure/window/basic, @@ -1212,7 +1212,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dJ" = ( /obj/structure/window/basic{ @@ -1316,18 +1316,18 @@ "dX" = ( /obj/structure/bed/padded, /obj/random/plushie/large, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dY" = ( /obj/structure/closet, /obj/random/loot, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "dZ" = ( /obj/structure/closet, /obj/random/shoes, /obj/random/snack, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "ea" = ( /obj/structure/table, @@ -1387,40 +1387,40 @@ /area/lar_maria/library) "ei" = ( /obj/structure/bed/chair/comfy/beige, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "ej" = ( /obj/machinery/botany, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "ek" = ( /obj/structure/bed/chair/comfy/brown, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "el" = ( /obj/abstract/landmark/corpse/lar_maria/virologist_female, /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "em" = ( /obj/machinery/suit_cycler, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "en" = ( /obj/structure/closet, /obj/random/loot, /obj/random/accessory, /obj/item/clothing/head/soft/zhp_cap, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "eo" = ( /obj/structure/bed/chair/comfy/green, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "ep" = ( /obj/structure/closet, /obj/random/accessory, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "eq" = ( /turf/wall/r_wall, @@ -1482,7 +1482,7 @@ /turf/floor/tiled, /area/lar_maria/office) "eC" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper_bin, /obj/item/pen/blue, /turf/floor/tiled, @@ -1498,20 +1498,20 @@ /turf/floor/tiled, /area/lar_maria/office) "eF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/handcuffs, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "eG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/smokes, /obj/random/snack, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "eH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/beakers, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "eI" = ( /obj/structure/hygiene/toilet, @@ -1588,7 +1588,7 @@ /turf/floor/tiled, /area/lar_maria/office) "eU" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/tiled, /area/lar_maria/office) "eV" = ( @@ -1642,7 +1642,7 @@ "fh" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fi" = ( /obj/machinery/alarm{ @@ -1650,7 +1650,7 @@ pixel_y = -25 }, /obj/effect/decal/cleanable/blood, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fj" = ( /obj/machinery/light/small{ @@ -1812,31 +1812,31 @@ /turf/floor/tiled, /area/lar_maria/office) "fF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/cane/aluminium, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fG" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/clothing/head/soft/zhp_cap, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fH" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/drinkbottle, /obj/random/contraband, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/toolbox, /obj/item/scalpel, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/snack, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fK" = ( /obj/machinery/door/airlock, @@ -1905,25 +1905,25 @@ /obj/machinery/vending/engivend{ req_access = list() }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fV" = ( /mob/living/simple_animal/hostile/lar_maria/guard, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fW" = ( /obj/structure/bookcase, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fX" = ( /mob/living/simple_animal/hostile/lar_maria/virologist/female, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fY" = ( /obj/structure/closet, /obj/random/handgun, /obj/random/powercell, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "fZ" = ( /obj/structure/hygiene/shower{ @@ -2012,7 +2012,7 @@ dir = 4; pixel_x = -25 }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "gn" = ( /obj/machinery/power/apc{ @@ -2024,12 +2024,12 @@ /obj/structure/cable{ icon_state = "0-2" }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "go" = ( /obj/structure/bed/padded, /obj/abstract/landmark/corpse/lar_maria/virologist, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/dorms) "gp" = ( /obj/random/trash, @@ -2067,7 +2067,7 @@ /obj/machinery/door/airlock, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/mess_hall) "gw" = ( /obj/machinery/door/airlock, @@ -2076,7 +2076,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/turf/floor/wood, +/turf/floor/laminate, /area/lar_maria/mess_hall) "gx" = ( /turf/wall/r_wall, diff --git a/mods/content/corporate/clothing/outfits.dm b/mods/content/corporate/clothing/outfits.dm index 9760a72d148..3d2d3824662 100644 --- a/mods/content/corporate/clothing/outfits.dm +++ b/mods/content/corporate/clothing/outfits.dm @@ -46,15 +46,15 @@ /decl/outfit/death_command name = "Spec Ops - Death commando" -/decl/outfit/death_command/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/outfit/death_command/equip_outfit(mob/living/wearer, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/deathsquad = GET_DECL(/decl/special_role/deathsquad) - deathsquad.equip_role(H) + deathsquad.equip_role(wearer) return 1 /decl/outfit/syndicate_command name = "Spec Ops - Syndicate commando" -/decl/outfit/syndicate_command/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/outfit/syndicate_command/equip_outfit(mob/living/wearer, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) var/decl/special_role/commandos = GET_DECL(/decl/special_role/deathsquad/mercenary) - commandos.equip_role(H) + commandos.equip_role(wearer) return 1 diff --git a/mods/content/corporate/datum/antagonists/commando.dm b/mods/content/corporate/datum/antagonists/commando.dm index f36ce069786..3aac5874e4b 100644 --- a/mods/content/corporate/datum/antagonists/commando.dm +++ b/mods/content/corporate/datum/antagonists/commando.dm @@ -26,15 +26,3 @@ /obj/item/gun/energy/laser, /obj/item/energy_blade/sword ) - -/obj/item/encryptionkey/hacked - can_decrypt = list(access_hacked) - 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}' - encryption_keys = list(/obj/item/encryptionkey/hacked) diff --git a/mods/content/corporate/datum/robolimbs.dm b/mods/content/corporate/datum/robolimbs.dm index 8c3c7cc009b..a103424c166 100644 --- a/mods/content/corporate/datum/robolimbs.dm +++ b/mods/content/corporate/datum/robolimbs.dm @@ -16,7 +16,7 @@ desc = "This limb has a white polymer casing with blue holo-displays." icon_base = 'mods/content/corporate/icons/cyberlimbs/bishop/bishop_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -28,7 +28,7 @@ icon_base = 'mods/content/corporate/icons/cyberlimbs/bishop/bishop_rook.dmi' has_eyes = FALSE bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_SECONDARY ) @@ -39,7 +39,7 @@ desc = "This limb has a white polymer casing with blue holo-displays." icon_base = 'mods/content/corporate/icons/cyberlimbs/bishop/bishop_glyph.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_SECONDARY ) @@ -59,7 +59,7 @@ desc = "This limb has cheap plastic panels mounted on grey metal." icon_base = 'mods/content/corporate/icons/cyberlimbs/cybersolutions/cybersolutions_wight.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -87,7 +87,7 @@ desc = "This limb is lightweight with a sleek high-contrast design." icon_base = 'mods/content/corporate/icons/cyberlimbs/einstein/einstein_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -135,6 +135,10 @@ has_limbs = list( BP_HEAD = list("path" = /obj/item/organ/external/head), ) + organ_material = /decl/material/solid/metal/aluminium + matter = list( + /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY + ) /decl/bodytype/prosthetic/wardtakahashi @@ -143,7 +147,7 @@ icon_base = 'mods/content/corporate/icons/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi' body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -154,7 +158,7 @@ desc = "This limb has a sleek black and white polymer finish." icon_base = 'mods/content/corporate/icons/cyberlimbs/zenghu/zenghu_spirit.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -180,7 +184,7 @@ desc = "This limb is simple and functional; no effort has been made to make it look human." icon_base = 'mods/content/corporate/icons/cyberlimbs/morpheus/morpheus_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel uid = "bodytype_prosthetic_morpheus" /decl/bodytype/prosthetic/morpheus/zenith @@ -218,7 +222,7 @@ body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS bodytype_category = BODYTYPE_HUMANOID // todo: add synthflesh material? - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -242,7 +246,7 @@ desc = "This limb has a minimalist black and red casing." icon_base = 'mods/content/corporate/icons/cyberlimbs/xion/xion_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/aluminium + organ_material = /decl/material/solid/metal/aluminium matter = list( /decl/material/solid/organic/plastic = MATTER_AMOUNT_SECONDARY ) @@ -287,7 +291,7 @@ desc = "A simple but efficient polymer robotic limb, created by NanoTrasen." icon_base = 'mods/content/corporate/icons/cyberlimbs/nanotrasen/nanotrasen_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/organic/plastic + organ_material = /decl/material/solid/organic/plastic uid = "bodytype_prosthetic_nanotrasen" /decl/bodytype/prosthetic/nanotrasen/metro @@ -311,7 +315,7 @@ appearance_flags = HAS_SKIN_TONE_NORMAL | HAS_UNDERWEAR | HAS_EYE_COLOR body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/organic/plastic + organ_material = /decl/material/solid/organic/plastic uid = "bodytype_prosthetic_zenghu_fem" /decl/bodytype/prosthetic/zenghu/masculine @@ -325,7 +329,7 @@ desc = "This limb seems meticulously hand-crafted, and distinctly Unathi in design." icon_base = 'mods/content/corporate/icons/cyberlimbs/uesseka/uesseka_main.dmi' bodytype_category = BODYTYPE_HUMANOID - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel matter = list( /decl/material/solid/metal/stainlesssteel = MATTER_AMOUNT_SECONDARY ) diff --git a/mods/content/corporate/icons/banner.dmi b/mods/content/corporate/icons/banner.dmi deleted file mode 100644 index cc4c3c95e9e..00000000000 Binary files a/mods/content/corporate/icons/banner.dmi and /dev/null differ diff --git a/mods/content/corporate/icons/banner_symbols.dmi b/mods/content/corporate/icons/banner_symbols.dmi new file mode 100644 index 00000000000..8d534a69a48 Binary files /dev/null and b/mods/content/corporate/icons/banner_symbols.dmi differ diff --git a/mods/content/corporate/items/clutter.dm b/mods/content/corporate/items/clutter.dm index 4de07358d1b..19ba76ee455 100644 --- a/mods/content/corporate/items/clutter.dm +++ b/mods/content/corporate/items/clutter.dm @@ -23,14 +23,19 @@ /obj/item/banner/nanotrasen name = "\improper NanoTrasen banner" hung_desc = "The banner is emblazoned with the NanoTrasen logo." - icon = 'mods/content/corporate/icons/banner.dmi' desc = "A banner emblazoned with the NanoTrasen logo." material_alteration = MAT_FLAG_ALTERATION_NONE color = COLOR_NAVY_BLUE + trim_color = COLOR_GOLD decals = list( - "banner_trim" = COLOR_GOLD, - "banner_nanotrasen" = COLOR_WHITE + /decl/banner_symbol/nanotrasen = COLOR_WHITE ) /obj/structure/banner_frame/nanotrasen banner = /obj/item/banner/nanotrasen + +/decl/banner_symbol/nanotrasen + icon = 'mods/content/corporate/icons/banner_symbols.dmi' + name = "NanoTrasen logo" + icon_state = "nanotrasen" + uid = "symbol_corporate_nanotrasen" diff --git a/mods/content/corporate/items/random.dm b/mods/content/corporate/items/random.dm new file mode 100644 index 00000000000..54dde92f9ce --- /dev/null +++ b/mods/content/corporate/items/random.dm @@ -0,0 +1,10 @@ +/obj/random/maintenance/security/spawn_choices() + var/static/injected = FALSE + . = ..() + if(!injected) + .[/obj/item/clothing/head/soft/sec/corp] = 4 + .[/obj/item/clothing/head/beret/corp/sec] = 3 + .[/obj/item/clothing/head/beret/corp/sec/corporate/hos] = 3 + .[/obj/item/clothing/head/beret/corp/sec/navy/officer] = 3 + .[/obj/item/clothing/suit/armor/vest/security] = 2 + injected = TRUE \ No newline at end of file diff --git a/mods/content/corporate/items/stamps.dm b/mods/content/corporate/items/stamps.dm index cfc6df4dbbf..35b35829728 100644 --- a/mods/content/corporate/items/stamps.dm +++ b/mods/content/corporate/items/stamps.dm @@ -4,7 +4,7 @@ /obj/item/stamp/hop name = "head of personnel's rubber stamp" - icon = 'icons/obj/items/stamps/stamp_xo.dmi' + icon = 'icons/obj/items/stamps/stamp_cap.dmi' /obj/item/stamp/ce name = "chief engineer's rubber stamp" @@ -32,7 +32,7 @@ /obj/item/stamp/ward name = "warden's rubber stamp" - icon = 'icons/obj/items/stamps/stamp_cos.dmi' + icon = 'icons/obj/items/stamps/stamp_brig.dmi' /obj/item/stamp/internalaffairs name = "internal affairs' rubber stamp" diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm similarity index 87% rename from maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm rename to mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm index 0ea139fdbc7..4175cd8f17c 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dm +++ b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dm @@ -1,8 +1,7 @@ -#include "../../../../mods/content/corporate/_corporate.dme" - /datum/map_template/ruin/exoplanet/oldpod name = "old pod" description = "A now unused, crashed escape pod." + prefix = "mods/content/corporate/random_ruins/exoplanet_ruins/" suffixes = list("oldpod/oldpod.dmm") cost = 0.5 template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS diff --git a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm similarity index 73% rename from maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm rename to mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm index ed155d0788a..1edbe07fd68 100644 --- a/maps/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm +++ b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm @@ -40,13 +40,13 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/plating, /area/map_template/oldpod) "ai" = ( /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aj" = ( @@ -65,25 +65,25 @@ /obj/structure/bed, /obj/abstract/landmark/corpse/doctor, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "al" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "am" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "an" = ( /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ao" = ( @@ -93,7 +93,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ap" = ( @@ -103,7 +103,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aq" = ( @@ -112,8 +112,8 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/filth, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -121,30 +121,30 @@ /obj/machinery/light/small{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "as" = ( /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "at" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "au" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -152,8 +152,8 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/allowed_leak, /turf/floor/tiled/monotile, /area/map_template/oldpod) @@ -162,52 +162,52 @@ dir = 4 }, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "ax" = ( /obj/machinery/door/firedoor, /obj/effect/wallframe_spawn/reinforced/hull, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/map_template/oldpod) "ay" = ( /obj/item/frame/air_alarm, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stock_parts/circuitboard/air_alarm, /turf/floor/tiled/monotile, /area/map_template/oldpod) "az" = ( /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aA" = ( /obj/random/firstaid, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aB" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aC" = ( /obj/item/clothing/head/helmet/space/emergency, /obj/item/clothing/suit/space/emergency, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aD" = ( @@ -223,26 +223,26 @@ /obj/random/tech_supply, /obj/random/tech_supply, /obj/item/tool/pickaxe, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aE" = ( /obj/structure/window/reinforced{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/table, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aG" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aH" = ( @@ -250,7 +250,7 @@ icon_state = "0-4" }, /obj/item/frame/apc, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/cell/crap/empty, /obj/item/stock_parts/circuitboard/apc, /turf/floor/tiled/monotile, @@ -260,29 +260,29 @@ icon_state = "2-8" }, /obj/effect/decal/cleanable/filth, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aJ" = ( /obj/abstract/landmark/corpse/pirate, /obj/item/gun/energy/captain, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aK" = ( /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aL" = ( /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aM" = ( @@ -290,17 +290,17 @@ /obj/item/baton/cattleprod, /obj/item/shard, /obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aN" = ( /obj/machinery/door/firedoor, /obj/structure/wall_frame/hull, /obj/structure/grille, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, -/obj/item/stack/material/rods, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, +/obj/item/stack/material/rods/mapped/steel, /obj/item/shard, /obj/item/shard, /obj/item/shard, @@ -327,7 +327,7 @@ /turf/floor/plating, /area/map_template/oldpod) "aQ" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/monotile, /area/map_template/oldpod) "aR" = ( @@ -345,16 +345,16 @@ name = "plastic table frame" }, /obj/item/firstaid/surgery, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aS" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aT" = ( @@ -366,7 +366,7 @@ dir = 1 }, /obj/structure/closet/crate/plastic/rations, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/gun/projectile/zipgun, /obj/item/gun/projectile/zipgun, /obj/item/gun/projectile/zipgun, @@ -411,16 +411,16 @@ dir = 8 }, /obj/machinery/optable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "aZ" = ( @@ -433,7 +433,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "ba" = ( @@ -475,14 +475,14 @@ }, /obj/random/firstaid, /obj/random/firstaid, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "bf" = ( /obj/effect/floor_decal/industrial/warning, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) "bg" = ( @@ -493,9 +493,9 @@ dir = 6; icon_state = "warning" }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white/monotile, /area/map_template/oldpod) diff --git a/mods/content/corporate/structures/lockers.dm b/mods/content/corporate/structures/lockers.dm index 33c3cbf1eab..5116f72e02c 100644 --- a/mods/content/corporate/structures/lockers.dm +++ b/mods/content/corporate/structures/lockers.dm @@ -51,3 +51,6 @@ /obj/structure/closet/secure_closet/hop/WillContain() . = ..() + /obj/item/clothing/suit/armor/vest/nt + +/obj/structure/closet/secure_closet/pilot + jumpsuit_type = /obj/item/clothing/jumpsuit/pilot \ No newline at end of file diff --git a/mods/content/dungeon_loot/_dungeon_loot.dm b/mods/content/dungeon_loot/_dungeon_loot.dm index 176ce11422b..0591781ed1c 100644 --- a/mods/content/dungeon_loot/_dungeon_loot.dm +++ b/mods/content/dungeon_loot/_dungeon_loot.dm @@ -17,4 +17,4 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /decl/modpack/dungeon_loot name = "Dungeon Loot" - dreams = list("Packrats") + dreams = list("packrats") diff --git a/mods/content/dungeon_loot/_dungeon_loot.dme b/mods/content/dungeon_loot/_dungeon_loot.dme index 18e66276b2f..ae3880c4164 100644 --- a/mods/content/dungeon_loot/_dungeon_loot.dme +++ b/mods/content/dungeon_loot/_dungeon_loot.dme @@ -3,6 +3,7 @@ // BEGIN_INCLUDE #include "_dungeon_loot.dm" #include "loot_pile.dm" +#include "subtypes\bookcase.dm" #include "subtypes\exosuit.dm" #include "subtypes\maint.dm" #include "subtypes\surface.dm" diff --git a/mods/content/dungeon_loot/loot_pile.dm b/mods/content/dungeon_loot/loot_pile.dm index b488fd95abf..5289e4ea5aa 100644 --- a/mods/content/dungeon_loot/loot_pile.dm +++ b/mods/content/dungeon_loot/loot_pile.dm @@ -62,7 +62,7 @@ return TRUE //You already searched this one - if(!allow_multiple_looting && LAZYISIN(user.ckey, searched_by)) + if(!allow_multiple_looting && LAZYISIN(searched_by, user.ckey)) to_chat(L, SPAN_WARNING("You can't find anything else vaguely useful in \the [src]. Another set of eyes might, however.")) return TRUE diff --git a/mods/content/dungeon_loot/subtypes/bookcase.dm b/mods/content/dungeon_loot/subtypes/bookcase.dm new file mode 100644 index 00000000000..4752b9d4bbf --- /dev/null +++ b/mods/content/dungeon_loot/subtypes/bookcase.dm @@ -0,0 +1,92 @@ +// Contains generic mundane/fantasy loot. +/obj/structure/loot_pile/bookcase + name = "bookcase" + desc = "A bookcase that has long since fallen into disrepair. It may still have some useful things left on its shelves..." + icon = 'icons/obj/structures/bookcase.dmi' + icon_state = "bookcase-damaged" // preview + material = /decl/material/solid/organic/wood/walnut + color = /decl/material/solid/organic/wood/walnut::color + material_alteration = MAT_FLAG_ALTERATION_ALL + /// 1-indexed, pick a random overlay to add corresponding to "loot[rand(1, loot_states)]". + var/loot_states = 3 + /// A text string corresponding to the icon_state of the loot overlay we're using. + var/loot_state + +/obj/structure/loot_pile/bookcase/update_material_name(override_name) + . = ..() + SetName("[pick("ruined", "destroyed", "dilapidated")] [name]") + +/obj/structure/loot_pile/bookcase/ebony + material = /decl/material/solid/organic/wood/ebony + color = /decl/material/solid/organic/wood/ebony::color + +/obj/structure/loot_pile/bookcase/get_icon_states_to_use() + var/static/list/icon_states_to_use = list("bookcase-damaged", "fancy-damaged") + return icon_states_to_use + +/obj/structure/loot_pile/bookcase/Initialize(ml, _mat, _reinf_mat) + if(isnum(loot_states) && loot_states > 0) + loot_state = "loot[rand(1, loot_states)]" + . = ..() + +/obj/structure/loot_pile/bookcase/on_update_icon() + . = ..() + if(loot_state) + add_overlay(overlay_image(icon, loot_state, null, RESET_COLOR|RESET_ALPHA)) + +/obj/structure/loot_pile/bookcase/get_common_loot() + var/static/list/common_loot = list( + /obj/item/paper/scroll, + /obj/item/paper/scroll, + /obj/item/paper/scroll, + /obj/item/pen/fancy/quill, + /obj/item/pen/fancy/quill, + /obj/item/clothing/neck/prayer_beads/random, + /obj/item/hourglass, + ) + return common_loot + +/obj/structure/loot_pile/bookcase/get_uncommon_loot() + var/static/list/uncommon_loot = list( + /obj/item/chems/glass/inkwell, + /obj/item/clothing/glasses/prescription/pincenez, + /obj/item/chems/drinks/bottle/wine, + /obj/item/stack/medical/ointment/crafted, + /obj/item/stack/medical/bandage/crafted, + ) + return uncommon_loot + +/obj/structure/loot_pile/bookcase/get_rare_loot() + var/static/list/rare_loot = list( + /obj/item/bone/skull, // unlucky! + /obj/item/pen/fancy/quill/goose, + /obj/item/clothing/gloves/ring/seal/signet, + /obj/item/chems/drinks/bottle/champagne, + /obj/item/chems/drinks/bottle/premiumwine, + ) + return rare_loot + +/// This spawns either a normal bookcase (20%), a damaged normal bookcase (60%), or a lootable decaying bookcase (20%). +/// There's also 20% chance to just spawn nothing. +/obj/random/dungeon_bookcase + name = "random dungeon bookcase" + icon = 'icons/obj/structures/bookcase.dmi' + icon_state = "bookcase-random" + spawn_nothing_percentage = 20 + +/obj/random/dungeon_bookcase/spawn_choices() + var/static/list/spawnable_choices = list( + /obj/structure/bookcase/ebony = 40, + /obj/structure/bookcase/fancy/ebony = 40, + /obj/structure/loot_pile/bookcase/ebony = 20 + ) + return spawnable_choices + +/obj/random/dungeon_bookcase/spawn_item() + . = ..() + for(var/obj/structure/bookcase/bookcase in .) + if(prob(25)) + continue + var/bookcase_max_health = bookcase.get_max_health() + bookcase.take_damage(bookcase_max_health * rand(51, 70)/100) + bookcase.update_icon() \ No newline at end of file diff --git a/mods/content/dungeon_loot/subtypes/maint.dm b/mods/content/dungeon_loot/subtypes/maint.dm index 1063d1d165f..cea9732ac81 100644 --- a/mods/content/dungeon_loot/subtypes/maint.dm +++ b/mods/content/dungeon_loot/subtypes/maint.dm @@ -146,7 +146,7 @@ /obj/item/food/old/hotdog, /obj/item/food/old/pizza, /obj/item/ammo_casing, - /obj/item/stack/material/rods/ten, + /obj/item/stack/material/rods/mapped/steel/ten, /obj/item/stack/material/sheet/mapped/steel/five, /obj/item/stack/material/cardstock/mapped/cardboard/five, /obj/item/poster, diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 3cd8559ddf0..87b99cb04e9 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -28,13 +28,25 @@ #include "datum\kobaloi\species.dm" #include "items\material_overrides.dm" #include "items\clothing\_loadout.dm" +#include "items\clothing\_overrides.dm" #include "items\clothing\_recipes.dm" #include "items\clothing\armor.dm" +#include "items\clothing\cloak.dm" #include "items\clothing\glasses.dm" #include "items\clothing\jerkin.dm" #include "items\clothing\loincloth.dm" -#include "items\clothing\overrides.dm" #include "items\clothing\trousers.dm" #include "props\signpost.dm" +#include "submaps\_submaps.dm" +#include "submaps\downlands\_downlands.dm" +#include "submaps\grassland\_grassland.dm" +#include "submaps\swamp\_swamp.dm" +#include "submaps\woods\_woods.dm" +#include "submaps\woods\bear_den\bear_den.dm" +#include "submaps\woods\chemistry_shack\chemistry_shack.dm" +#include "submaps\woods\fairy_rings\fairy_rings.dm" +#include "submaps\woods\fox_den\fox_den.dm" +#include "submaps\woods\hunter_camp\hunter_camp.dm" +#include "submaps\woods\old_cabin\old_cabin.dm" // END_INCLUDE #endif diff --git a/mods/content/fantasy/datum/hnoll/bodytypes.dm b/mods/content/fantasy/datum/hnoll/bodytypes.dm index b5da3ed52b5..1edda9e8e99 100644 --- a/mods/content/fantasy/datum/hnoll/bodytypes.dm +++ b/mods/content/fantasy/datum/hnoll/bodytypes.dm @@ -16,6 +16,7 @@ base_color = "#ae7d32" base_eye_color = "#00aa00" uid = "bodytype_hnoll" + footprints_icon = 'icons/mob/footprints/footprints_paw.dmi' default_sprite_accessories = list( SAC_HAIR = list( @@ -55,21 +56,21 @@ ) /decl/bodytype/hnoll/Initialize() - if(!equip_adjust) - equip_adjust = list( - slot_glasses_str = list( + if(!_equip_adjust) + _equip_adjust = list( + (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( + (slot_wear_mask_str) = list( "[NORTH]" = list( 0, 2), "[EAST]" = list( 2, 2), "[SOUTH]" = list( 0, 2), "[WEST]" = list(-2, 2) ), - slot_head_str = list( + (slot_head_str) = list( "[NORTH]" = list( 0, 2), "[EAST]" = list( 0, 2), "[SOUTH]" = list( 0, 2), diff --git a/mods/content/fantasy/datum/hnoll/species.dm b/mods/content/fantasy/datum/hnoll/species.dm index 31ebc61a61e..8bb1cd7496e 100644 --- a/mods/content/fantasy/datum/hnoll/species.dm +++ b/mods/content/fantasy/datum/hnoll/species.dm @@ -30,13 +30,6 @@ move_trail = /obj/effect/decal/cleanable/blood/tracks/paw base_external_prosthetics_model = null - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch, - /decl/natural_attack/bite/sharp - ) - available_background_info = list( /decl/background_category/homeworld = list( /decl/background_detail/location/fantasy, diff --git a/mods/content/fantasy/datum/kobaloi/bodytypes.dm b/mods/content/fantasy/datum/kobaloi/bodytypes.dm index 3e87eafcf54..72740539a49 100644 --- a/mods/content/fantasy/datum/kobaloi/bodytypes.dm +++ b/mods/content/fantasy/datum/kobaloi/bodytypes.dm @@ -32,87 +32,87 @@ uid = "bodytype_kobaloi" /decl/bodytype/kobaloi/Initialize() - if(!equip_adjust) - equip_adjust = list( - BP_R_HAND = list( + if(!_equip_adjust) + _equip_adjust = list( + (BP_R_HAND) = list( "[NORTH]" = list( 1, -4), "[EAST]" = list( 0, -4), "[SOUTH]" = list(-1, -4), "[WEST]" = list(-1, -4) ), - BP_L_HAND = list( + (BP_L_HAND) = list( "[NORTH]" = list(-1, -4), "[EAST]" = list( 1, -4), "[SOUTH]" = list( 1, -4), "[WEST]" = list( 0, -4) ), - slot_w_uniform_str = list( + (slot_w_uniform_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_belt_str = list( + (slot_belt_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_handcuffed_str = list( + (slot_handcuffed_str) = list( "[NORTH]" = list(-1, -4), "[EAST]" = list( 1, -4), "[SOUTH]" = list( 1, -4), "[WEST]" = list( 0, -4) ), - slot_wear_id_str = list( + (slot_wear_id_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_gloves_str = list( + (slot_gloves_str) = list( "[NORTH]" = list(-1, -4), "[EAST]" = list( 1, -4), "[SOUTH]" = list( 1, -4), "[WEST]" = list( 0, -4) ), - slot_wear_suit_str = list( + (slot_wear_suit_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 1, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-1, -6) ), - slot_back_str = list( + (slot_back_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 1, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-1, -5) ), - slot_glasses_str = list( + (slot_glasses_str) = list( "[NORTH]" = list( 0, -6), "[EAST]" = list( 3, -6), "[SOUTH]" = list( 0, -6), "[WEST]" = list(-3, -6) ), - slot_wear_mask_str = list( + (slot_wear_mask_str) = list( "[NORTH]" = list( 0, -7), "[EAST]" = list( 5, -7), "[SOUTH]" = list( 0, -7), "[WEST]" = list(-5, -7) ), - slot_head_str = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 3, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-3, -5) ), - slot_l_ear_str = list( + (slot_l_ear_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 3, -5), "[SOUTH]" = list( 0, -5), "[WEST]" = list(-3, -5) ), - slot_r_ear_str = list( + (slot_r_ear_str) = list( "[NORTH]" = list( 0, -5), "[EAST]" = list( 3, -5), "[SOUTH]" = list( 0, -5), diff --git a/mods/content/fantasy/datum/kobaloi/clothing.dm b/mods/content/fantasy/datum/kobaloi/clothing.dm index 1bd63942fbf..71346517d9c 100644 --- a/mods/content/fantasy/datum/kobaloi/clothing.dm +++ b/mods/content/fantasy/datum/kobaloi/clothing.dm @@ -1,4 +1,2 @@ -/obj/item/bag/sack/Initialize() - . = ..() - if(!(BODYTYPE_KOBALOI in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_KOBALOI, 'mods/content/fantasy/icons/clothing/sack_kobaloi.dmi') \ No newline at end of file +/obj/item/bag/sack + _kobaloi_onmob_icon = 'mods/content/fantasy/icons/clothing/sack_kobaloi.dmi' diff --git a/mods/content/fantasy/datum/outfits.dm b/mods/content/fantasy/datum/outfits.dm index 1697f5eb44f..3b65521921b 100644 --- a/mods/content/fantasy/datum/outfits.dm +++ b/mods/content/fantasy/datum/outfits.dm @@ -1,7 +1,10 @@ /decl/outfit/job/generic/fantasy - name = "Fantasy Outfit" - id_type = null - pda_type = null - l_ear = null - uniform = /obj/item/clothing/pants/trousers/jerkin - shoes = /obj/item/clothing/shoes/craftable/boots \ No newline at end of file + name = "Fantasy Outfit" + id_type = null + pda_type = null + l_ear = null + shoes = /obj/item/clothing/shoes/craftable/boots + uniform = list( + /obj/item/clothing/pants/trousers, + /obj/item/clothing/shirt/jerkin + ) diff --git a/mods/content/fantasy/datum/overrides.dm b/mods/content/fantasy/datum/overrides.dm index 0726866427d..08b4b54f4de 100644 --- a/mods/content/fantasy/datum/overrides.dm +++ b/mods/content/fantasy/datum/overrides.dm @@ -31,28 +31,33 @@ /decl/background_category/religion = /decl/background_detail/religion/other ) -// Rename grafadreka -/decl/species/grafadreka - name = "Meredrake" - name_plural = "Meredrakes" - description = "Meredrakes, sometimes called mire-drakes, are large reptillian pack predators, widely assumed to be cousins to true dragons. \ - They are commonly found living in caves or burrows bordering grassland or forest, and while they prefer to hunt deer or rabbits, they will sometimes attack travellers if pickings are slim enough. \ - While they are not domesticated, they can be habituated and trained as working animals if captured young enough." - -/decl/sprite_accessory/marking/grafadreka - species_allowed = list("Meredrake") - -/decl/language/grafadreka - desc = "Hiss hiss, feed me rabbits." - -/decl/material/liquid/sifsap - name = "drake spittle" - lore_text = "A complex chemical slurry brewed up in the gullet of meredrakes." - -/obj/aura/sifsap_salve - name = "Drakespittle Salve" - descriptor = "glowing spittle" - // Rename wooden prostheses /decl/bodytype/prosthetic/wooden name = "carved wooden" // weird to call it 'crude' when it's cutting-edge for the setting + +// Just some fun overrides for when robot debris shows up in maint. +/obj/effect/decal/cleanable/blood/gibs/robot + name = "mysterious debris" + desc = "Some kind of complex, oily detritus. What could it be?" + +/obj/item/remains/robot + name = "mysterious remains" + desc = "The oily remains of some complex, metallic object. What could they be from?" + +// Override to remove non-fantasy stuff. +/obj/random/trash/spawn_choices() + var/static/list/spawnable_choices = list( + /obj/item/remains/lizard, + /obj/effect/decal/cleanable/blood/gibs/robot, + /obj/effect/decal/cleanable/spiderling_remains, + /obj/item/remains/mouse, + /obj/effect/decal/cleanable/vomit, + /obj/effect/decal/cleanable/blood/splatter, + /obj/effect/decal/cleanable/ash, + /obj/effect/decal/cleanable/generic, + /obj/effect/decal/cleanable/flour, + /obj/effect/decal/cleanable/filth, + /obj/effect/decal/cleanable/dirt/visible, + /obj/item/remains/robot + ) + return spawnable_choices diff --git a/mods/content/fantasy/datum/skills.dm b/mods/content/fantasy/datum/skills.dm index 164ade162b6..30736399780 100644 --- a/mods/content/fantasy/datum/skills.dm +++ b/mods/content/fantasy/datum/skills.dm @@ -73,7 +73,7 @@ /decl/skill/crafting/artifice name = "Artifice" uid = "skill_crafting_artifice" - desc = "Your ability to create, install, and comprehend complex devices and mechanisms, as well as your ability to create finely-detailed objects." + desc = "Your ability to create, install, and comprehend complex devices and mechanisms, as well as your ability to create finely-detailed objects like cut gems or jewellery." levels = list( "Unskilled" = "You know that gears turn together when intermeshed and that axles are used to connect spinning things, but you've never done more work on a machine than hitting it if it's broken. You struggle with the precision needed to work on finely-detailed objects.", "Basic" = "You know some basic mechanical principles, like the construction of a basic pulley, or how to put a wheel on an axle. You could fix a broken or stuck well winch, but you'd struggle to deal with a malfunctioning windmill or granary. You have a steadier hand than most, able to place small gems on jewelry and connect small mechanisms.", @@ -220,6 +220,7 @@ /decl/skill/service/husbandry name = "Animal Husbandry" + uid = "skill_husbandry" desc = "Your ability to raise and care for animals." levels = list( "Unskilled" = "You know next to nothing about animals. You can feed and clean up after them, but you know nothing about their biology, their behavior, or raising their young.", @@ -306,3 +307,9 @@ "Experienced" = "You work as an pharmacist, or else you are a doctor with training in chemistry. If you are a pharmacist, you can make most medications. At this stage, you're working mostly by-the-book.
      - You can examine held containers for some reagents.", "Master" = "You specialized in chemistry or pharmaceuticals; you are either a medical researcher or professional chemist. You can create custom mixes and make even the trickiest of medications easily. You understand how your pharmaceuticals interact with the bodies of your patients. You are probably the originator of at least one new chemical innovation.
      - You can examine held containers for all reagents." ) + +/datum/lock + lockpicking_skill = SKILL_ARTIFICE + +/obj/item/gemstone + work_skill = SKILL_ARTIFICE diff --git a/mods/content/fantasy/icons/areas.dmi b/mods/content/fantasy/icons/areas.dmi new file mode 100644 index 00000000000..9849d6f87d8 Binary files /dev/null and b/mods/content/fantasy/icons/areas.dmi differ diff --git a/mods/content/fantasy/icons/clothing/jerkin.dmi b/mods/content/fantasy/icons/clothing/jerkin.dmi index bbcf50e66de..158ce68fbeb 100644 Binary files a/mods/content/fantasy/icons/clothing/jerkin.dmi and b/mods/content/fantasy/icons/clothing/jerkin.dmi differ diff --git a/mods/content/fantasy/icons/clothing/trousers.dmi b/mods/content/fantasy/icons/clothing/trousers.dmi index 2e76069619a..72c80d25259 100644 Binary files a/mods/content/fantasy/icons/clothing/trousers.dmi and b/mods/content/fantasy/icons/clothing/trousers.dmi differ diff --git a/mods/content/fantasy/items/clothing/_loadout.dm b/mods/content/fantasy/items/clothing/_loadout.dm index 28468c54941..c9d6b1e2125 100644 --- a/mods/content/fantasy/items/clothing/_loadout.dm +++ b/mods/content/fantasy/items/clothing/_loadout.dm @@ -34,10 +34,26 @@ slot = slot_w_uniform_str uid = "gear_fantasy_loincloth" +/decl/loadout_option/fantasy/uniform/shirt + name = "shirt" + path = /obj/item/clothing/shirt/crafted + uid = "gear_fantasy_shirt" + available_materials = list( + /decl/material/solid/organic/cloth, + /decl/material/solid/organic/cloth/wool, + /decl/material/solid/organic/cloth/hemp, + /decl/material/solid/organic/cloth/linen + ) + /decl/loadout_option/fantasy/uniform/jerkin name = "jerkin" path = /obj/item/clothing/shirt/jerkin uid = "gear_fantasy_jerkin" + available_materials = list( + /decl/material/solid/organic/leather, + /decl/material/solid/organic/skin/feathers, + /decl/material/solid/organic/skin/fur + ) /decl/loadout_option/fantasy/uniform/tunic name = "tunic" @@ -102,6 +118,11 @@ path = /obj/item/clothing/suit/hooded_cloak uid = "gear_fantasy_cloak_hooded" +/decl/loadout_option/fantasy/suit/winter_cloak + name = "cloak, winter" + path = /obj/item/clothing/suit/hooded_cloak/winter + uid = "gear_fantasy_cloak_hooded_winter" + /decl/loadout_option/fantasy/suit/poncho name = "poncho" path = /obj/item/clothing/suit/poncho/colored @@ -168,7 +189,7 @@ slot = slot_shoes_str available_materials = list( /decl/material/solid/organic/leather, - /decl/material/solid/organic/wood, + /decl/material/solid/organic/wood/oak, /decl/material/solid/organic/wood/mahogany, /decl/material/solid/organic/wood/maple, /decl/material/solid/organic/wood/ebony, @@ -182,7 +203,7 @@ /decl/loadout_option/fantasy/neck/prayer_beads name = "prayer beads" - path = /obj/item/clothing/neck/necklace/prayer_beads + path = /obj/item/clothing/neck/prayer_beads available_materials = list( /decl/material/solid/organic/bone, /decl/material/solid/stone/marble, @@ -243,7 +264,7 @@ name = "shovel" path = /obj/item/tool/shovel/one_material available_materials = list( - /decl/material/solid/organic/wood, + /decl/material/solid/organic/wood/oak, /decl/material/solid/organic/wood/mahogany, /decl/material/solid/organic/wood/maple, /decl/material/solid/organic/wood/ebony, @@ -265,7 +286,7 @@ /decl/loadout_option/fantasy/utility/waterskin name = "waterskin selection" - path = /obj/item/chems/waterskin + path = /obj/item/chems/glass/waterskin available_materials = null apply_to_existing_if_possible = TRUE // overwrite beggar knight's wineskin uid = "gear_fantasy_waterskin" @@ -273,21 +294,33 @@ /decl/loadout_option/fantasy/utility/waterskin/get_gear_tweak_options() . = ..() LAZYDISTINCTADD(.[/datum/gear_tweak/path], list( - "crafted leather waterskin" = /obj/item/chems/waterskin/crafted, - "dried stomach waterskin" = /obj/item/chems/waterskin, + "crafted leather waterskin" = /obj/item/chems/glass/waterskin/crafted, + "dried stomach waterskin" = /obj/item/chems/glass/waterskin, )) LAZYDISTINCTADD(.[/datum/gear_tweak/reagents], list( - "ale" = /decl/material/liquid/ethanol/ale, - "apple cider" = /decl/material/liquid/ethanol/cider_apple, - "beer" = /decl/material/liquid/ethanol/beer, - "kvass" = /decl/material/liquid/ethanol/kvass, - "pear cider" = /decl/material/liquid/ethanol/cider_pear, - "red wine" = /decl/material/liquid/ethanol/wine, - "sake" = /decl/material/liquid/ethanol/sake, + "ale" = /decl/material/liquid/alcohol/ale, + "apple cider" = /decl/material/liquid/alcohol/cider_apple, + "beer" = /decl/material/liquid/alcohol/beer, + "kvass" = /decl/material/liquid/alcohol/kvass, + "pear cider" = /decl/material/liquid/alcohol/cider_pear, + "red wine" = /decl/material/liquid/alcohol/wine, + "sake" = /decl/material/liquid/alcohol/sake, "water" = /decl/material/liquid/water, - "white wine" = /decl/material/liquid/ethanol/wine/premium, + "white wine" = /decl/material/liquid/alcohol/wine/premium, )) +/decl/loadout_option/fantasy/utility/crutch + name = "crutch" + path = /obj/item/crutch/wooden/padded + available_materials = list( + /decl/material/solid/organic/wood/oak, + /decl/material/solid/organic/wood/mahogany, + /decl/material/solid/organic/wood/maple, + /decl/material/solid/organic/wood/ebony, + /decl/material/solid/organic/wood/walnut + ) + uid = "gear_fantasy_crutch" + /decl/loadout_option/fantasy/eyes abstract_type = /decl/loadout_option/fantasy/eyes slot = slot_glasses_str diff --git a/mods/content/fantasy/items/clothing/_overrides.dm b/mods/content/fantasy/items/clothing/_overrides.dm new file mode 100644 index 00000000000..0ecd3b43e1c --- /dev/null +++ b/mods/content/fantasy/items/clothing/_overrides.dm @@ -0,0 +1,15 @@ +/obj/item + var/_kobaloi_onmob_icon + var/_hnoll_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_kobaloi_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_KOBALOI, _kobaloi_onmob_icon) + if(_hnoll_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_HNOLL, _hnoll_onmob_icon) + +/obj/item/clothing/gloves/setup_equip_flags() + . = ..() + if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) + bodytype_equip_flags |= BODY_EQUIP_FLAG_HNOLL \ No newline at end of file diff --git a/mods/content/fantasy/items/clothing/_recipes.dm b/mods/content/fantasy/items/clothing/_recipes.dm index 219a875f5bd..99942d8918e 100644 --- a/mods/content/fantasy/items/clothing/_recipes.dm +++ b/mods/content/fantasy/items/clothing/_recipes.dm @@ -1,5 +1,5 @@ /decl/stack_recipe/textiles/jerkin - result_type = /obj/item/clothing/shirt/jerkin + result_type = /obj/item/clothing/shirt/crafted category = "clothing" /decl/stack_recipe/textiles/gown diff --git a/mods/content/fantasy/items/clothing/armor.dm b/mods/content/fantasy/items/clothing/armor.dm index fd475c07f32..22651d3243d 100644 --- a/mods/content/fantasy/items/clothing/armor.dm +++ b/mods/content/fantasy/items/clothing/armor.dm @@ -1,3 +1,3 @@ // Override of the base item to add lore to the desc. /obj/item/clothing/suit/armor/forged/banded - desc = "A suit of overlapping armoured plates that covers the upper and lower body. Favoured by the Aegis and many Splinter Kingdoms." + desc = "A suit of overlapping armoured plates that covers the upper and lower body. Historically favoured by the Aegis and loyally adopted by many Splinter Kingdoms." diff --git a/mods/content/fantasy/items/clothing/cloak.dm b/mods/content/fantasy/items/clothing/cloak.dm new file mode 100644 index 00000000000..f61d886efe5 --- /dev/null +++ b/mods/content/fantasy/items/clothing/cloak.dm @@ -0,0 +1,17 @@ +// TODO: big fuckoff fur collar icons +/obj/item/clothing/head/hood/cloak/winter + min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/suit/hooded_cloak/winter + cold_protection = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS|SLOT_HANDS|SLOT_FEET + min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE + hood = /obj/item/clothing/head/hood/cloak/winter + protects_against_weather = TRUE + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/suit/robe/sleeved/shrine + material = /decl/material/solid/organic/cloth/linen + paint_color = COLOR_DARK_RED + markings_color = COLOR_OFF_WHITE + markings_state_modifier = "_sleeves" diff --git a/mods/content/fantasy/items/clothing/jerkin.dm b/mods/content/fantasy/items/clothing/jerkin.dm index 4944bae1976..942a871a81c 100644 --- a/mods/content/fantasy/items/clothing/jerkin.dm +++ b/mods/content/fantasy/items/clothing/jerkin.dm @@ -2,6 +2,18 @@ name = "jerkin" desc = "A sturdy jerkin, worn on the upper body." icon = 'mods/content/fantasy/icons/clothing/jerkin.dmi' - sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi') + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather + +/obj/item/clothing/shirt/crafted + desc = "A simple shirt, worn on the upper body." + icon = 'mods/content/fantasy/icons/clothing/jerkin.dmi' // TODO state with sleeves + sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/jerkin_hnoll.dmi') + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC + +/obj/item/clothing/shirt/crafted/wool + material = /decl/material/solid/organic/cloth/wool + +/obj/item/clothing/shirt/crafted/linen + material = /decl/material/solid/organic/cloth/linen diff --git a/mods/content/fantasy/items/clothing/loincloth.dm b/mods/content/fantasy/items/clothing/loincloth.dm index 168127ba6ad..5cb8288038e 100644 --- a/mods/content/fantasy/items/clothing/loincloth.dm +++ b/mods/content/fantasy/items/clothing/loincloth.dm @@ -3,7 +3,7 @@ gender = NEUTER desc = "A simple garment that is worn around the legs and lower body." icon = 'mods/content/fantasy/icons/clothing/loincloth.dmi' - sprite_sheets = list(BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/loincloth_hnoll.dmi') + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/loincloth_hnoll.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/skin/fur diff --git a/mods/content/fantasy/items/clothing/overrides.dm b/mods/content/fantasy/items/clothing/overrides.dm deleted file mode 100644 index 8ca8f71eea1..00000000000 --- a/mods/content/fantasy/items/clothing/overrides.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/clothing/gloves/setup_equip_flags() - . = ..() - if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) - bodytype_equip_flags |= BODY_EQUIP_FLAG_HNOLL \ No newline at end of file diff --git a/mods/content/fantasy/items/clothing/trousers.dm b/mods/content/fantasy/items/clothing/trousers.dm index 37d757d3abe..4fac34236e9 100644 --- a/mods/content/fantasy/items/clothing/trousers.dm +++ b/mods/content/fantasy/items/clothing/trousers.dm @@ -5,21 +5,14 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC material = /decl/material/solid/organic/leather color = /decl/material/solid/organic/leather::color - sprite_sheets = list( - BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' - ) + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/trousers_hnoll.dmi' -/obj/item/clothing/pants/trousers/jerkin/Initialize() - . = ..() - var/obj/item/clothing/shirt/jerkin/jerkin = new - attach_accessory(null, jerkin) - if(!(jerkin in accessories)) - qdel(jerkin) +/obj/item/clothing/pants/trousers/linen + material = /decl/material/solid/organic/cloth/linen + color = /decl/material/solid/organic/cloth/linen::color /obj/item/clothing/pants/trousers/braies name = "braies" desc = "Some short trousers. Comfortable and easy to wear." icon = 'mods/content/fantasy/icons/clothing/braies.dmi' - sprite_sheets = list( - BODYTYPE_HNOLL = 'mods/content/fantasy/icons/clothing/braies_hnoll.dmi' - ) + _hnoll_onmob_icon = 'mods/content/fantasy/icons/clothing/braies_hnoll.dmi' diff --git a/mods/content/fantasy/items/material_overrides.dm b/mods/content/fantasy/items/material_overrides.dm index d761bae31b7..cd5699e37b4 100644 --- a/mods/content/fantasy/items/material_overrides.dm +++ b/mods/content/fantasy/items/material_overrides.dm @@ -7,8 +7,32 @@ color = /decl/material/solid/organic/wood/walnut::color // FRANCE ISN'T REAL -/decl/material/liquid/ethanol/champagne +/obj/item/chems/drinks/bottle/champagne + name = "sparkling wine bottle" + +/decl/material/liquid/alcohol/champagne name = "sparkling wine" glass_name = "sparkling wine" glass_desc = "Sparkling white wine, a favourite at noble and merchant parties." lore_text = "Sparkling white wine, a favourite at noble and merchant parties." + +/obj/item/chems/drinks/bottle/premiumwine + name = "vintage Imperial white wine" + desc = "An expensive-looking bottle of white wine, no doubt predating the fall of the Aegis, with the name of the city or settlement that produced it written on it." + aged_min = 98 + aged_max = 420 + +/obj/item/chems/drinks/bottle/premiumwine/make_random_name() + var/decl/language/hnoll/hnoll_language = GET_DECL(/decl/language/hnoll) + return "bottle of vintage [hnoll_language.get_random_name(FEMALE, name_count = prob(20) ? 2 : 1)]" + +/obj/item/chems/drinks/bottle/wine + name = "bottle of red wine" + desc = "A bottle of locally-produced red wine." + var/place_of_origin + +/obj/item/chems/drinks/bottle/wine/Initialize() + . = ..() + var/decl/language/hnoll/hnoll_language = GET_DECL(/decl/language/hnoll) + place_of_origin = hnoll_language.get_random_name(FEMALE, name_count = prob(20) ? 2 : 1) + desc += " It has a label that reads '[place_of_origin]'." \ No newline at end of file diff --git a/mods/content/fantasy/submaps/_submaps.dm b/mods/content/fantasy/submaps/_submaps.dm new file mode 100644 index 00000000000..64c03240f4b --- /dev/null +++ b/mods/content/fantasy/submaps/_submaps.dm @@ -0,0 +1,52 @@ +#define MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND "template_fantasy_grassland" +#define MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP "template_fantasy_swamp" +#define MAP_TEMPLATE_CATEGORY_FANTASY_WOODS "template_fantasy_woods" +#define MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS "template_fantasy_downlands" +#define MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON "template_fantasy_dungeon" +#define MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS "template_fantasy_caverns" + +/datum/map_template/fantasy + abstract_type = /datum/map_template/fantasy + template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS + area_usage_test_exempted_root_areas = list( + /area/fantasy/outside/point_of_interest + ) + var/cost = 1 + +/datum/map_template/fantasy/get_template_cost() + return cost + +/datum/map/New() + LAZYSET(apc_test_exempt_areas, /area/fantasy, NO_SCRUBBER|NO_VENT|NO_APC) + ..() + +/area/fantasy + abstract_type = /area/fantasy + allow_xenoarchaeology_finds = FALSE + icon = 'mods/content/fantasy/icons/areas.dmi' + icon_state = "area" + base_turf = /turf/floor/rock/basalt + sound_env = GENERIC + ambience = list() + +/area/fantasy/outside + name = "\improper Wilderness" + abstract_type = /area/fantasy/outside + color = COLOR_GREEN + is_outside = OUTSIDE_YES + sound_env = PLAIN + ambience = list( + 'sound/effects/wind/wind_2_1.ogg', + 'sound/effects/wind/wind_2_2.ogg', + 'sound/effects/wind/wind_3_1.ogg', + 'sound/effects/wind/wind_4_1.ogg', + 'sound/effects/wind/wind_4_2.ogg', + 'sound/effects/wind/wind_5_1.ogg' + ) + interior_ambient_light_modifier = -0.3 + area_flags = AREA_FLAG_EXTERNAL | AREA_FLAG_IS_BACKGROUND + +/area/fantasy/outside/point_of_interest + name = "Point Of Interest" + description = null + area_blurb_category = /area/fantasy/outside/point_of_interest diff --git a/mods/content/fantasy/submaps/downlands/_downlands.dm b/mods/content/fantasy/submaps/downlands/_downlands.dm new file mode 100644 index 00000000000..5086d54dc54 --- /dev/null +++ b/mods/content/fantasy/submaps/downlands/_downlands.dm @@ -0,0 +1,7 @@ +/datum/map_template/fantasy/downlands + abstract_type = /datum/map_template/fantasy/downlands + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS) + +/datum/map_template/fantasy/dungeon + abstract_type = /datum/map_template/fantasy/dungeon + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON) diff --git a/mods/content/fantasy/submaps/grassland/_grassland.dm b/mods/content/fantasy/submaps/grassland/_grassland.dm new file mode 100644 index 00000000000..19b70b9367f --- /dev/null +++ b/mods/content/fantasy/submaps/grassland/_grassland.dm @@ -0,0 +1,7 @@ +/datum/map_template/fantasy/grassland + abstract_type = /datum/map_template/fantasy/grassland + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND) + +/datum/map_template/fantasy/cavern + abstract_type = /datum/map_template/fantasy/cavern + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS) \ No newline at end of file diff --git a/mods/content/fantasy/submaps/swamp/_swamp.dm b/mods/content/fantasy/submaps/swamp/_swamp.dm new file mode 100644 index 00000000000..6a3c2054ea9 --- /dev/null +++ b/mods/content/fantasy/submaps/swamp/_swamp.dm @@ -0,0 +1,3 @@ +/datum/map_template/fantasy/swamp + abstract_type = /datum/map_template/fantasy/swamp + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP) \ No newline at end of file diff --git a/mods/content/fantasy/submaps/woods/_woods.dm b/mods/content/fantasy/submaps/woods/_woods.dm new file mode 100644 index 00000000000..dc1429ef559 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/_woods.dm @@ -0,0 +1,3 @@ +/datum/map_template/fantasy/woods + abstract_type = /datum/map_template/fantasy/woods + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_WOODS) diff --git a/mods/content/fantasy/submaps/woods/bear_den/bear_den.dm b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dm new file mode 100644 index 00000000000..cb4da036c7c --- /dev/null +++ b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/bear_den + name = "bear den" + mappaths = list("mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm") + +/area/fantasy/outside/point_of_interest/bear_den + name = "Point of Interest - Bear Den" diff --git a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm similarity index 76% rename from maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm rename to mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm index 01ac1b5988a..021df578e9b 100644 --- a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm +++ b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm @@ -8,19 +8,19 @@ "k" = ( /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "n" = ( /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "o" = ( /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "p" = ( /turf/floor/grass, /area/template_noop) "r" = ( /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "w" = ( /obj/item/bladed/knife, /obj/item/cash/imperial/crown, @@ -29,20 +29,20 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "y" = ( /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "z" = ( /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "C" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "G" = ( /obj/item/bone/skull/deer, /obj/item/food/butchery/stomach, @@ -50,7 +50,7 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "J" = ( /turf/floor/grass/wild, /area/template_noop) @@ -61,16 +61,16 @@ /mob/living/simple_animal/hostile/bear, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "O" = ( /obj/abstract/exterior_marker/inside, /turf/wall/natural/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "U" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/wall/natural/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "V" = ( /obj/item/cash/imperial/quin, /obj/item/cash/imperial/quin, @@ -79,12 +79,12 @@ /obj/item/cash/imperial/crown, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "W" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) (1,1,1) = {" K diff --git a/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dm b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dm new file mode 100644 index 00000000000..158824c417b --- /dev/null +++ b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/chemistry_shack + name = "chemistry shack" + mappaths = list("mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm") + +/area/fantasy/outside/point_of_interest/chemistry_shack + name = "Point of Interest - Chemistry Shack" diff --git a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm similarity index 66% rename from maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm rename to mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm index 9c04e479e74..6ed42c83589 100644 --- a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm +++ b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm @@ -4,8 +4,8 @@ /obj/structure/door/walnut{ dir = 4 }, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "h" = ( /obj/abstract/exterior_marker/inside, /obj/item/rock/hematite{ @@ -33,20 +33,20 @@ }, /obj/structure/table/desk/ebony, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "k" = ( /obj/abstract/exterior_marker/inside, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/cooking_vessel/pot/iron, /obj/item/chems/glass/handmade/teapot, /obj/abstract/landmark/organize/vertical, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "m" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/oil, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "n" = ( /obj/structure/wall_sconce/lantern{ dir = 1; @@ -56,11 +56,11 @@ /area/template_noop) "p" = ( /obj/abstract/exterior_marker/inside, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/mortar, /obj/item/rock/basalt, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "q" = ( /obj/structure/drying_rack/ebony, /turf/floor/dirt, @@ -69,68 +69,68 @@ /obj/abstract/exterior_marker/inside, /obj/structure/filter_stand/mapped, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "s" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "z" = ( /turf/template_noop, /area/template_noop) "C" = ( /obj/abstract/exterior_marker/inside, /obj/structure/door/walnut, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "F" = ( /obj/abstract/exterior_marker/inside, /turf/wall/brick/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "H" = ( /obj/abstract/exterior_marker/inside, /turf/wall/brick/basalt/shutter, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "I" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/water, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "J" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "K" = ( /obj/abstract/exterior_marker/inside, /obj/structure/bed/simple/ebony/cloth, /obj/item/bedsheet/furs, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "L" = ( /obj/abstract/exterior_marker/inside, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bladed/knife, /obj/item/food/grown/potato, /obj/item/food/grown/potato, /obj/item/food/grown/carrot, /obj/item/food/grown/carrot, /obj/item/kitchen/rollingpin, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "M" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/wine, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "N" = ( /obj/abstract/exterior_marker/inside, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "R" = ( /obj/abstract/exterior_marker/inside, /obj/structure/closet/crate/chest/ebony, /obj/random/jewelry, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) "U" = ( /obj/abstract/exterior_marker/inside, /obj/structure/wall_sconce/lantern{ @@ -149,19 +149,19 @@ pixel_y = 9 }, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "W" = ( /turf/floor/dirt, /area/template_noop) "X" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut/shutter, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "Y" = ( /obj/abstract/exterior_marker/inside, /obj/structure/fire_source/stove, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/chemistry_shack) (1,1,1) = {" W diff --git a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm similarity index 75% rename from maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm rename to mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm index b3c1314f552..2611fe47b34 100644 --- a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm +++ b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm @@ -1,14 +1,14 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /turf/floor/fake_grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "w" = ( /obj/structure/flora/plant/random_mushroom, /turf/floor/fake_grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "D" = ( /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "N" = ( /turf/template_noop, /area/template_noop) diff --git a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm similarity index 75% rename from maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm rename to mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm index bbd7d2ae036..b86a4adcb0f 100644 --- a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm +++ b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm @@ -4,14 +4,14 @@ /area/template_noop) "h" = ( /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "j" = ( /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "A" = ( /obj/structure/flora/plant/random_mushroom/glowing, /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) (1,1,1) = {" a diff --git a/mods/content/fantasy/submaps/woods/fairy_rings/fairy_rings.dm b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_rings.dm new file mode 100644 index 00000000000..76140bdb759 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_rings.dm @@ -0,0 +1,15 @@ +/datum/map_template/fantasy/woods/fairy_ring + name = "fairy ring" + mappaths = list("mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm") + template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_ALLOW_DUPLICATES | TEMPLATE_FLAG_GENERIC_REPEATABLE + template_categories = list( + MAP_TEMPLATE_CATEGORY_FANTASY_WOODS + ) + area_coherency_test_exempt_areas = list(/area/fantasy/outside/point_of_interest/fairy_ring) + +/datum/map_template/fantasy/woods/fairy_ring/glowing + name = "glowing fairy ring" + mappaths = list("mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm") + +/area/fantasy/outside/point_of_interest/fairy_ring + name = "Point of Interest - Fairy Ring" diff --git a/mods/content/fantasy/submaps/woods/fox_den/fox_den.dm b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dm new file mode 100644 index 00000000000..894f6f7fb50 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/fox_den + name = "fox den" + mappaths = list("mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm") + +/area/fantasy/outside/point_of_interest/fox_den + name = "Point of Interest - Fox Den" diff --git a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm similarity index 82% rename from maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm rename to mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm index 6e1c6e5ce94..8053ead1e47 100644 --- a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm +++ b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm @@ -9,7 +9,7 @@ /mob/living/simple_animal/passive/fox, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "x" = ( /turf/floor/grass/wild, /area/template_noop) @@ -23,7 +23,7 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "B" = ( /turf/floor/grass, /area/template_noop) @@ -31,32 +31,32 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "O" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "P" = ( /obj/item/food/butchery/offal/small, /obj/item/stack/material/bone/mapped/bone, /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "S" = ( /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "W" = ( /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "Y" = ( /obj/item/seeds/extracted/foxglove, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) (1,1,1) = {" n diff --git a/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dm b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dm new file mode 100644 index 00000000000..262e1b71d55 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/hunter_camp + name = "hunter camp" + mappaths = list("mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm") + +/area/fantasy/outside/point_of_interest/hunter_camp + name = "Point of Interest - Hunter Camp" diff --git a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm similarity index 69% rename from maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm rename to mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm index 0d8357987fe..b269d8d4cdd 100644 --- a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm +++ b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm @@ -1,93 +1,93 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "b" = ( /obj/structure/drying_rack, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "e" = ( /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "h" = ( /obj/structure/flora/tree/hardwood/ebony, /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "j" = ( /obj/item/stack/material/skin/mapped/leather/twenty, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "k" = ( /obj/item/food/butchery/offal/beef, /obj/item/food/butchery/offal/small/beef, /obj/structure/pit, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "n" = ( /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "q" = ( /obj/structure/closet/crate/chest/ebony, /obj/item/food/butchery/haunch/shoulder/beef, /obj/item/food/butchery/haunch/side/beef, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "A" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "B" = ( /obj/structure/flora/stump/tree/ebony, /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "C" = ( /obj/structure/flora/stump/tree/ebony, /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "D" = ( /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "E" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "F" = ( /obj/structure/drying_rack, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "I" = ( /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "J" = ( /obj/structure/flora/tree/hardwood/ebony, /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "K" = ( /turf/template_noop, /area/template_noop) "P" = ( /obj/structure/flora/tree/hardwood/mahogany, /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "Q" = ( /obj/structure/bed/bedroll/fur, /obj/abstract/exterior_marker/inside, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "S" = ( /obj/structure/fire_source/firepit/basalt, /obj/item/stack/material/log/mapped/walnut/fifteen, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "U" = ( /obj/abstract/exterior_marker/inside, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "Z" = ( /obj/item/bladed/knife, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) (1,1,1) = {" K diff --git a/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dm b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dm new file mode 100644 index 00000000000..4a2130efce2 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/old_cabin + name = "old cabin" + mappaths = list("mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm") + +/area/fantasy/outside/point_of_interest/old_cabin + name = "Point of Interest - Old Cabin" diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm similarity index 58% rename from maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm rename to mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm index cb9a478a093..18e12175274 100644 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm +++ b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm @@ -2,108 +2,108 @@ "a" = ( /obj/structure/door/walnut, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "g" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/end, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "h" = ( /turf/template_noop, /area/template_noop) "i" = ( /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "k" = ( /obj/structure/closet/crate/chest/ebony, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "o" = ( /obj/structure/drying_rack/ebony, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "u" = ( /obj/structure/reagent_dispensers/barrel/ebony/beer, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "x" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/flame/torch, /obj/item/flame/torch, /obj/item/rock/flint, /obj/item/rock/hematite, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "z" = ( /obj/effect/spider/spiderling/mundane, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/structure/wall_sconce/torch{ dir = 1; pixel_y = 24 }, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "B" = ( /obj/effect/decal/cleanable/blood, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "D" = ( /obj/effect/spider/spiderling/mundane, -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "G" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut/shutter, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "H" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bladed/knife, /obj/item/food/grown/potato, /obj/item/food/grown/potato, /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "I" = ( /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "L" = ( /obj/effect/spider/spiderling/mundane, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "M" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "N" = ( /obj/abstract/exterior_marker/inside, /obj/structure/coatrack/ebony, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "T" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/desk/dresser, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) "W" = ( /obj/structure/wall_sconce/torch{ dir = 1; pixel_y = 24 }, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "Z" = ( /obj/item/remains/human, /obj/structure/bed/simple/ebony/cloth, @@ -111,8 +111,8 @@ /obj/effect/decal/cleanable/blood, /obj/random/jewelry, /obj/abstract/exterior_marker/inside, -/turf/floor/wood/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/turf/floor/wood/rough/walnut, +/area/fantasy/outside/point_of_interest/old_cabin) (1,1,1) = {" i diff --git a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm b/mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm similarity index 93% rename from maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm rename to mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm index e3e6c1ed4f4..1629e04adaf 100644 --- a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm +++ b/mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm @@ -28,7 +28,7 @@ /turf/floor/wood/walnut, /area/template_noop) "q" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/cup/wood, /turf/floor/wood/walnut, /area/template_noop) @@ -42,7 +42,7 @@ /turf/floor/path/basalt, /area/template_noop) "t" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/bladed/knife, /turf/floor/path/basalt, /area/template_noop) @@ -69,7 +69,7 @@ /turf/floor/wood/walnut, /area/template_noop) "E" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/teapot, /turf/floor/wood/walnut, /area/template_noop) @@ -78,7 +78,7 @@ /turf/floor/path/basalt, /area/template_noop) "J" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/food/grown/potato, /obj/item/chems/cooking_vessel/pot/iron, /turf/floor/path/basalt, @@ -104,11 +104,11 @@ /turf/floor/path/basalt, /area/template_noop) "R" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /turf/floor/wood/walnut, /area/template_noop) "S" = ( -/obj/structure/table/woodentable/ebony, +/obj/structure/table/wood/ebony, /obj/item/chems/glass/handmade/bowl/wood, /obj/item/chems/glass/handmade/bowl/wood, /obj/item/chems/glass/handmade/cup/wood, diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index b04503e9333..fc98131743c 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -26,11 +26,11 @@ /turf/floor/plating, /area/icarus/vessel) "aj" = ( -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "ak" = ( /obj/item/stack/material/ore/slag, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "al" = ( /obj/structure/flora/bush/palebush, @@ -38,20 +38,20 @@ /area/icarus/open) "am" = ( /obj/structure/bed/chair/comfy/black, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "an" = ( /obj/structure/bed/chair/comfy/captain, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "ao" = ( /obj/structure/bed/chair/comfy/black, /obj/item/secure_storage/briefcase, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "ap" = ( /obj/random/trash, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aq" = ( /turf/wall/r_wall, @@ -65,21 +65,21 @@ /area/icarus/vessel) "at" = ( /obj/structure/closet/gmcloset, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "au" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flame/fuelled/lighter/zippo/random, /obj/random/smokes, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "av" = ( -/obj/structure/table/woodentable, -/turf/floor/wood, +/obj/structure/table/laminate, +/turf/floor/laminate, /area/icarus/vessel) "aw" = ( /obj/machinery/papershredder, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "ax" = ( /obj/item/stack/material/ore/slag, @@ -87,55 +87,55 @@ /area/icarus/open) "ay" = ( /obj/item/shreddedp, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "az" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/smokes, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aA" = ( /obj/machinery/photocopier, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aB" = ( /obj/structure/bed/chair/comfy/black{ dir = 1 }, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/lunchbox/mars, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/photo_album, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/drinkbottle, /obj/random/drinkbottle, /obj/random/snack, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aG" = ( /obj/machinery/light, /obj/structure/filing_cabinet/tall, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aH" = ( /obj/structure/filing_cabinet/tall, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aI" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4; level = 2 }, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -144,25 +144,25 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aK" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/fancy/cigar, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aM" = ( /obj/machinery/door/airlock, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/floor/wood, +/turf/floor/laminate, /area/icarus/vessel) "aN" = ( /obj/structure/ladder, @@ -221,23 +221,23 @@ /turf/wall, /area/icarus/vessel) "aY" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aZ" = ( /obj/random/obstruction, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "ba" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, /area/icarus/vessel) "bb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "bc" = ( @@ -395,7 +395,7 @@ /area/icarus/vessel) "bE" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bF" = ( @@ -405,21 +405,21 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bH" = ( /obj/structure/hygiene/shower{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bI" = ( /obj/structure/hygiene/shower{ dir = 8 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bJ" = ( @@ -514,7 +514,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "bY" = ( @@ -528,14 +528,14 @@ dir = 4 }, /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "ca" = ( /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled/white, /area/icarus/vessel) @@ -625,7 +625,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "cq" = ( @@ -633,7 +633,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "cr" = ( @@ -652,7 +652,7 @@ /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "ct" = ( @@ -699,7 +699,7 @@ /obj/effect/floor_decal/corner/grey/diagonal{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/abstract/landmark/corpse/chef, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled/white, @@ -784,7 +784,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cN" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "cO" = ( @@ -878,14 +878,14 @@ /obj/structure/broken_cryo/icarus{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dd" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -921,8 +921,8 @@ "dj" = ( /obj/structure/table, /obj/item/towel, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -937,7 +937,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dm" = ( @@ -971,7 +971,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/wall, /area/icarus/vessel) "ds" = ( @@ -983,13 +983,13 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "du" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dv" = ( @@ -1030,13 +1030,13 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dC" = ( /obj/structure/table, /obj/random/accessory, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1098,7 +1098,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -1125,7 +1125,7 @@ /area/icarus/open) "dR" = ( /obj/structure/table, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "dS" = ( @@ -1136,7 +1136,7 @@ /turf/floor/tiled, /area/icarus/open) "dU" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "dV" = ( @@ -1145,7 +1145,7 @@ /turf/floor/tiled, /area/icarus/open) "dW" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/abstract/landmark/allowed_leak, @@ -1204,41 +1204,41 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ee" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ef" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eh" = ( /obj/random/tank, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "ei" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ej" = ( /obj/random/trash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ek" = ( @@ -1246,38 +1246,38 @@ /turf/floor/tiled, /area/icarus/open) "el" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "em" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "en" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eo" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/open) "ep" = ( /obj/structure/filing_cabinet/tall, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "eq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "er" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled, /area/icarus/open) @@ -1290,7 +1290,7 @@ /area/icarus/open) "eu" = ( /obj/item/clothing/mask/smokable/cigarette/killthroat, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ev" = ( @@ -1298,9 +1298,9 @@ /turf/floor/tiled, /area/icarus/open) "ew" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/clothing/mask/breath/emergency, /turf/unsimulated/floor/sand, /area/icarus/open) @@ -1314,394 +1314,394 @@ /turf/floor/tiled, /area/icarus/open) "ez" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "eA" = ( /turf/floor/plating/airless/broken, /area/icarus/open) "eB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/scalpel, /turf/unsimulated/floor/sand, /area/icarus/open) "eC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/bedsheet/orange, /turf/unsimulated/floor/sand, /area/icarus/open) "eE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "eF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/grass/wild, /area/icarus/open) "eG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/clothing/mask/surgical, /turf/unsimulated/floor/sand, /area/icarus/open) "eH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/plate, /turf/unsimulated/floor/sand, /area/icarus/open) "eJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/utensil/knife, /turf/unsimulated/floor/sand, /area/icarus/open) "eK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/padded, /turf/unsimulated/floor/sand, /area/icarus/open) "eL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/snack, /turf/unsimulated/floor/sand, /area/icarus/open) "eM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/plate, /turf/unsimulated/floor/sand, /area/icarus/open) "eO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/bed/chair{ dir = 1 }, /turf/unsimulated/floor/sand, /area/icarus/open) "eP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "eR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "eS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "eT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "eV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "eW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/snack, /turf/unsimulated/floor/sand, /area/icarus/open) "eX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "eY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "eZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/pill_bottle/antibiotics, /turf/unsimulated/floor/sand, /area/icarus/open) "fb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/bag/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ff" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/chems/drinks/cans/waterbottle, /turf/unsimulated/floor/sand, /area/icarus/open) "fi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "fl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fm" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "fo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/material, /turf/unsimulated/floor/sand, /area/icarus/open) "fp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/material/rods, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/item/stack/material/rods/mapped/steel, /turf/unsimulated/floor/sand, /area/icarus/open) "fq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/ash, /turf/unsimulated/floor/sand, /area/icarus/open) "fr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/material, /turf/unsimulated/floor/sand, /area/icarus/open) "fs" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ft" = ( /obj/effect/icarus/irradiate, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "fv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating, /area/icarus/open) "fw" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/plating/airless/broken, /area/icarus/open) "fx" = ( @@ -1714,13 +1714,13 @@ /turf/floor/tiled, /area/icarus/open) "fz" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fB" = ( @@ -1736,10 +1736,10 @@ /turf/floor/tiled, /area/icarus/vessel) "fE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fF" = ( @@ -1747,12 +1747,12 @@ /turf/floor/plating, /area/icarus/vessel) "fG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/vessel) "fH" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/vessel) @@ -1904,10 +1904,10 @@ /turf/floor/plating, /area/icarus/vessel) "gj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/vessel) @@ -1931,7 +1931,7 @@ /turf/floor/plating, /area/icarus/vessel) "go" = ( -/obj/structure/target_stake, +/obj/structure/target_stake/steel, /turf/floor/plating, /area/icarus/vessel) "gp" = ( @@ -2478,7 +2478,7 @@ /area/icarus/vessel) "hW" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "hX" = ( @@ -2487,8 +2487,8 @@ /area/icarus/open) "hY" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "hZ" = ( @@ -2505,17 +2505,17 @@ /area/icarus/vessel) "ib" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "ic" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "id" = ( @@ -2525,52 +2525,52 @@ /turf/wall/r_wall, /area/icarus/open) "ie" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "if" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ig" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /turf/unsimulated/floor/sand, /area/icarus/open) "ih" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/vehicle/train/cargo/trolley, /turf/unsimulated/floor/sand, /area/icarus/open) "ii" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) "ij" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/engine{ anchored = 0 }, @@ -2578,28 +2578,28 @@ /area/icarus/open) "ik" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "il" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/sand, /area/icarus/open) "im" = ( /obj/effect/decal/cleanable/ash, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/item/stack/material/ore/slag, /turf/unsimulated/floor/sand, /area/icarus/open) @@ -2608,8 +2608,8 @@ /turf/floor/grass/wild, /area/icarus/open) "ip" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/grass/wild, /area/icarus/open) "jb" = ( @@ -2654,7 +2654,7 @@ pixel_y = 2 }, /obj/random/soap, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/white, /area/icarus/vessel) "rK" = ( diff --git a/mods/content/government/away_sites/icarus/icarus-2.dmm b/mods/content/government/away_sites/icarus/icarus-2.dmm index e32afe37e27..57e1757f4eb 100644 --- a/mods/content/government/away_sites/icarus/icarus-2.dmm +++ b/mods/content/government/away_sites/icarus/icarus-2.dmm @@ -27,7 +27,7 @@ /turf/floor/plating, /area/icarus/vessel) "ai" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aj" = ( @@ -45,7 +45,7 @@ /area/icarus/vessel) "am" = ( /obj/item/stack/material/ore/slag, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "an" = ( @@ -86,13 +86,13 @@ /turf/floor/tiled, /area/icarus/vessel) "au" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/blood, /turf/floor/tiled, /area/icarus/vessel) "av" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aw" = ( @@ -122,7 +122,7 @@ /turf/floor/tiled, /area/icarus/vessel) "aB" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/overmap/visitable/sector/icarus, /turf/floor/tiled, /area/icarus/vessel) @@ -143,7 +143,7 @@ /area/icarus/vessel) "aG" = ( /obj/random/loot, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "aH" = ( @@ -462,7 +462,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bF" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -484,12 +484,12 @@ /turf/floor/tiled, /area/icarus/vessel) "bI" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/loot, /turf/floor/tiled, /area/icarus/vessel) "bJ" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /turf/floor/tiled, /area/icarus/vessel) "bK" = ( @@ -585,7 +585,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cc" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -635,7 +635,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cj" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -647,7 +647,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cl" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/backpack/captain, /obj/machinery/alarm{ alarm_id = "xenobio3_alarm"; @@ -657,7 +657,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cm" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/paper/icarus/crew_roster, /obj/item/folder/blue, /turf/floor/tiled, @@ -678,7 +678,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cp" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -751,7 +751,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cA" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/drinks/bottle/whiskey, /turf/floor/tiled, /area/icarus/vessel) @@ -768,12 +768,12 @@ /turf/floor/tiled, /area/icarus/vessel) "cD" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/toy/ship_model, /turf/floor/tiled, /area/icarus/vessel) "cE" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/action_figure, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -781,8 +781,8 @@ /turf/floor/tiled, /area/icarus/vessel) "cF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -903,7 +903,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cW" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/disk/secret_project/science, /turf/floor/tiled, /area/icarus/vessel) @@ -1054,7 +1054,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dr" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/tiled, @@ -1075,7 +1075,7 @@ /turf/floor/tiled, /area/icarus/vessel) "du" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/flashlight/lamp, /turf/floor/tiled, /area/icarus/vessel) @@ -1114,7 +1114,7 @@ dir = 4; icon_state = "tube1" }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/vessel) "dC" = ( @@ -1176,7 +1176,7 @@ /turf/wall, /area/icarus/open) "dL" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/random/trash, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -1209,7 +1209,7 @@ /turf/floor/tiled, /area/icarus/open) "dP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "dQ" = ( @@ -1249,7 +1249,7 @@ /turf/floor/tiled, /area/icarus/open) "dX" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -1285,9 +1285,9 @@ /turf/floor/plating, /area/icarus/open) "ed" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "ee" = ( @@ -1296,8 +1296,8 @@ /turf/floor/tiled, /area/icarus/open) "ef" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, +/obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled, /area/icarus/open) "eg" = ( diff --git a/mods/content/government/icons/banner.dmi b/mods/content/government/icons/banner.dmi deleted file mode 100644 index 88a40994837..00000000000 Binary files a/mods/content/government/icons/banner.dmi and /dev/null differ diff --git a/mods/content/government/icons/banner_symbols.dmi b/mods/content/government/icons/banner_symbols.dmi new file mode 100644 index 00000000000..ae958dd1f6d Binary files /dev/null and b/mods/content/government/icons/banner_symbols.dmi differ diff --git a/mods/content/government/items/clutter.dm b/mods/content/government/items/clutter.dm index d59c38172e6..a59be6eed6e 100644 --- a/mods/content/government/items/clutter.dm +++ b/mods/content/government/items/clutter.dm @@ -18,13 +18,12 @@ /obj/item/banner/solgov name = "\improper SolGov banner" desc = "A banner emblazoned with the solar seal." - icon = 'mods/content/government/icons/banner.dmi' hung_desc = "The banner is emblazoned with a golden SolGov seal." material_alteration = MAT_FLAG_ALTERATION_NONE color = COLOR_NAVY_BLUE + trim_color = COLOR_GOLD decals = list( - "banner_trim" = COLOR_GOLD, - "banner_solgov" = COLOR_WHITE + /decl/banner_symbol/government/sol = COLOR_WHITE ) /obj/structure/banner_frame/virgov @@ -37,10 +36,23 @@ name = "\improper VirGov banner" hung_desc = "The banner is emblazoned with a white VirGov seal." desc = "A banner emblazoned with the VirGov seal." - icon = 'mods/content/government/icons/banner.dmi' material_alteration = MAT_FLAG_ALTERATION_NONE color = COLOR_NAVY_BLUE + trim_color = COLOR_GOLD decals = list( - "banner_trim" = COLOR_GOLD, - "banner_virgov" = COLOR_WHITE + /decl/banner_symbol/government/vir = COLOR_WHITE ) + +/decl/banner_symbol/government + icon = 'mods/content/government/icons/banner_symbols.dmi' + abstract_type = /decl/banner_symbol/government + +/decl/banner_symbol/government/sol + name = "Sol insignia" + icon_state = "sol" + uid = "symbol_government_sol" + +/decl/banner_symbol/government/vir + name = "Vir insignia" + icon_state = "vir" + uid = "symbol_government_vir" diff --git a/mods/content/inertia/_inertia.dm b/mods/content/inertia/_inertia.dm new file mode 100644 index 00000000000..585525241f1 --- /dev/null +++ b/mods/content/inertia/_inertia.dm @@ -0,0 +1,4 @@ +/decl/modpack/inertia + name = "Ship Inertia Content" + desc = "This modpack adds support for inertia (throwing unsecured mobs) when ship thrusters fire, and adds an inertial dampener machine to counteract this." + nanoui_directory = "mods/content/inertia/nano_templates/" \ No newline at end of file diff --git a/mods/content/inertia/_inertia.dme b/mods/content/inertia/_inertia.dme new file mode 100644 index 00000000000..2407851eca3 --- /dev/null +++ b/mods/content/inertia/_inertia.dme @@ -0,0 +1,13 @@ +#ifndef MODPACK_SHIP_INERTIA +#define MODPACK_SHIP_INERTIA +// BEGIN_INCLUDE +#include "_inertia.dm" +#include "fabrication.dm" +#include "inertia_controller.dm" +#include "inertia_failure.dm" +#include "inertial_damper.dm" +#include "ship_inertia.dm" +#include "supplies.dm" +#include "wires.dm" +// END_INCLUDE +#endif diff --git a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm b/mods/content/inertia/fabrication.dm similarity index 80% rename from code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm rename to mods/content/inertia/fabrication.dm index 3bf3f65219e..72a1837b513 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/inertial_damper.dm +++ b/mods/content/inertia/fabrication.dm @@ -10,4 +10,7 @@ /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/keyboard = 1, /obj/item/stock_parts/power/apc/buildable = 1 - ) \ No newline at end of file + ) + +/datum/fabricator_recipe/imprinter/circuit/inertial_damper + path = /obj/item/stock_parts/circuitboard/inertial_damper diff --git a/icons/obj/machines/inertial_damper.dmi b/mods/content/inertia/icons/inertial_damper.dmi similarity index 100% rename from icons/obj/machines/inertial_damper.dmi rename to mods/content/inertia/icons/inertial_damper.dmi diff --git a/mods/content/inertia/inertia_controller.dm b/mods/content/inertia/inertia_controller.dm new file mode 100644 index 00000000000..6b020a67b60 --- /dev/null +++ b/mods/content/inertia/inertia_controller.dm @@ -0,0 +1,24 @@ +/// A list of all inertial dampers in existence. This is only used for assigning them to ships at roundstart. +var/global/list/ship_inertial_dampers = list() + +/datum/ship_inertial_damper + var/name = "ship inertial damper" + var/obj/machinery/holder + +/datum/ship_inertial_damper/proc/get_damping_strength(var/reliable) + return 0 + +/datum/ship_inertial_damper/New(var/obj/machinery/_holder) + ..() + holder = _holder + global.ship_inertial_dampers += src + +/datum/ship_inertial_damper/Destroy() + global.ship_inertial_dampers -= src + // This may need some future optimization for servers with lots of ships. + // Just track what ship we're assigned to somehow, and then use that here. + // You'd also have to register it to clear that ref if/when the ship object is destroyed. + for(var/obj/effect/overmap/visitable/ship/S in SSshuttle.ships) + S.inertial_dampers -= src + holder = null + . = ..() \ No newline at end of file diff --git a/code/modules/events/inertial_damper.dm b/mods/content/inertia/inertia_failure.dm similarity index 78% rename from code/modules/events/inertial_damper.dm rename to mods/content/inertia/inertia_failure.dm index e8d14585967..ce7d147f770 100644 --- a/code/modules/events/inertial_damper.dm +++ b/mods/content/inertia/inertia_failure.dm @@ -1,7 +1,18 @@ +// TODO: This should either be removed, or reworked to announce to specifically only the affected ship or its associated map. /datum/event/inertial_damper announceWhen = 5 check_proc = /proc/inertial_dampener_event_can_fire +/datum/event_container/moderate/New() + ..() + available_events += new /datum/event_meta( + EVENT_LEVEL_MODERATE, + "Inertial Damper Recalibration", + /datum/event/inertial_damper, + 75, + list(ASSIGNMENT_ENGINEER = 25) + ) + /datum/event/inertial_damper/setup() endWhen = rand(45, 120) diff --git a/code/modules/inertial_damper/inertial_damper.dm b/mods/content/inertia/inertial_damper.dm similarity index 88% rename from code/modules/inertial_damper/inertial_damper.dm rename to mods/content/inertia/inertial_damper.dm index 60eea516044..4cb9905a95c 100644 --- a/code/modules/inertial_damper/inertial_damper.dm +++ b/mods/content/inertia/inertial_damper.dm @@ -1,28 +1,6 @@ -#define WARNING_DELAY 80 //seconds between warnings. -var/global/list/ship_inertial_dampers = list() - -/datum/ship_inertial_damper - var/name = "ship inertial damper" - var/obj/machinery/holder - -/datum/ship_inertial_damper/proc/get_damping_strength(var/reliable) - return 0 - -/datum/ship_inertial_damper/New(var/obj/machinery/_holder) - ..() - holder = _holder - global.ship_inertial_dampers += src - -/datum/ship_inertial_damper/Destroy() - global.ship_inertial_dampers -= src - for(var/obj/effect/overmap/visitable/ship/S in SSshuttle.ships) - S.inertial_dampers -= src - holder = null - . = ..() - /obj/machinery/inertial_damper name = "inertial damper" - icon = 'icons/obj/machines/inertial_damper.dmi' + icon = 'mods/content/inertia/icons/inertial_damper.dmi' desc = "An inertial damper, a very large machine that balances against engine thrust to prevent harm to the crew." density = TRUE icon_state = "damper_on" @@ -67,6 +45,9 @@ var/global/list/ship_inertial_dampers = list() var/width = 3 var/height = 2 + /// The cooldown between announcements that the inertial damping system is off. + var/const/WARNING_DELAY = 8 SECONDS + /obj/machinery/inertial_damper/Initialize() . = ..() SetBounds() @@ -117,8 +98,10 @@ var/global/list/ship_inertial_dampers = list() /obj/machinery/inertial_damper/proc/is_on() return active -/obj/machinery/inertial_damper/proc/get_damping_strength(var/reliable) - if(hacked && !reliable) +/// Returns either the true damping strength including modifiers (include_modifiers == TRUE), +/// or just the value the damper is set to (include_modifiers == FALSE). +/obj/machinery/inertial_damper/proc/get_damping_strength(var/include_modifiers) + if(hacked && !include_modifiers) return initial(damping_strength) return damping_strength + damping_modifier @@ -203,5 +186,3 @@ var/global/list/ship_inertial_dampers = list() /obj/machinery/inertial_damper/dismantle() if((. = ..())) update_nearby_tiles(locs) - -#undef WARNING_DELAY \ No newline at end of file diff --git a/nano/templates/inertial_damper.tmpl b/mods/content/inertia/nano_templates/inertial_damper.tmpl similarity index 100% rename from nano/templates/inertial_damper.tmpl rename to mods/content/inertia/nano_templates/inertial_damper.tmpl diff --git a/mods/content/inertia/ship_inertia.dm b/mods/content/inertia/ship_inertia.dm new file mode 100644 index 00000000000..d903ef02aa1 --- /dev/null +++ b/mods/content/inertia/ship_inertia.dm @@ -0,0 +1,44 @@ +/obj/effect/overmap/visitable/ship + /// Whether or not this ship throws mobs on acceleration if dampers are inactive. + var/needs_dampers = FALSE + /// A list of inertial damping controller datums associated with this ship. + var/list/datum/ship_inertial_damper/inertial_dampers = list() + /// The current damping strength from all inertial dampers, recalculated every tick in the ship's Process(). + var/tmp/damping_strength = null + +/obj/effect/overmap/visitable/ship/populate_sector_objects() + ..() + for(var/datum/ship_inertial_damper/I in global.ship_inertial_dampers) + if(check_ownership(I.holder)) + inertial_dampers |= I + +// Theoretically there's no need to recalculate this every tick, +// instead it should be recalculated any time damping strength changes +// based only on the damper that changed. +/obj/effect/overmap/visitable/ship/Process(wait, tick) + . = ..() + damping_strength = 0 + for(var/datum/ship_inertial_damper/I in inertial_dampers) + var/obj/machinery/inertial_damper/ID = I.holder + damping_strength += ID.get_damping_strength(TRUE) + +/obj/effect/overmap/visitable/ship/adjust_speed(n_x, n_y) + . = ..() + var/magnitude = norm(n_x, n_y) + var/inertia_dir = magnitude >= 0 ? turn(fore_dir, 180) : fore_dir + var/inertia_strength = magnitude * 1e3 + if(needs_dampers && damping_strength < inertia_strength) + var/list/areas_by_name = area_repository.get_areas_by_z_level() + for(var/area_name in areas_by_name) + var/area/A = areas_by_name[area_name] + if(area_belongs_to_zlevels(A, map_z)) + A.throw_unbuckled_occupants(inertia_strength+2, inertia_strength, inertia_dir) + +// Add additional data to the engine console. +/obj/machinery/computer/ship/engines/modify_ship_ui_data(list/ui_data) + var/damping_strength = 0 + for(var/datum/ship_inertial_damper/inertia_controller in linked.inertial_dampers) + var/obj/machinery/inertial_damper/damper = inertia_controller.holder + damping_strength += damper.get_damping_strength(FALSE) // get only the level it's set to, not the actual level + ui_data["damping_strength"] = damping_strength + ui_data["needs_dampers"] = linked.needs_dampers \ No newline at end of file diff --git a/mods/content/inertia/supplies.dm b/mods/content/inertia/supplies.dm new file mode 100644 index 00000000000..fbe975ab7cb --- /dev/null +++ b/mods/content/inertia/supplies.dm @@ -0,0 +1,6 @@ +/decl/hierarchy/supply_pack/engineering/inertial_damper + name = "Equipment - inertial damper construction kit" + contains = list(/obj/item/stock_parts/circuitboard/inertial_damper, /obj/item/stock_parts/capacitor, /obj/item/stock_parts/micro_laser, /obj/item/stock_parts/console_screen) + containertype = /obj/structure/closet/crate/secure + containername = "inertial damper construction kit crate" + access = access_engine \ No newline at end of file diff --git a/code/datums/wires/inertial_damper.dm b/mods/content/inertia/wires.dm similarity index 71% rename from code/datums/wires/inertial_damper.dm rename to mods/content/inertia/wires.dm index 4ea708f73be..4cc74f8bc94 100644 --- a/code/datums/wires/inertial_damper.dm +++ b/mods/content/inertia/wires.dm @@ -7,11 +7,10 @@ new /datum/wire_description(DAMPER_WIRE_CONTROL, "This wire connects to the main control panel."), new /datum/wire_description(DAMPER_WIRE_AICONTROL, "This wire connects to automated control systems.") ) - -var/global/const/DAMPER_WIRE_POWER = 1 // Cut to disable power input into the generator. Pulse does nothing. Mend to restore. -var/global/const/DAMPER_WIRE_HACK = 2 // Pulse to hack the dampener, causing false display on engine consoles. Cut to unhack. Mend does nothing. -var/global/const/DAMPER_WIRE_CONTROL = 4 // Cut to lock controls. Mend to unlock them. Pulse does nothing. -var/global/const/DAMPER_WIRE_AICONTROL = 8 // Cut to disable AI control. Mend to restore. + var/const/DAMPER_WIRE_POWER = 1 // Cut to disable power input into the generator. Pulse does nothing. Mend to restore. + var/const/DAMPER_WIRE_HACK = 2 // Pulse to hack the dampener, causing false display on engine consoles. Cut to unhack. Mend does nothing. + var/const/DAMPER_WIRE_CONTROL = 4 // Cut to lock controls. Mend to unlock them. Pulse does nothing. + var/const/DAMPER_WIRE_AICONTROL = 8 // Cut to disable AI control. Mend to restore. /datum/wires/inertial_damper/CanUse() var/obj/machinery/inertial_damper/I = holder diff --git a/mods/content/item_sharpening/_item_sharpening.dm b/mods/content/item_sharpening/_item_sharpening.dm new file mode 100644 index 00000000000..3807839161b --- /dev/null +++ b/mods/content/item_sharpening/_item_sharpening.dm @@ -0,0 +1,8 @@ +#define IE_PAR_SHARP_DAM_MULT "sharp_dam_mult" + +/decl/modpack/item_sharpening + name = "Item Sharpening" + +/obj/proc/get_sharpening_material() + RETURN_TYPE(/decl/material) + return get_material() diff --git a/mods/content/item_sharpening/_item_sharpening.dme b/mods/content/item_sharpening/_item_sharpening.dme new file mode 100644 index 00000000000..c9af243f5e9 --- /dev/null +++ b/mods/content/item_sharpening/_item_sharpening.dme @@ -0,0 +1,11 @@ +#ifndef MODPACK_ITEM_SHARPENING +#define MODPACK_ITEM_SHARPENING +// BEGIN_INCLUDE +#include "_item_sharpening.dm" +#include "blade_sharpen.dm" +#include "effect_sharpen.dm" +#include "grindstone.dm" +#include "item_sharpen.dm" +#include "whetstone.dm" +//END_INCLUDE +#endif diff --git a/mods/content/item_sharpening/blade_sharpen.dm b/mods/content/item_sharpening/blade_sharpen.dm new file mode 100644 index 00000000000..a46b8d69033 --- /dev/null +++ b/mods/content/item_sharpening/blade_sharpen.dm @@ -0,0 +1,24 @@ +/obj/item/bladed/proc/get_sharpened_effect_params() + return list( + (IE_CAT_DAMAGE) = list( + (IE_PAR_USES) = max(1, max(1, rand(round(10 * 0.3), round(20 * 0.6)))), + (IE_PAR_MAX_USES) = 30, + (IE_PAR_SHARP_DAM_MULT) = 0.25 + ), + (IE_CAT_EXAMINE) + ) + +/obj/item/bladed/Initialize(ml, material_key, _hilt_mat, _guard_mat, _pommel_mat) + var/list/sharpened_params = get_sharpened_effect_params() + if(length(sharpened_params)) + add_item_effect(/decl/item_effect/sharpened, sharpened_params) + . = ..() + if(length(sharpened_params)) + update_attack_force() + update_name() + +/obj/item/bladed/folding/try_sharpen_with(mob/user, obj/sharpening_with) + if(!open) + to_chat(user, SPAN_WARNING("You cannot sharpen \the [src] while it's closed!")) + return FALSE + return ..() diff --git a/mods/content/item_sharpening/effect_sharpen.dm b/mods/content/item_sharpening/effect_sharpen.dm new file mode 100644 index 00000000000..5847ac347b3 --- /dev/null +++ b/mods/content/item_sharpening/effect_sharpen.dm @@ -0,0 +1,21 @@ +/decl/item_effect/sharpened/modify_attack_damage(base_damage, obj/item/used_item, mob/user, list/parameters) + var/uses = LAZYACCESS(parameters, IE_PAR_USES) + if(uses <= 0) + return base_damage + . = (1 + ((uses / max(1, LAZYACCESS(parameters, IE_PAR_MAX_USES))) * LAZYACCESS(parameters, IE_PAR_SHARP_DAM_MULT))) + +/decl/item_effect/sharpened/expend_attack_use(obj/item/used_item, mob/user, list/parameters) + var/uses = LAZYACCESS(parameters, IE_PAR_USES) + uses = max(0, uses-1) + used_item.set_item_effect_parameter(src, IE_CAT_DAMAGE, IE_PAR_USES, uses) + if(uses == 0) // We've gone dull! + used_item.update_attack_force() + used_item.update_name() + +/decl/item_effect/sharpened/on_examined(obj/item/item, mob/user, distance, list/parameters) + if(distance <= 1) + var/uses = item.get_item_effect_parameter(src, IE_CAT_DAMAGE, IE_PAR_USES) + if(uses > 0) + to_chat(user, SPAN_NOTICE("\The [item] has been honed to a keen edge.")) + else + to_chat(user, SPAN_NOTICE("\The [item] in need of sharpening.")) diff --git a/mods/content/item_sharpening/grindstone.dm b/mods/content/item_sharpening/grindstone.dm new file mode 100644 index 00000000000..13d8f126052 --- /dev/null +++ b/mods/content/item_sharpening/grindstone.dm @@ -0,0 +1,46 @@ +// TODO: better sound effects for working. +/obj/structure/working/grindstone + name = "grindstone" + desc = "A rotating section of coarse stone used to polish and sharpen metalwork like blades." + icon = 'mods/content/item_sharpening/icons/grindstone.dmi' + material_alteration = MAT_FLAG_ALTERATION_COLOR // Name and desc handled manually. + var/decl/material/stone_material = /decl/material/solid/quartz + +/obj/structure/working/grindstone/Initialize() + stone_material = GET_DECL(stone_material) + . = ..() + update_material_name() + update_material_desc() + +/obj/structure/working/grindstone/update_material_name(override_name) + . = ..() + if(stone_material) + SetName("[stone_material.adjective_name] [name]") + +/obj/structure/working/grindstone/update_material_desc(override_desc) + . = ..() + if(stone_material && istype(material)) + desc = "[desc] This one is made from [stone_material.solid_name] with \a [material.adjective_name] frame." + +/obj/structure/working/grindstone/on_update_icon() + . = ..() + underlays = list( + overlay_image(icon, "[icon_state]-grindstone", stone_material.color, RESET_COLOR), + overlay_image(icon, "[initial(icon_state)]-backdrop") + ) + +// Slightly wonky override, but this basically intercepts items being used on the grindstone. +/obj/structure/working/grindstone/try_take_input(obj/item/used_item, mob/user, silent) + if(working) + if(!silent) + to_chat(user, SPAN_WARNING("\The [src] is already in use, please wait for it to be free.")) + else + start_working() + used_item.try_sharpen_with(user, src) + if(!QDELETED(src) && working) + stop_working() + return TRUE + +/obj/structure/working/grindstone/get_sharpening_material() + RETURN_TYPE(/decl/material) + return stone_material diff --git a/mods/content/item_sharpening/icons/grindstone.dmi b/mods/content/item_sharpening/icons/grindstone.dmi new file mode 100644 index 00000000000..70b311b63b5 Binary files /dev/null and b/mods/content/item_sharpening/icons/grindstone.dmi differ diff --git a/mods/content/item_sharpening/item_sharpen.dm b/mods/content/item_sharpening/item_sharpen.dm new file mode 100644 index 00000000000..a72e928e5e8 --- /dev/null +++ b/mods/content/item_sharpening/item_sharpen.dm @@ -0,0 +1,49 @@ +/obj/item/update_name() + . = ..() + if(has_item_effect(/decl/item_effect/sharpened, IE_CAT_EXAMINE) && get_item_effect_parameter(/decl/item_effect/sharpened, IE_CAT_DAMAGE, IE_PAR_USES) <= 0) + SetName("dulled [name]") + +/obj/item/proc/can_sharpen_with(obj/sharpening_with) + if(!has_item_effect(/decl/item_effect/sharpened, IE_CAT_DAMAGE) || !material || !istype(sharpening_with)) + return FALSE + var/list/params = get_item_effect_parameters(/decl/item_effect/sharpened, IE_CAT_DAMAGE) + if(!islist(params) || params[IE_PAR_USES] >= params[IE_PAR_MAX_USES]) + return FALSE + return material.hardness <= sharpening_with.get_sharpening_material()?.hardness + +/obj/item/proc/sharpen_with(mob/user, obj/sharpen_with) + if(!has_item_effect(/decl/item_effect/sharpened, IE_CAT_DAMAGE)) + return FALSE + var/list/params = get_item_effect_parameters(/decl/item_effect/sharpened, IE_CAT_DAMAGE) + if(!islist(params)) + return FALSE + var/max_uses = params[IE_PAR_MAX_USES] + if(max_uses <= 0) + return FALSE + var/uses = params[IE_PAR_USES] || 0 + if(uses >= max_uses) + return FALSE + set_item_effect_parameter(/decl/item_effect/sharpened, IE_CAT_DAMAGE, IE_PAR_USES, max_uses) + if(uses == 0) // We've sharpened up from dull. + update_attack_force() + update_name() + return TRUE + +/obj/item/proc/try_sharpen_with(mob/user, obj/sharpening_with) + if(!has_item_effect(/decl/item_effect/sharpened, IE_CAT_DAMAGE)) + return FALSE + if(can_sharpen_with(sharpening_with)) + user.visible_message("\The [user] begins sharpening \the [src] with \the [sharpening_with].") + playsound(loc, 'sound/foley/knife1.ogg', 50) // metallic scrape, TODO better sound + if(user.do_skilled(10 SECONDS, SKILL_WEAPONS, src, check_holding = TRUE) && !QDELETED(sharpening_with) && can_sharpen_with(sharpening_with) && sharpen_with(user, sharpening_with)) + playsound(loc, 'sound/foley/knife1.ogg', 50) + user.visible_message("\The [user] sharpens \the [src] with \the [sharpening_with].") + else + to_chat(user, SPAN_WARNING("\The [src] cannot be [initial(sharp) ? "further sharpened" : "sharpened"] with \the [sharpening_with].")) + return TRUE + +// We don't override sharp because it's probably still pointy even if it isn't sharpened. +/obj/item/has_edge() + . = ..() + if(. && has_item_effect(/decl/item_effect/sharpened, IE_CAT_DAMAGE)) + return get_item_effect_parameter(/decl/item_effect/sharpened, IE_CAT_DAMAGE, IE_PAR_USES) > 0 diff --git a/mods/content/item_sharpening/whetstone.dm b/mods/content/item_sharpening/whetstone.dm new file mode 100644 index 00000000000..cdfbb09eea5 --- /dev/null +++ b/mods/content/item_sharpening/whetstone.dm @@ -0,0 +1,18 @@ +/obj/item/whetstone + name = "whetstone" + desc = "A worn-down lozenge used to sharpen blades." + icon = 'icons/obj/items/striker.dmi' // TODO unique icon? + w_class = ITEM_SIZE_TINY + material_alteration = MAT_FLAG_ALTERATION_ALL + material = /decl/material/solid/quartz + +/obj/item/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/whetstone)) + return try_sharpen_with(user, used_item) + return ..() + +/decl/loadout_option/utility/whetstone + name = "whetstone" + path = /obj/item/whetstone + loadout_flags = null + uid = "gear_utility_whetstone" diff --git a/mods/content/matchmaking/matchmaker.dm b/mods/content/matchmaking/matchmaker.dm index 0892ba4c827..ee7d49c6be8 100644 --- a/mods/content/matchmaking/matchmaker.dm +++ b/mods/content/matchmaking/matchmaker.dm @@ -1,14 +1,12 @@ -var/global/datum/matchmaker/matchmaker = new() - -/hook/roundstart/proc/matchmaking() - matchmaker.do_matchmaking() - return TRUE +/decl/modpack/matchmaking/on_roundstart() + do_matchmaking() -/datum/matchmaker/matchmaker/New() +// It doesn't really matter when this registers during init as long as it's before roundstart. +/decl/modpack/matchmaking/post_initialize() . = ..() events_repository.register_global(/decl/observ/player_latejoin, src, PROC_REF(matchmake_latejoiner)) -/datum/matchmaker/proc/matchmake_latejoiner(mob/living/character, datum/job/job) +/decl/modpack/matchmaking/proc/matchmake_latejoiner(mob/living/character, datum/job/job) if(character.mind && character.client?.prefs.relations.len) for(var/T in character.client.prefs.relations) var/TT = relation_types[T] @@ -30,17 +28,17 @@ var/global/datum/matchmaker/matchmaker = new() QDEL_NULL_LIST(known_connections) . = ..() -/datum/matchmaker +/decl/modpack/matchmaking var/list/relation_types = list() var/list/relations = list() -/datum/matchmaker/New() - ..() +/decl/modpack/matchmaking/Initialize() + . = ..() for(var/T in subtypesof(/datum/relation/)) var/datum/relation/R = T relation_types[initial(R.name)] = T -/datum/matchmaker/proc/do_matchmaking() +/decl/modpack/matchmaking/proc/do_matchmaking() var/list/to_warn = list() for(var/datum/relation/R in relations) if(R.other) @@ -51,13 +49,13 @@ var/global/datum/matchmaker/matchmaker = new() for(var/mob/M in to_warn) to_chat(M,"You have new connections. Use \"See Relationship Info\" to view and finalize them.") -/datum/matchmaker/proc/get_relationships(datum/mind/M, finalized_only) +/decl/modpack/matchmaking/proc/get_relationships(datum/mind/M, finalized_only) . = list() for(var/datum/relation/R in relations) if(R.holder == M && R.other && (R.finalized || !finalized_only)) . += R -/datum/matchmaker/proc/get_relationships_between(datum/mind/holder, datum/mind/target, finalized_only) +/decl/modpack/matchmaking/proc/get_relationships_between(datum/mind/holder, datum/mind/target, finalized_only) . = list() for(var/datum/relation/R in relations) if(R.holder == holder && R.other && R.other.holder == target && (R.finalized || !finalized_only)) @@ -68,6 +66,7 @@ var/global/datum/matchmaker/matchmaker = new() return if(!source.mind || !user.mind || source.name != source.real_name) return + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL if(!length(matchmaker.get_relationships_between(user.mind, source.mind, TRUE))) return return "
      You know them. More...
      " @@ -89,10 +88,12 @@ var/global/datum/matchmaker/matchmaker = new() ..() if(!can_connect_to) can_connect_to = list(type) + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL matchmaker.relations += src /datum/relation/proc/get_candidates() .= list() + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL for(var/datum/relation/R in matchmaker.relations) if(!valid_candidate(R.holder) || !can_connect(R)) continue @@ -112,6 +113,7 @@ var/global/datum/matchmaker/matchmaker = new() return TRUE /datum/relation/proc/can_connect(var/datum/relation/R) + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL for(var/datum/relation/D in matchmaker.relations) //have to check all connections between us and them if(D.holder == R.holder && D.other && D.other.holder == holder) if(D.type in incompatible) @@ -141,6 +143,7 @@ var/global/datum/matchmaker/matchmaker = new() to_chat(holder.current,"Your connection with [other.holder] is no more.") to_chat(other.holder.current,"Your connection with [holder] is no more.") other.other = null + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL matchmaker.relations -= other matchmaker.relations -= src qdel(other) @@ -187,6 +190,7 @@ var/global/datum/matchmaker/matchmaker = new() set desc = "See what connections between people you know of." set category = "IC" + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind) var/list/dat = list() var/editable = 0 @@ -221,6 +225,7 @@ var/global/datum/matchmaker/matchmaker = new() /mob/living/proc/see_relationship_info_with(var/mob/living/other) if(!other.mind) return + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind,other.mind,TRUE) var/list/dat = list("

      [other]

      ") if(mind.gen_relations_info) @@ -268,11 +273,12 @@ var/global/datum/matchmaker/matchmaker = new() var/ok = "Close anyway" ok = alert("HEY! You have some non-finalized relationships. You can terminate them if they do not fit your character, or edit the info tidbit that the other party is given. THIS IS YOUR ONLY CHANCE to do so - after you close the window, they won't be editable.","Finalize relationships","Return to edit", "Close anyway") if(ok == "Close anyway") + var/decl/modpack/matchmaking/matchmaker = IMPLIED_DECL var/list/relations = matchmaker.get_relationships(mind) for(var/datum/relation/R in relations) R.finalize() - show_browser(usr,null, "window=relations") + show_browser(src,null, "window=relations") else - show_browser(usr,null, "window=relations") + show_browser(src,null, "window=relations") return TOPIC_HANDLED return ..() \ No newline at end of file diff --git a/mods/content/psionics/_psionics.dm b/mods/content/psionics/_psionics.dm index 9092fd88ae6..fa58ed18f58 100644 --- a/mods/content/psionics/_psionics.dm +++ b/mods/content/psionics/_psionics.dm @@ -30,3 +30,12 @@ var/datum/ability_handler/psionics/psi = !is_preview_copy && istype(character) && character.get_ability_handler(/datum/ability_handler/psionics) if(psi) psi.update() + +/decl/ability/can_use_ability(mob/user, list/metadata, silent = FALSE) + . = ..() + if(. && is_supernatural) + var/spell_leech = user.disrupts_psionics() + if(spell_leech) + if(!silent) + to_chat(user, SPAN_WARNING("You try to marshal your energy, but find it leeched away by \the [spell_leech]!")) + return FALSE diff --git a/mods/content/psionics/_psionics.dme b/mods/content/psionics/_psionics.dme index 7bf5f2f680d..d52fd095516 100644 --- a/mods/content/psionics/_psionics.dme +++ b/mods/content/psionics/_psionics.dme @@ -9,7 +9,6 @@ #include "datum\jobs.dm" #include "datum\mind.dm" #include "datum\security_state.dm" -#include "datum\spells.dm" #include "datum\surgery.dm" #include "datum\uplink.dm" #include "datum\antagonists\foundation.dm" @@ -17,6 +16,7 @@ #include "items\_items.dm" #include "items\brain.dm" #include "items\cerebro_enhancers.dm" +#include "items\clothing.dm" #include "items\coffee_cup.dm" #include "items\foundation_implanter.dm" #include "items\foundation_labcoat.dm" @@ -26,7 +26,6 @@ #include "items\literature.dm" #include "items\null_ammo.dm" #include "items\nullrod.dm" -#include "items\soulstone.dm" #include "machines\psimeter.dm" #include "machines\psimonitor.dm" #include "system\subsystem_psi.dm" @@ -53,7 +52,6 @@ #include "system\psionics\interface\ui.dm" #include "system\psionics\interface\ui_hub.dm" #include "system\psionics\interface\ui_toggles.dm" -#include "system\psionics\mob\borer_power.dm" #include "system\psionics\mob\mob.dm" #include "system\psionics\mob\mob_assay.dm" #include "system\psionics\mob\mob_interactions.dm" diff --git a/mods/content/psionics/datum/antagonists/paramount.dm b/mods/content/psionics/datum/antagonists/paramount.dm index 5d4da1a8775..d00ab6c5c97 100644 --- a/mods/content/psionics/datum/antagonists/paramount.dm +++ b/mods/content/psionics/datum/antagonists/paramount.dm @@ -17,7 +17,7 @@ name = "Special Role - Paramount Grandmaster" head = /obj/item/clothing/head/helmet/space/psi_amp uniform = /obj/item/clothing/jumpsuit/psysuit - suit = /obj/item/clothing/suit/wizrobe/psypurple + suit = /obj/item/clothing/suit/paramount shoes = /obj/item/clothing/shoes/jackboots back = /obj/item/backpack/satchel gloves = /obj/item/clothing/gloves/grey diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index c19db16e091..e859f0dc515 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -1,38 +1,7 @@ /decl/material/liquid/crystal_agent/do_material_check(var/mob/living/M) - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (M.get_ability_handler(/datum/ability_handler/psionics) || (M.mind && wizards.is_antagonist(M.mind))) ? /decl/material/nullglass : ..() + . = !!M.get_ability_handler(/datum/ability_handler/psionics) ? /decl/material/nullglass : ..() -/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/victim, total_dose) ..() - var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) + var/datum/ability_handler/psionics/psi = victim.get_ability_handler(/datum/ability_handler/psionics) psi?.check_latency_trigger(30, "a [name] overdose") - -/decl/chemical_reaction/synthesis/nullglass - name = "Soulstone" - result = null - required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) - result_amount = 1 - -// TODO: #if defined(GAMEMODE_PACK_CULT) && defined(GAMEMODE_PACK_WIZARD) -// once wizard is modpacked -#ifdef GAMEMODE_PACK_CULT -/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, DATA_BLOOD_DONOR) - var/mob/living/donor = donor_ref?.resolve() - var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) - . = (istype(donor) && (!!donor.get_ability_handler(/datum/ability_handler/psionics) || (donor.mind && wizards.is_antagonist(donor.mind)))) -#endif - -/decl/chemical_reaction/synthesis/nullglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) - var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) - if(reaction_flags) - #ifdef GAMEMODE_PACK_CULT - for(var/i = 1, i <= created_volume, i++) - new /obj/item/soulstone(location) - #else - CRASH("Nullglass alternate reaction triggered in [holder.my_atom] without cult modpack loaded!") - #endif - else - for(var/i = 1, i <= created_volume*2, i++) - new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) \ No newline at end of file diff --git a/mods/content/psionics/datum/spells.dm b/mods/content/psionics/datum/spells.dm deleted file mode 100644 index 7c02c352000..00000000000 --- a/mods/content/psionics/datum/spells.dm +++ /dev/null @@ -1,7 +0,0 @@ -/spell/cast_check(skipcharge = 0,mob/user = usr, var/list/targets) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - var/spell_leech = user.disrupts_psionics() - if(spell_leech) - to_chat(user, SPAN_WARNING("You try to marshal your energy, but find it leeched away by \the [spell_leech]!")) - return 0 - . = ..() - \ No newline at end of file diff --git a/mods/content/psionics/items/clothing.dm b/mods/content/psionics/items/clothing.dm new file mode 100644 index 00000000000..32e5786c244 --- /dev/null +++ b/mods/content/psionics/items/clothing.dm @@ -0,0 +1,16 @@ +/obj/item/clothing/suit/paramount + name = "purple robes" + desc = "Heavy, royal purple robes threaded with psychic amplifiers and weird, bulbous lenses. Do not machine wash." + icon = 'icons/clothing/suits/wizard/psy.dmi' + gender = PLURAL + permeability_coefficient = 0.01 + armor = list( + ARMOR_MELEE = ARMOR_MELEE_RESISTANT, + ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, + ARMOR_LASER = ARMOR_LASER_SMALL, + ARMOR_ENERGY = ARMOR_ENERGY_SMALL, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_MINOR, + ARMOR_RAD = ARMOR_RAD_MINOR + ) + siemens_coefficient = 0.8 \ No newline at end of file diff --git a/mods/content/psionics/items/soulstone.dm b/mods/content/psionics/items/soulstone.dm deleted file mode 100644 index 3d984a0711c..00000000000 --- a/mods/content/psionics/items/soulstone.dm +++ /dev/null @@ -1,15 +0,0 @@ -#ifdef GAMEMODE_PACK_CULT -/obj/item/soulstone/disrupts_psionics() - . = !full ? src : FALSE - -/obj/item/soulstone/shatter() - for(var/i=1 to rand(2,5)) - new /obj/item/shard(get_turf(src), /decl/material/nullglass) - . = ..() - -/obj/item/soulstone/withstand_psi_stress(var/stress, var/atom/source) - . = ..(stress, source) - if(. > 0) - . = max(0, . - rand(2,5)) - shatter() -#endif \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/complexus/complexus.dm b/mods/content/psionics/system/psionics/complexus/complexus.dm index 990edecd13e..0ce5f4cfc18 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus.dm @@ -1,5 +1,4 @@ /datum/ability_handler/psionics - var/announced = FALSE // Whether or not we have been announced to our holder yet. var/suppressed = TRUE // Whether or not we are suppressing our psi powers. var/use_psi_armour = TRUE // Whether or not we should automatically deflect/block incoming damage. diff --git a/mods/content/psionics/system/psionics/equipment/psipower.dm b/mods/content/psionics/system/psionics/equipment/psipower.dm index 3d850f27cf2..8aa0afca352 100644 --- a/mods/content/psionics/system/psionics/equipment/psipower.dm +++ b/mods/content/psionics/system/psionics/equipment/psipower.dm @@ -15,7 +15,9 @@ . = ..() /obj/item/ability/psionic/attack_self(var/mob/user) - sound_to(owner, 'sound/effects/psi/power_fail.ogg') + var/mob/owner = owner_ref?.resolve() + if(istype(owner)) + sound_to(owner, 'sound/effects/psi/power_fail.ogg') . = ..() /obj/item/ability/psionic/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) @@ -31,6 +33,7 @@ . = ..(target, user, proximity) /obj/item/ability/psionic/Process() + var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) 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)) diff --git a/mods/content/psionics/system/psionics/equipment/psipower_blade.dm b/mods/content/psionics/system/psionics/equipment/psipower_blade.dm index fd8b4f947c8..94163e32012 100644 --- a/mods/content/psionics/system/psionics/equipment/psipower_blade.dm +++ b/mods/content/psionics/system/psionics/equipment/psipower_blade.dm @@ -1,8 +1,8 @@ /obj/item/ability/psionic/psiblade name = "psychokinetic slash" _base_attack_force = 10 - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE maintain_cost = 1 icon_state = "psiblade_short" diff --git a/mods/content/psionics/system/psionics/equipment/psipower_tk.dm b/mods/content/psionics/system/psionics/equipment/psipower_tk.dm index 787d2a59050..ee529a0d922 100644 --- a/mods/content/psionics/system/psionics/equipment/psipower_tk.dm +++ b/mods/content/psionics/system/psionics/equipment/psipower_tk.dm @@ -9,6 +9,7 @@ . = ..() /obj/item/ability/psionic/telekinesis/Process() + var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(!focus || !isturf(focus.loc) || get_dist(get_turf(focus), get_turf(owner)) > psi?.get_rank(PSI_PSYCHOKINESIS)) owner.drop_from_inventory(src) @@ -30,6 +31,7 @@ else return FALSE + var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(_focus.anchored || (check_paramount && psi?.get_rank(PSI_PSYCHOKINESIS) < PSI_RANK_PARAMOUNT)) focus = _focus @@ -88,7 +90,7 @@ else if(!focus.anchored) var/user_rank = psi?.get_rank(PSI_PSYCHOKINESIS) - focus.throw_at(target, user_rank*2, user_rank*10, owner) + focus.throw_at(target, user_rank*2, user_rank*10, owner_ref?.resolve()) sleep(1) sparkle() @@ -104,5 +106,4 @@ O.icon = 'icons/effects/effects.dmi' O.icon_state = "nothing" flick("empdisable",O) - sleep(5) - qdel(O) + QDEL_IN(src, 0.5 SECONDS) diff --git a/mods/content/psionics/system/psionics/faculties/_faculty.dm b/mods/content/psionics/system/psionics/faculties/_faculty.dm index 8c31791010a..03d9fc7a236 100644 --- a/mods/content/psionics/system/psionics/faculties/_faculty.dm +++ b/mods/content/psionics/system/psionics/faculties/_faculty.dm @@ -1,11 +1,16 @@ /decl/psionic_faculty var/id var/name - var/associated_intent + var/associated_intent_flag var/list/armour_types = list() var/list/powers = list() +/decl/psionic_faculty/validate() + . = ..() + if(!isnull(associated_intent_flag) && !isnum(associated_intent_flag)) + . += "non-bitflag associated_intent_flag value set" + /decl/psionic_faculty/Initialize() . = ..() for(var/atype in armour_types) - SSpsi.armour_faculty_by_type[atype] = id \ No newline at end of file + SSpsi.armour_faculty_by_type[atype] = id diff --git a/mods/content/psionics/system/psionics/faculties/coercion.dm b/mods/content/psionics/system/psionics/faculties/coercion.dm index 0cddc48bf32..8a92f058ad1 100644 --- a/mods/content/psionics/system/psionics/faculties/coercion.dm +++ b/mods/content/psionics/system/psionics/faculties/coercion.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/coercion id = PSI_COERCION name = "Coercion" - associated_intent = I_DISARM + associated_intent_flag = I_FLAG_DISARM armour_types = list(PSIONIC) /decl/psionic_power/coercion @@ -179,7 +179,7 @@ return TRUE if(accepted_glamour == "Yes") - to_chat(user, SPAN_DANGER("You layer a glamour across the \the [target]'s senses, beguiling them to unwittingly follow your commands.")) + to_chat(user, SPAN_DANGER("You layer a glamour across \the [target]'s senses, beguiling them to unwittingly follow your commands.")) to_chat(target, SPAN_DANGER("You have been ensnared by \the [user]'s glamour!")) beguiled.add_antagonist(target.mind, new_controller = user) else diff --git a/mods/content/psionics/system/psionics/faculties/energistics.dm b/mods/content/psionics/system/psionics/faculties/energistics.dm index 4deb52912db..2396a1e7119 100644 --- a/mods/content/psionics/system/psionics/faculties/energistics.dm +++ b/mods/content/psionics/system/psionics/faculties/energistics.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/energistics id = PSI_ENERGISTICS name = "Energistics" - associated_intent = I_HURT + associated_intent_flag = I_FLAG_HARM armour_types = list(ARMOR_BOMB, ARMOR_LASER, ARMOR_ENERGY) /decl/psionic_power/energistics diff --git a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm index 8ab5976c74f..8d0dd5c61f8 100644 --- a/mods/content/psionics/system/psionics/faculties/psychokinesis.dm +++ b/mods/content/psionics/system/psionics/faculties/psychokinesis.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/psychokinesis id = PSI_PSYCHOKINESIS name = "Psychokinesis" - associated_intent = I_GRAB + associated_intent_flag = I_FLAG_GRAB armour_types = list(ARMOR_MELEE, ARMOR_BULLET) /decl/psionic_power/psychokinesis @@ -19,7 +19,7 @@ admin_log = FALSE /decl/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target) - if((target && user != target) || user.a_intent != I_HURT) + if((target && user != target) || !user.check_intent(I_FLAG_HARM)) return FALSE . = ..() if(.) @@ -43,7 +43,7 @@ admin_log = FALSE /decl/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target) - if((target && user != target) || user.a_intent != I_HELP) + if((target && user != target) || !user.check_intent(I_FLAG_HELP)) return FALSE . = ..() if(.) @@ -64,7 +64,7 @@ ) /decl/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target) - if(user.a_intent != I_GRAB) + if(!user.check_intent(I_FLAG_GRAB)) return FALSE . = ..() if(.) diff --git a/mods/content/psionics/system/psionics/faculties/redaction.dm b/mods/content/psionics/system/psionics/faculties/redaction.dm index 97354f41a05..8879259a72a 100644 --- a/mods/content/psionics/system/psionics/faculties/redaction.dm +++ b/mods/content/psionics/system/psionics/faculties/redaction.dm @@ -1,7 +1,7 @@ /decl/psionic_faculty/redaction id = PSI_REDACTION name = "Redaction" - associated_intent = I_HELP + associated_intent_flag = I_FLAG_HELP armour_types = list(ARMOR_BIO, ARMOR_RAD) /decl/psionic_power/redaction diff --git a/mods/content/psionics/system/psionics/interface/ui.dm b/mods/content/psionics/system/psionics/interface/ui.dm index 4e8adfa83bd..3d8255b2030 100644 --- a/mods/content/psionics/system/psionics/interface/ui.dm +++ b/mods/content/psionics/system/psionics/interface/ui.dm @@ -1,14 +1,17 @@ /obj/screen/psi icon = 'mods/content/psionics/icons/psi.dmi' requires_ui_style = FALSE + apply_screen_overlay = FALSE var/hidden = TRUE + var/can_hide = TRUE /obj/screen/psi/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, ui_cat) . = ..() update_icon() /obj/screen/psi/on_update_icon() - if(hidden) + ..() + if(hidden && can_hide) set_invisibility(INVISIBILITY_ABSTRACT) else 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 cd87e528211..97c5ba41adc 100644 --- a/mods/content/psionics/system/psionics/interface/ui_hub.dm +++ b/mods/content/psionics/system/psionics/interface/ui_hub.dm @@ -6,6 +6,7 @@ maptext_x = 6 maptext_y = -8 requires_ui_style = FALSE + can_hide = FALSE var/image/on_cooldown var/list/components @@ -19,6 +20,7 @@ START_PROCESSING(SSprocessing, src) /obj/screen/psi/hub/on_update_icon() + ..() var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) icon_state = psi?.suppressed ? "psi_suppressed" : "psi_active" diff --git a/mods/content/psionics/system/psionics/interface/ui_toggles.dm b/mods/content/psionics/system/psionics/interface/ui_toggles.dm index 5585ac5d802..93c34b82a27 100644 --- a/mods/content/psionics/system/psionics/interface/ui_toggles.dm +++ b/mods/content/psionics/system/psionics/interface/ui_toggles.dm @@ -29,6 +29,7 @@ name = "Show/Hide Psi UI" icon_state = "arrow_left" requires_ui_style = FALSE + can_hide = FALSE var/obj/screen/psi/hub/controller /obj/screen/psi/toggle_psi_menu/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, ui_cat, obj/screen/psi/hub/_controller) @@ -43,6 +44,7 @@ controller.update_icon() /obj/screen/psi/toggle_psi_menu/on_update_icon() + ..() if(hidden) icon_state = "arrow_left" else diff --git a/mods/content/psionics/system/psionics/mob/mob.dm b/mods/content/psionics/system/psionics/mob/mob.dm index c85902acde4..15cc7914742 100644 --- a/mods/content/psionics/system/psionics/mob/mob.dm +++ b/mods/content/psionics/system/psionics/mob/mob.dm @@ -1,4 +1,5 @@ /datum/ability_handler/psionics/refresh_login() + . = ..() update(TRUE) if(!suppressed) show_auras() diff --git a/mods/content/psionics/system/psionics/mob/mob_interactions.dm b/mods/content/psionics/system/psionics/mob/mob_interactions.dm index fcc01c79fa6..aba8eeb102c 100644 --- a/mods/content/psionics/system/psionics/mob/mob_interactions.dm +++ b/mods/content/psionics/system/psionics/mob/mob_interactions.dm @@ -6,8 +6,6 @@ power.handle_post_power(user, target); \ if(istype(result)) { \ sound_to(user, sound('sound/effects/psi/power_evoke.ogg')); \ - LAZYADD(ability_items, result); \ - user.put_in_hands(result); \ } \ return TRUE; \ } \ @@ -25,18 +23,22 @@ return TRUE /datum/ability_handler/psionics/do_grabbed_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_grab_powers(SSpsi.faculties_by_intent[user.a_intent]), target) + INVOKE_PSI_POWERS(user, get_grab_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_melee_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(FALSE) return TRUE /datum/ability_handler/psionics/do_melee_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_melee_powers(SSpsi.faculties_by_intent[user.a_intent]), target) + SHOULD_CALL_PARENT(FALSE) + INVOKE_PSI_POWERS(user, get_melee_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_ranged_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(FALSE) return TRUE /datum/ability_handler/psionics/do_ranged_invocation(mob/user, atom/target) - INVOKE_PSI_POWERS(user, get_ranged_powers(SSpsi.faculties_by_intent[user.a_intent]), target) + SHOULD_CALL_PARENT(FALSE) + INVOKE_PSI_POWERS(user, get_ranged_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) -#undef INVOKE_PSI_POWERS \ No newline at end of file +#undef INVOKE_PSI_POWERS diff --git a/mods/content/psionics/system/subsystem_psi.dm b/mods/content/psionics/system/subsystem_psi.dm index 806f911873b..e6621835ce9 100644 --- a/mods/content/psionics/system/subsystem_psi.dm +++ b/mods/content/psionics/system/subsystem_psi.dm @@ -5,13 +5,27 @@ PROCESSING_SUBSYSTEM_DEF(psi) priority = SS_PRIORITY_PSYCHICS flags = SS_POST_FIRE_TIMING | SS_BACKGROUND - var/list/faculties_by_id = list() - var/list/faculties_by_name = list() - var/list/all_aura_images = list() - var/list/psi_dampeners = list() - var/list/psi_monitors = list() + var/list/faculties_by_id = list() + var/list/faculties_by_name = list() + var/list/all_aura_images = list() + var/list/psi_dampeners = list() + var/list/psi_monitors = list() var/list/armour_faculty_by_type = list() - var/list/faculties_by_intent = list() + var/list/faculties_by_intent = new(I_FLAG_ALL) + +/datum/controller/subsystem/processing/psi/proc/get_faculty_by_intent(decl/intent/intent) + var/static/list/intent_flags = list( + I_FLAG_HELP, + I_FLAG_DISARM, + I_FLAG_GRAB, + I_FLAG_HARM + ) + . = faculties_by_intent[intent.intent_flags] + if(!.) + for(var/flag in intent_flags) + if(flag & intent.intent_flags) + . = faculties_by_intent[flag] + faculties_by_intent[intent.intent_flags] = . /datum/controller/subsystem/processing/psi/proc/get_faculty(var/faculty) return faculties_by_name[faculty] || faculties_by_id[faculty] @@ -24,7 +38,7 @@ PROCESSING_SUBSYSTEM_DEF(psi) var/decl/psionic_faculty/faculty = faculties[ftype] faculties_by_id[faculty.id] = faculty faculties_by_name[faculty.name] = faculty - faculties_by_intent[faculty.associated_intent] = faculty.id + faculties_by_intent[faculty.associated_intent_flag] = faculty.id var/list/powers = decls_repository.get_decls_of_subtype(/decl/psionic_power) for(var/ptype in powers) diff --git a/mods/content/standard_jobs/_standard_jobs.dm b/mods/content/standard_jobs/_standard_jobs.dm new file mode 100644 index 00000000000..f19759923d4 --- /dev/null +++ b/mods/content/standard_jobs/_standard_jobs.dm @@ -0,0 +1,2 @@ +/decl/modpack/standard_jobs + name = "Standard SS13 Jobs" diff --git a/mods/content/standard_jobs/_standard_jobs.dme b/mods/content/standard_jobs/_standard_jobs.dme new file mode 100644 index 00000000000..a17a75892bb --- /dev/null +++ b/mods/content/standard_jobs/_standard_jobs.dme @@ -0,0 +1,31 @@ +#ifndef MODPACK_STANDARD_JOBS +#define MODPACK_STANDARD_JOBS +// BEGIN_INCLUDE +#include "_standard_jobs.dm" +#include "departments\civilian.dm" +#include "departments\command.dm" +#include "departments\engineering.dm" +#include "departments\medical.dm" +#include "departments\miscellaneous.dm" +#include "departments\science.dm" +#include "departments\security.dm" +#include "departments\service.dm" +#include "departments\supply.dm" +#include "jobs\_job.dm" +#include "jobs\captain.dm" +#include "jobs\civilian.dm" +#include "jobs\engineering.dm" +#include "jobs\medical.dm" +#include "jobs\science.dm" +#include "jobs\security.dm" +#include "jobs\synthetics.dm" +#include "outfits\cargo.dm" +#include "outfits\civilian.dm" +#include "outfits\command.dm" +#include "outfits\engineering.dm" +#include "outfits\medical.dm" +#include "outfits\pda.dm" +#include "outfits\science.dm" +#include "outfits\security.dm" +// END_INCLUDE +#endif diff --git a/mods/content/standard_jobs/departments/civilian.dm b/mods/content/standard_jobs/departments/civilian.dm new file mode 100644 index 00000000000..3cda485f4bb --- /dev/null +++ b/mods/content/standard_jobs/departments/civilian.dm @@ -0,0 +1,4 @@ +/decl/department/civilian + name = "Civilian" + display_priority = 1 + display_color = "#dddddd" diff --git a/mods/content/standard_jobs/departments/command.dm b/mods/content/standard_jobs/departments/command.dm new file mode 100644 index 00000000000..fa842fb881c --- /dev/null +++ b/mods/content/standard_jobs/departments/command.dm @@ -0,0 +1,14 @@ +/decl/department/command + name = "Command" + colour = "#800080" + display_priority = 5 + display_color = "#ccccff" + +/obj/machinery/network/pager + department = /decl/department/command + +/decl/department/support + name = "Support" + announce_channel = "Command" + colour = "#800080" + display_color = "#87ceeb" diff --git a/mods/content/standard_jobs/departments/engineering.dm b/mods/content/standard_jobs/departments/engineering.dm new file mode 100644 index 00000000000..252b4de16a6 --- /dev/null +++ b/mods/content/standard_jobs/departments/engineering.dm @@ -0,0 +1,12 @@ +/decl/department/engineering + name = "Engineering" + announce_channel = "Engineering" + colour = "#ffa500" + display_priority = 4 + display_color = "#fff5cc" + +/obj/item/robot_module/engineering + associated_department = /decl/department/engineering + +/obj/machinery/network/pager/engineering + department = /decl/department/engineering diff --git a/mods/content/standard_jobs/departments/medical.dm b/mods/content/standard_jobs/departments/medical.dm new file mode 100644 index 00000000000..01506ddd5d4 --- /dev/null +++ b/mods/content/standard_jobs/departments/medical.dm @@ -0,0 +1,13 @@ +/decl/department/medical + name = "Medical" + goals = list(/datum/goal/department/medical_fatalities) + announce_channel = "Medical" + colour = "#008000" + display_priority = 2 + display_color = "#ffeef0" + +/obj/item/robot_module/medical + associated_department = /decl/department/medical + +/obj/machinery/network/pager/medical + department = /decl/department/medical diff --git a/mods/content/standard_jobs/departments/miscellaneous.dm b/mods/content/standard_jobs/departments/miscellaneous.dm new file mode 100644 index 00000000000..19149216fdb --- /dev/null +++ b/mods/content/standard_jobs/departments/miscellaneous.dm @@ -0,0 +1,4 @@ +/decl/department/miscellaneous + name = "Misc" + display_priority = -1 + display_color = "#ccffcc" diff --git a/mods/content/standard_jobs/departments/science.dm b/mods/content/standard_jobs/departments/science.dm new file mode 100644 index 00000000000..47ebb9c2130 --- /dev/null +++ b/mods/content/standard_jobs/departments/science.dm @@ -0,0 +1,18 @@ +/decl/department/science + name = "Science" + goals = list(/datum/goal/department/extract_slime_cores) + announce_channel = "Science" + colour = "#a65ba6" + display_color = "#e79fff" + +/obj/item/robot_module/research + associated_department = /decl/department/science + +/obj/machinery/network/pager/science + department = /decl/department/science + +/decl/department/exploration + name = "Exploration" + announce_channel = "Exploration" + colour = "#68099e" + display_color = "#b784a7" diff --git a/mods/content/standard_jobs/departments/security.dm b/mods/content/standard_jobs/departments/security.dm new file mode 100644 index 00000000000..e758218721b --- /dev/null +++ b/mods/content/standard_jobs/departments/security.dm @@ -0,0 +1,12 @@ +/decl/department/security + name = "Security" + announce_channel = "Security" + colour = "#dd0000" + display_priority = 3 + display_color = "#ffddf0" + +/obj/item/robot_module/security + associated_department = /decl/department/security + +/obj/machinery/network/pager/security + department = /decl/department/security diff --git a/mods/content/standard_jobs/departments/service.dm b/mods/content/standard_jobs/departments/service.dm new file mode 100644 index 00000000000..b82c1c6deaf --- /dev/null +++ b/mods/content/standard_jobs/departments/service.dm @@ -0,0 +1,6 @@ + +/decl/department/service + name = "Service" + announce_channel = "Service" + colour = "#88b764" + display_color = "#d0f0c0" diff --git a/mods/content/standard_jobs/departments/supply.dm b/mods/content/standard_jobs/departments/supply.dm new file mode 100644 index 00000000000..c71d4327554 --- /dev/null +++ b/mods/content/standard_jobs/departments/supply.dm @@ -0,0 +1,8 @@ +/decl/department/supply + name = "Supply" + announce_channel = "Supply" + colour = "#bb9040" + display_color = "#f0e68c" + +/obj/machinery/network/pager/cargo + department = /decl/department/supply diff --git a/mods/content/standard_jobs/icons/hud.dmi b/mods/content/standard_jobs/icons/hud.dmi new file mode 100644 index 00000000000..ccea1d4a211 Binary files /dev/null and b/mods/content/standard_jobs/icons/hud.dmi differ diff --git a/mods/content/standard_jobs/jobs/_job.dm b/mods/content/standard_jobs/jobs/_job.dm new file mode 100644 index 00000000000..6869734493a --- /dev/null +++ b/mods/content/standard_jobs/jobs/_job.dm @@ -0,0 +1,3 @@ +/datum/job/standard + abstract_type = /datum/job/standard + hud_icon = 'mods/content/standard_jobs/icons/hud.dmi' diff --git a/maps/exodus/jobs/captain.dm b/mods/content/standard_jobs/jobs/captain.dm similarity index 93% rename from maps/exodus/jobs/captain.dm rename to mods/content/standard_jobs/jobs/captain.dm index c0782377252..d7abb62e0cd 100644 --- a/maps/exodus/jobs/captain.dm +++ b/mods/content/standard_jobs/jobs/captain.dm @@ -1,5 +1,6 @@ -/datum/job/captain +/datum/job/standard/captain title = "Captain" + hud_icon_state = "hudcaptain" head_position = 1 department_types = list(/decl/department/command) total_positions = 1 @@ -33,16 +34,17 @@ /datum/computer_file/program/reports ) -/datum/job/captain/equip_job(var/mob/living/human/H) +/datum/job/standard/captain/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(src) -/datum/job/captain/get_access() +/datum/job/standard/captain/get_access() return get_all_station_access() -/datum/job/hop +/datum/job/standard/hop title = "Head of Personnel" + hud_icon_state = "hudhop" head_position = 1 department_types = list( /decl/department/command, diff --git a/maps/exodus/jobs/civilian.dm b/mods/content/standard_jobs/jobs/civilian.dm similarity index 89% rename from maps/exodus/jobs/civilian.dm rename to mods/content/standard_jobs/jobs/civilian.dm index 90d800d0b6b..1ce8eeb39d0 100644 --- a/maps/exodus/jobs/civilian.dm +++ b/mods/content/standard_jobs/jobs/civilian.dm @@ -1,5 +1,6 @@ -/datum/job/assistant +/datum/job/standard/assistant title = "Assistant" + hud_icon_state = "hudassistant" total_positions = -1 spawn_positions = -1 supervisors = "absolutely everyone" @@ -10,13 +11,14 @@ outfit_type = /decl/outfit/job/generic/assistant department_types = list(/decl/department/civilian) -/datum/job/assistant/get_access() +/datum/job/standard/assistant/get_access() if(get_config_value(/decl/config/toggle/assistant_maint)) return list(access_maint_tunnels) return list() -/datum/job/chaplain +/datum/job/standard/chaplain title = "Chaplain" + hud_icon_state = "hudchaplain" // TODO: not always a crucifix department_types = list(/decl/department/civilian) total_positions = 1 spawn_positions = 1 @@ -42,9 +44,10 @@ software_on_spawn = list(/datum/computer_file/program/reports) //Food -/datum/job/bartender +/datum/job/standard/bartender title = "Bartender" department_types = list(/decl/department/service) + hud_icon_state = "hudbartender" total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" @@ -53,6 +56,11 @@ access_bar, access_kitchen ) + minimal_access = list( + access_hydroponics, + access_bar, + access_kitchen + ) minimal_access = list(access_bar) alt_titles = list("Barista") outfit_type = /decl/outfit/job/service/bartender @@ -63,8 +71,9 @@ SKILL_CHEMISTRY = SKILL_BASIC ) -/datum/job/chef +/datum/job/standard/chef title = "Chef" + hud_icon_state = "hudchef" department_types = list(/decl/department/service) total_positions = 2 spawn_positions = 2 @@ -84,8 +93,9 @@ SKILL_CHEMISTRY = SKILL_BASIC ) -/datum/job/hydro +/datum/job/standard/hydro title = "Gardener" + hud_icon_state = "hudgardener" department_types = list(/decl/department/service) total_positions = 2 spawn_positions = 1 @@ -106,8 +116,9 @@ event_categories = list(ASSIGNMENT_GARDENER) //Cargo -/datum/job/qm +/datum/job/standard/qm title = "Quartermaster" + hud_icon_state = "hudqm" department_types = list(/decl/department/supply) total_positions = 1 spawn_positions = 1 @@ -151,11 +162,12 @@ /datum/computer_file/program/reports ) -/datum/job/cargo_tech +/datum/job/standard/cargo_tech title = "Cargo Technician" department_types = list(/decl/department/supply) total_positions = 2 spawn_positions = 2 + hud_icon_state = "hudcargo" supervisors = "the quartermaster and the head of personnel" access = list( access_maint_tunnels, @@ -187,8 +199,9 @@ /datum/computer_file/program/reports ) -/datum/job/mining +/datum/job/standard/mining title = "Shaft Miner" + hud_icon_state = "hudminer" department_types = list(/decl/department/supply) total_positions = 3 spawn_positions = 3 @@ -222,11 +235,12 @@ SKILL_PILOT = SKILL_MAX ) -/datum/job/janitor +/datum/job/standard/janitor title = "Janitor" department_types = list(/decl/department/service) total_positions = 1 spawn_positions = 1 + hud_icon_state = "hudjanitor" supervisors = "the head of personnel" access = list( access_janitor, @@ -256,8 +270,9 @@ event_categories = list(ASSIGNMENT_JANITOR) //More or less assistants -/datum/job/librarian +/datum/job/standard/librarian title = "Librarian" + hud_icon_state = "hudlibrarian" department_types = list(/decl/department/civilian) total_positions = 1 spawn_positions = 1 @@ -276,8 +291,9 @@ skill_points = 20 software_on_spawn = list(/datum/computer_file/program/reports) -/datum/job/lawyer +/datum/job/standard/lawyer title = "Internal Affairs Agent" + hud_icon_state = "hudia" department_types = list(/decl/department/support) total_positions = 2 spawn_positions = 2 @@ -303,7 +319,7 @@ skill_points = 20 software_on_spawn = list(/datum/computer_file/program/reports) -/datum/job/lawyer/equip_job(var/mob/living/human/H) +/datum/job/standard/lawyer/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/maps/exodus/jobs/engineering.dm b/mods/content/standard_jobs/jobs/engineering.dm similarity index 86% rename from maps/exodus/jobs/engineering.dm rename to mods/content/standard_jobs/jobs/engineering.dm index 40cba546489..84630cb60ba 100644 --- a/maps/exodus/jobs/engineering.dm +++ b/mods/content/standard_jobs/jobs/engineering.dm @@ -1,5 +1,6 @@ -/datum/job/chief_engineer +/datum/job/standard/chief_engineer title = "Chief Engineer" + hud_icon_state = "hudce" head_position = 1 department_types = list( /decl/department/engineering, @@ -69,16 +70,15 @@ max_skill = list( SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX + SKILL_ELECTRICAL = SKILL_MAX, + SKILL_ATMOS = SKILL_MAX, + SKILL_ENGINES = SKILL_MAX ) skill_points = 30 software_on_spawn = list( /datum/computer_file/program/comm, /datum/computer_file/program/network_monitor, /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor, /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/atmos_control, /datum/computer_file/program/rcon_console, @@ -88,10 +88,10 @@ ) event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/engineer +/datum/job/standard/engineer title = "Engineer" department_types = list(/decl/department/engineering) - + hud_icon_state = "hudengineer" total_positions = 8 spawn_positions = 7 supervisors = "the chief engineer" @@ -130,22 +130,21 @@ min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC + SKILL_EVA = SKILL_BASIC, + SKILL_CONSTRUCTION = SKILL_ADEPT, + SKILL_ELECTRICAL = SKILL_BASIC, + SKILL_ATMOS = SKILL_BASIC, + SKILL_ENGINES = SKILL_BASIC ) max_skill = list( SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX + SKILL_ELECTRICAL = SKILL_MAX, + SKILL_ATMOS = SKILL_MAX, + SKILL_ENGINES = SKILL_MAX ) skill_points = 20 software_on_spawn = list( /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor, /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/atmos_control, /datum/computer_file/program/rcon_console, diff --git a/maps/exodus/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm similarity index 93% rename from maps/exodus/jobs/medical.dm rename to mods/content/standard_jobs/jobs/medical.dm index 3ec1f0e1a72..1d281434a51 100644 --- a/maps/exodus/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -1,5 +1,6 @@ -/datum/job/cmo +/datum/job/standard/cmo title = "Chief Medical Officer" + hud_icon_state = "hudcmo" head_position = 1 department_types = list( /decl/department/medical, @@ -74,8 +75,9 @@ ) event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/doctor +/datum/job/standard/doctor title = "Medical Doctor" + hud_icon_state = "hudmed" department_types = list(/decl/department/medical) minimal_player_age = 3 total_positions = 5 @@ -127,11 +129,11 @@ /datum/computer_file/program/camera_monitor ) skill_points = 22 - title = "Paramedic" event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/chemist +/datum/job/standard/chemist title = "Pharmacist" + hud_icon_state = "hudpharmacist" department_types = list(/decl/department/medical) minimal_player_age = 7 total_positions = 2 @@ -165,8 +167,9 @@ ) skill_points = 16 -/datum/job/counselor +/datum/job/standard/counselor title = "Counselor" + hud_icon_state = "hudmed" alt_titles = list("Mentalist") department_types = list(/decl/department/medical) total_positions = 1 @@ -203,13 +206,6 @@ ) give_psionic_implant_on_join = FALSE -/datum/job/counselor/equip_job(var/mob/living/human/H) - if(H.mind.role_alt_title == "Counselor") - psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) - if(H.mind.role_alt_title == "Mentalist") - psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) - return ..() - // Department-flavor IDs /obj/item/card/id/medical name = "identification card" diff --git a/maps/exodus/jobs/science.dm b/mods/content/standard_jobs/jobs/science.dm similarity index 95% rename from maps/exodus/jobs/science.dm rename to mods/content/standard_jobs/jobs/science.dm index a7a074efbce..548f9147ea7 100644 --- a/maps/exodus/jobs/science.dm +++ b/mods/content/standard_jobs/jobs/science.dm @@ -1,10 +1,11 @@ -/datum/job/rd +/datum/job/standard/rd title = "Chief Science Officer" head_position = 1 department_types = list( /decl/department/science, /decl/department/command ) + hud_icon_state = "hudrd" total_positions = 1 spawn_positions = 1 supervisors = "the captain" @@ -74,13 +75,14 @@ skill_points = 30 event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/scientist +/datum/job/standard/scientist title = "Scientist" department_types = list(/decl/department/science) total_positions = 6 spawn_positions = 4 supervisors = "the Chief Science Officer" selection_color = "#633d63" + hud_icon_state = "hudscientist" economic_power = 7 access = list( access_robotics, @@ -122,8 +124,9 @@ skill_points = 20 event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/roboticist +/datum/job/standard/roboticist title = "Roboticist" + hud_icon_state = "hudroboticist" department_types = list(/decl/department/science) total_positions = 2 spawn_positions = 2 diff --git a/maps/exodus/jobs/security.dm b/mods/content/standard_jobs/jobs/security.dm similarity index 95% rename from maps/exodus/jobs/security.dm rename to mods/content/standard_jobs/jobs/security.dm index f58305f7ae2..345f595a635 100644 --- a/maps/exodus/jobs/security.dm +++ b/mods/content/standard_jobs/jobs/security.dm @@ -1,5 +1,6 @@ -/datum/job/hos +/datum/job/standard/hos title = "Head of Security" + hud_icon_state = "hudhos" head_position = 1 department_types = list( /decl/department/security, @@ -87,14 +88,15 @@ ) event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/hos/equip_job(var/mob/living/human/H) +/datum/job/standard/hos/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) -/datum/job/warden +/datum/job/standard/warden title = "Warden" department_types = list(/decl/department/security) + hud_icon_state = "hudwarden" total_positions = 1 spawn_positions = 1 supervisors = "the head of security" @@ -142,10 +144,10 @@ /datum/computer_file/program/camera_monitor ) -/datum/job/detective +/datum/job/standard/detective title = "Detective" department_types = list(/decl/department/security) - + hud_icon_state = "huddetective" total_positions = 2 spawn_positions = 2 supervisors = "the head of security" @@ -192,8 +194,9 @@ /datum/computer_file/program/camera_monitor ) -/datum/job/officer +/datum/job/standard/officer title = "Security Officer" + hud_icon_state = "hudsec" department_types = list(/decl/department/security) total_positions = 4 spawn_positions = 4 diff --git a/maps/exodus/jobs/synthetics.dm b/mods/content/standard_jobs/jobs/synthetics.dm similarity index 74% rename from maps/exodus/jobs/synthetics.dm rename to mods/content/standard_jobs/jobs/synthetics.dm index e787da9e011..fa023f0a0d0 100644 --- a/maps/exodus/jobs/synthetics.dm +++ b/mods/content/standard_jobs/jobs/synthetics.dm @@ -1,4 +1,4 @@ -/datum/job/computer +/datum/job/standard/computer title = "Computer" event_categories = list(ASSIGNMENT_COMPUTER) total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm @@ -11,7 +11,8 @@ economic_power = 0 outfit_type = /decl/outfit/job/silicon/ai loadout_allowed = FALSE - hud_icon = "hudblank" + hud_icon_state = "hudblank" + hud_icon = null skill_points = 0 no_skill_buffs = TRUE guestbanned = 1 @@ -19,16 +20,16 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/computer/equip_job(var/mob/living/human/H) +/datum/job/standard/computer/equip_job(var/mob/living/human/H) return !!H -/datum/job/computer/is_position_available() +/datum/job/standard/computer/is_position_available() return (empty_playable_ai_cores.len != 0) -/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) +/datum/job/standard/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) return H -/datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) +/datum/job/standard/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) character = character.AIize() // AIize the character, but don't move them yet // is_available for AI checks that there is an empty core available in this list @@ -46,7 +47,7 @@ qdel(C) return TRUE -/datum/job/robot +/datum/job/standard/robot title = "Robot" event_categories = list(ASSIGNMENT_ROBOT) total_positions = 2 @@ -58,7 +59,8 @@ economic_power = 0 loadout_allowed = FALSE outfit_type = /decl/outfit/job/silicon/cyborg - hud_icon = "hudblank" + hud_icon_state = "hudblank" + hud_icon = null skill_points = 0 no_skill_buffs = TRUE guestbanned = 1 @@ -66,14 +68,14 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) +/datum/job/standard/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/robot/equip_job(var/mob/living/human/H) +/datum/job/standard/robot/equip_job(var/mob/living/human/H) return !!H -/datum/job/robot/New() +/datum/job/standard/robot/New() ..() alt_titles = SSrobots.robot_alt_titles.Copy() 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/mods/content/standard_jobs/outfits/cargo.dm similarity index 100% rename from maps/exodus/outfits/cargo.dm rename to mods/content/standard_jobs/outfits/cargo.dm diff --git a/maps/exodus/outfits/civilian.dm b/mods/content/standard_jobs/outfits/civilian.dm similarity index 100% rename from maps/exodus/outfits/civilian.dm rename to mods/content/standard_jobs/outfits/civilian.dm diff --git a/maps/exodus/outfits/command.dm b/mods/content/standard_jobs/outfits/command.dm similarity index 89% rename from maps/exodus/outfits/command.dm rename to mods/content/standard_jobs/outfits/command.dm index 86aee3a2f51..e2f9c8d8de6 100644 --- a/maps/exodus/outfits/command.dm +++ b/mods/content/standard_jobs/outfits/command.dm @@ -15,12 +15,12 @@ backpack_overrides[/decl/backpack_outfit/satchel] = /obj/item/backpack/satchel/cap backpack_overrides[/decl/backpack_outfit/messenger_bag] = /obj/item/backpack/messenger/com -/decl/outfit/job/captain/post_equip(var/mob/living/human/H) +/decl/outfit/job/captain/post_equip(mob/living/wearer) ..() - if(H.get_age() > 49) + if(wearer.get_age() > 49) // 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) + var/obj/item/clothing/uniform = wearer.get_equipped_item(slot_w_uniform_str) if(uniform) var/obj/item/clothing/medal/gold/medal = new if(uniform.can_attach_accessory(medal)) diff --git a/maps/exodus/outfits/engineering.dm b/mods/content/standard_jobs/outfits/engineering.dm similarity index 100% rename from maps/exodus/outfits/engineering.dm rename to mods/content/standard_jobs/outfits/engineering.dm diff --git a/maps/exodus/outfits/medical.dm b/mods/content/standard_jobs/outfits/medical.dm similarity index 100% rename from maps/exodus/outfits/medical.dm rename to mods/content/standard_jobs/outfits/medical.dm diff --git a/maps/exodus/outfits/_pda.dm b/mods/content/standard_jobs/outfits/pda.dm similarity index 100% rename from maps/exodus/outfits/_pda.dm rename to mods/content/standard_jobs/outfits/pda.dm diff --git a/maps/exodus/outfits/science.dm b/mods/content/standard_jobs/outfits/science.dm similarity index 100% rename from maps/exodus/outfits/science.dm rename to mods/content/standard_jobs/outfits/science.dm diff --git a/maps/exodus/outfits/security.dm b/mods/content/standard_jobs/outfits/security.dm similarity index 100% rename from maps/exodus/outfits/security.dm rename to mods/content/standard_jobs/outfits/security.dm diff --git a/mods/content/supermatter/_supermatter.dm b/mods/content/supermatter/_supermatter.dm new file mode 100644 index 00000000000..78daa387234 --- /dev/null +++ b/mods/content/supermatter/_supermatter.dm @@ -0,0 +1,23 @@ +// These are used by supermatter and supermatter monitor program, mostly for UI updating purposes. Higher should always be worse! +#define SUPERMATTER_ERROR -1 // Unknown status, shouldn't happen but just in case. +#define SUPERMATTER_INACTIVE 0 // No or minimal energy +#define SUPERMATTER_NORMAL 1 // Normal operation +#define SUPERMATTER_NOTIFY 2 // Ambient temp > 80% of CRITICAL_TEMPERATURE +#define SUPERMATTER_WARNING 3 // Ambient temp > CRITICAL_TEMPERATURE OR integrity damaged +#define SUPERMATTER_DANGER 4 // Integrity < 50% +#define SUPERMATTER_EMERGENCY 5 // Integrity < 25% +#define SUPERMATTER_DELAMINATING 6 // Pretty obvious. + +#define SUPERMATTER_DATA_EER "Relative EER" +#define SUPERMATTER_DATA_TEMPERATURE "Temperature" +#define SUPERMATTER_DATA_PRESSURE "Pressure" +#define SUPERMATTER_DATA_EPR "Chamber EPR" + +/decl/modpack/supermatter + name = "Supermatter Content" + desc = "This modpack includes the supermatter engine and related content." + nanoui_directory = "mods/content/supermatter/nano_templates/" + +/decl/modpack/supermatter/pre_initialize() + . = ..() + global.debug_verbs |= /datum/admins/proc/setup_supermatter \ No newline at end of file diff --git a/mods/content/supermatter/_supermatter.dme b/mods/content/supermatter/_supermatter.dme new file mode 100644 index 00000000000..fb6723cce50 --- /dev/null +++ b/mods/content/supermatter/_supermatter.dme @@ -0,0 +1,30 @@ +#ifndef CONTENT_PACK_SUPERMATTER +#define CONTENT_PACK_SUPERMATTER +// BEGIN_INCLUDE +#include "_supermatter.dm" +#include "admin_setup_supermatter.dm" +#include "datums\sm_codex.dm" +#include "datums\sm_follow.dm" +#include "datums\sm_grief_fix.dm" +#include "datums\sm_looping_sound.dm" +#include "datums\sm_supply_drop.dm" +#include "datums\sm_supply_pack.dm" +#include "datums\supermatter_monitor.dm" +#include "endgame_cascade\cascade_blob.dm" +#include "endgame_cascade\portal.dm" +#include "endgame_cascade\universe.dm" +#include "items\sm_book.dm" +#include "items\sm_grenade.dm" +#include "machinery\sm_supply_beacon.dm" +#include "machinery\supermatter.dm" +#include "machinery\supermatter_core_console.dm" +#include "overrides\sm_fuel_compressor.dm" +#include "overrides\sm_meteor.dm" +#include "overrides\sm_singularity.dm" +#include "overrides\sm_strings.dm" +#include "overrides\sm_trader.dm" +#include "overrides\sm_unit_tests.dm" +#include "overrides\sm_xenoarchaeology.dm" +#include "structures\sm_closets.dm" +// END_INCLUDE +#endif diff --git a/mods/content/supermatter/admin_setup_supermatter.dm b/mods/content/supermatter/admin_setup_supermatter.dm new file mode 100644 index 00000000000..9664671e836 --- /dev/null +++ b/mods/content/supermatter/admin_setup_supermatter.dm @@ -0,0 +1,116 @@ +#define ENERGY_NITROGEN 115 // Roughly 8 emitter shots. +#define ENERGY_CARBONDIOXIDE 150 // Roughly 10 emitter shots. +#define ENERGY_HYDROGEN 300 // Roughly 20 emitter shots. + +/datum/admins/proc/setup_supermatter() + set category = "Debug" + set name = "Setup Supermatter" + set desc = "Allows you to start the Supermatter engine." + + if (!istype(src,/datum/admins)) + src = usr.client.holder + if (!istype(src,/datum/admins)) + to_chat(usr, "Error: you are not an admin!") + return + + var/response = input(usr, "Are you sure? This will start up the engine with selected gas as coolant.", "Engine setup") as null|anything in list("N2", "CO2", "H2", "Abort") + if(!response || response == "Abort") + return + + var/errors = 0 + var/warnings = 0 + var/success = 0 + + log_and_message_admins("## SUPERMATTER SETUP - Setup initiated by [usr] using coolant type [response].") + + // CONFIGURATION PHASE + // Coolant canisters, set types according to response. + for(var/obj/effect/engine_setup/coolant_canister/C in global.engine_setup_markers) + switch(response) + if("N2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/ + continue + if("CO2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/ + continue + if("H2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/hydrogen/engine_setup/ + continue + + for(var/obj/effect/engine_setup/core/C in global.engine_setup_markers) + switch(response) + if("N2") + C.energy_setting = ENERGY_NITROGEN + continue + if("CO2") + C.energy_setting = ENERGY_CARBONDIOXIDE + continue + if("H2") + C.energy_setting = ENERGY_HYDROGEN + continue + + for(var/obj/effect/engine_setup/filter/F in global.engine_setup_markers) + F.coolant = response + + var/list/delayed_objects = list() + // SETUP PHASE + for(var/obj/effect/engine_setup/S in global.engine_setup_markers) + var/result = S.activate(0) + switch(result) + if(ENGINE_SETUP_OK) + success++ + continue + if(ENGINE_SETUP_WARNING) + warnings++ + continue + if(ENGINE_SETUP_ERROR) + errors++ + log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") + break + if(ENGINE_SETUP_DELAYED) + delayed_objects.Add(S) + continue + + if(!errors) + for(var/obj/effect/engine_setup/S in delayed_objects) + var/result = S.activate(1) + switch(result) + if(ENGINE_SETUP_OK) + success++ + continue + if(ENGINE_SETUP_WARNING) + warnings++ + continue + if(ENGINE_SETUP_ERROR) + errors++ + log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") + break + + log_and_message_admins("## SUPERMATTER SETUP - Setup completed with [errors] errors, [warnings] warnings and [success] successful steps.") + + return + + + +// Energises the supermatter. Errors when unable to locate supermatter. +/obj/effect/engine_setup/core + name = "Supermatter Core Marker" + var/energy_setting = 0 + +/obj/effect/engine_setup/core/activate(var/last = 0) + if(!last) + return ENGINE_SETUP_DELAYED + ..() + var/obj/machinery/power/supermatter/SM = locate() in get_turf(src) + if(!SM) + log_and_message_admins("## ERROR: Unable to locate supermatter core at [x] [y] [z]!") + return ENGINE_SETUP_ERROR + if(!energy_setting) + log_and_message_admins("## ERROR: Energy setting unset at [x] [y] [z]!") + return ENGINE_SETUP_ERROR + SM.power = energy_setting + return ENGINE_SETUP_OK + +#undef ENERGY_NITROGEN +#undef ENERGY_CARBONDIOXIDE +#undef ENERGY_HYDROGEN diff --git a/mods/content/supermatter/datums/sm_codex.dm b/mods/content/supermatter/datums/sm_codex.dm new file mode 100644 index 00000000000..c0d5c160fae --- /dev/null +++ b/mods/content/supermatter/datums/sm_codex.dm @@ -0,0 +1,21 @@ + +/datum/codex_entry/guide/supermatter + name = "Guide to Supermatter Engines" + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE + +/datum/codex_entry/supermatter + associated_paths = list(/obj/machinery/power/supermatter) + mechanics_text = "When energized by a laser (or something hitting it), it emits radiation and heat. If the heat reaches above 7000 kelvin, it will send an alert and start taking damage. \ + After integrity falls to zero percent, it will delaminate, causing a massive explosion, station-wide radiation spikes, and hallucinations. \ + Supermatter reacts badly to oxygen in the atmosphere. It'll also heat up really quick if it is in vacuum.
      \ +
      \ + Supermatter cores are extremely dangerous to be close to, and requires protection to handle properly. The protection you will need is:
      \ + Optical meson scanners on your eyes, to prevent hallucinations when looking at the supermatter.
      \ + Radiation helmet and suit, as the supermatter is radioactive.
      \ +
      \ + Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you. \ + It is advised to obtain a genetic backup before trying to drag it." + antag_text = "Exposing the supermatter to oxygen or vaccum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \ + cause a period of lag as the explosion is processed by the server, as well as irradiating the entire station and causing hallucinations to happen. \ + Wearing radiation equipment will protect you from most of the delamination effects sans explosion." + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_follow.dm b/mods/content/supermatter/datums/sm_follow.dm new file mode 100644 index 00000000000..5b221ad03d6 --- /dev/null +++ b/mods/content/supermatter/datums/sm_follow.dm @@ -0,0 +1,3 @@ +/datum/follow_holder/supermatter + sort_order = 10 + followed_type = /obj/machinery/power/supermatter \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_grief_fix.dm b/mods/content/supermatter/datums/sm_grief_fix.dm new file mode 100644 index 00000000000..70dd9469abc --- /dev/null +++ b/mods/content/supermatter/datums/sm_grief_fix.dm @@ -0,0 +1,8 @@ +/decl/atmos_grief_fix_step/supermatter + name = "Supermatter depowered" + sort_order = 0 + +/decl/atmos_grief_fix_step/supermatter/act() + // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. + for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) + S.power = 0 \ No newline at end of file diff --git a/code/modules/supermatter/sm_looping_sound.dm b/mods/content/supermatter/datums/sm_looping_sound.dm similarity index 100% rename from code/modules/supermatter/sm_looping_sound.dm rename to mods/content/supermatter/datums/sm_looping_sound.dm diff --git a/mods/content/supermatter/datums/sm_supply_drop.dm b/mods/content/supermatter/datums/sm_supply_drop.dm new file mode 100644 index 00000000000..1560d1118d2 --- /dev/null +++ b/mods/content/supermatter/datums/sm_supply_drop.dm @@ -0,0 +1,5 @@ +/datum/supply_drop_loot/supermatter + name = "Supermatter" +/datum/supply_drop_loot/supermatter/New() + ..() + contents = list(/obj/machinery/power/supermatter) diff --git a/mods/content/supermatter/datums/sm_supply_pack.dm b/mods/content/supermatter/datums/sm_supply_pack.dm new file mode 100644 index 00000000000..5261f06a069 --- /dev/null +++ b/mods/content/supermatter/datums/sm_supply_pack.dm @@ -0,0 +1,6 @@ +/decl/hierarchy/supply_pack/engineering/smbig + name = "Power - Supermatter core" + contains = list(/obj/machinery/power/supermatter) + containertype = /obj/structure/closet/crate/secure/large/supermatter + containername = "\improper Supermatter crate (CAUTION)" + access = access_ce \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm b/mods/content/supermatter/datums/supermatter_monitor.dm similarity index 91% rename from code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm rename to mods/content/supermatter/datums/supermatter_monitor.dm index e139e3c4f28..518d84a7f18 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm +++ b/mods/content/supermatter/datums/supermatter_monitor.dm @@ -5,7 +5,7 @@ /datum/computer_file/program/supermatter_monitor filename = "supmon" filedesc = "Supermatter Monitoring" - nanomodule_path = /datum/nano_module/program/supermatter_monitor/ + nanomodule_path = /datum/nano_module/program/supermatter_monitor program_icon_state = "smmon_0" program_key_state = "tech_key" program_menu_icon = "notice" @@ -215,3 +215,20 @@ if(S.uid == newuid) active = S return 1 + +// Add this to the software list for borgs +/obj/item/robot_module/engineering/grant_software() + software |= /datum/computer_file/program/supermatter_monitor + return ..() + +/obj/item/robot_module/flying/repair/grant_software() + software |= /datum/computer_file/program/supermatter_monitor + return ..() + +/obj/machinery/computer/modular/telescreen/preset/engineering/Initialize(mapload, d, populate_parts) + default_software |= /datum/computer_file/program/supermatter_monitor + return ..() + +/obj/machinery/computer/modular/preset/engineering/Initialize(mapload, d, populate_parts) + default_software |= /datum/computer_file/program/supermatter_monitor + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm b/mods/content/supermatter/endgame_cascade/cascade_blob.dm similarity index 98% rename from code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm rename to mods/content/supermatter/endgame_cascade/cascade_blob.dm index ef04b1069f7..6cd76d14233 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm +++ b/mods/content/supermatter/endgame_cascade/cascade_blob.dm @@ -9,7 +9,7 @@ //luminosity = 5 //l_color="#0066ff" plane = ABOVE_LIGHTING_PLANE - layer = SUPERMATTER_WALL_LAYER + layer = SUBSPACE_WALL_LAYER var/list/avail_dirs = list(NORTH,SOUTH,EAST,WEST,UP,DOWN) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/mods/content/supermatter/endgame_cascade/portal.dm similarity index 100% rename from code/game/gamemodes/endgame/supermatter_cascade/portal.dm rename to mods/content/supermatter/endgame_cascade/portal.dm diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/mods/content/supermatter/endgame_cascade/universe.dm similarity index 95% rename from code/game/gamemodes/endgame/supermatter_cascade/universe.dm rename to mods/content/supermatter/endgame_cascade/universe.dm index 8de40b0d123..ccca16707e4 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/mods/content/supermatter/endgame_cascade/universe.dm @@ -1,6 +1,3 @@ -var/global/universe_has_ended = 0 - - /datum/universal_state/supermatter_cascade name = "Supermatter Cascade" desc = "Unknown harmonance affecting universal substructure, converting nearby matter to supermatter." @@ -15,9 +12,9 @@ var/global/universe_has_ended = 0 /datum/universal_state/supermatter_cascade/OnTurfChange(var/turf/T) var/turf/space/S = T if(istype(S)) - S.color = "#0066ff" + S.set_color("#0066ff") else - S.color = initial(S.color) + S.set_color(initial(S.color)) /datum/universal_state/supermatter_cascade/DecayTurf(var/turf/T) T.handle_universal_decay() @@ -70,9 +67,10 @@ var/global/universe_has_ended = 0 if(!invalid_area) A.update_icon() +// TODO: Should this be changed to use the actual ambient lights system...? /datum/universal_state/supermatter_cascade/OverlayAndAmbientSet() spawn(0) - for(var/datum/lighting_corner/L in world) + for(var/datum/lighting_corner/L in SSlighting.lighting_corners) if(isAdminLevel(L.z)) L.update_lumcount(1,1,1) else diff --git a/mods/content/supermatter/items/sm_book.dm b/mods/content/supermatter/items/sm_book.dm new file mode 100644 index 00000000000..8230625788a --- /dev/null +++ b/mods/content/supermatter/items/sm_book.dm @@ -0,0 +1,6 @@ +/obj/item/book/manual/supermatter_engine + name = "supermatter engine reference manual" + icon = 'icons/obj/items/books/book_supermatter.dmi' + author = "Central Engineering Division" + title = "Supermatter Engine Operating Manual" + guide_decl = /datum/codex_entry/guide/supermatter \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/supermatter.dm b/mods/content/supermatter/items/sm_grenade.dm similarity index 50% rename from code/game/objects/items/weapons/grenades/supermatter.dm rename to mods/content/supermatter/items/sm_grenade.dm index 4f2758b53e3..b7f3186e666 100644 --- a/code/game/objects/items/weapons/grenades/supermatter.dm +++ b/mods/content/supermatter/items/sm_grenade.dm @@ -33,3 +33,25 @@ if(world.time > implode_at) explosion(loc, 0, 1, 3, 4) qdel(src) + +/obj/item/box/supermatters + name = "box of supermatter grenades" + desc = "A box containing 5 highly experimental supermatter grenades." + icon_state = "radbox" + +/obj/item/box/supermatters/WillContain() + return list(/obj/item/grenade/supermatter = 5) + +/datum/uplink_item/item/grenades/supermatter + name = "1x Supermatter Grenade" + desc = "This grenade contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." + item_cost = 15 + antag_roles = list(/decl/special_role/mercenary) + path = /obj/item/grenade/supermatter + +/datum/uplink_item/item/grenades/supermatters + name = "5x Supermatter Grenades" + desc = "These grenades contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." + item_cost = 60 + antag_roles = list(/decl/special_role/mercenary) + path = /obj/item/box/supermatters diff --git a/mods/content/supermatter/machinery/sm_supply_beacon.dm b/mods/content/supermatter/machinery/sm_supply_beacon.dm new file mode 100644 index 00000000000..e6a622480b6 --- /dev/null +++ b/mods/content/supermatter/machinery/sm_supply_beacon.dm @@ -0,0 +1,7 @@ +/obj/item/supply_beacon/supermatter + name = "inactive supermatter supply beacon" + deploy_path = /obj/structure/supply_beacon/supermatter + +/obj/structure/supply_beacon/supermatter + name = "supermatter supply beacon" + drop_type = "supermatter" diff --git a/code/modules/supermatter/supermatter.dm b/mods/content/supermatter/machinery/supermatter.dm similarity index 98% rename from code/modules/supermatter/supermatter.dm rename to mods/content/supermatter/machinery/supermatter.dm index 9ade7220a4b..b300501036c 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/mods/content/supermatter/machinery/supermatter.dm @@ -99,7 +99,7 @@ var/global/list/supermatter_delam_accent_sounds = list( SPAN_DANGER("As \the [source] slowly stops resonating, you find your skin covered in new radiation burns."), 1,\ SPAN_DANGER("The unearthly ringing subsides and you notice you have new radiation burns."), 2) else - M.show_message(SPAN_DANGER("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns."), 2) + M.show_message(SPAN_DANGER("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns."), 2) var/rads = 500 SSradiation.radiate(source, rads) @@ -113,9 +113,10 @@ var/global/list/supermatter_delam_accent_sounds = list( light_range = 4 layer = ABOVE_HUMAN_LAYER matter = list( - /decl/material/solid/supermatter = MATTER_AMOUNT_PRIMARY, + /decl/material/solid/exotic_matter = MATTER_AMOUNT_PRIMARY, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) + w_class = ITEM_SIZE_LARGE_STRUCTURE var/nitrogen_retardation_factor = 0.15 // Higher == N2 slows reaction more var/thermal_release_modifier = 10000 // Higher == more heat released during reaction @@ -237,13 +238,13 @@ var/global/list/supermatter_delam_accent_sounds = list( else aw_EPR = FALSE -/obj/machinery/power/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_to_irc = FALSE) +/obj/machinery/power/supermatter/proc/status_adminwarn_check(var/min_status, var/current_state, var/message, var/send_webhook = FALSE) var/status = get_status() if(status >= min_status) if(!current_state) log_and_message_admins(message) - if(send_to_irc) - send2adminirc(message) + if(send_webhook) + SSwebhooks.send(WEBHOOK_AHELP_SENT, list("name" = "Supermatter Warning", "body" = message)) return TRUE else return FALSE @@ -696,6 +697,7 @@ var/global/list/supermatter_delam_accent_sounds = list( desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it." icon = 'icons/obj/supermatter_32.dmi' icon_state = "supermatter_shard" + w_class = ITEM_SIZE_STRUCTURE warning_point = 50 emergency_point = 400 @@ -708,6 +710,7 @@ var/global/list/supermatter_delam_accent_sounds = list( /obj/machinery/power/supermatter/medium icon = 'icons/obj/supermatter_32.dmi' + w_class = (ITEM_SIZE_STRUCTURE + ITEM_SIZE_LARGE_STRUCTURE) / 2 // halfway between a shard and a normal SM /obj/machinery/power/supermatter/shard/announce_warning() //Shards don't get announcements return diff --git a/mods/content/supermatter/machinery/supermatter_core_console.dm b/mods/content/supermatter/machinery/supermatter_core_console.dm new file mode 100644 index 00000000000..8b2bf0e175c --- /dev/null +++ b/mods/content/supermatter/machinery/supermatter_core_console.dm @@ -0,0 +1,45 @@ +// Does this really need to be its own thing...? +// Can it not just be a stock parts preset or something? +/obj/machinery/computer/air_control/supermatter_core + frequency = 1438 + out_pressure_mode = 1 + +/datum/fabricator_recipe/imprinter/circuit/supermatter_control + path = /obj/item/stock_parts/circuitboard/air_management/supermatter_core + +/obj/item/stock_parts/circuitboard/air_management/supermatter_core + name = "circuitboard (core control)" + build_path = /obj/machinery/computer/air_control/supermatter_core + frequency = 1438 + var/input_tag + var/output_tag + + var/list/input_info = list() + var/list/output_info = list() + + var/input_flow_setting = 700 + var/pressure_setting = 100 + +/obj/item/stock_parts/circuitboard/air_management/supermatter_core/construct(var/obj/machinery/computer/air_control/supermatter_core/SC) + if(..(SC)) + SC.input_tag = input_tag + SC.output_tag = output_tag + + SC.input_info = input_info.Copy() + SC.output_info = output_info.Copy() + + SC.input_flow_setting = input_flow_setting + SC.pressure_setting = input_flow_setting + return 1 + +/obj/item/stock_parts/circuitboard/air_management/supermatter_core/deconstruct(var/obj/machinery/computer/air_control/supermatter_core/SC) + if(..(SC)) + input_tag = SC.input_tag + output_tag = SC.output_tag + + input_info = SC.input_info.Copy() + output_info = SC.output_info.Copy() + + input_flow_setting = SC.input_flow_setting + pressure_setting = SC.input_flow_setting + return 1 \ No newline at end of file diff --git a/nano/templates/supermatter_crystal.tmpl b/mods/content/supermatter/nano_templates/supermatter_crystal.tmpl similarity index 100% rename from nano/templates/supermatter_crystal.tmpl rename to mods/content/supermatter/nano_templates/supermatter_crystal.tmpl diff --git a/nano/templates/supermatter_monitor.tmpl b/mods/content/supermatter/nano_templates/supermatter_monitor.tmpl similarity index 100% rename from nano/templates/supermatter_monitor.tmpl rename to mods/content/supermatter/nano_templates/supermatter_monitor.tmpl diff --git a/mods/content/supermatter/overrides/sm_fuel_compressor.dm b/mods/content/supermatter/overrides/sm_fuel_compressor.dm new file mode 100644 index 00000000000..e259fa26625 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_fuel_compressor.dm @@ -0,0 +1,13 @@ +/obj/machinery/fuel_compressor/add_material(obj/thing, mob/user) + . = ..() + if(.) + return TRUE + if(istype(thing, /obj/machinery/power/supermatter/shard)) + var/exotic_matter_amount = thing?.matter?[/decl/material/solid/exotic_matter] + if(exotic_matter_amount <= 0) + return FALSE + stored_material[/decl/material/solid/exotic_matter] = exotic_matter_amount + to_chat(user, SPAN_NOTICE("You awkwardly cram \the [thing] into \the [src]'s material buffer.")) + qdel(thing) + return TRUE + return FALSE \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_meteor.dm b/mods/content/supermatter/overrides/sm_meteor.dm new file mode 100644 index 00000000000..449ad80fbb9 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_meteor.dm @@ -0,0 +1,5 @@ +/obj/effect/meteor/destroyer/supermatter + name = "supermatter shard" + desc = "Oh god, what will be next..?" + icon = 'icons/obj/supermatter_32.dmi' + icon_state = "supermatter" diff --git a/mods/content/supermatter/overrides/sm_singularity.dm b/mods/content/supermatter/overrides/sm_singularity.dm new file mode 100644 index 00000000000..b13506cd580 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_singularity.dm @@ -0,0 +1,46 @@ +#define STAGE_SUPER 11 + +/// A singularity that has the mass of a supermatter crystal. +/decl/singularity_stage/stage_super + name = "super gravitational singularity" + desc = "A gravitational singularity with the properties of supermatter. It has the power to destroy worlds." + min_energy = 50000 + max_energy = INFINITY + stage_size = STAGE_SUPER + footprint = 6 + icon = 'icons/effects/352x352.dmi' + icon_state = "singularity_s11"//uh, whoever drew that, you know that black holes are supposed to look dark right? What's this, the clown's singulo? + pixel_x = -160 + pixel_y = -160 + grav_pull = 16 + consume_range = 5 + dissipates_over_time = 0 //It cant go smaller due to e loss + event_chance = 25 //Events will fire off more often. + forced_event = /decl/singularity_event/supermatter_wave + wander = TRUE + explosion_vulnerable = FALSE + em_heavy_range = 12 + em_light_range = 16 + mesmerize_text = "helpless" + the_goggles_do_nothing = TRUE + ignore_obstacles = TRUE + +/decl/singularity_stage/stage_super/grow_to(obj/effect/singularity/source) + source.visible_message(SPAN_SINISTER("You witness the creation of a destructive force that cannot possibly be stopped by human hands.")) + +// why is this not shrink_from or something? +/decl/singularity_stage/stage_five/shrink_to(obj/effect/singularity/source) + source.visible_message(SPAN_WARNING("\The [source] miraculously reduces in size and loses its supermatter properties.")) + +// Singularity event +/decl/singularity_event/supermatter_wave/handle_event(obj/effect/singularity/source) + for(var/mob/living/M in view(10, source.loc)) + to_chat(M, SPAN_WARNING("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) + if(prob(67)) + to_chat(M, SPAN_NOTICE("Miraculously, it fails to kill you.")) + else + to_chat(M, SPAN_DANGER("You don't even have a moment to react as you are reduced to ashes by the intense radiation.")) + M.dust() + SSradiation.radiate(source, rand(source.energy)) + +#undef STAGE_SUPER \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_strings.dm b/mods/content/supermatter/overrides/sm_strings.dm new file mode 100644 index 00000000000..2d7427f03d3 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_strings.dm @@ -0,0 +1,19 @@ +/decl/game_mode/possible_ert_disabled_reasons() + var/static/sm_injected = FALSE + if(sm_injected) + return ..() + sm_injected = TRUE + . = ..() + . += "supermatter dust" + +/obj/item/disk/secret_project/get_secret_project_nouns() + var/static/sm_injected = FALSE + if(sm_injected) + return ..() + sm_injected = TRUE + . = ..() + . += "a supermatter engine" + return . + +/decl/material/solid/exotic_matter + 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." \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_trader.dm b/mods/content/supermatter/overrides/sm_trader.dm new file mode 100644 index 00000000000..ded45374bd9 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_trader.dm @@ -0,0 +1,3 @@ +/datum/trader/ship/unique/rock/New() + ..() + possible_trading_items[/obj/machinery/power/supermatter] = TRADER_ALL \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_unit_tests.dm b/mods/content/supermatter/overrides/sm_unit_tests.dm new file mode 100644 index 00000000000..18351659e4c --- /dev/null +++ b/mods/content/supermatter/overrides/sm_unit_tests.dm @@ -0,0 +1,3 @@ +/datum/unit_test/turf_floor_icons_shall_be_valid/New() + ..() + excepted_types |= /turf/unsimulated/wall/cascade \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_xenoarchaeology.dm b/mods/content/supermatter/overrides/sm_xenoarchaeology.dm new file mode 100644 index 00000000000..537de7a311c --- /dev/null +++ b/mods/content/supermatter/overrides/sm_xenoarchaeology.dm @@ -0,0 +1,7 @@ +/datum/artifact_find/New() + var/static/supermatter_injected = FALSE + if(!supermatter_injected) + potential_finds[/obj/machinery/power/supermatter] = 5 + potential_finds[/obj/machinery/power/supermatter/shard] = 25 + supermatter_injected = TRUE + ..() diff --git a/mods/content/supermatter/structures/sm_closets.dm b/mods/content/supermatter/structures/sm_closets.dm new file mode 100644 index 00000000000..a1e58097f93 --- /dev/null +++ b/mods/content/supermatter/structures/sm_closets.dm @@ -0,0 +1,2 @@ +/obj/structure/closet/crate/secure/large/supermatter + closet_appearance = /decl/closet_appearance/large_crate/secure/hazard \ No newline at end of file diff --git a/mods/content/tabloids/_tabloids.dm b/mods/content/tabloids/_tabloids.dm new file mode 100644 index 00000000000..7d6188ff28f --- /dev/null +++ b/mods/content/tabloids/_tabloids.dm @@ -0,0 +1,58 @@ +/decl/modpack/tabloids + name = "Tabloids" + tabloid_publishers = list( + "\improper Solar Enquirer", + "\improper Stellar Examiner", + "\improper Antares Daily", + "\improper Weekly Galactic News", + "\improper Spiral" + ) + tabloid_headlines = list( + "NARCOALGORITHMS: ARE YOUR CHILDREN SAFE?", + "ARE GMO HUMANS POISONOUS IN BED?", + "TOP 10 REASONS WHY OTHER SPECIES ARE A HOAX", + "CENTENNIAL POSITRONIC EXTENDS LIFESPAN WITH 1 SIMPLE TRICK", + "TOP 10 DANGEROUS FOODS WITH CHEMICALS", + "NEW TERRIFYING TEEN TREND: SUN-DIVING", + "HAS YOUR SPOUSE BEEN REPLACED BY AN ALIEN IMPOSTER? STUDIES SUGGEST YES!", + "SPACE CAUSES CANCER: DOCTORS CONFIRM", + "ARE BODY SCANNERS TOO INVASIVE? FIND OUT INSIDE!", + "HAS SCIENCE GONE TOO FAR? LOCAL SCIENTIST DEBUNKS ALIEN THEORY, DECRIES THEM AS TUBE EXPERIMENTS GONE WRONG", + "100 DELICIOUS RECIPES LETHAL TO CARBON-BASED LIFE", + "TOP FIVE SPECIES WE DROVE TO EXTINCTION; NUMBER TWO WILL SHOCK YOU", + "RELIGION WAS RIGHT? SHOCK FINDINGS SHOW ALIEN SIMILARITY TO ANIMALS, EXISTENCE OF BOATS", + "TOP TEN REASONS WHY ONLY HUMANS ARE SENTIENT", + "WHICH PLANET HAS THE BEST LOVERS? THIS AND MORE INSIDE!", + "SHE SAID WE SHOULD SEE OTHER PEOPLE, SO I MARRIED A NEO-AVIAN PACK: FULL STORY INSIDE", + "LOSE WEIGHT THREE TIMES FASTER WITH THESE LOW-G MANEUVERS!", + "MY DAUGHTER JOINED A NEURAL COLLECTIVE AND NOW SHE CAN TASTE SPACETIME: FULL STORY INSIDE", + "WERE THE NAZIS PSYCHIC? ONE HISTORIAN TELLS ALL", + "IS THE SOLAR GOVERNMENT CREATING AN AI SUPERINTELLIGENCE NEAR MERCURY? ONE EXPERT REVEALS SHOCKING INSIDER DETAILS!", + "TOP TEN HISTORICAL FIGURES THAT WERE TWO PROMETHEANS IN A TRENCHCOAT", + "TOP 10 SECRET AUGMENTS THE GOVERNMENT DOESN'T WANT YOU TO GET", + "ENLARGE YOUR MENTAL FACULTIES WITH THIS 1 WEIRD HAT", + "'HELP, MY SON THINKS HE'S A 20TH CENTURY VID CHARACTER CALLED SPOCK' AND MORE SHOCKING TALES INSIDE", + "18 RADICAL HIP IMPLANTS ALL THE KIDS ARE GETTING!", + "PRESERVED HEAD OF 21ST CENTURY CAPITALIST INSISTS THAT 'DYSON WALL' ONLY SANE SOLUTION TO RIMWARD MALCONTENTS", + "50 SHADES OF GREEN; BESTSELLING MULTISPECIES ROMANCE COMING TO CINEMAS", + "PLUTO: DWARF PLANET, OR SECRET RAMPANT AI FACILITY HELL-BENT ON CORRUPTING YOUR CHILDREN?", + "TOP TEN ANIME ALIENS. NUMBER 3 WILL SICKEN YOU", + "OCTUBER X'RALLBRE EXPOSED; NUDE PHOTOSHOOT LEAKS", + "WAR ON MARS AFTER NAKED MAN WAS FOUND; WERE THE ROMANS RIGHT?", + "REAL ALIENS ARGUE EARTH MOVIES RACIST!", + "HELP! I MARRIED A HEGEMONOUS SWARM INTELLIGENCE AND MY SON THINKS HE'S A ROUTER!", + "POSITRONICS: HUMAN INGENUITY AND GENEROSITY, OR A HORRIBLE MISTAKE? FIND OUT INSIDE!", + "THE FREE TRADER UNION: NEITHER FREE NOR A UNION. SHOCKING EXPOSE!", + "HAS THE FREE MARKET GONE TOO FAR? LUNA GLITTERPOP STAR AUCTIONS THIRD TESTICLE FOR TRANS-ORBITAL SHIPPING BONDS", + "THEY SAID IT WAS CANCER, BUT I KNEW IT WAS A TINY, SELF-REPLICATING CLONE OF RAY KURZWEIL: FULL STORY INSIDE", + "WHAT HAS TECHNOLOGY DONE? INDUSTRY BILLIONAIRE MARRIES OWN INFORMORPH MIND-COPY", + "REPTILLIAN ICE WARRIORS FROM ANOTHER WORLD LIVE INSIDE YOUR AIR DUCTS: HERE'S HOW TO GET RID OF THEM", + "10 CRITICAL THINGS YOU NEED TO KNOW ABOUT 'DRONEGATE'", + "THEY CALL THEM JUMPGATES BUT I'VE NEVER SEEN THEM JUMP: AN INDUSTRY INSIDER SPEAKS FOR THE FIRST TIME", + "EMERGENT INTELLIGENCES ARE STEALING YOUR BANK DETAILS, FETISHES: FOIL HAT RECIPE INSIDE", + "TIME TRAVELLERS ARE STEALING YOUR WIFI: 5 TIPS FOR DEFEATING HACKERS FROM THE FUTURE", + "'My mother was an alien spy': THIS CELEBRITY REVEAL WILL SHOCK AND AMAZE YOU", + "LUMINARY SCIENTIST SPEAKS: DIABETES IS A HYPERCORP RETROVIRUS!", + "'I REROUTED MY NEURAL CIRCUITRY SO THAT PAIN TASTES OF STRAWBERRIES' AND FIFTEEN OTHER CRAZY ALMACH STORIES", + "JOINING THE NAVY? HERE'S 15 EXPERT TIPS FOR AVOIDING BRAIN PARASITES" + ) \ No newline at end of file diff --git a/mods/content/tabloids/_tabloids.dme b/mods/content/tabloids/_tabloids.dme new file mode 100644 index 00000000000..0c6e6e35b01 --- /dev/null +++ b/mods/content/tabloids/_tabloids.dme @@ -0,0 +1,8 @@ +#ifndef CONTENT_PACK_TABLOIDS +#define CONTENT_PACK_TABLOIDS +// BEGIN_INCLUDE +#include "_tabloids.dm" +#include "tabloid.dm" +#include "tabloid_helpers.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/content/tabloids/icons/magazine.dmi b/mods/content/tabloids/icons/magazine.dmi new file mode 100644 index 00000000000..62b385510c8 Binary files /dev/null and b/mods/content/tabloids/icons/magazine.dmi differ diff --git a/mods/content/tabloids/tabloid.dm b/mods/content/tabloids/tabloid.dm new file mode 100644 index 00000000000..6fc781a7ee6 --- /dev/null +++ b/mods/content/tabloids/tabloid.dm @@ -0,0 +1,36 @@ +/obj/item/tabloid + name = "tabloid magazine" + desc = "It's one of those trashy tabloid magazines. It looks pretty out of date." + icon = 'mods/content/tabloids/icons/magazine.dmi' + icon_state = "magazine" + randpixel = 6 + material = /decl/material/solid/organic/paper + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) + var/headline + var/article_body + +/obj/item/tabloid/Initialize() + . = ..() + var/list/tabloid_headlines = get_tabloid_headlines() + name = SAFEPICK(get_tabloid_publishers()) || initial(name) + icon_state = SAFEPICK(get_tabloid_states()) || initial(icon_state) + headline = SAFEPICK(tabloid_headlines) + if(length(tabloid_headlines) && tabloid_headlines[headline]) + article_body = tabloid_headlines[headline] + +/obj/item/tabloid/examine(mob/user, distance, infix, suffix) + . = ..() + if(headline) + to_chat(user, "The headline screams, \"[headline]\"") + +/obj/item/tabloid/attack_self(mob/user) + . = ..() + if(!.) + user.visible_message(SPAN_NOTICE("\The [user] leafs idly through \the [src].")) + if(headline) + to_chat(user, "Most of it is the usual tabloid garbage, but the headline story, \"[headline]\", holds your attention for awhile.") + if(article_body) + to_chat(user, article_body) + else + to_chat(user, "It's the usual tabloid garbage. You find nothing of interest.") + return TRUE diff --git a/mods/content/tabloids/tabloid_helpers.dm b/mods/content/tabloids/tabloid_helpers.dm new file mode 100644 index 00000000000..966556dafbe --- /dev/null +++ b/mods/content/tabloids/tabloid_helpers.dm @@ -0,0 +1,24 @@ +// Minor fluff item for mapping in waiting rooms etc. +/proc/get_tabloid_publishers() + var/static/list/tabloid_publishers + if(!tabloid_publishers) + tabloid_publishers = list() + for(var/modpack_name in SSmodpacks.loaded_modpacks) + var/decl/modpack/modpack = SSmodpacks.loaded_modpacks[modpack_name] + if(length(modpack.tabloid_publishers)) + tabloid_publishers |= modpack.tabloid_publishers + return tabloid_publishers + +/proc/get_tabloid_headlines() + var/static/list/tabloid_headlines + if(!tabloid_headlines) + tabloid_headlines = list() + for(var/modpack_name in SSmodpacks.loaded_modpacks) + var/decl/modpack/modpack = SSmodpacks.loaded_modpacks[modpack_name] + if(length(modpack.tabloid_headlines)) + tabloid_headlines |= modpack.tabloid_headlines + return tabloid_headlines + +/proc/get_tabloid_states() + var/static/list/tabloid_states = icon_states('mods/content/tabloids/icons/magazine.dmi') + return tabloid_states diff --git a/mods/content/xenobiology/_xenobiology.dme b/mods/content/xenobiology/_xenobiology.dme index 11a5f3972c6..1591ea3f458 100644 --- a/mods/content/xenobiology/_xenobiology.dme +++ b/mods/content/xenobiology/_xenobiology.dme @@ -50,7 +50,6 @@ #include "slime\slime_commands.dm" #include "slime\slime_comments.dm" #include "slime\slime_follow.dm" -#include "slime\slime_hud.dm" #include "slime\slime_reagents.dm" #include "slime\slime_surgery.dm" #include "slime\slime_update_icon.dm" diff --git a/mods/content/xenobiology/icons/smartfridge_contents_slime.dmi b/mods/content/xenobiology/icons/smartfridge_contents_slime.dmi new file mode 100644 index 00000000000..c7c8e4acd4d Binary files /dev/null and b/mods/content/xenobiology/icons/smartfridge_contents_slime.dmi differ diff --git a/mods/content/xenobiology/overrides.dm b/mods/content/xenobiology/overrides.dm index a5c39ef2743..015002287b3 100644 --- a/mods/content/xenobiology/overrides.dm +++ b/mods/content/xenobiology/overrides.dm @@ -25,7 +25,7 @@ /obj/machinery/smartfridge/secure/extract name = "\improper Slime Extract Storage" desc = "A refrigerated storage unit for slime extracts." - icon_contents = "slime" + overlay_contents_icon = 'mods/content/xenobiology/icons/smartfridge_contents_slime.dmi' initial_access = list(access_research) /obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O) diff --git a/mods/content/xenobiology/slime/_slime.dm b/mods/content/xenobiology/slime/_slime.dm index fe74f041933..60c12cb89e3 100644 --- a/mods/content/xenobiology/slime/_slime.dm +++ b/mods/content/xenobiology/slime/_slime.dm @@ -18,7 +18,7 @@ status_flags = CANPARALYSE|CANPUSH butchery_data = null ai = /datum/mob_controller/slime - hud_used = /datum/hud/slime + hud_used = /datum/hud/animal nutrition = 800 var/is_adult = FALSE @@ -33,7 +33,6 @@ var/slime_type = /decl/slime_colour/grey var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside var/core_removal_stage = 0 //For removing cores. - var/datum/reagents/metabolism/ingested /mob/living/slime/Destroy() set_feeding_on() @@ -65,8 +64,7 @@ . = ..(mapload) - ingested = new /datum/reagents/metabolism(240, src, CHEM_TOUCH) - reagents = ingested + reagents = new /datum/reagents/metabolism(240, src, CHEM_TOUCH) render_target = "slime_\ref[src]" verbs += /mob/living/proc/ventcrawl @@ -127,7 +125,7 @@ if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille)) if(nutrition <= get_hunger_nutrition()) if (is_adult || prob(5)) - UnarmedAttack(AM) + UnarmedAttack(AM, Adjacent(AM)) if(ismob(AM)) var/mob/tmob = AM @@ -151,7 +149,7 @@ statpanel("Status") stat(null, "Health: [get_health_percent()]%") - stat(null, "Intent: [a_intent]") + stat(null, "Intent: [get_intent().name]") if (client.statpanel == "Status") stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") @@ -206,7 +204,7 @@ visible_message(SPAN_NOTICE("\The [user] pokes \the [src].")) return TRUE - if(user.a_intent == I_HELP) + if(user.check_intent(I_FLAG_HELP)) if(length(contents)) var/atom/movable/AM = pick(contents) AM.dropInto(loc) @@ -240,38 +238,39 @@ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) return TRUE - switch(user.a_intent) - if(I_HELP) - visible_message(SPAN_NOTICE("\The [user] hugs \the [src] to make it feel better!")) - return TRUE - if(I_DISARM) - if(prob(40)) - visible_message(SPAN_DANGER("\The [user] shoves \the [src] and it wobbles around, disoriented!")) - SET_STATUS_MAX(src, STAT_CONFUSE, 2) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - else - visible_message(SPAN_DANGER("\The [user] shoves \the [src]!")) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - return TRUE - if(I_HURT) - var/damage = rand(1, 9) - var/datum/mob_controller/slime/slime_ai = ai - if(istype(slime_ai)) - slime_ai.attacked += 10 - slime_ai.adjust_friendship(user, -5) - if(prob(10)) - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message(SPAN_DANGER("\The [user] has attempted to punch \the [src]!")) - return TRUE - playsound(loc, "punch", 25, 1, -1) - visible_message(SPAN_DANGER("\The [user] has punched \the [src]!")) - take_damage(damage) + if(user.check_intent(I_FLAG_HELP)) + visible_message(SPAN_NOTICE("\The [user] hugs \the [src] to make it feel better!")) + return TRUE + + if(user.check_intent(I_FLAG_DISARM)) + if(prob(40)) + visible_message(SPAN_DANGER("\The [user] shoves \the [src] and it wobbles around, disoriented!")) + SET_STATUS_MAX(src, STAT_CONFUSE, 2) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + else + visible_message(SPAN_DANGER("\The [user] shoves \the [src]!")) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + return TRUE + + if(user.check_intent(I_FLAG_HARM)) + var/damage = rand(1, 9) + var/datum/mob_controller/slime/slime_ai = ai + if(istype(slime_ai)) + slime_ai.attacked += 10 + slime_ai.adjust_friendship(user, -5) + if(prob(10)) + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + visible_message(SPAN_DANGER("\The [user] has attempted to punch \the [src]!")) return TRUE + playsound(loc, "punch", 25, 1, -1) + visible_message(SPAN_DANGER("\The [user] has punched \the [src]!")) + take_damage(damage) + return TRUE return ..() /mob/living/slime/attackby(var/obj/item/W, var/mob/user) - var/force = W.get_attack_force(user) + var/force = W.expend_attack_force(user) if(force > 0) var/datum/mob_controller/slime/slime_ai = ai if(istype(slime_ai)) @@ -374,6 +373,3 @@ . += "Anomalous slime core amount detected." . += "Growth progress:\t[amount_grown]/10." . = jointext(., "
      ") - -/mob/living/slime/can_change_intent() - return TRUE diff --git a/mods/content/xenobiology/slime/life.dm b/mods/content/xenobiology/slime/life.dm index 55b0e665ec1..d71a1d3edd4 100644 --- a/mods/content/xenobiology/slime/life.dm +++ b/mods/content/xenobiology/slime/life.dm @@ -46,6 +46,7 @@ . = ..() if(feeding_on) slime_feed() + var/datum/reagents/metabolism/ingested = reagents ingested.metabolize() /mob/living/slime/fluid_act(datum/reagents/fluids) @@ -86,6 +87,7 @@ . = ..() if(feeding_on) slime_feed() + var/datum/reagents/metabolism/ingested = reagents ingested.metabolize() // Digest whatever we've got floating around in our goop. diff --git a/mods/content/xenobiology/slime/slime_AI.dm b/mods/content/xenobiology/slime/slime_AI.dm index 993f1debc4b..bf28ef6cd6b 100644 --- a/mods/content/xenobiology/slime/slime_AI.dm +++ b/mods/content/xenobiology/slime/slime_AI.dm @@ -2,8 +2,8 @@ expected_type = /mob/living/slime var/mood var/chase_target = 0 - var/mob/living/leader - var/mob/living/current_target // Currently attacking this mob (separate from feeding) + var/weakref/leader + var/weakref/current_target // Currently attacking this mob (separate from feeding) var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with var/list/observed_friends // A list of refs to friends; they are not considered targets for feeding; passed down after splitting. @@ -20,6 +20,7 @@ /datum/mob_controller/slime/Destroy() observed_friends = null friendship_cooldown = null + leader = null current_target = null speech_buffer = null slime = null @@ -37,14 +38,14 @@ /datum/mob_controller/slime/proc/update_mood() if(!slime || !body) return - body.a_intent_change(I_HELP) + body.set_intent(I_FLAG_HELP) var/new_mood if(HAS_STATUS(body, STAT_CONFUSE)) new_mood = "pout" else if(rabid || attacked) new_mood = "angry" - body.a_intent_change(I_HURT) - else if(current_target) + body.set_intent(I_FLAG_HARM) + else if(current_target?.resolve()) new_mood = "mischevous" if(!new_mood) @@ -97,22 +98,27 @@ current_target = null return - if(current_target) + var/mob/actual_target = current_target?.resolve() + if(actual_target) chase_target-- if(chase_target <= 0 || attacked || rabid) // Tired of chasing or attacking everything nearby chase_target = 0 current_target = null + else + current_target = null var/hunger = slime.get_hunger_state() - if(!current_target) + var/mob/leader_mob = leader?.resolve() + actual_target = current_target?.resolve() + if(!actual_target) var/feral = (attacked || rabid || hunger >= 2) - if(feral || (!leader && !holding_still) || (hunger && prob(10))) + if(feral || (!leader_mob && !holding_still) || (hunger && prob(10))) var/list/targets for(var/mob/living/prey in view(7, body)) if(assess_target(prey)) LAZYADD(targets, prey) if(length(targets)) - current_target = get_best_target(targets) + current_target = weakref(get_best_target(targets)) chase_target = rand(5,7) if(slime.is_adult) chase_target += 3 @@ -120,8 +126,8 @@ if(holding_still) holding_still = max(holding_still - 1 - hunger, 0) else if(isturf(body?.loc)) - if(leader) - step_to(body, get_dir(body, leader)) + if(leader_mob) + step_to(body, get_dir(body, leader_mob)) else if(prob(hunger ? 50 : 33)) body.SelfMove(pick(global.cardinal)) @@ -131,42 +137,42 @@ return var/added_delay = 0 - if(slime.amount_grown >= SLIME_EVOLUTION_THRESHOLD && !current_target) + var/mob/actual_target = current_target?.resolve() + if(slime.amount_grown >= SLIME_EVOLUTION_THRESHOLD && !actual_target) if(slime.is_adult) slime.slime_split() else slime.slime_mature() added_delay = 10 else - - if(!assess_target(current_target) || current_target == slime.feeding_on || !(current_target in view(7, body))) + if(!assess_target(actual_target) || actual_target == slime.feeding_on || !(actual_target in view(7, body))) current_target = null - if(!current_target) + if(!actual_target) if(prob(1)) for(var/mob/living/slime/frenemy in range(1, body)) if(frenemy != body && body.Adjacent(frenemy)) - body.a_intent_change((frenemy.slime_type == slime.slime_type) ? I_HELP : I_HURT) - body.UnarmedAttack(frenemy) + body.set_intent((frenemy.slime_type == slime.slime_type) ? I_FLAG_HELP : I_FLAG_HARM) + body.UnarmedAttack(frenemy, TRUE) added_delay = 10 - else if(slime.Adjacent(current_target)) + else if(slime.Adjacent(actual_target)) var/do_attack = FALSE - if(issilicon(current_target)) - body.a_intent_change(I_HURT) + if(issilicon(actual_target)) + body.set_intent(I_FLAG_HARM) do_attack = TRUE - else if(current_target.client && !current_target.current_posture.prone && prob(60 + slime.powerlevel * 4)) - body.a_intent_change(I_DISARM) + else if(actual_target.client && !actual_target.current_posture.prone && prob(60 + slime.powerlevel * 4)) + body.set_intent(I_FLAG_DISARM) do_attack = TRUE - else if(slime.check_valid_feed_target(current_target) == FEED_RESULT_VALID) - body.a_intent_change(I_GRAB) + else if(slime.check_valid_feed_target(actual_target) == FEED_RESULT_VALID) + body.set_intent(I_FLAG_GRAB) do_attack = TRUE if(do_attack) - body.UnarmedAttack(current_target) + body.UnarmedAttack(actual_target, TRUE) added_delay = 10 else current_target = null else - step_to(body, current_target) + step_to(body, actual_target) next_core_logic_run = world.time + max(body?.get_movement_delay(), 5) + added_delay @@ -208,13 +214,13 @@ /datum/mob_controller/slime/proc/adjust_friendship(var/atom/user, var/amount) if(ismob(user)) - if(QDELETED(user)) + if(QDELING(user)) return FALSE user = weakref(user) else if(istype(user, /weakref)) // verify the ref is still valid var/weakref/user_ref = user - user = user_ref.resolve() - if(!ismob(user) || QDELETED(user)) + var/mob/resolved_user = user_ref.resolve() + if(!ismob(resolved_user) || QDELING(resolved_user)) return FALSE else return FALSE diff --git a/mods/content/xenobiology/slime/slime_click.dm b/mods/content/xenobiology/slime/slime_click.dm index 10befbff0c3..837f4660ea8 100644 --- a/mods/content/xenobiology/slime/slime_click.dm +++ b/mods/content/xenobiology/slime/slime_click.dm @@ -18,14 +18,14 @@ A.attack_generic(src, (is_adult ? rand(20,40) : rand(5,25)), "glomped") // Basic attack. return TRUE - if(a_intent == I_HELP) + if(check_intent(I_FLAG_HELP)) M.visible_message( \ SPAN_NOTICE("\The [src] gently pokes \the [M]."), \ SPAN_NOTICE("\The [src] gently pokes you.")) return TRUE var/power = max(0, min(10, (powerlevel + rand(0, 3)))) - if(a_intent == I_DISARM) + if(check_intent(I_FLAG_DISARM)) var/stun_prob = 1 if(powerlevel > 0 && !isslime(A)) switch(power * 10) @@ -46,10 +46,10 @@ SET_STATUS_MAX(src, STAT_WEAK, (power * 0.5)) return TRUE - if(a_intent == I_GRAB && slime_attach(M)) + if(check_intent(I_FLAG_GRAB) && slime_attach(M)) return TRUE - if(a_intent == I_HURT) + if(check_intent(I_FLAG_HARM)) if(prob(15) && !M.current_posture.prone) M.visible_message( \ SPAN_DANGER("\The [src] pounces at \the [M]!"), \ diff --git a/mods/content/xenobiology/slime/slime_commands.dm b/mods/content/xenobiology/slime/slime_commands.dm index 4290f05accf..3be381f2a01 100644 --- a/mods/content/xenobiology/slime/slime_commands.dm +++ b/mods/content/xenobiology/slime/slime_commands.dm @@ -20,15 +20,16 @@ triggers = list("follow") /decl/slime_command/follow/get_response(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) - if(holder.leader) - if(holder.leader == speaker) + var/mob/leader_mob = holder.leader?.resolve() + if(leader_mob) + if(leader_mob == speaker) return pick("Yes...", "Lead...", "Following...") - if(LAZYACCESS(holder.observed_friends, weakref(speaker)) > LAZYACCESS(holder.observed_friends, weakref(holder.leader))) - holder.leader = speaker + if(LAZYACCESS(holder.observed_friends, weakref(speaker)) > LAZYACCESS(holder.observed_friends, holder.leader)) + holder.leader = weakref(speaker) return "Yes... I follow [speaker]..." - return "No... I follow [holder.leader]..." + return "No... I follow [leader_mob]..." if(LAZYACCESS(holder.observed_friends, weakref(speaker)) > 2) - holder.leader = speaker + holder.leader = weakref(speaker) return "I follow..." return pick("No...", "I won't follow...") @@ -45,18 +46,20 @@ holder.adjust_friendship(speaker, -1) return "Grrr..." return "Fine..." - if(holder.current_target) + var/mob/actual_target = holder.current_target?.resolve() + if(actual_target) if(friendship > 3) holder.current_target = null if(friendship < 6) holder.adjust_friendship(speaker, -1) return "Grrr..." return "Fine..." - if(holder.leader) - if(holder.leader == speaker) + var/mob/leader_mob = holder.leader?.resolve() + if(leader_mob) + if(leader_mob == speaker) holder.leader = null return "Yes... I'll stop..." - if(friendship > LAZYACCESS(holder.observed_friends, weakref(holder.leader))) + if(friendship > LAZYACCESS(holder.observed_friends, holder.leader)) holder.leader = null return "Yes... I'll stop..." return "No... I'll keep following..." @@ -66,11 +69,12 @@ /decl/slime_command/stay/get_response(var/speaker, var/spoken, var/datum/mob_controller/slime/holder) var/friendship = LAZYACCESS(holder.observed_friends, weakref(speaker)) - if(holder.leader) - if(holder.leader == speaker) + var/mob/leader_mob = holder.leader?.resolve() + if(leader_mob) + if(leader_mob == speaker) holder.holding_still = friendship * 10 return "Yes... Staying..." - var/leader_friendship = LAZYACCESS(holder.observed_friends, weakref(holder.leader)) + var/leader_friendship = LAZYACCESS(holder.observed_friends, holder.leader) if(friendship > leader_friendship) holder.holding_still = (friendship - leader_friendship) * 10 return "Yes... Staying..." diff --git a/mods/content/xenobiology/slime/slime_comments.dm b/mods/content/xenobiology/slime/slime_comments.dm index bd8ad9f1146..f009e313123 100644 --- a/mods/content/xenobiology/slime/slime_comments.dm +++ b/mods/content/xenobiology/slime/slime_comments.dm @@ -29,8 +29,9 @@ if(holder.slime.nutrition < holder.slime.get_starve_nutrition()) . += list("So... hungry...", "Very... hungry...", "Need... food...", "Must... eat...") tension += 10 - if(holder.current_target) - . += "\The [holder.current_target]... looks tasty..." + var/mob/actual_target = holder.current_target?.resolve() + if(actual_target) + . += "\The [actual_target]... looks tasty..." if(length(.) && prob(tension)) return pick(.) diff --git a/mods/content/xenobiology/slime/slime_hud.dm b/mods/content/xenobiology/slime/slime_hud.dm deleted file mode 100644 index c1dcf1b914a..00000000000 --- a/mods/content/xenobiology/slime/slime_hud.dm +++ /dev/null @@ -1,4 +0,0 @@ -/datum/hud/slime/FinalizeInstantiation() - action_intent = new(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) - adding = list(action_intent) - ..() diff --git a/mods/content/xenobiology/slime/slime_reagents.dm b/mods/content/xenobiology/slime/slime_reagents.dm index bff84fd00ee..882797de759 100644 --- a/mods/content/xenobiology/slime/slime_reagents.dm +++ b/mods/content/xenobiology/slime/slime_reagents.dm @@ -14,22 +14,23 @@ metabolism = REM * 0.25 exoplanet_rarity_gas = MAT_RARITY_EXOTIC -/decl/material/liquid/water/affect_touch(var/mob/living/M, var/removed, var/datum/reagents/holder) +/decl/material/liquid/water/affect_touch(var/mob/living/victim, var/removed, var/datum/reagents/holder) . = ..() - if(isslime(M)) - M.take_damage(10 * removed, TOX) - var/mob/living/slime/S = M - if(istype(S) && istype(S.ai, /datum/mob_controller/slime)) - var/datum/mob_controller/slime/slime_ai = S.ai - if(slime_ai.current_target) + if(isslime(victim)) + victim.take_damage(10 * removed, TOX) + var/mob/living/slime/slime_victim = victim + if(istype(slime_victim) && istype(slime_victim.ai, /datum/mob_controller/slime)) + var/datum/mob_controller/slime/slime_ai = slime_victim.ai + if(slime_ai.current_target) // don't bother resolving it, we're just clearing it slime_ai.current_target = null - S.set_feeding_on() - if(LAZYACCESS(M.chem_doses, type) == removed) - M.visible_message( \ - SPAN_DANGER("\The [S]'s flesh sizzles where \the [name] touches it!"), \ - SPAN_DANGER("Your flesh is burned by \the [name]!")) - SET_STATUS_MAX(M, STAT_CONFUSE, 2) - var/datum/mob_controller/slime/slime_ai = M.ai + slime_victim.set_feeding_on() + if(LAZYACCESS(victim.chem_doses, type) == removed) + var/reagent_name = get_reagent_name(holder) // mostly to check masked name, but handles phase too + victim.visible_message( \ + SPAN_DANGER("\The [slime_victim]'s flesh sizzles where \the [reagent_name] touches it!"), \ + SPAN_DANGER("Your flesh is burned by \the [reagent_name]!")) + SET_STATUS_MAX(victim, STAT_CONFUSE, 2) + var/datum/mob_controller/slime/slime_ai = victim.ai if(istype(slime_ai)) slime_ai.attacked = max(slime_ai.attacked, rand(7,10)) // angery diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index bda33c4bf96..02138255d74 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -1,10 +1,6 @@ #ifndef GAMEMODE_PACK_CULT #define GAMEMODE_PACK_CULT -#ifdef GAMEMODE_PACK_DEITY -#warn Deity modpack loaded before Cult modpack, Nar'sie godform will be unavailable! -#endif - // BEGIN_INCLUDE #include "_cult.dm" #include "archaeology.dm" @@ -25,8 +21,11 @@ #include "special_role.dm" #include "structures.dm" #include "talisman.dm" -#include "wizard.dm" -#include "cultify\de-cultify.dm" +#include "abilities\_handler.dm" +#include "abilities\construct.dm" +#include "abilities\harvest.dm" +#include "abilities\shade.dm" +#include "cultify\de-cultify.dm" #include "cultify\defile.dm" #include "cultify\mob.dm" #include "cultify\turf.dm" @@ -34,7 +33,12 @@ #include "mobs\shade.dm" #include "mobs\constructs\constructs.dm" #include "mobs\constructs\soulstone.dm" -#include "spells\construct.dm" -#include "spells\harvest.dm" // END_INCLUDE -#endif \ No newline at end of file +#endif +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +// END_PREFERENCES diff --git a/mods/gamemodes/cult/abilities/_handler.dm b/mods/gamemodes/cult/abilities/_handler.dm new file mode 100644 index 00000000000..f346bb73fb4 --- /dev/null +++ b/mods/gamemodes/cult/abilities/_handler.dm @@ -0,0 +1,21 @@ +/obj/screen/ability/category/cult + name = "Toggle Construct Abilities" + icon = 'mods/gamemodes/cult/icons/abilities.dmi' + +/obj/screen/ability/button/cult + icon = 'mods/gamemodes/cult/icons/abilities.dmi' + +/datum/ability_handler/cult + category_toggle_type = /obj/screen/ability/category/cult + +/decl/ability/cult + abstract_type = /decl/ability/cult + ability_icon = 'mods/gamemodes/cult/icons/abilities.dmi' + ability_icon_state = "artificer" + associated_handler_type = /datum/ability_handler/cult + ui_element_type = /obj/screen/ability/button/cult + ability_cooldown_time = 60 SECONDS + +/obj/item/ability/cult + icon = 'mods/gamemodes/cult/icons/ability_item.dmi' + color = COLOR_RED diff --git a/mods/gamemodes/cult/abilities/construct.dm b/mods/gamemodes/cult/abilities/construct.dm new file mode 100644 index 00000000000..60138eaba35 --- /dev/null +++ b/mods/gamemodes/cult/abilities/construct.dm @@ -0,0 +1,131 @@ +//////////////////////////////Construct Spells///////////////////////// +/decl/ability/cult/construct + name = "Artificer" + desc = "This spell conjures a construct which may be controlled by shades." + target_selector = /decl/ability_targeting/clear_turf + overlay_icon = 'mods/gamemodes/cult/icons/effects.dmi' + overlay_icon_state = "sparkles" + target_selector = /decl/ability_targeting/clear_turf/construct + var/summon_type = /obj/structure/constructshell + +/decl/ability_targeting/clear_turf/construct/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + var/decl/ability/cult/construct/cult_ability = ability + if(!istype(cult_ability)) + return FALSE + return ..() && !istype(target, cult_ability.summon_type) && !(locate(cult_ability.summon_type) in target) + +/decl/ability/cult/construct/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + . = ..() + var/turf/target_turf = get_turf(hit_target) + if(istype(target_turf)) + if(ispath(summon_type, /turf)) + target_turf = target_turf.ChangeTurf(summon_type, TRUE, FALSE, TRUE, TRUE, FALSE) + if(target_turf) // We reapply effects as target no longer exists. + apply_effect_to(user, target_turf, metadata) + else if(ispath(summon_type, /atom)) + new summon_type(target_turf) + +/decl/ability/cult/construct/lesser + ability_cooldown_time = 2 MINUTES + summon_type = /obj/structure/constructshell/cult + ability_icon_state = "const_shell" + +/decl/ability/cult/construct/floor + name = "Floor Construction" + desc = "This spell constructs a cult floor" + ability_cooldown_time = 2 SECONDS + summon_type = /turf/floor/cult + ability_icon_state = "const_floor" + overlay_icon_state = "cultfloor" + +/decl/ability/cult/construct/wall + name = "Lesser Construction" + desc = "This spell constructs a cult wall" + ability_cooldown_time = 10 SECONDS + summon_type = /turf/wall/cult + ability_icon_state = "const_wall" + overlay_icon_state = "cultwall" + +/decl/ability/cult/construct/wall/reinforced + name = "Greater Construction" + desc = "This spell constructs a reinforced metal wall" + ability_cooldown_time = 30 SECONDS + summon_type = /turf/wall/r_wall + +/decl/ability/cult/construct/soulstone + name = "Summon Soulstone" + desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space." + ability_cooldown_time = 5 MINUTES + summon_type = /obj/item/soulstone + ability_icon_state = "const_stone" + +/decl/ability/cult/construct/pylon + name = "Red Pylon" + desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source." + ability_cooldown_time = 20 SECONDS + summon_type = /obj/structure/cult/pylon + ability_icon_state = "const_pylon" + target_selector = /decl/ability_targeting/pylon + is_melee_invocation = TRUE + prep_cast = TRUE + +/decl/ability_targeting/pylon/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + . = ..() + if(!.) + return + if(istype(target, /obj/structure/cult/pylon)) + return TRUE + if(isturf(target)) + var/turf/target_turf = target + // We can repair pylons, so let us target turfs containing broken pylons. + if(target_turf.contains_dense_objects(user)) + for(var/obj/structure/cult/pylon/pylon in target_turf) + if(pylon.isbroken) + return TRUE + return FALSE + // We can summon pylons in empty turfs. + return TRUE + return FALSE + +/decl/ability/cult/construct/pylon/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + for(var/obj/structure/cult/pylon/P in get_turf(hit_target)) + if(P.isbroken) + P.repair(user) + return TRUE + . = ..() + +/decl/ability/cult/construct/forcewall/lesser + name = "Force Shield" + desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats" + summon_type = /obj/effect/cult_force_wall + ability_cooldown_time = 30 SECONDS + ability_use_channel = 20 SECONDS + ability_icon_state = "const_juggwall" + prepare_message_3p_str = "$USER$ begins to twist and warp space around $TARGET$, building a wall of force." + prepare_message_1p_str = "You begin the lengthy process of warping local space to form a wall of force." + cast_message_3p_str = "$USER$ completes a wall of force!" + cast_message_1p_str = "You complete a wall of force!" + fail_cast_1p_str = "The screaming fabric of spacetime escapes your grip, and the wall of force vanishes." + +//Code for the Juggernaut construct's forcefield, that seemed like a good place to put it. +/obj/effect/cult_force_wall + desc = "This eerie-looking obstacle seems to have been pulled from another dimension through sheer force." + name = "wall of force" + icon = 'mods/gamemodes/cult/icons/effects.dmi' + icon_state = "m_shield_cult" + light_color = "#b40000" + light_range = 2 + anchored = TRUE + opacity = FALSE + density = TRUE + +/obj/effect/cult_force_wall/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(vanish)), 30 SECONDS) + +/obj/effect/cult_force_wall/proc/vanish() + density = FALSE + icon_state = "m_shield_cult_vanish" + sleep(12) + if(!QDELETED(src)) + qdel(src) diff --git a/mods/gamemodes/cult/abilities/harvest.dm b/mods/gamemodes/cult/abilities/harvest.dm new file mode 100644 index 00000000000..49569d6a25e --- /dev/null +++ b/mods/gamemodes/cult/abilities/harvest.dm @@ -0,0 +1,41 @@ +/decl/ability/cult/construct/harvest + name = "Harvest" + desc = "Back to where I come from, and you're coming with me." + ability_cooldown_time = 20 SECONDS + ability_use_channel = 10 SECONDS + overlay_icon_state = "rune_teleport" + overlay_lifespan = 0 + ability_icon_state = "const_harvest" + prepare_message_3p_str = "Space around $USER$ begins to bubble and decay as a terrible vista begins to intrude..." + prepare_message_1p_str = "You bore through space and time, seeking the essence of the Geometer of Blood." + fail_cast_1p_str = "Reality reasserts itself, preventing your return to Nar-Sie." + target_selector = /decl/ability_targeting/living_mob + +/decl/ability/cult/construct/harvest/can_use_ability(mob/user, list/metadata, silent) + . = ..() + if(.) + var/destination + for(var/obj/effect/narsie/N in global.narsie_list) + destination = N.loc + break + if(!destination) + to_chat(user, SPAN_DANGER("You cannot sense the Geometer of Blood!")) + return FALSE + +/decl/ability/cult/construct/harvest/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + ..() + var/destination = null + for(var/obj/effect/narsie/N in global.narsie_list) + destination = N.loc + break + if(!destination) + to_chat(user, SPAN_DANGER("You cannot sense the Geometer of Blood!")) + return + if(ismob(hit_target) && hit_target != user) + var/mob/living/victim = hit_target + to_chat(user, SPAN_SINISTER("You warp back to Nar-Sie along with your prey.")) + to_chat(victim, SPAN_SINISTER("You are wrenched through time and space and thrown into chaos!")) + victim.dropInto(destination) + else + to_chat(user, SPAN_SINISTER("You warp back to Nar-Sie.")) + user.dropInto(destination) diff --git a/mods/gamemodes/cult/abilities/shade.dm b/mods/gamemodes/cult/abilities/shade.dm new file mode 100644 index 00000000000..5fab626d14d --- /dev/null +++ b/mods/gamemodes/cult/abilities/shade.dm @@ -0,0 +1 @@ +/decl/ability/cult/construct/shift \ No newline at end of file diff --git a/mods/gamemodes/cult/flooring.dm b/mods/gamemodes/cult/flooring.dm index a92973b1077..71aff2a3ff3 100644 --- a/mods/gamemodes/cult/flooring.dm +++ b/mods/gamemodes/cult/flooring.dm @@ -7,6 +7,6 @@ turf_flags = TURF_ACID_IMMUNE | TURF_REMOVE_WRENCH can_paint = null -/decl/flooring/reinforced/cult/on_remove() +/decl/flooring/reinforced/cult/on_flooring_remove(turf/removing_from) var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) cult.remove_cultiness(CULTINESS_PER_TURF) diff --git a/mods/gamemodes/cult/ghosttrap.dm b/mods/gamemodes/cult/ghosttrap.dm index 3e5d7452df6..07faf87515f 100644 --- a/mods/gamemodes/cult/ghosttrap.dm +++ b/mods/gamemodes/cult/ghosttrap.dm @@ -20,9 +20,3 @@ var/obj/item/soulstone/stone = new(get_turf(user)) stone.shade = new(stone) request_player(stone.shade, "The soul stone shade summon ritual has been performed. ") - -#ifdef GAMEMODE_PACK_DEITY -/decl/ghosttrap/cult_shade/Initialize() - ban_checks |= /decl/special_role/godcultist - . = ..() -#endif \ No newline at end of file diff --git a/mods/gamemodes/cult/hell_universe.dm b/mods/gamemodes/cult/hell_universe.dm index c5e5ad0adf0..5133b72ba09 100644 --- a/mods/gamemodes/cult/hell_universe.dm +++ b/mods/gamemodes/cult/hell_universe.dm @@ -40,9 +40,3 @@ In short: for(var/mob/living/simple_animal/M in SSmobs.mob_list) if(M && !M.client) M.set_stat(DEAD) - -// Disable Narsie when we enter other (non-hell) universe states -/datum/universal_state/supermatter_cascade/OnEnter() - // Disable Nar-Sie. - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.allow_narsie = 0 \ No newline at end of file diff --git a/mods/gamemodes/cult/icons/abilities.dmi b/mods/gamemodes/cult/icons/abilities.dmi new file mode 100644 index 00000000000..f1d5d8bc121 Binary files /dev/null and b/mods/gamemodes/cult/icons/abilities.dmi differ diff --git a/mods/gamemodes/cult/icons/ability_item.dmi b/mods/gamemodes/cult/icons/ability_item.dmi new file mode 100644 index 00000000000..e22793f4f6b Binary files /dev/null and b/mods/gamemodes/cult/icons/ability_item.dmi differ diff --git a/mods/gamemodes/cult/icons/effects.dmi b/mods/gamemodes/cult/icons/effects.dmi new file mode 100644 index 00000000000..9e238941454 Binary files /dev/null and b/mods/gamemodes/cult/icons/effects.dmi differ diff --git a/mods/gamemodes/cult/icons/forcewall.dmi b/mods/gamemodes/cult/icons/forcewall.dmi new file mode 100644 index 00000000000..04b8560cdac Binary files /dev/null and b/mods/gamemodes/cult/icons/forcewall.dmi differ diff --git a/icons/effects/uristrunes.dmi b/mods/gamemodes/cult/icons/runes.dmi similarity index 100% rename from icons/effects/uristrunes.dmi rename to mods/gamemodes/cult/icons/runes.dmi diff --git a/mods/gamemodes/cult/items.dm b/mods/gamemodes/cult/items.dm index 01a8555e665..e4faf111e49 100644 --- a/mods/gamemodes/cult/items.dm +++ b/mods/gamemodes/cult/items.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/items/weapon/swords/cult.dmi' material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME -// separated into a proc so that deity can modify it +// separated into a proc so that modpacks can modify it /obj/item/sword/cultblade/proc/can_use_safely(mob/living/user) return iscultist(user) @@ -21,12 +21,12 @@ affecting = GET_EXTERNAL_ORGAN(H, zone) if(affecting) - to_chat(user, "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!") + to_chat(user, SPAN_DANGER("An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!")) else - to_chat(user, "An unexplicable force rips through you, tearing the sword from your grasp!") + to_chat(user, SPAN_DANGER("An unexplicable force rips through you, tearing the sword from your grasp!")) //random amount of damage between half of the blade's force and the full force of the blade. - var/force = get_attack_force(user) + var/force = expend_attack_force(user) user.apply_damage(rand(force/2, force), BRUTE, zone, (DAM_SHARP|DAM_EDGE), armor_pen = 100) SET_STATUS_MAX(user, STAT_WEAK, 5) diff --git a/mods/gamemodes/cult/mobs/constructs/constructs.dm b/mods/gamemodes/cult/mobs/constructs/constructs.dm index d5b09c3c438..1eb37f6980b 100644 --- a/mods/gamemodes/cult/mobs/constructs/constructs.dm +++ b/mods/gamemodes/cult/mobs/constructs/constructs.dm @@ -5,13 +5,11 @@ speak_emote = list("hisses") base_animal_type = /mob/living/simple_animal/construct base_movement_delay = -1 - response_help_1p = "You think better of touching $TARGET$." response_help_3p = "$USER$ thinks better of touching $TARGET$." response_disarm = "flails at" response_harm = "punches" icon = 'icons/mob/simple_animal/shade.dmi' - a_intent = I_HURT status_flags = CANPUSH universal_speak = FALSE universal_understand = TRUE @@ -32,7 +30,7 @@ z_flags = ZMM_MANGLE_PLANES glowing_eyes = TRUE ai = /datum/mob_controller/aggressive/construct - var/list/construct_spells = list() + var/list/construct_spells /datum/mob_controller/aggressive/construct emote_speech = list("Hsssssssszsht.", "Hsssssssss...", "Tcshsssssssszht!") @@ -55,7 +53,7 @@ add_language(/decl/language/cultcommon) add_language(/decl/language/cult) for(var/spell in construct_spells) - src.add_spell(new spell, "const_spell_ready") + add_ability(spell) set_light(1.5, -2, COLOR_WHITE) update_icon() @@ -108,7 +106,9 @@ environment_smash = 2 status_flags = 0 resistance = 10 - construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) + construct_spells = list( + /decl/ability/cult/construct/forcewall/lesser + ) hud_used = /datum/hud/construct/juggernaut base_movement_delay = 2 ai = /datum/mob_controller/aggressive/construct_armoured @@ -164,7 +164,9 @@ natural_weapon = /obj/item/natural_weapon/wraith environment_smash = 1 see_in_dark = 7 - construct_spells = list(/spell/targeted/ethereal_jaunt/shift) + construct_spells = list( + /decl/ability/cult/construct/shift + ) hud_used = /datum/hud/construct/wraith /obj/item/natural_weapon/wraith @@ -195,11 +197,11 @@ natural_weapon = /obj/item/natural_weapon/cult_builder environment_smash = 1 construct_spells = list( - /spell/aoe_turf/conjure/construct/lesser, - /spell/aoe_turf/conjure/wall, - /spell/aoe_turf/conjure/floor, - /spell/aoe_turf/conjure/soulstone, - /spell/aoe_turf/conjure/pylon + /decl/ability/cult/construct/lesser, + /decl/ability/cult/construct/wall, + /decl/ability/cult/construct/floor, + /decl/ability/cult/construct/soulstone, + /decl/ability/cult/construct/pylon ) hud_used = /datum/hud/construct/artificer base_movement_delay = 0 @@ -229,7 +231,9 @@ natural_weapon = /obj/item/natural_weapon/juggernaut/behemoth environment_smash = 2 resistance = 10 - construct_spells = list(/spell/aoe_turf/conjure/forcewall/lesser) + construct_spells = list( + /decl/ability/cult/construct/lesser + ) hud_used = /datum/hud/construct/juggernaut base_movement_delay = 2 ai = /datum/mob_controller/aggressive/construct_armoured @@ -250,7 +254,7 @@ see_in_dark = 7 hud_used = /datum/hud/construct/harvester construct_spells = list( - /spell/targeted/harvest + /decl/ability/cult/construct/harvest ) /obj/item/natural_weapon/harvester @@ -265,14 +269,14 @@ /mob/living/simple_animal/construct/handle_regular_status_updates() . = ..() if(.) - silence_spells(purge) + disable_abilities(purge) /mob/living/simple_animal/construct/handle_regular_hud_updates() . = ..() if(.) if(fire) fire.icon_state = "fire[!!GET_HUD_ALERT(src, /decl/hud_element/condition/fire)]" - silence_spells(purge) + disable_abilities(purge) if(healths) switch(current_health) if(250 to INFINITY) healths.icon_state = "health0" diff --git a/mods/gamemodes/cult/mobs/constructs/soulstone.dm b/mods/gamemodes/cult/mobs/constructs/soulstone.dm index a6e8d693c3b..69e5d0ef21e 100644 --- a/mods/gamemodes/cult/mobs/constructs/soulstone.dm +++ b/mods/gamemodes/cult/mobs/constructs/soulstone.dm @@ -51,7 +51,7 @@ to_chat(user, SPAN_NOTICE("You cleanse \the [src] of taint, purging its shackles to its creator.")) is_evil = FALSE return TRUE - else if(I.get_attack_force(user) >= 5) + else if(I.expend_attack_force(user) >= 5) if(full != SOULSTONE_CRACKED) user.visible_message( SPAN_WARNING("\The [user] hits \the [src] with \the [I], and it breaks.[shade.client ? " You hear a terrible scream!" : ""]"), @@ -107,6 +107,33 @@ full = f update_icon() +// Soulstone synthesis recipe. +/decl/chemical_reaction/synthesis/soulstone + name = "Soulstone" + result = null + required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) + result_amount = 1 + hidden_from_codex = TRUE // This shouldn't show up in search. Maybe it should be linked in a 'guide to cult' or something? + +/decl/chemical_reaction/synthesis/soulstone/send_data(datum/reagents/holder, reaction_limit) + return REAGENT_DATA(holder, /decl/material/liquid/blood) // allow on_reaction to get donor data + +/// Whether or not the reaction should produce a soulstone or a normal crystal. +/// The donor mob parameter may either be /mob/living or null. +/decl/chemical_reaction/synthesis/soulstone/proc/donor_is_magic(mob/living/donor) + return FALSE // By default, no one is magic! This is for modpacks to override. + +/decl/chemical_reaction/synthesis/soulstone/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) + var/weakref/donor_ref = LAZYACCESS(reaction_data, DATA_BLOOD_DONOR) + if(donor_is_magic(donor_ref?.resolve())) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/soulstone(location) + else // waste it and produce useless crystal shards + for(var/i = 1, i <= created_volume*2, i++) + new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) + +// Construct shells. These accept soulstones. /obj/structure/constructshell name = "empty shell" icon = 'icons/obj/structures/construct.dmi' diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index 874dc92049c..2d822d252c7 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -14,20 +14,8 @@ else playsound(src, 'sound/effects/ghost2.ogg', 10, 5) -/datum/trader/ship/unique/wizard/New() - possible_wanted_items |= list( - /mob/living/simple_animal/construct = TRADER_SUBTYPES_ONLY, - /obj/item/sword/cultblade = TRADER_THIS_TYPE, - /obj/item/clothing/head/culthood = TRADER_ALL, - /obj/item/clothing/suit/space/cult = TRADER_ALL, - /obj/item/clothing/suit/cultrobes = TRADER_ALL, - /obj/item/clothing/head/helmet/space/cult = TRADER_ALL, - /obj/structure/cult = TRADER_SUBTYPES_ONLY, - /obj/structure/constructshell = TRADER_ALL - ) - ..() - /datum/trader/ship/clothingshop/hatglovesaccessories/New() + ..() possible_trading_items[/obj/item/clothing/head/culthood] = TRADER_BLACKLIST_ALL /mob/living/silicon/ai @@ -60,9 +48,9 @@ /mob/living/simple_animal/hostile/revenant/cult/on_defilement() return -/obj/item/mop/Initialize() +/obj/item/mop/populate_moppable_types() . = ..() - moppable_types += /obj/effect/rune + moppable_types |= /obj/effect/rune /obj/effect/gateway/active/can_transform(mob/victim) if(iscultist(victim)) diff --git a/mods/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm index 11fd2e328ed..c54cb016914 100644 --- a/mods/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -2,7 +2,7 @@ name = "rune" desc = "A strange collection of symbols drawn in blood." anchored = TRUE - icon = 'icons/effects/uristrunes.dmi' + icon = 'mods/gamemodes/cult/icons/runes.dmi' icon_state = "blank" layer = RUNE_LAYER @@ -24,7 +24,7 @@ if(cult.rune_strokes[type]) var/list/f = cult.rune_strokes[type] for(var/i in f) - var/image/t = image('icons/effects/uristrunes.dmi', "rune-[i]") + var/image/t = image(icon, "rune-[i]") overlays += t else var/list/q = list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) @@ -33,7 +33,7 @@ var/j = pick(q) f += j q -= f - var/image/t = image('icons/effects/uristrunes.dmi', "rune-[j]") + var/image/t = image(icon, "rune-[j]") overlays += t cult.rune_strokes[type] = f.Copy() color = bcolor @@ -322,7 +322,7 @@ user.visible_message(SPAN_NOTICE("\The [user] touches \the [src] with \the [I], and it disappears."), SPAN_NOTICE("You disrupt the vile magic with the deadening field of \the [I].")) qdel(src) return TRUE - var/force = I.get_attack_force(user) + var/force = I.expend_attack_force(user) if(force) user.visible_message(SPAN_NOTICE("\The [user] hits \the [src] with \the [I]."), SPAN_NOTICE("You hit \the [src] with \the [I].")) take_damage(force, I.atom_damage_type) @@ -480,9 +480,8 @@ var/list/mob/living/casters = get_cultists() if(casters.len < 3) break - //T.turf_animation('icons/effects/effects.dmi', "rune_sac") - victim.fire_stacks = max(2, victim.fire_stacks) - victim.IgniteMob() + victim.set_fire_intensity(max(2, victim.get_fire_intensity())) + victim.ignite_fire() var/dam_amt = 2 + length(casters) victim.take_organ_damage(dam_amt, dam_amt) // This is to speed up the process and also damage mobs that don't take damage from being on fire, e.g. borgs if(ishuman(victim)) @@ -505,10 +504,9 @@ to_chat(victim, SPAN_OCCULT("The Geometer of Blood claims your body.")) victim.dust() if(victim) - victim.ExtinguishMob() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect + victim.extinguish_fire() // Technically allows them to put the fire out by sacrificing them and stopping immediately, but I don't think it'd have much effect victim = null - /obj/effect/rune/drain cultname = "blood drain" strokes = 3 diff --git a/mods/gamemodes/cult/spells/construct.dm b/mods/gamemodes/cult/spells/construct.dm deleted file mode 100644 index a300bacacb2..00000000000 --- a/mods/gamemodes/cult/spells/construct.dm +++ /dev/null @@ -1,122 +0,0 @@ -//////////////////////////////Construct Spells///////////////////////// - -/spell/aoe_turf/conjure/construct - name = "Artificer" - desc = "This spell conjures a construct which may be controlled by Shades." - - school = "conjuration" - charge_max = 600 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - range = 0 - - summon_type = list(/obj/structure/constructshell) - - hud_state = "artificer" - -/spell/aoe_turf/conjure/construct/lesser - charge_max = 1800 - summon_type = list(/obj/structure/constructshell/cult) - hud_state = "const_shell" - override_base = "const" - -/spell/aoe_turf/conjure/floor - name = "Floor Construction" - desc = "This spell constructs a cult floor" - - charge_max = 20 - spell_flags = Z2NOCAST | CONSTRUCT_CHECK - invocation = "none" - invocation_type = SpI_NONE - range = 0 - summon_type = list(/turf/floor/cult) - - hud_state = "const_floor" - -/spell/aoe_turf/conjure/wall - name = "Lesser Construction" - desc = "This spell constructs a cult wall" - - charge_max = 100 - spell_flags = Z2NOCAST | CONSTRUCT_CHECK - invocation = "none" - invocation_type = SpI_NONE - range = 0 - summon_type = list(/turf/wall/cult) - - hud_state = "const_wall" - -/spell/aoe_turf/conjure/wall/reinforced - name = "Greater Construction" - desc = "This spell constructs a reinforced metal wall" - - charge_max = 300 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - range = 0 - cast_delay = 50 - - summon_type = list(/turf/wall/r_wall) - -/spell/aoe_turf/conjure/soulstone - name = "Summon Soulstone" - desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space" - - charge_max = 3000 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - range = 0 - - summon_type = list(/obj/item/soulstone) - - hud_state = "const_stone" - override_base = "const" - -/spell/aoe_turf/conjure/pylon - name = "Red Pylon" - desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source." - - charge_max = 200 - spell_flags = CONSTRUCT_CHECK - invocation = "none" - invocation_type = SpI_NONE - range = 0 - - summon_type = list(/obj/structure/cult/pylon) - - hud_state = "const_pylon" - -/spell/aoe_turf/conjure/pylon/cast(list/targets) - ..() - var/turf/spawn_place = pick(targets) - for(var/obj/structure/cult/pylon/P in spawn_place.contents) - if(P.isbroken) - P.repair(usr) - continue - return - -/spell/aoe_turf/conjure/forcewall/lesser - name = "Force Shield" - desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats" - - charge_max = 300 - spell_flags = 0 - invocation = "none" - invocation_type = SpI_NONE - range = 0 - summon_type = list(/obj/effect/forcefield/cult) - duration = 200 - - hud_state = "const_juggwall" - -//Code for the Juggernaut construct's forcefield, that seemed like a good place to put it. -/obj/effect/forcefield/cult - desc = "That eerie looking obstacle seems to have been pulled from another dimension through sheer force." - name = "Juggerwall" - icon = 'icons/effects/effects.dmi' - icon_state = "m_shield_cult" - light_color = "#b40000" - light_range = 2 \ No newline at end of file diff --git a/mods/gamemodes/cult/spells/harvest.dm b/mods/gamemodes/cult/spells/harvest.dm deleted file mode 100644 index 41854b772bc..00000000000 --- a/mods/gamemodes/cult/spells/harvest.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/targeted/harvest - name = "Harvest" - desc = "Back to where I come from, and you're coming with me." - - school = "transmutation" - charge_max = 200 - spell_flags = Z2NOCAST | CONSTRUCT_CHECK | INCLUDEUSER - invocation = "" - invocation_type = SpI_NONE - range = 0 - max_targets = 0 - - overlay = 1 - overlay_icon = 'icons/effects/effects.dmi' - overlay_icon_state = "rune_teleport" - overlay_lifespan = 0 - - hud_state = "const_harvest" - -/spell/targeted/harvest/cast(list/targets, mob/user)//because harvest is already a proc - ..() - - var/destination = null - for(var/obj/effect/narsie/N in global.narsie_list) - destination = N.loc - break - if(destination) - var/prey = 0 - for(var/mob/living/M in targets) - if(!findNullRod(M)) - M.forceMove(destination) - if(M != user) - prey = 1 - to_chat(user, "You warp back to Nar-Sie[prey ? " along with your prey":""].") - else - to_chat(user, "...something's wrong!")//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world. - diff --git a/mods/gamemodes/cult/structures.dm b/mods/gamemodes/cult/structures.dm index 51db7add603..9f39d61522d 100644 --- a/mods/gamemodes/cult/structures.dm +++ b/mods/gamemodes/cult/structures.dm @@ -13,10 +13,10 @@ desc = "A floating crystal that hums with an unearthly energy." icon = 'icons/obj/structures/pylon.dmi' icon_state = "pylon" - var/isbroken = 0 light_power = 0.5 light_range = 13 light_color = "#3e0000" + var/isbroken = FALSE /obj/structure/cult/pylon/attack_hand(mob/M) SHOULD_CALL_PARENT(FALSE) @@ -28,7 +28,7 @@ return TRUE /obj/structure/cult/pylon/attackby(obj/item/W, mob/user) - attackpylon(user, W.get_attack_force(user)) + attackpylon(user, W.expend_attack_force(user)) return TRUE /obj/structure/cult/pylon/proc/attackpylon(mob/user, var/damage) @@ -42,7 +42,7 @@ ) user.do_attack_animation(src) playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1) - isbroken = 1 + isbroken = TRUE set_density(0) icon_state = "pylon-broken" set_light(0) @@ -61,10 +61,12 @@ /obj/structure/cult/pylon/proc/repair(mob/user) if(isbroken) to_chat(user, "You repair the pylon.") - isbroken = 0 + isbroken = FALSE set_density(1) icon_state = "pylon" set_light(13, 0.5) + return TRUE + return FALSE /obj/structure/cult/pylon/get_artifact_scan_data() return "Tribal pylon - subject resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations." diff --git a/mods/gamemodes/cult/wizard.dm b/mods/gamemodes/cult/wizard.dm deleted file mode 100644 index b29fa023f65..00000000000 --- a/mods/gamemodes/cult/wizard.dm +++ /dev/null @@ -1,47 +0,0 @@ -// #ifdef GAMEMODE_PACK_WIZARD -// todo: add wizard gamemode define check once it's modularized -/decl/modpack/cult/post_initialize() - . = ..() - global.artefact_feedback[/obj/structure/closet/wizard/souls] = "SS" - -/datum/spellbook/standard/New() - spells[/obj/structure/closet/wizard/souls] = 1 - ..() - -/datum/spellbook/druid/New() - spells[/obj/structure/closet/wizard/souls] = 1 - ..() - -/obj/structure/closet/wizard/souls - name = "Soul Shard Belt" - desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot. This also includes the spell Artificer, used to create the shells used in construct creation." - -/obj/structure/closet/wizard/souls/WillContain() - return list( - /obj/item/contract/boon/wizard/artificer, - /obj/item/belt/soulstone/full, - ) - -/datum/storage/belt/soulstone - can_hold = list( - /obj/item/soulstone - ) - -/obj/item/belt/soulstone - name = "soul stone belt" - desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away." - icon = 'icons/clothing/belt/soulstones.dmi' - storage = /datum/storage/belt/soulstone - -/obj/item/belt/soulstone/full/WillContain() - return list(/obj/item/soulstone = max(1, storage?.storage_slots)) - -/obj/item/contract/boon/wizard/artificer - path = /spell/aoe_turf/conjure/construct - desc = "This contract has a passage dedicated to an entity known as 'Nar-Sie'." - -/obj/item/magic_rock - material = /decl/material/solid/stone/cult - -/obj/item/summoning_stone - material = /decl/material/solid/stone/cult \ No newline at end of file diff --git a/mods/gamemodes/deity/_defines.dm b/mods/gamemodes/deity/_defines.dm deleted file mode 100644 index 285469200ee..00000000000 --- a/mods/gamemodes/deity/_defines.dm +++ /dev/null @@ -1,19 +0,0 @@ -#define DEITY_TREE_SACRIFICE "Sacrificing" -#define DEITY_TREE_SOUL "Soul Arts" -#define DEITY_TREE_DARK_MINION "Summoning" -#define DEITY_TREE_TRANSMUTATION "Transmutation" -#define DEITY_TREE_CONJURATION "Conjuration" -#define DEITY_TREE_ARTIFACT "Artifacts" -#define DEITY_TREE_FIRECONJ "Fire Conjuration" -#define DEITY_TREE_HERALD "Phenomenas" - -#define DEITY_BLOOD_CRAFT "Blood Crafting" -#define DEITY_ARMOR_CRAFT "Armor Crafting" -#define DEITY_VOID_CRAFT "Void Crafting" -#define DEITY_UNLOCK_ARMS "Unlock Armaments" -#define DEITY_UNLOCK_HEAL "Unlock Cleric Spells" - -#define isdeity(A) istype(A, /mob/living/deity) - -#define DEITY_STRUCTURE_NEAR_IMPORTANT 1 //Whether this needs to be near an important structure. -#define DEITY_STRUCTURE_ALONE 2 //Whether this can be near another of the same type. \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dm b/mods/gamemodes/deity/_deity.dm deleted file mode 100644 index 6c658e122b3..00000000000 --- a/mods/gamemodes/deity/_deity.dm +++ /dev/null @@ -1,2 +0,0 @@ -/decl/modpack/deity - name = "Deity Gamemode Content" \ No newline at end of file diff --git a/mods/gamemodes/deity/_deity.dme b/mods/gamemodes/deity/_deity.dme deleted file mode 100644 index a1603dd317d..00000000000 --- a/mods/gamemodes/deity/_deity.dme +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef GAMEMODE_PACK_DEITY -#define GAMEMODE_PACK_DEITY -// BEGIN_INCLUDE -#include "_defines.dm" -#include "_deity.dm" -#include "codex.dm" -#include "deity_base.dm" -#include "deity_role.dm" -#include "gamemode.dm" -#include "god_cultist_role.dm" -#include "overrides.dm" -#include "extensions\deity_be_near.dm" -#include "forms\forms.dm" -// These should only load if cult is loaded. -#ifdef GAMEMODE_PACK_CULT -#include "forms\narsie\items.dm" -#include "forms\narsie\narsie.dm" -#include "forms\narsie\structures.dm" -#include "forms\narsie\deity_items\basic.dm" -#include "forms\narsie\deity_items\minions.dm" -#include "forms\narsie\deity_items\sacrificing.dm" -#include "forms\narsie\deity_items\smithing.dm" -#include "forms\narsie\spells\tear_veil.dm" -#endif -#include "forms\starlight\items.dm" -#include "forms\starlight\mobs.dm" -#include "forms\starlight\starlight.dm" -#include "forms\starlight\structures.dm" -#include "forms\starlight\deity_items\artifacts.dm" -#include "forms\starlight\deity_items\phenomena.dm" -#include "forms\starlight\deity_items\spells.dm" -#include "forms\starlight\spells\disable_tech.dm" -#include "forms\starlight\spells\starlight_aura.dm" -#include "forms\starlight\spells\veil_of_shadows.dm" -#include "forms\tower\spells.dm" -#include "forms\tower\structures.dm" -#include "forms\tower\tower.dm" -#include "forms\tower\deity_items\conjuration.dm" -#include "forms\tower\deity_items\transmutation.dm" -#include "mobs\deity.dm" -#include "mobs\deity_boons.dm" -#include "mobs\deity_click.dm" -#include "mobs\deity_hud.dm" -#include "mobs\deity_items.dm" -#include "mobs\deity_phenomena.dm" -#include "mobs\deity_power.dm" -#include "mobs\deity_pylon.dm" -#include "mobs\deity_sources.dm" -#include "mobs\deity_Stat.dm" -#include "mobs\deity_topic.dm" -#include "mobs\deity_tracking.dm" -#include "mobs\say.dm" -#include "mobs\freelook\cultnet.dm" -#include "mobs\freelook\mask.dm" -#include "mobs\items\blood_crafting.dm" -#include "mobs\items\deity_item.dm" -#include "mobs\items\general.dm" -#include "mobs\items\generic.dm" -#include "mobs\menu\deity_nano.dm" -#include "mobs\phenomena\_defines.dm" -#include "mobs\phenomena\communication.dm" -#include "mobs\phenomena\conjuration.dm" -#include "mobs\phenomena\conversion.dm" -#include "mobs\phenomena\generic.dm" -#include "mobs\phenomena\narsie.dm" -#include "mobs\phenomena\phenomena.dm" -#include "mobs\phenomena\starlight.dm" -#include "mobs\phenomena\transmutation.dm" -#include "screen\intent.dm" -#include "spells\boon.dm" -#include "spells\construction.dm" -#include "spells\open_gateway.dm" -#include "spells\vision.dm" -#include "structures\altar.dm" -#include "structures\blood_forge.dm" -#include "structures\pylon.dm" -#include "structures\structures.dm" -#include "structures\trap.dm" -// END_INCLUDE -#endif \ No newline at end of file diff --git a/mods/gamemodes/deity/codex.dm b/mods/gamemodes/deity/codex.dm deleted file mode 100644 index fae5bfe607a..00000000000 --- a/mods/gamemodes/deity/codex.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/codex_entry/deity - abstract_type = /datum/codex_entry/deity - -/datum/codex_entry/deity/altar - associated_paths = list(/obj/structure/deity/altar) - mechanics_text = "To place someone upon the altar, first have them in an aggressive grab and click the altar while adjacent." - antag_text = "This structure anchors your deity within this realm, granting them additional power to influence it and empower their followers. Additionally, using it as a focus for their powers, they can convert someone laying on top of the altar.
      " - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge - associated_paths = list(/obj/structure/deity/blood_forge) - antag_text = "Allows creation of special items by feeding your blood into it. Only usable by cultists of the aligned deity." - disambiguator = "occult" - -/datum/codex_entry/deity/gateway - associated_paths = list(/obj/structure/deity/gateway) - antag_text = "Stand within the gateway to be transported to an unknown dimension and transformed into a flaming Starborn, a mysterious Blueforged or a subtle Shadowling." - disambiguator = "occult" - -/datum/codex_entry/deity/radiant_statue - associated_paths = list(/obj/structure/deity/radiant_statue) - antag_text = "Allows storage of power if cultists are nearby. This stored power can be expended to charge Starlight items." - disambiguator = "occult" - -/datum/codex_entry/deity/blood_forge/starlight - associated_paths = list(/obj/structure/deity/blood_forge/starlight) - antag_text = "Allows creation of special Starlight items. Only usable by cultists of the aligned deity. Use of this powerful forge will inflict burns." - disambiguator = "occult" - -/datum/codex_entry/deity/wizard_recharger - associated_paths = list(/obj/structure/deity/wizard_recharger) - antag_text = "A well of arcane power. When charged, a cultist may absorb this power to refresh their spells." - disambiguator = "occult" - -/datum/codex_entry/deity/pylon - associated_paths = list(/obj/structure/deity/pylon) - antag_text = "Serves as a conduit for a deity to speak through, making their will known in this dimension to any who hear it." - disambiguator = "occult" \ No newline at end of file diff --git a/mods/gamemodes/deity/deity_base.dm b/mods/gamemodes/deity/deity_base.dm deleted file mode 100644 index 0d7268ebd64..00000000000 --- a/mods/gamemodes/deity/deity_base.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/map_template/ruin/antag_spawn/deity - name = "Deity Base" - mappaths = list( - "mods/gamemodes/deity/deity_base.dmm" - ) - apc_test_exempt_areas = list( - /area/map_template/deity_spawn = NO_SCRUBBER|NO_VENT|NO_APC - ) - -/area/map_template/deity_spawn - name = "\improper Deity Spawn" - icon_state = "yellow" - requires_power = 0 - dynamic_lighting = FALSE diff --git a/mods/gamemodes/deity/deity_base.dmm b/mods/gamemodes/deity/deity_base.dmm deleted file mode 100644 index 7e009c2d0bd..00000000000 --- a/mods/gamemodes/deity/deity_base.dmm +++ /dev/null @@ -1,1035 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/space/infinity, -/area/map_template/deity_spawn) -"b" = ( -/turf/unsimulated/floor/lava, -/area/map_template/deity_spawn) -"c" = ( -/turf/unsimulated/floor/water, -/area/map_template/deity_spawn) -"d" = ( -/obj/abstract/landmark{ - name = "DeitySpawn" - }, -/turf/unsimulated/floor/lava, -/area/map_template/deity_spawn) -"e" = ( -/obj/abstract/landmark{ - name = "DeitySpawn" - }, -/turf/unsimulated/floor/water, -/area/map_template/deity_spawn) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(4,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(5,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(6,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(7,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(8,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(9,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(10,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(11,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(12,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(13,1,1) = {" -a -a -a -a -b -b -b -b -b -b -d -b -b -b -b -b -b -a -a -a -a -"} -(14,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(15,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(16,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(17,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(18,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(19,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(20,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(21,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(22,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(23,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(24,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(25,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(26,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(27,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(28,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(29,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(30,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(31,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(32,1,1) = {" -a -a -a -a -c -c -c -c -c -c -e -c -c -c -c -c -c -a -a -a -a -"} -(33,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(34,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(35,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(36,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(37,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(38,1,1) = {" -a -a -a -a -c -c -c -c -c -c -c -c -c -c -c -c -c -a -a -a -a -"} -(39,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(40,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(41,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(42,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(43,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(44,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} diff --git a/mods/gamemodes/deity/deity_role.dm b/mods/gamemodes/deity/deity_role.dm deleted file mode 100644 index 0426f6e8568..00000000000 --- a/mods/gamemodes/deity/deity_role.dm +++ /dev/null @@ -1,15 +0,0 @@ -/decl/special_role/deity - name = "Deity" - name_plural = "Deities" - mob_path = /mob/living/deity - welcome_text = "This is not your world. This is not your reality. But here you exist. Use your powers, feed off the faith of others.
      You have to click on yourself to choose your form.
      Everything you say will be heard by your cultists!
      To get points your cultists need to build!
      Build Shrine and Construction are the best starting boons!" - landmark_id = "DeitySpawn" - - flags = ANTAG_OVERRIDE_MOB | ANTAG_OVERRIDE_JOB - - hard_cap = 2 - hard_cap_round = 2 - initial_spawn_req = 1 - initial_spawn_target = 1 - - base_to_load = "Deity Base" diff --git a/mods/gamemodes/deity/extensions/deity_be_near.dm b/mods/gamemodes/deity/extensions/deity_be_near.dm deleted file mode 100644 index 5eed3ae1fe4..00000000000 --- a/mods/gamemodes/deity/extensions/deity_be_near.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/extension/deity_be_near - base_type = /datum/extension/deity_be_near - expected_type = /obj/item - var/keep_away_instead = FALSE - var/mob/living/deity/connected_deity - var/threshold_base = 6 - var/expected_helmet - flags = EXTENSION_FLAG_IMMEDIATE - -/datum/extension/deity_be_near/New(var/datum/holder, var/mob/living/deity/connect) - ..() - events_repository.register(/decl/observ/moved, holder,src, PROC_REF(check_movement)) - connected_deity = connect - 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" - - -/datum/extension/deity_be_near/Destroy() - events_repository.unregister(/decl/observ/moved, holder,src) - events_repository.unregister(/decl/observ/destroyed, holder, src) - events_repository.unregister(/decl/observ/item_equipped, holder, src) - . = ..() - -/datum/extension/deity_be_near/proc/check_movement() - var/obj/item/I = holder - if(!isliving(I.loc)) - return - var/min_dist = INFINITY - for(var/s in connected_deity.structures) - var/dist = get_dist(holder,s) - if(dist < min_dist) - min_dist = dist - if(keep_away_instead && min_dist < threshold_base) - deal_damage(I.loc, round(threshold_base/min_dist)) - else if(min_dist > threshold_base) - deal_damage(I.loc, round(min_dist/threshold_base)) - - -/datum/extension/deity_be_near/proc/deal_damage(var/mob/living/victim, var/mult) - return - -/datum/extension/deity_be_near/proc/dead_deity() - var/obj/item/I = holder - I.visible_message(SPAN_WARNING("\The [holder]'s power fades!")) - qdel(src) - -/datum/extension/deity_be_near/proc/wearing_full() - var/obj/item/I = holder - - if(!ishuman(I.loc)) - return FALSE - var/mob/living/human/H = I.loc - if(H.get_equipped_slot_for_item(I) != slot_wear_suit_str) - return FALSE - if(expected_helmet && !istype(H.get_equipped_item(slot_head_str), expected_helmet)) - return FALSE - return TRUE - -/datum/extension/deity_be_near/champion/deal_damage(var/mob/living/victim,var/mult) - victim.take_damage(3 * mult, OXY) - -/datum/extension/deity_be_near/oracle/deal_damage(var/mob/living/victim, var/mult) - victim.take_damage(mult, BURN) - -/datum/extension/deity_be_near/traitor/deal_damage(var/mob/living/victim, var/mult) - victim.take_damage(5 * mult, PAIN) \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/forms.dm b/mods/gamemodes/deity/forms/forms.dm deleted file mode 100644 index 6f1f2f135b3..00000000000 --- a/mods/gamemodes/deity/forms/forms.dm +++ /dev/null @@ -1,48 +0,0 @@ -/*A god form basically is a combination of a sprite sheet choice and a gameplay choice. -Each plays slightly different and has different challenges/benefits -*/ - -/datum/god_form - var/name = "Form" - var/info = "This is a form your being can take." - var/desc = "This is the mob's description given." - var/faction = MOB_FACTION_NEUTRAL //For stuff like mobs and shit - var/god_icon_state = "nar-sie" //What you look like - var/pylon_icon_state //What image shows up when appearing in a pylon - var/mob/living/deity/linked_god = null - var/starting_power_min = 10 - var/starting_regeneration = 1 - var/list/buildables = list() //Both a list of var changes and a list of buildables. - var/list/items - -/datum/god_form/New(var/mob/living/deity/D) - ..() - D.icon_state = god_icon_state - D.desc = desc - D.power_min = starting_power_min - D.power_per_regen = starting_regeneration - linked_god = D - if(items && items.len) - var/list/complete_items = list() - for(var/l in items) - var/datum/deity_item/di = new l() - complete_items[di.name] = di - D.set_items(complete_items) - items.Cut() - -// TODO: Make this not a thing. It's so bad. -/datum/god_form/proc/sync_structure(var/obj/O) - var/list/svars = buildables[O.type] - if(!svars) - return - for(var/V in svars) - O.vars[V] = svars[V] - -/datum/god_form/proc/take_charge(var/mob/living/user, var/charge) - return TRUE - -/datum/god_form/Destroy() - if(linked_god) - linked_god.form = null - linked_god = null - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm b/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm deleted file mode 100644 index 15613d71311..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/basic.dm +++ /dev/null @@ -1,34 +0,0 @@ -/datum/deity_item/boon/eternal_darkness - name = "Eternal Darkness" - desc = "Allows a follower to cause insanity in a target." - category = "Dark Spells" - base_cost = 40 - boon_path = /spell/targeted/shatter - -/datum/deity_item/boon/torment - name = "Torment" - desc = "Gives a follower the ability to cause mass hysteria and pain." - category = "Dark Spells" - base_cost = 50 - boon_path = /spell/targeted/torment - -/datum/deity_item/boon/blood_shard - name = "Blood Shard" - desc = "Lets a follower cause a target's blood to literally explode out of their skin into dangerous projectiles." - category = "Dark Spells" - base_cost = 75 - boon_path = /spell/hand/charges/blood_shard - -/datum/deity_item/boon/drain_blood - name = "Drain Blood" - desc = "Lets a follower drain blood from all those around them." - category = "Dark Spells" - base_cost = 110 - boon_path = /spell/aoe_turf/drain_blood - -/datum/deity_item/phenomena/exude_blood - name = "Phenomena: Exude Blood" - desc = "You extract the raw blood used in your faith and give it to one of your flock." - category = "Dark Spells" - base_cost = 30 - phenomena_path = /datum/phenomena/exude_blood \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm b/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm deleted file mode 100644 index 6af873ed6da..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/minions.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/deity_item/minions - name = DEITY_TREE_DARK_MINION - desc = "Unlock abilities that allow your followers to craft and summon useful creatures." - category = DEITY_TREE_DARK_MINION - base_cost = 75 - -/datum/deity_item/boon/soul_shard - name = "Soul Stone Shard" - desc = "Give your follower a sliver of soulstone to capture a life in." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 20 - boon_path = /obj/item/soulstone - -/datum/deity_item/boon/blood_zombie - name = "Blood Plague" - desc = "Give a vessel to a follower filled with infection so vile, it turns all sapient creatures into mindless husks." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 300 - boon_path = /obj/item/chems/drinks/zombiedrink - -/datum/deity_item/boon/tear_veil - name = "Tear Veil" - desc = "Grant your follower the ability to literally rip a hole in this reality, allowing things to pass through." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 100 - boon_path = /spell/tear_veil - -/datum/deity_item/phenomena/hellscape - name = "Phenomena: Reveal Hellscape" - desc = "You show a non-believer what their future will be like." - category = DEITY_TREE_DARK_MINION - requirements = list(DEITY_TREE_DARK_MINION = 1) - base_cost = 110 - phenomena_path = /datum/phenomena/hellscape \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm deleted file mode 100644 index 7e5d631c7f9..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/sacrificing.dm +++ /dev/null @@ -1,42 +0,0 @@ -/datum/deity_item/sacrifice - name = DEITY_TREE_SACRIFICE - desc = "Unlocks the tools necessary to allow your followers to sacrifice in your name." - category = DEITY_TREE_SACRIFICE - base_cost = 50 - max_level = 1 - -/datum/deity_item/boon/sac_dagger - name = "Sacrificial Dagger" - desc = "A small dagger embued with your powers. Lets your followers give you power through sacrifices on an altar." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 10 - boon_path = /obj/item/knife/ritual/sacrifice - -/datum/deity_item/boon/sac_spell - name = "Sacrifice Spell" - desc = "This ability makes the user take INCREDIBLE amounts of damage to heal a target for a similar amount of damage." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 10 - boon_path = /spell/targeted/heal_target/sacrifice - -/datum/deity_item/boon/execution_axe - name = "Greedy Axe" - desc = "This axe can store the very souls of those it kills to be later transfered to you through an altar." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 50 - boon_path = /obj/item/bladed/axe/fire/cult - -/datum/deity_item/blood_stone - name = "Bloodied Stone" - desc = "Unlocks the blood stone building, which allows followers to increase your power through ritual and prayer." - category = DEITY_TREE_SACRIFICE - requirements = list(DEITY_TREE_SACRIFICE = 1) - base_cost = 50 - max_level = 1 - -/datum/deity_item/blood_stone/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= /obj/structure/deity/blood_stone \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm b/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm deleted file mode 100644 index bcb12ff11e3..00000000000 --- a/mods/gamemodes/deity/forms/narsie/deity_items/smithing.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/deity_item/blood_crafting/narsie - recipes = list( - /obj/item/sword/cultblade = 50, - /obj/item/clothing/head/culthood/alt = 10, - /obj/item/clothing/suit/cultrobes/alt = 20 - ) - -/datum/deity_item/blood_crafting/armored - name = DEITY_ARMOR_CRAFT - desc = "Unlock the secrets to tempered blood smithing, allowing your followers to smith more powerful and expensive armaments." - category = DEITY_BLOOD_CRAFT - base_cost = 75 - requirements = list(DEITY_BLOOD_CRAFT = 1) - recipes = list( - /obj/item/clothing/suit/cultrobes/magusred = 80, - /obj/item/clothing/head/culthood/magus = 50, - /obj/structure/constructshell/cult = 70 - ) //also shield? - -/datum/deity_item/blood_crafting/space - name = DEITY_VOID_CRAFT - desc = "Allows your followers to craft space suits, allowing you to finally spread across the cosmos." - category = DEITY_BLOOD_CRAFT - base_cost = 100 - requirements = list(DEITY_BLOOD_CRAFT = 1, DEITY_ARMOR_CRAFT = 1) - recipes = list( - /obj/item/clothing/suit/space/cult = 100, - /obj/item/clothing/head/helmet/space/cult = 70 - ) //Probably more too. \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/items.dm b/mods/gamemodes/deity/forms/narsie/items.dm deleted file mode 100644 index 56d3ffe89f8..00000000000 --- a/mods/gamemodes/deity/forms/narsie/items.dm +++ /dev/null @@ -1,77 +0,0 @@ - -//SACRIFICE DAGGER -//If used on a person on an altar, causes the user to carve into them, dealing moderate damage and gaining points for the altar's god. -/obj/item/knife/ritual/sacrifice - name = "sacrificial dagger" - desc = "This knife is dull but well used." - material = /decl/material/solid/stone/cult - -/obj/item/knife/ritual/sacrifice/resolve_attackby(var/atom/a, var/mob/user, var/click_params) - var/turf/T = get_turf(a) - var/obj/structure/deity/altar/altar = locate() in T - if(!altar) - return ..() - if(isliving(a)) - var/mob/living/L = a - var/multiplier = 1 - if(L.mind) - multiplier++ - if(ishuman(L)) - var/mob/living/human/H = L - if(H.should_have_organ(BP_HEART)) - multiplier++ - if(L.stat == DEAD) - to_chat(user, SPAN_WARNING("\The [a] is already dead! There is nothing to take!")) - return - - user.visible_message(SPAN_WARNING("\The [user] hovers \the [src] over \the [a], whispering an incantation.")) - if(!do_after(user,200, L)) - return - user.visible_message(SPAN_DANGER("\The [user] plunges the knife down into \the [a]!")) - L.take_damage(20) - if(altar.linked_god) - altar.linked_god.adjust_power_min(2 * multiplier,0,"from a delicious sacrifice!") - - -//EXEC AXE -//If a person hit by this axe within three seconds dies, sucks in their soul to be harvested at altars. -/obj/item/bladed/axe/fire/cult - name = "terrible axe" - desc = "Its head is sharp and stained red with heavy use." - icon = 'icons/obj/items/weapon/bone_axe.dmi' - var/stored_power = 0 - -/obj/item/bladed/axe/fire/cult/examine(mob/user) - . = ..() - if(stored_power) - to_chat(user, SPAN_NOTICE("It exudes a death-like smell.")) - -/obj/item/bladed/axe/fire/cult/resolve_attackby(var/atom/a, var/mob/user, var/click_params) - if(istype(a, /obj/structure/deity/altar)) - var/obj/structure/deity/altar/altar = a - if(stored_power && altar.linked_god) - altar.linked_god.adjust_power_min(stored_power, "from harvested souls.") - altar.visible_message(SPAN_WARNING("\The [altar] absorbs a black mist exuded from \the [src].")) - return - if(ismob(a)) - var/mob/M = a - if(M.stat != DEAD) - events_repository.register(/decl/observ/death, M,src, TYPE_PROC_REF(/obj/item/bladed/axe/fire/cult, gain_power)) - spawn(30) - events_repository.unregister(/decl/observ/death, M,src) - return ..() - -/obj/item/bladed/axe/fire/cult/proc/gain_power() - stored_power += 50 - src.visible_message(SPAN_OCCULT("\The [src] screeches as the smell of death fills the air!")) - -/obj/item/chems/drinks/zombiedrink - name = "well-used urn" - desc = "Said to bring those who drink it back to life, no matter the price." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "urn" - volume = 10 - amount_per_transfer_from_this = 10 - -/obj/item/chems/drinks/zombiedrink/populate_reagents() - add_to_reagents(/decl/material/liquid/zombie, reagents.maximum_volume) diff --git a/mods/gamemodes/deity/forms/narsie/narsie.dm b/mods/gamemodes/deity/forms/narsie/narsie.dm deleted file mode 100644 index 1529c67f691..00000000000 --- a/mods/gamemodes/deity/forms/narsie/narsie.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/god_form/narsie - name = "Nar-Sie" - info = {"The Geometer of Blood, you crave blood and destruction.
      - Benefits:
      - +Can gain power from blood sacrifices.
      - +Ability to forge weapons and armor.
      - Drawbacks:
      - -Servant abilities require copious amounts of their blood. - "} - desc = "A being made of a million nightmares, a billion deaths." - god_icon_state = "nar-sie" - pylon_icon_state = "shade" - faction = "cult" - - buildables = list( - /obj/structure/deity/altar/narsie, - /obj/structure/deity/pylon - ) - items = list( - /datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/eternal_darkness, - /datum/deity_item/boon/torment, - /datum/deity_item/boon/blood_shard, - /datum/deity_item/boon/drain_blood, - /datum/deity_item/phenomena/exude_blood, - /datum/deity_item/sacrifice, - /datum/deity_item/boon/sac_dagger, - /datum/deity_item/boon/sac_spell, - /datum/deity_item/boon/execution_axe, - /datum/deity_item/blood_stone, - /datum/deity_item/minions, - /datum/deity_item/boon/soul_shard, - /datum/deity_item/boon/blood_zombie, - /datum/deity_item/boon/tear_veil, - /datum/deity_item/phenomena/hellscape, - /datum/deity_item/blood_crafting/narsie, - /datum/deity_item/blood_crafting/armored, - /datum/deity_item/blood_crafting/space - ) - -/datum/god_form/narsie/take_charge(var/mob/living/user, var/charge) - charge = min(100, charge * 0.25) - if(prob(charge)) - to_chat(user, SPAN_WARNING("You feel drained...")) - var/mob/living/human/H = user - if(istype(H) && H.should_have_organ(BP_HEART)) - H.vessel.remove_any(charge) - else - user.take_damage(charge) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm b/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm deleted file mode 100644 index daf6b5d59d9..00000000000 --- a/mods/gamemodes/deity/forms/narsie/spells/tear_veil.dm +++ /dev/null @@ -1,37 +0,0 @@ -/spell/tear_veil - name = "Tear Veil" - desc = "Use your mental strength to literally tear a hole from this dimension to the next, letting things through..." - - charge_max = 300 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "const_floor" - cast_sound = 'sound/effects/meteorimpact.ogg' - var/list/possible_spawns = list( - /mob/living/simple_animal/hostile/scarybat/cult, - /mob/living/simple_animal/hostile/creature/cult, - /mob/living/simple_animal/hostile/revenant/cult - ) - -/spell/tear_veil/choose_targets() - var/turf/T = get_turf(holder) - holder.visible_message(SPAN_NOTICE("A strange portal rips open underneath \the [holder]!")) - var/obj/effect/gateway/hole = new(get_turf(T)) - hole.density = FALSE - return list(hole) - -/spell/tear_veil/cast(var/list/targets, var/mob/holder, var/channel_count) - if(channel_count == 1) - return - var/type = pick(possible_spawns) - var/mob/living/L = new type(get_turf(targets[1])) - L.faction = holder.faction - L.visible_message(SPAN_WARNING("\A [L] escapes from the portal!")) - -/spell/tear_veil/after_spell(var/list/targets) - qdel(targets[1]) - return \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/narsie/structures.dm b/mods/gamemodes/deity/forms/narsie/structures.dm deleted file mode 100644 index af576963a1f..00000000000 --- a/mods/gamemodes/deity/forms/narsie/structures.dm +++ /dev/null @@ -1,36 +0,0 @@ -/obj/structure/deity/altar/narsie - name = "altar" - desc = "A small desk, covered in blood." - icon_state = "talismanaltar" - -//BLOODLETTING STRUCTURE -//A follower can stand here and mumble prayers as they let their blood flow slowly into the structure. -/obj/structure/deity/blood_stone - name = "bloody stone" - desc = "A jagged stone covered in the various stages of blood, from dried to fresh." - icon_state = "blood_stone" - // TODO: material-based health for deity structures - current_health = 100 //It's a piece of rock. - build_cost = 700 - -/obj/structure/deity/blood_stone/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/mob/living/human/H = user - user.visible_message( - SPAN_WARNING("\The [user] calmly slices their finger on \the [src], smearing their blood over the black stone."), - SPAN_WARNING("You slowly slide your finger down one of \the [src]'s sharp edges, smearing your blood over its smooth surface.") - ) - while(do_after(H, 5 SECONDS, src)) - user.audible_message("\The [user] utters something under their breath.", SPAN_OCCULT("You mutter a dark prayer to your master as you feel the stone eat away at your lifeforce.")) - if(H.should_have_organ(BP_HEART)) - H.drip(5, get_turf(src)) - else - H.take_damage(5) - linked_god.adjust_power_min(1, 1) - return TRUE - -/datum/codex_entry/deity/blood_stone - associated_paths = list(/obj/structure/deity/blood_stone) - antag_text = "Allows the user to feed blood directly to the aligned deity, granting it power." - disambiguator = "occult" \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm b/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm deleted file mode 100644 index 286be5afd10..00000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/artifacts.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/deity_item/boon/blazing_blade - name = "Blazing Blade" - desc = "A divine blade of burning fury. If it stays too far away from an altar of some sort, it disappears." - base_cost = 250 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/sword/blazing - -/datum/deity_item/boon/holy_beacon - name = "Holy Beacon" - desc = "A staff capable of producing an almost harmless bolt of sunlight, capable of blinding anyone in the room, at least for a while." - base_cost = 200 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/gun/energy/staff/beacon - -/datum/deity_item/boon/black_death - name = "Black Death" - desc = "A small dagger capable of poisoning those it bites. Careful, if it loses all its charges, it will burn the user. It can be recharged at a radiant statue." - base_cost = 150 - category = DEITY_TREE_ARTIFACT - boon_path = /obj/item/knife/ritual/shadow - -/datum/deity_item/blood_crafting/firecrafting - name = "Fire Crafting" - desc = "Gain the ability for your minions to build smithing stations that can make many rings of power." - base_cost = 300 - category = DEITY_TREE_ARTIFACT - max_level = 1 - forge_type = /obj/structure/deity/blood_forge/starlight - recipes = list(/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn = 70, - /obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged = 70, - /obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling = 70 - ) \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm b/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm deleted file mode 100644 index 2b982fcf3cc..00000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/phenomena.dm +++ /dev/null @@ -1,41 +0,0 @@ -/datum/deity_item/phenomena/herald - name = "Choose Herald" - desc = "Gives you the ability to choose a herald. Can only be used once so be careful." - phenomena_path = /datum/phenomena/herald - base_cost = 100 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomena/wisp - name = "Summon Wisp" - desc = "Manipulate around a small light." - phenomena_path = /datum/phenomena/movable_object/wisp - base_cost = 100 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomena/flickering_whisper - name = "Flickering Whisper" - desc = "Send a subtle message to a non-follower, and see what they see for a while." - phenomena_path = /datum/phenomena/flickering_whisper - base_cost = 50 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomena/burning_glare - name = "Burning Glare" - desc = "Use your divine power to physically burn a person." - phenomena_path = /datum/phenomena/burning_glare - base_cost = 200 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomena/open_gateway - name = "Open Gateway" - desc = "Unlocks the ability to open a gateway. Required for rebirth." - phenomena_path = /datum/phenomena/create_gateway - base_cost = 250 - category = DEITY_TREE_HERALD - -/datum/deity_item/phenomena/divine_right - name = "Divine Right" - desc = "Unlocks the ability to possess your Herald, permanently transforming you into a physical god." - phenomena_path = /datum/phenomena/divine_right - base_cost = 300 - category = DEITY_TREE_HERALD \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm b/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm deleted file mode 100644 index 33c6e19a55a..00000000000 --- a/mods/gamemodes/deity/forms/starlight/deity_items/spells.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/deity_item/boon/starburst - name = "Starburst" - desc = "Grant your minion the power to blind non-followers nearby." - base_cost = 60 - boon_path = /spell/targeted/genetic/blind/starburst - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/exchange_wounds - name = "Exchange Wounds" - desc = "Allow a follower to sacrifice their own well-being for that of those around them." - base_cost = 120 - boon_path = /spell/aoe_turf/exchange_wounds - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/radiant_aura - name = "Radiant Aura" - desc = "This spell makes one of your followers immune to laser fire, for a short while at least." - base_cost = 70 - boon_path = /spell/radiant_aura/starlight - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/burning_touch - name = "Burning Touch" - desc = "Sets your minion's hand aflame, allowing them to burn people with an ever-increasing flame." - base_cost = 60 - boon_path = /spell/targeted/equip_item/burning_hand - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/burning_grip - name = "Burning Grip" - desc = "Give your follower the ability to burn an item in someone's hand so badly it causes them to burn." - base_cost = 50 - boon_path = /spell/hand/burning_grip - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/blood_boil - name = "Blood Boil" - desc = "Allow a follower to concentrate so deeply on a target that their body temperature increases, eventually setting them on fire." - base_cost = 90 - boon_path = /spell/targeted/blood_boil - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/fireball - name = "Fireball" - desc = "A classic spell, grants your follower the ability to throw an exploding ball of flame in any direction." - base_cost = 100 - boon_path = /spell/targeted/projectile/dumbfire/fireball - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/emp - name = "Disable Machinery" - desc = "Gives your follower a spell of disabling machinery, and mechanical hearts." - base_cost = 110 - boon_path = /spell/aoe_turf/disable_tech/starlight - category = DEITY_TREE_FIRECONJ - -/datum/deity_item/boon/cure_light - name = "Cure Light Wounds" - desc = "Grant mercy on your followers, giving them the ability to heal themselves slightly." - base_cost = 70 - boon_path = /spell/targeted/heal_target - category = DEITY_TREE_FIRECONJ \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/items.dm b/mods/gamemodes/deity/forms/starlight/items.dm deleted file mode 100644 index 4a46c300d2f..00000000000 --- a/mods/gamemodes/deity/forms/starlight/items.dm +++ /dev/null @@ -1,157 +0,0 @@ -/obj/item/clothing/gloves/ring/aura_ring - var/obj/aura/granted_aura - -/obj/item/clothing/gloves/ring/aura_ring/equipped(var/mob/living/L, var/slot) - ..() - if(granted_aura && slot == slot_gloves_str) - L.add_aura(granted_aura) - -/obj/item/clothing/gloves/ring/aura_ring/dropped(var/mob/living/L) - ..() - if(granted_aura) - L.remove_aura(granted_aura) - -/obj/item/clothing/gloves/ring/aura_ring/Destroy() - QDEL_NULL(granted_aura) - . = ..() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn - name = "Talisman of the Starborn" - desc = "This ring seems to shine with more light than is put on it." - icon = 'icons/clothing/accessories/jewelry/rings/ring_star.dmi' - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_starborn/Initialize() - . = ..() - granted_aura = new /obj/aura/starborn() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged - name = "Talisman of the Blueforged" - desc = "The gem on this ring is quite peculiar..." - icon = 'icons/clothing/accessories/jewelry/rings/ring_blue.dmi' - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_blueforged/Initialize() - . = ..() - granted_aura = new /obj/aura/blueforge_aura() - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling - name = "Talisman of the Shadowling" - desc = "If you weren't looking at this, you probably wouldn't have noticed it." - icon = 'icons/clothing/accessories/jewelry/rings/ring_shadow.dmi' - -/obj/item/clothing/gloves/ring/aura_ring/talisman_of_shadowling/Initialize() - . = ..() - granted_aura = new /obj/aura/shadowling_aura() - -/obj/item/clothing/suit/armor/sunsuit - name = "knight's armor" - desc = "Now, you can be the knight in shining armor you've always wanted to be. With complementary sun insignia." - icon = 'icons/clothing/suits/deity/star_champion.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, - ARMOR_BULLET = ARMOR_BALLISTIC_AP, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/head/helmet/sunhelm - name = "knight's helm" - desc = "It's a shiny metal helmet. It looks ripped straight out of the Dark Ages, actually." - icon = 'icons/clothing/head/star_champion.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/clothing/suit/armor/sunrobe - name = "oracle's robe" - desc = "The robes of a priest. One that praises the sun, apparently. Well, it certainly reflects light well." - icon = 'icons/clothing/suits/deity/star_oracle.dmi' - armor = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, - ARMOR_LASER = ARMOR_LASER_HANDGUNS, - ARMOR_ENERGY = ARMOR_ENERGY_RESISTANT, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_MINOR - ) - -/obj/item/clothing/suit/armor/sunrobe/Initialize() - . = ..() - set_light(4, 0.3) - -/obj/item/clothing/suit/space/shadowsuit - name = "traitor's cloak" - desc = "There is absolutely nothing visible through the fabric. The shadows stick to your skin when you touch it." - item_flags = ITEM_FLAG_THICKMATERIAL | ITEM_FLAG_AIRTIGHT - min_pressure_protection = 0 - icon = 'icons/clothing/suits/deity/star_traitor.dmi' - -/obj/item/clothing/head/helmet/space/shadowhood - name = "traitor's hood" - desc = "No light can pierce this hood. It's unsettling." - icon = 'icons/clothing/head/star_traitor.dmi' - flags_inv = HIDEEARS | BLOCK_ALL_HAIR - -/obj/item/knife/ritual/shadow - name = "black death" - desc = "An obsidian dagger. The singed remains of a green cloth are wrapped around the 'handle.'" - var/charge = 5 - -/obj/item/knife/ritual/shadow/apply_hit_effect(var/mob/living/target, var/mob/living/user, var/hit_zone) - . = ..() - if(charge) - if(target.get_damage(BRUTE) > 15) - var/datum/reagents/R = target.reagents - if(!R) - return - R.add_reagent(/decl/material/liquid/venom, 5) - new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "fire_goon") - charge-- - else - user.take_damage(5, BURN) - if(prob(5)) - to_chat(user, SPAN_WARNING("\The [src] appears to be out of power!")) - new /obj/effect/temporary(get_turf(user),3, 'icons/effects/effects.dmi', "fire_goon") - -/obj/item/gun/energy/staff/beacon - name = "holy beacon" - desc = "Look closely into its crystal; there's a miniature sun. Or maybe that's just some fancy LEDs. Either way, it looks thoroughly mystical." - icon = 'icons/obj/wizard.dmi' - icon_state = "starstaff" - self_recharge = 0 - max_shots = 10 - projectile_type = /obj/item/projectile/energy/flash - required_antag_type = /decl/special_role/godcultist - -/obj/item/sword/blazing - name = "blazing blade" - icon = 'icons/obj/items/weapon/swords/flaming.dmi' - atom_damage_type = BURN - material_alteration = MAT_FLAG_ALTERATION_NONE - var/last_near_structure = 0 - var/mob/living/deity/linked - -/obj/item/sword/blazing/Initialize(var/maploading, var/material, var/deity) - . = ..() - START_PROCESSING(SSobj, src) - linked = deity - -/obj/item/sword/blazing/Destroy() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/sword/blazing/Process() - if(!linked || last_near_structure + 10 SECONDS > world.time) - return - - if(linked.near_structure(src,1)) - if(last_near_structure < world.time - 30 SECONDS) - to_chat(loc, SPAN_NOTICE("\The [src] surges with power anew!")) - last_near_structure = world.time - else - if(last_near_structure < world.time - 30 SECONDS) //If it has been at least 30 seconds. - if(prob(5)) - to_chat(loc, SPAN_WARNING("\The [src] begins to fade, its power dimming this far away from a shrine.")) - else if(last_near_structure + 1800 < world.time) - visible_message(SPAN_WARNING("\The [src] disintegrates into a pile of ash!")) - new /obj/effect/decal/cleanable/ash(get_turf(src)) - qdel(src) diff --git a/mods/gamemodes/deity/forms/starlight/mobs.dm b/mods/gamemodes/deity/forms/starlight/mobs.dm deleted file mode 100644 index 5748cf2e2f4..00000000000 --- a/mods/gamemodes/deity/forms/starlight/mobs.dm +++ /dev/null @@ -1,29 +0,0 @@ -/mob/living/starlight_soul - name = "soul" - desc = "A captured soul." - anchored = TRUE - butchery_data = null - -/mob/living/starlight_soul/Initialize(var/maploading, var/mob/living/old_mob) - . = ..() - if(old_mob) - name = old_mob.real_name - -/mob/living/starlight_soul/proc/set_deity(var/mob/living/deity/deity) - var/mob/observer/eye/freelook/cult/eye - if(eyeobj) - eye = eyeobj - eyeobj.release(src) - else - eye = new(src) - eye.suffix = "Soul" - eyeobj = eye - eye.visualnet = deity.eyenet - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(src.mind,1,"lost soul of [deity]", "You have been captured by \the [deity]! You now can only see into your own reality through the same rips and tears it uses. Your only chance at another body will be one in your captor's image...",specific_god=deity) - eyeobj.possess(src) - -/mob/living/starlight_soul/Destroy() - if(eyeobj) - QDEL_NULL(eyeobj) - . = ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm b/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm deleted file mode 100644 index f6462ae33fe..00000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/disable_tech.dm +++ /dev/null @@ -1,4 +0,0 @@ -/spell/aoe_turf/disable_tech/starlight - hidden_from_codex = TRUE - charge_max = 600 - spell_flags = 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm b/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm deleted file mode 100644 index 8ad867e41b3..00000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/starlight_aura.dm +++ /dev/null @@ -1,5 +0,0 @@ -/spell/radiant_aura/starlight - name = "Starlight Aura" - desc = "This spell makes you immune to laser fire, for a short while at least." - spell_flags = 0 - charge_max = 400 diff --git a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm b/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm deleted file mode 100644 index e47edecd082..00000000000 --- a/mods/gamemodes/deity/forms/starlight/spells/veil_of_shadows.dm +++ /dev/null @@ -1,57 +0,0 @@ -/spell/veil_of_shadows - name = "Veil of Shadows" - desc = "Become intangable, invisible. Like a ghost." - charge_max = 400 - invocation_type = SpI_EMOTE - invocation = "flickers out of existance" - school = "Divine" - spell_flags = 0 - duration = 100 - var/timer_id - var/light_steps = 4 - - hud_state = "wiz_statue" - -/spell/veil_of_shadows/choose_targets() - if(!timer_id && ishuman(holder)) - return list(holder) - . = null - -/spell/veil_of_shadows/cast(var/list/targets, var/mob/user) - var/mob/living/human/H = user - H.AddMovementHandler(/datum/movement_handler/mob/incorporeal) - if(H.add_cloaking_source(src)) - H.visible_message(SPAN_WARNING("\The [H] shrinks from view!")) - 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/human/H = holder - H.RemoveMovementHandler(/datum/movement_handler/mob/incorporeal) - deltimer(timer_id) - timer_id = null - var/turf/T = get_turf(H) - if(T.get_lumcount() > 0.1) //If we're somewhere somewhat shadowy we can stay invis as long as we stand still - drop_cloak() - else - events_repository.unregister(/decl/observ/moved, H,src) - events_repository.register(/decl/observ/moved, H,src,PROC_REF(drop_cloak)) - -/spell/veil_of_shadows/proc/drop_cloak() - var/mob/living/human/H = holder - if(H.remove_cloaking_source(src)) - H.visible_message(SPAN_NOTICE("\The [H] appears from nowhere!")) - events_repository.unregister(/decl/observ/moved, H,src) - -/spell/veil_of_shadows/proc/check_light() - if(light_steps) - light_steps-- - return - light_steps = initial(light_steps) - for(var/obj/machinery/light/light in view(1,holder)) - light.flicker(20) - -/spell/veil_of_shadows/Destroy() - deltimer(timer_id) - cancel_veil() - .= ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/starlight.dm b/mods/gamemodes/deity/forms/starlight/starlight.dm deleted file mode 100644 index ba3b75a83e8..00000000000 --- a/mods/gamemodes/deity/forms/starlight/starlight.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/god_form/starlight - name = "Starlight Herald" - info = {"Sun and fire incarnate.
      - Benefits:
      - +Ability to summon powerful minions via sacrifices.
      - +Bless one of your minions as a Herald, giving them species powers and armor.
      - Drawbacks:
      - -Servant's powers will burn them.
      - -You require copious amounts of power regeneration.
      - "} - desc = "The bringer of life, and all that entails." - god_icon_state = "sungod" - pylon_icon_state = "god" - faction = "herald" - - buildables = list(/obj/structure/deity/altar/starlight, - /obj/structure/deity/pylon/starlight, - /obj/structure/deity/radiant_statue, - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/boon/blazing_blade, - /datum/deity_item/boon/holy_beacon, - /datum/deity_item/boon/black_death, - /datum/deity_item/blood_crafting/firecrafting, - /datum/deity_item/boon/starburst, - /datum/deity_item/boon/exchange_wounds, - /datum/deity_item/boon/radiant_aura, - /datum/deity_item/boon/burning_touch, - /datum/deity_item/boon/burning_grip, - /datum/deity_item/boon/blood_boil, - /datum/deity_item/boon/emp, - /datum/deity_item/boon/cure_light, - /datum/deity_item/phenomena/herald, - /datum/deity_item/phenomena/wisp, - /datum/deity_item/phenomena/flickering_whisper, - /datum/deity_item/phenomena/burning_glare, - /datum/deity_item/phenomena/open_gateway, - /datum/deity_item/phenomena/divine_right - ) - -/datum/god_form/starlight/take_charge(var/mob/living/user, var/charge) - charge = max(5, charge/100) - if(prob(charge)) - to_chat(user, SPAN_DANGER("Your body burns!")) - user.take_damage(charge, BURN) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/starlight/structures.dm b/mods/gamemodes/deity/forms/starlight/structures.dm deleted file mode 100644 index 7134d19ce48..00000000000 --- a/mods/gamemodes/deity/forms/starlight/structures.dm +++ /dev/null @@ -1,272 +0,0 @@ -/obj/structure/deity/altar/starlight - icon_state = "altarcandle" - -/obj/structure/deity/pylon/starlight - name = "sun pylon" - desc = "A miniature sun, floating ontop of a small pillar." - icon_state = "star_pylon" - -/obj/structure/deity/gateway - name = "gateway" - desc = "A gateway into the unknown." - icon = 'icons/obj/singularity.dmi' - icon_state = "singularity_s1" - power_adjustment = 1 - density = FALSE - var/weakref/target_ref - var/start_time = 0 - var/power_drain = 7 - var/looking_for - var/static/list/possible_forms = list( - "Starborn" = list( - "description" = "A species of hardy fire-wreathed soldiers.", - "message" = "As a Starborn, you are immune to laser-fire. You are a hardy soldier, able to take on the greatest of foes.", - "species" = "Starborn" - ), - "Blueforged" = list( - "description" = "Trans-dimensional beings with a multitude of miraculous abilities.", - "message" = "As a Blueforged, you are immune to all physical damage... except for heat. Not even your god can protect you.", - "species" = "Blueforged", - "spells" = list( - /spell/targeted/ethereal_jaunt, - /spell/targeted/shatter, - /spell/hand/burning_grip, - /spell/aoe_turf/disable_tech, - /spell/targeted/projectile/magic_missile, - /spell/open_gateway - ) - ), - "Shadowling" = list( - "description" = "Beings that come from a place of no light. They sneak from place to place, disabling everyone they touch.", - "message" = "As a Shadow you take damage from the light itself but have the ability to vanish from sight itself.", - "species" = "Shadow", - "spells" = list( - /spell/veil_of_shadows, - /spell/targeted/subjugation, - /spell/targeted/projectile/magic_missile - ) - ) - ) - -/obj/structure/deity/gateway/Initialize() - . = ..() - if(linked_god) - linked_god.power_per_regen -= power_drain - START_PROCESSING(SSobj, src) - -/obj/structure/deity/gateway/Process() - if(!linked_god) - return - if(linked_god.power <= 0) - to_chat(linked_god,SPAN_WARNING("\The [src] disappears from your lack of power!")) - qdel(src) - return - var/mob/living/human/target - if(target_ref) - target = target_ref.resolve() - if(target) - if(get_turf(target) != get_turf(src)) - target = null - target_ref = null - start_time = 0 - return - else if(prob(5)) - to_chat(target,SPAN_DANGER("\The [src] sucks at your lifeforce!")) - if(start_time && world.time > start_time + 300) - start_time = 0 - to_chat(target,SPAN_DANGER("You have been sucked into \the [src], your soul used to fuel \the [linked_god]'s minions.")) - var/mob/living/starlight_soul/ss = new(get_turf(linked_god),target) - if(target.mind) - target.mind.transfer_to(ss) - else - ss.ckey = target.ckey - ss.set_deity(linked_god) - target.dust() - if(power_drain >= 3) - linked_god.power_per_regen += 3 - power_drain -= 3 - else - //Get new target - var/mob/living/human/T = locate() in get_turf(src) - if(T) - target_ref = weakref(T) - start_time = world.time - to_chat(T, SPAN_DANGER("You feel your lifeforce begin to drain into \the [src]!")) - -/obj/structure/deity/gateway/Destroy() - linked_god.power_per_regen += power_drain - . = ..() - -/obj/structure/deity/gateway/attack_deity(var/mob/living/deity/deity) - var/list/html = list() - html += "

      Servant List

      " - html += "
      Select a minion type to summon
      " - html += "" - for(var/a in possible_forms) - var/list/form = possible_forms[a] - html += "" - html += "
      NameDescription
      [a][form["description"]]
      " - show_browser(linked_god, jointext(html, null), "window=gateway") - -/obj/structure/deity/gateway/CanUseTopic(var/mob/user) - if(linked_god && (user == linked_god || user.loc == linked_god.loc)) - return STATUS_INTERACTIVE - return STATUS_CLOSE - -/obj/structure/deity/gateway/proc/stop_looking_for(var/successful) - if(looking_for) - if(!successful) - to_chat(linked_god, SPAN_WARNING("\The [src] did not find any [looking_for]. You may try again if you wish.")) - looking_for = null - -/obj/structure/deity/gateway/OnTopic(var/mob/user, var/list/href_list) - if(href_list["accept"] && istype(user,/mob/living/starlight_soul)) - if(href_list["accept"] != looking_for) - return TOPIC_HANDLED - var/mob/living/human/H = new(get_turf(src)) - user.mind.transfer_to(H) - H.set_species(possible_forms[looking_for]["species"]) - for(var/s in possible_forms[looking_for]["spells"]) - var/spell/S = new s - H.add_spell(S) - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(H.mind, 1, "[looking_for] of [linked_god]", "You are a powerful entity in the service to \the [linked_god]. [possible_forms[looking_for]["species"]]", specific_god = linked_god) - stop_looking_for(TRUE) - - return TOPIC_HANDLED - if(href_list["spawn_type"] && user == linked_god) - if(looking_for) - to_chat(usr, SPAN_WARNING("\The [src] is already looking for a [looking_for].")) - else - looking_for = href_list["spawn_type"] - to_chat(usr, SPAN_NOTICE("\The [src] is now looking for a [looking_for].")) - 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_REF(stop_looking_for), FALSE), 30 SECONDS) - show_browser(linked_god, null, "window=gateway") - return TOPIC_HANDLED - -/obj/structure/deity/radiant_statue - name = "radiant statue" - icon_state = "statue" - build_cost = 750 - power_adjustment = 1 - deity_flags = DEITY_STRUCTURE_NEAR_IMPORTANT|DEITY_STRUCTURE_ALONE - var/charge = 0 - var/charging = 0 //Charging, dispersing, etc. - -/obj/structure/deity/radiant_statue/on_update_icon() - ..() - if(charging) - icon_state = "statue_charging" - else if(charge) - icon_state = "statue_active" - else - icon_state = "statue" - -/obj/structure/deity/radiant_statue/Destroy() - if(charging) - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/structure/deity/radiant_statue/proc/get_followers_nearby() - . = list() - if(linked_god) - for(var/m in linked_god.minions) - var/datum/mind/M = m - if(get_dist(M.current, src) <= 3) - . += M.current - -/obj/structure/deity/radiant_statue/attack_hand(var/mob/L) - SHOULD_CALL_PARENT(FALSE) - var/obj/O = L.get_equipped_item(slot_wear_suit_str) - if(O && has_extension(O,/datum/extension/deity_be_near)) - if(activate_charging()) - to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling your master's power course through you.")) - else - to_chat(L, SPAN_WARNING("\The [src] has already been activated.")) - else - to_chat(L, SPAN_WARNING("\The [src] does not recognize you as a herald of \the [linked_god]. You must wear a full set of herald's armor.")) - return TRUE - -/obj/structure/deity/radiant_statue/attack_deity(var/mob/living/deity/deity) - if(activate_charging()) - to_chat(deity,SPAN_NOTICE("You activate \the [src], and it begins to charge as long as at least one of your followers is nearby.")) - else - to_chat(deity,SPAN_WARNING("\The [src] is either already activated, or there are no followers nearby to charge it.")) - -/obj/structure/deity/radiant_statue/proc/activate_charging() - var/list/followers = get_followers_nearby() - if(is_processing || !followers.len) - return 0 - charging = 1 - START_PROCESSING(SSobj, src) - src.visible_message(SPAN_NOTICE("\The [src] hums, activating.")) - update_icon() - return 1 - -/obj/structure/deity/radiant_statue/attackby(var/obj/item/I, var/mob/user) - if(charging && (istype(I, /obj/item/knife/ritual/shadow) || istype(I, /obj/item/gun/energy/staff/beacon)) && charge_item(I, user)) - return - ..() - -/obj/structure/deity/radiant_statue/proc/charge_item(var/obj/item/I, var/mob/user) - . = 0 - if(istype(I, /obj/item/gun/energy)) - var/obj/item/gun/energy/energy = I - 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 - shad.charge = initial(shad.charge) - . = 1 - if(.) - to_chat(user, SPAN_NOTICE("\The [src]'s glow envelops \the [I], restoring it to proper use.")) - charge -= 1 - -/obj/structure/deity/radiant_statue/Process() - if(charging) - charge++ - var/list/followers = get_followers_nearby() - if(followers.len == 0) - stop_charging() - return - - if(charge == 40) - src.visible_message(SPAN_NOTICE("\The [src] lights up, pulsing with energy.")) - charging = 0 - update_icon() - else - charge -= 0.5 - var/list/followers = get_followers_nearby() - if(followers.len) - for(var/m in followers) - var/mob/living/L = m - L.heal_damage(BURN, 5) - if(prob(5)) - to_chat(L, SPAN_NOTICE("You feel a pleasant warmth spread throughout your body...")) - for(var/s in L.mind.learned_spells) - var/spell/spell = s - spell.charge_counter = spell.charge_max - if(charge == 0) - stop_charging() - -/obj/structure/deity/radiant_statue/proc/stop_charging() - STOP_PROCESSING(SSobj, src) - src.visible_message(SPAN_NOTICE("\The [src] powers down, returning to its dormant form.")) - charging = 0 - update_icon() - -/obj/structure/deity/blood_forge/starlight - name = "radiant forge" - desc = "a swath of heat and fire permeats from this forge." - recipe_feat_list = "Fire Crafting" - text_modifications = list( - "Cost" = "Burn", - "Dip" = "fire. Pain envelopes you as dark burns mar your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire, ignoring the painful burns it gives you in the process.", - "Out" = "flames" - ) diff --git a/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm b/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm deleted file mode 100644 index dc26893321d..00000000000 --- a/mods/gamemodes/deity/forms/tower/deity_items/conjuration.dm +++ /dev/null @@ -1,107 +0,0 @@ -/datum/deity_item/conjuration - name = DEITY_TREE_CONJURATION - desc = "Conjuration is the school of creation and teleportation, summoning fireballs or teleporting long distances, this school is extremely powerful." - category = DEITY_TREE_CONJURATION - max_level = 3 - base_cost = 50 - -/datum/deity_item/conjuration/get_cost(var/mob/living/deity/D) - return base_cost * (level + 1) - -//Level 1 -/datum/deity_item/boon/single_charge/create_air - name = "Create Air" - desc = "Allows your follower to generate a livable atmosphere in the area they are in." - base_cost = 25 - category = DEITY_TREE_CONJURATION - boon_path = /spell/create_air/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/boon/single_charge/acid_spray - name = "Acid Spray" - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - base_cost = 130 - category = DEITY_TREE_CONJURATION - boon_path = /spell/acid_spray/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/boon/single_charge/force_wall - name = "Force Wall" - desc = "A temporary invincible wall for followers to summon." - base_cost = 30 - category = DEITY_TREE_CONJURATION - boon_path = /spell/aoe_turf/conjure/forcewall/tower - requirements = list(DEITY_TREE_CONJURATION = 1) - -/datum/deity_item/phenomena/dimensional_locker - name = "Phenomena: Dimensional Locker" - desc = "Gain the ability to move a magical locker around. While it cannot move living things, you can move it around as you please, even disappearing it into the nether." - base_cost = 50 - category = DEITY_TREE_CONJURATION - phenomena_path = /datum/phenomena/movable_object/dimensional_locker - requirements = list(DEITY_TREE_CONJURATION = 1) - -//Level 2 -/datum/deity_item/boon/single_charge/faithful_hound - name = "Faithful Hound" - desc = "This spell allows a follower to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - base_cost = 40 - category = DEITY_TREE_CONJURATION - boon_path = /spell/aoe_turf/conjure/faithful_hound/tower - requirements = list(DEITY_TREE_CONJURATION = 2) - -/datum/deity_item/wizard_armaments - name = DEITY_UNLOCK_ARMS - desc = "Unlock spells related to the summoning of weapons and armor. These spells only last a short duration, but are extremely effective." - base_cost = 25 - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 2) - -/datum/deity_item/boon/single_charge/sword - name = "Summon Sword" - desc = "This spell allows your followers to summon a golden firey sword for a short duration." - base_cost = 50 - boon_path = /spell/targeted/equip_item/dyrnwyn/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_UNLOCK_ARMS = 1) - -/datum/deity_item/boon/single_charge/shield - name = "Summon Shield" - desc = "This spell allows your followers to summon a magical shield for a short duration." - base_cost = 20 - boon_path = /spell/targeted/equip_item/shield/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_UNLOCK_ARMS = 1) - -/datum/deity_item/phenomena/portals - name = "Phenomena: Portals" - desc = "Gain the ability to create portals for your followers to enter through. You will need to create two for it work. Any created past that will delete the oldest portal." - base_cost = 75 - requirements = list(DEITY_TREE_CONJURATION = 2) - category = DEITY_TREE_CONJURATION - phenomena_path = /datum/phenomena/portals - -//Level 3 -/datum/deity_item/boon/single_charge/fireball - name = "Fireball" - desc = "Embue your follower with the power of exploding fire." - base_cost = 85 - boon_path = /spell/targeted/projectile/dumbfire/fireball/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 3) - -/datum/deity_item/boon/single_charge/force_portal - name = "Force Portal" - desc = "This spell allows a follower to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - base_cost = 45 - boon_path = /spell/aoe_turf/conjure/force_portal/tower - category = DEITY_TREE_CONJURATION - requirements = list(DEITY_TREE_CONJURATION = 3) - -/datum/deity_item/phenomena/banishing_smite - name = "Phenomena: Banishing Smite" - desc = "Gain the ability to smite an individual, dealing damage to them. If they are weakened enough, this can cause them to temporarily be transported." - base_cost = 75 - requirements = list(DEITY_TREE_CONJURATION = 3) - category = DEITY_TREE_CONJURATION - phenomena_path = /datum/phenomena/banishing_smite \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm b/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm deleted file mode 100644 index 7151b889538..00000000000 --- a/mods/gamemodes/deity/forms/tower/deity_items/transmutation.dm +++ /dev/null @@ -1,97 +0,0 @@ -/datum/deity_item/transmutation - name = DEITY_TREE_TRANSMUTATION - desc = "Transmutation is the school of change. It cannot be used to create things, only modify them or even destroy them." - category = DEITY_TREE_TRANSMUTATION - max_level = 3 - base_cost = 50 - -/datum/deity_item/conjuration/get_cost(var/mob/living/deity/D) - return base_cost * (level + 1) - -//Level 1 -/datum/deity_item/boon/single_charge/slippery_surface - name = "Slippery Surface" - desc = "Allows a follower to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - base_cost = 10 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/hand/slippery_surface/tower - -/datum/deity_item/boon/single_charge/smoke - name = "Smoke" - desc = "Allows a follower to distill the nearby air into smoke." - base_cost = 10 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/aoe_turf/smoke/tower - -//Level 2 -/datum/deity_item/boon/single_charge/knock - name = "Knock" - desc = "Allows a follower to open nearby doors without the keys." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/aoe_turf/knock/tower - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - -/datum/deity_item/boon/single_charge/burning_grip - name = "Burning Grip" - desc = "Allows a follower cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - base_cost = 15 - boon_path = /spell/hand/burning_grip/tower - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - -/datum/deity_item/phenomena/warp_body - name = "Phenomena: Warp Body" - desc = "Gain the ability to warp the very structure of a target's body, wracking pain and weakness." - base_cost = 75 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 2) - phenomena_path = /datum/phenomena/warp - -//Level 3 -/datum/deity_item/boon/single_charge/jaunt - name = "Ethereal Jaunt" - desc = "Allows a follower to liquify for a short duration, letting them pass through all dense objects." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - boon_path = /spell/targeted/ethereal_jaunt/tower - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - -/datum/deity_item/healing_spells - name = DEITY_UNLOCK_HEAL - desc = "Of transmutation, healing is perhaps the most immediately effective and useful. This unlocks the healing spells for your followers." - base_cost = 50 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - -/datum/deity_item/boon/single_charge/heal - name = "Minor Heal" - desc = "Allows your follower to heal themselves, or others, for a slight amount." - base_cost = 15 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/tower - -/datum/deity_item/boon/single_charge/heal/major - name = "Major Heal" - desc = "Allows your follower to heal others for a great amount." - base_cost = 25 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/major/tower - -/datum/deity_item/boon/single_charge/heal/area - name = "Area Heal" - desc = "Allows your follower to heal everyone in an area for minor damage." - base_cost = 20 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_UNLOCK_HEAL = 1) - boon_path = /spell/targeted/heal_target/area/tower - -/datum/deity_item/phenomena/rock_form - name = "Phenomena: Rock Form" - desc = "Gain the ability to transform your followers into beings of rock and stone." - base_cost = 75 - category = DEITY_TREE_TRANSMUTATION - requirements = list(DEITY_TREE_TRANSMUTATION = 3) - phenomena_path = /datum/phenomena/rock_form \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/spells.dm b/mods/gamemodes/deity/forms/tower/spells.dm deleted file mode 100644 index 18b88647edf..00000000000 --- a/mods/gamemodes/deity/forms/tower/spells.dm +++ /dev/null @@ -1,67 +0,0 @@ -/spell/create_air/tower - desc = "Allows you to generate a livable atmosphere in the area you are in." - charge_max = 5 - -/spell/hand/burning_grip/tower - desc = "Allows you cause an object to heat up intensly in someone's hand, making them drop it and whatever skin is attached." - charge_max = 3 - -/spell/hand/slippery_surface/tower - desc = "Allows you to slicken a small patch of floor. Anyone without sure-footing will find it hard to stay upright." - charge_max = 2 - -/spell/aoe_turf/knock/tower - charge_max = 2 - hidden_from_codex = TRUE - -/spell/aoe_turf/smoke/tower - charge_max = 2 - hidden_from_codex = TRUE - -/spell/aoe_turf/conjure/faithful_hound/tower - desc = "This spell allows you to summon a singular spectral dog that guards the nearby area. Anyone without the password is barked at or bitten." - charge_max = 1 - spell_flags = 0 - -/spell/aoe_turf/conjure/force_portal/tower - desc = "This spell allows you to summon a force portal. Anything that hits the portal gets sucked inside and is then thrown out when the portal explodes." - charge_max = 2 - spell_flags = 0 - -/spell/acid_spray/tower - desc = "The simplest form of aggressive conjuration: acid spray is quite effective in melting both man and object." - charge_max = 2 - -/spell/targeted/heal_target/tower - desc = "Allows you to heal yourself, or others, for a slight amount." - charge_max = 2 - -/spell/targeted/heal_target/major/tower - charge_max = 1 - spell_flags = INCLUDEUSER | SELECTABLE - desc = "Allows you to heal others for a great amount." - -/spell/targeted/heal_target/area/tower - desc = "Allows you to heal everyone in an area for minor damage." - charge_max = 1 - -/spell/targeted/ethereal_jaunt/tower - desc = "Allows you to liquefy for a short duration, letting you pass through all dense objects." - charge_max = 2 - spell_flags = Z2NOCAST | INCLUDEUSER - -/spell/aoe_turf/conjure/forcewall/tower - desc = "A temporary invincible wall for you to summon." - charge_max = 3 - -/spell/targeted/equip_item/dyrnwyn/tower - desc = "This spell allows you to summon a fiery golden sword for a short duration." - charge_max = 1 - -/spell/targeted/equip_item/shield/tower - desc = "This spell allows you to summon a magical shield for a short duration." - charge_max = 1 - -/spell/targeted/projectile/dumbfire/fireball/tower - desc = "Imbue yourself with the power of exploding fire." - charge_max = 2 \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/structures.dm b/mods/gamemodes/deity/forms/tower/structures.dm deleted file mode 100644 index 453caf22de2..00000000000 --- a/mods/gamemodes/deity/forms/tower/structures.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/structure/deity/altar/tower - icon_state = "tomealtar" - -/obj/structure/deity/wizard_recharger - name = "fountain of power" - desc = "Refreshing, cool water surrounded by archaic carvings." - icon_state = "fountain" - power_adjustment = 2 - build_cost = 700 - -/obj/structure/deity/wizard_recharger/attack_hand(var/mob/hitter) - SHOULD_CALL_PARENT(FALSE) - if(!length(hitter.mind?.learned_spells)) - to_chat(hitter, SPAN_WARNING("You don't feel as if this will do anything for you.")) - return TRUE - - hitter.visible_message(SPAN_NOTICE("\The [hitter] dips their hands into \the [src], a soft glow emanating from them.")) - if(do_after(hitter,300,src,check_holding=0)) - for(var/s in hitter.mind.learned_spells) - var/spell/spell = s - spell.charge_counter = spell.charge_max - to_chat(hitter, SPAN_NOTICE("You feel refreshed!")) - else - to_chat(hitter, SPAN_WARNING("You need to keep in contact with \the [src]!")) - return TRUE \ No newline at end of file diff --git a/mods/gamemodes/deity/forms/tower/tower.dm b/mods/gamemodes/deity/forms/tower/tower.dm deleted file mode 100644 index fe165b5c56d..00000000000 --- a/mods/gamemodes/deity/forms/tower/tower.dm +++ /dev/null @@ -1,49 +0,0 @@ -/datum/god_form/wizard - name = "The Tower" - info = {"Only from destruction does the Tower grow. Its bricks smelted from crumbled ignorance and the fires of ambition.
      - Benefits:
      - +Learn spells from two different schools.
      - +Deity gains power through each spell use.

      - Drawbacks:
      - -Abilities hold a limited amount of charge and must be charged at a fountain of power. - "} - desc = "A single solitary tower" - god_icon_state = "tower" - pylon_icon_state = "nim" - - buildables = list(/obj/structure/deity/altar/tower, - /obj/structure/deity/pylon, - /obj/structure/deity/wizard_recharger - ) - items = list(/datum/deity_item/general/potential, - /datum/deity_item/general/regeneration, - /datum/deity_item/conjuration, - /datum/deity_item/boon/single_charge/create_air, - /datum/deity_item/boon/single_charge/acid_spray, - /datum/deity_item/boon/single_charge/force_wall, - /datum/deity_item/phenomena/dimensional_locker, - /datum/deity_item/boon/single_charge/faithful_hound, - /datum/deity_item/wizard_armaments, - /datum/deity_item/boon/single_charge/sword, - /datum/deity_item/boon/single_charge/shield, - /datum/deity_item/phenomena/portals, - /datum/deity_item/boon/single_charge/fireball, - /datum/deity_item/boon/single_charge/force_portal, - /datum/deity_item/phenomena/banishing_smite, - /datum/deity_item/transmutation, - /datum/deity_item/boon/single_charge/slippery_surface, - /datum/deity_item/boon/single_charge/smoke, - /datum/deity_item/boon/single_charge/knock, - /datum/deity_item/boon/single_charge/burning_grip, - /datum/deity_item/phenomena/warp_body, - /datum/deity_item/boon/single_charge/jaunt, - /datum/deity_item/healing_spells, - /datum/deity_item/boon/single_charge/heal, - /datum/deity_item/boon/single_charge/heal/major, - /datum/deity_item/boon/single_charge/heal/area, - /datum/deity_item/phenomena/rock_form - ) - -/datum/god_form/wizard/take_charge(var/mob/living/user, var/charge) - linked_god.adjust_power_min(max(round(charge/100), 1),silent = 1) - return 1 \ No newline at end of file diff --git a/mods/gamemodes/deity/gamemode.dm b/mods/gamemodes/deity/gamemode.dm deleted file mode 100644 index 9bf79d8ca87..00000000000 --- a/mods/gamemodes/deity/gamemode.dm +++ /dev/null @@ -1,12 +0,0 @@ -/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!" - uid = "god" - required_players = 10 - required_enemies = 3 - end_on_antag_death = FALSE - associated_antags = list( - /decl/special_role/deity, - /decl/special_role/godcultist - ) \ No newline at end of file diff --git a/mods/gamemodes/deity/god_cultist_role.dm b/mods/gamemodes/deity/god_cultist_role.dm deleted file mode 100644 index d1c5bced882..00000000000 --- a/mods/gamemodes/deity/god_cultist_role.dm +++ /dev/null @@ -1,106 +0,0 @@ -/decl/special_role/godcultist - name = "God Cultist" - name_plural = "God Cultists" - blacklisted_jobs = list(/datum/job/submap) - antag_indicator = "hudcultist" - faction_verb = /mob/living/proc/dpray - welcome_text = "You are under the guidance of a powerful otherwordly being. Spread its will and keep your faith.
      Use dpray to communicate directly with your master!
      Ask your master for spells to start building!" - flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE - hard_cap = 5 - hard_cap_round = 6 - initial_spawn_req = 3 - initial_spawn_target = 3 - antaghud_indicator = "hudcultist" - skill_setter = /datum/antag_skill_setter/station - blocked_job_event_categories = list(ASSIGNMENT_ROBOT, ASSIGNMENT_COMPUTER) - -/decl/special_role/godcultist/add_antagonist_mind(var/datum/mind/player, var/ignore_role, var/nonstandard_role_type, var/nonstandard_role_msg, var/mob/living/deity/specific_god) - if(!..()) - return 0 - - if(specific_god) - add_cultist(player, specific_god) - - return 1 - -/decl/special_role/godcultist/post_spawn() - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - if(!deity.current_antagonists.len) - return - var/count = 1 - var/deity_count = 1 - while(count <= current_antagonists.len) - if(deity_count > deity.current_antagonists.len) - deity_count = 1 - var/datum/mind/deity_mind = deity.current_antagonists[deity_count] - var/datum/mind/mind = current_antagonists[count] - add_cultist(mind, deity_mind.current) - count++ - deity_count++ - - -/decl/special_role/godcultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) - var/mob/living/deity/god = get_deity(player) - if(!..()) - return 0 - remove_cultist(player, god) - return 1 - -/decl/special_role/godcultist/get_extra_panel_options(var/datum/mind/player) - return "\[Select Deity\]" - -/decl/special_role/godcultist/Topic(href, href_list) - if(..()) - return 1 - if(href_list["selectgod"]) - var/list/god_list = list() - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - if(length(deity.current_antagonists)) - for(var/m in deity.current_antagonists) - var/datum/mind/mind = m - god_list += mind.current - else - for(var/mob/living/deity/specific_deity in global.player_list) - god_list += specific_deity - if(god_list.len) - var/mob/living/deity/D = input(usr, "Select a deity for this cultist.") in null|god_list - if(D) - var/datum/mind/player = locate(href_list["selectgod"]) - remove_cultist(player) //Remove him from any current deity. - add_cultist(player, D) - log_and_message_admins("has set [key_name(player.current)] to be a minion of [key_name(D)]") - else - to_chat(usr, SPAN_WARNING("There are no deities to be linked to.")) - return 1 - -/decl/special_role/godcultist/proc/add_cultist(var/datum/mind/player, var/mob/living/deity/deity) - deity.add_follower(player.current) - player.current.add_language(/decl/language/cultcommon) - -/decl/special_role/godcultist/proc/remove_cultist(var/datum/mind/player, var/mob/living/deity/god) - god.remove_follower(player.current) - player.current.remove_language(/decl/language/cultcommon) - -/decl/special_role/godcultist/proc/get_deity(var/datum/mind/player) - var/decl/special_role/deity = GET_DECL(/decl/special_role/deity) - for(var/m in deity.current_antagonists) - var/datum/mind/mind = m - var/mob/living/deity/god = mind.current - if(god && god.is_follower(player.current,1)) - return god - -/mob/living/proc/dpray(var/msg as text) - set category = "Abilities" - - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - if(!src.mind || !godcult.is_antagonist(mind)) - return - msg = sanitize(msg) - var/mob/living/deity/D = godcult.get_deity(mind) - if(!D || !msg) - return - - //Make em wait a few seconds. - src.visible_message("\The [src] bows their head down, muttering something.", SPAN_NOTICE("You send the message \"[msg]\" to your master.")) - to_chat(D, "\The [src] (J) prays, \"[msg]\"") - log_and_message_admins("dprayed, \"[msg]\" to \the [key_name(D)]") diff --git a/mods/gamemodes/deity/mobs/deity.dm b/mods/gamemodes/deity/mobs/deity.dm deleted file mode 100644 index f26e490c85c..00000000000 --- a/mods/gamemodes/deity/mobs/deity.dm +++ /dev/null @@ -1,134 +0,0 @@ -/mob/living/deity - name = "shapeless creature" - desc = "A shape of otherworldly matter, not yet ready to be unleashed into this world." - icon = 'icons/mob/deity_big.dmi' - icon_state = "egg" - pixel_x = -128 - pixel_y = -128 - max_health = 100 - universal_understand = TRUE - mob_sort_value = 5 - is_spawnable_type = FALSE - butchery_data = null - - var/eye_type = /mob/observer/eye/freelook/cult - var/datum/visualnet/cultnet/eyenet - var/list/minions = list() //Minds of those who follow him - var/list/structures = list() //The objs that this dude controls. - var/list/feats = list() - var/datum/god_form/form - var/datum/current_boon - var/mob/living/following - -/mob/living/deity/Initialize() - . = ..() - eyenet = new() - eyeobj = new eye_type(get_turf(src), eyenet) - eyeobj.possess(src) - eyenet.add_source(src) - -/mob/living/deity/death(gibbed) - . = ..() - if(.) - for(var/m in minions) - var/datum/mind/M = m - remove_follower_spells(M) - to_chat(M.current, "Your connection has been severed! \The [src] is no more!") - sound_to(M.current, 'sound/hallucinations/far_noise.ogg') - SET_STATUS_MAX(M.current, STAT_WEAK, 10) - for(var/s in structures) - var/obj/structure/deity/S = s - S.linked_god = null - -/mob/living/deity/shared_nano_interaction() - if(stat == DEAD) - return STATUS_CLOSE - 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() - 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(form) - - return ..() - -/mob/living/deity/verb/return_to_plane() - set category = "Godhood" - - eyeobj.forceMove(get_turf(src)) - -/mob/living/deity/verb/choose_form() - set name = "Choose Form" - set category = "Godhood" - - var/dat = list() - dat += {"

      Choose a Form

      - This choice is permanent. Choose carefully, but quickly. - - - - - - "} - var/list/forms = subtypesof(/datum/god_form) - - for(var/form in forms) - var/datum/god_form/god = form - var/god_name = initial(god.name) - var/icon/god_icon = icon('icons/mob/mob.dmi', initial(god.pylon_icon_state)) - send_rsc(src,god_icon, "[god_name].png") - dat += {" - - - - "} - dat += "
      NameThemeDescription
      [god_name][initial(god.info)]
      " - show_browser(src, JOINTEXT(dat), "window=godform;can_close=0") - -/mob/living/deity/proc/set_form(var/type) - form = new type(src) - to_chat(src, SPAN_NOTICE("You undergo a transformation into your new form!")) - spawn(1) - SetName(form.name) - var/newname = sanitize(input(src, "Choose a name for your new form.", "Name change", form.name) as text, MAX_NAME_LEN) - if(newname) - fully_replace_character_name(newname) - src.verbs -= /mob/living/deity/verb/choose_form - show_browser(src, null, "window=godform") - for(var/m in minions) - var/datum/mind/mind = m - var/mob/living/L = mind.current - L.faction = form.faction - -//Gets the name based on form, or if there is no form name, type. -/mob/living/deity/proc/get_type_name(var/type) - if(form && form.buildables[type]) - var/list/vars = form.buildables[type] - if(vars["name"]) - return vars["name"] - var/atom/movable/M = type - return initial(M.name) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_Stat.dm b/mods/gamemodes/deity/mobs/deity_Stat.dm deleted file mode 100644 index 6105b7f9af3..00000000000 --- a/mods/gamemodes/deity/mobs/deity_Stat.dm +++ /dev/null @@ -1,14 +0,0 @@ -/mob/living/deity/Stat() - . = ..() - if(statpanel("Status")) - stat("Structure Num", structures.len) - stat("Minion Num", minions.len) - var/boon_name = "None" - if(current_boon) - if(istype(current_boon, /spell)) - var/spell/S = current_boon - boon_name = S.name - else - var/obj/O = current_boon - boon_name = O.name - stat("Current Boon",boon_name) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_boons.dm b/mods/gamemodes/deity/mobs/deity_boons.dm deleted file mode 100644 index da05d9a5ff2..00000000000 --- a/mods/gamemodes/deity/mobs/deity_boons.dm +++ /dev/null @@ -1,54 +0,0 @@ -/mob/living/deity/proc/set_boon(var/datum/boon) - if(current_boon) - qdel(current_boon) - current_boon = boon - to_chat(src, SPAN_NOTICE("You now have the boon [boon]")) - if(istype(boon, /atom/movable)) - var/atom/movable/A = boon - nano_data["boon_name"] = A.name - A.forceMove(src) - else if(istype(boon, /spell)) - var/spell/S = boon - nano_data["boon_name"] = S.name - -/mob/living/deity/proc/grant_boon(var/mob/living/L) - if(istype(current_boon, /spell) && !grant_spell(L, current_boon)) - return - else if(istype(current_boon, /obj/item)) - var/obj/item/I = current_boon - I.dropInto(L.loc) - var/origin_text = "on the floor" - if(L.equip_to_appropriate_slot(I)) - origin_text = "on your body" - else if(L.put_in_hands_or_del(I)) - origin_text = "in your hands" - else - var/obj/O = L.equip_to_storage(I) - if(O) - origin_text = "in \the [O]" - to_chat(L, SPAN_NOTICE("It appears [origin_text].")) - - to_chat(L, SPAN_OCCULT("\The [src] grants you a boon of [current_boon]!")) - to_chat(src, SPAN_NOTICE("You give \the [L] a boon of [current_boon].")) - log_and_message_admins("gave [key_name(L)] the boon [current_boon]") - current_boon = null - nano_data["boon_name"] = null - return - -/mob/living/deity/proc/grant_spell(var/mob/living/target, var/spell/spell) - var/datum/mind/M = target.mind - for(var/s in M.learned_spells) - var/spell/S = s - if(istype(S, spell.type)) - to_chat(src, SPAN_WARNING("They already know that spell!")) - return 0 - target.add_spell(spell) - spell.set_connected_god(src) - to_chat(target, SPAN_NOTICE("You feel a surge of power as you learn the art of [current_boon].")) - return 1 - -/* This is a generic proc used by the God to enact a sacrifice from somebody. Power is a value of magnitude. -*/ -/mob/living/deity/proc/take_charge(var/mob/living/L, var/power) - if(form) - form.take_charge(L, power) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_click.dm b/mods/gamemodes/deity/mobs/deity_click.dm deleted file mode 100644 index 06fff223062..00000000000 --- a/mods/gamemodes/deity/mobs/deity_click.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/deity/ClickOn(var/atom/A, var/params) - if(A == src) - if(form) - ui_interact(src) - else - choose_form() - return - var/list/modifiers = params2list(params) - if(modifiers["shift"] || modifiers["ctrl"]) - if(silenced) - to_chat(src, SPAN_WARNING("You cannot do that as you are silenced!")) - else - var/datum/phenomena/phenomena = get_phenomena(modifiers["shift"], modifiers["ctrl"]) - if(phenomena) - phenomena.Click(A) - return - if(current_boon && is_follower(A)) - grant_boon(A) - else if(istype(A, /obj/structure/deity)) - var/obj/structure/deity/D = A - if(D.linked_god == src) - D.attack_deity(src) - return - ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_hud.dm b/mods/gamemodes/deity/mobs/deity_hud.dm deleted file mode 100644 index 8a9e3d77d09..00000000000 --- a/mods/gamemodes/deity/mobs/deity_hud.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/deity - hud_used = /datum/hud/deity - -/datum/hud/deity/FinalizeInstantiation() - action_intent = new /obj/screen/intent/deity(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) - adding += action_intent - ..() - var/obj/screen/intent/deity/D = action_intent - D.sync_to_mob(mymob) diff --git a/mods/gamemodes/deity/mobs/deity_items.dm b/mods/gamemodes/deity/mobs/deity_items.dm deleted file mode 100644 index 3dfa6e4dc64..00000000000 --- a/mods/gamemodes/deity/mobs/deity_items.dm +++ /dev/null @@ -1,33 +0,0 @@ -/mob/living/deity - var/list/items - var/list/items_by_category - -/mob/living/deity/proc/set_items(var/list/_items) - items = _items - items_by_category = list() - for(var/i in items) - var/datum/deity_item/di = items[i] - if(!items_by_category[di.category]) - items_by_category[di.category] = list() - items_by_category[di.category] += di - -/mob/living/deity/proc/has_item(var/name, var/minimum_level = 1) - if(!(name in items)) - return FALSE - var/datum/deity_item/di = items[name] - . = di.level >= minimum_level - -/mob/living/deity/proc/upgrade_item(var/name) - if(!(name in items)) - return FALSE - var/datum/deity_item/di = items[name] - if(!di.can_buy(src)) - return FALSE - di.buy(src) - . = TRUE - -/mob/living/deity/proc/get_item_level(var/name) - . = 0 - if(items[name]) - var/datum/deity_item/di = items[name] - . = di.level diff --git a/mods/gamemodes/deity/mobs/deity_phenomena.dm b/mods/gamemodes/deity/mobs/deity_phenomena.dm deleted file mode 100644 index 6cb38eec0ec..00000000000 --- a/mods/gamemodes/deity/mobs/deity_phenomena.dm +++ /dev/null @@ -1,97 +0,0 @@ -/mob/living/deity - var/silenced = 0 - var/list/phenomenas = list() - var/list/intent_phenomenas = list() - var/static/list/control_types = list("control", "controlshift", "shift") - - -/mob/living/deity/Initialize() - . = ..() - for(var/intent in intents) //Just in case we somehow remove/add a new intent #futureproofing - populate_intent(intent) - set_phenomena(add_phenomena(/datum/phenomena/communicate), I_HELP, "shift") - set_phenomena(add_phenomena(/datum/phenomena/punish), I_HELP, "control") - set_phenomena(add_phenomena(/datum/phenomena/point), I_HELP, "controlshift") - set_phenomena(add_phenomena(/datum/phenomena/conversion), I_GRAB, "shift") - set_phenomena(add_phenomena(/datum/phenomena/forced_conversion), I_GRAB, "control") - -/mob/living/deity/proc/silence(var/amount) - if(!silenced) - to_chat(src, SPAN_WARNING("You've been silenced! Your phenomenas are disabled!")) - var/obj/screen/intent/deity/SD = istype(hud_used) && 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/handle_regular_status_updates() - . = ..() - if(.) - if(silenced > 0) - silenced-- - if(!silenced) - to_chat(src, SPAN_NOTICE("You are no longer silenced.")) - var/obj/screen/intent/deity/SD = istype(hud_used) && 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/proc/add_phenomena(var/type) - if(!phenomenas) - phenomenas = list() - for(var/P in phenomenas) - if(istype(phenomenas[P], type)) - return - var/datum/phenomena/P = new type(src) - phenomenas[P.name] = P - return P - -/mob/living/deity/proc/remove_phenomena_from_intent(var/intent, var/modifier, var/update = 1) - var/list/intent_list = intent_phenomenas[intent] - intent_list[modifier] = null - if(update) - update_phenomena_bindings() - -/mob/living/deity/proc/remove_phenomena(var/to_remove) - var/datum/phenomena/P = phenomenas[to_remove] - phenomenas -= to_remove - for(var/intent in intent_phenomenas) - var/list/intent_list = intent_phenomenas[intent] - for(var/mod in intent_list) - if(intent_list[mod] == P) - intent_list[mod] = null - var/obj/screen/intent/deity/SD = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.update_text() - update_phenomenas() - update_phenomena_bindings() - if(selected == to_remove) - selected = null - qdel(P) - -/mob/living/deity/proc/populate_intent(var/intent) - if(!intent_phenomenas[intent]) - intent_phenomenas[intent] = list() - intent_phenomenas[intent] |= control_types - -/mob/living/deity/proc/set_phenomena(var/datum/phenomena/phenomena, var/intent, var/modifiers) - if(!intent_phenomenas[intent]) - populate_intent(intent) - var/list/intent_list = intent_phenomenas[intent] - intent_list[modifiers] = phenomena - -/mob/living/deity/proc/get_phenomena(var/shift = 0, var/control = 0) - var/list/intent_list = intent_phenomenas[a_intent] - if(intent_list) - var/type = "" - if(shift) - type = "shift" - if(control) - type = "control[type]" - if(intent_list[type]) - return intent_list[type] - return null \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_power.dm b/mods/gamemodes/deity/mobs/deity_power.dm deleted file mode 100644 index ffe073b014a..00000000000 --- a/mods/gamemodes/deity/mobs/deity_power.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/deity - var/power = 0 - var/power_min = 10 - var/power_per_regen = 1 - -/mob/living/deity/proc/adjust_power(var/amount) - if(amount) - power = max(0, power + amount) - -/mob/living/deity/proc/adjust_power_min(var/amount, var/silent = 0, var/msg) - if(amount) - power_min = max(initial(power_min), power_min + amount) - if(!silent) - var/feel = "" - if(abs(amount) > 20) - feel = " immensely" - else if(abs(amount) > 10) - feel = " greatly" - if(abs(amount) >= 5) - var/class = amount > 0 ? "notice" : "warning" - to_chat(src, "You feel your power [amount > 0 ? "increase" : "decrease"][feel][msg ? " [msg]" : ""]") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_pylon.dm b/mods/gamemodes/deity/mobs/deity_pylon.dm deleted file mode 100644 index 7f84dc5b339..00000000000 --- a/mods/gamemodes/deity/mobs/deity_pylon.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/deity - var/image/pylon_image - var/obj/structure/deity/pylon/pylon - -/mob/living/deity/set_form(var/type) - ..() - pylon_image = image('icons/mob/mob.dmi', icon_state = form.pylon_icon_state) - pylon_image.alpha = 180 - -/mob/living/deity/proc/possess_pylon(var/obj/structure/deity/pylon/P) - if(pylon) - leave_pylon() - pylon = P - pylon.overlays += pylon_image - playsound(pylon,'sound/effects/phasein.ogg',40,1) - -/mob/living/deity/proc/leave_pylon() - if(!pylon) - return - pylon.overlays -= pylon_image - pylon = null \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_sources.dm b/mods/gamemodes/deity/mobs/deity_sources.dm deleted file mode 100644 index a1ec947983d..00000000000 --- a/mods/gamemodes/deity/mobs/deity_sources.dm +++ /dev/null @@ -1,84 +0,0 @@ -/mob/living/deity/proc/add_follower(var/mob/living/L) - if(is_follower(L, silent=1)) - return - - adjust_source(3, L) - minions += L.mind - var/spell/construction/C = new() - L.add_spell(C) - C.set_connected_god(src) - if(form) - L.faction = form.faction - 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) - events_repository.unregister(/decl/observ/destroyed, L,src) - -/mob/living/deity/proc/remove_follower_spells(var/datum/mind/M) - if(M.learned_spells) - for(var/s in M.learned_spells) - var/spell/S = s - if(S.connected_god == src) - M.current.remove_spell(S) - qdel(S) - -/mob/living/deity/proc/remove_follower(var/mob/living/L) - if(!is_follower(L, silent=1)) - return - - adjust_source(-3, L) - minions -= L.mind - L.faction = MOB_FACTION_NEUTRAL - if(L.mind) - remove_follower_spells(L.mind) - update_followers() - - -/mob/living/deity/proc/adjust_source(var/amount, var/atom/source, var/silent = 0, var/msg) - adjust_power_min(amount, silent, msg) - if(!ismovable(source)) - return - if(amount > 0) - eyenet.add_source(source) - if(istype(source, /obj/structure/deity)) - structures |= source - else - eyenet.remove_source(source) - if(istype(source, /obj/structure/deity)) - structures -= source - -/mob/living/deity/proc/is_follower(var/mob/living/L, var/silent = 0) - if(istype(L)) - if(L.mind) - if(L.mind in minions) - return 1 - if(!silent) - to_chat(src, SPAN_WARNING("You do not feel a malleable mind behind that frame.")) - return 0 - -/mob/living/deity/fully_replace_character_name(var/new_name, var/in_depth = TRUE) - if(!..()) - return 0 - for(var/m in minions) - var/datum/mind/minion = m - to_chat(minion.current, "Your master is now known as [new_name].") - minion.assigned_special_role = "Servant of [new_name]" - eyeobj.SetName("[src] ([eyeobj.name_sufix])") - nano_data["name"] = new_name - return 1 - -//Whether we are near an important structure. -/mob/living/deity/proc/near_structure(var/atom/A, var/all_structures = 0) - var/turf/T = get_turf(A) - for(var/s in structures) - if(!all_structures) - var/obj/structure/deity/D = s - if(D.deity_flags & DEITY_STRUCTURE_NEAR_IMPORTANT)//If it needs to be near an important structure, it isn't important. - continue - - if(get_dist(T, s) <= 3) - return 1 - return 0 \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_topic.dm b/mods/gamemodes/deity/mobs/deity_topic.dm deleted file mode 100644 index 01226e8ddc5..00000000000 --- a/mods/gamemodes/deity/mobs/deity_topic.dm +++ /dev/null @@ -1,51 +0,0 @@ -/mob/living/deity/OnSelfTopic(list/href_list) - if(href_list["form"]) - var/type = locate(href_list["form"]) in subtypesof(/datum/god_form) - if(type) - set_form(type) - return TOPIC_HANDLED - if(href_list["select_phenomena"]) - nano_data["phenomenaMenu"] = 1 - selected = phenomenas[href_list["select_phenomena"]] - nano_data["selectedPhenomenaName"] = selected.name - return TOPIC_HANDLED - if(href_list["clear_selected"]) - nano_data["phenomenaMenu"] = 0 - selected = null - nano_data["selectedPhenomenaName"] = null - return TOPIC_HANDLED - if(href_list["select_intent"]) - var/list/intent = intent_phenomenas[href_list["select_intent"]] - if(intent[href_list["select_binding"]]) - remove_phenomena_from_intent(href_list["select_intent"], href_list["select_binding"], 0) - if(selected) - set_phenomena(selected, href_list["select_intent"], href_list["select_binding"]) - update_phenomena_bindings() - return TOPIC_HANDLED - if(href_list["jump"]) - var/atom/a = locate(href_list["jump"]) - var/follow = 0 - if(href_list["follow"]) - follow = 1 - if(a) - if(following) - stop_follow() - eyeobj.setLoc(get_turf(a)) - if(follow) - follow_follower(a) - to_chat(src, SPAN_NOTICE("[follow ? "Following" : "Jumping to"] \the [a]")) - return TOPIC_HANDLED - if(href_list["buy"]) - var/datum/deity_item/di = locate(href_list["buy"]) - if(di.can_buy(src)) - di.buy(src) - else - to_chat(di,SPAN_WARNING("You don't meet all the requirements for [di.name]!")) - return TOPIC_HANDLED - if(href_list["switchCategory"]) - set_nano_category(text2num(href_list["switchCategory"])) - return 1 - if(href_list["switchMenu"]) - nano_data[href_list["menu"]] = text2num(href_list["switchMenu"]) - return TOPIC_HANDLED - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/deity_tracking.dm b/mods/gamemodes/deity/mobs/deity_tracking.dm deleted file mode 100644 index 27e9d3b552d..00000000000 --- a/mods/gamemodes/deity/mobs/deity_tracking.dm +++ /dev/null @@ -1,40 +0,0 @@ -/mob/living/deity/verb/jump_to_follower() - set category = "Godhood" - - if(!minions) - return - - var/list/could_follow = list() - for(var/m in minions) - var/datum/mind/M = m - if(M.current && M.current.stat != DEAD) - could_follow += M.current - - if(!could_follow.len) - return - - var/choice = input(src, "Jump to follower", "Teleport") as null|anything in could_follow - if(choice) - follow_follower(choice) - -/mob/living/deity/proc/follow_follower(var/mob/living/L) - if(!L || L.stat == DEAD || !is_follower(L, silent=1)) - return - if(following) - stop_follow() - eyeobj.setLoc(get_turf(L)) - to_chat(src, SPAN_NOTICE("You begin to follow \the [L].")) - following = L - 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) - events_repository.unregister(/decl/observ/destroyed, following, src) - events_repository.unregister(/decl/observ/death, following,src) - to_chat(src, SPAN_NOTICE("You stop following \the [following].")) - following = null - -/mob/living/deity/proc/keep_following(var/atom/movable/moving_instance, var/atom/old_loc, var/atom/new_loc) - eyeobj.setLoc(new_loc) diff --git a/mods/gamemodes/deity/mobs/freelook/cultnet.dm b/mods/gamemodes/deity/mobs/freelook/cultnet.dm deleted file mode 100644 index 86c718fa0f5..00000000000 --- a/mods/gamemodes/deity/mobs/freelook/cultnet.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/visualnet/cultnet - valid_source_types = list(/mob/living/, /obj/structure/deity) - chunk_type = /datum/chunk/cultnet - -/datum/chunk/cultnet/acquire_visible_turfs(var/list/visible) - for(var/source in sources) - if(isliving(source)) - var/mob/living/L = source - if(L.stat == DEAD) - continue - - for(var/turf/t in seen_turfs_in_range(source, world.view)) - visible[t] = t \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/freelook/mask.dm b/mods/gamemodes/deity/mobs/freelook/mask.dm deleted file mode 100644 index 6310effcb1c..00000000000 --- a/mods/gamemodes/deity/mobs/freelook/mask.dm +++ /dev/null @@ -1,11 +0,0 @@ -/mob/observer/eye/freelook/cult - name = "Mask of God" - desc = "A terrible fracture of reality coinciding into a mirror to another world." - living_eye = FALSE - -/mob/observer/eye/freelook/cult/EyeMove() - if(isdeity(owner)) - var/mob/living/deity/D = owner - if(D.following) - D.stop_follow() - return ..() diff --git a/mods/gamemodes/deity/mobs/items/blood_crafting.dm b/mods/gamemodes/deity/mobs/items/blood_crafting.dm deleted file mode 100644 index 3db0c0e161d..00000000000 --- a/mods/gamemodes/deity/mobs/items/blood_crafting.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/deity_item/blood_crafting - abstract_type = /datum/deity_item/blood_crafting - name = DEITY_BLOOD_CRAFT - desc = "Unlocks the blood smithing structure which allows followers to forge unholy tools from blood and flesh." - category = DEITY_BLOOD_CRAFT - max_level = 1 - base_cost = 75 - var/forge_type = /obj/structure/deity/blood_forge - var/list/recipes = list() - -/datum/deity_item/blood_crafting/buy(var/mob/living/deity/user) - ..() - user.form.buildables |= forge_type //put structure here - var/list/L = user.feats[name] - if(!L) - L = list() - for(var/type in recipes) - L[type] = recipes[type] - user.feats[name] = L \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/deity_item.dm b/mods/gamemodes/deity/mobs/items/deity_item.dm deleted file mode 100644 index 7590bbb9037..00000000000 --- a/mods/gamemodes/deity/mobs/items/deity_item.dm +++ /dev/null @@ -1,39 +0,0 @@ -// todo: declize /datum/deity_item -/datum/deity_item - var/name - var/desc - var/base_cost = 1 - var/category - var/level = 0 - var/max_level = 0 - var/list/requirements //Name of item = level of item - -/datum/deity_item/proc/can_buy(var/mob/living/deity/D) - if(max_level && level == max_level) - return FALSE - var/cost = get_cost(D) - if(cost && D.power < cost) - return FALSE - if(requirements && requirements.len) - for(var/name in requirements) - if(!D.has_item(name,requirements[name])) - return FALSE - return TRUE - -/datum/deity_item/proc/buy(var/mob/living/deity/D) - D.adjust_power(-get_cost(D)) - level++ - -/datum/deity_item/proc/get_cost(var/mob/living/deity/D) - return base_cost - - -/datum/deity_item/proc/print_level() - return "[level][max_level ? "/[max_level]" : ""]" - -/datum/deity_item/proc/print_requirements() - if(!requirements) - return "N/A" - . = "" - for(var/l in requirements) - . += "[l] [requirements[l]]
      " \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/general.dm b/mods/gamemodes/deity/mobs/items/general.dm deleted file mode 100644 index d5c21756578..00000000000 --- a/mods/gamemodes/deity/mobs/items/general.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/deity_item/general - category = "General" - -/datum/deity_item/general/potential - name = "Increase Potential" - desc = "Increase the amount of natural power you regenerate." - base_cost = 10 - -/datum/deity_item/general/potential/buy(var/mob/living/deity/D) - ..() - D.adjust_power_min(5) - -/datum/deity_item/general/potential/get_cost(var/mob/living/deity/D) - return base_cost + base_cost * level**2 - -/datum/deity_item/general/regeneration - name = "Increase Power Syphon" - desc = "Decreases the time it takes to charge your power." - base_cost = 5 - -/datum/deity_item/general/regeneration/buy(var/mob/living/deity/D) - ..() - D.power_per_regen++ - -/datum/deity_item/general/regeneration/get_cost(var/mob/living/deity/D) - return base_cost + 10 * level \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/items/generic.dm b/mods/gamemodes/deity/mobs/items/generic.dm deleted file mode 100644 index 01b2001ae6e..00000000000 --- a/mods/gamemodes/deity/mobs/items/generic.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/deity_item/boon - var/boon_path - -/datum/deity_item/boon/buy(var/mob/living/deity/D) - ..() - if(boon_path) - . = new boon_path() - D.set_boon(.) - -/datum/deity_item/phenomena - var/phenomena_path - max_level = 1 - -/datum/deity_item/phenomena/buy(var/mob/living/deity/D) - ..() - if(level == 1 && phenomena_path) - D.add_phenomena(phenomena_path) - D.update_phenomenas() - -/datum/deity_item/boon/single_charge/buy(var/mob/living/deity/D) - . = ..() - if(istype(.,/spell)) - var/spell/S = . - S.charge_counter = S.charge_max - S.charge_type = Sp_CHARGES \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/menu/deity_nano.dm b/mods/gamemodes/deity/mobs/menu/deity_nano.dm deleted file mode 100644 index 8633706588b..00000000000 --- a/mods/gamemodes/deity/mobs/menu/deity_nano.dm +++ /dev/null @@ -1,81 +0,0 @@ -/mob/living/deity - var/list/nano_data = list() - var/datum/phenomena/selected - -/mob/living/deity/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/uistate = global.self_topic_state) - if(!nano_data["categories"]) //If we don't have the categories set yet, we should populate our data. - var/list/categories = list() - for(var/cat in items_by_category) - categories += cat - nano_data["name"] = name - nano_data["form_name"] = form.name - nano_data["categories"] = categories - nano_data["menu"] = 0 //0 followers, 1 shop, 2 phenomena - nano_data["phenomenaMenu"] = 0 //0 Phenoms 1 Bindings - set_nano_category(0) - update_followers() - update_phenomenas() - update_phenomena_bindings() - else - update_category() - nano_data["power"] = power - nano_data["power_min"] = power_min - nano_data["regen"] = power_per_regen - ui = SSnano.try_update_ui(user, src, ui_key, ui, nano_data, force_open) - if(!ui) - ui = new(user, src, ui_key, "deity.tmpl", "Deity Menu", 650, 600, state = uistate) - ui.set_initial_data(nano_data) - ui.open() - ui.set_auto_update(TRUE) - -/mob/living/deity/proc/set_nano_category(var/num) - nano_data["category"] = num - update_category() - -/mob/living/deity/proc/update_category() - var/actual_cat = nano_data["categories"][nano_data["category"] + 1] - var/list/cat_items = items_by_category[actual_cat] - var/list/item_data = list() - for(var/item in cat_items) - var/datum/deity_item/di = item - item_data[++item_data.len] = list("name" = di.name, "desc" = di.desc, "requirements" = di.print_requirements(), "level" = di.print_level(), "cost" = di.get_cost(), "ref" = "\ref[di]") - nano_data["item_data"] = item_data - -/mob/living/deity/proc/update_followers() - var/list/follower_data = list() - for(var/m in minions) - var/list/minion_data = list() - var/datum/mind/mind = m - if(mind.current) - if(mind.current.stat != DEAD && mind.current.loc) - minion_data["ref"] = "\ref[mind.current]" - minion_data["name"] = "[mind.current.name]" - else - minion_data["name"] = mind.name - follower_data[++follower_data.len] = minion_data - nano_data["followers"] = follower_data - -/mob/living/deity/proc/update_phenomenas() - var/list/phenomena_data = list() - for(var/p in phenomenas) - var/datum/phenomena/P = phenomenas[p] - phenomena_data[++phenomena_data.len] = list("name" = p, "description" = P.desc, "cost" = P.cost, "cooldown" = P.cooldown) - nano_data["phenomenas"] = phenomena_data - -/mob/living/deity/proc/update_phenomena_bindings() - var/list/phenomena_bindings = list() - for(var/intent in intent_phenomenas) - var/list/intent_data = list() - for(var/binding in intent_phenomenas[intent]) - var/datum/phenomena/P = intent_phenomenas[intent][binding] - var/list/data = list() - if(P) - data["phenomena_name"] = P.name - data["binding"] = binding - intent_data[++intent_data.len] = data - 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 = istype(hud_used) && hud_used.action_intent - if(istype(SD)) - SD.update_text() \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/_defines.dm b/mods/gamemodes/deity/mobs/phenomena/_defines.dm deleted file mode 100644 index e0268f37fa5..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/_defines.dm +++ /dev/null @@ -1,4 +0,0 @@ -#define PHENOMENA_NEAR_STRUCTURE 1 //Must be done near a structure -#define PHENOMENA_FOLLOWER 2 //Can be done on a follower -#define PHENOMENA_NONFOLLOWER 4 //Can be done on a nonfollower. -#define PHENOMENA_MUNDANE 8 //Can affect mundane (no mind, no client) things. \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/communication.dm b/mods/gamemodes/deity/mobs/phenomena/communication.dm deleted file mode 100644 index b3d603bd1c2..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/communication.dm +++ /dev/null @@ -1,80 +0,0 @@ -/datum/phenomena/communicate - name = "Direct Communication" - desc = "Communicate directly with a mortal being. You may communicate with non-followers, but they will find you easier to ignore." - cost = 0 - flags = PHENOMENA_FOLLOWER | PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomena/communicate/activate(var/mob/living/L) - var/text_to_send = sanitize(input(linked, "Subjugate a member to your will", "Message a Believer") as text) - if(text_to_send) - var/text_size = 4 - if(!linked.is_follower(L)) - text_size = 1 - to_chat(L, "[text_to_send]") //Note to self: make this go to ghosties - to_chat(linked, SPAN_NOTICE("You send the message [text_to_send] to \the [L]")) - log_and_message_admins("communicated the message \"[text_to_send]\" to [key_name(L)]", linked) - -/datum/phenomena/point - name = "Point" - desc = "Attract your follower's attentions to something nearby." - cost = 0 - flags = PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - var/image/arrow - -/datum/phenomena/point/activate(var/atom/a) - ..() - if(!arrow) - arrow = image('icons/effects/markers.dmi', icon_state = "arrow", layer = POINTER_LAYER) - var/turf/T = get_turf(a) - arrow.loc = T - var/list/view = view(7,T) - for(var/m in linked.minions) - var/datum/mind/mind = m - if(mind.current) - var/mob/M = mind.current - if((M in view) && M.client) - to_chat(M, SPAN_OCCULT("Your attention is eerily drawn to \the [a].")) - M.client.images += arrow - 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) - -/datum/phenomena/point/proc/remove_image(var/mob/living/L) - L.client.images -= arrow - events_repository.unregister(/decl/observ/logged_out, L, src) - -/datum/phenomena/punish - name = "Punish" - desc = "Punish your followers for insubordination, the cost to use this phenomena is based on how deadly you choose the punishment to be." - cost = 0 - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living - var/static/list/punishment_list = list("Pain (0)" = 0, "Light Wound (5)" = 5, "Brain Damage (10)" = 10, "Heavy Wounds (20)" = 20) - -/datum/phenomena/punish/activate(var/mob/living/L) - var/pain = input(linked, "Choose their punishment.", "Punishment") as null|anything in punishment_list - if(!pain) - return - if(punishment_list[pain] && linked.power < punishment_list[pain]) - to_chat(linked, SPAN_WARNING("[pain] costs too much power for you to use on \the [L]")) - return - ..() - linked.adjust_power(-punishment_list[pain]) - switch(pain) - if("Pain (0)") - L.take_damage(15, PAIN) - to_chat(L, SPAN_WARNING("You feel intense disappointment coming at you from beyond the veil.")) - if("Light Wound (5)") - L.take_damage(5) - to_chat(L, SPAN_WARNING("You feel an ethereal whip graze your very soul!")) - if("Brain Damage (10)") - L.take_damage(5, BRAIN) - to_chat(L, SPAN_DANGER("You feel your mind breaking under a otherwordly hammer...")) - if("Heavy Wounds (20)") - L.take_damage(25) - to_chat(L, SPAN_DANGER("You feel your master turn its destructive potential against you!")) - to_chat(linked, SPAN_NOTICE("You punish \the [L].")) - log_admin("[key_name(linked)] used Punishment [pain] on \the [key_name(L)]") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/conjuration.dm b/mods/gamemodes/deity/mobs/phenomena/conjuration.dm deleted file mode 100644 index 5f15cc786aa..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/conjuration.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/phenomena/movable_object/dimensional_locker - object_type = /obj/structure/closet - name = "Dimensional Locker" - cost = 10 - desc = "Summon a trans-dimensional locker anywhere within your influence. You may transport objects and things, but not people in it." - -/datum/phenomena/movable_object/dimensional_locker/activate(var/atom/a, var/mob/living/deity/user) - var/list/mobs_inside = list() - recursive_content_check(object_to_move, mobs_inside, client_check = 0, sight_check = 0, include_objects = 0) - - for(var/i in mobs_inside) - var/mob/M = i - M.dropInto(object_to_move.loc) - to_chat(M,SPAN_WARNING("You are suddenly flung out of \the [object_to_move]!")) - ..() - -/datum/phenomena/portals - name = "Portals" - desc = "Summon a portal linked to the last portal you've created. The portal will be destroyed if it is not linked when someone crosses it." - cost = 30 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - var/list/portals = list() - -/datum/phenomena/portals/activate(var/atom/a, var/mob/living/deity/user) - ..() - var/obj/effect/portal/P = new(get_turf(a), null, 0) - P.failchance = 0 - portals += P - 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) - qdel(removed) - if(portals.len > 1) - var/obj/effect/portal/P1 = portals[1] - var/obj/effect/portal/P2 = portals[2] - P1.target = get_turf(P2) - P2.target = get_turf(P1) - -/datum/phenomena/portals/proc/remove_portal(var/portal) - portals -= portal - events_repository.unregister(/decl/observ/destroyed, portal,src) - var/turf/T = get_turf(portal) - for(var/obj/effect/portal/P in portals) - if(P.target == T) - P.target = null - -/datum/phenomena/banishing_smite - name = "Banishing Smite" - desc = "Deal a terrible blow to a mortal. If they are hurt enough ,they will find themselves trapped in a rift for 30 seconds." - cost = 70 - cooldown = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomena/banishing_smite/activate(var/mob/living/L, var/mob/living/deity/user) - ..() - 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, SPAN_DANGER("Something hard hits you!")) - 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(SPAN_DANGER("\The [L] is quickly sucked into \a [R]!")) - L.forceMove(R) - spawn(300) - qdel(R) diff --git a/mods/gamemodes/deity/mobs/phenomena/conversion.dm b/mods/gamemodes/deity/mobs/phenomena/conversion.dm deleted file mode 100644 index 9d4d989d3fb..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/conversion.dm +++ /dev/null @@ -1,51 +0,0 @@ -/datum/phenomena/conversion - name = "Conversion" - desc = "Ask a non-follower to convert to your cult. This is completely voluntary. Requires the subject to be close to an altar." - cost = 20 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomena/conversion/can_activate(var/atom/target) - if(!..()) - return 0 - var/is_good = 0 - for(var/obj/structure/deity/altar/A in linked.structures) - if(get_dist(target, A) < 2) - is_good = 1 - break - if(!is_good) - to_chat(linked,SPAN_WARNING("\The [target] needs to be near \a [linked.get_type_name(/obj/structure/deity/altar)].")) - return 0 - return 1 - -/datum/phenomena/conversion/activate(var/mob/living/L) - to_chat(src,SPAN_NOTICE("You give \the [L] a chance to willingly convert. May they choose wisely.")) - var/choice = alert(L, "You feel a weak power enter your mind attempting to convert it.", "Conversion", "Allow Conversion", "Deny Conversion") - if(choice == "Allow Conversion") - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(L.mind,1, "Servant of [linked]", "You willingly give your mind to it, may it bring you fortune.", specific_god=linked) - else - to_chat(L, SPAN_WARNING("With little difficulty you force the intrusion out of your mind. May it stay that way.")) - to_chat(src, SPAN_WARNING("\The [L] decides not to convert.")) - -/datum/phenomena/forced_conversion - name = "Forced Conversion" - desc = "Force a non-follower to join you. They need to be on top of an altar and conscious for this to work. They may resist, but that will hurt them." - cost = 100 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomena/forced_conversion/can_activate(var/mob/living/L) - if(!..()) - return 0 - var/obj/structure/deity/altar/A = locate() in get_turf(L) - if(!A || A.linked_god != linked) - to_chat(linked,SPAN_WARNING("\The [L] needs to be on \a [linked.get_type_name(/obj/structure/deity/altar)] to be forcefully converted.")) - return 0 - - return 1 - -/datum/phenomena/forced_conversion/activate(var/mob/living/L) - var/obj/structure/deity/altar/A = locate() in get_turf(L) - A.set_target(L) - to_chat(linked, SPAN_NOTICE("You imbue \the [A] with your power, setting forth to force \the [L] to your will.")) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/generic.dm b/mods/gamemodes/deity/mobs/phenomena/generic.dm deleted file mode 100644 index 633cd96eb7f..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/generic.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/phenomena/movable_object - var/object_type - var/atom/movable/object_to_move - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /atom - -/datum/phenomena/movable_object/New() - ..() - add_object() - -/datum/phenomena/movable_object/Destroy() - events_repository.unregister(/decl/observ/destroyed, object_to_move,src) - if(!object_to_move.loc) - QDEL_NULL(object_to_move) - . = ..() - -/datum/phenomena/movable_object/proc/add_object() - 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_REF(add_object)) - -/datum/phenomena/movable_object/activate(var/atom/a, var/mob/living/deity/user) - ..() - if(object_to_move == a) - object_to_move.forceMove(null) //Move to null space - else - var/turf/T = get_turf(a) - //No dense turf/stuff - if(T.density) - return - for(var/i in T) - var/atom/A = i - if(A.density) - return - object_to_move.forceMove(T) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/narsie.dm b/mods/gamemodes/deity/mobs/phenomena/narsie.dm deleted file mode 100644 index 52e69b66b47..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/narsie.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/phenomena/exude_blood - name = "Exhude Blood" - desc = "Take pity on a follower, converting a pitance of your power into blood. Don't let them forget your mercy." - cost = 20 - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/human - -/datum/phenomena/exude_blood/can_activate(var/mob/living/human/H) - if(!..()) - return 0 - - if(!H.should_have_organ(BP_HEART) || H.vessel.total_volume == H.species.blood_volume) - to_chat(linked, SPAN_WARNING("\The [H] doesn't require anymore blood.")) - return 0 - return 1 - -/datum/phenomena/exude_blood/activate(var/mob/living/human/H, var/mob/living/deity/user) - H.adjust_blood(30) - to_chat(H,SPAN_NOTICE("You feel a rush as new blood enters your system.")) - - -/datum/phenomena/hellscape - name = "Reveal Hellscape" - desc = "Show a non-follower what awaits their souls after you are through with them." - cost = 60 - cooldown = 450 - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - var/static/list/creepy_notes = list("Your knees give out as an unnatural screaming rings your ears.", - "You breathe in ash and decay, your lungs gasping for air as your body gives way to the floor.", - "An extreme pressure comes over you, as if an unknown force has marked you.") - -/datum/phenomena/hellscape/activate(var/mob/living/L) - to_chat(L, "[pick(creepy_notes)]") - L.damageoverlaytemp = 100 - sound_to(L, 'sound/hallucinations/far_noise.ogg') - SET_STATUS_MAX(L, STAT_WEAK, 2) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/phenomena.dm b/mods/gamemodes/deity/mobs/phenomena/phenomena.dm deleted file mode 100644 index 169eb499a3f..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/phenomena.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/phenomena - var/name = "Phenomena" - var/desc = "This has no desc." - var/cost = 0 - var/mob/living/deity/linked - var/flags = 0 - var/cooldown = 10 - var/refresh_time = 0 - var/expected_type - -/datum/phenomena/New(var/master) - linked = master - ..() - -/datum/phenomena/Destroy() - linked.remove_phenomena(src) - return ..() - -/datum/phenomena/proc/Click(var/atom/target) - if(can_activate(target)) - linked.adjust_power(-cost) - refresh_time = world.time + cooldown - activate(target) - -/datum/phenomena/proc/can_activate(var/atom/target) - if(!linked) - return 0 - if(refresh_time > world.time) - to_chat(linked, SPAN_WARNING("\The [src] is still on cooldown for [round((refresh_time - world.time)/10)] more seconds!")) - return 0 - - if(!linked.form) - to_chat(linked, SPAN_WARNING("You must choose your form first!")) - return 0 - - if(expected_type && !istype(target,expected_type)) - return 0 - - if(flags & PHENOMENA_NEAR_STRUCTURE) - if(!linked.near_structure(target, 1)) - to_chat(linked, SPAN_WARNING("\The [target] needs to be near a holy structure for your powers to work!")) - return 0 - - if(isliving(target)) - var/mob/living/L = target - if(!L.mind || !L.client) - if(!(flags & PHENOMENA_MUNDANE)) - to_chat(linked, SPAN_WARNING("\The [L]'s mind is too mundane for you to influence.")) - return 0 - else - if(linked.is_follower(target, silent = 1)) - if(!(flags & PHENOMENA_FOLLOWER)) - to_chat(linked, SPAN_WARNING("You can't use [name] on the flock!")) - return 0 - else if(!(flags & PHENOMENA_NONFOLLOWER)) - to_chat(linked, SPAN_WARNING("You can't use [name] on non-believers.")) - return 0 - - if(cost > linked.power) - to_chat(linked, SPAN_WARNING("You need more power to use [name] (Need [cost] power, have [linked.power])!")) - return 0 - - return 1 - -/datum/phenomena/proc/activate(var/target) - to_chat(linked, SPAN_NOTICE("You use the phenomena [name] on \the [target]")) - log_and_message_admins("uses the phenomena [name] on \the [target]", linked, get_turf(target)) - return - -/datum/phenomena/proc/get_desc() - . = desc - if(cooldown) - . = "Cooldown: [cooldown/10] seconds. [.]" - if(cost) - . = "Cost: [cost] power. [.]" \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/starlight.dm b/mods/gamemodes/deity/mobs/phenomena/starlight.dm deleted file mode 100644 index 72a6f0dbf07..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/starlight.dm +++ /dev/null @@ -1,232 +0,0 @@ -/datum/phenomena/herald - name = "Bestow Heraldry" - desc = "Turn one of your followers into a herald of your coming." - cost = 100 - cooldown = 60 SECONDS - flags = PHENOMENA_FOLLOWER - expected_type = /mob/living/human - var/static/list/possible_forms = list( - "Champion" = list("description" = "A protector of the faith. Fully protected by knightly armor, a Champion can shoot fire from their hands.", - "armor" = /obj/item/clothing/suit/armor/sunsuit, - "helm" = /obj/item/clothing/head/helmet/sunhelm, - "extension" = /datum/extension/deity_be_near/champion, - "spells" = list(/spell/hand/duration/sunwrath) - ), - "Oracle" = list("description" = "A preacher of the faith, the Oracle gives off heavenly light that they can use to heal followers and stun enemies.", - "armor" = /obj/item/clothing/suit/armor/sunrobe, - "extension" = /datum/extension/deity_be_near/oracle, - "spells" = list(/spell/targeted/glimpse_of_eternity) - ), - "Traitor" = list("description" = "Believers that reject the sun god's blessings, instead reveling in the shadows. Can turn invisible when its dark, and can move unprotected in space.", - "armor" = /obj/item/clothing/suit/space/shadowsuit, - "helm" = /obj/item/clothing/head/helmet/space/shadowhood, - "extension" = /datum/extension/deity_be_near/traitor, - "spells" = list(/spell/veil_of_shadows) - ) - ) - -/datum/phenomena/herald/can_activate(var/a) - if(!..()) - return FALSE - return valid_for_herald(a) - -/datum/phenomena/herald/proc/valid_for_herald(var/a) - var/mob/living/human/H = a - if(!istype(H)) - return FALSE - var/obj/item/I = H.get_equipped_item(slot_wear_suit_str) - if(I) - var/datum/extension/deity_be_near/dbn = get_extension(I, /datum/extension/deity_be_near) - if(dbn) - return FALSE - return TRUE - -/datum/phenomena/herald/proc/equip_slot(var/mob/living/L, var/slot_id, var/new_item) - var/equipped = L.get_equipped_slot_for_item(slot_id) - if(equipped) - L.try_unequip(equipped, get_turf(L)) - L.equip_to_slot_if_possible(new_item, slot_id) - -/datum/phenomena/herald/Topic(var/href, var/list/href_list) - if(..()) - return 1 - if(usr != linked) - return 1 - - if(href_list["herald"]) - var/list/form = possible_forms[href_list["herald"]] - var/mob/living/L = locate(href_list["target"]) - var/turf/T = get_turf(L) - if(!L || !valid_for_herald(L) || !form) - return 1 - var/type = form["armor"] - var/obj/item/I = new type(T) - var/datum/extension/deity_be_near/extension = set_extension(I, form["extension"], linked) - L.equip_to_slot_or_store_or_drop(I, slot_wear_suit_str) - if(form["helm"]) - var/h_type = form["helm"] - var/obj/item/helm = new h_type(T) - L.equip_to_slot_or_store_or_drop(helm, slot_head_str) - extension.expected_helmet = helm.type //We only do by type because A. its easier to manage and B the chances of it being non-unique in a normal game is very small - if(form["weapon"]) - var/w_type = form["weapon"] - L.put_in_hands_or_store_or_drop(new w_type(T)) - if(form["spells"]) - for(var/s in form["spells"]) - var/spell/boon = new s - boon.set_connected_god(linked) - L.add_spell(boon) - to_chat(L, "You have been chosen by your master to lead your fellow followers into the next age of rebirth.
      You have been granted powerful armor and a powerful spell. Don't lose them, as they are your key to your divinity and leadership.
      You also have particular sway over your deity's structures.
      ") - to_chat(linked, SPAN_NOTICE("\The [L] is now your herald!")) - linked.remove_phenomena(name) - show_browser(linked, null, "window=herald") - -/datum/phenomena/herald/activate(var/mob/living/human/H) - var/list/html = list() - html += "

      Heralds

      " - html += "
      Pick the type of herald you want.
      " - html += "" - for(var/type in possible_forms) - var/list/form = possible_forms[type] - html += "" - html += "
      NameDescription
      [type][form["description"]]
      " - show_browser(linked, jointext(html,null), "window=herald") - -/datum/phenomena/create_gateway - name = "Create Gateway" - desc = "Creates a gateway from this world to the next. Gateways syphon absurd amounts of power but can be sacrificed to summon powerful minions." - cost = 200 - flags = PHENOMENA_NEAR_STRUCTURE - expected_type = /atom - -/datum/phenomena/create_gateway/can_activate(var/atom/a) - if(!..()) - return 0 - if(istype(a, /obj/structure/deity/gateway)) - var/obj/structure/deity/gateway/G = a - if(G.linked_god == linked) - return 1 - var/turf/T = get_turf(a) - if(!T || T.density) - return 0 - for(var/i in T) - var/atom/at = i - if(at.density) - return 0 - return 1 - -/datum/phenomena/create_gateway/activate(var/atom/a) - ..() - if(istype(a, /obj/structure/deity/gateway)) - qdel(a) - else - new /obj/structure/deity/gateway(get_turf(a), linked) - -/datum/phenomena/flickering_whisper - name = "Flickering Whisper" - desc = "Whisper to a non-believer, allowing you to intrude on their thoughts and see what they see." - flags = PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomena/flickering_whisper/activate(var/mob/living/L) - var/atom/whisper_from - for(var/obj/structure/deity/radiant_statue/rs in view(3, L)) - whisper_from = rs - break - var/message = sanitize(input(linked, "What is your message?", null) as null|text) - if(!linked || !message || QDELETED(src)) - return - to_chat(L, SPAN_OCCULT("[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_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 - linked.eyenet.remove_source(viewer) - events_repository.unregister(/decl/observ/destroyed, viewer, src) - -/datum/phenomena/burning_glare - name = "Burning Glare" - desc = "Burn a victim. If they are burnt enough, you'll set them ablaze." - cost = 100 - flags = PHENOMENA_NONFOLLOWER|PHENOMENA_NEAR_STRUCTURE - cooldown = 30 SECONDS - expected_type = /mob/living - -/datum/phenomena/burning_glare/activate(var/mob/living/L) - ..() - to_chat(L, SPAN_DANGER("You feel yourself burn!")) - L.take_damage(10, BURN) - if(L.get_damage(BURN) > 60) - L.fire_stacks += 50 - L.IgniteMob() - -/datum/phenomena/divine_right - name = "Divine Right" - desc = "Trigger your rebirth into the body of someone wearing a herald's uniform. This takes time, requires 3 open gateways, and if the body is destroyed during the ritual... so are you. But once complete, you become an unstoppable demigod of unnatural power." - cost = 300 - cooldown = 180 SECONDS - flags = PHENOMENA_FOLLOWER|PHENOMENA_NEAR_STRUCTURE - expected_type = /mob/living - -/datum/phenomena/divine_right/can_activate(var/mob/living/L) - if(!..()) - return FALSE - var/active_gateways = 0 - for(var/obj/structure/deity/gateway/G in linked.structures) - active_gateways += 1 - - if(active_gateways < 3) - to_chat(linked, SPAN_WARNING("You do not have enough gateways activated.")) - return FALSE - - var/obj/O = L.get_equipped_item(slot_wear_suit_str) - if(O && has_extension(O, /datum/extension/deity_be_near)) - var/datum/extension/deity_be_near/dbn = get_extension(O, /datum/extension/deity_be_near) - if(dbn.wearing_full()) - return TRUE - to_chat(linked, SPAN_WARNING("\The [L] is not wearing a herald's uniform.")) - return FALSE - -/datum/phenomena/divine_right/activate(var/mob/living/L) - ..() - to_chat(L, SPAN_OCCULT("Your soul is ripped from your body as your master prepares to possess it.")) - to_chat(linked, SPAN_OCCULT("You prepare the body for possession. Keep it safe. If it is totally destroyed, you will die.")) - L.ghostize() - 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_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) - to_chat(player, SPAN_OCCULT("Something bad is coming.... you know you don't have much time. Find and destroy the vessel, before its too late.")) - else if(player != linked && !linked.is_follower(player, silent = 1)) - to_chat(player, SPAN_WARNING("The world swims around you for just a moment... something is wrong. Very wrong.")) - else - to_chat(player, SPAN_NOTICE("Your Master is being reborn into the body of \the [L]. Protect it at all costs.")) - -/datum/phenomena/divine_right/proc/fail_ritual(var/mob/living/L) - qdel(linked) - -/datum/phenomena/divine_right/proc/succeed_ritual(var/mob/living/L) - to_chat(linked, SPAN_OCCULT("You have been reborn! Your power is limited here, focused on your body, but in return you are both eternal and physical.")) - for(var/mob/living/player in global.player_list) - sound_to(player, 'sound/effects/cascade.ogg') - to_chat(player, SPAN_OCCULT("\The [linked] has been born into flesh. Kneel to its authority or else.")) - linked.mind.transfer_to(L) - L.SetName("[linked] Incarnate") - L.real_name = "[linked] Incarnate" - -/datum/phenomena/movable_object/wisp - name = "Wisp" - desc = "Creates or moves a small ball of light for your followers to use." - cost = 30 - object_type = /obj/item/flashlight/slime - -/datum/phenomena/movable_object/wisp/add_object() - ..() - object_to_move.SetName("wisp") \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm b/mods/gamemodes/deity/mobs/phenomena/transmutation.dm deleted file mode 100644 index e86c92ec4d4..00000000000 --- a/mods/gamemodes/deity/mobs/phenomena/transmutation.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/phenomena/warp - name = "Warp Body" - desc = "Corrupt a mortal being, causing their DNA to break and their body to fail on them." - cost = 90 - cooldown = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_MUNDANE|PHENOMENA_FOLLOWER|PHENOMENA_NONFOLLOWER - expected_type = /mob/living - -/datum/phenomena/warp/activate(var/mob/living/L) - ..() - L.take_damage(20, CLONE) - SET_STATUS_MAX(L, STAT_WEAK, 2) - to_chat(L, SPAN_DANGER("You feel your body warp and change underneath you!")) - -/datum/phenomena/rock_form - name = "Rock Form" - desc = "Convert your mortal followers into immortal stone beings." - cost = 300 - flags = PHENOMENA_NEAR_STRUCTURE|PHENOMENA_FOLLOWER - expected_type = /mob/living/human - -/datum/phenomena/rock_form/activate(var/mob/living/human/H) - ..() - to_chat(H, SPAN_DANGER("You feel your body harden as it rapidly is transformed into living crystal!")) - H.change_species(SPECIES_GOLEM) - SET_STATUS_MAX(H, STAT_WEAK, 5) \ No newline at end of file diff --git a/mods/gamemodes/deity/mobs/say.dm b/mods/gamemodes/deity/mobs/say.dm deleted file mode 100644 index 1dab1a38aa3..00000000000 --- a/mods/gamemodes/deity/mobs/say.dm +++ /dev/null @@ -1,9 +0,0 @@ -/mob/living/deity/say(var/message, var/decl/language/speaking = null, var/verb="says") - if(!..()) - return 0 - if(pylon) - pylon.audible_message("\The [pylon] reverberates, \"[message]\"") - else - for(var/m in minions) - var/datum/mind/mind = m - to_chat(mind.current, "[message]") \ No newline at end of file diff --git a/mods/gamemodes/deity/overrides.dm b/mods/gamemodes/deity/overrides.dm deleted file mode 100644 index c052abdf9a2..00000000000 --- a/mods/gamemodes/deity/overrides.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/item/sword/cultblade/can_use_safely(mob/living/user) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - return ..() || (user.mind in godcult.current_antagonists) - -/datum/reagents/Topic(href, href_list) - . = ..() - if(!. && href_list["deconvert"]) - var/list/data = REAGENT_DATA(src, /decl/material/liquid/water) - if(LAZYACCESS(data, "holy")) - var/mob/living/target = locate(href_list["deconvert"]) - if(istype(target) && !QDELETED(target) && target.mind) - var/decl/special_role/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.remove_antagonist(target.mind, TRUE) - -/decl/material/liquid/water/affect_holy(mob/living/M, removed, datum/reagents/holder) - . = ..() - if(.) - return . - 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.take_damage(5, PAIN, do_update_health = FALSE) - M.take_damage(1, BRUTE) - if(prob(10)) //Only annoy them a /bit/ - to_chat(M, SPAN_DANGER("You feel your insides curdle and burn! \[Give Into Purity\]")) - return TRUE - return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/screen/intent.dm b/mods/gamemodes/deity/screen/intent.dm deleted file mode 100644 index 80b3a423170..00000000000 --- a/mods/gamemodes/deity/screen/intent.dm +++ /dev/null @@ -1,44 +0,0 @@ -/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/mods/gamemodes/deity/spells/boon.dm b/mods/gamemodes/deity/spells/boon.dm deleted file mode 100644 index 269a0b4bc4c..00000000000 --- a/mods/gamemodes/deity/spells/boon.dm +++ /dev/null @@ -1,11 +0,0 @@ -/spell - var/mob/living/deity/connected_god //Do we have this spell based off a boon from a god? - -/spell/proc/set_connected_god(var/mob/living/deity/god) - connected_god = god - -// todo: godform check_charge to parallel take_charge. currently a boon always succeeds -/spell/take_charge(mob/user, skipcharge) - if(connected_god) - return connected_god.take_charge(user, max(1, charge_max/10)) - return ..() \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/construction.dm b/mods/gamemodes/deity/spells/construction.dm deleted file mode 100644 index 0005154ad6e..00000000000 --- a/mods/gamemodes/deity/spells/construction.dm +++ /dev/null @@ -1,55 +0,0 @@ -#define CONSTRUCT_SPELL_COST 1 -#define CONSTRUCT_SPELL_TYPE 2 - -/spell/construction - name = "Basic Construction" - desc = "This ability will let you summon a structure of your choosing." - - cast_delay = 10 - charge_max = 100 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - hud_state = "const_wall" - cast_sound = 'sound/effects/meteorimpact.ogg' - -/spell/construction/choose_targets() - var/list/possible_targets = list() - if(connected_god && connected_god.form) - for(var/type in connected_god.form.buildables) - var/cost = 10 - if(ispath(type, /obj/structure/deity)) - var/obj/structure/deity/D = type - cost = initial(D.build_cost) - possible_targets["[connected_god.get_type_name(type)] - [cost]"] = list(cost, type) - var/choice = input("Construct to build.", "Construction") as null|anything in possible_targets - if(!choice) - return - if(locate(/obj/structure/deity) in get_turf(holder)) - return - - return possible_targets[choice] - else - return - -/spell/construction/cast_check(var/skipcharge, var/mob/user, var/list/targets) - if(!..()) - return 0 - var/turf/T = get_turf(user) - if(skipcharge && !valid_deity_structure_spot(targets[CONSTRUCT_SPELL_TYPE], T, connected_god, user)) - return 0 - else - for(var/obj/O in T) - if(O.density) - to_chat(user, SPAN_WARNING("Something here is blocking your construction!")) - return 0 - return 1 - -/spell/construction/cast(var/target, mob/user) - charge_max = target[CONSTRUCT_SPELL_COST] - target = target[CONSTRUCT_SPELL_TYPE] - var/turf/T = get_turf(user) - new target(T, connected_god) -#undef CONSTRUCT_SPELL_COST -#undef CONSTRUCT_SPELL_TYPE \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/open_gateway.dm b/mods/gamemodes/deity/spells/open_gateway.dm deleted file mode 100644 index db83a05c891..00000000000 --- a/mods/gamemodes/deity/spells/open_gateway.dm +++ /dev/null @@ -1,34 +0,0 @@ -/spell/open_gateway - name = "Open Gateway" - desc = "Open a gateway for your master. Don't do it for too long, or you will die." - - charge_max = 600 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - number_of_channels = 0 - time_between_channels = 200 - hud_state = "const_wall" - cast_sound = 'sound/effects/meteorimpact.ogg' - -/spell/open_gateway/choose_targets() - var/mob/living/spellcaster = holder - var/turf/source_turf = get_turf(spellcaster) - holder.visible_message(SPAN_NOTICE("A gateway opens up underneath \the [spellcaster]!")) - var/deity - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - if(spellcaster.mind && (spellcaster.mind in godcult.current_antagonists)) - deity = godcult.get_deity(spellcaster.mind) - return list(new /obj/structure/deity/gateway(source_turf, deity)) - -/spell/open_gateway/cast(var/list/targets, var/mob/holder, var/channel_count) - if(prob((channel_count / 5) * 100)) - to_chat(holder, SPAN_DANGER("If you hold the portal open for much longer you'll be ripped apart!")) - if(channel_count == 6) - to_chat(holder, SPAN_DANGER("The gateway consumes you... leaving nothing but dust.")) - holder.dust() - - -/spell/open_gateway/after_spell(var/list/targets) - QDEL_NULL_LIST(targets) \ No newline at end of file diff --git a/mods/gamemodes/deity/spells/vision.dm b/mods/gamemodes/deity/spells/vision.dm deleted file mode 100644 index dabe6cf4fca..00000000000 --- a/mods/gamemodes/deity/spells/vision.dm +++ /dev/null @@ -1,21 +0,0 @@ -/spell/camera_connection/god_vision - name = "All Seeing Eye" - desc = "See what your master sees." - - charge_max = 10 - spell_flags = Z2NOCAST - invocation = "none" - invocation_type = SpI_NONE - - extension_type = /datum/extension/eye/freelook - - hud_state = "gen_mind" - -/spell/camera_connection/god_vision/set_connected_god(var/mob/living/deity/god) - ..() - - var/datum/extension/eye/freelook/fl = get_extension(src, /datum/extension/eye) - if(!fl) - return - fl.set_visualnet(god.eyenet) - diff --git a/mods/gamemodes/deity/structures/altar.dm b/mods/gamemodes/deity/structures/altar.dm deleted file mode 100644 index 888e4c935a9..00000000000 --- a/mods/gamemodes/deity/structures/altar.dm +++ /dev/null @@ -1,106 +0,0 @@ -/obj/structure/deity/altar - name = "altar" - desc = "A structure made for the express purpose of religion." - current_health = 50 - power_adjustment = 5 - deity_flags = DEITY_STRUCTURE_ALONE - build_cost = 1000 - var/mob/living/target - var/cycles_before_converted = 5 - var/next_cycle = 0 - -/obj/structure/deity/altar/Destroy() - if(target) - remove_target() - if(linked_god) - to_chat(src, SPAN_DANGER("You've lost an altar!")) - return ..() - -/obj/structure/deity/altar/grab_attack(obj/item/grab/grab, mob/user) - var/mob/living/victim = grab.get_affecting_mob() - if(grab.force_danger() && istype(victim)) - victim.dropInto(loc) - SET_STATUS_MAX(victim, STAT_WEAK, 1) - user.visible_message(SPAN_WARNING("\The [user] throws \the [victim] onto \the [src]!")) - qdel(grab) - return TRUE - return ..() - -/obj/structure/deity/altar/Process() - if(!target || world.time < next_cycle) - return - if(!linked_god || target.stat) - to_chat(linked_god, SPAN_WARNING("\The [target] has lost consciousness, breaking \the [src]'s hold on their mind!")) - remove_target() - return - - next_cycle = world.time + 10 SECONDS - cycles_before_converted-- - if(!cycles_before_converted) - src.visible_message("For one thundering moment, \the [target] cries out in pain before going limp and broken.") - var/decl/special_role/godcultist/godcult = GET_DECL(/decl/special_role/godcultist) - godcult.add_antagonist_mind(target.mind,1, "Servant of [linked_god]","Your loyalty may be faulty, but you know that it now has control over you...", specific_god=linked_god) - remove_target() - return - - switch(cycles_before_converted) - if(4) - text = "You can't think straight..." - if(3) - text = "You feel like your thought are being overriden..." - if(2) - text = "You can't... concentrate... must... resist!" - if(1) - text = "Can't... resist... anymore." - to_chat(linked_god, SPAN_WARNING("\The [target] is getting close to conversion!")) - to_chat(target, "[text]. Resist Conversion") - - -//Used for force conversion. -/obj/structure/deity/altar/proc/set_target(var/mob/living/L) - if(target || !linked_god) - return - cycles_before_converted = initial(cycles_before_converted) - START_PROCESSING(SSobj, src) - target = L - update_icon() - 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) - events_repository.unregister(/decl/observ/destroyed, target, src) - events_repository.unregister(/decl/observ/moved, target, src) - events_repository.unregister(/decl/observ/death, target, src) - target = null - update_icon() - -/obj/structure/deity/altar/OnTopic(var/user, var/list/href_list) - if(href_list["resist"]) - var/mob/living/M = locate(href_list["resist"]) - if(!istype(M) || target != M || M.stat || M.is_on_special_ability_cooldown()) - return TOPIC_HANDLED - - M.set_special_ability_cooldown(10 SECONDS) - M.visible_message(SPAN_WARNING("\The [M] writhes on top of \the [src]!"), SPAN_NOTICE("You struggle against the intruding thoughts, keeping them at bay!")) - to_chat(linked_god, SPAN_WARNING("\The [M] slows its conversion through willpower!")) - cycles_before_converted++ - if(prob(50)) - to_chat(M, SPAN_DANGER("The mental strain is too much for you! You feel your body weakening!")) - M.take_damage(15, TOX, do_update_health = FALSE) - M.take_damage(30, PAIN) - return TOPIC_REFRESH - -/obj/structure/deity/altar/on_update_icon() - ..() - if(target) - add_overlay(image('icons/effects/effects.dmi', icon_state = "summoning")) - -/obj/structure/deity/altar/nullrod_act(mob/user, obj/item/nullrod/rod) - if(!linked_god.silenced) //Don't want them to infinity spam it. - linked_god.silence(10) - new /obj/effect/temporary(get_turf(src),'icons/effects/effects.dmi',"purple_electricity_constant", 10) - visible_message(SPAN_NOTICE("\The [src] groans in protest as reality settles around \the [rod].")) - return TRUE - return FALSE \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/blood_forge.dm b/mods/gamemodes/deity/structures/blood_forge.dm deleted file mode 100644 index 3b23da40630..00000000000 --- a/mods/gamemodes/deity/structures/blood_forge.dm +++ /dev/null @@ -1,66 +0,0 @@ -/obj/structure/deity/blood_forge - name = "unholy forge" - desc = "This forge gives off no heat, no light, its flames look almost unnatural." - icon_state = "forge" - build_cost = 1000 - current_health = 50 - var/busy = 0 - var/recipe_feat_list = "Blood Crafting" - var/text_modifications = list( - "Cost" = "Blood", - "Dip" = "fire. Pain envelops you as blood seeps out of your hands and you begin to shape it into something more useful", - "Shape" = "You shape the fire as more and more blood comes out.", - "Out" = "flames" - ) - - power_adjustment = 2 - -/obj/structure/deity/blood_forge/attack_hand(var/mob/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return ..() - var/list/recipes = linked_god.feats[recipe_feat_list] - if(!recipes) - return TRUE - var/dat = "
      Recipes


      Item - [text_modifications["Cost"]] Cost
      " - for(var/type in recipes) - var/atom/a = type - var/cost = recipes[type] - dat += "[initial(a.name)] - [cost]
      [initial(a.desc)]

      " - show_browser(user, dat, "window=forge") - return TRUE - -/obj/structure/deity/blood_forge/CanUseTopic(var/user) - if(!linked_god || !linked_god.is_follower(user, silent = 1) || !ishuman(user)) - return STATUS_CLOSE - return ..() - -/obj/structure/deity/blood_forge/OnTopic(var/user, var/list/href_list) - if(href_list["make_recipe"]) - var/list/recipes = linked_god.feats[recipe_feat_list] - var/type = locate(href_list["make_recipe"]) in recipes - if(type) - var/cost = recipes[type] - craft_item(type, cost, user) - return TOPIC_REFRESH - -/obj/structure/deity/blood_forge/proc/craft_item(var/path, var/blood_cost, var/mob/user) - if(busy) - to_chat(user, SPAN_WARNING("Someone is already using \the [src]!")) - return - - busy = 1 - to_chat(user, SPAN_NOTICE("You dip your hands into \the [src]'s [text_modifications["Dip"]]")) - for(var/count = 0, count < blood_cost/10, count++) - if(!do_after(user, 50,src)) - busy = 0 - return - user.visible_message("\The [user] swirls their hands in \the [src].", text_modifications["Shape"]) - if(linked_god) - linked_god.take_charge(user, 10) - var/obj/item/I = new path(get_turf(src)) - user.visible_message("\The [user] pull out \the [I] from the [text_modifications["Out"]].", "You pull out the completed [I] from the [text_modifications["Out"]].") - busy = 0 - -/obj/structure/deity/blood_forge/proc/take_charge(var/mob/living/user, var/charge) - if(linked_god) - linked_god.take_charge(user, charge) \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/pylon.dm b/mods/gamemodes/deity/structures/pylon.dm deleted file mode 100644 index 4b977e2726d..00000000000 --- a/mods/gamemodes/deity/structures/pylon.dm +++ /dev/null @@ -1,75 +0,0 @@ - -/obj/structure/deity/pylon - name = "pylon" - desc = "A crystal platform used to communicate with the deity." - build_cost = 400 - icon = 'icons/obj/structures/pylon.dmi' - icon_state = "pylon" - var/list/intuned = list() - -/obj/structure/deity/pylon/attack_deity(var/mob/living/deity/D) - if(D.pylon == src) - D.leave_pylon() - else - D.possess_pylon(src) - -/obj/structure/deity/pylon/Destroy() - if(linked_god && linked_god.pylon == src) - linked_god.leave_pylon() - return ..() - -/obj/structure/deity/pylon/attack_hand(var/mob/L) - SHOULD_CALL_PARENT(FALSE) - if(!linked_god) - return FALSE - if(L in intuned) - remove_intuned(L) - else - add_intuned(L) - return TRUE - -/obj/structure/deity/pylon/proc/add_intuned(var/mob/living/L) - if(L in intuned) - return - to_chat(L, SPAN_NOTICE("You place your hands on \the [src], feeling yourself intune to its vibrations.")) - intuned += L - 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)) - return - to_chat(L, SPAN_WARNING("You no longer feel intuned to \the [src].")) - intuned -= L - events_repository.unregister(/decl/observ/destroyed, L, src) - -/obj/structure/deity/pylon/OnTopic(var/mob/living/human/user, var/href_list) - if(href_list["vision_jump"]) - if(istype(user)) - to_chat(user,SPAN_WARNING("You feel your body lurch uncomfortably as your consciousness jumps to \the [src]")) - if(prob(5)) - user.vomit() - else - to_chat(user, SPAN_NOTICE("You jump to \the [src]")) - if(user.eyeobj) - user.eyeobj.setLoc(locate(href_list["vision_jump"])) - else - CRASH("[user] does not have an eyeobj") - . = TOPIC_REFRESH - . = ..() - -/obj/structure/deity/pylon/hear_talk(mob/M, text, verb, decl/language/speaking) - if(!linked_god) - return - if(linked_god.pylon != src) - if(!(M in intuned)) - return - for(var/obj/structure/deity/pylon/P in linked_god.structures) - if(P == src || linked_god.pylon == P) - continue - P.audible_message("\The [P] resonates, \"[text]\"") - to_chat(linked_god, "[html_icon(src)] [M] (P) [verb], [linked_god.pylon == src ? "" : ""]\"[text]\"[linked_god.pylon == src ? "" : ""]") - if(linked_god.minions.len) - for(var/minion in linked_god.minions) - var/datum/mind/mind = minion - if(mind.current && mind.current.eyeobj) //If it is currently having a vision of some sort - to_chat(mind.current,"[html_icon(src)] [M] (J) [verb], \"[text]\"") diff --git a/mods/gamemodes/deity/structures/structures.dm b/mods/gamemodes/deity/structures/structures.dm deleted file mode 100644 index c3d9ea65b30..00000000000 --- a/mods/gamemodes/deity/structures/structures.dm +++ /dev/null @@ -1,68 +0,0 @@ -/proc/valid_deity_structure_spot(var/type, var/turf/target, var/mob/living/deity/deity, var/mob/living/user) - var/obj/structure/deity/D = type - var/flags = initial(D.deity_flags) - - if(flags & DEITY_STRUCTURE_NEAR_IMPORTANT && !deity.near_structure(target)) - if(user) - to_chat(user, SPAN_WARNING("You need to be near \a [deity.get_type_name(/obj/structure/deity/altar)] to build this!")) - return 0 - - if(flags & DEITY_STRUCTURE_ALONE) - for(var/structure in deity.structures) - if(istype(structure,type) && get_dist(target,structure) <= 3) - if(user) - to_chat(user, SPAN_WARNING("You are too close to another [deity.get_type_name(type)]!")) - return 0 - return 1 - -/obj/structure/deity - icon = 'icons/obj/cult.dmi' - max_health = 10 - density = TRUE - anchored = TRUE - icon_state = "tomealtar" - is_spawnable_type = FALSE // will usually runtime without a linked god - - var/mob/living/deity/linked_god - var/power_adjustment = 1 //How much power we get/lose - var/build_cost = 0 //How much it costs to build this item. - var/deity_flags = DEITY_STRUCTURE_NEAR_IMPORTANT - -/obj/structure/deity/Initialize(mapload, var/god) - . = ..(mapload) - if(god) - linked_god = god - linked_god.form.sync_structure(src) - linked_god.adjust_source(power_adjustment, src) - -/obj/structure/deity/Destroy() - if(linked_god) - linked_god.adjust_source(-power_adjustment, src) - linked_god = null - return ..() - -/obj/structure/deity/attackby(obj/item/W, mob/user) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(src) - playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 50, 1) - user.visible_message( - SPAN_DANGER("[user] hits \the [src] with \the [W]!"), - SPAN_DANGER("You hit \the [src] with \the [W]!"), - SPAN_DANGER("You hear something breaking!") - ) - take_damage(W.get_attack_force(user), W.atom_damage_type) - -/obj/structure/deity/physically_destroyed(mob/user) - SHOULD_CALL_PARENT(FALSE) - qdel(src) - . = TRUE - -/obj/structure/deity/physically_destroyed(var/skip_qdel) - visible_message(SPAN_DANGER("\The [src] crumbles!")) - . = ..() - -/obj/structure/deity/bullet_act(var/obj/item/projectile/P) - take_damage(P.damage, P.atom_damage_type) - -/obj/structure/deity/proc/attack_deity(var/mob/living/deity/deity) - return \ No newline at end of file diff --git a/mods/gamemodes/deity/structures/trap.dm b/mods/gamemodes/deity/structures/trap.dm deleted file mode 100644 index 240050d33b9..00000000000 --- a/mods/gamemodes/deity/structures/trap.dm +++ /dev/null @@ -1,30 +0,0 @@ -/obj/structure/deity/trap - density = FALSE - current_health = 1 - var/triggered = 0 - -/obj/structure/deity/trap/Initialize() - . = ..() - 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) - return ..() - -/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, TYPE_PROC_REF(/obj/structure/deity/trap, trigger)) - -/obj/structure/deity/trap/attackby(obj/item/W, mob/user) - trigger(user) - return ..() - -/obj/structure/deity/trap/bullet_act() - return - -/obj/structure/deity/trap/proc/trigger(var/atom/entered, var/atom/movable/enterer) - if(triggered > world.time || !isliving(enterer)) - return - - triggered = world.time + 30 SECONDS \ No newline at end of file diff --git a/mods/gamemodes/heist/_heist.dme b/mods/gamemodes/heist/_heist.dme index 57bf5c58b42..de2a67d69d3 100644 --- a/mods/gamemodes/heist/_heist.dme +++ b/mods/gamemodes/heist/_heist.dme @@ -1,13 +1,5 @@ #ifndef GAMEMODE_PACK_HEIST #define GAMEMODE_PACK_HEIST - -#ifdef MODPACK_VOX -#warn Vox modpack loaded before Heist modpack, compatibility features will be missing. -#endif -#ifdef GAMEMODE_PACK_MIXED -#warn Mixed gamemodes modpack loaded before Heist modpack, Heist combination modes will be missing. -#endif - // BEGIN_INCLUDE #include "_heist.dm" #include "areas.dm" diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm index cd92f5dc909..71eeb7977d4 100644 --- a/mods/gamemodes/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -160,7 +160,7 @@ /area/map_template/syndicate_mothership/raider_base) "aK" = ( /obj/structure/bed, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/structure/sign/painting/monkey_painting{ pixel_x = -28; pixel_y = 4 @@ -317,7 +317,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bf" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bg" = ( @@ -371,7 +371,7 @@ /turf/unsimulated/floor/freezer, /area/map_template/syndicate_mothership/raider_base) "bo" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/effect/floor_decal/carpet{ dir = 8 }, @@ -380,7 +380,7 @@ /turf/unsimulated/floor/carpet, /area/map_template/syndicate_mothership/raider_base) "bp" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/random/action_figure, /obj/random/contraband, /obj/random/junk, @@ -421,7 +421,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bv" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/air/airlock, /obj/structure/window/reinforced{ @@ -435,7 +435,7 @@ /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bx" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/unsimulated/floor/plating, @@ -505,36 +505,36 @@ /turf/unsimulated/floor/carpet, /area/map_template/syndicate_mothership/raider_base) "bJ" = ( -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "bK" = ( -/turf/unsimulated/floor/wood/broken, +/turf/unsimulated/floor/laminate/broken, /area/map_template/syndicate_mothership/raider_base) "bL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/plate/tray{ pixel_y = 5 }, /obj/item/backpack, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "bM" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/box/glasses/rocks, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "bN" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/machinery/chemical_dispenser/bar_soft/full, -/turf/unsimulated/floor/wood/broken6, +/turf/unsimulated/floor/laminate/broken6, /area/map_template/syndicate_mothership/raider_base) "bO" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/washing_machine, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bP" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 4 }, @@ -558,14 +558,14 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/machinery/atmospherics/portables_connector{ dir = 8 }, /turf/unsimulated/floor/plating, /area/map_template/syndicate_mothership/raider_base) "bS" = ( -/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/visible, /obj/effect/floor_decal/industrial/hatch/yellow, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/unsimulated/floor/plating, @@ -580,33 +580,33 @@ /area/map_template/syndicate_mothership/raider_base) "bV" = ( /obj/item/stool/padded, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "bW" = ( /obj/effect/decal/cleanable/generic, /obj/item/stool/padded, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "bZ" = ( /obj/machinery/acting/changer, /turf/unsimulated/floor/dark, /area/map_template/syndicate_mothership/raider_base) "ca" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/pizzabox/meat, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "cb" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/ashtray, /obj/item/trash/cigbutt/cigarbutt, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "cc" = ( -/obj/structure/table/woodentable, +/obj/structure/table/laminate, /obj/item/chems/glass/rag, /obj/random/loot, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "cd" = ( /obj/machinery/vending/cigarette{ @@ -631,11 +631,11 @@ /turf/unsimulated/floor/dark, /area/map_template/syndicate_mothership/raider_base) "ch" = ( -/turf/unsimulated/floor/wood/broken1, +/turf/unsimulated/floor/laminate/broken1, /area/map_template/syndicate_mothership/raider_base) "ci" = ( /obj/item/stool/padded, -/turf/unsimulated/floor/wood/broken1, +/turf/unsimulated/floor/laminate/broken1, /area/map_template/syndicate_mothership/raider_base) "cj" = ( /mob/living/simple_animal/hostile/parrot/pirate, @@ -664,11 +664,11 @@ icon_state = "plant-25"; name = "Jamie" }, -/turf/unsimulated/floor/wood, +/turf/unsimulated/floor/laminate, /area/map_template/syndicate_mothership/raider_base) "cn" = ( /obj/structure/reagent_dispensers/beerkeg, -/turf/unsimulated/floor/wood/broken1, +/turf/unsimulated/floor/laminate/broken1, /area/map_template/syndicate_mothership/raider_base) "co" = ( /obj/machinery/embedded_controller/radio/simple_docking_controller{ @@ -1149,7 +1149,7 @@ "dB" = ( /obj/structure/rack, /obj/item/gun/launcher/bow/crossbow/powered, -/obj/item/stack/material/rods/ten, +/obj/item/stack/material/rods/mapped/steel/ten, /obj/machinery/light/small{ dir = 8 }, diff --git a/mods/gamemodes/heist/outfit.dm b/mods/gamemodes/heist/outfit.dm index 5800150a525..fc04cd39238 100644 --- a/mods/gamemodes/heist/outfit.dm +++ b/mods/gamemodes/heist/outfit.dm @@ -66,16 +66,16 @@ randomize_clothing() . = ..() -/decl/outfit/raider/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/outfit/raider/equip_outfit(mob/living/wearer, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) randomize_clothing() . = ..() - if(. && H) - if(!H.get_equipped_item(slot_shoes_str)) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes_str) + if(. && wearer) + if(!wearer.get_equipped_item(slot_shoes_str)) + wearer.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wearer), slot_shoes_str) var/new_gun = pick(raider_guns) var/new_holster = pick(raider_holster) //raiders don't start with any backpacks, so let's be nice and give them a holster if they can use it. - var/turf/T = get_turf(H) + var/turf/T = get_turf(wearer) var/obj/item/primary = new new_gun(T) var/obj/item/clothing/webbing/holster/holster = null @@ -89,38 +89,38 @@ holster_extension.holstered = secondary secondary.forceMove(holster) else - H.equip_to_slot_or_del(secondary, slot_belt_str) + wearer.equip_to_slot_or_del(secondary, slot_belt_str) if(primary.slot_flags & SLOT_HOLSTER) holster = new new_holster(T) var/datum/extension/holster/holster_extension = get_extension(holster, /datum/extension/holster) holster_extension.holstered = primary primary.forceMove(holster) - else if(!H.get_equipped_item(slot_belt_str) && (primary.slot_flags & SLOT_LOWER_BODY)) - H.equip_to_slot_or_del(primary, slot_belt_str) - else if(!H.get_equipped_item(slot_back_str) && (primary.slot_flags & SLOT_BACK)) - H.equip_to_slot_or_del(primary, slot_back_str) + else if(!wearer.get_equipped_item(slot_belt_str) && (primary.slot_flags & SLOT_LOWER_BODY)) + wearer.equip_to_slot_or_del(primary, slot_belt_str) + else if(!wearer.get_equipped_item(slot_back_str) && (primary.slot_flags & SLOT_BACK)) + wearer.equip_to_slot_or_del(primary, slot_back_str) else - H.put_in_hands(primary) + wearer.put_in_hands(primary) if(istype(primary, /obj/item/gun/projectile)) var/obj/item/gun/projectile/bullet_thrower = primary if(bullet_thrower.magazine_type) - H.equip_to_slot_or_del(new bullet_thrower.magazine_type(H), slot_l_store_str) + wearer.equip_to_slot_or_del(new bullet_thrower.magazine_type(wearer), slot_l_store_str) if(prob(20)) //don't want to give them too much - H.equip_to_slot_or_del(new bullet_thrower.magazine_type(H), slot_r_store_str) + wearer.equip_to_slot_or_del(new bullet_thrower.magazine_type(wearer), slot_r_store_str) else if(bullet_thrower.ammo_type) - var/obj/item/box/ammobox = new(get_turf(H.loc)) + var/obj/item/box/ammobox = new(get_turf(wearer.loc)) for(var/i in 1 to rand(3,5) + rand(0,2)) new bullet_thrower.ammo_type(ammobox) - H.put_in_hands(ammobox) + wearer.put_in_hands(ammobox) if(holster) - var/obj/item/clothing/uniform = H.get_equipped_item(slot_w_uniform_str) + var/obj/item/clothing/uniform = wearer.get_equipped_item(slot_w_uniform_str) if(istype(uniform) && uniform.can_attach_accessory(holster)) - uniform.attackby(holster, H) + uniform.attackby(holster, wearer) else - H.put_in_hands(holster) + wearer.put_in_hands(holster) /decl/outfit/raider/proc/randomize_clothing() shoes = pick(raider_shoes) diff --git a/mods/gamemodes/meteor/gamemode.dm b/mods/gamemodes/meteor/gamemode.dm index 10212d20aa9..5836f1ad154 100644 --- a/mods/gamemodes/meteor/gamemode.dm +++ b/mods/gamemodes/meteor/gamemode.dm @@ -93,8 +93,7 @@ /obj/effect/meteor/irradiated=10, /obj/effect/meteor/golden=10, /obj/effect/meteor/silver=10, - /obj/effect/meteor/flaming=10, - /obj/effect/meteor/supermatter=1 + /obj/effect/meteor/flaming=10 ) // As a bonus, more frequent events. diff --git a/mods/gamemodes/mixed.dm b/mods/gamemodes/mixed.dm new file mode 100644 index 00000000000..f89baef2aa8 --- /dev/null +++ b/mods/gamemodes/mixed.dm @@ -0,0 +1,7 @@ +#ifndef GAMEMODE_PACK_MIXED +#define GAMEMODE_PACK_MIXED +#endif + +// This modpack doesn't actually have anything here, and instead it uses the compatibility patch system to make load order not matter. +/decl/modpack/mixed_modes + name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dm b/mods/gamemodes/mixed/_mixed.dm deleted file mode 100644 index c1c9167d414..00000000000 --- a/mods/gamemodes/mixed/_mixed.dm +++ /dev/null @@ -1,2 +0,0 @@ -/decl/modpack/mixed_modes - name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme deleted file mode 100644 index 6db33d07706..00000000000 --- a/mods/gamemodes/mixed/_mixed.dme +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef GAMEMODE_PACK_MIXED -#define GAMEMODE_PACK_MIXED -// BEGIN_INCLUDE -#include "_mixed.dm" -#if defined(GAMEMODE_PACK_HEIST) // TODO: && defined(GAMEMODE_PACK_MERCENARY) -#include "crossfire.dm" -#endif -#if defined(GAMEMODE_PACK_REVOLUTIONARY) -#include "siege.dm" -#endif -#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) -#include "uprising.dm" -#endif -// END_INCLUDE -#endif \ No newline at end of file diff --git a/mods/gamemodes/ninja/maps/ninja_base.dmm b/mods/gamemodes/ninja/maps/ninja_base.dmm index fcda23c484b..828d006063e 100644 --- a/mods/gamemodes/ninja/maps/ninja_base.dmm +++ b/mods/gamemodes/ninja/maps/ninja_base.dmm @@ -407,22 +407,22 @@ /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) "bw" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/machinery/chemical_dispenser/bar_soft/full, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) "bx" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/box/glasses, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) "by" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/box/sinpockets, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) "bz" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/machinery/microwave, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) @@ -464,7 +464,7 @@ /turf/unsimulated/floor/freezer, /area/map_template/ninja_dojo/dojo) "bF" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/chems/drinks/dry_ramen, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) @@ -494,7 +494,7 @@ /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) "bL" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/flashlight/lamp, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) @@ -539,7 +539,7 @@ /turf/unsimulated/floor/carpet, /area/map_template/ninja_dojo/dojo) "bS" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/food/soylentgreen, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) @@ -560,7 +560,7 @@ /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) "bW" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/toy/figure/wizard, /obj/item/radio/intercom/ninja{ dir = 1; @@ -569,7 +569,7 @@ /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) "bX" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/clothing/shoes/sandal, /obj/item/clothing/mask/balaclava, /turf/unsimulated/floor/wood, @@ -585,7 +585,7 @@ /turf/unsimulated/floor/freezer, /area/map_template/ninja_dojo/dojo) "ca" = ( -/obj/structure/table/woodentable, +/obj/structure/table/wood, /obj/item/flame/candle, /turf/unsimulated/floor/wood, /area/map_template/ninja_dojo/dojo) diff --git a/mods/gamemodes/traitor/overrides.dm b/mods/gamemodes/traitor/overrides.dm index 122c6cf5daa..0f8142a1635 100644 --- a/mods/gamemodes/traitor/overrides.dm +++ b/mods/gamemodes/traitor/overrides.dm @@ -3,18 +3,12 @@ return mind && traitors.is_antagonist(mind) /mob/living/silicon/robot/show_master(mob/who) - // TODO: Update to new antagonist system. - if (mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src && connected_ai) + var/decl/special_role/traitor/traitor_role = IMPLIED_DECL + if(traitor_role.is_antagonist(mind) && connected_ai) to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first.") return return ..() -/mob/living/silicon/robot/lawsync() - . = ..() - // TODO: Update to new antagonist system. - if(mind?.assigned_special_role == /decl/special_role/traitor && mind.original == src) - to_chat(src, SPAN_BOLD("Remember, your AI does NOT share or know about your law 0.")) - /mob/living/silicon/robot/handle_regular_hud_updates() . = ..() if(!.) diff --git a/mods/mobs/borers/_borers.dme b/mods/mobs/borers/_borers.dme index 380c95f4e87..7f230fc9536 100644 --- a/mods/mobs/borers/_borers.dme +++ b/mods/mobs/borers/_borers.dme @@ -1,10 +1,5 @@ #ifndef CONTENT_PACK_BORERS #define CONTENT_PACK_BORERS - -#ifdef MODPACK_PSIONICS -#warn Psionics modpack loaded before Borers modpack, compatibility features will be missing. -#endif - // BEGIN_INCLUDE #include "borer.dm" #include "datum\antagonist.dm" diff --git a/mods/mobs/borers/datum/antagonist.dm b/mods/mobs/borers/datum/antagonist.dm index c714ef8e1a1..423297f09f8 100644 --- a/mods/mobs/borers/datum/antagonist.dm +++ b/mods/mobs/borers/datum/antagonist.dm @@ -7,12 +7,12 @@ welcome_text = "Click a target while on GRAB intent to crawl into their ear and infiltrate their brain. You can only take control temporarily, and at risk of hurting your host, so be clever and careful; your host is encouraged to help you however they can. Talk to your host with Say, and your fellow borers with ,z." antag_indicator = "hudborer" antaghud_indicator = "hudborer" + antag_hud_icon = 'mods/mobs/borers/icons/hud.dmi' faction_name = "Borer Host" faction_descriptor = "Unity" faction_welcome = "You are now host to a cortical borer. Please listen to what they have to say; they're in your head." faction = "borer" - faction_indicator = "hudalien" hard_cap = 5 hard_cap_round = 8 diff --git a/mods/mobs/borers/datum/symbiote.dm b/mods/mobs/borers/datum/symbiote.dm index f6954fa2bf3..bf2f17e93c4 100644 --- a/mods/mobs/borers/datum/symbiote.dm +++ b/mods/mobs/borers/datum/symbiote.dm @@ -21,7 +21,8 @@ var/global/list/symbiote_starting_points = list() minimal_player_age = 14 economic_power = 0 defer_roundstart_spawn = TRUE - hud_icon = "hudblank" + hud_icon_state = "hudblank" + hud_icon = null outfit_type = /decl/outfit/job/symbiote_host create_record = FALSE var/check_whitelist // = "Symbiote" diff --git a/mods/mobs/borers/icons/hud.dmi b/mods/mobs/borers/icons/hud.dmi new file mode 100644 index 00000000000..8e01986fd47 Binary files /dev/null and b/mods/mobs/borers/icons/hud.dmi differ diff --git a/mods/mobs/borers/mob/borer/borer.dm b/mods/mobs/borers/mob/borer/borer.dm index 5529384f774..f9dbbe2f6e1 100644 --- a/mods/mobs/borers/mob/borer/borer.dm +++ b/mods/mobs/borers/mob/borer/borer.dm @@ -9,8 +9,6 @@ response_disarm = "prods" response_harm = "stamps on" base_movement_delay = 2 - - a_intent = I_HURT status_flags = CANPUSH natural_weapon = /obj/item/natural_weapon/bite/weak pass_flags = PASS_FLAG_TABLE @@ -20,6 +18,22 @@ bleed_colour = "#816e12" ai = /datum/mob_controller/borer + // Defined here to remove relaymove handlers as being + // directly in mob contents breaks relaymove spectacularly. + movement_handlers = list( + /datum/movement_handler/mob/death, + /datum/movement_handler/mob/borer_in_host, + /datum/movement_handler/mob/conscious, + /datum/movement_handler/mob/eye, + /datum/movement_handler/mob/delay, + /datum/movement_handler/mob/stop_effect, + /datum/movement_handler/mob/physically_capable, + /datum/movement_handler/mob/physically_restrained, + /datum/movement_handler/mob/space, + /datum/movement_handler/mob/multiz, + /datum/movement_handler/mob/movement + ) + var/static/list/chemical_types = list( "anti-trauma" = /decl/material/liquid/brute_meds, "amphetamines" = /decl/material/liquid/amphetamines, @@ -42,6 +56,9 @@ var/mob/living/human/host // Human host for the brain worm. var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth. +/datum/movement_handler/mob/borer_in_host/MayMove(mob/mover, is_external) + return ismob(mob.loc) ? MOVEMENT_STOP : MOVEMENT_PROCEED + /datum/mob_controller/borer emote_hear = list("chirrups") do_wander = FALSE diff --git a/mods/mobs/borers/mob/borer/borer_attacks.dm b/mods/mobs/borers/mob/borer/borer_attacks.dm index 43358767a9e..6c5919ed2b5 100644 --- a/mods/mobs/borers/mob/borer/borer_attacks.dm +++ b/mods/mobs/borers/mob/borer/borer_attacks.dm @@ -1,50 +1,44 @@ /mob/living/simple_animal/borer/UnarmedAttack(atom/A, proximity) - . = ..() - if(.) - return + if(host) + return TRUE // We cannot click things outside of our host. - if(!isliving(A) || a_intent != I_GRAB) - return FALSE + if(!isliving(A) || !check_intent(I_FLAG_GRAB) || stat || !proximity) + return ..() - if(host || !can_use_borer_ability(requires_host_value = FALSE, check_last_special = FALSE)) - return FALSE + if(!can_use_borer_ability(requires_host_value = FALSE, check_last_special = FALSE)) + return TRUE - var/mob/living/M = A - if(M.has_brain_worms()) + var/mob/living/victim = A + if(victim.has_brain_worms()) to_chat(src, SPAN_WARNING("You cannot take a host who already has a passenger!")) 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.")) + var/obj/item/organ/external/limb = GET_EXTERNAL_ORGAN(victim, BP_HEAD) + if(!limb) + to_chat(src, SPAN_WARNING("\The [victim] does not have anatomy compatible with your lifecycle!")) return TRUE - // end TODO - - var/mob/living/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!")) + if(BP_IS_PROSTHETIC(limb)) + to_chat(src, SPAN_WARNING("\The [victim]'s head is prosthetic and cannot support your lifecycle!")) 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.")) + if(!victim.should_have_organ(BP_BRAIN)) + to_chat(src, SPAN_WARNING("\The [victim] does not seem to have a brain cavity to enter.")) return TRUE - if(H.check_head_coverage()) + if(victim.check_head_coverage()) to_chat(src, SPAN_WARNING("You cannot get through that host's protective gear.")) 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...")) + to_chat(victim, SPAN_WARNING("Something slimy begins probing at the opening of your ear canal...")) + to_chat(src, SPAN_NOTICE("You slither up [victim] and begin probing at their ear canal...")) set_ability_cooldown(5 SECONDS) - if(!do_after(src, 3 SECONDS, M)) + if(!do_after(src, 3 SECONDS, victim) || host || GET_EXTERNAL_ORGAN(victim, BP_HEAD) != limb || BP_IS_PROSTHETIC(limb) || victim.check_head_coverage()) return TRUE - to_chat(src, SPAN_NOTICE("You wiggle into \the [M]'s ear.")) - if(M.stat == CONSCIOUS) - to_chat(M, SPAN_DANGER("Something wet, cold and slimy wiggles into your ear!")) + to_chat(src, SPAN_NOTICE("You wiggle into \the [victim]'s ear.")) + if(victim.stat == CONSCIOUS) + to_chat(victim, SPAN_DANGER("Something wet, cold and slimy wiggles into your ear!")) - host = M + host = victim host.status_flags |= PASSEMOTES forceMove(host) @@ -60,9 +54,9 @@ borers.add_antagonist_mind(host.mind, 1, borers.faction_name, borers.faction_welcome) if(ishuman(host)) - var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(H, BP_BRAIN) + var/obj/item/organ/internal/I = GET_INTERNAL_ORGAN(victim, BP_BRAIN) if(!I) // No brain organ, so the borer moves in and replaces it permanently. replace_brain() - else if(E) // If they're in normally, implant removal can get them out. - LAZYDISTINCTADD(E.implants, src) + else if(limb) // If they're in normally, implant removal can get them out. + LAZYDISTINCTADD(limb.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 8b9a155e5d4..79235e827d5 100644 --- a/mods/mobs/borers/mob/borer/borer_hud.dm +++ b/mods/mobs/borers/mob/borer/borer_hud.dm @@ -14,7 +14,7 @@ . = ..() /datum/hud/borer/FinalizeInstantiation() - hud_intent_selector = new(null, mymob, get_ui_style_data(), get_ui_color(), get_ui_alpha(), UI_ICON_INTENT) + hud_intent_selector = new(null, mymob) adding += hud_intent_selector hud_inject_chemicals = new(null, mymob) hud_leave_host = new(null, mymob) @@ -50,11 +50,12 @@ icon = 'mods/mobs/borers/icons/borer_ui.dmi' alpha = 0 invisibility = INVISIBILITY_MAXIMUM + requires_ui_style = FALSE /obj/screen/borer/handle_click(mob/user, params) if(!isborer(user)) return FALSE - var/mob/living/simple_animal/borer/worm = usr + var/mob/living/simple_animal/borer/worm = user if(!worm.host) return FALSE return TRUE diff --git a/mods/mobs/borers/mob/organ.dm b/mods/mobs/borers/mob/organ.dm index c1f686ade98..80c12e77c94 100644 --- a/mods/mobs/borers/mob/organ.dm +++ b/mods/mobs/borers/mob/organ.dm @@ -38,5 +38,4 @@ B.leave_host() B.ckey = last_owner.ckey - spawn(0) - qdel(src) + qdel(src) diff --git a/mods/mobs/borers/mob/overrides.dm b/mods/mobs/borers/mob/overrides.dm index 77c9a2c158e..26b83686f8e 100644 --- a/mods/mobs/borers/mob/overrides.dm +++ b/mods/mobs/borers/mob/overrides.dm @@ -22,8 +22,10 @@ var/mob/living/simple_animal/borer/B = HAS_BRAIN_WORMS(src) if(B.controlling) var/image/holder = hud_list[STATUS_HUD] + holder.icon = 'mods/mobs/borers/icons/hud.dmi' holder.icon_state = "hudbrainworm" var/image/holder2 = hud_list[STATUS_HUD_OOC] + holder2.icon = 'mods/mobs/borers/icons/hud.dmi' holder2.icon_state = "hudbrainworm" /mob/living/human/say_understands(mob/speaker, decl/language/speaking) diff --git a/mods/mobs/dionaea/icons/ui_intent_overlay.dmi b/mods/mobs/dionaea/icons/ui_intent_overlay.dmi new file mode 100644 index 00000000000..8c3174c773a Binary files /dev/null and b/mods/mobs/dionaea/icons/ui_intent_overlay.dmi differ diff --git a/mods/mobs/dionaea/icons/ui_intents.dmi b/mods/mobs/dionaea/icons/ui_intents.dmi index d8aaeba136e..7a7f29b4d21 100644 Binary files a/mods/mobs/dionaea/icons/ui_intents.dmi and b/mods/mobs/dionaea/icons/ui_intents.dmi differ diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 4c8b1a9f496..a1c8efe4486 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -76,6 +76,18 @@ heal_damage(OXY, rads, do_update_health = FALSE) heal_damage(TOX, rads) +/* +/mob/living/simple_animal/alien/diona/get_default_intent() + return GET_DECL(/decl/intent/help/binary/diona) + +/mob/living/simple_animal/alien/diona/get_available_intents() + var/static/list/available_intents = list( + GET_DECL(/decl/intent/harm/binary/diona), + GET_DECL(/decl/intent/help/binary/diona) + ) + return available_intents +*/ + /decl/bodytype/diona name = "nymph" bodytype_flag = 0 @@ -83,12 +95,12 @@ uid = "bodytype_diona" /decl/bodytype/diona/Initialize() - equip_adjust = list( - slot_head_str = list( + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(0, -8), "[SOUTH]" = list(0, -8), - "[EAST]" = list(0, -8), - "[WEST]" = list(0, -8) + "[EAST]" = list(0, -8), + "[WEST]" = list(0, -8) ) ) . = ..() diff --git a/mods/mobs/dionaea/mob/nymph_ui.dm b/mods/mobs/dionaea/mob/nymph_ui.dm index 15ab7bf27ea..fc44f7639a3 100644 --- a/mods/mobs/dionaea/mob/nymph_ui.dm +++ b/mods/mobs/dionaea/mob/nymph_ui.dm @@ -1,14 +1,16 @@ -/obj/screen/intent/diona_nymph - icon_state = "intent_harm" +/* Commented out due to issues with interactions and combined intent flags. +/obj/screen/intent/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intents.dmi' screen_loc = DIONA_SCREEN_LOC_INTENT -/obj/screen/intent/diona_nymph/on_update_icon() - if(intent == I_HURT || intent == I_GRAB) - intent = I_GRAB - icon_state = "intent_harm" - else - intent = I_DISARM - icon_state = "intent_help" +/decl/intent/harm/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + uid = "intent_harm_binary_diona" + +/decl/intent/help/binary/diona + icon = 'mods/mobs/dionaea/icons/ui_intent_overlay.dmi' + uid = "intent_help_binary_diona" +*/ /decl/ui_style/diona name = "Diona" @@ -17,11 +19,13 @@ override_icons = list( UI_ICON_HEALTH = 'mods/mobs/dionaea/icons/ui_health.dmi', UI_ICON_HANDS = 'mods/mobs/dionaea/icons/ui_hands.dmi', - UI_ICON_INTENT = 'mods/mobs/dionaea/icons/ui_intents.dmi', UI_ICON_INTERACTION = 'mods/mobs/dionaea/icons/ui_interactions.dmi', UI_ICON_INVENTORY = 'mods/mobs/dionaea/icons/ui_inventory.dmi' ) +/datum/hud/diona_nymph +// action_intent_type = /obj/screen/intent/diona_nymph + /datum/hud/diona_nymph/get_ui_style_data() return GET_DECL(/decl/ui_style/diona) @@ -36,10 +40,9 @@ var/ui_color = get_ui_color() var/ui_alpha = get_ui_alpha() - action_intent = new /obj/screen/intent/diona_nymph(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) - mymob.healths = new /obj/screen/diona_health( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) - src.other = list() - src.adding = list(mymob.healths, action_intent) + mymob.healths = new /obj/screen/diona_health(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) + other = list() + adding = list(mymob.healths) ..() /obj/screen/diona_health diff --git a/mods/species/ascent/_ascent.dme b/mods/species/ascent/_ascent.dme index 63d6f95300d..461ef828f3a 100644 --- a/mods/species/ascent/_ascent.dme +++ b/mods/species/ascent/_ascent.dme @@ -14,6 +14,7 @@ #include "datum\species_bodytypes.dm" #include "datum\traits.dm" #include "effects\razorweb.dm" +#include "items\_overrides.dm" #include "items\cell.dm" #include "items\clothing.dm" #include "items\clustertool.dm" diff --git a/mods/species/ascent/datum/species.dm b/mods/species/ascent/datum/species.dm index 809da7c26fb..f6bc5dddb05 100644 --- a/mods/species/ascent/datum/species.dm +++ b/mods/species/ascent/datum/species.dm @@ -71,11 +71,6 @@ species_flags = SPECIES_FLAG_NO_SLIP | SPECIES_FLAG_NO_MINOR_CUT spawn_flags = SPECIES_IS_RESTRICTED - unarmed_attacks = list( - /decl/natural_attack/claws/strong/gloves, - /decl/natural_attack/bite/sharp - ) - force_background_info = list( /decl/background_category/heritage = /decl/background_detail/heritage/ascent, /decl/background_category/homeworld = /decl/background_detail/location/kharmaani, diff --git a/mods/species/ascent/datum/species_bodytypes.dm b/mods/species/ascent/datum/species_bodytypes.dm index 05ca4ed987f..87a8462b0f7 100644 --- a/mods/species/ascent/datum/species_bodytypes.dm +++ b/mods/species/ascent/datum/species_bodytypes.dm @@ -30,6 +30,7 @@ BP_SYSTEM_CONTROLLER = /obj/item/organ/internal/controller ) limb_mapping = list(BP_CHEST = list(BP_CHEST, BP_M_HAND)) + footprints_icon = 'icons/mob/footprints/footprints_snake.dmi' // big tail heat_discomfort_strings = list( "You feel brittle and overheated.", @@ -85,8 +86,8 @@ uid = "bodytype_crystalline_gyne" /decl/bodytype/crystalline/mantid/gyne/Initialize() - equip_adjust = list( - BP_L_HAND = list( + _equip_adjust = list( + (BP_L_HAND) = list( "[NORTH]" = list(-4, 12), "[EAST]" = list(-4, 12), "[SOUTH]" = list(-4, 12), diff --git a/mods/species/ascent/effects/razorweb.dm b/mods/species/ascent/effects/razorweb.dm index d67a55ee498..0647ffe0c91 100644 --- a/mods/species/ascent/effects/razorweb.dm +++ b/mods/species/ascent/effects/razorweb.dm @@ -13,7 +13,7 @@ web.buckle_mob(hit_atom) web.visible_message(SPAN_DANGER("\The [hit_atom] is tangled in \the [web]!")) web.entangle(hit_atom, TRUE) - playsound(usr, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) qdel(src) // Hey, did you ever see The Cube (1997) directed by Vincenzo Natali? @@ -68,7 +68,7 @@ START_PROCESSING(SSobj, src) /obj/effect/razorweb/proc/decay() - playsound(usr, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) qdel_self() /obj/effect/razorweb/attack_hand(mob/user) @@ -81,7 +81,7 @@ /obj/effect/razorweb/attackby(var/obj/item/thing, var/mob/user) var/destroy_self - if(thing.get_attack_force(user)) + if(thing.expend_attack_force(user)) visible_message(SPAN_DANGER("\The [user] breaks \the [src] with \the [thing]!")) destroy_self = TRUE @@ -163,8 +163,8 @@ if(prob(break_chance)) visible_message(SPAN_DANGER("\The [src] breaks apart!")) - playsound(usr, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_break.ogg', 50) qdel(src) else - playsound(usr, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) + playsound(src, 'mods/species/ascent/sounds/razorweb_twang.ogg', 50) break_chance = min(break_chance+10, 100) \ No newline at end of file diff --git a/mods/species/ascent/icons/ui_intent_overlay.dmi b/mods/species/ascent/icons/ui_intent_overlay.dmi new file mode 100644 index 00000000000..d49275852d3 Binary files /dev/null and b/mods/species/ascent/icons/ui_intent_overlay.dmi differ diff --git a/mods/species/ascent/icons/ui_intents.dmi b/mods/species/ascent/icons/ui_intents.dmi index 1e027dcfcdd..0e8d07ec2fe 100644 Binary files a/mods/species/ascent/icons/ui_intents.dmi and b/mods/species/ascent/icons/ui_intents.dmi differ diff --git a/mods/species/ascent/items/_overrides.dm b/mods/species/ascent/items/_overrides.dm new file mode 100644 index 00000000000..3cc8b68959b --- /dev/null +++ b/mods/species/ascent/items/_overrides.dm @@ -0,0 +1,10 @@ +/obj/item + var/_alate_onmob_icon + var/_gyne_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_alate_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_MANTID_SMALL, _alate_onmob_icon) + if(_gyne_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_MANTID_LARGE, _gyne_onmob_icon) diff --git a/mods/species/ascent/items/clothing.dm b/mods/species/ascent/items/clothing.dm index 845397d4208..43a34e427b3 100644 --- a/mods/species/ascent/items/clothing.dm +++ b/mods/species/ascent/items/clothing.dm @@ -22,7 +22,7 @@ desc = "An alien facemask with chunky gas filters and a breathing valve." filter_water = TRUE icon = 'mods/species/ascent/icons/clothing/mask.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/mask_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/mask_gyne.dmi' bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE filtered_gases = list( /decl/material/solid/phoron, @@ -39,9 +39,7 @@ desc = "A set of powerful gripping claws." icon = 'mods/species/ascent/icons/magboots/boots.dmi' bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/magboots/boots_gyne.dmi' - ) + _gyne_onmob_icon = 'mods/species/ascent/icons/magboots/boots_gyne.dmi' /obj/item/clothing/jumpsuit/ascent name = "mantid undersuit" @@ -49,9 +47,7 @@ bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon = 'mods/species/ascent/icons/clothing/under.dmi' color = COLOR_DARK_GUNMETAL - sprite_sheets = list( - BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_gyne.dmi' - ) + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/under_gyne.dmi' /obj/item/clothing/suit/ascent name = "mantid gear harness" @@ -59,7 +55,7 @@ bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon_state = ICON_STATE_WORLD icon = 'mods/species/ascent/icons/clothing/under_harness.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/clothing/under_harness_gyne.dmi' body_parts_covered = 0 slot_flags = SLOT_OVER_BODY | SLOT_LOWER_BODY storage = /datum/storage/pockets/suit diff --git a/mods/species/ascent/items/guns.dm b/mods/species/ascent/items/guns.dm index 83fdda10ffc..99a76ce5351 100644 --- a/mods/species/ascent/items/guns.dm +++ b/mods/species/ascent/items/guns.dm @@ -20,7 +20,7 @@ list(mode_name="shock", projectile_type = /obj/item/projectile/beam/stun/shock), list(mode_name="lethal", projectile_type = /obj/item/projectile/beam/particle) ) - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/particle_rifle/inhands_gyne.dmi' /obj/item/gun/energy/particle/small name = "particle projector" diff --git a/mods/species/ascent/items/rig.dm b/mods/species/ascent/items/rig.dm index 35697954e7b..214f60caa99 100644 --- a/mods/species/ascent/items/rig.dm +++ b/mods/species/ascent/items/rig.dm @@ -3,7 +3,6 @@ name = "alate support exosuit" desc = "A powerful support exosuit with integrated power supply, weapon and atmosphere. It's closer to a mech than a rig." icon = 'mods/species/ascent/icons/rig/rig.dmi' - suit_type = "support exosuit" armor = list( ARMOR_MELEE = ARMOR_MELEE_MAJOR, @@ -28,7 +27,7 @@ gloves = /obj/item/clothing/gloves/rig/mantid update_visible_name = TRUE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_gyne.dmi' initial_modules = list( /obj/item/rig_module/vision/thermal, /obj/item/rig_module/ai_container, @@ -241,7 +240,7 @@ desc = "More like a torpedo casing than a helmet." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE icon = 'mods/species/ascent/icons/rig/rig_helmet.dmi' - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_helmet_gyne.dmi' /obj/item/clothing/suit/space/rig/mantid desc = "It's closer to a mech than a suit." @@ -255,16 +254,16 @@ /obj/item/stack/medical/resin, /obj/item/chems/drinks/cans/waterbottle/ascent ) - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_chest_gyne.dmi' /obj/item/clothing/shoes/magboots/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_boots.dmi' desc = "It's like a highly advanced forklift." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_boots_gyne.dmi' /obj/item/clothing/gloves/rig/mantid icon = 'mods/species/ascent/icons/rig/rig_gloves.dmi' desc = "They look like a cross between a can opener and a Swiss army knife the size of a shoebox." bodytype_equip_flags = BODY_EQUIP_FLAG_GYNE | BODY_EQUIP_FLAG_ALATE - sprite_sheets = list(BODYTYPE_MANTID_LARGE = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi') + _gyne_onmob_icon = 'mods/species/ascent/icons/rig/rig_gloves_gyne.dmi' diff --git a/mods/species/ascent/mobs/bodyparts.dm b/mods/species/ascent/mobs/bodyparts.dm index a86a379a15c..dba73c0e121 100644 --- a/mods/species/ascent/mobs/bodyparts.dm +++ b/mods/species/ascent/mobs/bodyparts.dm @@ -5,7 +5,7 @@ var/list/existing_webs = list() var/max_webs = 4 var/web_weave_time = 20 SECONDS - var/cooldown + var/organ_cooldown /obj/item/organ/external/groin/insectoid/mantid/gyne max_webs = 8 @@ -20,12 +20,12 @@ /obj/item/organ/external/groin/insectoid/mantid/refresh_action_button() . = ..() if(.) - action.button_icon_state = "weave-web-[cooldown ? "off" : "on"]" + action.button_icon_state = "weave-web-[organ_cooldown ? "off" : "on"]" action.button?.update_icon() /obj/item/organ/external/groin/insectoid/mantid/attack_self(var/mob/user) . = ..() - if(. && !cooldown) + if(. && !organ_cooldown) if(!isturf(owner.loc)) to_chat(owner, SPAN_WARNING("You cannot use this ability in this location.")) @@ -41,7 +41,7 @@ playsound(user, 'mods/species/ascent/sounds/razorweb_hiss.ogg', 70) owner.visible_message(SPAN_WARNING("\The [owner] separates their jaws and begins to weave a web of crystalline filaments...")) - cooldown = TRUE + organ_cooldown = TRUE refresh_action_button() addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), web_weave_time) if(do_after(owner, web_weave_time) && length(existing_webs) < max_webs) @@ -52,27 +52,27 @@ web.owner = owner /obj/item/organ/external/groin/insectoid/mantid/proc/reset_cooldown() - cooldown = FALSE + organ_cooldown = FALSE refresh_action_button() /obj/item/organ/external/head/insectoid/mantid name = "crested head" action_button_name = "Spit Razorweb" default_action_type = /datum/action/item_action/organ/ascent - var/cooldown_time = 2.5 MINUTES - var/cooldown + var/organ_cooldown_time = 2.5 MINUTES + var/organ_cooldown /obj/item/organ/external/head/insectoid/mantid/refresh_action_button() . = ..() if(.) - action.button_icon_state = "shot-web-[cooldown ? "off" : "on"]" + action.button_icon_state = "shot-web-[organ_cooldown ? "off" : "on"]" action.button?.update_icon() /obj/item/organ/external/head/insectoid/mantid/attack_self(var/mob/user) . = ..() if(.) - if(cooldown) + if(organ_cooldown) to_chat(owner, SPAN_WARNING("Your filament channel hasn't refilled yet!")) return @@ -81,12 +81,12 @@ playsound(user, 'mods/species/ascent/sounds/razorweb.ogg', 100) to_chat(owner, SPAN_WARNING("You spit up a wad of razorweb, ready to throw!")) owner.toggle_throw_mode(TRUE) - cooldown = TRUE + organ_cooldown = TRUE refresh_action_button() - addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), cooldown_time) + addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), organ_cooldown_time) else qdel(web) /obj/item/organ/external/head/insectoid/mantid/proc/reset_cooldown() - cooldown = FALSE + organ_cooldown = FALSE refresh_action_button() diff --git a/mods/species/ascent/mobs/drone.dm b/mods/species/ascent/mobs/drone.dm index f2f94d499de..2294585ee15 100644 --- a/mods/species/ascent/mobs/drone.dm +++ b/mods/species/ascent/mobs/drone.dm @@ -35,7 +35,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass, @@ -96,7 +95,6 @@ /obj/item/stack/material/cyborg/steel, /obj/item/stack/material/cyborg/aluminium, /obj/item/stack/material/rods/cyborg, - /obj/item/stack/material/strut/cyborg, /obj/item/stack/tile/floor/cyborg, /obj/item/stack/tile/roof/cyborg, /obj/item/stack/material/cyborg/glass/reinforced diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index da48aabf82e..16447b0c51d 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -51,3 +51,15 @@ /mob/living/simple_animal/alien/kharmaan/get_dexterity(var/silent) return (DEXTERITY_EQUIP_ITEM) + +/* +/mob/living/simple_animal/alien/kharmaan/get_default_intent() + return GET_DECL(/decl/intent/help/binary/ascent) + +/mob/living/simple_animal/alien/kharmaan/get_available_intents() + var/static/list/available_intents = list( + GET_DECL(/decl/intent/harm/binary/ascent), + GET_DECL(/decl/intent/help/binary/ascent) + ) + return available_intents +*/ \ No newline at end of file diff --git a/mods/species/ascent/mobs/nymph/nymph_inventory.dm b/mods/species/ascent/mobs/nymph/nymph_inventory.dm index 12396419807..e79adb9931d 100644 --- a/mods/species/ascent/mobs/nymph/nymph_inventory.dm +++ b/mods/species/ascent/mobs/nymph/nymph_inventory.dm @@ -1,13 +1,8 @@ -/mob/living/simple_animal/alien/kharmaan/proc/contains_crystals(var/obj/item/W) - for(var/mat in W.matter) - if(mat == /decl/material/solid/sand) - . += W.matter[mat] - else if(mat == /decl/material/solid/gemstone/crystal) - . += W.matter[mat] - else if(mat == /decl/material/solid/quartz) - . += W.matter[mat] - else if(mat == /decl/material/solid/glass) - . += W.matter[mat] +/mob/living/simple_animal/alien/kharmaan/proc/contains_crystals(var/obj/item/prop) + . += prop.matter[/decl/material/solid/sand] + . += prop.matter[/decl/material/solid/gemstone/crystal] + . += prop.matter[/decl/material/solid/quartz] + . += prop.matter[/decl/material/solid/glass] /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/simple_animal/alien/kharmaan/nimp = user diff --git a/mods/species/ascent/mobs/nymph/nymph_life.dm b/mods/species/ascent/mobs/nymph/nymph_life.dm index 4c217a9aee0..f8e5c45fd4a 100644 --- a/mods/species/ascent/mobs/nymph/nymph_life.dm +++ b/mods/species/ascent/mobs/nymph/nymph_life.dm @@ -61,23 +61,22 @@ return molt = min(molt + 1, 5) - var/mob/living/simple_animal/alien/kharmaan/nymph = usr - nymph.visible_message("\icon[nymph] [nymph] begins to shimmy and shake out of its old skin.") + visible_message("\icon[src] [src] begins to shimmy and shake out of its old skin.") if(molt == 5) - if(do_after(nymph, 10 SECONDS, nymph, FALSE)) - var/mob/living/human/H = new(get_turf(usr), SPECIES_MANTID_ALATE) - H.set_gyne_lineage(nymph.get_gyne_lineage()) + if(do_after(src, 10 SECONDS, src, FALSE)) + var/mob/living/human/H = new(get_turf(src), SPECIES_MANTID_ALATE) + H.set_gyne_lineage(get_gyne_lineage()) H.real_name = "[random_id(/decl/species/mantid, 10000, 99999)] [H.get_gyne_name()]" - H.nutrition = nymph.nutrition * 0.25 // Homgry after molt. - nymph.mind.transfer_to(H) - qdel(nymph) + H.nutrition = nutrition * 0.25 // Homgry after molt. + mind.transfer_to(H) + qdel(src) H.visible_message("\icon[H] [H] emerges from its molt as a new alate.") new/obj/item/ascent_molt(get_turf(src)) else - nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") + visible_message("\icon[src] [src] abruptly stops molting.") return - if(do_after(nymph, 5 SECONDS, nymph, FALSE)) + if(do_after(src, 5 SECONDS, src, FALSE)) var/matrix/M = matrix() M.Scale(1 + (molt / 10)) animate(src, transform = M, time = 2, easing = QUAD_EASING) @@ -88,4 +87,4 @@ new /obj/item/ascent_molt(get_turf(src)) else - nymph.visible_message("\icon[nymph] [nymph] abruptly stops molting.") \ No newline at end of file + visible_message("\icon[src] [src] 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 85225fd26a9..e3b6d1ec70c 100644 --- a/mods/species/ascent/mobs/nymph/nymph_ui.dm +++ b/mods/species/ascent/mobs/nymph/nymph_ui.dm @@ -1,15 +1,16 @@ -/obj/screen/intent/ascent_nymph - icon_state = "intent_harm" +/* Commented out due to issues with interactions and combined intent flags. +/obj/screen/intent/binary/ascent + icon = 'mods/species/ascent/icons/ui_intents.dmi' screen_loc = ANYMPH_SCREEN_LOC_INTENT -/obj/screen/intent/ascent_nymph/on_update_icon() - if(intent == I_HURT || intent == I_GRAB) - intent = I_GRAB - icon_state = "intent_harm" - else - intent = I_DISARM - icon_state = "intent_help" +/decl/intent/harm/binary/ascent + icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' + uid = "intent_harm_binary_ascent" +/decl/intent/help/binary/ascent + icon = 'mods/species/ascent/icons/ui_intent_overlay.dmi' + uid = "intent_help_binary_ascent" +*/ /obj/screen/ascent_nymph_molt name = "molt" icon = 'mods/species/ascent/icons/ui_molt.dmi' @@ -33,11 +34,13 @@ override_icons = list( UI_ICON_HEALTH = 'mods/species/ascent/icons/ui_health.dmi', UI_ICON_HANDS = 'mods/species/ascent/icons/ui_hands.dmi', - UI_ICON_INTENT = 'mods/species/ascent/icons/ui_intents.dmi', UI_ICON_INTERACTION = 'mods/species/ascent/icons/ui_interactions.dmi', UI_ICON_INVENTORY = 'mods/species/ascent/icons/ui_inventory.dmi' ) +/datum/hud/ascent_nymph +// action_intent_type = /obj/screen/intent/ascent_nymph + /datum/hud/ascent_nymph/get_ui_style_data() return GET_DECL(/decl/ui_style/ascent) @@ -54,10 +57,9 @@ molt = new( null, mymob, ui_style, ui_color, ui_alpha) food = new /obj/screen/food( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_NUTRITION) drink = new /obj/screen/drink( null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HYDRATION) - action_intent = new /obj/screen/intent/ascent_nymph(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_INTENT) mymob.healths = new /obj/screen/ascent_nymph_health(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HEALTH) - src.other = list() - src.adding = list(mymob.healths, molt, food, drink, action_intent) + other = list() + adding = list(mymob.healths, molt, food, drink) ..() /obj/screen/ascent_nymph_health diff --git a/mods/species/bayliens/bayliens.dm b/mods/species/bayliens/_bayliens.dm similarity index 53% rename from mods/species/bayliens/bayliens.dm rename to mods/species/bayliens/_bayliens.dm index a1ddf384ed9..80febefc65e 100644 --- a/mods/species/bayliens/bayliens.dm +++ b/mods/species/bayliens/_bayliens.dm @@ -1,10 +1,23 @@ -#define SPECIES_SKRELL "Skrell" -#define SPECIES_TAJARA "Tajara" -#define SPECIES_LIZARD "Unathi" -#define SPECIES_ADHERENT "Adherent" +#define SPECIES_SKRELL "Skrell" +#define SPECIES_TAJARA "Tajara" +#define SPECIES_LIZARD "Unathi" +#define SPECIES_ADHERENT "Adherent" + +#define BODYTYPE_FELINE "feline body" +#define BODYTYPE_ADHERENT "adherent body" + +#define BODY_EQUIP_FLAG_FELINE BITFLAG(7) /decl/modpack/bayliens name = "Baystation 12 Aliens" + tabloid_headlines = list( + "SHOCKING FIGURES REVEAL MORE TEENS DIE TO UNATHI HONOUR DUELS THAN GUN VIOLENCE", + "LOCAL UNATHI SYMPATHIZER: 'I really think you should stop with these spacebaiting articles.'", + "DO UNATHI SYMPATHIZERS HATE THE HUMAN RACE?", + "TENTACLES OF TERROR: SKRELL BLACK OPS SEIGE NYX NAVAL DEPOT. SHOCKING PHOTOGRAPHS INSIDE!", + "LOCAL MAN HAS SEIZURE AFTER SAYING SKRELLIAN NAME; FORCED ASSIMILATION SOON?", + "TAJARANS: CUTE AND CUDDLY, OR INFILTRATING THE GOVERNMENT? FIND OUT MORE INSIDE" + ) /decl/modpack/bayliens/pre_initialize() ..() diff --git a/mods/species/bayliens/_bayliens.dme b/mods/species/bayliens/_bayliens.dme index e8de7a35d0b..014aba6cf5d 100644 --- a/mods/species/bayliens/_bayliens.dme +++ b/mods/species/bayliens/_bayliens.dme @@ -1,7 +1,8 @@ #ifndef MODPACK_BAYLIENS #define MODPACK_BAYLIENS // BEGIN_INCLUDE -#include "bayliens.dm" +#include "_bayliens.dm" +#include "_overrides.dm" #include "adherent\_adherent.dm" #include "adherent\datum\culture.dm" #include "adherent\datum\emotes.dm" diff --git a/mods/species/bayliens/_overrides.dm b/mods/species/bayliens/_overrides.dm new file mode 100644 index 00000000000..5eb6f5a8558 --- /dev/null +++ b/mods/species/bayliens/_overrides.dm @@ -0,0 +1,7 @@ +/obj/item + var/_feline_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_feline_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_FELINE, _feline_onmob_icon) diff --git a/mods/species/bayliens/adherent/_adherent.dm b/mods/species/bayliens/adherent/_adherent.dm index 997107674c8..d70f337115d 100644 --- a/mods/species/bayliens/adherent/_adherent.dm +++ b/mods/species/bayliens/adherent/_adherent.dm @@ -1,6 +1,4 @@ -#define BODYTYPE_ADHERENT "adherent body" #define LANGUAGE_ADHERENT "Protocol" - #define BP_FLOAT "floatation disc" #define BP_JETS "maneuvering jets" #define BP_COOLING_FINS "cooling fins" diff --git a/mods/species/bayliens/adherent/datum/species_bodytypes.dm b/mods/species/bayliens/adherent/datum/species_bodytypes.dm index 8e6c7ab2ee9..bbf275eb855 100644 --- a/mods/species/bayliens/adherent/datum/species_bodytypes.dm +++ b/mods/species/bayliens/adherent/datum/species_bodytypes.dm @@ -53,54 +53,48 @@ uid = "bodytype_crystalline_adherent_turquoise" /decl/bodytype/crystalline/adherent/Initialize() - equip_adjust = list( - "[BP_L_HAND]" = list( + _equip_adjust = list( + (BP_L_HAND) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[BP_R_HAND]" = list( + (BP_R_HAND) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[slot_back_str]" = list( + (slot_back_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[slot_belt_str]" = list( + (slot_belt_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), "[WEST]" = list(0, 14) ), - - "[slot_head_str]" = list( + (slot_head_str) = list( "[NORTH]" = list( 0, 14), "[EAST]" = list( 3, 14), "[SOUTH]" = list( 0, 14), "[WEST]" = list(-3, 14) ), - - "[slot_l_ear_str]" = list( + (slot_l_ear_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), - "[WEST]" = list(0, 14) + "[WEST]" = list(0, 14) ), - - "[slot_r_ear_str]" = list( + (slot_r_ear_str) = list( "[NORTH]" = list(0, 14), "[EAST]" = list(0, 14), "[SOUTH]" = list(0, 14), - "[WEST]" = list(0, 14) + "[WEST]" = list(0, 14) ) ) . = ..() diff --git a/mods/species/bayliens/skrell/datum/species.dm b/mods/species/bayliens/skrell/datum/species.dm index 0d9acdcd880..c52a6dc6735 100644 --- a/mods/species/bayliens/skrell/datum/species.dm +++ b/mods/species/bayliens/skrell/datum/species.dm @@ -14,12 +14,6 @@ traits = list(/decl/trait/malus/intolerance/protein = TRAIT_LEVEL_MINOR) primitive_form = "Neaera" - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch, - /decl/natural_attack/bite - ) description = "The Skrell are a highly advanced race of amphibians hailing from the system known as Qerr'Vallis. Their society is regimented into \ five different castes which the Qerr'Katish, or Royal Caste, rules over. Skrell are strict herbivores who are unable to eat large quantities of \ @@ -117,27 +111,36 @@ var/obj/item/shoes = H.get_equipped_item(slot_shoes_str) if(!shoes) var/list/bloodDNA - var/list/blood_data = REAGENT_DATA(H.vessel, /decl/material/liquid/blood) + var/list/blood_data = REAGENT_DATA(H.vessel, blood_reagent) if(blood_data) bloodDNA = list(blood_data[DATA_BLOOD_DNA] = blood_data[DATA_BLOOD_TYPE]) else bloodDNA = list() - if(T.simulated) - 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) + T.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints, bloodDNA, H.dir, 0, H.get_skin_colour() + "25") // Coming (25 is the alpha value) if(isturf(old_loc)) var/turf/old_turf = old_loc - if(old_turf.simulated) - 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) + old_turf.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints, bloodDNA, 0, H.dir, H.get_skin_colour() + "25") // Going (25 is the alpha value) /decl/species/skrell/check_background() return TRUE +/decl/material/liquid/mucus/skrell + name = "slime" + uid = "chem_mucus_skrell" + lore_text = "A gooey semi-liquid secreted by skrellian skin." + +// Copied from blood. +// TODO: There's not currently a way to check this, which might be a little annoying for forensics. +// But this is just a stopgap to stop Skrell from literally leaking blood everywhere they go. +/decl/material/liquid/mucus/skrell/get_reagent_color(datum/reagents/holder) + var/list/goo_data = REAGENT_DATA(holder, type) + return goo_data?[DATA_BLOOD_COLOR] || ..() + /obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints name = "wet footprints" desc = "They look like still wet tracks left by skrellian feet." + chemical = /decl/material/liquid/mucus/skrell -/obj/effect/decal/cleanable/blood/tracks/footprints/skrellprints/dry() - qdel(src) /obj/item/organ/internal/eyes/skrell name = "amphibian eyes" desc = "Large black orbs, belonging to some sort of giant frog by looks of it." diff --git a/mods/species/bayliens/tajaran/_tajaran.dm b/mods/species/bayliens/tajaran/_tajaran.dm index b4e664e999b..151b2b1c8a7 100644 --- a/mods/species/bayliens/tajaran/_tajaran.dm +++ b/mods/species/bayliens/tajaran/_tajaran.dm @@ -1,6 +1,4 @@ #define LANGUAGE_TAJARA "Siik'maas" -#define BODYTYPE_FELINE "feline body" -#define BODY_EQUIP_FLAG_FELINE BITFLAG(7) /obj/item/clothing/setup_equip_flags() . = ..() diff --git a/mods/species/bayliens/tajaran/datum/species.dm b/mods/species/bayliens/tajaran/datum/species.dm index 231ed1684f0..19de51ffc36 100644 --- a/mods/species/bayliens/tajaran/datum/species.dm +++ b/mods/species/bayliens/tajaran/datum/species.dm @@ -45,13 +45,6 @@ thirst_factor = DEFAULT_THIRST_FACTOR * 1.2 gluttonous = GLUT_TINY - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch, - /decl/natural_attack/bite/sharp - ) - move_trail = /obj/effect/decal/cleanable/blood/tracks/paw available_background_info = list( diff --git a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm index 9dbd49a90fe..0088067d9b2 100644 --- a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm +++ b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm @@ -16,6 +16,7 @@ base_eye_color = "#00aa00" nail_noun = "claws" uid = "bodytype_feline" + footprints_icon = 'icons/mob/footprints/footprints_paw.dmi' age_descriptor = /datum/appearance_descriptor/age/tajaran @@ -27,7 +28,10 @@ eye_low_light_vision_adjustment_speed = 0.3 override_limb_types = list( - BP_TAIL = /obj/item/organ/external/tail/cat + BP_TAIL = /obj/item/organ/external/tail/cat, + BP_HEAD = /obj/item/organ/external/head/sharp_bite, + BP_L_HAND = /obj/item/organ/external/hand/clawed, + BP_R_HAND = /obj/item/organ/external/hand/right/clawed ) default_sprite_accessories = list( @@ -52,10 +56,25 @@ ) /decl/bodytype/feline/Initialize() - equip_adjust = list( - 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)) + _equip_adjust = list( + (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) + ) ) . = ..() diff --git a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm index af8842c7b19..e3be8485345 100644 --- a/mods/species/bayliens/tajaran/machinery/suit_cycler.dm +++ b/mods/species/bayliens/tajaran/machinery/suit_cycler.dm @@ -2,70 +2,51 @@ LAZYDISTINCTADD(available_bodytypes, BODYTYPE_FELINE) . = ..() -/obj/item/clothing/suit/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi') +/obj/item/clothing/suit/space/void/merc + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/merc/suit.dmi' -/obj/item/clothing/suit/space/void/swat/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi') +/obj/item/clothing/suit/space/void/swat + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/deathsquad/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi') +/obj/item/clothing/suit/space/void/engineering + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/engineering/suit.dmi' -/obj/item/clothing/suit/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi') +/obj/item/clothing/suit/space/void/mining + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/mining/suit.dmi' -/obj/item/clothing/suit/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi') +/obj/item/clothing/suit/space/void/medical + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/medical/suit.dmi' -/obj/item/clothing/suit/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi') +/obj/item/clothing/suit/space/void/security + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/sec/suit.dmi' -/obj/item/clothing/suit/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi') +/obj/item/clothing/suit/space/void/atmos + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/atmos/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/engineering_alt/suit.dmi' -/obj/item/clothing/suit/space/void/mining/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi') +/obj/item/clothing/suit/space/void/mining/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/mining_alt/suit.dmi' -/obj/item/clothing/suit/space/void/medical/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi') +/obj/item/clothing/suit/space/void/medical/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/medical_alt/suit.dmi' -/obj/item/clothing/suit/space/void/security/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi') +/obj/item/clothing/suit/space/void/security/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/sec_alt/suit.dmi' -/obj/item/clothing/suit/space/void/atmos/alt/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi') +/obj/item/clothing/suit/space/void/atmos/alt + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/atmos_alt/suit.dmi' -/obj/item/clothing/suit/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/salvage + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/salvage/suit.dmi' -/obj/item/clothing/suit/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi') +/obj/item/clothing/suit/space/void/expedition + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/pilot/suit.dmi' -/obj/item/clothing/suit/space/void/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi') +/obj/item/clothing/suit/space/void + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/nasa/suit.dmi' -/obj/item/clothing/suit/space/void/wizard/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/wizard/suit.dmi') -/obj/item/clothing/suit/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_FELINE, 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi') +/obj/item/clothing/suit/space/void/excavation + _feline_onmob_icon = 'mods/species/bayliens/tajaran/icons/clothing/excavation/suit.dmi' diff --git a/mods/species/bayliens/tritonian/datum/species.dm b/mods/species/bayliens/tritonian/datum/species.dm index a6e415dbce0..84491dd46cf 100644 --- a/mods/species/bayliens/tritonian/datum/species.dm +++ b/mods/species/bayliens/tritonian/datum/species.dm @@ -13,10 +13,3 @@ body_temperature = 302 water_soothe_amount = 5 - - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch, - /decl/natural_attack/bite/sharp - ) diff --git a/mods/species/bayliens/tritonian/datum/species_bodytypes.dm b/mods/species/bayliens/tritonian/datum/species_bodytypes.dm index 0e5614f62d5..dadaac398a3 100644 --- a/mods/species/bayliens/tritonian/datum/species_bodytypes.dm +++ b/mods/species/bayliens/tritonian/datum/species_bodytypes.dm @@ -6,6 +6,9 @@ override_organ_types = list( BP_LUNGS = /obj/item/organ/internal/lungs/gills ) + override_limb_types = list( + BP_HEAD = /obj/item/organ/external/head/sharp_bite + ) /decl/bodytype/human/tritonian/masculine name = "masculine" diff --git a/mods/species/bayliens/unathi/datum/species.dm b/mods/species/bayliens/unathi/datum/species.dm index 43ab46e0049..ad4a508329b 100644 --- a/mods/species/bayliens/unathi/datum/species.dm +++ b/mods/species/bayliens/unathi/datum/species.dm @@ -24,13 +24,6 @@ /decl/bodytype/lizard, /decl/bodytype/lizard/masculine ) - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/tail, - /decl/natural_attack/claws, - /decl/natural_attack/punch, - /decl/natural_attack/bite/sharp - ) available_accessory_categories = list( SAC_HORNS, diff --git a/mods/species/bayliens/unathi/datum/species_bodytypes.dm b/mods/species/bayliens/unathi/datum/species_bodytypes.dm index 33fef3a1188..226241bc9a1 100644 --- a/mods/species/bayliens/unathi/datum/species_bodytypes.dm +++ b/mods/species/bayliens/unathi/datum/species_bodytypes.dm @@ -10,7 +10,7 @@ limb_icon_intensity = 0.7 health_hud_intensity = 2 associated_gender = FEMALE - onmob_state_modifiers = list(slot_w_uniform_str = "f") + onmob_state_modifiers = list((slot_w_uniform_str) = "f") movement_slowdown = 0.5 base_color = "#066000" appearance_flags = HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR @@ -18,6 +18,7 @@ eye_flash_mod = 1.2 nail_noun = "claws" uid = "bodytype_unathi_fem" + footprints_icon = 'mods/species/bayliens/unathi/icons/footprints.dmi' age_descriptor = /datum/appearance_descriptor/age/lizard @@ -33,19 +34,24 @@ ) override_organ_types = list( - BP_EYES = /obj/item/organ/internal/eyes/lizard, - BP_BRAIN = /obj/item/organ/internal/brain/lizard + BP_EYES = /obj/item/organ/internal/eyes/lizard, + BP_BRAIN = /obj/item/organ/internal/brain/lizard ) - override_limb_types = list(BP_TAIL = /obj/item/organ/external/tail/lizard) + override_limb_types = list( + BP_TAIL = /obj/item/organ/external/tail/lizard, + BP_HEAD = /obj/item/organ/external/head/strong_bite, + BP_L_HAND = /obj/item/organ/external/hand/clawed, + BP_R_HAND = /obj/item/organ/external/hand/right/clawed + ) - cold_level_1 = 280 //Default 260 - Lower is better - cold_level_2 = 220 //Default 200 - cold_level_3 = 130 //Default 120 + 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_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( @@ -80,3 +86,7 @@ /obj/item/organ/external/tail/lizard tail_icon = 'mods/species/bayliens/unathi/icons/tail.dmi' tail_animation_states = 9 + +/obj/item/organ/external/tail/lizard/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/tail) + return unarmed_attack diff --git a/mods/species/bayliens/unathi/icons/footprints.dmi b/mods/species/bayliens/unathi/icons/footprints.dmi new file mode 100644 index 00000000000..fe21767b108 Binary files /dev/null and b/mods/species/bayliens/unathi/icons/footprints.dmi differ diff --git a/mods/species/drakes/_drakes.dme b/mods/species/drakes/_drakes.dme index 44fa41725be..025f1c54c51 100644 --- a/mods/species/drakes/_drakes.dme +++ b/mods/species/drakes/_drakes.dme @@ -1,12 +1,8 @@ #ifndef MODPACK_DRAKES #define MODPACK_DRAKES - -#ifdef MODPACK_FANTASY -#warn Fantasy modpack loaded before Drakes modpack, compatibility features will be missing. -#endif - // BEGIN_INCLUDE #include "_drakes.dm" +#include "_overrides.dm" #include "clothing.dm" #include "culture.dm" #include "drake_abilities.dm" diff --git a/mods/species/drakes/_overrides.dm b/mods/species/drakes/_overrides.dm new file mode 100644 index 00000000000..a4246927c61 --- /dev/null +++ b/mods/species/drakes/_overrides.dm @@ -0,0 +1,10 @@ +/obj/item + var/_drake_onmob_icon + var/_drake_hatchling_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_drake_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, _drake_onmob_icon) + if(_drake_hatchling_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, _drake_hatchling_onmob_icon) diff --git a/mods/species/drakes/clothing.dm b/mods/species/drakes/clothing.dm index ac23b01ba19..63c803bc1db 100644 --- a/mods/species/drakes/clothing.dm +++ b/mods/species/drakes/clothing.dm @@ -1,21 +1,11 @@ +/obj/item/backpack + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/backpack.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi' -/obj/item/backpack/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/backpack.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi') +/obj/item/card/id + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/id.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_id.dmi' -/obj/item/card/id/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/id.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_id.dmi') - -/obj/item/bag/setup_sprite_sheets() - . = ..() - if(!(BODYTYPE_GRAFADREKA in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, 'mods/species/drakes/icons/clothing/sack.dmi') - if(!(BODYTYPE_GRAFADREKA_HATCHLING in sprite_sheets)) - LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA_HATCHLING, 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi') +/obj/item/bag + _drake_onmob_icon = 'mods/species/drakes/icons/clothing/sack.dmi' + _drake_hatchling_onmob_icon = 'mods/species/drakes/icons/clothing/hatchling_backpack.dmi' diff --git a/mods/species/drakes/drake_abilities.dm b/mods/species/drakes/drake_abilities.dm index dcd67a13ef7..fb4d7b0fcab 100644 --- a/mods/species/drakes/drake_abilities.dm +++ b/mods/species/drakes/drake_abilities.dm @@ -6,9 +6,11 @@ spit_projectile_type = /obj/item/projectile/drake_spit/weak /datum/ability_handler/predator/grafadreka/can_do_ranged_invocation(mob/user, atom/target) - return istype(user) && user.a_intent == I_HURT && !user.incapacitated() && isatom(target) + return ..() || (istype(user) && user.check_intent(I_FLAG_HARM) && !user.incapacitated() && isatom(target)) /datum/ability_handler/predator/grafadreka/do_ranged_invocation(mob/user, atom/target) + if((. = ..())) + return if(world.time < next_spit) to_chat(user, SPAN_WARNING("You cannot spit again so soon!")) return TRUE @@ -24,9 +26,9 @@ return TRUE /datum/ability_handler/predator/grafadreka/do_melee_invocation(mob/user, atom/target) - if(user.a_intent == I_HURT) - return ..() // Handled by predator ability handler. + if((. = ..())) + return // Healing - if(user.a_intent == I_HELP && isliving(target)) + if(user.check_intent(I_FLAG_HELP) && isliving(target)) return handle_wound_cleaning(user, target) return FALSE diff --git a/mods/species/drakes/drake_abilities_friendly.dm b/mods/species/drakes/drake_abilities_friendly.dm index 6a1d8796c13..a224540e988 100644 --- a/mods/species/drakes/drake_abilities_friendly.dm +++ b/mods/species/drakes/drake_abilities_friendly.dm @@ -86,7 +86,7 @@ var/global/list/_wounds_being_tended_by_drakes = list() // Sivian animals get a heal buff from the modifier, others just // get it to stop friendly drakes constantly licking their wounds. // Organ wounds are closed, but the owners get sifsap injected via open wounds. - friend.add_aura(new /obj/aura/sifsap_salve(null, 60 SECONDS)) + friend.add_aura(new /obj/aura/sifsap_salve(friend, 60 SECONDS)) var/list/friend_organs = friend.get_external_organs() if(length(friend_organs)) for (var/obj/item/organ/external/E in friend_organs) diff --git a/mods/species/drakes/drake_attacks.dm b/mods/species/drakes/drake_attacks.dm index df214d9fc54..53d3fe7addc 100644 --- a/mods/species/drakes/drake_attacks.dm +++ b/mods/species/drakes/drake_attacks.dm @@ -16,25 +16,31 @@ wound.disinfected = FALSE // 50% damage bonus on prone, stunned or confused enemies. +/decl/natural_attack/bite/sharp/drake + damage = 12 // chomp + /decl/natural_attack/bite/sharp/drake/get_unarmed_damage(mob/living/user, mob/living/victim) . = ..() if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN)) . = max(1, round(. * 1.5)) +/decl/natural_attack/claws/strong/drake + damage = 8 // chonky for digging + /decl/natural_attack/claws/strong/drake/get_unarmed_damage(mob/living/user, mob/living/victim) . = ..() if(victim.current_posture?.prone || HAS_STATUS(victim, STAT_CONFUSE) || HAS_STATUS(victim, STAT_STUN)) . = max(1, round(. * 1.5)) // Raises germ level of wounds on attack. -/decl/natural_attack/bite/sharp/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/bite/sharp/drake/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(. && drake_spend_sap(user, 5)) var/obj/item/organ/external/bit = target.get_organ(zone) if(bit) drake_infect_wounds(bit) -/decl/natural_attack/claws/strong/drake/apply_effects(mob/living/user, mob/living/target, attack_damage, zone) +/decl/natural_attack/claws/strong/drake/apply_attack_effects(mob/living/user, mob/living/target, attack_damage, zone) . = ..() if(. && drake_spend_sap(user, 5)) var/obj/item/organ/external/bit = target.get_organ(zone) diff --git a/mods/species/drakes/icons/damage.dmi b/mods/species/drakes/icons/damage.dmi new file mode 100644 index 00000000000..189ce8a346c Binary files /dev/null and b/mods/species/drakes/icons/damage.dmi differ diff --git a/mods/species/drakes/sifsap.dm b/mods/species/drakes/sifsap.dm index f0fd4f179ef..5334839e70f 100644 --- a/mods/species/drakes/sifsap.dm +++ b/mods/species/drakes/sifsap.dm @@ -44,9 +44,9 @@ M.add_chemical_effect(CE_PULSE, -1) return ..() -/decl/material/liquid/sifsap/affect_overdose(mob/living/M, total_dose) - if(M.has_trait(/decl/trait/sivian_biochemistry)) +/decl/material/liquid/sifsap/affect_overdose(mob/living/victim, total_dose) + if(victim.has_trait(/decl/trait/sivian_biochemistry)) return - M.apply_damage(1, IRRADIATE) - SET_STATUS_MAX(M, 5, STAT_DROWSY) + victim.apply_damage(1, IRRADIATE) + SET_STATUS_MAX(victim, 5, STAT_DROWSY) return ..() diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index bbc187694bf..a3a14352074 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -20,10 +20,7 @@ /decl/pronouns/male, /decl/pronouns/female ) - unarmed_attacks = list( - /decl/natural_attack/bite/sharp/drake, - /decl/natural_attack/claws/strong/drake - ) + force_background_info = list( /decl/background_category/heritage = /decl/background_detail/heritage/grafadreka, /decl/background_category/homeworld = /decl/background_detail/location/grafadreka, @@ -37,16 +34,11 @@ traits = list( /decl/trait/sivian_biochemistry = TRAIT_LEVEL_EXISTS ) + move_trail = /obj/effect/decal/cleanable/blood/tracks/paw // Drakes must be whitelisted for jobs to be able to join as them, see maps.dm. job_blacklist_by_default = TRUE spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED - character_preview_screen_locs = list( - "1" = "character_preview_map:1,4:36", - "2" = "character_preview_map:1,3:31", - "4" = "character_preview_map:1,2:26", - "8" = "character_preview_map:1,1:21" - ) var/list/adult_pain_emotes_with_pain_level = list( list(/decl/emote/audible/drake_huff, /decl/emote/audible/drake_rattle) = 20 @@ -63,15 +55,12 @@ pain_emotes_with_pain_level = adult_pain_emotes_with_pain_level return ..() -/decl/species/grafadreka/get_surgery_overlay_icon(var/mob/living/human/H) - return null // todo: 'mods/species/drakes/icons/surgery.dmi' - // Stub for muscle memory of the Sit verb on Polaris. /mob/living/human/proc/drake_sit() set name = "Sit" set category = "IC" set src = usr - lay_down() + lay_down(block_posture = /decl/posture/lying) /datum/hud_data/grafadreka inventory_slots = list( diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index daec4b0ea06..aae52bd678a 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -28,18 +28,27 @@ eye_icon = 'mods/species/drakes/icons/eyes.dmi' icon_template = 'mods/species/drakes/icons/template.dmi' skeletal_icon = 'mods/species/drakes/icons/skeleton.dmi' + damage_overlays = 'mods/species/drakes/icons/damage.dmi' + surgery_overlay_icon = null // todo: 'mods/species/drakes/icons/surgery.dmi' bodytype_category = BODYTYPE_GRAFADREKA eye_blend = ICON_MULTIPLY limb_blend = ICON_MULTIPLY appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR mob_size = MOB_SIZE_LARGE - override_limb_types = list(BP_TAIL = /obj/item/organ/external/tail/grafadreka) + override_limb_types = list( + BP_TAIL = /obj/item/organ/external/tail/grafadreka, + BP_L_HAND = /obj/item/organ/external/hand/quadruped/grafadreka, + BP_R_HAND = /obj/item/organ/external/hand/right/quadruped/grafadreka, + BP_HEAD = /obj/item/organ/external/head/gripper/grafadreka + ) base_color = "#608894" base_eye_color = COLOR_SILVER pixel_offset_x = -16 antaghud_offset_x = 16 override_organ_types = list(BP_DRAKE_GIZZARD = /obj/item/organ/internal/drake_gizzard) uid = "bodytype_drake" + footprints_icon = 'icons/mob/footprints/footprints_paw.dmi' + additional_emotes = list( /decl/emote/audible/drake_warble, /decl/emote/audible/drake_purr, @@ -88,6 +97,13 @@ /decl/emote/visible/tfist ) + character_preview_screen_locs = list( + "1" = "character_preview_map:1,4:36", + "2" = "character_preview_map:1,3:31", + "4" = "character_preview_map:1,2:26", + "8" = "character_preview_map:1,1:21" + ) + available_mob_postures = list( /decl/posture/standing, /decl/posture/lying/drake, @@ -118,48 +134,58 @@ eye_low_light_vision_adjustment_speed = 0.3 eye_darksight_range = 7 - var/list/sitting_equip_adjust - var/list/lying_equip_adjust + // Copied from riot armor, as drakes cannot wear equipment + // or hold shields. May need to be toned down at some point. + natural_armour_values = list( + ARMOR_MELEE = ARMOR_MELEE_VERY_HIGH, + ARMOR_BULLET = ARMOR_BALLISTIC_SMALL, + ARMOR_LASER = ARMOR_LASER_SMALL, + ARMOR_ENERGY = ARMOR_ENERGY_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED + ) + + VAR_PRIVATE/list/_sitting_equip_adjust + VAR_PRIVATE/list/_lying_equip_adjust /decl/bodytype/quadruped/grafadreka/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - slot_head_str = list( + if(!length(_equip_adjust)) + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(16, -8), "[SOUTH]" = list(16, -12), - "[EAST]" = list(38, -8), - "[WEST]" = list(-6, -8) + "[EAST]" = list(38, -8), + "[WEST]" = list(-6, -8) ) ) - if(!length(sitting_equip_adjust)) - sitting_equip_adjust = list( - slot_head_str = list( + if(!length(_sitting_equip_adjust)) + _sitting_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list(16, -2), "[SOUTH]" = list(16, -2), - "[EAST]" = list(22, -2), - "[WEST]" = list(12, -2) + "[EAST]" = list(22, -2), + "[WEST]" = list(12, -2) ) ) - if(!length(lying_equip_adjust)) - lying_equip_adjust = list( - slot_head_str = list( + if(!length(_lying_equip_adjust)) + _lying_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 24, -24), "[SOUTH]" = list( 24, -24), - "[EAST]" = list( 24, -24), - "[WEST]" = list(-10, -24) + "[EAST]" = list( 24, -24), + "[WEST]" = list(-10, -24) ) ) return ..() -/decl/bodytype/quadruped/grafadreka/get_equip_adjust(mob/mob) +/decl/bodytype/quadruped/grafadreka/get_equip_adjustments(mob/mob) switch(mob.current_posture?.name) if("lying", "resting") - return lying_equip_adjust + return _lying_equip_adjust if("sitting") - return sitting_equip_adjust + return _sitting_equip_adjust return ..() /decl/bodytype/quadruped/grafadreka/hatchling @@ -168,6 +194,7 @@ blood_overlays = 'mods/species/drakes/icons/hatchling_blood.dmi' eye_icon = 'mods/species/drakes/icons/hatchling_eyes.dmi' icon_template = 'icons/mob/human_races/species/template.dmi' + damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' bodytype_category = BODYTYPE_GRAFADREKA_HATCHLING mob_size = MOB_SIZE_SMALL pixel_offset_x = 0 @@ -176,9 +203,14 @@ /datum/ability_handler/predator/grafadreka/hatchling ) z_flags = 0 + // TODO: weaker attack subtypes for the baby override_limb_types = list( - BP_TAIL = /obj/item/organ/external/tail/grafadreka/hatchling + BP_TAIL = /obj/item/organ/external/tail/grafadreka/hatchling, + BP_L_HAND = /obj/item/organ/external/hand/quadruped/grafadreka, + BP_R_HAND = /obj/item/organ/external/hand/right/quadruped/grafadreka, + BP_HEAD = /obj/item/organ/external/head/gripper/grafadreka ) + default_emotes = list( /decl/emote/audible/drake_hatchling_growl, /decl/emote/audible/drake_hatchling_whine, @@ -187,34 +219,35 @@ /decl/emote/audible/drake_sneeze ) age_descriptor = /datum/appearance_descriptor/age/grafadreka/hatchling + character_preview_screen_locs = null uid = "bodytype_drake_hatchling" /decl/bodytype/quadruped/grafadreka/hatchling/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - slot_head_str = list( + if(!length(_equip_adjust)) + _equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -18), "[SOUTH]" = list( 0, -18), - "[EAST]" = list( 8, -18), - "[WEST]" = list(-8, -18) + "[EAST]" = list( 8, -18), + "[WEST]" = list(-8, -18) ) ) - if(!length(sitting_equip_adjust)) - sitting_equip_adjust = list( - slot_head_str = list( + if(!length(_sitting_equip_adjust)) + _sitting_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -14), "[SOUTH]" = list( 0, -14), - "[EAST]" = list( 4, -14), - "[WEST]" = list(-4, -14) + "[EAST]" = list( 4, -14), + "[WEST]" = list(-4, -14) ) ) - if(!length(lying_equip_adjust)) - lying_equip_adjust = list( - slot_head_str = list( + if(!length(_lying_equip_adjust)) + _lying_equip_adjust = list( + (slot_head_str) = list( "[NORTH]" = list( 0, -24), "[SOUTH]" = list( 0, -24), - "[EAST]" = list( 0, -24), - "[WEST]" = list( 0, -24) + "[EAST]" = list( 0, -24), + "[WEST]" = list( 0, -24) ) ) return ..() @@ -274,3 +307,48 @@ /obj/item/organ/external/tail/grafadreka/hatchling tail_icon = 'mods/species/drakes/icons/hatchling_body.dmi' + +// Technically means that severed drake paws can be used as shovels, but whatever. +/obj/item/organ/external/hand/quadruped/grafadreka + _base_attack_force = 8 + needs_attack_dexterity = DEXTERITY_NONE + +/obj/item/organ/external/hand/quadruped/grafadreka/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/claws/strong/drake) + return unarmed_attack + +/obj/item/organ/external/hand/quadruped/grafadreka/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) + . = ..() + item_flags |= ITEM_FLAG_NO_BLUDGEON + set_extension(src, /datum/extension/tool, list( + TOOL_SHOVEL = TOOL_QUALITY_GOOD, + TOOL_HOE = TOOL_QUALITY_GOOD + )) + +/obj/item/organ/external/hand/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) + override_material = /decl/material/solid/organic/bone + . = ..() + +/obj/item/organ/external/hand/right/quadruped/grafadreka + _base_attack_force = 8 + needs_attack_dexterity = DEXTERITY_NONE + +/obj/item/organ/external/hand/right/quadruped/grafadreka/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/claws/strong/drake) + return unarmed_attack + +/obj/item/organ/external/hand/right/quadruped/grafadreka/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) + . = ..() + item_flags |= ITEM_FLAG_NO_BLUDGEON + set_extension(src, /datum/extension/tool, list( + TOOL_SHOVEL = TOOL_QUALITY_GOOD, + TOOL_HOE = TOOL_QUALITY_GOOD + )) + +/obj/item/organ/external/hand/right/quadruped/grafadreka/set_bodytype(decl/bodytype/new_bodytype, override_material, apply_to_internal_organs) + override_material = /decl/material/solid/organic/bone + . = ..() + +/obj/item/organ/external/head/gripper/grafadreka/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/bite/sharp/drake) + return unarmed_attack diff --git a/mods/species/neoavians/_neoavians.dme b/mods/species/neoavians/_neoavians.dme index e7c8d526399..6c5b71cb056 100644 --- a/mods/species/neoavians/_neoavians.dme +++ b/mods/species/neoavians/_neoavians.dme @@ -2,6 +2,7 @@ #define CONTENT_PACK_NEOAVIANS // BEGIN_INCLUDE #include "_neoavians.dm" +#include "_overrides.dm" #include "clothing.dm" #include "datum\accessory.dm" #include "datum\language.dm" diff --git a/mods/species/neoavians/_overrides.dm b/mods/species/neoavians/_overrides.dm new file mode 100644 index 00000000000..1d745db0a6f --- /dev/null +++ b/mods/species/neoavians/_overrides.dm @@ -0,0 +1,7 @@ +/obj/item + var/_avian_onmob_icon + +/obj/item/setup_sprite_sheets() + . = ..() + if(_avian_onmob_icon) + LAZYSET(sprite_sheets, BODYTYPE_AVIAN, _avian_onmob_icon) diff --git a/mods/species/neoavians/clothing.dm b/mods/species/neoavians/clothing.dm index 253e9fa2c5e..f4cdcaaed1b 100644 --- a/mods/species/neoavians/clothing.dm +++ b/mods/species/neoavians/clothing.dm @@ -1,11 +1,9 @@ //Shoes -/obj/item/clothing/shoes/magboots/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/feet/magboots.dmi') +/obj/item/clothing/shoes/magboots + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/magboots.dmi' -/obj/item/clothing/shoes/galoshes/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/feet/galoshes.dmi') +/obj/item/clothing/shoes/galoshes + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/galoshes.dmi' //Gloves /obj/item/clothing/gloves/setup_equip_flags() @@ -13,34 +11,32 @@ if(!isnull(bodytype_equip_flags) && !(bodytype_equip_flags & BODY_EQUIP_FLAG_EXCLUDE)) bodytype_equip_flags |= BODY_EQUIP_FLAG_AVIAN -/obj/item/clothing/gloves/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/gloves.dmi') +/obj/item/clothing/gloves + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/gloves.dmi' -//Backpacks & tanks +/obj/item/clothing/gloves/ring + _avian_onmob_icon = null -/obj/item/backpack/satchel/Initialize() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/satchel.dmi') +//Backpacks & tanks +/obj/item/backpack/satchel + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/satchel.dmi' //Radsuits (theyre essential?) +/obj/item/clothing/head/radiation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi' -/obj/item/clothing/head/radiation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi') +/obj/item/clothing/head/radiation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/head/rad_helm.dmi' -/obj/item/clothing/suit/radiation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/suit/rad_suit.dmi') +/obj/item/clothing/suit/radiation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/suit/rad_suit.dmi' //cloaks -/obj/item/clothing/suit/cloak/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/accessory/cloak.dmi') +/obj/item/clothing/suit/cloak + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/accessory/cloak.dmi' -/obj/item/clothing/suit/cloak/hide/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/accessory/cloak_hide.dmi') +/obj/item/clothing/suit/cloak/hide + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/accessory/cloak_hide.dmi' //clothing /obj/item/clothing/dress/avian_smock @@ -49,6 +45,7 @@ icon = 'mods/species/neoavians/icons/clothing/under/smock.dmi' icon_state = ICON_STATE_WORLD bodytype_equip_flags = BODY_EQUIP_FLAG_AVIAN + _avian_onmob_icon = null /obj/item/clothing/dress/avian_smock/worker name = "worker's smock" @@ -81,11 +78,16 @@ name = "stylish uniform" icon = 'mods/species/neoavians/icons/clothing/under/stylish_form.dmi' +/obj/item/clothing/shoes + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi' + /obj/item/clothing/shoes/avian name = "small shoes" icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi' color = COLOR_GRAY bodytype_equip_flags = BODY_EQUIP_FLAG_AVIAN + _avian_onmob_icon = null + icon = 'mods/species/neoavians/icons/clothing/feet/shoes.dmi' /obj/item/clothing/shoes/avian/footwraps name = "cloth footwraps" diff --git a/mods/species/neoavians/datum/species.dm b/mods/species/neoavians/datum/species.dm index a0bfea025ed..065b6c6d932 100644 --- a/mods/species/neoavians/datum/species.dm +++ b/mods/species/neoavians/datum/species.dm @@ -52,12 +52,6 @@ swap_flags = MONKEY|SIMPLE_ANIMAL push_flags = MONKEY|SIMPLE_ANIMAL - unarmed_attacks = list( - /decl/natural_attack/bite/sharp, - /decl/natural_attack/claws, - /decl/natural_attack/stomp/weak - ) - available_background_info = list( /decl/background_category/heritage = list( /decl/background_detail/heritage/neoavian, diff --git a/mods/species/neoavians/datum/species_bodytypes.dm b/mods/species/neoavians/datum/species_bodytypes.dm index 204832b50f2..dd1b48d63e3 100644 --- a/mods/species/neoavians/datum/species_bodytypes.dm +++ b/mods/species/neoavians/datum/species_bodytypes.dm @@ -39,6 +39,13 @@ base_eye_color = "#f5c842" mob_size = MOB_SIZE_SMALL nail_noun = "talons" + override_limb_types = list( + BP_L_FOOT = /obj/item/organ/external/foot/avian, + BP_R_FOOT = /obj/item/organ/external/foot/right/avian, + BP_L_HAND = /obj/item/organ/external/hand/clawed, + BP_R_HAND = /obj/item/organ/external/hand/right/clawed, + BP_HEAD = /obj/item/organ/external/head/sharp_bite + ) has_organ = list( BP_STOMACH = /obj/item/organ/internal/stomach, BP_HEART = /obj/item/organ/internal/heart, @@ -94,19 +101,79 @@ uid = "bodytype_avian_additive_raptor" /decl/bodytype/avian/Initialize() - equip_adjust = list( - 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_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)) + _equip_adjust = list( + (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_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) + ) ) . = ..() diff --git a/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi b/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi index fe7e1534a7e..645c2a006bf 100644 Binary files a/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi and b/mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi differ diff --git a/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi new file mode 100644 index 00000000000..779b0d77fe4 Binary files /dev/null and b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi differ diff --git a/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi new file mode 100644 index 00000000000..c84f8e938c6 Binary files /dev/null and b/mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi differ diff --git a/mods/species/neoavians/machinery/suit_cycler.dm b/mods/species/neoavians/machinery/suit_cycler.dm index 9b368c30577..4397f39c94d 100644 --- a/mods/species/neoavians/machinery/suit_cycler.dm +++ b/mods/species/neoavians/machinery/suit_cycler.dm @@ -4,86 +4,69 @@ //mining -/obj/item/clothing/suit/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi') +/obj/item/clothing/suit/space/void/mining + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi' -/obj/item/clothing/head/helmet/space/void/mining/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/mining + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi' //excavation +/obj/item/clothing/suit/space/void/excavation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi' -/obj/item/clothing/suit/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/suit.dmi') - -/obj/item/clothing/head/helmet/space/void/excavation/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/excavation + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/mining/helmet.dmi' //engineering +/obj/item/clothing/head/helmet/space/void/engineering + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/helmet.dmi' -/obj/item/clothing/head/helmet/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/helmet.dmi') - -/obj/item/clothing/suit/space/void/engineering/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/suit.dmi') +/obj/item/clothing/suit/space/void/engineering + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/engineering/suit.dmi' -/obj/item/clothing/head/helmet/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/atmos + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/helmet.dmi' -/obj/item/clothing/suit/space/void/atmos/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/suit.dmi') +/obj/item/clothing/suit/space/void/atmos + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/atmos/suit.dmi' //medical +/obj/item/clothing/suit/space/void/medical + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/suit.dmi' -/obj/item/clothing/suit/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/suit.dmi') +/obj/item/clothing/head/helmet/space/void/medical + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi' -/obj/item/clothing/head/helmet/space/void/medical/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/medical/helmet.dmi') +/obj/item/clothing/suit/space/void/medical/alt + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/suit.dmi' -//security +/obj/item/clothing/head/helmet/space/void/medical/alt + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/medical_alt/helmet.dmi' -/obj/item/clothing/head/helmet/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/helmet.dmi') +//security +/obj/item/clothing/head/helmet/space/void/security + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/helmet.dmi' -/obj/item/clothing/suit/space/void/security/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/suit.dmi') +/obj/item/clothing/suit/space/void/security + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/sec/suit.dmi' //salvage +/obj/item/clothing/head/helmet/space/void/engineering/salvage + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/helmet.dmi' -/obj/item/clothing/head/helmet/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/helmet.dmi') - -/obj/item/clothing/suit/space/void/engineering/salvage/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/suit.dmi') +/obj/item/clothing/suit/space/void/engineering/salvage + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/salvage/suit.dmi' //pilot -/obj/item/clothing/head/helmet/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/expedition + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/helmet.dmi' -/obj/item/clothing/suit/space/void/expedition/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/suit.dmi') +/obj/item/clothing/suit/space/void/expedition + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/pilot/suit.dmi' //merc -/obj/item/clothing/head/helmet/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/helmet.dmi') +/obj/item/clothing/head/helmet/space/void/merc + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/helmet.dmi' -/obj/item/clothing/suit/space/void/merc/setup_sprite_sheets() - . = ..() - LAZYSET(sprite_sheets, BODYTYPE_AVIAN, 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/suit.dmi') \ No newline at end of file +/obj/item/clothing/suit/space/void/merc + _avian_onmob_icon = 'mods/species/neoavians/icons/clothing/spacesuit/void/merc/suit.dmi' \ No newline at end of file diff --git a/mods/species/serpentid/datum/species.dm b/mods/species/serpentid/datum/species.dm index ecdce4d3f90..8dc853194d4 100644 --- a/mods/species/serpentid/datum/species.dm +++ b/mods/species/serpentid/datum/species.dm @@ -49,13 +49,6 @@ brute_mod = 0.9 burn_mod = 1.35 - natural_armour_values = list( - ARMOR_MELEE = ARMOR_MELEE_KNIVES, - ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, - ARMOR_BOMB = ARMOR_BOMB_PADDED, - ARMOR_BIO = ARMOR_BIO_SHIELDED, - ARMOR_RAD = 0.5*ARMOR_RAD_MINOR - ) gluttonous = GLUT_SMALLER strength = STR_HIGH breath_pressure = 25 @@ -67,8 +60,6 @@ swap_flags = ALLMOBS move_trail = /obj/effect/decal/cleanable/blood/tracks/snake - unarmed_attacks = list(/decl/natural_attack/forelimb_slash) - pain_emotes_with_pain_level = list( list(/decl/emote/audible/bug_hiss) = 40 ) @@ -84,8 +75,8 @@ #undef SERPENTID_FLIGHT_PRESSURE_THRESHOLD /decl/species/serpentid/handle_environment_special(var/mob/living/human/H) - if(!H.on_fire && H.fire_stacks < 2) - H.fire_stacks += 0.2 + if(!H.is_on_fire() && H.get_fire_intensity() < 2) + H.adjust_fire_intensity(0.2) return /decl/species/serpentid/handle_fall_special(var/mob/living/human/H, var/turf/landing) @@ -108,12 +99,6 @@ return FALSE -/decl/species/serpentid/can_shred(var/mob/living/human/H, var/ignore_intent, var/ignore_antag) - if(!H.get_equipped_item(slot_handcuffed_str) || H.buckled) - return ..(H, ignore_intent, TRUE) - else - return 0 - /decl/species/serpentid/handle_movement_delay_special(var/mob/living/human/victim) var/tally = 0 victim.remove_cloaking_source(src) diff --git a/mods/species/serpentid/datum/species_bodytypes.dm b/mods/species/serpentid/datum/species_bodytypes.dm index 8e9bd1be3b4..947019f4db7 100644 --- a/mods/species/serpentid/datum/species_bodytypes.dm +++ b/mods/species/serpentid/datum/species_bodytypes.dm @@ -34,15 +34,16 @@ BP_HEAD = list("path" = /obj/item/organ/external/head/insectoid/serpentid), BP_L_ARM = list("path" = /obj/item/organ/external/arm/insectoid), BP_L_HAND = list("path" = /obj/item/organ/external/hand/insectoid), - BP_L_HAND_UPPER = list("path" = /obj/item/organ/external/hand/insectoid/upper), + BP_L_HAND_UPPER = list("path" = /obj/item/organ/external/hand/insectoid/upper/serpentid), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/insectoid), BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/insectoid), - BP_R_HAND_UPPER = list("path" = /obj/item/organ/external/hand/right/insectoid/upper), + BP_R_HAND_UPPER = list("path" = /obj/item/organ/external/hand/right/insectoid/upper/serpentid), BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/insectoid/serpentid), BP_L_LEG = list("path" = /obj/item/organ/external/leg/insectoid/serpentid), BP_L_FOOT = list("path" = /obj/item/organ/external/foot/insectoid/serpentid), BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/insectoid/serpentid) ) + appearance_descriptors = list( /datum/appearance_descriptor/height = 1.75, /datum/appearance_descriptor/body_length = 1 @@ -56,16 +57,65 @@ heat_level_2 = 440 //Default 400 heat_level_3 = 800 //Default 1000 + natural_armour_values = list( + ARMOR_MELEE = ARMOR_MELEE_KNIVES, + ARMOR_BULLET = ARMOR_BALLISTIC_MINOR, + ARMOR_BOMB = ARMOR_BOMB_PADDED, + ARMOR_BIO = ARMOR_BIO_SHIELDED, + ARMOR_RAD = 0.5*ARMOR_RAD_MINOR + ) + footprints_icon = 'icons/mob/footprints/footprints_snake.dmi' + /decl/bodytype/serpentid/Initialize() - equip_adjust = list( - 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)) + _equip_adjust = list( + (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) + ) ) . = ..() @@ -73,3 +123,11 @@ name = "green" icon_base = 'mods/species/serpentid/icons/body_green.dmi' uid = "bodytype_serpentid_green" + +/obj/item/organ/external/hand/insectoid/upper/serpentid/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/forelimb_slash) + return unarmed_attack + +/obj/item/organ/external/hand/right/insectoid/upper/serpentid/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/forelimb_slash) + return unarmed_attack diff --git a/mods/species/skrell/datum/species.dm b/mods/species/skrell/datum/species.dm index 59a1be8470a..76c57542f62 100644 --- a/mods/species/skrell/datum/species.dm +++ b/mods/species/skrell/datum/species.dm @@ -12,12 +12,6 @@ ) primitive_form = "Neaera" - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch, - /decl/natural_attack/bite - ) description = "The skrell are a highly advanced species of amphibians hailing from \ the system known as Qerr'Vallis, which translates to 'Star of the royals' or 'Light of the Crown'. \ diff --git a/mods/species/tajaran/datum/species.dm b/mods/species/tajaran/datum/species.dm index bc39f5beedc..e6e5c8673a7 100644 --- a/mods/species/tajaran/datum/species.dm +++ b/mods/species/tajaran/datum/species.dm @@ -52,13 +52,6 @@ thirst_factor = DEFAULT_THIRST_FACTOR * 1.2 gluttonous = GLUT_TINY - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch, - /decl/natural_attack/bite/sharp - ) - move_trail = /obj/effect/decal/cleanable/blood/tracks/paw default_emotes = list( diff --git a/mods/species/tajaran/datum/species_bodytypes.dm b/mods/species/tajaran/datum/species_bodytypes.dm index 7d46eb828c6..a6be9223460 100644 --- a/mods/species/tajaran/datum/species_bodytypes.dm +++ b/mods/species/tajaran/datum/species_bodytypes.dm @@ -27,9 +27,11 @@ eye_low_light_vision_adjustment_speed = 0.3 override_limb_types = list( - BP_TAIL = /obj/item/organ/external/tail/cat + BP_TAIL = /obj/item/organ/external/tail/cat, + BP_HEAD = /obj/item/organ/external/head/sharp_bite, + BP_L_HAND = /obj/item/organ/external/hand/clawed, + BP_R_HAND = /obj/item/organ/external/hand/right/clawed ) - default_sprite_accessories = list( SAC_HAIR = list(/decl/sprite_accessory/hair/taj/lynx = list(SAM_COLOR = "#46321c")), SAC_MARKINGS = list(/decl/sprite_accessory/marking/tajaran/ears = list(SAM_COLOR = "#ae7d32")) @@ -52,10 +54,10 @@ ) /decl/bodytype/feline/Initialize() - equip_adjust = list( - 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)) + _equip_adjust = list( + (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)) ) . = ..() diff --git a/mods/species/teshari/datum/species.dm b/mods/species/teshari/datum/species.dm index 961dcca689c..fee57b3d085 100644 --- a/mods/species/teshari/datum/species.dm +++ b/mods/species/teshari/datum/species.dm @@ -53,12 +53,6 @@ swap_flags = MONKEY|SIMPLE_ANIMAL push_flags = MONKEY|SIMPLE_ANIMAL - unarmed_attacks = list( - /decl/natural_attack/bite/sharp, - /decl/natural_attack/claws, - /decl/natural_attack/stomp/weak - ) - blood_types = list( /decl/blood_type/avian/taplus, /decl/blood_type/avian/taminus, diff --git a/mods/species/teshari/datum/species_bodytypes.dm b/mods/species/teshari/datum/species_bodytypes.dm index f6b07f3ab87..8ce0a9ee7e4 100644 --- a/mods/species/teshari/datum/species_bodytypes.dm +++ b/mods/species/teshari/datum/species_bodytypes.dm @@ -12,6 +12,13 @@ base_eye_color = "#f5c842" mob_size = MOB_SIZE_SMALL nail_noun = "talons" + override_limb_types = list( + BP_L_FOOT = /obj/item/organ/external/foot/avian, + BP_R_FOOT = /obj/item/organ/external/foot/right/avian, + BP_L_HAND = /obj/item/organ/external/hand/clawed, + BP_R_HAND = /obj/item/organ/external/hand/right/clawed, + BP_HEAD = /obj/item/organ/external/head/sharp_bite + ) has_organ = list( BP_STOMACH = /obj/item/organ/internal/stomach, BP_HEART = /obj/item/organ/internal/heart, @@ -21,7 +28,6 @@ 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_sprite_accessories = list( SAC_HAIR = list(/decl/sprite_accessory/hair/avian = list(SAM_COLOR = "#252525")), SAC_MARKINGS = list(/decl/sprite_accessory/marking/avian = list(SAM_COLOR = "#454545")) @@ -67,19 +73,19 @@ uid = "bodytype_avian_additive_raptor" /decl/bodytype/avian/Initialize() - equip_adjust = list( - 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_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)) + _equip_adjust = list( + (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_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)) ) . = ..() diff --git a/mods/species/unathi/datum/species.dm b/mods/species/unathi/datum/species.dm index 5eed1b3b6b5..9a63a510ab5 100644 --- a/mods/species/unathi/datum/species.dm +++ b/mods/species/unathi/datum/species.dm @@ -24,13 +24,6 @@ /decl/bodytype/unathi, /decl/bodytype/unathi/masculine ) - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/tail, - /decl/natural_attack/claws, - /decl/natural_attack/punch, - /decl/natural_attack/bite/sharp - ) available_accessory_categories = list( SAC_HORNS, diff --git a/mods/species/unathi/datum/species_bodytypes.dm b/mods/species/unathi/datum/species_bodytypes.dm index e3fe7d1cbe1..8f1278f846c 100644 --- a/mods/species/unathi/datum/species_bodytypes.dm +++ b/mods/species/unathi/datum/species_bodytypes.dm @@ -19,6 +19,13 @@ nail_noun = "claws" uid = "bodytype_unathi_fem" + override_limb_types = list( + BP_TAIL = /obj/item/organ/external/tail/unathi, + BP_HEAD = /obj/item/organ/external/head/strong_bite, + BP_L_HAND = /obj/item/organ/external/hand/clawed, + BP_R_HAND = /obj/item/organ/external/hand/right/clawed + ) + age_descriptor = /datum/appearance_descriptor/age/unathi default_sprite_accessories = list( @@ -80,3 +87,7 @@ /obj/item/organ/external/tail/unathi tail_icon = 'mods/species/unathi/icons/tail.dmi' tail_animation_states = 9 + +/obj/item/organ/external/tail/unathi/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/tail) + return unarmed_attack diff --git a/mods/species/utility_frames/species.dm b/mods/species/utility_frames/species.dm index 77a9f1f7ebc..ddfeb4ac191 100644 --- a/mods/species/utility_frames/species.dm +++ b/mods/species/utility_frames/species.dm @@ -32,11 +32,6 @@ preview_outfit = null - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch - ) available_pronouns = list( /decl/pronouns, /decl/pronouns/neuter @@ -92,11 +87,6 @@ preview_outfit = null - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/punch - ) available_pronouns = list( /decl/pronouns, /decl/pronouns/neuter diff --git a/mods/species/utility_frames/species_bodytypes.dm b/mods/species/utility_frames/species_bodytypes.dm index a60628a7c51..eaa1db4e356 100644 --- a/mods/species/utility_frames/species_bodytypes.dm +++ b/mods/species/utility_frames/species_bodytypes.dm @@ -10,7 +10,7 @@ body_flags = BODY_FLAG_NO_PAIN | BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS base_color = "#333355" base_eye_color = "#00ccff" - material = /decl/material/solid/metal/steel + organ_material = /decl/material/solid/metal/steel vital_organs = list( BP_BRAIN, BP_CELL @@ -32,14 +32,14 @@ uid = "bodytype_prosthetic_utility_frame" /decl/bodytype/prosthetic/utility_frame/Initialize() - equip_adjust = list( - "[slot_l_ear_str]" = list( + _equip_adjust = list( + (slot_l_ear_str) = list( "[NORTH]" = list( 2, 0), "[EAST]" = list( 0, 0), "[SOUTH]" = list(-2, 0), "[WEST]" = list( 0, 0) ), - "[slot_r_ear_str]" = list( + (slot_r_ear_str) = list( "[NORTH]" = list(-2, 0), "[EAST]" = list( 0, 0), "[SOUTH]" = list( 2, 0), @@ -49,7 +49,6 @@ . = ..() DEFINE_ROBOLIMB_DESIGNS(/decl/bodytype/prosthetic/utility_frame, utility_frame) - /decl/bodytype/prosthetic/utility_frame/positronic has_organ = list( BP_BRAIN = /obj/item/organ/internal/brain/robotic/positronic, diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index 99bd0717bac..0e0e635d99b 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -5,11 +5,9 @@ #include "mobs_vox.dm" #include "organs_vox.dm" #include "datum\accessories.dm" -#include "datum\antagonism.dm" #include "datum\cultures_vox.dm" #include "datum\descriptors_vox.dm" #include "datum\factions_vox.dm" -#include "datum\heist_compatibility.dm" #include "datum\language.dm" #include "datum\locations_vox.dm" #include "datum\outfits.dm" diff --git a/mods/species/vox/datum/antagonism.dm b/mods/species/vox/datum/antagonism.dm deleted file mode 100644 index 4b8c182ee3a..00000000000 --- a/mods/species/vox/datum/antagonism.dm +++ /dev/null @@ -1,4 +0,0 @@ -// Wizard -/obj/item/magic_rock/Initialize(ml, material_key) - LAZYSET(potentials, SPECIES_VOX, /spell/targeted/shapeshift/true_form) - . = ..() diff --git a/mods/species/vox/datum/outfits.dm b/mods/species/vox/datum/outfits.dm index d1e653cb68e..564db2796e4 100644 --- a/mods/species/vox/datum/outfits.dm +++ b/mods/species/vox/datum/outfits.dm @@ -12,9 +12,9 @@ hands = list(/obj/item/gun/launcher/alien/spikethrower) id_type = /obj/item/card/id/syndicate -/decl/outfit/vox_raider/equip_outfit(mob/living/human/H, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) +/decl/outfit/vox_raider/equip_outfit(mob/living/wearer, assignment, equip_adjustments, datum/job/job, datum/mil_rank/rank) uniform = pick(/obj/item/clothing/suit/robe/vox, /obj/item/clothing/pants/vox) 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/webbing/holster/armpit, /obj/item/clothing/webbing/holster/waist, /obj/item/clothing/webbing/holster/hip) . = ..() - H.set_internals(locate(/obj/item/tank) in H.contents) \ No newline at end of file + wearer.set_internals(locate(/obj/item/tank) in wearer.contents) \ No newline at end of file diff --git a/mods/species/vox/datum/species.dm b/mods/species/vox/datum/species.dm index 02f7fed9313..eac1ad15786 100644 --- a/mods/species/vox/datum/species.dm +++ b/mods/species/vox/datum/species.dm @@ -32,14 +32,6 @@ /mob/living/human/proc/toggle_vox_pressure_seal ) - unarmed_attacks = list( - /decl/natural_attack/stomp, - /decl/natural_attack/kick, - /decl/natural_attack/claws/strong/gloves, - /decl/natural_attack/punch, - /decl/natural_attack/bite/strong - ) - rarity_value = 4 description = {"The Vox are the broken remnants of a once-proud race, now reduced to little more diff --git a/mods/species/vox/datum/species_bodytypes.dm b/mods/species/vox/datum/species_bodytypes.dm index 25f4e64c180..092cfeb50b9 100644 --- a/mods/species/vox/datum/species_bodytypes.dm +++ b/mods/species/vox/datum/species_bodytypes.dm @@ -30,9 +30,13 @@ BP_BRAIN ) override_limb_types = list( - BP_GROIN = /obj/item/organ/external/groin/vox, - BP_TAIL = /obj/item/organ/external/tail/vox + BP_GROIN = /obj/item/organ/external/groin/vox, + BP_TAIL = /obj/item/organ/external/tail/vox, + BP_L_HAND = /obj/item/organ/external/hand/vox, + BP_R_HAND = /obj/item/organ/external/hand/right/vox, + BP_HEAD = /obj/item/organ/external/head/strong_bite ) + has_organ = list( BP_STOMACH = /obj/item/organ/internal/stomach/vox, BP_HEART = /obj/item/organ/internal/heart/vox, @@ -60,17 +64,62 @@ var/icon/vox_marking_icon = 'mods/species/vox/icons/body/soldier/markings.dmi' /decl/bodytype/vox/Initialize() - if(!length(equip_adjust)) - equip_adjust = list( - 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)) + if(!length(_equip_adjust)) + _equip_adjust = list( + (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 ..() @@ -127,3 +176,11 @@ /obj/item/organ/external/tail/vox/stanchion tail_icon = 'mods/species/vox/icons/body/stanchion/body.dmi' + +/obj/item/organ/external/hand/vox/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/claws/strong/gloves) + return unarmed_attack + +/obj/item/organ/external/hand/right/vox/get_natural_attacks() + var/static/unarmed_attack = GET_DECL(/decl/natural_attack/claws/strong/gloves) + return unarmed_attack diff --git a/mods/species/vox/datum/unit_testing.dm b/mods/species/vox/datum/unit_testing.dm index 1026f897cad..1010d534842 100644 --- a/mods/species/vox/datum/unit_testing.dm +++ b/mods/species/vox/datum/unit_testing.dm @@ -4,7 +4,7 @@ /datum/unit_test/mob_damage/vox name = "MOB: Vox damage check template" - template = /datum/unit_test/mob_damage/vox + abstract_type = /datum/unit_test/mob_damage/vox mob_type = /mob/living/human/vox /datum/unit_test/mob_damage/vox/brute diff --git a/mods/species/vox/gear/gun.dm b/mods/species/vox/gear/gun.dm index c4f62db86c9..a2e5706de5d 100644 --- a/mods/species/vox/gear/gun.dm +++ b/mods/species/vox/gear/gun.dm @@ -78,27 +78,3 @@ /decl/material/liquid/sedatives, /decl/material/liquid/paralytics ) - -/spell/targeted/shapeshift/true_form - name = "True Form" - desc = "Pay respect to your heritage. Become what you once were." - - school = "racial" - spell_flags = INCLUDEUSER - invocation_type = SpI_EMOTE - range = -1 - invocation = "begins to grow!" - charge_max = 1200 //2 minutes - duration = 300 //30 seconds - - smoke_amt = 5 - smoke_spread = 1 - - possible_transformations = list(/mob/living/simple_animal/hostile/parrot/space/lesser) - - hud_state = "wiz_vox" - - cast_sound = 'sound/voice/shriek1.ogg' - revert_sound = 'sound/voice/shriek1.ogg' - - drop_items = 0 diff --git a/mods/species/vox/organs_vox.dm b/mods/species/vox/organs_vox.dm index ebc0f3cbaed..7933c8f41a4 100644 --- a/mods/species/vox/organs_vox.dm +++ b/mods/species/vox/organs_vox.dm @@ -26,25 +26,39 @@ name = "gizzard" color = "#0033cc" var/static/list/gains_nutriment_from_inedible_reagents = list( - /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 + /decl/material/solid/organic/wood/oak = 3, + /decl/material/solid/organic/wood/mahogany = 3, + /decl/material/solid/organic/wood/maple = 3, + /decl/material/solid/organic/wood/ebony = 3, + /decl/material/solid/organic/wood/walnut = 3, + /decl/material/solid/organic/wood/chipboard = 2, + /decl/material/solid/organic/wood/chipboard/mahogany = 2, + /decl/material/solid/organic/wood/chipboard/maple = 2, + /decl/material/solid/organic/wood/chipboard/ebony = 2, + /decl/material/solid/organic/wood/chipboard/walnut = 2, + /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/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 + /decl/material/solid/organic/wood/oak = 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/wood/chipboard = TRUE, + /decl/material/solid/organic/wood/chipboard/mahogany = TRUE, + /decl/material/solid/organic/wood/chipboard/maple = TRUE, + /decl/material/solid/organic/wood/chipboard/ebony = TRUE, + /decl/material/solid/organic/wood/chipboard/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, diff --git a/mods/~compatibility/patches/fantasy.dm b/mods/~compatibility/patches/fantasy.dm new file mode 100644 index 00000000000..4b4d6f7feab --- /dev/null +++ b/mods/~compatibility/patches/fantasy.dm @@ -0,0 +1,9 @@ +// Override drake lore and names for the fantasy modpack. +#ifdef MODPACK_DRAKES +#include "fantasy/drake_fantasy.dm" +#endif + +// Make whetstones available for the fantasy modpack/ +#ifdef MODPACK_ITEM_SHARPENING +#include "fantasy/whetstone_fantasy.dm" +#endif diff --git a/mods/~compatibility/patches/fantasy/drake_fantasy.dm b/mods/~compatibility/patches/fantasy/drake_fantasy.dm new file mode 100644 index 00000000000..70ad5e628e7 --- /dev/null +++ b/mods/~compatibility/patches/fantasy/drake_fantasy.dm @@ -0,0 +1,21 @@ +// Rename grafadreka +/decl/species/grafadreka + name = "Meredrake" + name_plural = "Meredrakes" + description = "Meredrakes, sometimes called mire-drakes, are large reptillian pack predators, widely assumed to be cousins to true dragons. \ + They are commonly found living in caves or burrows bordering grassland or forest, and while they prefer to hunt deer or rabbits, they will sometimes attack travellers if pickings are slim enough. \ + While they are not domesticated, they can be habituated and trained as working animals if captured young enough." + +/decl/sprite_accessory/marking/grafadreka + species_allowed = list("Meredrake") + +/decl/language/grafadreka + desc = "Hiss hiss, feed me rabbits." + +/decl/material/liquid/sifsap + name = "drake spittle" + lore_text = "A complex chemical slurry brewed up in the gullet of meredrakes." + +/obj/aura/sifsap_salve + name = "Drakespittle Salve" + descriptor = "glowing spittle" diff --git a/mods/~compatibility/patches/fantasy/whetstone_fantasy.dm b/mods/~compatibility/patches/fantasy/whetstone_fantasy.dm new file mode 100644 index 00000000000..b2821d26fa6 --- /dev/null +++ b/mods/~compatibility/patches/fantasy/whetstone_fantasy.dm @@ -0,0 +1,7 @@ +// Make whetstones available in character generation. +/decl/loadout_option/fantasy/utility/whetstone + name = "whetstone" + path = /obj/item/whetstone + available_materials = null + loadout_flags = null + uid = "gear_fantasy_whetstone" diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/~compatibility/patches/heist_vox.dm similarity index 88% rename from mods/species/vox/datum/heist_compatibility.dm rename to mods/~compatibility/patches/heist_vox.dm index a34c7d79244..e37a3416faa 100644 --- a/mods/species/vox/datum/heist_compatibility.dm +++ b/mods/~compatibility/patches/heist_vox.dm @@ -1,4 +1,3 @@ -#ifdef GAMEMODE_PACK_HEIST /decl/special_role/raider/Initialize() . = ..() LAZYSET(outfits_per_species, SPECIES_VOX, /decl/outfit/vox_raider) @@ -16,7 +15,7 @@ var/decl/species/my_species = user?.get_species() var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) - if(!istype(user) || !user.mind || !user.mind.assigned_special_role != raiders || !my_species || my_species.name == SPECIES_VOX || !is_alien_whitelisted(user, SPECIES_VOX)) + if(!istype(user) || !user.mind || !raiders.is_antagonist(user.mind) || !my_species || my_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") @@ -41,4 +40,3 @@ vox.SetName(vox.real_name) var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) raiders.update_access(vox) -#endif \ No newline at end of file diff --git a/mods/~compatibility/patches/mixed_gamemodes.dm b/mods/~compatibility/patches/mixed_gamemodes.dm new file mode 100644 index 00000000000..c554702eff5 --- /dev/null +++ b/mods/~compatibility/patches/mixed_gamemodes.dm @@ -0,0 +1,12 @@ +// TODO: #ifdef GAMEMODE_PACK_MERCENARY +#if defined(GAMEMODE_PACK_HEIST) +#include "mixed_gamemodes/crossfire.dm" +#endif +#if defined(GAMEMODE_PACK_REVOLUTIONARY) +#include "mixed_gamemodes/siege.dm" +#endif +// #endif + +#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) +#include "mixed_gamemodes/uprising.dm" +#endif \ No newline at end of file diff --git a/mods/gamemodes/mixed/crossfire.dm b/mods/~compatibility/patches/mixed_gamemodes/crossfire.dm similarity index 100% rename from mods/gamemodes/mixed/crossfire.dm rename to mods/~compatibility/patches/mixed_gamemodes/crossfire.dm diff --git a/mods/gamemodes/mixed/siege.dm b/mods/~compatibility/patches/mixed_gamemodes/siege.dm similarity index 100% rename from mods/gamemodes/mixed/siege.dm rename to mods/~compatibility/patches/mixed_gamemodes/siege.dm diff --git a/mods/gamemodes/mixed/uprising.dm b/mods/~compatibility/patches/mixed_gamemodes/uprising.dm similarity index 100% rename from mods/gamemodes/mixed/uprising.dm rename to mods/~compatibility/patches/mixed_gamemodes/uprising.dm diff --git a/mods/~compatibility/patches/psionics.dm b/mods/~compatibility/patches/psionics.dm new file mode 100644 index 00000000000..93473b9271f --- /dev/null +++ b/mods/~compatibility/patches/psionics.dm @@ -0,0 +1,13 @@ +// Give borers a paramount rank psi aura, and gives them a ranged psychic attack. +#ifdef CONTENT_PACK_BORERS +#include "psionics/borer_psi.dm" +#endif +// Allows psion blood to be used to create soulstones, +// and lets full soulstones nullify psi and shatter into nullglass. +#ifdef GAMEMODE_PACK_CULT +#include "psionics/cult_psi.dm" +#endif +// Adds psi abilities to the counselor. +#ifdef MODPACK_STANDARD_JOBS +#include "psionics/psi_jobs.dm" +#endif \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/mob/borer_power.dm b/mods/~compatibility/patches/psionics/borer_psi.dm similarity index 92% rename from mods/content/psionics/system/psionics/mob/borer_power.dm rename to mods/~compatibility/patches/psionics/borer_psi.dm index b48874f08e8..68c70ec95f7 100644 --- a/mods/content/psionics/system/psionics/mob/borer_power.dm +++ b/mods/~compatibility/patches/psionics/borer_psi.dm @@ -1,4 +1,3 @@ -#ifdef CONTENT_PACK_BORERS /mob/living/simple_animal/borer var/image/aura_image @@ -26,7 +25,7 @@ /mob/living/simple_animal/borer/RangedAttack(atom/A, var/params) . = ..() - if(!. && a_intent == I_DISARM && isliving(A) && !neutered && can_do_special_ranged_attack(FALSE)) + if(!. && check_intent(I_FLAG_DISARM) && isliving(A) && !neutered && can_do_special_ranged_attack(FALSE)) var/mob/living/M = A if(locate(/mob/living/simple_animal/borer) in M.contents) to_chat(src, SPAN_WARNING("You cannot dominate a host who already has a passenger!")) @@ -52,5 +51,4 @@ SET_STATUS_MAX(M, STAT_WEAK, 10) set_ability_cooldown(15 SECONDS) - return TRUE -#endif \ No newline at end of file + return TRUE \ No newline at end of file diff --git a/mods/~compatibility/patches/psionics/cult_psi.dm b/mods/~compatibility/patches/psionics/cult_psi.dm new file mode 100644 index 00000000000..0fa46de32d6 --- /dev/null +++ b/mods/~compatibility/patches/psionics/cult_psi.dm @@ -0,0 +1,18 @@ +// Make psion blood usable for soulstone synthesis. +/decl/chemical_reaction/synthesis/soulstone/donor_is_magic(mob/living/donor) + return ..() || !!donor?.get_ability_handler(/datum/ability_handler/psionics) + +// Make soulstones interact with psionics. +/obj/item/soulstone/disrupts_psionics() + . = !full ? src : FALSE + +/obj/item/soulstone/shatter() + for(var/i=1 to rand(2,5)) + new /obj/item/shard(get_turf(src), full ? /decl/material/nullglass : /decl/material/solid/gemstone/crystal) + . = ..() + +/obj/item/soulstone/withstand_psi_stress(var/stress, var/atom/source) + . = ..(stress, source) + if(. > 0) + . = max(0, . - rand(2,5)) + shatter() \ No newline at end of file diff --git a/mods/~compatibility/patches/psionics/psi_jobs.dm b/mods/~compatibility/patches/psionics/psi_jobs.dm new file mode 100644 index 00000000000..d62d097022f --- /dev/null +++ b/mods/~compatibility/patches/psionics/psi_jobs.dm @@ -0,0 +1,6 @@ +/datum/job/standard/counselor/equip_job(var/mob/living/human/H) + if(H.mind.role_alt_title == "Counselor") + psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) + if(H.mind.role_alt_title == "Mentalist") + psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) + return ..() \ No newline at end of file diff --git a/mods/~compatibility/patches/supermatter.dm b/mods/~compatibility/patches/supermatter.dm new file mode 100644 index 00000000000..27f6a6f4475 --- /dev/null +++ b/mods/~compatibility/patches/supermatter.dm @@ -0,0 +1,12 @@ +// Add the supermatter monitor to engineering jobs' default software. +#ifdef MODPACK_STANDARD_JOBS +#include "supermatter/supermatter_jobs.dm" +#endif +// Disable Narsie during the supermatter cascade. +#ifdef GAMEMODE_PACK_CULT +#include "supermatter/sm_disable_narsie.dm" +#endif +// Add the supermatter meteor to the meteor gamemode's cataclysmic meteors list. +#ifdef GAMEMODE_PACK_METEOR +#include "supermatter/sm_meteor.dm" +#endif \ No newline at end of file diff --git a/mods/~compatibility/patches/supermatter/sm_disable_narsie.dm b/mods/~compatibility/patches/supermatter/sm_disable_narsie.dm new file mode 100644 index 00000000000..a660384347b --- /dev/null +++ b/mods/~compatibility/patches/supermatter/sm_disable_narsie.dm @@ -0,0 +1,4 @@ +// Disable Narsie when a supermatter cascade begins. +/datum/universal_state/supermatter_cascade/OnEnter() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.allow_narsie = 0 \ No newline at end of file diff --git a/mods/~compatibility/patches/supermatter/sm_meteor.dm b/mods/~compatibility/patches/supermatter/sm_meteor.dm new file mode 100644 index 00000000000..df383bc3f76 --- /dev/null +++ b/mods/~compatibility/patches/supermatter/sm_meteor.dm @@ -0,0 +1,3 @@ +/decl/game_mode/meteor/Initialize() + . = ..() // No debounce, decls only init once. + meteors_cataclysm[/obj/effect/meteor/destroyer/supermatter] = 1 \ No newline at end of file diff --git a/mods/~compatibility/patches/supermatter/supermatter_jobs.dm b/mods/~compatibility/patches/supermatter/supermatter_jobs.dm new file mode 100644 index 00000000000..2a62b17318c --- /dev/null +++ b/mods/~compatibility/patches/supermatter/supermatter_jobs.dm @@ -0,0 +1,7 @@ +/datum/job/standard/chief_engineer/New() + ..() + software_on_spawn |= /datum/computer_file/program/supermatter_monitor + +/datum/job/standard/engineer/New() + ..() + software_on_spawn |= /datum/computer_file/program/supermatter_monitor \ No newline at end of file diff --git a/mods/~compatibility/readme.md b/mods/~compatibility/readme.md new file mode 100644 index 00000000000..d422273e7bb --- /dev/null +++ b/mods/~compatibility/readme.md @@ -0,0 +1,22 @@ +# Modpack Compatibility System +This folder exists as a way to work around the fact that the previous system for modpack cross-compatibility, define-gating, is sensitive to include order. This resulted in a lot of boilerplate, like having to emit warnings if modpacks were included in the wrong order. This meant that you could also introduce cyclical dependencies, where no matter what it would emit a warning and content would be missing. + +To avoid this issue, we instead include all compatibility patches last, so it is load order agnostic. + +## FAQ +### Why aren't the compatibility files in the modpacks themselves? +I didn't want to edit the modpack include validation script to exclude the compatibility patches from all DMEs. + +### Why is it organised using subfolders? +I didn't like using `#if defined(FOO) && defined(BAR)` and nested `#ifdef`s were hard to follow, so instead I group them by modpack. + +### Is there a general rule for which modpacks get their own folder? +Not really. I just grouped them in roughly the way that would result in the largest existing groupings, and then chose groupings that would make the most sense to expand in the future (fantasy and standard jobs). + +### Do all patches need to be in a subfolder? +No, it's totally fine to just put something in the base patches directory if there's only one patch for either of the mods in that pairing. That said, sometimes it can make sense to add a folder with just one patch if you can foresee future development requiring additional patches in the same category. + +### How do I decide which folder a patch goes in if both modpacks have folders? +I tend to personally go based on whatever it's mostly about; a hypothetical patch renaming and respriting psionics for the fantasy modpack would go in the fantasy folder. Alternatively, you could think of it as going for whichever one is more specific. + +That said, if one has a lot more patches than the other, or if one modpack (take Standard Jobs, for example) is patched by several modpacks that already have folders, it's fine to just go with whatever produces the largest patch subfolders (or gets rid of small/redundant ones). \ No newline at end of file diff --git a/mods/~compatibility/~compatibility.dm b/mods/~compatibility/~compatibility.dm new file mode 100644 index 00000000000..6d3b770558f --- /dev/null +++ b/mods/~compatibility/~compatibility.dm @@ -0,0 +1,20 @@ +// Add Vox-specific content for the Heist gamemode (Vox raider outfit, mirror to transform into a Vox as a raider) +#if defined(GAMEMODE_PACK_HEIST) && defined(MODPACK_VOX) +#include "patches/heist_vox.dm" +#endif + +#ifdef MODPACK_PSIONICS +#include "patches/psionics.dm" +#endif + +#ifdef GAMEMODE_PACK_MIXED +#include "patches/mixed_gamemodes.dm" +#endif + +#ifdef MODPACK_FANTASY_SPECIES +#include "patches/fantasy.dm" +#endif + +#ifdef CONTENT_PACK_SUPERMATTER +#include "patches/supermatter.dm" +#endif diff --git a/nano/images/shaded_hills/shaded_hills-1.png b/nano/images/shaded_hills/shaded_hills-1.png new file mode 100644 index 00000000000..862e93356aa Binary files /dev/null and b/nano/images/shaded_hills/shaded_hills-1.png differ diff --git a/nano/images/shaded_hills/shaded_hills-2.png b/nano/images/shaded_hills/shaded_hills-2.png new file mode 100644 index 00000000000..cc7727eb7d2 Binary files /dev/null and b/nano/images/shaded_hills/shaded_hills-2.png differ diff --git a/nano/images/shaded_hills/shaded_hills-3.png b/nano/images/shaded_hills/shaded_hills-3.png new file mode 100644 index 00000000000..ab087ace58e Binary files /dev/null and b/nano/images/shaded_hills/shaded_hills-3.png differ diff --git a/nano/images/shaded_hills/shaded_hills-4.png b/nano/images/shaded_hills/shaded_hills-4.png new file mode 100644 index 00000000000..97408dc32f6 Binary files /dev/null and b/nano/images/shaded_hills/shaded_hills-4.png differ diff --git a/nano/images/shaded_hills/shaded_hills-5.png b/nano/images/shaded_hills/shaded_hills-5.png new file mode 100644 index 00000000000..a4d8cf90dd2 Binary files /dev/null and b/nano/images/shaded_hills/shaded_hills-5.png differ diff --git a/nano/images/shaded_hills/shaded_hills-6.png b/nano/images/shaded_hills/shaded_hills-6.png new file mode 100644 index 00000000000..3cb34e5cb67 Binary files /dev/null and b/nano/images/shaded_hills/shaded_hills-6.png differ diff --git a/nano/templates/deity.tmpl b/nano/templates/deity.tmpl deleted file mode 100644 index b249a864960..00000000000 --- a/nano/templates/deity.tmpl +++ /dev/null @@ -1,116 +0,0 @@ - -
      -

      Deity Menu

      -
      - {{:data.name}} the {{:data.form_name}} -
      -
      - Current Boon: - {{if data.boon_name}} - {{:data.boon_name}} - {{else}} - N/A - {{/if}} -
      -
      - Power: {{:data.power}} Power Minimum: {{:data.power_min}} Regen: {{:data.regen}} -
      -
      - {{:helper.link('Followers', 'person', {'switchMenu' : 0, 'menu' : 'menu'}, data.menu == 0 ? 'disabled' : null)}} - {{:helper.link('Shop', 'suitcase', {'switchMenu' : 1, 'menu' : 'menu'}, data.menu == 1 ? 'disabled' : null)}} - {{:helper.link('Phenomena', 'star', {'switchMenu' : 2, 'menu' : 'menu'}, data.menu == 2 ? 'disabled' : null)}} -
      -
      -{{if data.menu == 0}} -

      Followers

      - {{for data.followers}} -
      - {{:value.name}} -
      -
      - {{:helper.link('Jump', 'zoomin', {'jump' : value.ref}, value.ref ? null : 'disabled')}} - {{:helper.link('Follow', 'zoomout', {'jump' : value.ref, 'follow' : 1}, value.ref ? null : 'disabled')}} -
      - {{empty}} - You have no minions! - {{/for}} -{{else data.menu == 1}} -

      Shop

      -
      - {{for data.categories}} - {{:helper.link(value, null, {'switchCategory' : index}, index == data.category ? 'disabled' : null)}} - {{/for}} -
      -
      - {{for data.item_data}} -
      -
      - {{:helper.link(value.name, null, {'buy' : value.ref})}} (Level {{:value.level}}) -
      -
      - Costs: {{:value.cost}} Requires: {{:value.requirements}} -
      -
      - {{:value.desc}} -
      -
      - {{empty}} - There is nothing there! - {{/for}} -{{else data.menu == 2}} -

      Phenomena

      -
      -
      - Selected Phenomena: -
      -
      - {{if data.selectedPhenomenaName}} - {{:helper.link(data.selectedPhenomenaName, null, {'clear_selected' : 1})}} - {{else}} - N/A - {{/if}} -
      -
      -
      - {{:helper.link('Phenomena', 'star', {'switchMenu' : 0, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 0 ? 'disabled' : null)}} - {{:helper.link('Bindings', 'key', {'switchMenu' : 1, 'menu' : 'phenomenaMenu'}, data.phenomenaMenu == 1 ? 'disabled' : null)}} -
      - {{if data.phenomenaMenu == 0}} - {{for data.phenomenas}} -
      -
      - {{:helper.link(value.name, null, {'select_phenomena' : value.name})}} -
      -
      - Use Cost: {{:value.cost}} - {{if value.cooldown}} - Cooldown: {{:value.cooldown}} - {{/if}} -
      -
      - {{:value.description}} -
      -
      - {{empty}} - You don't have any phenomena! - {{/for}} - {{else data.phenomenaMenu == 1}} - {{for data.bindings}} -

      {{:value.intent}}

      - {{for value.intent_data :intentValue:intentKey}} -
      -
      - {{:intentValue.binding}} -
      -
      - {{:helper.link(intentValue.phenomena_name ? intentValue.phenomena_name : 'N/A', null, {'select_intent' : value.intent, 'select_binding' : intentValue.binding})}} -
      -
      - {{/for}} -
      - {{/for}} - {{/if}} -{{/if}} -
      \ No newline at end of file diff --git a/nano/templates/design_database.tmpl b/nano/templates/design_database.tmpl index f09a5415a94..db1dd81ea57 100644 --- a/nano/templates/design_database.tmpl +++ b/nano/templates/design_database.tmpl @@ -6,12 +6,16 @@
      External storage
      - {{if data.disk_tech}} + {{if data.disk_tech || data.disk_error}} - - {{for data.disk_tech}} - - {{/for}} + {{if data.disk_error}} + invalid data format + {{else}} + + {{for data.disk_tech}} + + {{/for}} + {{/if}} {{else}} {{/if}} diff --git a/nano/templates/engines_control.tmpl b/nano/templates/engines_control.tmpl index 4df88e86014..c9ec27c77c7 100644 --- a/nano/templates/engines_control.tmpl +++ b/nano/templates/engines_control.tmpl @@ -29,6 +29,8 @@ {{:data.total_thrust}} + + {{if data.needs_dampers}}
      diff --git a/nano/templates/radio_basic.tmpl b/nano/templates/radio_basic.tmpl index fc94e17029c..b3ba6f4830a 100644 --- a/nano/templates/radio_basic.tmpl +++ b/nano/templates/radio_basic.tmpl @@ -138,12 +138,11 @@ Used In File(s): /code/game/objects/item/devices/radio/radio.dm {{:value.display_name}}
      - {{if value.secure_channel}} - {{:helper.link('On', null, {'ch_name' : value.chan, 'listen' : 1}, value.listening ? 'selected' : null)}} - {{:helper.link('Off', null, {'ch_name' : value.chan, 'listen' : 0}, value.listening ? null : 'selected')}} - {{else}} - {{:helper.link('Switch', null, {'spec_freq' : value.chan}, data.rawfreq == value.chan ? 'selected' : null)}} - {{/if}} + {{:helper.link('On', null, {'ch_name' : value.chan, 'listen' : 1}, value.listening ? 'selected' : null)}} + {{:helper.link('Off', null, {'ch_name' : value.chan, 'listen' : 0}, value.listening ? null : 'selected')}} + {{if !value.secure_channel}} + {{:helper.link('Switch', null, {'spec_freq' : value.chan}, data.rawfreq == value.chan ? 'selected' : null)}} + {{/if}}
      {{/for}} {{/if}} diff --git a/nebula.dme b/nebula.dme index 1cb64eac54e..3bd032e7efd 100644 --- a/nebula.dme +++ b/nebula.dme @@ -10,6 +10,7 @@ #define DEBUG // END_PREFERENCES // BEGIN_INCLUDE +#include "code\___compile_options.dm" #include "code\___opendream_linting.dm" #include "code\__globals.dm" #include "code\_macros.dm" @@ -20,7 +21,6 @@ #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" #include "code\__defines\_tick.dm" #include "code\__defines\admin.dm" @@ -57,8 +57,10 @@ #include "code\__defines\hud.dm" #include "code\__defines\hydroponics.dm" #include "code\__defines\integrated_circuits.dm" +#include "code\__defines\intent.dm" #include "code\__defines\interactions.dm" #include "code\__defines\inventory_sizes.dm" +#include "code\__defines\item_effects.dm" #include "code\__defines\items_clothing.dm" #include "code\__defines\jobs.dm" #include "code\__defines\languages.dm" @@ -121,6 +123,7 @@ #include "code\_global_vars\sound.dm" #include "code\_global_vars\lists\clothing.dm" #include "code\_global_vars\lists\flavor.dm" +#include "code\_global_vars\lists\jewellery.dm" #include "code\_global_vars\lists\logs.dm" #include "code\_global_vars\lists\mapping.dm" #include "code\_global_vars\lists\names.dm" @@ -190,7 +193,6 @@ #include "code\_onclick\hud\robot.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" @@ -209,6 +211,7 @@ #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_inventory_hands.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" @@ -218,7 +221,6 @@ #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" @@ -239,8 +241,6 @@ #include "code\controllers\communications.dm" #include "code\controllers\controller.dm" #include "code\controllers\failsafe.dm" -#include "code\controllers\hooks-defs.dm" -#include "code\controllers\hooks.dm" #include "code\controllers\master.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" @@ -282,7 +282,8 @@ #include "code\controllers\subsystems\mapping.dm" #include "code\controllers\subsystems\misc_late.dm" #include "code\controllers\subsystems\overlays.dm" -#include "code\controllers\subsystems\plants.dm" +#include "code\controllers\subsystems\overmap.dm" +#include "code\controllers\subsystems\pathfinding.dm" #include "code\controllers\subsystems\radiation.dm" #include "code\controllers\subsystems\shuttle.dm" #include "code\controllers\subsystems\skybox.dm" @@ -326,7 +327,7 @@ #include "code\controllers\subsystems\processing\mobs.dm" #include "code\controllers\subsystems\processing\nano.dm" #include "code\controllers\subsystems\processing\obj.dm" -#include "code\controllers\subsystems\processing\overmap.dm" +#include "code\controllers\subsystems\processing\plants.dm" #include "code\controllers\subsystems\processing\processing.dm" #include "code\controllers\subsystems\processing\projectiles.dm" #include "code\controllers\subsystems\processing\temperature.dm" @@ -348,7 +349,6 @@ #include "code\datums\mutable_appearance.dm" #include "code\datums\position_point_vector.dm" #include "code\datums\progressbar.dm" -#include "code\datums\security_state.dm" #include "code\datums\sound_player.dm" #include "code\datums\suit_sensor_jammer_method.dm" #include "code\datums\sun.dm" @@ -356,7 +356,13 @@ #include "code\datums\type_cloning.dm" #include "code\datums\weakref.dm" #include "code\datums\ai\_ai.dm" +#include "code\datums\ai\_ai_enemies.dm" +#include "code\datums\ai\_ai_friends.dm" +#include "code\datums\ai\_ai_memory.dm" +#include "code\datums\ai\_ai_pathfinding.dm" #include "code\datums\ai\_ai_stance.dm" +#include "code\datums\ai\_ai_targets.dm" +#include "code\datums\ai\_ai_wander.dm" #include "code\datums\ai\aggressive.dm" #include "code\datums\ai\beast.dm" #include "code\datums\ai\commanded.dm" @@ -421,8 +427,13 @@ #include "code\datums\extensions\abilities\abilities.dm" #include "code\datums\extensions\abilities\abilities_mob.dm" #include "code\datums\extensions\abilities\abilities_predator.dm" +#include "code\datums\extensions\abilities\ability_button.dm" +#include "code\datums\extensions\abilities\ability_decl.dm" #include "code\datums\extensions\abilities\ability_handler.dm" #include "code\datums\extensions\abilities\ability_item.dm" +#include "code\datums\extensions\abilities\ability_projectile.dm" +#include "code\datums\extensions\abilities\ability_targeting.dm" +#include "code\datums\extensions\abilities\readme.dm" #include "code\datums\extensions\appearance\appearance.dm" #include "code\datums\extensions\appearance\base_icon_state.dm" #include "code\datums\extensions\appearance\cardborg.dm" @@ -449,7 +460,6 @@ #include "code\datums\extensions\eye\landing.dm" #include "code\datums\extensions\holster\holster.dm" #include "code\datums\extensions\milkable\milkable.dm" -#include "code\datums\extensions\multitool\_multitool.dm" #include "code\datums\extensions\multitool\multitool.dm" #include "code\datums\extensions\multitool\store.dm" #include "code\datums\extensions\multitool\circuitboards\buildtype_select.dm" @@ -614,7 +624,6 @@ #include "code\datums\proximity_trigger\proximity_trigger.dm" #include "code\datums\proximity_trigger\turf_selection.dm" #include "code\datums\repositories\_defines.dm" -#include "code\datums\repositories\admin_pm.dm" #include "code\datums\repositories\areas.dm" #include "code\datums\repositories\atom_info.dm" #include "code\datums\repositories\attack_logs.dm" @@ -688,7 +697,7 @@ #include "code\datums\underwear\underwear.dm" #include "code\datums\uplink\ammunition.dm" #include "code\datums\uplink\badassery.dm" -#include "code\datums\uplink\devices and tools.dm" +#include "code\datums\uplink\devices_and_tools.dm" #include "code\datums\uplink\grenades.dm" #include "code\datums\uplink\hardsuit_modules.dm" #include "code\datums\uplink\highly_visible_and_dangerous_weapons.dm" @@ -716,7 +725,6 @@ #include "code\datums\wires\camera.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\fabricator.dm" -#include "code\datums\wires\inertial_damper.dm" #include "code\datums\wires\nuclearbomb.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\radio.dm" @@ -734,8 +742,10 @@ #include "code\game\atom_material.dm" #include "code\game\atoms.dm" #include "code\game\atoms_damage.dm" +#include "code\game\atoms_fires.dm" #include "code\game\atoms_fluids.dm" #include "code\game\atoms_init.dm" +#include "code\game\atoms_interactions.dm" #include "code\game\atoms_layering.dm" #include "code\game\atoms_movable.dm" #include "code\game\atoms_movable_grabs.dm" @@ -743,7 +753,6 @@ #include "code\game\atoms_movable_overlay.dm" #include "code\game\atoms_temperature.dm" #include "code\game\base_turf.dm" -#include "code\game\images.dm" #include "code\game\movietitles.dm" #include "code\game\response_team.dm" #include "code\game\sound.dm" @@ -764,7 +773,6 @@ #include "code\game\antagonist\outsider\actors.dm" #include "code\game\antagonist\outsider\ert.dm" #include "code\game\antagonist\outsider\mercenary.dm" -#include "code\game\antagonist\outsider\wizard.dm" #include "code\game\antagonist\station\provocateur.dm" #include "code\game\antagonist\station\thrall.dm" #include "code\game\area\area_abstract.dm" @@ -779,9 +787,6 @@ #include "code\game\gamemodes\endgame\endgame.dm" #include "code\game\gamemodes\endgame\ftl_jump\ftl_jump.dm" #include "code\game\gamemodes\endgame\nuclear_explosion\nuclear_explosion.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\cascade_blob.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\extended\extended.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" @@ -800,14 +805,6 @@ #include "code\game\gamemodes\objectives\objective_protect.dm" #include "code\game\gamemodes\objectives\objective_rev.dm" #include "code\game\gamemodes\objectives\objective_steal.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\gamemodes\wizard\wizard_props.dm" -#include "code\game\gamemodes\wizard\servant_items\caretaker.dm" -#include "code\game\gamemodes\wizard\servant_items\champion.dm" -#include "code\game\gamemodes\wizard\servant_items\familiar.dm" -#include "code\game\gamemodes\wizard\servant_items\fiend.dm" -#include "code\game\gamemodes\wizard\servant_items\infiltrator.dm" -#include "code\game\gamemodes\wizard\servant_items\overseer.dm" #include "code\game\jobs\_access_defs.dm" #include "code\game\jobs\access.dm" #include "code\game\jobs\access_datum.dm" @@ -841,7 +838,6 @@ #include "code\game\machinery\igniter.dm" #include "code\game\machinery\jukebox.dm" #include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\magnet.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\mech_recharger.dm" #include "code\game\machinery\message_server.dm" @@ -897,6 +893,7 @@ #include "code\game\machinery\_machines_base\stock_parts\access_lock.dm" #include "code\game\machinery\_machines_base\stock_parts\building_material.dm" #include "code\game\machinery\_machines_base\stock_parts\card_reader.dm" +#include "code\game\machinery\_machines_base\stock_parts\cupholder.dm" #include "code\game\machinery\_machines_base\stock_parts\disk_reader.dm" #include "code\game\machinery\_machines_base\stock_parts\item_holder.dm" #include "code\game\machinery\_machines_base\stock_parts\legacy_parts.dm" @@ -969,7 +966,6 @@ #include "code\game\machinery\kitchen\gibber.dm" #include "code\game\machinery\kitchen\icecream.dm" #include "code\game\machinery\kitchen\microwave.dm" -#include "code\game\machinery\kitchen\smartfridge.dm" #include "code\game\machinery\kitchen\cooking_machines\_cooker.dm" #include "code\game\machinery\kitchen\cooking_machines\_cooker_output.dm" #include "code\game\machinery\kitchen\cooking_machines\candy.dm" @@ -979,6 +975,16 @@ #include "code\game\machinery\kitchen\cooking_machines\oven.dm" #include "code\game\machinery\pipe\construction.dm" #include "code\game\machinery\pipe\pipelayer.dm" +#include "code\game\machinery\smartfridge\_smartfridge.dm" +#include "code\game\machinery\smartfridge\_smartfridge_secure.dm" +#include "code\game\machinery\smartfridge\chemistry.dm" +#include "code\game\machinery\smartfridge\drinks.dm" +#include "code\game\machinery\smartfridge\drying_oven.dm" +#include "code\game\machinery\smartfridge\foods.dm" +#include "code\game\machinery\smartfridge\medbay.dm" +#include "code\game\machinery\smartfridge\produce.dm" +#include "code\game\machinery\smartfridge\seeds.dm" +#include "code\game\machinery\smartfridge\sheets.dm" #include "code\game\machinery\turrets\_turrets.dm" #include "code\game\machinery\turrets\network_turret.dm" #include "code\game\machinery\turrets\turret_ammo.dm" @@ -994,22 +1000,19 @@ #include "code\game\machinery\vending\misc.dm" #include "code\game\machinery\vending\security.dm" #include "code\game\machinery\vending\toxins.dm" +#include "code\game\objects\__objs.dm" +#include "code\game\objects\_obj_edibility.dm" +#include "code\game\objects\_objs_damage.dm" +#include "code\game\objects\_objs_interactions.dm" #include "code\game\objects\alien_props.dm" #include "code\game\objects\empulse.dm" #include "code\game\objects\explosion.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" #include "code\game\objects\auras\radiant_aura.dm" #include "code\game\objects\auras\regenerating_aura.dm" -#include "code\game\objects\auras\shadowling_aura.dm" -#include "code\game\objects\auras\starlight.dm" #include "code\game\objects\auras\personal_shields\personal_shield.dm" #include "code\game\objects\compass\_compass.dm" #include "code\game\objects\compass\compass_holder.dm" @@ -1022,6 +1025,7 @@ #include "code\game\objects\effects\effect_system.dm" #include "code\game\objects\effects\explosion_particles.dm" #include "code\game\objects\effects\fake_fire.dm" +#include "code\game\objects\effects\footprints.dm" #include "code\game\objects\effects\force_portal.dm" #include "code\game\objects\effects\gateway.dm" #include "code\game\objects\effects\gibspawner.dm" @@ -1036,7 +1040,7 @@ #include "code\game\objects\effects\portals.dm" #include "code\game\objects\effects\spiders.dm" #include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\temporaray.dm" +#include "code\game\objects\effects\temporary.dm" #include "code\game\objects\effects\temporary_effect.dm" #include "code\game\objects\effects\wet_floor.dm" #include "code\game\objects\effects\wormhole.dm" @@ -1070,11 +1074,14 @@ #include "code\game\objects\items\_item_materials.dm" #include "code\game\objects\items\_item_melting.dm" #include "code\game\objects\items\_item_reagents.dm" +#include "code\game\objects\items\_item_sharpness.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blackout.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\buttons.dm" +#include "code\game\objects\items\candelabra.dm" +#include "code\game\objects\items\chisel.dm" #include "code\game\objects\items\christmas.dm" #include "code\game\objects\items\contraband.dm" #include "code\game\objects\items\crutches.dm" @@ -1083,6 +1090,8 @@ #include "code\game\objects\items\fleece.dm" #include "code\game\objects\items\glassjar.dm" #include "code\game\objects\items\holosign_creator.dm" +#include "code\game\objects\items\horseshoe.dm" +#include "code\game\objects\items\hourglass.dm" #include "code\game\objects\items\instruments.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\lockpicks.dm" @@ -1096,13 +1105,15 @@ #include "code\game\objects\items\rescuebag.dm" #include "code\game\objects\items\rock.dm" #include "code\game\objects\items\saddle.dm" -#include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\silencer.dm" #include "code\game\objects\items\spirit_board.dm" #include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\training_dummy.dm" #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\umbrella.dm" #include "code\game\objects\items\waterskin.dm" +#include "code\game\objects\items\artifice\chain.dm" +#include "code\game\objects\items\artifice\hook.dm" #include "code\game\objects\items\blades\_blade.dm" #include "code\game\objects\items\blades\axe.dm" #include "code\game\objects\items\blades\axe_fire.dm" @@ -1219,6 +1230,7 @@ #include "code\game\objects\items\stacks\medical\medical_resin.dm" #include "code\game\objects\items\stacks\medical\medical_splint.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\stacks\tiles\tile_types_wooden.dm" #include "code\game\objects\items\weapons\AI_modules.dm" #include "code\game\objects\items\weapons\autopsy.dm" #include "code\game\objects\items\weapons\balls.dm" @@ -1247,9 +1259,7 @@ #include "code\game\objects\items\weapons\RCD.dm" #include "code\game\objects\items\weapons\RPD.dm" #include "code\game\objects\items\weapons\RSF.dm" -#include "code\game\objects\items\weapons\scrolls.dm" #include "code\game\objects\items\weapons\secrets_disk.dm" -#include "code\game\objects\items\weapons\shields.dm" #include "code\game\objects\items\weapons\soap.dm" #include "code\game\objects\items\weapons\staff.dm" #include "code\game\objects\items\weapons\stunbaton.dm" @@ -1282,7 +1292,6 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\forensic.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\holomap.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\household.dm" -#include "code\game\objects\items\weapons\circuitboards\machinery\inertial_damper.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\medical.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining.dm" @@ -1310,7 +1319,6 @@ #include "code\game\objects\items\weapons\grenades\prank_grenades.dm" #include "code\game\objects\items\weapons\grenades\smokebomb.dm" #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\grenades\supermatter.dm" #include "code\game\objects\items\weapons\implants\implant.dm" #include "code\game\objects\items\weapons\implants\implantcase.dm" #include "code\game\objects\items\weapons\implants\implantchair.dm" @@ -1348,6 +1356,12 @@ #include "code\game\objects\items\weapons\melee\energy_projected.dm" #include "code\game\objects\items\weapons\melee\energy_sword.dm" #include "code\game\objects\items\weapons\melee\misc.dm" +#include "code\game\objects\items\weapons\shields\_shield.dm" +#include "code\game\objects\items\weapons\shields\shield_crafted.dm" +#include "code\game\objects\items\weapons\shields\shield_crafted_buckler.dm" +#include "code\game\objects\items\weapons\shields\shield_crafting.dm" +#include "code\game\objects\items\weapons\shields\shield_energy.dm" +#include "code\game\objects\items\weapons\shields\shield_riot.dm" #include "code\game\objects\items\weapons\storage\backpack.dm" #include "code\game\objects\items\weapons\storage\bags.dm" #include "code\game\objects\items\weapons\storage\basket.dm" @@ -1364,6 +1378,7 @@ #include "code\game\objects\items\weapons\storage\med_pouch.dm" #include "code\game\objects\items\weapons\storage\misc.dm" #include "code\game\objects\items\weapons\storage\mre.dm" +#include "code\game\objects\items\weapons\storage\nuggets.dm" #include "code\game\objects\items\weapons\storage\parachute.dm" #include "code\game\objects\items\weapons\storage\picnic_basket.dm" #include "code\game\objects\items\weapons\storage\secure.dm" @@ -1411,10 +1426,11 @@ #include "code\game\objects\structures\__structure.dm" #include "code\game\objects\structures\_structure_construction.dm" #include "code\game\objects\structures\_structure_icon.dm" +#include "code\game\objects\structures\_structure_interactions.dm" +#include "code\game\objects\structures\_structure_lock.dm" #include "code\game\objects\structures\_structure_materials.dm" #include "code\game\objects\structures\ai_decoy.dm" -#include "code\game\objects\structures\banners.dm" -#include "code\game\objects\structures\barrel.dm" +#include "code\game\objects\structures\armor_stand.dm" #include "code\game\objects\structures\barricade.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" @@ -1429,6 +1445,7 @@ #include "code\game\objects\structures\curtains.dm" #include "code\game\objects\structures\defensive_barrier.dm" #include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\divider.dm" #include "code\game\objects\structures\dogbed.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\double_sign.dm" @@ -1446,9 +1463,11 @@ #include "code\game\objects\structures\fountain.dm" #include "code\game\objects\structures\fuel_port.dm" #include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\grandfather_clock.dm" #include "code\game\objects\structures\grille.dm" #include "code\game\objects\structures\hand_cart.dm" #include "code\game\objects\structures\handrail.dm" +#include "code\game\objects\structures\hay.dm" #include "code\game\objects\structures\holosigns.dm" #include "code\game\objects\structures\inflatable.dm" #include "code\game\objects\structures\ironing_board.dm" @@ -1467,13 +1486,14 @@ #include "code\game\objects\structures\racks.dm" #include "code\game\objects\structures\railing.dm" #include "code\game\objects\structures\rubble.dm" +#include "code\game\objects\structures\rug.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\seaweed.dm" #include "code\game\objects\structures\showcase.dm" #include "code\game\objects\structures\signs.dm" #include "code\game\objects\structures\skele_stand.dm" +#include "code\game\objects\structures\snowman.dm" #include "code\game\objects\structures\stasis_cage.dm" -#include "code\game\objects\structures\structure_lock.dm" #include "code\game\objects\structures\tables.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" @@ -1488,6 +1508,9 @@ #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window_spawner.dm" +#include "code\game\objects\structures\barrels\barrel.dm" +#include "code\game\objects\structures\barrels\cask.dm" +#include "code\game\objects\structures\barrels\cask_rack.dm" #include "code\game\objects\structures\chemistry\_chemistry.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" #include "code\game\objects\structures\crates_lockers\largecrate.dm" @@ -1558,6 +1581,7 @@ #include "code\game\turfs\turf_footsteps.dm" #include "code\game\turfs\turf_height.dm" #include "code\game\turfs\turf_material.dm" +#include "code\game\turfs\turf_navigation.dm" #include "code\game\turfs\turf_ramps.dm" #include "code\game\turfs\unsimulated.dm" #include "code\game\turfs\flooring\_flooring.dm" @@ -1622,12 +1646,14 @@ #include "code\game\turfs\walls\wall_natural_subtypes.dm" #include "code\game\turfs\walls\wall_natural_xenoarch.dm" #include "code\game\turfs\walls\wall_types.dm" +#include "code\game\turfs\walls\wall_wattle.dm" #include "code\game\verbs\byond_membership.dm" #include "code\game\verbs\ignore.dm" #include "code\game\verbs\ooc.dm" #include "code\game\verbs\who.dm" #include "code\modules\abstract\_abstract.dm" #include "code\modules\abstract\abstract_exterior_marker.dm" +#include "code\modules\abstract\abstract_fluid_direction.dm" #include "code\modules\abstract\abstract_ramp_sculptor.dm" #include "code\modules\abstract\airlock_helper.dm" #include "code\modules\acting\acting_items.dm" @@ -1698,7 +1724,6 @@ #include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm" #include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm" #include "code\modules\admin\secrets\fun_secrets\waddle.dm" -#include "code\modules\admin\secrets\investigation\admin_pms.dm" #include "code\modules\admin\secrets\investigation\attack_logs.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" @@ -1819,10 +1844,25 @@ #include "code\modules\backgrounds\location\locations_other.dm" #include "code\modules\backgrounds\religion\_religion.dm" #include "code\modules\backgrounds\religion\religions_human.dm" +#include "code\modules\banners\__banner.dm" +#include "code\modules\banners\_banner_frame.dm" +#include "code\modules\banners\_banner_symbols.dm" +#include "code\modules\banners\banner_frame_definitions.dm" +#include "code\modules\banners\sign.dm" +#include "code\modules\banners\sign_post.dm" #include "code\modules\blob\blob.dm" #include "code\modules\blood\blood.dm" #include "code\modules\blood\blood_types.dm" #include "code\modules\blood\blood_types_subtypes.dm" +#include "code\modules\bodytype\_bodytype.dm" +#include "code\modules\bodytype\bodytype_abilities.dm" +#include "code\modules\bodytype\bodytype_crystalline.dm" +#include "code\modules\bodytype\bodytype_helpers.dm" +#include "code\modules\bodytype\bodytype_offsets.dm" +#include "code\modules\bodytype\bodytype_prosthetic.dm" +#include "code\modules\bodytype\bodytype_prosthetic_models.dm" +#include "code\modules\bodytype\bodytype_quadruped.dm" +#include "code\modules\bodytype\bodytype_random.dm" #include "code\modules\brain_interface\_brain_interface.dm" #include "code\modules\brain_interface\interface_radio.dm" #include "code\modules\butchery\_butchery.dm" @@ -1869,6 +1909,8 @@ #include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_storage.dm" #include "code\modules\client\preferences_toggle.dm" +#include "code\modules\client\mouse_pointer\_mouse_pointer.dm" +#include "code\modules\client\mouse_pointer\mouse_pointer_definitions.dm" #include "code\modules\client\preference_setup\_defines.dm" #include "code\modules\client\preference_setup\preference_setup.dm" #include "code\modules\client\preference_setup\antagonism\01_candidacy.dm" @@ -1971,8 +2013,10 @@ #include "code\modules\clothing\gloves\thick.dm" #include "code\modules\clothing\gloves\jewelry\bracelet.dm" #include "code\modules\clothing\gloves\jewelry\rings\_ring.dm" -#include "code\modules\clothing\gloves\jewelry\rings\material.dm" -#include "code\modules\clothing\gloves\jewelry\rings\rings.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_aura.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_misc.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_reagent.dm" +#include "code\modules\clothing\gloves\jewelry\rings\ring_seal.dm" #include "code\modules\clothing\head\_head.dm" #include "code\modules\clothing\head\collectable.dm" #include "code\modules\clothing\head\earmuffs.dm" @@ -1985,6 +2029,7 @@ #include "code\modules\clothing\head\misc_special.dm" #include "code\modules\clothing\head\security.dm" #include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\wizard.dm" #include "code\modules\clothing\jumpsuits\_jumpsuit.dm" #include "code\modules\clothing\jumpsuits\color.dm" #include "code\modules\clothing\jumpsuits\corp.dm" @@ -2008,10 +2053,16 @@ #include "code\modules\clothing\neck\_neck.dm" #include "code\modules\clothing\neck\bowties.dm" #include "code\modules\clothing\neck\brace.dm" -#include "code\modules\clothing\neck\jewelry.dm" +#include "code\modules\clothing\neck\prayer_beads.dm" #include "code\modules\clothing\neck\scarf.dm" #include "code\modules\clothing\neck\stethoscope.dm" #include "code\modules\clothing\neck\ties.dm" +#include "code\modules\clothing\neck\necklace\__necklace.dm" +#include "code\modules\clothing\neck\necklace\_pendant.dm" +#include "code\modules\clothing\neck\necklace\necklaces.dm" +#include "code\modules\clothing\neck\necklace\pendant_locket.dm" +#include "code\modules\clothing\neck\necklace\pendant_random.dm" +#include "code\modules\clothing\neck\necklace\pendant_setting.dm" #include "code\modules\clothing\pants\_pants.dm" #include "code\modules\clothing\pants\detective.dm" #include "code\modules\clothing\pants\misc.dm" @@ -2076,7 +2127,6 @@ #include "code\modules\clothing\spacesuits\void\misc.dm" #include "code\modules\clothing\spacesuits\void\station.dm" #include "code\modules\clothing\spacesuits\void\void.dm" -#include "code\modules\clothing\spacesuits\void\wizard.dm" #include "code\modules\clothing\suits\_suit.dm" #include "code\modules\clothing\suits\_suit_hood.dm" #include "code\modules\clothing\suits\alien.dm" @@ -2087,6 +2137,7 @@ #include "code\modules\clothing\suits\jobs.dm" #include "code\modules\clothing\suits\labcoat.dm" #include "code\modules\clothing\suits\mantle.dm" +#include "code\modules\clothing\suits\misc.dm" #include "code\modules\clothing\suits\miscellaneous.dm" #include "code\modules\clothing\suits\poncho.dm" #include "code\modules\clothing\suits\robes.dm" @@ -2095,7 +2146,7 @@ #include "code\modules\clothing\suits\straightjacket.dm" #include "code\modules\clothing\suits\toggles.dm" #include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\suits\wizard.dm" #include "code\modules\clothing\suits\armor\_armor.dm" #include "code\modules\clothing\suits\armor\adminbus_and_memes.dm" #include "code\modules\clothing\suits\armor\bulletproof.dm" @@ -2173,7 +2224,9 @@ #include "code\modules\codex\entries\tools.dm" #include "code\modules\codex\entries\turfs.dm" #include "code\modules\codex\entries\weapons.dm" +#include "code\modules\crafting\handmade_fancy.dm" #include "code\modules\crafting\handmade_items.dm" +#include "code\modules\crafting\forging\bellows.dm" #include "code\modules\crafting\metalwork\metalwork_items.dm" #include "code\modules\crafting\pottery\pottery_moulds.dm" #include "code\modules\crafting\pottery\pottery_structures.dm" @@ -2199,6 +2252,7 @@ #include "code\modules\crafting\stack_recipes\recipes_bricks.dm" #include "code\modules\crafting\stack_recipes\recipes_cardstock.dm" #include "code\modules\crafting\stack_recipes\recipes_coins.dm" +#include "code\modules\crafting\stack_recipes\recipes_fodder.dm" #include "code\modules\crafting\stack_recipes\recipes_grass.dm" #include "code\modules\crafting\stack_recipes\recipes_hardness.dm" #include "code\modules\crafting\stack_recipes\recipes_hardness_integrity.dm" @@ -2208,10 +2262,10 @@ #include "code\modules\crafting\stack_recipes\recipes_panels.dm" #include "code\modules\crafting\stack_recipes\recipes_planks.dm" #include "code\modules\crafting\stack_recipes\recipes_reinforced.dm" +#include "code\modules\crafting\stack_recipes\recipes_rods.dm" #include "code\modules\crafting\stack_recipes\recipes_soft.dm" #include "code\modules\crafting\stack_recipes\recipes_stacks.dm" #include "code\modules\crafting\stack_recipes\recipes_steel.dm" -#include "code\modules\crafting\stack_recipes\recipes_struts.dm" #include "code\modules\crafting\stack_recipes\recipes_textiles.dm" #include "code\modules\crafting\stack_recipes\recipes_turfs.dm" #include "code\modules\crafting\working\_working.dm" @@ -2219,6 +2273,10 @@ #include "code\modules\crafting\working\textiles\loom.dm" #include "code\modules\crafting\working\textiles\spinning_wheel.dm" #include "code\modules\crafting\working\textiles\twisting_bench.dm" +#include "code\modules\decoration\_decoration.dm" +#include "code\modules\decoration\decoration_inset.dm" +#include "code\modules\decoration\decoration_item.dm" +#include "code\modules\decoration\decoration_setting.dm" #include "code\modules\departments\department.dm" #include "code\modules\detectivework\forensics.dm" #include "code\modules\detectivework\evidence\_evidence_holder.dm" @@ -2277,7 +2335,6 @@ #include "code\modules\emotes\definitions\tail.dm" #include "code\modules\emotes\definitions\visible.dm" #include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_reporting.dm" #include "code\modules\error_handler\error_viewer.dm" #include "code\modules\events\ailments.dm" #include "code\modules\events\apc_damage.dm" @@ -2297,7 +2354,6 @@ #include "code\modules\events\event_dynamic.dm" #include "code\modules\events\gravity.dm" #include "code\modules\events\grid_check.dm" -#include "code\modules\events\inertial_damper.dm" #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" #include "code\modules\events\location_event.dm" @@ -2320,7 +2376,6 @@ #include "code\modules\events\trivial_news.dm" #include "code\modules\events\wallrot.dm" #include "code\modules\events\wormholes.dm" -#include "code\modules\ext_scripts\irc.dm" #include "code\modules\fabrication\__fabricator_defines.dm" #include "code\modules\fabrication\_fabricator.dm" #include "code\modules\fabrication\_fabricator_build_order.dm" @@ -2401,6 +2456,7 @@ #include "code\modules\fluids\fluid_flood.dm" #include "code\modules\fluids\fluid_mapped.dm" #include "code\modules\food\assembled.dm" +#include "code\modules\food\nuggets.dm" #include "code\modules\food\cooking\_recipe.dm" #include "code\modules\food\cooking\cooking_vessels\_cooking_vessel.dm" #include "code\modules\food\cooking\cooking_vessels\baking_dish.dm" @@ -2416,6 +2472,7 @@ #include "code\modules\food\cooking\recipes\recipe_soup.dm" #include "code\modules\food\cooking\recipes\recipe_soup_chili.dm" #include "code\modules\food\cooking\recipes\recipe_soup_curry.dm" +#include "code\modules\food\cooking\recipes\recipe_soup_noodle.dm" #include "code\modules\food\cooking\recipes\recipe_soup_simple.dm" #include "code\modules\food\cooking\recipes\recipe_soup_stew.dm" #include "code\modules\food\cooking\recipes\recipe_soup_stock.dm" @@ -2436,6 +2493,8 @@ #include "code\modules\games\cards_cag.dm" #include "code\modules\games\spaceball_cards.dm" #include "code\modules\games\tarot.dm" +#include "code\modules\gemstones\_gemstone.dm" +#include "code\modules\gemstones\gemstone_cuts.dm" #include "code\modules\genetics\_gene.dm" #include "code\modules\genetics\plants\_gene_plant.dm" #include "code\modules\genetics\plants\_plant_trait.dm" @@ -2558,7 +2617,6 @@ #include "code\modules\hydroponics\trays\tray_soil.dm" #include "code\modules\hydroponics\trays\tray_tools.dm" #include "code\modules\hydroponics\trays\tray_update_icons.dm" -#include "code\modules\inertial_damper\inertial_damper.dm" #include "code\modules\integrated_electronics\_defines.dm" #include "code\modules\integrated_electronics\core\_electronics.dm" #include "code\modules\integrated_electronics\core\analyzer.dm" @@ -2603,13 +2661,13 @@ #include "code\modules\integrated_electronics\subtypes\trig.dm" #include "code\modules\interactions\_interactions.dm" #include "code\modules\interactions\interactions_atom.dm" +#include "code\modules\interactions\interactions_reagents.dm" #include "code\modules\interactions\interactions_shared.dm" #include "code\modules\item_effects\_item_effect.dm" #include "code\modules\item_effects\item_effect_aura.dm" #include "code\modules\item_effects\item_effect_charges.dm" #include "code\modules\item_effects\item_effect_debug.dm" #include "code\modules\item_effects\item_effect_item.dm" -#include "code\modules\item_worth\_helpers.dm" #include "code\modules\keybindings\_defines.dm" #include "code\modules\keybindings\_keybindings.dm" #include "code\modules\keybindings\admin.dm" @@ -2689,6 +2747,7 @@ #include "code\modules\materials\definitions\gasses\material_gas_mundane.dm" #include "code\modules\materials\definitions\liquids\_mat_liquid.dm" #include "code\modules\materials\definitions\liquids\materials_liquid_chemistry.dm" +#include "code\modules\materials\definitions\liquids\materials_liquid_mundane.dm" #include "code\modules\materials\definitions\liquids\materials_liquid_solvents.dm" #include "code\modules\materials\definitions\liquids\materials_liquid_soup.dm" #include "code\modules\materials\definitions\liquids\materials_liquid_toxins.dm" @@ -2782,8 +2841,10 @@ #include "code\modules\mob\mob_genetics.dm" #include "code\modules\mob\mob_grabs.dm" #include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_intent.dm" #include "code\modules\mob\mob_layering.dm" #include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_organs.dm" #include "code\modules\mob\mob_snapshot.dm" #include "code\modules\mob\mob_status.dm" #include "code\modules\mob\mob_temperature.dm" @@ -2833,10 +2894,12 @@ #include "code\modules\mob\living\living_dreams.dm" #include "code\modules\mob\living\living_eating.dm" #include "code\modules\mob\living\living_electrocution.dm" +#include "code\modules\mob\living\living_fires.dm" #include "code\modules\mob\living\living_genetics.dm" #include "code\modules\mob\living\living_give.dm" #include "code\modules\mob\living\living_grabs.dm" #include "code\modules\mob\living\living_hallucinations.dm" +#include "code\modules\mob\living\living_hud.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" @@ -2980,9 +3043,9 @@ #include "code\modules\mob\living\simple_animal\aquatic\_aquatic_retaliate.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_carp.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish.dm" +#include "code\modules\mob\living\simple_animal\aquatic\aquatic_fish_lantern.dm" #include "code\modules\mob\living\simple_animal\aquatic\aquatic_sharks.dm" #include "code\modules\mob\living\simple_animal\crow\crow.dm" -#include "code\modules\mob\living\simple_animal\familiars\familiars.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" #include "code\modules\mob\living\simple_animal\friendly\corgi.dm" #include "code\modules\mob\living\simple_animal\friendly\crab.dm" @@ -3068,9 +3131,6 @@ #include "code\modules\mob\observer\eye\freelook\ai\update_triggers.dm" #include "code\modules\mob\observer\ghost\follow.dm" #include "code\modules\mob\observer\ghost\ghost.dm" -#include "code\modules\mob\observer\ghost\login.dm" -#include "code\modules\mob\observer\ghost\logout.dm" -#include "code\modules\mob\observer\ghost\say.dm" #include "code\modules\mob\observer\virtual\_constants.dm" #include "code\modules\mob\observer\virtual\base.dm" #include "code\modules\mob\observer\virtual\helpers.dm" @@ -3126,7 +3186,6 @@ #include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" #include "code\modules\modular_computers\file_system\programs\engineering\shields_monitor.dm" #include "code\modules\modular_computers\file_system\programs\engineering\shutoff_valve.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" #include "code\modules\modular_computers\file_system\programs\generic\camera.dm" #include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" #include "code\modules\modular_computers\file_system\programs\generic\crew_manifest.dm" @@ -3252,6 +3311,7 @@ #include "code\modules\nano\modules\nano_module.dm" #include "code\modules\organs\_organ_setup.dm" #include "code\modules\organs\organ.dm" +#include "code\modules\organs\organ_prosthetics.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\ailments\_ailment.dm" #include "code\modules\organs\ailments\ailment_codex.dm" @@ -3291,9 +3351,6 @@ #include "code\modules\organs\internal\stomach.dm" #include "code\modules\organs\internal\voice.dm" #include "code\modules\organs\internal\species\golem.dm" -#include "code\modules\organs\prosthetics\_prosthetics.dm" -#include "code\modules\organs\prosthetics\prosthetics_manufacturer.dm" -#include "code\modules\organs\prosthetics\prosthetics_manufacturer_models.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\_overmap.dm" #include "code\modules\overmap\overmap_object.dm" @@ -3382,6 +3439,7 @@ #include "code\modules\posture\posture_bodytype.dm" #include "code\modules\posture\posture_mob.dm" #include "code\modules\posture\posture_subtypes.dm" +#include "code\modules\power\admin_setup_engine.dm" #include "code\modules\power\apc.dm" #include "code\modules\power\batteryrack.dm" #include "code\modules\power\breaker_box.dm" @@ -3556,17 +3614,18 @@ #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_alcohol.dm" #include "code\modules\reagents\chems\chems_blood.dm" #include "code\modules\reagents\chems\chems_cleaner.dm" #include "code\modules\reagents\chems\chems_compounds.dm" #include "code\modules\reagents\chems\chems_drinks.dm" #include "code\modules\reagents\chems\chems_drugs.dm" -#include "code\modules\reagents\chems\chems_ethanol.dm" #include "code\modules\reagents\chems\chems_explosives.dm" #include "code\modules\reagents\chems\chems_fuel.dm" #include "code\modules\reagents\chems\chems_herbal.dm" #include "code\modules\reagents\chems\chems_medicines.dm" #include "code\modules\reagents\chems\chems_nutriment.dm" +#include "code\modules\reagents\chems\chems_oil.dm" #include "code\modules\reagents\chems\chems_painkillers.dm" #include "code\modules\reagents\chems\chems_pigments.dm" #include "code\modules\reagents\chems\chems_poisons.dm" @@ -3593,6 +3652,8 @@ #include "code\modules\reagents\reactions\reaction_recipe.dm" #include "code\modules\reagents\reactions\reaction_recipe_food.dm" #include "code\modules\reagents\reactions\reaction_synthesis.dm" +#include "code\modules\reagents\reagent_containers\_glass.dm" +#include "code\modules\reagents\reagent_containers\_glass_edibility.dm" #include "code\modules\reagents\reagent_containers\beaker.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" @@ -3603,8 +3664,6 @@ #include "code\modules\reagents\reagent_containers\food.dm" #include "code\modules\reagents\reagent_containers\food_cooking.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\mortar.dm" @@ -3700,7 +3759,11 @@ #include "code\modules\sealant_gun\sealant_injector.dm" #include "code\modules\sealant_gun\sealant_rack.dm" #include "code\modules\sealant_gun\sealant_tank.dm" -#include "code\modules\security levels\keycard_authentication.dm" +#include "code\modules\security_levels\_security_level.dm" +#include "code\modules\security_levels\alarm_appearance.dm" +#include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\security_levels\security_levels.dm" +#include "code\modules\security_levels\security_state.dm" #include "code\modules\shield_generators\floor_diffuser.dm" #include "code\modules\shield_generators\handheld_diffuser.dm" #include "code\modules\shield_generators\modes.dm" @@ -3729,104 +3792,15 @@ #include "code\modules\species\species.dm" #include "code\modules\species\species_allergies.dm" #include "code\modules\species\species_attack.dm" -#include "code\modules\species\species_bodytype.dm" -#include "code\modules\species\species_bodytype_abilities.dm" -#include "code\modules\species\species_bodytype_helpers.dm" -#include "code\modules\species\species_bodytype_offsets.dm" -#include "code\modules\species\species_bodytype_quadruped.dm" -#include "code\modules\species\species_bodytype_random.dm" -#include "code\modules\species\species_crystalline_bodytypes.dm" #include "code\modules\species\species_getters.dm" #include "code\modules\species\species_helpers.dm" #include "code\modules\species\species_hud.dm" -#include "code\modules\species\species_shapeshifter.dm" -#include "code\modules\species\species_shapeshifter_bodytypes.dm" #include "code\modules\species\outsider\random.dm" -#include "code\modules\species\outsider\shadow.dm" -#include "code\modules\species\outsider\starlight.dm" #include "code\modules\species\station\golem.dm" #include "code\modules\species\station\human.dm" #include "code\modules\species\station\human_bodytypes.dm" #include "code\modules\species\station\monkey.dm" #include "code\modules\species\station\monkey_bodytypes.dm" -#include "code\modules\spells\artifacts.dm" -#include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\contracts.dm" -#include "code\modules\spells\no_clothes.dm" -#include "code\modules\spells\racial_wizard.dm" -#include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spell_projectile.dm" -#include "code\modules\spells\spellbook.dm" -#include "code\modules\spells\spells.dm" -#include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\blink.dm" -#include "code\modules\spells\aoe_turf\charge.dm" -#include "code\modules\spells\aoe_turf\disable_tech.dm" -#include "code\modules\spells\aoe_turf\drain_blood.dm" -#include "code\modules\spells\aoe_turf\exchange_wounds.dm" -#include "code\modules\spells\aoe_turf\knock.dm" -#include "code\modules\spells\aoe_turf\smoke.dm" -#include "code\modules\spells\aoe_turf\summons.dm" -#include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\aoe_turf\conjure\druidic_spells.dm" -#include "code\modules\spells\aoe_turf\conjure\faithful_hound.dm" -#include "code\modules\spells\aoe_turf\conjure\force_portal.dm" -#include "code\modules\spells\aoe_turf\conjure\forcewall.dm" -#include "code\modules\spells\aoe_turf\conjure\grove.dm" -#include "code\modules\spells\artifacts\spellbound_servants.dm" -#include "code\modules\spells\artifacts\storage.dm" -#include "code\modules\spells\general\acid_spray.dm" -#include "code\modules\spells\general\area_teleport.dm" -#include "code\modules\spells\general\camera_vision.dm" -#include "code\modules\spells\general\contract_spells.dm" -#include "code\modules\spells\general\create_air.dm" -#include "code\modules\spells\general\invisibility.dm" -#include "code\modules\spells\general\mark_recall.dm" -#include "code\modules\spells\general\portal_teleport.dm" -#include "code\modules\spells\general\radiant_aura.dm" -#include "code\modules\spells\general\return_master.dm" -#include "code\modules\spells\general\toggle_armor.dm" -#include "code\modules\spells\hand\blood_shards.dm" -#include "code\modules\spells\hand\burning_grip.dm" -#include "code\modules\spells\hand\entangle.dm" -#include "code\modules\spells\hand\hand.dm" -#include "code\modules\spells\hand\hand_item.dm" -#include "code\modules\spells\hand\slippery_surface.dm" -#include "code\modules\spells\hand\sunwrath.dm" -#include "code\modules\spells\spellbook\battlemage.dm" -#include "code\modules\spells\spellbook\cleric.dm" -#include "code\modules\spells\spellbook\druid.dm" -#include "code\modules\spells\spellbook\spatial.dm" -#include "code\modules\spells\spellbook\standard.dm" -#include "code\modules\spells\spellbook\student.dm" -#include "code\modules\spells\targeted\analyze.dm" -#include "code\modules\spells\targeted\blood_boil.dm" -#include "code\modules\spells\targeted\cleric_spells.dm" -#include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\exude_pleasantness.dm" -#include "code\modules\spells\targeted\genetic.dm" -#include "code\modules\spells\targeted\glimpse_of_eternity.dm" -#include "code\modules\spells\targeted\shapeshift.dm" -#include "code\modules\spells\targeted\shatter_mind.dm" -#include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\subjugate.dm" -#include "code\modules\spells\targeted\swap.dm" -#include "code\modules\spells\targeted\targeted.dm" -#include "code\modules\spells\targeted\torment.dm" -#include "code\modules\spells\targeted\equip\burning_touch.dm" -#include "code\modules\spells\targeted\equip\dyrnwyn.dm" -#include "code\modules\spells\targeted\equip\equip.dm" -#include "code\modules\spells\targeted\equip\holy_relic.dm" -#include "code\modules\spells\targeted\equip\horsemask.dm" -#include "code\modules\spells\targeted\equip\party_hardy.dm" -#include "code\modules\spells\targeted\equip\seed.dm" -#include "code\modules\spells\targeted\equip\shield.dm" -#include "code\modules\spells\targeted\projectile\dumbfire.dm" -#include "code\modules\spells\targeted\projectile\fireball.dm" -#include "code\modules\spells\targeted\projectile\magic_missile.dm" -#include "code\modules\spells\targeted\projectile\passage.dm" -#include "code\modules\spells\targeted\projectile\projectile.dm" -#include "code\modules\spells\targeted\projectile\stuncuff.dm" #include "code\modules\sprite_accessories\_accessory.dm" #include "code\modules\sprite_accessories\_accessory_category.dm" #include "code\modules\sprite_accessories\cosmetics\_accessory_cosmetics.dm" @@ -3868,9 +3842,6 @@ #include "code\modules\submaps\submap_job.dm" #include "code\modules\submaps\submap_join.dm" #include "code\modules\submaps\submap_landmark.dm" -#include "code\modules\supermatter\setup_supermatter.dm" -#include "code\modules\supermatter\sm_looping_sound.dm" -#include "code\modules\supermatter\supermatter.dm" #include "code\modules\surgery\__surgery_setup.dm" #include "code\modules\surgery\_surgery.dm" #include "code\modules\surgery\bones.dm" @@ -4043,12 +4014,12 @@ #include "code\modules\ZAS\Diagnostic.dm" #include "code\modules\ZAS\Fire.dm" #include "code\modules\ZAS\Turf.dm" -#include "code\modules\ZAS\Variable Settings.dm" +#include "code\modules\ZAS\VariableSettings.dm" #include "code\modules\ZAS\Zone.dm" #include "code\procs\announce.dm" -#include "code\procs\AStar.dm" #include "code\procs\dbcore.dm" #include "code\procs\hud.dm" +#include "code\procs\pathfinding.dm" #include "code\procs\radio.dm" #include "code\unit_tests\_defines.dm" #include "code\unit_tests\_includes.dm" @@ -4102,7 +4073,6 @@ #include "maps\_map_include.dm" #include "maps\antag_spawn\ert\ert.dm" #include "maps\antag_spawn\mercenary\mercenary.dm" -#include "maps\antag_spawn\wizard\wizard.dm" #include "maps\away_sites_testing\away_sites_testing_define.dm" #include "maps\example\example_define.dm" #include "maps\exodus\exodus.dm" @@ -4121,7 +4091,6 @@ #include "maps\random_ruins\exoplanet_ruins\marooned\marooned.dm" #include "maps\random_ruins\exoplanet_ruins\monoliths\monoliths.dm" #include "maps\random_ruins\exoplanet_ruins\oasis\oasis.dm" -#include "maps\random_ruins\exoplanet_ruins\oldpod\oldpod.dm" #include "maps\random_ruins\exoplanet_ruins\radshrine\radshrine.dm" #include "maps\random_ruins\exoplanet_ruins\spider_nest\spider_nest.dm" #include "maps\random_ruins\exoplanet_ruins\tar_anomaly\tar_anomaly.dm" @@ -4142,5 +4111,6 @@ #include "maps\~mapsystem\maps_unit_testing.dm" #include "maps\~unit_tests\unit_testing.dm" #include "mods\_modpack.dm" +#include "mods\~compatibility\~compatibility.dm" #include "~code\global_init.dm" // END_INCLUDE diff --git a/scripts/server.sh b/scripts/server.sh index b65b6b33d16..bc89d45b7c4 100755 --- a/scripts/server.sh +++ b/scripts/server.sh @@ -63,7 +63,7 @@ while [[ ! -e stopserver ]]; do cp "$GITDIR/$DME.rsc" . cp -r "$GITDIR/nano" . # Necessary for NanoUI cp -r "$GITDIR/maps" . # Necessary for runtime submap loading - cp -r "$GITDIR/mods" . # Also necessary for runtime submap loading. TODO: a better solution + cp -r "$GITDIR/mods" . # Also necessary for runtime submap and NanoUI loading. TODO: a better solution? [[ ! -e btime.so && -e "$GITDIR/btime.so" ]] && cp "$GITDIR/btime.so" . [[ ! -e .git/logs ]] && mkdir -p .git/logs cp "$GITDIR/.git/HEAD" ./.git/HEAD diff --git a/sound/music/europa/Martian Cowboy.ogg b/sound/music/europa/MartianCowboy.ogg similarity index 100% rename from sound/music/europa/Martian Cowboy.ogg rename to sound/music/europa/MartianCowboy.ogg diff --git a/test/check-paths.sh b/test/check-paths.sh index d34ee8c4458..852c681ae6c 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -23,35 +23,36 @@ exactly() { # exactly N name search [mode] [filter] # With the potential exception of << if you increase any of these numbers you're probably doing it wrong # Additional exception August 2020: \b is a regex symbol as well as a BYOND macro. -exactly 1 "escapes" '\\\\(red|blue|green|black|b|i[^mc])' -exactly 6 "Del()s" '\WDel\(' +exactly 3 "escapes" '\\(red|blue|green|black|b|i[^mc])' +exactly 3 "Del()s" '(?> uses" '>>(?!>)' -P +exactly 1 "world<< uses" 'world\s*<<' +exactly 74 "'in world' uses" '\s+\bin world\b(?=\s*$|\s*//|\s*\))' -P +exactly 1 "world.log<< uses" 'world.log\s*<<' +exactly 18 "<< uses" '(?> uses" '(?\\])>>(?!>)' -P exactly 0 "incorrect indentations" '^( {4,})' -P -exactly 24 "text2path uses" 'text2path' -exactly 4 "update_icon() override" '/update_icon\((.*)\)' -P -exactly 0 "goto uses" 'goto ' +exactly 23 "text2path uses" 'text2path' +exactly 4 "update_icon() overrides" '\/update_icon\(' -P +exactly 0 "goto uses" '\bgoto\b' exactly 9 "atom/New uses" '^/(obj|atom|area|mob|turf).*/New\(' exactly 1 "decl/New uses" '^/decl.*/New\(' -exactly 0 "tag uses" '\stag = ' -P '*.dmm' -exactly 3 "unmarked globally scoped variables" '^(/|)var/(?!global)' -P -exactly 0 "global-marked member variables" '\t(/|)var.*/global/.+' -P -exactly 0 "static-marked globally scoped variables" '^(/|)var.*/static/.+' -P +exactly 3 "tag uses" '(? 2: + ckey = sys.argv[2] + if ckey is not None: + ckey = ckey.lower() + + singletargetmap = None + if len(sys.argv) > 3: + singletargetmap = sys.argv[3] + if singletargetmap is not None: + singletargetmap = singletargetmap.lower() + # Work out what maps we actually need to replicate to. # This should be updated as map directories change, or the script will break. targetmaps = [] @@ -40,7 +52,7 @@ def main(): if os.path.isdir(dir): targetmap = dir.path targetmap = targetmap.replace(mapdir + os.sep, "") - if targetmap not in ignoremaps and targetmap != mapname: + if (targetmap not in ignoremaps) and (targetmap != mapname) and ((singletargetmap is None) or (singletargetmap == targetmap)): targetmaps.append(targetmap) # Make sure we can actually see the save directory. @@ -62,6 +74,8 @@ def main(): continue if match.group(1) != mapname: continue + if (ckey is not None) and (ckey != root[root.rfind("/")+1:]): + continue savefile = os.path.join(root, file) with open(savefile, "r") as loadedsave: wrote = 0 diff --git a/tools/map_migrations/4583_tables.txt b/tools/map_migrations/4583_tables.txt new file mode 100644 index 00000000000..72bbd06136d --- /dev/null +++ b/tools/map_migrations/4583_tables.txt @@ -0,0 +1,11 @@ +/obj/structure/table/woodentable/@SUBTYPES : /obj/structure/table/wood/@SUBTYPES{@OLD} +/obj/structure/table/woodentable_reinforced/@SUBTYPES : /obj/structure/table/wood/reinforced/@SUBTYPES{@OLD} +/obj/item/stack/tile/wood/@SUBTYPES : /obj/item/stack/tile/wood/oak/@SUBTYPES{@OLD} +/obj/item/stack/tile/mahogany/@SUBTYPES : /obj/item/stack/tile/wood/mahogany/@SUBTYPES{@OLD} +/obj/item/stack/tile/maple/@SUBTYPES : /obj/item/stack/tile/wood/maple/@SUBTYPES{@OLD} +/obj/item/stack/tile/ebony/@SUBTYPES : /obj/item/stack/tile/wood/ebony/@SUBTYPES{@OLD} +/obj/item/stack/tile/walnut/@SUBTYPES : /obj/item/stack/tile/wood/walnut/@SUBTYPES{@OLD} +/obj/item/stack/tile/bamboo/@SUBTYPES : /obj/item/stack/tile/wood/bamboo/@SUBTYPES{@OLD} +/obj/item/stack/tile/yew/@SUBTYPES : /obj/item/stack/tile/wood/yew/@SUBTYPES{@OLD} + + diff --git a/tools/map_migrations/4615_target_stakes.txt b/tools/map_migrations/4615_target_stakes.txt new file mode 100644 index 00000000000..8e4677a219f --- /dev/null +++ b/tools/map_migrations/4615_target_stakes.txt @@ -0,0 +1,2 @@ +/obj/item/target/@SUBTYPES : /obj/item/target_dummy/@SUBTYPES{@OLD} +/obj/structure/target_stake/@SUBTYPES : /obj/structure/target_stake/steel/@SUBTYPES{@OLD} diff --git a/tools/map_migrations/4647_dirt.txt b/tools/map_migrations/4647_dirt.txt new file mode 100644 index 00000000000..262db2c52ce --- /dev/null +++ b/tools/map_migrations/4647_dirt.txt @@ -0,0 +1,2 @@ +/obj/effect/decal/cleanable/dirt/@SUBTYPES : /obj/effect/decal/cleanable/dirt/visible/@SUBTYPES{@OLD} + diff --git a/tools/map_migrations/4651_rods.txt b/tools/map_migrations/4651_rods.txt new file mode 100644 index 00000000000..e7d5bffba5e --- /dev/null +++ b/tools/map_migrations/4651_rods.txt @@ -0,0 +1,2 @@ +/obj/item/stack/material/rods/@SUBTYPES : /obj/item/stack/material/rods/mapped/steel/@SUBTYPES{@OLD} + diff --git a/tools/map_migrations/4662_waterskin.txt b/tools/map_migrations/4662_waterskin.txt new file mode 100644 index 00000000000..8fa91607ee8 --- /dev/null +++ b/tools/map_migrations/4662_waterskin.txt @@ -0,0 +1,2 @@ +/obj/item/chems/waterskin/@SUBTYPES : /obj/item/chems/glass/waterskin/@SUBTYPES{@OLD} + diff --git a/~code/global_init.dm b/~code/global_init.dm index 00301af2ca2..c483e8f9e8b 100644 --- a/~code/global_init.dm +++ b/~code/global_init.dm @@ -11,14 +11,14 @@ Pre-map initialization stuff should go here. */ -var/global_init = new /datum/global_init() +var/global/global_init = new /datum/global_init() /datum/global_init/New() SSconfiguration.load_all_configuration() - callHook("global_init") - qdel(src) //we're done + generate_game_id() + makeDatumRefLists() + QDEL_IN(src, 0) //we're done. give it some time to finish setting up though /datum/global_init/Destroy() - global_init = null - ..() - return QDEL_HINT_HARDDEL + global.global_init = null + return ..()
      {{:helper.link(data.disk_name, null, {'eject_disk' : 1})}}
      DataStored
      {{:value.field}}{{:value.level}}
      DataStored
      {{:value.field}}{{:value.level}}
      {{:data.disk_name}}