diff --git a/.travis.yml b/.travis.yml index dd59f657edb..0fee4533fce 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,38 +6,56 @@ branches: env: global: - BYOND_MAJOR="512" - - BYOND_MINOR="1418" + - BYOND_MINOR="1427" - NODE_VERSION="4" - RUST_G_VERSION="0.3.0" - - BUILD_TOOLS=false - - BUILD_TESTING=false - - DM_MAPFILE="loadallmaps" - matrix: - - BUILD_TOOLS=true - - BUILD_TESTING=true - - BUILD_TESTING=false - -cache: - directories: - - $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR} - - tgui/node_modules - - $HOME/.rustup - - $HOME/.cargo - - -addons: - apt: - packages: - - libc6-i386 - - libgcc1:i386 - - libstdc++6:i386 - - gcc-multilib - - python3 - - python3-pip - - libssl-dev:i386 +matrix: + include: + - env: + - BUILD_TOOLS=true + addons: + apt: + packages: + - python3 + - python3-pip + cache: + directories: + - tgui/node_modules + - env: + - BUILD_TESTING=true + - BUILD_TOOLS=false + addons: + apt: + packages: + - libc6-i386 + - libstdc++6:i386 + cache: + directories: + - $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR} + - env: + - BUILD_TESTING=false + - BUILD_TOOLS=false + addons: + mariadb: '10.2' + apt: + packages: + - libc6-i386 + - libstdc++6:i386 + - libssl-dev:i386 + - gcc-multilib + cache: + directories: + - $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR} + - $HOME/libmariadb + - $HOME/.rustup + - $HOME/.cargo install: - tools/travis/install_build_tools.sh + - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root -e 'CREATE DATABASE tg_travis;'; fi + - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root tg_travis < SQL/tgstation_schema.sql; fi + - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root -e 'CREATE DATABASE tg_travis_prefixed;'; fi + - if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then mysql -u root tg_travis_prefixed < SQL/tgstation_schema_prefixed.sql; fi before_script: - tools/travis/before_build_tools.sh diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index 682132e29e7..dad9f1e766a 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -450,15 +450,14 @@ CREATE TABLE `schema_revision` ( PRIMARY KEY (`major`, `minor`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -DELIMITER -$$ +DELIMITER $$ CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes); END $$ CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes); END $$ -CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); +CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); END $$ diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index a1555cd9251..8c9b15e8941 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -450,15 +450,14 @@ CREATE TABLE `SS13_schema_revision` ( PRIMARY KEY (`major`,`minor`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -DELIMITER -$$ -CREATE TRIGGER `role_timeTlogupdate` AFTER UPDATE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes); +DELIMITER $$ +CREATE TRIGGER `SS13_role_timeTlogupdate` AFTER UPDATE ON `SS13_role_time` FOR EACH ROW BEGIN INSERT into SS13_role_time_log (ckey, job, delta) VALUES (NEW.CKEY, NEW.job, NEW.minutes-OLD.minutes); END $$ -CREATE TRIGGER `role_timeTloginsert` AFTER INSERT ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes); +CREATE TRIGGER `SS13_role_timeTloginsert` AFTER INSERT ON `SS13_role_time` FOR EACH ROW BEGIN INSERT into SS13_role_time_log (ckey, job, delta) VALUES (NEW.ckey, NEW.job, NEW.minutes); END $$ -CREATE TRIGGER `role_timeTlogdelete` AFTER DELETE ON `role_time` FOR EACH ROW BEGIN INSERT into role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); +CREATE TRIGGER `SS13_role_timeTlogdelete` AFTER DELETE ON `SS13_role_time` FOR EACH ROW BEGIN INSERT into SS13_role_time_log (ckey, job, delta) VALUES (OLD.ckey, OLD.job, 0-OLD.minutes); END $$ diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 5348f3f3856..7d9bdf64854 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -294,7 +294,7 @@ /area/ruin/space/has_grav/abandonedzoo) "aP" = ( /obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/bottle/liver_enhance_virion, +/obj/item/reagent_containers/glass/bottle/random_virus, /obj/item/reagent_containers/dropper, /turf/open/floor/plasteel{ icon_state = "dark" diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 71f23231b9f..948c39b2bc1 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -46270,12 +46270,11 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bUT" = ( -/obj/structure/rack, -/obj/item/weldingtool, -/obj/item/screwdriver{ - pixel_y = 16 +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5 }, -/obj/effect/spawner/lootdrop/maintenance, +/obj/item/reagent_containers/food/condiment/flour, /turf/open/floor/plating, /area/maintenance/port/aft) "bUU" = ( @@ -46289,20 +46288,16 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bUW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/table, +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 }, /turf/open/floor/plating, /area/maintenance/port/aft) "bUX" = ( -/obj/structure/rack, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = -3 - }, -/obj/item/stack/cable_coil, -/obj/item/wirecutters, -/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet/crate/bin, +/obj/item/kitchen/knife, /turf/open/floor/plating, /area/maintenance/port/aft) "bUY" = ( @@ -46759,26 +46754,13 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bVW" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating{ icon_state = "platingdmg1" }, /area/maintenance/port/aft) -"bVX" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bVZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bWa" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bWb" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -47513,12 +47495,11 @@ }, /area/maintenance/port/aft) "bXA" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"bXB" = ( -/obj/structure/chair/stool, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, /turf/open/floor/plating, /area/maintenance/port/aft) "bXC" = ( @@ -47957,25 +47938,11 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bYG" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen, -/obj/structure/extinguisher_cabinet{ - pixel_y = -30 - }, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/port/aft) "bYH" = ( -/obj/structure/light_construct, +/obj/structure/rack, +/obj/item/stack/rods{ + amount = 4 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -50135,8 +50102,6 @@ /turf/open/space, /area/solar/port/aft) "cdb" = ( -/obj/structure/girder, -/obj/structure/grille, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, @@ -50164,6 +50129,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/girder, +/obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/aft) "cde" = ( @@ -50704,8 +50671,6 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "ceo" = ( -/obj/structure/girder, -/obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, @@ -50742,19 +50707,6 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) -"ces" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen, -/turf/open/floor/plating, -/area/maintenance/port/aft) "ceu" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -71371,11 +71323,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"dbk" = ( -/obj/item/hand_labeler_refill, -/obj/structure/easel, -/turf/open/floor/plating, -/area/maintenance/port) "dbl" = ( /obj/structure/easel, /turf/open/floor/plating, @@ -74242,12 +74189,7 @@ /turf/open/floor/plating, /area/maintenance/port) "diy" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/poster/random_contraband, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, /turf/open/floor/plating, /area/maintenance/port/aft) "diz" = ( @@ -76081,6 +76023,19 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"gqA" = ( +/obj/machinery/button/door{ + dir = 2; + id = "abandoned_kitchen"; + name = "Shutters Control"; + pixel_x = 26; + pixel_y = 6; + req_one_access_txt = null + }, +/obj/effect/decal/cleanable/blood/old, +/obj/item/clothing/suit/apron/chef, +/turf/open/floor/plating, +/area/maintenance/port/aft) "gra" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -76150,6 +76105,11 @@ /obj/machinery/autolathe, /turf/open/floor/plasteel/white, /area/science/circuit) +"hvt" = ( +/obj/structure/kitchenspike_frame, +/obj/effect/decal/cleanable/blood/gibs/old, +/turf/open/floor/plating, +/area/maintenance/port/aft) "hyP" = ( /obj/machinery/door/airlock/external{ name = "Escape Pod Two" @@ -76159,6 +76119,13 @@ }, /turf/open/floor/plating, /area/security/prison) +"hIt" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ioI" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -76186,6 +76153,10 @@ }, /turf/open/floor/plasteel/whitepurple, /area/science/lab) +"iLj" = ( +/obj/structure/table, +/turf/open/floor/plating, +/area/maintenance/port/aft) "jeV" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -76407,6 +76378,13 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"mWg" = ( +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/aft) "nnK" = ( /obj/item/stack/sheet/glass/fifty, /obj/item/paper_bin, @@ -76553,6 +76531,17 @@ /obj/item/pen, /turf/open/floor/plasteel/white, /area/science/circuit) +"oZg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/girder, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/port/aft) "pmc" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -76623,6 +76612,12 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"qhe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -76911,6 +76906,10 @@ }, /turf/open/floor/plating, /area/security/prison) +"wmt" = ( +/obj/effect/decal/cleanable/flour, +/turf/open/floor/plating, +/area/maintenance/port/aft) "wxc" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Airlock"; @@ -76995,6 +76994,13 @@ /obj/structure/chair/comfy, /turf/open/floor/plasteel, /area/science/misc_lab) +"xEf" = ( +/obj/structure/table, +/obj/item/flashlight/lamp{ + on = 0 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -77010,6 +77016,16 @@ /obj/effect/landmark/blobstart, /turf/open/floor/engine/cult, /area/library) +"ydn" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ygk" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -93613,10 +93629,10 @@ bPJ alK cgH dux -bUU -bVX -bXB -bYG +iLj +dvt +bXE +hvt dux dux dux @@ -93870,8 +93886,8 @@ aqK alK dit dux -bUV -duH +ydn +wmt bXC bYH dux @@ -94128,12 +94144,12 @@ alK bSu dux bUW -bVZ +bXE bXD bYI bZO cbt -cdc +oZg dux dux csT @@ -94385,11 +94401,11 @@ alK bSr dux bUX -bWa -bXE -bYJ +bUU +gqA +xEf dux -dvt +mWg cdd dux cfC @@ -94642,7 +94658,7 @@ bRf bSv dux dux -dux +hIt dux dux dux @@ -94899,7 +94915,7 @@ alK bOf bOv alC -dbk +qhe dux bYK bZP @@ -95419,7 +95435,7 @@ bYM bZP cbx cdh -bXE +bUV dux dwc cia @@ -95933,7 +95949,7 @@ bYN dux cbz bXE -ces +bYJ dux dwe cic diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index d00645846b6..c9d545fc030 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -1,22 +1,22 @@ -#define ACCESS_SECURITY 1 // Security equipment -#define ACCESS_BRIG 2 // Brig timers and permabrig -#define ACCESS_ARMORY 3 -#define ACCESS_FORENSICS_LOCKERS 4 +#define ACCESS_SECURITY 1 // Security equipment, security records, gulag item storage, secbots +#define ACCESS_BRIG 2 // Brig cells+timers, permabrig, gulag+gulag shuttle, prisoner management console +#define ACCESS_ARMORY 3 // Armory, gulag teleporter, execution chamber +#define ACCESS_FORENSICS_LOCKERS 4 //Detective's office, forensics lockers, security+medical records #define ACCESS_MEDICAL 5 #define ACCESS_MORGUE 6 -#define ACCESS_TOX 7 -#define ACCESS_TOX_STORAGE 8 -#define ACCESS_GENETICS 9 -#define ACCESS_ENGINE 10 -#define ACCESS_ENGINE_EQUIP 11 +#define ACCESS_TOX 7 //R&D department, R&D console, burn chamber on some maps +#define ACCESS_TOX_STORAGE 8 //Toxins storage, burn chamber on some maps +#define ACCESS_GENETICS 9 +#define ACCESS_ENGINE 10 //Engineering area, power monitor, power flow control console +#define ACCESS_ENGINE_EQUIP 11 //APCs, EngiVend/YouTool, engineering equipment lockers #define ACCESS_MAINT_TUNNELS 12 #define ACCESS_EXTERNAL_AIRLOCKS 13 -#define ACCESS_EMERGENCY_STORAGE 14 +#define ACCESS_EMERGENCY_STORAGE 14 //Not in use #define ACCESS_CHANGE_IDS 15 #define ACCESS_AI_UPLOAD 16 #define ACCESS_TELEPORTER 17 #define ACCESS_EVA 18 -#define ACCESS_HEADS 19 +#define ACCESS_HEADS 19 //Bridge, EVA storage windoors, gateway shutters, AI integrity restorer, clone record deletion, comms console #define ACCESS_CAPTAIN 20 #define ACCESS_ALL_PERSONAL_LOCKERS 21 #define ACCESS_CHAPEL_OFFICE 22 @@ -31,9 +31,9 @@ #define ACCESS_CARGO 31 #define ACCESS_CONSTRUCTION 32 #define ACCESS_CHEMISTRY 33 -#define ACCESS_CARGO_BOT 34 +#define ACCESS_CARGO_BOT 34 //Not in use #define ACCESS_HYDROPONICS 35 -#define ACCESS_MANUFACTURING 36 +#define ACCESS_MANUFACTURING 36 //Only used on research.dmm away mission #define ACCESS_LIBRARY 37 #define ACCESS_LAWYER 38 #define ACCESS_VIROLOGY 39 @@ -44,10 +44,10 @@ #define ACCESS_THEATRE 46 #define ACCESS_RESEARCH 47 #define ACCESS_MINING 48 -#define ACCESS_MINING_OFFICE 49 //not in use +#define ACCESS_MINING_OFFICE 49 //Not in use #define ACCESS_MAILSORTING 50 -#define ACCESS_MINT 51 -#define ACCESS_MINT_VAULT 52 +#define ACCESS_MINT 51 //Not in use +#define ACCESS_MINT_VAULT 52 //Not in use #define ACCESS_VAULT 53 #define ACCESS_MINING_STATION 54 #define ACCESS_XENOBIOLOGY 55 @@ -58,19 +58,19 @@ #define ACCESS_KEYCARD_AUTH 60 //Used for events which require at least two people to confirm them #define ACCESS_TCOMSAT 61 // has access to the entire telecomms satellite / machinery #define ACCESS_GATEWAY 62 -#define ACCESS_SEC_DOORS 63 // Security front doors -#define ACCESS_MINERAL_STOREROOM 64 +#define ACCESS_SEC_DOORS 63 // Outer brig doors, department security posts +#define ACCESS_MINERAL_STOREROOM 64 //For releasing minerals from the ORM #define ACCESS_MINISAT 65 #define ACCESS_WEAPONS 66 //Weapon authorization for secbots -#define ACCESS_NETWORK 67 -#define ACCESS_CLONING 68 //Cloning room +#define ACCESS_NETWORK 67 //NTnet diagnostics/monitoring software +#define ACCESS_CLONING 68 //Cloning room and clone pod ejection //BEGIN CENTCOM ACCESS /*Should leave plenty of room if we need to add more access levels. Mostly for admin fun times.*/ -#define ACCESS_CENT_GENERAL 101//General facilities. +#define ACCESS_CENT_GENERAL 101//General facilities. CentCom ferry. #define ACCESS_CENT_THUNDER 102//Thunderdome. -#define ACCESS_CENT_SPECOPS 103//Special Ops. +#define ACCESS_CENT_SPECOPS 103//Special Ops. Captain's display case, Marauder and Seraph mechs. #define ACCESS_CENT_MEDICAL 104//Medical/Research #define ACCESS_CENT_LIVING 105//Living quarters. #define ACCESS_CENT_STORAGE 106//Generic storage areas. @@ -79,7 +79,7 @@ #define ACCESS_CENT_BAR 110 // The non-existent CentCom Bar //The Syndicate -#define ACCESS_SYNDICATE 150//General Syndicate Access +#define ACCESS_SYNDICATE 150//General Syndicate Access. Includes Syndicate mechs and ruins. #define ACCESS_SYNDICATE_LEADER 151//Nuke Op Leader Access //Away Missions or Ruins diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index a550206ff66..3ffb583332e 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -64,7 +64,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) //Takes a value of time in deciseconds. //Returns a text value of that number in hours, minutes, or seconds. /proc/DisplayTimeText(time_value, truncate = FALSE) - var/second = time_value*0.1 + var/second = (time_value)*0.1 var/second_adjusted = null var/second_rounded = FALSE var/minute = null @@ -144,7 +144,7 @@ GLOBAL_VAR_INIT(rollovercheck_last_timeofday, 0) else if(day && (!minute || !second)) hour = " and 1 hour" else - hour = "[truncate ? "hour" : "1 hour"]" + hour = "[truncate ? "hour" : "1 hour"]" else hour = null diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 1dd64ea4af9..bb2cb98cd2b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1271,10 +1271,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage) if(!istype(C)) return - var/animate_color = initial(C.color) - var/datum/client_colour/CC = C.mob.client_colours[1] - if(CC) - animate_color = CC.colour + var/animate_color = C.color C.color = flash_color animate(C, color = animate_color, time = flash_time) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index be796ddd10c..e792c90f1ec 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -190,6 +190,8 @@ if(Adjacent(target) || (tool && CheckToolReach(src, target, tool.reach))) //Adjacent or reaching attacks return TRUE + if (!target.loc) + continue GET_COMPONENT_FROM(storage, /datum/component/storage, target.loc) if (storage) var/datum/component/storage/concrete/master = storage.master() diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 0f662ad97d9..25b3a46fa01 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -25,10 +25,13 @@ InitEntries() LoadModes() if(fexists("[directory]/config.txt") && LoadEntries("config.txt") <= 1) - log_config("No $include directives found in config.txt! Loading legacy game_options/dbconfig/comms files...") - LoadEntries("game_options.txt") - LoadEntries("dbconfig.txt") - LoadEntries("comms.txt") + var/list/legacy_configs = list("game_options.txt", "dbconfig.txt", "comms.txt") + for(var/I in legacy_configs) + if(fexists("[directory]/[I]")) + log_config("No $include directives found in config.txt! Loading legacy [legacy_configs.Join("/")] files...") + for(var/J in legacy_configs) + LoadEntries(J) + break loadmaplist(CONFIG_MAPS_FILE) LoadMOTD() diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 4f4a93b824a..4d27a0d4cdd 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -318,6 +318,8 @@ SUBSYSTEM_DEF(vote) return 1 /datum/action/vote/proc/remove_from_client() + if(!owner) + return if(owner.client) owner.client.player_details.player_actions -= src else if(owner.ckey) diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 3d63d9a63e4..be4e08eacad 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -1,4 +1,5 @@ /datum/component/anti_magic + var/active = TRUE var/magic = FALSE var/holy = FALSE @@ -7,7 +8,7 @@ holy = _holy /datum/component/anti_magic/proc/can_protect(_magic = TRUE, _holy = FALSE) - if(!enabled) + if(!active) return FALSE if((_magic && magic) || (_holy && holy)) return TRUE diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm index 99335a99913..de0d081e3df 100644 --- a/code/datums/components/riding.dm +++ b/code/datums/components/riding.dm @@ -1,5 +1,6 @@ /datum/component/riding var/last_vehicle_move = 0 //used for move delays + var/last_move_diagonal = FALSE var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower var/keytype @@ -146,7 +147,7 @@ Unbuckle(user) return - if(world.time < last_vehicle_move + vehicle_move_delay) + if(world.time < last_vehicle_move + ((last_move_diagonal? 2 : 1) * vehicle_move_delay)) return last_vehicle_move = world.time @@ -161,7 +162,12 @@ if(!Process_Spacemove(direction) || !isturf(AM.loc)) return step(AM, direction) - + + if((direction & (direction - 1)) && (AM.loc == next)) //moved diagonally + last_move_diagonal = TRUE + else + last_move_diagonal = FALSE + handle_vehicle_layer() handle_vehicle_offsets() else diff --git a/code/datums/components/storage/concrete/bag_of_holding.dm b/code/datums/components/storage/concrete/bag_of_holding.dm index c14b1f52701..765889849b9 100644 --- a/code/datums/components/storage/concrete/bag_of_holding.dm +++ b/code/datums/components/storage/concrete/bag_of_holding.dm @@ -1,6 +1,9 @@ /datum/component/storage/concrete/bluespace/bag_of_holding/handle_item_insertion(obj/item/W, prevent_warning = FALSE, mob/living/user) var/atom/A = parent if((istype(W, /obj/item/storage/backpack/holding) || count_by_type(W.GetAllContents(), /obj/item/storage/backpack/holding))) + var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed") + if(safety != "Proceed" || QDELETED(A) || QDELETED(W) || QDELETED(user) || !user.canUseTopic(A, BE_CLOSE, iscarbon(user))) + return var/turf/loccheck = get_turf(A) if(is_reebe(loccheck.z)) user.visible_message("An unseen force knocks [user] to the ground!", "\"I think not!\"") @@ -8,15 +11,16 @@ return if(istype(loccheck.loc, /area/fabric_of_reality)) to_chat(user, "You can't do that here!") - var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed") - if(safety == "Abort" || !in_range(A, user) || !A || !W || user.incapacitated()) - return to_chat(user, "The Bluespace interfaces of the two devices catastrophically malfunction!") qdel(W) playsound(loccheck,'sound/effects/supermatter.ogg', 200, 1) for(var/turf/T in range(6,loccheck)) if(istype(T, /turf/open/space/transit)) continue + for(var/mob/living/M in T) + if(M.movement_type & FLYING) + M.visible_message("The bluespace collapse crushes the air towards it, pulling [M] towards the ground...") + M.Knockdown(5, TRUE, TRUE) //Overrides stun absorbs. T.TerraformTurf(/turf/open/chasm/magic, /turf/open/chasm/magic) message_admins("[ADMIN_LOOKUPFLW(user)] detonated a bag of holding at [ADMIN_VERBOSEJMP(loccheck)].") log_game("[key_name(user)] detonated a bag of holding at [AREACOORD(loccheck)].") diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 8efd0f4a9e7..013e55ce14e 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -696,7 +696,10 @@ if(A.loc == user) . = COMPONENT_NO_ATTACK_HAND - show_to(user) + if(locked) + to_chat(user, "[parent] seems to be locked!") + else + show_to(user) /datum/component/storage/proc/signal_on_pickup(mob/user) var/atom/A = parent @@ -717,7 +720,7 @@ return hide_from(target) /datum/component/storage/proc/on_alt_click(mob/user) - if(!isliving(user) || user.incapacitated() || !quickdraw || !user.CanReach(parent)) + if(!isliving(user) || user.incapacitated() || !quickdraw || locked || !user.CanReach(parent)) return var/obj/item/I = locate() in real_location() if(!I) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 67eb33277ac..ddb924f7402 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -189,7 +189,9 @@ if(properties && properties.len) if(properties["stealth"] >= 2) - visibility_flags = HIDDEN_SCANNER + visibility_flags |= HIDDEN_SCANNER + else + visibility_flags &= ~HIDDEN_SCANNER SetSpread(CLAMP(2 ** (properties["transmittable"] - symptoms.len), DISEASE_SPREAD_BLOOD, DISEASE_SPREAD_AIRBORNE)) diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index 9574338b517..6574ecd5185 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -1,52 +1,35 @@ // Cold - /datum/disease/advance/cold/New() name = "Cold" symptoms = list(new/datum/symptom/sneeze) ..() - // Flu - /datum/disease/advance/flu/New() name = "Flu" symptoms = list(new/datum/symptom/cough) ..() +//Randomly generated Disease, for virus crates and events +/datum/disease/advance/random + name = "Experimental Disease" -// Voice Changing - -/datum/disease/advance/voice_change/New() - name = "Epiglottis Mutation" - symptoms = list(new/datum/symptom/voice_change) - ..() - - -// Toxin Filter - -/datum/disease/advance/heal/New() - name = "Liver Enhancer" - symptoms = list(new/datum/symptom/heal) - ..() - - -// Hallucigen - -/datum/disease/advance/hallucigen/New() - name = "Second Sight" - symptoms = list(new/datum/symptom/hallucigen) - ..() - -// Sensory Restoration - -/datum/disease/advance/mind_restoration/New() - name = "Intelligence Booster" - symptoms = list(new/datum/symptom/mind_restoration) - ..() - -// Sensory Destruction - -/datum/disease/advance/narcolepsy/New() - name = "Experimental Insomnia Cure" - symptoms = list(new/datum/symptom/narcolepsy) - ..() \ No newline at end of file +/datum/disease/advance/random/New(max_symptoms, max_level = 8) + if(!max_symptoms) + max_symptoms = rand(1, VIRUS_SYMPTOM_LIMIT) + var/list/datum/symptom/possible_symptoms = list() + for(var/symptom in subtypesof(/datum/symptom)) + var/datum/symptom/S = symptom + if(initial(S.level) > max_level) + continue + if(initial(S.level) <= 0) //unobtainable symptoms + continue + possible_symptoms += S + for(var/i in 1 to max_symptoms) + var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) + if(chosen_symptom) + var/datum/symptom/S = new chosen_symptom + symptoms += S + Refresh() + + name = "Sample #[rand(1,10000)]" \ No newline at end of file diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 78314d4fd32..119363dfa3d 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -201,7 +201,8 @@ GLOBAL_LIST_EMPTY(explosions) items += A.GetAllContents() for(var/O in items) var/atom/A = O - A.ex_act(dist) + if(!QDELETED(A)) + A.ex_act(dist) if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) new /obj/effect/hotspot(T) //Mostly for ambience! diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 9c0fa0cd452..fb440987374 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -18,13 +18,10 @@ var/clockwork_warp_allowed = TRUE // Can servants warp into this area from Reebe? var/clockwork_warp_fail = "The structure there is too dense for warping to pierce. (This is normal in high-security areas.)" - var/eject = null - var/fire = null var/atmos = TRUE var/atmosalm = FALSE var/poweralm = TRUE - var/party = null var/lightswitch = TRUE var/requires_power = TRUE @@ -256,9 +253,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/proc/firereset(obj/source) if (fire) - fire = 0 - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - updateicon() + unset_fire_alarm_effects() ModifyFiredoors(TRUE) for(var/item in firealarms) var/obj/machinery/firealarm/F = item @@ -290,7 +285,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) DOOR.lock() /area/proc/burglaralert(obj/trigger) - if(always_unpowered == 1) //no burglar alarms in space/asteroid + if(always_unpowered) //no burglar alarms in space/asteroid return //Trigger alarm effect @@ -306,61 +301,32 @@ GLOBAL_LIST_EMPTY(teleportlocs) addtimer(CALLBACK(SILICON, /mob/living/silicon.proc/cancelAlarm,"Burglar",src,trigger), 600) /area/proc/set_fire_alarm_effect() - fire = 1 - updateicon() + fire = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT + for(var/alarm in firealarms) + var/obj/machinery/firealarm/F = alarm + F.update_fire_light(fire) + for(var/obj/machinery/light/L in src) + L.update() -/area/proc/readyalert() - if(name == "Space") - return - if(!eject) - eject = 1 - updateicon() - -/area/proc/readyreset() - if(eject) - eject = 0 - updateicon() - -/area/proc/partyalert() - if(src.name == "Space") //no parties in space!!! - return - if (!( src.party )) - src.party = 1 - src.updateicon() - src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/area/proc/partyreset() - if (src.party) - src.party = 0 - src.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - src.updateicon() - for(var/obj/machinery/door/firedoor/D in src) - if(!D.welded) - if(D.operating) - D.nextstate = OPEN - else if(D.density) - INVOKE_ASYNC(D, /obj/machinery/door/firedoor.proc/open) +/area/proc/unset_fire_alarm_effects() + fire = FALSE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + for(var/alarm in firealarms) + var/obj/machinery/firealarm/F = alarm + F.update_fire_light(fire) + for(var/obj/machinery/light/L in src) + L.update() /area/proc/updateicon() - if ((fire || eject || party) && (!requires_power||power_environ))//If it doesn't require power, can still activate this proc. - if(fire && !eject && !party) - icon_state = "blue" - else if(!fire && eject && !party) - icon_state = "red" - else if(party && !fire && !eject) - icon_state = "party" - else - icon_state = "blue-red" - else - var/weather_icon - for(var/V in SSweather.processing) - var/datum/weather/W = V - if(W.stage != END_STAGE && (src in W.impacted_areas)) - W.update_areas() - weather_icon = TRUE - if(!weather_icon) - icon_state = null + var/weather_icon + for(var/V in SSweather.processing) + var/datum/weather/W = V + if(W.stage != END_STAGE && (src in W.impacted_areas)) + W.update_areas() + weather_icon = TRUE + if(!weather_icon) + icon_state = null /area/space/updateicon() icon_state = null diff --git a/code/game/atoms.dm b/code/game/atoms.dm index b937d4d932b..2674c66d480 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -2,6 +2,7 @@ layer = TURF_LAYER plane = GAME_PLANE var/level = 2 + var/article // If non-null, overrides a/an/some in all cases var/flags_1 = NONE var/interaction_flags_atom = NONE @@ -241,7 +242,10 @@ /atom/proc/get_examine_name(mob/user) . = "\a [src]" - var/list/override = list(gender == PLURAL? "some" : "a" , " ", "[name]") + var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]") + if(article) + . = "[article] [src]" + override[EXAMINE_POSITION_ARTICLE] = article if(SendSignal(COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) . = override.Join("") diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d411f518f1c..e465b0d2de8 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -221,14 +221,15 @@ if(. && pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move. if(pulling.anchored) stop_pulling() - return - var/pull_dir = get_dir(src, pulling) - if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) //puller and pullee more than one tile away or in diagonal position - pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position - if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up - stop_pulling() - if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. - pulledby.stop_pulling() + else + var/pull_dir = get_dir(src, pulling) + //puller and pullee more than one tile away or in diagonal position + if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) + pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position + if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up + stop_pulling() + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. + pulledby.stop_pulling() last_move = direct @@ -563,6 +564,7 @@ I = image('icons/effects/effects.dmi', A, visual_effect_icon, A.layer + 0.1) else if(used_item) I = image(icon = used_item, loc = A, layer = A.layer + 0.1) + I.plane = GAME_PLANE // Scale the icon. I.transform *= 0.75 diff --git a/code/game/gamemodes/brother/traitor_bro.dm b/code/game/gamemodes/brother/traitor_bro.dm index 41b583852d2..e25c4f7716f 100644 --- a/code/game/gamemodes/brother/traitor_bro.dm +++ b/code/game/gamemodes/brother/traitor_bro.dm @@ -43,7 +43,7 @@ team.add_member(bro) bro.special_role = "brother" bro.restricted_roles = restricted_jobs - log_game("[bro.key] (ckey) has been selected as a Brother") + log_game("[key_name(bro)] has been selected as a Brother") pre_brother_teams += team return ..() diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 93d77209e00..f350ab43921 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -69,7 +69,7 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th GLOB.changeling_team_objective_type = pick(possible_team_objectives) for(var/datum/mind/changeling in changelings) - log_game("[changeling.key] (ckey) has been selected as a changeling") + log_game("[key_name(changeling)] has been selected as a changeling") var/datum/antagonist/changeling/new_antag = new() new_antag.team_mode = TRUE changeling.add_antag_datum(new_antag) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index a0cfd79770f..fc0cfc2879f 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -174,7 +174,7 @@ Credit where due: /datum/game_mode/clockwork_cult/post_setup() for(var/S in servants_to_serve) var/datum/mind/servant = S - log_game("[servant.key] was made an initial servant of Ratvar") + log_game("[key_name(servant)] was made an initial servant of Ratvar") var/mob/living/L = servant.current var/turf/T = pick(GLOB.servant_spawns) L.forceMove(T) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index c3f5805e837..de9422d6f77 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -79,7 +79,7 @@ cultists_to_cult += cultist cultist.special_role = ROLE_CULTIST cultist.restricted_roles = restricted_jobs - log_game("[cultist.key] (ckey) has been selected as a cultist") + log_game("[key_name(cultist)] has been selected as a cultist") return (cultists_to_cult.len>=required_enemies) diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm index 3007164465d..2e897539d87 100644 --- a/code/game/gamemodes/devil/devil_game_mode.dm +++ b/code/game/gamemodes/devil/devil_game_mode.dm @@ -41,7 +41,7 @@ devil.special_role = traitor_name devil.restricted_roles = restricted_jobs - log_game("[devil.key] (ckey) has been selected as a [traitor_name]") + log_game("[key_name(devil)] has been selected as a [traitor_name]") antag_candidates.Remove(devil) if(devils.len < required_enemies) diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm index 6089f959417..8f7bedd4ddf 100644 --- a/code/game/gamemodes/monkey/monkey.dm +++ b/code/game/gamemodes/monkey/monkey.dm @@ -36,7 +36,7 @@ carriers += carrier carrier.special_role = "Monkey Leader" carrier.restricted_roles = restricted_jobs - log_game("[carrier.key] (ckey) has been selected as a Jungle Fever carrier") + log_game("[key_name(carrier)] has been selected as a Jungle Fever carrier") antag_candidates -= carrier if(!carriers.len) diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 3b7dca1a81d..973de8cde16 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -30,7 +30,7 @@ pre_nukeops += new_op new_op.assigned_role = "Nuclear Operative" new_op.special_role = "Nuclear Operative" - log_game("[new_op.key] (ckey) has been selected as a nuclear operative") + log_game("[key_name(new_op)] has been selected as a nuclear operative") return TRUE else return FALSE diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 1553ee811f4..592d930f7d1 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -96,7 +96,7 @@ revolution = new() for(var/datum/mind/rev_mind in headrev_candidates) - log_game("[rev_mind.key] (ckey) has been selected as a head rev") + log_game("[key_name(rev_mind)] has been selected as a head rev") var/datum/antagonist/rev/head/new_head = new() new_head.give_flash = TRUE new_head.give_hud = TRUE diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index c8636973f8d..313c090ce3b 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -53,7 +53,7 @@ pre_traitors += traitor traitor.special_role = traitor_name traitor.restricted_roles = restricted_jobs - log_game("[traitor.key] (ckey) has been selected as a [traitor_name]") + log_game("[key_name(traitor)] has been selected as a [traitor_name]") antag_candidates.Remove(traitor) return !traitors_required || pre_traitors.len > 0 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 8a6a7b7903d..32d17fec2c0 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -23,7 +23,7 @@ wizards += wizard wizard.assigned_role = ROLE_WIZARD wizard.special_role = ROLE_WIZARD - log_game("[wizard.key] (ckey) has been selected as a Wizard") //TODO: Move these to base antag datum + log_game("[key_name(wizard)] has been selected as a Wizard") //TODO: Move these to base antag datum if(GLOB.wizardstart.len == 0) to_chat(wizard.current, "A starting location for you could not be found, please report this bug!") return 0 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index b3acda62601..f61d7c7d42e 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -170,7 +170,7 @@ return if(mob_occupant.health < min_health && chem != "epinephrine") return - if(inject_chem(chem)) + if(inject_chem(chem, usr)) . = TRUE if(scrambled_chems && prob(5)) to_chat(usr, "Chem System Re-route detected, results may not be as expected!") @@ -179,9 +179,11 @@ scramble_chem_buttons() to_chat(user, "You scramble the sleeper's user interface!") -/obj/machinery/sleeper/proc/inject_chem(chem) +/obj/machinery/sleeper/proc/inject_chem(chem, mob/user) if((chem in available_chems) && chem_allowed(chem)) occupant.reagents.add_reagent(chem_buttons[chem], 10) //emag effect kicks in here so that the "intended" chem is used for all checks, for extra FUUU + if(user) + add_logs(user, occupant, "injected [chem] into", addition = "via [src]") return TRUE /obj/machinery/sleeper/proc/chem_allowed(chem) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 5a8d8b7a892..23dcabd885b 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -133,7 +133,7 @@ clonemind = locate(mindref) in SSticker.minds if(!istype(clonemind)) //not a mind return FALSE - if(clonemind.current) + if(!QDELETED(clonemind.current)) if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body return FALSE if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. diff --git a/code/game/machinery/computer/gulag_teleporter.dm b/code/game/machinery/computer/gulag_teleporter.dm index 98c398a2c29..68cbf03f03c 100644 --- a/code/game/machinery/computer/gulag_teleporter.dm +++ b/code/game/machinery/computer/gulag_teleporter.dm @@ -148,7 +148,7 @@ id_goal_not_set = TRUE id.goal = default_goal say("[id]'s ID card goal defaulting to [id.goal] points.") - log_game("[user]([user.ckey] teleported [prisoner]([prisoner.ckey]) to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][id.goal] points.") + log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][id.goal] points.") teleporter.handle_prisoner(id, temporary_record) playsound(src, 'sound/weapons/emitter.ogg', 50, 1) prisoner.forceMove(get_turf(beacon)) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index fc3c32cd4d8..f606494b967 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -283,7 +283,7 @@ src.temp = "Are you sure you wish to delete all records?
\n\tYes
\n\tNo
" else if(href_list["del_all2"]) - investigate_log("[usr.name] ([usr.key]) has deleted all medical records.", INVESTIGATE_RECORDS) + investigate_log("[key_name(usr)] has deleted all medical records.", INVESTIGATE_RECORDS) GLOB.data_core.medical.Cut() src.temp = "All records deleted." @@ -449,7 +449,7 @@ src.temp = "Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
" else if(href_list["del_r2"]) - investigate_log("[usr.name] ([usr.key]) has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS) + investigate_log("[key_name(usr)] has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS) if(active2) qdel(active2) active2 = null diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index 41aaac85dbb..5c8d189a7f9 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -133,7 +133,7 @@ if((istype(S) && S.hack_software) || IsAdminGhost(usr)) var/mob/living/silicon/robot/R = locate(href_list["magbot"]) in GLOB.silicon_mobs if(istype(R) && !R.emagged && (R.connected_ai == usr || IsAdminGhost(usr)) && !R.scrambledcodes && can_control(usr, R)) - log_game("[key_name(usr)] emagged [R.name] using robotic console!") + log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!") message_admins("[ADMIN_LOOKUPFLW(usr)] emagged cyborg [key_name_admin(R)] using robotic console!") R.SetEmagged(1) @@ -141,7 +141,7 @@ if(isAI(usr) && is_servant_of_ratvar(usr)) var/mob/living/silicon/robot/R = locate(href_list["convert"]) in GLOB.silicon_mobs if(istype(R) && !is_servant_of_ratvar(R) && R.connected_ai == usr) - log_game("[key_name(usr)] converted [R.name] using robotic console!") + log_game("[key_name(usr)] converted [key_name(R)] using robotic console!") message_admins("[ADMIN_LOOKUPFLW(usr)] converted cyborg [key_name_admin(R)] using robotic console!") add_servant_of_ratvar(R) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 31e9480429c..17121c45cf1 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -457,7 +457,7 @@ What a mess.*/ temp += "No" if("Purge All Records") - investigate_log("[usr.name] ([usr.key]) has purged all the security records.", INVESTIGATE_RECORDS) + investigate_log("[key_name(usr)] has purged all the security records.", INVESTIGATE_RECORDS) for(var/datum/data/record/R in GLOB.data_core.security) qdel(R) GLOB.data_core.security.Cut() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 4a2df111511..dc7056784a3 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -15,7 +15,6 @@ resistance_flags = FIRE_PROOF heat_proof = TRUE glass = TRUE - var/nextstate = null sub_door = TRUE explosion_block = 1 safe = FALSE @@ -24,6 +23,7 @@ assemblytype = /obj/structure/firelock_frame armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN + var/nextstate = null var/boltslocked = TRUE var/list/affecting_areas diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index 973f96b09d9..34a5659f3f4 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -23,9 +23,14 @@ idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON + resistance_flags = FIRE_PROOF + + light_power = 0 + light_range = 7 + light_color = "#ff3232" + var/detecting = 1 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - resistance_flags = FIRE_PROOF var/last_alarm = 0 var/area/myarea = null @@ -273,35 +278,10 @@ new /obj/item/stack/cable_coil(loc, 3) qdel(src) - -/* - * Party button - */ - -/obj/machinery/firealarm/partyalarm - name = "\improper PARTY BUTTON" - desc = "Cuban Pete is in the house!" - - -/obj/machinery/firealarm/partyalarm/reset() - if (stat & (NOPOWER|BROKEN)) - return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) - return - A.partyreset() - -/obj/machinery/firealarm/partyalarm/alarm() - if (stat & (NOPOWER|BROKEN)) - return - var/area/A = src.loc - A = A.loc - if (!( istype(A, /area) )) - return - A.partyalert() - -/obj/machinery/firealarm/partyalarm/ui_data(mob/user) - . = ..() - var/area/A = get_area(src) - .["alarm"] = A.party +/obj/machinery/firealarm/proc/update_fire_light(fire) + if(fire == !!light_power) + return // do nothing if we're already active + if(fire) + set_light(l_power = 0.8) + else + set_light(l_power = 0) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 11d9ee8df5e..effdc174b6a 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -42,6 +42,8 @@ if(href_list["makepipe"]) if(wait < world.time) var/p_type = text2path(href_list["makepipe"]) + if (!verify_recipe(GLOB.atmos_pipe_recipes, p_type)) + return var/p_dir = text2num(href_list["dir"]) var/obj/item/pipe/P = new (loc, p_type, p_dir) P.setPipingLayer(piping_layer) @@ -66,6 +68,15 @@ else return ..() +/obj/machinery/pipedispenser/proc/verify_recipe(recipes, path) + for(var/category in recipes) + var/list/cat_recipes = recipes[category] + for(var/i in cat_recipes) + var/datum/pipe_info/info = i + if (path == info.id) + return TRUE + return FALSE + /obj/machinery/pipedispenser/wrench_act(mob/living/user, obj/item/I) if(default_unfasten_wrench(user, I, 40)) user << browse(null, "window=pipedispenser") @@ -124,6 +135,8 @@ if(href_list["dmake"]) if(wait < world.time) var/p_type = text2path(href_list["dmake"]) + if (!verify_recipe(GLOB.disposal_pipe_recipes, p_type)) + return var/obj/structure/disposalconstruct/C = new (loc, p_type) if(!C.can_place()) diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 4fa40910a8b..4c745189372 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -28,8 +28,7 @@ /obj/machinery/transformer/examine(mob/user) . = ..() if(cooldown && (issilicon(user) || isobserver(user))) - var/seconds_remaining = (cooldown_timer - world.time) / 10 - to_chat(user, "It will be ready in [max(0, seconds_remaining)] seconds.") + to_chat(user, "It will be ready in [DisplayTimeText(cooldown_timer - world.time)].") /obj/machinery/transformer/Destroy() QDEL_NULL(countdown) diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index fe10bf510b4..89330fa006a 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -187,7 +187,7 @@ log_message("Honked from [src.name]. HONK!") var/turf/T = get_turf(src) message_admins("[ADMIN_LOOKUPFLW(chassis.occupant)] used a Mecha Honker in [ADMIN_VERBOSEJMP(T)]") - log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in [AREACOORD(T)]") + log_game("[key_name(chassis.occupant)] used a Mecha Honker in [AREACOORD(T)]") return 1 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index c6f070c23a5..ddad0067b56 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -42,7 +42,7 @@ var/last_message = 0 var/add_req_access = 1 var/maint_access = 0 - var/dna_lock//dna-locking the mech + var/dna_lock //dna-locking the mech var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference var/datum/effect_system/spark_spread/spark_system = new var/lights = FALSE diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index bb4d5ac97cb..66eb0ed98fd 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -913,3 +913,11 @@ req_components = list( /obj/item/stock_parts/manipulator = 2, /obj/item/stock_parts/matter_bin = 2) + +/obj/item/circuitboard/machine/generator + name = "Thermo-Electric Generator (Machine Board)" + build_path = /obj/machinery/power/generator + +/obj/item/circuitboard/machine/circulator + name = "Circulator/Heat Exchanger (Machine Board)" + build_path = /obj/machinery/atmospherics/components/binary/circulator \ No newline at end of file diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 7e1a1be7e3c..9e20dc455b0 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -32,7 +32,7 @@ var/time = time2text(world.realtime,"hh:mm:ss") var/turf/T = get_turf(src) - GLOB.lastsignalers.Add("[time] : [usr.key] used [src] @ location ([T.x],[T.y],[T.z]) : [format_frequency(frequency)]/[code]") + GLOB.lastsignalers.Add("[time] : [usr.key] used [src] @ location [AREACOORD(T)] : [format_frequency(frequency)]/[code]") var/datum/signal/signal = new(list("code" = code)) radio_connection.post_signal(src, signal, filter = RADIO_SIGNALER) diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm index 6b1564a3bc2..eefa302032f 100644 --- a/code/game/objects/items/hot_potato.dm +++ b/code/game/objects/items/hot_potato.dm @@ -140,7 +140,7 @@ START_PROCESSING(SSfastprocess, src) var/turf/T = get_turf(src) message_admins("[user? "[ADMIN_LOOKUPFLW(user)] has primed [src]" : "A [src] has been primed"] (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [ADMIN_VERBOSEJMP(T)]") - log_game("[user? "[user] has primed [src]" : "A [src] has been primed"] ([detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [AREACOORD(T)]") + log_game("[user ? "[key_name(user)] has primed [src]" : "A [src] has been primed"] ([detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range]) for detonation at [AREACOORD(T)]") active = TRUE /obj/item/hot_potato/proc/deactivate() diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 79ccf151e93..ef02fbf384a 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -312,7 +312,7 @@ audible_message("HUMAN HARM") playsound(get_turf(src), 'sound/ai/harmalarm.ogg', 70, 3) cooldown = world.time + 200 - log_game("[user.ckey]([user]) used a Cyborg Harm Alarm in ([user.x],[user.y],[user.z])") + log_game("[key_name(user)] used a Cyborg Harm Alarm in [AREACOORD(user)]") if(iscyborg(user)) var/mob/living/silicon/robot/R = user to_chat(R.connected_ai, "
NOTICE - Peacekeeping 'HARM ALARM' used by: [user]
") @@ -335,7 +335,7 @@ C.Jitter(25) playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3) cooldown = world.time + 600 - log_game("[user.ckey]([user]) used an emagged Cyborg Harm Alarm in ([user.x],[user.y],[user.z])") + log_game("[key_name(user)] used an emagged Cyborg Harm Alarm in [AREACOORD(user)]") #define DISPENSE_LOLLIPOP_MODE 1 #define THROW_LOLLIPOP_MODE 2 diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index 3f8c3b24e70..e1d65be1b78 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -19,6 +19,7 @@ STR.max_w_class = WEIGHT_CLASS_NORMAL STR.max_combined_w_class = 14 STR.max_items = 4 + STR.locked = TRUE /obj/item/storage/lockbox/attackby(obj/item/W, mob/user, params) var/locked = SendSignal(COMSIG_IS_STORAGE_LOCKED) diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 123ffaa76c3..658a95b016d 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -75,6 +75,9 @@ return ..() if(user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_HEAD) return ..() + if(user.has_trait(TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm [M]!") + return if(user.has_trait(TRAIT_CLUMSY) && prob(50)) M = user return eyestab(M,user) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 65ed2281f01..02e1cc9bd0e 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -27,6 +27,8 @@ var/req_access_txt = "0" var/list/req_one_access var/req_one_access_txt = "0" + + var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object /obj/vv_edit_var(vname, vval) switch(vname) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index fe89b450c48..39ae5bfae89 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -170,7 +170,7 @@ return if(QDELETED(src) || uses <= 0) return - log_game("[user.ckey] golem-swapped into [src]") + log_game("[key_name(user)] golem-swapped into [src]") user.visible_message("A faint light leaves [user], moving to [src] and animating it!","You leave your old body behind, and transfer into [src]!") show_flavour = FALSE create(ckey = user.ckey,name = user.real_name) diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index e656b2f5305..1cd3f6e4447 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -79,6 +79,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( qdel(src) //Just get the side effects and call Destroy var/turf/W = new path(src) + W.vis_contents.Cut() + for(var/i in transferring_comps) W.TakeComponent(i) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index e2134de21cd..a6f7af8b123 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -88,7 +88,7 @@ baseturfs = /turf/open/indestructible/airblock /turf/open/indestructible/clock_spawn_room - name = "cogmetal" + name = "cogmetal floor" desc = "Brass plating that gently radiates heat. For some reason, it reminds you of blood." icon_state = "reebe" baseturfs = /turf/open/indestructible/clock_spawn_room diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 5d028c6403f..e53d9d2c6d6 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -85,6 +85,7 @@ return /turf/open/floor/grass/snow + gender = PLURAL name = "snow" icon = 'icons/turf/snow.dmi' desc = "Looks cold." @@ -103,6 +104,7 @@ return /turf/open/floor/grass/snow/basalt //By your powers combined, I am captain planet + gender = NEUTER name = "volcanic floor" icon = 'icons/turf/floors.dmi' icon_state = "basalt" diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm index 0ac71545921..e5560df6eca 100644 --- a/code/game/turfs/simulated/floor/mineral_floor.dm +++ b/code/game/turfs/simulated/floor/mineral_floor.dm @@ -118,7 +118,7 @@ initial_gas_mix = "TEMP=2.7" /turf/open/floor/mineral/plastitanium/brig - name = "Brig floor" + name = "brig floor" //BANANIUM @@ -174,6 +174,7 @@ //URANIUM /turf/open/floor/mineral/uranium + article = "a" name = "uranium floor" icon_state = "uranium" floor_tile = /obj/item/stack/tile/mineral/uranium diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index f7cea96a3fc..b3929abf91c 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -47,17 +47,17 @@ initial_gas_mix = "TEMP=2.7" /turf/open/floor/circuit/killroom - name = "Killroom Floor" + name = "killroom Floor" initial_gas_mix = "n2=500;TEMP=80" /turf/open/floor/circuit/telecomms initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/circuit/telecomms/mainframe - name = "Mainframe Base" + name = "mainframe Base" /turf/open/floor/circuit/telecomms/server - name = "Server Base" + name = "server Base" /turf/open/floor/circuit/green icon_state = "gcircuit" @@ -81,7 +81,7 @@ initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/circuit/green/telecomms/mainframe - name = "Mainframe Base" + name = "mainframe Base" /turf/open/floor/circuit/red icon_state = "rcircuit" diff --git a/code/game/turfs/simulated/floor/plasteel_floor.dm b/code/game/turfs/simulated/floor/plasteel_floor.dm index a673cfde441..815cb52bd4a 100644 --- a/code/game/turfs/simulated/floor/plasteel_floor.dm +++ b/code/game/turfs/simulated/floor/plasteel_floor.dm @@ -26,11 +26,11 @@ /turf/open/floor/plasteel/dark/telecomms initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/plasteel/dark/telecomms/mainframe - name = "Mainframe Floor" + name = "mainframe floor" /turf/open/floor/plasteel/dark/telecomms/server - name = "Server Base" + name = "server base" /turf/open/floor/plasteel/dark/telecomms/server/walkway - name = "Server Walkway" + name = "server walkway" /turf/open/floor/plasteel/airless/dark icon_state = "darkfull" /turf/open/floor/plasteel/dark/side @@ -60,7 +60,7 @@ /turf/open/floor/plasteel/brown/telecomms initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/plasteel/brown/telecomms/mainframe - name = "Mainframe Floor" + name = "mainframe Floor" /turf/open/floor/plasteel/brown/corner icon_state = "browncorner" @@ -349,9 +349,9 @@ /turf/open/floor/plasteel/vault/telecomms initial_gas_mix = "n2=100;TEMP=80" /turf/open/floor/plasteel/vault/telecomms/mainframe - name = "Mainframe Floor" + name = "mainframe Floor" /turf/open/floor/plasteel/vault/killroom - name = "Killroom Floor" + name = "killroom Floor" initial_gas_mix = "n2=500;TEMP=80" /turf/open/floor/plasteel/cult @@ -363,7 +363,7 @@ /turf/open/floor/plasteel/goonplaque icon_state = "plaque" - name = "Commemorative Plaque" + name = "commemorative plaque" desc = "\"This is a plaque in honour of our comrades on the G4407 Stations. Hopefully TG4407 model can live up to your fame and fortune.\" Scratched in beneath that is a crude image of a meteor and a spaceman. The spaceman is laughing. The meteor is exploding." /turf/open/floor/plasteel/cult/narsie_act() diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 3877868ca24..013a3646f54 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -2,6 +2,7 @@ /**********************Asteroid**************************/ /turf/open/floor/plating/asteroid //floor piece + gender = PLURAL name = "asteroid sand" baseturfs = /turf/open/floor/plating/asteroid icon = 'icons/turf/floors.dmi' @@ -266,6 +267,7 @@ /turf/open/floor/plating/asteroid/snow + gender = PLURAL name = "snow" desc = "Looks cold." icon = 'icons/turf/snow.dmi' @@ -292,7 +294,7 @@ return FALSE /turf/open/floor/plating/asteroid/snow/ice - name = "icey snow" + name = "icy snow" desc = "Looks colder." baseturfs = /turf/open/floor/plating/asteroid/snow/ice initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120" diff --git a/code/game/turfs/simulated/floor/plating/dirt.dm b/code/game/turfs/simulated/floor/plating/dirt.dm index 15b8b56c263..cd7272fa402 100644 --- a/code/game/turfs/simulated/floor/plating/dirt.dm +++ b/code/game/turfs/simulated/floor/plating/dirt.dm @@ -1,4 +1,5 @@ /turf/open/floor/plating/dirt + gender = PLURAL name = "dirt" desc = "Upon closer examination, it's still dirt." icon = 'icons/turf/floors.dmi' diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index a04bd818ad0..6d4a949c754 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -34,6 +34,7 @@ /turf/open/floor/plating/ashplanet icon = 'icons/turf/mining.dmi' + gender = PLURAL name = "ash" icon_state = "ash" smooth = SMOOTH_MORE|SMOOTH_BORDER @@ -66,6 +67,7 @@ slowdown = 1 /turf/open/floor/plating/ashplanet/rocky + gender = PLURAL name = "rocky ground" icon_state = "rockyash" smooth_icon = 'icons/turf/floors/rocky_ash.dmi' @@ -73,6 +75,7 @@ canSmoothWith = list(/turf/open/floor/plating/ashplanet/rocky, /turf/closed) /turf/open/floor/plating/ashplanet/wateryrock + gender = PLURAL name = "wet rocky ground" smooth = null icon_state = "wateryrock" @@ -97,6 +100,7 @@ contents_explosion(severity, target) /turf/open/floor/plating/beach/sand + gender = PLURAL name = "sand" desc = "Surf's up." icon_state = "sand" @@ -114,6 +118,7 @@ baseturfs = /turf/open/floor/plating/beach/coastline_b /turf/open/floor/plating/beach/water + gender = PLURAL name = "water" desc = "You get the feeling that nobody's bothered to actually make this water functional..." icon_state = "water" @@ -124,6 +129,7 @@ baseturfs = /turf/open/floor/plating/beach/coastline_t/sandwater_inner /turf/open/floor/plating/ironsand + gender = PLURAL name = "iron sand" desc = "Like sand, but more metal." diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index a51989d2302..13cf9364123 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -90,11 +90,12 @@ //air filled floors; used in atmos pressure chambers /turf/open/floor/engine/n2o - name = "n2o floor" + article = "an" + name = "\improper N2O floor" initial_gas_mix = "n2o=6000;TEMP=293.15" /turf/open/floor/engine/co2 - name = "co2 floor" + name = "\improper CO2 floor" initial_gas_mix = "co2=50000;TEMP=293.15" /turf/open/floor/engine/plasma @@ -102,11 +103,12 @@ initial_gas_mix = "plasma=70000;TEMP=293.15" /turf/open/floor/engine/o2 - name = "o2 floor" + name = "\improper O2 floor" initial_gas_mix = "o2=100000;TEMP=293.15" /turf/open/floor/engine/n2 - name = "n2 floor" + article = "an" + name = "\improper N2 floor" initial_gas_mix = "n2=100000;TEMP=293.15" /turf/open/floor/engine/air diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 94e5a0a063b..6687d357734 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -52,6 +52,7 @@ canSmoothWith = list(/turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone) /turf/closed/wall/mineral/uranium + article = "a" name = "uranium wall" desc = "A wall with uranium plating. This is probably a bad idea." icon = 'icons/turf/walls/uranium_wall.dmi' diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 3977ad1955c..23ba5957c81 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -1,4 +1,5 @@ /turf/open/water + gender = PLURAL name = "water" desc = "Shallow water." icon = 'icons/turf/floors.dmi' diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index e66b148e9ce..8416684e73a 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -1,4 +1,5 @@ /turf/open/space/transit + name = "\proper hyperspace" icon_state = "black" dir = SOUTH baseturfs = /turf/open/space/transit diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 015cb14789b..d491c496baa 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -651,7 +651,7 @@ var/atom/A = new chosen(usr.loc) A.flags_1 |= ADMIN_SPAWNED_1 - log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] spawned [chosen] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/spawn_cargo(object as text) @@ -669,7 +669,7 @@ S.admin_spawned = TRUE S.generate(get_turf(usr)) - log_admin("[key_name(usr)] spawned cargo pack [chosen] at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] spawned cargo pack [chosen] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Cargo") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -725,7 +725,7 @@ to_chat(usr, "AI [key_name(S, usr)]'s laws:") else if(iscyborg(S)) var/mob/living/silicon/robot/R = S - to_chat(usr, "CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"]: laws:") + to_chat(usr, "CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [key_name(R.connected_ai)])":"(Independent)"]: laws:") else if (ispAI(S)) to_chat(usr, "pAI [key_name(S, usr)]'s laws:") else diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index d6080339a94..7ba3e699d4e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -594,8 +594,8 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( if(!message) return O.say(message) - log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] say \"[message]\"") - message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. say \"[message]\"") + log_admin("[key_name(usr)] made [O] at [AREACOORD(O)] say \"[message]\"") + message_admins("[key_name_admin(usr)] made [O] at [AREACOORD(O)]. say \"[message]\"") SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" @@ -686,7 +686,7 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( if (tile) var/mob/living/carbon/human/hooman = new(tile) hooman.equipOutfit(pick(subtypesof(/datum/outfit))) - testing("Spawned test mob at [tile.x],[tile.y],[tile.z]") + testing("Spawned test mob at [COORD(tile)]") while (!area && --j > 0) /client/proc/toggle_AI_interact() diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index 83b3d483806..d4dd5951d23 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -146,9 +146,9 @@ if(!SSdbcore.Connect()) to_chat(usr, "Failed to establish database connection.") return - var/output + var/list/output = list() var/ruler = "
" - var/navbar = "\[All\]|\[#\]" + var/list/navbar = list("\[All\]|\[#\]") for(var/letter in GLOB.alphabet) navbar += "|\[[letter]\]" navbar += "|\[Memos\]|\[Watchlist\]" @@ -198,9 +198,9 @@ var/datum/DBQuery/query_get_messages = SSdbcore.NewQuery("SELECT type, secret, id, adminckey, text, timestamp, server, lasteditor, DATEDIFF(NOW(), timestamp) AS `age` FROM [format_table_name("messages")] WHERE type <> 'memo' AND targetckey = '[target_ckey]' AND deleted = 0 ORDER BY timestamp DESC") if(!query_get_messages.warn_execute()) return - var/messagedata - var/watchdata - var/notedata + var/list/messagedata = list() + var/list/watchdata = list() + var/list/notedata = list() var/skipped = 0 while(query_get_messages.NextRow()) type = query_get_messages.item[1] @@ -230,8 +230,7 @@ skipped = TRUE alphatext = "filter: alpha(opacity=[alpha]); opacity: [alpha/100];" - var/data - data += "

[timestamp] | [server] | [admin_ckey]" + var/list/data = list("

[timestamp] | [server] | [admin_ckey]") if(!linkless) data += " \[Delete\]" if(type == "note") @@ -304,7 +303,7 @@ else if(!type && !target_ckey && !index) output += "

\[Add message\]\[Add watchlist entry\]\[Add note\]
" output += ruler - usr << browse({"[output]"}, "window=browse_messages;size=900x500") + usr << browse({"[jointext(output, "")]"}, "window=browse_messages;size=900x500") proc/get_message_output(type, target_ckey) if(!SSdbcore.Connect()) diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 4718ba925da..1c8002943d4 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -278,10 +278,10 @@ T.PlaceOnTop(/turf/closed/wall) else if(iswallturf(object)) T.PlaceOnTop(/turf/closed/wall/r_wall) - log_admin("Build Mode: [key_name(user)] built [T] at ([T.x],[T.y],[T.z])") + log_admin("Build Mode: [key_name(user)] built [T] at [AREACOORD(T)]") return else if(right_click) - log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])") + log_admin("Build Mode: [key_name(user)] deleted [object] at [AREACOORD(object)]") if(isturf(object)) var/turf/T = object T.ScrapeAway() @@ -289,7 +289,7 @@ qdel(object) return else if(isturf(object) && alt_click && left_click) - log_admin("Build Mode: [key_name(user)] built an airlock at ([object.x],[object.y],[object.z])") + log_admin("Build Mode: [key_name(user)] built an airlock at [AREACOORD(object)]") new/obj/machinery/door/airlock(get_turf(object)) else if(isturf(object) && ctrl_click && left_click) var/obj/structure/window/reinforced/window @@ -298,7 +298,7 @@ else window = new /obj/structure/window/reinforced(get_turf(object)) window.setDir(build_dir) - log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])") + log_admin("Build Mode: [key_name(user)] built a window at [AREACOORD(object)]") if(ADV_BUILDMODE) if(left_click && alt_click) objholder = object.type @@ -306,15 +306,15 @@ else if(left_click) if(ispath(objholder, /turf)) var/turf/T = get_turf(object) - log_admin("Build Mode: [key_name(user)] modified [T] ([T.x],[T.y],[T.z]) to [objholder]") + log_admin("Build Mode: [key_name(user)] modified [T] in [AREACOORD(object)] to [objholder]") T.PlaceOnTop(objholder) else var/obj/A = new objholder (get_turf(object)) A.setDir(build_dir) - log_admin("Build Mode: [key_name(user)] modified [A]'s ([A.x],[A.y],[A.z]) dir to [build_dir]") + log_admin("Build Mode: [key_name(user)] modified [A]'s [COORD(A)] dir to [build_dir]") else if(right_click) if(isobj(object)) - log_admin("Build Mode: [key_name(user)] deleted [object] at ([object.x],[object.y],[object.z])") + log_admin("Build Mode: [key_name(user)] deleted [object] at [AREACOORD(object)]") qdel(object) if(VAR_BUILDMODE) @@ -343,7 +343,7 @@ if(right_click) if(throw_atom) throw_atom.throw_at(object, 10, 1,user) - log_admin("Build Mode: [key_name(user)] threw [throw_atom] at [object] ([object.x],[object.y],[object.z])") + log_admin("Build Mode: [key_name(user)] threw [throw_atom] at [object] in [AREACOORD(object)]") if(AREA_BUILDMODE) if(left_click) //rectangular if(!cornerA) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 2bd67eaf37a..39aff339539 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -75,7 +75,7 @@ for (var/device in f) if (istype(device, /atom)) var/atom/A = device - output += "    [device] ([A.x],[A.y],[A.z] in area [get_area(device)])
" + output += "    [device] ([AREACOORD(A)])
" else output += "    [device]
" diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index b92e9901e05..8f31dba1a25 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -9,8 +9,8 @@ var/turf/T = get_turf(O) if(T) - log_admin("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])") - message_admins("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])") + log_admin("[key_name(usr)] has possessed [O] ([O.type]) at [AREACOORD(T)]") + message_admins("[key_name(usr)] has possessed [O] ([O.type]) at [AREACOORD(T)]") else log_admin("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location") message_admins("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 5598402525e..e8afe623ee5 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -28,11 +28,11 @@ if(!check_rights(R_ADMIN)) return - message_admins("[key_name_admin(src)] has started answering [key_name(M.key, 0, 0)]'s prayer.") + message_admins("[key_name_admin(src)] has started answering [ADMIN_LOOKUPFLW(M)]'s prayer.") var/msg = input("Message:", text("Subtle PM to [M.key]")) as text|null if (!msg) - message_admins("[key_name_admin(src)] decided not to answer [key_name(M.key, 0, 0)]'s prayer") + message_admins("[key_name_admin(src)] decided not to answer [ADMIN_LOOKUPFLW(M)]'s prayer") return if(usr) if (usr.client) @@ -856,7 +856,7 @@ Traitors and the like can also be revived with the previous role mostly intact. N.set_safety() N.set_active() - log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at ([N.x],[N.y],[N.z]).") + log_admin("[key_name(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [AREACOORD(N)].") message_admins("[ADMIN_LOOKUPFLW(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [ADMIN_VERBOSEJMP(N)].") SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Nuke", "[N.timing]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm index f51f776d6f5..621e6c36189 100644 --- a/code/modules/admin/verbs/spawnobjasmob.dm +++ b/code/modules/admin/verbs/spawnobjasmob.dm @@ -66,5 +66,5 @@ basemob.ckey = mainsettings["ckey"]["value"] - log_admin("[key_name(usr)] spawned a sentient object-mob [basemob] from [chosen_obj] at ([usr.x],[usr.y],[usr.z])") + log_admin("[key_name(usr)] spawned a sentient object-mob [basemob] from [chosen_obj] at [AREACOORD(usr)]") SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn object-mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index f28780a6c03..f19521e8216 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -359,7 +359,7 @@ to_chat(L, "You hear a voice in your head saying: [message]") to_chat(user, "You send the message to your target.") - log_talk(user,"[key_name(user)] sent an abductor mind message to [L]/[L.ckey]: '[message]'", LOGSAY) + log_talk(user,"[key_name(user)] sent an abductor mind message to [key_name(L)]: '[message]'", LOGSAY) /obj/item/firing_pin/abductor diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index b1de92972e5..1f5088fbec8 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -496,12 +496,12 @@ structure_check() searches for nearby cultist structures required for the invoca if((istype(I, /obj/item/melee/cultblade/dagger) && iscultist(user))) user.visible_message("[user.name] begins erasing [src]...", "You begin erasing [src]...") if(do_after(user, 50, target = src)) //Prevents accidental erasures. - log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with [I.name]") + log_game("Summon Narsie rune erased by [key_name(user)] with [I.name]") message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with [I.name]") ..() else if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me. - log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod") + log_game("Summon Narsie rune erased by [key_name(user)] using a null rod") message_admins("[ADMIN_LOOKUPFLW(user)] erased a Narsie rune with a null rod") ..() diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index bf035e1f213..e0eb886ca03 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -81,7 +81,7 @@ the new instance inside the host to be updated to the template's stats. /mob/camera/disease/Login() ..() if(freemove) - to_chat(src, "You have [round((freemove_end - world.time)/10)] seconds to select your first host. Click on a human to select your host.") + to_chat(src, "You have [DisplayTimeText(freemove_end - world.time)] to select your first host. Click on a human to select your host.") /mob/camera/disease/Stat() @@ -285,7 +285,7 @@ the new instance inside the host to be updated to the template's stats. ..() /mob/camera/disease/proc/adapt_cooldown() - to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [adaptation_cooldown/10] seconds.") + to_chat(src, "You have altered your genetic structure. You will be unable to adapt again for [DisplayTimeText(adaptation_cooldown)].") next_adaptation_time = world.time + adaptation_cooldown addtimer(CALLBACK(src, .proc/notify_adapt_ready), adaptation_cooldown) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 4d3ccf8a344..1beb60f6244 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -371,11 +371,11 @@ if(timing) previous_level = get_security_level() bomb_set = TRUE - set_security_level("delta") detonation_timer = world.time + (timer_set * 10) for(var/obj/item/pinpointer/nuke/syndicate/S in GLOB.pinpointer_list) S.switch_mode_to(TRACK_INFILTRATOR) countdown.start() + set_security_level("delta") else bomb_set = FALSE detonation_timer = null diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index 28f562d23e5..f26658e4aff 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -4,11 +4,6 @@ #define PROB_ACTUAL_TRAITOR 20 #define TRAITOR_AGENT_ROLE "Syndicate External Affairs Agent" -/datum/antagonist/traitor/internal_affairs - name = "Internal Affairs Agent" - antagpanel_category = "IAA" - - /datum/antagonist/traitor/internal_affairs name = "Internal Affairs Agent" employer = "Nanotrasen" diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 4be7550a023..948b73a1a03 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -283,7 +283,7 @@ if(BODY_ZONE_PRECISE_MOUTH) var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text) target.say(wgw) - log_game("[user][user.key] made [target][target.key] say [wgw] with a voodoo doll.") + log_game("[key_name(user)] made [key_name(target)] say [wgw] with a voodoo doll.") if(BODY_ZONE_PRECISE_EYES) user.set_machine(src) user.reset_perspective(target) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index db489d04feb..2064402ea83 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -100,13 +100,13 @@ if (atmos_overlay_types) for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added - vars["vis_contents"] -= overlay + vis_contents -= overlay if (new_overlay_types.len) if (atmos_overlay_types) - vars["vis_contents"] += new_overlay_types - atmos_overlay_types //don't add overlays that already exist + vis_contents += new_overlay_types - atmos_overlay_types //don't add overlays that already exist else - vars["vis_contents"] += new_overlay_types + vis_contents += new_overlay_types UNSETEMPTY(new_overlay_types) src.atmos_overlay_types = new_overlay_types diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index e8007a66081..f8c366a4401 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -1,23 +1,40 @@ //node2, air2, network2 correspond to input //node1, air1, network1 correspond to output - +#define CIRCULATOR_COLD 0 +#define CIRCULATOR_HOT 1 /obj/machinery/atmospherics/components/binary/circulator name = "circulator/heat exchanger" desc = "A gas circulator pump and heat exchanger." - icon_state = "circ1-off" + icon_state = "circ-off" - var/side = CIRC_LEFT - var/status = 0 + var/active = FALSE var/last_pressure_delta = 0 pipe_flags = PIPING_ONE_PER_TURF density = TRUE - var/global/const/CIRC_LEFT = 1 - var/global/const/CIRC_RIGHT = 2 + var/mode = CIRCULATOR_HOT + var/obj/machinery/power/generator/generator + +//default cold circ for mappers +/obj/machinery/atmospherics/components/binary/circulator/cold + mode = CIRCULATOR_COLD + +/obj/machinery/atmospherics/components/binary/circulator/Initialize(mapload) + .=..() + component_parts = list(new /obj/item/circuitboard/machine/circulator) + +/obj/machinery/atmospherics/components/binary/circulator/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) + +/obj/machinery/atmospherics/components/binary/circulator/Destroy() + if(generator) + disconnectFromGenerator() + ..() /obj/machinery/atmospherics/components/binary/circulator/proc/return_transfer_air() @@ -56,11 +73,55 @@ /obj/machinery/atmospherics/components/binary/circulator/update_icon() if(!is_operational()) - icon_state = "circ[side]-p" + icon_state = "circ-p" else if(last_pressure_delta > 0) if(last_pressure_delta > ONE_ATMOSPHERE) - icon_state = "circ[side]-run" + icon_state = "circ-run" else - icon_state = "circ[side]-slow" + icon_state = "circ-slow" else - icon_state = "circ[side]-off" + icon_state = "circ-off" + +/obj/machinery/atmospherics/components/binary/circulator/wrench_act(mob/living/user, obj/item/I) + if(!panel_open) + return + anchored = !anchored + I.play_tool_sound(src) + if(generator) + disconnectFromGenerator() + to_chat(user, "You [anchored?"secure":"unsecure"] [src].") + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/multitool_act(mob/living/user, obj/item/I) + if(generator) + disconnectFromGenerator() + mode = !mode + to_chat(user, "You set [src] to [mode?"cold":"hot"] mode.") + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/screwdriver_act(mob/user, obj/item/I) + panel_open = !panel_open + I.play_tool_sound(src) + to_chat(user, "You [panel_open?"open":"close"] the panel on [src].") + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/crowbar_act(mob/user, obj/item/I) + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/atmospherics/components/binary/circulator/on_deconstruction() + if(generator) + disconnectFromGenerator() + +/obj/machinery/atmospherics/components/binary/circulator/proc/disconnectFromGenerator() + if(mode) + generator.cold_circ = null + else + generator.hot_circ = null + generator.update_icon() + generator = null + +/obj/machinery/atmospherics/components/binary/circulator/setPipingLayer(new_layer) + ..() + pixel_x = 0 + pixel_y = 0 diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 889e6f628b1..65f48f32589 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -40,7 +40,7 @@ var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No") if(ghost_role == "No" || !loc) return - log_game("[user.ckey] became [mob_name]") + log_game("[key_name(user)] became [mob_name]") create(ckey = user.ckey) /obj/effect/mob_spawn/Initialize(mapload) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 2cc0626adc4..fe4155a29b2 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1123,18 +1123,19 @@ /datum/supply_pack/medical/virus name = "Virus Crate" - desc = "Contains twelve different bottles, each filled with a different chemical compound, each useful for virology. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open." + desc = "Contains twelve different bottles, containing several viral samples for virology research. Also includes seven beakers and syringes. Balled-up jeans not included. Requires CMO access to open." cost = 2500 access = ACCESS_CMO contains = list(/obj/item/reagent_containers/glass/bottle/flu_virion, /obj/item/reagent_containers/glass/bottle/cold, - /obj/item/reagent_containers/glass/bottle/epiglottis_virion, - /obj/item/reagent_containers/glass/bottle/liver_enhance_virion, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, + /obj/item/reagent_containers/glass/bottle/random_virus, /obj/item/reagent_containers/glass/bottle/fake_gbs, /obj/item/reagent_containers/glass/bottle/magnitis, /obj/item/reagent_containers/glass/bottle/pierrot_throat, /obj/item/reagent_containers/glass/bottle/brainrot, - /obj/item/reagent_containers/glass/bottle/hallucigen_virion, /obj/item/reagent_containers/glass/bottle/anxiety, /obj/item/reagent_containers/glass/bottle/beesease, /obj/item/storage/box/syringes, diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 1378f0069d3..407529c1ea3 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -773,6 +773,8 @@ GLOBAL_LIST_EMPTY(external_rsc_urls) if (isliving(mob)) var/mob/living/M = mob M.update_damage_hud() + if (prefs.auto_fit_viewport) + fit_viewport() /client/proc/generate_clickcatcher() if(!void) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e78a71ba15e..fecc8d3beff 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -114,6 +114,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/parallax var/ambientocclusion = TRUE + var/auto_fit_viewport = FALSE var/uplink_spawn_loc = UPLINK_PDA @@ -157,7 +158,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) return update_preview_icon() user << browse_rsc(preview_icon, "previewicon.png") - var/dat = "
" + var/list/dat = list("
") dat += "Character Settings" dat += "Game Preferences" @@ -512,6 +513,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"]
" + dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"]
" if (CONFIG_GET(flag/maprotation)) var/p_map = preferred_map @@ -604,7 +606,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" var/datum/browser/popup = new(user, "preferences", "
Character Setup
", 640, 770) - popup.set_content(dat) + popup.set_content(dat.Join()) popup.open(0) #undef APPEARANCE_CATEGORY_COLUMN @@ -1495,6 +1497,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/obj/screen/plane_master/game_world/PM = locate(/obj/screen/plane_master/game_world) in parent.screen PM.backdrop(parent.mob) + if("auto_fit_viewport") + auto_fit_viewport = !auto_fit_viewport + if(auto_fit_viewport && parent) + parent.fit_viewport() + if("save") save_preferences() save_character() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 8c92e59f767..199a0eab6b5 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -98,6 +98,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["clientfps"] >> clientfps S["parallax"] >> parallax S["ambientocclusion"] >> ambientocclusion + S["auto_fit_viewport"] >> auto_fit_viewport S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay @@ -122,6 +123,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car clientfps = sanitize_integer(clientfps, 0, 1000, 0) parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) + auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) @@ -168,6 +170,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["clientfps"], clientfps) WRITE_FILE(S["parallax"], parallax) WRITE_FILE(S["ambientocclusion"], ambientocclusion) + WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport) WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index cf27cc4da67..97b8fee9fce 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -298,3 +298,49 @@ GLOBAL_VAR_INIT(normal_ooc_colour, OOC_COLOR) set desc = "View the last round end report you've seen" SSticker.show_roundend_report(src, TRUE) + +/client/verb/fit_viewport() + set name = "Fit Viewport" + set category = "OOC" + set desc = "Fit the width of the map window to match the viewport" + + // Fetch aspect ratio + var/view_size = getviewsize(view) + var/aspect_ratio = view_size[1] / view_size[2] + + // Calculate desired pixel width using window size and aspect ratio + var/sizes = params2list(winget(src, "mainwindow.split;mapwindow", "size")) + var/map_size = splittext(sizes["mapwindow.size"], "x") + var/height = text2num(map_size[2]) + var/desired_width = round(height * aspect_ratio) + if (text2num(map_size[1]) == desired_width) + // Nothing to do + return + + var/split_size = splittext(sizes["mainwindow.split.size"], "x") + var/split_width = text2num(split_size[1]) + + // Calculate and apply a best estimate + // +4 pixels are for the width of the splitter's handle + var/pct = 100 * (desired_width + 4) / split_width + winset(src, "mainwindow.split", "splitter=[pct]") + + // Apply an ever-lowering offset until we finish or fail + var/delta + for(var/safety in 1 to 10) + var/after_size = winget(src, "mapwindow", "size") + map_size = splittext(after_size, "x") + var/got_width = text2num(map_size[1]) + + if (got_width == desired_width) + // success + return + else if (isnull(delta)) + // calculate a probable delta value based on the difference + delta = 100 * (desired_width - got_width) / split_width + else if ((delta > 0 && got_width > desired_width) || (delta < 0 && got_width < desired_width)) + // if we overshot, halve the delta and reverse direction + delta = -delta/2 + + pct += delta + winset(src, "mainwindow.split", "splitter=[pct]") diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index 79559cc9661..48b69c95685 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -5,11 +5,13 @@ ears = /obj/item/radio/headset id = /obj/item/card/id +/datum/outfit/vr/pre_equip(mob/living/carbon/human/H) + H.dna.species.before_equip_job(null, H) + /datum/outfit/vr/post_equip(mob/living/carbon/human/H) - var/datum/job/captain/J = new/datum/job/captain var/obj/item/card/id/id = H.wear_id - if (id) - id.access |= J.get_access() + if (istype(id)) + id.access |= get_all_accesses() /datum/outfit/vr/syndicate name = "Syndicate VR Operative - Basic" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 3b7420947f8..875fcad37cc 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -732,35 +732,3 @@ fitted = NO_FEMALE_UNIFORM can_adjust = FALSE resistance_flags = NONE - -/obj/item/clothing/under/swimsuit - name = "black swimsuit" - desc = "Perfect for the beach episode." - icon_state = "swim_black" - item_state = "bl_suit" - item_color = "swim_black" - can_adjust = FALSE - -/obj/item/clothing/under/swimsuit/blue - name = "blue swimsuit" - icon_state = "swim_blue" - item_state = "b_suit" - item_color = "swim_blue" - -/obj/item/clothing/under/swimsuit/green - name = "green swimsuit" - icon_state = "swim_green" - item_state = "g_suit" - item_color = "swim_green" - -/obj/item/clothing/under/swimsuit/purple - name = "purple swimsuit" - icon_state = "swim_purple" - item_state = "p_suit" - item_color = "swim_purple" - -/obj/item/clothing/under/swimsuit/red - name = "red swimsuit" - icon_state = "swim_red" - item_state = "r_suit" - item_color = "swim_red" \ No newline at end of file diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm index 98355382062..aee49abcc09 100755 --- a/code/modules/events/abductor.dm +++ b/code/modules/events/abductor.dm @@ -23,9 +23,9 @@ var/datum/team/abductor_team/T = new if(T.team_number > ABDUCTOR_MAX_TEAMS) return MAP_ERROR - - log_game("[scientist.mind.key] (ckey) has been selected as [T.name] abductor scientist.") - log_game("[agent.mind.key] (ckey) has been selected as [T.name] abductor agent.") + + log_game("[key_name(scientist)] has been selected as [T.name] abductor scientist.") + log_game("[key_name(agent)] has been selected as [T.name] abductor agent.") scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, T) agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, T) diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 81e93244ea3..f09c0481f61 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -61,7 +61,7 @@ else D = new virus_type() else - D = make_virus(max_severity, max_severity) + D = new /datum/disease/advance/random(max_severity, max_severity) D.carrier = TRUE H.ForceContractDisease(D, FALSE, TRUE) @@ -73,23 +73,3 @@ message_admins("An event has triggered a random advanced virus outbreak on [ADMIN_LOOKUPFLW(H)]! It has these symptoms: [english_list(name_symptoms)]") log_game("An event has triggered a random advanced virus outbreak on [key_name(H)]! It has these symptoms: [english_list(name_symptoms)]") break - -/datum/round_event/disease_outbreak/proc/make_virus(max_symptoms, max_level) - if(max_symptoms > VIRUS_SYMPTOM_LIMIT) - max_symptoms = VIRUS_SYMPTOM_LIMIT - var/datum/disease/advance/A = new /datum/disease/advance() - var/list/datum/symptom/possible_symptoms = list() - for(var/symptom in subtypesof(/datum/symptom)) - var/datum/symptom/S = symptom - if(initial(S.level) > max_level) - continue - if(initial(S.level) <= 0) //unobtainable symptoms - continue - possible_symptoms += S - for(var/i in 1 to max_symptoms) - var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms) - if(chosen_symptom) - var/datum/symptom/S = new chosen_symptom - A.symptoms += S - A.Refresh() //just in case someone already made and named the same disease - return A diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 7a0a8f5f5af..29be63a2bba 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -35,7 +35,7 @@ return 0 if(M == user) - to_chat(M, "You swallow a gulp of [src].") + user.visible_message("[user] swallows a gulp of [src].", "You swallow a gulp of [src].") if(M.has_trait(TRAIT_VORACIOUS)) M.changeNext_move(CLICK_CD_MELEE * 0.5) //chug! chug! chug! diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 7153587c79e..f35bd6f9379 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -51,6 +51,9 @@ if(user.a_intent != INTENT_HARM || !isGlass) return ..() + if(user.has_trait(TRAIT_PACIFISM)) + to_chat(user, "You don't want to harm [target]!") + return force = 15 //Smashing bottles over someoen's head hurts. diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index a91d5a6a7b6..faafcdf7762 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -16,8 +16,9 @@ cut_overlays() if(reagents.reagent_list.len) var/datum/reagent/R = reagents.get_master_reagent() - name = R.glass_name - desc = R.glass_desc + if(!renamedByPlayer) + name = R.glass_name + desc = R.glass_desc if(R.glass_icon_state) icon_state = R.glass_icon_state else @@ -26,8 +27,7 @@ add_overlay(reagent_overlay) else icon_state = "glass_empty" - name = "drinking glass" - desc = "Your standard drinking glass." + renamedByPlayer = FALSE //so new drinks can rename the glass //Shot glasses!// // This lets us add shots in here instead of lumping them in with drinks because >logic // diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index f5ce5bf7820..53a0c2fb5b7 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -41,7 +41,7 @@ return 0 if(M == user) - to_chat(M, "You swallow some of contents of \the [src].") + user.visible_message("[user] swallows some of contents of \the [src].", "You swallow some of contents of \the [src].") else user.visible_message("[user] attempts to feed [M] from [src].") if(!do_mob(user, M)) diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 7ac53294bcf..85371e0875b 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -72,15 +72,15 @@ to_chat(M, "You don't feel like eating any more junk food at the moment.") return 0 else if(fullness <= 50) - to_chat(M, "You hungrily [eatverb] some of \the [src] and gobble it down!") + user.visible_message("[user] hungrily takes a [eatverb] from \the [src], gobbling it down!", "You hungrily take a [eatverb] from \the [src], gobbling it down!") else if(fullness > 50 && fullness < 150) - to_chat(M, "You hungrily begin to [eatverb] \the [src].") + user.visible_message("[user] hungrily takes a [eatverb] from \the [src].", "You hungrily take a [eatverb] from \the [src].") else if(fullness > 150 && fullness < 500) - to_chat(M, "You [eatverb] \the [src].") + user.visible_message("[user] takes a [eatverb] from \the [src].", "You take a [eatverb] from \the [src].") else if(fullness > 500 && fullness < 600) - to_chat(M, "You unwillingly [eatverb] a bit of \the [src].") + user.visible_message("[user] unwillingly takes a [eatverb] of a bit of \the [src].", "You unwillingly take a [eatverb] of a bit of \the [src].") else if(fullness > (600 * (1 + M.overeatduration / 2000))) // The more you eat - the more you can eat - to_chat(M, "You cannot force any more of \the [src] to go down your throat!") + user.visible_message("[user] cannot force any more of \the [src] to go down [user.p_their()] throat!", "You cannot force any more of \the [src] to go down your throat!") return 0 if(M.has_trait(TRAIT_VORACIOUS)) M.changeNext_move(CLICK_CD_MELEE * 0.5) //nom nom nom diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 3141a9340aa..3592f5a4370 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -633,6 +633,13 @@ required_catalysts = list("enzyme" = 5) mix_message = "The rice grains ferment into a clear, sweet-smelling liquid." +/datum/chemical_reaction/peppermint_patty + name = "Peppermint Patty" + id = "peppermint_patty" + results = list("peppermint_patty" = 10) + required_reagents = list("hot_coco" = 6, "creme_de_cacao" = 1, "creme_de_menthe" = 1, "vodka" = 1, "menthol" = 1) + mix_message = "The coco turns mint green just as the strong scent hits your nose." + /datum/chemical_reaction/alexander name = "Alexander" id = "alexander" diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 478ddcccdd7..ba8e0b9dcf9 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -198,7 +198,7 @@ function output(message, flag) { if (flag !== 'internal') opts.lastPang = Date.now(); - message = byondDecode(message) + message = byondDecode(message).trim(); //The behemoth of filter-code (for Admin message filters) //Note: This is proooobably hella inefficient @@ -296,27 +296,30 @@ function output(message, flag) { opts.messageCount--; //I guess the count should only ever equal the limit } + // Create the element - if combining is off, we use it, and if it's on, we + // might discard it bug need to check its text content. Some messages vary + // only in HTML markup, have the same text content, and should combine. + var entry = document.createElement('div'); + entry.innerHTML = message; + var trimmed_message = entry.textContent || entry.innerText || ""; + var handled = false; - var trimmed_message = message.trim() - var lastmessages = $messages.children('div.entry:last-child'); - if (opts.messageCombining && lastmessages.length && $last_message) - { - if($last_message == trimmed_message) - { - if(lastmessages.children('span.r').length) - { - var current_value = parseInt(lastmessages.children('span.r').text()) - lastmessages.children('span.r').text(current_value+1) + if (opts.messageCombining) { + var lastmessages = $messages.children('div.entry:last-child').last(); + if (lastmessages.length && $last_message && $last_message == trimmed_message) { + var badge = lastmessages.children('.r').last(); + if (badge.length) { + badge = badge.detach(); + badge.text(parseInt(badge.text()) + 1); + } else { + badge = $('', {'class': 'r', 'text': 2}); } - else - { - lastmessages.append($('', { 'class': 'r', 'text': 2})); - } - var insertedBadge = $(lastmessages).find('.r'); - insertedBadge.animate({ + lastmessages.html(message); + lastmessages.append(badge); + badge.animate({ "font-size": "0.9em" }, 100, function() { - insertedBadge.animate({ + badge.animate({ "font-size": "0.7em" }, 100); }); @@ -325,10 +328,8 @@ function output(message, flag) { } } - if(!handled) - { + if (!handled) { //Actually append the message - var entry = document.createElement('div'); entry.className = 'entry'; if (filteredOut) { @@ -337,7 +338,6 @@ function output(message, flag) { } $last_message = trimmed_message; - entry.innerHTML = trimmed_message; $messages[0].appendChild(entry); $(entry).find("img.icon").error(iconError); //Actually do the snap diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 878026f8433..c2c17417fda 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -30,16 +30,19 @@ bullet_bounce_sound = null /turf/open/floor/holofloor/beach + gender = PLURAL name = "sand" icon = 'icons/misc/beach.dmi' icon_state = "sand" bullet_bounce_sound = null /turf/open/floor/holofloor/beach/coast_t + gender = NEUTER name = "coastline" icon_state = "sandwater_t" /turf/open/floor/holofloor/beach/coast_b + gender = NEUTER name = "coastline" icon_state = "sandwater_b" @@ -57,6 +60,7 @@ . = ..() /turf/open/floor/holofloor/basalt + gender = PLURAL name = "basalt" icon_state = "basalt0" @@ -67,7 +71,7 @@ set_basalt_light(src) /turf/open/floor/holofloor/space - name = "Space" + name = "\proper space" icon = 'icons/turf/space.dmi' icon_state = "0" @@ -76,7 +80,7 @@ . = ..() /turf/open/floor/holofloor/hyperspace - name = "hyperspace" + name = "\proper hyperspace" icon = 'icons/turf/space.dmi' icon_state = "speedspace_ns_1" bullet_bounce_sound = null @@ -110,6 +114,7 @@ queue_smooth(src) /turf/open/floor/holofloor/snow + gender = PLURAL name = "snow" desc = "Looks cold." icon = 'icons/turf/snow.dmi' @@ -122,6 +127,7 @@ initial_gas_mix = "nob=7500;TEMP=2.7" /turf/open/floor/holofloor/asteroid + gender = PLURAL name = "asteroid sand" icon = 'icons/turf/floors.dmi' icon_state = "asteroid" diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index ed0e1df554f..5e75a57c32c 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -45,8 +45,6 @@ rating = M.rating maxwater = tmp_capacity * 50 // Up to 300 maxnutri = tmp_capacity * 5 // Up to 30 - waterlevel = maxwater - nutrilevel = 3 /obj/machinery/hydroponics/Destroy() if(myseed) @@ -741,7 +739,7 @@ else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample)) if(!myseed) if(istype(O, /obj/item/seeds/kudzu)) - investigate_log("had Kudzu planted in it by [user.ckey]([user]) at ([x],[y],[z])","kudzu") + investigate_log("had Kudzu planted in it by [key_name(user)] at [AREACOORD(src)]","kudzu") if(!user.transferItemToLoc(O, src)) return to_chat(user, "You plant [O].") diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 645e54c1539..c391c629629 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -306,7 +306,7 @@ else if(istype(O, /obj/item/seeds) && !istype(O, /obj/item/seeds/sample)) if(!TR.myseed) if(istype(O, /obj/item/seeds/kudzu)) - investigate_log("had Kudzu planted in it by [acting_object] at ([x],[y],[z])","kudzu") + investigate_log("had Kudzu planted in it by [acting_object] at [AREACOORD(src)]","kudzu") acting_object.visible_message("[acting_object] plants [O].") TR.dead = 0 TR.myseed = O diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 6ec7463ab5a..ced08bbc6a7 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -222,7 +222,7 @@ if(ACCESS_ENGINE) return "Engineering" if(ACCESS_ENGINE_EQUIP) - return "Power Equipment" + return "Power and Engineering Equipment" if(ACCESS_MAINT_TUNNELS) return "Maintenance" if(ACCESS_EXTERNAL_AIRLOCKS) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 410b51633e8..367d3505a0e 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -419,7 +419,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums alert("Database error encountered uploading to Archive") return else - log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") + log_game("[key_name(usr)] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs") alert("Upload Complete. Uploaded title will be unavailable for printing for a short period") if(href_list["newspost"]) if(!GLOB.news_network) diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index 99e1ce20d76..6947b5b23f4 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -34,7 +34,7 @@ H.robust_searching = 1 H.friends += user H.attack_same = 1 - log_game("[user] has revived hostile mob [target] with a malfunctioning lazarus injector") + log_game("[key_name(user)] has revived hostile mob [key_name(target)] with a malfunctioning lazarus injector") else H.attack_same = 0 loaded = 0 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 19cb048b096..e3e810db1b4 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1231,7 +1231,7 @@ INVOKE_ASYNC(src, .proc/prepare_icon_update) beacon.icon_state = "hierophant_tele_off" return - add_logs(user, beacon, "teleported self from ([source.x],[source.y],[source.z]) to") + add_logs(user, beacon, "teleported self from [AREACOORD(source)] to") new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user) new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user) for(var/t in RANGE_TURFS(1, T)) @@ -1278,7 +1278,7 @@ return M.visible_message("[M] fades in!") if(user != M) - add_logs(user, M, "teleported", null, "from ([source.x],[source.y],[source.z])") + add_logs(user, M, "teleported", null, "from [AREACOORD(source)]") /obj/item/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay if(!T) diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 8699e02b29f..b44daefd3f6 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -777,6 +777,32 @@ icon_state = "female_commie" gender = FEMALE +/datum/sprite_accessory/underwear/swimsuit + name = "Ladies Black Swimsuit" + icon_state = "swim_black" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_blue + name = "Ladies Blue Swimsuit" + icon_state = "swim_blue" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_green + name = "Ladies Green Swimsuit" + icon_state = "swim_green" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_purple + name = "Ladies Purple Swimsuit" + icon_state = "swim_purple" + gender = FEMALE + +/datum/sprite_accessory/underwear/swimsuit_red + name = "Ladies Red Swimsuit" + icon_state = "swim_red" + gender = FEMALE + + //////////////////////////// // Undershirt Definitions // //////////////////////////// diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 3b400bcbb8c..cdc1b08d21b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -97,7 +97,7 @@ Doesn't work on other aliens/AI.*/ return 0 var/msg = sanitize(input("Message:", "Alien Whisper") as text|null) if(msg) - log_talk(user,"AlienWhisper: [key_name(user)]->[M.key] : [msg]",LOGSAY) + log_talk(user,"AlienWhisper: [key_name(user)]->[key_name(M)] : [msg]",LOGSAY) to_chat(M, "You hear a strange, alien voice in your head...[msg]") to_chat(user, "You said: \"[msg]\" to [M]") for(var/ded in GLOB.dead_mob_list) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 55802175d10..a365d6ed361 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -224,9 +224,6 @@ return thermal_protection_flags /mob/living/carbon/human/proc/get_cold_protection(temperature) - if(has_trait(TRAIT_RESISTCOLD)) - return TRUE - temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K. var/thermal_protection_flags = get_cold_protection_flags(temperature) @@ -378,10 +375,10 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put ballmer_percent = (-abs(drunkenness - 13.35) / 0.9) + 1 if(prob(5)) say(pick(GLOB.ballmer_good_msg)) - SSresearch.science_tech.add_points_all(TECHWEB_POINT_TYPE_DEFAULT, (BALLMER_POINTS * ballmer_percent)) + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = BALLMER_POINTS * ballmer_percent)) if(drunkenness > 26) // by this point you're into windows ME territory if(prob(5)) - SSresearch.science_tech.remove_points_all(TECHWEB_POINT_TYPE_DEFAULT, BALLMER_POINTS) + SSresearch.science_tech.remove_point_list(list(TECHWEB_POINT_TYPE_GENERIC = BALLMER_POINTS)) say(pick(GLOB.ballmer_windows_me_msg)) if(drunkenness >= 41) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 3899c95d661..a1cc04d4ea8 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -951,7 +951,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.update_inv_w_uniform() H.update_inv_wear_suit() else - if(H.overeatduration > 500) + if(H.overeatduration >= 100) to_chat(H, "You suddenly feel blubbery!") H.add_trait(TRAIT_FAT, OBESITY) H.update_inv_w_uniform() @@ -1143,7 +1143,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(H.has_trait(TRAIT_FAT)) . += (1.5 - flight) - if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTCOLD)) . += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR return . @@ -1535,7 +1535,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) H.emote("scream") H.apply_damage(burn_damage, BURN) - else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !(GLOB.mutations_list[COLDRES] in H.dna.mutations)) + else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTCOLD)) H.SendSignal(COMSIG_CLEAR_MOOD_EVENT, "hot") H.SendSignal(COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold) switch(H.bodytemperature) diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 24343f0f004..c4665b5d6d6 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -3,7 +3,7 @@ id = "android" say_mod = "states" species_traits = list(NOBLOOD) - inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) + inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) meat = null damage_overlay_type = "synth" diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 39b470c70b4..66dda19d709 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -675,7 +675,7 @@ var/msg = sanitize(input("Message:", "Telepathy") as text|null) if(msg) - log_talk(H,"SlimeTelepathy: [key_name(H)]->[M.key] : [msg]",LOGSAY) + log_talk(H,"SlimeTelepathy: [key_name(H)]->[key_name(M)] : [msg]",LOGSAY) to_chat(M, "You hear an alien voice in your head... [msg]") to_chat(H, "You telepathically said: \"[msg]\" to [M]") for(var/dead in GLOB.dead_mob_list) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index ad9b74aa8fd..85b57e8a2d9 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -81,7 +81,7 @@ adjust_bodytemperature(min((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) - if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) + if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !has_trait(TRAIT_RESISTHEAT)) switch(bodytemperature) if(360 to 400) throw_alert("temp", /obj/screen/alert/hot, 1) @@ -96,7 +96,7 @@ else apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) - else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) + else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !has_trait(TRAIT_RESISTCOLD)) if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) switch(bodytemperature) if(200 to 260) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 20228f96087..febb65a16c6 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -60,7 +60,7 @@ /datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE) . = ..() - if(user.reagents.get_reagent("menthol")) + if(user.reagents.get_reagent("menthol") || user.reagents.get_reagent("peppermint_patty")) return FALSE /datum/emote/living/dance diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ad1235f0ea8..94307969812 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -428,6 +428,7 @@ heal_overall_damage(INFINITY, INFINITY, INFINITY, FALSE, FALSE, TRUE) //heal brute and burn dmg on both organic and robotic limbs, and update health right away. ExtinguishMob() fire_stacks = 0 + confused = 0 update_canmove() GET_COMPONENT(mood, /datum/component/mood) if (mood) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 6ee218c6c17..72c212fe847 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -857,14 +857,17 @@ if(health < maxHealth*0.5) //Gradual break down of modules as more damage is sustained if(uneq_module(held_items[3])) playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 1, 1) - visible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 3 OFFLINE.\"", "SYSTEM ERROR: Module 3 OFFLINE.") + audible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 3 OFFLINE.\"") + to_chat(src, "SYSTEM ERROR: Module 3 OFFLINE.") if(health < 0) if(uneq_module(held_items[2])) - visible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 2 OFFLINE.\"", "SYSTEM ERROR: Module 2 OFFLINE.") + audible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 2 OFFLINE.\"") + to_chat(src, "SYSTEM ERROR: Module 2 OFFLINE.") playsound(loc, 'sound/machines/warning-buzzer.ogg', 60, 1, 1) if(health < -maxHealth*0.5) if(uneq_module(held_items[1])) - visible_message("[src] sounds an alarm! \"CRITICAL ERROR: All modules OFFLINE.\"", "CRITICAL ERROR: All modules OFFLINE.") + audible_message("[src] sounds an alarm! \"CRITICAL ERROR: All modules OFFLINE.\"") + to_chat(src, "CRITICAL ERROR: All modules OFFLINE.") playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1, 1) /mob/living/silicon/robot/update_sight() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index cc39dec24c6..1183b18d9c5 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -395,22 +395,22 @@ to_chat(usr, "You must be dead to use this!") return - log_game("[usr.name]/[usr.key] used abandon mob.") + log_game("[key_name(usr)] used abandon mob.") to_chat(usr, "Please roleplay correctly!") if(!client) - log_game("[usr.key] AM failed due to disconnect.") + log_game("[key_name(usr)] AM failed due to disconnect.") return client.screen.Cut() client.screen += client.void if(!client) - log_game("[usr.key] AM failed due to disconnect.") + log_game("[key_name(usr)] AM failed due to disconnect.") return var/mob/dead/new_player/M = new /mob/dead/new_player() if(!client) - log_game("[usr.key] AM failed due to disconnect.") + log_game("[key_name(usr)] AM failed due to disconnect.") qdel(M) return diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 7f5307f17fa..42b3d08c0c5 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -143,6 +143,7 @@ else O.name = input to_chat(user, "\The [oldname] has been successfully been renamed to \the [input].") + O.renamedByPlayer = TRUE if(penchoice == "Change description") var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index a2bbe739376..7060edecbd0 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -140,7 +140,7 @@ By design, d1 is the smallest direction and d2 is the highest return user.visible_message("[user] cuts the cable.", "You cut the cable.") stored.add_fingerprint(user) - investigate_log("was cut by [key_name(usr, usr.client)] in [AREACOORD(src)]", INVESTIGATE_WIRES) + investigate_log("was cut by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES) deconstruct() return diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index eb6e82a2422..da6a2888889 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -8,10 +8,6 @@ var/obj/machinery/atmospherics/components/binary/circulator/cold_circ var/obj/machinery/atmospherics/components/binary/circulator/hot_circ - //note: these currently only support EAST and WEST - var/cold_dir = WEST - var/hot_dir = EAST - var/lastgen = 0 var/lastgenlev = -1 var/lastcirc = "00" @@ -19,34 +15,18 @@ /obj/machinery/power/generator/Initialize(mapload) . = ..() - var/obj/machinery/atmospherics/components/binary/circulator/circpath = /obj/machinery/atmospherics/components/binary/circulator - cold_circ = locate(circpath) in get_step(src, cold_dir) - hot_circ = locate(circpath) in get_step(src, hot_dir) + find_circs() connect_to_network() SSair.atmos_machinery += src - - if(cold_circ) - switch(cold_dir) - if(EAST) - cold_circ.side = circpath.CIRC_RIGHT - if(WEST) - cold_circ.side = circpath.CIRC_LEFT - cold_circ.update_icon() - - if(hot_circ) - switch(hot_dir) - if(EAST) - hot_circ.side = circpath.CIRC_RIGHT - if(WEST) - hot_circ.side = circpath.CIRC_LEFT - hot_circ.update_icon() - - if(!cold_circ || !hot_circ) - stat |= BROKEN - update_icon() + component_parts = list(new /obj/item/circuitboard/machine/generator) + +/obj/machinery/power/generator/ComponentInitialize() + . = ..() + AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ) /obj/machinery/power/generator/Destroy() + kill_circs() SSair.atmos_machinery -= src return ..() @@ -61,7 +41,8 @@ if(L != 0) add_overlay(image('icons/obj/power.dmi', "teg-op[L]")) - add_overlay("teg-oc[lastcirc]") + if(hot_circ && cold_circ) + add_overlay("teg-oc[lastcirc]") #define GENRATE 800 // generator output coefficient from Q @@ -122,7 +103,7 @@ lastgen -= power_output ..() -/obj/machinery/power/generator/proc/get_menu(include_link = 1) +/obj/machinery/power/generator/proc/get_menu(include_link = TRUE) var/t = "" if(!powernet) t += "Unable to connect to the power network!" @@ -147,8 +128,12 @@ t += "Pressure Inlet: [round(hot_circ_air2.return_pressure(), 0.1)] kPa / Outlet: [round(hot_circ_air1.return_pressure(), 0.1)] kPa
" t += "" + else if(!hot_circ && cold_circ) + t += "Unable to locate hot circulator!" + else if(hot_circ && !cold_circ) + t += "Unable to locate cold circulator!" else - t += "Unable to locate all parts!" + t += "Unable to locate any parts!" if(include_link) t += "
Close" @@ -167,10 +152,80 @@ if( href_list["close"] ) usr << browse(null, "window=teg") usr.unset_machine() - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/power/generator/power_change() ..() update_icon() + +/obj/machinery/power/generator/proc/find_circs() + kill_circs() + var/list/circs = list() + var/obj/machinery/atmospherics/components/binary/circulator/C + var/circpath = /obj/machinery/atmospherics/components/binary/circulator + if(dir == NORTH || dir == SOUTH) + C = locate(circpath) in get_step(src, EAST) + if(C && C.dir == WEST) + circs += C + + C = locate(circpath) in get_step(src, WEST) + if(C && C.dir == EAST) + circs += C + + else + C = locate(circpath) in get_step(src, NORTH) + if(C && C.dir == SOUTH) + circs += C + + C = locate(circpath) in get_step(src, SOUTH) + if(C && C.dir == NORTH) + circs += C + + if(circs.len) + for(C in circs) + if(C.mode == CIRCULATOR_COLD && !cold_circ) + cold_circ = C + C.generator = src + else if(C.mode == CIRCULATOR_HOT && !hot_circ) + hot_circ = C + C.generator = src + +/obj/machinery/power/generator/wrench_act(mob/living/user, obj/item/I) + if(!panel_open) + return + anchored = !anchored + I.play_tool_sound(src) + if(!anchored) + kill_circs() + to_chat(user, "You [anchored?"secure":"unsecure"] [src].") + return TRUE + +/obj/machinery/power/generator/multitool_act(mob/living/user, obj/item/I) + if(!anchored) + return + find_circs() + to_chat(user, "You update [src]'s circulator links.") + return TRUE + +/obj/machinery/power/generator/screwdriver_act(mob/user, obj/item/I) + panel_open = !panel_open + I.play_tool_sound(src) + to_chat(user, "You [panel_open?"open":"close"] the panel on [src].") + return TRUE + +/obj/machinery/power/generator/crowbar_act(mob/user, obj/item/I) + default_deconstruction_crowbar(I) + return TRUE + +/obj/machinery/power/generator/on_deconstruction() + kill_circs() + +/obj/machinery/power/generator/proc/kill_circs() + if(hot_circ) + hot_circ.generator = null + hot_circ = null + if(cold_circ) + cold_circ.generator = null + cold_circ = null diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 768843c0bce..4d8cdaa7782 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -250,7 +250,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(href_list["gentoggle"]) breaker = !breaker - investigate_log("was toggled [breaker ? "ON" : "OFF"] by [usr.key].", INVESTIGATE_GRAVITY) + investigate_log("was toggled [breaker ? "ON" : "OFF"] by [key_name(usr)].", INVESTIGATE_GRAVITY) set_power() src.updateUsrDialog() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 39014ff2e31..0b6cf369211 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -296,7 +296,8 @@ cut_overlays() switch(status) // set icon_states if(LIGHT_OK) - if(emergency_mode) + var/area/A = get_area(src) + if(emergency_mode || (A && A.fire)) icon_state = "[base_state]_emergency" else icon_state = "[base_state]" @@ -319,9 +320,16 @@ on = FALSE emergency_mode = FALSE if(on) - var/BR = nightshift_enabled? nightshift_brightness : brightness - var/PO = nightshift_enabled? nightshift_light_power : bulb_power - var/CO = nightshift_enabled? nightshift_light_color : bulb_colour + var/BR = brightness + var/PO = bulb_power + var/CO = bulb_colour + var/area/A = get_area(src) + if (A && A.fire) + CO = bulb_emergency_colour + else if (nightshift_enabled) + BR = nightshift_brightness + PO = nightshift_light_power + CO = nightshift_light_color var/matching = light && BR == light.light_range && PO == light.light_power && CO == light.light_color if(!matching) switchcount++ diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index b8eb067e6f2..0e3545b1a75 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -80,7 +80,7 @@ if(loaded_tank) fuel = loaded_tank.air_contents.gases[/datum/gas/plasma] fuel = fuel ? fuel[MOLES] : 0 - investigate_log("turned [active?"on":"off"] by [user.key]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO) + investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO) return else to_chat(user, "The controls are locked!") diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 4399939caf2..6be89b43f4c 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -78,7 +78,7 @@ field_generator power level display "You turn on [src].", \ "You hear heavy droning.") turn_on() - investigate_log("activated by [user.key].", INVESTIGATE_SINGULO) + investigate_log("activated by [key_name(user)].", INVESTIGATE_SINGULO) add_fingerprint(user) else diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 8612b2d9ec4..4a8ee61f0fd 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -348,12 +348,12 @@ switch(action) if("tryinput") input_attempt = !input_attempt - log_smes(usr.ckey) + log_smes(usr) update_icon() . = TRUE if("tryoutput") output_attempt = !output_attempt - log_smes(usr.ckey) + log_smes(usr) update_icon() . = TRUE if("input") @@ -377,7 +377,7 @@ . = TRUE if(.) input_level = CLAMP(target, 0, input_level_max) - log_smes(usr.ckey) + log_smes(usr) if("output") var/target = params["target"] var/adjust = text2num(params["adjust"]) @@ -399,10 +399,10 @@ . = TRUE if(.) output_level = CLAMP(target, 0, output_level_max) - log_smes(usr.ckey) + log_smes(usr) -/obj/machinery/power/smes/proc/log_smes(user = "") - investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Charge: [charge] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [user]", INVESTIGATE_SINGULO) +/obj/machinery/power/smes/proc/log_smes(mob/user) + investigate_log("input/output; [input_level>output_level?"":""][input_level]/[output_level] | Charge: [charge] | Output-mode: [output_attempt?"on":"off"] | Input-mode: [input_attempt?"auto":"off"] by [user ? key_name(user) : "outside forces"]", INVESTIGATE_SINGULO) /obj/machinery/power/smes/emp_act(severity) @@ -419,7 +419,7 @@ if (charge < 0) charge = 0 update_icon() - log_smes("an emp") + log_smes() /obj/machinery/power/smes/engineering charge = 1.5e6 // Engineering starts with some charge for singulo diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 63a35434123..624b031f799 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -255,9 +255,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) sleep(10) continue else if(i > 50) - speaking = "[i/10] seconds remain before causality stabilization." + speaking = "[DisplayTimeText(i, TRUE)] remain before causality stabilization." else - speaking = "[i/10]..." + speaking = "[i*0.1]..." radio.talk_into(src, speaking, common_channel, get_spans(), get_default_language()) sleep(10) @@ -480,7 +480,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(!istype(L)) return FALSE if(!istype(Proj.firer, /obj/machinery/power/emitter)) - investigate_log("has been hit by [Proj] fired by [Proj.firer]", INVESTIGATE_SUPERMATTER) + investigate_log("has been hit by [Proj] fired by [key_name(Proj.firer)]", INVESTIGATE_SUPERMATTER) if(Proj.flag != "bullet") power += Proj.damage * config_bullet_energy if(!has_been_powered) @@ -563,7 +563,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(!cause) cause = "contact" nom.visible_message(vis_msg, mob_msg, "You hear an unearthly noise as a wave of heat washes over you.") - investigate_log("has been attacked ([cause]) by [nom]", INVESTIGATE_SUPERMATTER) + investigate_log("has been attacked ([cause]) by [key_name(nom)]", INVESTIGATE_SUPERMATTER) playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) Consume(nom) @@ -582,7 +582,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) user.visible_message("As [user] touches \the [src] with \a [W], silence fills the room...",\ "You touch \the [src] with \the [W], and everything suddenly goes silent.\n\The [W] flashes into dust as you flinch away from \the [src].",\ "Everything suddenly goes silent.") - investigate_log("has been attacked ([W]) by [user]", INVESTIGATE_SUPERMATTER) + investigate_log("has been attacked ([W]) by [key_name(user)]", INVESTIGATE_SUPERMATTER) Consume(W) playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1) @@ -629,7 +629,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Some poor sod got eaten, go ahead and irradiate people nearby. radiation_pulse(src, 3000, 2, TRUE) for(var/mob/living/L in range(10)) - investigate_log("has irradiated [L] after consuming [AM].", INVESTIGATE_SUPERMATTER) + investigate_log("has irradiated [key_name(L)] after consuming [AM].", INVESTIGATE_SUPERMATTER) if(L in view()) L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\ "The unearthly ringing subsides and you notice you have new radiation burns.", 2) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 5ab3146a91f..476240a8525 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -131,4 +131,8 @@ var/turf_mag = get_turf(src) for(var/obj/item/ammo in stored_ammo) ammo.forceMove(turf_mag) - stored_ammo -= ammo \ No newline at end of file + stored_ammo -= ammo + +/obj/item/ammo_box/magazine/handle_atom_del(atom/A) + stored_ammo -= A + update_icon() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index c4d5f685bd7..d9c62f79f89 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -342,7 +342,7 @@ var/state = "bayonet" //Generic state. if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? state = bayonet.icon_state - var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi' + var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi' knife_overlay = mutable_appearance(bayonet_icons, state) knife_overlay.pixel_x = knife_x_offset knife_overlay.pixel_y = knife_y_offset @@ -522,3 +522,8 @@ if(zoomable) azoom = new() azoom.gun = src + +/obj/item/gun/handle_atom_del(atom/A) + if(A == chambered) + chambered = null + update_icon() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index ffa1e085b26..e4c6966cff5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -46,7 +46,7 @@ if(stat & NOPOWER) return if(on) - if(beaker) + if(beaker && beaker.reagents.total_volume) beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume) beaker.reagents.handle_reactions() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index f9c707570a9..cc1b75559fc 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1559,6 +1559,21 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "cup of sake" glass_desc = "A traditional cup of sake." +/datum/reagent/consumable/ethanol/peppermint_patty + name = "Peppermint Patty" + id = "peppermint_patty" + description = "This lightly alcoholic drink combines the benefits of menthol and cocoa." + color = "#45ca7a" + taste_description = "mint and chocolate" + boozepwr = 25 + glass_icon_state = "peppermint_patty" + glass_name = "Peppermint Patty" + glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night." + +/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/M) + M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL) + ..() + /datum/reagent/consumable/ethanol/alexander name = "Alexander" id = "alexander" @@ -1591,7 +1606,6 @@ All effects don't start immediately, but rather get worse over time; the rate is to_chat(L,"You notice [mighty_shield] looks worn again. Weird.") ..() - /datum/reagent/consumable/ethanol/sidecar name = "Sidecar" id = "sidecar" @@ -1648,7 +1662,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "mojito" glass_name = "Mojito" glass_desc = "A drink that looks as refreshing as it tastes." - + /datum/reagent/consumable/ethanol/fernet name = "Fernet" id = "fernet" @@ -1697,9 +1711,9 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fanciulli" glass_name = "glass of fanciulli" glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet." - + /datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/M) - + M.nutrition = max(M.nutrition - 5, 0) M.overeatduration = 0 return ..() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index a2779f50391..cdb476c95a8 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -180,7 +180,7 @@ Borg Shaker recharge_time = 3 accepts_reagent_upgrades = FALSE - reagent_ids = list("beer", "orangejuice", "grenadine" ,"limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "fernet") + reagent_ids = list("beer", "orangejuice", "grenadine", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "fernet", "milk", "coffee", "banana", "lemonjuice") /obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user) return //Can't inject stuff with a shaker, can we? //not with that attitude diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 4b797cbd730..4d737657f8d 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -226,25 +226,10 @@ desc = "A small bottle of Romerol. The REAL zombie powder." list_reagents = list("romerol" = 30) -/obj/item/reagent_containers/glass/bottle/flu_virion - name = "Flu virion culture bottle" - desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/flu - -/obj/item/reagent_containers/glass/bottle/epiglottis_virion - name = "Epiglottis virion culture bottle" - desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/voice_change - -/obj/item/reagent_containers/glass/bottle/liver_enhance_virion - name = "Liver enhancement virion culture bottle" - desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/heal - -/obj/item/reagent_containers/glass/bottle/hallucigen_virion - name = "Hallucigen virion culture bottle" - desc = "A small bottle. Contains hallucigen virion culture in synthblood medium." - spawned_disease = /datum/disease/advance/hallucigen +/obj/item/reagent_containers/glass/bottle/random_virus + name = "Experimental disease culture bottle" + desc = "A small bottle. Contains an untested viral culture in synthblood medium." + spawned_disease = /datum/disease/advance/random /obj/item/reagent_containers/glass/bottle/pierrot_throat name = "Pierrot's Throat culture bottle" @@ -255,6 +240,11 @@ name = "Rhinovirus culture bottle" desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium." spawned_disease = /datum/disease/advance/cold + +/obj/item/reagent_containers/glass/bottle/flu_virion + name = "Flu virion culture bottle" + desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium." + spawned_disease = /datum/disease/advance/flu /obj/item/reagent_containers/glass/bottle/retrovirus name = "Retrovirus culture bottle" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 5b42c777f1f..ccd9872b464 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -249,7 +249,7 @@ var/mob/living/target = locate(/mob/living) in oview(7,src) if(target) var/obj/item/throwing = loaded_item - investigate_log("Experimentor has thrown [loaded_item] at [target]", INVESTIGATE_EXPERIMENTOR) + investigate_log("Experimentor has thrown [loaded_item] at [key_name(target)]", INVESTIGATE_EXPERIMENTOR) ejectItem() if(throwing) throwing.throw_at(target, 10, 1) @@ -371,7 +371,7 @@ throwSmoke(loc) for(var/mob/living/m in oview(1, src)) m.apply_damage(5, BURN, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_PRECISE_GROIN)) - investigate_log("Experimentor has dealt minor burn damage to [m]", INVESTIGATE_EXPERIMENTOR) + investigate_log("Experimentor has dealt minor burn damage to [key_name(m)]", INVESTIGATE_EXPERIMENTOR) ejectItem() //////////////////////////////////////////////////////////////////////////////////////////////// if(exp == SCANTYPE_COLD) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index a4e003fc73d..ca334497a76 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -762,9 +762,11 @@ datum/status_effect/stabilized/blue/on_remove() /datum/status_effect/stabilized/gold/tick() var/obj/item/slimecross/stabilized/gold/linked = linked_extract - if(!familiar) + if(QDELETED(familiar)) familiar = new linked.mob_type(get_turf(owner.loc)) + familiar.name = linked.mob_name familiar.del_on_death = TRUE + familiar.copy_known_languages_from(owner, FALSE) if(linked.saved_mind) linked.saved_mind.transfer_to(familiar) familiar.ckey = linked.saved_mind.key diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index 57e38542d69..fe1b498667a 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -98,6 +98,7 @@ Stabilized extracts: colour = "gold" var/mob_type var/datum/mind/saved_mind + var/mob_name = "Familiar" /obj/item/slimecross/stabilized/gold/proc/generate_mobtype() var/static/list/mob_spawn_pets = list() @@ -114,20 +115,30 @@ Stabilized extracts: generate_mobtype() /obj/item/slimecross/stabilized/gold/attack_self(mob/user) - var/choice = input(user, "Which do you want to reset?", "Familiar Adjustment") as null|anything in list("Familiar Species", "Familiar Sentience") + var/choice = input(user, "Which do you want to reset?", "Familiar Adjustment") as null|anything in list("Familiar Location", "Familiar Species", "Familiar Sentience", "Familiar Name") if(!user.canUseTopic(src, BE_CLOSE)) return if(isliving(user)) var/mob/living/L = user if(L.has_status_effect(/datum/status_effect/stabilized/gold)) L.remove_status_effect(/datum/status_effect/stabilized/gold) - START_PROCESSING(SSobj, src) + if(choice == "Familiar Location") + to_chat(user, "You prod [src], and it shudders slightly.") + START_PROCESSING(SSobj, src) if(choice == "Familiar Species") to_chat(user, "You squeeze [src], and a shape seems to shift around inside.") generate_mobtype() + START_PROCESSING(SSobj, src) if(choice == "Familiar Sentience") to_chat(user, "You poke [src], and it lets out a glowing pulse.") saved_mind = null + START_PROCESSING(SSobj, src) + if(choice == "Familiar Name") + var/newname = copytext(sanitize(input(user, "Would you like to change the name of [mob_name]", "Name change", mob_name) as null|text),1,MAX_NAME_LEN) + if(newname) + mob_name = newname + to_chat(user, "You speak softly into [src], and it shakes slightly in response.") + START_PROCESSING(SSobj, src) /obj/item/slimecross/stabilized/oil colour = "oil" diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm index d37ecfe0527..047f9639e4b 100644 --- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm +++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm @@ -177,7 +177,7 @@ GLOBAL_DATUM(necropolis_gate, /obj/structure/necropolis_gate/legion_gate) log_game("Legion took damage while the necropolis gate was closed and released itself.") else message_admins("[user ? ADMIN_LOOKUPFLW(user):"Unknown"] has released Legion!") - log_game("[user ? key_name(user):"Unknown"] released Legion.") + log_game("[user ? key_name(user) : "Unknown"] released Legion.") var/sound/legion_sound = sound('sound/creatures/legion_spawn.ogg') for(var/mob/M in GLOB.player_list) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 31de01b1590..89bbee9d60d 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -434,7 +434,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C else if (!(R in product_records)) vend_ready = 1 - message_admins("Vending machine exploit attempted by [key_name(usr, usr.client)]!") + message_admins("Vending machine exploit attempted by [ADMIN_LOOKUPFLW(usr)]!") return if (R.amount <= 0) diff --git a/html/changelog.html b/html/changelog.html index 61838e5b03a..5c522940cf8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,85 @@ -->
+

13 June 2018

+

Armhulen code, Keekenox sprites and S_____ as the ideas guy :roll_eyes: updated:

+
    +
  • New drinks: Peppermint Patty and the Candyland Extract!!
  • +
+

CitrusGender updated:

+
    +
  • checks to see if bullets are deleted if they are the ammo type and the bullet chambered.
  • +
+

Dax Dupont updated:

+
    +
  • It's now easier to become fat. Don't eat so much.
  • +
+

Mickyan updated:

+
    +
  • Fixed pacifists being able to harm using bottles/screwdrivers
  • +
+

SpaceManiac updated:

+
    +
  • Capitalization, propriety, and plurality on turfs have been improved.
  • +
+

XDTM updated:

+
    +
  • Coldproof mobs can now be cooled down, but are still immune to the negative effects of cold.
  • +
  • This also fixes some edge cases (freezing beams) where mobs could be cooled down and damaged despite cold resistance.
  • +
  • Virus crates now contain several bottles of randomly generated diseases with symptom levels up to 8.
  • +
  • Removed the single-symptom bottles that were included in the virus crate.
  • +
  • Androids are now immune to radiation.
  • +
+

cacogen updated:

+
    +
  • You can now see what other people are eating or drinking.
  • +
  • Borg shaker can now synthesise milk, lemon juice, banana juice and coffee
  • +
  • Renamed drinks no longer revert to their original name when their reagents change
  • +
+

chesse20 updated:

+
    +
  • Adds Exotic Corgi Crate to Cargo
  • +
  • Adds Exotic Corgi, a Corgi with a random hue applied to it
  • +
  • Adds Talking Corgi Crate, and talking Corgi
  • +
+ +

12 June 2018

+

Dax Dupont updated:

+
    +
  • Botany trays don't magically refill anymore with a rped.
  • +
+

SpaceManiac updated:

+
    +
  • Fire alarms now redden all the room's lights, and emit light themselves, rather than applying an area-wide overlay.
  • +
  • Fire alarms no longer visually conflict with radiation storms.
  • +
  • Pulling objects diagonally no longer causes them to flail about when changing directions.
  • +
  • Riders are no longer left behind if you move while pulling something that has since been anchored.
  • +
  • Lockboxes are now actually locked again.
  • +
  • Deaf people can no longer hear cyborg system error alarms.
  • +
  • Plasmamen now receive their suit and internals when entering VR.
  • +
  • Legion cores and admin revives now heal confusion.
  • +
+

XDTM updated:

+
    +
  • Diseases now properly lose scan invisibility if their stealth drops below the required threshold.
  • +
+ +

11 June 2018

+

Mickyan updated:

+
    +
  • Added an abandoned kitchen to Metastation maintenance
  • +
+

XDTM updated:

+
    +
  • Fixed anti-magic not working at all.
  • +
+

fludd12 updated:

+
    +
  • Stabilized gold extracts now respawn the familiar properly.
  • +
  • Stabilized gold familiars retain the proper languages even after respawning.
  • +
  • Stabilized gold familiars can be renamed and have their positions reset at will.
  • +
+

08 June 2018

AnturK updated:

    @@ -1436,110 +1515,6 @@
    • When you wash your bloody hands they will no longer still look bloody afterwards
    - -

    11 April 2018

    -

    Davidj361 updated:

    -
      -
    • Fixed paper bins dropping out of your hand or bag when grabbing a pen or paper.
    • -
    • Paper bins not giving finger prints upon interaction.
    • -
    • Detective can now write notes onto his printed scanner reports.
    • -
    • Detective scanner can have its logs erased via alt-click.
    • -
    • Detective scanner can display logs via the action button.
    • -
    -

    Denton updated:

    -
      -
    • Added a missing intercom to the Delta arrivals shuttle.
    • -
    -

    ExcessiveUseOfCobblestone updated:

    -
      -
    • Uplink Items now have 2 separate probabilities. One for the syndicate crate and one for cargo null crates. I encourage you to view uplink_items.dm and make changes.
    • -
    -

    Robustin updated:

    -
      -
    • Hostile mobs capable of smashing structures will now smash their way through dense objects too.
    • -
    -

    SpaceManiac updated:

    -
      -
    • The blindness overlay applied during cloning now properly stretches for widescreen views.
    • -
    • Various macro consistency problems have been addressed.
    • -
    -

    YPOQ updated:

    -
      -
    • Eminences can hear clock cult chat again
    • -
    -

    george99g updated:

    -
      -
    • Suiciding will now deactivate all your genetics prescans.
    • -
    -

    iskyp updated:

    -
      -
    • makes dragnet non harmful
    • -
    • pacifists can now use any disabler or stun setting on any energy gun
    • -
    • removed all of the pacifism check code from code/modules/mob/living/living.dm
    • -
    • gun objects no longer have a harmful variable, instead, ammo_casing objects now have a harmful variable, which is by default set to TRUE
    • -
    • if a pacifist fires a gun, it checks whether or not the round chambered is lethal, instead of whether or not the gun itself is lethal.
    • -
    • /obj/item/machinery/power/supermatter_shard is now /obj/item/machinery/power/supermatter_crystal/shard. the crystal is the parent object.
    • -
    -

    neersighted updated:

    -
      -
    • Reduced lag by speeding up logs 10000%
    • -
    • Logs now include millisecond-level timestamps
    • -
    -

    pigeonsk updated:

    -
      -
    • AI now requires silicon playtime instead of crew playtime for roundstart role
    • -
    -

    selea updated:

    -
      -
    • fixed runtime in logic circuits, which was occured with invalid input types.
    • -
    - -

    09 April 2018

    -

    CosmicScientist updated:

    -
      -
    • Top Nanotrasen scientists have diagnosed two new phobias! Birds and chasms! Good luck Chief Engineers and Miners.
    • -
    -

    Dax Dupont updated:

    -
      -
    • Removing notes now has an "Are you sure" dialog.
    • -
    -

    Denton updated:

    -
      -
    • Omegastation now has its own arrivals shuttle.
    • -
    -

    Mickyan updated:

    -
      -
    • Stinger, Grasshopper, Quadruple Sec, and Quintuple Sec have new sprites.
    • -
    -

    Naksu updated:

    -
      -
    • Fixed an heirloom trait-related runtime
    • -
    • Fixed an incorrect signature in MakeSlippery causing runtimes
    • -
    -

    SpironoZeppeli updated:

    -
      -
    • You can now wrench the supermatter shard
    • -
    -

    ninjanomnom updated:

    -
      -
    • The arena shuttle should be working again.
    • -
    • The escape pods now reach their proper destination at round end
    • -
    - -

    08 April 2018

    -

    AnturK updated:

    -
      -
    • Slime reflexes restored.
    • -
    -

    Dax Dupont updated:

    -
      -
    • Hugbox version of the VR sleeper you can't emag.
    • -
    • There's now two categorized vr landmarks for two teams for easy spawning. You can also now rebuild/refresh all the VR spawnpoints by calling build_spawnpoints(1) on any sleeper.
    • -
    -

    Naksu updated:

    -
      -
    • Admins can now access a new control panel for borgs via a new admin verb
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 472a39d5b6a..38a820d0da2 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -18367,3 +18367,61 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. give the creature a sentience potion, the mind will transfer over! oranges: - rscadd: Sec now has khaki pants for tacticoolness +2018-06-11: + Mickyan: + - rscadd: Added an abandoned kitchen to Metastation maintenance + XDTM: + - bugfix: Fixed anti-magic not working at all. + fludd12: + - bugfix: Stabilized gold extracts now respawn the familiar properly. + - bugfix: Stabilized gold familiars retain the proper languages even after respawning. + - tweak: Stabilized gold familiars can be renamed and have their positions reset + at will. +2018-06-12: + Dax Dupont: + - bugfix: Botany trays don't magically refill anymore with a rped. + SpaceManiac: + - tweak: Fire alarms now redden all the room's lights, and emit light themselves, + rather than applying an area-wide overlay. + - bugfix: Fire alarms no longer visually conflict with radiation storms. + - bugfix: Pulling objects diagonally no longer causes them to flail about when changing + directions. + - bugfix: Riders are no longer left behind if you move while pulling something that + has since been anchored. + - bugfix: Lockboxes are now actually locked again. + - bugfix: Deaf people can no longer hear cyborg system error alarms. + - bugfix: Plasmamen now receive their suit and internals when entering VR. + - bugfix: Legion cores and admin revives now heal confusion. + XDTM: + - bugfix: Diseases now properly lose scan invisibility if their stealth drops below + the required threshold. +2018-06-13: + 'Armhulen code, Keekenox sprites and S_____ as the ideas guy :roll_eyes:': + - rscadd: 'New drinks: Peppermint Patty and the Candyland Extract!!' + CitrusGender: + - bugfix: checks to see if bullets are deleted if they are the ammo type and the + bullet chambered. + Dax Dupont: + - balance: It's now easier to become fat. Don't eat so much. + Mickyan: + - bugfix: Fixed pacifists being able to harm using bottles/screwdrivers + SpaceManiac: + - spellcheck: Capitalization, propriety, and plurality on turfs have been improved. + XDTM: + - tweak: Coldproof mobs can now be cooled down, but are still immune to the negative + effects of cold. + - bugfix: This also fixes some edge cases (freezing beams) where mobs could be cooled + down and damaged despite cold resistance. + - balance: Virus crates now contain several bottles of randomly generated diseases + with symptom levels up to 8. + - rscdel: Removed the single-symptom bottles that were included in the virus crate. + - balance: Androids are now immune to radiation. + cacogen: + - rscadd: You can now see what other people are eating or drinking. + - rscadd: Borg shaker can now synthesise milk, lemon juice, banana juice and coffee + - bugfix: Renamed drinks no longer revert to their original name when their reagents + change + chesse20: + - rscadd: Adds Exotic Corgi Crate to Cargo + - rscadd: Adds Exotic Corgi, a Corgi with a random hue applied to it + - rscadd: Adds Talking Corgi Crate, and talking Corgi diff --git a/html/changelogs/AutoChangeLog-pr-38056.yml b/html/changelogs/AutoChangeLog-pr-38056.yml new file mode 100644 index 00000000000..301cff5dbb9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38056.yml @@ -0,0 +1,5 @@ +author: "Nichlas0010" +delete-after: True +changes: + - tweak: "The TEG and its circulator can now be deconstructed and rotated!" + - tweak: "The TEG and its circulator now supports circulators in all directions, rather than just west/east!" diff --git a/html/changelogs/AutoChangeLog-pr-38351.yml b/html/changelogs/AutoChangeLog-pr-38351.yml new file mode 100644 index 00000000000..c02dc505536 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38351.yml @@ -0,0 +1,4 @@ +author: "SpaceManiac" +delete-after: True +changes: + - rscadd: "A new OOC verb \"Fit Viewport\" can be used to adjust the window splitter to eliminate letterboxing around the map. It can also be set to run automatically in Preferences." diff --git a/html/changelogs/AutoChangeLog-pr-38401.yml b/html/changelogs/AutoChangeLog-pr-38401.yml new file mode 100644 index 00000000000..d229ddb0312 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38401.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - admin: "You can now send messages as CentCom through people's headsets." diff --git a/html/changelogs/AutoChangeLog-pr-38447.yml b/html/changelogs/AutoChangeLog-pr-38447.yml new file mode 100644 index 00000000000..72b63813eac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38447.yml @@ -0,0 +1,4 @@ +author: "ninjanomnom" +delete-after: True +changes: + - bugfix: "Gas overlays left over in some turf changes should no longer stick around where they shouldn't." diff --git a/html/changelogs/AutoChangeLog-pr-38450.yml b/html/changelogs/AutoChangeLog-pr-38450.yml new file mode 100644 index 00000000000..89f2e5ae7bd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38450.yml @@ -0,0 +1,4 @@ +author: "Cruix" +delete-after: True +changes: + - bugfix: "Item attack animations can no longer be seen over darkness or camera static." diff --git a/html/changelogs/AutoChangeLog-pr-38470.yml b/html/changelogs/AutoChangeLog-pr-38470.yml new file mode 100644 index 00000000000..e0ac64648f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-38470.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - bugfix: "Pipe dispensers can no longer create pipes containing literally anything" diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index 483883b94cd..385cd215166 100644 Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index c83a82b1bd8..23541a8e401 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/atmospherics/components/binary_devices.dmi b/icons/obj/atmospherics/components/binary_devices.dmi index 9331613af32..ebe5a61ddb5 100644 Binary files a/icons/obj/atmospherics/components/binary_devices.dmi and b/icons/obj/atmospherics/components/binary_devices.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index a845a4294c2..e6e8ff9eb71 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index cd76709b00c..dc6d4547b45 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/tools/travis/before_build_byond.sh b/tools/travis/before_build_byond.sh index 8cfe0a1cf6f..24a53ebe4ec 100755 --- a/tools/travis/before_build_byond.sh +++ b/tools/travis/before_build_byond.sh @@ -6,7 +6,7 @@ if [ "$BUILD_TOOLS" = true ]; then exit 0 fi; echo "Combining maps for building" -if [ "$DM_MAPFILE" = "loadallmaps" ]; then +if [ $BUILD_TESTING = true ]; then python tools/travis/template_dm_generator.py fi; diff --git a/tools/travis/build_byond.sh b/tools/travis/build_byond.sh index a25b6a5cff3..752418ccb3c 100755 --- a/tools/travis/build_byond.sh +++ b/tools/travis/build_byond.sh @@ -41,17 +41,33 @@ if [ "$BUILD_TOOLS" = false ]; then exit 1 fi; - #config folder should not be mandatory - rm -rf config/* - - #disable all ruins - echo -e "LAVALAND_BUDGET 0\nSPACE_BUDGET 0" > config/config.txt - source $HOME/BYOND-${BYOND_MAJOR}.${BYOND_MINOR}/byond/bin/byondsetup if [ "$BUILD_TESTING" = true ]; then tools/travis/dm.sh -DTRAVISBUILDING -DTRAVISTESTING -DALL_MAPS tgstation.dme else - tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme && DreamDaemon tgstation.dmb -close -trusted -params "test-run&log-directory=travis" + tools/travis/dm.sh -DTRAVISBUILDING tgstation.dme + + #config folder should not be mandatory + rm -rf config/* + + #test config + cp tools/travis/travis_config.txt config/config.txt + + # get libmariadb, cache it so limmex doesn't get angery + if [ -f $HOME/libmariadb ]; then + #travis likes to interpret the cache command as it being a file for some reason + rm $HOME/libmariadb + mkdir $HOME/libmariadb + fi + if [ ! -f $HOME/libmariadb/libmariadb.so ]; then + wget http://www.byond.com/download/db/mariadb_client-2.0.0-linux.tgz + tar -xvf mariadb_client-2.0.0-linux.tgz + mv mariadb_client-2.0.0-linux/libmariadb.so $HOME/libmariadb/libmariadb.so + rm -rf mariadb_client-2.0.0-linux.tgz mariadb_client-2.0.0-linux + fi + ln -s $HOME/libmariadb/libmariadb.so libmariadb.so + + DreamDaemon tgstation.dmb -close -trusted -params "test-run&log-directory=travis" cat data/logs/travis/clean_run.lk fi; fi; diff --git a/tools/travis/build_dependencies.sh b/tools/travis/build_dependencies.sh index 60a23d97234..5884423d69d 100755 --- a/tools/travis/build_dependencies.sh +++ b/tools/travis/build_dependencies.sh @@ -2,7 +2,7 @@ set -e -if [ "$BUILD_TOOLS" = false ]; then +if [ $BUILD_TOOLS = false ] && [ $BUILD_TESTING = false ]; then curl https://sh.rustup.rs -sSf | sh -s -- -y --default-host i686-unknown-linux-gnu source ~/.profile diff --git a/tools/travis/travis_config.txt b/tools/travis/travis_config.txt new file mode 100644 index 00000000000..e59e4ed4ca2 --- /dev/null +++ b/tools/travis/travis_config.txt @@ -0,0 +1,9 @@ +SQL_ENABLED +ADDRESS 127.0.0.1 +PORT 3306 +FEEDBACK_DATABASE tg_travis +FEEDBACK_TABLEPREFIX +FEEDBACK_LOGIN root +FEEDBACK_PASSWORD +LAVALAND_BUDGET 0 +SPACE_BUDGET 0