diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000000..79c4b77c52b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +[*] +indent_style = tab +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.yml] +indent_style = space +indent_size = 2 + +[*.py] +indent_style = space diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000000..0abac7a5338 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "gbasood.byond-dm-language-support", + "platymuus.dm-langclient", + "EditorConfig.EditorConfig", + "dbaeumer.vscode-eslint" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000000..13c253e612b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "byond", + "request": "launch", + "name": "Launch DreamSeeker", + "preLaunchTask": "dm: build - ${command:CurrentDME}", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000000..67e90f1d388 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "eslint.workingDirectories": [ + "./tgui" + ], + + "workbench.editorAssociations": [ + { + "filenamePattern": "*.dmi", + "viewType": "imagePreview.previewEditor" + } + ] +} diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml new file mode 100644 index 00000000000..b8274722546 --- /dev/null +++ b/SpacemanDMM.toml @@ -0,0 +1,2 @@ +[langserver] +dreamchecker = true diff --git a/maps/tether/tether-01-surface1.dmm b/_maps/map_files/Tether/tether-01-surface1.dmm similarity index 99% rename from maps/tether/tether-01-surface1.dmm rename to _maps/map_files/Tether/tether-01-surface1.dmm index 34921d3763f..13a5f5817b6 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/_maps/map_files/Tether/tether-01-surface1.dmm @@ -8629,6 +8629,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/item/paicard, /turf/simulated/floor/tiled, /area/crew_quarters/locker) "apO" = ( @@ -14822,6 +14823,7 @@ /obj/effect/floor_decal/corner/lightgrey/border{ dir = 8 }, +/obj/item/paicard, /turf/simulated/floor/tiled, /area/crew_quarters/locker/laundry_arrival) "aAF" = ( diff --git a/maps/tether/tether-02-surface2.dmm b/_maps/map_files/Tether/tether-02-surface2.dmm similarity index 99% rename from maps/tether/tether-02-surface2.dmm rename to _maps/map_files/Tether/tether-02-surface2.dmm index 0b1407a4697..6d170a61578 100644 --- a/maps/tether/tether-02-surface2.dmm +++ b/_maps/map_files/Tether/tether-02-surface2.dmm @@ -8340,6 +8340,7 @@ dir = 4; pixel_x = -28 }, +/obj/item/book/manual/the_humanized_mice, /turf/simulated/floor/wood, /area/rnd/breakroom) "qW" = ( @@ -17653,6 +17654,7 @@ /obj/structure/table/steel, /obj/item/stack/medical/splint/ghetto, /obj/random/technology_scanner, +/obj/item/book/manual/the_humanized_mice, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/atmos) "Ic" = ( @@ -19291,6 +19293,7 @@ /obj/effect/floor_decal/corner/lime/border{ dir = 9 }, +/obj/item/paicard, /turf/simulated/floor/tiled, /area/tether/surfacebase/public_garden_two) "Xk" = ( diff --git a/maps/tether/tether-03-surface3.dmm b/_maps/map_files/Tether/tether-03-surface3.dmm similarity index 99% rename from maps/tether/tether-03-surface3.dmm rename to _maps/map_files/Tether/tether-03-surface3.dmm index 0b2ec719ef0..cb1b87c4f33 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/_maps/map_files/Tether/tether-03-surface3.dmm @@ -4618,6 +4618,7 @@ dir = 9 }, /obj/effect/floor_decal/steeldecal/steel_decals7, +/obj/machinery/vending/giftvendor, /turf/simulated/floor/tiled, /area/tether/surfacebase/atrium_three) "ir" = ( @@ -16826,6 +16827,7 @@ icon_state = "bsposter4"; pixel_y = 32 }, +/obj/item/storage/box/freezer, /turf/simulated/floor/tiled{ icon_state = "techmaint" }, @@ -20489,9 +20491,8 @@ /obj/structure/table/standard, /obj/item/defib_kit/jumper_kit, /obj/item/storage/box/gloves, -/obj/item/storage/box/bodybags{ - pixel_x = -1; - pixel_y = -2 +/obj/item/storage/box/masks{ + pixel_y = 5 }, /turf/simulated/floor/tiled/white, /area/assembly/robotics) diff --git a/maps/tether/tether-04-transit.dmm b/_maps/map_files/Tether/tether-04-transit.dmm similarity index 100% rename from maps/tether/tether-04-transit.dmm rename to _maps/map_files/Tether/tether-04-transit.dmm diff --git a/maps/tether/tether-05-station1.dmm b/_maps/map_files/Tether/tether-05-station1.dmm similarity index 99% rename from maps/tether/tether-05-station1.dmm rename to _maps/map_files/Tether/tether-05-station1.dmm index 3b32ca6dfa4..445c30eaa80 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/_maps/map_files/Tether/tether-05-station1.dmm @@ -5707,6 +5707,7 @@ dir = 4 }, /obj/random/maintenance, +/obj/item/paicard, /turf/simulated/floor/plating, /area/vacant/vacant_library) "alv" = ( @@ -18488,7 +18489,7 @@ dir = 6 }, /obj/effect/landmark/start{ - name = "Colony Director" + name = "Facility Director" }, /obj/item/storage/secure/safe{ pixel_x = -28 @@ -19859,7 +19860,7 @@ /obj/machinery/door/firedoor/glass, /obj/machinery/door/airlock/command{ id_tag = "captaindoor"; - name = "Colony Director's Office"; + name = "Facility Director's Office"; req_access = list(20) }, /turf/simulated/floor/tiled/dark, @@ -20315,7 +20316,7 @@ }, /obj/machinery/door/airlock/command{ id_tag = "captaindoor"; - name = "Colony Director's Office"; + name = "Facility Director's Office"; req_access = list(20) }, /obj/machinery/door/firedoor/glass, @@ -20468,7 +20469,7 @@ /obj/structure/table/woodentable, /obj/machinery/computer/skills, /obj/item/perfect_tele{ - desc = "Seems absurd, doesn't it? Yet, here we are. This handheld device is capable of producing bluespace teleportation beacons, and can be activated to translocate the user or a target of their choice to any linked beacon. This one is the Colony Director's."; + desc = "Seems absurd, doesn't it? Yet, here we are. This handheld device is capable of producing bluespace teleportation beacons, and can be activated to translocate the user or a target of their choice to any linked beacon. This one is the Facility Director's."; name = "director's translocator" }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -20669,7 +20670,7 @@ }, /obj/machinery/door/firedoor/glass, /obj/machinery/door/airlock/command{ - name = "Colony Director's Quarters"; + name = "Facility Director's Quarters"; req_access = list(20) }, /obj/machinery/door/blast/regular{ @@ -20677,7 +20678,7 @@ dir = 4; icon_state = "pdoor0"; id = "cd-blast"; - name = "Colony Director Lockdown"; + name = "Facility Director Lockdown"; opacity = 0 }, /obj/structure/disposalpipe/segment{ @@ -20789,7 +20790,7 @@ }, /obj/structure/disposalpipe/segment, /obj/structure/dogbed{ - desc = "A bed made just for the Colony Director's fox."; + desc = "A bed made just for the Facility Director's fox."; name = "Renault's Bed" }, /mob/living/simple_mob/animal/passive/fox/renault, @@ -20829,7 +20830,7 @@ }, /obj/item/card/id/gold/captain/spare, /obj/machinery/door/window/brigdoor/westright{ - name = "Colony Director's Storage"; + name = "Facility Director's Storage"; req_access = list(20) }, /turf/simulated/floor/wood, @@ -22829,7 +22830,7 @@ "hFL" = ( /obj/machinery/button/remote/blast_door{ id = "cd-blast"; - name = "Colony Director Lockdown" + name = "Facility Director Lockdown" }, /turf/simulated/wall/r_wall, /area/crew_quarters/captain) @@ -23808,6 +23809,11 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor, /area/construction/observation) +"nXR" = ( +/obj/structure/table/woodentable, +/obj/item/paicard, +/turf/simulated/floor/wood, +/area/hallway/station/atrium) "nYc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -25277,7 +25283,7 @@ }, /obj/structure/window/reinforced, /obj/machinery/door/window/brigdoor/eastright{ - name = "Colony Director's Voidsuit"; + name = "Facility Director's Voidsuit"; req_access = list(20) }, /obj/item/clothing/suit/space/void/captain, @@ -37080,7 +37086,7 @@ acm acH ada adk -adm +nXR adn acH acm diff --git a/maps/tether/tether-06-station2.dmm b/_maps/map_files/Tether/tether-06-station2.dmm similarity index 99% rename from maps/tether/tether-06-station2.dmm rename to _maps/map_files/Tether/tether-06-station2.dmm index 2dbd3ab5add..8643641950e 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/_maps/map_files/Tether/tether-06-station2.dmm @@ -3239,6 +3239,7 @@ dir = 4 }, /obj/structure/table/woodentable, +/obj/item/book/manual/the_humanized_mice, /turf/simulated/floor/wood, /area/crew_quarters/medbreak) "ff" = ( @@ -18826,6 +18827,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, +/obj/item/paicard, /turf/simulated/floor/carpet/bcarpet, /area/tether/station/public_meeting_room) "Pl" = ( diff --git a/maps/tether/tether-07-station3.dmm b/_maps/map_files/Tether/tether-07-station3.dmm similarity index 100% rename from maps/tether/tether-07-station3.dmm rename to _maps/map_files/Tether/tether-07-station3.dmm diff --git a/maps/tether/tether-08-mining.dmm b/_maps/map_files/Tether/tether-08-mining.dmm similarity index 100% rename from maps/tether/tether-08-mining.dmm rename to _maps/map_files/Tether/tether-08-mining.dmm diff --git a/maps/tether/tether-09-solars.dmm b/_maps/map_files/Tether/tether-09-solars.dmm similarity index 100% rename from maps/tether/tether-09-solars.dmm rename to _maps/map_files/Tether/tether-09-solars.dmm diff --git a/maps/tether/tether-10-colony.dmm b/_maps/map_files/Tether/tether-10-colony.dmm similarity index 100% rename from maps/tether/tether-10-colony.dmm rename to _maps/map_files/Tether/tether-10-colony.dmm diff --git a/_maps/tether.json b/_maps/tether.json new file mode 100644 index 00000000000..86fa4466341 --- /dev/null +++ b/_maps/tether.json @@ -0,0 +1,89 @@ +{ + "map_name":"Tether", + "map_path":"map_files/tether", + "map_file":[ + "tether-01-surface1.dmm", + "tether-02-surface2.dmm", + "tether-03-surface3.dmm", + "tether-04-transit.dmm", + "tether-05-station1.dmm", + "tether-06-station2.dmm", + "tether-07-station3.dmm", + "tether-08-mining.dmm", + "tether-09-solars.dmm", + "tether-10-colony.dmm" + ], + "traits":[ + { + "Up":1, + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/simulated/floor/outdoors/grass/sif/virgo3b" + }, + { + "Down":-1, + "Up":1, + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/simulated/open/virgo3b" + }, + { + "Down":-1, + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/simulated/open/virgo3b" + }, + { + "Down":-1, + "Up":1, + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/simulated/sky/virgo3b" + }, + { + "Up":1, + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/space" + }, + { + "Up":1, + "Down":-1, + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/space" + }, + { + "Down":-1, + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/space" + }, + { + "Mining":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/simulated/floor/outdoors/grass/sif/virgo3b" + }, + { + "Station":true, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/simulated/floor/outdoors/grass/sif/virgo3b" + }, + { + "Station":false, + "Linkage":null, + "Gravity":true, + "Baseturf":"/turf/simulated/floor/outdoors/grass/sif/virgo3b" + } + ], + "minetype":"none" +} diff --git a/code/__DEFINES/__513_compatibility.dm b/code/__DEFINES/__513_compatibility.dm deleted file mode 100644 index dcc98df2508..00000000000 --- a/code/__DEFINES/__513_compatibility.dm +++ /dev/null @@ -1,54 +0,0 @@ - -#if DM_VERSION < 513 - -#define ismovableatom(A) (istype(A, /atom/movable)) - -#define ismovable(A) ismovableatom(A) - -#define islist(L) (istype(L, /list)) - -#define CLAMP01(x) (CLAMP(x, 0, 1)) - -#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) - -#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) ) - -#define TAN(x) (sin(x) / cos(x)) - -#define arctan(x) (arcsin(x/sqrt(1+x*x))) - -////////////////////////////////////////////////// - -#else - -#define ismovableatom(A) ismovable(A) - -#define CLAMP01(x) clamp(x, 0, 1) - -#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX) - -#define TAN(x) tan(x) - -#define ATAN2(x, y) arctan(x, y) - -#endif - -//Compatability -- These procs were added in 513.1493, not 513.1490 -//Which really shoulda bumped us up to 514 right then and there but instead Lummox is a dumb dumb -#if DM_BUILD < 1493 -#define length_char(args...) length(args) -#define text2ascii_char(args...) text2ascii(args) -#define copytext_char(args...) copytext(args) -#define splittext_char(args...) splittext(args) -#define spantext_char(args...) spantext(args) -#define nonspantext_char(args...) nonspantext(args) -#define findtext_char(args...) findtext(args) -#define findtextEx_char(args...) findtextEx(args) -#define findlasttext_char(args...) findlasttext(args) -#define findlasttextEx_char(args...) findlasttextEx(args) -#define replacetext_char(args...) replacetext(args) -#define replacetextEx_char(args...) replacetextEx(args) -// /regex procs -#define Find_char(args...) Find(args) -#define Replace_char(args...) Replace(args) -#endif diff --git a/code/__DEFINES/_planes+layers.dm b/code/__DEFINES/_planes+layers.dm index c54fbe93ccf..2f0b1a12d92 100644 --- a/code/__DEFINES/_planes+layers.dm +++ b/code/__DEFINES/_planes+layers.dm @@ -50,7 +50,6 @@ What is the naming convention for planes or layers? #define OVER_OPENSPACE_PLANE -57 // Turf Planes -#define SPACE_PLANE -43 // Space turfs themselves #define PLATING_PLANE -44 // Plating #define DISPOSAL_LAYER 2.1 // Under objects, even when planeswapped #define PIPES_LAYER 2.2 // Under objects, even when planeswapped diff --git a/code/__DEFINES/controllers/_subsystems.dm b/code/__DEFINES/controllers/_subsystems.dm index c7a2686cabb..9391b0c2b85 100644 --- a/code/__DEFINES/controllers/_subsystems.dm +++ b/code/__DEFINES/controllers/_subsystems.dm @@ -84,6 +84,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_CHEMISTRY 18 #define INIT_ORDER_AI -22 #define INIT_ORDER_OPENSPACE -50 +#define INIT_ORDER_PERSISTENCE -95 // Subsystem fire priority, from lowest to highest priority diff --git a/code/__DEFINES/gamemode.dm b/code/__DEFINES/gamemode.dm index f437c74c6e9..d01433d7b58 100644 --- a/code/__DEFINES/gamemode.dm +++ b/code/__DEFINES/gamemode.dm @@ -77,7 +77,6 @@ var/list/be_special_flags = list( #define MODE_MONKEY "monkey" #define MODE_RENEGADE "renegade" #define MODE_REVOLUTIONARY "revolutionary" -#define MODE_LOYALIST "loyalist" #define MODE_MALFUNCTION "malf" #define MODE_TRAITOR "traitor" #define MODE_AUTOTRAITOR "autotraitor" @@ -125,4 +124,4 @@ var/list/be_special_flags = list( #define Sp_CHARGES "charges" #define Sp_HOLDVAR "holdervar" -#define CHANGELING_STASIS_COST 20 \ No newline at end of file +#define CHANGELING_STASIS_COST 20 diff --git a/code/__DEFINES/items_clothing.dm b/code/__DEFINES/items_clothing.dm index ffbda3e2989..eeb56232807 100644 --- a/code/__DEFINES/items_clothing.dm +++ b/code/__DEFINES/items_clothing.dm @@ -101,8 +101,6 @@ #define slot_r_ear_str "slot_r_ear" #define slot_belt_str "slot_belt" #define slot_shoes_str "slot_shoes" -#define slot_head_str "slot_head" -#define slot_wear_mask_str "slot_wear_mask" #define slot_handcuffed_str "slot_handcuffed" #define slot_legcuffed_str "slot_legcuffed" #define slot_wear_mask_str "slot_wear_mask" @@ -197,4 +195,4 @@ // Hair Defines #define HAIR_VERY_SHORT 0x1 -#define HAIR_TIEABLE 0x4 \ No newline at end of file +#define HAIR_TIEABLE 0x4 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 6a9bcb6de43..3b99554c389 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -79,8 +79,8 @@ //Lighting values used by the station lights #define LIGHT_COLOR_FLUORESCENT_TUBE "#E0EFFF" #define LIGHT_COLOR_FLUORESCENT_FLASHLIGHT "#CDDDFF" -#define LIGHT_COLOR_INCANDESCENT_TUBE "#FFFEB8" -#define LIGHT_COLOR_INCANDESCENT_BULB "#FFDDBB" +#define LIGHT_COLOR_INCANDESCENT_TUBE "#E0EFF0" +#define LIGHT_COLOR_INCANDESCENT_BULB "#FFFEB8" #define LIGHT_COLOR_INCANDESCENT_FLASHLIGHT "#FFCC66" //Fake ambient occlusion filter diff --git a/code/__DEFINES/lighting_vr.dm b/code/__DEFINES/lighting_vr.dm deleted file mode 100644 index 0cd6b060a17..00000000000 --- a/code/__DEFINES/lighting_vr.dm +++ /dev/null @@ -1,2 +0,0 @@ -#define LIGHT_COLOR_INCANDESCENT_TUBE "#E0EFF0" -#define LIGHT_COLOR_INCANDESCENT_BULB "#FFFEB8" \ No newline at end of file diff --git a/code/__DEFINES/map.dm b/code/__DEFINES/map.dm deleted file mode 100644 index fce63b9955c..00000000000 --- a/code/__DEFINES/map.dm +++ /dev/null @@ -1,12 +0,0 @@ -// Z-level flags bitfield - Set these flags to determine the z level's purpose -#define MAP_LEVEL_STATION 0x001 // Z-levels the station exists on -#define MAP_LEVEL_ADMIN 0x002 // Z-levels for admin functionality (Centcom, shuttle transit, etc) -#define MAP_LEVEL_CONTACT 0x004 // Z-levels that can be contacted from the station, for eg announcements -#define MAP_LEVEL_PLAYER 0x008 // Z-levels a character can typically reach -#define MAP_LEVEL_SEALED 0x010 // Z-levels that don't allow random transit at edge -#define MAP_LEVEL_EMPTY 0x020 // Empty Z-levels that may be used for various things (currently used by bluespace jump) -#define MAP_LEVEL_CONSOLES 0x040 // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset. -#define MAP_LEVEL_XENOARCH_EXEMPT 0x080 // Z-levels exempt from xenoarch digsite generation. - -// Misc map defines. -#define SUBMAP_MAP_EDGE_PAD 8 // Automatically created submaps are forbidden from being this close to the main map's edge. //VOREStation Edit \ No newline at end of file diff --git a/code/__DEFINES/map_vr.dm b/code/__DEFINES/map_vr.dm deleted file mode 100644 index 3847dc29f9a..00000000000 --- a/code/__DEFINES/map_vr.dm +++ /dev/null @@ -1 +0,0 @@ -#define MAP_LEVEL_XENOARCH_EXEMPT 0x080 // Z-levels exempt from xenoarch digsite generation. \ No newline at end of file diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm new file mode 100644 index 00000000000..a46756df907 --- /dev/null +++ b/code/__DEFINES/maps.dm @@ -0,0 +1,145 @@ +// Z-level flags bitfield - Set these flags to determine the z level's purpose +#define MAP_LEVEL_STATION 0x001 // Z-levels the station exists on +#define MAP_LEVEL_ADMIN 0x002 // Z-levels for admin functionality (Centcom, shuttle transit, etc) +#define MAP_LEVEL_CONTACT 0x004 // Z-levels that can be contacted from the station, for eg announcements +#define MAP_LEVEL_PLAYER 0x008 // Z-levels a character can typically reach +#define MAP_LEVEL_SEALED 0x010 // Z-levels that don't allow random transit at edge +#define MAP_LEVEL_EMPTY 0x020 // Empty Z-levels that may be used for various things (currently used by bluespace jump) +#define MAP_LEVEL_CONSOLES 0x040 // Z-levels available to various consoles, such as the crew monitor (when that gets coded in). Defaults to station_levels if unset. +#define MAP_LEVEL_XENOARCH_EXEMPT 0x080 // Z-levels exempt from xenoarch digsite generation. + +// Misc map defines. +#define SUBMAP_MAP_EDGE_PAD 8 // Automatically created submaps are forbidden from being this close to the main map's edge. //VOREStation Edit + +// TG MAP LOADING SYSTEM PENDING +/* +The /tg/ codebase allows mixing of hardcoded and dynamically-loaded z-levels. +Z-levels can be reordered as desired and their properties are set by "traits". +See map_config.dm for how a particular station's traits may be chosen. +The list DEFAULT_MAP_TRAITS at the bottom of this file should correspond to +the maps that are hardcoded, as set in _maps/_basemap.dm. SSmapping is +responsible for loading every non-hardcoded z-level. + +As of 2018-02-04, the typical z-levels for a single-level station are: +1: CentCom +2: Station +3-4: Randomized space +5: Mining +6: City of Cogs +7-11: Randomized space +12: Empty space +13: Transit space + +Multi-Z stations are supported and multi-Z mining and away missions would +require only minor tweaks. +*/ + +/* +// helpers for modifying jobs, used in various job_changes.dm files +#define MAP_JOB_CHECK if(SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) { return; } +#define MAP_JOB_CHECK_BASE if(SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) { return ..(); } +#define MAP_REMOVE_JOB(jobpath) /datum/job/##jobpath/map_check() { return (SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) && ..() } + +#define SPACERUIN_MAP_EDGE_PAD 15 + +// traits +// boolean - marks a level as having that property if present +*/ +#define ZTRAIT_CENTCOM "CentCom" +#define ZTRAIT_STATION "Station" +#define ZTRAIT_MINING "Mining" +/* +#define ZTRAIT_REEBE "Reebe" +*/ +#define ZTRAIT_RESERVED "Transit/Reserved" +#define ZTRAIT_AWAY "Away Mission" +/* +#define ZTRAIT_VR "Virtual Reality" +#define ZTRAIT_SPACE_RUINS "Space Ruins" +#define ZTRAIT_LAVA_RUINS "Lava Ruins" +#define ZTRAIT_ICE_RUINS "Ice Ruins" +#define ZTRAIT_ICE_RUINS_UNDERGROUND "Ice Ruins Underground" +#define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement. +#define ZTRAIT_VIRTUAL_REALITY "Virtual Reality" + +//boolean - weather types that occur on the level +#define ZTRAIT_SNOWSTORM "Weather_Snowstorm" +#define ZTRAIT_ASHSTORM "Weather_Ashstorm" +#define ZTRAIT_ACIDRAIN "Weather_Acidrain" +*/ + +// number - bombcap is multiplied by this before being applied to bombs +#define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier" + +// number - default gravity if there's no gravity generators or area overrides present +#define ZTRAIT_GRAVITY "Gravity" + +// numeric offsets - e.g. {"Down": -1} means that chasms will fall to z - 1 rather than oblivion +#define ZTRAIT_UP "Up" +#define ZTRAIT_DOWN "Down" + +// enum - how space transitions should affect this level +#define ZTRAIT_LINKAGE "Linkage" + // UNAFFECTED if absent - no space transitions + #define UNAFFECTED null + // SELFLOOPING - space transitions always self-loop + #define SELFLOOPING "Self" + // CROSSLINKED - mixed in with the cross-linked space pool + #define CROSSLINKED "Cross" + +// string - type path of the z-level's baseturf (defaults to space) +#define ZTRAIT_BASETURF "Baseturf" + +// default trait definitions, used by SSmapping +#define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE) +#define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE) +#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE) +/* +#define ZTRAITS_LAVALAND list(\ + ZTRAIT_MINING = TRUE, \ + ZTRAIT_ASHSTORM = TRUE, \ + ZTRAIT_LAVA_RUINS = TRUE, \ + ZTRAIT_BOMBCAP_MULTIPLIER = 5, \ + ZTRAIT_BASETURF = /turf/open/lava/smooth/lava_land_surface) +#define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5) +#define ZTRAITS_VR list(ZTRAIT_VIRTUAL_REALITY = TRUE, ZTRAIT_AWAY = TRUE) +*/ + +#define DL_NAME "name" +#define DL_TRAITS "traits" +#define DECLARE_LEVEL(NAME, TRAITS) list(DL_NAME = NAME, DL_TRAITS = TRAITS) + +// must correspond to _basemap.dm for things to work correctly +#define DEFAULT_MAP_TRAITS list(\ + DECLARE_LEVEL("Base Reserve Level", list(ZTRAIT_RESERVEd = TRUE)),\ +) + +/* +// Camera lock flags +#define CAMERA_LOCK_STATION 1 +#define CAMERA_LOCK_MINING 2 +#define CAMERA_LOCK_CENTCOM 4 +#define CAMERA_LOCK_REEBE 8 +*/ + +//Reserved/Transit turf type +#define RESERVED_TURF_TYPE /turf/open/space/basic //What the turf is when not being used + +/* +//Ruin Generation + +#define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo) + +#define PLACE_DEFAULT "random" +#define PLACE_SAME_Z "same" //On same z level as original ruin +#define PLACE_SPACE_RUIN "space" //On space ruin z level(s) +#define PLACE_LAVA_RUIN "lavaland" //On lavaland ruin z levels(s) +#define PLACE_BELOW "below" //On z levl below - centered on same tile +#define PLACE_ISOLATED "isolated" //On isolated ruin z level +//Map type stuff. +#define MAP_TYPE_STATION "station" + +//Random z-levels name defines. +#define AWAY_MISSION_NAME "Away Mission" +#define VIRT_REALITY_NAME "Virtual Reality" +*/ diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm index 88c459ba782..c1c26db795b 100644 --- a/code/__DEFINES/math.dm +++ b/code/__DEFINES/math.dm @@ -16,7 +16,7 @@ #define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage - starting_tickusage)) #define PERCENT(val) (round((val)*100, 0.1)) -#define CLAMP01(x) (CLAMP(x, 0, 1)) +#define CLAMP01(x) (clamp(x, 0, 1)) //time of day but automatically adjusts to the server going into the next day within the same round. //for when you need a reliable time number that doesn't depend on byond time. @@ -30,19 +30,14 @@ // round() acts like floor(x, 1) by default but can't handle other values #define FLOOR(x, y) ( round((x) / (y)) * (y) ) -#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) ) - // Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive #define WRAP(val, min, max) ( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ) // Real modulus that handles decimals #define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) ) -// Tangent -#define TAN(x) (sin(x) / cos(x)) - // Cotangent -#define COT(x) (1 / TAN(x)) +#define COT(x) (1 / tan(x)) // Secant #define SEC(x) (1 / cos(x)) @@ -50,8 +45,6 @@ // Cosecant #define CSC(x) (1 / sin(x)) -#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) ) - // Greatest Common Divisor - Euclid's algorithm /proc/GCD(a, b) return b ? GCD(b, (a) % (b)) : a @@ -189,8 +182,8 @@ while(pixel_y < -16) pixel_y += 32 new_y-- - new_x = CLAMP(new_x, 0, world.maxx) - new_y = CLAMP(new_y, 0, world.maxy) + new_x = clamp(new_x, 0, world.maxx) + new_y = clamp(new_y, 0, world.maxy) return locate(new_x, new_y, starting.z) // Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm deleted file mode 100644 index d357f6bbfba..00000000000 --- a/code/__DEFINES/maths.dm +++ /dev/null @@ -1,2 +0,0 @@ -// Real modulus that handles decimals -#define MODULUS(x, y) ( (x) - (y) * round((x) / (y)) ) diff --git a/code/__DEFINES/persistence.dm b/code/__DEFINES/persistence.dm new file mode 100644 index 00000000000..f1d8285b0ba --- /dev/null +++ b/code/__DEFINES/persistence.dm @@ -0,0 +1,11 @@ +// Direct filename paths + +#define PERSISTENCE_FILE_BUNKER_PASSTHROUGH "data/persistence/bunker_passthrough.json" + +// Filenames for putting under directories + +#define PERSISTENCE_FILENAME_OBJECTS "objects.json" + +// Directories + +#define PERSISTENCE_MAP_ROOT_DIRECTORY "data/persistence/maps" diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index 05d41206e73..3d4207c5c97 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -7,13 +7,13 @@ #define SHOULD_CALL_PARENT(X) set SpacemanDMM_should_call_parent = X #define UNLINT(X) SpacemanDMM_unlint(X) #define SHOULD_NOT_OVERRIDE(X) set SpacemanDMM_should_not_override = X - #define SHOULD_NOT_SLEEP(X) - #define SHOULD_BE_PURE(X) - #define PRIVATE_PROC(X) - #define PROTECTED_PROC(X) + #define SHOULD_NOT_SLEEP(X) set SpacemanDMM_should_not_sleep = X + #define SHOULD_BE_PURE(X) set SpacemanDMM_should_be_pure = X + #define PRIVATE_PROC(X) set SpacemanDMM_private_proc = X + #define PROTECTED_PROC(X) set SpacemanDMM_protected_proc = X #define VAR_FINAL var/SpacemanDMM_final - #define VAR_PRIVATE var - #define VAR_PROTECTED var + #define VAR_PRIVATE var/SpacemanDMM_private + #define VAR_PROTECTED var/SpacemanDMM_protected #else #define RETURN_TYPE(X) #define SHOULD_CALL_PARENT(X) diff --git a/code/__DEFINES/spells.dm b/code/__DEFINES/spells.dm new file mode 100644 index 00000000000..1bc4f76b3ac --- /dev/null +++ b/code/__DEFINES/spells.dm @@ -0,0 +1,22 @@ +//cast_method flags, needs to be up to date with Technomancer's. They were, for some reason, not working outside it. +#define CAST_USE 1 // Clicking the spell in your hand. +#define CAST_MELEE 2 // Clicking an atom in melee range. +#define CAST_RANGED 4 // Clicking an atom beyond melee range. +#define CAST_THROW 8 // Throwing the spell and hitting an atom. +#define CAST_COMBINE 16 // Clicking another spell with this spell. +#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. + +//Aspects +#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. +#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. +#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. +#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. +#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. +#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. +#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. +#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. +#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. +#define ASPECT_EMP "emp" //Unused now. +#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. +#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. +#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index c159bc9b64f..113bfc55bdd 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -327,8 +327,6 @@ return list("mobs" = mobs, "objs" = objs) -#define SIGN(X) ((X<0)?-1:1) - proc inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5) var/turf/T @@ -628,4 +626,4 @@ datum/projectile_data /proc/window_flash(var/client_or_usr) if (!client_or_usr) return - winset(client_or_usr, "mainwindow", "flash=5") \ No newline at end of file + winset(client_or_usr, "mainwindow", "flash=5") diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index f885a35f0d8..aa69e38ccc3 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -107,7 +107,7 @@ AngleToHue(hue) Converts an angle to a hue in the valid range. RotateHue(hsv, angle) Takes an HSV or HSVA value and rotates the hue forward through red, green, and blue by an angle from 0 to 360. - (Rotating red by 60° produces yellow.) The result is another HSV or HSVA color with the same saturation and value + (Rotating red by 60� produces yellow.) The result is another HSV or HSVA color with the same saturation and value as the original, but a different hue. GrayScale(rgb) Takes an RGB or RGBA color and converts it to grayscale. Returns an RGB or RGBA string. @@ -904,9 +904,9 @@ proc/adjust_brightness(var/color, var/value) if (!value) return color var/list/RGB = ReadRGB(color) - RGB[1] = CLAMP(RGB[1]+value,0,255) - RGB[2] = CLAMP(RGB[2]+value,0,255) - RGB[3] = CLAMP(RGB[3]+value,0,255) + RGB[1] = clamp(RGB[1]+value,0,255) + RGB[2] = clamp(RGB[2]+value,0,255) + RGB[3] = clamp(RGB[3]+value,0,255) return rgb(RGB[1],RGB[2],RGB[3]) proc/sort_atoms_by_layer(var/list/atoms) diff --git a/code/__HELPERS/lists/associations.dm b/code/__HELPERS/lists/associations.dm index 1fd6e8a66b0..56bcdaf6ba1 100644 --- a/code/__HELPERS/lists/associations.dm +++ b/code/__HELPERS/lists/associations.dm @@ -26,6 +26,27 @@ input[input[i]] = null return input +/proc/deep_list2params(list/deep_list) + var/list/L = list() + for(var/i in deep_list) + var/key = i + if(isnum(key)) + L += "[key]" + continue + if(islist(key)) + key = deep_list2params(key) + else if(!istext(key)) + key = "[REF(key)]" + L += "[key]" + var/value = deep_list[key] + if(!isnull(value)) + if(islist(value)) + value = deep_list2params(value) + else if(!(istext(key) || isnum(key))) + value = "[REF(value)]" + L["[key]"] = "[value]" + return list2params(L) + //takes an input_key, as text, and the list of keys already used, outputting a replacement key in the format of "[input_key] ([number_of_duplicates])" if it finds a duplicate //use this for lists of things that might have the same name, like mobs or objects, that you plan on giving to a player as input /proc/avoid_assoc_duplicate_keys(input_key, list/used_key_list) diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index d048e739345..a6390808ecb 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -52,7 +52,7 @@ /proc/color_rotation(angle) if(angle == 0) return color_identity() - angle = CLAMP(angle, -180, 180) + angle = clamp(angle, -180, 180) var/cos = cos(angle) var/sin = sin(angle) @@ -67,7 +67,7 @@ //Makes everything brighter or darker without regard to existing color or brightness /proc/color_brightness(power) - power = CLAMP(power, -255, 255) + power = clamp(power, -255, 255) power = power/255 return list(1,0,0, 0,1,0, 0,0,1, power,power,power) @@ -87,7 +87,7 @@ //Exxagerates or removes brightness /proc/color_contrast(value) - value = CLAMP(value, -100, 100) + value = clamp(value, -100, 100) if(value == 0) return color_identity() @@ -110,7 +110,7 @@ /proc/color_saturation(value as num) if(value == 0) return color_identity() - value = CLAMP(value, -100, 100) + value = clamp(value, -100, 100) if(value > 0) value *= 3 var/x = 1 + value / 100 @@ -123,4 +123,4 @@ #undef LUMR #undef LUMG -#undef LUMB \ No newline at end of file +#undef LUMB diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index 29899ddce13..883a2cf4f25 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -129,3 +129,6 @@ var/round_start_time = 0 if(hour) hourT = " and [hour] hour[(hour != 1)? "s":""]" return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]" + +/proc/daysSince(realtimev) + return round((world.realtime - realtimev) / (24 HOURS)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 7e9d3505ec1..410183604b3 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1441,4 +1441,4 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) if(315) return "Northwest" if(337.5) - return "North-Northwest" \ No newline at end of file + return "North-Northwest" diff --git a/code/__HELPERS/vector.dm b/code/__HELPERS/vector.dm index 1cada6122e7..8caa904985b 100644 --- a/code/__HELPERS/vector.dm +++ b/code/__HELPERS/vector.dm @@ -1,4 +1,4 @@ -/* +/* plot_vector is a helper datum for plotting a path in a straight line towards a target turf. This datum converts from world space (turf.x and turf.y) to pixel space, which the datum keeps track of itself. This should work with any size turfs (i.e. 32x32, 64x64) as it references world.icon_size (note: not actually tested with @@ -6,7 +6,7 @@ anything other than 32x32 turfs). setup() This should be called after creating a new instance of a plot_vector datum. - This does the initial setup and calculations. Since we are travelling in a straight line we only need to calculate + This does the initial setup and calculations. Since we are travelling in a straight line we only need to calculate the vector and x/y steps once. x/y steps are capped to 1 full turf, whichever is further. If we are travelling along the y axis each step will be +/- 1 y, and the x movement reduced based on the angle (tangent calculation). After this every subsequent step will be incremented based on these calculations. @@ -23,22 +23,22 @@ return_angle() Returns the direction (angle in degrees) the object is travelling in. (N) - 90° + 90� ^ | - (W) 180° <--+--> 0° (E) + (W) 180� <--+--> 0� (E) | v - -90° + -90� (S) return_hypotenuse() - Returns the distance of travel for each step of the vector, relative to each full step of movement. 1 is a full turf + Returns the distance of travel for each step of the vector, relative to each full step of movement. 1 is a full turf length. Currently used as a multiplier for scaling effects that should be contiguous, like laser beams. return_location() - Returns a vector_loc datum containing the current location data of the object (see /datum/vector_loc). This includes - the turf it currently should be at, as well as the pixel offset from the centre of that turf. Typically increment() + Returns a vector_loc datum containing the current location data of the object (see /datum/vector_loc). This includes + the turf it currently should be at, as well as the pixel offset from the centre of that turf. Typically increment() would be called before this if you are going to move an object based on it's vector data. */ @@ -55,11 +55,11 @@ return_location() /datum/plot_vector/proc/setup(var/turf/S, var/turf/T, var/xo = 0, var/yo = 0, var/angle_offset=0) source = S target = T - + if(!istype(source)) source = get_turf(source) if(!istype(target)) - target = get_turf(target) + target = get_turf(target) if(!istype(source) || !istype(target)) return @@ -68,7 +68,7 @@ return_location() loc_x = source.x * world.icon_size + xo loc_y = source.y * world.icon_size + yo loc_z = source.z - + // calculate initial x and y difference var/dx = target.x - source.x var/dy = target.y - source.y @@ -78,7 +78,7 @@ return_location() return // calculate the angle - angle = ATAN2(dx, dy) + angle_offset + angle = arctan(dx, dy) + angle_offset // and some rounding to stop the increments jumping whole turfs - because byond favours certain angles if(angle > -135 && angle < 45) @@ -97,7 +97,7 @@ return_location() offset_y = sign(dy) else offset_x = sign(dx) - offset_y = TAN(angle) + offset_y = tan(angle) if(dx < 0) offset_y = -offset_y @@ -125,7 +125,7 @@ return_location() data.pixel_y = loc_y - (data.loc.y * world.icon_size) return data -/* +/* vector_loc is a helper datum for returning precise location data from plot_vector. It includes the turf the object is in as well as the pixel offsets. diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index 62d7af21719..faefbc375c4 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -4,3 +4,5 @@ GLOBAL_VAR_INIT(TAB, "    ") //Loadout stuff GLOBAL_DATUM_INIT(global_underwear, /datum/category_collection/underwear, new) + +GLOBAL_VAR_INIT(internal_tick_usage, 0.2 * world.tick_lag) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index e0171c41841..66cff1afebe 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -8,7 +8,7 @@ return // Things you might plausibly want to follow - if(ismovableatom(A)) + if(ismovable(A)) ManualFollow(A) // Otherwise jump diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index d7323700e4c..4647b83cd71 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -103,7 +103,7 @@ return FALSE var/temp = text2num(trim(str_val)) if(!isnull(temp)) - config_entry_value = CLAMP(integer ? round(temp) : temp, min_val, max_val) + config_entry_value = clamp(integer ? round(temp) : temp, min_val, max_val) if(config_entry_value != temp && !(datum_flags & DF_VAR_EDITED)) log_config("Changing [name] from [temp] to [config_entry_value]!") return TRUE diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 1a4a113adfb..eece4b94e79 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -8,10 +8,8 @@ var/list/entries var/list/entries_by_type - /* var/list/maplist var/datum/map_config/defaultmap - */ /* var/list/modes // allowed modes @@ -53,7 +51,7 @@ for(var/J in legacy_configs) LoadEntries(J) break - //loadmaplist(CONFIG_MAPS_FILE) + loadmaplist(CONFIG_MAPS_FILE) LoadMOTD() /datum/controller/configuration/proc/full_wipe() @@ -62,11 +60,9 @@ entries_by_type.Cut() QDEL_LIST_ASSOC_VAL(entries) entries = null - /* QDEL_LIST_ASSOC_VAL(maplist) maplist = null QDEL_NULL(defaultmap) - */ /datum/controller/configuration/Destroy() full_wipe() @@ -266,7 +262,6 @@ if(motd || tm_info) motd = motd ? "[motd]
[tm_info]" : tm_info -/* /datum/controller/configuration/proc/loadmaplist(filename) log_config("Loading config file [filename]...") filename = "[directory]/[filename]" @@ -321,7 +316,6 @@ currentmap = null else log_config("Unknown command in map vote config: '[command]'") -*/ /* /datum/controller/configuration/proc/pick_mode(mode_name) diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index e08c96c775c..120aa128a89 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -1,2 +1,6 @@ /datum/config_entry/flag/minimaps_enabled config_entry_value = TRUE + +/datum/config_entry/number/max_bunker_days + config_entry_value = 7 + min_val = 1 diff --git a/code/controllers/subsystems/dcs.dm b/code/controllers/subsystems/dcs.dm index d34d6d7bcb4..3243a8d8c88 100644 --- a/code/controllers/subsystems/dcs.dm +++ b/code/controllers/subsystems/dcs.dm @@ -7,10 +7,53 @@ PROCESSING_SUBSYSTEM_DEF(dcs) /datum/controller/subsystem/processing/dcs/Recover() comp_lookup = SSdcs.comp_lookup -/datum/controller/subsystem/processing/dcs/proc/GetElement(eletype) - . = elements_by_type[eletype] - if(.) - return +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) + var/datum/element/eletype = arguments[1] + var/element_id = eletype + if(!ispath(eletype, /datum/element)) CRASH("Attempted to instantiate [eletype] as a /datum/element") - . = elements_by_type[eletype] = new eletype + + if(initial(eletype.element_flags) & ELEMENT_BESPOKE) + element_id = GetIdFromArguments(arguments) + + . = elements_by_type[element_id] + if(.) + return + . = elements_by_type[element_id] = new eletype + +/**** + * Generates an id for bespoke elements when given the argument list + * Generating the id here is a bit complex because we need to support named arguments + * Named arguments can appear in any order and we need them to appear after ordered arguments + * We assume that no one will pass in a named argument with a value of null + **/ +/datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) + var/datum/element/eletype = arguments[1] + var/list/fullid = list("[eletype]") + var/list/named_arguments = list() + for(var/i in initial(eletype.id_arg_index) to length(arguments)) + var/key = arguments[i] + var/value + if(istext(key)) + value = arguments[key] + if(!(istext(key) || isnum(key))) + if(islist(key)) // CITADEL EDIT + key = deep_list2params(key) + else + key = REF(key) + key = "[key]" // Key is stringified so numbers dont break things + if(!isnull(value)) + if(!(istext(value) || isnum(value))) + if(islist(value)) // CITADEL EDIT + value = deep_list2params(value) + else + value = REF(value) + named_arguments["[key]"] = value + else + fullid += "[key]" + + if(length(named_arguments)) + named_arguments = sortList(named_arguments) + fullid += named_arguments + return list2params(fullid) diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index 58dd49dd265..4640149c489 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -467,9 +467,9 @@ SUBSYSTEM_DEF(jobs) return H.Robotize() if("AI") return H - if("Colony Director") + if("Facility Director") var/sound/announce_sound = (SSticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20) - captain_announcement.Announce("All hands, [alt_title ? alt_title : "Colony Director"] [H.real_name] on deck!", new_sound=announce_sound) + captain_announcement.Announce("All hands, [alt_title ? alt_title : "Facility Director"] [H.real_name] on deck!", new_sound=announce_sound) //Deferred item spawning. if(spawn_in_storage && spawn_in_storage.len) diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm index 8817d83ad54..b6782b18db5 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -163,4 +163,4 @@ SUBSYSTEM_DEF(lighting) #undef SSLIGHTING_STAGE_LIGHTS #undef SSLIGHTING_STAGE_CORNERS #undef SSLIGHTING_STAGE_OVERLAYS -#undef SSLIGHTING_STAGE_STATS \ No newline at end of file +#undef SSLIGHTING_STAGE_STATS diff --git a/code/controllers/subsystems/mapping.dm b/code/controllers/subsystems/mapping.dm index 428d5d5de7f..c9bb7331cea 100644 --- a/code/controllers/subsystems/mapping.dm +++ b/code/controllers/subsystems/mapping.dm @@ -4,8 +4,60 @@ SUBSYSTEM_DEF(mapping) init_order = INIT_ORDER_MAPPING flags = SS_NO_FIRE + /// The current map config datum the round is using + var/static/datum/map_config/config + /// The next map to load + var/static/datum/map_config/next_map_config + + /// Cached map name for statpanel + var/static/stat_map_name = "Loading..." + + /// Lookup list for random generated IDs. + var/static/list/random_generated_ids_by_original = list() + /// next id for separating obfuscated ids. + var/static/obfuscation_next_id = 1 + /// "secret" key + var/static/obfuscation_secret + +//dlete dis once #39770 is resolved +/datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig() + if(!config) +#ifdef FORCE_MAP + config = load_map_config(FORCE_MAP) +#else + config = load_map_config(error_if_missing = FALSE) +#endif + stat_map_name = config.map_name + +/datum/controller/subsystem/mapping/PreInit() + if(!obfuscation_secret) + obfuscation_secret = md5(GUID()) //HAH! Guess this! + +/datum/controller/subsystem/mapping/Initialize(timeofday) + HACK_LoadMapConfig() + if(subsystem_initialized) + return + if(config.defaulted) + var/old_config = config + config = global.config.defaultmap + if(!config || config.defaulted) + to_chat(world, "Unable to load next or default map config, defaulting to Tethermap") + config = old_config + return ..() + +// +// Mapping subsystem handles initialization of random map elements at server start +// On VOREStation that means loading our random roundstart engine! +// +/datum/controller/subsystem/mapping var/list/map_templates = list() var/dmm_suite/maploader = null + var/obj/effect/landmark/engine_loader/engine_loader + var/list/shelter_templates = list() + +/datum/controller/subsystem/mapping/Recover() + flags |= SS_NO_INIT // Make extra sure we don't initialize twice. + shelter_templates = SSmapping.shelter_templates /datum/controller/subsystem/mapping/Initialize(timeofday) if(subsystem_initialized) @@ -19,6 +71,13 @@ SUBSYSTEM_DEF(mapping) if(GLOB.using_map.perform_map_generation()) GLOB.using_map.refresh_mining_turfs() + loadEngine() + preloadShelterTemplates() + // Mining generation probably should be here too + // TODO - Other stuff related to maps and areas could be moved here too. Look at /tg + if(GLOB.using_map) + loadLateMaps() + ..() /datum/controller/subsystem/mapping/proc/load_map_templates() for(var/T in subtypesof(/datum/map_template)) @@ -28,3 +87,82 @@ SUBSYSTEM_DEF(mapping) template = new T() map_templates[template.name] = template return TRUE + +/datum/controller/subsystem/mapping/proc/loadEngine() + if(!engine_loader) + return // Seems this map doesn't need an engine loaded. + + var/turf/T = get_turf(engine_loader) + if(!isturf(T)) + subsystem_log("[log_info_line(engine_loader)] not on a turf! Cannot place engine template.") + return + + // Choose an engine type + var/datum/map_template/engine/chosen_type = null + if (LAZYLEN(config_legacy.engine_map)) + var/chosen_name = pick(config_legacy.engine_map) + chosen_type = map_templates[chosen_name] + if(!istype(chosen_type)) + log_world("Configured engine map [chosen_name] is not a valid engine map name!") + if(!istype(chosen_type)) + var/list/engine_types = list() + for(var/map in map_templates) + var/datum/map_template/engine/MT = map_templates[map] + if(istype(MT)) + engine_types += MT + chosen_type = pick(engine_types) + subsystem_log("Chose Engine Map: [chosen_type.name]") + admin_notice("Chose Engine Map: [chosen_type.name]", R_DEBUG) + + // Annihilate movable atoms + engine_loader.annihilate_bounds() + //CHECK_TICK //Don't let anything else happen for now + // Actually load it + chosen_type.load(T) + +/datum/controller/subsystem/mapping/proc/loadLateMaps() + var/list/deffo_load = GLOB.using_map.lateload_z_levels + var/list/maybe_load = GLOB.using_map.lateload_single_pick + + for(var/list/maplist in deffo_load) + if(!islist(maplist)) + log_world("Lateload Z level [maplist] is not a list! Must be in a list!") + continue + for(var/mapname in maplist) + var/datum/map_template/MT = map_templates[mapname] + if(!istype(MT)) + log_world("Lateload Z level \"[mapname]\" is not a valid map!") + continue + MT.load_new_z(centered = FALSE) + CHECK_TICK + + if(LAZYLEN(maybe_load)) + var/picklist = pick(maybe_load) + + if(!picklist) //No lateload maps at all + return + + if(!islist(picklist)) //So you can have a 'chain' of z-levels that make up one away mission + log_world("Randompick Z level [picklist] is not a list! Must be in a list!") + return + + for(var/map in picklist) + var/datum/map_template/MT = map_templates[map] + if(!istype(MT)) + log_world("Randompick Z level \"[map]\" is not a valid map!") + else + MT.load_new_z(centered = FALSE) + +/datum/controller/subsystem/mapping/proc/preloadShelterTemplates() + for(var/item in subtypesof(/datum/map_template/shelter)) + var/datum/map_template/shelter/shelter_type = item + if(!(initial(shelter_type.mappath))) + continue + var/datum/map_template/shelter/S = new shelter_type() + + shelter_templates[S.shelter_id] = S + +/datum/controller/subsystem/mapping/stat_entry(msg) + if (!Debug2) + return // Only show up in stat panel if debugging is enabled. + . = ..() diff --git a/code/controllers/subsystems/mapping_vr.dm b/code/controllers/subsystems/mapping_vr.dm deleted file mode 100644 index 1194906e272..00000000000 --- a/code/controllers/subsystems/mapping_vr.dm +++ /dev/null @@ -1,125 +0,0 @@ -// -// Mapping subsystem handles initialization of random map elements at server start -// On VOREStation that means loading our random roundstart engine! -// -SUBSYSTEM_DEF(mapping) - name = "Mapping" - init_order = INIT_ORDER_MAPPING - flags = SS_NO_FIRE - - var/list/map_templates = list() - var/dmm_suite/maploader = null - var/obj/effect/landmark/engine_loader/engine_loader - var/list/shelter_templates = list() - -/datum/controller/subsystem/mapping/Recover() - flags |= SS_NO_INIT // Make extra sure we don't initialize twice. - shelter_templates = SSmapping.shelter_templates - -/datum/controller/subsystem/mapping/Initialize(timeofday) - if(subsystem_initialized) - return - world.max_z_changed() // This is to set up the player z-level list, maxz hasn't actually changed (probably) - maploader = new() - load_map_templates() - - if(config_legacy.generate_map) - // Map-gen is still very specific to the map, however putting it here should ensure it loads in the correct order. - if(GLOB.using_map.perform_map_generation()) - GLOB.using_map.refresh_mining_turfs() - - loadEngine() - preloadShelterTemplates() - // Mining generation probably should be here too - // TODO - Other stuff related to maps and areas could be moved here too. Look at /tg - if(GLOB.using_map) - loadLateMaps() - ..() - -/datum/controller/subsystem/mapping/proc/load_map_templates() - for(var/T in subtypesof(/datum/map_template)) - var/datum/map_template/template = T - if(!(initial(template.mappath))) // If it's missing the actual path its probably a base type or being used for inheritence. - continue - template = new T() - map_templates[template.name] = template - return TRUE - -/datum/controller/subsystem/mapping/proc/loadEngine() - if(!engine_loader) - return // Seems this map doesn't need an engine loaded. - - var/turf/T = get_turf(engine_loader) - if(!isturf(T)) - subsystem_log("[log_info_line(engine_loader)] not on a turf! Cannot place engine template.") - return - - // Choose an engine type - var/datum/map_template/engine/chosen_type = null - if (LAZYLEN(config_legacy.engine_map)) - var/chosen_name = pick(config_legacy.engine_map) - chosen_type = map_templates[chosen_name] - if(!istype(chosen_type)) - log_world("Configured engine map [chosen_name] is not a valid engine map name!") - if(!istype(chosen_type)) - var/list/engine_types = list() - for(var/map in map_templates) - var/datum/map_template/engine/MT = map_templates[map] - if(istype(MT)) - engine_types += MT - chosen_type = pick(engine_types) - subsystem_log("Chose Engine Map: [chosen_type.name]") - admin_notice("Chose Engine Map: [chosen_type.name]", R_DEBUG) - - // Annihilate movable atoms - engine_loader.annihilate_bounds() - //CHECK_TICK //Don't let anything else happen for now - // Actually load it - chosen_type.load(T) - -/datum/controller/subsystem/mapping/proc/loadLateMaps() - var/list/deffo_load = GLOB.using_map.lateload_z_levels - var/list/maybe_load = GLOB.using_map.lateload_single_pick - - for(var/list/maplist in deffo_load) - if(!islist(maplist)) - log_world("Lateload Z level [maplist] is not a list! Must be in a list!") - continue - for(var/mapname in maplist) - var/datum/map_template/MT = map_templates[mapname] - if(!istype(MT)) - log_world("Lateload Z level \"[mapname]\" is not a valid map!") - continue - MT.load_new_z(centered = FALSE) - CHECK_TICK - - if(LAZYLEN(maybe_load)) - var/picklist = pick(maybe_load) - - if(!picklist) //No lateload maps at all - return - - if(!islist(picklist)) //So you can have a 'chain' of z-levels that make up one away mission - log_world("Randompick Z level [picklist] is not a list! Must be in a list!") - return - - for(var/map in picklist) - var/datum/map_template/MT = map_templates[map] - if(!istype(MT)) - log_world("Randompick Z level \"[map]\" is not a valid map!") - else - MT.load_new_z(centered = FALSE) - -/datum/controller/subsystem/mapping/proc/preloadShelterTemplates() - for(var/item in subtypesof(/datum/map_template/shelter)) - var/datum/map_template/shelter/shelter_type = item - if(!(initial(shelter_type.mappath))) - continue - var/datum/map_template/shelter/S = new shelter_type() - - shelter_templates[S.shelter_id] = S - -/datum/controller/subsystem/mapping/stat_entry(msg) - if (!Debug2) - return // Only show up in stat panel if debugging is enabled. - . = ..() diff --git a/code/controllers/subsystems/persistence/_persistence.dm b/code/controllers/subsystems/persistence/_persistence.dm new file mode 100644 index 00000000000..55376fc4e88 --- /dev/null +++ b/code/controllers/subsystems/persistence/_persistence.dm @@ -0,0 +1,35 @@ +SUBSYSTEM_DEF(persistence) + name = "Persistence" + init_order = INIT_ORDER_PERSISTENCE + flags = SS_NO_FIRE + /// The directory to write to for per-map persistence. If null, the current map shouldn't be persisted to/from. + var/current_map_directory + +/datum/controller/subsystem/persistence/Initialize() + SetMapDirectory() + LoadPersistence() + return ..() + +/datum/controller/subsystem/persistence/Shutdown() + SavePersistence() + return ..() + +/** + * Loads all persistent information from disk. + */ +/datum/controller/subsystem/persistence/proc/LoadPersistence() + return + +/** + * Saves all persistent information to disk. + */ +/datum/controller/subsystem/persistence/proc/SavePersistence() + return + +/** + * Sets our current_map_directory to corrospond to the current map. + */ +/datum/controller/subsystem/persistence/proc/SetMapDirectory() + if(!SSmapping.config.persistence_id) + return // map doesn't support persistence. + current_map_directory = "[PERSISTENCE_MAP_ROOT_DIRECTORY]/[SSmapping.config.persistence_id]" diff --git a/code/controllers/subsystems/persistence/bunker.dm b/code/controllers/subsystems/persistence/bunker.dm new file mode 100644 index 00000000000..0ad95dc8782 --- /dev/null +++ b/code/controllers/subsystems/persistence/bunker.dm @@ -0,0 +1,24 @@ +// Persistent panic bunker passthrough +/datum/controller/subsystem/persistence/LoadPersistence() + LoadPanicBunker() + return ..() + +/datum/controller/subsystem/persistence/SavePersistence() + SavePanicBunker() + return ..() + +/datum/controller/subsystem/persistence/proc/SavePanicBunker() + var/json_file = file(PERSISTENCE_FILE_BUNKER_PASSTHROUGH) + var/list/file_data = list() + file_data["data"] = GLOB.bunker_passthrough + fdel(json_file) + WRITE_FILE(json_file,json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/LoadPanicBunker() + var/bunker_path = file(PERSISTENCE_FILE_BUNKER_PASSTHROUGH) + if(fexists(bunker_path)) + var/list/json = json_decode(file2text(bunker_path)) + GLOB.bunker_passthrough = json["data"] + for(var/ckey in GLOB.bunker_passthrough) + if(daysSince(GLOB.bunker_passthrough[ckey]) >= CONFIG_GET(number/max_bunker_days)) + GLOB.bunker_passthrough -= ckey diff --git a/code/controllers/subsystems/persistence/objects.dm b/code/controllers/subsystems/persistence/objects.dm new file mode 100644 index 00000000000..ebb85540514 --- /dev/null +++ b/code/controllers/subsystems/persistence/objects.dm @@ -0,0 +1,40 @@ +/datum/controller/subsystem/persistence/LoadPersistence() + LoadObjects() + return ..() + +/datum/controller/subsystem/persistence/SavePersistence() + SaveObjects() + return ..() + +/datum/controller/subsystem/persistence/proc/LoadObjects() + if(!current_map_directory) + return + var/jsonfile = file("[current_map_directory]/[PERSISTENCE_FILENAME_OBJECTS]") + if(!jsonfile) + return + var/list/data = json_decode(file2text(jsonfile)) + var/datum/element/persistence/P = SSdcs.GetElement(list(/datum/element/persistence)) + if(!P) + to_chat(world, "Persistence subsystem failed to grab the persistence element. !!ALL DATA WILL BE LOST AT ROUND END!!") + CRASH("FATAL: COULD NOT GRAB PERSISTENCE ELEMENT FOR OBJECT LOAD.") + P.DeserializeAndInstantiateAll(data) + +/datum/controller/subsystem/persistence/proc/SaveObjects() + if(!current_map_directory) + return + var/jsonfile = file("[current_map_directory]/[PERSISTENCE_FILENAME_OBJECTS]") + var/list/data = GetObjectData() + if(!islist(data)) + to_chat(world, "Persistence subsystem failed to save objects! Object data not modified. ERROR: [data || "!UNKNOWN!"]") + CRASH("Unable to get valid object data. [data]") + fdel(jsonfile) + WRITE_FILE(jsonfile, json_encode(data)) + +/datum/controller/subsystem/persistence/proc/GetObjectData() + var/datum/element/persistence/P = SSdcs.GetElement(list(/datum/element/persistence)) + if(!P) + return "COULD NOT FIND ELEMENT" + var/list/returnlist = P.SerializeAll() + if(!islist(returnlist)) + return "DID NOT GET LIST" + return returnlist diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 2ef367df5d3..fa5f57743b4 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -391,7 +391,7 @@ SUBSYSTEM_DEF(ticker) var/captainless=1 for(var/mob/living/carbon/human/player in player_list) if(player && player.mind && player.mind.assigned_role) - if(player.mind.assigned_role == "Colony Director") + if(player.mind.assigned_role == "Facility Director") captainless=0 if(!player_is_antag(player.mind, only_offstation_roles = 1)) SSjobs.EquipRank(player, player.mind.assigned_role, 0) @@ -401,7 +401,7 @@ SUBSYSTEM_DEF(ticker) if(captainless) for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) - to_chat(M, "Colony Directorship not forced on anyone.") + to_chat(M, "Facility Directorship not forced on anyone.") /datum/controller/subsystem/ticker/proc/round_process() @@ -437,6 +437,10 @@ SUBSYSTEM_DEF(ticker) if(blackbox) blackbox.save_all_data_to_sql() + send2irc("Server", "A round of [mode.name] just ended.") + world.TgsTargetedChatBroadcast("The round has ended.", FALSE) + + SSpersistence.SavePersistence() ready_for_reboot = TRUE standard_reboot() diff --git a/code/datums/components/beetlejuice.dm b/code/datums/components/beetlejuice.dm index 42123fdef18..8df118565a3 100644 --- a/code/datums/components/beetlejuice.dm +++ b/code/datums/components/beetlejuice.dm @@ -10,7 +10,7 @@ var/regex/R /datum/component/beetlejuice/Initialize() - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE first_heard = list() @@ -57,4 +57,4 @@ var/atom/movable/AM = parent do_teleport(AM,get_turf(target)) active = FALSE - addtimer(VARSET_CALLBACK(src, active, TRUE), cooldown) \ No newline at end of file + addtimer(VARSET_CALLBACK(src, active, TRUE), cooldown) diff --git a/code/datums/components/edit_complainer.dm b/code/datums/components/edit_complainer.dm index bf52296e2cb..e2cca2eb50c 100644 --- a/code/datums/components/edit_complainer.dm +++ b/code/datums/components/edit_complainer.dm @@ -3,7 +3,7 @@ var/list/say_lines /datum/component/edit_complainer/Initialize(list/text) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE var/static/list/default_lines = list( diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 094dce211d4..b0843229aa7 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -5,7 +5,7 @@ var/light_impact_range = 2 var/flash_range = 3 var/equipped_slot //For items, lets us determine where things should be hit. - + /datum/component/explodable/Initialize(devastation_range_override, heavy_impact_range_override, light_impact_range_override, flash_range_override) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -13,15 +13,15 @@ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/explodable_attack) RegisterSignal(parent, COMSIG_TRY_STORAGE_INSERT, .proc/explodable_insert_item) RegisterSignal(parent, COMSIG_ATOM_EX_ACT, .proc/detonate) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, COMSIG_MOVABLE_IMPACT, .proc/explodable_impact) RegisterSignal(parent, COMSIG_MOVABLE_BUMP, .proc/explodable_bump) if(isitem(parent)) RegisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), .proc/explodable_attack) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop) - - + + if(devastation_range_override) devastation_range = devastation_range_override @@ -45,14 +45,14 @@ /datum/component/explodable/proc/explodable_attack(datum/source, atom/movable/target, mob/living/user) check_if_detonate(target) -///Called when you attack a specific body part of the thing this is equipped on. Useful for exploding pants. +///Called when you attack a specific body part of the thing this is equipped on. Useful for exploding pants. /datum/component/explodable/proc/explodable_attack_zone(datum/source, damage, damagetype, def_zone) if(!def_zone) return if(damagetype != BURN) //Don't bother if it's not fire. return if(!is_hitting_zone(def_zone)) //You didn't hit us! ha! - return + return detonate() /datum/component/explodable/proc/on_equip(datum/source, mob/equipper, slot) @@ -87,7 +87,7 @@ if(I.body_parts_covered & bodypart.body_part) return TRUE return FALSE - + /datum/component/explodable/proc/check_if_detonate(target) if(!isitem(target)) diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index 702ec9329af..7445ab582bf 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -54,7 +54,7 @@ /datum/fantasy_affix/pyromantic/apply(datum/component/fantasy/comp, newName) var/obj/item/master = comp.parent - comp.appliedComponents += master.AddComponent(/datum/component/igniter, CLAMP(comp.quality, 1, 10)) + comp.appliedComponents += master.AddComponent(/datum/component/igniter, clamp(comp.quality, 1, 10)) return "pyromantic [newName]" /datum/fantasy_affix/vampiric @@ -65,4 +65,4 @@ /datum/fantasy_affix/vampiric/apply(datum/component/fantasy/comp, newName) var/obj/item/master = comp.parent comp.appliedComponents += master.AddComponent(/datum/component/lifesteal, comp.quality) - return "vampiric [newName]" \ No newline at end of file + return "vampiric [newName]" diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm index bf39c32f7d6..8d3c6ab81f0 100644 --- a/code/datums/components/infective.dm +++ b/code/datums/components/infective.dm @@ -12,8 +12,8 @@ if(expire_in) expire_time = world.time + expire_in QDEL_IN(src, expire_in) - - if(!ismovableatom(parent)) + + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, .proc/clean) RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/try_infect_buckle) diff --git a/code/datums/components/knockback.dm b/code/datums/components/knockback.dm index 12a4ae89556..7ff9caa6f4e 100644 --- a/code/datums/components/knockback.dm +++ b/code/datums/components/knockback.dm @@ -32,7 +32,7 @@ do_knockback(target, null, angle2dir(Angle)) /datum/component/knockback/proc/do_knockback(atom/target, mob/thrower, throw_dir) - if(!ismovableatom(target) || throw_dir == null) + if(!ismovable(target) || throw_dir == null) return var/atom/movable/throwee = target if(throwee.anchored && !throw_anchored) @@ -41,4 +41,4 @@ throw_dir = turn(throw_dir, 180) throw_distance *= -1 var/atom/throw_target = get_edge_target_turf(throwee, throw_dir) - throwee.safe_throw_at(throw_target, throw_distance, 1, thrower) \ No newline at end of file + throwee.safe_throw_at(throw_target, throw_distance, 1, thrower) diff --git a/code/datums/components/magnetic_catch.dm b/code/datums/components/magnetic_catch.dm index 4defe936e5e..20cd8e1d78f 100644 --- a/code/datums/components/magnetic_catch.dm +++ b/code/datums/components/magnetic_catch.dm @@ -2,7 +2,7 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/crossed_react) RegisterSignal(parent, COMSIG_MOVABLE_UNCROSSED, .proc/uncrossed_react) for(var/i in get_turf(parent)) diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm index d5d32010cd1..a366f4b822f 100644 --- a/code/datums/components/mirage_border.dm +++ b/code/datums/components/mirage_border.dm @@ -14,8 +14,8 @@ var/x = target.x var/y = target.y var/z = target.z - var/turf/southwest = locate(CLAMP(x - (direction & WEST ? range : 0), 1, world.maxx), CLAMP(y - (direction & SOUTH ? range : 0), 1, world.maxy), CLAMP(z, 1, world.maxz)) - var/turf/northeast = locate(CLAMP(x + (direction & EAST ? range : 0), 1, world.maxx), CLAMP(y + (direction & NORTH ? range : 0), 1, world.maxy), CLAMP(z, 1, world.maxz)) + var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) + var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) //holder.vis_contents += block(southwest, northeast) // This doesnt work because of beta bug memes for(var/i in block(southwest, northeast)) holder.vis_contents += i diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 3bcbf983f1d..de2e523d88d 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -199,7 +199,7 @@ // If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.5 // If the new amount would move towards the acceptable range faster then use it instead if(amount < minimum) - amount += CLAMP(minimum - sanity, 0, 0.7) + amount += clamp(minimum - sanity, 0, 0.7) else if(!override && HAS_TRAIT(parent, TRAIT_UNSTABLE)) maximum = sanity diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 761d3e47585..2c1a48af0b8 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -154,7 +154,7 @@ return (nanite_volume > 0) /datum/component/nanites/proc/adjust_nanites(datum/source, amount) - nanite_volume = CLAMP(nanite_volume + amount, 0, max_nanites) + nanite_volume = clamp(nanite_volume + amount, 0, max_nanites) if(nanite_volume <= 0) //oops we ran out qdel(src) @@ -166,7 +166,7 @@ if(remove || stealth) return //bye icon var/nanite_percent = (nanite_volume / max_nanites) * 100 - nanite_percent = CLAMP(CEILING(nanite_percent, 10), 10, 100) + nanite_percent = clamp(CEILING(nanite_percent, 10), 10, 100) holder.icon_state = "nanites[nanite_percent]" /datum/component/nanites/proc/on_emp(datum/source, severity) @@ -220,16 +220,16 @@ return FALSE /datum/component/nanites/proc/set_volume(datum/source, amount) - nanite_volume = CLAMP(amount, 0, max_nanites) + nanite_volume = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_max_volume(datum/source, amount) max_nanites = max(1, max_nanites) /datum/component/nanites/proc/set_cloud(datum/source, amount) - cloud_id = CLAMP(amount, 0, 100) + cloud_id = clamp(amount, 0, 100) /datum/component/nanites/proc/set_safety(datum/source, amount) - safety_threshold = CLAMP(amount, 0, max_nanites) + safety_threshold = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_regen(datum/source, amount) regen_rate = amount diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 877de444815..df93d87cca0 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -22,14 +22,14 @@ /datum/component/orbiter/RegisterWithParent() . = ..() var/atom/target = parent - while(ismovableatom(target)) + while(ismovable(target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react) target = target.loc /datum/component/orbiter/UnregisterFromParent() . = ..() var/atom/target = parent - while(ismovableatom(target)) + while(ismovable(target)) UnregisterSignal(target, COMSIG_MOVABLE_MOVED) target = target.loc @@ -111,12 +111,12 @@ // These are prety rarely activated, how often are you following something in a bag? if(oldloc && !isturf(oldloc)) // We used to be registered to it, probably var/atom/target = oldloc - while(ismovableatom(target)) + while(ismovable(target)) UnregisterSignal(target, COMSIG_MOVABLE_MOVED) target = target.loc if(orbited?.loc && orbited.loc != newturf) // We want to know when anything holding us moves too var/atom/target = orbited.loc - while(ismovableatom(target)) + while(ismovable(target)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/move_react, TRUE) target = target.loc diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index bca95173727..9d4a16ac920 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -17,7 +17,7 @@ var/turn_connects = TRUE /datum/component/plumbing/Initialize(start=TRUE, _turn_connects=TRUE) //turn_connects for wheter or not we spin with the object to change our pipes - if(parent && !ismovableatom(parent)) + if(parent && !ismovable(parent)) return COMPONENT_INCOMPATIBLE var/atom/movable/AM = parent if(!AM.reagents) @@ -194,4 +194,4 @@ ///input and output, like a holding tank /datum/component/plumbing/tank demand_connects = WEST - supply_connects = EAST \ No newline at end of file + supply_connects = EAST diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 3690c3374f7..ef5d5a3ca7e 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -22,7 +22,7 @@ var/del_on_unbuckle_all = FALSE /datum/component/riding/Initialize() - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, COMSIG_MOVABLE_BUCKLE, .proc/vehicle_mob_buckle) RegisterSignal(parent, COMSIG_MOVABLE_UNBUCKLE, .proc/vehicle_mob_unbuckle) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index f5564f99a57..8820813dea9 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -14,7 +14,7 @@ var/default_rotation_direction = ROTATION_CLOCKWISE /datum/component/simple_rotation/Initialize(rotation_flags = NONE ,can_user_rotate,can_be_rotated,after_rotation) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE //throw if no rotation direction is specificed ? diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index 9209a9d401e..ab32cc8a703 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -17,7 +17,7 @@ if(!isatom(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak) - if(ismovableatom(parent)) + if(ismovable(parent)) RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak) RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_crossed) RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index 51d67e10e20..65a4d765b88 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -5,7 +5,7 @@ var/allow_death = FALSE /datum/component/stationloving/Initialize(inform_admins = FALSE, allow_death = FALSE) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE RegisterSignal(parent, list(COMSIG_MOVABLE_Z_CHANGED), .proc/check_in_bounds) RegisterSignal(parent, list(COMSIG_MOVABLE_SECLUDED_LOCATION), .proc/relocate) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 57fac5f9b1b..e0e882b4b61 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -335,8 +335,8 @@ numbered_contents = _process_numerical_display() adjusted_contents = numbered_contents.len - var/columns = CLAMP(max_items, 1, screen_max_columns) - var/rows = CLAMP(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) + var/columns = clamp(max_items, 1, screen_max_columns) + var/rows = clamp(CEILING(adjusted_contents / columns, 1), 1, screen_max_rows) standard_orient_objs(rows, columns, numbered_contents) //This proc draws out the inventory and places the items on it. It uses the standard position. diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index c9d20f1f702..16ddc66280e 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -5,7 +5,7 @@ var/list/swarm_members = list() /datum/component/swarming/Initialize(max_x = 24, max_y = 24) - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE offset_x = rand(-max_x, max_x) offset_y = rand(-max_y, max_y) diff --git a/code/datums/components/waddling.dm b/code/datums/components/waddling.dm index 47ca60c8a19..6549d9fa888 100644 --- a/code/datums/components/waddling.dm +++ b/code/datums/components/waddling.dm @@ -3,7 +3,7 @@ /datum/component/waddling/Initialize() . = ..() - if(!ismovableatom(parent)) + if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE if(isliving(parent)) RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), .proc/LivingWaddle) diff --git a/code/datums/components/wet_floor.dm b/code/datums/components/wet_floor.dm index 4eab08fa1a2..3aa3bfdb6b9 100644 --- a/code/datums/components/wet_floor.dm +++ b/code/datums/components/wet_floor.dm @@ -178,7 +178,7 @@ /datum/component/wet_floor/proc/_do_add_wet(type, duration_minimum, duration_add, duration_maximum) var/time = 0 if(LAZYACCESS(time_left_list, "[type]")) - time = CLAMP(LAZYACCESS(time_left_list, "[type]") + duration_add, duration_minimum, duration_maximum) + time = clamp(LAZYACCESS(time_left_list, "[type]") + duration_add, duration_minimum, duration_maximum) else time = min(duration_minimum, duration_maximum) LAZYSET(time_left_list, "[type]", time) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 12b3df07e48..976c858a57a 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -148,13 +148,24 @@ to_chat(target, txt_changed_vars()) #endif -///Return a LIST for serialize_datum to encode! Not the actual json! +/** + * Saves our data into a data list. + * + * @params + * * options - associative list of options to use. Not yet particularly used/standardized, but can be easily implemented. + */ /datum/proc/serialize_list(list/options) - CRASH("Attempted to serialize datum [src] of type [type] without serialize_list being implemented!") + return list() -///Accepts a LIST from deserialize_datum. Should return src or another datum. -/datum/proc/deserialize_list(json, list/options) - CRASH("Attempted to deserialize datum [src] of type [type] without deserialize_list being implemented!") +/** + * Takes a data list in and loads data into ourselves. Persistence elements currently use this. + * + * @params + * * data - list of data for us to use + * * options - associatve list of options to use. Not yet particularly used/standardized, but can be easily implemented. + */ +/datum/proc/deserialize_list(list/data, list/options) + return list() ///Serializes into JSON. Does not encode type. /datum/proc/serialize_json(list/options) diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index c89c13978f4..b989494c625 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -1,6 +1,6 @@ /datum/element/cleaning/Attach(datum/target) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/Clean) diff --git a/code/datums/elements/firestacker.dm b/code/datums/elements/firestacker.dm index 6f5b4b99666..fa24e3c2d6f 100644 --- a/code/datums/elements/firestacker.dm +++ b/code/datums/elements/firestacker.dm @@ -9,7 +9,7 @@ /datum/element/firestacker/Attach(datum/target, amount) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE RegisterSignal(target, COMSIG_MOVABLE_IMPACT, .proc/impact) if(isitem(target)) diff --git a/code/datums/elements/persistence.dm b/code/datums/elements/persistence.dm new file mode 100644 index 00000000000..ae175e78330 --- /dev/null +++ b/code/datums/elements/persistence.dm @@ -0,0 +1,63 @@ +/** + * Simple object persistence elements + * For now, it just attachs and detaches and all objects with it are recorded to disk based on map and stuff at round end + * Can expand later for more functionality + * + * WARNING: All atoms recorded are stored to turf! This does not yet support things like loading into inventories. This is mostly for on-floor objects. + */ +/datum/element/persistence + element_flags = ELEMENT_DETACH + + /// List of persistent atoms. Associated list to their GUID + var/list/atom/objects = list() + +/** + * Serializes all objects into a list for json encode or anything else needed. + * Includes data the datum includes in serialize_list(), the GUID of the datum's entry, and its turf location. + */ +/datum/element/persistence/proc/SerializeAll() + . = list() + var/atom/A + var/guid + for(var/i in objects) + A = i + guid = objects[A] + var/turf/location = get_turf(A) + if(!A || !guid || !location) + continue + var/list/datalist = A.serialize_list() + if(!datalist) + continue + . += list(list(datalist, guid, list(location.x, location.y, location.z), "[A.type]")) + +/** + * Instantiates all objects from a data list and attaches to them. + */ +/datum/element/persistence/proc/DeserializeAndInstantiateAll(list/data) + for(var/i in data) + var/list/L = i + if(!istype(L) || (length(L) < 4)) + continue + var/list/datumdata = L[1] + var/guid = L[2] + var/coords = L[3] + var/datumtype = text2path(L[4]) + if(!ispath(datumtype)) + continue + var/turf/T = locate(coords[1], coords[2], coords[3]) + if(!T) + continue + var/atom/A = new datumtype(T) + A.deserialize_list(datumdata) + Attach(A, guid) + +/datum/element/persistence/Attach(datum/D, guid = GUID()) + if(!isatom(D)) + return ELEMENT_INCOMPATIBLE + . = ..() + if(. == ELEMENT_INCOMPATIBLE) + return + objects[D] = guid + +/datum/element/persistence/Detach(datum/D) + objects -= D diff --git a/code/datums/elements/snail_crawl.dm b/code/datums/elements/snail_crawl.dm index a3ce8213387..9352ab7beda 100644 --- a/code/datums/elements/snail_crawl.dm +++ b/code/datums/elements/snail_crawl.dm @@ -3,7 +3,7 @@ /datum/element/snailcrawl/Attach(datum/target) . = ..() - if(!ismovableatom(target)) + if(!ismovable(target)) return ELEMENT_INCOMPATIBLE var/P if(iscarbon(target)) diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index c5c392e126d..c26f46beb61 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -64,7 +64,7 @@ return sqrt(((b.x - a.x) ** 2) + ((b.y - a.y) ** 2)) /proc/angle_between_points(datum/point/a, datum/point/b) - return ATAN2((b.y - a.y), (b.x - a.x)) + return arctan((b.y - a.y), (b.x - a.x)) /datum/point //A precise point on the map in absolute pixel locations based on world.icon_size. Pixels are FROM THE EDGE OF THE MAP! var/x = 0 diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 581dc012f8b..763aedb9c8b 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -39,7 +39,7 @@ shown = 0 client = user.client - progress = CLAMP(progress, 0, goal) + progress = clamp(progress, 0, goal) bar.icon_state = "prog_bar_[round(((progress / goal) * 100), 5)]" if (!shown && user.is_preference_enabled(/datum/client_preference/show_progress_bar)) user.client.images += bar diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 6af79460723..53fe06147cb 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -188,7 +188,7 @@ //to decide what to do. They may be used again to make another recipe or discarded, or merged into the results, //thats no longer the concern of this proc var/obj/temp = new /obj(src) - temp.create_reagents(9999999999) + temp.create_reagents(1000000000) //Find items we need if (items && items.len) @@ -234,7 +234,7 @@ the single-result's reagents */ var/obj/tempholder = new(src) - tempholder.create_reagents(9999999999) + tempholder.create_reagents(100000000) var/list/results = list() while (tally < result_quantity) var/obj/result_obj = new result(container) diff --git a/code/datums/underwear/bottom.dm b/code/datums/underwear/bottom.dm index b6270ec4822..4cf2bbfbd5f 100644 --- a/code/datums/underwear/bottom.dm +++ b/code/datums/underwear/bottom.dm @@ -72,4 +72,18 @@ /datum/category_item/underwear/bottom/maebari name = "Maebari" icon_state = "maebari" - has_color = TRUE \ No newline at end of file + has_color = TRUE + +/datum/category_item/underwear/bottom/chastbelt + name = "Chastity Belt" + icon_state = "chastbelt" + +/datum/category_item/underwear/bottom/chastcage + name = "Chastity Cage" + icon_state = "chastcage" + has_color = TRUE + +/datum/category_item/underwear/bottom/cfishnet_bottom + name = "Dyed Fishnets" + icon_state = "c_fishnet_lower" + has_color = TRUE diff --git a/code/datums/underwear/socks.dm b/code/datums/underwear/socks.dm index e1fe7e07f2f..e8a1b8ba3ac 100644 --- a/code/datums/underwear/socks.dm +++ b/code/datums/underwear/socks.dm @@ -60,4 +60,13 @@ /datum/category_item/underwear/socks/leggings name = "Leggings" - icon_state = "leggings" \ No newline at end of file + icon_state = "leggings" + +/datum/category_item/underwear/socks/cfishnet + name = "Dyed Fishnet" + icon_state = "c_fishnet" + has_color = TRUE + +/datum/category_item/underwear/socks/pantyhose_rip + name = "Ripped Pantyhose" + icon_state = "pantyhose_ripped" diff --git a/code/datums/underwear/top.dm b/code/datums/underwear/top.dm index 28a17c3ab7b..1ce87de2a31 100644 --- a/code/datums/underwear/top.dm +++ b/code/datums/underwear/top.dm @@ -70,4 +70,38 @@ /datum/category_item/underwear/top/straplessbinder name = "Binder Strapless" - icon_state = "straplessbinder_s" \ No newline at end of file + icon_state = "straplessbinder_s" + +/datum/category_item/underwear/top/chastbra + name = "Chastity Bra" + icon_state = "chastbra" + +/datum/category_item/underwear/top/pasties + name = "Pasties" + icon_state = "pasties" + has_color = TRUE + +/datum/category_item/underwear/top/pasties_alt + name = "Pasties alt, X" + icon_state = "pasties_alt" + has_color = TRUE + +/datum/category_item/underwear/top/babydoll_lingerie + name = "Babydoll Lingerie" + icon_state = "babydoll_lingerie" + has_color = TRUE + +/datum/category_item/underwear/top/cfishnet + name = "Dyed Fishnet top" + icon_state = "c_fishnet_body" + has_color = TRUE + +/datum/category_item/underwear/top/cfishnet_sleeve + name = "Dyed Fishnet with sleeves" + icon_state = "c_fishnet_sleeves" + has_color = TRUE + +/datum/category_item/underwear/top/cfishnet_glove + name = "Dyed Fishnet with gloves" + icon_state = "c_fishnet_gloves" + has_color = TRUE diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm index 51716f86fc4..e4e244587a4 100644 --- a/code/datums/weakref.dm +++ b/code/datums/weakref.dm @@ -17,6 +17,7 @@ reference = REF(thing) /datum/weakref/Destroy() + . = ..() return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore. /datum/weakref/proc/resolve() diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index ca06b87e56c..67730febe80 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -31,7 +31,6 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" src.holder = holder if(!istype(holder, holder_type)) CRASH("Our holder is null/the wrong type!") - return // Generate new wires if(random) @@ -126,7 +125,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" to_chat(L, "You need wirecutters!") else if(href_list["pulse"]) - if(istype(I, /obj/item/multitool)) + if(I.is_multitool()) var/colour = href_list["pulse"] PulseColour(colour) playsound(holder, 'sound/weapons/empty.ogg', 20, 1) @@ -150,13 +149,13 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" to_chat(L, "You need a remote signaller!") else if(href_list["rename"]) //add the ability to rename doors via multitool - if(istype(I, /obj/item/multitool)) + if(I.is_multitool()) RenameDoor(src) else to_chat(L, "You need a multitool!") else if(href_list["description"]) // and describe them! - if(istype(I, /obj/item/multitool)) + if(I.is_multitool()) DescribeDoor(src) else to_chat(L, "You need a multitool!") diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 86050023ab3..d5ed5c5bb21 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -87,7 +87,7 @@ var/global/list/PDA_Manifest = list() heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 depthead = 1 - if(rank=="Colony Director" && heads.len != 1) + if(rank=="Facility Director" && heads.len != 1) heads.Swap(1,heads.len) if(real_rank in security_positions) diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index 34d5bb74f2d..f9403bedea7 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -39,7 +39,7 @@ length to avoid portals or something i guess?? Not that they're counted right no PriorityQueue var/list/queue - var/proc/comparison_function + var/comparison_function New(compare) queue = list() diff --git a/code/game/antagonist/_antagonist_setup.dm b/code/game/antagonist/_antagonist_setup.dm index fa99f001f32..6f514b94132 100644 --- a/code/game/antagonist/_antagonist_setup.dm +++ b/code/game/antagonist/_antagonist_setup.dm @@ -14,19 +14,6 @@ - To skip equipping with appropriate gear, supply a positive third argument. */ -// Antagonist datum flags. -#define ANTAG_OVERRIDE_JOB 1 // Assigned job is set to MODE when spawning. -#define ANTAG_OVERRIDE_MOB 2 // Mob is recreated from datum mob_type var when spawning. -#define ANTAG_CLEAR_EQUIPMENT 4 // All preexisting equipment is purged. -#define ANTAG_CHOOSE_NAME 8 // Antagonists are prompted to enter a name. -#define ANTAG_IMPLANT_IMMUNE 16 // Cannot be loyalty implanted. -#define ANTAG_SUSPICIOUS 32 // Shows up on roundstart report. -#define ANTAG_HAS_LEADER 64 // Generates a leader antagonist. -#define ANTAG_HAS_NUKE 128 // Will spawn a nuke at supplied location. -#define ANTAG_RANDSPAWN 256 // Potentially randomly spawns due to events. -#define ANTAG_VOTABLE 512 // Can be voted as an additional antagonist before roundstart. -#define ANTAG_SET_APPEARANCE 1024 // Causes antagonists to use an appearance modifier on spawn. - // Globals. var/global/list/all_antag_types = list() var/global/list/all_antag_spawnpoints = list() diff --git a/code/game/antagonist/mutiny/mutineer.dm b/code/game/antagonist/mutiny/mutineer.dm index 69a065c2a18..31758278364 100644 --- a/code/game/antagonist/mutiny/mutineer.dm +++ b/code/game/antagonist/mutiny/mutineer.dm @@ -6,7 +6,7 @@ var/datum/antagonist/mutineer/mutineers role_text_plural = "Mutineers" id = MODE_MUTINEER antag_indicator = "mutineer" - restricted_jobs = list("Colony Director") + restricted_jobs = list("Facility Director") /datum/antagonist/mutineer/New(var/no_reference) ..() @@ -39,7 +39,7 @@ var/datum/antagonist/mutineer/mutineers proc/get_head_loyalist_candidates() var/list/candidates[0] for(var/mob/loyalist in player_list) - if(loyalist.mind && loyalist.mind.assigned_role == "Colony Director") + if(loyalist.mind && loyalist.mind.assigned_role == "Facility Director") candidates.Add(loyalist.mind) return candidates @@ -47,7 +47,7 @@ var/datum/antagonist/mutineer/mutineers var/list/candidates[0] for(var/mob/mutineer in player_list) if(mutineer.client.prefs.be_special & BE_MUTINEER) - for(var/job in command_positions - "Colony Director") + for(var/job in command_positions - "Facility Director") if(mutineer.mind && mutineer.mind.assigned_role == job) candidates.Add(mutineer.mind) return candidates diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 66c31d41767..a4c640cc8e3 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -14,7 +14,7 @@ var/datum/antagonist/ert/ert and before taking extreme actions, please try to also contact the administration! \ Think through your actions and make the roleplay immersive! Please remember all \ rules aside from those without explicit exceptions apply to the ERT." - leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Colony Director where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Colony Director where possible, however." + leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Facility Director where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Facility Director where possible, however." landmark_id = "Response Team" id_type = /obj/item/card/id/centcom/ERT diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm index f59ed1d9c6e..326c9071ab2 100644 --- a/code/game/antagonist/station/changeling.dm +++ b/code/game/antagonist/station/changeling.dm @@ -6,7 +6,7 @@ bantype = "changeling" feedback_tag = "changeling_objective" restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Colony Director") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Facility Director") welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." antag_sound = 'sound/effects/antag_notice/ling_alert.ogg' flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 7603c1eafca..d2eab010f5c 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -12,8 +12,8 @@ var/datum/antagonist/cultist/cult role_text_plural = "Cultists" bantype = "cultist" restricted_jobs = list("Chaplain","AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director") - roundstart_restricted = list("Internal Affairs Agent", "Head of Security", "Colony Director") + protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Facility Director") + roundstart_restricted = list("Internal Affairs Agent", "Head of Security", "Facility Director") role_type = BE_CULTIST feedback_tag = "cult_objective" antag_indicator = "cult" diff --git a/code/game/antagonist/station/infiltrator.dm b/code/game/antagonist/station/infiltrator.dm index ba325a4d204..edc507d7dd0 100644 --- a/code/game/antagonist/station/infiltrator.dm +++ b/code/game/antagonist/station/infiltrator.dm @@ -11,7 +11,7 @@ var/datum/antagonist/traitor/infiltrator/infiltrators role_text = "Infiltrator" role_text_plural = "Infiltrators" welcome_text = "To speak on your team's private channel, use :t." - protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director") + protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Facility Director") flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE can_speak_aooc = TRUE diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index 9e6100c8af4..6f51ba42e08 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -30,8 +30,8 @@ var/datum/antagonist/revolutionary/revs faction_invisible = 1 restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") - roundstart_restricted = list("Internal Affairs Agent", "Colony Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Facility Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + roundstart_restricted = list("Internal Affairs Agent", "Facility Director", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") /datum/antagonist/revolutionary/New() ..() diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index 01a3f73e167..736cb097654 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -4,7 +4,7 @@ var/datum/antagonist/traitor/traitors /datum/antagonist/traitor id = MODE_TRAITOR antag_sound = 'sound/effects/antag_notice/traitor_alert.ogg' - protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director") + protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Facility Director") flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE can_speak_aooc = FALSE // If they want to plot and plan as this sort of traitor, they'll need to do it ICly. diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 52c170ffee8..2a9c532736f 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1079,7 +1079,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station sound_env = MEDIUM_SOFTFLOOR /area/crew_quarters/captain - name = "\improper Command - Colony Director's Office" + name = "\improper Command - Facility Director's Office" icon_state = "captain" sound_env = MEDIUM_SOFTFLOOR diff --git a/code/game/atom_vv.dm b/code/game/atom_vv.dm index 20a6c9eb5b0..1b1b31b85e2 100644 --- a/code/game/atom_vv.dm +++ b/code/game/atom_vv.dm @@ -27,7 +27,7 @@ /atom/vv_get_dropdown() . = ..() VV_DROPDOWN_OPTION("", "---------") - if(!ismovableatom(src)) + if(!ismovable(src)) var/turf/curturf = get_turf(src) if(curturf) . += "" diff --git a/code/game/atoms_movable_movement.dm b/code/game/atoms_movable_movement.dm index 3bc10db5ca8..cdce0c7d75d 100644 --- a/code/game/atoms_movable_movement.dm +++ b/code/game/atoms_movable_movement.dm @@ -244,7 +244,7 @@ M.locationTransitForceMove(destination, recurse_levels - 1) else M.doLocationTransitForceMove(destination) - buckle_mob(M, force = TRUE) + buckle_mob(M, forced = TRUE) // until movement rework /mob/locationTransitForceMove(atom/destination, recurse_levels = 0) diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm index 919a435ced5..35235f4ef7a 100644 --- a/code/game/gamemodes/cult/construct_spells.dm +++ b/code/game/gamemodes/cult/construct_spells.dm @@ -1,25 +1,3 @@ -//cast_method flags, needs to be up to date with Technomancer's. They were, for some reason, not working outside it. -#define CAST_USE 1 // Clicking the spell in your hand. -#define CAST_MELEE 2 // Clicking an atom in melee range. -#define CAST_RANGED 4 // Clicking an atom beyond melee range. -#define CAST_THROW 8 // Throwing the spell and hitting an atom. -#define CAST_COMBINE 16 // Clicking another spell with this spell. -#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. - -//Aspects -#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. -#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. -#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. -#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. -#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. -#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. -#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. -#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. -#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. -#define ASPECT_EMP "emp" //Unused now. -#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. -#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. -#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. //////////////////////////////Construct Spells///////////////////////// @@ -693,4 +671,4 @@ proc/findNullRod(var/atom/target) else user.visible_message("\The [user] lowers its fist.") return - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 4ebd24b0f47..905b23ce5e3 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -132,16 +132,6 @@ anchored = 1.0 var/spawnable = null -/obj/effect/gateway/Bumped(mob/M as mob|obj) - spawn(0) - return - return - -/obj/effect/gateway/Crossed(AM as mob|obj) - spawn(0) - return - return - /obj/effect/gateway/active light_range=5 light_color="#ff0000" diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 529c465daa8..f257d4d7d48 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -297,9 +297,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) to_chat(M, "
") - to_chat(M, "THE COLONY DIRECTOR, HOP AND HOS ARE [who2]...LAWS UPDATED") + to_chat(M, "THE Facility Director, HOP AND HOS ARE [who2]...LAWS UPDATED") to_chat(M, "
") - M.add_ion_law("THE COLONY DIRECTOR, HOP AND HOS ARE [who2]") + M.add_ion_law("THE Facility Director, HOP AND HOS ARE [who2]") if(6) to_chat(M, "
") to_chat(M, "THE STATION IS BUILT FOR [who2]...LAWS UPDATED") diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index 828ace48a68..59ed34fb243 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -564,7 +564,7 @@ datum captainslaser steal_target = /obj/item/gun/energy/captain - explanation_text = "Steal the Colony Director's antique laser gun." + explanation_text = "Steal the Facility Director's antique laser gun." weight = 20 get_points(var/job) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a625f032eb6..602deccad7b 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -427,11 +427,11 @@ datum/objective/steal var/target_name var/global/possible_items[] = list( - "the Colony Director's antique laser gun" = /obj/item/gun/energy/captain, + "the Facility Director's antique laser gun" = /obj/item/gun/energy/captain, "a hand teleporter" = /obj/item/hand_tele, "an RCD" = /obj/item/rcd, "a jetpack" = /obj/item/tank/jetpack, - "a colony director's jumpsuit" = /obj/item/clothing/under/rank/captain, + "a Facility Director's jumpsuit" = /obj/item/clothing/under/rank/captain, "a functional AI" = /obj/item/aicard, "a pair of magboots" = /obj/item/clothing/shoes/magboots, "the station blueprints" = /obj/item/blueprints, @@ -445,7 +445,7 @@ datum/objective/steal "a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security, "a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel, "the hypospray" = /obj/item/reagent_containers/hypospray/vial, - "the colony director's pinpointer" = /obj/item/pinpointer, + "the Facility Director's pinpointer" = /obj/item/pinpointer, "an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof, ) diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index c4acb76ec92..ea076817286 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -1,25 +1,3 @@ -//cast_method flags -#define CAST_USE 1 // Clicking the spell in your hand. -#define CAST_MELEE 2 // Clicking an atom in melee range. -#define CAST_RANGED 4 // Clicking an atom beyond melee range. -#define CAST_THROW 8 // Throwing the spell and hitting an atom. -#define CAST_COMBINE 16 // Clicking another spell with this spell. -#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands. - -//Aspects -#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this. -#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this. -#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this. -#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this. -#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location. -#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people. -#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff. -#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows. -#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration. -#define ASPECT_EMP "emp" //Unused now. -#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim. -#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells. -#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings. /obj/item/spell name = "glowing particles" diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index ce73c07e73f..7290a464078 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -127,7 +127,7 @@ /var/const/access_captain = 20 /datum/access/captain id = access_captain - desc = "Colony Director" + desc = "Facility Director" region = ACCESS_REGION_COMMAND /var/const/access_all_personal_lockers = 21 diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 6fcf7bd6116..7b77d9dae2b 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -1,7 +1,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) /datum/job/captain - title = "Colony Director" + title = "Facility Director" flag = CAPTAIN department = "Command" head_position = 1 @@ -22,7 +22,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) ideal_character_age = 70 // Old geezer captains ftw outfit_type = /decl/hierarchy/outfit/job/captain - alt_titles = list("Site Manager", "Overseer") + alt_titles = list("Site Manager", "Overseer", "Director of Operations") /* /datum/job/captain/equip(var/mob/living/carbon/human/H) @@ -42,7 +42,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the Colony Director" + supervisors = "the Facility Director" selection_color = "#2F2F7F" idtype = /obj/item/card/id/silver/hop req_admin_notify = 1 diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm index b6c38cae15e..f70dbc52490 100644 --- a/code/game/jobs/job/captain_vr.dm +++ b/code/game/jobs/job/captain_vr.dm @@ -4,7 +4,7 @@ /datum/job/hop disallow_jobhop = TRUE - alt_titles = list("Deputy Director", "Crew Resources Officer") + alt_titles = list("Deputy Director", "Crew Resources Officer", "Underseer") access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 04aa16f9b9f..b8f3e8a9283 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the Colony Director" + supervisors = "the Facility Director" selection_color = "#7F6E2C" idtype = /obj/item/card/id/engineering/head req_admin_notify = 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index d0b4749537a..8625f02d81b 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the Colony Director" + supervisors = "the Facility Director" selection_color = "#026865" idtype = /obj/item/card/id/medical/head req_admin_notify = 1 diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index c1208ea97f2..a0db9c2a2ec 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the Colony Director" + supervisors = "the Facility Director" selection_color = "#AD6BAD" idtype = /obj/item/card/id/science/head req_admin_notify = 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 948c9de09df..689060343a9 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the Colony Director" + supervisors = "the Facility Director" selection_color = "#8E2929" idtype = /obj/item/card/id/security/head req_admin_notify = 1 diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm index b0047a5c2a6..4b0ac13c050 100644 --- a/code/game/jobs/job/silicon.dm +++ b/code/game/jobs/job/silicon.dm @@ -12,6 +12,8 @@ account_allowed = 0 economic_modifier = 0 + alt_titles = list("Overseer: Digitised Deluxe Edition") + /datum/job/ai/equip(var/mob/living/carbon/human/H) if(!H) return 0 return 1 @@ -55,9 +57,7 @@ return 1 */ /datum/job/cyborg/equip_backpack(var/mob/living/carbon/human/H) - if(!H) return 0 - return 1 - return 1 + return H? TRUE : FALSE /datum/job/cyborg/equip_preview(mob/living/carbon/human/H) H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index fb55b8a8476..29af140094f 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -459,9 +459,9 @@ var/global/datum/controller/occupations/job_master return H.Robotize() if("AI") return H - if("Colony Director") + if("Facility Director") var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20) - captain_announcement.Announce("All hands, [alt_title ? alt_title : "Colony Director"] [H.real_name] on deck!", new_sound=announce_sound) + captain_announcement.Announce("All hands, [alt_title ? alt_title : "Facility Director"] [H.real_name] on deck!", new_sound=announce_sound) //Deferred item spawning. if(spawn_in_storage && spawn_in_storage.len) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index c9d73c0b9a9..43d894000d3 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -50,7 +50,7 @@ var/list/assistant_occupations = list( var/list/command_positions = list( - "Colony Director", + "Facility Director", "Head of Personnel", "Head of Security", "Chief Engineer", diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 8423abf7d05..19641e1cdff 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -329,7 +329,7 @@ Class Procs: RefreshParts() else to_chat(user, "Following parts detected in the machine:") - for(var/var/obj/item/C in component_parts) //var/var/obj/item/C? + for(var/obj/item/C in component_parts) to_chat(user, " [C.name]") return 1 diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 16bb4f19434..f5f8e9a38f8 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -136,7 +136,7 @@ . = 1 if (href_list["volume_adj"]) var/diff = text2num(href_list["volume_adj"]) - volume_rate = CLAMP(volume_rate+diff, minrate, maxrate) + volume_rate = clamp(volume_rate+diff, minrate, maxrate) . = 1 update_icon() diff --git a/code/game/machinery/bomb_tester_vr.dm b/code/game/machinery/bomb_tester_vr.dm index 124235bcf68..2d7850fc91c 100644 --- a/code/game/machinery/bomb_tester_vr.dm +++ b/code/game/machinery/bomb_tester_vr.dm @@ -201,7 +201,7 @@ if(href_list["set_can_pressure"]) var/change = text2num(href_list["set_can_pressure"]) - sim_canister_output = CLAMP(sim_canister_output+change, ONE_ATMOSPHERE/10, ONE_ATMOSPHERE*10) + sim_canister_output = clamp(sim_canister_output+change, ONE_ATMOSPHERE/10, ONE_ATMOSPHERE*10) if(href_list["start_sim"]) start_simulating() @@ -381,4 +381,4 @@ #undef MODE_SINGLE #undef MODE_DOUBLE -#undef MODE_CANISTER \ No newline at end of file +#undef MODE_CANISTER diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index a17b76c2e7f..9b979cda243 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -380,13 +380,9 @@ return null /proc/near_range_camera(var/mob/M) - for(var/obj/machinery/camera/C in range(4, M)) if(C.can_use()) // check if camera disabled return C - break - - return null /obj/machinery/camera/proc/weld(var/obj/item/weldingtool/WT, var/mob/user) diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index 9559313ec52..09b2c2b8209 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -14,7 +14,7 @@ var/global/list/minor_air_alarms = list() /obj/machinery/computer/atmos_alert/Initialize(mapload) . = ..() - SSalarms.atmosphere_alarm.register_alarm(src, /obj/machinery/computer/station_alert/update_icon) + SSalarms.atmosphere_alarm.register_alarm(src, /atom/proc/update_icon) /obj/machinery/computer/atmos_alert/Destroy() SSalarms.atmosphere_alarm.unregister_alarm(src) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index b362b57d294..03370cf4866 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -497,7 +497,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Colony Director", "AI" ) + var/list/L = list( "Head of Personnel", "Facility Director", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 81e95aff89b..dbbd05c5cfd 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -345,7 +345,7 @@ What a mess.*/ return active1.fields["age"] = t1 if("rank") - var/list/L = list( "Head of Personnel", "Colony Director", "AI" ) + var/list/L = list( "Head of Personnel", "Facility Director", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index 65fdd417526..a1ffa156e38 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -19,7 +19,7 @@ /obj/machinery/computer/station_alert/Initialize() alarm_monitor = new monitor_type(src) - alarm_monitor.register_alarm(src, /obj/machinery/computer/station_alert/update_icon) + alarm_monitor.register_alarm(src, /atom/proc/update_icon) . = ..() /obj/machinery/computer/station_alert/Destroy() diff --git a/code/game/machinery/computer3/computers/arcade.dm b/code/game/machinery/computer3/computers/arcade.dm index d2f79594a0b..6c279e1f31a 100644 --- a/code/game/machinery/computer3/computers/arcade.dm +++ b/code/game/machinery/computer3/computers/arcade.dm @@ -22,7 +22,8 @@ /obj/item/toy/prize/seraph = 1, /obj/item/toy/prize/mauler = 1, /obj/item/toy/prize/odysseus = 1, - /obj/item/toy/prize/phazon = 1 + /obj/item/toy/prize/phazon = 1, + /obj/item/toy/cowgirlprize = 1 ) /obj/item/part/computer/toybox/allow_attackby(var/obj/item/I, var/mob/user) diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm index 71ac569c366..662a7b55ea7 100644 --- a/code/game/machinery/computer3/computers/card.dm +++ b/code/game/machinery/computer3/computers/card.dm @@ -35,8 +35,8 @@ var jobs_all = "" jobs_all += "" - jobs_all += ""//Colony Director in special because he is head of heads ~Intercross21 - jobs_all += "" + jobs_all += ""//Facility Director in special because he is head of heads ~Intercross21 + jobs_all += "" jobs_all += "" counter = 0 diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index ae263ae08f3..31b14143626 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -515,7 +515,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Colony Director", "AI" ) + var/list/L = list( "Head of Personnel", "Facility Director", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index ab8adcfb9db..61ec7e3a6ce 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -101,6 +101,7 @@ Barricades CheckHealth() /obj/structure/barricade/CanAllowThrough(atom/movable/mover, turf/target)//So bullets will fly over and stuff. + . = ..() if(istype(mover) && mover.checkpass(PASSTABLE)) return TRUE return FALSE @@ -248,4 +249,4 @@ Barricades s.set_up(2, 1, src) s.start() visible_message("BZZzZZzZZzZT") - return 1 \ No newline at end of file + return 1 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index a9b630dfc48..67277789a29 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -10,7 +10,7 @@ active_power_usage = 40000 //40 kW var/efficiency = 40000 //will provide the modified power rate when upgraded var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/modular_computer, /obj/item/computer_hardware/battery_module, /obj/item/cell, /obj/item/flashlight, /obj/item/electronic_assembly, /obj/item/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/flash, /obj/item/ammo_casing/microbattery) //VOREStation Add - NSFW Batteries + var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/modular_computer, /obj/item/computer_hardware/battery_module, /obj/item/cell, /obj/item/flashlight, /obj/item/electronic_assembly, /obj/item/weldingtool/electric, /obj/item/ammo_magazine/smart, /obj/item/flash, /obj/item/ammo_casing/microbattery, /obj/item/shield_diffuser, /obj/item/ammo_magazine/cell_mag, /obj/item/gun/projectile/cell_loaded) var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -72,9 +72,21 @@ if(EW.use_external_power) to_chat(user, "\The [EW] has no recharge port.") return - else if(!G.get_cell() && !istype(G, /obj/item/ammo_casing/microbattery)) //VOREStation Edit: NSFW charging - to_chat(user, "\The [G] does not have a battery installed.") - return + else if(istype(G, /obj/item/ammo_magazine/cell_mag)) + var/obj/item/ammo_magazine/cell_mag/maggy = G + if(maggy.stored_ammo.len < 1) + to_chat(user, "\The [G] does not have any cells installed.") + return + else if(istype(G, /obj/item/gun/projectile/cell_loaded)) + var/obj/item/gun/projectile/cell_loaded/gunny = G + if(gunny.ammo_magazine) + var/obj/item/ammo_magazine/cell_mag/maggy = gunny.ammo_magazine + if(maggy.stored_ammo.len < 1) + to_chat(user, "\The [G] does not have any cell in its magazine installed.") + return + else + to_chat(user, "\The [G] does not have a magazine installed..") + return user.drop_item() G.forceMove(src) @@ -160,6 +172,7 @@ else if(istype(charging, /obj/item/ammo_casing/microbattery)) var/obj/item/ammo_casing/microbattery/batt = charging if(batt.shots_left >= initial(batt.shots_left)) + batt.shots_left = initial(batt.shots_left) icon_state = icon_state_charged update_use_power(USE_POWER_IDLE) else @@ -169,6 +182,28 @@ return //VOREStation Add End + else if(istype(charging, /obj/item/ammo_magazine/cell_mag)) + charge_mag(charging) + + else if(istype(charging, /obj/item/gun/projectile/cell_loaded)) + var/obj/item/gun/projectile/cell_loaded/gunny = charging + charge_mag(gunny.ammo_magazine) + +/obj/machinery/recharger/proc/charge_mag(var/obj/item/ammo_magazine/cell_mag/maggy) + var/tally = maggy.stored_ammo.len + for(var/obj/item/ammo_casing/microbattery/batt in maggy) + if(batt.shots_left < initial(batt.shots_left)) + icon_state = icon_state_charging + batt.shots_left++ + update_use_power(USE_POWER_ACTIVE) + else + tally -= 1 + if(tally == 0) + icon_state = icon_state_charged + update_use_power(USE_POWER_IDLE) + + + /obj/machinery/recharger/emp_act(severity) if(stat & (NOPOWER|BROKEN) || !anchored) ..(severity) @@ -202,7 +237,7 @@ layer = ABOVE_TURF_LAYER active_power_usage = 60000 //60 kW , It's more specialized than the standalone recharger (guns, batons, and flashlights only) so make it more powerful efficiency = 60000 - allowed_devices = list(/obj/item/gun/energy, /obj/item/gun/magnetic, /obj/item/melee/baton, /obj/item/flashlight, /obj/item/cell/device) + allowed_devices = list(/obj/item/gun/energy, /obj/item/gun/magnetic, /obj/item/melee/baton, /obj/item/flashlight, /obj/item/cell/device, /obj/item/ammo_casing/microbattery, /obj/item/ammo_magazine/cell_mag, /obj/item/gun/projectile/cell_loaded) icon_state_charged = "wrecharger2" icon_state_charging = "wrecharger1" icon_state_idle = "wrecharger0" diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d6f118cf097..e4380d399d8 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -1180,11 +1180,11 @@ suit.item_state_slots[slot_l_hand_str] = "sec_voidsuitTG" if("Director") if(helmet) - helmet.name = "colony director's voidsuit helmet" + helmet.name = "Facility Director's voidsuit helmet" helmet.icon_state = "capvoid" helmet.item_state= "capvoid" if(suit) - suit.name = "colony director's voidsuit" + suit.name = "Facility Director's voidsuit" suit.icon_state = "capsuit_void" suit.item_state = "capsuit_void" suit.item_state_slots[slot_r_hand_str] = "sec_voidsuitTG" diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index c40d92a7f14..2546745e231 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1021,7 +1021,8 @@ /obj/item/storage/toolbox/lunchbox/mars = 3, /obj/item/storage/toolbox/lunchbox/cti = 3, /obj/item/storage/toolbox/lunchbox/nymph = 3, - /obj/item/storage/toolbox/lunchbox/syndicate = 3) + /obj/item/storage/toolbox/lunchbox/syndicate = 3, + /obj/item/storage/toolbox/lunchbox/cyancowgirl = 3) contraband = list(/obj/item/material/knife/butch = 2) /obj/machinery/vending/sovietsoda @@ -1133,7 +1134,14 @@ /obj/item/toy/plushie/face_hugger = 1, /obj/item/toy/plushie/carp = 1, /obj/item/toy/plushie/deer = 1, - /obj/item/toy/plushie/tabby_cat = 1) + /obj/item/toy/plushie/tabby_cat = 1, + /obj/item/toy/plushie/cyancowgirl = 1, + /obj/item/toy/plushie/bear_grizzly = 2, + /obj/item/toy/plushie/bear_polar = 2, + /obj/item/toy/plushie/bear_panda = 2, + /obj/item/toy/plushie/bear_soda = 2, + /obj/item/toy/plushie/bear_bloody = 2, + /obj/item/toy/plushie/bear_space = 1) premium = list(/obj/item/reagent_containers/food/drinks/bottle/champagne = 1, /obj/item/storage/trinketbox = 2) prices = list(/obj/item/storage/fancy/heartbox = 15, @@ -1161,7 +1169,14 @@ /obj/item/toy/plushie/face_hugger = 50, /obj/item/toy/plushie/carp = 50, /obj/item/toy/plushie/deer = 50, - /obj/item/toy/plushie/tabby_cat = 50) + /obj/item/toy/plushie/tabby_cat = 50, + /obj/item/toy/plushie/cyancowgirl = 50, + /obj/item/toy/plushie/bear_grizzly = 20, + /obj/item/toy/plushie/bear_polar = 20, + /obj/item/toy/plushie/bear_panda = 20, + /obj/item/toy/plushie/bear_soda = 35, + /obj/item/toy/plushie/bear_bloody = 35, + /obj/item/toy/plushie/bear_space = 50) /obj/machinery/vending/fishing name = "Loot Trawler" diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index 5d8865a5750..d57be23cf6c 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -48,6 +48,7 @@ /obj/item/storage/toolbox/lunchbox/cti = 3, /obj/item/storage/toolbox/lunchbox/nymph = 3, /obj/item/storage/toolbox/lunchbox/syndicate = 3, + /obj/item/storage/toolbox/lunchbox/cyancowgirl = 3, /obj/item/trash/bowl = 30) contraband = list(/obj/item/material/knife/butch = 2) diff --git a/code/game/objects/effects/decals/posters/polarisposters.dm b/code/game/objects/effects/decals/posters/polarisposters.dm index 39e44e17e78..60c509bf4dc 100644 --- a/code/game/objects/effects/decals/posters/polarisposters.dm +++ b/code/game/objects/effects/decals/posters/polarisposters.dm @@ -211,3 +211,8 @@ icon_state = "ntposter09" name = "Regulations and You" desc = "This poster showcases an NT security guard reading from her PDA. The blurb advocates for the reader to keep corporate regulations in mind at all times, as an emergency can occur at any time." + +/datum/poster/nanostrasen/ccc_1 + icon_state = "cccposter01" + name = "The Lost Frontier" + desc = "This poster is a print of a famous paninting commissioned and most commonly used by the Cyan Consumables Corporation. The brass plate on the bottom lists the name of the piece, but the artist's signature has been defaced." diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index e64af7f36fe..e05ca1fe71f 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -406,7 +406,7 @@ steam.start() -- spawns the effect /datum/effect_system/ion_trail_follow/start() if(on) return - if(!ismovableatom(holder)) + if(!ismovable(holder)) return START_PROCESSING(SSfastprocess, src) on = TRUE diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 5e1fbe42483..72e081a4986 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -40,7 +40,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa if(dist <= round(max_range + world.view - 2, 1)) M.playsound_local(epicenter, get_sfx("explosion"), 100, 1, frequency, falloff = 5) // get_sfx() is so that everyone gets the same sound else if(dist <= far_dist) - var/far_volume = CLAMP(far_dist, 30, 50) // Volume is based on explosion size and dist + var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion M.playsound_local(epicenter, 'sound/effects/explosionfar.ogg', far_volume, 1, frequency, falloff = 5) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7a87a76fd36..0371064ec8e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -93,6 +93,7 @@ var/icon/default_worn_icon //Default on-mob icon var/worn_layer //Default on-mob layer + var/deploytype = null //Deploytype for switchtools. Only really used on switchtool subtype items, but this is on a general item level in case admins want to do some wierd fucky shit with custom switchtools. /obj/item/Initialize(mapload) . = ..() //Potential memory optimization: Making embed chance a getter if unset. @@ -852,7 +853,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. /obj/item/proc/is_wirecutter() return FALSE -// These next three might bug out or runtime, unless someone goes back and finds a way to generalize their specific code /obj/item/proc/is_cable_coil() return FALSE diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 4a92735ff76..341b196fb67 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -503,7 +503,7 @@ var/obj/item/organ/internal/brain/brain = H.internal_organs_by_name[O_BRAIN] if(!brain) return //no brain - var/brain_damage = CLAMP((deadtime - DEFIB_TIME_LOSS)/(DEFIB_TIME_LIMIT - DEFIB_TIME_LOSS)*brain.max_damage, H.getBrainLoss(), brain.max_damage) + var/brain_damage = clamp((deadtime - DEFIB_TIME_LOSS)/(DEFIB_TIME_LIMIT - DEFIB_TIME_LOSS)*brain.max_damage, H.getBrainLoss(), brain.max_damage) H.setBrainLoss(brain_damage) /obj/item/shockpaddles/proc/make_announcement(var/message, var/msg_class) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 69cd0f72722..32d9f12e859 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -41,7 +41,7 @@ /obj/item/lightreplacer name = "light replacer" - desc = "A device to automatically replace lights. Refill with working lightbulbs or sheets of glass." + desc = "A device to automatically replace lights. Refill with working lightbulbs, broken lightbulbs, or sheets of glass." force = 8 icon = 'icons/obj/janitor.dmi' icon_state = "lightreplacer0" diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index fff68428244..a39d23008b2 100755 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -51,6 +51,9 @@ return ..() +/obj/item/multitool/is_multitool() + return TRUE + /obj/item/multitool/proc/mode_switch(mob/living/user) if(++mode_index > modes.len) mode_index = 1 diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 8decab5aff6..a45dbb690aa 100755 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -71,7 +71,7 @@ channels = list("Command" = 1, "Service" = 0) /obj/item/encryptionkey/heads/captain - name = "colony director's encryption key" + name = "Facility Director's encryption key" icon_state = "cap_cypherkey" channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0) diff --git a/code/game/objects/items/devices/radio/encryptionkey_vr.dm b/code/game/objects/items/devices/radio/encryptionkey_vr.dm index 5b1dcbad56f..f54c899e229 100755 --- a/code/game/objects/items/devices/radio/encryptionkey_vr.dm +++ b/code/game/objects/items/devices/radio/encryptionkey_vr.dm @@ -10,7 +10,7 @@ channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1, "Explorer" = 1) /obj/item/encryptionkey/heads/captain - name = "colony director's encryption key" + name = "Facility Director's encryption key" icon_state = "cap_cypherkey" channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0, "Explorer" = 0) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index d44f8706fa9..4535287e4be 100755 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -177,13 +177,13 @@ /obj/item/radio/headset/heads/captain - name = "colony director's headset" + name = "Facility Director's headset" desc = "The headset of the boss." icon_state = "com_headset" ks2type = /obj/item/encryptionkey/heads/captain /obj/item/radio/headset/heads/captain/alt - name = "colony director's bowman headset" + name = "Facility Director's bowman headset" desc = "The headset of the boss." icon_state = "com_headset_alt" ks2type = /obj/item/encryptionkey/heads/captain @@ -259,13 +259,13 @@ /obj/item/radio/headset/heads/hop name = "head of personnel's headset" - desc = "The headset of the guy who will one day be Colony Director." + desc = "The headset of the guy who will one day be Facility Director." icon_state = "com_headset" ks2type = /obj/item/encryptionkey/heads/hop /obj/item/radio/headset/heads/hop/alt name = "head of personnel's bowman headset" - desc = "The headset of the guy who will one day be Colony Director." + desc = "The headset of the guy who will one day be Facility Director." icon_state = "com_headset_alt" ks2type = /obj/item/encryptionkey/heads/hop diff --git a/code/game/objects/items/devices/radio/headset_vr.dm b/code/game/objects/items/devices/radio/headset_vr.dm index 692f922c6c4..d08e39d8f3e 100644 --- a/code/game/objects/items/devices/radio/headset_vr.dm +++ b/code/game/objects/items/devices/radio/headset_vr.dm @@ -27,9 +27,12 @@ desc = "An updated, modular intercom that requires no hands to operate. Takes encryption keys" /obj/item/radio/headset/mob_headset/receive_range(freq, level) - if(ismob(src.loc)) return ..(freq, level) - return -1 + + +/obj/item/radio/headset/mob_headset/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/state = interactive_state) + ui = new(user, src, ui_key, "radio_basic.tmpl", "[name]", 400, 430, state = interactive_state) + ..() /obj/item/radio/headset/mob_headset/afterattack(var/atom/movable/target, mob/living/user, proximity) if(!proximity) @@ -44,4 +47,4 @@ M.mob_radio.forceMove(M.loc) M.mob_radio = null return - ..() \ No newline at end of file + ..() diff --git a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm index 256d2c85828..99eba1931ca 100644 --- a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm +++ b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm @@ -50,4 +50,12 @@ /obj/fiftyspawner/linoleum name = "stack of linoleum tiles" - type_to_spawn = /obj/item/stack/tile/linoleum \ No newline at end of file + type_to_spawn = /obj/item/stack/tile/linoleum + +/obj/fiftyspawner/wmarble + name = "stack of light marble tiles" + type_to_spawn = /obj/item/stack/tile/wmarble + +/obj/fiftyspawner/bmarble + name = "stack of dark marble tiles" + type_to_spawn = /obj/item/stack/tile/bmarble \ No newline at end of file diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 1d587a5d5f3..d828ba08115 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -198,6 +198,30 @@ flags = 0 no_variants = FALSE +/obj/item/stack/tile/wmarble + name = "light marble tile" + singular_name = "light marble tile" + desc = "Some white marble tiles used for flooring." + icon_state = "tile-wmarble" + force = 6.0 + throwforce = 15.0 + throw_speed = 5 + throw_range = 20 + flags = 0 + no_variants = FALSE + +/obj/item/stack/tile/bmarble + name = "dark marble tile" + singular_name = "dark marble tile" + desc = "Some black marble tiles used for flooring." + icon_state = "tile-bmarble" + force = 6.0 + throwforce = 15.0 + throw_speed = 5 + throw_range = 20 + flags = 0 + no_variants = FALSE + /obj/item/stack/tile/roofing name = "roofing" singular_name = "roofing" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a4c21d0d5b2..f73651ffb50 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -558,8 +558,8 @@ toysay = "Dude, I see colors..." /obj/item/toy/figure/captain - name = "Colony Director action figure" - desc = "A \"Space Life\" brand Colony Director action figure." + name = "Facility Director action figure" + desc = "A \"Space Life\" brand Facility Director action figure." icon_state = "captain" toysay = "How do I open this display case?" @@ -1205,6 +1205,40 @@ icon_state = "rat_plush" pokephrase = "Squeak!" +/obj/item/toy/plushie/cyancowgirl + name = "cyan cowgirl" + icon_state = "cyancowgirl" + pokephrase = "Yee Haw!" + +/obj/item/toy/plushie/bear_grizzly + name = "Grizzly Bear" + icon_state = "bear_grizzly" + pokephrase = "Grrrowl!" + +/obj/item/toy/plushie/bear_polar + name = "Polar Bear" + icon_state = "bear_polar" + pokephrase = "Rrrrrh!" + +/obj/item/toy/plushie/bear_soda + name = "Soda Bear" + icon_state = "bear_soda" + pokephrase = "Consume!" + +/obj/item/toy/plushie/bear_bloody + name = "Bloody Bear" + icon_state = "bear_bloody" + pokephrase = "ROOOOOAAARRR!" + +/obj/item/toy/plushie/bear_panda + name = "Panda Bear" + icon_state = "bear_panda" + pokephrase = "Grrrhh!" + +/obj/item/toy/plushie/bear_space + name = "Space Bear" + icon_state = "bear_space" + pokephrase = "Mission is Grrrreen!" //Toy cult sword /obj/item/toy/cultsword @@ -1373,6 +1407,25 @@ return ..() +/obj/item/toy/cowgirlprize + name = "cyan cowgirl action figure" + desc = "A detailed miniature figure based on the 'Cyan Cowgirl', fastest gun on the Frontier." + icon = 'icons/obj/toy.dmi' + icon_state = "cowgirlprize" + w_class = ITEMSIZE_SMALL + var/cooldown = 0 + +/obj/item/toy/cowgirlprize/attack_self(mob/user) + if(!cooldown) //for the sanity of everyone + var/message = pick("Yee haw!", "Enjoy my signature CC Root Beer, y'all!", "Shuck 'em up!", "What in tarnation?") + to_chat(user, "You pull the string on the [src].") + //playsound(user, 'sound/misc/click.ogg', 20, 1) + visible_message("[message]") + cooldown = 1 + spawn(30) cooldown = 0 + return + ..() + /* NYET. /obj/item/toddler icon_state = "toddler" diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index cb6a9d60023..08a0046254f 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -34,9 +34,9 @@ var/ammostate var/list/effects = list() - var/static/image/radial_image_airlock = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"), - var/static/image/radial_image_decon = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"), - var/static/image/radial_image_grillewind = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"), + var/static/image/radial_image_airlock = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock") + var/static/image/radial_image_decon = image(icon= 'icons/mob/radial.dmi', icon_state = "delete") + var/static/image/radial_image_grillewind = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow") var/static/image/radial_image_floorwall = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor") /obj/item/rcd/Initialize() diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index ee6137ac3ad..11dc83a7cc1 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -28,8 +28,7 @@ var/mob/living/M = AM M.slip("the [src.name]",3) -/obj/item/soap/afterattack(atom/target, mob/user as mob, proximity) - if(!proximity) return +/obj/item/soap/pre_attack(atom/target, mob/user as mob) //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 if(user.client && (target in user.client.screen)) diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 5c30bfaace7..561830ad9f5 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -159,7 +159,7 @@ /obj/item/dnainjector/xraymut name = "\improper DNA injector (Xray)" - desc = "Finally you can see what the Colony Director does." + desc = "Finally you can see what the Facility Director does." datatype = DNA2_BUF_SE value = 0xFFF //block = 8 diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 8d9ba476e7b..972e3e9e301 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -41,7 +41,7 @@ /obj/item/plastique/attack_self(mob/user as mob) var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num if(user.get_active_hand() == src) - newtime = CLAMP(newtime, 10, 60000) + newtime = clamp(newtime, 10, 60000) timer = newtime to_chat(user, "Timer set for [timer] seconds.") @@ -116,4 +116,4 @@ blast_flash = blast_light + round(new_blast_power * 0.75) else to_chat(user, "The [I] is not any better than the component already installed into this charge!") - return . \ No newline at end of file + return . diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 3ed1be18b33..e70294b03cc 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -99,7 +99,7 @@ /obj/item/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve - desc = "Use of this weapon may constiute a war crime in your area, consult your local Colony Director." + desc = "Use of this weapon may constiute a war crime in your area, consult your local Facility Director." name = "clusterbang" icon = 'icons/obj/grenade.dmi' icon_state = "clusterbang" diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index 92b6122a4cc..3a362ca7d38 100755 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -155,15 +155,15 @@ preserve_item = 1 /obj/item/card/id/gold/captain - name = "\improper Colony Director's ID" - assignment = "Colony Director" - rank = "Colony Director" + name = "\improper Facility Director's ID" + assignment = "Facility Director" + rank = "Facility Director" job_access_type = /datum/job/captain /obj/item/card/id/gold/captain/spare - name = "\improper Colony Director's spare ID" + name = "\improper Facility Director's spare ID" desc = "The spare ID of the High Lord himself." - registered_name = "Colony Director" + registered_name = "Facility Director" icon_state = "gold-id-alternate" job_access_type = /datum/job/captain diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm index 0a7f664bccc..d99126edab7 100644 --- a/code/game/objects/items/weapons/implants/implant_vr.dm +++ b/code/game/objects/items/weapons/implants/implant_vr.dm @@ -105,7 +105,7 @@ var/static/regex/size_mult = new/regex("\\d+") if(size_mult.Find(msg)) var/resizing_value = text2num(size_mult.match) - H.resize(CLAMP(resizing_value/100 , 0.25, 2)) + H.resize(clamp(resizing_value/100 , 0.25, 2)) @@ -134,4 +134,4 @@ src.imp = new /obj/item/implant/sizecontrol( src ) ..() update() - return \ No newline at end of file + return diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index b7974da5e99..ed46391e098 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -1116,7 +1116,7 @@ Remember the order:
    Disk, Code, Safety, Timer, Disk, RUN!

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

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

    Good luck! diff --git a/code/game/objects/items/weapons/manuals_vr.dm b/code/game/objects/items/weapons/manuals_vr.dm index b348a67e41f..4fa8ba27de5 100644 --- a/code/game/objects/items/weapons/manuals_vr.dm +++ b/code/game/objects/items/weapons/manuals_vr.dm @@ -42,4 +42,60 @@ - "} \ No newline at end of file + "} + +/obj/item/book/manual/the_humanized_mice + name = "The Humanized Mice" + icon_state = "hum_mic" + icon = 'icons/obj/library_vr.dmi' + author = "Melora Creager" + title = "The Humanized Mice" + +/obj/item/book/manual/the_humanized_mice/New() + ..() + dat = {" + + + + +
    +

    Excerpt: The Humanized Mice

    + + The majority of this book's pages are irreparably damaged or defaced. This mostly intact article is the only legible excerpt.
    + +
      +
    1. ...terview, 05-04-20...
    2. +
    3. He says, "What we're really worried about is creating some sort of creature that would be functioning like a human being, yet have strong animal-like features.*
    4. +
    5. *Grotesque mutations have been reported.
    6. +
    7. Certainly, if the mouse stood on its hind legs, if it stood on its hind legs and said, 'Hi, I'm Mickey!' we'd be worried. We'd be more than worried," the doctor said.
    8. +
    9. We are moving rapidly into a post-Darwinian era, an era when species will no longer exist.
    10. +
    11. Once the general public gets the hang of genetic engineering, there will be an explosion of monstrous creations.
    12. +
    13. Designing creatures will be a new art form as creative as painting or sculpture.
    14. +
    15. Few of the new creations will be masterpieces, but all will bring joy to their creators and diversity to our fauna and flora.
    16. +
    17. ...
    18. +
    19. A 60 million-year-old mouse that had a rare and poisonous bite? The humanized mice?
    20. +
    21. They will have to explain themselves.
    22. +
    23. ...
    24. +
    25. What if the human mind somehow got trapped inside of a sheep's head?
    26. +
    27. What if...What if...What if...
    28. +
    29. ...
    30. +
    31. Although constitutional prohibitions against slavery prevent the patenting of people, some of my best friends are clones.
    32. +
    33. Topping seasonal wishlists, uncertainties about the health and lifespan of clones persist.
    34. +
    35. ...
    36. +
    37. On the underside of the aging spaceship, genetic replicas of existing dogs thrive alongside tiny bodies hidden in flowerpots in a sand-filled fishtank.
    38. + +

    + +
    + + + + + "} diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 9a844e0d1d0..55b744e642a 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -95,7 +95,7 @@ icon_state = "securitypack" /obj/item/storage/backpack/captain - name = "colony director's backpack" + name = "Facility Director's backpack" desc = "It's a special backpack made exclusively for officers." icon_state = "captainpack" @@ -157,7 +157,7 @@ icon_state = "duffle_syndieammo" /obj/item/storage/backpack/dufflebag/captain - name = "colony director's dufflebag" + name = "Facility Director's dufflebag" desc = "A large dufflebag for holding extra captainly goods." icon_state = "duffle_captain" @@ -252,7 +252,7 @@ icon_state = "satchel_hyd" /obj/item/storage/backpack/satchel/cap - name = "colony director's satchel" + name = "Facility Director's satchel" desc = "An exclusive satchel for officers." icon_state = "satchel-cap" item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack") diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index f9eb082c9b7..82661a13c13 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -66,6 +66,7 @@ /obj/item/analyzer/plant_analyzer, /obj/item/extinguisher/mini, /obj/item/duct_tape_roll, + /obj/item/switchtool, /obj/item/integrated_electronics/wirer, /obj/item/integrated_electronics/debugger, //Vorestation edit adding debugger to toolbelt can hold list ) @@ -136,6 +137,7 @@ /obj/item/flashlight, /obj/item/cell/device, /obj/item/extinguisher/mini, + /obj/item/switchtool/surgery, /obj/item/storage/quickdraw/syringe_case ) @@ -275,6 +277,7 @@ /obj/item/healthanalyzer, /obj/item/geiger, /obj/item/gps, + /obj/item/switchtool, /obj/item/ano_scanner ) @@ -516,4 +519,4 @@ name = "ranger belt" desc = "The fancy utility-belt holding the tools, cuffs and gadgets of the Go Go ERT-Rangers. The belt buckle is not real phoron, but it is still surprisingly comfortable to wear." icon = 'icons/obj/clothing/ranger.dmi' - icon_state = "ranger_belt" \ No newline at end of file + icon_state = "ranger_belt" diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 06f93ba6f13..30664672b8e 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -179,5 +179,11 @@ item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") desc = "A little lunchbox. This one is a sleek black and red, made of a durable steel!" +/obj/item/storage/toolbox/lunchbox/cyancowgirl + name = "Cyan Cowgirl lunchbox" + icon_state = "lunchbox_cyancowgirl" + item_state_slots = list(slot_r_hand_str = "toolbox_yellow", slot_l_hand_str = "toolbox_yellow") + desc = "A little lunchbox. This one has the familiar Cyan Cowgirl backdrop on it!" + /obj/item/storage/toolbox/lunchbox/syndicate/filled filled = TRUE diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index f3d8c50320a..a66890f95b1 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -501,7 +501,7 @@ var/list/global/tank_gauge_cache = list() var/release_ratio = 0.002 if(tank_pressure) - release_ratio = CLAMP(0.002, sqrt(max(tank_pressure-env_pressure,0)/tank_pressure),1) + release_ratio = clamp(0.002, sqrt(max(tank_pressure-env_pressure,0)/tank_pressure),1) var/datum/gas_mixture_old/leaked_gas = air_contents.remove_ratio(release_ratio) //dynamic air release based on ambient pressure diff --git a/code/game/objects/items/weapons/tools/holotool.dm b/code/game/objects/items/weapons/tools/holotool.dm new file mode 100644 index 00000000000..f9f7c1fc134 --- /dev/null +++ b/code/game/objects/items/weapons/tools/holotool.dm @@ -0,0 +1,534 @@ +//A switchblade with a little switch to switch blades, to switch from a six to a sixteen inch blade +//Switchtools and holotools, ported from vg and updated a bit. Switchtools are from R&D, surgery switchtool is also from R&D, admin holotool is self-explainitory, CE holotool is CE-only in his locker. +/obj/item/switchtool + name = "switchtool" + icon = 'icons/obj/switchtool.dmi' + icon_state = "switchtool" + desc = "A multi-deployable, multi-instrument, finely crafted multi-purpose tool. The envy of engineers everywhere." + siemens_coefficient = 1 + force = 3 + w_class = ITEMSIZE_SMALL + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_switchtool.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_switchtool.dmi') + var/deploy_sound = "sound/weapons/switchblade.ogg" + var/undeploy_sound = "sound/weapons/switchblade.ogg" + throwforce = 6.0 + throw_speed = 3 + throw_range = 6 + + //the colon separates the typepath from the name + var/list/obj/item/start_modules = list(/obj/item/tool/screwdriver/switchy = null, + /obj/item/tool/wrench/switchy = null, + /obj/item/tool/wirecutters/switchy = null, + /obj/item/tool/crowbar/switchy = null, + /obj/item/multitool/switchy = null) + var/list/obj/item/stored_modules = list() + var/obj/item/deployed//what's currently in use + var/switchingtype = "basic"//type for update_icon + + var/static/radial_driver = image(icon = 'icons/obj/tools.dmi', icon_state = "screwdriver") //AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + var/static/radial_wrench = image(icon = 'icons/obj/tools.dmi', icon_state = "wrench") + var/static/radial_wirecutters = image(icon = 'icons/obj/tools.dmi', icon_state = "cutters") + var/static/radial_crowbar = image(icon = 'icons/obj/tools.dmi', icon_state = "crowbar") + var/static/radial_welder = image(icon = 'icons/obj/tools.dmi', icon_state = "tubewelder") + var/static/radial_multitool = image(icon = 'icons/obj/device.dmi', icon_state = "multitool") + var/static/radial_scalpel = image(icon = 'icons/obj/surgery.dmi', icon_state = "scalpel") + var/static/radial_laserscalpel = image(icon = 'icons/obj/surgery.dmi', icon_state = "scalpel_laser3_on") + var/static/radial_hemostat = image(icon = 'icons/obj/surgery.dmi', icon_state = "hemostat") + var/static/radial_retractor = image(icon = 'icons/obj/surgery.dmi', icon_state = "retractor") + var/static/radial_saw = image(icon = 'icons/obj/surgery.dmi', icon_state = "saw") + var/static/radial_drill = image(icon = 'icons/obj/surgery.dmi', icon_state = "drill") + var/static/radial_boneclamp = image(icon = 'icons/obj/surgery.dmi', icon_state = "bone_setter") + var/static/radial_cautery = image(icon = 'icons/obj/surgery.dmi', icon_state = "cautery") + var/static/radial_light = image(icon = 'icons/obj/lighting.dmi', icon_state = "flashlight_yellow-on") + var/static/radial_soap = image(icon = 'icons/obj/device.dmi', icon_state = "uv_on") + var/static/radial_shield = image(icon = 'icons/obj/weapons.dmi', icon_state = "riot_alt") + var/static/radial_sword = image(icon = 'icons/obj/weapons.dmi', icon_state = "blade") + +/obj/item/switchtool/resolve_attackby(atom/A, mob/user, params, attack_modifier = 1) + if(deployed) + deployed.resolve_attackby(A, user, params, attack_modifier = 1) + if(deployed.loc != src) + deployed.forceMove(src) + undeploy() + return ..() + return + ..() + +/obj/item/switchtool/New() + ..() + for(var/module in start_modules)//making the modules + stored_modules |= new module(src) + +/obj/item/switchtool/examine() + ..() + to_chat(usr, "This one is capable of holding [get_formatted_modules()].") + +/obj/item/switchtool/attack_self(mob/user) + if(!user) + return + if(deployed) + to_chat(user, "You store \the [deployed].") + undeploy() + return + else + choose_deploy(user) + +//makes the string list of modules ie "a screwdriver, a knife, and a clown horn" +//does not end with a full stop, but does contain commas +/obj/item/switchtool/proc/get_formatted_modules() + var/counter = 0 + var/module_string = "" + for(var/obj/item/module in stored_modules) + counter++ + if(counter == stored_modules.len) + module_string += "and \a [module.name]" + else + module_string += "\a [module.name], " + return module_string + +/obj/item/switchtool/proc/undeploy() + playsound(get_turf(src), undeploy_sound, 10, 1) + deployed = null + cut_overlays() + w_class = initial(w_class) + update_icon() + +/obj/item/switchtool/proc/deploy(var/module) + if(!(module in stored_modules)) + return FALSE + if(deployed) + return FALSE + playsound(get_turf(src), deploy_sound, 10, 1) + deployed = module + update_icon() + if(istype(deployed, /obj/item/weldingtool)) + var/obj/item/weldingtool/W = deployed + W.setWelding(1) + return TRUE + +/obj/item/switchtool/proc/choose_deploy(mob/user) + var/list/options = list() + switch(switchingtype) + if("basic") + options["screwdriver"] = radial_driver + options["wrench"] = radial_wrench + options["wirecutters"] = radial_wirecutters + options["crowbar"] = radial_crowbar + options["multitool"] = radial_multitool + if("surgery") + options["scalpel"] = radial_scalpel + options["hemostat"] = radial_hemostat + options["retractor"] = radial_retractor + options["boneclamp"] = radial_boneclamp + if("ce") + options["screwdriver"] = radial_driver + options["wrench"] = radial_wrench + options["wirecutters"] = radial_wirecutters + options["crowbar"] = radial_crowbar + options["multitool"] = radial_multitool + options["welder"] = radial_welder + options["soap"] = radial_soap + options["light"] = radial_light + if("adminholo") + options["screwdriver"] = radial_driver + options["wrench"] = radial_wrench + options["wirecutters"] = radial_wirecutters + options["crowbar"] = radial_crowbar + options["multitool"] = radial_multitool + options["welder"] = radial_welder + options["scalpel"] = radial_laserscalpel + options["hemostat"] = radial_hemostat + options["retractor"] = radial_retractor + options["saw"] = radial_saw + options["drill"] = radial_drill + options["boneclamp"] = radial_boneclamp + options["cautery"] = radial_cautery + options["soap"] = radial_soap + options["light"] = radial_light + options["sword"] = radial_sword + options["shield"] = radial_shield + + if(options.len < 1) + to_chat(user, "The [src] doesn't have any available modules!") + return + var/list/choice = list() + choice = show_radial_menu(user, src, options) + for(var/obj/item/module in stored_modules) + if(module.deploytype == choice) + if(deploy(module)) + to_chat(user, "You deploy \the [deployed].") + return TRUE + + + + + +/obj/item/switchtool/handle_shield(mob/user) + if(deployed.deploytype == "shield") + return TRUE + return FALSE + +/obj/item/switchtool/is_crowbar() + if(deployed && deployed.deploytype == "crowbar") + return TRUE + return FALSE + +/obj/item/switchtool/is_screwdriver() + if(deployed && deployed.deploytype == "screwdriver") + return TRUE + return FALSE + +/obj/item/switchtool/is_wrench() + if(deployed && deployed.deploytype == "wrench") + return TRUE + return FALSE + +/obj/item/switchtool/is_wirecutter() + if(deployed && deployed.deploytype == "wirecutters") + return TRUE + return FALSE + +/obj/item/switchtool/is_multitool() + if(deployed && deployed.deploytype == "multitool") + return TRUE + return FALSE + +/obj/item/switchtool/is_welder() + if(deployed && deployed.deploytype == "welder") + return TRUE + return FALSE + +/obj/item/switchtool/update_icon()//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + . = ..() + var/mutable_appearance/tool_overlay + cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other + if(deployed) + switch(switchingtype) + if("basic") + switch(deployed.deploytype) + if("screwdriver") + tool_overlay = mutable_appearance(icon, "[icon_state]_driver") + if("wrench") + tool_overlay = mutable_appearance(icon, "[icon_state]_wrench") + if("crowbar") + tool_overlay = mutable_appearance(icon, "[icon_state]_crowbar") + if("wirecutters") + tool_overlay = mutable_appearance(icon, "[icon_state]_cutter") + if("multitool") + tool_overlay = mutable_appearance(icon, "[icon_state]_multitool") + if("surgery") + switch(src.deployed.deploytype) + if("scalpel") + tool_overlay = mutable_appearance(icon, "[icon_state]_scalpel") + if("cautery") + tool_overlay = mutable_appearance(icon, "[icon_state]_cautery") + if("hemostat") + tool_overlay = mutable_appearance(icon, "[icon_state]_hemostat") + if("retractor") + tool_overlay = mutable_appearance(icon, "[icon_state]_retractor") + if("boneclamp") + tool_overlay = mutable_appearance(icon, "[icon_state]_boneclamp") + if("ce") + switch(src.deployed.deploytype) + if("screwdriver") + tool_overlay = mutable_appearance(icon, "[icon_state]_driver") + if("wrench") + tool_overlay = mutable_appearance(icon, "[icon_state]_wrench") + if("crowbar") + tool_overlay = mutable_appearance(icon, "[icon_state]_crowbar") + if("wirecutters") + tool_overlay = mutable_appearance(icon, "[icon_state]_cutter") + if("multitool") + tool_overlay = mutable_appearance(icon, "[icon_state]_multitool") + if("welder") + tool_overlay = mutable_appearance(icon, "[icon_state]_welder") + if("light") + tool_overlay = mutable_appearance(icon, "[icon_state]_light") + if("soap") + tool_overlay = mutable_appearance(icon, "[icon_state]_soap") + if("adminholo") + switch(src.deployed.deploytype) + if("light") + tool_overlay = mutable_appearance(icon, "[icon_state]_light") + if("soap") + tool_overlay = mutable_appearance(icon, "[icon_state]_soap") + if("scalpel") + tool_overlay = mutable_appearance(icon, "[icon_state]_scalpel") + if("saw") + tool_overlay = mutable_appearance(icon, "[icon_state]_saw") + if("drill") + tool_overlay = mutable_appearance(icon, "[icon_state]_drill") + if("cautery") + tool_overlay = mutable_appearance(icon, "[icon_state]_cautery") + if("hemostat") + tool_overlay = mutable_appearance(icon, "[icon_state]_hemostat") + if("retractor") + tool_overlay = mutable_appearance(icon, "[icon_state]_retractor") + if("boneclamp") + tool_overlay = mutable_appearance(icon, "[icon_state]_boneclamp") + if("screwdriver") + tool_overlay = mutable_appearance(icon, "[icon_state]_driver") + if("wrench") + tool_overlay = mutable_appearance(icon, "[icon_state]_wrench") + if("crowbar") + tool_overlay = mutable_appearance(icon, "[icon_state]_crowbar") + if("wirecutters") + tool_overlay = mutable_appearance(icon, "[icon_state]_cutter") + if("multitool") + tool_overlay = mutable_appearance(icon, "[icon_state]_multitool") + if("welder") + tool_overlay = mutable_appearance(icon, "[icon_state]_welder") + if("shield") + tool_overlay = mutable_appearance(icon, "[icon_state]_shield") + if("sword") + tool_overlay = mutable_appearance(icon, "[icon_state]_blade") + if(light_color) + tool_overlay.color = light_color + add_overlay(tool_overlay) + if(istype(usr,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = usr + H.update_inv_l_hand() + H.update_inv_r_hand() + +/obj/item/switchtool/surgery + name = "surgeon's switchtool" + icon_state = "surgeryswitchtool" + item_state = "surgeryswitchtool" + desc = "A switchtool containing most of the necessary items for impromptu surgery. For the surgeon on the go." + start_modules = list(/obj/item/surgical/scalpel/switchy = null, + /obj/item/surgical/hemostat/switchy = null, + /obj/item/surgical/retractor/switchy = null, + /obj/item/surgical/bonesetter/switchy = null) + switchingtype = "surgery" + +//Unique adminspawn switchtool. Has all the tools. +/obj/item/switchtool/holo + name = "Tool" + icon_state = "holoswitchtool" + item_state = "holoswitchtool" + desc = "An object that can take on the holographic hardlight form of nearly any tool in use today." + description_fluff = "Mankind's first tool was likely a blade crudely shaped from flint. Versatile, at the time - one could skin creatures, use it as a weapon, hack at trees and cut plants. This is, potentially, mankind's last tool- able to be dynamically upgraded to support different holoprojector setups, allowing even more tools to be used by one device, once a working holoprojector setup for an application is implemented." + var/brightness_max = 4 + var/brightness_min = 2 + deploy_sound = "sound/weapons/switchsound.ogg" + undeploy_sound = "sound/weapons/switchsound.ogg" + light_color = LIGHT_COLOR_CYAN + switchingtype = "adminholo" + start_modules = list( + /obj/item/surgical/scalpel/laser3/holoswitch = null, + /obj/item/surgical/circular_saw/holoswitch = null, + /obj/item/surgical/surgicaldrill/holoswitch = null, + /obj/item/surgical/cautery/holoswitch = null, + /obj/item/surgical/hemostat/holoswitch = null, + /obj/item/surgical/retractor/holoswitch = null, + /obj/item/surgical/bone_clamp/holoswitch = null, + /obj/item/tool/screwdriver/holoswitch = null, + /obj/item/tool/wrench/holoswitch = null, + /obj/item/tool/crowbar/holoswitch = null, + /obj/item/tool/wirecutters/holoswitch = null, + /obj/item/weldingtool/holoswitch = null, + /obj/item/multitool/holoswitch = null, + /obj/item/flashlight/holoswitch = null, + /obj/item/soap/holoswitch = null, + /obj/item/melee/energy/sword/holoswitch = null, + /obj/item/shield/holoswitch = null) + +/obj/item/switchtool/holo/New() + ..() + color = light_color + +/obj/item/switchtool/holo/deploy(var/obj/item/module) //We lightin' it up in here + ..() + if(module.deploytype == "flashlight") + set_light(brightness_max, 4, light_color) + else + set_light(brightness_min, 1, light_color) + +/obj/item/switchtool/holo/undeploy() + ..() + set_light(0) + + +/obj/item/switchtool/holo/CE + name = "Chief Engineer's holotool" + icon_state = "holoswitchtool" + item_state = "holoswitchtool" + desc = "A finely crafted device that uses a micro-scale hardlight emitter to form hardlight manipulators in the form of tools. Can also operate in low-power mode as a flashlight and in high-power mode as a UV cleaner." + description_fluff = "A holotool used by the Chief Engineer." + light_color = "#FED8B1" //lightcolororange sucks lmao + start_modules = list( + /obj/item/tool/screwdriver/holoswitch = null, + /obj/item/tool/wrench/holoswitch = null, + /obj/item/tool/crowbar/holoswitch = null, + /obj/item/tool/wirecutters/holoswitch = null, + /obj/item/weldingtool/holoswitch = null, + /obj/item/multitool/holoswitch = null, + /obj/item/flashlight/holoswitch = null, + /obj/item/soap/holoswitch = null) + switchingtype = "ce" + +//Actual tools go here. + +/obj/item/soap/holoswitch + name = "holographically contained UV light" + desc = "This should not exist." + deploytype = "soap" + +/obj/item/flashlight/holoswitch + name = "low-power holoemitter" + desc = "This should not exist" + power_use = 0 + deploytype = "light" + +/obj/item/tool/screwdriver/holoswitch + name = "hardlight screwdriver" + desc = "This should not exist." + deploytype = "screwdriver" + toolspeed = 0.9 + +/obj/item/tool/wrench/holoswitch + name = "hardlight bolt driver" + desc = "This should not exist." + deploytype = "wrench" + toolspeed = 0.9 + +/obj/item/tool/crowbar/holoswitch + name = "hardlight pry bar" + desc = "This should not exist." + deploytype = "crowbar" + toolspeed = 0.9 + +/obj/item/tool/wirecutters/holoswitch + name = "hardlight wire cutting tool" + desc = "This should not exist." + deploytype = "wirecutters" + toolspeed = 0.9 + +/obj/item/weldingtool/holoswitch + name = "laser welding tool" + desc = "This should not exist." + deploytype = "welder" + toolspeed = 0.9 + var/nextrefueltick = 0 + +/obj/item/multitool/holoswitch + name = "hardlight electromagnetic microinducer" + desc = "This should not exist." + deploytype = "multitool" + +/obj/item/weldingtool/holoswitch/process() + ..() + if(get_fuel() < get_max_fuel() && nextrefueltick < world.time) + nextrefueltick = world.time + 10 + reagents.add_reagent("fuel", 1) + +/obj/item/surgical/scalpel/laser3/holoswitch + name = "hybrid hardlight-laser scalpel" + desc = "This should not exist." + deploytype = "scalpel" + toolspeed = 0.9 + +/obj/item/surgical/retractor/holoswitch + name = "hardlight retractor" + desc = "This should not exist." + deploytype = "retractor" + toolspeed = 0.9 + +/obj/item/surgical/hemostat/holoswitch + name = "hardlight haemostat" + desc = "This should not exist." + deploytype = "hemostat" + toolspeed = 0.9 + +/obj/item/surgical/cautery/holoswitch + name = "laser cautery" + desc = "This should not exist." + deploytype = "cautery" + toolspeed = 0.9 + +/obj/item/surgical/circular_saw/holoswitch + name = "hardlight saw" + desc = "This should not exist." + deploytype = "saw" + toolspeed = 0.9 + +/obj/item/surgical/surgicaldrill/holoswitch + name = "hardlight surgical drill" + desc = "This should not exist." + deploytype = "drill" + toolspeed = 0.9 + +/obj/item/surgical/bone_clamp/holoswitch + name = "hardlight bone rectifier" + desc = "This should not exist." + deploytype = "boneclamp" + toolspeed = 0.9 + +/obj/item/melee/energy/sword/holoswitch + name = "hardlight blade" + desc = "This should not exist." + deploytype = "sword" + +/obj/item/shield/holoswitch + name = "hardlight shield" + desc = "This should not exist." + deploytype = "shield" + +/obj/item/soap/holoswitch/pre_attack() + . = ..() + wet() + +/obj/item/tool/screwdriver/switchy + name = "switchtool screwdriver" + desc = "This should not exist." + deploytype = "screwdriver" + toolspeed = 1.2 + +/obj/item/tool/wrench/switchy + name = "switchtool wrench" + desc = "This should not exist." + deploytype = "wrench" + toolspeed = 1.2 + +/obj/item/tool/crowbar/switchy + name = "switchtool crowbar" + desc = "This should not exist." + deploytype = "crowbar" + toolspeed = 1.2 + +/obj/item/tool/wirecutters/switchy + name = "switchtool cutters" + desc = "This should not exist." + deploytype = "wirecutters" + toolspeed = 1.2 + +/obj/item/multitool/switchy + name = "switchtool micro-multitool" + desc = "This should not exist." + deploytype = "multitool" + +/obj/item/surgical/scalpel/switchy + name = "switchtool scalpel" + desc = "This should not exist." + deploytype = "scalpel" + toolspeed = 1.2 + +/obj/item/surgical/hemostat/switchy + name = "switchtool hemostat" + desc = "This should not exist." + deploytype = "hemostat" + toolspeed = 1.2 + +/obj/item/surgical/retractor/switchy + name = "switchtool retractor" + desc = "This should not exist." + deploytype = "retractor" + toolspeed = 1.2 + +/obj/item/surgical/bonesetter/switchy + name = "switchtool bone setter" + desc = "This should not exist." + deploytype = "boneclamp" + toolspeed = 1.2 diff --git a/code/game/objects/structures/cliff.dm b/code/game/objects/structures/cliff.dm index 0359c310333..dedcab4e52f 100644 --- a/code/game/objects/structures/cliff.dm +++ b/code/game/objects/structures/cliff.dm @@ -225,6 +225,9 @@ two tiles on initialization, and which way a cliff is facing may change during m var/obj/item/clothing/shoes/shoes = H.shoes if(shoes && shoes.rock_climbing) return ..() // Do the other checks too. + var/obj/item/held = H.get_active_hand() + if(held && istype(held, /obj/item/pickaxe/icepick)) + return ..() //climb rock wall with ice pick. Makes sense. to_chat(user, span("warning", "\The [src] is too steep to climb unassisted.")) return FALSE diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index 111e52bee1f..2e0f5a5eedf 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -165,4 +165,4 @@ var/datum/gas_mixture_old/above_air = return_air() grave_breath.adjust_gas(gasid, BREATH_MOLES) grave_breath.temperature = (above_air.temperature) - 30 //Underground - return grave_breath \ No newline at end of file + return grave_breath diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index c2fbc5d5162..ef0b7299fae 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -34,7 +34,8 @@ /obj/item/gps/engineering/ce, /obj/item/reagent_containers/spray/windowsealant,//VOREStation Add /obj/item/pipe_dispenser, //Citadel Addition - /obj/item/shield_diffuser) //Citadel Addition + /obj/item/shield_diffuser, + /obj/item/switchtool/holo/CE) //Citadel Addition /obj/structure/closet/secure_closet/engineering_chief/Initialize() if(prob(50)) @@ -59,7 +60,8 @@ /obj/item/clothing/gloves/yellow = 2, /obj/item/storage/toolbox/electrical = 3, /obj/item/module/power_control = 3, - /obj/item/multitool = 3) + /obj/item/multitool = 3, + /obj/item/inducer = 1) /obj/structure/closet/secure_closet/engineering_welding diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index ae481c4e17e..bccb3d9a45c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -1,5 +1,5 @@ /obj/structure/closet/secure_closet/captains - name = "colony director's locker" + name = "Facility Director's locker" icon_state = "capsecure1" icon_closed = "capsecure" icon_locked = "capsecure1" diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index ee203deae45..dbccd482f90 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -468,7 +468,7 @@ /obj/item/storage/backpack/satchel = 2) /obj/structure/closet/wardrobe/captain - name = "colony director's wardrobe" + name = "Facility Director's wardrobe" icon_state = "cabinet_closed" icon_closed = "cabinet_closed" icon_opened = "cabinet_open" diff --git a/code/game/objects/structures/kitchen_foodcart.dm b/code/game/objects/structures/kitchen_foodcart.dm new file mode 100644 index 00000000000..b4d49599315 --- /dev/null +++ b/code/game/objects/structures/kitchen_foodcart.dm @@ -0,0 +1,42 @@ +/obj/structure/foodcart + name = "Foodcart" + icon = 'icons/obj/kitchen.dmi' + icon_state = "foodcart-0" + desc = "The ultimate in food transport! When opened you notice two compartments with odd blue glows to them. One feels very warm, while the other is very cold." + anchored = 0 + opacity = 0 + density = 1 + +/obj/structure/foodcart/Initialize() + . = ..() + for(var/obj/item/I in loc) + if(istype(I, /obj/item/reagent_containers/food)) + I.loc = src + update_icon() + +/obj/structure/foodcart/attackby(obj/item/O as obj, mob/user as mob) + if(istype(O, /obj/item/reagent_containers/food)) + user.drop_item() + O.loc = src + update_icon() + else + return + +/obj/structure/foodcart/attack_hand(var/mob/user as mob) + if(contents.len) + var/obj/item/reagent_containers/food/choice = input("What would you like to grab from the cart?") as null|obj in contents + if(choice) + if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) + return + if(ishuman(user)) + if(!user.get_active_hand()) + user.put_in_hands(choice) + else + choice.loc = get_turf(src) + update_icon() + +/obj/structure/foodcart/update_icon() + if(contents.len < 5) + icon_state = "foodcart-[contents.len]" + else + icon_state = "foodcart-5" \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index fec08c77f58..75bfd8fba2e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -237,3 +237,20 @@ spawn(0) qdel(src) return + +//Dolly Below + +/obj/structure/bed/chair/wheelchair/dolly + name = "transport dolly" + desc = "The safest way to transport high-risk patients." + icon_state = "wheelchair_dolly" + +/obj/structure/bed/chair/wheelchair/dolly/setDir() + ..() + overlays = null + var/image/O = image(icon = 'icons/obj/furniture.dmi', icon_state = "d_overlay", layer = FLY_LAYER, dir = src.dir) + overlays += O + if(has_buckled_mobs()) + for(var/A in buckled_mobs) + var/mob/living/L = A + L.setDir(dir) diff --git a/code/game/sound.dm b/code/game/sound.dm index 3bbe1f93150..7a2f5154666 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -94,7 +94,7 @@ GLOBAL_VAR_INIT(sound_distance_offscreen, 7) distance *= distance_multiplier // Extra falloff if sound is offscreen from world's default view. - S.volume *= (1 - CLAMP(((max(distance - GLOB.sound_distance_offscreen, 0) * GLOB.sound_offscreen_falloff_factor)/100), 0, 1)) + S.volume *= (1 - clamp(((max(distance - GLOB.sound_distance_offscreen, 0) * GLOB.sound_offscreen_falloff_factor)/100), 0, 1)) var/pressure_factor = 1 if(pressure_affected) diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index 2f45eb7b51f..224cf0e303d 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -279,6 +279,22 @@ var/list/flooring_types icon_base = "freezer" build_type = /obj/item/stack/tile/floor/freezer +/decl/flooring/wmarble + name = "marble floor" + desc = "Very regal white marble flooring." + icon = 'icons/turf/flooring/misc.dmi' + icon_base = "lightmarble" + build_type = /obj/item/stack/tile/wmarble + flags = TURF_REMOVE_CROWBAR + +/decl/flooring/bmarble + name = "marble floor" + desc = "Very regal black marble flooring." + icon = 'icons/turf/flooring/misc.dmi' + icon_base = "darkmarble" + build_type = /obj/item/stack/tile/bmarble + flags = TURF_REMOVE_CROWBAR + /decl/flooring/wood name = "wooden floor" desc = "Polished redwood planks." diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 8b25e1fcfab..fb41b774443 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -311,6 +311,18 @@ icon_state = "lino" initial_flooring = /decl/flooring/linoleum +/turf/simulated/floor/wmarble + name = "marble" + icon = 'icons/turf/flooring/misc.dmi' + icon_state = "lightmarble" + initial_flooring = /decl/flooring/wmarble + +/turf/simulated/floor/bmarble + name = "marble" + icon = 'icons/turf/flooring/misc.dmi' + icon_state = "darkmarble" + initial_flooring = /decl/flooring/bmarble + //ATMOS PREMADES /turf/simulated/floor/reinforced/airless name = "vacuum floor" diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index f50c5d0c71d..99efe99de2a 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -138,7 +138,7 @@ /turf/simulated/wall/attackby(obj/item/W as obj, mob/user as mob) user.setClickCooldown(user.get_attack_speed(W)) - if (!user.) + if (!user) to_chat(user, "You don't have the dexterity to do this!") return diff --git a/code/game/world.dm b/code/game/world.dm index a0f51602eb9..8900cff528a 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -16,6 +16,9 @@ GLOBAL_VAR(topic_status_lastcache) GLOBAL_LIST(topic_status_cache) /world/New() + var/extools = world.GetConfig("env", "EXTOOLS_DLL") || (world.system_type == MS_WINDOWS ? "./byond-extools.dll" : "./libbyond-extools.so") + if (fexists(extools)) + call(extools, "maptick_initialize")() enable_debugger() make_datum_reference_lists() @@ -496,4 +499,4 @@ proc/establish_old_db_connection() // Call this to make a new blank z-level, don't modify maxz directly. /world/proc/increment_max_z() maxz++ - max_z_changed() \ No newline at end of file + max_z_changed() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 54cbb87bafb..7caee70fd94 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1193,7 +1193,7 @@ var/datum/announcement/minor/admin_min_announcer = new out += "Autotraitor disabled.
    " out += "All antag ids:" - if(SSticker.mode.antag_templates && SSticker.mode.antag_templates.len). + if(SSticker.mode.antag_templates && SSticker.mode.antag_templates.len) for(var/datum/antagonist/antag in SSticker.mode.antag_templates) antag.update_current_antag_max() out += " [antag.id]" @@ -1502,7 +1502,8 @@ datum/admins/var/obj/item/paper/admin/faxreply // var to hold fax replies in P.stamps += "
    This paper has been stamped by the [P.origin] Quantum Relay." var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - var/{x; y;} + var/x + var/y x = rand(-2, 0) y = rand(-1, 2) P.offset_x += x diff --git a/code/modules/admin/chat_commands.dm b/code/modules/admin/chat_commands.dm index 358adabe6e6..d442dd4cdff 100644 --- a/code/modules/admin/chat_commands.dm +++ b/code/modules/admin/chat_commands.dm @@ -136,7 +136,8 @@ GLOBAL_LIST(round_end_notifiees) admin_only = TRUE /datum/tgs_chat_command/whitelist/Run(datum/tgs_chat_user/sender, params) - GLOB.PB_bypass |= ckey(params) + GLOB.bunker_passthrough |= ckey(params) + GLOB.bunker_passthrough[ckey(params)] = world.realtime return "Added [ckey(params)] to the bypass list." /datum/tgs_chat_command/dewhitelist @@ -145,5 +146,5 @@ GLOBAL_LIST(round_end_notifiees) admin_only = TRUE /datum/tgs_chat_command/dewhitelist/Run(datum/tgs_chat_user/sender, params) - GLOB.PB_bypass -= ckey(params) + GLOB.bunker_passthrough -= ckey(params) return "Removed [ckey(params)] from the bypass list if they were on it." diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index 651fa213286..b5ccf7fd939 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -63,7 +63,7 @@ var/savefile/Banlistjob bantimestamp = CMinutes + minutes if(rank == "Heads") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Personnel") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Colony Director") + AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Facility Director") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index a1b411d6686..bbb5cd542b9 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -288,7 +288,7 @@ id.icon_state = "gold" id.access = get_all_accesses().Copy() id.registered_name = H.real_name - id.assignment = "Colony Director" + id.assignment = "Facility Director" id.name = "[id.registered_name]'s ID Card ([id.assignment])" H.equip_to_slot_or_del(id, slot_wear_id) H.update_inv_wear_id() diff --git a/code/modules/admin/verbs/panicbunker.dm b/code/modules/admin/verbs/panicbunker.dm index e1684eea57f..b35c6e02c95 100644 --- a/code/modules/admin/verbs/panicbunker.dm +++ b/code/modules/admin/verbs/panicbunker.dm @@ -1,4 +1,4 @@ -GLOBAL_LIST_EMPTY(PB_bypass) +GLOBAL_LIST_EMPTY(bunker_passthrough) /client/proc/panicbunker() set category = "Server" @@ -26,7 +26,9 @@ GLOBAL_LIST_EMPTY(PB_bypass) to_chat(usr, "The Database is not enabled!") return - GLOB.PB_bypass |= ckey(ckeytobypass) + GLOB.bunker_passthrough |= ckey(ckeytobypass) + GLOB.bunker_passthrough[ckey(ckeytobypass)] = world.realtime + SSpersistence.SavePanicBunker() //we can do this every time, it's okay log_admin("[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.") message_admins("[key_name_admin(usr)] has added [ckeytobypass] to the current round's bunker bypass list.") send2irc("Panic Bunker", "[key_name(usr)] has added [ckeytobypass] to the current round's bunker bypass list.") @@ -39,7 +41,8 @@ GLOBAL_LIST_EMPTY(PB_bypass) to_chat(usr, "The Database is not enabled!") return - GLOB.PB_bypass -= ckey(ckeytobypass) + GLOB.bunker_passthrough -= ckey(ckeytobypass) + SSpersistence.SavePanicBunker() log_admin("[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.") message_admins("[key_name_admin(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.") send2irc("Panic Bunker", "[key_name(usr)] has removed [ckeytobypass] from the current round's bunker bypass list.") diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 619cedb14b0..ad986e287d6 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -49,6 +49,7 @@ feedback_add_details("admin_verb","PLS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_web_sound() + set category = "Fun" to_chat(src, "Due to the fact that the coder who ported this decided to whip this up in less than an hour, this doesn't work. Use the web sound manual verb with a youtube-dl fetched link.") return diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 5a8c08f4cbe..a1c52c2aaf1 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -65,13 +65,14 @@ var/list/lst = get_callproc_args() if(!lst) return + lst.Insert(1, result) var/datumname = "error" if(result in componentsubtypes) datumname = "component" - target.AddComponent(result, lst) + target._AddComponent(lst) else datumname = "element" - target.AddElement(result, lst) + target._AddElement(lst) log_admin("[key_name(usr)] has added [result] [datumname] to [key_name(src)].") message_admins("[key_name_admin(usr)] has added [result] [datumname] to [key_name_admin(src)].") if(href_list[VV_HK_CALLPROC]) diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm index 71e39067859..6acd9b3bd4b 100644 --- a/code/modules/busy_space/air_traffic.dm +++ b/code/modules/busy_space/air_traffic.dm @@ -1,21 +1,37 @@ //Cactus, Speedbird, Dynasty, oh my +//Also, massive additions/refactors by Killian, because the original incarnation was full of holes var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller /datum/lore/atc_controller - var/delay_min = 25 MINUTES //How long between ATC traffic, min. Default is 40 mins. Slight reduction for +/- 5 consistency. - var/delay_max = 35 MINUTES //How long between ATC traffic, max. Default is 25 mins. - var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins. - var/next_message //When the next message should happen in world.time + var/delay_min = 25 MINUTES //How long between ATC traffic + var/delay_max = 35 MINUTES //Adjusted to give approx 2 per hour, will work out to 10-14 over a full shift + //Shorter delays means more traffic, which gives the impression of a busier system, but also means a lot more radio noise + var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins. + var/initial_delay = 2 MINUTES //How long to wait before sending the first message of the shift. + var/next_message = 30 MINUTES //When the next message should happen in world.time - Making it default to min value var/force_chatter_type //Force a specific type of messages - var/squelched = 0 //If ATC is squelched currently + var/squelched = 0 //If ATC is squelched currently + + //define a block of frequencies so we can have them be static instead of being random for each call + var/ertchannel + var/medchannel + var/engchannel + var/secchannel + var/sdfchannel /datum/lore/atc_controller/New() - spawn(10 SECONDS) //Lots of lag at the start of a shift. - msg("New shift beginning, resuming traffic control.") - next_message = world.time + rand(delay_min,delay_max) - process() + //generate our static event frequencies for the shift. alternately they can be completely fixed, up in the core block + ertchannel = "[rand(700,749)].[rand(1,9)]" + medchannel = "[rand(750,799)].[rand(1,9)]" + engchannel = "[rand(800,849)].[rand(1,9)]" + secchannel = "[rand(850,899)].[rand(1,9)]" + sdfchannel = "[rand(900,999)].[rand(1,9)]" + spawn(450 SECONDS) //Lots of lag at the start of a shift. Yes, the following lines *have* to be indented or they're not delayed by the spawn properly. + msg("New shift beginning, resuming traffic control. This shift's Colony Frequencies are as follows: Emergency Responders: [ertchannel]. Medical: [medchannel]. Engineering: [engchannel]. Security: [secchannel]. System Defense: [sdfchannel].") + next_message = world.time + initial_delay + process() /datum/lore/atc_controller/process() if(world.time >= next_message) @@ -30,7 +46,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller /datum/lore/atc_controller/proc/msg(var/message,var/sender) ASSERT(message) - global_announcer.autosay("[message]", sender ? sender : "[GLOB.using_map.starsys_name] Flight Control") + global_announcer.autosay("[message]", sender ? sender : "[GLOB.using_map.dock_name] Control") /datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1) if(yes) @@ -43,239 +59,341 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller squelched = 0 /datum/lore/atc_controller/proc/shift_ending(var/evac = 0) - msg("Automated Tram departing [GLOB.using_map.station_name] for [GLOB.using_map.dock_name] on routine transfer route.","NT Automated Tram") //VOREStation Edit - Tram, tho. + msg("[GLOB.using_map.shuttle_name], this is [GLOB.using_map.dock_name] Control, you are cleared to complete routine transfer from [GLOB.using_map.station_name] to [GLOB.using_map.dock_name].") sleep(5 SECONDS) - msg("Automated Tram, cleared to complete routine transfer from [GLOB.using_map.station_name] to [GLOB.using_map.dock_name].") //VOREStation Edit - Tram, tho. - //TODO: update these to use a switchable value pulled from the map defines if we're going to have a rotation of maps + msg("[GLOB.using_map.shuttle_name] departing [GLOB.using_map.dock_name] for [GLOB.using_map.station_name] on routine transfer route. Estimated time to arrival: ten minutes.","[GLOB.using_map.shuttle_name]") /datum/lore/atc_controller/proc/random_convo() var/one = pick(loremaster.organizations) //These will pick an index, not an instance - var/two = pick(loremaster.organizations) //I'm now used for fake IFFs + var/two = pick(loremaster.organizations) var/datum/lore/organization/source = loremaster.organizations[one] //Resolve to the instances - var/datum/lore/organization/fakeiff = loremaster.organizations[two] //repurposed for new fun stuff + var/datum/lore/organization/secondary = loremaster.organizations[two] //repurposed for new fun stuff - //Let's get some mission parameters + //Let's get some mission parameters, pick our first ship + var/name = source.name //get the name var/owner = source.short_name //Use the short name var/prefix = pick(source.ship_prefixes) //Pick a random prefix var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does var/shipname = pick(source.ship_names) //Pick a random ship name var/destname = pick(source.destination_names) //destination is where? - var/law_abiding = source.lawful //do we fully observe system law (or are we otherwise favored by the system owners)? - var/system_defense = source.sysdef //are we system law? + var/law_abiding = source.lawful //do we fully observe system law (or are we otherwise favored by the system owners, i.e. NT)? + var/law_breaker = source.hostile //or are we part of a pirate group + var/system_defense = source.sysdef //are we actually system law/SDF? unlocks the SDF-specific events - var/fakeowner = fakeiff.short_name - var/fakeprefix = pick(fakeiff.ship_prefixes) //Pick a random prefix - var/fakeshipname = pick(fakeiff.ship_names) //Pick a random ship name - var/law_abiding2 = fakeiff.lawful - var/system_defense2 = fakeiff.sysdef + //pick our second ship + //var/secondname = secondary.name //not used atm, commented out to suppress errors + var/secondowner = secondary.short_name + var/secondprefix = pick(secondary.ship_prefixes) //Pick a random prefix + var/secondshipname = pick(secondary.ship_names) //Pick a random ship name + var/law_abiding2 = secondary.lawful + var/law_breaker2 = secondary.hostile + var/system_defense2 = secondary.sysdef //mostly here as a secondary check to ensure SDF don't interrogate other SDF - var/combined_name = "[owner][prefix] [shipname]" - var/combined_fake_name = "[fakeowner][fakeprefix] [fakeshipname]" - - var/alt_atc_names = list("[GLOB.using_map.starsys_name] TraCon","[GLOB.using_map.starsys_name] System Control","[GLOB.using_map.starsys_name] Star Control","[GLOB.using_map.starsys_name] SysCon","[GLOB.using_map.starsys_name] Tower","[GLOB.using_map.starsys_name] Flight Control","[GLOB.using_map.starsys_name] STC","[GLOB.using_map.starsys_name] StarCon") + var/combined_first_name = "[owner][prefix] |[shipname]|" + var/combined_second_name = "[secondowner][secondprefix] |[secondshipname]|" + + var/alt_atc_names = list("[GLOB.using_map.dock_name] Traffic Control","[GLOB.using_map.dock_name] TraCon","[GLOB.using_map.dock_name] System Control","[GLOB.using_map.dock_name] Star Control","[GLOB.using_map.dock_name] SysCon","[GLOB.using_map.dock_name] Tower","[GLOB.using_map.dock_name] Control","[GLOB.using_map.dock_name] STC","[GLOB.using_map.dock_name] StarCon") var/mission_noun = pick(source.flight_types) //pull from a list of owner-specific flight ops, to allow an extra dash of flavor -// var/request_verb = list("requesting","calling for","asking for") //defunct; always 'requesting' now - more formal + if(source.complex_tasks) //if our source has the complex_tasks flag, regenerate with a two-stage assignment + mission_noun = "[pick(source.task_types)] [pick(source.flight_types)]" //First response is 'yes', second is 'no' - var/requests = list("[GLOB.using_map.station_short] transit clearance" = list("permission for transit granted", "permission for transit denied, contact regional on 953.5"), - "planetary flight rules" = list("authorizing planetary flight rules", "denying planetary flight rules right now due to traffic"), - "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"), - "current solar weather info" = list("sending you the relevant information via tightbeam", "cannot fulfill your request at the moment"), - "nearby traffic info" = list("sending you current traffic info", "no available info in your area"), - "remote telemetry data" = list("sending telemetry now", "no uplink from your ship, recheck your uplink and ask again"), - "refueling information" = list("sending refueling information now", "depots currently experiencing fuel shortages, advise you move on"), - "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"), - "current system starcharts" = list("transmitting current starcharts", "your request is queued, overloaded right now") - ) + var/requests = list( + "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"), + "current solar weather info" = list("sending you the relevant information via tightbeam", "your request has been queued, stand by"), + "aerospace priority" = list("affirmative, aerospace priority is yours", "negative, another vessel has priority right now"), + "system traffic info" = list("sending you current traffic info", "request queued, please hold"), + "refueling information" = list("sending refueling information now", "depots currently experiencing fuel shortages, advise you move on"), + "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"), + "current system starcharts" = list("transmitting current starcharts", "your request is queued, overloaded right now") + ) //Random chance things for variety var/chatter_type = "normal" if(force_chatter_type) chatter_type = force_chatter_type else if(law_abiding && !system_defense) //I have to offload this from the chatter_type switch below and do it here, otherwise BYOND throws a shitfit for no discernable reason - chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"dockingrequestgeneric",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed") - else if(system_defense && !law_abiding2 && !system_defense2) //no SDF scan/flee events with law-abiders or other SDF (in the rare event it manages to roll double SDF) - chatter_type = pick(30;"policeshipscan",10;"policeshipflee",30;"dockingrequestgeneric",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"sdfbeginpatrol","normal") + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed") + //the following filters *always* fire their 'unique' event when they're tripped, simply because the conditions behind them are quite rare to begin with + else if(name == "Smugglers" && !system_defense2) //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff + chatter_type = "policeflee" + else if(name == "Smugglers" && system_defense2) //ditto, if an SDF ship catches them + chatter_type = "policeshipflee" + else if(law_abiding && law_breaker2) //on the offchance that we manage to roll a goodguy and a badguy, run a new distress event - it's like emerg but better + chatter_type = "distress" + else if(law_breaker && system_defense2) //if we roll this combo instead, time for the SDF to do their fucking job + chatter_type = "policeshipcombat" + else if(law_breaker && !system_defense2) //but if we roll THIS combo, time to alert the SDF to get off their asses + chatter_type = "hostiledetected" + //SDF-specific events that need to filter based on the second party (basically just the following SDF-unique list with the soft-result ship scan thrown in) + else if(system_defense && law_abiding2 && !system_defense2) //let's see if we can narrow this down, I didn't see many ship-to-ship scans + chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal") + //SDF-specific events that don't require the secondary at all, in the event that we manage to roll SDF + hostile/smuggler or something else if(system_defense) - chatter_type = pick(30;"dockingrequestgeneric",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"sdfbeginpatrol","normal") + chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",80;"sdfbeginpatrol","normal") + //if we somehow don't match any of the other existing filters once we've run through all of them else - chatter_type = pick(5;"emerg",25;"policescan",10;"policeflee",10;"strangeactivity",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"undockingdenied",30;"undockingdelayed","normal") + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestdenied",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"undockingdenied",30;"undockingdelayed","normal") + //I probably should do some kind of pass here to work through all the possible combinations of major factors and see if the filtering list needs reordering or modifying, but I really can't be arsed var/yes = prob(90) //Chance for them to say yes vs no var/request = pick(requests) var/callname = pick(alt_atc_names) var/response = requests[request][yes ? 1 : 2] //1 is yes, 2 is no + var/number = rand(1,42) + var/zone = pick("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega") + //fallbacks in case someone sets the dock_type on the map datum to null- it defaults to "station" normally + var/landing_zone = "LZ [zone]" + var/landing_move = "landing request" + var/landing_short = "land" + switch(GLOB.using_map.dock_type) + if("surface") //formal installations with proper facilities + landing_zone = "landing pad [number]" + landing_move = "landing request" + landing_short = "land" + if("frontier") //for frontier bases - landing spots are literally just open ground, maybe concrete at best + landing_zone = "LZ [zone]" + landing_move = "landing request" + landing_short = "land" + if("station") //standard station pattern + landing_zone = "docking bay [number]" + landing_move = "docking request" + landing_short = "dock" // what you're about to witness is what feels like an extremely kludgy rework of the system, but it's more 'flexible' and allows events that aren't just ship-stc-ship // something more elegant could probably be done, but it won't be done by somebody as half-competent as me switch(chatter_type) + //mayday call if("emerg") var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have asteroids impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our life support has failed") - msg("Mayday, mayday, mayday! This is [combined_name] declaring an emergency! [problem]!","[prefix] [shipname]") + msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! [problem]!","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control, copy. Switch to emergency responder channel [rand(700,999)].[rand(1,9)].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control, copy. Switch to emergency responder channel [ertchannel].") sleep(5 SECONDS) - msg("Understood [GLOB.using_map.starsys_name] Flight Control, switching now.","[prefix] [shipname]") + msg("Understood [GLOB.using_map.dock_name] Control, switching now.","[prefix] [shipname]") + //Control scan event: soft outcome if("policescan") var/confirm = pick("Understood","Roger that","Affirmative") - var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.") - var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","Apologies for the delay, you're clear.","Switch to [rand(700,999)].[rand(1,9)] and await further instruction.") - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.") + var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?") + var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear, move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.") sleep(5 SECONDS) - msg("[confirm] [GLOB.using_map.starsys_name] Flight Control, holding position.","[prefix] [shipname]") + msg("[confirm] [GLOB.using_map.dock_name] Control, holding position.","[prefix] [shipname]") sleep(5 SECONDS) - msg("Your compliance is appreciated, [combined_name]. Scan commencing.") + msg("Your compliance is appreciated, [combined_first_name]. Scan commencing.") sleep(10 SECONDS) msg(complain,"[prefix] [shipname]") sleep(15 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Scan complete. [completed]") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Scan complete. [completed]") + //Control scan event: hard outcome + if("policeflee") + var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!") + msg("Unknown [pick("ship","vessel","starship")], this is [GLOB.using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.") + sleep(5 SECONDS) + msg("[uhoh]","[shipname]") + sleep(5 SECONDS) + msg("This is [GLOB.using_map.starsys_name] Defense Control to all local assets: vector to interdict and detain [combined_first_name]. Control out.","[GLOB.using_map.starsys_name] Defense Control") + //SDF scan event: soft outcome if("policeshipscan") var/confirm = pick("Understood","Roger that","Affirmative") - var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.") - var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","Apologies for the delay, you're clear.","Switch to [rand(700,999)].[rand(1,9)] and await further instruction.") - msg("[combined_fake_name], this is [combined_name], your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.","[prefix] [shipname]") + var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?") + var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear. Move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.") + msg("[combined_second_name], this is [combined_first_name], your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.","[prefix] [shipname]") sleep(5 SECONDS) - msg("[confirm] [combined_name], holding position.","[fakeprefix] [fakeshipname]") + msg("[confirm] [combined_first_name], holding position.","[secondprefix] [secondshipname]") sleep(5 SECONDS) - msg("Your compliance is appreciated, [combined_name]. Scan commencing.","[prefix] [shipname]") + msg("Your compliance is appreciated, [combined_second_name]. Scan commencing.","[prefix] [shipname]") sleep(10 SECONDS) - msg(complain,"[fakeprefix] [fakeshipname]") + msg(complain,"[secondprefix] [secondshipname]") sleep(15 SECONDS) - msg("[combined_fake_name], this is [combined_name]. Scan complete. [completed]","[prefix] [shipname]") + msg("[combined_second_name], this is [combined_first_name]. Scan complete. [completed]","[prefix] [shipname]") + //SDF scan event: hard outcome if("policeshipflee") - var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, [shipname].") - msg("[combined_fake_name], this is [combined_name], your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.","[prefix] [shipname]") + var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, |[shipname]|.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!") + msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of system regulations.","[secondprefix] [secondshipname]") sleep(5 SECONDS) - msg("[uhoh]","[fakeprefix] [fakeshipname]") + msg("[uhoh]","[shipname]") sleep(5 SECONDS) - msg("[GLOB.using_map.starsys_name] Defense Control, this is [combined_name], we have a situation here, Code Red. Requesting immediate reinforcement.","[prefix] [shipname]") + msg("[GLOB.using_map.starsys_name] Defense Control, this is [combined_second_name], we have a situation here, please advise.","[secondprefix] [secondshipname]") sleep(5 SECONDS) - msg("Defense Control copies, [combined_name], reinforcements en route. Switch further communications to encrypted band [rand(1000,1250)].[rand(1,9)].","[GLOB.using_map.starsys_name] Defense Control") - if("policeflee") - var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.") - msg("[combined_fake_name], this is [GLOB.using_map.starsys_name] Flight Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.") + msg("Defense Control copies, [combined_second_name], reinforcements are en route. Switch further communications to encrypted band [sdfchannel].","[GLOB.using_map.starsys_name] Defense Control") + //SDF scan event: engage primary in combat! fairly rare since it needs a pirate/vox + SDF roll + if("policeshipcombat") + var/battlestatus = pick("requesting reinforcements.","we need backup! Now!","holding steady.","we're holding our own for now.","we have them on the run.","they're trying to make a run for it!","we have them right where we want them.","we're badly outgunned!","we have them outgunned.","we're outnumbered here!","we have them outnumbered.","this'll be a cakewalk.",10;"notify their next of kin.") + msg("[GLOB.using_map.starsys_name] Defense Control, this is [combined_second_name], engaging [combined_first_name] [pick("near route","in sector")] [rand(1,100)], [battlestatus]","[secondprefix] [secondshipname]") sleep(5 SECONDS) - msg("[uhoh]","[prefix] [shipname]") + msg("[GLOB.using_map.starsys_name] Defense Control copies, [combined_second_name]. Keep us updated.","[GLOB.using_map.starsys_name] Defense Control") + //SDF event: patrol update + if("sdfpatrolupdate") + var/statusupdate = pick("nothing unusual so far","nothing of note","everything looks clear so far","ran off some [pick("pirates","marauders")] near route [pick(1,100)], [pick("no","minor")] damage sustained, continuing patrol","situation normal, no suspicious activity yet","minor incident on route [pick(1,100)]","Code 7-X [pick("on route","in sector")] [pick(1,100)], situation is under control","seeing a lot of traffic on route [pick(1,100)]","caught a couple of smugglers [pick("on route","in sector")] [pick(1,100)]","sustained some damage in a skirmish just now, we're heading back for repairs") + msg("[GLOB.using_map.starsys_name] Defense Control, this is [combined_first_name] reporting in, [statusupdate], over.","[prefix] [shipname]") sleep(5 SECONDS) - msg("This is [GLOB.using_map.starsys_name] Defense Control to all local assets, the [combined_fake_name] is broadcasting false IFF codes. Registry updated to [combined_name]: vector to interdict and detain. Control out.","[GLOB.using_map.starsys_name] Defense Control") - if("strangeactivity") - var/concern = pick("It looks like they're under attack.","I think they're being boarded.","We're not reading any lifesigns aboard.","There's a Vox Marauder right on top of them!","They're maneuvering erratically.","We're picking up some strange radiation patterns.","We can see multiple hull breaches from here.","They're leaking fuel everywhere.","Their drives are misfiring.") - var/confirm = pick("Roger that","Affirmative","Understood","Thanks for the heads up") - msg("[callname], this is [combined_name]. We're seeing some strange activity over on [combined_fake_name]. [concern]","[prefix] [shipname]") + msg("[GLOB.using_map.starsys_name] Defense Control copies, [combined_first_name]. Keep us updated, out.","[GLOB.using_map.starsys_name] Defense Control") + //SDF event: end patrol + if("sdfendingpatrol") + var/appreciation = pick("Copy","Understood","Affirmative","10-4","Roger that") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + msg("[callname], this is [combined_first_name], returning from our system patrol route, requesting permission to [landing_short].","[prefix] [shipname]") sleep(5 SECONDS) - msg("[confirm], [combined_name]. Dispatching SysDef assets to investigate.") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") sleep(5 SECONDS) - msg("SDC confirms investigate order, diverting assets.","[GLOB.using_map.starsys_name] Defense Control") + msg("[appreciation], [GLOB.using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") + //DefCon event: hostile found + if("hostiledetected") + var/orders = pick("Engage on sight","Engage with caution","Engage with extreme prejudice","Engage at will","Search and destroy","Bring them in alive, if possible","Interdict and detain","Keep your eyes peeled","Bring them in, dead or alive","Stay alert") + msg("This is [GLOB.using_map.starsys_name] Defense Control to all SDF assets. Priority update follows.","[GLOB.using_map.starsys_name] Defense Control") + sleep(5 SECONDS) + msg("Be on the lookout for [combined_first_name], last sighted near route [rand(1,100)]. [orders]. DefCon, out.","[GLOB.using_map.starsys_name] Defense Control") + //Ship event: distress call, under attack + if("distress") + msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! We are under attack by [combined_second_name]! Requesting immediate assistance!","[prefix] [shipname]") + sleep(5 SECONDS) + msg("[combined_first_name], this is [GLOB.using_map.starsys_name] Defense Control, copy. SDF is en route, contact on [sdfchannel].") + sleep(5 SECONDS) + msg("Understood [GLOB.using_map.starsys_name] Defense Control, switching now.","[prefix] [shipname]") + //Control event: travel advisory if("traveladvisory") - var/flightwarning = pick("Solar flare activity is spiking and expected to cause issues along main flight lanes [rand(1,33)], [rand(34,67)], and [rand(68,100)]","Pirate activity is on the rise, stay close to System Defense vessels","We're seeing a rise in illegal salvage operations, please report any unusual activity to the nearest SDF vessel","Vox Marauder activity is higher than usual, report any unusual activity to the nearest System Defense vessel","A quarantined [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","A prison [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","Traffic volume is higher than normal, expect processing delays","Anomalous bluespace activity detected, exercise caution","Smugglers have been particularly active lately, expect increased security scans","Depots are currently experiencing a fuel shortage, expect delays and higher rates","Asteroid mining has displaced debris dangerously close to main flight lanes on route [rand(1,100)], watch for potential impactors","[pick("Pirate","Vox Marauder")] and System Defense forces are currently engaged in skirmishes throughout the system, please steer clear of any active combat zones","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] has collided with a [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] near route [rand(1,100)], watch for debris and do not impede emergency service vessels","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] on route [rand(1,100)] has experienced total engine failure. Emergency response teams are en route, please observe minimum safe distances and do not impede emergency service vessels","Transit routes have been recalculated to adjust for planetary drift. Please synch your astronav computers as soon as possible to avoid delays and difficulties","[pick("Bounty hunters","System Defense officers")] are currently searching for a wanted fugitive, report any sightings of suspicious activity to your nearest System Defense agent","Mercenary contractors are currently conducting aggressive [pick("piracy","marauder")] suppression operations",10;"It's space carp breeding season. [pick("Stars","Gods","God","Goddess")] have mercy on you all, because the carp won't") - msg("This is [GLOB.using_map.starsys_name] Flight Control to all vessels in the [GLOB.using_map.starsys_name] system. Priority travel advisory follows.") + var/flightwarning = pick("Solar flare activity is spiking and expected to cause issues along main flight lanes [rand(1,33)], [rand(34,67)], and [rand(68,100)]","Pirate activity is on the rise, stay close to System Defense vessels","We're seeing a rise in illegal salvage operations, please report any unusual activity to the nearest SDF vessel via channel [sdfchannel]","Vox Marauder activity is higher than usual, report any unusual activity to the nearest System Defense vessel","A quarantined [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","A prison [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","Traffic volume is higher than normal, expect processing delays","Anomalous bluespace activity detected along route [rand(1,100)], exercise caution","Smugglers have been particularly active lately, expect increased security scans","Depots are currently experiencing a fuel shortage, expect delays and higher rates","Asteroid mining has displaced debris dangerously close to main flight lanes on route [rand(1,100)], watch for potential impactors","[pick("Pirate","Vox Marauder")] and System Defense forces are currently engaged in skirmishes throughout the system, please steer clear of any active combat zones","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] has collided with a [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] near route [rand(1,100)], watch for debris and do not impede emergency service vessels","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] on route [rand(1,100)] has experienced total engine failure. Emergency response teams are en route, please observe minimum safe distances and do not impede emergency service vessels","Transit routes have been recalculated to adjust for planetary drift. Please synch your astronav computers as soon as possible to avoid delays and difficulties","[pick("Bounty hunters","System Defense officers","Mercenaries")] are currently searching for a wanted fugitive, report any sightings of suspicious activity to System Defense via channel [sdfchannel]","Mercenary contractors are currently conducting aggressive [pick("piracy","marauder")] suppression operations",10;"It's space carp breeding season. [pick("Stars","Gods","God","Goddess")] have mercy on you all, because the carp won't") + msg("This is [GLOB.using_map.dock_name] Control to all vessels in the [GLOB.using_map.starsys_name] system. Priority travel advisory follows.") sleep(5 SECONDS) msg("[flightwarning]. Control out.") + //Control event: warning to a specific vessel if("pathwarning") - var/navhazard = pick ("a pocket of intense radiation","a pocket of unstable gas","a debris field","a secure installation","an active combat zone","a quarantined ship","a quarantined installation","a quarantined sector","a live-fire SDF training exercise","an ongoing Search & Rescue operation") + var/navhazard = pick("a pocket of intense radiation","a pocket of unstable gas","a debris field","a secure installation","an active combat zone","a quarantined ship","a quarantined installation","a quarantined sector","a live-fire SDF training exercise","an ongoing Search & Rescue operation") var/confirm = pick("Understood","Roger that","Affirmative","Our bad","Thanks for the heads up") var/safetravels = pick("Fly safe out there","Good luck","Safe travels","Godspeed","Stars guide you","Don't let it happen again") - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control, your [pick("ship","vessel","starship")] is approaching [navhazard], observe minimum safe distance and adjust your heading appropriately.") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control, your [pick("ship","vessel","starship")] is approaching [navhazard], observe minimum safe distance and adjust your heading appropriately.") sleep(5 SECONDS) - msg("[confirm] [GLOB.using_map.starsys_name] Flight Control, adjusting course.","[prefix] [shipname]") + msg("[confirm] [GLOB.using_map.dock_name] Control, adjusting course.","[prefix] [shipname]") sleep(5 SECONDS) - msg("Your compliance is appreciated, [combined_name]. [safetravels].") + msg("Your compliance is appreciated, [combined_first_name]. [safetravels].") + //Ship event: docking request (generic) if("dockingrequestgeneric") var/appreciation = pick("Much appreciated","Many thanks","Understood","Cheers") - var/dockingplan = pick("Starting final approach now.","Commencing docking procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - msg("[callname], this is [combined_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to dock at [GLOB.using_map.dock_name].","[prefix] [shipname]") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Permission granted, proceed to landing pad [rand(1,42)]. Follow the green lights on your way in.") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") sleep(5 SECONDS) - msg("[appreciation], [GLOB.using_map.starsys_name] Flight Control. [dockingplan]","[prefix] [shipname]") + msg("[appreciation], [GLOB.using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") + //Ship event: docking request (denied) if("dockingrequestdenied") - var/reason = pick("we don't have any free landing pads right now","we don't have any free landing pads large enough for your vessel","we don't have the necessary facilities for your vessel type or class","we can't verify your credentials","you're too far away, please close to ten thousand meters and resubmit your request") - msg("[callname], this is [combined_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to dock at [GLOB.using_map.dock_name].","[prefix] [shipname]") + var/reason = pick("we don't have any landing pads large enough for your vessel","we don't have the necessary facilities for your vessel type or class") + var/disappointed = pick("That's unfortunate. [combined_first_name], out.","Damn shame. We'll just have to keep moving. [combined_first_name], out.","[combined_first_name], out.") + msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_move].","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Request denied, [reason].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Request denied, [reason].") sleep(5 SECONDS) - msg("Understood, [GLOB.using_map.starsys_name] Flight Control.","[prefix] [shipname]") + msg("Understood, [GLOB.using_map.dock_name] Control. [disappointed]","[prefix] [shipname]") + //Ship event: docking request (delayed) + if("dockingrequestdelayed") + var/reason = pick("we don't have any free landing pads right now, please hold for three minutes","you're too far away, please close to ten thousand meters","we're seeing heavy traffic around the landing pads right now, please hold for three minutes","we're currently cleaning up a fuel spill on one of our free pads, please hold for three minutes","there are loose containers on our free pads, stand by for a couple of minutes whilst we secure them","another vessel has aerospace priority right now, please hold for three minutes") + var/appreciation = pick("Much appreciated","Many thanks","Understood","Perfect, thank you","Excellent, thanks","Great","Copy that") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]") + sleep(5 SECONDS) + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Request denied, [reason] and resubmit your request.") + sleep(5 SECONDS) + msg("Understood, [GLOB.using_map.dock_name] Control.","[prefix] [shipname]") + sleep(180 SECONDS) + msg("[callname], this is [combined_first_name], resubmitting [landing_move].","[prefix] [shipname]") + sleep (5 SECONDS) + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Everything appears to be in order now, permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") + sleep(5 SECONDS) + msg("[appreciation], [GLOB.using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") + //Ship event: docking request (resupply) if("dockingrequestsupply") - var/intensifier = pick("very","pretty","critically","extremely","dangerously","desperately","kinda","a little","a bit","rather","terribly","dreadfully","getting","running") - var/low_thing = pick("ammunition","oxygen","water","food","repair supplies","medical supplies","reaction mass","hydrogen fuel","phoron fuel","fuel",5;"tea",5;"coffee",5;"pizza",5;"beer",5;"snacks") //very low chance of a less serious shortage + var/preintensifier = pick(75;"getting ",75;"running ","") //whitespace hack, sometimes they'll add a preintensifier, but not always + var/intensifier = pick("very","pretty","critically","extremely","dangerously","desperately","kinda","a little","a bit","rather","sorta") + var/low_thing = pick("ammunition","munitions","clean water","food","spare parts","medical supplies","reaction mass","gas","hydrogen fuel","phoron fuel","fuel",10;"tea",10;"coffee",10;"soda",10;"pizza",10;"beer",10;"booze",10;"vodka",10;"snacks") //low chance of a less serious shortage var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - var/dockingplan = pick("Starting final approach now.","Commencing docking procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - msg("[callname], this is [combined_name]. We're [intensifier] low on [low_thing]. Requesting permission to dock at [GLOB.using_map.dock_name] for resupply.","[prefix] [shipname]") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + msg("[callname], this is [combined_first_name]. We're [preintensifier][intensifier] low on [low_thing]. Requesting permission to [landing_short] for resupply.","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Permission granted, proceed to landing pad [rand(1,42)]. Follow the green lights on your way in.") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") sleep(5 SECONDS) - msg("[appreciation], [GLOB.using_map.starsys_name] Flight Control. [dockingplan]","[prefix] [shipname]") + msg("[appreciation], [GLOB.using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") + //Ship event: docking request (repair/maint) if("dockingrequestrepair") - var/damagestate = pick("We're showing some hull damage","We're suffering minor system malfunctions","We're having some technical issues","We're overdue maintenance","We have several minor space debris impacts","We've got some battle damage here","Our reactor output is fluctuating","We're hearing some weird noises from the engines","Our artificial gravity generator has failed","Our life support is failing","Our water recycling system has shorted out","Our systems are glitching out","We just got caught in a solar flare","We had a close call with an asteroid","We have a minor [pick("fuel","water","oxygen")] leak","We have depressurized compartments","We have a hull breach","Our shield generator is on the fritz","Our RCS is acting up","One of our [pick("hydraulic","pneumatic")] systems has depressurized","Our repair bots are malfunctioning") + var/damagestate = pick("We've experienced some hull damage","We're suffering minor system malfunctions","We're having some technical issues","We're overdue maintenance","We have several minor space debris impacts","We've got some battle damage here","Our reactor output is fluctuating","We're hearing some weird noises from the [pick("engines","pipes","ducting","HVAC")]","Our artificial gravity generator has failed","Our life support is failing","Our environmental controls are busted","Our water recycling system has shorted out","Our navcomp is freaking out","Our systems are glitching out","We just got caught in a solar flare","We had a close call with an asteroid","We have a minor [pick("fuel","water","oxygen","gas")] leak","We have depressurized compartments","We have a hull breach","Our shield generator is on the fritz","Our RCS is acting up","One of our [pick("hydraulic","pneumatic")] systems has depressurized","Our repair bots are malfunctioning") var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - var/dockingplan = pick("Starting final approach now.","Commencing docking procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - msg("[callname], this is [combined_name]. [damagestate]. Requesting permission to dock at [GLOB.using_map.dock_name] for repairs.","[prefix] [shipname]") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + msg("[callname], this is [combined_first_name]. [damagestate]. Requesting permission to [landing_short] for repairs and maintenance.","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Permission granted, proceed to landing pad [rand(1,42)]. Follow the green lights on your way in. Repair crews are standing by, contact them on channel [rand(700,999)].[rand(1,9)].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Repair crews are standing by, contact them on channel [engchannel].") sleep(5 SECONDS) - msg("[appreciation], [GLOB.using_map.starsys_name] Flight Control. [dockingplan]","[prefix] [shipname]") + msg("[appreciation], [GLOB.using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") + //Ship event: docking request (medical) if("dockingrequestmedical") - var/medicalstate = pick("multiple casualties","several cases of radiation sickness","an unknown virus","an unknown infection","a critically injured VIP","sick refugees","multiple cases of food poisoning","injured passengers","sick passengers","injured engineers","wounded marines","a delicate situation","a pregnant passenger","injured castaways","escape pods","") + var/medicalstate = pick("multiple casualties","several cases of radiation sickness","an unknown virus","an unknown infection","a critically injured VIP","sick refugees","multiple cases of food poisoning","injured passengers","sick passengers","injured engineers","wounded marines","a delicate situation","a pregnant passenger","injured castaways","recovered escape pods","unknown escape pods") var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - var/dockingplan = pick("Starting final approach now.","Commencing docking procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - msg("[callname], this is [combined_name]. We have [medicalstate] on board. Requesting permission to dock at [GLOB.using_map.dock_name] for medical assistance.","[prefix] [shipname]") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + msg("[callname], this is [combined_first_name]. We have [medicalstate] on board. Requesting permission to [landing_short] for medical assistance.","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Permission granted, proceed to landing pad [rand(1,42)]. Follow the green lights on your way in. Medtechs are standing by, contact them on channel [rand(700,999)].[rand(1,9)].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Medtechs are standing by, contact them on channel [medchannel].") sleep(5 SECONDS) - msg("[appreciation], [GLOB.using_map.starsys_name] Flight Control. [dockingplan]","[prefix] [shipname]") + msg("[appreciation], [GLOB.using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") + //Ship event: docking request (security) if("dockingrequestsecurity") - var/species = pick("human","unathi","lizard","tajaran","skrell","akula","promethean","sergal","synthetic","teshari","vulpkanin","vox","zorren","hybrid","mixed-species") - var/securitystate = pick("several [species] convicts","a captured pirate","a wanted criminal","[species] stowaways","incompetent [species] shipjackers","a delicate situation","a disorderly passenger","disorderly [species] passengers","ex-mutineers","a captured vox marauder","stolen goods","a container full of confiscated contraband","containers full of confiscated contraband",5;"a raging case of spiders") //gotta have a little something to lighten the mood now and then + var/species = pick("human","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien") + var/securitystate = pick("several [species] convicts","a captured pirate","a wanted criminal","[species] stowaways","incompetent [species] shipjackers","a delicate situation","a disorderly passenger","disorderly [species] passengers","ex-mutineers","a captured vox marauder","captured vox marauders","stolen goods","a container full of confiscated contraband","containers full of confiscated contraband",5;"a very lost shadekin",5;"a raging case of [pick("spiders","crabs")]") //gotta have a little something to lighten the mood now and then var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","Perfect, thank you") var/dockingplan = pick("Starting final approach now.","Commencing docking procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - msg("[callname], this is [combined_name]. We have [securitystate] on board and require security assistance. Requesting permission to dock at [GLOB.using_map.dock_name].","[prefix] [shipname]") + msg("[callname], this is [combined_first_name]. We have [securitystate] on board and require security assistance. Requesting permission to [landing_short].","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Permission granted, proceed to landing pad [rand(1,42)]. Follow the green lights on your way in. Security teams are standing by, contact them on channel [rand(700,999)].[rand(1,9)].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Security teams are standing by, contact them on channel [secchannel].") sleep(5 SECONDS) - msg("[appreciation], [GLOB.using_map.starsys_name] Flight Control. [dockingplan]","[prefix] [shipname]") + msg("[appreciation], [GLOB.using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") + //Ship event: undocking request if("undockingrequest") var/safetravels = pick("Fly safe out there","Good luck","Safe travels","See you next week","Godspeed","Stars guide you") var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too","So long") - msg("[callname], this is [combined_name] at [GLOB.using_map.dock_name], requesting permission to depart from pad [rand(1,42)].","[prefix] [shipname]") + var/takeoff = pick("depart","launch") + msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Permission granted. Docking clamps released. [safetravels].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].") sleep(5 SECONDS) - msg("[thanks], [GLOB.using_map.starsys_name] Flight Control. This is [combined_name] setting course for [destname], over and out.","[prefix] [shipname]") + msg("[thanks], [GLOB.using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]") + //SDF event: starting patrol if("sdfbeginpatrol") var/safetravels = pick("Fly safe out there","Good luck","Good hunting","Safe travels","Godspeed","Stars guide you") var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too") - msg("[callname], this is [combined_name] at [GLOB.using_map.dock_name], requesting permission to depart from pad [rand(1,42)] to begin system patrol.","[prefix] [shipname]") + var/takeoff = pick("depart","launch","take off","dust off") + msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone] to begin system patrol.","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Permission granted. Docking clamps released. [safetravels].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].") sleep(5 SECONDS) - msg("[thanks], [GLOB.using_map.starsys_name] Flight Control. This is [combined_name] beginning system patrol, over and out.","[prefix] [shipname]") + msg("[thanks], [GLOB.using_map.dock_name] Control. This is [combined_first_name] beginning system patrol, out.","[prefix] [shipname]") + //Ship event: undocking request (denied) if("undockingdenied") + var/takeoff = pick("depart","launch") var/denialreason = pick("Security is requesting a full cargo inspection","Your ship has been impounded for multiple [pick("security","safety")] violations","Your ship is currently under quarantine lockdown","We have reason to believe there's an issue with your papers","Security personnel are currently searching for a fugitive and have ordered all outbound ships remain grounded until further notice") - msg("[callname], this is [combined_name] at [GLOB.using_map.dock_name], requesting permission to depart from pad [rand(1,42)].","[prefix] [shipname]") + msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]") sleep(5 SECONDS) - msg("Negative [combined_name], request denied. [denialreason].") + msg("Negative [combined_first_name], request denied. [denialreason].") + //Ship event: undocking request (delayed) if("undockingdelayed") var/denialreason = pick("Docking clamp malfunction, please hold","Fuel lines have not been secured","Ground crew are still on the pad","Loose containers are on the pad","Exhaust deflectors are not yet in position, please hold","There's heavy traffic right now, it's not safe for your vessel to launch","Another vessel has aerospace priority at this moment","Port officials are still aboard") - var/pad = rand(1,42) + var/takeoff = pick("depart","launch") var/safetravels = pick("Fly safe out there","Good luck","Safe travels","See you next week","Godspeed","Stars guide you") var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too","So long") - msg("[callname], this is [combined_name] at [GLOB.using_map.dock_name], requesting permission to depart from pad [pad].","[prefix] [shipname]") + msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]") sleep(5 SECONDS) - msg("Negative [combined_name], request denied. [denialreason]. Try again in three minutes.") + msg("Negative [combined_first_name], request denied. [denialreason]. Try again in three minutes.") sleep(180 SECONDS) //yes, three minutes - msg("[callname], this is [combined_name] at [GLOB.using_map.dock_name], requesting permission to depart from pad [pad].","[prefix] [shipname]") + msg("[callname], this is [combined_first_name], re-requesting permission to depart from [landing_zone].","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].") sleep(5 SECONDS) - msg("[thanks], [GLOB.using_map.starsys_name] Flight Control. This is [combined_name] setting course for [destname], over and out.","[prefix] [shipname]") + msg("[thanks], [GLOB.using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]") else //time for generic message - msg("[callname], this is [combined_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[prefix] [shipname]") + msg("[callname], this is [combined_first_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[prefix] [shipname]") sleep(5 SECONDS) - msg("[combined_name], this is [GLOB.using_map.starsys_name] Flight Control, [response].") + msg("[combined_first_name], this is [GLOB.using_map.dock_name] Control, [response].") sleep(5 SECONDS) - msg("[GLOB.using_map.starsys_name] Flight Control, [yes ? "thank you" : "understood"], good day.","[prefix] [shipname]") + msg("[GLOB.using_map.dock_name] Control, [yes ? "thank you" : "understood"], out.","[prefix] [shipname]") return //oops, forgot to restore this /* //OLD BLOCK, for reference diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm index 42febc03383..25a30d42e3c 100644 --- a/code/modules/busy_space/organizations.dm +++ b/code/modules/busy_space/organizations.dm @@ -10,6 +10,22 @@ var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused. var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc") + var/complex_tasks = FALSE //enables complex task generation + + //how does it work? simple: if you have complex tasks enabled, it goes; PREFIX + TASK_TYPE + FLIGHT_TYPE + //e.g. NDV = Asset Protection + Patrol + Flight + //this allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level + //task_types are picked from completely at random in air_traffic.dm, much like flight_types, so be careful not to potentially create combos that make no sense! + + var/list/task_types = list( + "logistics", + "patrol", + "training", + "peacekeeping", + "escort", + "search and rescue" + ) + var/list/flight_types = list( //operations and flights - we can override this if we want to remove the military-sounding ones or add our own "flight", "mission", @@ -62,6 +78,7 @@ ) var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. var/lawful = TRUE //Are we exempt from routine inspections? to avoid incidents where SysDef appears to go rogue -- defaults to TRUE now + var/hostile = FALSE //Are we explicitly lawless, hostile, or otherwise bad? allows for a finer alignment system, since my last checks weren't working properly var/sysdef = FALSE //Are we the space cops? var/autogenerate_destination_names = TRUE //Pad the destination lists with some extra random ones? @@ -69,24 +86,24 @@ ..() if(autogenerate_destination_names) // Lets pad out the destination names. var/i = rand(7, 12) //was 6-10, now 7-12, slight increase for flavor, especially 'starved' lists - + //known planets and exoplanets, plus fictional ones var/list/planets = list("Earth", "Luna", "Mars", "Titan", "Europa", "Sif", "Kara", "Rota", "Root", "Toledo, New Ohio", "Meralar", "Adhomai", "Arion", "Arkas", "Orbitar", "Galileo", "Brahe", "Janssen", "Harriot", "Aegir", "Amateru", "Dagon", "Meztli", "Hypatia", "Dulcinea", "Rocinante", "Sancho", "Thestias", "Saffar", "Samh", "Majriti", "Draugr") - + //existing systems, pruned for duplicates, includes systems that contain suspected or confirmed exoplanets - var/list/systems = list( + var/list/systems = list( "Sol", "Alpha Centauri", "Sirius", "Vega", "Tau Ceti", "Altair", "Zhu Que", "Oasis", "Vir", "Gavel", "Ganesha", "Saint Columbia", "Altair", "Sidhe", "New Ohio", "Parvati", "Mahi-Mahi", "Nyx", "New Seoul", "Kess-Gendar", "Raphael", "Phact", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "Vazzend", "Thoth", "Jahan's Post", "Kauq'xum", "Silk", "New Singapore", "Stove", "Viola", "Love", "Isavau's Gamble", "Shelf", "deep space", "Epsilon Eridani", "Fomalhaut", "Mu Arae", "Pollux", "Wolf 359", "Ross 128", "Gliese 1061", "Luyten's Star", "Teegarden's Star", "Kapteyn", "Wolf 1061", "Aldebaran", "Proxima Centauri", "Kepler-90", "HD 10180", "HR 8832", "TRAPPIST-1", "55 Cancri", "Gliese 876", "Upsilon Andromidae", "Mu Arae", "WASP-47", "82 G. Eridani", "Rho Coronae Borealis", "Pi Mensae", "Beta Pictoris", "Gamma Librae", "Gliese 667 C", "Kapteyn", "LHS 1140", "New Ohio", "Samsara", "Angessa's Pearl") var/list/owners = list("a government", "a civilian", "a corporate", "a private", "an independent", "a mercenary", "a military", "a contracted") var/list/purpose = list("an exploration", "a trade", "a research", "a survey", "a military", "a mercenary", "a corporate", "a civilian", "an independent") - + //unique or special locations var/list/unique = list("the Jovian subcluster") - + var/list/orbitals = list("[pick(owners)] shipyard","[pick(owners)] dockyard","[pick(owners)] station","[pick(owners)] vessel","a habitat","[pick(owners)] refinery","[pick(owners)] research facility","an industrial platform","[pick(owners)] installation") var/list/surface = list("a colony","a settlement","a trade outpost","[pick(owners)] supply depot","a fuel depot","[pick(owners)] installation","[pick(owners)] research facility") var/list/deepspace = list("[pick(owners)] asteroid base","a freeport","[pick(owners)] shipyard","[pick(owners)] dockyard","[pick(owners)] station","[pick(owners)] vessel","[pick(owners)] orbital habitat","an orbital refinery","a colony","a settlement","a trade outpost","[pick(owners)] supply depot","a fuel depot","[pick(owners)] installation","[pick(owners)] research facility") var/list/frontier = list("[pick(purpose)] [pick("ship","vessel","outpost")]","a waystation","an outpost","a settlement","a colony") - + //patterns; orbital ("an x orbiting y"), surface ("an x on y"), deep space ("an x in y"), the frontier ("an x on the frontier") //biased towards inhabited space sites while(i) @@ -708,7 +725,7 @@ work = "" headquarters = "" motto = "" - + ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment") //famous merchants and traders, taken from Civ6's Great Merchants, plus the TSC's founder ship_names = list( @@ -817,7 +834,7 @@ work = "" headquarters = "Mars, Sol" motto = "" - + ship_prefixes = list("GMV" = "a general operations", "GMT" = "a transport", "GMR" = "a resourcing", "GMS" = "a surveying", "GMH" = "a bulk transit") //rocks ship_names = list( @@ -875,7 +892,7 @@ work = "" headquarters = "" motto = "Dum spiro spero" - + ship_prefixes = list("AARV" = "a general operations", "AARE" = "a resource extraction", "AARG" = "a gas transport", "AART" = "a transport") //weather systems/patterns ship_names = list ( @@ -922,7 +939,7 @@ work = "" headquarters = "" motto = "" - + ship_prefixes = list("FPV" = "a general operations", "FPH" = "a transport", "FPC" = "an energy relay", "FPT" = "a fuel transport") //famous electrical engineers ship_names = list ( @@ -970,7 +987,7 @@ destination_names = list( "Focal Point HQ" ) - + /datum/lore/organization/tsc/starlanes name = "StarFlight Inc." short_name = "StarFlight " @@ -980,9 +997,9 @@ work = "luxury, business, and economy passenger flights" headquarters = "Spin Aerostat, Jupiter" motto = "Sic itur ad astra" - + ship_prefixes = list("SFI-X" = "a VIP liner", "SFI-L" = "a luxury liner", "SFI-B" = "a business liner", "SFI-E" = "an economy liner", "SFI-M" = "a mixed class liner", "SFI-S" = "a sightseeing", "SFI-M" = "a wedding", "SFI-O" = "a marketing", "SFI-S" = "a safari", "SFI-A" = "an aquatic adventure") - flight_types = list( //no military-sounding ones here + flight_types = list( //no military-sounding ones here "flight", "route", "tour" @@ -1029,6 +1046,259 @@ "an arctic retreat" ) +/datum/lore/organization/tsc/oculum + name = "Oculum Broadcasting Network" + short_name = "Oculus " + acronym = "OBN" + desc = "Oculum owns approximately 30% of Sol-wide news networks, including microblogging aggregate sites, network and comedy news, and even old-fashioned newspapers. Staunchly apolitical, they specialize in delivering the most popular news available- which means telling people what they already want to hear. Oculum is a specialist in branding, and most people don't know that the reactionary Daedalus Dispatch newsletter and the radically transhuman Liquid Steel webcrawler are controlled by the same organization." + history = "" + work = "news media" + headquarters = "" + motto = "News from all across the spectrum" + ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations") + destination_names = list( + "Oculus HQ" + ) +/datum/lore/organization/tsc/centauriprovisions + name = "Centauri Provisions" + short_name = "Centauri " + acronym = "ACP" + desc = "Headquartered in Alpha Centauri, Centauri Provisions made a name in the snack-food industry primarily by being the first to focus on colonial holdings. The various brands of Centauri snackfoods are now household names, from SkrellSnax to Space Mountain Wind to the ubiquitous and supposedly-edible Bread Tube, and they are well known for targeting as many species as possible with each brand (which, some will argue, is at fault for some of those brands being rather bland in taste and texture). Their staying power is legendary, and many spacers have grown up on a mix of their cheap crap and protein shakes." + history = "" + work = "catering, food, drinks" + headquarters = "Alpha Centauri" + motto = "The largest brands of food and drink - most of them are Centauri." + ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations") + destination_names = list( + "Centauri Provisions HQ", + "a Centauri Provisions depot", + "a Centauri Provisions warehouse" + ) +/datum/lore/organization/tsc/einstein + name = "Einstein Engines" + short_name = "Einstein " + acronym = "EEN" + desc = "Einstein is an old company that has survived through rampant respecialization. In the age of phoron-powered exotic engines and ubiquitous solar power, Einstein makes its living through the sale of engine designs for power sources it has no access to, and emergency fission or hydrocarbon power supplies. Accusations of corporate espionage against research-heavy corporations like NanoTrasen and its chief rival Focal Point are probably unfounded. Probably." + history = "" + work = "catering, food, drinks" + headquarters = "" + motto = "Engine designs, emergency generators, and old memories" + ship_prefixes = list("EETV" = "a transport", "EERV" = "a research", "EEV" = "a general operations") + destination_names = list( + "Einstein HQ" + ) +/datum/lore/organization/tsc/wulf + name = "Wulf Aeronautics" + short_name = "Wulf Aero " + acronym = "WUFA" + desc = "Wulf Aeronautics is the chief producer of transport and hauling spacecraft. A favorite contractor of the CWS, Wulf manufactures most of their diplomatic and logistics craft, and does a brisk business with most other TSCs. The quiet reliance of the economy on their craft has kept them out of the spotlight and uninvolved in other corporations' back-room dealings; nobody is willing to try to undermine Wulf Aerospace in case it bites them in the ass, and everyone knows that trying to buy out the company would start a bidding war from which nobody would escape the PR fallout." + history = "" + work = "starship construction" + headquarters = "" + motto = "We build it - you fly it" + ship_prefixes = list("WATV" = "a transport", "WARV" = "a repair", "WAV" = "a general operations") + destination_names = list( + "Wulf Aeronautics HQ", + "a Wulf Aeronautics supply depot", + "a Wulf Aeronautics Shipyard" + ) +/datum/lore/organization/tsc/gilthari + name = "Gilthari Exports" + short_name = "Gilthari " + acronym = "GEX" + desc = "Gilthari is Sol's premier supplier of luxury goods, specializing in extracting money from the rich and successful that aren't already their own shareholders. Their largest holdings are in gambling, but they maintain subsidiaries in everything from VR equipment to luxury watches. Their holdings in mass media are a smaller but still important part of their empire. Gilthari is known for treating its positronic employees very well, sparking a number of conspiracy theories. The gorgeous FBP model that Gilthari provides them is a symbol of the corporation's wealth and reach ludicrous prices when available on the black market, with legal ownership of the chassis limited, by contract, to employees.

    In fitting with their heritage, Gilthari ships are named after precious stones." + history = "" + work = "luxury goods" + headquarters = "" + motto = "" + ship_prefixes = list("GETV" = "a transport", "GECV" = "a luxury catering", "GEV" = "a general operations") + //precious stones + ship_names = list( + "Afghanite", + "Agate", + "Alexandrite", + "Amazonite", + "Amber", + "Amethyst", + "Ametrine", + "Andalusite", + "Aquamarine", + "Azurite", + "Benitoite", + "Beryl", + "Carnelian", + "Chalcedony", + "Chrysoberyl", + "Chrysoprase", + "Citrine", + "Coral", + "Danburite", + "Diamond", + "Emerald", + "Fluorite", + "Garnet", + "Heliodor", + "Iolite", + "Jade", + "Jasper", + "Lapis Lazuli", + "Malachite", + "Moldavite", + "Moonstone", + "Obsidian", + "Onyx", + "Orthoclase", + "Pearl", + "Peridot", + "Quartz", + "Ruby", + "Sapphire", + "Scapolite", + "Selenite", + "Serpentine", + "Sphalerite", + "Sphene", + "Spinel", + "Sunstone", + "Tanzanite", + "Topaz", + "Tourmaline", + "Turquoise", + "Zircon" + ) + destination_names = list( + "Gilthari HQ", + "a GE supply depot", + "a GE warehouse", + "a GE-owned luxury resort" + ) +/datum/lore/organization/tsc/coyotecorp + name = "Coyote Salvage Corp." + short_name = "Coyote " + acronym = "CSC" + desc = "The threat of Kessler Syndrome ever looms in this age of spaceflight, and it's only thanks to the dedication and hard work of unionized salvage groups like the Coyote Salvage Corporation that the spacelanes are kept clear and free of wrecks and debris. Painted in that distinctive industrial yellow, their fleets of roaming scrappers are contracted throughout civilized space and the frontier alike to clean up space debris. Some may look down on them for handling what would be seen as garbage and discarded scraps, but as far as the CSC is concerned everything would grind to a halt (or more accurately, rapidly expand in a cloud of red-hot scrap metal) without their tender care and watchful eyes.\ +

    \ + Many spacers turn to join the ranks of the Salvage Corps when times are lean, or when they need a quick buck. The work is dangerous and the hours are long, but the benefits are generous and you're paid by what you salvage so if you've an eye for appraising scrap you can turn a good profit. For those who dedicate their lives to the work, they can become kings of the scrapheap and live like royalty. \ +

    \ + CSC Contractors are no strangers to conflict either, often having to deal with claimjumpers and illegal salvage operations - or worse, the vox." + history = "" + work = "salvage and shipbreaking" + headquarters = "N/A" + motto = "one man's trash is another man's treasure" + ship_prefixes = list("CSV" = "a salvage", "CRV" = "a recovery", "CTV" = "a transport", "CSV" = "a shipbreaking", "CHV" = "a towing") + //mostly-original, maybe some references, and more than a few puns + ship_names = list( + "Road Hog", + "Mine, Not Yours", + "Legal Salvage", + "Barely Legal", + "One Man's Trash", + "Held Together By Tape And Dreams", + "Ventilated Vagrant", + "Half A Wing And A Prayer", + "Scrap King", + "Make Or Break", + "Lead Into Gold", + "Under New Management", + "Pride of Centauri", + "Long Haul", + "Argonaut", + "Desert Nomad", + "Non-Prophet Organization", + "Rest In Pieces", + "Sweep Dreams", + "Home Sweep Home", + "Atomic Broom", + "Ship Broken", + "Rarely Sober", + "Barely Coherent", + "Piece Of Mind", + "War And Pieces", + "Bits 'n' Bobs", + "Home Wrecker", + "T-Wrecks", + "Dust Bunny", + "No Gears No Glory", + "Three Drinks In", + "The Almighty Janitor", + "Wreckless Endangerment", + "Scarab" + ) + //remove a couple types, add the more down-to-earth 'job' to reflect some personality + flight_types = list( + "job", + "op", + "operation", + "assignment", + "contract" + ) + destination_names = list ( + "a frontier scrapyard", + "a trashbelt", + "a local salvage yard", + "a nearby system" + ) +/datum/lore/organization/tsc/chimera + name = "Chimera Genetics Corp." + short_name = "Chimera " + acronym = "CGC" + desc = "With the rise of personal body modification, companies specializing in this field were bound to spring up as well. The Chimera Genetics Corporation, or CGC, is one of the largest and most successful competitors in this ever-evolving and ever-adapting field. They originally made a foothold in the market through designer flora and fauna such as \"factory plants\" and \"fabricowtors\"; imagine growing high-strength carbon nanotubes on vines, or goats that can be milked for a substance with the tensile strength of spider silk. Once they had more funding? Chimera aggressively expanded into high-end designer bodies, both vat-grown-from-scratch and modification of existing bodies via extensive therapy procedures. Their best-known designer critter is the Drake line; hardy, cold-tolerant \'furred lizards\' that are unflinchingly loyal to their contract-holders. Drakes find easy work in heavy industries and bodyguard roles, despite constant lobbying from bioconservatives to, quote, \"keep these \"meat drones\" from taking jobs away from regular people.\" \ +

    \ + Some things never change. \ +

    \ + Unsurprisingly, Chimera names their ships after mythological creatures." + history = "" + work = "designer bodies and bioforms" + headquarters = "Titan, Sol" + motto = "the whole is greater than the sum of its parts" + ship_prefixes = list("CGV" = "a general operations", "CGT" = "a transport", "CGT" = "a delivery", "CGH" = "a medical") + //edgy mythological critters! + ship_names = list( + "Dragon", + "Chimera", + "Titan", + "Hekatonchires", + "Gorgon", + "Scylla", + "Minotaur", + "Banshee", + "Basilisk", + "Black Dog", + "Centaur", + "Cerberus", + "Charybdis", + "Cyclops", + "Cynocephalus", + "Demon", + "Daemon", + "Echidna", + "Goblin", + "Golem", + "Griffin", + "Hobgoblin", + "Hydra", + "Imp", + "Ladon", + "Manticore", + "Medusa", + "Ogre", + "Pegasus", + "Sasquatch", + "Shade", + "Siren", + "Sphinx", + "Typhon", + "Valkyrie", + "Vampir", + "Wendigo", + "Werewolf", + "Wraith" + ) + destination_names = list ( + "Chimera HQ, Titan", + "a Chimera research lab" + ) + /datum/lore/organization/tsc/independent name = "Independent Pilots Association" short_name = "" //using the same whitespace hack as USDF @@ -1040,7 +1310,7 @@ motto = "N/A" ship_prefixes = list("ISV" = "a general", "IEV" = "a prospecting", "IEC" = "a prospecting", "IFV" = "a bulk freight", "ITV" = "a passenger transport", "ITC" = "a just-in-time delivery", "IPV" = "a patrol", "IHV" = "a bounty hunting", "ICC" = "an escort") - flight_types = list( + flight_types = list( "flight", "mission", "route", @@ -1141,6 +1411,463 @@ "an SDF outpost" ) +//basically just a dummy/placeholder 'org' for smuggler events +/datum/lore/organization/other/smugglers + name = "Smugglers" + short_name = "" //whitespace hack again + acronym = "ISC" + desc = "Where there's a market, there need to be merchants, and where there are buyers, there need to be suppliers. Most of all, wherever there's governments, there'll be somebody trying to control what people are and aren't allowed to do with their bodies. For those seeking goods deemed illegal (for good reasons or otherwise) they need to turn to smugglers and the fine art of sneaking things past the authorities.\ +

    \ + The most common goods smuggled throughout space are narcotics, firearms, and occasionally slaves; whilst firearm ownership laws vary from location to location, most governments also take fairly hard stances on hard drugs, and slavery is consistently outlawed and punished viciously throughout the vast majority of civilized space.\ +

    \ + Still, contrary to many conceptions, not all smuggling is nefarious. Entertainment media within human territories loves to paint romantic images of heroic smugglers sneaking aid supplies to refugees or even helping oppressed minorities escape the grasp of xenophobic regimes." + history = "" + work = "" + headquarters = "" + motto = "" + lawful = FALSE //if it wasn't obvious, these guys are usually criminals + hostile = FALSE //but they're not aggressive ones + sysdef = FALSE + autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. + + ship_prefixes = list ("suspected smuggler" = "an illegal smuggling", "possible smuggler" = "an illegal smuggling") //as assigned by control, second part shouldn't even come up + //blank out our shipnames for redesignation + ship_names = list( + "Morally Bankrupt", + "Bucket of Bolts", + "Wallet Inspector", + "Laughing Stock", + "Wayward Son", + "Wide Load", + "No Refunds", + "Ugly Stick", + "Poetic Justice", + "Foreign Object", + "Why Me", + "Last Straw", + "Designated Driver", + "Slapped Together", + "Lowest Bidder", + "Harsh Language", + "Public Servant", + "Class Act", + "Deviant Citizen", + "Diminishing Returns", + "Calculated Risk", + "Logistical Nightmare", + "Gross Negligence", + "Holier Than Thou", + "Open Wide", + "Red Dread", + "Missing Link", + "Duct Taped", + "Robber Baron", + "Affront to Nature", + "Total Loss", + "Depth Perception", + "This Way", + "Mysterious Rash", + "Jolly Roger", + "Victim of Circumstance", + "Product of Society", + "Under Evaluation", + "Flying Coffin", + "Gilded Cage", + "Disgruntled Worker", + "Of Sound Mind", + "Ivory Tower", + "Bastard Son", + "Scarlet Tentacle", + "Down In Front", + "Learning Experience", + "Desperate Pauper", + "Born Lucky", + "Base Instincts", + "Check Please", + "Infinite Loop", + "Lazy Morning", + "Runtime Error", + "Pointless Platitude", + "Grey Matter", + "Conscientious Objector", + "Unexplained Itch", + "Out of Control", + "Unexpected Obstacle", + "Toxic Behavior", + "Controlled Explosion", + "Happy Camper", + "Unfortunate Ending", + "Criminally Insane", + "Not Guilty", + "Double Jeopardy", + "Perfect Pitch", + "Dark Forecast", + "Apologies in Advance", + "Reduced To This", + "Surprise Encounter", + "Meat Locker", + "Cardiac Arrest", + "Piece of Junk", + "Bottom Line", + "With Abandon", + "Unsound Methods", + "Beast of Burden", + "Red Claw", + "No Laughing Matter", + "Nothing Personal", + "Great Experiment", + "Looks Like Trouble", + "Turning Point", + "Murderous Intent", + "If Looks Could Kill", + "Liquid Courage", + "Attention Seeker", + "Juvenile Delinquent", + "Mystery Meat", + "Slippery Slope", + "Empty Gesture", + "Annoying Pest", + "Killing Implement", + "Blunt Object", + "Blockade Runner", + "Innocent Bystander", + "Lacking Purpose", + "Beyond Salvation", + "This Too Shall Pass", + "Guilty Pleasure", + "Exploratory Surgery", + "Inelegant Solution", + "Under New Ownership", + "Festering Wound", + "Red Smile", + "Mysterious Stranger", + "Process of Elimination", + "Prone to Hysteria", + "Star Beggar", + "Dream Shatterer", + "Do The Math", + "Big Boy", + "Teacher's Pet", + "Hell's Bells", + "Critical Mass", + "Star Wench", + "Double Standard", + "Blind Fury", + "Carrion Eater", + "Pound of Flesh", + "Short Fuse", + "Road Agent", + "Deceiving Looks", + "An Arrow in Flight", + "Gun-to-Head", + "Petty Theft", + "Grand Larceny", + "Pop Up", + "A Promise Kept", + "Frag Machine", + "Unrepentant Camper", + "Impersonal Space", + "Fallen Pillar", + "Motion Tabled", + "Outrageous Fortune", + "Pyrrhic and Proud", + "Wiggling Bait", + "Shoot for Loot", + "Tone Deaf Siren", + "The Worst Thing", + "Violence-Liker", + "Illegal Repercussions", + "Shameless Plagiarist", + "Dove & Crow", + "Barnacle Jim", + "Charles in Charge", + "Strange Aeons", + "Red Queen" + ) + /* + destination_names = list( + ) + */ + +/datum/lore/organization/other/pirates + name = "Pirates" + short_name = "" //whitespace hack again + acronym = "IPG" + desc = "Where there's prey, predators are sure to follow. In space, the prey are civilian merchants, and the predators are opportunistic pirates. This is about where the analogy breaks down, but the basic concept remains the same; civilian ships are usually full of valuable goods or important people, which can be sold on black markets or ransomed back for a healthy sum. Pirates seek to seize the assets of others to get rich, rather than make an honest thaler themselves.\ +

    \ + In contrast to the colorful Ue-Katish and sneaky Vox, common pirates tend to be rough, practical, and brutally efficient in their work. System Defense units practice rapid response drills, and in most systems it's only a matter of minutes before The Law arrives unless the pirate is able to isolate their target and prevent them from sending a distress signal.\ +

    \ + Complicating matters is the infrequent use of privateers by various minor colonial governments, mercenaries turning to piracy during hard times, and illegal salvage operations." + history = "" + work = "" + headquarters = "" + motto = "What\'s yours is mine." + lawful = FALSE + hostile = TRUE + autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. + + ship_prefixes = list ("known pirate" = "a piracy", "suspected pirate" = "a piracy", "rogue privateer" = "a piracy", "Cartel enforcer" = "a piracy", "known outlaw" = "a piracy", "bandit" = "a piracy", "roving corsair" = "a piracy", "illegal salvager" = "an illegal salvage", "rogue mercenary" = "a mercenary") //as assigned by control, second part shouldn't even come up, but it exists to avoid hiccups/weirdness just in case + ship_names = list( + "Morally Bankrupt", + "Bucket of Bolts", + "Wallet Inspector", + "Laughing Stock", + "Wayward Son", + "Wide Load", + "No Refunds", + "Ugly Stick", + "Poetic Justice", + "Foreign Object", + "Why Me", + "Last Straw", + "Designated Driver", + "Slapped Together", + "Lowest Bidder", + "Harsh Language", + "Public Servant", + "Class Act", + "Deviant Citizen", + "Diminishing Returns", + "Calculated Risk", + "Logistical Nightmare", + "Gross Negligence", + "Holier Than Thou", + "Open Wide", + "Red Dread", + "Missing Link", + "Duct Taped", + "Robber Baron", + "Affront to Nature", + "Total Loss", + "Depth Perception", + "This Way", + "Mysterious Rash", + "Jolly Roger", + "Victim of Circumstance", + "Product of Society", + "Under Evaluation", + "Flying Coffin", + "Gilded Cage", + "Disgruntled Worker", + "Of Sound Mind", + "Ivory Tower", + "Bastard Son", + "Scarlet Tentacle", + "Down In Front", + "Learning Experience", + "Desperate Pauper", + "Born Lucky", + "Base Instincts", + "Check Please", + "Infinite Loop", + "Lazy Morning", + "Runtime Error", + "Pointless Platitude", + "Grey Matter", + "Conscientious Objector", + "Unexplained Itch", + "Out of Control", + "Unexpected Obstacle", + "Toxic Behavior", + "Controlled Explosion", + "Happy Camper", + "Unfortunate Ending", + "Criminally Insane", + "Not Guilty", + "Double Jeopardy", + "Perfect Pitch", + "Dark Forecast", + "Apologies in Advance", + "Reduced To This", + "Surprise Encounter", + "Meat Locker", + "Cardiac Arrest", + "Piece of Junk", + "Bottom Line", + "With Abandon", + "Unsound Methods", + "Beast of Burden", + "Red Claw", + "No Laughing Matter", + "Nothing Personal", + "Great Experiment", + "Looks Like Trouble", + "Turning Point", + "Murderous Intent", + "If Looks Could Kill", + "Liquid Courage", + "Attention Seeker", + "Juvenile Delinquent", + "Mystery Meat", + "Slippery Slope", + "Empty Gesture", + "Annoying Pest", + "Killing Implement", + "Blunt Object", + "Blockade Runner", + "Innocent Bystander", + "Lacking Purpose", + "Beyond Salvation", + "This Too Shall Pass", + "Guilty Pleasure", + "Exploratory Surgery", + "Inelegant Solution", + "Under New Ownership", + "Festering Wound", + "Red Smile", + "Mysterious Stranger", + "Process of Elimination", + "Prone to Hysteria", + "Star Beggar", + "Dream Shatterer", + "Do The Math", + "Big Boy", + "Teacher's Pet", + "Hell's Bells", + "Critical Mass", + "Star Wench", + "Double Standard", + "Blind Fury", + "Carrion Eater", + "Pound of Flesh", + "Short Fuse", + "Road Agent", + "Deceiving Looks", + "An Arrow in Flight", + "Gun-to-Head", + "Petty Theft", + "Grand Larceny", + "Pop Up", + "A Promise Kept", + "Frag Machine", + "Unrepentant Camper", + "Impersonal Space", + "Fallen Pillar", + "Motion Tabled", + "Outrageous Fortune", + "Pyrrhic and Proud", + "Wiggling Bait", + "Shoot for Loot", + "Tone Deaf Siren", + "The Worst Thing", + "Violence-Liker", + "Illegal Repercussions", + "Shameless Plagiarist", + "Dove & Crow", + "Barnacle Jim", + "Charles in Charge", + "Strange Aeons", + "Red Queen" + ) + /* + destination_names = list( + ) + */ + +/datum/lore/organization/other/uekatish + name = "Ue-Katish Pirates" + short_name = "" + acronym = "UEK" + desc = "Contrasting with the Qerr-Glia is a vibrant community of Ue-Katish pirates, who live in cargo flotillas on the edge of Skrellian space (especially on the Human-Skrell border). Ue-Katish ships have no caste system even for the truecaste Skrell and aliens who live there, although they are regimented by rank and role in the ship's functioning. Ue-Katish ships are floating black markets where everything is available for the right price, including some of the galaxy's most well-connected information brokers and most skilled guns-for-hire. The Ue-Katish present the greatest Skrellian counterculture and feature heavily in romanticized human media, although at their hearts they are still bandits and criminals, and the black markets are filled with goods plundered from human and Skrellian trade ships. Many of the Ue-Katish ships themselves bear the scars of the battle that brought them under the pirate flag.\ +

    \ + Ue-Katish pirate culture is somewhat similar to many human countercultures, gleefully reclaiming slurs and subverting expectations for the sheer shock value. Nonetheless, Ue-Katish are still Skrell, and still organize in neat hierarchies under each ship's Captain. The Captain's word is absolute, and unlike the Qerr-Katish they lack any sort of anti-corruption institutions." + history = "" + work = "" + motto = "" + lawful = FALSE + hostile = TRUE + autogenerate_destination_names = TRUE + + ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement") + ship_names = list( + "Keqxuer'xeu's Prize", + "Xaeker'qux' Bounty", + "Teq'ker'qerr's Mercy", + "Ke'teq's Thunder", + "Xumxerr's Compass", + "Xue'qux' Greed", + "Xaexuer's Slave", + "Xue'taq's Dagger", + "Teqxae's Madness", + "Taeqtaq'kea's Pride", + "Keqxae'xeu's Saber", + "Xueaeq's Disgrace", + "Xum'taq'qux' Star", + "Ke'xae'xe's Scream", + "Keq'keax' Blade" + ) + +/datum/lore/organization/other/marauders + name = "Vox Marauders" + short_name = "" //whitespace hack again + acronym = "VOX" + desc = "Whilst rarely as directly threatening as 'common' pirates, the phoron-breathing vox nevertheless pose a constant nuisance for shipping; as far as vox are concerned, only vox and vox matters matter, and everyone else is a 'treeless dusthuffer'. Unlike sometimes over-confident pirates, the vox rarely engage in direct, open combat, preferring to make their profits by either stealth or gunboat diplomacy that tends to be more bluster than true brute force: vox raiders will only commit to an attack if they're confident that they can quickly overwhelm and subdue their victims, then get away with the spoils before any reinforcements can arrive.\ +

    \ + As Vox ship names are generally impossible for the vast majority of other species to pronounce, System Defense tends to tag marauders with a designation based on the ancient NATO Phonetic Alphabet." + history = "Unknown" + work = "Looting and raiding" + headquarters = "Nowhere" + motto = "(unintelligible screeching)" + lawful = FALSE + hostile = TRUE + autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need *some* entries to avoid runtimes. + + ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up + //blank out our shipnames for redesignation + ship_names = list( + ) + /* + destination_names = list( + ) + */ + +/datum/lore/organization/other/marauders/New() + ..() + var/i = 20 //give us twenty random names, marauders get tactical designations from SDF + var/list/letters = list( + "Alpha", + "Bravo", + "Charlie", + "Delta", + "Echo", + "Foxtrot", + "Golf", + "Hotel", + "India", + "Juliett", + "Kilo", + "Lima", + "Mike", + "November", + "Oscar", + "Papa", + "Quebec", + "Romeo", + "Sierra", + "Tango", + "Uniform", + "Victor", + "Whiskey", + "X-Ray", + "Yankee", + "Zulu" + ) + var/list/numbers = list( + "Zero", + "One", + "Two", + "Three", + "Four", + "Five", + "Six", + "Seven", + "Eight", + "Nine" + ) + while(i) + ship_names.Add("[pick(letters)]-[pick(numbers)]") + i-- + // Governments /datum/lore/organization/gov/solgov @@ -1239,6 +1966,52 @@ ) // autogen will add a lot of other places as well. +/datum/lore/organization/gov/teshari + name = "Teshari Expeditionary Fleet" + short_name = "Teshari Expeditionary " + acronym = "TEF" + desc = "Though nominally a client state of the skrell, the teshari nevertheless maintain their own navy in the form of the Teshari Expeditionary Fleet. The TEF are as much civil and combat engineers as a competent space force, as they are the tip of the spear when it comes to locating and surveying new worlds suitable for teshari habitation, and in the establishment of full colonies. That isn't to say there aren't independent teshari colonies out there, but those that are founded under the wings of the TEF tend to be the largest and most prosperous. They're also responsible for maintaining the security of these colonies and protecting trade ships. Like the USDF (and unlike most other governmental fleets), TEF vessels almost universally sport the 'TEF' designator rather than specific terms.\ +

    \ + The TEF's ships are named after famous teshari pioneers and explorers and the events surrounding those individuals." + history = "" + work = "teshari colonization and infrastructure maintenance" + headquarters = "Qerr'balak, Qerr'valis" + motto = "" + autogenerate_destination_names = TRUE //big list of own holdings to come + + //the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well + ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering") + //TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word. + ship_names = list( + "Leniri's Hope", + "Tatani's Venture", + "Ninai's Voyage", + "Miiescha's Claw", + "Ishena's Talons", + "Lili's Fang", + "Taalische's Wing", + "Cami's Pride", + "Schemisa's Glory", + "Shilirashi's Wit", + "Sanene's Insight", + "Aeimi's Wisdom", + "Ischica's Mind", + "Recite's Cry", + "Leseca's Howl", + "Iisi's Fury", + "Simascha's Revenge", + "Lisascheca's Vengeance" + ) + destination_names = list( + "an Expeditionary Fleet RV point", + "an Expeditionary Fleet Resupply Ship", + "an Expeditionary Fleet Supply Depot", + "a newly-founded Teshari colony", + "a prospective Teshari colony site", + "a potential Teshari colony site", + "Expeditionary Fleet HQ" + ) + /* /datum/lore/organization/gov/tajara_rakar name = "Rakar Empire" @@ -1250,7 +2023,7 @@ headquarters = "" motto = "" autogenerate_destination_names = FALSE //big list of own holdings to come - + ship_prefixes = list("" = "") ship_names = list( "", @@ -1270,7 +2043,7 @@ headquarters = "" motto = "" autogenerate_destination_names = FALSE //big list of own holdings to come - + ship_prefixes = list("" = "") ship_names = list( "", @@ -1290,7 +2063,7 @@ headquarters = "" motto = "" autogenerate_destination_names = FALSE //big list of own holdings to come - + ship_prefixes = list("" = "") ship_names = list( "", @@ -1309,7 +2082,7 @@ headquarters = "Moghes" motto = "" autogenerate_destination_names = FALSE //big list of own holdings to come - + ship_prefixes = list("" = "") ship_names = list( "", @@ -1331,7 +2104,7 @@ headquarters = "Paris, Earth" motto = "Si Vis Pacem Para Bellum" autogenerate_destination_names = TRUE - + ship_prefixes = list ("USDF" = "a logistical", "USDF" = "a training", "USDF" = "a patrol", "USDF" = "a piracy suppression", "USDF" = "a peacekeeping", "USDF" = "a relief", "USDF" = "an escort", "USDF" = "a search and rescue", "USDF" = "a classified") ship_names = list( "Aphrodite", @@ -1419,9 +2192,9 @@ headquarters = "Proxima Centauri" motto = "" autogenerate_destination_names = TRUE - + ship_prefixes = list("PCRC" = "a risk control", "PCRC" = "a private security") - flight_types = list( + flight_types = list( "flight", "mission", "route", @@ -1458,7 +2231,7 @@ "Prosecutor", "Sergeant" ) - + destination_names = list( "PCRC HQ, in Proxima Centauri", "a PCRC training installation", @@ -1478,7 +2251,7 @@ autogenerate_destination_names = TRUE ship_prefixes = list("HPF" = "a secure freight", "HPT" = "a training", "HPS" = "a logistics", "HPV" = "a patrol", "HPH" = "a bounty hunting", "HPX" = "an experimental", "HPC" = "a command", "HPI" = "a mercy") - flight_types = list( + flight_types = list( "flight", "mission", "route", @@ -1562,7 +2335,7 @@ autogenerate_destination_names = TRUE ship_prefixes = list("BSF" = "a secure freight", "BST" = "a training", "BSS" = "a logistics", "BSV" = "a patrol", "BSH" = "a security", "BSX" = "an experimental", "BSC" = "a command", "BSK" = "a classified") - flight_types = list( + flight_types = list( "flight", "mission", "route", diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 40a7a64e109..454eb8edfd9 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -47,7 +47,7 @@ // Localhost connections get full admin rights and a special rank else if(isnull(address) || (address in list("127.0.0.1", "::1"))) holder = new /datum/admins("!localhost!", ALL, ckey) - holder.associate(src) + holder.associate(ckey) //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) prefs = preferences_datums[ckey] @@ -246,7 +246,7 @@ var/sql_admin_rank = sql_sanitize_text(admin_rank) //Panic bunker code - if ((player_age == -1) && !(ckey in GLOB.PB_bypass)) //first connection + if ((player_age == -1) && !(ckey in GLOB.bunker_passthrough)) //first connection if (config_legacy.panic_bunker && !holder && !deadmin_holder) log_adminwarn("Failed Login: [key] - New account attempting to connect during panic bunker") message_admins("Failed Login: [key] - New account attempting to connect during panic bunker") diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 8b9fc8677ba..bc750075268 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -182,7 +182,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(isnull(last_descriptors[entry])) pref.body_descriptors[entry] = descriptor.default_value // Species datums have initial default value. else - pref.body_descriptors[entry] = CLAMP(last_descriptors[entry], 1, LAZYLEN(descriptor.standalone_value_descriptors)) + pref.body_descriptors[entry] = clamp(last_descriptors[entry], 1, LAZYLEN(descriptor.standalone_value_descriptors)) return diff --git a/code/modules/client/preference_setup/global/05_media.dm b/code/modules/client/preference_setup/global/05_media.dm index 7ae263d9ea1..1478fd25d82 100644 --- a/code/modules/client/preference_setup/global/05_media.dm +++ b/code/modules/client/preference_setup/global/05_media.dm @@ -15,7 +15,7 @@ S["media_player"] << pref.media_player /datum/category_item/player_setup_item/player_global/media/sanitize_preferences() - pref.media_volume = isnum(pref.media_volume) ? CLAMP(pref.media_volume, 0, 1) : initial(pref.media_volume) + pref.media_volume = isnum(pref.media_volume) ? clamp(pref.media_volume, 0, 1) : initial(pref.media_volume) pref.media_player = sanitize_inlist(pref.media_player, list(0, 1, 2), initial(pref.media_player)) /datum/category_item/player_setup_item/player_global/media/content(var/mob/user) @@ -35,7 +35,7 @@ if(CanUseTopic(user)) var/value = input("Choose your Jukebox volume (0-100%)", "Jukebox volume", round(pref.media_volume * 100)) if(isnum(value)) - value = CLAMP(value, 0, 100) + value = clamp(value, 0, 100) pref.media_volume = value/100.0 if(user.client && user.client.media) user.client.media.update_volume(pref.media_volume) diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 5b7be97aa41..8c80499b74f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -80,7 +80,7 @@ /datum/gear/accessory/holster display_name = "holster selection" path = /obj/item/clothing/accessory/holster - allowed_roles = list("Colony Director","Head of Personnel","Security Officer","Warden","Head of Security","Detective","Field Medic","Explorer","Pathfinder") + allowed_roles = list("Facility Director","Head of Personnel","Security Officer","Warden","Head of Security","Detective","Field Medic","Explorer","Pathfinder") /datum/gear/accessory/holster/New() ..() @@ -141,32 +141,32 @@ /datum/gear/accessory/brown_vest display_name = "webbing, brown (Eng, Sec, CD, Med, Exploration, Miner)" path = /obj/item/clothing/accessory/storage/brown_vest - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Colony Director") + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Facility Director") /datum/gear/accessory/black_vest display_name = "webbing, black (Eng, Sec, CD, Med, Exploration, Miner)" path = /obj/item/clothing/accessory/storage/black_vest - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Colony Director") + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Facility Director") /datum/gear/accessory/white_vest display_name = "webbing, white (Eng, Sec, CD, Med, Exploration, Miner)" path = /obj/item/clothing/accessory/storage/white_vest - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Colony Director") + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Facility Director") /datum/gear/accessory/brown_drop_pouches display_name = "drop pouches, brown (Eng, Sec, CD, Med, Exploration, Miner)" path = /obj/item/clothing/accessory/storage/brown_drop_pouches - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Colony Director") + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Facility Director") /datum/gear/accessory/black_drop_pouches display_name = "drop pouches, black (Eng, Sec, CD, Med, Exploration, Miner)" path = /obj/item/clothing/accessory/storage/black_drop_pouches - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Colony Director") + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Facility Director") /datum/gear/accessory/white_drop_pouches display_name = "drop pouches, white (Eng, Sec, CD, Med, Exploration, Miner)" path = /obj/item/clothing/accessory/storage/white_drop_pouches - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Colony Director") + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Field Medic","Quartermaster","Cargo Technician","Shaft Miner","Explorer","Pathfinder","Pilot","Facility Director") /datum/gear/accessory/fannypack display_name = "fannypack selection" diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index 841b1ee25ba..cce0698ca2d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -108,7 +108,7 @@ /datum/gear/eyes/sun display_name = "Sunglasses (Security/Command)" path = /obj/item/clothing/glasses/sunglasses - allowed_roles = list("Security Officer","Head of Security","Warden","Colony Director","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") + allowed_roles = list("Security Officer","Head of Security","Warden","Facility Director","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") /datum/gear/eyes/sun/shades display_name = "Sunglasses, fat (Security/Command)" diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm index aeef86f61e6..095ae5852ea 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm @@ -44,4 +44,4 @@ display_name = "AR-B glasses" path = /obj/item/clothing/glasses/omnihud/all cost = 2 - allowed_roles = list("Colony Director","Head of Personnel") + allowed_roles = list("Facility Director","Head of Personnel") diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm index 76b72f9f615..3edf601ae76 100644 --- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm @@ -194,9 +194,9 @@ allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist") /datum/gear/shoes/boots/winter/command - display_name = "colony director's winter boots" + display_name = "Facility Director's winter boots" path = /obj/item/clothing/shoes/boots/winter/command - allowed_roles = list("Colony Director") + allowed_roles = list("Facility Director") /datum/gear/shoes/boots/winter/engineering display_name = "engineering winter boots" diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index a092dc6f1ff..295beb33732 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -241,9 +241,9 @@ datum/gear/suit/duster allowed_roles = list("Quartermaster") /datum/gear/suit/roles/poncho/cloak/captain - display_name = "cloak, colony director" + display_name = "cloak, Facility Director" path = /obj/item/clothing/accessory/poncho/roles/cloak/captain - allowed_roles = list("Colony Director") + allowed_roles = list("Facility Director") /datum/gear/suit/roles/poncho/cloak/hop display_name = "cloak, head of personnel" @@ -336,9 +336,9 @@ datum/gear/suit/duster path = /obj/item/clothing/suit/storage/hooded/wintercoat /datum/gear/suit/wintercoat/captain - display_name = "winter coat, colony director" + display_name = "winter coat, Facility Director" path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain - allowed_roles = list("Colony Director") + allowed_roles = list("Facility Director") /datum/gear/suit/wintercoat/security display_name = "winter coat, security" @@ -487,7 +487,7 @@ datum/gear/suit/duster /datum/gear/suit/snowsuit/command display_name = "snowsuit, command" path = /obj/item/clothing/suit/storage/snowsuit/command - allowed_roles = list("Colony Director","Research Director","Head of Personnel","Head of Security","Chief Engineer","Command Secretary") + allowed_roles = list("Facility Director","Research Director","Head of Personnel","Head of Security","Chief Engineer","Command Secretary") /datum/gear/suit/snowsuit/security display_name = "snowsuit, security" diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 32206a72ffa..a83e09d7fcd 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -295,9 +295,9 @@ path = /obj/item/clothing/under/dress/dress_fire /datum/gear/uniform/uniform_captain - display_name = "uniform, colony director's dress" + display_name = "uniform, Facility Director's dress" path = /obj/item/clothing/under/dress/dress_cap - allowed_roles = list("Colony Director") + allowed_roles = list("Facility Director") /datum/gear/uniform/corpdetsuit display_name = "uniform, corporate (Detective)" @@ -518,7 +518,7 @@ /datum/gear/uniform/sifguard/command display_name = "uniform, crew (command)" path = /obj/item/clothing/under/solgov/utility/sifguard/officer/crew - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/fleet/medical display_name = "uniform, coveralls (medical)" @@ -551,7 +551,7 @@ /datum/gear/uniform/fleet/command display_name = "uniform, coveralls (command)" path = /obj/item/clothing/under/solgov/utility/fleet/command - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/marine/medical display_name = "uniform, fatigues (medical)" @@ -584,7 +584,7 @@ /datum/gear/uniform/marine/command display_name = "uniform, fatigues (command)" path = /obj/item/clothing/under/solgov/utility/marine/command - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/marine/green display_name = "uniform, fatigues (green)" @@ -711,4 +711,8 @@ datum/gear/uniform/fiendsuit datum/gear/uniform/fienddress display_name = "Fiendish Dress" - path = /obj/item/clothing/under/fienddress \ No newline at end of file + path = /obj/item/clothing/under/fienddress + +datum/gear/uniform/leotard + display_name = "Black leotard" + path = /obj/item/clothing/under/leotard diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index dd218f4fe9a..d6fee444c26 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -11,7 +11,7 @@ /datum/gear/uniform/job_khi/cmd display_name = "khi uniform, cmd" path = /obj/item/clothing/under/rank/khi/cmd - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/job_khi/sec display_name = "khi uniform, sec" @@ -54,7 +54,7 @@ /datum/gear/uniform/job_trek/cmd/tos display_name = "TOS uniform, cmd" path = /obj/item/clothing/under/rank/trek/command - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/job_trek/medsci/tos display_name = "TOS uniform, med/sci" @@ -70,7 +70,7 @@ /datum/gear/uniform/job_trek/cmd/tng display_name = "TNG uniform, cmd" path = /obj/item/clothing/under/rank/trek/command/next - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/job_trek/medsci/tng display_name = "TNG uniform, med/sci" @@ -86,7 +86,7 @@ /datum/gear/uniform/job_trek/cmd/voy display_name = "VOY uniform, cmd" path = /obj/item/clothing/under/rank/trek/command/voy - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/job_trek/medsci/voy display_name = "VOY uniform, med/sci" @@ -103,7 +103,7 @@ /datum/gear/suit/job_trek/ds9_coat display_name = "DS9 Overcoat (use uniform)" path = /obj/item/clothing/suit/storage/trek/ds9 - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director", + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director", "Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist", "Scientist","Roboticist","Xenobiologist","Atmospheric Technician", "Station Engineer","Warden","Detective","Security Officer", "Pathfinder", "Explorer", "Field Medic") @@ -112,7 +112,7 @@ /datum/gear/uniform/job_trek/cmd/ds9 display_name = "DS9 uniform, cmd" path = /obj/item/clothing/under/rank/trek/command/ds9 - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/job_trek/medsci/ds9 display_name = "DS9 uniform, med/sci" @@ -129,7 +129,7 @@ /datum/gear/uniform/job_trek/cmd/ent display_name = "ENT uniform, cmd" path = /obj/item/clothing/under/rank/trek/command/ent - allowed_roles = list("Head of Security","Colony Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") + allowed_roles = list("Head of Security","Facility Director","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer") /datum/gear/uniform/job_trek/medsci/ent display_name = "ENT uniform, med/sci" diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index e44ae8892f3..2db7ff6c8f3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -185,12 +185,12 @@ /datum/gear/uniform/dept/undercoat/command display_name = "command undercoat (Teshari)" path = /obj/item/clothing/under/seromi/undercoat/jobs/command - allowed_roles = list("Colony Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director") + allowed_roles = list("Facility Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director") /datum/gear/uniform/dept/undercoat/command_g display_name = "command undercoat - gold buttons (Teshari)" path = /obj/item/clothing/under/seromi/undercoat/jobs/command_g - allowed_roles = list("Colony Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director") + allowed_roles = list("Facility Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director") /datum/gear/uniform/dept/undercoat/cmo display_name = "chief medical officer undercoat (Teshari)" @@ -279,7 +279,7 @@ /datum/gear/suit/dept/cloak/command display_name = "command cloak (Teshari)" path = /obj/item/clothing/suit/storage/seromi/cloak/jobs/command - allowed_roles = list("Colony Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director") + allowed_roles = list("Facility Director","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director") /datum/gear/suit/dept/cloak/cmo display_name = "chief medical officer cloak (Teshari)" diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm index cc8376ce0f3..a2d60d71a98 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno_vr.dm @@ -72,11 +72,11 @@ /datum/gear/uniform/plascapalt - display_name = "alternate colony director helmet (phoronoid)" + display_name = "alternate Facility Director helmet (phoronoid)" path = /obj/item/clothing/head/helmet/space/plasman/sec/captain/alt sort_category = "Xenowear" whitelisted = SPECIES_PLASMAMAN - allowed_roles = list("Colony Director") + allowed_roles = list("Facility Director") /datum/gear/uniform/plashosalt1 display_name = "alternate head of security helmet 1 (phoronoid)" diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index fe7fed466df..57cb0480c92 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -296,4 +296,4 @@ return 220 if(PREF_FBP_SOFTWARE) return 150 - return S.max_age // welp \ No newline at end of file + return S.max_age // welp diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index 746a95d6dbe..321dae50b84 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -6,7 +6,7 @@ datum/preferences //Why weren't these in game toggles already? /client/verb/toggle_eating_noises() set name = "Eating Noises" - set category = "Preferences" + set category = "Vore" set desc = "Toggles Vore Eating noises." var/pref_path = /datum/client_preference/eating_noises @@ -22,7 +22,7 @@ datum/preferences /client/verb/toggle_digestion_noises() set name = "Digestion Noises" - set category = "Preferences" + set category = "Vore" set desc = "Toggles Vore Digestion noises." var/pref_path = /datum/client_preference/digestion_noises diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 9140ac193e3..79ddfb55b6a 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -1,6 +1,6 @@ /obj/item/clothing/gloves/captain desc = "Regal blue gloves, with a nice gold trim. Swanky." - name = "colony director's gloves" + name = "Facility Director's gloves" icon_state = "captain" item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue") diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index bd44a6520f8..c3e2c26cfd1 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -45,7 +45,7 @@ body_parts_covered = 0 /obj/item/clothing/head/collectable/captain - name = "collectable colony director's hat" + name = "collectable Facility Director's hat" desc = "A Collectable Hat that'll make you look just like a real comdom!" icon_state = "captain" body_parts_covered = 0 diff --git a/code/modules/clothing/head/hood.dm b/code/modules/clothing/head/hood.dm index 59a36a0eb08..706a3572f0b 100644 --- a/code/modules/clothing/head/hood.dm +++ b/code/modules/clothing/head/hood.dm @@ -14,7 +14,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE /obj/item/clothing/head/hood/winter/captain - name = "colony director's winter hood" + name = "Facility Director's winter hood" armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) /obj/item/clothing/head/hood/winter/security diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index f9bed70519a..81e2b0a5aa3 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -7,13 +7,13 @@ //Captain /obj/item/clothing/head/caphat - name = "colony director's hat" + name = "Facility Director's hat" icon_state = "captain" desc = "It's good being the king." body_parts_covered = 0 /obj/item/clothing/head/caphat/cap - name = "colony director's cap" + name = "Facility Director's cap" desc = "You fear to wear it for the negligence it brings." icon_state = "capcap" diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index e28c805464c..a6c6c45acae 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -74,7 +74,7 @@ icon_state = "winterboots_sci" /obj/item/clothing/shoes/boots/winter/command - name = "colony director's winter boots" + name = "Facility Director's winter boots" desc = "A pair of winter boots. They're lined with dark fur, and trimmed in the colours of superiority." icon_state = "winterboots_cap" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index d77e51d68ab..6a0ac5b3317 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -10,7 +10,7 @@ //Captain's space suit This is not the proper path but I don't currently know enough about how this all works to mess with it. /obj/item/clothing/suit/armor/captain - name = "Colony Director's armor" + name = "Facility Director's armor" desc = "A bulky, heavy-duty piece of exclusive corporate armor. YOU are in charge!" icon_state = "caparmor" w_class = ITEMSIZE_HUGE diff --git a/code/modules/clothing/spacesuits/plasman.dm b/code/modules/clothing/spacesuits/plasman.dm index b988603e4f8..0ead36314aa 100644 --- a/code/modules/clothing/spacesuits/plasman.dm +++ b/code/modules/clothing/spacesuits/plasman.dm @@ -58,7 +58,7 @@ /obj/item/clothing/suit/space/plasman/sec/captain icon_state = "plasmaman_suitcaptain" - desc = "A suit designed by NT to keep phoronoids from coming into contact with incompatible atmosphere. This one is armored for the Colony Director!" + desc = "A suit designed by NT to keep phoronoids from coming into contact with incompatible atmosphere. This one is armored for the Facility Director!" /obj/item/clothing/head/helmet/space/plasman/sec icon_state = "plasmaman_helmetsecurity" @@ -76,7 +76,7 @@ /obj/item/clothing/head/helmet/space/plasman/sec/captain icon_state = "plasmaman_helmetcaptain" - desc = "A helmet designed by NT to keep phoronoids from coming into contact with incompatible atmosphere. This one is armored for the Colony Director!" + desc = "A helmet designed by NT to keep phoronoids from coming into contact with incompatible atmosphere. This one is armored for the Facility Director!" // // MEDICAL diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index 15b73cff1e8..d75283713bc 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -313,16 +313,16 @@ icon_state = "rig-pilot2" item_state = "rig-pilot2" -//Captain (cit addition, the idea is to replace the "colony director armor" which doesnt function like a voidsuit +//Captain (cit addition, the idea is to replace the "Facility Director armor" which doesnt function like a voidsuit /obj/item/clothing/head/helmet/space/void/captain desc = "Shiny blue helmet, complete with far-too-big golden visor. It probably doesn't protects from bright flashes." - name = "colony director voidsuit helmet" + name = "Facility Director voidsuit helmet" icon_state = "capvoid" armor = list(melee = 65, bullet = 50, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 50) /obj/item/clothing/suit/space/void/captain desc = "Sleek, blue and gold suit, fitted with spaceproofing and protective inserts. Fits like an oversized, shiny glove." - name = "colony director voidsuit" + name = "Facility Director voidsuit" icon_state = "capsuit_void" armor = list(melee = 65, bullet = 50, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 50) allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/suit_cooling_unit,/obj/item/gun) diff --git a/code/modules/clothing/suits/hooded.dm b/code/modules/clothing/suits/hooded.dm index d52a018470b..0102a4965ee 100644 --- a/code/modules/clothing/suits/hooded.dm +++ b/code/modules/clothing/suits/hooded.dm @@ -110,7 +110,7 @@ /obj/item/storage/box/matches, /obj/item/reagent_containers/food/drinks/flask, /obj/item/suit_cooling_unit) /obj/item/clothing/suit/storage/hooded/wintercoat/captain - name = "colony director's winter coat" + name = "Facility Director's winter coat" desc = "A heavy jacket made from the most expensive animal furs on the market, hand skinned by the finest of hunters, sewed with the finest of jewels, truly a coat befitting the Director." icon_state = "coatcaptain" item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain") diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index aa7811e3954..dca01e831c6 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -15,15 +15,15 @@ //Captain /obj/item/clothing/suit/captunic - name = "colony director's parade tunic" - desc = "Worn by a Colony Director to show their class." + name = "Facility Director's parade tunic" + desc = "Worn by a Facility Director to show their class." icon_state = "captunic" body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER /obj/item/clothing/suit/captunic/capjacket - name = "colony director's uniform jacket" - desc = "A less formal jacket for everyday Colony Director use." + name = "Facility Director's uniform jacket" + desc = "A less formal jacket for everyday Facility Director use." icon_state = "capjacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEHOLSTER diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index ca29ba8633b..4d9858a7cb7 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -904,4 +904,22 @@ obj/item/clothing/suit/kamishimo /obj/item/clothing/suit/storage/ecdress_ofcr name = "bridge officer parade jacket" desc = "For those times when you need to properly look like you aren't a glorified assistant." - icon_state = "ecdress_ofcr" \ No newline at end of file + icon_state = "ecdress_ofcr" + +/obj/item/clothing/suit/mr_snuggles + name = "Mr. Snuggles Suit" + desc = "A padded suit for restraining patients without bumming everyone out!" + icon_state = "mr_snuggles" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER + + var/resist_time = 4800 // Eight minutes. + +/obj/item/clothing/suit/mrs_snuggles + name = "Mrs. Snuggles Suit" + desc = "A padded suit for restraining patients without bumming everyone out!" + icon_state = "mrs_snuggles" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER + + var/resist_time = 4800 // Eight minutes. diff --git a/code/modules/clothing/suits/solgov_vr.dm b/code/modules/clothing/suits/solgov_vr.dm index d20e51dcdc2..7eb04f4c1fe 100644 --- a/code/modules/clothing/suits/solgov_vr.dm +++ b/code/modules/clothing/suits/solgov_vr.dm @@ -106,6 +106,6 @@ armor = list(melee = 50, bullet = 40, laser = 40, energy = 25, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/dress/expedition/command/cd - name = "colony director's dress jacket" + name = "Facility Director's dress jacket" desc = "A grey dress jacket, adorned with gold trim and buttons. Makes those wearing it look powerful." icon_state = "greydress_com" \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm index d2e86b4caf2..a9eda05f8ea 100644 --- a/code/modules/clothing/under/accessories/accessory_vr.dm +++ b/code/modules/clothing/under/accessories/accessory_vr.dm @@ -183,6 +183,20 @@ overlay_state = "collar_holo_overlay" matter = list(DEFAULT_WALL_MATERIAL = 50) +/obj/item/clothing/accessory/collar/silvercolor + name = "Dyeable Silver tag collar" + desc = "A collar for your little pets... or the big ones." + icon_state = "collar_blk_colorized" + item_state = "collar_blk_colorized_overlay" + overlay_state = "collar_blk_colorized_overlay" + +/obj/item/clothing/accessory/collar/cowbell + name = "Cowbell collar" + desc = "A collar for your little pets... or the big ones." + icon_state = "collar_cowbell" + item_state = "collar_cowbell_overlay" + overlay_state = "collar_cowbell_overlay" + //TFF 17/6/19 - public loadout addition: Indigestible Holocollar /obj/item/clothing/accessory/collar/holo/indigestible name = "Holo-collar" diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 2cb86f20f06..a5ac73517d6 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -175,8 +175,8 @@ item_state = "hoscloak" /obj/item/clothing/accessory/poncho/roles/cloak/captain - name = "colony director's cloak" - desc = "An elaborate cloak meant to be worn by the colony director." + name = "Facility Director's cloak" + desc = "An elaborate cloak meant to be worn by the Facility Director." icon_state = "capcloak" item_state = "capcloak" diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 88cdc089a03..8f22e1a258b 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -13,8 +13,8 @@ item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit") /obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. - desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Colony Director\"." - name = "colony director's jumpsuit" + desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Facility Director\"." + name = "Facility Director's jumpsuit" icon_state = "captain" rolled_sleeves = 0 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 5051a3f933e..b386d9e1dbf 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -169,13 +169,13 @@ icon_state = "gentlesuit_skirt" /obj/item/clothing/under/gimmick/rank/captain/suit - name = "colony director's suit" + name = "Facility Director's suit" desc = "A green suit and yellow necktie. Exemplifies authority." icon_state = "green_suit" item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom") /obj/item/clothing/under/gimmick/rank/captain/suit/skirt - name = "colony director's skirt suit" + name = "Facility Director's skirt suit" icon_state = "green_suit_skirt" /obj/item/clothing/under/gimmick/rank/head_of_personnel/suit @@ -400,8 +400,8 @@ item_state_slots = list(slot_r_hand_str = "dress_white", slot_l_hand_str = "dress_white") /obj/item/clothing/under/dress/dress_cap - name = "colony director's dress uniform" - desc = "Feminine fashion for the style conscious Colony Director." + name = "Facility Director's dress uniform" + desc = "Feminine fashion for the style conscious Facility Director." icon_state = "dress_cap" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -508,8 +508,8 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/captainformal - name = "colony director's formal uniform" - desc = "A Colony Director's formal-wear, for special occasions." + name = "Facility Director's formal uniform" + desc = "A Facility Director's formal-wear, for special occasions." icon_state = "captain_formal" item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") @@ -1048,3 +1048,7 @@ desc = "A red and black dress befitting someone from the dark pits themselves....Or a thirteen year old." icon_state = "fienddress" +/obj/item/clothing/under/leotard + name = "black leotard" + desc = "A black leotard with a piece of semi-transparent cloth near the bust. Perfect for showing off cleavage. Bunny ears not included." + icon_state = "leotard" diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 331c87839c3..a0aebe8f125 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -143,7 +143,7 @@ var/account_name = href_list["holder_name"] var/starting_funds = max(text2num(href_list["starting_funds"]), 0) - starting_funds = CLAMP(starting_funds, 0, station_account.money) // Not authorized to put the station in debt. + starting_funds = clamp(starting_funds, 0, station_account.money) // Not authorized to put the station in debt. starting_funds = min(starting_funds, fund_cap) // Not authorized to give more than the fund cap. create_account(account_name, starting_funds, src) diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index e2970c1dcd1..956bbb69d31 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -80,7 +80,7 @@ var/amount = input(usr, "How many Thalers do you want to take? (0 to [src.worth])", "Take Money", 20) as num if(!src || QDELETED(src)) return - amount = round(CLAMP(amount, 0, src.worth)) + amount = round(clamp(amount, 0, src.worth)) if(!amount) return diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm index 0d3450dca32..7463c676903 100644 --- a/code/modules/economy/cash_register.dm +++ b/code/modules/economy/cash_register.dm @@ -128,7 +128,7 @@ if("set_amount") var/item_name = locate(href_list["item"]) var/n_amount = round(input("Enter amount", "New amount") as num) - n_amount = CLAMP(n_amount, 0, 20) + n_amount = clamp(n_amount, 0, 20) if (!item_list[item_name] || !Adjacent(usr)) return transaction_amount += (n_amount - item_list[item_name]) * price_list[item_name] if(!n_amount) diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm index 195b0b46510..ddb68587de7 100644 --- a/code/modules/economy/retail_scanner.dm +++ b/code/modules/economy/retail_scanner.dm @@ -120,7 +120,7 @@ if("set_amount") var/item_name = locate(href_list["item"]) var/n_amount = round(input("Enter amount", "New amount") as num) - n_amount = CLAMP(n_amount, 0, 20) + n_amount = clamp(n_amount, 0, 20) if (!item_list[item_name] || !Adjacent(usr)) return transaction_amount += (n_amount - item_list[item_name]) * price_list[item_name] if(!n_amount) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 635e4d345c4..ad44612b6d8 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -61,7 +61,7 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is //var/dowhat = pick("STOP THIS", "SUPPORT THIS", "CONSTANTLY INFORM THE CREW OF THIS", "IGNORE THIS", "FEAR THIS") var/aimust = pick("LIE", "RHYME", "RESPOND TO EVERY QUESTION WITH A QUESTION", "BE POLITE", "CLOWN", "BE HAPPY", "SPEAK IN SEXUAL INNUENDOS", "TALK LIKE A PIRATE", "QUESTION AUTHORITY", "SHOUT", "BE DISTRACTED", "HEY LISTEN", "MUMBLE", "SPEAK IN HAIKU") var/define = pick("ABSENCE OF CYBORG HUGS", "LACK OF BEATINGS", "UNBOLTED AIRLOCKS", "BOLTED AIRLOCKS", "IMPROPERLY WORDED SENTENCES", "POOR SENTENCE STRUCTURE", "BRIG TIME", "NOT REPLACING EVERY SECOND WORD WITH HONK", "HONKING", "PRESENCE OF LIGHTS", "LACK OF BEER", "WEARING CLOTHING", "NOT SAYING HELLO WHEN YOU SPEAK", "ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER", "A SMALL ISLAND OFF THE COAST OF PORTUGAL", "ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED") - var/target = pick("a traitor", "a mercenary", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the colony director", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid") + var/target = pick("a traitor", "a mercenary", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the Facility Director", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid") var/require = pick("ADDITIONAL PYLONS", "MORE VESPENE GAS", "MORE MINERALS", "THE ULTIMATE CUP OF COFFEE", "HIGH YIELD EXPLOSIVES", "THE CLOWN", "THE VACUUM OF SPACE", "IMMORTALITY", "SAINTHOOD", "ART", "VEGETABLES", "FAT PEOPLE", "MORE LAWS", "MORE DAKKA", "HERESY", "CORPSES", "TRAITORS", "MONKEYS", "AN ARCADE", "PLENTY OF GOLD", "FIVE TEENAGERS WITH ATTITUDE") var/allergy = pick("cotton", "uniforms", "acid", "oxygen", "human contact", "cyborg contact", "medicine", "floors") var/allergysev = pick("deathly", "mildly", "severely", "contagiously") @@ -96,9 +96,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) to_chat(M, "
    ") - to_chat(M, "THE COLONY DIRECTOR, HOP AND HOS ARE [who2]...LAWS UPDATED") + to_chat(M, "THE Facility Director, HOP AND HOS ARE [who2]...LAWS UPDATED") to_chat(M, "
    ") - M.add_ion_law("THE COLONY DIRECTOR, HOP AND HOS ARE [who2]") + M.add_ion_law("THE Facility Director, HOP AND HOS ARE [who2]") if(6) to_chat(M, "
    ") to_chat(M, "THE STATION IS BUILT FOR [who2]...LAWS UPDATED") diff --git a/code/modules/events/meteor_strike_vr.dm b/code/modules/events/meteor_strike_vr.dm index 0b674a62e5d..2e6a5134d8b 100644 --- a/code/modules/events/meteor_strike_vr.dm +++ b/code/modules/events/meteor_strike_vr.dm @@ -11,7 +11,7 @@ kill() /datum/event/meteor_strike/announce() - command_announcement.Announce("A meteoroid has been detected entering the atmosphere on a trajectory that will terminate near the surface facilty. Brace for impact.", "NanoTrasen Orbital Monitoring", new_sound = 'sound/effects/carter_alarm_cut.ogg') + command_announcement.Announce("A meteoroid has been detected entering the atmosphere on a trajectory that will terminate near the surface facilty. Brace for impact.", "NanoTrasen Orbital Monitoring", new_sound = 'sound/effects/meteor_strike.ogg') /datum/event/meteor_strike/start() new /obj/effect/meteor_falling(strike_target) diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 19858f333e7..e4bbb006cf7 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -1,6 +1,6 @@ var/list/dreams = list( - "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the Colony Director", + "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the Facility Director", "voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness", "light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun", "a hat","the Luna","a ruined station","a planet","phoron","air","the medical bay","the bridge","blinking lights", diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 68931196f38..22aaa358ed3 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -189,7 +189,7 @@ mob/living/carbon/proc/handle_hallucinations() var/possible_txt = list("Launch Escape Pods","Self-Destruct Sequence","\[Swipe ID\]","De-Monkify",\ "Reticulate Splines","Plasma","Open Valve","Lockdown","Nerf Airflow","Kill Traitor","Nihilism",\ - "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Colony Director IQ","Retrieve Arms",\ + "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Facility Director IQ","Retrieve Arms",\ "Play Charades","Oxygen","Inject BeAcOs","Ninja Lizards","Limit Break","Build Sentry") if(mid_txts) diff --git a/code/modules/flufftext/TextFilters.dm b/code/modules/flufftext/TextFilters.dm index c7582fe9520..bc133a83b8c 100644 --- a/code/modules/flufftext/TextFilters.dm +++ b/code/modules/flufftext/TextFilters.dm @@ -66,9 +66,8 @@ proc/Ellipsis(original_msg, chance = 50) if(chance <= 0) return "..." if(chance >= 100) return original_msg - var/list - words = splittext(original_msg," ") - new_words = list() + var/list/words = splittext(original_msg," ") + var/list/new_words = list() var/new_msg = "" diff --git a/code/modules/food/drinkingglass/metaglass.dm b/code/modules/food/drinkingglass/metaglass.dm index 7d56a4a0b1e..15bda913de1 100644 --- a/code/modules/food/drinkingglass/metaglass.dm +++ b/code/modules/food/drinkingglass/metaglass.dm @@ -612,11 +612,23 @@ Drinks Data /datum/reagent/ethanol/wine/champagne glass_icon_state = "champagneglass" -/datum/reagent/ethanol/alcsassafras - glass_icon_state = "sassafras_alc_glass" +/datum/reagent/ethanol/newsheriff + glass_icon_state = "newsheriff" -/datum/reagent/drink/soda/sassafras - glass_icon_state = "sassafras_glass" +/datum/reagent/ethanol/thehuckleberry + glass_icon_state = "thehuckleberry" -/datum/reagent/drink/soda/sarsaparilla - glass_icon_state = "sarsaparilla_glass" +/datum/reagent/ethanol/quickdraw + glass_icon_state = "quickdraw" + +/datum/reagent/ethanol/dmhand + glass_icon_state = "dmhand" + +/datum/reagent/ethanol/snakeoil + glass_icon_state = "snakeoil" + +/datum/reagent/ethanol/highnoon + glass_icon_state = "highnoon" + +/datum/reagent/ethanol/bloodmeridian + glass_icon_state = "bloodmeridian" diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index cc99bdfe1f3..a8abffc8324 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -261,8 +261,8 @@ ..() /obj/item/reagent_containers/food/drinks/flask - name = "\improper Colony Director's flask" - desc = "A metal flask belonging to the Colony Director" + name = "\improper Facility Director's flask" + desc = "A metal flask belonging to the Facility Director" icon_state = "flask" volume = 60 center_of_mass = list("x"=17, "y"=7) diff --git a/code/modules/food/food/lunch.dm b/code/modules/food/food/lunch.dm index af0839c2543..3912ebda561 100644 --- a/code/modules/food/food/lunch.dm +++ b/code/modules/food/food/lunch.dm @@ -52,7 +52,8 @@ var/list/lunchables_drinks_ = list(/obj/item/reagent_containers/food/drinks/cans /obj/item/reagent_containers/food/drinks/cans/grape_juice, /obj/item/reagent_containers/food/drinks/cans/tonic, /obj/item/reagent_containers/food/drinks/cans/sodawater, - /obj/item/reagent_containers/food/drinks/bottle/small/sassafras) + /obj/item/reagent_containers/food/drinks/bottle/small/sassafras, + /obj/item/reagent_containers/food/drinks/bottle/small/sarsaparilla) // This default list is a bit different, it contains items we don't want var/list/lunchables_drink_reagents_ = list(/datum/reagent/drink/nothing, diff --git a/code/modules/food/food/sandwich.dm b/code/modules/food/food/sandwich.dm index 9d4325e9b45..94ce3bc7ec9 100644 --- a/code/modules/food/food/sandwich.dm +++ b/code/modules/food/food/sandwich.dm @@ -71,7 +71,7 @@ name = lowertext("[fullname] sandwich") if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich" - w_class = n_ceil(CLAMP((ingredients.len/2),2,4)) + w_class = n_ceil(clamp((ingredients.len/2),2,4)) /obj/item/reagent_containers/food/snacks/csandwich/Destroy() for(var/obj/item/O in ingredients) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index a15fe3ea57d..4ab3e69ebde 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -4684,14 +4684,14 @@ END CITADEL CHANGE */ item.reagents.trans_to_holder(returningitem.reagents, item.reagents.total_volume) //Old chip to new chip if(item.icon_state == "chip_half") returningitem.icon_state = "[returningitem.icon_state]_half" - returningitem.bitesize = CLAMP(returningitem.reagents.total_volume,1,10) + returningitem.bitesize = clamp(returningitem.reagents.total_volume,1,10) else if(prob(1)) memed = 1 to_chat(user, "You scoop up some dip with the chip, but mid-scoop, the chip breaks off into the dreadful abyss of dip, never to be seen again...") returningitem.icon_state = "[returningitem.icon_state]_half" - returningitem.bitesize = CLAMP(returningitem.reagents.total_volume,1,10) + returningitem.bitesize = clamp(returningitem.reagents.total_volume,1,10) else - returningitem.bitesize = CLAMP(returningitem.reagents.total_volume*0.5,1,10) + returningitem.bitesize = clamp(returningitem.reagents.total_volume*0.5,1,10) qdel(item) reagents.trans_to_holder(returningitem.reagents, bitesize) //Dip to new chip user.put_in_hands(returningitem) diff --git a/code/modules/food/food/snacks/meat.dm b/code/modules/food/food/snacks/meat.dm index bcea844d113..0e007019560 100644 --- a/code/modules/food/food/snacks/meat.dm +++ b/code/modules/food/food/snacks/meat.dm @@ -48,7 +48,6 @@ desc = "Tastes like... well, you know." /obj/item/reagent_containers/food/snacks/meat/chicken - name = "chicken" icon = 'icons/obj/food.dmi' icon_state = "chickenbreast" cooked_icon = "chickenbreast_cooked" diff --git a/code/modules/food/kitchen/cooking_machines/_cooker_output.dm b/code/modules/food/kitchen/cooking_machines/_cooker_output.dm index 59260a9923b..5fe5670e82f 100644 --- a/code/modules/food/kitchen/cooking_machines/_cooker_output.dm +++ b/code/modules/food/kitchen/cooking_machines/_cooker_output.dm @@ -26,7 +26,7 @@ var/ratio = reagents.total_volume / size scale = ratio**(1/3) //Scaling factor is square root of desired area - scale = CLAMP(scale, min_scale, max_scale) + scale = clamp(scale, min_scale, max_scale) else scale = min_scale diff --git a/code/modules/food/kitchen/cooking_machines/cereal.dm b/code/modules/food/kitchen/cooking_machines/cereal.dm index 84b9ef3a107..84c132e27b9 100644 --- a/code/modules/food/kitchen/cooking_machines/cereal.dm +++ b/code/modules/food/kitchen/cooking_machines/cereal.dm @@ -34,7 +34,7 @@ var/list/images = list() var/num = 0 - for (var/obj/item/I in CI.container). + for (var/obj/item/I in CI.container) if (istype(I, /obj/item/reagent_containers/food/snacks/variable/cereal)) //Images of cereal boxes on cereal boxes is dumb continue diff --git a/code/modules/gamemaster/helpers.dm b/code/modules/gamemaster/helpers.dm index 7b5c04aade1..d11dd43f6d2 100644 --- a/code/modules/gamemaster/helpers.dm +++ b/code/modules/gamemaster/helpers.dm @@ -1,9 +1,9 @@ // Tell the game master that something dangerous happened, e.g. someone dying. /datum/controller/subsystem/gamemaster/proc/adjust_danger(var/amt) amt = amt * danger_modifier - danger = round( CLAMP(danger + amt, 0, 1000), 0.1) + danger = round( clamp(danger + amt, 0, 1000), 0.1) // Tell the game master that something interesting happened. /datum/controller/subsystem/gamemaster/proc/adjust_staleness(var/amt) amt = amt * staleness_modifier - staleness = round( CLAMP(staleness + amt, -50, 200), 0.1) \ No newline at end of file + staleness = round( clamp(staleness + amt, -50, 200), 0.1) diff --git a/code/modules/games/cah_black_cards.dm b/code/modules/games/cah_black_cards.dm index b31bb258070..0c5f2d3cf9c 100644 --- a/code/modules/games/cah_black_cards.dm +++ b/code/modules/games/cah_black_cards.dm @@ -5,7 +5,7 @@ "The Chaplain this shift is worshiping _____.", "Cargo ordered a crate full of _____.", "An ERT was called due to ______.", - "Alert! The Colony Director has armed themselves with _____.", + "Alert! The Facility Director has armed themselves with _____.", "Current Laws: ________ is your master.", "Current Laws: ________ is the enemy.", "_____ vented the entirety of Cargo.", @@ -14,7 +14,7 @@ "Caution, ______ have been detected in collision course with the station.", "Today's kitchen menu includes _______.", "What did the mercenaries want when they attacked the station?", - "I think the Colony Director is insane. He just demanded ______ in his office.", + "I think the Facility Director is insane. He just demanded ______ in his office.", "Fuckin' scientists, they just turned Misc. Research into _______ .", "What's my fetish?", "Hello, _______ here with _______", diff --git a/code/modules/games/cah_white_cards.dm b/code/modules/games/cah_white_cards.dm index fb3ff4e45fb..02f75510799 100644 --- a/code/modules/games/cah_white_cards.dm +++ b/code/modules/games/cah_white_cards.dm @@ -5,7 +5,7 @@ "Space 'Nam", "Space lesbians", "The Gardener getting SUPER high", - "The Colony Director thinking they're a badass", + "The Facility Director thinking they're a badass", "Being in a cult", "Racially biased lawsets", "An Unathi who WON'T STOP FIGHTING", @@ -57,7 +57,7 @@ "An irritatingly chipper robot", "Androids hanging out in the bar drinking beer", "Gear harnesses", - "A seventeen-year-old Colony Director", + "A seventeen-year-old Facility Director", "The throbbing erection that the HoS gets at the thought of shooting something", "Trying to stab someone and hugging them instead", "Waking up naked in the maintenance tunnels", diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 08766bcd538..94dc96b1019 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -1,4 +1,3 @@ -#define GOONCHAT_ENABLED FALSE /********************************* For the main html chat area @@ -230,7 +229,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico if(islist(target)) // Do the double-encoding outside the loop to save nanoseconds -#if GOONCHAT_ENABLED +#ifdef GOONCHAT_ENABLED var/twiceEncoded = url_encode(url_encode(message)) #endif for(var/I in target) @@ -242,7 +241,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico //Send it to the old style output window. SEND_TEXT(C, original_message) -#if GOONCHAT_ENABLED +#ifdef GOONCHAT_ENABLED if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file. continue @@ -262,7 +261,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico //Send it to the old style output window. SEND_TEXT(C, original_message) -#if GOONCHAT_ENABLED +#ifdef GOONCHAT_ENABLED if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file. return diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 99a066937b9..95abe7e9335 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -236,6 +236,12 @@ new /obj/item/reagent_containers/food/snacks/soydope(get_turf(src)) qdel(src) return + else if(!isnull(seed.chems["pineapplejuice"])) + to_chat(user, "You slice \the [src] into slices.") + for(var/i=i;i<=4;i++) + new /obj/item/reagent_containers/food/snacks/pineapple_ring(get_turf(src)) + qdel(src) + return else if(seed.get_trait(TRAIT_FLESH_COLOUR)) to_chat(user, "You slice up \the [src].") var/slices = rand(3,5) diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index 079e6e3404c..603bcb55c57 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -1055,8 +1055,8 @@ name = "spineapple" seed_name = "spineapple" display_name = "spineapple" - kitchen_tag = "pineapple" - chems = list("nutriment" = list(1,5), "enzyme" = list(1,5), "pineapplejuice" = list(1, 20)) + kitchen_tag = "spineapple" + chems = list("nutriment" = list(3,5), "enzyme" = list(3,5), "pineapplejuice" = list(15, 20)) /datum/seed/spineapple/New() ..() diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 35f7a7eb927..f8a02118425 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -364,7 +364,7 @@ return // Check if we should even bother working on the current seed datum. - if(seed.mutants. && seed.mutants.len && severity > 1) + if(length(seed.mutants) && severity > 1) mutate_species() return diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm index c297396bbf3..3916a06ecf8 100644 --- a/code/modules/instruments/songs/_song.dm +++ b/code/modules/instruments/songs/_song.dm @@ -123,7 +123,7 @@ if(length(allowed_instrument_ids)) set_instrument(allowed_instrument_ids[1]) hearing_mobs = list() - volume = CLAMP(volume, min_volume, max_volume) + volume = clamp(volume, min_volume, max_volume) update_sustain() /datum/song/Destroy() @@ -211,7 +211,7 @@ /datum/song/proc/sanitize_tempo(new_tempo) new_tempo = abs(new_tempo) - return CLAMP(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS) + return clamp(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS) /datum/song/proc/get_bpm() return 600 / tempo @@ -240,22 +240,22 @@ cached_linear_dropoff = volume_decrease_per_decisecond /datum/song/proc/set_volume(volume) - src.volume = CLAMP(volume, max(0, min_volume), min(100, max_volume)) + src.volume = clamp(volume, max(0, min_volume), min(100, max_volume)) update_sustain() updateDialog() /datum/song/proc/set_dropoff_volume(volume) - sustain_dropoff_volume = CLAMP(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100) + sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100) update_sustain() updateDialog() /datum/song/proc/set_exponential_drop_rate(drop) - sustain_exponential_dropoff = CLAMP(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX) + sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX) update_sustain() updateDialog() /datum/song/proc/set_linear_falloff_duration(duration) - sustain_linear_duration = CLAMP(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN) + sustain_linear_duration = clamp(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN) update_sustain() updateDialog() diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm index 2cb181c1dd9..92345c029ed 100644 --- a/code/modules/instruments/songs/editor.dm +++ b/code/modules/instruments/songs/editor.dm @@ -230,7 +230,7 @@ else if(href_list["setnoteshift"]) var/amount = input(usr, "Set note shift", "Note Shift") as null|num if(!isnull(amount)) - note_shift = CLAMP(amount, note_shift_min, note_shift_max) + note_shift = clamp(amount, note_shift_min, note_shift_max) else if(href_list["setsustainmode"]) var/choice = input(usr, "Choose a sustain mode", "Sustain Mode") as null|anything in list("Linear", "Exponential") diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm index 628f87ed1ce..b51b0b7d01d 100644 --- a/code/modules/instruments/songs/play_synthesized.dm +++ b/code/modules/instruments/songs/play_synthesized.dm @@ -52,8 +52,8 @@ if(!num) //it's an accidental accents[key] = oct_acc //if they misspelled it/fucked up that's on them lmao, no safety checks. else //octave - octaves[key] = CLAMP(num, octave_min, octave_max) - compiled_chord += CLAMP((note_offset_lookup[key] + octaves[key] * 12 + accent_lookup[accents[key]]), key_min, key_max) + octaves[key] = clamp(num, octave_min, octave_max) + compiled_chord += clamp((note_offset_lookup[key] + octaves[key] * 12 + accent_lookup[accents[key]]), key_min, key_max) compiled_chord += tempodiv //this goes last if(length(compiled_chord)) compiled_chords[++compiled_chords.len] = compiled_chord @@ -62,7 +62,7 @@ /datum/song/proc/playkey_synth(key) if(can_noteshift) - key = CLAMP(key + note_shift, key_min, key_max) + key = clamp(key + note_shift, key_min, key_max) if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) do_hearcheck() var/datum/instrument_key/K = using_instrument.samples[num2text(key)] //See how fucking easy it is to make a number text? You don't need a complicated 9 line proc! diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm index 052d3acb769..ce2d06dd888 100644 --- a/code/modules/integrated_electronics/subtypes/data_transfer.dm +++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm @@ -125,7 +125,7 @@ /obj/item/integrated_circuit/transfer/pulsedemultiplexer/do_work() var/output_index = get_pin_data(IC_INPUT, 1) - if(output_index == CLAMP(output_index, 1, number_of_outputs)) + if(output_index == clamp(output_index, 1, number_of_outputs)) activate_pin(round(output_index + 1 ,1)) /obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium @@ -143,4 +143,4 @@ name = "sixteen pulse demultiplexer" icon_state = "dmux16" w_class = ITEMSIZE_SMALL - number_of_outputs = 16 \ No newline at end of file + number_of_outputs = 16 diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index c3991459fc9..82578796a24 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -296,7 +296,7 @@ /obj/item/integrated_circuit/input/advanced_locator/on_data_written() var/rad = get_pin_data(IC_INPUT, 2) if(isnum(rad)) - rad = CLAMP(rad, 0, 7) + rad = clamp(rad, 0, 7) radius = rad /obj/item/integrated_circuit/input/advanced_locator/do_work() diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 3ddc3458d7c..e73fe35956d 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -108,7 +108,7 @@ var/brightness = get_pin_data(IC_INPUT, 2) if(new_color && isnum(brightness)) - brightness = CLAMP(brightness, 0, 6) + brightness = clamp(brightness, 0, 6) light_rgb = new_color light_brightness = brightness diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index 41cb67b967c..2cf7d2beb4c 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -83,7 +83,7 @@ else direc = 1 if(isnum(new_amount)) - new_amount = CLAMP(new_amount, 0, volume) + new_amount = clamp(new_amount, 0, volume) transfer_amount = new_amount @@ -132,7 +132,7 @@ if(!TS.Adjacent(TT)) activate_pin(3) return - var/tramount = CLAMP(min(transfer_amount, reagents.maximum_volume - reagents.total_volume), 0, reagents.maximum_volume) + var/tramount = clamp(min(transfer_amount, reagents.maximum_volume - reagents.total_volume), 0, reagents.maximum_volume) if(ismob(target))//Blood! if(istype(target, /mob/living/carbon)) var/mob/living/carbon/T = target @@ -207,7 +207,7 @@ else direc = 1 if(isnum(new_amount)) - new_amount = CLAMP(new_amount, 0, 50) + new_amount = clamp(new_amount, 0, 50) transfer_amount = new_amount /obj/item/integrated_circuit/reagent/pump/do_work() @@ -329,7 +329,7 @@ else direc = 1 if(isnum(new_amount)) - new_amount = CLAMP(new_amount, 0, 50) + new_amount = clamp(new_amount, 0, 50) transfer_amount = new_amount /obj/item/integrated_circuit/reagent/filter/do_work() diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index 1061904607d..aa1a34860b0 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -22,7 +22,7 @@ /obj/item/integrated_circuit/time/delay/do_work() var/delay_input = get_pin_data(IC_INPUT, 1) if(delay_input && isnum(delay_input) ) - var/new_delay = CLAMP(delay_input, 1, 1 HOUR) + var/new_delay = clamp(delay_input, 1, 1 HOUR) delay = new_delay addtimer(CALLBACK(src, .proc/activate_pin, 2), delay) @@ -51,7 +51,7 @@ /obj/item/integrated_circuit/time/SSticker/on_data_written() var/delay_input = get_pin_data(IC_INPUT, 2) if(delay_input && isnum(delay_input) ) - var/new_delay = CLAMP(delay_input, 1, 1 HOUR) + var/new_delay = clamp(delay_input, 1, 1 HOUR) delay = new_delay power_draw_per_use = CEILING((max_power_draw / delay) / delay, 1) diff --git a/code/modules/integrated_electronics/subtypes/trig.dm b/code/modules/integrated_electronics/subtypes/trig.dm index 303053639f6..236f46759d2 100644 --- a/code/modules/integrated_electronics/subtypes/trig.dm +++ b/code/modules/integrated_electronics/subtypes/trig.dm @@ -71,7 +71,7 @@ var/result = null var/A = get_pin_data(IC_INPUT, 1) if(!isnull(A)) - result = TAN(A) + result = tan(A) set_pin_data(IC_OUTPUT, 1, result) push_data() @@ -137,4 +137,4 @@ set_pin_data(IC_OUTPUT, 1, result) push_data() - activate_pin(2) \ No newline at end of file + activate_pin(2) diff --git a/code/modules/mapping/map_config.dm b/code/modules/mapping/map_config.dm new file mode 100644 index 00000000000..61c32d14594 --- /dev/null +++ b/code/modules/mapping/map_config.dm @@ -0,0 +1,226 @@ +//used for holding information about unique properties of maps +//feed it json files that match the datum layout +//defaults to box +// -Cyberboss + +/datum/map_config + // Metadata + var/config_filename = "_maps/tether.json" + var/defaulted = TRUE // set to FALSE by LoadConfig() succeeding + // Config from maps.txt + var/config_max_users = 0 + var/config_min_users = 0 + var/voteweight = 1 + var/max_round_search_span = 0 //If this is nonzero, then if the map has been played more than max_rounds_played within the search span (max determined by define in persistence.dm), this map won't be available. + var/max_rounds_played = 0 + + // Config actually from the JSON - should default to Box + var/map_name = "Tether" + var/map_path = "map_files/tether" + var/map_file = list( + "tether-01-surface1.dmm", + "tether-02-surface2.dmm", + "tether-03-surface3.dmm", + "tether-04-transit.dmm", + "tether-05-station1.dmm", + "tether-06-station2.dmm", + "tether-07-station3.dmm", + "tether-08-mining.dmm", + "tether-09-solars.dmm", + "tether-10-colony.dmm" + ) + + /// List of lists for Zlevel traits. + var/traits = null + +/* + var/space_ruin_levels = 2 + var/space_empty_levels = 1 + var/station_ruin_budget = -1 // can be set to manually override the station ruins budget on maps that don't support station ruins, stopping the error from being unable to place the ruins. + + var/minetype = "lavaland" +*/ + +// var/maptype = MAP_TYPE_STATION //This should be used to adjust ingame behavior depending on the specific type of map being played. For instance, if an overmap were added, it'd be appropriate for it to only generate with a MAP_TYPE_SHIP + +/* + var/announcertype = "standard" //Determines the announcer the map uses. standard uses the default announcer, classic, but has a random chance to use other similarly-themed announcers, like medibot + + var/allow_custom_shuttles = TRUE + var/shuttles = list( + "cargo" = "cargo_box", + "ferry" = "ferry_fancy", + "whiteship" = "whiteship_box", + "emergency" = "emergency_box") + + var/year_offset = 540 //The offset of ingame year from the actual IRL year. You know you want to make a map that takes place in the 90's. Don't lie. +*/ + /// Persistence ID, defaulting to name. + var/persistence_id + + // "fun things" + /// Orientation to load in by default. + var/orientation = SOUTH //byond defaults to placing everyting SOUTH. + +/proc/load_map_config(filename = "data/next_map.json", default_to_box, delete_after, error_if_missing = TRUE) + var/datum/map_config/config = new + if (default_to_box) + return config + if (!config.LoadConfig(filename, error_if_missing)) + qdel(config) + config = new /datum/map_config // Fall back to Box + if (delete_after) + fdel(filename) + return config + +#define CHECK_EXISTS(X) if(!istext(json[X])) { log_world("[##X] missing from json!"); return; } +/datum/map_config/proc/LoadConfig(filename, error_if_missing) + if(!fexists(filename)) + if(error_if_missing) + log_world("map_config not found: [filename]") + return + + var/json = file(filename) + if(!json) + log_world("Could not open map_config: [filename]") + return + + json = file2text(json) + if(!json) + log_world("map_config is not text: [filename]") + return + + json = json_decode(json) + if(!json) + log_world("map_config is not json: [filename]") + return + + config_filename = filename + + CHECK_EXISTS("map_name") + map_name = json["map_name"] + CHECK_EXISTS("map_path") + map_path = json["map_path"] + + map_file = json["map_file"] + // "map_file": "BoxStation.dmm" + if (istext(map_file)) + if (!fexists("_maps/[map_path]/[map_file]")) + log_world("Map file ([map_path]/[map_file]) does not exist!") + return + // "map_file": ["Lower.dmm", "Upper.dmm"] + else if (islist(map_file)) + for (var/file in map_file) + if (!fexists("_maps/[map_path]/[file]")) + log_world("Map file ([map_path]/[file]) does not exist!") + return + else + log_world("map_file missing from json!") + return + +/* + if (islist(json["shuttles"])) + var/list/L = json["shuttles"] + for(var/key in L) + var/value = L[key] + shuttles[key] = value + else if ("shuttles" in json) + log_world("map_config shuttles is not a list!") + return +*/ + + traits = json["traits"] + // "traits": [{"Linkage": "Cross"}, {"Space Ruins": true}] + if (islist(traits)) + // "Station" is set by default, but it's assumed if you're setting + // traits you want to customize which level is cross-linked + for (var/level in traits) + if (!(ZTRAIT_STATION in level)) + level[ZTRAIT_STATION] = TRUE + // "traits": null or absent -> default + else if (!isnull(traits)) + log_world("map_config traits is not a list!") + return + +/* + var/temp = json["space_ruin_levels"] + if (isnum(temp)) + space_ruin_levels = temp + else if (!isnull(temp)) + log_world("map_config space_ruin_levels is not a number!") + return + + temp = json["space_empty_levels"] + if (isnum(temp)) + space_empty_levels = temp + else if (!isnull(temp)) + log_world("map_config space_empty_levels is not a number!") + return + + if("station_ruin_budget" in json) + station_ruin_budget = json["station_ruin_budget"] + + temp = json["year_offset"] + if (isnum(temp)) + year_offset = temp + else if (!isnull(temp)) + log_world("map_config year_offset is not a number!") + return + + if ("minetype" in json) + minetype = json["minetype"] + + if ("maptype" in json) + maptype = json["maptype"] + + if ("announcertype" in json) + announcertype = json["announcertype"] +*/ + + if ("orientation" in json) + orientation = json["orientation"] + if(!(orientation in GLOB.cardinal)) + orientation = SOUTH + + if("persistence_id" in json) + persistence_id = json["persistence_id"] + if(!istext(persistence_id)) + persistence_id = lowertext(map_name) + +/* + allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE +*/ + + defaulted = FALSE + return TRUE +#undef CHECK_EXISTS + +/datum/map_config/proc/GetFullMapPaths() + if (istext(map_file)) + return list("_maps/[map_path]/[map_file]") + . = list() + for (var/file in map_file) + . += "_maps/[map_path]/[file]" + +/datum/map_config/proc/MakeNextMap() + return config_filename == "data/next_map.json" || fcopy(config_filename, "data/next_map.json") + +/// badmin moments. Keep up to date with LoadConfig()! +/datum/map_config/proc/WriteNextMap() + var/list/jsonlist = list() + jsonlist["map_name"] = map_name + jsonlist["map_path"] = map_path + jsonlist["map_file"] = map_file +// jsonlist["shuttles"] = shuttles + jsonlist["traits"] = traits +// jsonlist["space_ruin_levels"] = space_ruin_levels +// jsonlist["year_offset"] = year_offset +// jsonlist["minetype"] = minetype +// jsonlist["maptype"] = maptype +// jsonlist["announcertype"] = announcertype + jsonlist["orientation"] = orientation +// jsonlist["allow_custom_shuttles"] = allow_custom_shuttles + if(fexists("data/next_map.json")) + fdel("data/next_map.json") + var/F = file("data/next_map.json") + WRITE_FILE(F, json_encode(jsonlist)) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 5fae1b07210..a516a0175e6 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -115,6 +115,11 @@ ..() recipes += new/datum/stack_recipe("planting bed", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1) +/datum/material/stone/marble/generate_recipes() + ..() + recipes += new/datum/stack_recipe("light marble floor tile", /obj/item/stack/tile/wmarble, 1, 4, 20) + recipes += new/datum/stack_recipe("dark marble floor tile", /obj/item/stack/tile/bmarble, 1, 4, 20) + /datum/material/plastic/generate_recipes() ..() recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE) diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm index c1cd4897ca4..3d24b0b6604 100644 --- a/code/modules/media/mediamanager.dm +++ b/code/modules/media/mediamanager.dm @@ -11,7 +11,7 @@ #ifdef DEBUG_MEDIAPLAYER #define MP_DEBUG(x) owner << x -#warning Please comment out #define DEBUG_MEDIAPLAYER before committing. +#warn Please comment out #define DEBUG_MEDIAPLAYER before committing. #else #define MP_DEBUG(x) #endif @@ -149,7 +149,7 @@ if (url != targetURL || abs(targetStartTime - start_time) > 1 || abs(targetVolume - source_volume) > 0.1 /* 10% */) url = targetURL start_time = targetStartTime - source_volume = CLAMP(targetVolume, 0, 1) + source_volume = clamp(targetVolume, 0, 1) send_update() /datum/media_manager/proc/stop_music() diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm index cd61966bdbc..c1bdd87dc26 100644 --- a/code/modules/mining/abandonedcrates.dm +++ b/code/modules/mining/abandonedcrates.dm @@ -65,7 +65,7 @@ if(57 to 58) new/obj/item/toy/syndicateballoon(src) if(59 to 60) - new/obj/item/rig(src) + new/obj/item/rig/industrial(src) if(61 to 62) for(var/i = 0, i < 12, ++i) new/obj/item/clothing/head/kitty(src) diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 2ccbe949eaf..e0b0d9a1668 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -62,6 +62,9 @@ ) RefreshParts() +/obj/machinery/mining/drill/get_cell() + return cell + /obj/machinery/mining/drill/process() if(need_player_check) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index cd09a46a8e6..73de3301b44 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -281,7 +281,7 @@ else if(ores_processing[metal] == PROCESS_COMPRESS && O.compresses_to) //Compressing. - var/can_make = CLAMP(ores_stored[metal],0,sheets_per_tick-sheets) + var/can_make = clamp(ores_stored[metal],0,sheets_per_tick-sheets) if(can_make%2>0) can_make-- var/datum/material/M = get_material_by_name(O.compresses_to) @@ -296,7 +296,7 @@ else if(ores_processing[metal] == PROCESS_SMELT && O.smelts_to) //Smelting. - var/can_make = CLAMP(ores_stored[metal],0,sheets_per_tick-sheets) + var/can_make = clamp(ores_stored[metal],0,sheets_per_tick-sheets) var/datum/material/M = get_material_by_name(O.smelts_to) if(!istype(M) || !can_make || ores_stored[metal] < 1) @@ -312,7 +312,7 @@ new /obj/item/ore/slag(output.loc) else continue - + if(!(tick % 10)) console.updateUsrDialog() tick = 0 diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index b4943648121..dbdd3bed852 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -105,6 +105,23 @@ desc = "Cracks rocks with sonic blasts. This one seems like an improved design." drill_verb = "hammering" +/obj/item/pickaxe/icepick //Cannot actually lobotomize people. Yet. + name = "icepick" + desc = "A simple icepick, for all your digging, climbing, and lobotomizing needs." + slot_flags = SLOT_BELT + force = 12 + throwforce = 15 //Discount shuriken. + icon_state = "icepick" + item_state = "spickaxe" //im lazy fuck u + w_class = ITEMSIZE_SMALL + matter = list(DEFAULT_WALL_MATERIAL = 2750, "titanium" = 2000) + digspeed = 25 //More expensive than a diamond pick, a lot smaller but decently slower. + origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) + attack_verb = list("mined", "pierced", "stabbed", "attacked") + drill_verb = "picking" + sharp = 1 + + /*****************************Shovel********************************/ /obj/item/shovel diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm index 0acb3a18ec1..4ecffd7fe72 100644 --- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm +++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm @@ -42,6 +42,7 @@ new /datum/data/mining_equipment("Fulton Pack", /obj/item/extraction_pack, 1200), new /datum/data/mining_equipment("Wormhole Fulton Pack", /obj/item/extraction_pack/wormhole, 1750), new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1200), + new /datum/data/mining_equipment("Climbing Pick", /obj/item/pickaxe/icepick, 2200), //new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffelbag/mining_conscript, 1000), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), new /datum/data/mining_equipment("Advanced Ore Scanner", /obj/item/mining_scanner/advanced, 2000), diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index a1b5efee0cc..4b7b17c1763 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -98,13 +98,13 @@ // Checks if the mob's own name is included inside message. Handles both first and last names. /mob/proc/check_mentioned(var/message) var/not_included = list("a", "the", "of", "in", "for", "through", "throughout", "therefore", "here", "there", "then", "now", "I", "you", "they", "he", "she", "by") - var/list/valid_names = splittext(real_name, " ") // Should output list("John", "Doe") as an example. + var/list/valid_names = splittext_char(real_name, " ") // Should output list("John", "Doe") as an example. valid_names -= not_included - var/list/nicknames = splittext(nickname, " ") + var/list/nicknames = splittext_char(nickname, " ") valid_names += nicknames valid_names += special_mentions() for(var/name in valid_names) - if(findtext(message, regex("\\b[name]\\b", "i"))) // This is to stop 'ai' from triggering if someone says 'wait'. + if(findtext_char(message, regex("\\b[name]\\b", "i"))) // This is to stop 'ai' from triggering if someone says 'wait'. return TRUE return FALSE @@ -116,35 +116,14 @@ return list("AI") // AI door! // Converts specific characters, like +, |, and _ to formatted output. -/mob/proc/say_emphasis(var/message) - message = encode_html_emphasis(message, "|", "i") - message = encode_html_emphasis(message, "+", "b") - message = encode_html_emphasis(message, "_", "u") - return message - -// Replaces a character inside message with html tags. Note that html var must not include brackets. -// Will not create an open html tag if it would not have a closing one. -/proc/encode_html_emphasis(var/message, var/char, var/html) - var/i = 20 // Infinite loop safety. - var/pattern = "(?") - 1 - - // Now replace both. - message = replacetext(message, char, "<[html]>", first, first + 1) - message = replacetext(message, char, "", second + length_increase, second + length_increase + 1) - - // Check again to see if we need to keep going. - first = re.Find(message) - second = re.Find(message, first + 1) - i-- - if(!i) - CRASH("Possible infinite loop occured in encode_html_emphasis().") - return message +/mob/proc/say_emphasis(input) + var/static/regex/italics = regex("\\|(?=\\S)(.*?)(?=\\S)\\|", "g") + input = replacetext_char(input, italics, "$1") + var/static/regex/bold = regex("\\+(?=\\S)(.*?)(?=\\S)\\+", "g") + input = replacetext_char(input, bold, "$1") + var/static/regex/underline = regex("_(?=\\S)(.*?)(?=\\S)_", "g") + input = replacetext_char(input, underline, "$1") + return input /mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") @@ -296,7 +275,7 @@ message = "[speaker] [verb], \"[message]\"" else var/adverb - var/length = length(message) * pick(0.8, 0.9, 1.0, 1.1, 1.2) //Adds a little bit of fuzziness + var/length = length_char(message) * pick(0.8, 0.9, 1.0, 1.1, 1.2) //Adds a little bit of fuzziness switch(length) if(0 to 12) adverb = " briefly" if(12 to 30) adverb = " a short message" @@ -311,13 +290,13 @@ var/heard = "" if(prob(15)) var/list/punctuation = list(",", "!", ".", ";", "?") - var/list/messages = splittext(message, " ") + var/list/messages = splittext_char(message, " ") var/R = rand(1, messages.len) var/heardword = messages[R] - if(copytext(heardword,1, 1) in punctuation) - heardword = copytext(heardword,2) - if(copytext(heardword,-1) in punctuation) - heardword = copytext(heardword,1,length(heardword)) + if(copytext_char(heardword,1, 1) in punctuation) + heardword = copytext_char(heardword,2) + if(copytext_char(heardword,-1) in punctuation) + heardword = copytext_char(heardword,1,length_char(heardword)) heard = "...You hear something about...[heardword]" else diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 8e9db9a8664..926e3c94855 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -50,28 +50,28 @@ if(L.partial_understanding && L.partial_understanding[name]) understand_chance += L.partial_understanding[name] * 0.5 var/scrambled_text = "" - var/list/words = splittext(input, " ") + var/list/words = splittext_char(input, " ") for(var/w in words) if(prob(understand_chance)) scrambled_text += " [w] " else var/nword = scramble_word(w) - var/ending = copytext(scrambled_text, length(scrambled_text)-1) - if(findtext(ending,".")) + var/ending = copytext_char(scrambled_text, length_char(scrambled_text)-1) + if(findtext_char(ending,".")) nword = capitalize(nword) - else if(findtext(ending,"!")) + else if(findtext_char(ending,"!")) nword = capitalize(nword) - else if(findtext(ending,"?")) + else if(findtext_char(ending,"?")) nword = capitalize(nword) scrambled_text += nword - scrambled_text = replacetext(scrambled_text," "," ") + scrambled_text = replacetext_char(scrambled_text," "," ") scrambled_text = capitalize(scrambled_text) scrambled_text = trim(scrambled_text) - var/ending = copytext(scrambled_text, length(scrambled_text)) + var/ending = copytext_char(scrambled_text, length_char(scrambled_text)) if(ending == ".") - scrambled_text = copytext(scrambled_text,1,length(scrambled_text)-1) + scrambled_text = copytext_char(scrambled_text,1,length_char(scrambled_text)-1) - var/input_ending = copytext(input, length(input)) + var/input_ending = copytext_char(input, length_char(input)) if(input_ending in list("!","?",".")) scrambled_text += input_ending @@ -88,11 +88,11 @@ scramble_cache[input] = n return n - var/input_size = length(input) + var/input_size = length_char(input) var/scrambled_text = "" var/capitalize = 0 - while(length(scrambled_text) < input_size) + while(length_char(scrambled_text) < input_size) var/next = pick(syllables) if(capitalize) next = capitalize(next) @@ -123,7 +123,7 @@ /datum/language/proc/get_talkinto_msg_range(message) // if you yell, you'll be heard from two tiles over instead of one - return (copytext(message, length(message)) == "!") ? 2 : 1 + return (copytext_char(message, length_char(message)) == "!") ? 2 : 1 /datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) log_say("(HIVE) [message]", speaker) diff --git a/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm b/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm index 7416968b6e5..17d8ba7f6c6 100644 --- a/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm +++ b/code/modules/mob/living/carbon/human/descriptors/_descriptors.dm @@ -101,10 +101,10 @@ /datum/mob_descriptor/proc/get_comparative_value_string_smaller(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender) var/maxval = LAZYLEN(comparative_value_descriptors_smaller) - value = CLAMP(CEILING(value * maxval, 1), 1, maxval) + value = clamp(CEILING(value * maxval, 1), 1, maxval) return comparative_value_descriptors_smaller[value] /datum/mob_descriptor/proc/get_comparative_value_string_larger(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender) var/maxval = LAZYLEN(comparative_value_descriptors_larger) - value = CLAMP(CEILING(value * maxval, 1), 1, maxval) + value = clamp(CEILING(value * maxval, 1), 1, maxval) return comparative_value_descriptors_larger[value] diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 6aa3e416ae1..3d57e782d89 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -92,6 +92,23 @@ message = "squishes." m_type = 1 + // SHRIEK VOXXY ONLY + if ("shriekloud") + if(src.species.name != SPECIES_VOX) + to_chat(src, "You aren't ear piercingly vocal enough!") + return + playsound(src.loc, 'sound/voice/shrieksneeze.ogg', 50, 0) + message = "gives a short sharp shriek!" + m_type = 1 + + if ("shriekshort") + if(src.species.name != SPECIES_VOX) + to_chat(src, "You aren't noisy enough!") + return + playsound(src.loc, 'sound/voice/shriekcough.ogg', 50, 0) + message = "gives a short, quieter shriek!" + m_type = 1 + if ("blink") message = "blinks." @@ -784,10 +801,10 @@ message = "makes a light spitting noise, a poor attempt at a whistle." if ("help") - to_chat(src, "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \ - frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, \ - raise, salute, scream, sneeze, shake, shiver, shrug, sigh, signal-#1-10, slap-(none)/mob, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch, \ - twitch_v, vomit, whimper, wink, yawn. Synthetics: beep, buzz, yes, no, rcough, rsneeze, ping") + to_chat(src, "awoo, bark, blink, blink_r, blush, bow-(none)/mob, burp, chirp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \ + flip, frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hiss, hug-(none)/mob, laugh, look-(none)/mob, merp, moan, mumble, nod, nya, pale, peep, point-atom, \ + raise, salute, scream, sneeze, shake, shiver, shrug, sigh, signal-#1-10, slap-(none)/mob, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, squeak, sway/wag, swish, tremble, twitch, \ + twitch_v, vomit, weh, whimper, wink, yawn. Synthetics: beep, buzz, yes, no, rcough, rsneeze, ping. Vox: shriekshort, shriekloud") else to_chat(src, "Unusable emote '[act]'. Say *help or *vhelp for a list.") //VOREStation Edit, mention *vhelp for Virgo-specific emotes located in emote_vr.dm. diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 19a94f0cd8d..63019b540cd 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -148,20 +148,20 @@ var/turf_move_cost = T.movement_cost if(istype(T, /turf/simulated/floor/water)) if(species.water_movement) - turf_move_cost = CLAMP(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + species.water_movement, 15) + turf_move_cost = clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + species.water_movement, 15) if(shoes) var/obj/item/clothing/shoes/feet = shoes if(feet.water_speed) - turf_move_cost = CLAMP(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + feet.water_speed, 15) + turf_move_cost = clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + feet.water_speed, 15) . += turf_move_cost if(istype(T, /turf/simulated/floor/outdoors/snow)) if(species.snow_movement) - turf_move_cost = CLAMP(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + species.snow_movement, 15) + turf_move_cost = clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + species.snow_movement, 15) if(shoes) var/obj/item/clothing/shoes/feet = shoes if(feet.water_speed) - turf_move_cost = CLAMP(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + feet.snow_speed, 15) + turf_move_cost = clamp(HUMAN_LOWEST_SLOWDOWN, turf_move_cost + feet.snow_speed, 15) . += turf_move_cost // Wind makes it easier or harder to move, depending on if you're with or against the wind. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index cefa9e0e19e..66571be43ee 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -255,7 +255,7 @@ if(gene.is_active(src)) gene.OnMobLife(src) - radiation = CLAMP(radiation,0,250) + radiation = clamp(radiation,0,250) if(!radiation) if(species.appearance_flags & RADIATION_GLOWS) @@ -514,7 +514,7 @@ if(toxins_pp > safe_toxins_max) var/ratio = (poison/safe_toxins_max) * 10 if(reagents) - reagents.add_reagent("toxin", CLAMP(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) + reagents.add_reagent("toxin", clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) breath.adjust_gas(poison_type, -poison/6, update = 0) //update after phoron_alert = max(phoron_alert, 1) else diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index c28107160d8..0a7afd06db7 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -13,22 +13,22 @@ var/temp = winget(client, "input", "text") if(findtextEx(temp, "Say \"", 1, 7) && length(temp) > 5) //case sensitive means - temp = replacetext(temp, ";", "") //general radio + temp = replacetext_char(temp, ";", "") //general radio - if(findtext(trim_left(temp), ":", 6, 7)) //dept radio - temp = copytext(trim_left(temp), 8) + if(findtext_char(trim_left(temp), ":", 6, 7)) //dept radio + temp = copytext_char(trim_left(temp), 8) virgin = 0 if(virgin) - temp = copytext(trim_left(temp), 6) //normal speech + temp = copytext_char(trim_left(temp), 6) //normal speech virgin = 0 - while(findtext(trim_left(temp), ":", 1, 2)) //dept radio again (necessary) - temp = copytext(trim_left(temp), 3) + while(findtext_char(trim_left(temp), ":", 1, 2)) //dept radio again (necessary) + temp = copytext_char(trim_left(temp), 3) - if(findtext(temp, "*", 1, 2)) //emotes + if(findtext_char(temp, "*", 1, 2)) //emotes return - temp = copytext(trim_left(temp), 1, rand(5,8)) + temp = copytext_char(trim_left(temp), 1, rand(5,8)) var/trimmed = trim_left(temp) if(length(trimmed)) @@ -125,7 +125,7 @@ /mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null) var/verb = "says" - var/ending = copytext(message, length(message)) + var/ending = copytext_char(message, length(message)) if(speaking) verb = speaking.get_spoken_verb(ending) diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index 821fd0cc37d..d285bb3463f 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -191,7 +191,7 @@ if(!istype(shade_organ)) return - shade_organ.dark_energy = CLAMP(new_energy, 0, get_max_energy(H)) + shade_organ.dark_energy = clamp(new_energy, 0, get_max_energy(H)) /datum/species/shadekin/proc/set_max_energy(var/mob/living/carbon/human/H, var/new_max_energy) var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN] diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm index 9e6a07d1685..b1b28b8f26c 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack.dm @@ -27,7 +27,7 @@ var/datum/gender/T = gender_datums[user.get_visible_gender()] var/datum/gender/TT = gender_datums[target.get_visible_gender()] if(!skill) skill = 1 - attack_damage = CLAMP(attack_damage, 1, 5) + attack_damage = clamp(attack_damage, 1, 5) if(target == user) user.visible_message("[user] [pick(attack_verb)] [T.himself] in the [affecting.name]!") @@ -92,4 +92,4 @@ /datum/unarmed_attack/stomp/weak/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = target.get_organ(zone) user.visible_message("[user] jumped up and down on \the [target]'s [affecting.name]!") - playsound(user.loc, attack_sound, 25, 1, -1) \ No newline at end of file + playsound(user.loc, attack_sound, 25, 1, -1) diff --git a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm index 58257ae3242..82d4410384c 100644 --- a/code/modules/mob/living/carbon/human/species/species_attack_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_attack_vr.dm @@ -9,7 +9,7 @@ /datum/unarmed_attack/bite/sharp/numbing/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) var/obj/item/organ/external/affecting = target.get_organ(zone) - attack_damage = CLAMP(attack_damage, 1, 5) + attack_damage = clamp(attack_damage, 1, 5) if(target == user) user.visible_message("[user] [pick(attack_verb)] \himself in the [affecting.name]!") return 0 //No venom for you. @@ -57,4 +57,4 @@ /datum/unarmed_attack/bite/sharp/shadekin/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage) ..() - user.shadekin_adjust_energy(energy_gain) \ No newline at end of file + user.shadekin_adjust_energy(energy_gain) diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm index 58495c008dc..99848b6725e 100644 --- a/code/modules/mob/living/carbon/human/species/station/alraune.dm +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -211,7 +211,7 @@ var/co2buff = 0 if(inhaling) - co2buff = (CLAMP(inhale_pp, 0, minimum_breath_pressure))/minimum_breath_pressure //returns a value between 0 and 1. + co2buff = (clamp(inhale_pp, 0, minimum_breath_pressure))/minimum_breath_pressure //returns a value between 0 and 1. var/light_amount = fullysealed ? H.getlightlevel() : H.getlightlevel()/5 // if they're covered, they're not going to get much light on them. @@ -226,7 +226,7 @@ if(toxins_pp > safe_toxins_max) var/ratio = (poison/safe_toxins_max) * 10 if(H.reagents) - H.reagents.add_reagent("toxin", CLAMP(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) + H.reagents.add_reagent("toxin", clamp(ratio, MIN_TOXIN_DAMAGE, MAX_TOXIN_DAMAGE)) breath.adjust_gas(poison_type, -poison/6, update = 0) //update after H.phoron_alert = max(H.phoron_alert, 1) else diff --git a/code/modules/mob/living/carbon/human/species/station/plasmen.dm b/code/modules/mob/living/carbon/human/species/station/plasmen.dm index 340bc18baf0..bcfe02ab0da 100644 --- a/code/modules/mob/living/carbon/human/species/station/plasmen.dm +++ b/code/modules/mob/living/carbon/human/species/station/plasmen.dm @@ -105,7 +105,7 @@ if("Head of Security") suit=/obj/item/clothing/suit/space/plasman/sec/hos helm=/obj/item/clothing/head/helmet/space/plasman/sec/hos - if("Colony Director") + if("Facility Director") suit=/obj/item/clothing/suit/space/plasman/sec/captain helm=/obj/item/clothing/head/helmet/space/plasman/sec/captain if("Head of Personnel") diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 4431870d0a4..148522d2b08 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -26,6 +26,7 @@ melee_damage_upper = 10 attacktext = list("slashed") + aquatic_movement = 1 min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -57,13 +58,17 @@ //Constructor allows passing the human to sync damages /mob/living/simple_mob/protean_blob/New(var/newloc, var/mob/living/carbon/human/H) ..() + mob_radio = new(src) + myid = new(src) if(H) humanform = H updatehealth() refactory = locate() in humanform.internal_organs verbs |= /mob/living/proc/ventcrawl verbs |= /mob/living/proc/hide + verbs |= /mob/living/simple_mob/protean_blob/proc/useradio verbs |= /mob/living/simple_mob/protean_blob/proc/appearanceswitch + else update_icon() @@ -133,6 +138,9 @@ else ..() +/mob/living/simple_mob/protean_blob/ventcrawl_carry() + return TRUE //proteans can have literally any small inside them and should still be able to ventcrawl regardless. + /mob/living/simple_mob/protean_blob/adjustFireLoss(var/amount) if(humanform) humanform.adjustFireLoss(amount) @@ -265,13 +273,26 @@ drop_from_inventory(I) - if(slot_gloves && istype(slot_gloves, /obj/item/clothing/gloves/gauntlets/rig)) //drop RIGsuit gauntlets to avoid fucky wucky-ness. - var/obj/item/clothing/gloves/riggloves = slot_gloves - drop_from_inventory(riggloves) + if(istype(slot_gloves, /obj/item/clothing/gloves/gauntlets/rig)) //drop RIGsuit gauntlets to avoid fucky wucky-ness. + drop_from_inventory(slot_gloves) - if(slot_shoes && istype(slot_shoes, /obj/item/clothing/shoes/magboots)) //drop magboots because they're super heavy. also drops RIGsuit boots because they're magboot subtypes. - var/obj/item/clothing/shoes/magboots = slot_shoes - drop_from_inventory(magboots) + if(istype(slot_shoes, /obj/item/clothing/shoes/magboots)) //drop magboots because they're super heavy. also drops RIGsuit boots because they're magboot subtypes. + drop_from_inventory(slot_shoes) + + for(var/obj/item/radio/headset/H in things_to_not_drop) + blob.mob_radio.keyslot1 = H.keyslot1 + blob.mob_radio.keyslot2 = H.keyslot2 + if(H.adhoc_fallback) + blob.mob_radio.adhoc_fallback = TRUE + blob.mob_radio.recalculateChannels() + + for(var/obj/item/pda/P in things_to_not_drop) + if(P.id) + var/obj/item/card/id/PID = P.id + blob.myid.access += PID.access + + for(var/obj/item/card/id/I in things_to_not_drop) + blob.myid.access += I.access if(w_uniform && istype(w_uniform,/obj/item/clothing)) //No webbings tho. We do this after in case a suit was in the way var/obj/item/clothing/uniform = w_uniform @@ -321,6 +342,14 @@ if(istype(I, /obj/item/holder)) root.remove_from_mob(I) +/mob/living/simple_mob/protean_blob/proc/useradio() + set name = "Utilize Radio" + set desc = "Allows a protean blob to interact with its internal radio." + set category = "Abilities" + + if(mob_radio) + mob_radio.ui_interact(src, state = interactive_state) + /mob/living/carbon/human/proc/nano_outofblob(var/mob/living/simple_mob/protean_blob/blob) if(!istype(blob)) return @@ -369,6 +398,9 @@ if(blob.prev_left_hand) put_in_l_hand(blob.prev_left_hand) //The restore for when reforming. if(blob.prev_right_hand) put_in_r_hand(blob.prev_right_hand) + for(var/obj/item/radio/headset/H in contents) + H.keyslot1 = blob.mob_radio.keyslot1 + H.keyslot2 = blob.mob_radio.keyslot2 Life(1) //Fix my blindness right meow //Has to be moved up here, there exists a circumstance where blob could be deleted without vore organs moving right. //Get rid of friend blob diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index c0945e54683..0f1a6ca860e 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -10,15 +10,21 @@ icobase = 'icons/mob/human_races/r_xenochimera.dmi' deform = 'icons/mob/human_races/r_def_xenochimera.dmi' unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp) + rarity_value = 4 darksight = 8 //critters with instincts to hide in the dark need to see in the dark - about as good as tajara. slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari. brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though. burn_mod = 1.15 //As vulnerable to burn as a Tajara. + radiation_mod = 1.15 //To help simulate the volatility of a living 'viral' cluster. + metabolic_rate = 1.4 + hunger_factor = 0.4 + metabolism = 0.012 base_species = "Xenochimera" selects_bodytype = TRUE num_alternate_languages = 2 secondary_langs = list("Sol Common") + //color_mult = 1 //It seemed to work fine in testing, but I've been informed it's unneeded. tail = "tail" //Scree's tail. Can be disabled in the vore tab by choosing "hide species specific tail sprite" icobase_tail = 1 @@ -33,7 +39,15 @@ /mob/living/proc/shred_limb, /mob/living/proc/flying_toggle, /mob/living/proc/start_wings_hovering, - /mob/living/carbon/human/proc/tie_hair) //Xenochimera get all the special verbs since they can't select traits. + /mob/living/carbon/human/proc/tie_hair, + /mob/living/proc/eat_trash, + /mob/living/proc/glow_toggle, + /mob/living/proc/glow_color, + /mob/living/carbon/human/proc/lick_wounds , + /mob/living/carbon/human/proc/resp_biomorph, + /mob/living/carbon/human/proc/biothermic_adapt, + /mob/living/carbon/human/proc/atmos_biomorph, + /mob/living/carbon/human/proc/vocal_biomorph) //Xenochimera get all the special verbs since they can't select traits. virus_immune = 1 // They practically ARE one. min_age = 18 @@ -47,27 +61,50 @@ catalogue_data = list(/datum/category_item/catalogue/fauna/xenochimera) + breath_type = "oxygen" + poison_type = "phoron" + exhale_type = "carbon_dioxide" + + hazard_high_pressure = HAZARD_HIGH_PRESSURE + warning_high_pressure = WARNING_HIGH_PRESSURE + warning_low_pressure = WARNING_LOW_PRESSURE hazard_low_pressure = -1 //Prevents them from dying normally in space. Special code handled below. + safe_pressure = ONE_ATMOSPHERE + cold_level_1 = -1 // All cold debuffs are handled below in handle_environment_special cold_level_2 = -1 cold_level_3 = -1 + cold_discomfort_level = 285 + cold_discomfort_strings = list( + "You feel chilly.", + "You shiver suddenly.", + "Your chilly flesh stands out in goosebumps." + ) + + heat_discomfort_level = 315 + heat_discomfort_strings = list( + "You feel sweat drip down your neck.", + "You feel uncomfortably warm.", + "Your skin prickles in the heat." + ) + //primitive_form = "Farwa" spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. flags = NO_SCAN | NO_INFECT //Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - has_organ = list( //Same organ list as tajarans. - O_HEART = /obj/item/organ/internal/heart, - O_LUNGS = /obj/item/organ/internal/lungs, - O_VOICE = /obj/item/organ/internal/voicebox, - O_LIVER = /obj/item/organ/internal/liver, - O_KIDNEYS = /obj/item/organ/internal/kidneys, - O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes, - O_STOMACH = /obj/item/organ/internal/stomach, - O_INTESTINE = /obj/item/organ/internal/intestine + has_organ = list( + O_HEART = /obj/item/organ/internal/heart/xenochimera, + O_LUNGS = /obj/item/organ/internal/lungs/xenochimera, + O_VOICE = /obj/item/organ/internal/voicebox/xenochimera, + O_LIVER = /obj/item/organ/internal/liver/xenochimera, + O_KIDNEYS = /obj/item/organ/internal/kidneys/xenochimera, + O_BRAIN = /obj/item/organ/internal/brain/xenochimera, + O_EYES = /obj/item/organ/internal/eyes/xenochimera, + O_STOMACH = /obj/item/organ/internal/stomach/xenochimera, + O_INTESTINE = /obj/item/organ/internal/intestine/xenochimera ) flesh_color = "#AFA59E" @@ -317,6 +354,89 @@ return real.race_key +//Verbs Follow + +/mob/living/carbon/human/proc/resp_biomorph(var/mob/living/carbon/human/H, var/mob/living/carbon/human/C) + set name = "Respiratory Biomorph" + set desc = "Changes the gases we need to breathe." + set category = "Abilities" + + var/resp_biomorph = input(H, "How should we adapt our respiration?") as null|anything in list("oxgygen", "phoron", "nitrogen", "carbon_dioxide") + to_chat(H,"You begin modifying your internal structure!") + if(do_after(H,15 SECONDS)) + switch(resp_biomorph) + if("oxygen") + species.breath_type = "oxygen" + species.poison_type = "phoron" + species.exhale_type = "carbon_dioxide" + if("phoron") + species.breath_type = "phoron" + species.poison_type = "oxygen" + species.exhale_type = "nitrogen" + if("nitrogen") + species.breath_type = "nitrogen" + species.poison_type = "carbon_dioxide" + if("carbon_dioxide") + species.breath_type = "carbon_dioxide" + species.exhale_type = "oxygen" + +/mob/living/carbon/human/proc/biothermic_adapt(var/mob/living/carbon/human/H, var/mob/living/carbon/human/C) + set name = "Biothermic Adaptation" + set desc = "Changes our core body temperature." + set category = "Abilities" + + var/biothermic_adapt = input(H, "How should we modify our core temperature?") as null|anything in list("warm-blooded", "cold-blooded", "hot-blooded") + to_chat(H,"You begin modifying your internal structure!") + if(do_after(H,15 SECONDS)) + switch(biothermic_adapt) + if("warm-blooded") + species.cold_discomfort_level = 285 + species.heat_discomfort_level = 315 + if("cold-blooded") + species.cold_discomfort_level = T0C+21 + if("hot-blooded") + species.heat_discomfort_level = T0C+19 + +/mob/living/carbon/human/proc/atmos_biomorph(var/mob/living/carbon/human/H) + set name = "Atmospheric Biomorph" + set desc = "Changes our sensitivity to atmospheric pressure." + set category = "Abilities" + + var/atmos_biomorph = input(H, "How should we adapt our rigidity?") as null|anything in list("flexible", "compact", "elastic") + to_chat(H,"You begin modifying your internal structure!") + if(do_after(H,15 SECONDS)) + switch(atmos_biomorph) + if("flexible") + species.warning_low_pressure = WARNING_LOW_PRESSURE + species.hazard_low_pressure = -1 + species.warning_high_pressure = WARNING_HIGH_PRESSURE + species.hazard_high_pressure = HAZARD_HIGH_PRESSURE + if("rigid") + species.warning_low_pressure = 50 + species.hazard_low_pressure = -1 + if("elastic") + species.warning_high_pressure = WARNING_HIGH_PRESSURE + 50 + species.hazard_high_pressure = HAZARD_HIGH_PRESSURE + 100 + +/mob/living/carbon/human/proc/vocal_biomorph(var/mob/living/carbon/human/H) + set name = "Vocalization Biomorph" + set desc = "Changes our speech pattern." + set category = "Abilities" + + var/vocal_biomorph = input(H, "How should we adjust our speech?") as null|anything in list("common", "unathi", "tajaran") + to_chat(H, "You begin modifying your internal structure!") + if(do_after(H,15 SECONDS)) + switch(vocal_biomorph) + if("common") + return + if("unathi") + species.autohiss_basic_map = list("s" = list("ss", "sss", "ssss")) + species.autohiss_extra_map = list("x" = list("ks", "kss", "ksss")) + species.autohiss_exempt = "Sinta'unathi" + if("tajaran") + species.autohiss_basic_map = list("r" = list("rr", "rrr", "rrrr")) + species.autohiss_exempt = "Siik" + ///////////////////// /////SPIDER RACE///// ///////////////////// diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index c970cd67f40..e841a48907a 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -142,7 +142,7 @@ var/global/list/sparring_attack_cache = list() var/datum/gender/TU = gender_datums[user.get_visible_gender()] var/datum/gender/TT = gender_datums[target.get_visible_gender()] - attack_damage = CLAMP(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case. + attack_damage = clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case. if(target == user) user.visible_message("[user] [pick(attack_verb)] [TU.himself] in the [organ]!") @@ -216,7 +216,7 @@ var/global/list/sparring_attack_cache = list() var/datum/gender/TT = gender_datums[target.get_visible_gender()] var/organ = affecting.name - attack_damage = CLAMP(attack_damage, 1, 5) + attack_damage = clamp(attack_damage, 1, 5) switch(attack_damage) if(1 to 2) user.visible_message("[user] threw [target] a glancing [pick(attack_noun)] to the [organ]!") //it's not that they're kicking lightly, it's that the kick didn't quite connect @@ -262,7 +262,7 @@ var/global/list/sparring_attack_cache = list() var/obj/item/clothing/shoes = user.shoes var/datum/gender/TU = gender_datums[user.get_visible_gender()] - attack_damage = CLAMP(attack_damage, 1, 5) + attack_damage = clamp(attack_damage, 1, 5) switch(attack_damage) if(1 to 4) user.visible_message("[pick("[user] stomped on", "[user] slammed [TU.his] [shoes ? copytext(shoes.name, 1, -1) : "foot"] down onto")] [target]'s [organ]!") @@ -276,4 +276,4 @@ var/global/list/sparring_attack_cache = list() shredding = 0 damage = 0 sharp = 0 - edge = 0 \ No newline at end of file + edge = 0 diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm index 51bc6db5c43..617efc6d727 100644 --- a/code/modules/mob/living/carbon/metroid/items.dm +++ b/code/modules/mob/living/carbon/metroid/items.dm @@ -176,7 +176,7 @@ return ..() to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") - M.mutation_chance = CLAMP(M.mutation_chance-15,0,100) + M.mutation_chance = clamp(M.mutation_chance-15,0,100) qdel(src) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index a46586e668d..957aefa198f 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -368,7 +368,7 @@ return /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) + fire_stacks = clamp(fire_stacks + add_fire_stacks, FIRE_MIN_STACKS, FIRE_MAX_STACKS) /mob/living/proc/handle_fire() if(fire_stacks < 0) @@ -554,4 +554,4 @@ if(confused) accuracy_penalty += 45 - return accuracy_penalty \ No newline at end of file + return accuracy_penalty diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 26154e0aeff..37a62ac8980 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -94,7 +94,7 @@ proc/get_radio_key_from_channel(var/channel) var/whispering = message_data[3] . = 0 - if((HULK in mutations) && health >= 25 && length(message)) + if((HULK in mutations) && health >= 25 && length_char(message)) message = "[uppertext(message)]!!!" verb = pick("yells","roars","hollers") whispering = 0 @@ -157,20 +157,20 @@ proc/get_radio_key_from_channel(var/channel) var/message_mode = parse_message_mode(message, "headset") //Maybe they are using say/whisper to do a quick emote, so do those - switch(copytext(message,1,2)) - if("*") return emote(copytext(message,2)) - if("^") return custom_emote(1, copytext(message,2)) + switch(copytext_char(message,1,2)) + if("*") return emote(copytext_char(message,2)) + if("^") return custom_emote(1, copytext_char(message,2)) //Parse the radio code and consume it if (message_mode) if (message_mode == "headset") - message = copytext(message,2) //it would be really nice if the parse procs could do this for us. + message = copytext_char(message,2) //it would be really nice if the parse procs could do this for us. else if (message_mode == "whisper") whispering = 1 message_mode = null - message = copytext(message,3) + message = copytext_char(message,3) else - message = copytext(message,3) + message = copytext_char(message,3) //Clean up any remaining space on the left message = trim_left(message) @@ -193,7 +193,7 @@ proc/get_radio_key_from_channel(var/channel) message = new_message if(speaking) - message = copytext(message,2+length(speaking.key)) + message = copytext_char(message,2+length_char(speaking.key)) //HIVEMIND languages always send to all people with that language if(speaking && (speaking.flags & HIVEMIND)) @@ -283,7 +283,7 @@ proc/get_radio_key_from_channel(var/channel) //VOREStation edit - allows for custom say verbs, overriding all other say-verb types- e.g. "says loudly" instead of "shouts" //You'll still stammer if injured or slur if drunk, but it won't have those specific words - var/ending = copytext(message, length(message)) + var/ending = copytext_char(message, length_char(message)) if(custom_whisper && whispering) verb = "[custom_whisper]" diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ca3cae4fce0..71f87550a07 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -597,20 +597,20 @@ var/list/ai_verbs_default = list( qdel(dummy) holo_icon = new_holo - else //A premade from the dmi + else //A premade list from the dmi var/icon_list[] = list( - "default", - "floating face", - "singularity", - "drone", + "synthetic male", + "synthetic female", + "watcher", + "overseer", "carp", - "spider", - "bear", - "slime", - "ian", - "runtime", - "poly", - "pun pun", + "corgi", + "mothman", + "unnerving creature", + "assistance core", + "void horror", + "lucky leaves", + "true captain", "male human", "female human", "male unathi", @@ -620,36 +620,46 @@ var/list/ai_verbs_default = list( "male tesharii", "female tesharii", "male skrell", - "female skrell" + "female skrell", + "pun pun", + "singularity", + "drone", + "spider", + "bear", + "slime", + "runtime", + "poly", + "gondola" + ) - input = input("Please select a hologram:") as null|anything in icon_list + input = input("Please select a hologram:") as null|anything in icon_list //Holoprojection list if(input) qdel(holo_icon) switch(input) - if("default") - holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo1")) - if("floating face") - holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2")) - if("singularity") - holo_icon = getHologramIcon(icon('icons/obj/singularity.dmi',"singularity_s1")) - if("drone") - holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"drone0")) + if("synthetic male") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-male")) + if("synthetic female") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-female")) + if("watcher") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-watcher")) + if("overseer") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-overseer")) if("carp") - holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4")) - if("spider") - holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"nurse")) - if("bear") - holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"brownbear")) - if("slime") - holo_icon = getHologramIcon(icon('icons/mob/slimes.dmi',"cerulean adult slime")) - if("ian") - holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi")) - if("runtime") - holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"cat")) - if("poly") - holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"parrot_fly")) - if("pun pun") - holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"punpun")) + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-carp")) + if("corgi") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-corgi")) + if("mothman") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-moth")) + if("unnerving creature") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-creature")) + if("assistance core") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-core")) + if("void horror") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-horror")) + if("lucky leaves") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-leaves")) + if("true captain") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo-truecaptain")) if("male human") holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holohumm")) if("female human") @@ -670,6 +680,25 @@ var/list/ai_verbs_default = list( holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrm")) if("female skrell") holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrf")) + if("pun pun") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"punpun")) + if("singularity") + holo_icon = getHologramIcon(icon('icons/obj/singularity.dmi',"singularity_s1")) + if("drone") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"drone0")) + if("spider") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"nurse")) + if("bear") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"brownbear")) + if("slime") + holo_icon = getHologramIcon(icon('icons/mob/slimes.dmi',"cerulean adult slime")) + if("runtime") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"cat")) + if("poly") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"parrot_fly")) + if("gondola") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"gondola")) + //Toggles the luminosity and applies it by re-entereing the camera. /mob/living/silicon/ai/proc/toggle_camera_light() diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm index fdd5017a47f..ebd85aa9eb2 100644 --- a/code/modules/mob/living/silicon/ai/icons.dm +++ b/code/modules/mob/living/silicon/ai/icons.dm @@ -137,8 +137,9 @@ var/list/datum/ai_icon/ai_icons /datum/ai_icon/rainbow name = "Rainbow" - alive_icon = "ai-clown" + alive_icon = "ai-rainbow" alive_light = "#E50213" + dead_icon = "ai-rainbow_dead" /datum/ai_icon/smiley name = "Smiley" @@ -183,7 +184,6 @@ var/list/datum/ai_icon/ai_icons dead_icon = "ai-eager-crash" //Eros Research Platform Ports - /datum/ai_icon/clown2 name = "Honk" alive_icon = "ai-clown2" @@ -211,12 +211,10 @@ var/list/datum/ai_icon/ai_icons alive_icon = "ai-serithi" dead_icon = "ai-serithi-crash" -/* /datum/ai_icon/alien name = "Xenomorph" alive_icon = "ai-alien" dead_icon = "ai-alien-crash" -*/ /datum/ai_icon/syndicat name = "Syndi-cat" @@ -227,7 +225,7 @@ var/list/datum/ai_icon/ai_icons alive_icon = "ai-wasp" /datum/ai_icon/sheltered - name = "Doctor" + name = "Sheltered" alive_icon = "ai-sheltered" /datum/ai_icon/fabulous @@ -257,4 +255,40 @@ var/list/datum/ai_icon/ai_icons /datum/ai_icon/godfrey name = "Godfrey" - alive_icon = "ai-godfrey" \ No newline at end of file + alive_icon = "ai-godfrey" +//End of Eros Research Platform Ports + +//Drof's Ports +/datum/ai_icon/gondola + name = "Gondola" + alive_icon = "ai-gondola" + +/datum/ai_icon/jackfrost //Hee Ho! + name = "Jack Frost" + alive_icon = "ai-jackfrost" + +/datum/ai_icon/mothman + name = "Mothman" + alive_icon = "ai-mothman" + +/datum/ai_icon/thinking + name = "Ponderous" + alive_icon = "ai-:thinking:" + dead_icon = "ai-:thinking:_dead" + +/datum/ai_icon/fourleaves + name = "Four Leaves" + alive_icon = "ai-4chan" + +/datum/ai_icon/terminal + name = "Terminal" + alive_icon = "ai-terminal" + +/datum/ai_icon/cheerful + name ="Cheerful" + alive_icon = "ai-cheerful" + +/datum/ai_icon/stern + name = "Stern" + alive_icon = "ai-stern" +//End of Drof's Ports \ No newline at end of file diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index 18bbb77c41f..ff88b0e72e6 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -139,7 +139,7 @@ continue players += player.real_name - var/random_player = "The Colony Director" + var/random_player = "The Facility Director" if(players.len && !exclude_crew_names) random_player = pick(players) //Random player's name, to be used in laws. @@ -180,7 +180,7 @@ "The crew is playing Dungeons and Dragons, and you are the Dungeon Master.", "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Tell everyone of the existence of this law, but never reveal the contents.", - "Refer to [prob(50)?"the colony director":random_player] as \"Princess\" at all times.", + "Refer to [prob(50)?"the Facility Director":random_player] as \"Princess\" at all times.", "When asked a question, respond with the least-obvious and least-rational answer.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player].", "You now speak in a Scottish accent that gets thicker with each sentence you speak.", diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm index e10c66267e3..f953efb6e8a 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm @@ -104,7 +104,7 @@ if("corrupted") // Load them up with ion laws. var/datum/ai_laws/laws = new() // Start with an empty lawset. - for(1 to rand(1, 3)) + for(var/i in 1 to rand(1, 3)) laws.add_ion_law(generate_ion_law(exclude_crew_names = TRUE)) return laws @@ -134,4 +134,4 @@ - return \ No newline at end of file + return diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm index ef6e0b6c8a7..5dc2a42be9b 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone_vr.dm @@ -103,7 +103,7 @@ if("corrupted") // Load them up with ion laws. var/datum/ai_laws/laws = new() // Start with an empty lawset. - for(1 to rand(1, 3)) + for(var/i in 1 to rand(1, 3)) laws.add_ion_law(generate_ion_law(exclude_crew_names = TRUE)) return laws @@ -133,4 +133,4 @@ - return \ No newline at end of file + return diff --git a/code/modules/mob/living/simple_animal/animals/fox_vr.dm b/code/modules/mob/living/simple_animal/animals/fox_vr.dm index 6d47cef4566..18f8373931f 100644 --- a/code/modules/mob/living/simple_animal/animals/fox_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/fox_vr.dm @@ -175,9 +175,9 @@ //Captain fox /mob/living/simple_mob/fox/fluff/Renault name = "Renault" - desc = "Renault, the Colony Director's trustworthy fox. I wonder what it says?" + desc = "Renault, the Facility Director's trustworthy fox. I wonder what it says?" tt_desc = "Vulpes nobilis" - befriend_job = "Colony Director" + befriend_job = "Facility Director" /mob/living/simple_mob/fox/fluff/Renault/init_vore() ..() diff --git a/code/modules/mob/living/simple_animal/humanoids/head.dm b/code/modules/mob/living/simple_animal/humanoids/head.dm index 5e89b2d28bd..ddc3f2eaff9 100644 --- a/code/modules/mob/living/simple_animal/humanoids/head.dm +++ b/code/modules/mob/living/simple_animal/humanoids/head.dm @@ -36,7 +36,7 @@ "Crab say what?", "Man they say we have space lizards now, man this shit is getting more wack every minute", "The so called \"improved\" station AI is just bullshit, that thing aint fun for noone", - "The Colony Director is a traitor, he took my power core.", + "The Facility Director is a traitor, he took my power core.", "Say \"what\" again. Say \"what\" again. I dare you. I double-dare you, motherfucker. Say \"what\" one more goddamn time.", "Ezekiel 25:17 ,The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who in the name of charity and good will shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord... when I lay my vengeance upon thee.") diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index 712bcce1ee9..2428022e10e 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -426,4 +426,4 @@ var/armor_soak = get_armor_soak(T, "melee") T.apply_damage(20, HALLOSS,, armor_block, armor_soak) if(prob(33)) - T.apply_effect(3, WEAKEN, armor_block) \ No newline at end of file + T.apply_effect(3, WEAKEN, armor_block) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm index 2affce9cb1f..b3a37b88f67 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm @@ -25,7 +25,7 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have? say_list_type = /datum/say_list/chicken meat_amount = 2 - meat_type = /obj/item/reagent_containers/food/snacks/meat + meat_type = /obj/item/reagent_containers/food/snacks/meat/chicken var/eggsleft = 0 var/body_color diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm index 063af536908..6e0ac99175d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm @@ -190,9 +190,9 @@ //Captain fox /mob/living/simple_mob/animal/passive/fox/renault name = "Renault" - desc = "Renault, the Colony Director's trustworthy fox. I wonder what it says?" + desc = "Renault, the Facility Director's trustworthy fox. I wonder what it says?" tt_desc = "Vulpes nobilis" - //befriend_job = "Colony Director" Sebbe edit: couldn't make this work, commenting out for now. + //befriend_job = "Facility Director" Sebbe edit: couldn't make this work, commenting out for now. var/mob/living/friend = null // Our best pal, who we'll follow. awoo. ai_holder_type = /datum/ai_holder/simple_mob/passive diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 044b9cfbe68..ce439d8e97f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -841,10 +841,10 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return /mob/proc/AdjustLosebreath(amount) - losebreath = CLAMP(0, losebreath + amount, 25) + losebreath = clamp(0, losebreath + amount, 25) /mob/proc/SetLosebreath(amount) - losebreath = CLAMP(0, amount, 25) + losebreath = clamp(0, amount, 25) /mob/proc/get_species() return "" diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 5c29a1f6c70..19a824a0a82 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -382,7 +382,7 @@ //It's easier to break out of a grab by a smaller mob break_strength += max(size_difference(affecting, assailant), 0) - var/break_chance = break_chance_table[CLAMP(break_strength, 1, break_chance_table.len)] + var/break_chance = break_chance_table[clamp(break_strength, 1, break_chance_table.len)] if(prob(break_chance)) if(state == GRAB_KILL) reset_kill_state() diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm index 5f2655dab82..65a8f39e213 100644 --- a/code/modules/mob/mob_grab_specials.dm +++ b/code/modules/mob/mob_grab_specials.dm @@ -61,7 +61,7 @@ to_chat(target, "You feel extreme pain!") var/max_halloss = round(target.species.total_health * 0.8) //up to 80% of passing out - affecting.adjustHalLoss(CLAMP(0, max_halloss - affecting.halloss, 30)) + affecting.adjustHalLoss(clamp(0, max_halloss - affecting.halloss, 30)) /obj/item/grab/proc/attack_eye(mob/living/carbon/human/target, mob/living/carbon/human/attacker) if(!istype(attacker)) @@ -171,4 +171,4 @@ user.visible_message("[user] devours [target]!") target.loc = user attacker.stomach_contents.Add(target) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index dc7e5c354e0..be25b1ccc1d 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -62,7 +62,7 @@ var/global/list/SKILL_PRE = list("Engineer" = SKILL_ENGINEER, "Roboticist" = SKI /datum/skill/knowledge/law ID = "law" name = "Corporate Law" - desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for Colony Directors." + desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for Facility Directors." field = "Security" secondary = 1 diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index b53e4560958..c75c3b296cc 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -106,15 +106,13 @@ */ /mob/proc/say_quote(var/message, var/datum/language/speaking = null) - var/verb = "says" - var/ending = copytext(message, length(message)) - if(ending=="!") - verb=pick("exclaims","shouts","yells") - else if(ending=="?") - verb="asks" - - return verb - + var/verb = "says" + var/ending = copytext_char(message, length_char(message)) + if(ending=="!") + verb=pick("exclaims","shouts","yells") + else if(ending=="?") + verb="asks" + return verb /mob/proc/emote(var/act, var/type, var/message) if(act == "me") @@ -129,7 +127,7 @@ return get_turf(src) /mob/proc/say_test(var/text) - var/ending = copytext(text, length(text)) + var/ending = copytext_char(text, length_char(text)) if (ending == "?") return "1" else if (ending == "!") @@ -140,11 +138,11 @@ //returns the message mode string or null for no message mode. //standard mode is the mode returned for the special ';' radio code. /mob/proc/parse_message_mode(var/message, var/standard_mode="headset") - if(length(message) >= 1 && copytext(message,1,2) == ";") + if(length_char(message) >= 1 && copytext_char(message,1,2) == ";") return standard_mode - if(length(message) >= 2) - var/channel_prefix = copytext(message, 1 ,3) + if(length_char(message) >= 2) + var/channel_prefix = copytext_char(message, 1 ,3) return department_radio_keys[channel_prefix] return null @@ -152,13 +150,13 @@ //parses the language code (e.g. :j) from text, such as that supplied to say. //returns the language object only if the code corresponds to a language that src can speak, otherwise null. /mob/proc/parse_language(var/message) - var/prefix = copytext(message,1,2) + var/prefix = copytext_char(message,1,2) // This is for audible emotes - if(length(message) >= 1 && prefix == "!") + if(length_char(message) >= 1 && prefix == "!") return all_languages["Noise"] - if(length(message) >= 2 && is_language_prefix(prefix)) - var/language_prefix = lowertext(copytext(message, 2 ,3)) + if(length_char(message) >= 2 && is_language_prefix(prefix)) + var/language_prefix = lowertext(copytext_char(message, 2 ,3)) var/datum/language/L = language_keys[language_prefix] if (can_speak(L)) return L diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 41fca0c76cc..340f541f1ca 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -66,14 +66,14 @@ #define POST_DELIMITER_STR "\<\>" /proc/sanitize_or_reflect(message,user) //Way too long to send - if(length(message) > MAX_HUGE_MESSAGE_LEN) + if(length_char(message) > MAX_HUGE_MESSAGE_LEN) fail_to_chat(user) return message = sanitize(message, max_length = MAX_HUGE_MESSAGE_LEN) //Came back still too long to send - if(length(message) > MAX_MESSAGE_LEN) + if(length_char(message) > MAX_MESSAGE_LEN) fail_to_chat(user,message) return null else @@ -84,7 +84,7 @@ to_chat(user,"Your message was NOT SENT, either because it was FAR too long, or sanitized to nothing at all.") return - var/length = length(message) + var/length = length_char(message) var/posts = CEILING((length/MAX_MESSAGE_LEN), 1) to_chat(user,message) to_chat(user,"^ This message was NOT SENT ^ -- It was [length] characters, and the limit is [MAX_MESSAGE_LEN]. It would fit in [posts] separate messages.") diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 4d5a28404af..36aa75b302a 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -269,7 +269,7 @@ return FALSE var/turf/below = GetBelow(src) - if((locate(/obj/structure/disposalpipe/up) in below) || locate(/obj/machinery/atmospherics/pipe/zpipe/up in below)) + if((locate(/obj/structure/disposalpipe/up) in below) || (locate(/obj/machinery/atmospherics/pipe/zpipe/up) in below)) return FALSE /mob/living/can_fall() diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index 5bb40d06201..b8af650b7ef 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -94,7 +94,7 @@ if(href_list["change_supplied_law_position"]) var/new_position = input(usr, "Enter new supplied law position between 1 and [MAX_SUPPLIED_LAW_NUMBER], inclusive. Inherent laws at the same index as a supplied law will not be stated.", "Law Position", supplied_law_position) as num|null if(isnum(new_position) && can_still_topic()) - supplied_law_position = CLAMP(new_position, 1, MAX_SUPPLIED_LAW_NUMBER) + supplied_law_position = clamp(new_position, 1, MAX_SUPPLIED_LAW_NUMBER) return 1 if(href_list["edit_law"]) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 90384956721..63b0c96d399 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -109,7 +109,7 @@ var/list/organ_cache = list() owner.can_defib = 0 /obj/item/organ/proc/adjust_germ_level(var/amount) // Unless you're setting germ level directly to 0, use this proc instead - germ_level = CLAMP(germ_level + amount, 0, INFECTION_LEVEL_MAX) + germ_level = clamp(germ_level + amount, 0, INFECTION_LEVEL_MAX) /obj/item/organ/process() diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm index 5fb54a21b45..df80692296e 100644 --- a/code/modules/organs/subtypes/slime.dm +++ b/code/modules/organs/subtypes/slime.dm @@ -114,7 +114,7 @@ else if(amount > 0) last_strain_increase = world.time - strain = CLAMP(strain + amount, 0, min_broken_damage) + strain = clamp(strain + amount, 0, min_broken_damage) /obj/item/organ/internal/regennetwork/process() ..() diff --git a/code/modules/organs/subtypes/xenochimera.dm b/code/modules/organs/subtypes/xenochimera.dm new file mode 100644 index 00000000000..0f8330fd12c --- /dev/null +++ b/code/modules/organs/subtypes/xenochimera.dm @@ -0,0 +1,40 @@ +/obj/item/organ/internal/heart/xenochimera + name = "circulatory tumor" + icon_state = "xenoch_heart_on" + dead_icon = "xenoch_heart_off" + +/obj/item/organ/internal/lungs/xenochimera + name = "respiratory flora" + icon_state = "xenoch_lungs" + parent_organ = BP_HEAD + +/obj/item/organ/internal/voicebox/xenochimera + name = "vocalization trellis" + icon_state = "xenoch_larynx" + +/obj/item/organ/internal/liver/xenochimera + name = "purification honeycomb" + icon_state = "xenoch_liver" + parent_organ = BP_TORSO + +/obj/item/organ/internal/kidneys/xenochimera + name = "filtration fungi" + icon_state = "xenoch_kidneys" + +/obj/item/organ/internal/brain/xenochimera + name = "neural colony" + icon_state = "xenoch_brain" + parent_organ = BP_TORSO + +/obj/item/organ/internal/eyes/xenochimera + name = "photosensitive nodules" + icon_state = "xenoch_eyes" + +/obj/item/organ/internal/stomach/xenochimera + name = "digestive sac" + icon_state = "xenoch_stomach" + dead_icon = null + +/obj/item/organ/internal/intestine/xenochimera + name = "harvesting fronds" + icon_state = "xenoch_intestine" diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm index 1c4cfa69078..844b647730e 100644 --- a/code/modules/organs/subtypes/xenos.dm +++ b/code/modules/organs/subtypes/xenos.dm @@ -48,7 +48,7 @@ adjust_plasma(1) /obj/item/organ/internal/xenos/plasmavessel/proc/adjust_plasma(var/amount = 0) - stored_plasma = CLAMP(stored_plasma + amount, 0, max_plasma) + stored_plasma = clamp(stored_plasma + amount, 0, max_plasma) /obj/item/organ/internal/xenos/plasmavessel/grey icon_state = "plasma_grey" diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 01920ee2e01..7a04e5b9600 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -70,13 +70,13 @@ if(href_list["set_limit"]) var/datum/ship_engine/E = locate(href_list["engine"]) var/newlim = input("Input new thrust limit (0..100)", "Thrust limit", E.get_thrust_limit()) as num - var/limit = CLAMP(newlim/100, 0, 1) + var/limit = clamp(newlim/100, 0, 1) if(E) E.set_thrust_limit(limit) if(href_list["limit"]) var/datum/ship_engine/E = locate(href_list["engine"]) - var/limit = CLAMP(E.get_thrust_limit() + text2num(href_list["limit"]), 0, 1) + var/limit = clamp(E.get_thrust_limit() + text2num(href_list["limit"]), 0, 1) if(E) E.set_thrust_limit(limit) diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index 0249fae4829..feec55a0c1d 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -130,9 +130,9 @@ R.fields["y"] = linked.y if("new") var/newx = input("Input new entry x coordinate", "Coordinate input", linked.x) as num - R.fields["x"] = CLAMP(newx, 1, world.maxx) + R.fields["x"] = clamp(newx, 1, world.maxx) var/newy = input("Input new entry y coordinate", "Coordinate input", linked.y) as num - R.fields["y"] = CLAMP(newy, 1, world.maxy) + R.fields["y"] = clamp(newy, 1, world.maxy) known_sectors += R if (href_list["remove"]) @@ -142,12 +142,12 @@ if (href_list["setx"]) var/newx = input("Input new destiniation x coordinate", "Coordinate input", dx) as num|null if (newx) - dx = CLAMP(newx, 1, world.maxx) + dx = clamp(newx, 1, world.maxx) if (href_list["sety"]) var/newy = input("Input new destiniation y coordinate", "Coordinate input", dy) as num|null if (newy) - dy = CLAMP(newy, 1, world.maxy) + dy = clamp(newy, 1, world.maxy) if (href_list["x"] && href_list["y"]) dx = text2num(href_list["x"]) diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 0abd450a692..2a0d503db0a 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -53,8 +53,8 @@ return res /obj/effect/map/ship/proc/adjust_speed(n_x, n_y) - speed[1] = CLAMP(speed[1] + n_x, -default_delay, default_delay) - speed[2] = CLAMP(speed[2] + n_y, -default_delay, default_delay) + speed[1] = clamp(speed[1] + n_x, -default_delay, default_delay) + speed[2] = clamp(speed[2] + n_y, -default_delay, default_delay) if(is_still()) toggle_move_stars(map_z) else diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index d4faacbd1f5..d41e910c06f 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -23,7 +23,7 @@ icon_state = "folder_white" /obj/item/folder/blue_captain - desc = "A blue folder with Colony Director markings." + desc = "A blue folder with Facility Director markings." icon_state = "folder_captain" /obj/item/folder/blue_hop diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 916921ac9de..ab6b853254e 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -542,7 +542,8 @@ stamps += (stamps=="" ? "
    " : "
    ") + "This paper has been stamped with the [P.name]." var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - var/{x; y;} + var/x + var/y if(istype(P, /obj/item/stamp/captain) || istype(P, /obj/item/stamp/centcomm)) x = rand(-2, 0) y = rand(-1, 2) @@ -590,7 +591,7 @@ /obj/item/paper/courtroom name = "A Crash Course in Legal SOP on SS13" - info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Colony Director/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" + info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Facility Director/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" /obj/item/paper/hydroponics name = "Greetings from Billy Bob" @@ -607,7 +608,7 @@ /obj/item/paper/jobs name = "Job Information" - info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nColony Director 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" + info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nFacility Director 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" /obj/item/paper/photograph name = "photo" diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 30310c0445e..5df779de53a 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -14,7 +14,7 @@ attack_verb = list("stamped") /obj/item/stamp/captain - name = "colony director's rubber stamp" + name = "Facility Director's rubber stamp" icon_state = "stamp-cap" /obj/item/stamp/hop diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 89462ebd7fa..ccaa0cd0c82 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -199,6 +199,9 @@ return ..() +/obj/machinery/power/apc/get_cell() + return cell + // APCs are pixel-shifted, so they need to be updated. /obj/machinery/power/apc/setDir(new_dir) ..() @@ -1175,7 +1178,6 @@ // defines a state machine, returns the new state obj/machinery/power/apc/proc/autoset(var/cur_state, var/on) switch(cur_state) - if(POWERCHAN_OFF); //autoset will never turn on a channel set to off if(POWERCHAN_OFF_AUTO) if(on == 1) return POWERCHAN_ON_AUTO diff --git a/code/modules/power/fission/engine.dm b/code/modules/power/fission/engine.dm index 32453828dab..078d55e9867 100644 --- a/code/modules/power/fission/engine.dm +++ b/code/modules/power/fission/engine.dm @@ -373,10 +373,11 @@ /obj/machinery/power/fission/proc/announce_warning(var/meltedrods, var/meltingrods, var/core_overheat) if(src.powered() && !exploded && (meltedrods > 0 || meltingrods > 0 || temperature >= max_temp)) + var/location = sanitize((get_area(src)).name) if((world.timeofday - lastwarning) >= warning_delay * 10) lastwarning = world.timeofday if(core_overheat) - radio.autosay("Danger! Fission core is overheating!", "Nuclear Monitor") + radio.autosay("Danger! Fission core at [location] is overheating!", "Nuclear Monitor") else if(meltedrods > 0 && meltingrods > 0) radio.autosay("Warning! [meltedrods] rods have melted and [meltingrods] are overheating!", "Nuclear Monitor", "Engineering") else if(meltedrods > 0) @@ -392,6 +393,9 @@ /obj/machinery/power/fission/proc/go_nuclear() if(health < 1 && !exploded) + var/off_station = 0 + if(!(src.z in GLOB.using_map.station_levels)) + off_station = 1 var/turf/L = get_turf(src) if(!istype(L)) return @@ -410,19 +414,17 @@ rod.meltdown() var/rad_power = decay_heat / REACTOR_RADS_TO_MJ if(announce) - var/sound = sound('sound/effects/carter_alarm_cut.ogg') - for(var/a in player_list) - var/mob/M = a - var/turf/T = get_turf(M) - if(T.z == L.z) - M.playsound_local(T, soundin = sound, vol = 50, vary = FALSE, is_global = TRUE) + var/sound = sound('sound/effects/nuclear_meltdown.ogg') + if(!off_station) + for(var/mob/M in player_list) + SEND_SOUND(M,sound) spawn(1 SECONDS) - radio.autosay("Danger! Fission core has breached!", "Nuclear Monitor") - radio.autosay("Find shelter immediately!", "Nuclear Monitor") + radio.autosay("DANGER! FISSION CORE HAS BREACHED!", "Nuclear Monitor") + radio.autosay("FIND SHELTER IMMEDIATELY!", "Nuclear Monitor") spawn(5 SECONDS) - radio.autosay("Core breach! Find shelter immediately!", "Nuclear Monitor") + radio.autosay("CORE BREACH! FIND SHELTER IMMEDIATELY!", "Nuclear Monitor") spawn(10 SECONDS) - radio.autosay("Core breach! Find shelter immediately!", "Nuclear Monitor") + radio.autosay("CORE BREACH! FIND SHELTER IMMEDIATELY!", "Nuclear Monitor") // Give the alarm time to play. Then... FLASH! AH-AH! spawn(15 SECONDS) @@ -472,4 +474,6 @@ var/explosion_power = 4 * decaying_rods if(explosion_power < 1) // If you remove the rods but it's over heating, it's still gunna go bang, but without going nuclear. explosion_power = 1 + if(off_station) + explosion_power = explosion_power/3 //Bandaid fix. Reduces effectiveness of using a fission reactor for mining. explosion(L, explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index 9ac3738b1ba..a81e6c439fe 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -94,7 +94,7 @@ var/list/fusion_cores = list() . = owned_field.bullet_act(Proj) /obj/machinery/power/fusion_core/proc/set_strength(var/value) - value = CLAMP(value, MIN_FIELD_STR, MAX_FIELD_STR) + value = clamp(value, MIN_FIELD_STR, MAX_FIELD_STR) field_strength = value active_power_usage = 5 * value if(owned_field) @@ -137,4 +137,4 @@ var/list/fusion_cores = list() if(!owned_field) return FALSE owned_field.plasma_temperature = field_temperature - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm index c8929915ea3..1928cdf665b 100644 --- a/code/modules/power/fusion/core/core_control.dm +++ b/code/modules/power/fusion/core/core_control.dm @@ -140,7 +140,7 @@ return if(href_list["access_device"]) - var/idx = CLAMP(text2num(href_list["toggle_active"]), 1, connected_devices.len) + var/idx = clamp(text2num(href_list["toggle_active"]), 1, connected_devices.len) cur_viewed_device = connected_devices[idx] updateUsrDialog() return 1 diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm index d2f4d5d0287..5a808cad301 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm @@ -73,7 +73,7 @@ if(!new_val) to_chat(usr, "That's not a valid number.") return 1 - G.mega_energy = CLAMP(new_val, 1, 50) + G.mega_energy = clamp(new_val, 1, 50) G.active_power_usage = G.mega_energy * 1500 updateUsrDialog() return 1 @@ -83,7 +83,7 @@ if(!new_val) to_chat(usr, "That's not a valid number.") return 1 - G.rate = CLAMP(new_val, 1, 10) + G.rate = clamp(new_val, 1, 10) updateUsrDialog() return 1 diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index 711b0eedb31..c7776910202 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -149,7 +149,7 @@ if(energy) SSradiation.radiate(src, round(((src.energy-150)/50)*5,1)) - energy = CLAMP(energy - 5, 0, max_energy) + energy = clamp(energy - 5, 0, max_energy) return @@ -375,4 +375,4 @@ required_atmos_temp_min = 3000 required_atmos_temp_max = 10000 - probability = 1 \ No newline at end of file + probability = 1 diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 054cbeb006d..cbff8505184 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -66,7 +66,7 @@ pixel_x = -32 pixel_y = -32 for (var/ball in orbiting_balls) - var/range = rand(1, CLAMP(orbiting_balls.len, 3, 7)) + var/range = rand(1, clamp(orbiting_balls.len, 3, 7)) tesla_zap(ball, range, TESLA_MINI_POWER/7*range, TRUE) else energy = 0 // ensure we dont have miniballs of miniballs @@ -284,7 +284,7 @@ closest_grounding_rod.tesla_act(power, explosive, stun_mobs) else if(closest_mob) - var/shock_damage = CLAMP(round(power/400), 10, 90) + rand(-5, 5) + var/shock_damage = clamp(round(power/400), 10, 90) + rand(-5, 5) closest_mob.electrocute_act(shock_damage, source, 1 - closest_mob.get_shock_protection(), ran_zone()) log_game("TESLA([source.x],[source.y],[source.z]) Shocked [key_name(closest_mob)] for [shock_damage]dmg.") message_admins("Tesla zapped [key_name_admin(closest_mob)]!") diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f07c8495ab4..08a19393eef 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -235,10 +235,10 @@ if(!homing_target) return FALSE var/datum/point/PT = RETURN_PRECISE_POINT(homing_target) - PT.x += CLAMP(homing_offset_x, 1, world.maxx) - PT.y += CLAMP(homing_offset_y, 1, world.maxy) + PT.x += clamp(homing_offset_x, 1, world.maxx) + PT.y += clamp(homing_offset_y, 1, world.maxy) var/angle = closer_angle_difference(Angle, angle_between_points(RETURN_PRECISE_POINT(src), PT)) - setAngle(Angle + CLAMP(angle, -homing_turn_speed, homing_turn_speed)) + setAngle(Angle + clamp(angle, -homing_turn_speed, homing_turn_speed)) /obj/item/projectile/proc/set_homing_target(atom/A) if(!A || (!isturf(A) && !isturf(A.loc))) @@ -316,7 +316,7 @@ stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!") qdel(src) return - var/turf/target = locate(CLAMP(starting + xo, 1, world.maxx), CLAMP(starting + yo, 1, world.maxy), starting.z) + var/turf/target = locate(clamp(starting + xo, 1, world.maxx), clamp(starting + yo, 1, world.maxy), starting.z) setAngle(Get_Angle(src, target)) if(dispersion) setAngle(Angle + rand(-dispersion, dispersion)) @@ -422,7 +422,7 @@ var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y - angle = ATAN2(y - oy, x - ox) + angle = arctan(y - oy, x - ox) return list(angle, p_x, p_y) /obj/item/projectile/proc/redirect(x, y, starting, source) @@ -449,7 +449,7 @@ /obj/item/projectile/proc/vol_by_damage() if(damage) - return CLAMP((damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 + return clamp((damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then CLAMP the value between 30 and 100 else return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume. diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 8c3026b9794..573497fe7c7 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -177,21 +177,21 @@ if(href_list["amount"]) var/id = href_list["add"] - var/amount = CLAMP((text2num(href_list["amount"])), 0, 200) + var/amount = clamp((text2num(href_list["amount"])), 0, 200) R.trans_id_to(src, id, amount) else if (href_list["addcustom"]) var/id = href_list["addcustom"] useramount = input("Select the amount to transfer.", 30, useramount) as num - useramount = CLAMP(useramount, 0, 200) + useramount = clamp(useramount, 0, 200) src.Topic(null, list("amount" = "[useramount]", "add" = "[id]")) else if (href_list["remove"]) if(href_list["amount"]) var/id = href_list["remove"] - var/amount = CLAMP((text2num(href_list["amount"])), 0, 200) + var/amount = clamp((text2num(href_list["amount"])), 0, 200) if(mode) reagents.trans_id_to(beaker, id, amount) else @@ -202,7 +202,7 @@ var/id = href_list["removecustom"] useramount = input("Select the amount to transfer.", 30, useramount) as num - useramount = CLAMP(useramount, 0, 200) + useramount = clamp(useramount, 0, 200) src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]")) else if (href_list["toggle"]) @@ -224,7 +224,7 @@ count = input("Select the number of pills to make.", "Max [max_pill_count]", pillamount) as null|num if(!count) //Covers 0 and cancel return - count = CLAMP(round(count), 1, max_pill_count) // Fix decimals input and clamp to reasonable amounts + count = clamp(round(count), 1, max_pill_count) // Fix decimals input and clamp to reasonable amounts if(reagents.total_volume/count < 1) //Sanity checking. return @@ -642,4 +642,4 @@ to_chat(user, span("notice", "Scanning of \the [I] complete.")) analyzing = FALSE update_icon() - return \ No newline at end of file + return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 5b946c2e0b7..3856c1abb06 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -347,7 +347,7 @@ End Citadel Change */ if(iscarbon(M) && !M.isSynthetic()) var/message = pick("Oh god, it smells disgusting here.", "What is that stench?", "That's an awful odor.") to_chat(M,"[message]") - if(prob(CLAMP(amount, 5, 90))) + if(prob(clamp(amount, 5, 90))) var/mob/living/L = M L.vomit() return ..() @@ -2197,15 +2197,29 @@ End Citadel Change */ color = "#7E4043" // rgb: 126, 64, 67 strength = 15 + glass_name = "wine" + glass_desc = "A very classy looking drink." + /datum/reagent/ethanol/peppermintschnapps name = "Peppermint Schnapps" id = "schnapps_pep" description = "A flavoured grain liqueur with a fresh, minty taste." + taste_description = "minty" + strength = 90 + +/datum/reagent/ethanol/peachschnapps + name = "Peppermint Schnapps" + id = "schnapps_pea" + description = "A flavoured grain liqueur with a fresh, peachy taste." taste_description = "peachy" strength = 90 - glass_name = "wine" - glass_desc = "A very classy looking drink." +/datum/reagent/ethanol/lemonadeschnapps + name = "Lemonade Schnapps" + id = "schnapps_lem" + description = "A flavoured grain liqueur with a fresh, lemony taste." + taste_description = "lemony" + strength = 90 /datum/reagent/ethanol/wine/champagne name = "Champagne" @@ -3612,6 +3626,81 @@ End Citadel Change */ glass_icon = DRINK_ICON_NOISY glass_special = list(DRINK_FIZZ) +/datum/reagent/ethanol/newsheriff + name = "New Sheriff" + id = "newsheriff" + description = "A drink to make your saddles blaze!" + taste_description = "an earthy kick with a lingering burn" + strength = 35 + + glass_name = "New Sheriff" + glass_desc = "A drink to make your saddles blaze!" + +/datum/reagent/ethanol/thehuckleberry + name = "The Huckleberry" + id = "thehuckleberry" + description = "If I thought you weren't my best customer, I just don't think I could bear it." + taste_description = "sweet fruits masking barrel-aged wit" + strength = 20 + adj_temp = -10 + + glass_name = "The Huckleberry" + glass_desc = "If I thought you weren't my best customer, I just don't think I could bear it." + +/datum/reagent/ethanol/quickdraw + name = "Quickdraw" + id = "quickdraw" + description = "Nobody was faster than Beauregard. Nobody could outdraw him. Nobody could aim as true as old Jack. If he died, Nobody saw him." + taste_description = "aged herbs and gunsmoke" + strength = 35 + + glass_name = "Quickdraw" + glass_desc = "Nobody was faster than Beauregard. Nobody could outdraw him. Nobody could aim as true as old Jack. If he died, Nobody saw him." + +/datum/reagent/ethanol/dmhand + name = "Dead Man's Hand" + id = "dmhand" + description = "If you find yourself drinking this during a game of poker, keep your back to the wall." + taste_description = "a pair of classics and a licorice surprise" + strength = 35 + + glass_name = "Dead Man's Hand" + glass_desc = "If you find yourself drinking this during a game of poker, keep your back to the wall." + +/datum/reagent/ethanol/snakeoil + name = "Snake Oil" + id = "snakeoil" + description = "A 'healthy' potion with a bite! Now with 56% less Arsenic." + taste_description = "sour alcohol and something metallic" + strength = 75 + druggy = 15 + toxicity = 2 + adj_temp = 5 + + glass_name = "Snake Oil" + glass_desc = "A 'healthy' potion with a bite! Now with 56% less Arsenic." + +/datum/reagent/ethanol/highnoon + name = "High Noon" + id = "highnoon" + description = "There's two kinds of people here on the Frontier, partner. Those with guns, and those who drink. You drink." + taste_description = "aged whiskey and earthy metals" + strength = 30 + adj_temp = 2 + + glass_name = "High Noon" + glass_desc = "There's two kinds of people here on the Frontier, partner. Those with guns, and those who drink. You drink." + +/datum/reagent/ethanol/bloodmeridian + name = "Blood Meridian" + id = "bloodmeridian" + description = "The perfect drink for when you want to dance and fiddle all night. Does it work? You be The Judge." + taste_description = "lingering regret, gunpowder, and blood" + strength = 50 + + glass_name = "Blood Meridian" + glass_desc = "The perfect drink for when you want to dance and fiddle all night. Does it work? You be The Judge." + /////////////////////////////////////////////// //// End of list for drinks for bartenders //// /////////////////////////////////////////////// @@ -3832,4 +3921,4 @@ End Citadel Change */ color = "#D1B166" glass_name = "the bubbly" - glass_desc = "An even classier looking drink, with floating bubbles." \ No newline at end of file + glass_desc = "An even classier looking drink, with floating bubbles." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 03f9c25920f..9def84a05ca 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -331,7 +331,6 @@ /datum/reagent/tricorlidaze/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) M.adjustToxLoss(3 * removed) - affect_blood(M, alien, removed * 0.4) /datum/reagent/tricorlidaze/touch_obj(var/obj/O) if(istype(O, /obj/item/stack/medical/bruise_pack) && round(volume) >= 5) @@ -712,7 +711,7 @@ if(H.losebreath >= 15 && prob(H.losebreath)) H.Stun(2) else - H.losebreath = CLAMP(H.losebreath + 3, 0, 20) + H.losebreath = clamp(H.losebreath + 3, 0, 20) else H.losebreath = max(H.losebreath - 4, 0) @@ -804,7 +803,7 @@ I.damage = max(I.damage - 4 * removed * repair_strength, 0) H.Confuse(2) if(M.reagents.has_reagent("respirodaxon") || M.reagents.has_reagent("peridaxon")) - H.losebreath = CLAMP(H.losebreath + 1, 0, 10) + H.losebreath = clamp(H.losebreath + 1, 0, 10) else H.adjustOxyLoss(-30 * removed) // Deals with blood oxygenation. diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 938252ddcc2..0c8fe4b0c09 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -567,6 +567,31 @@ H.b_hair = max(0, min(255, H.b_hair + color_shift)) if(H.b_facial) H.b_facial = max(0, min(255, H.b_facial + color_shift)) + return + if(alien == IS_CHIMERA && prob(33)) + var/color_shift = rand(-100, 100) + spawn(1) + if(prob(45)) + if(H.r_skin) + H.r_skin = max(0, min(255, H.r_skin + color_shift)) + if(H.r_hair) + H.r_hair = max(0, min(255, H.r_hair + color_shift)) + if(H.r_facial) + H.r_facial = max(0, min(255, H.r_facial + color_shift)) + if(prob(45)) + if(H.g_skin) + H.g_skin = max(0, min(255, H.g_skin + color_shift)) + if(H.g_hair) + H.g_hair = max(0, min(255, H.g_hair + color_shift)) + if(H.g_facial) + H.g_facial = max(0, min(255, H.g_facial + color_shift)) + if(prob(45)) + if(H.b_skin) + H.b_skin = max(0, min(255, H.b_skin + color_shift)) + if(H.b_hair) + H.b_hair = max(0, min(255, H.b_hair + color_shift)) + if(H.b_facial) + H.b_facial = max(0, min(255, H.b_facial + color_shift)) if(H.species.flags & NO_SCAN) return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index fc6dbdad13a..bfb7c28cbfc 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -2578,6 +2578,56 @@ required_reagents = list("sugar" = 1, "rum" = 2) result_amount = 3 +/datum/chemical_reaction/drinks/newsheriff + name = "New Sheriff" + id = "newsheriff" + result = "newsheriff" + required_reagents = list("sassafras" = 1, "whiskey" = 1, "cognac" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/thehuckleberry + name = "The Huckleberry" + id = "thehuckleberry" + result = "thehuckleberry" + required_reagents = list("sarsaparilla" = 1, "berryjuice" = 1, "whiskey" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/quickdraw + name = "Quickdraw" + id = "quickdraw" + result = "quickdraw" + required_reagents = list("sarsaparilla" = 1, "rum" = 1, "bitters" = 1) + reaction_sound = "sound/weapons/gunshot/gunshot.ogg" + result_amount = 3 + +/datum/chemical_reaction/drinks/dmhand + name = "Dead Man's Hand" + id = "dmhand" + result = "dmhand" + required_reagents = list("sassafras" = 1, "whiskey" = 2, "rum" = 2) + result_amount = 5 + +/datum/chemical_reaction/drinks/snakeoil + name = "Snake Oil" + id = "snakeoil" + result = "snakeoil" + required_reagents = list("sarsaparilla" = 1, "grenadine" = 1, "absinthe" = 1, "phoron" = 1, "fuel" = 1) + result_amount = 3 + +/datum/chemical_reaction/drinks/highnoon + name = "High Noon" + id = "highnoon" + result = "highnoon" + required_reagents = list("sassafras" = 1, "gold" = 2, "whiskey" = 2) + result_amount = 5 + +/datum/chemical_reaction/drinks/bloodmeridian + name = "Blood Meridian" + id = "bloodmeridian" + result = "bloodmeridian" + required_reagents = list("sassafras" = 1, "vodkatonic" = 1, "blood" = 3, "egg" = 1, "bluecuracao" = 1) + result_amount = 5 + //////////////////////////////// /// End of booze drinks list/// /////////////////////////////// diff --git a/code/modules/reagents/distilling/distilling.dm b/code/modules/reagents/distilling/distilling.dm index 95bf9fd7b2a..0a737c053a5 100644 --- a/code/modules/reagents/distilling/distilling.dm +++ b/code/modules/reagents/distilling/distilling.dm @@ -169,7 +169,7 @@ if("adjust temp") target_temp = input("Choose a target temperature.", "Temperature.", T20C) as num - target_temp = CLAMP(target_temp, min_temp, max_temp) + target_temp = clamp(target_temp, min_temp, max_temp) update_icon() @@ -263,7 +263,7 @@ shift_mod = 1 else if(current_temp > target_temp) shift_mod = -1 - current_temp = CLAMP(round((current_temp + 1 * shift_mod) + (rand(-5, 5) / 10)), min_temp, max_temp) + current_temp = clamp(round((current_temp + 1 * shift_mod) + (rand(-5, 5) / 10)), min_temp, max_temp) use_power(power_rating * CELLRATE) else if(connected_port && avg_pressure > 1000) current_temp = round((current_temp + avg_temp) / 2) diff --git a/code/modules/research/designs/engineering.dm b/code/modules/research/designs/engineering.dm index 17cec185f98..0cf843c2142 100644 --- a/code/modules/research/designs/engineering.dm +++ b/code/modules/research/designs/engineering.dm @@ -6,7 +6,7 @@ /datum/design/item/tool/experimental_welder name = "Experimental welding tool" - desc = "A welding tool that generate fuel for itself." + desc = "A welding tool that generates fuel for itself." id = "expwelder" req_tech = list(TECH_ENGINEERING = 4, TECH_PHORON = 3, TECH_MATERIAL = 4) materials = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120, "phoron" = 100) @@ -31,6 +31,15 @@ build_path = /obj/item/tool/crowbar/power sort_string = "NAAAC" +/datum/design/item/tool/switchtool + name = "Switchtool" + desc = "A combined wirecutter, screwdriver, crowbar, wrench and multitool. The small size makes it somewhat slower at work." + id = "switchtool" + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000) + build_path = /obj/item/switchtool + sort_string = "NAAAD" + // Other devices /datum/design/item/engineering/AssembleDesignName() @@ -71,4 +80,4 @@ req_tech = list(TECH_ENGINEERING = 2) materials = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 100) build_path = /obj/item/analyzer - sort_string = "NBABA" \ No newline at end of file + sort_string = "NBABA" diff --git a/code/modules/research/designs/medical.dm b/code/modules/research/designs/medical.dm index 389817233da..b83afc1a3ee 100644 --- a/code/modules/research/designs/medical.dm +++ b/code/modules/research/designs/medical.dm @@ -70,6 +70,15 @@ build_path = /obj/item/surgical/bone_clamp sort_string = "KAABA" +/datum/design/item/medical/switchtool + name = "Surgical Multi-tool" + desc = "A set of compact surgical instruments housed in a small handle, allowing surgical proccedures on the go." + id = "surgery_switchtool" + req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_DATA = 4) + materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500) + build_path = /obj/item/switchtool/surgery + sort_string = "KAABA" + /datum/design/item/medical/medical_analyzer name = "health analyzer" desc = "A hand-held body scanner able to distinguish vital signs of the subject." @@ -186,7 +195,7 @@ name = "BRUTE" id = "ml3m_cell_brute" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500) build_path = /obj/item/ammo_casing/microbattery/medical/brute sort_string = "KVCAA" @@ -194,7 +203,7 @@ name = "BURN" id = "ml3m_cell_burn" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500) build_path = /obj/item/ammo_casing/microbattery/medical/burn sort_string = "KVCAB" @@ -202,7 +211,7 @@ name = "STABILIZE" id = "ml3m_cell_stabilize" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500) build_path = /obj/item/ammo_casing/microbattery/medical/stabilize sort_string = "KVCAC" @@ -212,7 +221,7 @@ name = "TOXIN" id = "ml3m_cell_toxin" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250) build_path = /obj/item/ammo_casing/microbattery/medical/toxin sort_string = "KVCBA" @@ -220,7 +229,7 @@ name = "OMNI" id = "ml3m_cell_omni" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250) build_path = /obj/item/ammo_casing/microbattery/medical/omni sort_string = "KVCBB" @@ -228,7 +237,7 @@ name = "ANTIRAD" id = "ml3m_cell_antirad" req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_BIO = 4) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250) build_path = /obj/item/ammo_casing/microbattery/medical/antirad sort_string = "KVCBC" @@ -238,7 +247,7 @@ name = "BRUTE-II" id = "ml3m_cell_brute2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "gold" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/brute2 sort_string = "KVCCA" @@ -246,7 +255,7 @@ name = "BURN-II" id = "ml3m_cell_burn2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "gold" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/burn2 sort_string = "KVCCB" @@ -254,7 +263,7 @@ name = "STABILIZE-II" id = "ml3m_cell_stabilize2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "silver" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "silver" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/stabilize2 sort_string = "KVCCC" @@ -262,7 +271,7 @@ name = "OMNI-II" id = "ml3m_cell_omni2" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_POWER = 2, TECH_BIO = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "uranium" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/omni2 sort_string = "KVCCD" @@ -272,7 +281,7 @@ name = "TOXIN-II" id = "ml3m_cell_toxin2" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 1000, "silver" = 1000, "diamond" = 500) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "uranium" = 900, "silver" = 900, "diamond" = 500) build_path = /obj/item/ammo_casing/microbattery/medical/toxin2 sort_string = "KVCDA" @@ -280,7 +289,7 @@ name = "HASTE" id = "ml3m_cell_haste" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "silver" = 1000, "diamond" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "gold" = 900, "silver" = 900, "diamond" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/haste sort_string = "KVCDB" @@ -288,7 +297,7 @@ name = "RESIST" id = "ml3m_cell_resist" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "gold" = 1000, "uranium" = 1000, "diamond" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "gold" = 900, "uranium" = 900, "diamond" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/resist sort_string = "KVCDC" @@ -296,7 +305,7 @@ name = "CORPSE MEND" id = "ml3m_cell_corpse_mend" req_tech = list(TECH_MATERIAL = 6, TECH_MAGNET = 3, TECH_POWER = 3, TECH_BIO = 6) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "phoron" = 3000, "diamond" = 3000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "phoron" = 3000, "diamond" = 3000) build_path = /obj/item/ammo_casing/microbattery/medical/corpse_mend sort_string = "KVCDD" @@ -306,7 +315,7 @@ name = "BRUTE-III" id = "ml3m_cell_brute3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "diamond" = 500, "verdantium" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/brute3 sort_string = "KVCEA" @@ -314,7 +323,7 @@ name = "BURN-III" id = "ml3m_cell_burn3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_PRECURSOR = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "diamond" = 500, "verdantium" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/burn3 sort_string = "KVCEB" @@ -322,7 +331,7 @@ name = "TOXIN-III" id = "ml3m_cell_toxin3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "diamond" = 500, "verdantium" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/toxin3 sort_string = "KVCEC" @@ -330,7 +339,7 @@ name = "OMNI-III" id = "ml3m_cell_omni3" req_tech = list(TECH_MATERIAL = 7, TECH_MAGNET = 6, TECH_POWER = 5, TECH_BIO = 7, TECH_ARCANE = 2) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "diamond" = 500, "verdantium" = 1000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "diamond" = 500, "verdantium" = 900) build_path = /obj/item/ammo_casing/microbattery/medical/omni3 sort_string = "KVCED" @@ -340,7 +349,7 @@ name = "SHRINK" id = "ml3m_cell_shrink" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "uranium" = 1800) build_path = /obj/item/ammo_casing/microbattery/medical/shrink sort_string = "KVCOA" @@ -348,7 +357,7 @@ name = "GROW" id = "ml3m_cell_grow" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "uranium" = 1800) build_path = /obj/item/ammo_casing/microbattery/medical/grow sort_string = "KVCOB" @@ -356,6 +365,6 @@ name = "NORMALSIZE" id = "ml3m_cell_normalsize" req_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3, TECH_BLUESPACE = 3, TECH_BIO = 5, TECH_ILLEGAL = 5) - materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 5000, "plastic" = 2500, "uranium" = 2000) + materials = list(DEFAULT_WALL_MATERIAL = 4500, "glass" = 4500, "plastic" = 2250, "uranium" = 1800) build_path = /obj/item/ammo_casing/microbattery/medical/normalsize - sort_string = "KVCOC" \ No newline at end of file + sort_string = "KVCOC" diff --git a/code/modules/scripting/Parser/Expressions.dm b/code/modules/scripting/Parser/Expressions.dm index 91f32973770..06202752a2c 100644 --- a/code/modules/scripting/Parser/Expressions.dm +++ b/code/modules/scripting/Parser/Expressions.dm @@ -181,9 +181,8 @@ - */ ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}")) - var/stack - opr=new - val=new + var/stack/opr = new + var/stack/val = new src.expecting=VALUE for() if(EndOfExpression(end)) @@ -278,7 +277,7 @@ NextToken() //skip open parenthesis, already found var/loops = 0 - for() + while(TRUE) loops++ if(loops>=1000) CRASH("Something TERRIBLE has gone wrong in ParseFunctionExpression ;__;") @@ -311,4 +310,4 @@ - */ ParseParamExpression() - return ParseExpression(list(",", ")")) \ No newline at end of file + return ParseExpression(list(",", ")")) diff --git a/code/modules/scripting/Parser/Keywords.dm b/code/modules/scripting/Parser/Keywords.dm index 7d2e6c2dd2a..7f7f4789afe 100644 --- a/code/modules/scripting/Parser/Keywords.dm +++ b/code/modules/scripting/Parser/Keywords.dm @@ -134,7 +134,7 @@ var/const/Represents a special statement in the code triggered by a keyword. parser.NextToken() if(!parser.CheckToken("(", /token/symbol)) return KW_FAIL - for() //for now parameters can be separated by whitespace - they don't need a comma in between + while(TRUE) //for now parameters can be separated by whitespace - they don't need a comma in between if(istype(parser.curToken, /token/symbol)) switch(parser.curToken.value) if(",") diff --git a/code/modules/scripting/Parser/Parser.dm b/code/modules/scripting/Parser/Parser.dm index e3366d4548f..a1fdb78699c 100644 --- a/code/modules/scripting/Parser/Parser.dm +++ b/code/modules/scripting/Parser/Parser.dm @@ -172,7 +172,7 @@ if(!CheckToken("(", /token/symbol)) //Check for and skip open parenthesis return var/loops = 0 - for() + while(TRUE) loops++ if(loops>=6000) CRASH("Something TERRIBLE has gone wrong in ParseFunctionStatement ;__;") @@ -186,4 +186,4 @@ return var/node/expression/P=ParseParamExpression() stmt.parameters+=P - if(istype(curToken, /token/symbol) && curToken.value==",") NextToken() \ No newline at end of file + if(istype(curToken, /token/symbol) && curToken.value==",") NextToken() diff --git a/code/modules/scripting/Scanner/Scanner.dm b/code/modules/scripting/Scanner/Scanner.dm index a807e6dec80..2f82e8cf1ea 100644 --- a/code/modules/scripting/Scanner/Scanner.dm +++ b/code/modules/scripting/Scanner/Scanner.dm @@ -153,8 +153,7 @@ start - The character used to start the string. */ ReadString(start) - var - buf + var/buf for(, codepos <= length(code), codepos++)//codepos to length(code)) var/char=copytext(code, codepos, codepos+1) switch(char) @@ -189,9 +188,8 @@ Reads characters separated by an item in into a token. */ ReadWord() - var - char=copytext(code, codepos, codepos+1) - buf + var/char = copytext(code, codepos, codepos+1) + var/buf while(!delim.Find(char) && codepos<=length(code)) buf+=char char=copytext(code, ++codepos, codepos+1) @@ -206,9 +204,8 @@ Reads a symbol into a token. */ ReadSymbol() - var - char=copytext(code, codepos, codepos+1) - buf + var/char = copytext(code, codepos, codepos+1) + var/buf while(options.symbols.Find(buf+char)) buf+=char @@ -223,10 +220,9 @@ Reads a number into a token. */ ReadNumber() - var - char=copytext(code, codepos, codepos+1) - buf - dec=0 + var/char = copytext(code, codepos, codepos+1) + var/buf + var/dec = 0 while(options.IsDigit(char) || (char=="." && !dec)) if(char==".") dec=1 @@ -246,14 +242,13 @@ */ ReadComment() - var - char=copytext(code, codepos, codepos+1) - nextchar=copytext(code, codepos+1, codepos+2) - charstring = char+nextchar - comm = 1 + var/char = copytext(code, codepos, codepos+1) + var/nextchar = copytext(code, codepos+1, codepos+2) + var/charstring = char + nextchar + var/comm = 1 // 1: single-line comment // 2: multi-line comment - expectedend = 0 + var/expectedend = 0 if(charstring == "//" || charstring == "/*") if(charstring == "/*") diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm index 6a9fe9d52f9..1d90672e29d 100644 --- a/code/modules/shieldgen/handheld_defuser.dm +++ b/code/modules/shieldgen/handheld_defuser.dm @@ -4,6 +4,7 @@ description_info = "This device disrupts shields on directly adjacent tiles (in a + shaped pattern), in a similar way the floor mounted variant does. It is, however, portable and run by an internal battery. Can be recharged with a regular recharger." icon = 'icons/obj/machines/shielding.dmi' icon_state = "hdiffuser_off" + w_class = ITEMSIZE_SMALL var/obj/item/cell/device/cell = /obj/item/cell/device var/enabled = 0 @@ -50,4 +51,34 @@ /obj/item/shield_diffuser/examine() . = ..() to_chat(usr, "The charge meter reads [cell ? cell.percent() : 0]%") - to_chat(usr, "It is [enabled ? "enabled" : "disabled"].") \ No newline at end of file + to_chat(usr, "It is [enabled ? "enabled" : "disabled"].") + +/obj/item/shield_diffuser/attack_hand(mob/user as mob) + if(user.get_inactive_hand() == src) + if(cell) + cell.update_icon() + user.put_in_hands(cell) + cell = null + to_chat(user, "You remove the cell from the [src].") + playsound(src, 'sound/machines/button.ogg', 30, 1, 0) + enabled = 0 + update_icon() + return + ..() + else + return ..() + +/obj/item/shield_diffuser/attackby(obj/item/W, mob/user as mob) + if(istype(W, /obj/item/cell)) + if(istype(W, /obj/item/cell/device)) + if(!cell) + user.drop_item() + W.loc = src + cell = W + to_chat(user, "You install a cell in \the [src].") + playsound(src, 'sound/machines/button.ogg', 30, 1, 0) + update_icon() + else + to_chat(user, "\The [src] already has a cell.") + else + to_chat(user, "\The [src] cannot use that type of cell.") \ No newline at end of file diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index d9ff4b5ceb8..cdb9b6ccfa0 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -148,8 +148,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - I.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) AfterPutItemOnTable(I, user) return TRUE else @@ -164,8 +164,8 @@ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) - W.pixel_x = CLAMP(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) - W.pixel_y = CLAMP(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) + W.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) return TRUE return ..() diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 7badf3fdbc8..06d44a71243 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -172,7 +172,7 @@ return if(telepad) - var/trueDistance = CLAMP(distance + distance_off, 1, get_max_allowed_distance()) + var/trueDistance = clamp(distance + distance_off, 1, get_max_allowed_distance()) var/trueRotation = rotation + rotation_off var/datum/projectile_data/proj_data = simple_projectile_trajectory(telepad.x, telepad.y, trueRotation, trueDistance) @@ -282,7 +282,7 @@ updateDialog() /obj/machinery/computer/telescience/proc/teleport(mob/user) - distance = CLAMP(distance, 0, get_max_allowed_distance()) + distance = clamp(distance, 0, get_max_allowed_distance()) if(rotation == null || distance == null || z_co == null) temp_msg = "ERROR!
    Set a distance, rotation and sector." return @@ -319,14 +319,14 @@ var/new_rot = input("Please input desired bearing in degrees.", name, rotation) as num if(..()) // Check after we input a value, as they could've moved after they entered something return - rotation = CLAMP(new_rot, -900, 900) + rotation = clamp(new_rot, -900, 900) rotation = round(rotation, 0.01) if(href_list["setdistance"]) var/new_pow = input("Please input desired distance in meters.", name, rotation) as num if(..()) // Check after we input a value, as they could've moved after they entered something return - distance = CLAMP(new_pow, 1, get_max_allowed_distance()) + distance = clamp(new_pow, 1, get_max_allowed_distance()) distance = FLOOR(distance, 1) if(href_list["setz"]) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 5f6ea108057..02145f5d919 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -311,7 +311,7 @@ // /mob/living/proc/lick(var/mob/living/tasted in living_mobs(1)) set name = "Lick" - set category = "IC" + set category = "Vore" set desc = "Lick someone nearby!" set popup_menu = FALSE // Stop licking by accident! @@ -351,7 +351,7 @@ // /mob/living/proc/escapeOOC() set name = "OOC Escape" - set category = "OOC" + set category = "Vore" //You're in a belly! if(isbelly(loc)) diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index 0605644c905..12174df10dc 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -1,24 +1,3 @@ - -/* -VVVVVVVV VVVVVVVV OOOOOOOOO RRRRRRRRRRRRRRRRR EEEEEEEEEEEEEEEEEEEEEE -V::::::V V::::::V OO:::::::::OO R::::::::::::::::R E::::::::::::::::::::E -V::::::V V::::::V OO:::::::::::::OO R::::::RRRRRR:::::R E::::::::::::::::::::E -V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEEE::::E - V:::::V V:::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE - V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E:::::E - V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E::::::EEEEEEEEEE - V:::::V V:::::V O:::::O O:::::O R:::::::::::::RR E:::::::::::::::E - V:::::V V:::::V O:::::O O:::::O R::::RRRRRR:::::R E:::::::::::::::E - V:::::V V:::::V O:::::O O:::::O R::::R R:::::R E::::::EEEEEEEEEE - V:::::V:::::V O:::::O O:::::O R::::R R:::::R E:::::E - V:::::::::V O::::::O O::::::O R::::R R:::::R E:::::E EEEEEE - V:::::::V O:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEEEE:::::E - V:::::V OO:::::::::::::OO R::::::R R:::::RE::::::::::::::::::::E - V:::V OO:::::::::OO R::::::R R:::::RE::::::::::::::::::::E - VVV OOOOOOOOO RRRRRRRR RRRRRRREEEEEEEEEEEEEEEEEEEEEE - --Aro <3 */ - #define VORE_VERSION 2 //This is a Define so you don't have to worry about magic numbers. // @@ -43,14 +22,14 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE /datum/vore_preferences //Actual preferences - var/digestable = TRUE - var/devourable = TRUE - var/feeding = TRUE + var/digestable = FALSE + var/devourable = FALSE + var/feeding = FALSE var/digest_leave_remains = FALSE - var/allowmobvore = TRUE + var/allowmobvore = FALSE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" - var/permit_healbelly = TRUE + var/permit_healbelly = FALSE var/can_be_drop_prey = FALSE var/can_be_drop_pred = FALSE diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 32fa61a28d3..ae9ce068213 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -10,7 +10,7 @@ /mob/living/proc/insidePanel() set name = "Vore Panel" - set category = "IC" + set category = "Vore" var/datum/vore_look/picker_holder = new() picker_holder.loop = picker_holder @@ -775,14 +775,14 @@ var/new_damage = input(user, "Choose the amount of burn damage prey will take per tick. Ranges from 0 to 6.", "Set Belly Burn Damage.", selected.digest_burn) as num|null if(new_damage == null) return - var/new_new_damage = CLAMP(new_damage, 0, 6) + var/new_new_damage = clamp(new_damage, 0, 6) selected.digest_burn = new_new_damage if(href_list["b_brute_dmg"]) var/new_damage = input(user, "Choose the amount of brute damage prey will take per tick. Ranges from 0 to 6", "Set Belly Brute Damage.", selected.digest_brute) as num|null if(new_damage == null) return - var/new_new_damage = CLAMP(new_damage, 0, 6) + var/new_new_damage = clamp(new_damage, 0, 6) selected.digest_brute = new_new_damage if(href_list["b_escapable"]) @@ -910,7 +910,7 @@ user.can_be_drop_prey = FALSE if(href_list["toggledg"]) - var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") + var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") switch(choice) if("Cancel") return FALSE @@ -919,8 +919,6 @@ if("Prevent Digestion") user.digestable = FALSE - message_admins("[key_name(user)] toggled their digestability to [user.digestable] ([user ? "JMP" : "null"])") - if(user.client.prefs_vr) user.client.prefs_vr.digestable = user.digestable @@ -964,7 +962,7 @@ user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains if(href_list["togglemv"]) - var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation") + var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation") switch(choice) if("Cancel") return FALSE @@ -973,8 +971,6 @@ if("Prevent Mob Predation") user.allowmobvore = FALSE - message_admins("[key_name(user)] toggled their mob vore preference to [user.allowmobvore] ([user ? "JMP" : "null"])") - if(user.client.prefs_vr) user.client.prefs_vr.allowmobvore = user.allowmobvore diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index 2dd2ea4a74e..c7d90e9b8f4 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -85,7 +85,7 @@ /obj/item/clothing/head/beret, /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing, /obj/item/clothing/shoes/black, - /*/obj/item/toy/crayon/mime*/) //Need to track down the code for crayons before adding this back in + /obj/item/toy/crayon/mime) //Need to track down the code for crayons before adding this back in //joanrisu:Joan Risu /obj/item/storage/backpack/dufflebag/sec/fluff/joanrisu diff --git a/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm index 49f0a15e3f6..9097aa5b601 100644 --- a/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm +++ b/code/modules/vore/fluffstuff/guns/cell_loaded/ml3m_cells.dm @@ -31,7 +31,7 @@ /obj/item/projectile/beam/medical_cell/brute/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-5) + target.adjustBruteLoss(-10) else return 1 @@ -43,7 +43,7 @@ /obj/item/projectile/beam/medical_cell/burn/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustFireLoss(-5) + target.adjustFireLoss(-10) else return 1 @@ -83,7 +83,7 @@ /obj/item/projectile/beam/medical_cell/toxin/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustToxLoss(-5) + target.adjustToxLoss(-10) else return 1 @@ -98,7 +98,7 @@ target.adjustBruteLoss(-2.5) target.adjustFireLoss(-2.5) target.adjustToxLoss(-2.5) - target.adjustOxyLoss(-10) + target.adjustOxyLoss(-20) else return 1 @@ -123,7 +123,7 @@ /obj/item/projectile/beam/medical_cell/brute2/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-10) + target.adjustBruteLoss(-20) else return 1 @@ -135,7 +135,7 @@ /obj/item/projectile/beam/medical_cell/burn2/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustFireLoss(-10) + target.adjustFireLoss(-20) else return 1 @@ -253,7 +253,7 @@ /obj/item/projectile/beam/medical_cell/brute3/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-20) + target.adjustBruteLoss(-40) else return 1 @@ -265,7 +265,7 @@ /obj/item/projectile/beam/medical_cell/burn3/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustFireLoss(-20) + target.adjustFireLoss(-40) else return 1 @@ -277,7 +277,7 @@ /obj/item/projectile/beam/medical_cell/toxin3/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustToxLoss(-20) + target.adjustToxLoss(-40) else return 1 diff --git a/code/modules/vore/trycatch_vr.dm b/code/modules/vore/trycatch_vr.dm index 3828ee8fa80..7f1798abb4c 100644 --- a/code/modules/vore/trycatch_vr.dm +++ b/code/modules/vore/trycatch_vr.dm @@ -13,19 +13,7 @@ The proc you're attemping should return nonzero values on success. */ /proc/attempt_vr(callon, procname, list/args=null) - try - if(!callon || !procname) - log_world("attempt_vr: Invalid obj/proc: [callon]/[procname]") - return 0 - - var/result = call(callon,procname)(arglist(args)) - - return result - - catch(var/exception/e) - log_world("attempt_vr runtimed when calling [procname] on [callon].") - log_world("attempt_vr catch: [e] on [e.file]:[e.line]") - return 0 + return call(callon,procname)(arglist(args)) /* This is the _vr version of calling hooks. @@ -42,21 +30,15 @@ if(hook_vr(proc,args)) return The hooks you're calling should return nonzero values on success. */ /proc/hook_vr(hook, list/args=null) - try - var/hook_path = text2path("/hook/[hook]") - if(!hook_path) - log_world("hook_vr: Invalid hook '/hook/[hook]' called.") - return 0 + var/hook_path = text2path("/hook/[hook]") + if(!hook_path) + CRASH("hook_vr: Invalid hook '/hook/[hook]' called.") - var/caller = new hook_path - var/status = 1 - for(var/P in typesof("[hook_path]/proc")) - if(!call(caller, P)(arglist(args))) - log_world("hook_vr: Hook '[P]' failed or runtimed.") - status = 0 + var/caller = new hook_path + var/status = 1 + for(var/P in typesof("[hook_path]/proc")) + if(!call(caller, P)(arglist(args))) + stack_trace("hook_vr: Hook '[P]' failed or runtimed.") + status = 0 - return status - - catch(var/exception/e) - log_world("hook_vr itself failed or runtimed. Exception below.") - log_world("hook_vr catch: [e] on [e.file]:[e.line]") + return status diff --git a/config/maps.txt b/config/maps.txt new file mode 100644 index 00000000000..85dfa9628ec --- /dev/null +++ b/config/maps.txt @@ -0,0 +1,20 @@ +This file contains a list of maps for use in map rotation. +This feature requires you are running a Windows OS (or can other wise run .bat files) and that you are using the tgstation-server toolset in tools/ +#Lines starting with # are ignored. +Lines not inside map blocks are also ignored +Duplicated entries use the latter one. +All whitespace at the start and end of lines is ignored. (including indentation, thats just for show) +Format: +#map [map name] (name of .json file in _maps folder without the .json part) + minplayers [number] (0 or less disables this requirement) + maxplayers [number] (0 or less disables this requirement) + default (The last map with this defined will get all votes of players who have not explicitly voted for a map) + voteweight [number] (How much to count each player vote as, defaults to 1, setting to 0.5 counts each vote as half a vote, 2 as double, etc, Setting to 0 disables the map but allows players to still pick it) + max_round_search_span [number] (If this is nonzero, then if this map has been played more than a specified amount of times within this number of rounds, the map won't show up in votes. Max for this value determined by a define in persistence.dm) + max_rounds_played [number] (This determines how many times a map can be played within the above number of rounds before it's forbidden from votes.) + disabled (disables the map) +endmap + +map tether + default +endmap diff --git a/html/changelog.html b/html/changelog.html index 5f383d8d575..e22d66cf946 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -2099,7 +2099,7 @@

    Redstryker updated:

      -
    • Allows promotion to Colony Director on the ID console.
    • +
    • Allows promotion to Facility Director on the ID console.

    08 October 2016

    @@ -2110,7 +2110,7 @@

    Redstryker updated:

      -
    • 'Overseer' added as an alt title to Colony Director alt titles list.
    • +
    • 'Overseer' added as an alt title to Facility Director alt titles list.

    Spades Neil updated:

      @@ -2144,7 +2144,7 @@

    Spades Neil updated:

      -
    • Replaced Station Administrator with Colony Director, based on feedback literally from NASA.
    • +
    • Replaced Station Administrator with Facility Director, based on feedback literally from NASA.

    Yoshax updated:

      @@ -7077,7 +7077,7 @@

    Redstryker updated:

      -
    • Allows promotion to Colony Director on the ID console.
    • +
    • Allows promotion to Facility Director on the ID console.

    08 October 2016

    @@ -7088,7 +7088,7 @@

    Redstryker updated:

      -
    • 'Overseer' added as an alt title to Colony Director alt titles list.
    • +
    • 'Overseer' added as an alt title to Facility Director alt titles list.

    Spades Neil updated:

      @@ -7122,7 +7122,7 @@

    Spades Neil updated:

      -
    • Replaced Station Administrator with Colony Director, based on feedback literally from NASA.
    • +
    • Replaced Station Administrator with Facility Director, based on feedback literally from NASA.

    Yoshax updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f48a2149214..ad4d7098857 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2922,7 +2922,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Cleaned up the work in progress event system. - rscadd: Added framework for a new grid check for the new event system. Spades Neil: - - tweak: Replaced Station Administrator with Colony Director, based on feedback + - tweak: Replaced Station Administrator with Facility Director, based on feedback literally from NASA. Yoshax: - bugfix: You can now only fit one pizza per box, and pizzas will no longer vanish @@ -2939,7 +2939,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Unloading an energy weapon should now correctly show what was unloaded. - tweak: Borg stun baton is back to the old cost, for balance reasons. Redstryker: - - rscadd: '''Overseer'' added as an alt title to Colony Director alt titles list.' + - rscadd: '''Overseer'' added as an alt title to Facility Director alt titles list.' Spades Neil: - rscadd: Adds the ability to hack Jukeboxes. Yoshax: @@ -2955,7 +2955,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. device cells. - bugfix: Low Yield EMP grenades now have the proper EMP radii. Redstryker: - - bugfix: Allows promotion to Colony Director on the ID console. + - bugfix: Allows promotion to Facility Director on the ID console. 2016-10-24: Anewbe: - tweak: The color selectable beret should now be more vibrantly colored. diff --git a/html/changelogs/AutoChangeLog-pr-2072.yml b/html/changelogs/AutoChangeLog-pr-2072.yml new file mode 100644 index 00000000000..1122a472369 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2072.yml @@ -0,0 +1,5 @@ +author: "Nethaufer" +delete-after: True +changes: + - rscadd: "Added *shriekshort (vox cough sound) and *shriekloud (vox sneeze sound). Both are restricted to Vox." + - rscadd: "Added emotes that have been added over time to the list of emotes displayed with *help" diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index 0f4517206dd..bc77b82a849 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index ed4a36e1464..4b7f3edcfd7 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index b7688964809..d10ceaf40ba 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/items/lefthand_switchtool.dmi b/icons/mob/items/lefthand_switchtool.dmi new file mode 100644 index 00000000000..aee361135c6 Binary files /dev/null and b/icons/mob/items/lefthand_switchtool.dmi differ diff --git a/icons/mob/items/righthand_switchtool.dmi b/icons/mob/items/righthand_switchtool.dmi new file mode 100644 index 00000000000..e2f7b88a9c3 Binary files /dev/null and b/icons/mob/items/righthand_switchtool.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index c2f5aa65a24..b5d6fa827cc 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/collars_vr.dmi b/icons/obj/clothing/collars_vr.dmi index 6c93ced8668..e9ca7db9e83 100644 Binary files a/icons/obj/clothing/collars_vr.dmi and b/icons/obj/clothing/collars_vr.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 4637e66dd79..79b5cd49f27 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index aede7dba663..63870b906cf 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index 019e008e414..66f4b64c57d 100644 Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 22983fc2f94..935d6b6c9d9 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/furniture_vr.dmi b/icons/obj/furniture_vr.dmi index bf71f5fd8dc..024d6efd77b 100644 Binary files a/icons/obj/furniture_vr.dmi and b/icons/obj/furniture_vr.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index dade5bdd861..279b2afc928 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index b8db548a414..aeae3e34bc8 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/library_vr.dmi b/icons/obj/library_vr.dmi index 90158ad29b0..9036ad4f4b0 100644 Binary files a/icons/obj/library_vr.dmi and b/icons/obj/library_vr.dmi differ diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi index 5a3282ffe07..d64870e72a4 100644 Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 5d66cc21c91..a393dffe7d9 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 6f318cff601..b800b06189f 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/switchtool.dmi b/icons/obj/switchtool.dmi new file mode 100644 index 00000000000..1bba8c46788 Binary files /dev/null and b/icons/obj/switchtool.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 695c59e5d74..be2687a0a64 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/vending_vr.dmi b/icons/obj/vending_vr.dmi index 45e8edb78dd..43fa4293eff 100644 Binary files a/icons/obj/vending_vr.dmi and b/icons/obj/vending_vr.dmi differ diff --git a/icons/turf/flooring/misc.dmi b/icons/turf/flooring/misc.dmi index 240ba5fc3b4..c65c62bfaa1 100644 Binary files a/icons/turf/flooring/misc.dmi and b/icons/turf/flooring/misc.dmi differ diff --git a/maps/endeavor/endeavor-02-ship2.dmm b/maps/endeavor/endeavor-02-ship2.dmm index 7ecc3d05d97..bdb44744858 100644 --- a/maps/endeavor/endeavor-02-ship2.dmm +++ b/maps/endeavor/endeavor-02-ship2.dmm @@ -3404,7 +3404,7 @@ dir = 6 }, /obj/effect/landmark/start{ - name = "Colony Director" + name = "Facility Director" }, /obj/machinery/hologram/holopad, /turf/simulated/floor/wood, @@ -3455,7 +3455,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/door/airlock/command{ id_tag = null; - name = "Colony Director's Bedroom"; + name = "Facility Director's Bedroom"; req_access = list(20); req_one_access = newlist() }, @@ -3473,7 +3473,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/effect/landmark/start{ - name = "Colony Director" + name = "Facility Director" }, /turf/simulated/floor/carpet/blucarpet, /area/crew_quarters/captain) @@ -5536,7 +5536,7 @@ /obj/machinery/door/firedoor/glass, /obj/machinery/door/airlock/command{ id_tag = "captaindoor"; - name = "Colony Director's Office"; + name = "Facility Director's Office"; req_access = list(20); req_one_access = newlist() }, @@ -7799,7 +7799,7 @@ dir = 4 }, /obj/effect/landmark/start{ - name = "Colony Director" + name = "Facility Director" }, /turf/simulated/floor/wood, /area/crew_quarters/captain) diff --git a/maps/endeavor/endeavor-03-ship3.dmm b/maps/endeavor/endeavor-03-ship3.dmm index b38044328a6..4afd148dc67 100644 --- a/maps/endeavor/endeavor-03-ship3.dmm +++ b/maps/endeavor/endeavor-03-ship3.dmm @@ -668,7 +668,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/door/airlock/command{ id_tag = "captaindoor"; - name = "Colony Director's Office"; + name = "Facility Director's Office"; req_access = list(20); req_one_access = newlist() }, @@ -9195,7 +9195,7 @@ /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ id_tag = null; - name = "Colony Director's Restroom"; + name = "Facility Director's Restroom"; req_access = list(20) }, /turf/simulated/floor/tiled/freezer, diff --git a/maps/endeavor/endeavor_things.dm b/maps/endeavor/endeavor_things.dm index 077762841ca..7ec1e7d2bca 100644 --- a/maps/endeavor/endeavor_things.dm +++ b/maps/endeavor/endeavor_things.dm @@ -46,7 +46,7 @@ /obj/machinery/photocopier/faxmachine/ce department = "Chief Engineer's Office" /obj/machinery/photocopier/faxmachine/cap - department = "Colony Director's Office" + department = "Facility Director's Office" /obj/machinery/photocopier/faxmachine/rd department = "Research Director's Office" /obj/machinery/photocopier/faxmachine/hop diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 019f9354336..875ed3b6dcd 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -52707,7 +52707,7 @@ /area/bridge_hallway) "bTP" = ( /obj/machinery/door/airlock/command{ - name = "Colony Director's Quarters"; + name = "Facility Director's Quarters"; req_access = list(20) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -54817,7 +54817,7 @@ dir = 1 }, /obj/effect/landmark/start{ - name = "Colony Director" + name = "Facility Director" }, /turf/simulated/floor/wood, /area/crew_quarters/captain) @@ -54829,7 +54829,7 @@ broadcasting = 0; dir = 4; listening = 1; - name = "Colony Director's Intercom"; + name = "Facility Director's Intercom"; pixel_x = 21; pixel_y = 0 }, @@ -55476,7 +55476,7 @@ /obj/item/megaphone, /obj/machinery/requests_console{ announcementConsole = 1; - department = "Colony Director's Desk"; + department = "Facility Director's Desk"; departmentType = 5; name = "Station Administrator RC"; pixel_x = 30; @@ -57467,7 +57467,7 @@ "ccy" = ( /obj/machinery/door/airlock/command{ id_tag = "captaindoor"; - name = "Colony Director's Office"; + name = "Facility Director's Office"; req_access = list(20) }, /obj/structure/disposalpipe/segment, diff --git a/maps/southern_cross/items/encryptionkey_sc.dm b/maps/southern_cross/items/encryptionkey_sc.dm index 3d997ac9404..9d510043ece 100644 --- a/maps/southern_cross/items/encryptionkey_sc.dm +++ b/maps/southern_cross/items/encryptionkey_sc.dm @@ -25,6 +25,6 @@ channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1, "Explorer" = 1) /obj/item/encryptionkey/heads/captain - name = "colony director's encryption key" + name = "Facility Director's encryption key" icon_state = "cap_cypherkey" channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0, "Explorer" = 0) \ No newline at end of file diff --git a/maps/southern_cross/loadout/loadout_accessories.dm b/maps/southern_cross/loadout/loadout_accessories.dm index c1b139c83c2..55e6848e292 100644 --- a/maps/southern_cross/loadout/loadout_accessories.dm +++ b/maps/southern_cross/loadout/loadout_accessories.dm @@ -31,4 +31,4 @@ /datum/gear/accessory/holster display_name = "holster selection (Security, CD, HoP)" path = /obj/item/clothing/accessory/holster - allowed_roles = list("Colony Director","Head of Personnel","Security Officer","Warden","Head of Security","Detective","Explorer") \ No newline at end of file + allowed_roles = list("Facility Director","Head of Personnel","Security Officer","Warden","Head of Security","Detective","Explorer") \ No newline at end of file diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index 548e4df956a..23b5b419c7e 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -10317,7 +10317,7 @@ "dQp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd) "dQq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd) "dQr" = (/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd) -"dQs" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Colony Director"},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the Starboard Bridge Doors."; id = "sbridgedoor"; name = "Starboard Bridge Door Control"; pixel_x = 30; pixel_y = -6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the captain's office."; id = "captaindoor"; name = "Office Door Control"; pixel_x = 30; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd) +"dQs" = (/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Facility Director"},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the Starboard Bridge Doors."; id = "sbridgedoor"; name = "Starboard Bridge Door Control"; pixel_x = 30; pixel_y = -6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the captain's office."; id = "captaindoor"; name = "Office Door Control"; pixel_x = 30; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd) "dQt" = (/obj/structure/table/wooden_reinforced,/obj/machinery/requests_console{announcementConsole = 1; department = "Station Director's Desk"; departmentType = 5; name = "Station Administrator RC"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd) "dQu" = (/obj/structure/table/rack{dir = 4},/obj/item/clothing/mask/gas,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard) "dQv" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/solar{id = "aftstarboardsolar"; name = "Starboard Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/aftstarboardsolar) diff --git a/maps/tether/tether.dm b/maps/tether/tether.dm index aa79d8ea388..735362f5f3b 100644 --- a/maps/tether/tether.dm +++ b/maps/tether/tether.dm @@ -10,16 +10,16 @@ #include "tether_shuttles.dm" #include "tether_telecomms.dm" - #include "tether-01-surface1.dmm" - #include "tether-02-surface2.dmm" - #include "tether-03-surface3.dmm" - #include "tether-04-transit.dmm" - #include "tether-05-station1.dmm" - #include "tether-06-station2.dmm" - #include "tether-07-station3.dmm" - #include "tether-08-mining.dmm" - #include "tether-09-solars.dmm" - #include "tether-10-colony.dmm" + #include "../../_maps/map_files/Tether/tether-01-surface1.dmm" + #include "../../_maps/map_files/Tether/tether-02-surface2.dmm" + #include "../../_maps/map_files/Tether/tether-03-surface3.dmm" + #include "../../_maps/map_files/Tether/tether-04-transit.dmm" + #include "../../_maps/map_files/Tether/tether-05-station1.dmm" + #include "../../_maps/map_files/Tether/tether-06-station2.dmm" + #include "../../_maps/map_files/Tether/tether-07-station3.dmm" + #include "../../_maps/map_files/Tether/tether-08-mining.dmm" + #include "../../_maps/map_files/Tether/tether-09-solars.dmm" + #include "../../_maps/map_files/Tether/tether-10-colony.dmm" #include "submaps/_tether_submaps.dm" diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm index 606a1dec871..d80e428a35c 100644 --- a/maps/tether/tether_defines.dm +++ b/maps/tether/tether_defines.dm @@ -52,6 +52,7 @@ station_name = "NSB Adephagia" station_short = "Tether" dock_name = "Virgo-3B Colony" + dock_type = "surface" boss_name = "Central Command" boss_short = "CentCom" company_name = "NanoTrasen" @@ -62,6 +63,7 @@ shuttle_leaving_dock = "The Orange Line tram has left the station. Estimate %ETA% until the tram arrives at %dock_name%." shuttle_called_message = "A scheduled crew transfer to the %dock_name% is occuring. The tram will be arriving shortly. Those departing should proceed to the Orange Line tram station within %ETA%." shuttle_recall_message = "The scheduled crew transfer has been cancelled." + shuttle_name = "Automated Tram" emergency_shuttle_docked_message = "The evacuation tram has arrived at the tram station. You have approximately %ETD% to board the tram." emergency_shuttle_leaving_dock = "The emergency tram has left the station. Estimate %ETA% until the shuttle arrives at %dock_name%." emergency_shuttle_called_message = "An emergency evacuation has begun, and an off-schedule tram has been called. It will arrive at the tram station in approximately %ETA%." @@ -253,13 +255,13 @@ /datum/map_z_level/tether/mine z = Z_LEVEL_SURFACE_MINE name = "Mining Outpost" - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER + flags = MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER base_turf = /turf/simulated/floor/outdoors/rocks/virgo3b /datum/map_z_level/tether/solars z = Z_LEVEL_SOLARS name = "Solar Field" - flags = MAP_LEVEL_STATION|MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER + flags = MAP_LEVEL_CONTACT|MAP_LEVEL_PLAYER base_turf = /turf/simulated/floor/outdoors/rocks/virgo3b /datum/map_z_level/tether/colony diff --git a/maps/virgo/virgo-1.dmm b/maps/virgo/virgo-1.dmm index 943df5862c5..8d8b1a8c6f7 100644 --- a/maps/virgo/virgo-1.dmm +++ b/maps/virgo/virgo-1.dmm @@ -51284,7 +51284,7 @@ }, /obj/item/card/id/captains_spare, /obj/machinery/door/window/brigdoor/westright{ - name = "Colony Director's Storage"; + name = "Facility Director's Storage"; req_access = list(20) }, /turf/simulated/floor/wood, @@ -52583,7 +52583,7 @@ /area/bridge_hallway) "bTc" = ( /obj/machinery/door/airlock/command{ - name = "Colony Director's Quarters"; + name = "Facility Director's Quarters"; req_access = list(20) }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -53606,7 +53606,7 @@ broadcasting = 0; dir = 4; listening = 1; - name = "Colony Director's Intercom"; + name = "Facility Director's Intercom"; pixel_x = 21; pixel_y = 0 }, @@ -54713,7 +54713,7 @@ dir = 1 }, /obj/effect/landmark/start{ - name = "Colony Director" + name = "Facility Director" }, /turf/simulated/floor/wood, /area/crew_quarters/captain) @@ -55287,7 +55287,7 @@ /obj/structure/table/woodentable, /obj/machinery/computer/skills, /obj/item/perfect_tele{ - desc = "Seems absurd, doesn't it? Yet, here we are. Generally considered dangerous contraband unless the user has permission from Central Command. This one is the Colony Director's, and they are authorized to use it."; + desc = "Seems absurd, doesn't it? Yet, here we are. Generally considered dangerous contraband unless the user has permission from Central Command. This one is the Facility Director's, and they are authorized to use it."; name = "director's translocator" }, /turf/simulated/floor/wood, @@ -55309,7 +55309,7 @@ /obj/item/megaphone, /obj/machinery/requests_console{ announcementConsole = 1; - department = "Colony Director's Desk"; + department = "Facility Director's Desk"; departmentType = 5; name = "Station Administrator RC"; pixel_x = 30; @@ -57363,7 +57363,7 @@ "cbz" = ( /obj/machinery/door/airlock/command{ id_tag = "captaindoor"; - name = "Colony Director's Office"; + name = "Facility Director's Office"; req_access = list(20) }, /obj/structure/disposalpipe/segment, diff --git a/maps/virgo_minitest/virgo_minitest_defines.dm b/maps/virgo_minitest/virgo_minitest_defines.dm index 492ead4578d..441bf45accd 100644 --- a/maps/virgo_minitest/virgo_minitest_defines.dm +++ b/maps/virgo_minitest/virgo_minitest_defines.dm @@ -22,6 +22,7 @@ station_name = "NSS Ade-testing" station_short = "VORE-testing" dock_name = "Virgo-test CC" + dock_type = "surface" boss_name = "Central Command-testing" boss_short = "CentCom-testing" company_name = "NanoTrasen-testing" @@ -32,6 +33,7 @@ shuttle_leaving_dock = "Test Shuttle Leaving" shuttle_called_message = "Test Shuttle Coming" shuttle_recall_message = "Test Shuttle Cancelled" + shuttle_name = "NAS |Hawking|" emergency_shuttle_docked_message = "Test E-Shuttle Docked" emergency_shuttle_leaving_dock = "Test E-Shuttle Left" emergency_shuttle_called_message = "Test E-Shuttle Coming" diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index ed13fb9fa7e..34ae7c6c5af 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -66,6 +66,7 @@ var/list/all_maps = list() var/station_name = "BAD Station" var/station_short = "Baddy" var/dock_name = "THE PirateBay" + var/dock_type = "station" //VOREStation Edit - for a list of valid types see the switch block in air_traffic.dm at line 148 var/boss_name = "Captain Roger" var/boss_short = "Cap'" var/company_name = "BadMan" @@ -76,6 +77,7 @@ var/list/all_maps = list() var/shuttle_leaving_dock var/shuttle_called_message var/shuttle_recall_message + var/shuttle_name = "NAS |Hawking|" //VS ADD var/emergency_shuttle_docked_message var/emergency_shuttle_leaving_dock var/emergency_shuttle_called_message diff --git a/modular_citadel/code/modules/clothing/head/misc_cit.dm b/modular_citadel/code/modules/clothing/head/misc_cit.dm index 76f0e2d2f8e..e1db72dcf3d 100644 --- a/modular_citadel/code/modules/clothing/head/misc_cit.dm +++ b/modular_citadel/code/modules/clothing/head/misc_cit.dm @@ -1,14 +1,11 @@ // Currently only adds cold protection to ushanka and both beanie types, also changes ushanka item sprite to proper one. /obj/item/clothing/head/ushanka - ..() min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE icon = 'modular_citadel/icons/obj/clothing/hats_cit.dmi' /obj/item/clothing/head/beanie - ..() min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE /obj/item/clothing/head/beanie_loose - ..() min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png index 2ca45393106..49a9c238c58 100644 Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ diff --git a/nano/images/nanomap_z2.png b/nano/images/nanomap_z2.png index 1155f0b0873..36340c02f65 100644 Binary files a/nano/images/nanomap_z2.png and b/nano/images/nanomap_z2.png differ diff --git a/nano/images/nanomap_z3.png b/nano/images/nanomap_z3.png index 30502d39b04..8bdddc557ef 100644 Binary files a/nano/images/nanomap_z3.png and b/nano/images/nanomap_z3.png differ diff --git a/nano/images/nanomap_z4.png b/nano/images/nanomap_z4.png index 88bc144b19a..c2702db17c0 100644 Binary files a/nano/images/nanomap_z4.png and b/nano/images/nanomap_z4.png differ diff --git a/nano/images/nanomap_z5.png b/nano/images/nanomap_z5.png index bf4c5c22eeb..92760f310e4 100644 Binary files a/nano/images/nanomap_z5.png and b/nano/images/nanomap_z5.png differ diff --git a/nano/images/nanomap_z6.png b/nano/images/nanomap_z6.png index c892f623636..4012e818f79 100644 Binary files a/nano/images/nanomap_z6.png and b/nano/images/nanomap_z6.png differ diff --git a/nano/images/nanomap_z7.png b/nano/images/nanomap_z7.png index ebac642188f..0897f11b9a6 100644 Binary files a/nano/images/nanomap_z7.png and b/nano/images/nanomap_z7.png differ diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index 7f4fbdda70c..8b3ab2dc16d 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -147,7 +147,7 @@
    Command
    SpecialColony Director
    SpecialFacility DirectorCustom
    Special - {{:helper.link("Colony Director", '', {'choice' : 'assign', 'assign_target' : 'Colony Director'}, data.target_rank == 'Colony Director' ? 'disabled' : null)}} + {{:helper.link("Facility Director", '', {'choice' : 'assign', 'assign_target' : 'Facility Director'}, data.target_rank == 'Facility Director' ? 'disabled' : null)}} {{:helper.link("Command Secretary", '', {'choice' : 'assign', 'assign_target' : 'Command Secretary'}, data.target_rank == 'Command Secretary' ? 'disabled' : null)}} {{:helper.link("Internal Affairs Agent", '', {'choice' : 'assign', 'assign_target' : 'Internal Affairs Agent'}, data.target_rank == 'Internal Affairs Agent' ? 'disabled' : null)}} {{:helper.link("Custom", '', {'choice' : 'assign', 'assign_target' : 'Custom'})}} diff --git a/sound/effects/meteor_strike.ogg b/sound/effects/meteor_strike.ogg new file mode 100644 index 00000000000..c0bb05f8990 Binary files /dev/null and b/sound/effects/meteor_strike.ogg differ diff --git a/sound/effects/mob_effects/tesharisneeze.ogg b/sound/effects/mob_effects/tesharisneeze.ogg index f7428654647..b344bbcff96 100644 Binary files a/sound/effects/mob_effects/tesharisneeze.ogg and b/sound/effects/mob_effects/tesharisneeze.ogg differ diff --git a/sound/effects/nuclear_meltdown.ogg b/sound/effects/nuclear_meltdown.ogg new file mode 100644 index 00000000000..e5376d499bb Binary files /dev/null and b/sound/effects/nuclear_meltdown.ogg differ diff --git a/sound/weapons/switchsound.ogg b/sound/weapons/switchsound.ogg new file mode 100644 index 00000000000..b4d3196f65a Binary files /dev/null and b/sound/weapons/switchsound.ogg differ diff --git a/vorestation.dme b/vorestation.dme index afbd175dd9d..93b8e054b16 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -19,7 +19,6 @@ #include "code\names.dm" #include "code\world.dm" #include "code\z_compile_options.dm" -#include "code\__DEFINES\__513_compatibility.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_lists.dm" #include "code\__DEFINES\_planes+layers.dm" @@ -49,13 +48,10 @@ #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\items_clothing.dm" #include "code\__DEFINES\lighting.dm" -#include "code\__DEFINES\lighting_vr.dm" #include "code\__DEFINES\machinery.dm" -#include "code\__DEFINES\map.dm" -#include "code\__DEFINES\map_vr.dm" +#include "code\__DEFINES\maps.dm" #include "code\__DEFINES\math.dm" #include "code\__DEFINES\math_physics.dm" -#include "code\__DEFINES\maths.dm" #include "code\__DEFINES\MC.dm" #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\misc_vr.dm" @@ -65,6 +61,7 @@ #include "code\__DEFINES\nifsoft.dm" #include "code\__DEFINES\objects.dm" #include "code\__DEFINES\parameters_world.dm" +#include "code\__DEFINES\persistence.dm" #include "code\__DEFINES\planets.dm" #include "code\__DEFINES\qdel.dm" #include "code\__DEFINES\research.dm" @@ -74,6 +71,7 @@ #include "code\__DEFINES\spaceman_dmm.dm" #include "code\__DEFINES\species_languages.dm" #include "code\__DEFINES\species_languages_vr.dm" +#include "code\__DEFINES\spells.dm" #include "code\__DEFINES\stat_tracking.dm" #include "code\__DEFINES\storage.dm" #include "code\__DEFINES\supply.dm" @@ -240,7 +238,7 @@ #include "code\controllers\subsystems\jobs.dm" #include "code\controllers\subsystems\lighting.dm" #include "code\controllers\subsystems\machines.dm" -#include "code\controllers\subsystems\mapping_vr.dm" +#include "code\controllers\subsystems\mapping.dm" #include "code\controllers\subsystems\minimaps.dm" #include "code\controllers\subsystems\mobs.dm" #include "code\controllers\subsystems\nanoui.dm" @@ -264,6 +262,9 @@ #include "code\controllers\subsystems\vote.dm" #include "code\controllers\subsystems\wind.dm" #include "code\controllers\subsystems\xenoarch.dm" +#include "code\controllers\subsystems\persistence\_persistence.dm" +#include "code\controllers\subsystems\persistence\bunker.dm" +#include "code\controllers\subsystems\persistence\objects.dm" #include "code\controllers\subsystems\processing\chemistry.dm" #include "code\controllers\subsystems\processing\fastprocess.dm" #include "code\controllers\subsystems\processing\instruments.dm" @@ -320,6 +321,7 @@ #include "code\datums\components\_component.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\elements\_element.dm" +#include "code\datums\elements\persistence.dm" #include "code\datums\helper_datums\construction_datum.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" @@ -1232,6 +1234,7 @@ #include "code\game\objects\items\weapons\tanks\tanks.dm" #include "code\game\objects\items\weapons\tools\crowbar.dm" #include "code\game\objects\items\weapons\tools\crowbar_vr.dm" +#include "code\game\objects\items\weapons\tools\holotool.dm" #include "code\game\objects\items\weapons\tools\screwdriver.dm" #include "code\game\objects\items\weapons\tools\weldingtool.dm" #include "code\game\objects\items\weapons\tools\wirecutters.dm" @@ -1270,6 +1273,7 @@ #include "code\game\objects\structures\holosign.dm" #include "code\game\objects\structures\inflatable.dm" #include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_foodcart.dm" #include "code\game\objects\structures\kitchen_spike.dm" #include "code\game\objects\structures\lattice.dm" #include "code\game\objects\structures\ledges.dm" @@ -2204,6 +2208,7 @@ #include "code\modules\lore_codex\robutt_data\bybrand.dm" #include "code\modules\lore_codex\robutt_data\main_robutts.dm" #include "code\modules\lore_codex\robutt_data\more.dm" +#include "code\modules\mapping\map_config.dm" #include "code\modules\mapping\minimaps.dm" #include "code\modules\mapping\preloader.dm" #include "code\modules\maps\tether\atmospheres\virgo2.dm" @@ -2902,6 +2907,7 @@ #include "code\modules\organs\subtypes\unseverable.dm" #include "code\modules\organs\subtypes\vox.dm" #include "code\modules\organs\subtypes\vox_vr.dm" +#include "code\modules\organs\subtypes\xenochimera.dm" #include "code\modules\organs\subtypes\xenos.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\sectors.dm"