diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index b5564f3f6b0..45ffedc345c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -37,9 +37,9 @@ actual development. * Document and explain your pull requests thoroughly. Detail what each commit changes, and why it changes it. We do not want to have to read all of you commit names to figure out what your pull request is about. - * Any pull request that is not solely composed of fixes or non gameplay-affecting - refactors must have a changelog. Inline changelogs are supported through the format - described [here](https://github.com/ParadiseSS13/Paradise/pull/3291#issuecomment-172950466) + * Any pull request must have a changelog, this is to allow us to know when a PR is deployed + on the live server. Inline changelogs are supported through the format described + [here](https://github.com/ParadiseSS13/Paradise/pull/3291#issuecomment-172950466) and should be used rather than manually edited .yml file changelogs. * Pull requests should not have any merge commits except in the case of fixing merge conflicts for an existing pull request. New pull requests should not have any merge diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000000..7e822d1b031 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,23 @@ +**What does this PR do:** +Include a small to medium description of what your PR changes. Feel free to give it a little flourish if you want to show off a new feature more completely. + +**Images of sprite/map changes (IF APPLICABLE):** +If you did not make a map or sprite edit, you may leave this section blank. You may include a gif of your feature if you want + +**Changelog:** +*Remove this line, and appropriate fields from the changelog* +:cl: name here +add: Added new things +del: Removed old things +tweak: tweaked a few things +balance: rebalanced something +fix: fixed a few things +wip: added a few works in progress +soundadd: added a new sound thingy +sounddel: removed an old sound thingy +imageadd: added some icons and images +imagedel: deleted some icons and images +spellcheck: fixed a few typos +experiment: added an experimental thingy +/:cl: + diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 15dccc0a805..4946add50f2 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -134,7 +134,7 @@ CREATE TABLE `SS13_death` ( DROP TABLE IF EXISTS `SS13_donators`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `donators` ( +CREATE TABLE `SS13_donators` ( `patreon_name` varchar(32) NOT NULL, `tier` int(2), `ckey` varchar(32) COMMENT 'Manual Field', diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm index 5c2b01be449..8e882edd44f 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm @@ -1,7 +1,7 @@ "a" = (/turf/space,/area/space) -"b" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/ruin/powered) +"b" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/ruin/powered) "c" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/ruin/powered) -"d" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/ruin/powered) +"d" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "diagonalWall3"},/area/ruin/powered) "e" = (/obj/structure/shuttle/engine/propulsion{dir = 8; icon_state = "propulsion"; tag = "icon-propulsion (EAST)"},/turf/space,/area/ruin/powered) "f" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating,/area/ruin/powered) "g" = (/obj/structure/table/wood,/obj/item/clothing/under/shorts/black,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) @@ -24,22 +24,22 @@ "x" = (/obj/machinery/door_control{name = "Strange Ship Door Control"; pixel_x = 6; pixel_y = 0; id = "strange ship"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/ruin/powered) "y" = (/obj/machinery/light,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) "z" = (/mob/living/simple_animal/bot/medbot,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) -"A" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "diagonalWall3"},/area/ruin/powered) +"A" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/ruin/powered) "B" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) -"C" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/ruin/powered) +"C" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/ruin/powered) "D" = (/obj/machinery/light,/obj/structure/stool/bed,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered) (1,1,1) = {" -aabcccccdaaaa +aabcccccAaaaa aefghijkcaaaa -aeflhhhhccccd +aeflhhhhccccA bccccmhhcmhjc cnophhhhqhhrc shhthhhhuhvwc xhypzhhhqhhnc -Accccmhhcmhjc +dccccmhhcmhjc aefBhhhhccccC aefnnDhjcaaaa -aaAcccccCaaaa +aadcccccCaaaa "} diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index f2c40c8f0e5..79e3605900a 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -177,7 +177,7 @@ "du" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dv" = (/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dw" = (/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/awaymission/academy/classrooms) -"dx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/effect/landmark{name = "awaystart"},/obj/item/weldingtool,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) +"dx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/item/weldingtool,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "dy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "dz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms) "dA" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) @@ -200,6 +200,7 @@ "dR" = (/obj/structure/kitchenspike,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/academy/classrooms) "dS" = (/obj/structure/mineral_door/iron,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dT" = (/obj/structure/mineral_door/iron,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) +"dU" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/wood,/area/awaymission/academy/classrooms) "dV" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dW" = (/obj/structure/cable,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "dX" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/academy/classrooms) @@ -305,7 +306,6 @@ "fT" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "fU" = (/obj/structure/target_stake,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) "fV" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) -"fW" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "fX" = (/obj/structure/grille,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms) "fY" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/academy/classrooms) "fZ" = (/obj/structure/table,/obj/item/pen/red,/turf/simulated/floor/plasteel,/area/awaymission/academy/classrooms) @@ -655,7 +655,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabscXcYcZcZcZcZdadvbEdbdcdcdcdcdcdcddasbrbJbKbraVapbrbJbKbrasasasasasasasasasabbsbsbsbsbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdededebVbVdvcMdvbEdcdcdfdcdfdcdfdcasbrbrbrbraVapbrbrbrbrasdhdidjdkdidididjdidlbEdmdmdnbsbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdodpdqbVdvdvcMdrbEdcdcdsdcdsdcdsdcasaFaFaFaFaVapaFaFaFaFasdtdudvjMdudvdvdvdvdwbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdxdydzcYcYcYdAdvbEdcdcdcdcdfdcdfdcasaFdBdBaFaVapaFdBdBaFasdtdvdvdvdvdvdvdCdDdwdEdmkydmdFbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdxdydzcYcYcYdAdvbEdcdcdUdcdfdcdfdcasaFdBdBaFaVapaFdBdBaFasdtdvdvdvdvdvdvdCdDdwdEdmkydmdFbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdGdpdHbVdvdvcMdvbEdcdcdcdcdsdcdsdcasaFdBdBaFaVapaFdBdBaFasdtdudvdvdudIdvdJdKdwbEdmdmdmdmbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdedededvbVdvcMdvbEdcdcdcdcdcdcdcdcasaFdBdBaFaVapaFdBdBaFasdtdvdvdvdvdvdvdLdMdNdOdPdQdmdRbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbEbEbEdSdTbEbEbEewewbEbEbEbEbEasasasasasaVapasasasasasdtdudvdvdvdVdvdvdWdwbEdXdYdmdRbsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -669,7 +669,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdZdZbsfsftfuedfvfwfefefefefxeieifyfefefefzekeihEekekeieieibEeCeCeCeCfAeCeCeCeCeFeGeGeGbsbsaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbsbsbsbsbsbEdSdTbEbEbEbEbEererererbEbEfBfCfDfBkTfDfDfBbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbsbsaPaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsbBbBbBfEfFfGfHfIfIfJbEfKdcdcdcdcdcbEfLfCfDfLkUfDfDfMbEfNfOfPbzbzkvfQfRfSfTdvdvfUbsbsaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfVfWbBfXfYdvdvdvfZgabEdcgbdcgcgcdcgdgegffDfLkUfDfDfLbEggghgigjggcAdvgkdvdvdvdvbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsfVbBbBfXfYdvdvdvfZgabEdcgbdcgcgcdcgdgegffDfLkUfDfDfLbEggghgigjggcAdvgkdvdvdvdvbsbsaPaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaabsglbBbBgmfYdvgndvdvgobEdcdfdcdcdcdcgpfLfDfDfLkUfDfDfLbEgggqggggggcAfQkzdvdvfUbsbsaPaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaSaaaaaaaaaaaaaaaaaabsgrgrgrfXfYdvdudvdvgsbEgtdsdckAgudcgpfLfDfDfLkUfDfDgvbEgwgqggggggcAdvgxdvgybsbsaPaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSkBaSaSaSaaaaaaaaaaaaaaaaaabsgzgzgzfXfYdvgAdvgngobEdcgbdcdcdcdcgBgegCgDfLkUfDfDfLbEgggqdggEgGcAgHfRfUbsbsaPaaaaaaaPaaaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index 6375ad8257f..9493caeb02d 100644 --- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm +++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm @@ -8,16 +8,16 @@ "ah" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Fore) "ai" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/BMPship/Fore) "aj" = (/mob/living/simple_animal/hostile/carp,/turf/space,/area/space) -"ak" = (/obj/machinery/porta_turret{lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) +"ak" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Gate) "al" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore) -"am" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) -"an" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Aft) +"am" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship/Gate) +"an" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Gate) "ao" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) "ap" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) -"aq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) +"aq" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Gate) "ar" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore) "as" = (/obj/structure/lattice,/turf/space,/area/space) -"at" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft) +"at" = (/obj/machinery/porta_turret{lethal = 1; name = "ship defense turret"},/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) "au" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; equipment = 0; lighting = 0; locked = 0; operating = 0; pixel_y = 24; req_access = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore) "av" = (/obj/structure/table,/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship) "aw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 0; equipment = 3; locked = 0; operating = 0; req_access = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) @@ -25,41 +25,41 @@ "ay" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Aft) "az" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Aft) "aA" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship/Aft) -"aB" = (/obj/machinery/door/airlock/silver{locked = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Aft) +"aB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) "aC" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship/Aft) -"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/BMPship/Aft) -"aE" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft) -"aF" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship/Aft) -"aG" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aH" = (/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aI" = (/obj/item/restraints/handcuffs,/obj/structure/closet/crate,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aJ" = (/obj/item/scalpel,/obj/structure/closet/crate,/obj/item/tank/anesthetic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aK" = (/obj/item/bodybag,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aL" = (/obj/item/storage/box/syringes,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aM" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"aO" = (/obj/machinery/computer/operating,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) +"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/awaymission/BMPship/Gate) +"aE" = (/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aF" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Gate) +"aG" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"aH" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aI" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"aJ" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"aK" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aL" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Gate) +"aM" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Gate) +"aN" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Gate) +"aO" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Gate) "aP" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship/Aft) -"aQ" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship/Aft) -"aR" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aS" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aT" = (/obj/structure/table,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aU" = (/obj/structure/table,/obj/item/storage/box,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aV" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Aft) -"aW" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Aft) -"aX" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/awaymission/BMPship/Aft) -"aY" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship/Aft) -"aZ" = (/obj/effect/gibspawner/generic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"ba" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) +"aQ" = (/obj/machinery/door/airlock/silver{locked = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Gate) +"aR" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship/Gate) +"aS" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/BMPship/Gate) +"aT" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship/Gate) +"aU" = (/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aV" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aW" = (/obj/item/scalpel,/obj/structure/closet/crate,/obj/item/tank/anesthetic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aX" = (/obj/item/restraints/handcuffs,/obj/structure/closet/crate,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aY" = (/obj/item/storage/box/syringes,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"aZ" = (/obj/item/bodybag,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"ba" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) "bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship/Aft) -"bc" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Aft) +"bc" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) "bd" = (/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"be" = (/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bf" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bg" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bh" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bi" = (/obj/item/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bj" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) +"be" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship/Gate) +"bf" = (/obj/machinery/computer/operating,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"bg" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bh" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship/Gate) +"bi" = (/obj/structure/table,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bj" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) "bk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "bl" = (/obj/item/stack/spacecash/c500,/obj/item/stack/spacecash/c100,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) "bm" = (/obj/structure/stool/bed,/obj/item/bedsheet/yellow,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) @@ -69,17 +69,17 @@ "bq" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Fore) "br" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/awaymission/BMPship/Fore) "bs" = (/obj/structure/sign/vacuum,/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship/Fore) -"bt" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Aft) -"bu" = (/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Aft) -"bv" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"bw" = (/obj/machinery/door/unpowered/shuttle,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated,/area/awaymission/BMPship/Aft) -"bx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Aft) -"by" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bz" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bA" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bB" = (/obj/machinery/gateway/centeraway{calibrated = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bD" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) +"bt" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bu" = (/obj/structure/table,/obj/item/storage/box,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bv" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Gate) +"bw" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; environ = 2; equipment = 0; lighting = 0; locked = 0; operating = 1; req_access = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/BMPship/Gate) +"bx" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship/Gate) +"by" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/awaymission/BMPship/Gate) +"bz" = (/obj/effect/gibspawner/generic,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"bA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"bB" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/BMPship/Gate) +"bC" = (/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Gate) +"bD" = (/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) "bE" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "bF" = (/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) "bG" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore) @@ -87,10 +87,10 @@ "bI" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore) "bJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship/Aft) "bK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bL" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bM" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bN" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"bO" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) +"bL" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bM" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bN" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bO" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Gate) "bP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore) "bQ" = (/turf/simulated/floor/plasteel{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/awaymission/BMPship/Fore) "bR" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Fore) @@ -98,15 +98,15 @@ "bT" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship/Fore) "bU" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship/Fore) "bV" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"},/area/awaymission/BMPship/Aft) -"bW" = (/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"bX" = (/obj/machinery/door_control{id = "packerMed"; pixel_y = -24},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"bY" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) +"bW" = (/obj/item/hand_labeler,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"bX" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Gate) +"bY" = (/turf/simulated/floor/plating/airless{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Gate) "bZ" = (/obj/machinery/seed_extractor,/obj/item/seeds/plump/walkingmushroom,/turf/simulated/floor/plasteel{tag = "icon-green"; icon_state = "green"},/area/awaymission/BMPship/Midship) -"ca" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"cb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"cc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"cd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) -"ce" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft) +"ca" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/item/clothing/glasses/regular/hipster,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"cb" = (/obj/machinery/door/unpowered/shuttle,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated,/area/awaymission/BMPship/Gate) +"cc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/BMPship/Gate) +"ce" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) "cf" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/BMPship/Fore) "cg" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/BMPship/Fore) "ch" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plasteel{tag = "icon-carpetside (NORTH)"; icon_state = "carpetside"; dir = 1},/area/awaymission/BMPship/Fore) @@ -117,17 +117,17 @@ "cm" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Midship) "cn" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/BMPship/Aft) "co" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Aft) -"cp" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft) -"cq" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship/Aft) -"cr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cs" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"ct" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cu" = (/obj/structure/closet/crate,/obj/item/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cv" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cw" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft) -"cz" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship/Aft) +"cp" = (/obj/machinery/gateway/centeraway{calibrated = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cq" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cr" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"ct" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cu" = (/turf/simulated/shuttle/wall{tag = "icon-swall2"; icon_state = "swall2"},/area/awaymission/BMPship/Gate) +"cv" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cw" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cx" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"cy" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Gate) +"cz" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"},/area/awaymission/BMPship/Gate) "cA" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore) "cB" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore) "cC" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore) @@ -151,7 +151,7 @@ "cU" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship) "cV" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Midship) "cW" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Aft) -"cX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerCargo"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft) +"cX" = (/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) "cY" = (/turf/simulated/floor/plasteel{tag = "icon-carpet15-13 (EAST)"; icon_state = "carpet15-13"; dir = 4},/area/awaymission/BMPship/Fore) "cZ" = (/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore) "da" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore) @@ -473,6 +473,27 @@ "je" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/awaymission) "jf" = (/turf/space,/area/crew_quarters/bar) "jg" = (/turf/space,/area/exploration/methlab) +"jh" = (/obj/machinery/door_control{id = "packerMed"; pixel_y = -24},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"ji" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"jj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/storage/box,/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jn" = (/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Gate) +"jo" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) +"jp" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/BMPship/Gate) +"jq" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Gate) +"jr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"js" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship/Gate) +"jt" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"ju" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jv" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jw" = (/obj/structure/closet/crate,/obj/item/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jy" = (/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/food/snacks/meat,/obj/item/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jz" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship/Gate) +"jA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Gate) +"jB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerCargo"},/turf/simulated/floor/plating,/area/awaymission/BMPship/Gate) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -523,18 +544,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaCaxaxayaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamakezdhaoancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaajaaaaaaapezezeybdbdancoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaaqakatdhbdbdbdcWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaEaxaxaxaxaxaxaxaxaxayaxaxaxazaAaBaCazazaxaDcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaVaVaVaVaVaWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagagagagagagagaiaaaaaaaaaaaaasaXaYaHaHaZaHaHaHbaaHaHbbbcbdbdbebdbdbfbgbhbdbibjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblbmbnbobpbqbpbqbpbrbsaaaaaaaaaaasbtaYaHbuaHaHaHaGaHbvaNaNbwbxbybdbzbdbdbAbBbCbDbdbjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaEaFaHbuaYaHbuaHaHaHaZaHaHaHbJbcbKbdbdbdbdbLbMbNbdbdbOaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaEbVbtbuaHbWbXaHaHaHbYaHbWbYaHaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCaucCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUavcVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaamakakanakaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBataEaDaGaFaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaaaaajaaaaaaaHaEaEaIaJaJaFaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaaKataLaDaJaJaJaMaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaNakakakakakakakakakanakakakaOaRaQamaOaOakaSaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaTaVaUaXaWaZaYbcbabfbebhbgbjbibubtbtbtbtbtbwbvaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagagagagagagagaiaaaaaaaaaaaaasbybxaUaUbzaUaUaUbAaUaUbBbCaJaJbDaJaJbMbLbNaJbWbObeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblbmbnbobpbqbpbqbpbrbsaaaaaaaaaaasbXbxaUbYaUaUaUaVaUcababacbcdccaJceaJaJcqcpcscrctbObeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaNaTaUbYbxaUbYaUaUaUbzaUaUaUcubCctaJaJaJaJcwcvcxaJctcybeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaNczbXbYaUcXjhaUaUaUjiaUcXjiaUbebCjjjljkjkjmjkjkjkjkjojnbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmjpakakakakaRjqjqjqamakakakakczjsjrjujtjrjrjwjvjyjxjAjzbeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCaucCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUavcVaMakakakakakakakakanaRjBamjpcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxaycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdodoawdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQbZdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVcDdIdZeaebdYbbedeedRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index 479699ce0f2..f37709c438e 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -520,7 +520,7 @@ "jZ" = (/obj/structure/table,/obj/item/firstaid_arm_assembly,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "ka" = (/obj/structure/table,/obj/item/flash,/obj/item/flash,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "kb" = (/obj/structure/stool/bed/chair{dir = 1},/mob/living/simple_animal/hostile/russian/ranged{loot = list(/obj/effect/landmark/mobcorpse/russian/ranged)},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar) -"kc" = (/obj/structure/table,/obj/item/mmi/radio_enabled,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) +"kc" = (/obj/structure/table,/obj/item/mmi,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "kd" = (/obj/structure/table,/obj/item/storage/toolbox/mechanical,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar) "ke" = (/obj/machinery/door/airlock/maintenance_hatch{req_access_txt = "101"},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general) "kf" = (/obj/machinery/door/window/northright,/obj/machinery/door/window/southleft,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general) @@ -971,4 +971,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} - diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 61aeaa07620..d823f8ae25f 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -2683,7 +2683,7 @@ "aZE" = (/obj/item/radio/intercom{pixel_x = 25},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/window/reinforced,/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "aZF" = (/obj/machinery/door/airlock/public/glass{name = "Central Access"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore) "aZG" = (/obj/machinery/door/airlock/public/glass{name = "Central Access"},/turf/simulated/floor/plasteel{icon_state = "bluecorner"},/area/hallway/primary/fore) -"aZH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_y = -30},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding,/obj/item/clothing/head/welding,/turf/simulated/floor/plasteel,/area/atmos) +"aZH" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_y = -30},/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding,/obj/item/clothing/head/welding,/obj/item/clothing/glasses/welding,/obj/item/clothing/glasses/welding,/turf/simulated/floor/plasteel,/area/atmos) "aZI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint) "aZJ" = (/obj/effect/decal/cleanable/cobweb,/obj/item/clothing/mask/muzzle/gag,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/brig) "aZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2) @@ -5878,7 +5878,7 @@ "cjb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "telescienceblast"; name = "test chamber blast doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/explab_chamber) "cjc" = (/obj/structure/sign/poster/random{pixel_x = 32},/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/blueshield) "cjd" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/ntrep) -"cje" = (/obj/structure/table/wood,/obj/item/clipboard{pixel_x = -2},/obj/item/folder,/obj/item/stamp/centcom,/obj/item/pen/multi/fountain,/turf/simulated/floor/carpet,/area/ntrep) +"cje" = (/obj/structure/table/wood,/obj/item/clipboard{pixel_x = -2},/obj/item/folder,/obj/item/pen/multi/fountain,/obj/item/stamp/rep,/turf/simulated/floor/carpet,/area/ntrep) "cjf" = (/obj/structure/table/wood,/obj/machinery/computer/skills{req_access_txt = "57"},/turf/simulated/floor/carpet,/area/ntrep) "cjg" = (/obj/machinery/door/window{dir = 1; name = "Desk Door"; req_access_txt = "73"},/obj/machinery/keycard_auth{pixel_x = 24; pixel_y = 0},/turf/simulated/floor/wood,/area/ntrep) "cjh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/aft) @@ -6395,7 +6395,7 @@ "csY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "csZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cta" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) -"ctb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) +"ctb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "ctc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "ctd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) "cte" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology) @@ -7091,6 +7091,7 @@ "cGs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cGt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cGu" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft) +"cGv" = (/obj/machinery/door/airlock/maintenance,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cGw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cGx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cGy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Aft Primary Hallway 3"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft) @@ -7632,7 +7633,7 @@ "cQO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/genetics) "cQP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/atmos) "cQQ" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/atmos) -"cQR" = (/obj/machinery/door/airlock/maintenance,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cQR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{aiControlDisabled = 0; frequency = 1379; hackProof = 0; icon_state = "door_locked"; id_tag = "atmospherics_south_inner"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) "cQS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Engineering"; name = "Engineering Security Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engine/equipmentstorage) "cQT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/atmos/distribution) "cQU" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/reagent_dispensers/watertank,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plating,/area/storage/secure) @@ -8229,6 +8230,7 @@ "dcn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/engine/engineering) "dco" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central/ne) "dcp" = (/obj/machinery/porta_turret{dir = 1},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "darkbluecorners"},/area/turret_protected/aisat_interior) +"dcq" = (/obj/machinery/door/airlock/external{aiControlDisabled = 0; frequency = 1379; hackProof = 0; icon_state = "door_locked"; id_tag = "atmospherics_south_outer"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) "dcs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/engine/engineering) "dct" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/atmos) "dcv" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plasteel,/area/atmos) @@ -8626,8 +8628,6 @@ "dmt" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plating,/area/maintenance/asmaint) "dmu" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/maintenance/asmaint2) "dmv" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "atmospherics_south_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "atmospherics_south_sensor"; pixel_x = -8; pixel_y = -30},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "atmospherics_south"; pixel_x = 0; pixel_y = -25; req_access_txt = null; tag_airpump = "atmospherics_south_pump"; tag_chamber_sensor = "atmospherics_south_sensor"; tag_exterior_door = "atmospherics_south_outer"; tag_interior_door = "atmospherics_south_inner"},/turf/simulated/floor/plating,/area/engine/engineering) -"dmw" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_inner"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) -"dmx" = (/obj/machinery/door/airlock/external{aiControlDisabled = 1; frequency = 1379; hackProof = 1; icon_state = "door_locked"; id_tag = "atmospherics_south_outer"; locked = 1; name = "Atmospherics External Access"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/engine/engineering) "dmy" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine) "dmz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/vacuum{pixel_y = -30},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine) "dmA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/igniter{icon_state = "igniter0"; id = "gasturbine"; on = 0},/turf/simulated/floor/engine/insulated,/area/maintenance/turbine) @@ -9097,7 +9097,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalvaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaalvaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcXudbjcZucZucZucZucZudardbtdblcOqcOtcOrdarcKUdbqdbrcHhcVjcVjdbsdbBdbydbEdbCdbGdbFdbzcSUdbAcKLcNXcPgdacdbJcSUdbDcZSdbKdbLcSddaMdaNdbNcSddaPdaVcXTcXUcPicYbdbIcTodbScLVdbWcQZcRecBPckKchfdbMdbMcJqchfcLYcsLcLZcIjcMccMbcMecMdcJGcJvcyPctrcIqciYbQXbQXcMhciYbQXaqFcBRdbRcJKcJKcxNdbRcJKcJKcxNdbRcJKcJKcBRaaaaaaaaaaabaabaaaaaaaaacuQbGGbGGcFccuQbGGbGGbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalvalwalwamhalvalvalvalvalwalvalvalwdbTaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXudbUcZwcZucZucZudbVdardblcPkcMOcMTcMScMVcMUcMYcMWcMZcVjdcmdcldchcPlcPEcPDcPWcPFdcndcwdbrcHhcWecPXcZMcQccSUdcscZSdctdcLcSddaMdaNcZccSddcvdaVcXTdcOcQecZedcScSndcTdbbdbbcQZcRecBQckKdcAcuccABcJqchfchfcNdcNecDncNfcNfcNgchfchfchfchfctrcIqciYbQXcNhcKFciYcepcepcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRcBRaaaaaaaaaaaaaabaabaaaaaabGHbGHbGHcFccuQdcJdcKbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucXucXudcUdcMdcMdcMdardcNcQjdcPdcPdcQdcWdawcNidcXcNkcNjcNjcNWcNZcQFcOaddbcOccQGcNZcOdcOfcOecOhcOgcOicQHddrdbDcZSddmddscSddaMcSdddtcSddaPdaVcXTcXUddxcYbdbIcQZcQZcQZcQZcQZcRecBQcOjcYlcuccTBcOScOPcOVcOPcOXcsLcsLcsLcsLczfchfcPacPecPbcPfcGLbQXcFvcepcepaaaaaaddFaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaabaaabGHcJQddBddKcuQddJddIbGGbZZaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddLcXucZucZucZudcMaabaabdarddGcQJdcPdcPcQUdarcRgcRwcRrcSvcStcSNcSxcSUcUBcQbddScVjcVccSUcVpcVqcVqcSvcSvcVucVrcSUddZcZSdeadehcSddaMcSdcZUdagdecdeidaYdejdekcXcdelcSndendemdemcQZcRecBQcsLckKchfchfcPdchfchfcsLcQlcyJcyJcyJcsLcQucQRcQOcQXcQWcDocepcepcepcepaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaabaabbGHdbgcAScaccuQcuQcuQbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddLcXucZucZucZudcMaabaabdarddGcQJdcPdcPcQUdarcRgcRwcRrcSvcStcSNcSxcSUcUBcQbddScVjcVccSUcVpcVqcVqcSvcSvcVucVrcSUddZcZSdeadehcSddaMcSdcZUdagdecdeidaYdejdekcXcdelcSndendemdemcQZcRecBQcsLckKchfchfcPdchfchfcsLcQlcyJcyJcyJcsLcQucGvcQOcQXcQWcDocepcepcepcepaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaabaabbGHdbgcAScaccuQcuQcuQbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcXucZucZucZudcMaabaaadardescQJdcPdcPcVvdardeucQYcSUdeFcRbcRbcRfcSUcVwdeAdeBdeCcVycSUcRbcRbcRbdeFcSUcRhdeucSUdbDcZSdeOdePdeHdeIdeJdeKdeQdeRcXbdeUcXUdeVcYbdbIcTodeXcRideYcQZcRecBPcBPckKcprdeScRjdeTchfcsLdfadeZdffcRkcRmcRlchfciYciYcRncepcepaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGHbGHbGHbGHdfhcaccuQdfidfcbGGbGHaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacXucXudcMdcUdfdaaaaaadardfecVzdcPdcPcVAdardfwcRodfzdfkcRpcRqcRpdfocVBdfqdfrdfscQHdfocRpcRpcRpdftdfzcRsdfvcSUdbDdfEdaMdfxdfydeQdfFdfGdfBdfIdfHdfKdfJdfNcZedcScSndfOdemdemcQZcRecBPcsLcOjcSfcScdfgcsKchfdgmcTBcsLcYidfLcsLcYicBNchfcSgcFcbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabGHbGGbGGbGGcJQdfSdfUcuQdfPbGGbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfXdfYdfYdfZdfYdfYdgadardfVcQjdcPdcPcVCdardaGcSicSUcSUdfodfodfodfocVGcVScVNcSvcVTdfodfodfodfocSUcSUcSydglcSUdbDcZSdgrdgsdfydggdghcSdcSddgtcXWdggcXUdgjcYbdbIcQZcQZcQZcQZcQZcRecBPcTBcsLdgkdgCcsLdgmchfchfdgnchfdgocpscJGcYichfchfcuQcFcbGHaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaabGHbGHcuQdgAdgycJQdfScacbGGbGGbGGdgBbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9111,7 +9111,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabafOaabafOafOaabaabaabalwalwcSUcSUcUpdibaaacTDcTEaaaaaaaabdledlfdlgaabaaaaaacUlcTFaaadibcUqcSUcSUdaGcSUcQZdkOdlvdkOcQZdkTdlwdkTcQZdkVdlxdkVcQZaabdhKaaaalwaaadjddgSdgSdgSdlldlmdlndlydlndlmdkPdlpcsLdlAdlrdfMddHcYidlscBPcBQcBQcBQdlKaabaabaaabZZdlBdlCcuQbGGdlDdlJdbgcuQdlPbGGcuQdlzbGGbGGdlLbGGbGHbGHbGHbZZbZZbGHdjQdlSdlRdlUdjQaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaabaabaaaaaaaabaabalwcSUcSUcTtdibaaacTxafOaaadlEaabdlFdlGdlHaabaabdjqafOcTxaaadibcTtcSUcSUdaGcSUcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZcQZaabdhKaaaayiaaadjdaaaaaaaaadlIdlmdlVdlXdlWdlmcsLdlMcsLcsLdlNdlOcXrdmcdlQcBPaaaaaaaaaaaaaaaaabaaabZZdlZdmbdlLbGGdgybGGbGGdlLdjobGGcuQcuQcuQcuQcuQbGGbGHaabaaaaaaaaaaabdlTdlTdmddlTdlTaabaabdhcaabaabdjTaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcSUcSCcUodibaaacTxafOaaaaaaaabaabaabaabaabaaaaaaafOcTxaaadibcUncTmcSUdmecSUcSUcSUcSUdmfdhhdhhdhhdhhdhhdhhdhhdhhdhhdhhdmgaabaabaabdjEaaaaaaaaadlYdlmdlndmhdlndlmdmadmidfMdfMdmldmrdmmcBPcBPcBPaaaaaaaaaaaaaaaaabaaabZZdlBdmncuQdbgbGGbGGdmpcuQdmqbGGbGGbGGbGGbGGbGGbGGbGHaabaaaaaaaaaaabaaadlTdmsdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaabcSUcTtdibdmjaaacTDcTEaaaaaaaaaaabaaaaaaaaaaaaaaacUlcTFaaadibdibcTtcSUdmkdmwdmvdaGdmxdmgaabaabaabaabaabaabaabdmoaabaabaabaabaabaabdjEaabaabaabdlYdlmdmydmAdmzdmEaabdmacBPcBQdmtcBQcBPcBPaaaaabaaaaaaaaaaaaaaaaabaabbZZbZZbZZbGHbGHbGHbGGcuQbGHdmubGHbGHdbgbPAcLhbKlcMsbGHaabaaaaaaaaaaabaaadlTdmGdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaabcSUcTtdibdmjaaacTDcTEaaaaaaaaaaabaaaaaaaaaaaaaaacUlcTFaaadibdibcTtcSUdmkcQRdmvdaGdcqdmgaabaabaabaabaabaabaabdmoaabaabaabaabaabaabdjEaabaabaabdlYdlmdmydmAdmzdmEaabdmacBPcBQdmtcBQcBPcBPaaaaabaaaaaaaaaaaaaaaaabaabbZZbZZbZZbGHbGHbGHbGGcuQbGHdmubGHbGHdbgbPAcLhbKlcMsbGHaabaaaaaaaaaaabaaadlTdmGdlTaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcSUcUDdbudiPaabcTxafOdjqaaaaaadjqaaaaaaaaaaaadjqafOcTxaaadiRdbQcUEcSUdmLcSUcSUcSUcSUcSUcSUaaaaaaaabaaaaaaaaadmoaaaaaadmBdmBdmBdmBdmCaaaaaaaabdlYdmDdlmdmOdlmdlmaaaaabaaaaaadmFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabGHdmbdmMbGHdmNaabbGHbGHbZZbZZcMsbGHaaaaabaaaaaaaaaaabaaaaaadmRaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSUcUFcUIcUHaaacTxafOafOdcfafOafOdcfafOafOdcfafOafOcTxaaacUJcUIcUKcSUdmPdmQdnjdnldnkdnmdmVdmWdmWdmXdmWdmWdmWdmYdmWdmWdmZdnadnbdnodmCaaaaaaaabdndaHQdlmdnedlmdnfaabaabaaaaaadngaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaabpaaaaaabGHdnqdnnbGHdnpaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaadnraaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnscSUcSUcULaaacUMcSFcSFcUOcSFcSFcUOcSFcSFcUOcSFcSFcUQaaacULcSUcSUcSUdmPdnBdnAdnEdnCdnHdfoaaaaaaaabaaaaaaaaadmodmBdmBdmBbfmbJNdnvdmCaaaaaaaabaabaHQdnxdnIdnxaHQaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaabZZdnJbZZbZZaabdhcaaaaabaaaaaaaabaaaamWamWalwayiaabaabaabaabdnLaabaabaabaabdhcamhamWamWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index c11a0421bda..5b09cc250c5 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/binary dir = SOUTH initialize_directions = SOUTH|NORTH - use_power = 1 + use_power = IDLE_POWER_USE var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 @@ -150,4 +150,4 @@ /obj/machinery/atmospherics/binary/process_atmos() ..() - return parent1 && parent2 \ No newline at end of file + return parent1 && parent2 diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 0eed9729f87..a3903f278fb 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -5,7 +5,7 @@ name = "omni device" icon = 'icons/atmos/omni_devices.dmi' icon_state = "base" - use_power = 1 + use_power = IDLE_POWER_USE initialize_directions = 0 can_unwrench = 1 @@ -299,4 +299,4 @@ for(var/datum/omni_port/port in ports) if(!port.parent) return 0 - return 1 \ No newline at end of file + return 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index e750256b0df..c0787a95612 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/trinary dir = SOUTH initialize_directions = SOUTH|NORTH|WEST - use_power = 1 + use_power = IDLE_POWER_USE var/on = 0 @@ -209,4 +209,4 @@ /obj/machinery/atmospherics/trinary/process_atmos() ..() - return parent1 && parent2 && parent3 \ No newline at end of file + return parent1 && parent2 && parent3 diff --git a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm index 39441f8ed87..51415223de2 100644 --- a/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary_devices/cold_sink.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/atmospherics/cold_sink.dmi' icon_state = "on_cool" density = 1 - use_power = 1 + use_power = IDLE_POWER_USE name = "cold sink" desc = "Cools gas when connected to pipe network" @@ -39,4 +39,4 @@ if(abs(old_temperature-air_contents.temperature) > 1) parent.update = 1 - return 1 \ No newline at end of file + return 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm index 2b0cbc14277..31eb7305ded 100644 --- a/code/ATMOSPHERICS/components/unary_devices/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary_devices/heat_source.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/atmospherics/cold_sink.dmi' icon_state = "intact_off" density = 1 - use_power = 1 + use_power = IDLE_POWER_USE name = "heat reservoir" desc = "Heats gas when connected to pipe network" @@ -38,4 +38,4 @@ if(abs(old_temperature-air_contents.temperature) > 1) parent.update = 1 - return 1 \ No newline at end of file + return 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm index fe5b6a0a445..345afd9921e 100644 --- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm @@ -1,7 +1,7 @@ /obj/machinery/atmospherics/unary/outlet_injector icon = 'icons/atmos/injector.dmi' icon_state = "map_injector" - use_power = 1 + use_power = IDLE_POWER_USE layer = 3 can_unwrench = 1 diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 99eeb1883ea..1f2670371f8 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -8,7 +8,7 @@ name = "air vent" desc = "Has a valve and pump attached to it" - use_power = 1 + use_power = IDLE_POWER_USE can_unwrench = 1 var/open = 0 diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 11b1fc0f920..8b5c4b2afb2 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -7,7 +7,7 @@ name = "air scrubber" desc = "Has a valve and pump attached to it" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 60 diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm index 48c482ac906..4cd51e66b67 100644 --- a/code/ATMOSPHERICS/pipes/pipe.dm +++ b/code/ATMOSPHERICS/pipes/pipe.dm @@ -4,7 +4,7 @@ var/volume = 0 force = 20 layer = 2.4 //under wires with their 2.44 - use_power = 0 + use_power = NO_POWER_USE can_unwrench = 1 var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 376fcd45559..be6326272f7 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -35,8 +35,8 @@ #define MINIMUM_TEMPERATURE_RATIO_TO_SUSPEND 0.012 #define MINIMUM_TEMPERATURE_DELTA_TO_SUSPEND 4 //Minimum temperature difference before group processing is suspended #define MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER 0.5 //Minimum temperature difference before the gas temperatures are just set to be equal -#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION T20C+10 -#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION T20C+200 +#define MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION (T20C+10) +#define MINIMUM_TEMPERATURE_START_SUPERCONDUCTION (T20C+200) #define FLOOR_HEAT_TRANSFER_COEFFICIENT 0.4 #define WALL_HEAT_TRANSFER_COEFFICIENT 0.0 #define DOOR_HEAT_TRANSFER_COEFFICIENT 0.0 @@ -45,8 +45,8 @@ #define WINDOW_HEAT_TRANSFER_COEFFICIENT 0.1 //a hack for now //Must be between 0 and 1. Values closer to 1 equalize temperature faster //Should not exceed 0.4 else strange heat flow occur -#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD 150+T0C -#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST 100+T0C +#define FIRE_MINIMUM_TEMPERATURE_TO_SPREAD (150+T0C) +#define FIRE_MINIMUM_TEMPERATURE_TO_EXIST (100+T0C) #define FIRE_SPREAD_RADIOSITY_SCALE 0.85 #define FIRE_CARBON_ENERGY_RELEASED 2500000 //Amount of heat released per mole of burnt carbon into the tile #define FIRE_PLASMA_ENERGY_RELEASED 15000000 //Amount of heat released per mole of burnt plasma into the tile @@ -56,8 +56,8 @@ //Plasma fire properties #define OXYGEN_BURN_RATE_BASE 7 #define PLASMA_BURN_RATE_DELTA 20 -#define PLASMA_MINIMUM_BURN_TEMPERATURE 100+T0C -#define PLASMA_UPPER_TEMPERATURE 1370+T0C +#define PLASMA_MINIMUM_BURN_TEMPERATURE (100+T0C) +#define PLASMA_UPPER_TEMPERATURE (1370+T0C) #define PLASMA_MINIMUM_OXYGEN_NEEDED 2 #define PLASMA_MINIMUM_OXYGEN_PLASMA_RATIO 30 #define PLASMA_OXYGEN_FULLBURN 10 diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 686bc3e1759..593419b61b1 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -34,7 +34,7 @@ #define CANPUSH 8 #define PASSEMOTES 16 //Mob has a cortical borer or holders inside of it that need to see emotes. #define GOTTAGOFAST 32 -#define GOTTAGOREALLYFAST 64 +#define GOTTAGOFAST_METH 64 #define IGNORESLOWDOWN 128 #define GODMODE 4096 #define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index 8218d392640..4b783490568 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -5,3 +5,10 @@ #define CAT_FOOD "Food" #define CAT_MISC "Misc" #define CAT_PRIMAL "Tribal" + +#define RECIPE_MICROWAVE "Microwave" +#define RECIPE_OVEN "Oven" +#define RECIPE_GRILL "Grill" +#define RECIPE_CANDY "Candy" + +#define RECIPE_FAIL null \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 67a187c45db..4612c8cdce3 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -370,4 +370,7 @@ // used for alternate_option #define GET_RANDOM_JOB 0 #define BE_ASSISTANT 1 -#define RETURN_TO_LOBBY 2 \ No newline at end of file +#define RETURN_TO_LOBBY 2 + +//Melting Temperatures for various specific objects +#define GIRDER_MELTING_TEMP 5000 \ No newline at end of file diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 1d47ae409b3..056bc25be5d 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -129,6 +129,9 @@ #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully #define EYE_SHINE_THRESHOLD 6 //dark_view threshold past which a humanoid's eyes will 'shine' in the dark. +#define EMOTE_VISUAL 1 //A mob emote is visual +#define EMOTE_SOUND 2 //A mob emote is sound + //Human sub-species #define isshadowling(A) (is_species(A, /datum/species/shadow/ling)) #define isshadowlinglesser(A) (is_species(A, /datum/species/shadow/ling/lesser)) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 0ed5dd944db..8e1b8516172 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -91,6 +91,9 @@ /proc/log_adminsay(text, mob/speaker) if(config.log_adminchat) WRITE_LOG(GLOB.world_game_log, "ADMINSAY: [speaker.simple_info_line()]: [html_decode(text)][log_end]") + +/proc/log_qdel(text) + WRITE_LOG(GLOB.world_qdel_log, "QDEL: [text]") /proc/log_mentorsay(text, mob/speaker) if(config.log_adminchat) diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm index b47e60275e8..6ebaba5bc3b 100644 --- a/code/__HELPERS/time.dm +++ b/code/__HELPERS/time.dm @@ -56,7 +56,7 @@ /* This is used for displaying the "station time" equivelent of a world.time value Calling it with no args will give you the current time, but you can specify a world.time-based value as an argument - - You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date + - You can use this, for example, to do "This will expire at [station_time_at(world.time + 500)]" to display a "station time" expiration date which is much more useful for a player)*/ /proc/station_time(time=world.time, display_only=FALSE) return ((((time - round_start_time)) + GLOB.gametime_offset) % 864000) - (display_only ? GLOB.timezoneOffset : 0) @@ -93,8 +93,8 @@ proc/isDay(var/month, var/day) /proc/stop_watch(wh) return round(0.1 * (TimeOfGame - wh), 0.1) -/proc/month2number(month) - return month_names.Find(month) +/proc/numberToMonthName(number) + return month_names.Find(number) //Take a value in seconds and returns a string of minutes and seconds in the format X minute(s) and X seconds. /proc/seconds_to_time(var/seconds as num) diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm index 65bffa7515a..8a06b552db2 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -31,6 +31,16 @@ var/list/round_end_sounds = list( // Maps available round end sounds to their du 'sound/goonstation/misc/newround2.ogg' = 14.8 SECONDS ) +GLOBAL_LIST_INIT(cooking_recipe_types, list( + RECIPE_MICROWAVE = /datum/recipe/microwave, + RECIPE_OVEN = /datum/recipe/oven, + RECIPE_GRILL = /datum/recipe/grill, + RECIPE_CANDY = /datum/recipe/candy + )) +GLOBAL_LIST_INIT(cooking_recipes, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) +GLOBAL_LIST_INIT(cooking_ingredients, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) +GLOBAL_LIST_INIT(cooking_reagents, list(RECIPE_MICROWAVE = list(), RECIPE_OVEN = list(), RECIPE_GRILL = list(), RECIPE_CANDY = list())) + GLOBAL_LIST(station_level_space_turfs) -#define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.") \ No newline at end of file +#define EGG_LAYING_MESSAGES list("lays an egg.", "squats down and croons.", "begins making a huge racket.", "begins clucking raucously.") diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index c48600ca40c..f2e463f2af1 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -6,6 +6,8 @@ GLOBAL_VAR(config_error_log) GLOBAL_PROTECT(config_error_log) GLOBAL_VAR(world_runtime_log) GLOBAL_PROTECT(world_runtime_log) +GLOBAL_VAR(world_qdel_log) +GLOBAL_PROTECT(world_qdel_log) GLOBAL_VAR(world_href_log) GLOBAL_PROTECT(world_href_log) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 7f60fd0cac3..1919df19ae6 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -85,6 +85,7 @@ var/githuburl = "http://example.org" var/donationsurl = "http://example.org" var/repositoryurl = "http://example.org" + var/discordurl = "http://example.org" var/overflow_server_url var/forbid_singulo_possession = 0 @@ -388,7 +389,10 @@ if("githuburl") config.githuburl = value - + + if("discordurl") + config.discordurl = value + if("donationsurl") config.donationsurl = value @@ -782,4 +786,4 @@ if(M.can_start()) runnable_modes[M] = probabilities[M.config_tag] // to_chat(world, "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]") - return runnable_modes \ No newline at end of file + return runnable_modes diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 9f21eb23e2d..16193241ca8 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -284,9 +284,12 @@ SUBSYSTEM_DEF(air) /datum/controller/subsystem/air/proc/setup_allturfs(var/list/turfs_to_init = block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz))) var/list/active_turfs = src.active_turfs + // Clear active turfs - faster than removing every single turf in the world + // one-by-one, and Initalize_Atmos only ever adds `src` back in. + active_turfs.Cut() + for(var/thing in turfs_to_init) var/turf/T = thing - active_turfs -= T if(T.blocks_air) continue T.Initialize_Atmos(times_fired) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 823294e4d4e..97dd02838d0 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -59,7 +59,7 @@ SUBSYSTEM_DEF(garbage) msg += " | Fail:[fail_counts.Join(",")]" ..(msg) -/* TO-DO + /datum/controller/subsystem/garbage/Shutdown() //Adds the del() log to the qdel log file var/list/dellog = list() @@ -83,7 +83,6 @@ SUBSYSTEM_DEF(garbage) if(I.no_hint) dellog += "\tNo hint: [I.no_hint] times" log_qdel(dellog.Join("\n")) -*/ /datum/controller/subsystem/garbage/fire() //the fact that this resets its processing each fire (rather then resume where it left off) is intentional. diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 27d92b085fd..31c791f5127 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -546,7 +546,7 @@ to_chat(usr, "This can only be used on instances of type /mob") return - var/new_name = sanitize(copytext(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null,1,MAX_NAME_LEN)) + var/new_name = reject_bad_name(sanitize(copytext(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null,1,MAX_NAME_LEN))) if( !new_name || !M ) return message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].") @@ -1215,8 +1215,8 @@ return switch(Text) - if("brute") L.adjustBruteLoss(amount) - if("fire") L.adjustFireLoss(amount) + if("brute") L.adjustBruteLoss(amount, robotic=1) + if("fire") L.adjustFireLoss(amount, robotic=1) if("toxin") L.adjustToxLoss(amount) if("oxygen")L.adjustOxyLoss(amount) if("brain") L.adjustBrainLoss(amount) diff --git a/code/datums/diseases/lycancoughy.dm b/code/datums/diseases/lycancoughy.dm index 2c5a8752cbb..b50b7e0a0c3 100644 --- a/code/datums/diseases/lycancoughy.dm +++ b/code/datums/diseases/lycancoughy.dm @@ -10,6 +10,7 @@ viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) desc = "If left untreated subject will regurgitate... puppies." severity = MEDIUM + var/barklimit = 0 /datum/disease/lycan/stage_act() ..() @@ -33,13 +34,21 @@ affected_mob.visible_message("[affected_mob] howls!", \ "You howl!") affected_mob.AdjustConfused(rand(6, 8)) - if(prob(3)) + if(prob(3) && barklimit <= 10) var/list/puppytype = list(/mob/living/simple_animal/pet/corgi/puppy, /mob/living/simple_animal/pet/pug, /mob/living/simple_animal/pet/fox) var/mob/living/puppypicked = pick(puppytype) affected_mob.visible_message("[affected_mob] coughs up [initial(puppypicked.name)]!", \ "You cough up [initial(puppypicked.name)]?!") - affected_mob.emote("cough") - affected_mob.adjustBruteLoss(5) new puppypicked(affected_mob.loc) new puppypicked(affected_mob.loc) + barklimit ++ + if(prob(1)) + var/list/plushtype = list(/obj/item/toy/plushie/orange_fox, /obj/item/toy/plushie/corgi, /obj/item/toy/plushie/robo_corgi, /obj/item/toy/plushie/pink_fox) + var/obj/item/toy/plushie/coughfox = pick(plushtype) + new coughfox(affected_mob.loc) + affected_mob.visible_message("[affected_mob] coughs up a [initial(coughfox.name)]!", \ + "You cough [initial(coughfox.name)] up ?!") + + affected_mob.emote("cough") + affected_mob.adjustBruteLoss(5) return diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 72f5b6545c8..015fa78df29 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -1,5 +1,5 @@ //wrapper -/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) +/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, bypass_area_flag=FALSE) var/datum/teleport/instant/science/D = new if(D.start(arglist(args))) return 1 @@ -14,14 +14,15 @@ var/soundin //soundfile to play before teleportation var/soundout //soundfile to play after teleportation var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation) + var/ignore_area_flag = FALSE -/datum/teleport/proc/start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null) +/datum/teleport/proc/start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, bypass_area_flag=FALSE) if(!initTeleport(arglist(args))) return 0 return 1 -/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout) +/datum/teleport/proc/initTeleport(ateleatom, adestination, aprecision, afteleport, aeffectin, aeffectout, asoundin, asoundout, bypass_area_flag=FALSE) if(!setTeleatom(ateleatom)) return 0 if(!setDestination(adestination)) @@ -31,6 +32,7 @@ setEffects(aeffectin,aeffectout) setForceTeleport(afteleport) setSounds(asoundin,asoundout) + ignore_area_flag = bypass_area_flag return 1 //must succeed @@ -97,7 +99,8 @@ var/turf/destturf var/turf/curturf = get_turf(teleatom) - var/area/destarea = get_area(destination) + var/area/curarea = get_area(curturf) + if(precision) var/list/posturfs = list() var/center = get_turf(destination) @@ -109,6 +112,18 @@ else destturf = get_turf(destination) + if(!is_teleport_allowed(destturf.z)) + return 0 + // Only check the destination zlevel for is_teleport_allowed. Checking origin as well breaks ERT teleporters. + + var/area/destarea = get_area(destturf) + + if(!ignore_area_flag) + if(curarea.tele_proof) + return 0 + if(destarea.tele_proof) + return 0 + if(!destturf || !curturf) return 0 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 0e8d655c546..a10a539830e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -479,10 +479,11 @@ message_admins("[key_name_admin(usr)] has changed [key_name_admin(current)]'s assigned role to [assigned_role]") else if(href_list["memory_edit"]) - var/new_memo = copytext(input("Write new memory", "Memory", memory) as null|message,1,MAX_MESSAGE_LEN) - if(isnull(new_memo)) + var/messageinput = input("Write new memory", "Memory", memory) as null|message + if(isnull(messageinput)) return - var/confirmed = alert(usr, "Are you sure?", "Edit Memory", "Yes", "No") + var/new_memo = copytext(messageinput, 1,MAX_MESSAGE_LEN) + var/confirmed = alert(usr, "Are you sure you want to edit their memory? It will wipe out their original memory!", "Edit Memory", "Yes", "No") if(confirmed == "Yes") // Because it is too easy to accidentally wipe someone's memory memory = new_memo log_admin("[key_name(usr)] has edited [key_name(current)]'s memory") @@ -1349,7 +1350,7 @@ special_role = SPECIAL_ROLE_VAMPIRE ticker.mode.forge_vampire_objectives(src) ticker.mode.greet_vampire(src) - ticker.mode.update_change_icons_added(src) + ticker.mode.update_vampire_icons_added(src) /datum/mind/proc/make_Changeling() if(!(src in ticker.mode.changelings)) diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 83ca8f7f0ea..99d97e45626 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -53,19 +53,18 @@ return -1 return . -/datum/recipe/proc/check_items(obj/container) //1=precisely, 0=insufficiently, -1=superfluous - if(!items) - if(locate(/obj/) in container) - return -1 - else - return 1 +/datum/recipe/proc/check_items(obj/container, list/ignored_items = null) //1=precisely, 0=insufficiently, -1=superfluous . = 1 - var/list/checklist = items.Copy() + var/list/checklist = items ? items.Copy() : list() for(var/obj/O in container) + if(ignored_items && is_type_in_list(O, ignored_items)) //skip if this is something we are ignoring + continue + if(!items) + return -1 var/found = 0 for(var/type in checklist) if(istype(O,type)) - checklist-=type + checklist -= type found = 1 break if(!found) @@ -95,16 +94,16 @@ container.reagents.clear_reagents() return result_obj -/proc/select_recipe(list/datum/recipe/avaiable_recipes, obj/obj, exact = 1 as num) +/proc/select_recipe(list/datum/recipe/available_recipes, obj/obj, exact = 1 as num, list/ignored_items = null) if(!exact) exact = -1 var/list/datum/recipe/possible_recipes = new - for(var/datum/recipe/recipe in avaiable_recipes) - if(recipe.check_reagents(obj.reagents)==exact && recipe.check_items(obj)==exact) - possible_recipes+=recipe - if(possible_recipes.len==0) + for(var/datum/recipe/recipe in available_recipes) + if(recipe.check_reagents(obj.reagents) == exact && recipe.check_items(obj, ignored_items) == exact) + possible_recipes += recipe + if(possible_recipes.len == 0) return null - else if(possible_recipes.len==1) + else if(possible_recipes.len == 1) return possible_recipes[1] else //okay, let's select the most complicated recipe var/r_count = 0 diff --git a/code/datums/spell.dm b/code/datums/spell.dm index f251fed2951..1a78f8be2ca 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -146,7 +146,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(!istype(H.shoes, /obj/item/clothing/shoes/sandal)) to_chat(user, "I don't feel strong enough without my sandals.") return 0 - if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) && !istype(H.wear_suit, /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard)) + if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman/wizard)) to_chat(user, "I don't feel strong enough without my hat.") return 0 else if(!ishuman(user)) @@ -321,28 +321,40 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/include_user = 0 //if it includes usr in the target list var/random_target = 0 // chooses random viable target instead of asking the caster var/random_target_priority = TARGET_CLOSEST // if random_target is enabled how it will pick the target - + var/humans_only = 0 //for avoiding simple animals and only doing "human" mobs, 0 = all mobs, 1 = humans only /obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends) var/inner_radius = -1 //for all your ring spell needs /obj/effect/proc_holder/spell/targeted/choose_targets(mob/user = usr) var/list/targets = list() - + switch(max_targets) if(0) //unlimited - for(var/mob/living/target in view_or_range(range, user, selection_type)) - targets += target + + if(!humans_only) + for(var/mob/living/target in view_or_range(range, user, selection_type)) + targets += target + else + for(var/mob/living/carbon/human/target in view_or_range(range, user, selection_type)) + targets += target + if(1) //single target can be picked if(range < 0) targets += user else var/possible_targets = list() - - for(var/mob/living/M in view_or_range(range, user, selection_type)) - if(!include_user && user == M) - continue - possible_targets += M + + if(!humans_only) + for(var/mob/living/M in view_or_range(range, user, selection_type)) + if(!include_user && user == M) + continue + possible_targets += M + else + for(var/mob/living/carbon/human/M in view_or_range(range, user, selection_type)) + if(!include_user && user == M) + continue + possible_targets += M //targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets //Adds a safety check post-input to make sure those targets are actually in range. @@ -366,8 +378,12 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin else var/list/possible_targets = list() - for(var/mob/living/target in view_or_range(range, user, selection_type)) - possible_targets += target + if(!humans_only) + for(var/mob/living/target in view_or_range(range, user, selection_type)) + possible_targets += target + else + for(var/mob/living/carbon/human/target in view_or_range(range, user, selection_type)) + possible_targets += target for(var/i=1,i<=max_targets,i++) if(!possible_targets.len) break diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index 1d296c26d41..301dd5086b2 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -30,4 +30,28 @@ SC.locked = 0 C.open() + return + +/obj/effect/proc_holder/spell/aoe_turf/knock/greater + name = "Greater Knock" + desc = "On first cast, will remove access restrictions on all airlocks on the Cyberiad, and announce this spell's use to the station. On any further cast, will open all doors in sight. Cannot be refunded once bought!" + + charge_max = 200 + invocation = "MAIOR OXIN FIERA" + invocation_type = "shout" + range = 7 + level_max = 0 //Cannot be improved, quality of life since can't be refunded + cooldown_min = 200 + var/used = FALSE + +/obj/effect/proc_holder/spell/aoe_turf/knock/greater/cast(list/targets, mob/user = usr) + if(!used) + used = TRUE + for(var/obj/machinery/door/airlock/A in airlocks) + if(is_station_level(A.z)) + A.req_access = list() + A.req_one_access = list() + command_announcement.Announce("We have removed all access requirements on your station's airlocks. You can thank us later!", "Greetings!", 'sound/misc/notice2.ogg', , , "Space Wizard Federation Message") + else + ..() return \ No newline at end of file diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 628b754a5ae..2db64b30bdb 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -943,6 +943,8 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine /obj/item/reagent_containers/food/condiment/peppermill, /obj/item/kitchen/rollingpin, /obj/item/storage/fancy/egg_box, + /obj/item/mixing_bowl, + /obj/item/mixing_bowl, /obj/item/reagent_containers/food/condiment/enzyme, /obj/item/reagent_containers/food/condiment/sugar, /obj/item/reagent_containers/food/snacks/meat/monkey, diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 952711f3063..ef439049611 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1,16 +1,13 @@ -var/list/uplink_items = list() +GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /proc/get_uplink_items(var/job = null) - // If not already initialized.. + var/list/uplink_items = list() if(!uplink_items.len) - // Fill in the list and order it like this: - // A keyed list, acting as categories, which are lists to the datum. - var/list/last = list() - for(var/item in typesof(/datum/uplink_item)) + for(var/path in GLOB.uplink_items) - var/datum/uplink_item/I = new item() + var/datum/uplink_item/I = new path if(!I.item) continue if(I.gamemodes.len && ticker && !(ticker.mode.type in I.gamemodes)) @@ -55,6 +52,9 @@ var/list/uplink_items = list() var/list/job = null var/surplus = 100 //Chance of being included in the surplus crate (when pick() selects it) var/hijack_only = FALSE //can this item be purchased only during hijackings? + var/refundable = FALSE + var/refund_path = null // Alternative path for refunds, in case the item purchased isn't what is actually refunded (ie: holoparasites). + var/refund_amount // specified refund amount in case there needs to be a TC penalty for refunds. /datum/uplink_item/proc/spawn_item(var/turf/loc, var/obj/item/uplink/U) if(hijack_only) @@ -214,7 +214,7 @@ var/list/uplink_items = list() /datum/uplink_item/jobspecific/rad_laser name = "Radiation Laser" - desc = "A radiation laser concealed inside of a Health Analyser. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyser, only appears like one. May not function correctly on radiation resistant humanoids!" + desc = "A radiation laser concealed inside of a Health Analyzer. After a moderate delay, causes temporary collapse and radiation. Has adjustable controls, but will not function as a regular health analyzer, only appears like one. May not function correctly on radiation resistant humanoids!" reference = "RL" item = /obj/item/rad_laser cost = 5 @@ -352,7 +352,7 @@ var/list/uplink_items = list() item = /obj/item/pen/poison cost = 2 excludefrom = list(/datum/game_mode/nuclear) - job = list("Head of Personnel", "Quartermaster", "Cargo Technician") + job = list("Head of Personnel", "Quartermaster", "Cargo Technician", "Librarian") // DANGEROUS WEAPONS @@ -500,6 +500,7 @@ var/list/uplink_items = list() reference = "AGG" item = /obj/item/storage/box/syndie_kit/atmosgasgrenades cost = 11 + surplus = 0 /datum/uplink_item/dangerous/emp name = "EMP Grenades and Implanter Kit" @@ -540,9 +541,11 @@ var/list/uplink_items = list() desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel." reference = "SC" item = /obj/item/antag_spawner/borg_tele + refund_path = /obj/item/antag_spawner/borg_tele cost = 50 gamemodes = list(/datum/game_mode/nuclear) surplus = 0 + refundable = TRUE /datum/uplink_item/dangerous/foamsmg name = "Toy Submachine Gun" @@ -571,19 +574,14 @@ var/list/uplink_items = list() gamemodes = list(/datum/game_mode/nuclear) surplus = 0 - -//for refunding the syndieborg teleporter -/datum/uplink_item/dangerous/syndieborg/spawn_item() - var/obj/item/antag_spawner/borg_tele/T = ..() - if(istype(T)) - T.TC_cost = cost - /datum/uplink_item/dangerous/guardian name = "Holoparasites" desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an organic host as a home base and source of fuel." item = /obj/item/storage/box/syndie_kit/guardian excludefrom = list(/datum/game_mode/nuclear) cost = 12 + refund_path = /obj/item/guardiancreator/tech/choose + refundable = TRUE // Ammunition diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index cdf25ce9651..d661e320dd8 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -7,7 +7,7 @@ /proc/key_name_helper(whom, include_name, include_link = FALSE, type = null) if(include_link != FALSE && include_link != TRUE) - log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]")) + log_runtime(EXCEPTION("Key_name was called with an incorrect include_link [include_link]"), src) var/mob/M var/client/C diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 44a9ae7e522..d8dabdb4a10 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -394,4 +394,10 @@ for(var/obj/machinery/door/airlock/temp_airlock in src) temp_airlock.prison_open() for(var/obj/machinery/door/window/temp_windoor in src) - temp_windoor.open() \ No newline at end of file + temp_windoor.open() + +/area/AllowDrop() + CRASH("Bad op: area/AllowDrop() called") + +/area/drop_location() + CRASH("Bad op: area/drop_location() called") \ No newline at end of file diff --git a/code/game/area/depot-areas.dm b/code/game/area/depot-areas.dm index 9de680da82e..69205c3c35f 100644 --- a/code/game/area/depot-areas.dm +++ b/code/game/area/depot-areas.dm @@ -57,22 +57,32 @@ /area/syndicate_depot/core/proc/reset_alert() if(used_self_destruct) - return + for(var/obj/effect/overload/O in src) + new /obj/structure/fusionreactor(O.loc) + qdel(O) + + if(on_peaceful) + peaceful_mode(FALSE, TRUE) local_alarm = FALSE called_backup = FALSE + unlock_computers() used_self_destruct = FALSE + + run_started = FALSE + run_finished = FALSE + + despawn_guards() + hostile_list = list() + dead_list = list() + peaceful_list = list() + something_looted = FALSE detected_mech = FALSE detected_pod = FALSE detected_double_agent = FALSE updateicon() - despawn_guards() - guard_list = list() - hostile_list = list() - dead_list = list() - peaceful_list = list() alert_log += "Alert level reset." @@ -97,6 +107,13 @@ if(on_peaceful) increase_alert("Thieves!") +/area/syndicate_depot/core/proc/armory_locker_looted() + if(!run_finished && !used_self_destruct) + if(shield_list.len) + activate_self_destruct("Armory compromised despite armory shield being online.", FALSE) + return + declare_finished() + /area/syndicate_depot/core/proc/turret_died() something_looted = TRUE if(on_peaceful) @@ -133,19 +150,12 @@ if(L.opened) L.close() if(!L.locked) - L.locked = 1 + L.locked = !L.locked L.req_access = list(access_syndicate_leader) L.update_icon() for(var/obj/machinery/computer/syndicate_depot/teleporter/P in src) if(!P.portal_enabled) P.toggle_portal() - for(var/obj/machinery/door/airlock/hatch/syndicate/vault/V in src) - if(!V.density) - V.close() - V.emergency = 0 - if(!V.locked) - V.locked = !V.locked - V.update_icon() else log_game("Depot visit: ended") alert_log += "Visitor mode ended." @@ -250,15 +260,17 @@ if(user) var/turf/T = get_turf(user) var/area/A = get_area(T) - var/log_msg = "[key_name(user)] has armed the depot self destruct device at [A.name] ([T.x],[T.y],[T.z])" + var/log_msg = "[key_name(user)] has triggered the depot self destruct at [A.name] ([T.x],[T.y],[T.z])" message_admins(log_msg) log_game(log_msg) playsound(user, 'sound/machines/Alarm.ogg', 100, 0, 0) else log_game("Depot self destruct activated.") if(reactor) - reactor.overload(containment_failure) + if(!reactor.has_overloaded) + reactor.overload(containment_failure) else + log_debug("Depot: [src] called activate_self_destruct with no reactor."); message_admins("Syndicate Depot lacks reactor to initiate self-destruct. Must be destroyed manually.") updateicon() @@ -269,13 +281,17 @@ for(var/obj/machinery/door/airlock/A in src) spawn(0) A.close() - if(A.density) + if(A.density && !A.locked) A.lock() /area/syndicate_depot/core/proc/lockout_computers() for(var/obj/machinery/computer/syndicate_depot/C in src) C.activate_security_lockout() +/area/syndicate_depot/core/proc/unlock_computers() + for(var/obj/machinery/computer/syndicate_depot/C in src) + C.security_lockout = FALSE + /area/syndicate_depot/core/proc/toggle_door_locks() for(var/obj/machinery/door/airlock/A in src) A.emergency = !A.emergency @@ -313,6 +329,12 @@ if(L.name == "syndi_depot_shield") var/obj/machinery/shieldwall/syndicate/S = new /obj/machinery/shieldwall/syndicate(L.loc) shield_list += S.UID() + for(var/obj/structure/closet/secure_closet/syndicate/depot/armory/L in src) + if(L.opened) + L.close() + if(!L.locked) + L.locked = !L.locked + L.update_icon() /area/syndicate_depot/core/proc/shields_key_check() if(!shield_list.len) @@ -327,6 +349,10 @@ if(S) qdel(S) shield_list = list() + for(var/obj/structure/closet/secure_closet/syndicate/depot/armory/L in src) + if(L.locked) + L.locked = !L.locked + L.update_icon() /area/syndicate_depot/core/proc/despawn_guards() for(var/mob/thismob in list_getmobs(guard_list)) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index ea3b9df4f54..f1e84856b38 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -204,9 +204,6 @@ -/atom/proc/allow_drop() - return 1 - /atom/proc/CheckExit() return 1 @@ -305,6 +302,10 @@ /atom/proc/rpd_act() return +/atom/proc/rpd_blocksusage() + // Atoms that return TRUE prevent RPDs placing any kind of pipes on their turf. + return FALSE + /atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked) if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) @@ -708,4 +709,13 @@ var/list/blood_splatter_icons = list() .["Jump to turf"] = "?_src_=holder;adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]" .["Add reagent"] = "?_src_=vars;addreagent=[UID()]" .["Trigger explosion"] = "?_src_=vars;explode=[UID()]" - .["Trigger EM pulse"] = "?_src_=vars;emp=[UID()]" \ No newline at end of file + .["Trigger EM pulse"] = "?_src_=vars;emp=[UID()]" + +/atom/proc/AllowDrop() + return FALSE + +/atom/proc/drop_location() + var/atom/L = loc + if(!L) + return null + return L.AllowDrop() ? L : get_turf(L) \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 4e467e4eb18..50a578cc3b3 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -428,8 +428,11 @@ flick_overlay(I, viewing, 5) // 5 ticks/half a second // And animate the attack! - animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3) - - + var/t_color = "#ffffff" + if(ismob(src) && ismob(A) && (!used_item)) + var/mob/M = src + t_color = M.a_intent == INTENT_HARM ? "#ff0000" : "#ffffff" + animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3, color = t_color) + /atom/movable/proc/portal_destroyed(obj/effect/portal/P) return diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 354536561c1..c206cc7aab8 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -56,7 +56,7 @@ icon_state = "scanner_open" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 50 active_power_usage = 300 interact_offline = 1 @@ -103,8 +103,8 @@ for(var/obj/item/stock_parts/micro_laser/P in component_parts) damage_coeff = P.rating -/obj/machinery/dna_scannernew/allow_drop() - return 0 +/obj/machinery/dna_scannernew/AllowDrop() + return FALSE /obj/machinery/dna_scannernew/relaymove(mob/user as mob) if(user.stat) @@ -359,7 +359,7 @@ var/obj/item/disk/data/disk = null var/selected_menu_key = null anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 400 var/waiting_for_user_input=0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X @@ -533,7 +533,7 @@ occupantData["name"] = connected.occupant.dna.real_name occupantData["stat"] = connected.occupant.stat occupantData["isViableSubject"] = 1 - if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna) + if((NOCLONE in connected.occupant.mutations && connected.scan_level < 3) || !src.connected.occupant.dna || (NO_DNA in connected.occupant.dna.species.species_traits)) occupantData["isViableSubject"] = 0 occupantData["health"] = connected.occupant.health occupantData["maxHealth"] = connected.occupant.maxHealth diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 37292beb8fe..2e75d15a77d 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -171,11 +171,9 @@ H.visible_message("[user] sprays a cloud of fine ice crystals engulfing, [H]!", "[user] sprays a cloud of fine ice crystals cover your [H.head]'s visor and make it into your air vents!.") add_attack_logs(user, C, "Cryokinesis") - H.bodytemperature = max(0, H.bodytemperature - 50) - H.adjustFireLoss(5) + H.bodytemperature = max(0, H.bodytemperature - 100) if(!handle_suit) - C.bodytemperature = max(0, C.bodytemperature - 100) - C.adjustFireLoss(10) + C.bodytemperature = max(0, C.bodytemperature - 200) C.ExtinguishMob() C.visible_message("[user] sprays a cloud of fine ice crystals, engulfing [C]!") diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 0e1fc7daa86..e17b5098c5c 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -120,4 +120,17 @@ B.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND spawn(0) if(is_offspring) - B.verbs -= /mob/camera/blob/verb/split_consciousness \ No newline at end of file + B.verbs -= /mob/camera/blob/verb/split_consciousness + +/obj/structure/blob/core/proc/lateblobtimer() + addtimer(CALLBACK(src, .proc/lateblobcheck), 50) + +/obj/structure/blob/core/proc/lateblobcheck() + if(overmind) + overmind.add_points(60) + if(overmind.mind) + overmind.mind.special_role = SPECIAL_ROLE_BLOB_OVERMIND + else + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks a overmind.mind.") + else + log_debug("/obj/structure/blob/core/proc/lateblobcheck: Blob core lacks an overmind.") \ No newline at end of file diff --git a/code/game/gamemodes/blob/blobs/storage.dm b/code/game/gamemodes/blob/blobs/storage.dm index f29fb9af405..8c9da104edf 100644 --- a/code/game/gamemodes/blob/blobs/storage.dm +++ b/code/game/gamemodes/blob/blobs/storage.dm @@ -7,7 +7,7 @@ var/mob/camera/blob/overmind = null /obj/structure/blob/storage/update_icon() - if(health <= 0) + if(health <= 0 && !QDELETED(src)) overmind.max_blob_points -= 50 qdel(src) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index c01f335ba08..da5c31fc092 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -81,3 +81,18 @@ if(req_human && !ishuman(user)) return 0 return 1 + +// Transform the target to the chosen dna. Used in transform.dm and tiny_prick.dm (handy for changes since it's the same thing done twice) +/obj/effect/proc_holder/changeling/proc/transform_dna(var/mob/living/carbon/human/H, var/datum/dna/D) + if(!D) + return + + H.set_species(D.species.type) + H.dna = D.Clone() + H.real_name = D.real_name + domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them + H.flavor_text = "" + H.dna.UpdateSE() + H.dna.UpdateUI() + H.sync_organ_dna(1) + H.UpdateAppearance() diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 56417ac4335..8ab09fc781c 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -48,7 +48,7 @@ var/healpertick = -(total_healing / healing_ticks) user.heal_overall_damage((-healpertick/recent_uses), (-healpertick/recent_uses)) user.adjustOxyLoss(healpertick/recent_uses) - user.blood_volume += 30 + user.blood_volume = min(user.blood_volume + 30, BLOOD_VOLUME_NORMAL) user.updatehealth() else break diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm index 60adda8f088..96d4a784f45 100644 --- a/code/game/gamemodes/changeling/powers/headcrab.dm +++ b/code/game/gamemodes/changeling/powers/headcrab.dm @@ -6,6 +6,11 @@ dna_cost = 1 req_human = 1 +/obj/effect/proc_holder/changeling/headcrab/try_to_sting(mob/user, mob/target) + if(alert("Are you sure you wish to do this? This action cannot be undone.",,"Yes","No")=="No") + return + ..() + /obj/effect/proc_holder/changeling/headcrab/sting_action(mob/user) var/datum/mind/M = user.mind var/list/organs = user.get_organs_zone("head", 1) @@ -37,4 +42,4 @@ to_chat(crab, "You burst out of the remains of your former body in a shower of gore!") user.gib() feedback_add_details("changeling_powers","LR") - return 1 + return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 4cf998cf043..b61096a8939 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -25,13 +25,13 @@ if(istype(user.l_hand, weapon_type)) //Not the nicest way to do it, but eh qdel(user.l_hand) if(!silent) - user.visible_message("With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "You hear organic matter ripping and tearing!") user.update_inv_l_hand() return if(istype(user.r_hand, weapon_type)) qdel(user.r_hand) if(!silent) - user.visible_message("With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!", "We assimilate the [weapon_name_simple] back into our body.", "You hear organic matter ripping and tearing!") user.update_inv_r_hand() return ..(user, target) @@ -138,7 +138,7 @@ loc.visible_message("A grotesque blade forms around [loc.name]\'s arm!", "Our arm twists and mutates, transforming it into a deadly blade.", "You hear organic matter ripping and tearing!") /obj/item/melee/arm_blade/dropped(mob/user) - user.visible_message("With a sickening crunch, [user] reforms [user.p_their()] blade into an arm!", "We assimilate the blade back into our body.", "With a sickening crunch, [user] reforms [user.p_their()] blade into an arm!", "We assimilate the blade back into our body.", "You hear organic matter ripping and tearing!") . = ..() /obj/item/melee/arm_blade/afterattack(atom/target, mob/user, proximity) @@ -216,7 +216,7 @@ to_chat(loc, "You prepare to extend a tentacle.") /obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] is not ready yet.") + to_chat(user, "The [name] is not ready yet.") /obj/item/gun/magic/tentacle/suicide_act(mob/user) user.visible_message("[user] coils [src] tightly around [user.p_their()] neck! It looks like [user.p_theyre()] trying to commit suicide.") @@ -315,10 +315,10 @@ on_hit(I) //grab the item as if you had hit it directly with the tentacle return 1 else - to_chat(firer, "You can't seem to pry [I] out of [C]'s hands!") + to_chat(firer, "You can't seem to pry [I] out of [C]'s hands!") return 0 else - to_chat(firer, "[C] has nothing in hand to disarm!") + to_chat(firer, "[C] has nothing in hand to disarm!") return 0 if(INTENT_GRAB) diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index bb216ddad35..58afbb73dfe 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -100,7 +100,6 @@ /obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target) add_attack_logs(user, target, "Transformation sting (changeling) (new identity is [selected_dna.real_name])") - var/datum/dna/NewDNA = selected_dna if(issmall(target)) to_chat(user, "Our genes cry out as we sting [target.name]!") @@ -111,13 +110,7 @@ target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!") spawn(10) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - H.set_species(NewDNA.species.type) - target.dna = NewDNA.Clone() - target.real_name = NewDNA.real_name - target.UpdateAppearance() - domutcheck(target, null) + transform_dna(target,selected_dna)//target is always human so no problem here feedback_add_details("changeling_powers","TS") return TRUE diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index bacdc8b0d8b..8e1334fb30e 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -14,16 +14,8 @@ if(!chosen_dna) return - if(ishuman(user)) - user.set_species(chosen_dna.species.type) - user.dna = chosen_dna.Clone() - user.real_name = chosen_dna.real_name - domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them - user.flavor_text = "" - user.dna.UpdateSE() - user.dna.UpdateUI() - user.sync_organ_dna(1) - user.UpdateAppearance() + + transform_dna(user,chosen_dna) user.changeling_update_languages(changeling.absorbed_languages) diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index c854693c86e..d1350bafc6f 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -36,4 +36,4 @@ else if(M in dead_mob_list) to_chat(M, " (F) [my_message] ") - log_say("(CULT) [message]") \ No newline at end of file + log_say("(CULT) [message]", user) \ No newline at end of file diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 087bfbb4008..9bce3e24ad8 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -739,7 +739,7 @@ var/list/teleport_runes = list() playsound(E, 'sound/effects/EMPulse.ogg', 100, 1) for(var/M in invokers) var/mob/living/L = M - to_chat(L, "You chant in unison and a colossal burst of energy knocks you backward!") + to_chat(L, "You chant in unison and a colossal burst of energy knocks you backward!") L.Weaken(2) qdel(src) //delete before pulsing because it's a delay reee empulse(E, 9*invokers.len, 12*invokers.len, 1) // Scales now, from a single room to most of the station depending on # of chanters diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 760868e8435..e64421f330b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -156,15 +156,7 @@ msg="Task #[count] completed! " if(pay>0) if(M.mind.initial_account) - M.mind.initial_account.money += pay - var/datum/transaction/T = new() - T.target_name = "[command_name()] Payroll" - T.purpose = "Payment" - T.amount = pay - T.date = current_date_string - T.time = station_time_timestamp() - T.source_terminal = "\[CLASSIFIED\] Terminal #[rand(111,333)]" - M.mind.initial_account.transaction_log.Add(T) + M.mind.initial_account.credit(pay, "Payment", "\[CLASSIFIED\] Terminal #[rand(111,333)]", "[command_name()] Payroll") msg += "You have been sent the $[pay], as agreed." else msg += "However, we were unable to send you the $[pay] you're entitled." diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 0c609c818b4..102efcdc898 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -369,6 +369,7 @@ var/round_start_time = 0 if(player.mind.assigned_role == "Captain") captainless=0 if(player.mind.assigned_role != player.mind.special_role) + job_master.AssignRank(player, player.mind.assigned_role, 0) job_master.EquipRank(player, player.mind.assigned_role, 0) EquipCustomItems(player) if(captainless) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 8f4b5dab95e..7c2b44f5cab 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -185,7 +185,7 @@ set name = "Destroy RCDs" set desc = "Detonate all RCDs on the station, while sparing onboard cyborg RCDs." - if(stat || malf_cooldown) + if(stat || malf_cooldown > world.time) return for(var/obj/item/rcd/RCD in rcd_list) @@ -193,9 +193,7 @@ RCD.detonate_pulse() to_chat(src, "RCD detonation pulse emitted.") - malf_cooldown = 1 - spawn(100) - malf_cooldown = 0 + malf_cooldown = world.time + 100 /datum/AI_Module/large/mecha_domination @@ -454,7 +452,7 @@ set name = "Reactivate Cameranet" set category = "Malfunction" - if(stat || malf_cooldown) + if(stat || malf_cooldown > world.time) return var/fixedcams = 0 //Tells the AI how many cams it fixed. Stats are fun. @@ -477,9 +475,7 @@ break to_chat(src, "Diagnostic complete! Operations completed: [fixedcams].") - malf_cooldown = 1 - spawn(30) //Lag protection - malf_cooldown = 0 + malf_cooldown = world.time + 30 /datum/AI_Module/large/upgrade_cameras diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 5d5c3342010..4bfc8c9672d 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -197,17 +197,17 @@ /datum/game_mode/proc/auto_declare_completion_abduction() var/text = "" if(abductors.len) - text += "
The abductors were:" + text += "
The abductors were:
" for(var/datum/mind/abductor_mind in abductors) text += printplayer(abductor_mind) text += printobjectives(abductor_mind) - text += "
" + text += "
" if(abductees.len) - text += "
The abductees were:" + text += "
The abductees were:
" for(var/datum/mind/abductee_mind in abductees) text += printplayer(abductee_mind) text += printobjectives(abductee_mind) - text += "
" + text += "
" to_chat(world, text) //Landmarks diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 9593ee6b792..45998cd4b30 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -363,7 +363,9 @@ if(M.has_brain_worms()) to_chat(src, "[M] is already infested!") return + host = M + add_attack_logs(src, host, "Infested as borer") M.borer = src forceMove(M) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index 68e8c16c5da..9465d479f02 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -415,6 +415,9 @@ failure_message = "...ERROR. BOOT SEQUENCE ABORTED. AI FAILED TO INTIALIZE. PLEASE CONTACT SUPPORT OR TRY AGAIN LATER." ling_failure = "The holoparasites recoil in horror. They want nothing to do with a creature like you." +/obj/item/guardiancreator/tech/check_uplink_validity() + return !used + /obj/item/guardiancreator/tech/choose random = FALSE @@ -439,13 +442,13 @@ info = {"A list of Holoparasite Types

- Chaos: Ignites mobs on touch. teleports them at random on attack. Automatically extinguishes the user if they catch fire.
+ Chaos: Has two modes. Deception: Causes target of attacks to hallucinate. Dispersion: Attacks have a chance to teleport the target randomly. Ignites mobs on touch. Automatically extinguishes the user if they catch fire.

- Standard:Devestating close combat attacks and high damage resist. No special powers.
+ Standard: Devestating close combat attacks and high damage resist. No special powers.

Ranged: Has two modes. Ranged: Extremely weak, highly spammable projectile attack. Scout: Can not attack, but can move through walls. Can lay surveillance snares in either mode.

- Support:Has two modes. Combat: Medium power attacks and damage resist. Healer: Attacks heal damage, but low damage resist and slow movemen. Can deploy a bluespace beacon and warp targets to it (including you) in either mode.
+ Support: Has two modes. Combat: Medium power attacks and damage resist. Healer: Attacks heal damage, but low damage resist and slow movemen. Can deploy a bluespace beacon and warp targets to it (including you) in either mode.

Explosive: High damage resist and medium power attack. Can turn any object into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered.

diff --git a/code/game/gamemodes/miniantags/guardian/types/healer.dm b/code/game/gamemodes/miniantags/guardian/types/healer.dm index c679beac91a..6c784e1ee0a 100644 --- a/code/game/gamemodes/miniantags/guardian/types/healer.dm +++ b/code/game/gamemodes/miniantags/guardian/types/healer.dm @@ -47,8 +47,8 @@ changeNext_move(CLICK_CD_MELEE) if(heal_cooldown <= world.time && !stat) var/mob/living/carbon/C = target - C.adjustBruteLoss(-5) - C.adjustFireLoss(-5) + C.adjustBruteLoss(-5, robotic=1) + C.adjustFireLoss(-5, robotic=1) C.adjustOxyLoss(-5) C.adjustToxLoss(-5) heal_cooldown = world.time + 20 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 17afd375952..65f02aac59c 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -146,6 +146,7 @@ proc/issyndicate(mob/living/M as mob) M.set_species(/datum/species/human, TRUE) M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics + M.dna.species.create_organs(M) M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ops. M.overeatduration = 0 diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 6b78a31dac0..54b9ecc3fc5 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -19,7 +19,7 @@ var/bomb_set var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. var/lastentered var/is_syndicate = 0 - use_power = 0 + use_power = NO_POWER_USE unacidable = 1 var/previous_level = "" var/datum/wires/nuclearbomb/wires = null diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index b7364970351..a0ba4773785 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -329,11 +329,17 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu explanation_text = "Destroy the station with a nuclear device." martyr_compatible = 1 - - /datum/objective/steal var/datum/theft_objective/steal_target martyr_compatible = 0 + var/theft_area + +/datum/objective/steal/proc/get_location() + if(steal_target.location_override) + return steal_target.location_override + var/obj/item/T = locate(steal_target.typepath) + theft_area = get_area(T.loc) + return "[theft_area]" /datum/objective/steal/find_target() var/loop=50 @@ -346,7 +352,9 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu if(O.flags & 2) continue steal_target=O - explanation_text = "Steal [O]." + explanation_text = "Steal [steal_target]. One was last seen in [get_location()]. " + if(islist(O.protected_jobs) && O.protected_jobs.len) + explanation_text += "It may also be in the possession of the [jointext(O.protected_jobs, ", ")]." return explanation_text = "Free Objective." diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 089cad71a3a..ac607d6e01f 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -306,7 +306,7 @@ if(!(objective.check_completion())) return 0 - return 1 + return 1 ///////////////////////////// //Checks for a head victory// diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index ea846e394a5..4cec8b12728 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -22,6 +22,7 @@ charge_max = 300 clothes_req = 0 action_icon_state = "glare" + humans_only = 1 /obj/effect/proc_holder/spell/targeted/glare/cast(list/targets, mob/user = usr) for(var/mob/living/carbon/human/target in targets) @@ -263,6 +264,7 @@ range = 1 //Adjacent to user var/enthralling = 0 action_icon_state = "enthrall" + humans_only = 1 /obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets, mob/user = usr) var/mob/living/carbon/human/ling = user @@ -595,6 +597,7 @@ clothes_req = 0 include_user = 0 action_icon_state = "revive_thrall" + humans_only = 1 /obj/effect/proc_holder/spell/targeted/reviveThrall/cast(list/targets, mob/user = usr) if(!shadowling_check(user)) @@ -751,7 +754,7 @@ playsound(user.loc, 'sound/magic/Staff_Chaos.ogg', 100, 1) for(var/mob/living/boom in targets) if(is_shadow(boom)) //Used to not work on thralls. Now it does so you can PUNISH THEM LIKE THE WRATHFUL GOD YOU ARE. - to_chat(user, "Making an ally explode seems unwise.") + to_chat(user, "Making an ally explode seems unwise.") charge_counter = charge_max return user.visible_message("[user]'s markings flare as [user.p_they()] gesture[user.p_s()] at [boom]!", \ @@ -782,7 +785,7 @@ for(var/mob/living/carbon/human/target in targets) if(is_shadow_or_thrall(target)) - to_chat(user, "You cannot enthrall an ally.") + to_chat(user, "You cannot enthrall an ally.") charge_counter = charge_max return if(!target.ckey || !target.mind) diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index d3f29734815..3d20040f128 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -11,6 +11,7 @@ var/list/protected_jobs = list() var/list/altitems = list() var/flags = 0 + var/location_override /datum/theft_objective/proc/check_completion(var/datum/mind/owner) if(!owner.current) @@ -49,6 +50,7 @@ /datum/theft_objective/ai name = "a functional AI" typepath = /obj/item/aicard + location_override = "AI Satellite. An intellicard for transportation can be found in Tech Storage, Science Department or manufactured" datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C) if(..()) @@ -91,6 +93,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C) name = "a sample of unused slime extract" typepath = /obj/item/slime_extract protected_jobs = list("Research Director","Scientist") + location_override = "Xenobiology" /datum/theft_objective/slime_extract/check_special_completion(var/obj/item/slime_extract/E) if(..()) @@ -169,6 +172,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C) min=28 max=28 protected_jobs = list("Chief Engineer", "Station Engineer", "Scientist", "Research Director", "Life Support Specialist") + location_override = "Engineering or Toxin Mixing" /datum/theft_objective/number/plasma_gas/getAmountStolen(var/obj/item/I) return I:air_contents:toxins diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 0c380010e6a..ff101cbb5c1 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -202,6 +202,14 @@ category = "Mobility" cost = 1 +/datum/spellbook_entry/greaterknock + name = "Greater Knock" + spell_type = /obj/effect/proc_holder/spell/aoe_turf/knock/greater + log_name = "GK" + category = "Mobility" + cost = 2 + refundable = 0 //global effect on cast + /datum/spellbook_entry/fleshtostone name = "Flesh to Stone" spell_type = /obj/effect/proc_holder/spell/targeted/touch/flesh_to_stone @@ -535,7 +543,10 @@ if(istype(O, /obj/item/antag_spawner/slaughter_demon)) to_chat(user, "On second thought, maybe summoning a demon is a bad idea. You refund your points.") - uses+=2 + if(istype(O, /obj/item/antag_spawner/slaughter_demon/laughter)) + uses += 1 + else + uses += 2 for(var/datum/spellbook_entry/item/bloodbottle/BB in entries) if(!isnull(BB.limit)) BB.limit++ diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 0e315e03b2c..5f4483610d2 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -412,8 +412,45 @@ var/global/datum/controller/occupations/job_master return 1 +/datum/controller/occupations/proc/AssignRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + if(!H) + return null + var/datum/job/job = GetJob(rank) -/datum/controller/occupations/proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + H.job = rank + + var/alt_title = null + + if(H.mind) + H.mind.assigned_role = rank + alt_title = H.mind.role_alt_title + + CreateMoneyAccount(H, rank, job) + + to_chat(H, "You are the [alt_title ? alt_title : rank].") + to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") + to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)") + if(job.is_service) + to_chat(H, "As a member of Service, make sure to read up on your Department SOP") + if(job.is_supply) + to_chat(H, "As a member of Supply, make sure to read up on your Department SOP") + if(job.is_command) + to_chat(H, "As an important member of Command, read up on your Department SOP") + if(job.is_legal) + to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure") + if(job.is_engineering) + to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP") + if(job.is_medical) + to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP") + if(job.is_science) + to_chat(H, "As a member of Science, make sure to read up on your Department SOP") + if(job.is_security) + to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP") + if(job.req_admin_notify) + to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") + + return H +/datum/controller/occupations/proc/EquipRank(mob/living/carbon/human/H, rank, joined_late = 0) // Equip and put them in an area if(!H) return null @@ -457,40 +494,11 @@ var/global/datum/controller/occupations/job_master H.buckled.loc = H.loc H.buckled.dir = H.dir - var/alt_title = null - if(H.mind) - H.mind.assigned_role = rank - alt_title = H.mind.role_alt_title - - CreateMoneyAccount(H, rank, job) - if(job) var/new_mob = job.equip(H) if(ismob(new_mob)) H = new_mob - to_chat(H, "You are the [alt_title ? alt_title : rank].") - to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.") - to_chat(H, "For more information on how the station works, see Standard Operating Procedure (SOP)") - if(job.is_service) - to_chat(H, "As a member of Service, make sure to read up on your Department SOP") - if(job.is_supply) - to_chat(H, "As a member of Supply, make sure to read up on your Department SOP") - if(job.is_command) - to_chat(H, "As an important member of Command, read up on your Department SOP") - if(job.is_legal) - to_chat(H, "Your job requires complete knowledge of Space Law and Legal Standard Operating Procedure") - if(job.is_engineering) - to_chat(H, "As a member of Engineering, make sure to read up on your Department SOP") - if(job.is_medical) - to_chat(H, "As a member of Medbay, make sure to read up on your Department SOP") - if(job.is_science) - to_chat(H, "As a member of Science, make sure to read up on your Department SOP") - if(job.is_security) - to_chat(H, "As a member of Security, you are to know Space Law, Legal Standard Operating Procedure, as well as your Department SOP") - if(job.req_admin_notify) - to_chat(H, "You are playing a job that is important for the game progression. If you have to disconnect, please notify the admins via adminhelp.") - if(job && H) job.after_spawn(H) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 661453adfc3..f1171177c42 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -6,9 +6,10 @@ level = 1 // underfloor layer = 2.5 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 0 var/syndicate = 0 + var/area_bypass = FALSE var/obj/item/radio/beacon/Beacon var/enabled = TRUE @@ -22,6 +23,7 @@ Beacon.invisibility = INVISIBILITY_MAXIMUM Beacon.loc = T Beacon.syndicate = syndicate + Beacon.area_bypass = area_bypass hide(T.intact) /obj/machinery/bluespace_beacon/proc/destroy_beacon() @@ -64,6 +66,7 @@ /obj/machinery/bluespace_beacon/syndicate syndicate = TRUE enabled = FALSE + area_bypass = TRUE // This enables teleports to this beacon to bypass the tele_proof flag of /area/s. Intended for depot syndi teleport computer. var/obj/machinery/computer/syndicate_depot/teleporter/mycomputer /obj/machinery/bluespace_beacon/syndicate/New() @@ -74,4 +77,4 @@ /obj/machinery/bluespace_beacon/syndicate/Destroy() if(mycomputer) mycomputer.mybeacon = null - return ..() \ No newline at end of file + return ..() diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm index dc06a13e076..5fb11e932c2 100644 --- a/code/game/machinery/Freezer.dm +++ b/code/game/machinery/Freezer.dm @@ -5,7 +5,7 @@ density = 1 var/min_temperature = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE current_heat_capacity = 1000 layer = 3 armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 360d5cc5aff..49ab34601b5 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -5,7 +5,7 @@ icon_state = "table2-idle" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 1 active_power_usage = 5 var/mob/living/carbon/human/victim = null diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 44ef4ee26da..c964fd1f688 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -420,7 +420,7 @@ /obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount) if(!(chemical in injection_chems)) - to_chat(user, "The sleeper does not offer that chemical!") + to_chat(user, "The sleeper does not offer that chemical!") return if(occupant) @@ -519,8 +519,8 @@ return return -/obj/machinery/sleeper/allow_drop() - return 0 +/obj/machinery/sleeper/AllowDrop() + return FALSE /obj/machinery/sleeper/verb/move_inside() set name = "Enter Sleeper" diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index de32918c068..e9201838763 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -75,7 +75,7 @@ icon = 'icons/obj/monitors.dmi' icon_state = "alarm0" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 4 active_power_usage = 8 power_channel = ENVIRON diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 9ad575f74d7..78b94f969fd 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -74,7 +74,7 @@ var/datum/canister_icons/canister_icon_container = new() pressure_resistance = 7*ONE_ATMOSPHERE var/temperature_resistance = 1000 + T0C volume = 1000 - use_power = 0 + use_power = NO_POWER_USE interact_offline = 1 var/release_log = "" var/busy = 0 diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 03fa12a1c26..d3d23e96bba 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -10,7 +10,7 @@ var/frequency = 0 var/id var/id_tag - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 5 req_one_access_txt = "24;10" diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 34088a6314c..dfecc3a4409 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -1,6 +1,6 @@ /obj/machinery/portable_atmospherics name = "atmoalter" - use_power = 0 + use_power = NO_POWER_USE armor = list(melee = 0, bullet = 0, laser = 0, energy = 100, bomb = 0, bio = 100, rad = 100) var/datum/gas_mixture/air_contents = new diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 81ee03c5ee8..a0e9ee978dd 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -21,7 +21,7 @@ var/hack_wire var/disable_wire var/shock_wire - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 var/busy = 0 diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 5382c9ec429..a76bd387ac7 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -12,7 +12,7 @@ var/active = 0 settagwhitelist = list("id_tag", "logic_id_tag") anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 var/range = 7 @@ -162,7 +162,7 @@ var/id = null var/active = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 @@ -201,4 +201,4 @@ sleep(50) icon_state = "launcherbtt" - active = 0 \ No newline at end of file + active = 0 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index e555ee91ce8..07f22d8373e 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -3,7 +3,7 @@ desc = "It's used to monitor rooms." icon = 'icons/obj/monitors.dmi' icon_state = "camera" - use_power = 2 + use_power = ACTIVE_POWER_USE idle_power_usage = 5 active_power_usage = 10 layer = WALL_OBJ_LAYER diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 8baf02088bb..03ebe757789 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -1,25 +1,25 @@ +#define ASSEMBLY_UNBUILT 0 // Nothing done to it +#define ASSEMBLY_WRENCHED 1 // Wrenched in place +#define ASSEMBLY_WELDED 2 // Welded in place +#define ASSEMBLY_WIRED 3 // Wires attached (Upgradable now) +#define ASSEMBLY_BUILT 4 // Fully built (incl panel closed) + /obj/item/camera_assembly name = "camera assembly" desc = "A pre-fabricated security camera kit, ready to be assembled and mounted to a surface." icon = 'icons/obj/monitors.dmi' icon_state = "cameracase" w_class = WEIGHT_CLASS_SMALL - anchored = 0 + anchored = FALSE materials = list(MAT_METAL=400, MAT_GLASS=250) max_integrity = 150 can_be_hit = TRUE // Motion, EMP-Proof, X-Ray var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer) var/list/upgrades = list() - var/state = 0 - var/busy = 0 - /* - 0 = Nothing done to it - 1 = Wrenched in place - 2 = Welded in place - 3 = Wires attached to it (you can now attach/dettach upgrades) - 4 = Screwdriver panel closed and is fully built (you cannot attach upgrades) - */ + var/state = ASSEMBLY_UNBUILT + var/busy = FALSE + /obj/item/camera_assembly/Destroy() QDEL_LIST(upgrades) @@ -28,74 +28,72 @@ /obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params) switch(state) - if(0) + if(ASSEMBLY_UNBUILT) // State 0 if(iswrench(I) && isturf(loc)) playsound(loc, I.usesound, 50, 1) - to_chat(user, "You wrench the assembly into place.") + to_chat(user, "You wrench the assembly into place.") anchored = 1 - state = 1 + state = ASSEMBLY_WRENCHED update_icon() auto_turn() return - if(1) + if(ASSEMBLY_WRENCHED) // State 1 if(iswelder(I)) if(weld(I, user)) - to_chat(user, "You weld the assembly securely into place.") - anchored = 1 - state = 2 + to_chat(user, "You weld the assembly securely into place.") + anchored = TRUE + state = ASSEMBLY_WELDED return else if(iswrench(I)) playsound(loc, I.usesound, 50, 1) - to_chat(user, "You unattach the assembly from it's place.") - anchored = 0 + to_chat(user, "You unattach the assembly from it's place.") + anchored = FALSE update_icon() - state = 0 + state = ASSEMBLY_UNBUILT return - if(2) - // State 2 + if(ASSEMBLY_WELDED) if(iscoil(I)) var/obj/item/stack/cable_coil/C = I if(C.use(2)) to_chat(user, "You add wires to the assembly.") playsound(loc, I.usesound, 50, 1) - state = 3 + state = ASSEMBLY_WIRED else to_chat(user, "You need 2 coils of wire to wire the assembly.") return else if(iswelder(I)) if(weld(I, user)) - to_chat(user, "You unweld the assembly from it's place.") - state = 1 - anchored = 1 + to_chat(user, "You unweld the assembly from it's place.") + state = ASSEMBLY_WRENCHED + anchored = TRUE return - if(3) - // State 3 + if(ASSEMBLY_WIRED) if(isscrewdriver(I)) playsound(loc, I.usesound, 50, 1) var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) if(!input) - to_chat(usr, "No input found please hang up and try your call again.") + to_chat(usr, "No input found please hang up and try your call again.") return var/list/tempnetwork = splittext(input, ",") if(tempnetwork.len < 1) - to_chat(usr, "No network found please hang up and try your call again.") + to_chat(usr, "No network found please hang up and try your call again.") return var/area/camera_area = get_area(src) var/temptag = "[sanitize(camera_area.name)] ([rand(1, 999)])" input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag)) - state = 4 + state = ASSEMBLY_BUILT var/obj/machinery/camera/C = new(loc) loc = C C.assembly = src @@ -104,7 +102,7 @@ C.network = uniquelist(tempnetwork) tempnetwork = difflist(C.network,restricted_camera_networks) - if(!tempnetwork.len)//Camera isn't on any open network - remove its chunk from AI visibility. + if(!tempnetwork.len) // Camera isn't on any open network - remove its chunk from AI visibility. cameranet.removeCamera(C) C.c_tag = input @@ -122,8 +120,8 @@ else if(iswirecutter(I)) new/obj/item/stack/cable_coil(get_turf(src), 2) playsound(loc, I.usesound, 50, 1) - to_chat(user, "You cut the wires from the circuits.") - state = 2 + to_chat(user, "You cut the wires from the circuits.") + state = ASSEMBLY_WELDED return // Upgrades! @@ -131,7 +129,7 @@ if(!user.unEquip(I)) to_chat(user, "[I] is stuck!") return - to_chat(user, "You attach [I] into the assembly inner circuits.") + to_chat(user, "You attach [I] into the assembly inner circuits.") upgrades += I user.drop_item() I.loc = src @@ -141,7 +139,7 @@ else if(iscrowbar(I) && upgrades.len) var/obj/U = locate(/obj) in upgrades if(U) - to_chat(user, "You unattach an upgrade from the assembly.") + to_chat(user, "You unattach an upgrade from the assembly.") playsound(loc, I.usesound, 50, 1) U.loc = get_turf(src) upgrades -= U @@ -161,23 +159,29 @@ ..() /obj/item/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user) - if(busy) - return 0 + return FALSE if(!WT.remove_fuel(0, user)) - return 0 + return FALSE - to_chat(user, "You start to weld the [src]..") + to_chat(user, "You start to weld the [src]...") playsound(loc, WT.usesound, 50, 1) - busy = 1 + busy = TRUE if(do_after(user, 20 * WT.toolspeed, target = src)) - busy = 0 + busy = FALSE if(!WT.isOn()) - return 0 - return 1 - busy = 0 - return 0 + return FALSE + return TRUE + busy = FALSE + return FALSE /obj/item/camera_assembly/deconstruct(disassembled = TRUE) new /obj/item/stack/sheet/metal(loc) - qdel(src) \ No newline at end of file + qdel(src) + + +#undef ASSEMBLY_UNBUILT +#undef ASSEMBLY_WRENCHED +#undef ASSEMBLY_WELDED +#undef ASSEMBLY_WIRED +#undef ASSEMBLY_BUILT diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 6b728f2a20b..d85a89606ea 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/power.dmi' icon_state = "ccharger0" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 60 power_channel = EQUIP @@ -123,4 +123,4 @@ use_power(200) //this used to use CELLRATE, but CELLRATE is fucking awful. feel free to fix this properly! charging.give(175) //inefficiency. - updateicon() \ No newline at end of file + updateicon() diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm index cf34302f118..5d5e6bd9511 100644 --- a/code/game/machinery/computer/HolodeckControl.dm +++ b/code/game/machinery/computer/HolodeckControl.dm @@ -515,7 +515,7 @@ var/eventstarted = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 21d061bfd45..a332e7df7c8 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -116,7 +116,10 @@ /obj/machinery/computer/security/proc/get_user_access(mob/user) var/list/access = list() - if(ishuman(user)) + + if(emagged) + access = get_all_accesses() // Assume captain level access when emagged + else if(ishuman(user)) access = user.get_access() else if((isAI(user) || isrobot(user)) && CanUseTopic(user, default_state) == STATUS_INTERACTIVE) access = get_all_accesses() // Assume captain level access when AI @@ -159,7 +162,6 @@ var/list/access = get_user_access(user) if(emagged) - access = get_all_accesses() // Assume captain level access when emagged data["emagged"] = 1 var/list/networks_list = list() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 0f565d2eb3d..51c55ffd84a 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -107,7 +107,7 @@ var/time_last_changed_position = 0 set name = "Eject ID Card" set src in oview(1) - if(usr.restrained()) + if(usr.incapacitated()) return if(scan) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index cfddc393875..9afe0113cc4 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -4,7 +4,7 @@ icon_state = "computer" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 300 active_power_usage = 300 var/obj/item/circuitboard/circuit = null //if circuit==null, computer can't disassembly diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index f3f4ec8fc3d..4efdcb69ee8 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -3,7 +3,7 @@ desc = "Used to monitor active health sensors built into most of the crew's uniforms." icon_keyboard = "med_key" icon_screen = "crew" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 250 active_power_usage = 500 light_color = LIGHT_COLOR_DARKBLUE @@ -33,4 +33,4 @@ crew_monitor.ui_interact(user, ui_key, ui, force_open) /obj/machinery/computer/crew/interact(mob/user) - crew_monitor.ui_interact(user) \ No newline at end of file + crew_monitor.ui_interact(user) diff --git a/code/game/machinery/computer/depot.dm b/code/game/machinery/computer/depot.dm index 6bd5eadc822..78a8a8a69ab 100644 --- a/code/game/machinery/computer/depot.dm +++ b/code/game/machinery/computer/depot.dm @@ -138,6 +138,7 @@ if(depotarea) depotarea.toggle_door_locks(src) to_chat(user, "Door locks toggled.") + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/doors/secondary(mob/user, subcommand) if(..()) @@ -145,6 +146,7 @@ if(depotarea) depotarea.toggle_falsewalls(src) to_chat(user, "False walls toggled.") + playsound(user, sound_yes, 50, 0) // Engineering AKA self destruct computer, no useful functions, just a trap for the people who can't resist pushing dangerous-sounding buttons. @@ -167,9 +169,9 @@ if(depotarea.used_self_destruct) playsound(user, sound_no, 50, 0) return - playsound(user, sound_click, 20, 1) if(depotarea) depotarea.activate_self_destruct("Fusion reactor containment field disengaged. All hands, evacuate. All hands, evacuate!", TRUE, user) + playsound(user, sound_click, 20, 1) // Shield computer, used to manipulate base shield, and armory shield @@ -285,6 +287,7 @@ to_chat(user, "[src] requires authentication with syndicate codewords, which you do not know.") raise_alert("Detected unauthorized access by [user] to [src]!") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/syndiecomms/secondary(mob/user, subcommand) if(..()) @@ -319,6 +322,7 @@ else to_chat(user, "ERROR: [src] is unable to uplink to depot network.") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/syndiecomms/proc/grant_syndie_faction(mob/user) user.faction += "syndicate" @@ -347,7 +351,7 @@ icon_screen = "telesci" icon_keyboard = "teleport_key" var/obj/machinery/bluespace_beacon/syndicate/mybeacon - var/obj/effect/portal/myportal + var/obj/effect/portal/redspace/myportal var/portal_enabled = FALSE var/portaldir = WEST @@ -401,10 +405,8 @@ if(!tele_target) return var/turf/portal_turf = get_step(src, portaldir) - var/obj/effect/portal/P = new(portal_turf, tele_target, src, 0) + var/obj/effect/portal/redspace/P = new(portal_turf, tele_target, src, 0) myportal = P - P.failchance = 0 - P.icon_state = "portal1" var/area/A = get_area(tele_target) P.name = "[A] portal" else if(!portal_enabled && myportal) @@ -432,6 +434,7 @@ var/bresult = mybeacon.toggle() to_chat(user, "Syndicate Teleporter Beacon: [bresult ? "ON" : "OFF"]") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/teleporter/secondary(mob/user) if(..()) @@ -444,6 +447,7 @@ toggle_portal() to_chat(user, "Outgoing Teleport Portal: [portal_enabled ? "ON" : "OFF"]") updateUsrDialog() + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/teleporter/proc/toggle_portal() portal_enabled = !portal_enabled @@ -507,6 +511,7 @@ if(depotarea) depotarea.reset_alert() to_chat(user, "Alert level reset.") + playsound(user, sound_yes, 50, 0) /obj/machinery/computer/syndicate_depot/aiterminal/secondary(mob/user) if(..()) @@ -516,4 +521,5 @@ new /obj/effect/portal(get_turf(B)) to_chat(user, "[B] has been recalled.") qdel(B) - raise_alert("Sentry bot removed via emergency recall.") \ No newline at end of file + raise_alert("Sentry bot removed via emergency recall.") + playsound(user, sound_yes, 50, 0) \ No newline at end of file diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 08f7a45221d..2fa4e6f1177 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -3,7 +3,7 @@ desc = "Used to monitor power levels across the station." icon_screen = "power" icon_keyboard = "power_key" - use_power = 2 + use_power = ACTIVE_POWER_USE idle_power_usage = 20 active_power_usage = 80 light_color = LIGHT_COLOR_ORANGE diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 7537c0abdb2..5c26f423e96 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -50,7 +50,7 @@ /obj/machinery/computer/secure_data/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - ui = new(user, src, ui_key, "secure_data.tmpl", name, 800, 380) + ui = new(user, src, ui_key, "secure_data.tmpl", name, 800, 800) ui.open() /obj/machinery/computer/secure_data/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 4c437be1146..953a476d1a8 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -4,7 +4,7 @@ icon_state = "box_0" density = 1 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE var/obj/item/circuitboard/circuit = null var/list/components = null var/list/req_components = null @@ -655,11 +655,11 @@ obj/item/circuitboard/rdserver build_path = /obj/machinery/mecha_part_fabricator/spacepod board_type = "machine" origin_tech = "programming=2;engineering=2" - frame_desc = "Requires 3 Matter Bins, 2 Manipulators, 2 Micro-Lasers, and 1 Console Screen." + frame_desc = "Requires 2 Matter Bins, 1 Manipulators, 1 Micro-Lasers, and 1 Console Screen." req_components = list( - /obj/item/stock_parts/matter_bin = 3, - /obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/micro_laser = 2, + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stock_parts/micro_laser = 1, /obj/item/stock_parts/console_screen = 1) diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 2cf9de49571..e4bdd652998 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -123,7 +123,7 @@ ..() if(autoeject) if(occupant) - if(!occupant.has_organic_damage()) + if(!occupant.has_organic_damage() && !occupant.has_mutated_organs()) on = 0 go_out() playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) @@ -149,8 +149,8 @@ parent.update = 1 -/obj/machinery/atmospherics/unary/cryo_cell/allow_drop() - return 0 +/obj/machinery/atmospherics/unary/cryo_cell/AllowDrop() + return FALSE /obj/machinery/atmospherics/unary/cryo_cell/relaymove(mob/user as mob) @@ -367,7 +367,7 @@ if(air_contents.total_moles() < 10) return if(occupant) - if(occupant.stat == 2 || occupant.health >= 100) //Why waste energy on dead or healthy people + if(occupant.stat == 2 || (occupant.health >= 100 && !occupant.has_mutated_organs())) //Why waste energy on dead or healthy people occupant.bodytemperature = T0C return occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity()) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 00cddbb9c23..879773c3850 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -27,7 +27,7 @@ */ anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 @@ -62,7 +62,7 @@ req_access = list() req_one_access = list() playsound(loc, "sparks", 100, 1) - + /obj/machinery/door_control/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) return attack_hand(user) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 4de934f1c96..a076fcec8fd 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -306,6 +306,10 @@ About the new airlock wires panel: else return 0 +//Checks if the user can get shocked and shocks him if it can. Returns TRUE if it happened +/obj/machinery/door/airlock/proc/shock_user(mob/user, prob) + return (!issilicon(user) && isElectrified() && shock(user, prob)) + /obj/machinery/door/airlock/update_icon(state=0, override=0) if(operating && !override) return @@ -630,11 +634,25 @@ About the new airlock wires panel: return ..() /obj/machinery/door/airlock/attack_hand(mob/user) - if(!issilicon(user)) - if(isElectrified()) - if(shock(user, 100)) - return + if(shock_user(user, 100)) + return + if(headbutt_airlock(user)) + return//Smack that head against that airlock + if(remove_airlock_note(user, FALSE)) + return + + if(panel_open) + if(security_level) + to_chat(user, "Wires are protected!") + return + wires.Interact(user) + else + ..() + + +//Checks if the user can headbutt the airlock and does it if it can. Returns TRUE if it happened +/obj/machinery/door/airlock/proc/headbutt_airlock(mob/user) if(ishuman(user) && prob(40) && density) var/mob/living/carbon/human/H = user if(H.getBrainLoss() >= 60 && Adjacent(user)) @@ -648,15 +666,23 @@ About the new airlock wires panel: H.UpdateDamageIcon() else visible_message("[user] headbutts the airlock. Good thing [user.p_theyre()] wearing a helmet.") - return + return TRUE + return FALSE +//For the tools being used on the door. Since you don't want to call the attack_hand method if you're using hands. That would be silly +//Also it's a bit inconsistent that when you access the panel you headbutt it. But not while crowbarring +//Try to interact with the panel. If the user can't it'll try activating the door +/obj/machinery/door/airlock/proc/interact_with_panel(mob/user) + if(shock_user(user, 100)) + return + if(panel_open) if(security_level) to_chat(user, "Wires are protected!") return wires.Interact(user) else - ..() + try_to_activate_door(user) /obj/machinery/door/airlock/CanUseTopic(mob/user) if(!issilicon(user) && !isobserver(user)) @@ -777,13 +803,14 @@ About the new airlock wires panel: return 1 /obj/machinery/door/airlock/attackby(obj/item/C, mob/user, params) - if(!issilicon(user)) - if(isElectrified()) - if(shock(user, 75)) - return + if(shock_user(user, 75)) + return add_fingerprint(user) + if(headbutt_airlock(user))//See if the user headbutts the airlock + return + if(panel_open) switch(security_level) if(AIRLOCK_SECURITY_NONE) @@ -922,23 +949,19 @@ About the new airlock wires panel: update_icon() else if(iswirecutter(C)) if(note) - user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].") - playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) - note.forceMove(get_turf(user)) - note = null - update_icon() + remove_airlock_note(user, TRUE) else - return attack_hand(user) + return interact_with_panel(user) else if(ismultitool(C)) - return attack_hand(user) + return interact_with_panel(user) else if(istype(C, /obj/item/assembly/signaler)) - return attack_hand(user) + return interact_with_panel(user) else if(istype(C, /obj/item/pai_cable)) // -- TLE var/obj/item/pai_cable/cable = C cable.plugin(src, user) else if(istype(C, /obj/item/paper) || istype(C, /obj/item/photo)) if(note) - to_chat(user, "There's already something pinned to this airlock! Use wirecutters to remove it.") + to_chat(user, "There's already something pinned to this airlock! Use wirecutters or your hands to remove it.") return if(!user.unEquip(C)) to_chat(user, "For some reason, you can't attach [C]!") @@ -1294,6 +1317,23 @@ About the new airlock wires panel: else if(istype(note, /obj/item/photo)) return "photo" +//Removes the current note on the door if any. Returns if a note is removed +/obj/machinery/door/airlock/proc/remove_airlock_note(mob/user, wirecutters_used=TRUE) + if(note) + if(!wirecutters_used) + if (ishuman(user) && user.a_intent == INTENT_GRAB)//grab that note + user.visible_message("[user] removes [note] from [src].", "You remove [note] from [src].") + playsound(src, 'sound/items/poster_ripped.ogg', 50, 1) + else return FALSE + else + user.visible_message("[user] cuts down [note] from [src].", "You remove [note] from [src].") + playsound(src, 'sound/items/Wirecutter.ogg', 50, 1) + note.forceMove(get_turf(user)) + note = null + update_icon() + return TRUE + return FALSE + /obj/machinery/door/airlock/narsie_act() var/turf/T = get_turf(src) var/runed = prob(20) diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm index 52b11da599b..1519981dfc7 100644 --- a/code/game/machinery/dye_generator.dm +++ b/code/game/machinery/dye_generator.dm @@ -4,7 +4,7 @@ icon_state = "barbervend" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/dye_color = "#FFFFFF" diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 889263da2f8..23ee6e19403 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -4,7 +4,7 @@ name = "Embedded Controller" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/on = 1 diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index b3664c58cd6..9528b527d6e 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -13,7 +13,7 @@ FIRE ALARM var/lockdownbyai = 0 anchored = 1.0 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 power_channel = ENVIRON @@ -70,7 +70,7 @@ FIRE ALARM /obj/machinery/firealarm/attackby(obj/item/I, mob/user, params) add_fingerprint(user) - if(iswirecutter(I) && buildstage == 2) + if(isscrewdriver(I) && buildstage == 2) wiresexposed = !wiresexposed update_icon() return @@ -281,7 +281,7 @@ Just a object used in constructing fire alarms var/timing = 0.0 var/lockdownbyai = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 7a13b0bf796..23eafe8874b 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -121,7 +121,7 @@ var/id = null var/active = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 8ac57a5cec6..013be887cce 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -1,23 +1,22 @@ -//these are probably broken - /obj/machinery/floodlight - name = "Emergency Floodlight" + name = "emergency floodlight" icon = 'icons/obj/machines/floodlight.dmi' icon_state = "flood00" - anchored = 0 - density = 1 - var/on = 0 + anchored = FALSE + density = TRUE + light_power = 20 + var/on = FALSE var/obj/item/stock_parts/cell/high/cell = null var/use = 5 - var/unlocked = 0 - var/open = 0 + var/unlocked = FALSE + var/open = FALSE var/brightness_on = 14 - light_power = 20 - //var/brightness_on = 999 //can't remember what the maxed out value is //Lighting overhaul: No max, stop TRYING TO ILLUMINATE MORE TILES THAN THE MAP CONSISTS OF. -/obj/machinery/floodlight/New() + +/obj/machinery/floodlight/Initialize() + . = ..() src.cell = new(src) - ..() + mapVarInit() /obj/machinery/floodlight/Destroy() QDEL_NULL(cell) @@ -30,13 +29,12 @@ if(on) cell.charge -= use if(cell.charge <= 0) - on = 0 + on = FALSE updateicon() set_light(0) src.visible_message("[src] shuts down due to lack of power!") - return -/obj/machinery/floodlight/attack_ai(mob/user as mob) +/obj/machinery/floodlight/attack_ai() return /obj/machinery/floodlight/attack_hand(mob/user as mob) @@ -51,25 +49,33 @@ cell.update_icon() src.cell = null - to_chat(user, "You remove the power cell") + to_chat(user, "You remove the power cell.") updateicon() return if(on) - on = 0 - to_chat(user, "You turn off the light") + on = FALSE + to_chat(user, "You turn off the light.") set_light(0) else if(!cell) return if(cell.charge <= 0) return - on = 1 - to_chat(user, "You turn on the light") + on = TRUE + to_chat(user, "You turn on the light.") set_light(brightness_on) updateicon() +/obj/machinery/floodlight/proc/mapVarInit() + if(on) + if(!cell) + return + if(cell.charge <= 0) + return + set_light(brightness_on) + updateicon() /obj/machinery/floodlight/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/wrench)) @@ -79,32 +85,32 @@ "[user] tightens \the [src]'s casters.", \ " You have tightened \the [src]'s casters.", \ "You hear ratchet.") - anchored = 1 + anchored = TRUE else if(anchored) playsound(src.loc, W.usesound, 50, 1) user.visible_message( \ "[user] loosens \the [src]'s casters.", \ " You have loosened \the [src]'s casters.", \ "You hear ratchet.") - anchored = 0 + anchored = FALSE if(istype(W, /obj/item/screwdriver)) if(!open) if(unlocked) - unlocked = 0 + unlocked = FALSE to_chat(user, "You screw the battery panel in place.") else - unlocked = 1 + unlocked = TRUE to_chat(user, "You unscrew the battery panel.") if(istype(W, /obj/item/crowbar)) if(unlocked) if(open) - open = 0 + open = FALSE overlays = null to_chat(user, "You crowbar the battery panel in place.") else if(unlocked) - open = 1 + open = TRUE to_chat(user, "You remove the battery panel.") if(istype(W, /obj/item/stock_parts/cell)) diff --git a/code/game/machinery/gameboard.dm b/code/game/machinery/gameboard.dm index 526a935cf90..ab93e69f36d 100644 --- a/code/game/machinery/gameboard.dm +++ b/code/game/machinery/gameboard.dm @@ -5,7 +5,7 @@ desc = "A holographic table allowing the crew to have fun(TM) on boring shifts! One player per board." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/cooling_down = 0 light_color = LIGHT_COLOR_LIGHTBLUE @@ -100,4 +100,4 @@ if(default_deconstruction_crowbar(I, ignore_panel = TRUE)) return else - return ..() \ No newline at end of file + return ..() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index bda66a55622..405182d8874 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -40,7 +40,7 @@ var/list/holopads = list() desc = "It's a floor-mounted device for projecting holographic images." icon_state = "holopad0" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. @@ -386,7 +386,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/proc/SetLightsAndPower() var/total_users = masters.len + LAZYLEN(holo_calls) - use_power = HOLOPAD_PASSIVE_POWER_USAGE + HOLOGRAM_POWER_USAGE * total_users + use_power = total_users > 0 ? ACTIVE_POWER_USE : IDLE_POWER_USE + active_power_usage = HOLOPAD_PASSIVE_POWER_USAGE + (HOLOGRAM_POWER_USAGE * total_users) if(total_users) set_light(2) icon_state = "holopad1" diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 4958cdf60f6..713e29abf8a 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -41,7 +41,7 @@ var/id = null var/active = 0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 22d1177c437..87ec7974711 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -7,7 +7,7 @@ var/id = null var/on = 1.0 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 4 diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index fcf8de24ca5..6f080b8351b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -100,7 +100,7 @@ Class Procs: layer = BELOW_OBJ_LAYER var/stat = 0 var/emagged = 0 - var/use_power = 1 + var/use_power = IDLE_POWER_USE //0 = dont run the auto //1 = run auto, use idle //2 = run auto, use active @@ -210,9 +210,9 @@ Class Procs: /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return 0 - if(use_power == 1) + if(use_power == IDLE_POWER_USE) use_power(idle_power_usage,power_channel, 1) - else if(use_power >= 2) + else if(use_power >= ACTIVE_POWER_USE) use_power(active_power_usage,power_channel, 1) return 1 diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 0ff8847a8d8..09774a6d600 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -13,7 +13,7 @@ level = 1 // underfloor layer = 2.5 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 50 var/freq = 1449 // radio frequency @@ -151,10 +151,10 @@ // Update power usage: if(on) - use_power = 2 + use_power = ACTIVE_POWER_USE active_power_usage = electricity_level*15 else - use_power = 0 + use_power = NO_POWER_USE // Overload conditions: @@ -199,7 +199,7 @@ icon_state = "airlock_control_standby" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 45 var/frequency = 1449 var/code = 0 @@ -404,26 +404,3 @@ rpath += copytext(path, i, i+1) // else, add to list // there doesn't HAVE to be separators but it makes paths syntatically visible - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index 8021816cb40..8bc5976d638 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/objects.dmi' icon_state = "mass_driver" anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 50 @@ -215,4 +215,4 @@ return src.dir = turn(src.dir, -90) - return \ No newline at end of file + return diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 270b2a99411..e84d0778ef3 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -140,6 +140,7 @@ //update the name and icon of the pipe item depending on the type /obj/item/pipe/rpd_act(mob/user, obj/item/rpd/our_rpd) + . = TRUE if(our_rpd.mode == RPD_ROTATE_MODE) rotate() else if(our_rpd.mode == RPD_FLIP_MODE) @@ -147,7 +148,7 @@ else if(our_rpd.mode == RPD_DELETE_MODE) our_rpd.delete_single_pipe(user, src) else - ..() + return ..() /obj/item/pipe/proc/update(var/obj/machinery/atmospherics/make_from) name = "[get_pipe_name(pipe_type, PIPETYPE_ATMOS)] fitting" diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 43613ef4990..1b3dfe19001 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -87,15 +87,11 @@ var/obj/item/pipe/P = new (loc, pipe_type=p_type, dir=p_dir) P.update() P.add_fingerprint(usr) - wait = 1 - spawn(10) - wait = 0 + wait = world.time + 10 if(href_list["makemeter"]) - if(!wait) + if(wait < world.time) new /obj/item/pipe_meter(loc) - wait = 1 - spawn(15) - wait = 0 + wait = world.time + 15 if(href_list["makegsensor"]) if(!wait) new /obj/item/pipe_gsensor(loc) @@ -192,12 +188,10 @@ usr.set_machine(src) add_fingerprint(usr) - if(!wait) + if(wait < world.time) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new(loc, p_type) if(p_type in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)) C.density = TRUE C.add_fingerprint(usr) - wait = 1 - spawn(15) - wait = 0 + wait = world.time + 15 diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index a148a3c40f5..53e406cf433 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -9,7 +9,7 @@ icon_state = "turretCover" anchored = 1 density = 0 - use_power = 1 //this turret uses and requires power + use_power = IDLE_POWER_USE //this turret uses and requires power idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power power_channel = EQUIP //drains power from the EQUIPMENT channel @@ -997,7 +997,7 @@ var/list/turret_icons syndicate = 1 installation = null always_up = 1 - use_power = 0 + use_power = NO_POWER_USE has_cover = 0 raised = 1 scan_range = 9 @@ -1013,15 +1013,14 @@ var/list/turret_icons check_anomalies = 1 check_synth = 1 ailock = 1 + var/area/syndicate_depot/core/depotarea /obj/machinery/porta_turret/syndicate/die() . = ..() - var/area/syndicate_depot/core/depotarea = areaMaster if(istype(depotarea)) depotarea.turret_died() /obj/machinery/porta_turret/syndicate/shootAt(mob/living/target) - var/area/syndicate_depot/core/depotarea = areaMaster if(istype(depotarea)) depotarea.list_add(target, depotarea.hostile_list) depotarea.declare_started() diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 29c43304b38..672402ac351 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "qpad-idle" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 200 active_power_usage = 5000 var/teleport_cooldown = 400 //30 seconds base due to base parts @@ -132,6 +132,7 @@ playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) flick("qpad-beam", linked_pad) playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5) + var/tele_success = TRUE for(var/atom/movable/ROI in get_turf(src)) // if is anchored, don't let through if(ROI.anchored) @@ -145,4 +146,6 @@ continue else if(!isobserver(ROI)) continue - do_teleport(ROI, get_turf(linked_pad)) + tele_success = do_teleport(ROI, get_turf(linked_pad)) + if(!tele_success) + to_chat(user, "Teleport failed due to bluespace interference.") diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index abc8d137679..8c061800020 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -4,7 +4,7 @@ icon_state = "recharger0" desc = "A charging dock for energy based weaponry." anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 4 active_power_usage = 250 var/obj/item/charging = null @@ -48,7 +48,7 @@ return 1 G.forceMove(src) charging = G - use_power = 2 + use_power = ACTIVE_POWER_USE update_icon() else to_chat(user, "[src] isn't connected to anything!") @@ -66,7 +66,7 @@ charging.forceMove(loc) user.put_in_hands(charging) charging = null - use_power = 1 + use_power = IDLE_POWER_USE update_icon() /obj/machinery/recharger/attack_tk(mob/user) @@ -74,7 +74,7 @@ charging.update_icon() charging.forceMove(loc) charging = null - use_power = 1 + use_power = IDLE_POWER_USE update_icon() /obj/machinery/recharger/process() diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index f987b698772..7e3bafbdc39 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -4,7 +4,7 @@ icon_state = "borgcharger0" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 1000 var/mob/occupant = null @@ -109,8 +109,8 @@ /obj/machinery/recharge_station/Bumped(var/mob/AM) move_inside(AM) -/obj/machinery/recharge_station/allow_drop() - return 0 +/obj/machinery/recharge_station/AllowDrop() + return FALSE /obj/machinery/recharge_station/relaymove(mob/user as mob) if(user.stat) @@ -177,7 +177,7 @@ occupant.forceMove(loc) occupant = null build_icon() - use_power = 1 + use_power = IDLE_POWER_USE return /obj/machinery/recharge_station/proc/restock_modules() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 6d79a65dcbd..b655635ba1a 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -4,14 +4,14 @@ icon = 'icons/effects/effects.dmi' icon_state = "shield-old" density = 1 - opacity = 0 + opacity = FALSE anchored = 1 unacidable = 1 var/const/max_health = 200 var/health = max_health //The shield can only take so much beating (prevents perma-prisons) /obj/machinery/shield/New() - src.dir = pick(1,2,3,4) + dir = pick(NORTH, SOUTH, EAST, WEST) ..() /obj/machinery/shield/Initialize() @@ -19,7 +19,7 @@ ..() /obj/machinery/shield/Destroy() - opacity = 0 + opacity = FALSE density = 0 air_update_turf(1) return ..() @@ -30,43 +30,48 @@ move_update_air(T) /obj/machinery/shield/CanPass(atom/movable/mover, turf/target, height) - if(!height) return 0 - else return ..() + if(!height) + return FALSE + return ..() -/obj/machinery/shield/CanAtmosPass(var/turf/T) +/obj/machinery/shield/CanAtmosPass(turf/T) return !density -/obj/machinery/shield/attackby(obj/item/W as obj, mob/user as mob, params) - if(!istype(W)) return +/obj/machinery/shield/attackby(obj/item/I, mob/user, params) + if(!istype(I)) + return //Calculate damage - var/aforce = W.force - if(W.damtype == BRUTE || W.damtype == BURN) - src.health -= aforce + var/aforce = I.force + if(I.damtype == BRUTE || I.damtype == BURN) + health -= aforce //Play a fitting sound - playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1) + playsound(loc, 'sound/effects/EMPulse.ogg', 75, 1) - - if(src.health <= 0) + if(health <= 0) visible_message("The [src] dissipates") qdel(src) return - opacity = 1 - spawn(20) if(src) opacity = 0 + opacity = TRUE + spawn(20) + if(src) + opacity = FALSE ..() -/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shield/bullet_act(obj/item/projectile/Proj) health -= Proj.damage ..() if(health <=0) visible_message("The [src] dissipates") qdel(src) return - opacity = 1 - spawn(20) if(src) opacity = 0 + opacity = TRUE + spawn(20) + if(src) + opacity = FALSE /obj/machinery/shield/ex_act(severity) switch(severity) @@ -79,7 +84,6 @@ if(3.0) if(prob(25)) qdel(src) - return /obj/machinery/shield/emp_act(severity) switch(severity) @@ -114,10 +118,10 @@ return //The shield becomes dense to absorb the blow.. purely asthetic. - opacity = 1 + opacity = TRUE spawn(20) if(src) - opacity = 0 + opacity = FALSE /obj/machinery/shieldgen @@ -126,17 +130,17 @@ icon = 'icons/obj/objects.dmi' icon_state = "shieldoff" density = 1 - opacity = 0 + opacity = FALSE anchored = 0 pressure_resistance = 2*ONE_ATMOSPHERE req_access = list(access_engine) var/const/max_health = 100 var/health = max_health var/active = 0 - var/malfunction = 0 //Malfunction causes parts of the shield to slowly dissapate + var/malfunction = FALSE //Malfunction causes parts of the shield to slowly dissapate var/list/deployed_shields = list() - var/is_open = 0 //Whether or not the wires are exposed - var/locked = 0 + var/is_open = FALSE //Whether or not the wires are exposed + var/locked = FALSE /obj/machinery/shieldgen/Destroy() QDEL_LIST(deployed_shields) @@ -145,9 +149,10 @@ /obj/machinery/shieldgen/proc/shields_up() - if(active) return 0 //If it's already turned on, how did this get called? + if(active) + return //If it's already turned on, how did this get called? - src.active = 1 + active = 1 update_icon() for(var/turf/target_tile in range(2, src)) @@ -156,9 +161,10 @@ deployed_shields += new /obj/machinery/shield(target_tile) /obj/machinery/shieldgen/proc/shields_down() - if(!active) return 0 //If it's already off, how did this get called? + if(!active) + return //If it's already off, how did this get called? - src.active = 0 + active = 0 update_icon() for(var/obj/machinery/shield/shield_tile in deployed_shields) @@ -173,7 +179,7 @@ /obj/machinery/shieldgen/proc/checkhp() if(health <= 30) - src.malfunction = 1 + malfunction = TRUE if(health <= 0) qdel(src) update_icon() @@ -182,28 +188,28 @@ /obj/machinery/shieldgen/ex_act(severity) switch(severity) if(1.0) - src.health -= 75 - src.checkhp() + health -= 75 + checkhp() if(2.0) - src.health -= 30 + health -= 30 if(prob(15)) - src.malfunction = 1 - src.checkhp() + malfunction = TRUE + checkhp() if(3.0) - src.health -= 10 - src.checkhp() + health -= 10 + checkhp() return /obj/machinery/shieldgen/emp_act(severity) switch(severity) if(1) - src.health /= 2 //cut health in half - malfunction = 1 - locked = pick(0,1) + health = health * 0.5 //cut health in half + malfunction = TRUE + locked = pick(TRUE, FALSE) if(2) if(prob(50)) - src.health *= 0.3 //chop off a third of the health - malfunction = 1 + health *= 0.3 //chop off a third of the health + malfunction = TRUE checkhp() /obj/machinery/shieldgen/attack_hand(mob/user as mob) @@ -214,70 +220,70 @@ to_chat(user, "The panel must be closed before operating this machine.") return - if(src.active) + if(active) user.visible_message("[bicon(src)] [user] deactivated the shield generator.", \ "[bicon(src)] You deactivate the shield generator.", \ "You hear heavy droning fade out.") - src.shields_down() + shields_down() else if(anchored) user.visible_message("[bicon(src)] [user] activated the shield generator.", \ "[bicon(src)] You activate the shield generator.", \ "You hear heavy droning.") - src.shields_up() + shields_up() else to_chat(user, "The device must first be secured to the floor.") - return -/obj/machinery/shieldgen/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/card/emag)) - malfunction = 1 +/obj/machinery/shieldgen/attackby(obj/item/I as obj, mob/user as mob, params) + if(istype(I, /obj/item/card/emag)) + malfunction = TRUE update_icon() - else if(istype(W, /obj/item/screwdriver)) - playsound(src.loc, W.usesound, 100, 1) + else if(isscrewdriver(I)) + playsound(loc, I.usesound, 100, 1) if(is_open) to_chat(user, "You close the panel.") - is_open = 0 + is_open = FALSE else to_chat(user, "You open the panel and expose the wiring.") - is_open = 1 + is_open = TRUE - else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) - var/obj/item/stack/cable_coil/coil = W + else if(istype(I, /obj/item/stack/cable_coil) && malfunction && is_open) + var/obj/item/stack/cable_coil/coil = I to_chat(user, "You begin to replace the wires.") - //if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ), target = src)) //Take longer to repair heavier damage if(do_after(user, 30 * coil.toolspeed, target = src)) - if(!src || !coil) return + if(!src || !coil) + return coil.use(1) health = max_health - malfunction = 0 + malfunction = TRUE playsound(loc, coil.usesound, 50, 1) to_chat(user, "You repair the [src]!") update_icon() - else if(istype(W, /obj/item/wrench)) + else if(istype(I, /obj/item/wrench)) if(locked) to_chat(user, "The bolts are covered, unlocking this would retract the covers.") return if(anchored) - playsound(src.loc, W.usesound, 100, 1) + playsound(loc, I.usesound, 100, 1) to_chat(user, "You unsecure the [src] from the floor!") if(active) to_chat(user, "The [src] shuts off!") - src.shields_down() + shields_down() anchored = 0 else - if(istype(get_turf(src), /turf/space)) return //No wrenching these in space! - playsound(src.loc, W.usesound, 100, 1) + if(istype(get_turf(src), /turf/space)) + return //No wrenching these in space! + playsound(loc, I.usesound, 100, 1) to_chat(user, "You secure the [src] to the floor!") anchored = 1 - else if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda)) - if(src.allowed(user)) - src.locked = !src.locked - to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") + else if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + if(allowed(user)) + locked = !locked + to_chat(user, "The controls are now [locked ? "locked." : "unlocked."]") else to_chat(user, "Access denied.") @@ -287,11 +293,12 @@ /obj/machinery/shieldgen/update_icon() if(active) - src.icon_state = malfunction ? "shieldonbr":"shieldon" + icon_state = malfunction ? "shieldonbr":"shieldon" else - src.icon_state = malfunction ? "shieldoffbr":"shieldoff" + icon_state = malfunction ? "shieldoffbr":"shieldoff" return + ////FIELD GEN START //shameless copypasta from fieldgen, powersink, and grille #define maxstoredpower 500 /obj/machinery/shieldwallgen @@ -309,24 +316,24 @@ var/last_check = 0 var/check_delay = 10 var/recalc = 0 - var/locked = 1 + var/locked = TRUE var/destroyed = 0 var/directwired = 1 -// var/maxshieldload = 200 var/obj/structure/cable/attached // the attached cable var/storedpower = 0 flags = CONDUCT - use_power = 0 + use_power = NO_POWER_USE /obj/machinery/shieldwallgen/proc/power() if(!anchored) power = 0 return 0 - var/turf/T = src.loc + var/turf/T = loc var/obj/structure/cable/C = T.get_cable_node() var/datum/powernet/PN - if(C) PN = C.powernet // find the powernet of the connected cable + if(C) + PN = C.powernet // find the powernet of the connected cable if(!PN) power = 0 @@ -345,32 +352,33 @@ // message_admins("[PN.load]", 1) // use_power(250) //uses APC power -/obj/machinery/shieldwallgen/attack_hand(mob/user as mob) +/obj/machinery/shieldwallgen/attack_hand(mob/user) if(state != 1) to_chat(user, "The shield generator needs to be firmly secured to the floor first.") return 1 - if(src.locked && !istype(user, /mob/living/silicon)) + if(locked && !issilicon(user)) to_chat(user, "The controls are locked!") return 1 if(power != 1) to_chat(user, "The shield generator needs to be powered by wire underneath.") return 1 - if(src.active >= 1) - src.active = 0 + if(active >= 1) + active = 0 icon_state = "Shield_Gen" user.visible_message("[user] turned the shield generator off.", \ "You turn off the shield generator.", \ "You hear heavy droning fade out.") - for(var/dir in list(1,2,4,8)) src.cleanup(dir) + for(var/dir in list(NORTH, SOUTH, EAST, WEST)) + cleanup(dir) else - src.active = 1 + active = 1 icon_state = "Shield_Gen +a" user.visible_message("[user] turned the shield generator on.", \ "You turn on the shield generator.", \ "You hear heavy droning.") - src.add_fingerprint(user) + add_fingerprint(user) /obj/machinery/shieldwallgen/process() spawn(100) @@ -381,12 +389,10 @@ storedpower = maxstoredpower if(storedpower <= 0) storedpower = 0 -// if(shieldload >= maxshieldload) //there was a loop caused by specifics of process(), so this was needed. -// shieldload = maxshieldload - if(src.active == 1) - if(!src.state == 1) - src.active = 0 + if(active == 1) + if(!state == 1) + active = 0 return spawn(1) setup_field(1) @@ -396,18 +402,19 @@ setup_field(4) spawn(4) setup_field(8) - src.active = 2 - if(src.active >= 1) - if(src.power == 0) - src.visible_message("The [src.name] shuts down due to lack of power!", \ + active = 2 + if(active >= 1) + if(power == 0) + visible_message("The [name] shuts down due to lack of power!", \ "You hear heavy droning fade out") icon_state = "Shield_Gen" - src.active = 0 - for(var/dir in list(1,2,4,8)) src.cleanup(dir) + active = 0 + for(var/dir in list(NORTH, SOUTH, EAST, WEST)) + cleanup(dir) -/obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0) - var/turf/T = src.loc - var/turf/T2 = src.loc +/obj/machinery/shieldwallgen/proc/setup_field(NSEW = 0) + var/turf/T = loc + var/turf/T2 = loc var/obj/machinery/shieldwallgen/G var/steps = 0 var/oNSEW = 0 @@ -439,7 +446,7 @@ if(isnull(G)) return - T2 = src.loc + T2 = loc for(var/dist = 0, dist < steps, dist += 1) // creates each field tile var/field_dir = get_dir(T2,get_step(T2, NSEW)) @@ -450,30 +457,30 @@ CF.dir = field_dir -/obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/wrench)) +/obj/machinery/shieldwallgen/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/wrench)) if(active) to_chat(user, "Turn off the field generator first.") return else if(state == 0) state = 1 - playsound(src.loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, "You secure the external reinforcing bolts to the floor.") - src.anchored = 1 + anchored = 1 return else if(state == 1) state = 0 - playsound(src.loc, W.usesound, 75, 1) + playsound(loc, I.usesound, 75, 1) to_chat(user, "You undo the external reinforcing bolts.") - src.anchored = 0 + anchored = 0 return - if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda)) - if(src.allowed(user)) - src.locked = !src.locked - to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") + if(istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) + if(allowed(user)) + locked = !locked + to_chat(user, "Controls are now [locked ? "locked." : "unlocked."]") else to_chat(user, "Access denied.") @@ -481,18 +488,19 @@ add_fingerprint(user) ..() -/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW) +/obj/machinery/shieldwallgen/proc/cleanup(NSEW) var/obj/machinery/shieldwall/F var/obj/machinery/shieldwallgen/G - var/turf/T = src.loc - var/turf/T2 = src.loc + var/turf/T = loc + var/turf/T2 = loc for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for fields T = get_step(T2, NSEW) T2 = T if(locate(/obj/machinery/shieldwall) in T) F = (locate(/obj/machinery/shieldwall) in T) - qdel(F) + if(F.gen_primary == src || F.gen_secondary == src) + qdel(F) if(locate(/obj/machinery/shieldwallgen) in T) G = (locate(/obj/machinery/shieldwallgen) in T) @@ -500,19 +508,19 @@ break /obj/machinery/shieldwallgen/Destroy() - src.cleanup(1) - src.cleanup(2) - src.cleanup(4) - src.cleanup(8) + cleanup(1) + cleanup(2) + cleanup(4) + cleanup(8) return ..() -/obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/Proj) storedpower -= Proj.damage ..() return -//////////////Containment Field START +////////////// Containment Field START /obj/machinery/shieldwall name = "Shield" desc = "An energy shield." @@ -524,23 +532,24 @@ luminosity = 3 var/needs_power = 0 var/active = 1 -// var/power = 10 var/delay = 5 var/last_active var/mob/U var/obj/machinery/shieldwallgen/gen_primary var/obj/machinery/shieldwallgen/gen_secondary -/obj/machinery/shieldwall/New(var/obj/machinery/shieldwallgen/A, var/obj/machinery/shieldwallgen/B) +/obj/machinery/shieldwall/New(obj/machinery/shieldwallgen/A, obj/machinery/shieldwallgen/B) ..() - src.gen_primary = A - src.gen_secondary = B + gen_primary = A + gen_secondary = B if(A && B) needs_power = 1 -/obj/machinery/shieldwall/attack_hand(mob/user as mob) +/obj/machinery/shieldwall/attack_hand(mob/user) return +/obj/machinery/shieldwall/rpd_blocksusage() + return TRUE /obj/machinery/shieldwall/process() if(needs_power) @@ -551,14 +560,14 @@ if(!(gen_primary.active)||!(gen_secondary.active)) qdel(src) return -// + if(prob(50)) gen_primary.storedpower -= 10 else gen_secondary.storedpower -=10 -/obj/machinery/shieldwall/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shieldwall/bullet_act(obj/item/projectile/Proj) if(needs_power) var/obj/machinery/shieldwallgen/G if(prob(50)) @@ -598,7 +607,8 @@ /obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0) return 1 + if(height == 0) + return TRUE if(istype(mover) && mover.checkpass(PASSGLASS)) return prob(20) @@ -606,7 +616,7 @@ if(istype(mover, /obj/item/projectile)) return prob(10) else - return !src.density + return !density /obj/machinery/shieldwall/syndicate diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 72fd23dde66..fa99ecf8951 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -18,7 +18,6 @@ account = get_card_account(user.get_active_hand()) else account = null - ui_interact(user) /obj/machinery/slot_machine/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -30,88 +29,78 @@ /obj/machinery/slot_machine/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] - data["working"] = working data["money"] = account ? account.money : null data["plays"] = plays data["result"] = result data["resultlvl"] = resultlvl - return data /obj/machinery/slot_machine/Topic(href, href_list) add_fingerprint(usr) if(href_list["ops"]) - var/operation = text2num(href_list["ops"]) - if(operation == 1) // Play - if(working == 1) + if(text2num(href_list["ops"])) // Play + if(working) return if(!account || account.money < 10) return - if(!account.charge(10, transaction_purpose = "Bet", dest_name = name)) + if(!account.charge(10, null, "Bet", "Slot Machine", "Slot Machine")) return - plays += 1 + plays++ working = 1 icon_state = "slots-on" - var/roll = rand(1,4050) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - spawn(25) - if(roll == 1) - visible_message("[src] says, 'JACKPOT! [usr.name] has won a MILLION CREDITS!'") - event_announcement.Announce("Congratulations to [usr.name] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner") - result = "JACKPOT! You win one million credits!" - resultlvl = "highlight" - win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg') - else if(roll > 1 && roll <= 5) - visible_message("[src] says, 'Big Winner! [usr.name] has won a hundred thousand credits!'") - event_announcement.Announce("Congratulations to [usr.name] on winning a hundred thousand credits!", "Big Winner") - result = "Big Winner! You win a hundred thousand credits!" - resultlvl = "good" - win_money(100000, 'sound/goonstation/misc/klaxon.ogg') - else if(roll > 5 && roll <= 50) - visible_message("[src] says, 'Big Winner! [usr.name] has won ten thousand credits!'") - result = "You win ten thousand credits!" - resultlvl = "good" - win_money(10000, 'sound/goonstation/misc/klaxon.ogg') - else if(roll > 50 && roll <= 100) - visible_message("[src] says, 'Winner! [usr.name] has won a thousand credits!'") - result = "You win a thousand credits!" - resultlvl = "good" - win_money(1000, 'sound/goonstation/misc/bell.ogg') - else if(roll > 100 && roll <= 200) - visible_message("[src] says, 'Winner! [usr.name] has won a hundred credits!'") - result = "You win a hundred credits!" - resultlvl = "good" - win_money(100, 'sound/goonstation/misc/bell.ogg') - else if(roll > 200 && roll <= 300) - visible_message("[src] says, 'Winner! [usr.name] has won fifty credits!'") - result = "You win fifty credits!" - resultlvl = "good" - win_money(50) - else if(roll > 300 && roll <= 600) - visible_message("[src] says, 'Winner! [usr.name] has won ten credits!'") - result = "You win ten credits!" - resultlvl = "good" - win_money(10) - else - result = "No luck!" - resultlvl = "average" - working = 0 - icon_state = "slots-off" + addtimer(CALLBACK(src, .proc/spin_slots, usr.name), 25) + +/obj/machinery/slot_machine/proc/spin_slots(userName) + switch(rand(1,4050)) + if(1) + atom_say("JACKPOT! [userName] has won a MILLION CREDITS!") + event_announcement.Announce("Congratulations to [userName] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner") + result = "JACKPOT! You win one million credits!" + resultlvl = "highlight" + win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg') + if(2 to 5) + atom_say("Big Winner! [userName] has won a hundred thousand credits!") + event_announcement.Announce("Congratulations to [userName] on winning a hundred thousand credits!", "Big Winner") + result = "Big Winner! You win a hundred thousand credits!" + resultlvl = "good" + win_money(100000, 'sound/goonstation/misc/klaxon.ogg') + if(6 to 50) + atom_say("Big Winner! [userName] has won ten thousand credits!") + result = "You win ten thousand credits!" + resultlvl = "good" + win_money(10000, 'sound/goonstation/misc/klaxon.ogg') + if(51 to 100) + atom_say("Winner! [userName] has won a thousand credits!") + result = "You win a thousand credits!" + resultlvl = "good" + win_money(1000, 'sound/goonstation/misc/bell.ogg') + if(101 to 200) + atom_say("Winner! [userName] has won a hundred credits!") + result = "You win a hundred credits!" + resultlvl = "good" + win_money(100, 'sound/goonstation/misc/bell.ogg') + if(201 to 300) + atom_say("Winner! [userName] has won fifty credits!") + result = "You win fifty credits!" + resultlvl = "good" + win_money(50) + if(301 to 1000) + atom_say("Winner! [userName] has won ten credits!") + result = "You win ten credits!" + resultlvl = "good" + win_money(10) + else + result = "No luck!" + resultlvl = "average" + working = 0 + icon_state = "slots-off" /obj/machinery/slot_machine/proc/win_money(amt, sound='sound/machines/ping.ogg') if(sound) playsound(loc, sound, 55, 1) - if(!account) return - account.money += amt - - var/datum/transaction/T = new() - T.target_name = account.owner_name - T.purpose = "Slot Winnings" - T.amount = "[amt]" - T.date = current_date_string - T.time = station_time_timestamp() - account.transaction_log.Add(T) + account.credit(amt, "Slot Winnings", "Slot Machine", account.owner_name) \ No newline at end of file diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index ebf3cfeadf9..94d0921b946 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -16,7 +16,7 @@ name = "status display" anchored = 1 density = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/mode = 1 // 0 = Blank // 1 = Shuttle timer @@ -280,4 +280,4 @@ #undef FONT_COLOR #undef WARNING_FONT_COLOR #undef FONT_STYLE -#undef SCROLL_SPEED \ No newline at end of file +#undef SCROLL_SPEED diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 64e387fb731..10451c758be 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -15,7 +15,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept desc = "A dish-shaped machine used to broadcast processed subspace signals." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 25 machinetype = 5 circuitboard = /obj/item/circuitboard/telecomms/broadcaster @@ -113,7 +113,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept desc = "A compact machine used for portable subspace telecommuniations processing." density = 1 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 machinetype = 6 var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel @@ -167,15 +167,15 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept old_type = SYNDICATE_RADIO_TYPE if(new_freq == antag_freq) new_type = SYNDICATE_RADIO_TYPE - + for(var/cent_freq in CENT_FREQS) if(old_freq == cent_freq) old_type = CENTCOMM_RADIO_TYPE if(new_freq == cent_freq) new_type = CENTCOMM_RADIO_TYPE - + return new_type > old_type - + /** Here is the big, bad function that broadcasts a message given the appropriate @@ -246,11 +246,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/bad_connection = FALSE var/datum/radio_frequency/new_connection = connection - + if(connection.frequency != display_freq) bad_connection = Is_Bad_Connection(connection.frequency, display_freq) new_connection = radio_controller.return_frequency(display_freq) - + var/list/obj/item/radio/radios = list() // --- Broadcast only to intercom devices --- diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm index 44403c6bf1d..ed8c531720b 100644 --- a/code/game/machinery/telecomms/logbrowser.dm +++ b/code/game/machinery/telecomms/logbrowser.dm @@ -65,31 +65,31 @@ i++ // If the log is a speech file if(C.input_type == "Speech File") - dat += "
  • [C.name] \[X\]
    " + dat += "
  • [C.name] \[X\]
    " // -- If the orator is a human, or universal translate is active, OR mob has universal speech on -- if(user.say_understands(null, C.parameters["language"]) || universal_translate || C.parameters["uspeech"]) - dat += "Data type: [C.input_type]
    " - dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " - dat += "Class: [C.parameters["race"]]
    " - dat += "Contents: \"[C.parameters["message"]]\"
    " + dat += "Data type: [C.input_type]
    " + dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
    " + dat += "Class: [C.parameters["race"]]
    " + dat += "Contents: \"[C.parameters["message"]]\"
    " // -- Orator is not human and universal translate not active -- else - dat += "Data type: Audio File
    " - dat += "Source: Unidentifiable
    " - dat += "Class: [C.parameters["race"]]
    " - dat += "Contents: Unintelligble
    " + dat += "Data type: Audio File
    " + dat += "Source: Unidentifiable
    " + dat += "Class: [C.parameters["race"]]
    " + dat += "Contents: Unintelligble
    " dat += "

  • " else if(C.input_type == "Execution Error") - dat += "
  • [C.name] \[X\]
    " - dat += "Output: \"[C.parameters["message"]]\"
    " + dat += "
  • [C.name] \[X\]
    " + dat += "Output: \"[C.parameters["message"]]\"
    " dat += "

  • " @@ -131,7 +131,7 @@ if("scan") if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/server/T in range(25, src)) @@ -139,9 +139,9 @@ servers.Add(T) if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" screen = 0 @@ -155,13 +155,13 @@ var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])] - temp = "- DELETED ENTRY: [D.name] -" + temp = "- DELETED ENTRY: [D.name] -" SelectedServer.log_entries.Remove(D) qdel(D) else - temp = "- FAILED: NO SELECTED MACHINE -" + temp = "- FAILED: NO SELECTED MACHINE -" if(href_list["network"]) @@ -169,14 +169,14 @@ if(newnet && ((usr in range(1, src) || issilicon(usr)))) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() return diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 24e0c51a2b7..16113f5bcfe 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -222,7 +222,7 @@ /obj/machinery/telecomms/processor/Options_Topic(href, href_list) if(href_list["process"]) - temp = "-% Processing mode changed. %-" + temp = "-% Processing mode changed. %-" src.process_mode = !src.process_mode */ @@ -240,18 +240,18 @@ if(href_list["receive"]) receiving = !receiving - temp = "-% Receiving mode changed. %-" + temp = "-% Receiving mode changed. %-" if(href_list["broadcast"]) broadcasting = !broadcasting - temp = "-% Broadcasting mode changed. %-" + temp = "-% Broadcasting mode changed. %-" if(href_list["change_listening"]) //Lock to the station OR lock to the current position! //You need at least two receivers and two broadcasters for this to work, this includes the machine. var/result = toggle_level() if(result) - temp = "-% [src]'s signal has been successfully changed." + temp = "-% [src]'s signal has been successfully changed." else - temp = "-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required." + temp = "-% [src] could not lock it's signal onto the station. Two broadcasters or receivers required." // BUS @@ -270,10 +270,10 @@ newfreq *= 10 // shift the decimal one place if(newfreq < 10000) change_frequency = newfreq - temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" + temp = "-% New frequency to change to assigned: \"[newfreq] GHz\" %-" else change_frequency = 0 - temp = "-% Frequency changing deactivated %-" + temp = "-% Frequency changing deactivated %-" /obj/machinery/telecomms/Topic(href, href_list) @@ -293,27 +293,27 @@ if("toggle") src.toggled = !src.toggled - temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." + temp = "-% [src] has been [src.toggled ? "activated" : "deactivated"]." update_power() /* if("hide") src.hide = !hide - temp = "-% Shadow Link has been [src.hide ? "activated" : "deactivated"]." + temp = "-% Shadow Link has been [src.hide ? "activated" : "deactivated"]." */ if("id") var/newid = copytext(reject_bad_text(input(usr, "Specify the new ID for this machine", src, id) as null|text),1,MAX_MESSAGE_LEN) if(newid && canAccess(usr)) id = newid - temp = "-% New ID assigned: \"[id]\" %-" + temp = "-% New ID assigned: \"[id]\" %-" if("network") var/newnet = input(usr, "Specify the new network for this machine. This will break all current links.", src, network) as null|text if(newnet && canAccess(usr)) if(length(newnet) > 15) - temp = "-% Too many characters in new network tag %-" + temp = "-% Too many characters in new network tag %-" else for(var/obj/machinery/telecomms/T in links) @@ -321,7 +321,7 @@ network = newnet links = list() - temp = "-% New network tag assigned: \"[network]\" %-" + temp = "-% New network tag assigned: \"[network]\" %-" if("freq") @@ -331,21 +331,21 @@ newfreq *= 10 // shift the decimal one place if(!(newfreq in freq_listening) && newfreq < 10000) freq_listening.Add(newfreq) - temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" + temp = "-% New frequency filter assigned: \"[newfreq] GHz\" %-" if(href_list["delete"]) // changed the layout about to workaround a pesky runtime -- Doohl var/x = text2num(href_list["delete"]) - temp = "-% Removed frequency filter [x] %-" + temp = "-% Removed frequency filter [x] %-" freq_listening.Remove(x) if(href_list["unlink"]) if(text2num(href_list["unlink"]) <= length(links)) var/obj/machinery/telecomms/T = links[text2num(href_list["unlink"])] - temp = "-% Removed \ref[T] [T.name] from linked entities. %-" + temp = "-% Removed \ref[T] [T.name] from linked entities. %-" // Remove link entries from both T and src. @@ -363,20 +363,20 @@ if(!(P.buffer in src.links)) src.links.Add(P.buffer) - temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" + temp = "-% Successfully linked with \ref[P.buffer] [P.buffer.name] %-" else - temp = "-% Unable to acquire buffer %-" + temp = "-% Unable to acquire buffer %-" if(href_list["buffer"]) P.buffer = src - temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" + temp = "-% Successfully stored \ref[P.buffer] [P.buffer.name] in buffer %-" if(href_list["flush"]) - temp = "-% Buffer successfully flushed. %-" + temp = "-% Buffer successfully flushed. %-" P.buffer = null src.Options_Topic(href, href_list) diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm index 8cf29f6b8db..0a12b637a39 100644 --- a/code/game/machinery/telecomms/presets.dm +++ b/code/game/machinery/telecomms/presets.dm @@ -35,7 +35,7 @@ hide = 1 toggled = 1 //anchored = 1 - use_power = 0 + use_power = NO_POWER_USE //idle_power_usage = 0 autolinkers = list("c_relay") @@ -51,7 +51,7 @@ /obj/machinery/telecomms/hub/preset_cent id = "CentComm Hub" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("hub_cent", "c_relay", "s_relay", "m_relay", "r_relay", "e_relay", "centcomm", "receiverCent", "broadcasterCent") @@ -83,7 +83,7 @@ /obj/machinery/telecomms/receiver/preset_cent id = "CentComm Receiver" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("receiverCent") freq_listening = list(ERT_FREQ, DTH_FREQ) @@ -121,7 +121,7 @@ /obj/machinery/telecomms/bus/preset_cent id = "CentComm Bus" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE freq_listening = list(ERT_FREQ, DTH_FREQ) autolinkers = list("processorCent", "centcomm") @@ -150,7 +150,7 @@ /obj/machinery/telecomms/processor/preset_cent id = "CentComm Processor" network = "tcommsat" - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("processorCent") //Servers @@ -208,7 +208,7 @@ /obj/machinery/telecomms/server/presets/centcomm id = "CentComm Server" freq_listening = list(ERT_FREQ, DTH_FREQ) - use_power = 0 + use_power = NO_POWER_USE autolinkers = list("centcomm") //Broadcasters @@ -230,5 +230,5 @@ /obj/machinery/telecomms/broadcaster/preset_cent id = "CentComm Broadcaster" network = "tcommsat" - use_power = 0 - autolinkers = list("broadcasterCent") \ No newline at end of file + use_power = NO_POWER_USE + autolinkers = list("broadcasterCent") diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 0b9b1449137..c74d5364919 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -195,7 +195,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "This machine has a dish-like shape and green lights. It is designed to detect and process subspace radio activity." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 1 circuitboard = /obj/item/circuitboard/telecomms/receiver @@ -251,7 +251,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send/receive massive amounts of data." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 80 machinetype = 7 circuitboard = /obj/item/circuitboard/telecomms/hub @@ -285,7 +285,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send massive amounts of data far away." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 8 circuitboard = /obj/item/circuitboard/telecomms/relay @@ -336,7 +336,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A mighty piece of hardware used to send massive amounts of data quickly." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 50 machinetype = 2 circuitboard = /obj/item/circuitboard/telecomms/bus @@ -388,7 +388,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "This machine is used to process large quantities of information." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 machinetype = 3 circuitboard = /obj/item/circuitboard/telecomms/processor @@ -425,7 +425,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() desc = "A machine used to store data and network statistics." density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 15 machinetype = 4 circuitboard = /obj/item/circuitboard/telecomms/server diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm index 84f3c6a47f3..93c8da26253 100644 --- a/code/game/machinery/telecomms/telemonitor.dm +++ b/code/game/machinery/telecomms/telemonitor.dm @@ -92,7 +92,7 @@ if("probe") if(machinelist.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/T in range(25, src)) @@ -100,9 +100,9 @@ machinelist.Add(T) if(!machinelist.len) - temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE NETWORK ENTITIES IN \[[network]\] -" else - temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" + temp = "- [machinelist.len] ENTITIES LOCATED & BUFFERED -" screen = 0 @@ -112,13 +112,13 @@ var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text if(newnet && ((usr in range(1, src) || issilicon(usr)))) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 machinelist = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() return diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm index 45f0817ef55..28a2809e5b4 100644 --- a/code/game/machinery/telecomms/traffic_control.dm +++ b/code/game/machinery/telecomms/traffic_control.dm @@ -301,7 +301,7 @@ if("scan") if(servers.len > 0) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" + temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" else for(var/obj/machinery/telecomms/server/T in range(25, src)) @@ -309,9 +309,9 @@ servers.Add(T) if(!servers.len) - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" + temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" else - temp = "- [servers.len] SERVERS PROBED & BUFFERED -" + temp = "- [servers.len] SERVERS PROBED & BUFFERED -" screen = 0 @@ -333,14 +333,14 @@ if(newnet && canAccess(user)) if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" + temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -" else network = newnet screen = 0 servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" + temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" updateUsrDialog() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 46671a9f4fa..53148d9de6d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -11,6 +11,7 @@ var/calibrating var/turf/target //Used for one-time-use teleport cards (such as clown planet coordinates.) //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. + var/area_bypass = FALSE /obj/machinery/computer/teleporter/New() src.id = "[rand(1000, 9999)]" @@ -87,7 +88,7 @@ data["accurate"] = null data["regime"] = regime_set var/area/targetarea = get_area(target) - data["target"] = (!target) ? "None" : sanitize(targetarea.name) + data["target"] = (!target || !targetarea) ? "None" : sanitize(targetarea.name) data["calibrating"] = calibrating data["locked"] = locked return data @@ -172,6 +173,7 @@ locked = null /obj/machinery/computer/teleporter/proc/set_target(mob/user) + area_bypass = FALSE if(regime_set == "Teleporter") var/list/L = list() var/list/areaindex = list() @@ -211,7 +213,10 @@ var/desc = input("Please select a location to lock in.", "Locking Computer") in L target = L[desc] - + if(istype(target, /obj/item/radio/beacon)) + var/obj/item/radio/beacon/B = target + if(B.area_bypass) + area_bypass = TRUE else var/list/L = list() var/list/areaindex = list() @@ -264,7 +269,7 @@ desc = "It's the hub of a teleporting machine." icon_state = "tele0" var/accurate = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 var/obj/machinery/teleport/station/power_station @@ -335,7 +340,11 @@ to_chat(T, "[pick(TPError)]") return else - teleport(M) + if(!teleport(M) && isliving(M)) // the isliving(M) is needed to avoid triggering errors if a spark bumps the telehub + visible_message("[src] emits a loud buzz, as its teleport portal flickers and fails!") + playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + power_station.toggle() // turn off the portal. + use_power(5000) //--FalseIncarnate return @@ -353,6 +362,7 @@ return ..() /obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T) + . = TRUE var/obj/machinery/computer/teleporter/com = power_station.teleporter_console if(!com) return @@ -361,11 +371,10 @@ return if(istype(M, /atom/movable)) if(!calibrated && prob(25 - ((accurate) * 10))) //oh dear a problem - do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), 3), 2) + . = do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), 3), 2, bypass_area_flag = com.area_bypass) else - do_teleport(M, com.target) + . = do_teleport(M, com.target, bypass_area_flag = com.area_bypass) calibrated = 0 - return /obj/machinery/teleport/hub/update_icon() if(panel_open) @@ -380,7 +389,7 @@ desc = "A teleporter with the target pre-set on the circuit board." icon_state = "tele0" var/recalibrating = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 @@ -457,7 +466,7 @@ desc = "The power control station for a bluespace teleporter." icon_state = "controller" var/engaged = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 2000 var/obj/machinery/computer/teleporter/teleporter_console @@ -574,8 +583,8 @@ visible_message("No target detected.") src.engaged = 0 teleporter_hub.update_icon() - src.add_fingerprint(user) - return + if(istype(user)) + add_fingerprint(user) /obj/machinery/teleport/station/power_change() ..() diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index e04667e237a..cf146b7a882 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -43,7 +43,7 @@ var/icon_deny //Icon_state when denying access // Power - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/vend_power_usage = 150 @@ -386,9 +386,8 @@ // empty at high security levels if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2) var/attempt_pin = input("Enter pin code", "Vendor transaction") as num - customer_account = attempt_account_access(customer_account, attempt_pin, 2) - if(!customer_account) + if(!attempt_account_access(customer_account.account_number, attempt_pin, 2)) src.status_message = "Unable to access account: incorrect credentials." src.status_error = 1 return 0 @@ -399,11 +398,9 @@ return 0 else // Okay to move the money at this point - var/paid = customer_account.charge(currently_vending.price, - transaction_purpose = "Purchase of [currently_vending.product_name]", - terminal_name = name, - terminal_id = name, - dest_name = vendor_account.owner_name) + var/paid = customer_account.charge(currently_vending.price, vendor_account, + "Purchase of [currently_vending.product_name]", name, vendor_account.owner_name, + "Sale of [currently_vending.product_name]", customer_account.owner_name) if(paid) // Give the vendor the money. We use the account owner name, which means @@ -419,15 +416,8 @@ */ /obj/machinery/vending/proc/credit_purchase(var/target as text) vendor_account.money += currently_vending.price - - var/datum/transaction/T = new() - T.target_name = target - T.purpose = "Purchase of [currently_vending.product_name]" - T.amount = "[currently_vending.price]" - T.source_terminal = src.name - T.date = current_date_string - T.time = station_time_timestamp() - vendor_account.transaction_log.Add(T) + vendor_account.credit(currently_vending.price, "Sale of [currently_vending.product_name]", + name, target) /obj/machinery/vending/attack_ai(mob/user) return attack_hand(user) @@ -547,7 +537,7 @@ if((href_list["vend"]) && vend_ready && !currently_vending) if(issilicon(usr) && !isrobot(usr)) - to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic!") + to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic!") return if(!allowed(usr) && !usr.can_admin_interact() && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH @@ -856,7 +846,7 @@ to_chat(user, "[I] is not compatible with this machine.") return FALSE if(!I.is_open_container()) - to_chat(user, "You need to open [I] before you insert it.") return FALSE return TRUE @@ -907,8 +897,8 @@ /obj/machinery/vending/chinese name = "\improper Mr. Chang" desc = "A self-serving Chinese food machine, for all your Chinese food needs." - product_slogans = "Taste 5000 years of culture!" - icon_state = "snack" + product_slogans = "Taste 5000 years of culture!;Mr. Chang, approved for safe consumption in over 10 sectors!;Chinese food is great for a date night, or a lonely night!;You can't go wrong with Mr. Chang's authentic Chinese food!" + icon_state = "chang" products = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 6, /obj/item/reagent_containers/food/snacks/chinese/tao = 6, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 6, /obj/item/reagent_containers/food/snacks/chinese/newdles = 6, /obj/item/reagent_containers/food/snacks/chinese/rice = 6) prices = list(/obj/item/reagent_containers/food/snacks/chinese/chowmein = 50, /obj/item/reagent_containers/food/snacks/chinese/tao = 50, /obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball = 50, /obj/item/reagent_containers/food/snacks/chinese/newdles = 50, @@ -1233,7 +1223,7 @@ /obj/item/reagent_containers/food/condiment/pack/hotsauce = 5, /obj/item/reagent_containers/food/condiment/saltshaker =5, /obj/item/reagent_containers/food/condiment/peppermill =5, - /obj/item/whetstone = 2, + /obj/item/whetstone = 2, /obj/item/mixing_bowl = 10, /obj/item/kitchen/mould/bear = 1, /obj/item/kitchen/mould/worm = 1, /obj/item/kitchen/mould/bean = 1, /obj/item/kitchen/mould/ball = 1, /obj/item/kitchen/mould/cane = 1, /obj/item/kitchen/mould/cash = 1, diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index a9d4b4008b6..9e3369f1af9 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -41,8 +41,8 @@ var/inject_amount = 10 salvageable = 0 -/obj/item/mecha_parts/mecha_equipment/medical/sleeper/allow_drop() - return 0 +/obj/item/mecha_parts/mecha_equipment/medical/sleeper/AllowDrop() + return FALSE /obj/item/mecha_parts/mecha_equipment/medical/sleeper/Destroy() for(var/atom/movable/AM in src) diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index d0af747dc64..65118f8c491 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -5,7 +5,7 @@ desc = "Nothing is being built." density = TRUE anchored = TRUE - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 active_power_usage = 5000 var/time_coeff = 1 @@ -151,10 +151,10 @@ GET_COMPONENT(materials, /datum/component/material_container) materials.use_amount(res_coef) overlays += "fab-active" - use_power = 2 + use_power = ACTIVE_POWER_USE updateUsrDialog() sleep(get_construction_time_w_coeff(D)) - use_power = 1 + use_power = IDLE_POWER_USE overlays -= "fab-active" desc = initial(desc) @@ -461,7 +461,20 @@ "Pod_Parts", "Pod_Frame", "Misc") + req_access = list(access_mechanic) + +/obj/machinery/mecha_part_fabricator/spacepod/New() + ..() + QDEL_LIST(component_parts) + component_parts = list() + component_parts += new /obj/item/circuitboard/podfab(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) + component_parts += new /obj/item/stock_parts/manipulator(null) + component_parts += new /obj/item/stock_parts/micro_laser(null) + component_parts += new /obj/item/stock_parts/console_screen(null) + RefreshParts() /obj/machinery/mecha_part_fabricator/robot name = "Robotic Fabricator" - part_sets = list("Cyborg") \ No newline at end of file + part_sets = list("Cyborg") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index a2fa4220c3c..dd7993247b1 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -165,8 +165,6 @@ to_chat(user, "[bicon(ME)] [ME]") -/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits. - return /obj/mecha/hear_talk(mob/M, text) if(M == occupant && radio.broadcasting) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 1244f151be7..2feaea2a149 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -108,6 +108,9 @@ qdel(src) /obj/structure/sign/poster/proc/roll_and_drop(loc) + if(ruined) + qdel(src) + return pixel_x = 0 pixel_y = 0 var/obj/item/poster/P = new(loc, src) diff --git a/code/game/objects/effects/forcefields.dm b/code/game/objects/effects/forcefields.dm index f6643a5506a..2305e33249e 100644 --- a/code/game/objects/effects/forcefields.dm +++ b/code/game/objects/effects/forcefields.dm @@ -17,16 +17,9 @@ icon_state = "empty" name = "invisible wall" desc = "You have a bad feeling about this." - var/timeleft = 300 - var/last_process = 0 + var/lifetime = 30 SECONDS /obj/effect/forcefield/mime/New() ..() - last_process = world.time - processing_objects.Add(src) - -/obj/effect/forcefield/mime/process() - timeleft -= (world.time - last_process) - if(timeleft <= 0) - processing_objects.Remove(src) - qdel(src) \ No newline at end of file + if(lifetime) + QDEL_IN(src, lifetime) \ No newline at end of file diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 18506a5c882..8323641c899 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -14,14 +14,12 @@ /obj/effect/mine/Crossed(AM as mob|obj) if(!isliving(AM)) return - if(isanimal(AM)) - var/mob/living/simple_animal/SA = AM - if(faction && (faction in SA.faction)) - return - if(!SA.flying) - triggermine(SA) - else - triggermine(AM) + var/mob/living/M = AM + if(faction && (faction in M.faction)) + return + if(M.flying) + return + triggermine(M) /obj/effect/mine/proc/triggermine(mob/living/victim) if(triggered) @@ -34,6 +32,11 @@ triggered = 1 qdel(src) +/obj/effect/mine/ex_act(severity) + // Necessary because, as effects, they have infinite health, and wouldn't be destroyed otherwise. + // Also, they're pressure-sensitive mines, it makes sense that an explosion (wave of pressure) triggers/destroys them. + qdel(src) + /obj/effect/mine/explosive name = "explosive mine" var/range_devastation = 0 @@ -144,7 +147,7 @@ spawn(10) animate(victim.client,color = old_color, time = duration)//, easing = SINE_EASING|EASE_OUT) spawn(duration) - to_chat(victim, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.") + to_chat(victim, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.") qdel(chainsaw) qdel(src) @@ -169,7 +172,7 @@ if(!victim.client || !istype(victim)) return to_chat(victim, "You feel fast!") - victim.status_flags |= GOTTAGOREALLYFAST + victim.status_flags |= GOTTAGOFAST spawn(duration) - victim.status_flags &= ~GOTTAGOREALLYFAST - to_chat(victim, "You slow down.") \ No newline at end of file + victim.status_flags &= ~GOTTAGOFAST + to_chat(victim, "You slow down.") diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 8692e65dc9d..a048ca1ebff 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -11,6 +11,7 @@ anchored = 1 var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent var/can_multitool_to_remove = 0 + var/ignore_tele_proof_area_setting = FALSE /obj/effect/portal/Bumped(mob/M as mob|obj) teleport(M) @@ -42,12 +43,29 @@ qdel(src) return if(istype(M, /atom/movable)) - if(prob(failchance)) //oh dear a problem, put em in deep space + if(prob(failchance)) src.icon_state = "portal1" - do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0) + if(!do_teleport(M, locate(rand(5, world.maxx - 5), rand(5, world.maxy -5), 3), 0, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to deep space. + invalid_teleport() else - do_teleport(M, target, precision) ///You will appear adjacent to the beacon + if(!do_teleport(M, target, precision, bypass_area_flag = ignore_tele_proof_area_setting)) // Try to send them to a turf adjacent to target. + invalid_teleport() /obj/effect/portal/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/multitool) && can_multitool_to_remove) - qdel(src) \ No newline at end of file + qdel(src) + +/obj/effect/portal/proc/invalid_teleport() + visible_message("[src] flickers and fails due to bluespace interference!") + var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(5, 0, loc) + spark_system.start() + qdel(src) + + +/obj/effect/portal/redspace + name = "redspace portal" + desc = "A portal capable of bypassing bluespace interference." + icon_state = "portal1" + failchance = 0 + ignore_tele_proof_area_setting = TRUE \ No newline at end of file diff --git a/code/game/objects/effects/spawners/random_spawners.dm b/code/game/objects/effects/spawners/random_spawners.dm index 668bb52b467..1619eba14c4 100644 --- a/code/game/objects/effects/spawners/random_spawners.dm +++ b/code/game/objects/effects/spawners/random_spawners.dm @@ -264,6 +264,7 @@ /obj/effect/spawner/random_spawners/syndicate/loot/level4 name = "armory loot" + spawn_inside = /obj/structure/closet/secure_closet/syndicate/depot/armory // Loot schema: high-power weapons (m90, esword, ebow, revolver), devices that negate depot challenges (thermal glasses, chameleon device), explosives result = list(/obj/item/gun/projectile/automatic/c20r = 1, /obj/item/gun/projectile/automatic/m90 = 1, @@ -299,10 +300,9 @@ /obj/structure/falsewall/reinforced = 1) /obj/effect/spawner/random_spawners/syndicate/layout/door/vault - name = "60pc vaultdoor 20pc falsewall 20pc wall" - result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 6, - /turf/simulated/wall/r_wall = 2, - /obj/structure/falsewall/reinforced = 2) + name = "80pc vaultdoor 20pc wall" + result = list(/obj/machinery/door/airlock/hatch/syndicate/vault = 4, + /turf/simulated/wall/r_wall = 1) /obj/effect/spawner/random_spawners/syndicate/layout/spacepod diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 29abbef2d76..f6f42554b08 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -29,16 +29,33 @@ visible_message("[user] has [pick(W.attack_verb)] [src] with [W]!") else visible_message("[user] has attacked [src] with [W]!") - var/damage = W.force / 4 - if(iswelder(W)) var/obj/item/weldingtool/WT = W - if(WT.remove_fuel(0, user)) damage = 15 playsound(loc, WT.usesound, 100, 1) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + health -= damage + healthcheck() +/obj/structure/spider/attack_animal(mob/living/simple_animal/M) + if(M.melee_damage_upper == 0) + return + var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + visible_message("\The [M] [M.attacktext] [src]!") + health -= damage + healthcheck() + +/obj/structure/spider/attack_alien(mob/living/carbon/alien/humanoid/M) + playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) + visible_message("[M] has slashed at [src]!", "[M] has slashed at [src]!") + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + var/damage = rand(10, 20) health -= damage healthcheck() diff --git a/code/game/objects/items/devices/autopsy.dm b/code/game/objects/items/devices/autopsy.dm index daaa90a2664..929d7372752 100644 --- a/code/game/objects/items/devices/autopsy.dm +++ b/code/game/objects/items/devices/autopsy.dm @@ -146,7 +146,7 @@ if(damaging_weapon) scan_data += "Severity: [damage_desc]
    " scan_data += "Hits by weapon: [total_hits]
    " - scan_data += "Approximate time of wound infliction: [station_time(age)]
    " + scan_data += "Approximate time of wound infliction: [station_time_timestamp("hh:mm", age)]
    " scan_data += "Affected limbs: [D.organ_names]
    " scan_data += "Possible weapons:
    " for(var/weapon_name in weapon_chances) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 5fa97f07d62..175ca0886ad 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -10,6 +10,7 @@ var/spamcheck = 0 var/emagged = 0 var/insults = 0 + var/span = "" var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!") /obj/item/megaphone/attack_self(mob/living/user as mob) @@ -32,6 +33,10 @@ if(H && H.mind && H.mind.miming) to_chat(user, "Your vow of silence prevents you from speaking.") return + if(H.mind) + span = H.mind.speech_span + if((COMIC in H.mutations) || H.get_int_organ(/obj/item/organ/internal/cyberimp/brain/clown_voice)) + span = "sans" if(spamcheck) to_chat(user, "\The [src] needs to recharge!") return @@ -51,6 +56,8 @@ else to_chat(user, "*BZZZZzzzzzt*") else + if(span) + message = "[message]" saymsg(user, message) spamcheck = 1 @@ -58,7 +65,7 @@ spamcheck = 0 /obj/item/megaphone/proc/saymsg(mob/living/user as mob, message) - audible_message("[user] broadcasts, \"[message]\"", hearing_distance = 14) + audible_message("[user.GetVoice()] [user.GetAltName()] broadcasts, \"[message]\"", hearing_distance = 14) log_say(message, user) for(var/obj/O in oview(14, get_turf(src))) O.hear_talk(user, "[message]") diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index ff7fd6504d1..19e26f06bf5 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -7,6 +7,7 @@ origin_tech = "bluespace=1" var/emagged = 0 var/syndicate = 0 + var/area_bypass = FALSE /obj/item/radio/beacon/New() ..() diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 687e2fa9dce..8128e1f44d4 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -45,15 +45,16 @@ name = "station intercom (Security)" frequency = SEC_I_FREQ -/obj/item/radio/intercom/New(turf/loc, var/ndir = 0, var/building = 3) +/obj/item/radio/intercom/New(turf/loc, ndir, building = 3) ..() buildstage = building if(buildstage) processing_objects.Add(src) else - pixel_x = (ndir & 3)? 0 : (ndir == 4 ? 28 : -28) - pixel_y = (ndir & 3)? (ndir ==1 ? 28 : -28) : 0 - dir=ndir + if(ndir) + pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0 + pixel_y = (ndir & NORTH|SOUTH) ? (ndir == NORTH ? 28 : -28) : 0 + dir=ndir b_stat=1 on = 0 global_intercoms.Add(src) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 62d8dc6c87d..2a398363c7f 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -509,7 +509,7 @@ REAGENT SCANNER if(ismob(loc)) var/mob/M = loc M.put_in_hands(P) - to_chat(M, "Report printed. Log cleared.") + to_chat(M, "Report printed. Log cleared.") datatoprint = "" else to_chat(usr, "[src] has no logs or is already in use.") @@ -580,7 +580,7 @@ REAGENT SCANNER if(ismob(loc)) var/mob/M = loc M.put_in_hands(P) - to_chat(M, "Report printed. Log cleared.") + to_chat(M, "Report printed. Log cleared.") datatoprint = "" scanning = 1 else diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index cc3320489f6..1c3124a74cb 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -12,7 +12,7 @@ var/list/world_uplinks = list() var/welcome // Welcoming menu message var/uses // Numbers of crystals var/hidden_crystals = 0 - var/list/ItemsCategory // List of categories with lists of items + var/list/uplink_items // List of categories with lists of items var/list/ItemsReference // List of references with an associated item var/list/nanoui_items // List of items for NanoUI use var/nanoui_menu = 0 // The current menu we are in @@ -32,7 +32,7 @@ var/list/world_uplinks = list() ..() welcome = ticker.mode.uplink_welcome uses = ticker.mode.uplink_uses - ItemsCategory = get_uplink_items() + uplink_items = get_uplink_items() world_uplinks += src @@ -57,14 +57,14 @@ var/list/world_uplinks = list() dat += "Each item costs a number of telecrystals as indicated by the number following its name.
    " var/category_items = 1 - for(var/category in ItemsCategory) + for(var/category in uplink_items) if(category_items < 1) dat += "We apologize, as you could not afford anything from this category.
    " dat += "
    " dat += "[category]
    " category_items = 0 - for(var/datum/uplink_item/I in ItemsCategory[category]) + for(var/datum/uplink_item/I in uplink_items[category]) if(I.cost > uses) continue if(I.job && I.job.len) @@ -87,9 +87,9 @@ var/list/world_uplinks = list() var/list/nano = new var/list/reference = new - for(var/category in ItemsCategory) + for(var/category in uplink_items) nano[++nano.len] = list("Category" = category, "items" = list()) - for(var/datum/uplink_item/I in ItemsCategory[category]) + for(var/datum/uplink_item/I in uplink_items[category]) if(I.job && I.job.len) if(!(I.job.Find(job))) continue @@ -117,6 +117,9 @@ var/list/world_uplinks = list() if(..()) return 1 + if(href_list["refund"]) + refund(usr) + if(href_list["buy_item"] == "random") var/datum/uplink_item/UI = chooseRandomItem() href_list["buy_item"] = UI.reference @@ -142,6 +145,22 @@ var/list/world_uplinks = list() return 1 +/obj/item/uplink/proc/refund(mob/user as mob) + var/obj/item/I = user.get_active_hand() + if(I) // Make sure there's actually something in the hand before even bothering to check + for(var/category in uplink_items) + for(var/item in uplink_items[category]) + var/datum/uplink_item/UI = item + var/path = UI.refund_path || UI.item + var/cost = UI.refund_amount || UI.cost + if(I.type == path && UI.refundable && I.check_uplink_validity()) + uses += cost + used_TC -= cost + to_chat(user, "[I] refunded.") + qdel(I) + return + ..() + // HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. /* How to create an uplink in 3 easy steps! @@ -287,17 +306,6 @@ var/list/world_uplinks = list() return 1 return 0 -//Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it) -/obj/item/radio/uplink/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/antag_spawner/borg_tele)) - var/obj/item/antag_spawner/borg_tele/S = W - if(!S.used && !S.checking) - hidden_uplink.uses += S.TC_cost - qdel(S) - to_chat(user, "Teleporter refunded.") - else - to_chat(user, "This teleporter is already used, or is currently being used.") - // PRESET UPLINKS // A collection of preset uplinks. // diff --git a/code/game/objects/items/mixing_bowl.dm b/code/game/objects/items/mixing_bowl.dm new file mode 100644 index 00000000000..1edfdac9561 --- /dev/null +++ b/code/game/objects/items/mixing_bowl.dm @@ -0,0 +1,170 @@ + +/obj/item/mixing_bowl + name = "mixing bowl" + desc = "Mixing it up in the kitchen." + flags = OPENCONTAINER + icon = 'icons/obj/kitchen.dmi' + icon_state = "mixing_bowl" + var/max_n_of_items = 25 + var/dirty = FALSE + var/clean_icon = "mixing_bowl" + var/dirty_icon = "mixing_bowl_dirty" + +/obj/item/mixing_bowl/New() + ..() + create_reagents(100) + +/obj/item/mixing_bowl/attackby(obj/item/I, mob/user, params) + if(dirty) + if(istype(I, /obj/item/soap)) + user.visible_message("[user] starts to scrub [src].", "You start to scrub [src].") + if(do_after(user, 20 * I.toolspeed, target = src)) + clean() + user.visible_message("[user] has scrubbed [src] clean.", "You have scrubbed [src] clean.") + return 1 + else + to_chat(user, "You should clean [src] before you use it for food prep.") + return 0 + if(is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_MICROWAVE]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_GRILL]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_OVEN]) || is_type_in_list(I, GLOB.cooking_ingredients[RECIPE_CANDY])) + if(contents.len>=max_n_of_items) + to_chat(user, "This [src] is full of ingredients, you cannot put more.") + return 1 + if(istype(I, /obj/item/stack)) + var/obj/item/stack/S = I + if(S.amount > 1) + var/obj/item/stack/to_add = S.split(user, 1) + to_add.forceMove(src) + user.visible_message("[user] adds one of [S] to [src].", "You add one of [S] to [src].") + else + return add_item(S, user) + else + return add_item(I, user) + else if(is_type_in_list(I, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment))) + if(!I.reagents) + return 1 + for(var/datum/reagent/R in I.reagents.reagent_list) + if(!(R.id in GLOB.cooking_reagents[RECIPE_MICROWAVE]) && !(R.id in GLOB.cooking_reagents[RECIPE_GRILL]) && !(R.id in GLOB.cooking_reagents[RECIPE_OVEN]) && !(R.id in GLOB.cooking_reagents[RECIPE_CANDY])) + to_chat(user, "Your [I] contains components unsuitable for cookery.") + return 1 + else + to_chat(user, "You have no idea what you can cook with [I].") + return 1 + +/obj/item/mixing_bowl/proc/add_item(obj/item/I, mob/user) + if(!user.drop_item()) + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in [src]") + //return 0 + else + I.forceMove(src) + user.visible_message("[user] adds [I] to [src].", "You add [I] to [src].") + +/obj/item/mixing_bowl/attack_self(mob/user) + var/dat = "" + if(dirty) + dat = {"This [src] is dirty!
    Please clean it before use!
    "} + else + var/list/items_counts = new + var/list/items_measures = new + var/list/items_measures_p = new + for(var/obj/O in contents) + var/display_name = O.name + if(istype(O,/obj/item/reagent_containers/food/snacks/egg)) + items_measures[display_name] = "egg" + items_measures_p[display_name] = "eggs" + if(istype(O,/obj/item/reagent_containers/food/snacks/tofu)) + items_measures[display_name] = "tofu chunk" + items_measures_p[display_name] = "tofu chunks" + if(istype(O,/obj/item/reagent_containers/food/snacks/meat)) //any meat + items_measures[display_name] = "slab of meat" + items_measures_p[display_name] = "slabs of meat" + if(istype(O,/obj/item/reagent_containers/food/snacks/donkpocket)) + display_name = "Turnovers" + items_measures[display_name] = "turnover" + items_measures_p[display_name] = "turnovers" + if(istype(O,/obj/item/reagent_containers/food/snacks/carpmeat)) + items_measures[display_name] = "fillet of meat" + items_measures_p[display_name] = "fillets of meat" + items_counts[display_name]++ + for(var/O in items_counts) + var/N = items_counts[O] + if(!(O in items_measures)) + dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
    "} + else + if(N==1) + dat += {"[capitalize(O)]: [N] [items_measures[O]]
    "} + else + dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
    "} + + for(var/datum/reagent/R in reagents.reagent_list) + var/display_name = R.name + if(R.id == "capsaicin") + display_name = "Hotsauce" + if(R.id == "frostoil") + display_name = "Coldsauce" + dat += {"[display_name]: [R.volume] unit\s
    "} + + if(items_counts.len==0 && reagents.reagent_list.len==0) + dat = {"The [src] is empty
    "} + else + dat = {"Ingredients:
    [dat]"} + dat += {"

    Eject ingredients!
    "} + + var/datum/browser/popup = new(user, name, name, 400, 400) + popup.set_content(dat) + popup.open(0) + onclose(user, "[name]") + return + +/obj/item/mixing_bowl/Topic(href, href_list) + if(..()) + return + if("dispose") + dispose() + return + +/obj/item/mixing_bowl/proc/dispose() + for(var/obj/O in contents) + O.forceMove(loc) + if(reagents.total_volume) + make_dirty(5) + reagents.clear_reagents() + to_chat(usr, "You dispose of [src]'s contents.") + updateUsrDialog() + +/obj/item/mixing_bowl/proc/make_dirty(chance) + if(!chance) + return + if(prob(chance)) + dirty = TRUE + flags = null + icon_state = dirty_icon + +/obj/item/mixing_bowl/proc/clean() + dirty = FALSE + flags = OPENCONTAINER + icon_state = clean_icon + +/obj/item/mixing_bowl/wash(mob/user, atom/source) + if(..()) + clean() + +/obj/item/mixing_bowl/proc/fail(obj/source) + if(!source) + source = src + var/amount = 0 + for(var/obj/O in contents) + amount++ + if(O.reagents) + var/id = O.reagents.get_master_reagent_id() + if(id) + amount+=O.reagents.get_reagent_amount(id) + qdel(O) + if(reagents && reagents.total_volume) + var/id = reagents.get_master_reagent_id() + if(id) + amount += reagents.get_reagent_amount(id) + reagents.clear_reagents() + var/obj/item/reagent_containers/food/snacks/badrecipe/ffuu = new(get_turf(source)) + ffuu.reagents.add_reagent("carbon", amount) + ffuu.reagents.add_reagent("????", amount/10) + make_dirty(75) \ No newline at end of file diff --git a/code/game/objects/items/mountable_frames/extinguisher_frame.dm b/code/game/objects/items/mountable_frames/extinguisher_frame.dm new file mode 100644 index 00000000000..5356a154a6d --- /dev/null +++ b/code/game/objects/items/mountable_frames/extinguisher_frame.dm @@ -0,0 +1,10 @@ +/obj/item/mounted/frame/extinguisher + name = "Extinguisher Cabinet Frame" + desc = "Used for building extinguisher cabinet" + icon = 'icons/obj/closet.dmi' + icon_state = "extinguisher_frame" + mount_reqs = list("simfloor", "nospace") + +/obj/item/mounted/frame/extinguisher/do_build(turf/on_wall, mob/user) + new /obj/structure/extinguisher_cabinet/empty(get_turf(src), get_dir(user, on_wall)) + qdel(src) diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index d5719261ec8..212f32e0121 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -68,12 +68,12 @@ var/global/list/datum/stack_recipe/gold_recipes = list ( \ ) var/global/list/datum/stack_recipe/plasma_recipes = list ( \ - new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe/dangerous("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ null, \ - new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \ + new/datum/stack_recipe/dangerous("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20), \ null, \ - new/datum/stack_recipe("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \ - new/datum/stack_recipe("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe/dangerous("Scientist Statue", /obj/structure/statue/plasma/scientist, 5, one_per_turf = 1, on_floor = 1), \ + new/datum/stack_recipe/dangerous("Xenomorph Statue", /obj/structure/statue/plasma/xeno, 5, one_per_turf = 1, on_floor = 1), \ ) var/global/list/datum/stack_recipe/bananium_recipes = list ( \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 5ef40ee25e8..90876bcf55c 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -90,6 +90,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list( new /datum/stack_recipe("air alarm frame", /obj/item/mounted/frame/alarm_frame, 2), new /datum/stack_recipe("fire alarm frame", /obj/item/mounted/frame/firealarm, 2), new /datum/stack_recipe("intercom frame", /obj/item/mounted/frame/intercom, 2), + new /datum/stack_recipe("extinguisher cabinet frame", /obj/item/mounted/frame/extinguisher, 2), null ) @@ -170,7 +171,6 @@ var/global/list/datum/stack_recipe/wood_recipes = list( new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40), new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), - new /datum/stack_recipe("easel", /obj/structure/easel, 3, one_per_turf = 1, on_floor = 1), new /datum/stack_recipe("wooden buckler", /obj/item/shield/riot/buckler, 20, time = 40), new /datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50), new /datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10), diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index e55569b23e8..b6b3021a08e 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -31,7 +31,10 @@ /obj/item/stack/examine(mob/user) if(..(user, 1)) - to_chat(user, "There are [amount] [singular_name]\s in the stack.") + if(singular_name) + to_chat(user, "There are [amount] [singular_name]\s in the stack.") + else + to_chat(user, "There are [amount] [name]\s in the stack.") /obj/item/stack/attack_self(mob/user) list_recipes(user) diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm index 10d06e9741d..2a2e91ef599 100644 --- a/code/game/objects/items/stacks/stack_recipe.dm +++ b/code/game/objects/items/stacks/stack_recipe.dm @@ -35,6 +35,14 @@ result.color = S.color ..() + +/datum/stack_recipe/dangerous +/datum/stack_recipe/dangerous/post_build(/obj/item/stack/S, /obj/result) + var/turf/targ = get_turf(usr) + message_admins("[title] made by [key_name_admin(usr)](?) in [get_area(usr)] [ADMIN_COORDJMP(targ)]!",0,1) + log_game("[title] made by [key_name_admin(usr)] at [get_area(usr)] [targ.x], [targ.y], [targ.z].") + ..() + /datum/stack_recipe/rods /datum/stack_recipe/rods/post_build(var/obj/item/stack/S, var/obj/result) if(istype(result, /obj/item/stack/rods)) diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 5325fb06b77..aa3f23f99b7 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -39,6 +39,9 @@ atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 5) user.visible_message("[user.name] sets the plasma tiles on fire!", \ "You set the plasma tiles on fire!") + message_admins("Plasma tiles ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1) + log_game("Plasma tiles ignited by [key_name(user)] in ([x],[y],[z])") + investigate_log("was ignited by [key_name(user)]","atmos") qdel(src) return diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index c28fd68fc62..20766ef38cb 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -6,14 +6,26 @@ w_class = WEIGHT_CLASS_TINY var/colour = "red" var/open = 0 + var/list/lipstick_colors = list( + "purple" = "purple", + "jade" = "#216F43", + "lime" = "lime", + "black" = "black", + "green" = "green", + "blue" = "blue", + "white" = "white") + /obj/item/lipstick/purple name = "purple lipstick" colour = "purple" /obj/item/lipstick/jade - //It's still called Jade, but theres no HTML color for jade, so we use lime. name = "jade lipstick" + colour = "#216F43" + +/obj/item/lipstick/lime + name = "lime lipstick" colour = "lime" /obj/item/lipstick/black @@ -36,8 +48,9 @@ name = "lipstick" /obj/item/lipstick/random/New() - colour = pick("red","purple","lime","black","green","blue","white") - name = "[colour] lipstick" + var/lscolor = pick(lipstick_colors)//A random color is picked from the var defined initially in a new var. + colour = lipstick_colors[lscolor]//The color of the lipstick is pulled from the new variable (right hand side, HTML & Hex RGB) + name = "[lscolor] lipstick"//The new variable is also used to match the name to the color of the lipstick. Kudos to Desolate & Lemon /obj/item/lipstick/attack_self(mob/user as mob) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index b1fc3398af0..c37c1cce2c8 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -293,6 +293,10 @@ update_icon() return unwield(user) +/obj/item/twohanded/shockpaddles/on_mob_move(dir, mob/user) + if(defib && !(defib.Adjacent(user))) + defib.remove_paddles(user) + /obj/item/twohanded/shockpaddles/proc/check_defib_exists(mainunit, var/mob/living/carbon/human/M, var/obj/O) if(!mainunit || !istype(mainunit, /obj/item/defibrillator)) //To avoid weird issues from admin spawns M.unEquip(O) diff --git a/code/game/objects/items/weapons/garrote.dm b/code/game/objects/items/weapons/garrote.dm index 4a01914a31a..03125313656 100644 --- a/code/game/objects/items/weapons/garrote.dm +++ b/code/game/objects/items/weapons/garrote.dm @@ -84,8 +84,7 @@ unwield(U) U.swap_hand() // For whatever reason the grab will not properly work if we don't have the free hand active. - M.grabbedby(U, 1) - var/obj/item/grab/G = U.get_active_hand() + var/obj/item/grab/G = M.grabbedby(U, 1) U.swap_hand() if(G && istype(G)) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index d9aee2c5347..5a6131b2d4a 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -135,6 +135,7 @@ desc = "You can use this to wrap items in." icon = 'icons/obj/items.dmi' icon_state = "wrap_paper" + singular_name = "wrapping paper" flags = NOBLUDGEON amount = 25 max_amount = 25 diff --git a/code/game/objects/items/weapons/implants/implantcase.dm b/code/game/objects/items/weapons/implants/implantcase.dm index db8f9f549d5..ad53a49d084 100644 --- a/code/game/objects/items/weapons/implants/implantcase.dm +++ b/code/game/objects/items/weapons/implants/implantcase.dm @@ -16,7 +16,7 @@ if(imp) icon_state = "implantcase-[imp.item_color]" origin_tech = imp.origin_tech - flags = imp.flags + flags = imp.flags & ~DROPDEL reagents = imp.reagents else icon_state = "implantcase-0" diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 047a75bd634..c705374f7a9 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -160,7 +160,7 @@ if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort var/mob/living/carbon/C = hit_atom - if(!C.legcuffed) + if(!C.legcuffed && C.get_num_legs() >= 2) visible_message("[src] ensnares [C]!") C.legcuffed = src forceMove(C) diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm index e130c3ed606..c139155b57c 100644 --- a/code/game/objects/items/weapons/rpd.dm +++ b/code/game/objects/items/weapons/rpd.dm @@ -192,7 +192,27 @@ var/list/pipemenu = list( return if(world.time < lastused + spawndelay) return - target.rpd_act(user, src) //Handle RPD effects in separate procs + + + var/turf/T = get_turf(target) + if(target != T) + // We only check the rpd_act of the target if it isn't the turf, because otherwise + // (A) blocked turfs can be acted on, and (B) unblocked turfs get acted on twice. + if(target.rpd_act(user, src) == TRUE) + // If the object we are clicking on has a valid RPD interaction for just that specific object, do that and nothing else. + // Example: clicking on a pipe with a RPD in rotate mode should rotate that pipe and ignore everything else on the tile. + return + + // If we get this far, we have to check every object in the tile, to make sure that none of them block RPD usage on this tile. + // This is done by calling rpd_blocksusage on every /obj in the tile. If any block usage, fail at this point. + + for(var/obj/O in T) + if(O.rpd_blocksusage() == TRUE) + to_chat(user, "[O] blocks the [src]!") + return + + // If we get here, then we're effectively acting on the turf, probably placing a pipe. + T.rpd_act(user, src) #undef RPD_COOLDOWN_TIME #undef RPD_WALLBUILD_TIME diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 9d4481952f5..65524fec445 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -127,12 +127,48 @@ /obj/item/flashlight/pen, /obj/item/clothing/mask/surgical, /obj/item/clothing/gloves/color/latex, - /obj/item/reagent_containers/hypospray/autoinjector, - /obj/item/rad_laser, + /obj/item/reagent_containers/hypospray/autoinjector, + /obj/item/reagent_containers/hypospray/CMO, + /obj/item/reagent_containers/hypospray/safety, + /obj/item/rad_laser, /obj/item/sensor_device, /obj/item/wrench/medical, ) +/obj/item/storage/belt/medical/surgery + max_w_class = WEIGHT_CLASS_NORMAL + max_combined_w_class = 17 + use_to_pickup = 1 + name = "Surgical Belt" + desc = "Can hold various surgical tools." + storage_slots = 9 + use_item_overlays = 1 + can_hold = list( + /obj/item/scalpel, + /obj/item/hemostat, + /obj/item/retractor, + /obj/item/circular_saw, + /obj/item/bonegel, + /obj/item/bonesetter, + /obj/item/FixOVein, + /obj/item/surgicaldrill, + /obj/item/cautery, + ) + +/obj/item/storage/belt/medical/surgery/loaded + +/obj/item/storage/belt/medical/surgery/loaded/New() + ..() + new /obj/item/scalpel(src) + new /obj/item/hemostat(src) + new /obj/item/retractor(src) + new /obj/item/circular_saw(src) + new /obj/item/bonegel(src) + new /obj/item/bonesetter(src) + new /obj/item/FixOVein(src) + new /obj/item/surgicaldrill(src) + new /obj/item/cautery(src) + /obj/item/storage/belt/medical/response_team /obj/item/storage/belt/medical/response_team/New() @@ -203,7 +239,7 @@ /obj/item/storage/belt/security/response_team/New() ..() - new /obj/item/kitchen/knife/combat(src) + new /obj/item/reagent_containers/spray/pepper(src) new /obj/item/melee/baton/loaded(src) new /obj/item/flash(src) new /obj/item/melee/classic_baton/telescopic(src) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index ddc8b79012f..3bed8e15333 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -231,6 +231,15 @@ ..() base_name = name +/obj/item/storage/pill_bottle/ert/New() + ..() + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/salicylic(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + new /obj/item/reagent_containers/food/pill/charcoal(src) + /obj/item/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri if(ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~ var/mob/M = usr diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 66316b6f7ef..f24b60c62d0 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -352,6 +352,10 @@ W.fire_act() return 1 +/obj/item/storage/Exited(atom/A, loc) + remove_from_storage(A, loc) //worry not, comrade; this only gets called once + ..() + /obj/item/storage/empty_object_contents(burn, loc) for(var/obj/item/Item in contents) remove_from_storage(Item, loc, burn) @@ -553,3 +557,6 @@ else log_runtime(EXCEPTION("Non-list thing found in storage/deserialize."), src, list("Thing: [thing]")) ..() + +/obj/item/storage/AllowDrop() + return TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 06eaae8421c..2b93bec6b52 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -49,9 +49,6 @@ if(front_id) switch(front_id.icon_state) - if("id") - icon_state = "walletid" - return if("silver") icon_state = "walletid_silver" return @@ -61,6 +58,9 @@ if("centcom") icon_state = "walletid_centcom" return + else + icon_state = "walletid" + return icon_state = "wallet" @@ -124,9 +124,6 @@ /obj/item/storage/wallet/color/update_icon() if(front_id) switch(front_id.icon_state) - if("id") - icon_state = "[item_color]_walletid" - return if("silver") icon_state = "[item_color]_walletid_silver" return @@ -136,6 +133,9 @@ if("centcom") icon_state = "[item_color]_walletid_centcom" return + else + icon_state = "[item_color]_walletid" + return icon_state = "[item_color]_wallet" /obj/item/storage/wallet/color/blue diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 57e0290346e..b8437f3b7ed 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -3,6 +3,7 @@ desc = "A roll of sticky tape. Possibly for taping ducks... or was that ducts?" icon = 'icons/obj/bureaucracy.dmi' icon_state = "taperoll" + singular_name = "tape roll" w_class = WEIGHT_CLASS_TINY amount = 10 max_amount = 10 diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 43904d27359..08a6a3e168c 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -1,3 +1,5 @@ +#define HEALPERWELD 15 + /* Tools! * Note: Multitools are in devices * @@ -407,24 +409,47 @@ to_chat(user, "Turn on [src] before attempting repairs!") return 1 - if(S.brute_dam) - if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP) - if(get_fuel() >= 1) - if(H == user) - if(!do_mob(user, H, 10)) - return 1 - if(remove_fuel(1,null)) - playsound(src.loc, usesound, 50, 1) - S.heal_damage(15,0,0,1) - user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].") - else if(S.open != 2) - to_chat(user, "Need more welding fuel!") - return 1 - else - to_chat(user, "The damage is far too severe to patch over externally.") - return 1 - else if(S.open != 2) + if(S.brute_dam > ROBOLIMB_SELF_REPAIR_CAP) + to_chat(user, "The damage is far too severe to patch over externally.") + return + + if(!S.brute_dam) to_chat(user, "Nothing to fix!") + return + + if(get_fuel() >= 1) + if(H == user) + if(!do_mob(user, H, 10)) + return 1 + if(!remove_fuel(1,null)) + to_chat(user, "Need more welding fuel!") + var/rembrute = HEALPERWELD + var/nrembrute = 0 + var/childlist + if(!isnull(S.children)) + childlist = S.children.Copy() + var/parenthealed = FALSE + while(rembrute > 0) + var/obj/item/organ/external/E + if(S.brute_dam) + E = S + else if(LAZYLEN(childlist)) + E = pick_n_take(childlist) + if(!E.brute_dam || !E.is_robotic()) + continue + else if(S.parent && !parenthealed) + E = S.parent + parenthealed = TRUE + if(!E.brute_dam || !E.is_robotic()) + break + else + break + playsound(src.loc, usesound, 50, 1) + nrembrute = max(rembrute - E.brute_dam, 0) + E.heal_damage(rembrute,0,0,1) + rembrute = nrembrute + user.visible_message("\The [user] patches some dents on \the [M]'s [E.name] with \the [src].") + return 1 else return ..() diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a7e57ce5a52..29d3f2663bc 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -71,10 +71,6 @@ SSnanoui.close_uis(src) return ..() -/obj/rpd_act(mob/user, obj/item/rpd/our_rpd) - var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs - T.rpd_act(user, our_rpd) - /obj/proc/process() set waitfor = 0 processing_objects.Remove(src) @@ -307,3 +303,6 @@ a { .["Make speed process"] = "?_src_=vars;makespeedy=[UID()]" else .["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]" + +/obj/proc/check_uplink_validity() + return 1 diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm deleted file mode 100644 index 4d02555eac5..00000000000 --- a/code/game/objects/structures/artstuff.dm +++ /dev/null @@ -1,136 +0,0 @@ -/////////// -// EASEL // -/////////// - -/obj/structure/easel - name = "easel" - desc = "only for the finest of art!" - icon = 'icons/obj/artstuff.dmi' - icon_state = "easel" - density = 1 - burn_state = FLAMMABLE - burntime = 15 - var/obj/item/canvas/painting = null - -/obj/structure/easel/Destroy() - QDEL_NULL(painting) - return ..() - -//Adding canvases -/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params) - if(istype(I, /obj/item/canvas)) - var/obj/item/canvas/C = I - user.unEquip(C) - painting = C - C.loc = get_turf(src) - C.layer = layer+0.1 - user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].") - return - - ..() - - -//Stick to the easel like glue -/obj/structure/easel/Move() - var/turf/T = get_turf(src) - ..() - if(painting && painting.loc == T) //Only move if it's near us. - painting.loc = get_turf(src) - else - painting = null - - -////////////// -// CANVASES // -////////////// - -#define AMT_OF_CANVASES 4 //Keep this up to date or shit will break. - -//To safe memory on making /icons we cache the blanks.. -var/global/list/globalBlankCanvases[AMT_OF_CANVASES] - -/obj/item/canvas - name = "11px by 11px canvas" - desc = "Draw out your soul on this canvas! Only crayons can draw on it. Examine it to focus on the canvas." - icon = 'icons/obj/artstuff.dmi' - icon_state = "11x11" - burn_state = FLAMMABLE - var/whichGlobalBackup = 1 //List index - -/obj/item/canvas/nineteenXnineteen - name = "19px by 19px canvas" - icon_state = "19x19" - whichGlobalBackup = 2 - -/obj/item/canvas/twentythreeXnineteen - name = "23px by 19px canvas" - icon_state = "23x19" - whichGlobalBackup = 3 - -/obj/item/canvas/twentythreeXtwentythree - name = "23px by 23px canvas" - icon_state = "23x23" - whichGlobalBackup = 4 - - -//Find the right size blank canvas -/obj/item/canvas/proc/getGlobalBackup() - . = null - if(globalBlankCanvases[whichGlobalBackup]) - . = globalBlankCanvases[whichGlobalBackup] - else - var/icon/I = icon(initial(icon),initial(icon_state)) - globalBlankCanvases[whichGlobalBackup] = I - . = I - - - -//One pixel increments -/obj/item/canvas/attackby(var/obj/item/I, var/mob/user, params) - //Click info - var/list/click_params = params2list(params) - var/pixX = text2num(click_params["icon-x"]) - var/pixY = text2num(click_params["icon-y"]) - - //Should always be true, otherwise you didn't click the object, but let's check because SS13~ - if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) - return - - var/icon/masterpiece = icon(icon,icon_state) - //Cleaning one pixel with a soap or rag - if(istype(I, /obj/item/soap) || istype(I, /obj/item/reagent_containers/glass/rag)) - //Pixel info created only when needed - var/thePix = masterpiece.GetPixel(pixX,pixY) - var/icon/Ico = getGlobalBackup() - if(!Ico) - qdel(masterpiece) - return - - var/theOriginalPix = Ico.GetPixel(pixX,pixY) - if(thePix != theOriginalPix) //colour changed - DrawPixelOn(theOriginalPix,pixX,pixY) - qdel(masterpiece) - return 1 - - //Drawing one pixel with a crayon - if(istype(I, /obj/item/toy/crayon)) - var/obj/item/toy/crayon/C = I - var/pix = masterpiece.GetPixel(pixX, pixY) - if(pix && pix != C.colour) // if the located pixel isn't blank (null)) - DrawPixelOn(C.colour, pixX, pixY) - qdel(masterpiece) - return 1 - - ..() - -//Clean the whole canvas -/obj/item/canvas/attack_self(var/mob/user) - if(!user) - return - var/icon/blank = getGlobalBackup() - if(blank) - //it's basically a giant etch-a-sketch - icon = blank - user.visible_message("[user] cleans the canvas.","You clean the canvas.") - -#undef AMT_OF_CANVASES \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 76f0bab19d5..2f681c79d76 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -7,9 +7,9 @@ armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0) var/icon_closed = "closed" var/icon_opened = "open" - var/opened = 0 - var/welded = 0 - var/locked = 0 + var/opened = FALSE + var/welded = FALSE + var/locked = FALSE var/wall_mounted = 0 //never solid (You can always pass over it) var/health = 100 var/lastbang @@ -34,19 +34,20 @@ return ..() /obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0) - if(height==0 || wall_mounted) return 1 + if(height==0 || wall_mounted) + return TRUE return (!density) /obj/structure/closet/proc/can_open() if(welded) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/closet/proc/can_close() for(var/obj/structure/closet/closet in get_turf(src)) if(closet != src && closet.anchored != 1) - return 0 - return 1 + return FALSE + return TRUE /obj/structure/closet/proc/dump_contents() var/turf/T = get_turf(src) @@ -59,27 +60,27 @@ /obj/structure/closet/proc/open() if(opened) - return 0 + return FALSE if(!can_open()) - return 0 + return FALSE dump_contents() icon_state = icon_opened - opened = 1 + opened = TRUE if(sound) playsound(loc, sound, 15, 1, -3) else playsound(loc, 'sound/machines/click.ogg', 15, 1, -3) density = 0 - return 1 + return TRUE /obj/structure/closet/proc/close() if(!opened) - return 0 + return FALSE if(!can_close()) - return 0 + return FALSE var/itemcount = 0 @@ -109,13 +110,13 @@ itemcount++ icon_state = icon_closed - opened = 0 + opened = FALSE if(sound) playsound(loc, sound, 15, 1, -3) else playsound(loc, 'sound/machines/click.ogg', 15, 1, -3) density = 1 - return 1 + return TRUE /obj/structure/closet/proc/toggle(mob/user) if(!(opened ? close() : open())) @@ -246,7 +247,7 @@ if(istype(W, /obj/item/grab)) MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet if(istype(W,/obj/item/tk_grab)) - return 0 + return FALSE if(istype(W, cutting_tool)) if(istype(W, /obj/item/weldingtool)) var/obj/item/weldingtool/WT = W @@ -264,7 +265,7 @@ var/turf/T = get_turf(src) new material_drop(T, material_drop_amount) qdel(src) - return + return if(isrobot(user)) return if(!user.drop_item()) //couldn't drop the item @@ -371,8 +372,9 @@ // should be independently resolved, but this is also an interesting twist. /obj/structure/closet/Exit(atom/movable/AM) open() - if(AM.loc == src) return 0 - return 1 + if(AM.loc == src) + return FALSE + return TRUE /obj/structure/closet/container_resist(var/mob/living/L) var/breakout_time = 2 //2 minutes by default @@ -404,7 +406,7 @@ return //Well then break it! - welded = 0 + welded = FALSE update_icon() to_chat(usr, "You successfully break out!") for(var/mob/O in viewers(L.loc)) @@ -421,4 +423,7 @@ /obj/structure/closet/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) \ No newline at end of file + user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + +/obj/structure/closet/AllowDrop() + return TRUE \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm index 1d52dbcdf1b..be67d79272f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/depot.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/depot.dm @@ -6,6 +6,8 @@ anchored = 1 health = 200 req_access = list() + var/is_armory = FALSE + var/ignore_use = FALSE /obj/structure/closet/secure_closet/syndicate/depot/New() @@ -26,9 +28,12 @@ . = ..() /obj/structure/closet/secure_closet/syndicate/depot/proc/loot_pickup() - var/area/syndicate_depot/core/depotarea = areaMaster - if(depotarea) - depotarea.locker_looted() + if(!ignore_use) + var/area/syndicate_depot/core/depotarea = areaMaster + if(istype(depotarea)) + depotarea.locker_looted() + if(is_armory) + depotarea.armory_locker_looted() /obj/structure/closet/secure_closet/syndicate/depot/attack_animal(mob/M) if(isanimal(M) && "syndicate" in M.faction) @@ -36,10 +41,26 @@ return return ..(M) +/obj/structure/closet/secure_closet/syndicate/depot/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/rcs)) + to_chat(user, "Bluespace interference prevents the [W] from locking onto [src]!") + return + return ..() + /obj/structure/closet/secure_closet/syndicate/depot/emp_act(severity) return /obj/structure/closet/secure_closet/syndicate/depot/togglelock(mob/user) . = ..() if(!locked) - loot_pickup() \ No newline at end of file + loot_pickup() + +/obj/structure/closet/secure_closet/syndicate/depot/attack_ghost(mob/user) + if(user.can_advanced_admin_interact()) + ignore_use = TRUE + toggle(user) + ignore_use = FALSE + +/obj/structure/closet/secure_closet/syndicate/depot/armory + req_access = list(access_syndicate) + is_armory = TRUE \ No newline at end of file diff --git a/code/game/objects/structures/depot.dm b/code/game/objects/structures/depot.dm index 9dfe256ce38..b655d010aa7 100644 --- a/code/game/objects/structures/depot.dm +++ b/code/game/objects/structures/depot.dm @@ -7,15 +7,24 @@ anchored = 1 max_integrity = 50 var/area/syndicate_depot/core/depotarea + var/has_overloaded = FALSE /obj/structure/fusionreactor/Initialize() - . = ..() + ..() depotarea = areaMaster - if(depotarea) + if(istype(depotarea)) depotarea.reactor = src + return INITIALIZE_HINT_LATELOAD + +/obj/structure/fusionreactor/LateInitialize() + for(var/obj/machinery/porta_turret/syndicate/T in range(50, loc)) + if(!istype(T.depotarea)) + T.depotarea = depotarea /obj/structure/fusionreactor/Destroy() - if(depotarea) + if(istype(depotarea)) + if(!has_overloaded) + overload(TRUE, TRUE) depotarea.reactor = null ..() @@ -30,7 +39,7 @@ healthcheck() /obj/structure/fusionreactor/proc/healthcheck() - if(obj_integrity <= 0) + if(obj_integrity <= 0 && istype(depotarea)) overload(TRUE) /obj/structure/fusionreactor/attackby(obj/item/I, mob/user, params) @@ -47,13 +56,20 @@ else return ..() -/obj/structure/fusionreactor/proc/overload(containment_failure) +/obj/structure/fusionreactor/proc/overload(containment_failure = FALSE, skip_qdel = FALSE) + if(has_overloaded) + return + has_overloaded = TRUE + if(istype(depotarea) && !depotarea.used_self_destruct) + depotarea.activate_self_destruct("Fusion reactor cracked open. Core loose!", TRUE) var/obj/effect/overload/O = new /obj/effect/overload(get_turf(src)) if(containment_failure) playsound(loc, 'sound/machines/Alarm.ogg', 100, 0, 0) O.deliberate = TRUE O.max_cycles = 6 - qdel(src) + if(!skip_qdel) + qdel(src) + /obj/effect/overload icon = 'icons/obj/tesla_engine/energy_ball.dmi' diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 048961defd5..568fb0ededc 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -1,3 +1,8 @@ +#define NO_EXTINGUISHER 0 +#define NORMAL_EXTINGUISHER 1 +#define MINI_EXTINGUISHER 2 + + /obj/structure/extinguisher_cabinet name = "extinguisher cabinet" desc = "A small wall mounted cabinet designed to hold a fire extinguisher." @@ -5,13 +10,28 @@ icon_state = "extinguisher_closed" anchored = 1 density = 0 - var/obj/item/extinguisher/has_extinguisher = new/obj/item/extinguisher + var/obj/item/extinguisher/has_extinguisher = null + var/extinguishertype var/opened = 0 + var/material_drop = /obj/item/stack/sheet/metal + +/obj/structure/extinguisher_cabinet/New(turf/loc, ndir = null) + ..() + if(ndir) + pixel_x = (ndir & EAST|WEST) ? (ndir == EAST ? 28 : -28) : 0 + pixel_y = (ndir & NORTH|SOUTH)? (ndir == WEST ? 28 : -28) : 0 + switch(extinguishertype) + if(NO_EXTINGUISHER) + return + if(MINI_EXTINGUISHER) + has_extinguisher = new/obj/item/extinguisher/mini + else + has_extinguisher = new/obj/item/extinguisher /obj/structure/extinguisher_cabinet/Destroy() QDEL_NULL(has_extinguisher) return ..() - + /obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user, params) if(isrobot(user) || isalien(user)) return @@ -23,13 +43,34 @@ to_chat(user, "You place [O] in [src].") else opened = !opened + else if(istype(O, /obj/item/weldingtool)) + if(has_extinguisher) + to_chat(user, "You need to remove the extinguisher before deconstructing the cabinet!") + return + if(!opened) + to_chat(user, "Open the cabinet before cutting it apart!") + return + var/obj/item/weldingtool/WT = O + if(!WT.remove_fuel(0, user)) + return + to_chat(user, "You begin cutting [src] apart...") + playsound(loc, WT.usesound, 40, 1) + if(do_after(user, 40 * WT.toolspeed, 1, target = src)) + if(!src ||!opened || !WT.isOn()) // !src to prevent it being duped + return + visible_message("[user] slices apart [src].", + "You cut [src] apart with [WT].", + "You hear welding.") + var/turf/T = get_turf(src) + new material_drop(T) + qdel(src) else opened = !opened update_icon() - /obj/structure/extinguisher_cabinet/attack_hand(mob/user) if(isrobot(user) || isalien(user)) + to_chat(user, "You don't have the dexterity to do this!") return if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -70,3 +111,11 @@ icon_state = "extinguisher_full" else icon_state = "extinguisher_empty" + +/obj/structure/extinguisher_cabinet/empty/New(turf/loc, ndir = null) + extinguishertype = NO_EXTINGUISHER + ..() + +#undef NO_EXTINGUISHER +#undef NORMAL_EXTINGUISHER +#undef MINI_EXTINGUISHER diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 4ef1978cffb..cb7350f5b34 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -47,6 +47,11 @@ new /obj/item/stack/sheet/metal(get_turf(src)) qdel(src) +/obj/structure/girder/temperature_expose(datum/gas_mixture/air, exposed_temperature) + var/temp_check = exposed_temperature + if(temp_check >= GIRDER_MELTING_TEMP) + take_damage(10) + /obj/structure/girder/attackby(obj/item/W, mob/user, params) add_fingerprint(user) if(isscrewdriver(W)) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 7d7c9628d63..0f85d0bb8eb 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -54,6 +54,7 @@ /obj/structure/mirror/attackby(obj/item/I, mob/living/user, params) + user.changeNext_move(CLICK_CD_MELEE) if(isscrewdriver(I)) user.visible_message("[user] begins to unfasten [src].", "You begin to unfasten [src].") if(do_after(user, 30 * I.toolspeed, target = src)) @@ -80,6 +81,7 @@ /obj/structure/mirror/attack_alien(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) if(islarva(user)) return user.do_attack_animation(src) @@ -91,6 +93,7 @@ /obj/structure/mirror/attack_animal(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) if(!isanimal(user)) return var/mob/living/simple_animal/M = user @@ -105,6 +108,7 @@ /obj/structure/mirror/attack_slime(mob/living/user) + user.changeNext_move(CLICK_CD_MELEE) var/mob/living/carbon/slime/S = user if(!S.is_adult) return @@ -125,4 +129,4 @@ /obj/item/mounted/mirror/do_build(turf/on_wall, mob/user) var/obj/structure/mirror/M = new /obj/structure/mirror(get_turf(user), get_dir(on_wall, user), 1) transfer_prints_to(M, TRUE) - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 179615dada3..31bfadee7d7 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -243,7 +243,7 @@ icon_state = "shower" density = 0 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE var/on = 0 var/obj/effect/mist/mymist = null var/ismist = 0 //needs a var so we can make it linger~ @@ -756,4 +756,3 @@ qdel(src) if(prob(50)) new /obj/item/stack/sheet/cardboard(T) - diff --git a/code/game/response_team.dm b/code/game/response_team.dm index 646adfa2038..d7aa9e88504 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -410,13 +410,17 @@ var/ert_request_answered = 0 shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/commander - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - + glasses = /obj/item/clothing/glasses/sunglasses + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/eyes/hud/security, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) belt = /obj/item/gun/energy/gun/nuclear backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/commander = 1, /obj/item/clothing/mask/gas/sechailer/swat = 1, + /obj/item/gun/energy/ionrifle/carbine = 1, /obj/item/restraints/handcuffs = 1, /obj/item/clothing/shoes/magboots = 1, /obj/item/storage/lockbox/mindshield = 1 @@ -449,15 +453,6 @@ var/ert_request_answered = 0 id = /obj/item/card/id/ert/security var/has_grenades = FALSE -/datum/outfit/job/centcom/response_team/security/pre_equip() - . = ..() - if(has_grenades) - var/grenadebox = /obj/item/storage/box/flashbangs - if(prob(50)) - grenadebox = /obj/item/storage/box/teargas - backpack_contents.Insert(1, grenadebox) - backpack_contents[grenadebox] = 1 - /datum/outfit/job/centcom/response_team/security/amber name = "RT Security (Amber)" shoes = /obj/item/clothing/shoes/combat @@ -471,7 +466,9 @@ var/ert_request_answered = 0 backpack_contents = list( /obj/item/clothing/head/helmet/ert/security = 1, /obj/item/clothing/mask/gas/sechailer = 1, - /obj/item/storage/box/zipties = 1 + /obj/item/storage/box/zipties = 1, + /obj/item/storage/box/teargas = 1, + /obj/item/flashlight/seclite = 1 ) /datum/outfit/job/centcom/response_team/security/red @@ -481,17 +478,22 @@ var/ert_request_answered = 0 shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/color/black suit = /obj/item/clothing/suit/space/hardsuit/ert/security - suit_store = /obj/item/gun/energy/gun/advtaser + suit_store = /obj/item/gun/energy/gun/blueshield glasses = /obj/item/clothing/glasses/hud/security/sunglasses - - r_hand = /obj/item/gun/energy/lasercannon + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/arm/flash, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) + r_hand = /obj/item/gun/projectile/automatic/lasercarbine backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/security = 1, /obj/item/clothing/mask/gas/sechailer = 1, /obj/item/clothing/shoes/magboots = 1, /obj/item/storage/box/handcuffs = 1, - /obj/item/gun/energy/ionrifle/carbine = 1 + /obj/item/storage/box/teargas = 1, + /obj/item/grenade/flashbang = 1, + /obj/item/ammo_box/magazine/laser = 2 ) /datum/outfit/job/centcom/response_team/security/gamma @@ -530,12 +532,13 @@ var/ert_request_answered = 0 suit_store = /obj/item/tank/emergency_oxygen/engi glasses = /obj/item/clothing/glasses/meson - l_pocket = /obj/item/t_scanner + l_pocket = /obj/item/gun/energy/gun/mini r_pocket = /obj/item/melee/classic_baton/telescopic backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer = 1, /obj/item/clothing/mask/gas = 1, + /obj/item/t_scanner = 1, /obj/item/stack/sheet/glass/fifty = 1, /obj/item/stack/sheet/metal/fifty = 1 ) @@ -544,10 +547,14 @@ var/ert_request_answered = 0 name = "RT Engineer (Red)" shoes = /obj/item/clothing/shoes/magboots/advance gloves = /obj/item/clothing/gloves/color/yellow + belt = /obj/item/storage/belt/utility/chief/full suit = /obj/item/clothing/suit/space/hardsuit/ert/engineer suit_store = /obj/item/tank/emergency_oxygen/engi glasses = /obj/item/clothing/glasses/meson - + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/eyes/shield, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) l_pocket = /obj/item/t_scanner/extended_range r_pocket = /obj/item/melee/classic_baton/telescopic @@ -586,28 +593,28 @@ var/ert_request_answered = 0 pda = /obj/item/pda/heads/ert/medical id = /obj/item/card/id/ert/medic - l_pocket = /obj/item/reagent_containers/hypospray/CMO - r_pocket = /obj/item/melee/classic_baton/telescopic - /datum/outfit/job/centcom/response_team/medic/amber name = "RT Medic (Amber)" shoes = /obj/item/clothing/shoes/white gloves = /obj/item/clothing/gloves/color/latex suit = /obj/item/clothing/suit/armor/vest/ert/medical + suit_store = /obj/item/gun/energy/gun/mini glasses = /obj/item/clothing/glasses/hud/health - belt = /obj/item/storage/belt/medical/response_team + belt = /obj/item/storage/belt/medical/surgery/loaded - l_pocket = /obj/item/reagent_containers/hypospray/CMO + l_pocket = /obj/item/reagent_containers/hypospray/safety/ert r_pocket = /obj/item/melee/classic_baton/telescopic backpack_contents = list( /obj/item/clothing/head/helmet/ert/medical = 1, /obj/item/clothing/mask/surgical = 1, - /obj/item/storage/firstaid/o2 = 1, - /obj/item/storage/firstaid/brute = 1, /obj/item/storage/firstaid/adv = 1, + /obj/item/storage/firstaid/regular = 1, + /obj/item/storage/box/autoinjectors = 1, + /obj/item/roller = 1, + /obj/item/storage/pill_bottle/ert = 1 ) /datum/outfit/job/centcom/response_team/medic/red @@ -616,18 +623,24 @@ var/ert_request_answered = 0 gloves = /obj/item/clothing/gloves/color/latex/nitrile suit = /obj/item/clothing/suit/space/hardsuit/ert/medical glasses = /obj/item/clothing/glasses/hud/health/health_advanced - + suit_store = /obj/item/gun/energy/gun + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/arm/surgery, + /obj/item/organ/internal/cyberimp/chest/nutriment + ) belt = /obj/item/defibrillator/compact/loaded + l_pocket = /obj/item/reagent_containers/hypospray/safety/ert + r_pocket = /obj/item/melee/classic_baton/telescopic backpack_contents = list( /obj/item/clothing/head/helmet/space/hardsuit/ert/medical = 1, /obj/item/clothing/mask/surgical = 1, - /obj/item/storage/firstaid/o2 = 1, /obj/item/storage/firstaid/toxin = 1, - /obj/item/storage/firstaid/adv = 1, - /obj/item/storage/firstaid/surgery = 1, - /obj/item/gun/energy/gun = 1, + /obj/item/storage/firstaid/brute = 1, + /obj/item/storage/firstaid/fire = 1, + /obj/item/storage/box/autoinjectors = 1, + /obj/item/roller = 1, /obj/item/clothing/shoes/magboots = 1 ) @@ -637,6 +650,9 @@ var/ert_request_answered = 0 gloves = /obj/item/clothing/gloves/combat suit = /obj/item/clothing/suit/space/hardsuit/ert/medical glasses = /obj/item/clothing/glasses/hud/health/night + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/arm/surgery + ) belt = /obj/item/defibrillator/compact/loaded @@ -711,15 +727,22 @@ var/ert_request_answered = 0 /datum/outfit/job/centcom/response_team/janitorial/amber name = "RT Janitor (Amber)" + suit = /obj/item/clothing/suit/armor/vest/ert/janitor + head = /obj/item/clothing/head/helmet/ert/janitor glasses = /obj/item/clothing/glasses/sunglasses + r_hand = /obj/item/gun/energy/disabler + /datum/outfit/job/centcom/response_team/janitorial/red name = "RT Janitor (Red)" suit = /obj/item/clothing/suit/space/hardsuit/ert/janitor head = /obj/item/clothing/head/helmet/space/hardsuit/ert/janitor glasses = /obj/item/clothing/glasses/hud/security/sunglasses - suit_store = /obj/item/gun/energy/gun + cybernetic_implants = list( + /obj/item/organ/internal/cyberimp/chest/nutriment + ) r_pocket = /obj/item/scythe/tele + l_pocket = /obj/item/gun/energy/gun/mini /datum/outfit/job/centcom/response_team/janitorial/gamma name = "RT Janitor (Gamma)" diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm index 35b7960b742..d2e147d9532 100644 --- a/code/game/turfs/simulated/floor/mineral.dm +++ b/code/game/turfs/simulated/floor/mineral.dm @@ -157,18 +157,14 @@ honk() /turf/simulated/floor/mineral/bananium/proc/honk() - if(!spam_flag) - spam_flag = 1 + if(spam_flag < world.time) playsound(src, 'sound/items/bikehorn.ogg', 50, 1) - spawn(20) - spam_flag = 0 + spam_flag = world.time + 20 /turf/simulated/floor/mineral/bananium/proc/squeek() - if(!spam_flag) - spam_flag = 1 + if(spam_flag < world.time) playsound(src, "clownstep", 50, 1) - spawn(10) - spam_flag = 0 + spam_flag = world.time + 10 /turf/simulated/floor/mineral/bananium/airless oxygen = 0.01 @@ -255,4 +251,4 @@ return //unbreakable /turf/simulated/floor/plating/abductor2/burn_tile() - return //unburnable \ No newline at end of file + return //unburnable diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 337233b5bf4..012d270005a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -475,3 +475,6 @@ SSair.remove_from_active(T0) T0.CalculateAdjacentTurfs() SSair.add_to_active(T0,1) + +/turf/AllowDrop() + return TRUE \ No newline at end of file diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index da843d8e53c..59f50797cf1 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -84,7 +84,7 @@ do_suicide(damagetype, held_item) return - to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.") + to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.") do_suicide(0) updatehealth() diff --git a/code/game/world.dm b/code/game/world.dm index 516346aeca3..2e57bf99a62 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -442,9 +442,11 @@ var/failed_old_db_connections = 0 GLOB.world_game_log = "[GLOB.log_directory]/game.log" GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log" GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log" + GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log" start_log(GLOB.world_game_log) start_log(GLOB.world_href_log) start_log(GLOB.world_runtime_log) + start_log(GLOB.world_qdel_log) if(fexists(GLOB.config_error_log)) fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 84120c2c669..f401589bf90 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -60,9 +60,9 @@ var/global/nologevent = 0 body += "TP - " body += "PM - " body += "SM - " - body += "[admin_jump_link(M)]\]
    " if(ishuman(M) && M.mind) - body += "HM" + body += "HM -" + body += "[admin_jump_link(M)]\]
    " body += "Mob type: [M.type]
    " if(M.client) if(M.client.related_accounts_cid.len) @@ -566,7 +566,7 @@ var/global/nologevent = 0 if(!check_rights(R_SERVER,0)) message = adminscrub(message,500) message = replacetext(message, "\n", "
    ") // required since we're putting it in a

    tag - to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:

    [message]

    ") + to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:

    [message]

    ") log_admin("Announce: [key_name(usr)] : [message]") feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/tickets/adminticketsUI.dm b/code/modules/admin/tickets/adminticketsUI.dm index 750fa13e6cb..b063c5cb673 100644 --- a/code/modules/admin/tickets/adminticketsUI.dm +++ b/code/modules/admin/tickets/adminticketsUI.dm @@ -44,14 +44,14 @@ return dat -/datum/adminTicketHolder/proc/showUI(var/client/user, var/tab) +/datum/adminTicketHolder/proc/showUI(mob/user, var/tab) var/dat = null dat = returnUI(tab) var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600) popup.set_content(dat) popup.open() -/datum/adminTicketHolder/proc/showDetailUI(var/client/user, var/ticketID) +/datum/adminTicketHolder/proc/showDetailUI(mob/user, var/ticketID) var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID] var/status = "[T.state2text()]" @@ -91,9 +91,9 @@ popup.set_content(dat) popup.open() -/datum/adminTicketHolder/proc/userDetailUI(var/client/user) +/datum/adminTicketHolder/proc/userDetailUI(mob/user) //dat - var/tickets = checkForTicket(user) + var/tickets = checkForTicket(user.client) var/dat dat += "

    Your open tickets

    " dat += "" @@ -130,7 +130,7 @@ if(href_list["details"]) var/indexNum = text2num(href_list["details"]) - showDetailUI(usr.client, indexNum) + showDetailUI(usr, indexNum) return if(href_list["resolve"]) @@ -169,4 +169,4 @@ if(globAdminTicketHolder.assignAdminToTicket(usr.client, indexNum)) message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]") to_chat(returnClient(indexNum), "Your ticket is being handled by [usr.client].") - showDetailUI(usr, indexNum) \ No newline at end of file + showDetailUI(usr, indexNum) diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm index a0431cd8e23..0cf22c5d24c 100644 --- a/code/modules/admin/tickets/adminticketsverbs.dm +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -48,4 +48,4 @@ if(!holder && !check_rights(R_ADMIN)) return - globAdminTicketHolder.userDetailUI(usr.client) + globAdminTicketHolder.userDetailUI(usr) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 9a526c4a7c2..194b1d49035 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1216,8 +1216,7 @@ //strip their stuff and stick it in the crate for(var/obj/item/I in M) - M.unEquip(I) - if(I) + if(M.unEquip(I)) I.loc = locker I.layer = initial(I.layer) I.plane = initial(I.plane) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 682a174c450..0b7797b84e3 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -271,7 +271,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return 0 var/obj/item/paicard/card = new(T) var/mob/living/silicon/pai/pai = new(card) - pai.name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text + var/raw_name = input(choice, "Enter your pAI name:", "pAI Name", "Personal AI") as text + var/new_name = reject_bad_name(raw_name, 1) + if(new_name) + pai.name = new_name + pai.real_name = new_name + else + to_chat(usr, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .") pai.real_name = pai.name pai.key = choice.key card.setPersonality(pai) diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 5c8e1c77745..c3641766db0 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -32,7 +32,7 @@ client/proc/one_click_antag() if(M.stat || !M.mind || M.mind.special_role) return FALSE if(temp) - if(M.mind.assigned_role in temp.restricted_jobs || M.client.prefs.species in temp.protected_species) + if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species)) return FALSE if(role) // Don't even bother evaluating if there's no role if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && (!jobban_isbanned(M, role))) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 0cf729f1e57..0fd53b8b62a 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -28,6 +28,7 @@ prayer_type = "CULTIST PRAYER" deity = ticker.cultdat.entity_name + log_say("(PRAYER) [msg]", usr) msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]:[key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SC) (BLESS) (SMITE): [msg]" for(var/client/X in admins) @@ -36,7 +37,6 @@ to_chat(usr, "Your prayers have been received by the gods.") feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - //log_admin("HELP: [key_name(src)]: [msg]") /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2f794dafbd0..c5d6a50c418 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -435,6 +435,7 @@ Traitors and the like can also be revived with the previous role mostly intact. //Now for special roles and equipment. switch(new_character.mind.special_role) if("traitor") + job_master.AssignRank(new_character, new_character.mind.assigned_role, 0) job_master.EquipRank(new_character, new_character.mind.assigned_role, 1) ticker.mode.equip_traitor(new_character) if("Wizard") @@ -465,6 +466,7 @@ Traitors and the like can also be revived with the previous role mostly intact. call(/datum/game_mode/proc/add_law_zero)(new_character) //Add aliens. else + job_master.AssignRank(new_character, new_character.mind.assigned_role, 0) job_master.EquipRank(new_character, new_character.mind.assigned_role, 1)//Or we simply equip them. //Announces the character on all the systems, based on the record. diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index c81f30efc83..ecf8c336118 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -45,7 +45,7 @@ spawn_antag(C, get_turf(src.loc), "syndieborg") else checking = FALSE - to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.") + to_chat(user, "Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.") return /obj/item/antag_spawner/borg_tele/spawn_antag(client/C, turf/T, type = "") diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index 9b925e2f2ac..c3158e9ccba 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -6,7 +6,7 @@ icon_state = "clawmachine_on" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/tokens = 0 var/freeplay = 0 //for debugging and admin kindness @@ -112,28 +112,7 @@ to_chat(user, "Unable to access account: incorrect credentials.") return 0 - if(token_price > customer_account.money) - to_chat(user, "Insufficient funds in account.") - return 0 - else - // Okay to move the money at this point - - // debit money from the purchaser's account - customer_account.money -= token_price - - // create entry in the purchaser's account log - var/datum/transaction/T = new() - T.target_name = "[src.name]" - T.purpose = "Purchase of [src.name] credit" - if(token_price > 0) - T.amount = "([token_price])" - else - T.amount = "[token_price]" - T.source_terminal = src.name - T.date = current_date_string - T.time = station_time_timestamp() - customer_account.transaction_log.Add(T) - return 1 + return customer_account.charge(token_price, null, "Purchase of [name] credit", name, name) /obj/machinery/arcade/proc/start_play(mob/user as mob) user.set_machine(src) @@ -159,4 +138,4 @@ /obj/machinery/arcade/Destroy() src.close_game() - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm index 4e2e4e9a0d7..d8666c36617 100644 --- a/code/modules/arcade/prize_counter.dm +++ b/code/modules/arcade/prize_counter.dm @@ -6,7 +6,7 @@ icon_state = "prize_counter-on" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/tickets = 0 @@ -205,4 +205,4 @@ th.cost.toomuch {background:maroon;} print_tickets() else new /obj/item/stack/tickets(get_turf(src), tickets) - tickets = 0 \ No newline at end of file + tickets = 0 diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index df7206a7914..8228e490a38 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -10,46 +10,67 @@ bomb_name = "voice-activated bomb" - describe() - if(recorded || listening) - return "A meter on [src] flickers with every nearby sound." - else - return "[src] is deactivated." +/obj/item/assembly/voice/describe() + if(recorded || listening) + return "A meter on [src] flickers with every nearby sound." + else + return "[src] is deactivated." - hear_talk(mob/living/M as mob, msg) - hear_input(M, msg, 0) +/obj/item/assembly/voice/hear_talk(mob/living/M as mob, msg) + hear_input(M, msg, 0) - hear_message(mob/living/M as mob, msg) +/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg) hear_input(M, msg, 1) - proc/hear_input(mob/living/M as mob, msg, type) - if(!istype(M,/mob/living)) - return - if(listening) - recorded = msg - recorded_type = type - listening = 0 - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"") - else - if(findtext(msg, recorded) && type == recorded_type) - pulse(0) - var/turf/T = get_turf(src) //otherwise it won't work in hand - T.visible_message("[bicon(src)] beeps!") +/obj/item/assembly/voice/proc/hear_input(mob/living/M as mob, msg, type) + if(!istype(M,/mob/living)) + return + if(listening) + recorded = msg + recorded_type = type + listening = 0 + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"") + else if(findtext(msg, recorded) && type == recorded_type) + pulse(0) + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("[bicon(src)] beeps!") - activate() - return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way. +/obj/item/assembly/voice/activate() + return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way. - attack_self(mob/user) - if(!user || !secured) return 0 +/obj/item/assembly/voice/attack_self(mob/user) + if(!user || !secured) return 0 - listening = !listening - var/turf/T = get_turf(src) - T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") - return 1 + listening = !listening + var/turf/T = get_turf(src) + T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"") + return 1 - toggle_secure() - . = ..() - listening = 0 \ No newline at end of file +/obj/item/assembly/voice/toggle_secure() + . = ..() + listening = 0 + +/obj/item/assembly/voice/noise + name = "noise sensor" + desc = "A simple noise sensor that triggers on vocalizations other then speech." + icon_state = "voice" + materials = list(MAT_METAL=100, MAT_GLASS=10) + origin_tech = "magnets=1;engineering=1" + bomb_name = "noise-activated bomb" + +/obj/item/assembly/voice/noise/attack_self(mob/user) + return + +/obj/item/assembly/voice/noise/describe() + return "[src] does not appear to have any controls." + +/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, msg) + return + +/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg) + pulse(0) + var/turf/T = get_turf(src) //otherwise it won't work in hand + T.visible_message("[bicon(src)] beeps!") \ No newline at end of file diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index d5e2cbcd34d..d6e72f1505c 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -31,7 +31,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centerstation density = 1 icon_state = "offcenter" - use_power = 1 + use_power = IDLE_POWER_USE //warping vars var/list/linked = list() @@ -96,9 +96,12 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centerstation/proc/toggleon(mob/user as mob) - if(!ready) return - if(linked.len != 8) return - if(!powered()) return + if(!ready) + return + if(linked.len != 8) + return + if(!powered()) + return if(!awaygate) awaygate = locate(/obj/machinery/gateway/centeraway) in world if(!awaygate) @@ -135,9 +138,12 @@ var/obj/machinery/gateway/centerstation/the_gateway = null //okay, here's the good teleporting stuff /obj/machinery/gateway/centerstation/Bumped(atom/movable/M as mob|obj) - if(!ready) return - if(!active) return - if(!awaygate) return + if(!ready) + return + if(!active) + return + if(!awaygate) + return if(awaygate.calibrated) M.forceMove(get_step(awaygate.loc, SOUTH)) @@ -163,7 +169,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centeraway density = 1 icon_state = "offcenter" - use_power = 0 + use_power = NO_POWER_USE var/calibrated = 1 var/list/linked = list() //a list of the connected gateway chunks var/ready = 0 @@ -207,8 +213,10 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centeraway/proc/toggleon(mob/user as mob) - if(!ready) return - if(linked.len != 8) return + if(!ready) + return + if(linked.len != 8) + return if(!stationgate) stationgate = locate(/obj/machinery/gateway/centerstation) in world if(!stationgate) @@ -241,13 +249,20 @@ var/obj/machinery/gateway/centerstation/the_gateway = null /obj/machinery/gateway/centeraway/Bumped(atom/movable/M as mob|obj) - if(!ready) return - if(!active) return + if(!ready) + return + if(!active) + return if(istype(M, /mob/living/carbon)) - if(exilecheck(M)) return + if(exilecheck(M)) + return if(istype(M, /obj)) + if(M.can_buckle && M.has_buckled_mobs()) + if(exilecheck(M.buckled_mob)) + return for(var/mob/living/carbon/F in M) - if(exilecheck(F)) return + if(exilecheck(F)) + return M.forceMove(get_step(stationgate.loc, SOUTH)) M.dir = SOUTH diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm deleted file mode 100644 index bdb15581b61..00000000000 --- a/code/modules/awaymissions/maploader/swapmaps.dm +++ /dev/null @@ -1,677 +0,0 @@ -/* - SwapMaps library by Lummox JR - developed for digitalBYOND - http://www.digitalbyond.org - - Version 2.1 - - The purpose of this library is to make it easy for authors to swap maps - in and out of their game using savefiles. Swapped-out maps can be - transferred between worlds for an MMORPG, sent to the client, etc. - This is facilitated by the use of a special datum and a global list. - - Uses of swapmaps: - - - Temporary battle arenas - - House interiors - - Individual custom player houses - - Virtually unlimited terrain - - Sharing maps between servers running different instances of the same - game - - Loading and saving pieces of maps for reusable room templates - */ - -/* - User Interface: - - VARS: - - swapmaps_iconcache - An associative list of icon files with names, like - 'player.dmi' = "player" - swapmaps_mode - This must be set at runtime, like in world/New(). - - SWAPMAPS_SAV 0 (default) - Uses .sav files for raw /savefile output. - SWAPMAPS_TEXT 1 - Uses .txt files via ExportText() and ImportText(). These maps - are easily editable and appear to take up less space in the - current version of BYOND. - - PROCS: - - SwapMaps_Find(id) - Find a map by its id - SwapMaps_Load(id) - Load a map by its id - SwapMaps_Save(id) - Save a map by its id (calls swapmap.Save()) - SwapMaps_Unload(id) - Save and unload a map by its id (calls swapmap.Unload()) - SwapMaps_Save_All() - Save all maps - SwapMaps_DeleteFile(id) - Delete a map file - SwapMaps_CreateFromTemplate(id) - Create a new map by loading another map to use as a template. - This map has id==src and will not be saved. To make it savable, - change id with swapmap.SetID(newid). - SwapMaps_LoadChunk(id,turf/locorner) - Load a swapmap as a "chunk", at a specific place. A new datum is - created but it's not added to the list of maps to save or unload. - The new datum can be safely deleted without affecting the turfs - it loaded. The purpose of this is to load a map file onto part of - another swapmap or an existing part of the world. - locorner is the corner turf with the lowest x,y,z values. - SwapMaps_SaveChunk(id,turf/corner1,turf/corner2) - Save a piece of the world as a "chunk". A new datum is created - for the chunk, but it can be deleted without destroying any turfs. - The chunk file can be reloaded as a swapmap all its own, or loaded - via SwapMaps_LoadChunk() to become part of another map. - SwapMaps_GetSize(id) - Return a list corresponding to the x,y,z sizes of a map file, - without loading the map. - Returns null if the map is not found. - SwapMaps_AddIconToCache(name,icon) - Cache an icon file by name for space-saving storage - - swapmap.New(id,x,y,z) - Create a new map; specify id, width (x), height (y), and - depth (z) - Default size is world.maxx,world.maxy,1 - swapmap.New(id,turf1,turf2) - Create a new map; specify id and 2 corners - This becomes a /swapmap for one of the compiled-in maps, for - easy saving. - swapmap.New() - Create a new map datum, but does not allocate space or assign an - ID (used for loading). - swapmap.Del() - Deletes a map but does not save - swapmap.Save() - Saves to map_[id].sav - Maps with id==src are not saved. - swapmap.Unload() - Saves the map and then deletes it - Maps with id==src are not saved. - swapmap.SetID(id) - Change the map's id and make changes to the lookup list - swapmap.AllTurfs(z) - Returns a block of turfs encompassing the entire map, or on just - one z-level - z is in world coordinates; it is optional - swapmap.Contains(turf/T) - Returns nonzero if T is inside the map's boundaries. - Also works for objs and mobs, but the proc is not area-safe. - swapmap.InUse() - Returns nonzero if a mob with a key is within the map's - boundaries. - swapmap.LoCorner(z=z1) - Returns locate(x1,y1,z), where z=z1 if none is specified. - swapmap.HiCorner(z=z2) - Returns locate(x2,y2,z), where z=z2 if none is specified. - swapmap.BuildFilledRectangle(turf/corner1,turf/corner2,item) - Builds a filled rectangle of item from one corner turf to the - other, on multiple z-levels if necessary. The corners may be - specified in any order. - item is a type path like /turf/wall or /obj/barrel{full=1}. - swapmap.BuildRectangle(turf/corner1,turf/corner2,item) - Builds an unfilled rectangle of item from one corner turf to - the other, on multiple z-levels if necessary. - swapmap.BuildInTurfs(list/turfs,item) - Builds item on all of the turfs listed. The list need not - contain only turfs, or even only atoms. - */ - -swapmap - var/id // a string identifying this map uniquely - var/x1 // minimum x,y,z coords - var/y1 - var/z1 - var/x2 // maximum x,y,z coords (also used as width,height,depth until positioned) - var/y2 - var/z2 - var/tmp/locked // don't move anyone to this map; it's saving or loading - var/tmp/mode // save as text-mode - var/ischunk // tells the load routine to load to the specified location - - New(_id,x,y,z) - if(isnull(_id)) return - id=_id - mode=swapmaps_mode - if(isturf(x) && isturf(y)) - /* - Special format: Defines a map as an existing set of turfs; - this is useful for saving a compiled map in swapmap format. - Because this is a compiled-in map, its turfs are not deleted - when the datum is deleted. - */ - x1=min(x:x,y:x);x2=max(x:x,y:x) - y1=min(x:y,y:y);y2=max(x:y,y:y) - z1=min(x:z,y:z);z2=max(x:z,y:z) - InitializeSwapMaps() - if(z2>swapmaps_compiled_maxz ||\ - y2>swapmaps_compiled_maxy ||\ - x2>swapmaps_compiled_maxx) - qdel(src) - return - x2=x?(x):world.maxx - y2=y?(y):world.maxy - z2=z?(z):1 - AllocateSwapMap() - - Destroy() - // a temporary datum for a chunk can be deleted outright - // for others, some cleanup is necessary - if(!ischunk) - swapmaps_loaded-=src - swapmaps_byname-=id - if(z2>swapmaps_compiled_maxz ||\ - y2>swapmaps_compiled_maxy ||\ - x2>swapmaps_compiled_maxx) - var/list/areas=new - for(var/atom/A in block(locate(x1,y1,z1),locate(x2,y2,z2))) - for(var/obj/O in A) qdel(O) - for(var/mob/M in A) - if(!M.key) qdel(M) - else M.loc=null - areas[A.loc]=null - qdel(A) - // delete areas that belong only to this map - for(var/area/a in areas) - if(a && !a.contents.len) qdel(a) - if(x2>=world.maxx || y2>=world.maxy || z2>=world.maxz) CutXYZ() - qdel(areas) - ..() - return QDEL_HINT_HARDDEL_NOW - - /* - Savefile format: - map - id - x // size, not coords - y - z - areas // list of areas, not including default - [each z; 1 to depth] - [each y; 1 to height] - [each x; 1 to width] - type // of turf - AREA // if non-default; saved as a number (index into areas list) - vars // all other changed vars - */ - Write(savefile/S) - var/x - var/y - var/z - var/n - var/list/areas - var/area/defarea=locate(world.area) - if(!defarea) defarea=new world.area - areas=list() - for(var/turf/T in block(locate(x1,y1,z1),locate(x2,y2,z2))) - areas[T.loc]=null - for(n in areas) // quickly eliminate associations for smaller storage - areas-=n - areas+=n - areas-=defarea - InitializeSwapMaps() - locked=1 - S["id"] << id - S["z"] << z2-z1+1 - S["y"] << y2-y1+1 - S["x"] << x2-x1+1 - S["areas"] << areas - for(n in 1 to areas.len) areas[areas[n]]=n - var/oldcd=S.cd - for(z in z1 to z2) - S.cd="[z-z1+1]" - for(y in y1 to y2) - S.cd="[y-y1+1]" - for(x in x1 to x2) - S.cd="[x-x1+1]" - var/turf/T=locate(x,y,z) - S["type"] << T.type - if(T.loc!=defarea) S["AREA"] << areas[T.loc] - T.Write(S) - S.cd=".." - S.cd=".." - sleep() - S.cd=oldcd - locked=0 - qdel(areas) - - Read(savefile/S,_id,turf/locorner) - var/x - var/y - var/z - var/n - var/list/areas - var/area/defarea=locate(world.area) - id=_id - if(locorner) - ischunk=1 - x1=locorner.x - y1=locorner.y - z1=locorner.z - if(!defarea) defarea=new world.area - if(!_id) - S["id"] >> id - else - var/dummy - S["id"] >> dummy - S["z"] >> z2 // these are depth, - S["y"] >> y2 // height, - S["x"] >> x2 // width - S["areas"] >> areas - locked=1 - AllocateSwapMap() // adjust x1,y1,z1 - x2,y2,z2 coords - var/oldcd=S.cd - for(z in z1 to z2) - S.cd="[z-z1+1]" - for(y in y1 to y2) - S.cd="[y-y1+1]" - for(x in x1 to x2) - S.cd="[x-x1+1]" - var/tp - S["type"]>>tp - var/turf/T=locate(x,y,z) - T.loc.contents-=T - T=new tp(locate(x,y,z)) - if("AREA" in S.dir) - S["AREA"]>>n - var/area/A=areas[n] - A.contents+=T - else defarea.contents+=T - // clear the turf - for(var/obj/O in T) qdel(O) - for(var/mob/M in T) - if(!M.key) qdel(M) - else M.loc=null - // finish the read - T.Read(S) - S.cd=".." - S.cd=".." - sleep() - S.cd=oldcd - locked=0 - qdel(areas) - - /* - Find an empty block on the world map in which to load this map. - If no space is found, increase world.maxz as necessary. (If the - map is greater in x,y size than the current world, expand - world.maxx and world.maxy too.) - - Ignore certain operations if loading a map as a chunk. Use the - x1,y1,z1 position for it, and *don't* count it as a loaded map. - */ - proc/AllocateSwapMap() - InitializeSwapMaps() - world.maxx=max(x2,world.maxx) // stretch x/y if necessary - world.maxy=max(y2,world.maxy) - if(!ischunk) - if(world.maxz<=swapmaps_compiled_maxz) - z1=swapmaps_compiled_maxz+1 - x1=1;y1=1 - else - var/list/l=ConsiderRegion(1,1,world.maxx,world.maxy,swapmaps_compiled_maxz+1) - x1=l[1] - y1=l[2] - z1=l[3] - qdel(l) - x2+=x1-1 - y2+=y1-1 - z2+=z1-1 - space_manager.increase_max_zlevel_to(z2) // stretch z if necessary - if(!ischunk) - swapmaps_loaded[src]=null - swapmaps_byname[id]=src - - proc/ConsiderRegion(X1,Y1,X2,Y2,Z1,Z2) - while(1) - var/nextz=0 - var/swapmap/M - for(M in swapmaps_loaded) - if(M.z2Z2) || M.z1>=Z1+z2 ||\ - M.x1>X2 || M.x2=X1+x2 ||\ - M.y1>Y2 || M.y2=Y1+y2) continue - // look for sub-regions with a defined ceiling - var/nz2=Z2?(Z2):Z1+z2-1+M.z2-M.z1 - if(M.x1>=X1+x2) - .=ConsiderRegion(X1,Y1,M.x1-1,Y2,Z1,nz2) - if(.) return - else if(M.x2<=X2-x2) - .=ConsiderRegion(M.x2+1,Y1,X2,Y2,Z1,nz2) - if(.) return - if(M.y1>=Y1+y2) - .=ConsiderRegion(X1,Y1,X2,M.y1-1,Z1,nz2) - if(.) return - else if(M.y2<=Y2-y2) - .=ConsiderRegion(X1,M.y2+1,X2,Y2,Z1,nz2) - if(.) return - nextz=nextz?min(nextz,M.z2+1):(M.z2+1) - if(!M) - /* If nextz is not 0, then at some point there was an overlap that - could not be resolved by using an area to the side */ - if(nextz) Z1=nextz - if(!nextz || (Z2 && Z2-Z1+1=z2)?list(X1,Y1,Z1):null - X1=1;X2=world.maxx - Y1=1;Y2=world.maxy - - proc/CutXYZ() - var/mx=swapmaps_compiled_maxx - var/my=swapmaps_compiled_maxy - var/mz=swapmaps_compiled_maxz - for(var/swapmap/M in swapmaps_loaded) // may not include src - mx=max(mx,M.x2) - my=max(my,M.y2) - mz=max(mz,M.z2) - world.maxx=mx - world.maxy=my - space_manager.cut_levels_downto(mz) - - // save and delete - proc/Unload() - Save() - qdel(src) - - proc/Save() - if(id==src) return 0 - var/savefile/S=mode?(new):new("map_[id].sav") - S << src - while(locked) sleep(1) - if(mode) - fdel("map_[id].txt") - S.ExportText("/","map_[id].txt") - return 1 - - // this will not delete existing savefiles for this map - proc/SetID(newid) - swapmaps_byname-=id - id=newid - swapmaps_byname[id]=src - - proc/AllTurfs(z) - if(isnum(z) && (zz2)) return null - return block(LoCorner(z),HiCorner(z)) - - // this could be safely called for an obj or mob as well, but - // probably not an area - proc/Contains(turf/T) - return (T && T.x>=x1 && T.x<=x2\ - && T.y>=y1 && T.y<=y2\ - && T.z>=z1 && T.z<=z2) - - proc/InUse() - for(var/turf/T in AllTurfs()) - for(var/mob/M in T) if(M.key) return 1 - - proc/LoCorner(z=z1) - return locate(x1,y1,z) - proc/HiCorner(z=z2) - return locate(x2,y2,z) - - /* - Build procs: Take 2 turfs as corners, plus an item type. - An item may be like: - - /turf/wall - /obj/fence{icon_state="iron"} - */ - proc/BuildFilledRectangle(turf/T1,turf/T2,item) - if(!Contains(T1) || !Contains(T2)) return - var/turf/T=T1 - // pick new corners in a block()-friendly form - T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) - T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) - for(T in block(T1,T2)) new item(T) - - proc/BuildRectangle(turf/T1,turf/T2,item) - if(!Contains(T1) || !Contains(T2)) return - var/turf/T=T1 - // pick new corners in a block()-friendly form - T1=locate(min(T1.x,T2.x),min(T1.y,T2.y),min(T1.z,T2.z)) - T2=locate(max(T.x,T2.x),max(T.y,T2.y),max(T.z,T2.z)) - if(T2.x-T1.x<2 || T2.y-T1.y<2) BuildFilledRectangle(T1,T2,item) - else - //for(T in block(T1,T2)-block(locate(T1.x+1,T1.y+1,T1.z),locate(T2.x-1,T2.y-1,T2.z))) - for(T in block(T1,locate(T2.x,T1.y,T2.z))) new item(T) - for(T in block(locate(T1.x,T2.y,T1.z),T2)) new item(T) - for(T in block(locate(T1.x,T1.y+1,T1.z),locate(T1.x,T2.y-1,T2.z))) new item(T) - for(T in block(locate(T2.x,T1.y+1,T1.z),locate(T2.x,T2.y-1,T2.z))) new item(T) - - /* - Supplementary build proc: Takes a list of turfs, plus an item - type. Actually the list doesn't have to be just turfs. - */ - proc/BuildInTurfs(list/turfs,item) - for(var/T in turfs) new item(T) - -atom - Write(savefile/S) - for(var/V in vars-"x"-"y"-"z"-"contents"-"icon"-"overlays"-"underlays") - if(issaved(vars[V])) - if(vars[V]!=initial(vars[V])) S[V]<>ic - if(istext(ic)) icon=swapmaps_iconcache[ic] - if(l && contents!=l) - contents+=l - qdel(l) - - -// set this up (at runtime) as follows: -// list(\ -// 'player.dmi'="player",\ -// 'monster.dmi'="monster",\ -// ... -// 'item.dmi'="item") -var/list/swapmaps_iconcache - -// preferred mode; sav or text -var/const/SWAPMAPS_SAV=0 -var/const/SWAPMAPS_TEXT=1 -var/swapmaps_mode=SWAPMAPS_SAV - -var/swapmaps_compiled_maxx -var/swapmaps_compiled_maxy -var/swapmaps_compiled_maxz -var/swapmaps_initialized -var/swapmaps_loaded -var/swapmaps_byname - -proc/InitializeSwapMaps() - if(swapmaps_initialized) return - swapmaps_initialized=1 - swapmaps_compiled_maxx=world.maxx - swapmaps_compiled_maxy=world.maxy - swapmaps_compiled_maxz=world.maxz - swapmaps_loaded=list() - swapmaps_byname=list() - if(swapmaps_iconcache) - for(var/V in swapmaps_iconcache) - // reverse-associate everything - // so you can look up an icon file by name or vice-versa - swapmaps_iconcache[swapmaps_iconcache[V]]=V - -proc/SwapMaps_AddIconToCache(name,icon) - if(!swapmaps_iconcache) swapmaps_iconcache=list() - swapmaps_iconcache[name]=icon - swapmaps_iconcache[icon]=name - -proc/SwapMaps_Find(id) - InitializeSwapMaps() - return swapmaps_byname[id] - -proc/SwapMaps_Load(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(!M) - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else if(fexists("map_[id].sav")) - S=new("map_[id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else return // no file found - if(text) - S=new - S.ImportText("/",file("map_[id].txt")) - S >> M - while(M.locked) sleep(1) - M.mode=text - return M - -proc/SwapMaps_Save(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(M) M.Save() - return M - -proc/SwapMaps_Save_All() - InitializeSwapMaps() - for(var/swapmap/M in swapmaps_loaded) - if(M) M.Save() - -proc/SwapMaps_Unload(id) - InitializeSwapMaps() - var/swapmap/M=swapmaps_byname[id] - if(!M) return // return silently from an error - M.Unload() - return 1 - -proc/SwapMaps_DeleteFile(id) - fdel("map_[id].sav") - fdel("map_[id].txt") - -proc/SwapMaps_CreateFromTemplate(template_id) - var/swapmap/M=new - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[template_id].txt")) - text=1 - else if(fexists("map_[template_id].sav")) - S=new("map_[template_id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[template_id].txt")) - text=1 - else - log_world("SwapMaps error in SwapMaps_CreateFromTemplate(): map_[template_id] file not found.") - return - if(text) - S=new - S.ImportText("/",file("map_[template_id].txt")) - /* - This hacky workaround is needed because S >> M will create a brand new - M to fill with data. There's no way to control the Read() process - properly otherwise. The //.0 path should always match the map, however. - */ - S.cd="//.0" - M.Read(S,M) - M.mode=text - while(M.locked) sleep(1) - return M - -proc/SwapMaps_LoadChunk(chunk_id,turf/locorner) - var/swapmap/M=new - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) - text=1 - else if(fexists("map_[chunk_id].sav")) - S=new("map_[chunk_id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[chunk_id].txt")) - text=1 - else - log_world("SwapMaps error in SwapMaps_LoadChunk(): map_[chunk_id] file not found.") - return - if(text) - S=new - S.ImportText("/",file("map_[chunk_id].txt")) - /* - This hacky workaround is needed because S >> M will create a brand new - M to fill with data. There's no way to control the Read() process - properly otherwise. The //.0 path should always match the map, however. - */ - S.cd="//.0" - M.Read(S,M,locorner) - while(M.locked) sleep(1) - qdel(M) - return 1 - -proc/SwapMaps_SaveChunk(chunk_id,turf/corner1,turf/corner2) - if(!corner1 || !corner2) - log_world("SwapMaps error in SwapMaps_SaveChunk():") - if(!corner1) log_world(" corner1 turf is null") - if(!corner2) log_world(" corner2 turf is null") - return - var/swapmap/M=new - M.id=chunk_id - M.ischunk=1 // this is a chunk - M.x1=min(corner1.x,corner2.x) - M.y1=min(corner1.y,corner2.y) - M.z1=min(corner1.z,corner2.z) - M.x2=max(corner1.x,corner2.x) - M.y2=max(corner1.y,corner2.y) - M.z2=max(corner1.z,corner2.z) - M.mode=swapmaps_mode - M.Save() - while(M.locked) sleep(1) - qdel(M) - return 1 - -proc/SwapMaps_GetSize(id) - var/savefile/S - var/text=0 - if(swapmaps_mode==SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else if(fexists("map_[id].sav")) - S=new("map_[id].sav") - else if(swapmaps_mode!=SWAPMAPS_TEXT && fexists("map_[id].txt")) - text=1 - else - log_world("SwapMaps error in SwapMaps_GetSize(): map_[id] file not found.") - return - if(text) - S=new - S.ImportText("/",file("map_[id].txt")) - /* - The //.0 path should always be the map. There's no other way to - read this data. - */ - S.cd="//.0" - var/x - var/y - var/z - S["x"] >> x - S["y"] >> y - S["z"] >> z - return list(x,y,z) diff --git a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm index 8b578fdd1f7..e74da2a6628 100644 --- a/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm +++ b/code/modules/awaymissions/mission_code/UO71-terrorspiders.dm @@ -181,7 +181,7 @@ /obj/item/paper/terrorspiders9 name = "paper - 'Research Notes'" - info = "The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them." + info = "The notes appear gibberish to you. Perhaps a destructive analyzer in R&D could make sense of them." origin_tech = "combat=4;materials=4;engineering=4;biotech=4" /obj/item/gun/energy/laser/awaymission_aeg @@ -257,5 +257,3 @@ else to_chat(user, "Your ID card already has all the access this machine can give.") . = 1 - - diff --git a/code/modules/awaymissions/mission_code/blackmarketpackers.dm b/code/modules/awaymissions/mission_code/blackmarketpackers.dm index 468863f3026..c2d10d7c97d 100644 --- a/code/modules/awaymissions/mission_code/blackmarketpackers.dm +++ b/code/modules/awaymissions/mission_code/blackmarketpackers.dm @@ -19,4 +19,9 @@ /area/awaymission/BMPship/Fore name = "\improper Fore Block" icon_state = "away3" + requires_power = 1 + +/area/awaymission/BMPship/Gate + name = "\improper Gateway Block" + icon_state = "away4" requires_power = 1 \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm index 966ce6053f6..b0a092b7e7d 100644 --- a/code/modules/awaymissions/mission_code/challenge.dm +++ b/code/modules/awaymissions/mission_code/challenge.dm @@ -28,10 +28,10 @@ anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 active = 1 locked = 1 - state = 2 \ No newline at end of file + state = 2 diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index 81d21df5dcf..00609b7a218 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -234,7 +234,7 @@ D.account = get_card_account(id, occupant) if(!D.account) return null - if(!D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name)) + if(!D.account.charge(100, null, "10 minutes hotel stay", "Biesel GalaxyNet Terminal [rand(111,1111)]", "[name]")) return null D.occupant = occupant @@ -251,7 +251,7 @@ if(!D || !D.occupant) return - if(D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name)) + if(D.account.charge(100, null, "10 minutes hotel stay extension", "Biesel GalaxyNet Terminal [rand(111,1111)]", "[name]")) D.roomtimer = addtimer(CALLBACK(src, .proc/process_room, roomid), PAY_INTERVAL, TIMER_STOPPABLE) else force_checkout(roomid) @@ -299,4 +299,4 @@ return S.retal_target = target - S.retal = 1 \ No newline at end of file + S.retal = 1 diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index b26bdba7d92..9ebd1d88b6b 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -46,7 +46,7 @@ anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/chargesa = 1 var/insistinga = 0 @@ -72,7 +72,7 @@ else chargesa-- insistinga = 0 - var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","To Kill","Peace") + var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","Peace") switch(wish) if("Power") to_chat(user, "Your wish is granted, but at a terrible cost...") @@ -115,28 +115,6 @@ to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") human.set_species(/datum/species/shadow) user.regenerate_icons() - if("To Kill") - to_chat(user, "Your wish is granted, but at a terrible cost...") - to_chat(user, "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart.") - ticker.mode.traitors += user.mind - user.mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/objective/hijack/hijack = new - hijack.owner = user.mind - user.mind.objectives += hijack - to_chat(user, "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!") - var/obj_count = 1 - for(var/datum/objective/OBJ in user.mind.objectives) - to_chat(user, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ - if(ishuman(user)) - var/mob/living/carbon/human/human = user - if(!isshadowperson(human)) - to_chat(user, "Your flesh rapidly mutates!") - to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.") - to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.") - to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.") - human.set_species(/datum/species/shadow) - user.regenerate_icons() if("Peace") to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.") to_chat(user, "You feel as if you just narrowly avoided a terrible fate...") @@ -288,4 +266,4 @@ say("How could you betray the Syndicate?") for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list) W.on_alert = TRUE - ..(gibbed) \ No newline at end of file + ..(gibbed) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index c7f8504f13e..0fe05e8ff92 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -200,6 +200,7 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) "large_stamp-law.png" = 'icons/paper_icons/large_stamp-law.png', "large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png', "large_stamp-syndicate.png" = 'icons/paper_icons/large_stamp-syndicate.png', + "large_stamp-rep.png" = 'icons/paper_icons/large_stamp-rep.png', "talisman.png" = 'icons/paper_icons/talisman.png', "ntlogo.png" = 'icons/paper_icons/ntlogo.png' ) @@ -348,4 +349,4 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE) register_asset(asset_name, assets[asset_name]) /datum/asset/mob_hunt/send(client) - send_asset_list(client, assets, verify) \ No newline at end of file + send_asset_list(client, assets, verify) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 838670221ad..99f7fa69746 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -109,136 +109,42 @@ if("shop") if(href_list["KarmaBuy"]) var/karma=verify_karma() + if(isnull(karma)) //Doesn't display anything if karma database is down. + return switch(href_list["KarmaBuy"]) if("1") - if(karma <5) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Barber?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Barber",5) - return + karma_purchase(karma,5,"job","Barber") if("2") - if(karma <5) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Brig Physician?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Brig Physician",5) - return + karma_purchase(karma,5,"job","Brig Physician") if("3") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Nanotrasen Representative?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Nanotrasen Representative",30) - return + karma_purchase(karma,30,"job","Nanotrasen Representative") if("5") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Blueshield?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Blueshield",30) - return + karma_purchase(karma,30,"job","Blueshield") if("6") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Mechanic?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Mechanic",30) - return + karma_purchase(karma,30,"job","Mechanic") if("7") - if(karma <45) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Magistrate?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Magistrate",45) - return + karma_purchase(karma,45,"job","Magistrate") if("9") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Security Pod Pilot?", "Confirmation", "No", "Yes") != "Yes") - return - DB_job_unlock("Security Pod Pilot",30) - return + karma_purchase(karma,30,"job","Security Pod Pilot") if(href_list["KarmaBuy2"]) var/karma=verify_karma() + if(isnull(karma)) //Doesn't display anything if karma database is down. + return switch(href_list["KarmaBuy2"]) if("1") - if(karma <15) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Machine People?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Machine",15) - return + karma_purchase(karma,15,"species","Machine People","Machine") if("2") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Kidan?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Kidan",30) - return + karma_purchase(karma,30,"species","Kidan") if("3") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Grey?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Grey",30) - return + karma_purchase(karma,30,"species","Grey") if("4") - if(karma <45) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Vox?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Vox",45) - return + karma_purchase(karma,45,"species","Vox") if("5") - if(karma <45) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Slime People?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Slime People",45) - return + karma_purchase(karma,45,"species","Slime People") if("6") - if(karma <100) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Plasmaman?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Plasmaman",100) - return + karma_purchase(karma,100,"species","Plasmaman") if("7") - if(karma <30) - to_chat(usr, "You do not have enough karma!") - return - else - if(alert("Are you sure you want to unlock Drask?", "Confirmation", "No", "Yes") != "Yes") - return - DB_species_unlock("Drask",30) - return + karma_purchase(karma,30,"species","Drask") if(href_list["KarmaRefund"]) var/type = href_list["KarmaRefundType"] var/job = href_list["KarmaRefund"] diff --git a/code/modules/client/preference/loadout/loadout_cosmetics.dm b/code/modules/client/preference/loadout/loadout_cosmetics.dm index c9b82a0259b..aa7f5f02576 100644 --- a/code/modules/client/preference/loadout/loadout_cosmetics.dm +++ b/code/modules/client/preference/loadout/loadout_cosmetics.dm @@ -1,7 +1,11 @@ /datum/gear/lipstick + display_name = "lipstick, red" + path = /obj/item/lipstick + sort_category = "Cosmetics" + +/datum/gear/lipstick/black display_name = "lipstick, black" path = /obj/item/lipstick/black - sort_category = "Cosmetics" /datum/gear/lipstick/jade display_name = "lipstick, jade" @@ -11,9 +15,13 @@ display_name = "lipstick, purple" path = /obj/item/lipstick/purple -/datum/gear/lipstick/red - display_name = "lipstick, red" - path = /obj/item/lipstick +/datum/gear/lipstick/blue + display_name = "lipstick, blue" + path = /obj/item/lipstick/blue + +/datum/gear/lipstick/lime + display_name = "lipstick, lime" + path = /obj/item/lipstick/lime /datum/gear/monocle display_name = "monocle" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index a5b4e614551..50872791f59 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -561,6 +561,7 @@ BLIND // can't see anything strip_delay = 80 put_on_delay = 80 burn_state = FIRE_PROOF + hide_tail_by_species = null species_restricted = list("exclude","Diona","Vox","Wryn") //Under clothing diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 4936256484e..3c0d57dfff9 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -202,7 +202,27 @@ var/aggressiveness = 1 var/safety = 1 actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase) - + var/phrase_list = list( + + "halt" = "HALT! HALT! HALT! HALT!", + "bobby" = "Stop in the name of the Law.", + "compliance" = "Compliance is in your best ineterest.", + "justice" = "Prepare for justice!", + "running" = "Running will only increase your sentence", + "dontmove" = "Don't move, Creep!", + "floor" = "Down on the floor, Creep!", + "robocop" = "Dead or alive you're coming with me.", + "god" = "God made today for the crooks we could not catch yesterday.", + "freeze" = "Freeze, Scum Bag!", + "imperial" = "Stop right there, criminal scum!", + "bash" = "Stop or I'll bash you.", + "harry" = "Go ahead, make my day", + "asshole" = "Stop breaking the law, asshole.", + "stfu" = "You have the right to shut the fuck up", + "shutup" = "Shut up crime!", + "super" = "Face the wrath of the golden bolt.", + "dredd" = "I am, the LAW!" + ) /obj/item/clothing/mask/gas/sechailer/hos name = "\improper HOS SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." @@ -250,133 +270,34 @@ else if(actiontype == /datum/action/item_action/adjust) adjustmask(user) else if(actiontype == /datum/action/item_action/selectphrase) + var/key = phrase_list[phrase] + var/message = phrase_list[key] + + if (!safety) + to_chat(user, "You set the restrictor to: FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT.") + return + switch(aggressiveness) if(1) - switch(phrase) - if(1) - to_chat(user, "You set the restrictor to: Stop in the name of the Law.") - phrase = 2 - if(2) - to_chat(user, "You set the restrictor to: Compliance is in your best interest.") - phrase = 3 - if(3) - to_chat(user, "You set the restrictor to: Prepare for justice.") - phrase = 4 - if(4) - to_chat(user, "You set the restrictor to: Running will only increase your sentence.") - phrase = 5 - if(5) - to_chat(user, "You set the restrictor to: Don't move, Creep!") - phrase = 6 - if(6) - to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!") - phrase = 1 - else - to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!") - phrase = 1 + phrase = (phrase < 6) ? (phrase + 1) : 1 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") if(2) - switch(phrase) - if(7) - to_chat(user, "You set the restrictor to: Dead or alive you're coming with me.") - phrase = 8 - if(8) - to_chat(user, "You set the restrictor to: God made today for the crooks we could not catch yesterday.") - phrase = 9 - if(9) - to_chat(user, "You set the restrictor to: Freeze, Scum Bag!") - phrase = 10 - if(10) - to_chat(user, "You set the restrictor to: Stop right there, criminal scum!") - phrase = 11 - if(11) - to_chat(user, "You set the restrictor to: Down on the floor, Creep!") - phrase = 7 - else - to_chat(user, "You set the restrictor to: Down on the floor, Creep!") - phrase = 7 + phrase = (phrase < 11 && phrase >= 7) ? (phrase + 1) : 7 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") if(3) - switch(phrase) - if(12) - to_chat(user, "You set the restrictor to: Go ahead, make my day.") - phrase = 13 - if(13) - to_chat(user, "You set the restrictor to: Stop breaking the law, ass hole.") - phrase = 14 - if(14) - to_chat(user, "You set the restrictor to: You have the right to shut the fuck up.") - phrase = 15 - if(15) - to_chat(user, "You set the restrictor to: Shut up crime!") - phrase = 16 - if(16) - to_chat(user, "You set the restrictor to: Face the wrath of the golden bolt.") - phrase = 17 - if(17) - to_chat(user, "You set the restrictor to: I am, the LAW!") - phrase = 18 - if(18) - to_chat(user, "You set the restrictor to: Stop or I'll bash you.") - phrase = 12 - else - to_chat(user, "You set the restrictor to: Go ahead, make my day.") - phrase = 13 - + phrase = (phrase < 18 && phrase >= 12 ) ? (phrase + 1) : 12 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") if(4) - switch(phrase) - if(1) - to_chat(user, "You set the restrictor to: Stop in the name of the Law.") - phrase = 2 - if(2) - to_chat(user, "You set the restrictor to: Compliance is in your best interest.") - phrase = 3 - if(3) - to_chat(user, "You set the restrictor to: Prepare for justice.") - phrase = 4 - if(4) - to_chat(user, "You set the restrictor to: Running will only increase your sentence.") - phrase = 5 - if(5) - to_chat(user, "You set the restrictor to: Don't move, Creep!") - phrase = 6 - if(6) - to_chat(user, "You set the restrictor to: Down on the floor, Creep!") - phrase = 7 - if(7) - to_chat(user, "You set the restrictor to: Dead or alive you're coming with me.") - phrase = 8 - if(8) - to_chat(user, "You set the restrictor to: God made today for the crooks we could not catch yesterday.") - phrase = 9 - if(9) - to_chat(user, "You set the restrictor to: Freeze, Scum Bag!") - phrase = 10 - if(10) - to_chat(user, "You set the restrictor to: Stop right there, criminal scum!") - phrase = 11 - if(11) - to_chat(user, "You set the restrictor to: Stop or I'll bash you.") - phrase = 12 - if(12) - to_chat(user, "You set the restrictor to: Go ahead, make my day.") - phrase = 13 - if(13) - to_chat(user, "You set the restrictor to: Stop breaking the law, ass hole.") - phrase = 14 - if(14) - to_chat(user, "You set the restrictor to: You have the right to shut the fuck up.") - phrase = 15 - if(15) - to_chat(user, "You set the restrictor to: Shut up crime!") - phrase = 16 - if(16) - to_chat(user, "You set the restrictor to: Face the wrath of the golden bolt.") - phrase = 17 - if(17) - to_chat(user, "You set the restrictor to: I am, the LAW!") - phrase = 18 - if(18) - to_chat(user, "You set the restrictor to: HALT! HALT! HALT! HALT!") - phrase = 1 + phrase = (phrase < 18 && phrase >= 1 ) ? (phrase + 1) : 1 + key = phrase_list[phrase] + message = phrase_list[key] + to_chat(user,"You set the restrictor to: [message]") else to_chat(user, "It's broken.") @@ -419,77 +340,20 @@ return /obj/item/clothing/mask/gas/sechailer/proc/halt() - var/phrase_text = null - var/phrase_sound = null + var/key = phrase_list[phrase] + var/message = phrase_list[key] if(cooldown < world.time - 35) // A cooldown, to stop people being jerks if(!safety) - phrase_text = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT." - usr.visible_message("[usr]'s Compli-o-Nator: [phrase_text]") + message = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT." + usr.visible_message("[usr]'s Compli-o-Nator: [message]") playsound(src.loc, 'sound/voice/binsult.ogg', 100, 0, 4) cooldown = world.time return - - switch(phrase) //sets the properties of the chosen phrase - if(1) // good cop - phrase_text = "HALT! HALT! HALT! HALT!" - phrase_sound = "halt" - if(2) - phrase_text = "Stop in the name of the Law." - phrase_sound = "bobby" - if(3) - phrase_text = "Compliance is in your best interest." - phrase_sound = "compliance" - if(4) - phrase_text = "Prepare for justice!" - phrase_sound = "justice" - if(5) - phrase_text = "Running will only increase your sentence." - phrase_sound = "running" - if(6) // bad cop - phrase_text = "Don't move, Creep!" - phrase_sound = "dontmove" - if(7) - phrase_text = "Down on the floor, Creep!" - phrase_sound = "floor" - if(8) - phrase_text = "Dead or alive you're coming with me." - phrase_sound = "robocop" - if(9) - phrase_text = "God made today for the crooks we could not catch yesterday." - phrase_sound = "god" - if(10) - phrase_text = "Freeze, Scum Bag!" - phrase_sound = "freeze" - if(11) - phrase_text = "Stop right there, criminal scum!" - phrase_sound = "imperial" - if(12) // LA-PD - phrase_text = "Stop or I'll bash you." - phrase_sound = "bash" - if(13) - phrase_text = "Go ahead, make my day." - phrase_sound = "harry" - if(14) - phrase_text = "Stop breaking the law, ass hole." - phrase_sound = "asshole" - if(15) - phrase_text = "You have the right to shut the fuck up." - phrase_sound = "stfu" - if(16) - phrase_text = "Shut up crime!" - phrase_sound = "shutup" - if(17) - phrase_text = "Face the wrath of the golden bolt." - phrase_sound = "super" - if(18) - phrase_text = "I am, the LAW!" - phrase_sound = "dredd" - - usr.visible_message("[usr]'s Compli-o-Nator: [phrase_text]") - playsound(src.loc, "sound/voice/complionator/[phrase_sound].ogg", 100, 0, 4) + usr.visible_message("[usr]'s Compli-o-Nator: [message]") + playsound(src.loc, "sound/voice/complionator/[key].ogg", 100, 0, 4) cooldown = world.time diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 22f293aedfc..fba251f71f8 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -120,6 +120,78 @@ mute = MUZZLE_MUTE_NONE security_lock = TRUE locked = FALSE + materials = list(MAT_METAL=500, MAT_GLASS=50) + +/obj/item/clothing/mask/muzzle/safety/shock + name = "shock muzzle" + desc = "A muzzle designed to prevent biting. This one is fitted with a behavior correction system." + var/obj/item/assembly/trigger = null + origin_tech = "materials=1;engineering=1" + materials = list(MAT_METAL=500, MAT_GLASS=50) + +/obj/item/clothing/mask/muzzle/safety/shock/attackby(obj/item/W, mob/user, params) + if(isscrewdriver(W) && trigger) + to_chat(user, "You disassemble [src].") + trigger.forceMove(get_turf(user)) + trigger.master = null + trigger.holder = null + trigger = null + return TRUE + else if(istype(W, /obj/item/assembly/signaler) || istype(W, /obj/item/assembly/voice)) + if(istype(trigger, /obj/item/assembly/signaler) || istype(trigger, /obj/item/assembly/voice)) + to_chat(user, "Something is already attached to [src].") + return FALSE + if(!user.drop_item()) + to_chat(user, "You are unable to insert [W] into [src].") + return FALSE + trigger = W + trigger.forceMove(src) + trigger.master = src + trigger.holder = src + to_chat(user, "You attach the [W] to [src].") + return TRUE + else if(istype(W, /obj/item/assembly)) + to_chat(user, "That won't fit in [src]. Perhaps a signaler or voice analyzer would?") + return FALSE + + return ..() + + +/obj/item/clothing/mask/muzzle/safety/shock/proc/can_shock(obj/item/clothing/C) + if(istype(C)) + if(isliving(C.loc)) + return C.loc + else if(isliving(loc)) + return loc + return FALSE + +/obj/item/clothing/mask/muzzle/safety/shock/proc/process_activation(var/obj/D, var/normal = 1, var/special = 1) + visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + var/mob/M = can_shock(loc) + if(M) + to_chat(M, "You feel a sharp shock!") + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(3, 1, M) + s.start() + + M.Weaken(5) + M.Stuttering(1) + M.Jitter(20) + return + +/obj/item/clothing/mask/muzzle/safety/shock/HasProximity(atom/movable/AM as mob|obj) + if(trigger) + trigger.HasProximity(AM) + + +/obj/item/clothing/mask/muzzle/safety/shock/hear_talk(mob/living/M as mob, msg) + if(trigger) + trigger.hear_talk(M, msg) + +/obj/item/clothing/mask/muzzle/safety/shock/hear_message(mob/living/M as mob, msg) + if(trigger) + trigger.hear_message(M, msg) + /obj/item/clothing/mask/surgical diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 91884eeba2d..2597b3cdde7 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -40,7 +40,7 @@ allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/t_scanner, /obj/item/rcd, /obj/item/crowbar, \ /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/multitool, \ /obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \ - /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun) + /obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun, /obj/item/gun/projectile/automatic/lasercarbine, /obj/item/gun/energy/gun/blueshield) strip_delay = 130 species_fit = list("Drask", "Vox") sprite_sheets = list( diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 75614d56312..2ba550d8a81 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -70,6 +70,7 @@ allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd) siemens_coefficient = 0 + hide_tail_by_species = list("Vox" , "Vulpkanin" , "Unathi" , "Tajaran") species_restricted = list("exclude","Diona","Wryn") sprite_sheets = list( "Unathi" = 'icons/mob/species/unathi/suit.dmi', @@ -313,7 +314,7 @@ on = 1 actions_types = list(/datum/action/item_action/toggle_helmet_mode) flags = BLOCKHAIR | STOPSPRESSUREDMAGE | THICKMATERIAL - visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE + visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE|HIDETAIL /obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon() icon_state = "hardsuit[on]-[item_color]" @@ -379,7 +380,7 @@ desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." slowdown = 1 flags = STOPSPRESSUREDMAGE | THICKMATERIAL - flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT + flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS else to_chat(user, "You switch your hardsuit to combat mode. You will take damage in zero pressure environments, but you are more suited for a fight.") diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 1e874772478..532522747ed 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -110,7 +110,7 @@ slowdown = 0 flags = STOPSPRESSUREDMAGE flags_size = ONESIZEFITSALL - allowed = list(/obj/item) //for stuffing exta special presents + allowed = list(/obj/item) //for stuffing extra special presents //Space pirate outfit /obj/item/clothing/head/helmet/space/pirate @@ -139,13 +139,20 @@ //Paramedic EVA suit /obj/item/clothing/head/helmet/space/eva/paramedic name = "Paramedic EVA helmet" - desc = "A paramedic EVA helmet. Used in the recovery of bodies from space." + desc = "A brand new paramedic EVA helmet. It seems to mold to your head shape. Used for retrieving bodies in space." icon_state = "paramedic-eva-helmet" item_state = "paramedic-eva-helmet" - species_fit = list("Vox", "Grey") + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) + species_restricted = list("exclude", "Diona", "Wryn") + species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/helmet.dmi', - "Grey" = 'icons/mob/species/grey/helmet.dmi' + "Grey" = 'icons/mob/species/grey/helmet.dmi', + "Skrell" = 'icons/mob/species/skrell/helmet.dmi', + "Tajaran" = 'icons/mob/species/tajaran/helmet.dmi', + "Drask" = 'icons/mob/species/drask/helmet.dmi', + "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi', ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/hats.dmi' @@ -155,10 +162,18 @@ name = "Paramedic EVA suit" icon_state = "paramedic-eva" item_state = "paramedic-eva" - desc = "A paramedic EVA suit. Used in the recovery of bodies from space." - species_fit = list("Vox") + desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space." + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20) + species_restricted = list("exclude", "Diona", "Wryn") + species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin") sprite_sheets = list( - "Vox" = 'icons/mob/species/vox/suit.dmi' + "Vox" = 'icons/mob/species/vox/suit.dmi', + "Grey" = 'icons/mob/species/grey/suit.dmi', + "Skrell" = 'icons/mob/species/skrell/suit.dmi', + "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + "Drask" = 'icons/mob/species/drask/suit.dmi', + "Unathi" = 'icons/mob/species/unathi/suit.dmi', + "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi', ) sprite_sheets_obj = list( "Vox" = 'icons/obj/clothing/species/vox/suits.dmi' diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 764ee71583a..a243e734ef6 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -243,7 +243,6 @@ /obj/item/clothing/accessory/holobadge/cord icon_state = "holobadge-cord" item_color = "holobadge-cord" - slot_flags = SLOT_MASK | SLOT_TIE /obj/item/clothing/accessory/holobadge/attack_self(mob/user as mob) if(!stored_name) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index b509f5df1b5..1a1d5d1a98b 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -44,7 +44,7 @@ return if(!user.canUnEquip(W, 0)) - to_chat(user, "You can't let go of the [W]!") + to_chat(user, "You can't let go of the [W]!") return holstered = W diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 95ae68dcd26..f371ae3997b 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -103,7 +103,7 @@ item_color = "centcom" /obj/item/clothing/under/rank/centcom/officer - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant-Commander\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder." name = "\improper Nanotrasen Officers Uniform" icon_state = "officer" item_state = "g_suit" @@ -112,7 +112,7 @@ flags_size = ONESIZEFITSALL /obj/item/clothing/under/rank/centcom/captain - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shoulder." name = "\improper Nanotrasen Captains Uniform" icon_state = "centcom" item_state = "dg_suit" @@ -120,7 +120,7 @@ displays_id = 0 /obj/item/clothing/under/rank/centcom/blueshield - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears \"N.S.S. Cyberiad\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears \"N.S.S. Cyberiad\" on the left shoulder." name = "\improper Nanotrasen Navy Uniform" icon_state = "officer" item_state = "g_suit" @@ -128,8 +128,12 @@ displays_id = 0 flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/centcom/blueshield/New() + ..() + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Lieutenant\" and bears [station_name()] on the left shoulder." + /obj/item/clothing/under/rank/centcom/representative - desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shounder." + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shoulder." name = "\improper Nanotrasen Navy Uniform" icon_state = "officer" item_state = "g_suit" @@ -137,6 +141,10 @@ displays_id = 0 flags_size = ONESIZEFITSALL +/obj/item/clothing/under/rank/centcom/representative/New() + ..() + desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears [station_name()] on the left shoulder." + /obj/item/clothing/under/rank/centcom/diplomatic desc = "A very gaudy and official looking uniform of the Nanotrasen Diplomatic Corps." name = "\improper Nanotrasen Diplomatic Uniform" @@ -831,4 +839,4 @@ icon_state = "medicalgown" item_state = "medicalgown" item_color = "medicalgown" - body_parts_covered = UPPER_TORSO|LOWER_TORSO \ No newline at end of file + body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 9dad4d2374b..eb616151422 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -563,6 +563,61 @@ else to_chat(user, "You can't modify [target]!") +#define USED_MOD_HELM 1 +#define USED_MOD_SUIT 2 + +/obj/item/fluff/pyro_wintersec_kit //DarkLordpyro: Valthorne Haliber + name = "winter sec conversion kit" + desc = "A securirty hardsuit conversion kit." + icon_state = "modkit" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/fluff/pyro_wintersec_kit/afterattack(atom/target, mob/user, proximity) + if(!proximity || !ishuman(user) || user.incapacitated()) + return + var/mob/living/carbon/human/H = user + + if(istype(target, /obj/item/clothing/head/helmet/space/hardsuit/security)) + if(used & USED_MOD_HELM) + to_chat(H, "The kit's helmet modifier has already been used.") + return + to_chat(H, "You modify the appearance of [target].") + used |= USED_MOD_HELM + + var/obj/item/clothing/head/helmet/space/hardsuit/security/P = target + P.name = "winterised security hardsuit helmet" + P.desc = "A rare winterised variant of the security hardsuit helmet, used on colder mining worlds for security patrols." + P.icon = 'icons/obj/custom_items.dmi' + P.icon_state = "hardsuit0-secf" + P.item_state = "hardsuit0-secf" + P.sprite_sheets = null + P.item_color = "secf" + user.update_icons() + + if(P == H.head) + H.update_inv_head() + return + if(istype(target, /obj/item/clothing/suit/space/hardsuit/security)) + if(used & USED_MOD_SUIT) + to_chat(user, "The kit's suit modifier has already been used.") + return + to_chat(H, "You modify the appearance of [target].") + used |= USED_MOD_SUIT + + var/obj/item/clothing/suit/space/hardsuit/security/P = target + P.name = "winterised security hardsuit" + P.desc = "A rare winterised variant of the security hardsuit, used on colder mining worlds for securiry patrols, this one has 'Haliber' written on an ID patch located on the right side of the chest." + P.icon = 'icons/obj/custom_items.dmi' + P.icon_state = "hardsuit-secf" + P.item_state = "hardsuit-secf" + P.sprite_sheets = null + user.update_icons() + + if(P == H.wear_suit) + H.update_inv_wear_suit() + return + to_chat(user, "You can't modify [target]!") + ////////////////////////////////// //////////// Clothing //////////// ////////////////////////////////// @@ -945,6 +1000,14 @@ flags_inv = HIDEEARS //////////// Uniforms //////////// +/obj/item/clothing/under/fluff/benjaminfallout // Benjaminfallout: Pretzel Brassheart + icon = 'icons/obj/custom_items.dmi' + name = "Pretzel's dress" + desc = "A nice looking dress" + icon_state = "fallout_dress" + item_state = "fallout_dress" + item_color = "fallout_dress" + /obj/item/clothing/under/fluff/soviet_casual_uniform // Norstead : Natalya Sokolova icon = 'icons/obj/custom_items.dmi' name = "Soviet Casual Uniform" @@ -1043,6 +1106,15 @@ item_color = "aegisuniform" displays_id = 0 +/obj/item/clothing/under/fluff/elo_turtleneck // vforcebomber: E.L.O. + name = "E.L.O's Turtleneck" + desc = "This TurtleNeck belongs to the IPC E.L.O. And has her name sown into the upper left breast, a very wooly jumper." + icon = 'icons/obj/custom_items.dmi' // for the floor sprite + icon_override = 'icons/obj/custom_items.dmi' // for the mob sprite + icon_state = "eloturtleneckfloor" + item_color = "eloturtleneck" + displays_id = FALSE + //////////// Masks //////////// /obj/item/clothing/mask/bandana/fluff/dar //sasanek12: Dar'Konr @@ -1228,6 +1300,13 @@ species_fit = null sprite_sheets = null +/obj/item/storage/backpack/fluff/syndiesatchel //SkeletalElite: Rawkkihiki + name= "Military Satchel" + desc = "A well made satchel for military operations. Totally not made by an enemy corporation" + icon = 'icons/obj/custom_items.dmi' + icon_state = "rawk_satchel" + sprite_sheets = null + /obj/item/storage/backpack/fluff/krich_back //lizardzsi: Krichahka name = "Voxcaster" desc = "Battered, Sol-made military radio backpack that had its speakers fried from playing Vox opera. The words 'Swift-Talon' are crudely scratched onto its side." @@ -1396,3 +1475,12 @@ item_state = "panzermedal" item_color = "panzermedal" slot_flags = SLOT_TIE + +/obj/item/clothing/accessory/medal/fluff/XannZxiax //Sagrotter: Xann Zxiax + name = "Zxiax Garnet" + desc = "Green Garnet on fancy blue cord, when you look at the Garnet, you feel strangely appeased." + icon = 'icons/obj/custom_items.dmi' + icon_state = "Xann_necklace" + item_state = "Xann_necklace" + item_color = "Xann_necklace" + slot_flags = SLOT_TIE diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm index c293e6348c1..64318877847 100644 --- a/code/modules/detective_work/scanner.dm +++ b/code/modules/detective_work/scanner.dm @@ -80,7 +80,7 @@ if(ismob(loc)) var/mob/M = loc M.put_in_hands(P) - to_chat(M, "Report printed. Log cleared.") + to_chat(M, "Report printed. Log cleared.") // Clear the logs log = list() diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 6306fa5a83e..e43797ef9dd 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -19,7 +19,7 @@ log transactions icon = 'icons/obj/terminals.dmi' icon_state = "atm" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 var/obj/machinery/computer/account_database/linked_db var/datum/money_account/authenticated_account @@ -97,18 +97,9 @@ log transactions if(!powered()) return var/obj/item/stack/spacecash/C = I - authenticated_account.money += C.amount playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1) - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Credit deposit" - T.amount = C.amount - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - authenticated_account.transaction_log.Add(T) + authenticated_account.credit(C.amount, "Credit deposit", machine_id, authenticated_account.owner_name) to_chat(user, "You insert [C] into [src].") SSnanoui.update_uis(src) @@ -175,19 +166,8 @@ log transactions else if(transfer_amount <= authenticated_account.money) var/target_account_number = text2num(href_list["target_acc_number"]) var/transfer_purpose = href_list["purpose"] - if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount)) + if(linked_db.charge_to_account(target_account_number, authenticated_account, transfer_purpose, machine_id, transfer_amount)) to_chat(usr, "[bicon(src)]Funds transfer successful.") - authenticated_account.money -= transfer_amount - - //create an entry in the account transaction log - var/datum/transaction/T = new() - T.target_name = "Account #[target_account_number]" - T.purpose = transfer_purpose - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - T.amount = "([transfer_amount])" - authenticated_account.transaction_log.Add(T) else to_chat(usr, "[bicon(src)]Funds transfer failed.") @@ -263,15 +243,7 @@ log transactions authenticated_account.money -= amount withdraw_arbitrary_sum(amount) - //create an entry in the account transaction log - var/datum/transaction/T = new() - T.target_name = authenticated_account.owner_name - T.purpose = "Credit withdrawal" - T.amount = "([amount])" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - authenticated_account.transaction_log.Add(T) + authenticated_account.charge(amount, null, "Credit withdrawal", machine_id, authenticated_account.owner_name) else to_chat(usr, "[bicon(src)]You don't have enough funds to do that!") if("balance_statement") diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 23b51fd2aea..f1f283fe56a 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -1,4 +1,9 @@ -var/global/current_date_string +#define STATION_CREATION_DATE "2 April, 2555" +#define STATION_CREATION_TIME "11:24:30" +#define STATION_START_CASH 75000 +#define STATION_SOURCE_TERMINAL "Biesel GalaxyNet Terminal #227" +#define DEPARTMENT_START_CASH 5000 + var/global/num_financial_terminals = 1 var/global/datum/money_account/station_account var/global/list/datum/money_account/department_accounts = list() @@ -15,19 +20,13 @@ var/global/list/all_money_accounts = list() station_account.owner_name = "[station_name()] Station Account" station_account.account_number = rand(111111, 999999) station_account.remote_access_pin = rand(1111, 111111) - station_account.money = 75000 + station_account.money = STATION_START_CASH //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = station_account.owner_name - T.purpose = "Account creation" - T.amount = 75000 - T.date = "2nd April, 2555" - T.time = "11:24" - T.source_terminal = "Biesel GalaxyNet Terminal #277" + station_account.makeTransactionLog(STATION_START_CASH, "Account Creation", STATION_SOURCE_TERMINAL, station_account.owner_name, FALSE, + STATION_CREATION_DATE, STATION_CREATION_TIME) //add the account - station_account.transaction_log.Add(T) all_money_accounts.Add(station_account) /proc/create_department_account(department) @@ -37,19 +36,13 @@ var/global/list/all_money_accounts = list() department_account.owner_name = "[department] Account" department_account.account_number = rand(111111, 999999) department_account.remote_access_pin = rand(1111, 111111) - department_account.money = 5000 + department_account.money = DEPARTMENT_START_CASH //create an entry in the account transaction log for when it was created - var/datum/transaction/T = new() - T.target_name = department_account.owner_name - T.purpose = "Account creation" - T.amount = department_account.money - T.date = "2nd April, 2555" - T.time = "11:24" - T.source_terminal = "Biesel GalaxyNet Terminal #277" + department_account.makeTransactionLog(DEPARTMENT_START_CASH, "Account Creation", STATION_SOURCE_TERMINAL, department_account.owner_name, FALSE, + STATION_CREATION_DATE, STATION_CREATION_TIME) //add the account - department_account.transaction_log.Add(T) all_money_accounts.Add(department_account) department_accounts[department] = department_account @@ -73,7 +66,7 @@ var/global/list/all_money_accounts = list() if(!source_db) //set a random date, time and location some time over the past few decades T.date = "[num2text(rand(1,31))] [pick(month_names)], [rand(game_year - 20,game_year - 1)]" - T.time = "[rand(0,23)]:[rand(0,59)]" + T.time = "[rand(0,23)]:[rand(0,59)]:[rand(0,59)]" T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]" M.account_number = rand(111111, 999999) @@ -104,7 +97,7 @@ var/global/list/all_money_accounts = list() Date and time: [station_time_timestamp()], [current_date_string]

    Creation terminal ID: [source_db.machine_id]
    Authorised NT officer overseeing creation: [overseer]
    "} - // END AUTOFIX + //stamp the paper var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') stampoverlay.icon_state = "paper_stamp-cent" @@ -133,7 +126,6 @@ var/global/list/all_money_accounts = list() /datum/money_account/New() ..() - //security_level = pick (0,1) //Stealing is now slightly viable /datum/transaction var/target_name = "" @@ -142,222 +134,14 @@ var/global/list/all_money_accounts = list() var/date = "" var/time = "" var/source_terminal = "" -/* -/obj/machinery/account_database - name = "Accounts database" - desc = "Holds transaction logs, account data and all kinds of other financial records." - icon = 'icons/obj/virology.dmi' - icon_state = "analyser" - density = 1 - req_one_access = list(access_hop, access_captain) - var/receipt_num - var/machine_id = "" - var/obj/item/card/id/held_card - var/access_level = 0 - var/datum/money_account/detailed_account_view - var/creating_new_account = 0 - var/activated = 1 -/obj/machinery/account_database/New() - ..() - if(!station_account) - create_station_account() - - if(department_accounts.len == 0) - for(var/department in station_departments) - create_department_account(department) - if(!vendor_account) - create_department_account("Vendor") - vendor_account = department_accounts["Vendor"] - - if(!current_date_string) - current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557" - - machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" - -/obj/machinery/account_database/attack_hand(mob/user as mob) - if(ishuman(user) && !user.stat && get_dist(src,user) <= 1) - var/dat = "Accounts Database
    " - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:171: dat += "[machine_id]
    " - dat += {"[machine_id]
    - Confirm identity: [held_card ? held_card : "-----"]
    "} - // END AUTOFIX - if(access_level > 0) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:175: dat += "[activated ? "Disable" : "Enable"] remote access
    " - dat += {"[activated ? "Disable" : "Enable"] remote access
    - You may not edit accounts at this terminal, only create and view them.
    "} - // END AUTOFIX - if(creating_new_account) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:178: dat += "
    " - dat += {"
    - Return to accounts list -
    - - - Holder name:
    - Initial funds: (subtracted from station account)
    - New accounts are automatically assigned a secret number and pin, which are printed separately in a sealed package.
    -
    - "} - // END AUTOFIX - else - if(detailed_account_view) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:190: dat += "
    " - dat += {"
    - Return to accounts list
    - Account number: #[detailed_account_view.account_number]
    - Account holder: [detailed_account_view.owner_name]
    - Account balance: $[detailed_account_view.money]
    -
    - - - - - - - - "} - // END AUTOFIX - for(var/datum/transaction/T in detailed_account_view.transaction_log) - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:205: dat += "" - dat += {" - - - - - - - "} - // END AUTOFIX - dat += "
    DateTimeTargetPurposeValueSource terminal ID
    [T.date][T.time][T.target_name][T.purpose]$[T.amount][T.source_terminal]
    " - else - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:215: dat += "Create new account

    " - dat += {"Create new account

    - "} - // END AUTOFIX - for(var/i=1, i<=all_money_accounts.len, i++) - var/datum/money_account/D = all_money_accounts[i] - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\Accounts.dm:219: dat += "" - dat += {" - - - - "} - // END AUTOFIX - dat += "
    #[D.account_number][D.owner_name]View in detail
    " - - user << browse(dat,"window=account_db;size=700x650") - else - user << browse(null,"window=account_db") - -/obj/machinery/account_database/attackby(O as obj, user as mob)//TODO:SANITY - if(istype(O, /obj/item/card)) - var/obj/item/card/id/idcard = O - if(!held_card) - usr.drop_item() - idcard.loc = src - held_card = idcard - - if(access_cent_captain in idcard.access) - access_level = 2 - else if(access_hop in idcard.access || access_captain in idcard.access) - access_level = 1 - else - ..() - -/obj/machinery/account_database/Topic(var/href, var/href_list) - ..() - if(href_list["toggle_activated"]) - activated = !activated - - if(href_list["choice"]) - switch(href_list["choice"]) - if("create_account") - creating_new_account = 1 - if("finalise_create_account") - var/account_name = href_list["holder_name"] - var/starting_funds = max(text2num(href_list["starting_funds"]), 0) - create_account(account_name, starting_funds, src) - if(starting_funds > 0) - //subtract the money - station_account.money -= starting_funds - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = account_name - T.purpose = "New account funds initialisation" - T.amount = "([starting_funds])" - T.date = current_date_string - T.time = station_time_timestamp() - T.source_terminal = machine_id - station_account.transaction_log.Add(T) - - creating_new_account = 0 - if("insert_card") - if(held_card) - held_card.loc = src.loc - - if(ishuman(usr) && !usr.get_active_hand()) - usr.put_in_hands(held_card) - held_card = null - access_level = 0 - - else - var/obj/item/I = usr.get_active_hand() - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/C = I - usr.drop_item() - C.loc = src - held_card = C - - if(access_cent_captain in C.access) - access_level = 2 - else if(access_hop in C.access || access_captain in C.access) - access_level = 1 - if("view_account_detail") - var/index = text2num(href_list["account_index"]) - if(index && index <= all_money_accounts.len) - detailed_account_view = all_money_accounts[index] - if("view_accounts_list") - detailed_account_view = null - creating_new_account = 0 - - src.attack_hand(usr) -*/ -/obj/machinery/computer/account_database/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount) +/obj/machinery/computer/account_database/proc/charge_to_account(attempt_account_number, datum/money_account/source, purpose, terminal_id, amount) if(!activated) return 0 for(var/datum/money_account/D in all_money_accounts) if(D.account_number == attempt_account_number && !D.suspended) - D.money += amount - - //create a transaction log entry - var/datum/transaction/T = new() - T.target_name = source_name - T.purpose = purpose - if(amount < 0) - T.amount = "([amount])" - else - T.amount = "[amount]" - T.date = current_date_string - T.time = station_time_timestamp() - T.source_terminal = terminal_id - D.transaction_log.Add(T) - + source.charge(amount, D, purpose, terminal_id, "Account #[D.account_number]", "Transfer from [source.owner_name]", + "[D.owner_name]") return 1 return 0 @@ -378,3 +162,9 @@ var/global/list/all_money_accounts = list() for(var/datum/money_account/D in all_money_accounts) if(D.account_number == attempt_account_number) return D + +#undef STATION_CREATION_DATE +#undef STATION_CREATION_TIME +#undef STATION_START_CASH +#undef STATION_SOURCE_TERMINAL +#undef DEPARTMENT_START_CASH diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 3ea778671a1..e99367cb8fd 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -1,3 +1,4 @@ +var/global/current_date_string /obj/machinery/computer/account_database name = "Accounts Uplink Terminal" @@ -15,34 +16,6 @@ light_color = LIGHT_COLOR_GREEN -/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user) - if(user.can_admin_interact()) - return 2 - if(!held_card) - return 0 - if(access_cent_commander in held_card.access) - return 2 - else if(access_hop in held_card.access || access_captain in held_card.access) - return 1 - -/obj/machinery/computer/account_database/proc/create_transation(target, reason, amount) - var/datum/transaction/T = new() - T.target_name = target - T.purpose = reason - T.amount = amount - T.date = current_date_string - T.time = station_time_timestamp() - T.source_terminal = machine_id - return T - -/obj/machinery/computer/account_database/proc/accounting_letterhead(report_name) - return {" -

    [report_name]

    -
    [station_name()] Accounting Report
    -
    - Generated By: [held_card.registered_name], [held_card.assignment]
    - "} - /obj/machinery/computer/account_database/New() if(!station_account) create_station_account() @@ -55,11 +28,29 @@ vendor_account = department_accounts["Vendor"] if(!current_date_string) - current_date_string = "[time2text(world.timeofday, "DD MM")], [game_year]" + current_date_string = "[time2text(world.timeofday, "DD Month")], [game_year]" machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]" ..() +/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user) + if(user.can_admin_interact()) + return 2 + if(!held_card) + return 0 + if(access_cent_commander in held_card.access) + return 2 + else if(access_hop in held_card.access || access_captain in held_card.access) + return 1 + +/obj/machinery/computer/account_database/proc/accounting_letterhead(report_name) + return {" +

    [report_name]

    +
    [station_name()] Accounting Report
    +
    + Generated By: [held_card.registered_name], [held_card.assignment]
    + "} + /obj/machinery/computer/account_database/attackby(obj/O, mob/user, params) if(!istype(O, /obj/item/card/id)) return ..() @@ -160,16 +151,6 @@ if("create_account") creating_new_account = 1 - if("add_funds") - var/amount = input("Enter the amount you wish to add", "Silently add funds") as num - if(detailed_account_view) - detailed_account_view.money += amount - - if("remove_funds") - var/amount = input("Enter the amount you wish to remove", "Silently remove funds") as num - if(detailed_account_view) - detailed_account_view.money -= amount - if("toggle_suspension") if(detailed_account_view) detailed_account_view.suspended = !detailed_account_view.suspended @@ -182,14 +163,10 @@ starting_funds = Clamp(starting_funds, 0, station_account.money) // Not authorized to put the station in debt. starting_funds = min(starting_funds, fund_cap) // Not authorized to give more than the fund cap. - create_account(account_name, starting_funds, src) + var/datum/money_account/M = create_account(account_name, starting_funds, src) if(starting_funds > 0) - //subtract the money - station_account.money -= starting_funds - - //create a transaction log entry - var/trx = create_transation(account_name, "New account activation", "([starting_funds])") - station_account.transaction_log.Add(trx) + station_account.charge(starting_funds, null, "New account activation", + "", "New account activation", M.owner_name) creating_new_account = 0 ui.close() @@ -205,19 +182,6 @@ detailed_account_view = null creating_new_account = 0 - if("revoke_payroll") - var/funds = detailed_account_view.money - var/account_trx = create_transation(station_account.owner_name, "Revoke payroll", "([funds])") - var/station_trx = create_transation(detailed_account_view.owner_name, "Revoke payroll", funds) - - station_account.money += funds - detailed_account_view.money = 0 - - detailed_account_view.transaction_log.Add(account_trx) - station_account.transaction_log.Add(station_trx) - - callHook("revoke_payroll", list(detailed_account_view)) - if("print") var/text playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index f305c43ad9d..b636a96e2aa 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -3,8 +3,7 @@ desc = "Swipe your ID card to make purchases electronically." icon = 'icons/obj/device.dmi' icon_state = "eftpos" - var/machine_id = "" - var/eftpos_name = "Default EFTPOS scanner" + var/machine_name = "" var/transaction_locked = 0 var/transaction_paid = 0 var/transaction_amount = 0 @@ -15,7 +14,7 @@ /obj/item/eftpos/New() ..() - machine_id = "[station_name()] EFTPOS #[num_financial_terminals++]" + machine_name = "[station_name()] EFTPOS #[num_financial_terminals++]" access_code = rand(1111,111111) reconnect_database() spawn(0) @@ -28,14 +27,10 @@ /obj/item/eftpos/proc/print_reference() playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1) var/obj/item/paper/R = new(loc) - R.name = "Reference: [eftpos_name]" - - // AUTOFIXED BY fix_string_idiocy.py - // C:\Users\Rob\Documents\Projects\vgstation13\code\WorkInProgress\Cael_Aislinn\Economy\EFTPOS.dm:31: R.info = "[eftpos_name] reference

    " - R.info = {"[eftpos_name] reference

    + R.name = "Reference: [machine_name]" + R.info = {"[machine_name] reference

    Access code: [access_code]

    Do not lose or misplace this code.
    "} - // END AUTOFIX //stamp the paper var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') stampoverlay.icon_state = "paper_stamp-cent" @@ -86,8 +81,7 @@ /obj/item/eftpos/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) var/data[0] - data["eftpos_name"] = eftpos_name - data["machine_id"] = machine_id + data["machine_name"] = machine_name data["transaction_locked"] = transaction_locked data["transaction_paid"] = transaction_paid data["transaction_purpose"] = transaction_purpose @@ -112,15 +106,6 @@ print_reference() else to_chat(usr, "[bicon(src)]Incorrect code entered.") - if("change_id") - var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code")) - if(attempt_code == access_code) - var/name = input("Enter a new terminal ID for this device", "Enter new EFTPOS ID") as text|null - if(name) - eftpos_name = "[name] EFTPOS scanner" - print_reference() - else - to_chat(usr, "[bicon(src)]Incorrect code entered.") if("link_account") if(!linked_db) reconnect_database() @@ -179,48 +164,34 @@ if(istype(I, /obj/item/card/id)) var/obj/item/card/id/C = I visible_message("[user] swipes a card through [src].") - if(transaction_locked && !transaction_paid) - if(linked_account) - var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num - var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) - if(D) - if(transaction_amount <= D.money) - playsound(src, 'sound/machines/chime.ogg', 50, 1) - visible_message("[bicon(src)] The [src] chimes.") - transaction_paid = 1 - //transfer the money - D.money -= transaction_amount - linked_account.money += transaction_amount + if(!transaction_locked || transaction_paid) + return + + if(!linked_account) + to_chat(user, "[bicon(src)]EFTPOS is not connected to an account.") + return + + var/confirm = alert("Are you sure you want to pay $[transaction_amount] to Account: [linked_account.owner_name] ", "Confirm transaction", "Yes", "No") + if(confirm == "No") + return + var/attempt_pin = input("Enter pin code", "EFTPOS transaction") as num + var/datum/money_account/D = attempt_account_access(C.associated_account_number, attempt_pin, 2) + + if(!D) + to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again.") + + if(transaction_amount > D.money) + to_chat(user, "[bicon(src)]You don't have that much money!") + return + + var/transSuccess = D.charge(transaction_amount, linked_account, transaction_purpose, machine_name, D.owner_name) + if(transSuccess == TRUE) + playsound(src, 'sound/machines/chime.ogg', 50, 1) + visible_message("[bicon(src)] The [src] chimes.") + transaction_paid = 1 - //create entries in the two account transaction logs - var/datum/transaction/T = new() - T.target_name = "[linked_account.owner_name] (via [eftpos_name])" - T.purpose = transaction_purpose - if(transaction_amount > 0) - T.amount = "([transaction_amount])" - else - T.amount = "[transaction_amount]" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - D.transaction_log.Add(T) - // - T = new() - T.target_name = D.owner_name - T.purpose = transaction_purpose - T.amount = "[transaction_amount]" - T.source_terminal = machine_id - T.date = current_date_string - T.time = station_time_timestamp() - linked_account.transaction_log.Add(T) - else - to_chat(user, "[bicon(src)]You don't have that much money!") - else - to_chat(user, "[bicon(src)]Unable to access account. Check security settings and try again.") - else - to_chat(user, "[bicon(src)]EFTPOS is not connected to an account.") else ..() - //emag? \ No newline at end of file + //emag? diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm index 60361ad3f77..30d570bac92 100644 --- a/code/modules/economy/utils.dm +++ b/code/modules/economy/utils.dm @@ -46,47 +46,69 @@ /datum/money_account/proc/fmtBalance() return "$[num2septext(money)]" -/datum/money_account/proc/charge(var/transaction_amount,var/datum/money_account/dest,var/transaction_purpose, var/terminal_name="", var/terminal_id=0, var/dest_name = "UNKNOWN") +// Seperated from charge so they can reuse the code and also because there's many instances where a log will be made without actually making a transaction +/datum/money_account/proc/makeTransactionLog(transaction_amount = 0, transaction_purpose, terminal_name = "", + dest_name = "UNKNOWN", charging = TRUE, date = current_date_string, time = "") + var/datum/transaction/T = new() + T.target_name = dest_name + T.purpose = transaction_purpose + if(!charging || transaction_amount == 0) + T.amount = "[transaction_amount]" + else + T.amount = "([transaction_amount])" + + T.source_terminal = terminal_name + T.date = date + if(time == "") + T.time = station_time_timestamp() + else + T.time = time + transaction_log.Add(T) + + // Charge is for transferring money from an account to another. The destination account can possibly not exist (Magical money sink) +/datum/money_account/proc/charge(transaction_amount = 0, datum/money_account/dest, transaction_purpose, + terminal_name = "", dest_name = "UNKNOWN", dest_purpose, dest_target_name) if(suspended) to_chat(usr, "Unable to access source account: account suspended.") return 0 - + + if(transaction_amount <= money) + //transfer the money + money -= transaction_amount + makeTransactionLog(transaction_amount, transaction_purpose, terminal_name, dest_name) + if(dest) + dest.money += transaction_amount + dest.makeTransactionLog(transaction_amount, + dest_purpose ? dest_purpose : transaction_purpose, terminal_name, dest_target_name ? dest_target_name : dest_name, FALSE) + return 1 + else + to_chat(usr, "Insufficient funds in account.") + return 0 + +// phantom_charge is for when you want to charge an account, without making any corresponding log (e.g. you make it yourself with custom date +// or there won't be any log for some IC reasons (hacking) +/datum/money_account/proc/phantom_charge(transaction_amount = 0, datum/money_account/dest, suspensionbypass = 0) + if(suspended && !suspensionbypass) + return 0 + if(transaction_amount <= money) //transfer the money money -= transaction_amount if(dest) dest.money += transaction_amount - - //create entries in the two account transaction logs - var/datum/transaction/T - if(dest) - T = new() - T.target_name = owner_name - if(terminal_name!="") - T.target_name += " (via [terminal_name])" - T.purpose = transaction_purpose - if(transaction_amount > 0) - T.amount = "([transaction_amount])" - else - T.amount = "[transaction_amount]" - if(terminal_id) - T.source_terminal = terminal_id - T.date = current_date_string - T.time = station_time_timestamp() - dest.transaction_log.Add(T) - // - T = new() - T.target_name = (!dest) ? dest_name : dest.owner_name - if(terminal_name!="") - T.target_name += " (via [terminal_name])" - T.purpose = transaction_purpose - T.amount = "[transaction_amount]" - if(terminal_id) - T.source_terminal = terminal_id - T.date = current_date_string - T.time = station_time_timestamp() - transaction_log.Add(T) return 1 else - to_chat(usr, "Insufficient funds in account.") - return 0 \ No newline at end of file + return 0 + +// Credit is for giving money to an account out of thin air. Suspension does not matter. +/datum/money_account/proc/credit(transaction_amount = 0, transaction_purpose, + terminal_name = "", dest_name = "UNKNOWN", date = current_date_string, time = "") + + money += transaction_amount + makeTransactionLog(transaction_amount, transaction_purpose, terminal_name, dest_name, FALSE, date, time) + return 1 + +//phantom_credit is like the above without any log +/datum/money_account/proc/phantom_credit(transaction_amount = 0) + money += transaction_amount + return 1 diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index ef5a816d2ff..a482642f023 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -1,7 +1,6 @@ /datum/event/blob - announceWhen = 60 - endWhen = 120 - var/obj/structure/blob/core/Blob + announceWhen = 120 + endWhen = 180 /datum/event/blob/announce() event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') @@ -11,18 +10,17 @@ if(!T) return kill() var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1) - var/mob/C - if(candidates.len) - C = pick(candidates) - Blob = new /obj/structure/blob/core(T, new_overmind=C.client) - for(var/i in 1 to 5) - Blob.process() - else + if(!candidates.len) return kill() - -/datum/event/blob/tick() - if(!Blob) - kill() - return - if(IsMultiple(activeFor, 3)) - Blob.process() + var/list/vents = list() + for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in all_vent_pumps) + if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) + if(temp_vent.parent.other_atmosmch.len > 50) + vents += temp_vent + var/obj/vent = pick(vents) + var/mob/living/simple_animal/mouse/blobinfected/B = new(vent.loc) + var/mob/M = pick(candidates) + B.key = M.key + to_chat(B, "You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.") + var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob") + notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay) \ No newline at end of file diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm index 9ca4e878050..c0b16ab43a6 100644 --- a/code/modules/events/grid_check.dm +++ b/code/modules/events/grid_check.dm @@ -17,12 +17,12 @@ if(announce) event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure", new_sound = 'sound/AI/poweroff.ogg') - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot) + var/list/skipped_areas = list(/area/turret_protected/ai) + var/list/skipped_areas_apc = list(/area/engine/engineering) for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) - if(current_area.type in skipped_areas || !is_station_level(S.z)) + if((current_area.type in skipped_areas) || !is_station_level(S.z)) continue S.last_charge = S.charge S.last_output_attempt = S.output_attempt @@ -35,26 +35,26 @@ for(var/obj/machinery/power/apc/C in apcs) var/area/current_area = get_area(C) - if(current_area.type in skipped_areas_apc || !is_station_level(C.z)) + if((current_area.type in skipped_areas_apc) || !is_station_level(C.z)) continue if(C.cell) C.cell.charge = 0 /proc/power_restore(var/announce = 1) - var/list/skipped_areas = list(/area/turret_protected/ai, /area/syndicate_depot) - var/list/skipped_areas_apc = list(/area/engine/engineering, /area/syndicate_depot) + var/list/skipped_areas = list(/area/turret_protected/ai) + var/list/skipped_areas_apc = list(/area/engine/engineering) if(announce) event_announcement.Announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", "Power Systems Nominal", new_sound = 'sound/AI/poweron.ogg') for(var/obj/machinery/power/apc/C in apcs) var/area/current_area = get_area(C) - if(current_area.type in skipped_areas_apc || !is_station_level(C.z)) + if((current_area.type in skipped_areas_apc) || !is_station_level(C.z)) continue if(C.cell) C.cell.charge = C.cell.maxcharge for(var/obj/machinery/power/smes/S in machines) var/area/current_area = get_area(S) - if(current_area.type in skipped_areas || !is_station_level(S.z)) + if((current_area.type in skipped_areas) || !is_station_level(S.z)) continue S.charge = S.last_charge S.output_attempt = S.last_output_attempt diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 641fec1405e..4ba4a14a315 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -1,3 +1,6 @@ +#define MINIMUM_PERCENTAGE_LOSS 0.5 +#define VARIABLE_LOSS 2 // Invariant: 1 - VARIABLE_LOSS/10 >= MINIMUM_PERCENTAGE_LOSS + /var/global/account_hack_attempted = 0 /datum/event/money_hacker @@ -16,7 +19,7 @@ /datum/event/money_hacker/announce() var/message = "A brute force hack has been detected (in progress since [station_time_timestamp()]). The target of the attack is: Financial account #[affected_account.account_number], \ - without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \ + without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected account until the attack has ceased. \ Notifications will be sent as updates occur.
    " var/my_department = "[station_name()] firewall subroutines" @@ -32,35 +35,38 @@ /datum/event/money_hacker/end() var/message - if(affected_account && !affected_account) - //hacker wins + if(!isnull(affected_account) && !affected_account.suspended) message = "The hack attempt has succeeded." - //subtract the money - var/lost = affected_account.money * 0.8 + (rand(2,4) - 2) / 10 - affected_account.money -= lost + var/lost = affected_account.money * (MINIMUM_PERCENTAGE_LOSS + rand(0,VARIABLE_LOSS) / 10); + + affected_account.phantom_charge(lost) + //create a taunting log entry - var/datum/transaction/T = new() - T.target_name = pick("","yo brotha from anotha motha","el Presidente","chieF smackDowN") - T.purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez") - T.amount = pick("","([rand(0,99999)])","alla money","9001$","HOLLA HOLLA GET DOLLA","([lost])") + var/dest_name = pick("","yo brotha from anotha motha","el Presidente","chieF smackDowN") + var/amount = pick("","([rand(0,99999)])","alla money","9001$","HOLLA HOLLA GET DOLLA","([lost])") + var/purpose = pick("Ne$ ---ount fu%ds init*&lisat@*n","PAY BACK YOUR MUM","Funds withdrawal","pWnAgE","l33t hax","liberationez") var/date1 = "31 December, 1999" var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]" - T.date = pick("", current_date_string, date1, date2) + var/date = pick("", current_date_string, date1, date2) var/time1 = rand(0, 99999999) var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" - T.time = pick("", station_time_timestamp(), time2) - T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD") + var/time = pick("", station_time_timestamp(), time2) + var/source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD") + + affected_account.makeTransactionLog(amount, purpose, source_terminal, dest_name, TRUE, date, time) - affected_account.transaction_log.Add(T) else //crew wins - message = "The attack has ceased, the affected accounts can now be brought online." + message = "The attack has ceased, the affected account can now be brought online." var/my_department = "[station_name()] firewall subroutines" for(var/obj/machinery/message_server/MS in world) if(!MS.active) continue MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) + +#undef MINIMUM_PERCENTAGE_LOSS +#undef VARIABLE_LOSS diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index b95278b441b..9339ee6a626 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -8,19 +8,9 @@ if(all_money_accounts.len) var/datum/money_account/D = pick(all_money_accounts) winner_name = D.owner_name - if(!D.suspended) - D.money += winner_sum - var/datum/transaction/T = new() - T.target_name = "Nyx Daily Grand Slam -Stellar- Lottery" - T.purpose = "Winner!" - T.amount = winner_sum - T.date = current_date_string - T.time = worldtime2text() - T.source_terminal = "Biesel TCD Terminal #[rand(111,333)]" - D.transaction_log.Add(T) - - deposit_success = 1 + D.credit(winner_sum, "Winner!", "Biesel TCD Terminal #[rand(111,333)]", "Nyx Daily Grand Slam -Stellar- Lottery") + deposit_success = 1 /datum/event/money_lotto/announce() var/datum/feed_message/newMsg = new /datum/feed_message diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index ea35118ab11..e31a6543ce3 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -43,7 +43,7 @@ nightmare() if(ishuman(src)) if(prob(10)) - emote("writhes in [p_their()] sleep.") + custom_emote(1,"writhes in [p_their()] sleep.") dir = pick(cardinal) /mob/living/carbon/proc/experience_dream(dream_image, isNightmare) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index d8a1f4f1526..74a0baf8cd5 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -21,7 +21,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/image/halbody var/obj/halitem var/hal_screwyhud = SCREWYHUD_NONE - var/handling_hal = 0 + var/handling_hal = FALSE /mob/living/carbon/proc/handle_hallucinations() if(handling_hal) @@ -34,9 +34,9 @@ Gunshots/explosions/opening doors/less rare audio (done) //AAAAHg var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"borer"=10,"delusion"=20,"koolaid"=10) - handling_hal = 1 + handling_hal = TRUE while(hallucination > 20) - sleep(rand(200, 500) / (hallucination / 25)) + sleep(rand(200, 500) / (hallucination * 0.04)) if(prob(20)) continue var/list/current = list() @@ -48,10 +48,8 @@ Gunshots/explosions/opening doors/less rare audio (done) if(86 to 100) current = major - var/halpick = pickweight(current) - - hallucinate(halpick) - handling_hal = 0 + hallucinate(pickweight(current)) + handling_hal = FALSE /obj/effect/hallucination @@ -70,7 +68,7 @@ Gunshots/explosions/opening doors/less rare audio (done) var/col_mod = null var/image/current_image = null var/image_layer = MOB_LAYER - var/active = 1 //qdelery + var/active = TRUE //qdelery /obj/effect/hallucination/simple/New(loc, mob/living/carbon/T) ..() @@ -113,7 +111,7 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/Destroy() if(target.client) target.client.images.Remove(current_image) - active = 0 + active = FALSE return ..() #define FAKE_FLOOD_EXPAND_TIME 20 @@ -198,21 +196,17 @@ Gunshots/explosions/opening doors/less rare audio (done) pump = U break if(!pump) - return 0 + return xeno = new(pump.loc,target) sleep(10) if(!xeno) return - xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) - sleep(10) - if(!xeno) - return - xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) - xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) - sleep(10) - if(!xeno) - return + for(var/i in 0 to 2) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) + sleep(10) + if(!xeno) + return var/xeno_name = xeno.name to_chat(target, "[xeno_name] begins climbing into the ventilation system...") sleep(10) @@ -253,7 +247,7 @@ Gunshots/explosions/opening doors/less rare audio (done) break if(pump) borer = new(pump.loc,target) - for(var/i=0, i<11, i++) + for(var/i in 0 to 10) walk_to(borer, get_step(borer, get_cardinal_dir(borer, T))) if(borer.Adjacent(T)) to_chat(T, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") @@ -331,10 +325,10 @@ Gunshots/explosions/opening doors/less rare audio (done) target = T var/turf/start = get_turf(T) var/screen_border = pick(cardinal) - for(var/i = 0,i<11,i++) + for(var/i in 0 to 10) start = get_step(start, screen_border) s = new(start,target) - for(var/i = 0,i<11,i++) + for(var/i in 0 to 10) sleep(5) s.loc = get_step(get_turf(s), get_dir(s, target)) s.Show() @@ -359,10 +353,10 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/battle/New(loc, mob/living/carbon/T) target = T - var/hits = rand(3,6) + var/hits = rand(2,5) switch(rand(1,5)) if(1) //Laser fight - for(var/i=0,i0, i--) + for(var/i in 0 to rand(1,3)) playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) sleep(rand(10,30)) playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) @@ -877,10 +865,9 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ playsound_local(null, 'sound/AI/outbreak5.ogg') if(19) //Tesla loose! playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) + for(var/i in 0 to 2) + sleep(20) + playsound_local(null, 'sound/magic/lightningbolt.ogg', 65+(35*(i-1)), 1) //65%, then 100% volume. if(20) //AI is doomsdaying! to_chat(src, "

    Anomaly Alert

    ") to_chat(src, "

    Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

    ") @@ -987,8 +974,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ halitem.icon_state = "flashbang1" halitem.name = "Flashbang" if(client) client.screen += halitem - spawn(rand(100,250)) - qdel(halitem) + addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, halitem), rand(100,250)) if("dangerflash") //Flashes of danger if(!halimage) @@ -1007,8 +993,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER) if(4) halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) - - + if(client) client.images += halimage sleep(rand(40,60)) //Only seen for a brief moment. @@ -1054,4 +1039,4 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_ spawn(rand(30,50)) //Only seen for a brief moment. if(client) client.images -= halbody - halbody = null + halbody = null \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm b/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm index d83bfaeccb0..be4f18539e2 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/candy_maker.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/cooking_machines.dmi' icon_state = "candymaker_off" cook_verbs = list("Wonderizing", "Scrumpdiddlyumptiousification", "Miracle-coating", "Flavorifaction") - recipe_type = /datum/recipe/candy + recipe_type = RECIPE_CANDY off_icon = "candymaker_off" on_icon = "candymaker_on" broken_icon = "candymaker_broke" diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm index 62aaf8440bf..802f8f08c54 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm @@ -4,7 +4,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 var/on = 0 var/onicon = null diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 1e3c5602a22..bd80823addd 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -20,7 +20,7 @@ var/stealthmode = FALSE var/list/victims = list() - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 500 diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm index c1b2612533d..e95b186a9f0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill_new.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/cooking_machines.dmi' icon_state = "grill_off" cook_verbs = list("Grilling", "Searing", "Frying") - recipe_type = /datum/recipe/grill + recipe_type = RECIPE_GRILL off_icon = "grill_off" on_icon = "grill_on" broken_icon = "grill_broke" diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index a58ccc1bb2b..5d758193bae 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -7,7 +7,7 @@ anchored = 1 icon = 'icons/obj/cooking_machines.dmi' icon_state = "icecream_vat" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 var/obj/item/reagent_containers/glass/beaker = null var/useramount = 15 //Last used amount diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm index ec806610601..a10f4e2fdae 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -6,7 +6,7 @@ layer = 2.9 density = 1 anchored = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 pass_flags = PASSTABLE diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm index 83f1126f78f..9de98749e42 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm @@ -5,7 +5,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 flags = OPENCONTAINER @@ -16,10 +16,7 @@ var/list/cook_verbs = list("Cooking") //Recipe & Item vars var/recipe_type //Make sure to set this on the machine definition, or else you're gonna runtime on New() - var/list/datum/recipe/available_recipes // List of the recipes you can use - var/list/acceptable_items // List of the items you can put in - var/list/acceptable_reagents // List of the reagents you can put in - var/max_n_of_items = 0 + var/max_n_of_items = 25 //Icon states var/off_icon var/on_icon @@ -35,23 +32,28 @@ ..() create_reagents(100) reagents.set_reacting(FALSE) - if(!available_recipes) - available_recipes = new - acceptable_items = new - acceptable_reagents = new - for(var/type in subtypesof(recipe_type)) + init_lists() + +/obj/machinery/kitchen_machine/proc/init_lists() + if(!GLOB.cooking_recipes[recipe_type]) + GLOB.cooking_recipes[recipe_type] = list() + GLOB.cooking_ingredients[recipe_type] = list() + GLOB.cooking_reagents[recipe_type] = list() + if(!length(GLOB.cooking_recipes[recipe_type])) + for(var/type in subtypesof(GLOB.cooking_recipe_types[recipe_type])) var/datum/recipe/recipe = new type + if(recipe in GLOB.cooking_recipes[recipe_type]) + qdel(recipe) + continue if(recipe.result) // Ignore recipe subtypes that lack a result - available_recipes += recipe + GLOB.cooking_recipes[recipe_type] += recipe for(var/item in recipe.items) - acceptable_items |= item + GLOB.cooking_ingredients[recipe_type] |= item for(var/reagent in recipe.reagents) - acceptable_reagents |= reagent - if(recipe.items) - max_n_of_items = max(max_n_of_items,recipe.count_n_items()) + GLOB.cooking_reagents[recipe_type] |= reagent else qdel(recipe) - acceptable_items |= /obj/item/reagent_containers/food/snacks/grown + GLOB.cooking_ingredients[recipe_type] |= /obj/item/reagent_containers/food/snacks/grown /******************* * Item Adding @@ -80,26 +82,14 @@ if(broken > 0) if(broken == 2 && istype(O, /obj/item/screwdriver)) // If it's broken and they're using a screwdriver - user.visible_message( \ - "[user] starts to fix part of \the [src].", \ - "You start to fix part of \the [src]." \ - ) + user.visible_message("[user] starts to fix part of [src].", "You start to fix part of [src].") if(do_after(user, 20 * O.toolspeed, target = src)) - user.visible_message( \ - "[user] fixes part of \the [src].", \ - "You have fixed part of \the [src]." \ - ) + user.visible_message("[user] fixes part of [src].", "You have fixed part of \the [src].") broken = 1 // Fix it a bit else if(broken == 1 && istype(O, /obj/item/wrench)) // If it's broken and they're doing the wrench - user.visible_message( \ - "[user] starts to fix part of \the [src].", \ - "You start to fix part of \the [src]." \ - ) + user.visible_message("[user] starts to fix part of [src].", "You start to fix part of [src].") if(do_after(user, 20 * O.toolspeed, target = src)) - user.visible_message( \ - "[user] fixes \the [src].", \ - "You have fixed \the [src]." \ - ) + user.visible_message("[user] fixes [src].", "You have fixed [src].") icon_state = off_icon broken = 0 // Fix it! dirty = 0 // just to be sure @@ -109,15 +99,9 @@ return 1 else if(dirty==100) // The machine is all dirty so can't be used! if(istype(O, /obj/item/reagent_containers/spray/cleaner) || istype(O, /obj/item/soap)) // If they're trying to clean it then let them - user.visible_message( \ - "[user] starts to clean \the [src].", \ - "You start to clean \the [src]." \ - ) + user.visible_message("[user] starts to clean [src].", "You start to clean [src].") if(do_after(user, 20 * O.toolspeed, target = src)) - user.visible_message( \ - "[user] has cleaned \the [src].", \ - "You have cleaned \the [src]." \ - ) + user.visible_message("[user] has cleaned [src].", "You have cleaned [src].") dirty = 0 // It's clean! broken = 0 // just to be sure icon_state = off_icon @@ -125,33 +109,25 @@ else //Otherwise bad luck!! to_chat(user, "It's dirty!") return 1 - else if(is_type_in_list(O,acceptable_items)) + else if(is_type_in_list(O, GLOB.cooking_ingredients[recipe_type]) || istype(O, /obj/item/mixing_bowl)) if(contents.len>=max_n_of_items) to_chat(user, "This [src] is full of ingredients, you cannot put more.") return 1 - if(istype(O,/obj/item/stack) && O:amount>1) - new O.type (src) - O:use(1) - user.visible_message( \ - "[user] has added one of [O] to \the [src].", \ - "You add one of [O] to \the [src].") + if(istype(O,/obj/item/stack)) + var/obj/item/stack/S = O + if(S.amount > 1) + var/obj/item/stack/to_add = S.split(user, 1) + to_add.forceMove(src) + user.visible_message("[user] adds one of [S] to [src].", "You add one of [S] to [src].") + else + add_item(S, user) else - if(!user.drop_item()) - to_chat(user, "\The [O] is stuck to your hand, you cannot put it in \the [src]") - return 0 - - O.forceMove(src) - user.visible_message( \ - "[user] has added \the [O] to \the [src].", \ - "You add \the [O] to \the [src].") - else if(istype(O,/obj/item/reagent_containers/glass) || \ - istype(O,/obj/item/reagent_containers/food/drinks) || \ - istype(O,/obj/item/reagent_containers/food/condiment) \ - ) + add_item(O, user) + else if(is_type_in_list(O, list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment))) if(!O.reagents) return 1 for(var/datum/reagent/R in O.reagents.reagent_list) - if(!(R.id in acceptable_reagents)) + if(!(R.id in GLOB.cooking_reagents[recipe_type])) to_chat(user, "Your [O] contains components unsuitable for cookery.") return 1 //G.reagents.trans_to(src,G.amount_per_transfer_from_this) @@ -162,6 +138,14 @@ return 1 updateUsrDialog() +/obj/machinery/kitchen_machine/proc/add_item(obj/item/I, mob/user) + if(!user.drop_item()) + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in [src]") + //return 0 + else + I.forceMove(src) + user.visible_message("[user] adds [I] to [src].", "You add [I] to [src].") + /obj/machinery/kitchen_machine/attack_ai(mob/user) return 0 @@ -182,11 +166,11 @@ return var/dat = "" if(broken > 0) - dat = {"Bzzzzttttt"} + dat = {"Bzzzzttttt"} else if(operating) - dat = {"[pick(cook_verbs)] in progress!
    Please wait...!
    "} + dat = {"[pick(cook_verbs)] in progress!
    Please wait...!
    "} else if(dirty==100) - dat = {"This [src] is dirty!
    Please clean it before use!
    "} + dat = {"This [src] is dirty!
    Please clean it before use!
    "} else var/list/items_counts = new var/list/items_measures = new @@ -260,12 +244,13 @@ stop() return - var/datum/recipe/recipe = select_recipe(available_recipes,src) - var/obj/cooked - var/obj/byproduct - if(!recipe) + var/list/recipes_to_make = choose_recipes() + + if(recipes_to_make.len == 1 && recipes_to_make[1][2] == RECIPE_FAIL) + //This only runs if there is a single recipe source to be made and it is a failure (the machine was loaded with only 1 mixing bowl that results in failure OR was directly loaded with ingredients that results in failure). + //If there are multiple sources, this bit gets skipped. dirty += 1 - if(prob(max(10,dirty*5))) + if(prob(max(10,dirty*5))) //chance to get so dirty we require cleaning before next use if(!wzhzhzh(4)) abort() return @@ -274,14 +259,14 @@ muck_finish() fail() return - else if(has_extra_item()) + else if(has_extra_item()) //if extra items present, break down and require repair before next use if(!wzhzhzh(4)) abort() return broke() fail() return - else + else //otherwise just stop without requiring cleaning/repair if(!wzhzhzh(10)) abort() return @@ -289,24 +274,69 @@ fail() return else - var/halftime = round(recipe.time/10/2) - if(!wzhzhzh(halftime)) + if(!wzhzhzh(5)) abort() return - if(!wzhzhzh(halftime)) + if(!wzhzhzh(5)) abort() fail() return - cooked = recipe.make_food(src) - byproduct = recipe.get_byproduct() - stop() - if(cooked) - cooked.forceMove(loc) - for(var/i=1,iThe machine's display flashes that it has [grinded] monkey\s worth of material left.
    ") else // I'm not sure if the \s macro works with a word in between; I'll play it safe to_chat(user, "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded].") - return \ No newline at end of file + return diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven.dm b/code/modules/food_and_drinks/kitchen_machinery/oven.dm index cf27804d823..2827720c12e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/oven.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/oven.dm @@ -6,7 +6,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/candy = 0 idle_power_usage = 5 var/on = FALSE //Is it making food already? diff --git a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm index 4904a2a5d5f..67a65148244 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/oven_new.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/cooking_machines.dmi' icon_state = "oven_off" cook_verbs = list("Baking", "Roasting", "Broiling") - recipe_type = /datum/recipe/oven + recipe_type = RECIPE_OVEN off_icon = "oven_off" on_icon = "oven_on" broken_icon = "oven_broke" diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index ad4dcb5e4d8..19c866fae43 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -9,7 +9,7 @@ var/broken = 0 var/processing = 0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 50 var/rating_speed = 1 diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index fd4aa5aa340..3a905a658d0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -7,7 +7,7 @@ layer = 2.9 density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 var/max_n_of_items = 1500 @@ -226,7 +226,6 @@ if(load(O, user)) user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") - SSnanoui.update_uis(src) else if(istype(O, /obj/item/storage/bag)) @@ -242,7 +241,7 @@ SSnanoui.update_uis(src) - else + else if(!istype(O, /obj/item/card/emag)) to_chat(user, "\The [src] smartly refuses [O].") return 1 @@ -308,11 +307,6 @@ to_chat(user, "Some items are refused.") SSnanoui.update_uis(src) -/obj/machinery/smartfridge/secure/emag_act(mob/user) - emagged = 1 - locked = -1 - to_chat(user, "You short out the product lock on [src].") - /******************* * SmartFridge Menu ********************/ @@ -416,7 +410,7 @@ desc = "A wooden contraption, used to dry plant products, food and leather." icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "drying_rack_on" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 200 icon_on = "drying_rack_on" @@ -453,13 +447,13 @@ return 1 if(href_list["dryingOn"]) drying = TRUE - use_power = 2 + use_power = ACTIVE_POWER_USE update_icon() return 1 if(href_list["dryingOff"]) drying = FALSE - use_power = 1 + use_power = IDLE_POWER_USE update_icon() return 1 return 0 @@ -503,10 +497,10 @@ /obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff) if(drying || forceoff) drying = FALSE - use_power = 1 + use_power = IDLE_POWER_USE else drying = TRUE - use_power = 2 + use_power = ACTIVE_POWER_USE update_icon() /obj/machinery/smartfridge/drying_rack/proc/rack_dry() @@ -539,6 +533,16 @@ /************************ * Secure SmartFridges *************************/ +/obj/machinery/smartfridge/secure/emag_act(mob/user) + emagged = 1 + locked = -1 + to_chat(user, "You short out the product lock on [src].") + +/obj/machinery/smartfridge/secure/emp_act(severity) + if(prob(40/severity) && (!emagged) && (locked != -1)) + playsound(loc, 'sound/effects/sparks4.ogg', 60, 1) + emagged = 1 + locked = -1 /obj/machinery/smartfridge/secure/Topic(href, href_list) if(stat & (NOPOWER|BROKEN)) @@ -548,4 +552,4 @@ to_chat(usr, "Access denied.") SSnanoui.update_uis(src) return 0 - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index e14aaa09ba7..459d8d144f5 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -40,7 +40,7 @@ /obj/item/deck/examine(mob/user) ..() - to_chat(user,"It contains [cards.len ? cards.len : "no"] cards") + to_chat(user,"It contains [cards.len ? cards.len : "no"] cards") /obj/item/deck/attack_hand(mob/user as mob) draw_card(user) @@ -221,6 +221,8 @@ return if(over_object == M) + if(!remove_item_from_storage(M)) + M.unEquip(src) M.put_in_hands(src) else if(istype(over_object, /obj/screen)) @@ -250,7 +252,7 @@ /obj/item/pack/attack_self(mob/user as mob) user.visible_message("[name] rips open the [src]!", "You rips open the [src]!") - var/obj/item/cardhand/H = new() + var/obj/item/cardhand/H = new(get_turf(user)) H.cards += cards cards.Cut() @@ -258,7 +260,7 @@ qdel(src) H.update_icon() - user.put_in_active_hand(H) + user.put_in_hands(H) /obj/item/cardhand name = "hand of cards" @@ -315,9 +317,9 @@ /obj/item/cardhand/examine(mob/user) ..(user) if((!concealed) && cards.len) - to_chat(user,"It contains:") + to_chat(user,"It contains:") for(var/datum/playingcard/P in cards) - to_chat(user,"the [P.name].") + to_chat(user,"the [P.name].") // Datum action here @@ -368,16 +370,17 @@ var/datum/playingcard/card = pickablecards[pickedcard] var/obj/item/cardhand/H = new(get_turf(src)) - user.put_in_active_hand(H) + user.put_in_hands(H) H.cards += card cards -= card H.parentdeck = parentdeck H.concealed = concealed H.update_icon() - update_icon() if(!cards.len) qdel(src) + return + update_icon() /obj/item/cardhand/verb/discard(var/mob/user as mob) @@ -410,7 +413,7 @@ if(cards.len) update_icon() if(H.cards.len) - usr.visible_message("The [user] plays the [discarding].", "You play the [discarding].") + usr.visible_message("The [usr] plays the [discarding].", "You play the [discarding].") H.loc = get_step(usr,usr.dir) if(!cards.len) @@ -419,7 +422,6 @@ /obj/item/cardhand/update_icon(var/direction = 0) if(!cards.len) - qdel(src) return else if(cards.len > 1) name = "hand of cards" diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 96553775361..67979b61dd7 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -5,7 +5,7 @@ icon_state = "biogen-empty" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/processing = 0 var/obj/item/reagent_containers/glass/beaker = null diff --git a/code/modules/hydroponics/grown/beans.dm b/code/modules/hydroponics/grown/beans.dm index d75791f5404..24ddf1dbbba 100644 --- a/code/modules/hydroponics/grown/beans.dm +++ b/code/modules/hydroponics/grown/beans.dm @@ -15,7 +15,7 @@ icon_dead = "soybean-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/soya/koi) - reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.05) + reagents_add = list("soybeanoil" = 0.2, "vitamin" = 0.04, "plantmatter" = 0.05) /obj/item/reagent_containers/food/snacks/grown/soybeans seed = /obj/item/seeds/soya diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 903fec0c1a2..b5bea1fc6b3 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -1008,7 +1008,7 @@ icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "soil" density = 0 - use_power = 0 + use_power = NO_POWER_USE wrenchable = 0 /obj/machinery/hydroponics/soil/update_icon_hoses() diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 5b4a35262d7..84db02cb89c 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -315,12 +315,16 @@ /datum/plant_gene/trait/teleport/on_slip(obj/item/reagent_containers/food/snacks/grown/G, mob/living/carbon/C) var/teleport_radius = max(round(G.seed.potency / 10), 1) var/turf/T = get_turf(C) - to_chat(C, "You slip through spacetime!") - do_teleport(C, T, teleport_radius) - if(prob(50)) - do_teleport(G, T, teleport_radius) + if(do_teleport(C, T, teleport_radius)) + to_chat(C, "You slip through spacetime!") + if(prob(50)) + do_teleport(G, T, teleport_radius) + else + new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect... + qdel(G) else - new /obj/effect/decal/cleanable/molten_object(T) //Leave a pile of goo behind for dramatic effect... + to_chat(C, "[src] sparks, and burns up!") + new /obj/effect/decal/cleanable/molten_object(T) qdel(G) diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm index 1f18edfae22..cfc44382d64 100644 --- a/code/modules/karma/karma.dm +++ b/code/modules/karma/karma.dm @@ -1,3 +1,7 @@ +/* KARMA + Everything karma related is here. + Part of karma purchase is handled in client_procs.dm */ + proc/sql_report_karma(var/mob/spender, var/mob/receiver) var/sqlspendername = sanitizeSQL(spender.name) var/sqlspenderkey = spender.ckey @@ -39,49 +43,49 @@ proc/sql_report_karma(var/mob/spender, var/mob/receiver) var/err = query.ErrorMsg() log_game("SQL ERROR during karmatotal logging (adding new key). Error : \[[err]\]\n") else - karma += 1 + karma++ query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karma=[karma] WHERE id=[id]") if(!query.Execute()) var/err = query.ErrorMsg() log_game("SQL ERROR during karmatotal logging (updating existing entry). Error : \[[err]\]\n") - var/list/karma_spenders = list() -// Returns 1 if mob can give karma at all; if not, tells them why +// Returns TRUE if mob can give karma at all; if not, tells them why /mob/proc/can_give_karma() if(!client) - return 0 + to_chat(src, "You can't award karma without being connected.") + return FALSE if(config.disable_karma) to_chat(src, "Karma is disabled.") - return 0 + return FALSE if(!ticker || !player_list.len || (ticker.current_state == GAME_STATE_PREGAME)) to_chat(src, "You can't award karma until the game has started.") - return 0 + return FALSE if(client.karma_spent || (ckey in karma_spenders)) to_chat(src, "You've already spent your karma for the round.") - return 0 - return 1 + return FALSE + return TRUE -// Returns 1 if mob can give karma to M; if not, tells them why +// Returns TRUE if mob can give karma to M; if not, tells them why /mob/proc/can_give_karma_to_mob(mob/M) if(!can_give_karma()) - return 0 + return FALSE if(!istype(M)) to_chat(src, "That's not a mob.") - return 0 + return FALSE if(!M.client) to_chat(src, "That mob has no client connected at the moment.") - return 0 - if(ckey == M.ckey) + return FALSE + if(M.ckey == ckey) to_chat(src, "You can't spend karma on yourself!") - return 0 + return FALSE if(client.address == M.client.address) message_admins("Illegal karma spending attempt detected from [key] to [M.key]. Using the same IP!") log_game("Illegal karma spending attempt detected from [key] to [M.key]. Using the same IP!") to_chat(src, "You can't spend karma on someone connected from the same IP.") - return 0 - return 1 + return FALSE + return TRUE /mob/verb/spend_karma_list() @@ -129,9 +133,9 @@ var/list/karma_spenders = list() if(!can_give_karma_to_mob(M)) return // Check again, just in case things changed while the alert box was up - M.client.karma += 1 + M.client.karma++ to_chat(usr, "Good karma spent on [M.name].") - client.karma_spent = 1 + client.karma_spent = TRUE karma_spenders += ckey var/special_role = "None" @@ -153,14 +157,14 @@ var/list/karma_spenders = list() if(config.disable_karma) to_chat(src, "Karma is disabled.") - return 0 + return - var/currentkarma=verify_karma() - to_chat(usr, {"
    You have [currentkarma] available."}) - return + var/currentkarma = verify_karma() + if(!isnull(currentkarma)) + to_chat(usr, {"
    You have [currentkarma] available."}) /client/proc/verify_karma() - var/currentkarma=0 + var/currentkarma = 0 if(!dbcon.IsConnected()) to_chat(usr, "Unable to connect to karma database. Please try again later.
    ") return @@ -174,24 +178,18 @@ var/list/karma_spenders = list() totalkarma = query.item[1] karmaspent = query.item[2] currentkarma = (text2num(totalkarma) - text2num(karmaspent)) -/* if(totalkarma) - to_chat(usr, {"
    You have [currentkarma] available.
    ) -You've gained [totalkarma] total karma in your time here.
    "} - else - to_chat(usr, "Your total karma is: 0
    ")*/ + return currentkarma /client/verb/karmashop() set name = "karmashop" set desc = "Spend your hard-earned karma here" - set hidden = 1 + set hidden = TRUE if(config.disable_karma) to_chat(src, "Karma is disabled.") - return 0 - + return karmashopmenu() - return /client/proc/karmashopmenu() var/dat = "
    " @@ -267,7 +265,23 @@ You've gained [totalkarma] total karma in your time here.
    "} var/datum/browser/popup = new(usr, "karmashop", "
    Karma Shop
    ", 400, 400) popup.set_content(dat) popup.open(0) - return + +//Checks if can afford, what you're purchasing, then purchases. (used in client_procs.dm) +/client/proc/karma_purchase(var/karma = 0, var/price = 1, var/category, var/name, var/DBname = null) + if(karma < price) + to_chat(usr, "You do not have enough karma!") + return + if(alert("Are you sure you want to unlock [name]?", "Confirmation", "No", "Yes") != "Yes") + return + if(karma < price) //Check one more time. (definitely not repeated code) + to_chat(usr, "You do not have enough karma!") + return + if(!isnull(DBname)) //In case database uses another name for logging. (Machine, Machine People) + name = DBname + if(category == "job") + DB_job_unlock(name,price) + else if(category == "species") + DB_species_unlock(name,price) /client/proc/DB_job_unlock(var/job,var/cost) var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'") @@ -281,9 +295,7 @@ You've gained [totalkarma] total karma in your time here.
    "} if(!dbckey) query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, job) VALUES ('[usr.ckey]','[job]')") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (adding new key). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"adding new key") return else to_chat(usr, "You have unlocked [job].") @@ -297,9 +309,7 @@ You've gained [totalkarma] total karma in your time here.
    "} var/newjoblist = jointext(joblist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET job='[newjoblist]' WHERE ckey='[dbckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (updating existing entry). Error : \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have unlocked [job].") @@ -321,9 +331,7 @@ You've gained [totalkarma] total karma in your time here.
    "} if(!dbckey) query = dbcon.NewQuery("INSERT INTO [format_table_name("whitelist")] (ckey, species) VALUES ('[usr.ckey]','[species]')") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (adding new key). Error : \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"adding new key") return else to_chat(usr, "You have unlocked [species].") @@ -337,9 +345,7 @@ You've gained [totalkarma] total karma in your time here.
    "} var/newspecieslist = jointext(specieslist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET species='[newspecieslist]' WHERE ckey='[dbckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have unlocked [species].") @@ -349,7 +355,7 @@ You've gained [totalkarma] total karma in your time here.
    "} to_chat(usr, "You already have this species unlocked!") return -/client/proc/karmacharge(var/cost,var/refund = 0) +/client/proc/karmacharge(var/cost,var/refund = FALSE) var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("karmatotals")] WHERE byondkey='[usr.ckey]'") query.Execute() @@ -361,9 +367,7 @@ You've gained [totalkarma] total karma in your time here.
    "} spent += cost query = dbcon.NewQuery("UPDATE [format_table_name("karmatotals")] SET karmaspent=[spent] WHERE byondkey='[usr.ckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n") - message_admins("SQL ERROR during karmaspent updating (updating existing entry). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have been [refund ? "refunded" : "charged"] [cost] karma.") @@ -372,23 +376,8 @@ You've gained [totalkarma] total karma in your time here.
    "} /client/proc/karmarefund(var/type,var/name,var/cost) switch(name) - if("Tajaran Ambassador") - cost = 30 - if("Unathi Ambassador") - cost = 30 - if("Skrell Ambassador") - cost = 30 - if("Diona Ambassador") - cost = 30 - if("Kidan Ambassador") - cost = 30 - if("Slime People Ambassador") - cost = 30 - if("Grey Ambassador") - cost = 30 - if("Vox Ambassador") - cost = 30 - if("Customs Officer") + if("Tajaran Ambassador","Unathi Ambassador","Skrell Ambassador","Diona Ambassador","Kidan Ambassador", + "Slime People Ambassador","Grey Ambassador","Vox Ambassador","Customs Officer") cost = 30 if("Nanotrasen Recruiter") cost = 10 @@ -422,9 +411,7 @@ You've gained [totalkarma] total karma in your time here.
    "} var/newtypelist = jointext(typelist,",") query = dbcon.NewQuery("UPDATE [format_table_name("whitelist")] SET [type]='[newtypelist]' WHERE ckey='[dbckey]'") if(!query.Execute()) - var/err = query.ErrorMsg() - log_game("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") - message_admins("SQL ERROR during whitelist logging (updating existing entry). Error: \[[err]\]\n") + queryErrorLog(query.ErrorMsg(),"updating existing entry") return else to_chat(usr, "You have been refunded [cost] karma for [type] [name].") @@ -436,6 +423,10 @@ You've gained [totalkarma] total karma in your time here.
    "} else to_chat(usr, "Your ckey ([dbckey]) was not found.") +/client/proc/queryErrorLog(err = null, errType) + log_game("SQL ERROR during whitelist logging ([errType]]). Error : \[[err]\]\n") + message_admins("SQL ERROR during whitelist logging ([errType]]). Error : \[[err]\]\n") + /client/proc/checkpurchased(var/name = null) // If the first parameter is null, return a full list of purchases var/DBQuery/query = dbcon.NewQuery("SELECT * FROM [format_table_name("whitelist")] WHERE ckey='[usr.ckey]'") query.Execute() @@ -454,10 +445,10 @@ You've gained [totalkarma] total karma in your time here.
    "} var/list/combinedlist = joblist + specieslist if(name) if(name in combinedlist) - return 1 + return TRUE else - return 0 + return FALSE else return combinedlist else - return 0 + return FALSE \ No newline at end of file diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a856e3f822f..dd7f591e3b7 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -77,7 +77,7 @@ health -= O.force * 0.75 else if(health <= 0) - visible_message("The bookcase is smashed apart!") + visible_message("The bookcase is smashed apart!") qdel(src) return ..() diff --git a/code/modules/martial_arts/adminfu.dm b/code/modules/martial_arts/adminfu.dm index a279765c980..eaec2b1c3c8 100644 --- a/code/modules/martial_arts/adminfu.dm +++ b/code/modules/martial_arts/adminfu.dm @@ -37,8 +37,7 @@ add_to_streak("G",D) if(check_streak(A,D)) return 1 - D.grabbedby(A,1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A,1) if(G) G.state = GRAB_NECK diff --git a/code/modules/martial_arts/brawling.dm b/code/modules/martial_arts/brawling.dm index b326e9f8b33..f7c4d307968 100644 --- a/code/modules/martial_arts/brawling.dm +++ b/code/modules/martial_arts/brawling.dm @@ -53,8 +53,7 @@ A.visible_message("[A] tries to grab ahold of [D], but fails!", \ "You fail to grab ahold of [D]!") return 1 - D.grabbedby(A,1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A,1) if(G) D.visible_message("[A] grabs ahold of [D] drunkenly!", \ "[A] grabs ahold of [D] drunkenly!") diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm index a6cd25d50c0..38f1dba77b9 100644 --- a/code/modules/martial_arts/sleeping_carp.dm +++ b/code/modules/martial_arts/sleeping_carp.dm @@ -108,8 +108,7 @@ add_to_streak("G",D) if(check_streak(A,D)) return 1 - D.grabbedby(A,1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A,1) if(G) G.state = GRAB_AGGRESSIVE //Instant aggressive grab diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index bf9c5a67783..852bcd3edf3 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -664,6 +664,9 @@ var/turf/T = get_turf(H) T.add_vomit_floor(H) playsound(H, 'sound/effects/splat.ogg', 50, 1) + else + visible_message("[src] flickers and fails, due to bluespace interference!") + qdel(src) /**********************Resonator**********************/ diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm index 59d3a715f32..1e0f73cd995 100644 --- a/code/modules/mining/lavaland/loot/colossus_loot.dm +++ b/code/modules/mining/lavaland/loot/colossus_loot.dm @@ -12,7 +12,7 @@ unacidable = 1 burn_state = LAVA_PROOF | FIRE_PROOF pixel_y = -4 - use_power = 0 + use_power = NO_POWER_USE var/memory_saved = FALSE var/list/stored_items = list() var/static/list/blacklist = typecacheof(list(/obj/item/spellbook)) @@ -97,7 +97,7 @@ icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "anomaly_crystal" luminosity = 8 - use_power = 0 + use_power = NO_POWER_USE density = 1 burn_state = LAVA_PROOF | FIRE_PROOF unacidable = 1 diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 623f5b6b353..6c4e847fe32 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -24,15 +24,20 @@ return target // All mobs should have custom emote, really.. -/mob/proc/custom_emote(var/m_type=1,var/message = null) +/mob/proc/custom_emote(var/m_type=EMOTE_VISUAL,var/message = null) if(stat || !use_me && usr == src) if(usr) to_chat(usr, "You are unable to emote.") return - var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle) - if(m_type == 2 && muzzled) return + var/muzzled = is_muzzled() + if(muzzled) + var/obj/item/clothing/mask/muzzle/M = wear_mask + if(m_type == EMOTE_SOUND && M.mute >= MUZZLE_MUTE_MUFFLE) + return //Not all muzzles block sound + if(m_type == EMOTE_SOUND && !can_speak()) + return var/input if(!message) @@ -63,7 +68,7 @@ // Type 1 (Visual) emotes are sent to anyone in view of the item - if(m_type & 1) + if(m_type & EMOTE_VISUAL) var/list/can_see = get_mobs_in_view(1,src) //Allows silicon & mmi mobs carried around to see the emotes of the person carrying them around. can_see |= viewers(src,null) for(var/mob/O in can_see) @@ -80,7 +85,7 @@ // Type 2 (Audible) emotes are sent to anyone in hear range // of the *LOCATION* -- this is important for pAIs to be heard - else if(m_type & 2) + else if(m_type & EMOTE_SOUND) for(var/mob/O in get_mobs_in_view(7,src)) if(O.status_flags & PASSEMOTES) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 57be913c699..6c11ee7a3a4 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -1,6 +1,6 @@ // At minimum every mob has a hear_say proc. -/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) +/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(!client) return 0 @@ -70,12 +70,12 @@ if(speaker == src) to_chat(src, "You cannot hear yourself speak!") else - to_chat(src, "[speaker_name][alt_name] talks but you cannot hear [speaker.p_them()].") + to_chat(src, "[speaker_name][speaker.GetAltName()] talks but you cannot hear [speaker.p_them()].") else if(language) - to_chat(src, "[speaker_name][alt_name] [track][language.format_message(message, verb)]") + to_chat(src, "[speaker_name][speaker.GetAltName()] [track][language.format_message(message, verb)]") else - to_chat(src, "[speaker_name][alt_name] [track][verb], \"[message]\"") + to_chat(src, "[speaker_name][speaker.GetAltName()] [track][verb], \"[message]\"") if(speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z)) var/turf/source = speaker? get_turf(speaker) : get_turf(src) src.playsound_local(source, speech_sound, sound_vol, 1) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 4c01ac1a4a5..5ff0ea8e28b 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -83,7 +83,7 @@ //This is probably the main one you need to know :) //Just puts stuff on the floor for most mobs, since all mobs have hands but putting stuff in the AI/corgi/ghost hand is VERY BAD. /mob/proc/put_in_hands(obj/item/W) - W.forceMove(get_turf(src)) + W.forceMove(drop_location()) W.layer = initial(W.layer) W.plane = initial(W.plane) W.dropped() @@ -137,7 +137,7 @@ if(I) if(client) client.screen -= I - I.forceMove(loc) + I.forceMove(drop_location()) I.dropped(src) if(I) I.layer = initial(I.layer) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index ddac1cc18e9..adf81753827 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -66,7 +66,7 @@ #define MAX_ALIEN_LEAP_DIST 7 /mob/living/carbon/alien/humanoid/hunter/proc/leap_at(var/atom/A) - if(pounce_cooldown) + if(pounce_cooldown > world.time) to_chat(src, "You are too fatigued to pounce right now!") return @@ -114,9 +114,7 @@ Weaken(2, 1, 1) toggle_leap(0) - pounce_cooldown = !pounce_cooldown - spawn(pounce_cooldown_time) //3s by default - pounce_cooldown = !pounce_cooldown + pounce_cooldown = world.time + pounce_cooldown_time else if(A.density && !A.CanPass(src)) visible_message("[src] smashes into [A]!", "[src] smashes into [A]!") Weaken(2, 1, 1) diff --git a/code/modules/mob/living/carbon/brain/MMI_radio.dm b/code/modules/mob/living/carbon/brain/MMI_radio.dm index 6eeaa44a42c..7064b4a2a82 100644 --- a/code/modules/mob/living/carbon/brain/MMI_radio.dm +++ b/code/modules/mob/living/carbon/brain/MMI_radio.dm @@ -3,3 +3,4 @@ desc = "Enables radio capability on MMIs when either installed directly on the MMI, or through a cyborg's chassis." icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade1" + origin_tech = "programming=3;biotech=2;engineering=2" diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm index 907a2e4862d..f2a15119156 100644 --- a/code/modules/mob/living/carbon/brain/say.dm +++ b/code/modules/mob/living/carbon/brain/say.dm @@ -29,7 +29,7 @@ to_chat(usr, "You cannot speak, as your internal speaker is turned off.") . = FALSE -/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) +/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios) switch(message_mode) if("headset") var/radio_worked = 0 // If any of the radios our brainmob could use functioned, this is set true so that we don't use any others @@ -45,6 +45,6 @@ radio_worked = c.radio.talk_into(src, message, message_mode, verb, speaking) return radio_worked if("whisper") - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 else return 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 4b00bf832c8..81f386a3364 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -78,6 +78,10 @@ #undef STOMACH_ATTACK_DELAY +/mob/living/carbon/proc/has_mutated_organs() + return FALSE + + /mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1) if(src.is_muzzled()) if(message) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index c1eb8641820..69653dfe1e8 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -10,6 +10,10 @@ act = copytext(act, 1, t1) var/muzzled = is_muzzled() + if(muzzled) + var/obj/item/clothing/mask/muzzle/M = wear_mask + if(M.mute == MUZZLE_MUTE_NONE) + muzzled = 0 //Not all muzzles block sound if(!can_speak()) muzzled = 1 //var/m_type = 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3f36b8b6d55..d718e7e95d3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1328,7 +1328,7 @@ dna.species.create_organs(src) for(var/thing in kept_items) - equip_to_slot_or_del(thing, kept_items[thing]) + equip_to_slot_if_possible(thing, kept_items[thing], redraw_mob = 0) //Handle default hair/head accessories for created mobs. var/obj/item/organ/external/head/H = get_organ("head") @@ -1615,6 +1615,12 @@ Eyes need to have significantly high darksight to shine unless the mob has the X else return FALSE +/mob/living/carbon/human/has_mutated_organs() + for(var/obj/item/organ/external/E in bodyparts) + if(E.status & ORGAN_MUTATED) + return TRUE + return FALSE + /mob/living/carbon/human/InCritical() return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 80c128ee07f..ddfce48f6ce 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -88,21 +88,21 @@ return amount -/mob/living/carbon/human/adjustBruteLoss(amount, damage_source) +/mob/living/carbon/human/adjustBruteLoss(amount, damage_source, robotic=0) if(dna.species) amount = amount * dna.species.brute_mod if(amount > 0) take_overall_damage(amount, 0, used_weapon = damage_source) else - heal_overall_damage(-amount, 0) + heal_overall_damage(-amount, 0, 0, robotic) -/mob/living/carbon/human/adjustFireLoss(amount, damage_source) +/mob/living/carbon/human/adjustFireLoss(amount, damage_source, robotic=0) if(dna.species) amount = amount * dna.species.burn_mod if(amount > 0) take_overall_damage(0, amount, used_weapon = damage_source) else - heal_overall_damage(0, -amount) + heal_overall_damage(0, -amount, 0, robotic) /mob/living/carbon/human/proc/adjustBruteLossByPart(amount, organ_name, obj/damage_source = null) if(dna.species) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 6c2bb844155..b8e209498c2 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -178,7 +178,7 @@ emp_act /mob/living/carbon/human/grabbedby(mob/living/user) if(w_uniform) w_uniform.add_fingerprint(user) - ..() + return ..() //Returns 1 if the attack hit, 0 if it missed. /mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, def_zone) diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm index 8e8c2c80013..06df994df5f 100644 --- a/code/modules/mob/living/carbon/human/interactive/functions.dm +++ b/code/modules/mob/living/carbon/human/interactive/functions.dm @@ -630,7 +630,7 @@ var/obj/item/reagent_containers/food/snacks/newSnack = new chosenType(get_turf(src)) TARGET = newSnack newSnack.reagents.remove_any((newSnack.reagents.total_volume/2)-1) - newSnack.name = "Synthetic [newSnack.name]" + newSnack.name = "synthetic [newSnack.name]" custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as [p_they()] vomit[p_s()] [newSnack] from [p_their()] mouth!") catch(var/exception/e) log_runtime(e, src, "Caught in SNPC cooking module") diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm index 763a5ef15be..d8d469cfd57 100644 --- a/code/modules/mob/living/carbon/human/interactive/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm @@ -581,7 +581,7 @@ saveVoice() ..() -/mob/living/carbon/human/interactive/hear_say(message, verb = "says", datum/language/language = null, alt_name = "", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) +/mob/living/carbon/human/interactive/hear_say(message, verb = "says", datum/language/language = null, italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) if(!istype(speaker, /mob/living/carbon/human/interactive)) knownStrings |= html_decode(message) ..() diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 7d408ce9199..a9f93f3d441 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,10 +1,10 @@ /mob/living/carbon/human/say(var/message, var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) - var/alt_name = "" + ..(message, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here. +/mob/living/carbon/human/GetAltName() if(name != GetVoice()) - alt_name = " (as [get_id_name("Unknown")])" - - ..(message, alt_name = alt_name, sanitize = sanitize, ignore_speech_problems = ignore_speech_problems, ignore_atmospherics = ignore_atmospherics) //ohgod we should really be passing a datum here. + return " (as [get_id_name("Unknown")])" + return ..() /mob/living/carbon/human/proc/forcesay(list/append) if(stat == CONSCIOUS) @@ -160,7 +160,7 @@ returns[3] = speech_problem_flag return returns -/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) +/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios) switch(message_mode) if("intercom") for(var/obj/item/radio/intercom/I in view(1, src)) @@ -203,7 +203,7 @@ R.talk_into(src, message, null, verb, speaking) if("whisper") - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 else if(message_mode) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index c11d84451f9..cb1d9b55319 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -253,8 +253,8 @@ if(H.status_flags & GOTTAGOFAST) . -= 1 - if(H.status_flags & GOTTAGOREALLYFAST) - . -= 2 + if(H.status_flags & GOTTAGOFAST_METH) + . -= 1 return . /datum/species/proc/on_species_gain(mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index fa3e4e321a9..a27f7fee103 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -127,9 +127,26 @@ if((head_organ.dna.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use. hair += i + var/file = file2text("config/custom_sprites.txt") //Pulls up the custom_sprites list + var/lines = splittext(file, "\n") + + for(var/line in lines) // Looks for lines set up as screen:ckey:screen_name + var/list/Entry = splittext(line, ":") // split lines + for(var/i = 1 to Entry.len) + Entry[i] = trim(Entry[i]) // Cleans up lines + if(Entry.len != 3 || Entry[1] != "screen") // Ignore entries that aren't for screens + continue + if(Entry[2] == H.ckey) // They're in the list? Custom sprite time, var and icon change required + hair += Entry[3] // Adds custom screen to list + var/new_style = input(H, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair + var/new_color = input("Please select hair color.", "Monitor Color", head_organ.hair_colour) as null|color + if(H.incapacitated()) - to_chat(src, "You were interrupted while changing your monitor display.") + to_chat(H, "You were interrupted while changing your monitor display.") return + if(new_style) - H.change_hair(new_style) \ No newline at end of file + H.change_hair(new_style, 1) // The 1 is to enable custom sprites + if(new_color) + H.change_hair_color(new_color) diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index b49dd88d8e6..82c875444d2 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -83,7 +83,6 @@ if("Warden","Security Officer","Security Pod Pilot") suit=/obj/item/clothing/suit/space/eva/plasmaman/security helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security - H.equip_or_collect(new /obj/item/gun/energy/gun/advtaser(H), slot_in_backpack) if("Internal Affairs Agent") suit=/obj/item/clothing/suit/space/eva/plasmaman/lawyer helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/lawyer @@ -93,7 +92,6 @@ if("Head of Security") suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos - H.equip_or_collect(new /obj/item/gun/energy/gun(H), slot_in_backpack) if("Captain", "Blueshield") suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain @@ -106,7 +104,6 @@ if("Medical Doctor","Brig Physician","Virologist") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical - H.equip_or_collect(new /obj/item/flashlight/pen(H), slot_in_backpack) if("Paramedic") suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm index 1bc0b8b3b9e..d01f1ccf6fe 100644 --- a/code/modules/mob/living/carbon/human/species/vox.dm +++ b/code/modules/mob/living/carbon/human/species/vox.dm @@ -84,16 +84,21 @@ /datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H) if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime") H.unEquip(H.wear_mask) - H.unEquip(H.l_hand) H.equip_or_collect(new /obj/item/clothing/mask/breath/vox(H), slot_wear_mask) var/tank_pref = H.client && H.client.prefs ? H.client.prefs.speciesprefs : null + var/obj/item/tank/internal_tank if(tank_pref)//Diseasel, here you go - H.equip_or_collect(new /obj/item/tank/nitrogen(H), slot_l_hand) + internal_tank = new /obj/item/tank/nitrogen(H) else - H.equip_or_collect(new /obj/item/tank/emergency_oxygen/vox(H), slot_l_hand) - to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") - H.internal = H.l_hand + internal_tank = new /obj/item/tank/emergency_oxygen/vox(H) + if(!H.equip_to_appropriate_slot(internal_tank)) + if(!H.put_in_any_hand_if_possible(internal_tank)) + H.unEquip(H.l_hand) + H.equip_or_collect(internal_tank, slot_l_hand) + to_chat(H, "Could not find an empty slot for internals! Please report this as a bug") + H.internal = internal_tank + to_chat(H, "You are now running on nitrogen internals from the [internal_tank]. Your species finds oxygen toxic, so you must breathe nitrogen only.") H.update_action_buttons_icon() /datum/species/vox/on_species_gain(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 5b0c7813ef3..4e74688e10f 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -1,10 +1,5 @@ //Lallander was here /mob/living/carbon/human/whisper(message as text) - var/alt_name = "" - - if(name != GetVoice()) - alt_name = "(as [get_id_name("Unknown")])" - message = trim_strip_html_properly(message) //bit of duplicate code, acceptable because the workaround would be annoying //parse the language code and consume it @@ -23,4 +18,4 @@ message = trim_left(message) message = handle_autohiss(message, speaking) - whisper_say(message, speaking, alt_name) \ No newline at end of file + whisper_say(message, speaking) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm index 6d47231792b..04416e945ee 100644 --- a/code/modules/mob/living/carbon/slime/say.dm +++ b/code/modules/mob/living/carbon/slime/say.dm @@ -14,7 +14,7 @@ return 1 return ..() -/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) +/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(speaker in Friends) speech_buffer = list() speech_buffer.Add(speaker) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 55e8536cd10..2f6bb4628c3 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -95,10 +95,10 @@ proc/get_radio_key_from_channel(var/channel) returns[3] = speech_problem_flag return returns -/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios) switch(message_mode) if("whisper") //all mobs can whisper by default - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 return 0 @@ -109,7 +109,7 @@ proc/get_radio_key_from_channel(var/channel) return returns -/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name = "", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) +/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/sanitize = TRUE, var/ignore_speech_problems = FALSE, var/ignore_atmospherics = FALSE) if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") @@ -184,7 +184,7 @@ proc/get_radio_key_from_channel(var/channel) return 0 var/list/used_radios = list() - if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)) + if(handle_message_mode(message_mode, message, verb, speaking, used_radios)) return 1 var/list/handle_v = handle_speech_sound() @@ -268,7 +268,7 @@ proc/get_radio_key_from_channel(var/channel) var/speech_bubble_test = say_test(message) for(var/mob/M in listening) - M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol) + M.hear_say(message, verb, speaking, italics, src, speech_sound, sound_vol) if(M.client) speech_bubble_recipients.Add(M.client) spawn(0) @@ -359,7 +359,7 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/get_whisper_loc() return src -/mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") +/mob/living/proc/whisper_say(var/message, var/datum/language/speaking = null, var/verb="whispers") if(client) if(client.prefs.muted & MUTE_IC) to_chat(src, "You cannot speak in IC (Muted).") @@ -381,6 +381,7 @@ proc/get_radio_key_from_channel(var/channel) var/eavesdropping_range = 2 var/watching_range = 5 var/italics = 1 + var/adverb_added = FALSE var/not_heard //the message displayed to people who could not hear the whispering if(speaking) @@ -389,6 +390,7 @@ proc/get_radio_key_from_channel(var/channel) not_heard = "[verb] something" else var/adverb = pick("quietly", "softly") + adverb_added = TRUE verb = "[speaking.speech_verb] [adverb]" not_heard = "[speaking.speech_verb] something [adverb]" else @@ -404,7 +406,7 @@ proc/get_radio_key_from_channel(var/channel) if(verb == "yells loudly") verb = "slurs emphatically" - else if(speech_problem_flag) + else if(speech_problem_flag && !adverb_added) var/adverb = pick("quietly", "softly") verb = "[verb] [adverb]" @@ -464,14 +466,14 @@ proc/get_radio_key_from_channel(var/channel) var/speech_bubble_test = say_test(message) for(var/mob/M in listening) - M.hear_say(message, verb, speaking, alt_name, italics, src) + M.hear_say(message, verb, speaking, italics, src) if(M.client) speech_bubble_recipients.Add(M.client) if(eavesdropping.len) var/new_message = stars(message) //hopefully passing the message twice through stars() won't hurt... I guess if you already don't understand the language, when they speak it too quietly to hear normally you would be able to catch even less. for(var/mob/M in eavesdropping) - M.hear_say(new_message, verb, speaking, alt_name, italics, src) + M.hear_say(new_message, verb, speaking, italics, src) if(M.client) speech_bubble_recipients.Add(M.client) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c0393d78f92..cf9102858bd 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -69,7 +69,7 @@ var/list/ai_verbs_default = list( var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite - var/malf_cooldown = 0 //Cooldown var for malf modules + var/malf_cooldown = 0 //Cooldown var for malf modules, stores a worldtime + cooldown var/obj/machinery/power/apc/malfhack = null var/explosive = 0 //does the AI explode when it dies? @@ -281,7 +281,7 @@ var/list/ai_verbs_default = list( /obj/machinery/ai_powersupply name="\improper AI power supply" active_power_usage=1000 - use_power = 2 + use_power = ACTIVE_POWER_USE power_channel = EQUIP var/mob/living/silicon/ai/powered_ai = null invisibility = 100 @@ -303,9 +303,9 @@ var/list/ai_verbs_default = list( return if(!powered_ai.anchored) loc = powered_ai.loc - use_power = 0 + use_power = NO_POWER_USE if(powered_ai.anchored) - use_power = 2 + use_power = ACTIVE_POWER_USE /mob/living/silicon/ai/proc/pick_icon() set category = "AI Commands" @@ -1250,7 +1250,7 @@ var/list/ai_verbs_default = list( else to_chat(src, "Target is not on or near any active cameras on the station.") - + /mob/living/silicon/ai/handle_fire() return diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 2728a1af55e..98b97ed0602 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -137,6 +137,6 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) +/mob/camera/aiEye/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) if(relay_speech) ai.relay_speech(speaker, message, verb, language) diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index 41d4c67427d..b0f498014d8 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -7,7 +7,7 @@ var/turf/T = get_turf_or_move(loc) for(var/mob/M in viewers(T)) - M.show_message("[src] emits a dull beep before it loses power and collapses.", 3, "You hear a dull beep followed by the sound of glass crunching.", 2) + M.show_message("[src] emits a dull beep before it loses power and collapses.", 3, "You hear a dull beep followed by the sound of glass crunching.", 2) name = "pAI debris" desc = "The unfortunate remains of some poor personal AI device." icon_state = "[chassis]_dead" diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index d28ce620a0c..d635422073f 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -324,11 +324,11 @@ return if(loc != card) - to_chat(src, "You are already in your mobile form!") + to_chat(src, "You are already in your mobile form!") return if(world.time <= last_special) - to_chat(src, "You must wait before folding your chassis out again!") + to_chat(src, "You must wait before folding your chassis out again!") return last_special = world.time + 200 @@ -336,7 +336,7 @@ //I'm not sure how much of this is necessary, but I would rather avoid issues. force_fold_out() - visible_message("[src] folds outwards, expanding into a mobile form.", "You fold outwards, expanding into a mobile form.") + visible_message("[src] folds outwards, expanding into a mobile form.", "You fold outwards, expanding into a mobile form.") /mob/living/silicon/pai/proc/force_fold_out() if(istype(card.loc, /mob)) @@ -359,11 +359,11 @@ return if(loc == card) - to_chat(src, "You are already in your card form!") + to_chat(src, "You are already in your card form!") return if(world.time <= last_special) - to_chat(src, "You must wait before returning to your card form!") + to_chat(src, "You must wait before returning to your card form!") return close_up() @@ -494,7 +494,7 @@ if(loc == card) return - visible_message("[src] neatly folds inwards, compacting down to a rectangular card.", "You neatly fold inwards, compacting down to a rectangular card.") + visible_message("[src] neatly folds inwards, compacting down to a rectangular card.", "You neatly fold inwards, compacting down to a rectangular card.") stop_pulling() reset_perspective(card) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index f330dddf1a3..2d52af6e89d 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -65,7 +65,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates if("name") t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text if(t) - candidate.name = sanitize(copytext(t,1,MAX_NAME_LEN)) + candidate.name = reject_bad_name(sanitize(copytext(t,1,MAX_NAME_LEN))) if("desc") t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message if(t) @@ -84,7 +84,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates candidate.savefile_load(usr) //In case people have saved unsanitized stuff. if(candidate.name) - candidate.name = sanitize(copytext(candidate.name,1,MAX_NAME_LEN)) + candidate.name = reject_bad_name(sanitize(copytext(candidate.name,1,MAX_NAME_LEN))) if(candidate.description) candidate.description = sanitize(copytext(candidate.description,1,MAX_MESSAGE_LEN)) if(candidate.role) diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index cc5108d89f8..dfdaac8015c 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -163,7 +163,7 @@ icon_state = "radio" // -//Robotic Component Analyser, basically a health analyser for robots +//Robotic Component Analyzer, basically a health analyzer for robots // /obj/item/robotanalyzer name = "cyborg analyzer" diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index adf6e2f7682..88d566ad692 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -281,7 +281,7 @@ grabbed_something = 1 if(grabbed_something) - to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") + to_chat(user, "You deploy your decompiler and clear out the contents of \the [T].") else to_chat(user, "Nothing on \the [T] is useful to you.") return diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 790ecaa399a..9bf388fe5fe 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -4,7 +4,7 @@ density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 active_power_usage = 5000 diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index 053384baba5..779b3a2de14 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -1,7 +1,7 @@ /mob/living/silicon/robot/drone/say(var/message, var/datum/language/speaking = null) if(copytext(message, 1, 2) == "*") return emote(copytext(message, 2)) - + if(!speaking) speaking = parse_language(message) if(!speaking) @@ -10,6 +10,6 @@ if(speaking) return ..() -/mob/living/silicon/robot/drone/whisper_say(var/message, var/datum/language/speaking = null, var/alt_name="", var/verb="whispers") +/mob/living/silicon/robot/drone/whisper_say(var/message, var/datum/language/speaking = null, var/verb="whispers") say(message) //drones do not get to whisper, only speak normally return 1 \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index f284a0b250c..d590892cc01 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -20,6 +20,9 @@ contents -= O if(module) O.loc = module //Return item to module so it appears in its contents, so it can be taken out again. + for(var/X in O.actions) // Remove assocated actions + var/datum/action/A = X + A.Remove(src) if(module_active == O) module_active = null @@ -56,6 +59,7 @@ O.plane = HUD_PLANE O.screen_loc = inv1.screen_loc contents += O + set_actions(O) else if(!module_state_2) O.mouse_opacity = initial(O.mouse_opacity) module_state_2 = O @@ -63,6 +67,7 @@ O.plane = HUD_PLANE O.screen_loc = inv2.screen_loc contents += O + set_actions(O) else if(!module_state_3) O.mouse_opacity = initial(O.mouse_opacity) module_state_3 = O @@ -70,10 +75,16 @@ O.plane = HUD_PLANE O.screen_loc = inv3.screen_loc contents += O + set_actions(O) else to_chat(src, "You need to disable a module first!") update_icons() +/mob/living/silicon/robot/proc/set_actions(obj/item/I) + for(var/X in I.actions) + var/datum/action/A = X + A.Grant(src) + /mob/living/silicon/robot/proc/uneq_active() uneq_module(module_active) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 755b874667a..86968bcf6c3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -51,6 +51,7 @@ var/list/robot_verbs_default = list( var/opened = 0 var/custom_panel = null var/list/custom_panel_names = list("Cricket") + var/list/custom_eye_names = list("Cricket","Standard") var/emagged = 0 var/is_emaggable = TRUE var/eye_protection = 0 @@ -290,7 +291,7 @@ var/list/robot_verbs_default = list( if(N.kickoff) modules = list("Nations") if(mmi != null && mmi.alien) - modules = "Hunter" + modules = list("Hunter") modtype = input("Please, select a module!", "Robot", null, null) as null|anything in modules if(!modtype) return @@ -306,7 +307,7 @@ var/list/robot_verbs_default = list( module.channels = list("Service" = 1) module_sprites["Basic"] = "robot_old" module_sprites["Android"] = "droid" - module_sprites["Default"] = "robot" + module_sprites["Default"] = "Standard" module_sprites["Noble-STD"] = "Noble-STD" if("Service") @@ -317,7 +318,7 @@ var/list/robot_verbs_default = list( module_sprites["Bro"] = "Brobot" module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" - module_sprites["Standard"] = "robotServ" + module_sprites["Standard"] = "Standard-Serv" module_sprites["Noble-SRV"] = "Noble-SRV" module_sprites["Cricket"] = "Cricket-SERV" @@ -329,7 +330,7 @@ var/list/robot_verbs_default = list( module_sprites["Basic"] = "Miner_old" module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" - module_sprites["Standard"] = "robotMine" + module_sprites["Standard"] = "Standard-Mine" module_sprites["Noble-DIG"] = "Noble-DIG" module_sprites["Cricket"] = "Cricket-MINE" @@ -342,7 +343,7 @@ var/list/robot_verbs_default = list( module_sprites["Surgeon"] = "surgeon" module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" - module_sprites["Standard"] = "robotMedi" + module_sprites["Standard"] = "Standard-Medi" module_sprites["Noble-MED"] = "Noble-MED" module_sprites["Cricket"] = "Cricket-MEDI" status_flags &= ~CANPUSH @@ -354,7 +355,7 @@ var/list/robot_verbs_default = list( module_sprites["Red Knight"] = "Security" module_sprites["Black Knight"] = "securityrobot" module_sprites["Bloodhound"] = "bloodhound" - module_sprites["Standard"] = "robotSecy" + module_sprites["Standard"] = "Standard-Secy" module_sprites["Noble-SEC"] = "Noble-SEC" module_sprites["Cricket"] = "Cricket-SEC" status_flags &= ~CANPUSH @@ -367,7 +368,7 @@ var/list/robot_verbs_default = list( module_sprites["Basic"] = "Engineering" module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" - module_sprites["Standard"] = "robotEngi" + module_sprites["Standard"] = "Standard-Engi" module_sprites["Noble-ENG"] = "Noble-ENG" module_sprites["Cricket"] = "Cricket-ENGI" magpulse = 1 @@ -378,7 +379,7 @@ var/list/robot_verbs_default = list( module_sprites["Basic"] = "JanBot2" module_sprites["Mopbot"] = "janitorrobot" module_sprites["Mop Gear Rex"] = "mopgearrex" - module_sprites["Standard"] = "robotJani" + module_sprites["Standard"] = "Standard-Jani" module_sprites["Noble-CLN"] = "Noble-CLN" module_sprites["Cricket"] = "Cricket-JANI" @@ -394,7 +395,6 @@ var/list/robot_verbs_default = list( if("Hunter") module = new /obj/item/robot_module/alien/hunter(src) - icon = "icons/mob/alien.dmi" icon_state = "xenoborg-state-a" modtype = "Xeno-Hu" feedback_inc("xeborg_hunter",1) @@ -871,7 +871,10 @@ var/list/robot_verbs_default = list( overlays.Cut() if(stat != DEAD && !(paralysis || stunned || weakened || low_power_mode)) //Not dead, not stunned. - overlays += "eyes-[icon_state]" + if(custom_panel in custom_eye_names) + overlays += "eyes-[custom_panel]" + else + overlays += "eyes-[icon_state]" else overlays -= "eyes" diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 0a3ed47b933..48297dbb401 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,12 +1,13 @@ -/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios) log_say(message, src) if(..()) return 1 -/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios) if(..()) return 1 if(message_mode) + used_radios += radio if(!is_component_functioning("radio")) to_chat(src, "Your radio isn't functional at this time.") return 0 @@ -14,12 +15,14 @@ message_mode = null return radio.talk_into(src,message,message_mode,verb,speaking) -/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios) if(..()) return 1 if(message_mode == "department") + used_radios += aiRadio return holopad_talk(message, verb, speaking) else if(message_mode) + used_radios += aiRadio if(aiRadio.disabledAi || aiRestorePowerRoutine || stat) to_chat(src, "System Error - Transceiver Disabled.") return 0 @@ -27,15 +30,16 @@ message_mode = null return aiRadio.talk_into(src,message,message_mode,verb,speaking) -/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) +/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios) if(..()) return 1 else if(message_mode == "whisper") - whisper_say(message, speaking, alt_name) + whisper_say(message, speaking) return 1 else if(message_mode) if(message_mode == "general") message_mode = null + used_radios += radio return radio.talk_into(src,message,message_mode,verb,speaking) /mob/living/silicon/say_quote(var/text) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 5e79c315f42..7f5c1916619 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -889,7 +889,7 @@ Pass a positive integer as an argument to override a bot's default speed. // Machinery to simplify topic and access calls /obj/machinery/bot_core - use_power = 0 + use_power = NO_POWER_USE var/mob/living/simple_animal/bot/owner = null /obj/machinery/bot_core/New(loc) @@ -1106,4 +1106,4 @@ Pass a positive integer as an argument to override a bot's default speed. var/image/I = path[path[1]] if(I) I.icon = null - path.Cut(1, 2) \ No newline at end of file + path.Cut(1, 2) diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 90c44f19286..085f9e2bd3d 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -44,7 +44,7 @@ icon_state = "ed209_frame" item_state = "ed209_frame" var/build_step = 0 - var/created_name = "ED-209 Security Robot" //To preserve the name if it's a unique securitron I guess + var/created_name = "\improper ED-209 Security Robot" //To preserve the name if it's a unique securitron I guess var/lasercolor = "" /obj/item/ed209_assembly/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 0efaefcce07..619d0316349 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -694,7 +694,7 @@ /mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H) add_attack_logs(src, H, "Run over (DAMTYPE: [uppertext(BRUTE)])") H.visible_message("[src] drives over [H]!", \ - "[src] drives over you!") + "[src] drives over you!") playsound(loc, 'sound/effects/splat.ogg', 50, 1) var/damage = rand(5,15) @@ -706,10 +706,14 @@ H.apply_damage(0.5*damage, BRUTE, "r_arm", run_armor_check("r_arm", "melee")) - var/turf/T = get_turf(src) - H.add_mob_blood(H) - H.add_splatter_floor(T) + + if(NO_BLOOD in H.dna.species.species_traits)//Does the run over mob have blood? + return//If it doesn't it shouldn't bleed (Though a check should be made eventually for things with liquid in them, like slime people, vox armalis, etc.) + + var/turf/T = get_turf(src)//Where are we? + H.add_mob_blood(H)//Cover the victim in their own blood. + H.add_splatter_floor(T)//Put the blood where we are. bloodiness += 4 var/list/blood_dna = H.get_blood_dna_list() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index ef5de1908a8..451f21ce09a 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -175,7 +175,7 @@ Auto Patrol: []"}, mode = BOT_HUNT /mob/living/simple_animal/bot/secbot/attack_hand(mob/living/carbon/human/H) - if(H.a_intent == INTENT_HARM) + if(H.a_intent == INTENT_HARM || H.a_intent == INTENT_DISARM) retaliate(H) return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 2514af0eebd..bda169fe576 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -78,7 +78,7 @@ to_chat(user, "[src] is wearing too much armor! You can't cause [p_them()] any damage.") visible_message(" [user] hits [src] with [O], however [src] is too armored.") else - to_chat(user, "[src] is wearing too much armor! You can't reach [p_their()] skin.") + to_chat(user, "[src] is wearing too much armor! You can't reach [p_their()] skin.") visible_message("[user] gently taps [src] with [O].") if(health>0 && prob(15)) custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.") diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index a7a62c74c0b..762dea31272 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -146,3 +146,55 @@ response_disarm = "gently pushes aside" response_harm = "splats" gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + + +/mob/living/simple_animal/mouse/blobinfected + maxHealth = 100 + health = 100 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + gold_core_spawnable = CHEM_MOB_SPAWN_INVALID + var/cycles_alive = 0 + var/cycles_limit = 30 + var/has_burst = FALSE + +/mob/living/simple_animal/mouse/blobinfected/Life() + cycles_alive++ + var/timeleft = (cycles_limit - cycles_alive) * 2 + if(ismob(loc)) // if someone ate it, burst immediately + burst(FALSE) + else if(timeleft < 1) // if timer expired, burst. + burst(FALSE) + else if(cycles_alive % 2 == 0) // give the mouse/player a countdown reminder every 2 cycles + to_chat(src, "[timeleft] seconds until you burst, and become a blob...") + return ..() + +/mob/living/simple_animal/mouse/blobinfected/death(gibbed) + burst(gibbed) + return ..(gibbed) + +/mob/living/simple_animal/mouse/blobinfected/proc/burst(gibbed) + if(has_burst) + return FALSE + var/turf/T = get_turf(src) + if(!is_station_level(T.z) || isspaceturf(T)) + to_chat(src, "You feel ready to burst, but this isn't an appropriate place! You must return to the station!") + return FALSE + has_burst = TRUE + var/datum/mind/blobmind = mind + var/client/C = client + if(istype(blobmind) && istype(C)) + blobmind.special_role = SPECIAL_ROLE_BLOB + var/obj/structure/blob/core/core = new(T, 200, C, 3) + core.lateblobtimer() + else + new /obj/structure/blob/core(T) // Ghosts will be prompted to control it. + if(ismob(loc)) // in case some taj/etc ate the mouse. + var/mob/M = loc + M.gib() + if(!gibbed) + gib() + +/mob/living/simple_animal/mouse/blobinfected/get_scooped(mob/living/carbon/grabber) + to_chat(grabber, "You try to pick up [src], but they slip out of your grasp!") + to_chat(src, "[src] tries to pick you up, but you wriggle free of their grasp!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm index 3063c5a8ce1..9e4bae870cd 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/hivelord.dm @@ -65,10 +65,12 @@ addtimer(CALLBACK(src, .proc/inert_check), 2400) /obj/item/organ/internal/hivelord_core/proc/inert_check() - if(!owner && !preserved) - go_inert() - else + if(owner) preserved(implanted = 1) + else if(preserved) + preserved() + else + go_inert() /obj/item/organ/internal/hivelord_core/proc/preserved(implanted = 0) inert = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm index cdbc64eea1e..30546ecb17d 100644 --- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm +++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm @@ -168,11 +168,11 @@ W.ChangeTurf(/turf/simulated/floor/plating) new /obj/item/stack/sheet/metal(src, plasmaPoopPotential) currentlyEating = null //ffs, unstore this - src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing. + src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing. else currentlyEating = null contents += noms - src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing. + src.visible_message("\the [src] eats \the [noms]!","You eat \the [noms]!","You hear gnashing.") //inform everyone what the fucking worm is doing. if(ismob(noms)) var/mob/M = noms //typecast because noms isn't movable M.loc = src //because just setting a mob loc to null breaks the camera and such @@ -331,4 +331,4 @@ /mob/living/simple_animal/hostile/spaceWorm/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y) ..() if(previousWorm) - previousWorm.do_attack_animation(src) \ No newline at end of file + previousWorm.do_attack_animation(src) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 894c039b3f4..875af3da359 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -51,7 +51,10 @@ var/damage = O.force if(O.damtype == STAMINA) damage = 0 - health -= damage + if(force_threshold && damage < force_threshold) + visible_message("[src] is unharmed by [O]!") + return + adjustHealth(damage) visible_message("[src] has been attacked with the [O] by [user]. ") playsound(loc, O.hitsound, 25, 1, -1) else @@ -125,6 +128,9 @@ seen_revived_enemy = TRUE raise_alert("[name] reports intruder [target] has returned from death!") depotarea.list_remove(target, depotarea.dead_list) + if(!atoms_share_level(src, target) && prob(20)) + // This prevents someone from aggroing a depot mob, then hiding in a locker, perfectly safe, while the mob stands there getting killed by their friends. + LoseTarget() /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_action() if(seen_enemy) @@ -134,6 +140,14 @@ if(scan_cycles >= 15 && istype(depotarea)) scan_cycles = 0 if(!atoms_share_level(src, spawn_turf)) + if(istype(loc, /obj/structure/closet)) + var/obj/structure/closet/O = loc + forceMove(get_turf(src)) + visible_message("[src] smashes their way out of [O]!") + qdel(O) + raise_alert("[src] reported being trapped in a locker.") + raised_alert = FALSE + return if(alert_on_spacing) raise_alert("[src] lost in space.") death() @@ -196,19 +210,14 @@ alert_on_timeout = TRUE alert_on_shield_breach = TRUE -/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/death() - if(depotarea) - depotarea.declare_finished() - return ..() - - /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/Initialize() - . = ..() + ..() + return INITIALIZE_HINT_LATELOAD + +/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/armory/LateInitialize() if(istype(depotarea)) var/list/key_candidates = list() for(var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O in living_mob_list) - if(O == src) - continue key_candidates += O if(key_candidates.len) var/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/officer/O = pick(key_candidates) diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 693ca724ac6..b5d0a100ae3 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -171,8 +171,8 @@ var/global/list/ts_spiderling_list = list() visible_message("[src] harmlessly nuzzles [target].") T.CheckFaction() CheckFaction() - else if(istype(target, /obj/structure/spider/cocoon)) - to_chat(src, "Destroying our own cocoons would not help us.") + else if(istype(target, /obj/structure/spider)) // Prevents destroying coccoons (exploit), eggs (horrible misclick), etc + to_chat(src, "Destroying things created by fellow spiders would not help us.") else if(istype(target, /obj/machinery/door/firedoor)) var/obj/machinery/door/firedoor/F = target if(F.density) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index dba62b4744c..ed4c074bff0 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -703,12 +703,12 @@ available_channels = list(":e") ..() -/mob/living/simple_animal/parrot/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) +/mob/living/simple_animal/parrot/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios) if(message_mode && istype(ears)) ears.talk_into(src, message, message_mode, verb, speaking) used_radios += ears -/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null) +/mob/living/simple_animal/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null) if(speaker != src && prob(50)) parrot_hear(html_decode(message)) ..() diff --git a/code/modules/mob/living/update_status.dm b/code/modules/mob/living/update_status.dm index f7498392c02..c7f9bdd0d96 100644 --- a/code/modules/mob/living/update_status.dm +++ b/code/modules/mob/living/update_status.dm @@ -49,7 +49,14 @@ // Whether the mob is capable of talking /mob/living/can_speak() - return !(silent || (disabilities & MUTE) || is_muzzled()) + if(!(silent || (disabilities & MUTE))) + if(is_muzzled()) + var/obj/item/clothing/mask/muzzle/M = wear_mask + if(M.mute >= MUZZLE_MUTE_MUFFLE) + return FALSE + return TRUE + else + return FALSE // Whether the mob is capable of standing or not /mob/living/proc/can_stand() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fc09105e948..77c98392740 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -47,6 +47,9 @@ /mob/proc/generate_name() return name +/mob/proc/GetAltName() + return "" + /mob/proc/Cell() set category = "Admin" @@ -857,7 +860,7 @@ var/list/slot_equipment_priority = list( \ if(machine && in_range(src, usr)) show_inv(machine) - if(!usr.stat && usr.canmove && !usr.restrained() && in_range(src, usr)) + if(!usr.incapacitated() && in_range(src, usr)) if(href_list["item"]) var/slot = text2num(href_list["item"]) var/obj/item/what = get_item_by_slot(slot) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 46b5d1b0606..01bcb2bcc1a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -469,7 +469,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) /proc/notify_ghosts(message, ghost_sound = null, enter_link = null, title = null, atom/source = null, image/alert_overlay = null, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts. for(var/mob/dead/observer/O in player_list) if(O.client) - to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") + to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") if(ghost_sound) O << sound(ghost_sound) if(flashwindow) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a2586dd65a1..97a0dc9ca80 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -68,8 +68,8 @@ var/list/antags = client.prefs.be_special if(antags && antags.len) - if(!skip_antag) output += "

    Global Antag Candidancy" - else output += "

    Global Antag Candidancy" + if(!skip_antag) output += "

    Global Antag Candidacy" + else output += "

    Global Antag Candidacy" output += "
    You are [skip_antag ? "ineligible" : "eligible"] for all antag roles.

    " else output += "

    View the Crew Manifest

    " @@ -316,12 +316,10 @@ job_master.AssignRole(src, rank, 1) var/mob/living/character = create_character() //creates the human and transfers vars and mind - character = job_master.EquipRank(character, rank, 1) //equips the human - EquipCustomItems(character) + character = job_master.AssignRank(character, rank, 1) //equips the human // AIs don't need a spawnpoint, they must spawn at an empty core if(character.mind.assigned_role == "AI") - var/mob/living/silicon/ai/ai_character = character.AIize() // AIize the character, but don't move them yet // IsJobAvailable for AI checks that there is an empty core available in this list @@ -365,6 +363,9 @@ ticker.mode.latespawn(character) + character = job_master.EquipRank(character, rank, 1) //equips the human + EquipCustomItems(character) + if(character.mind.assigned_role == "Cyborg") AnnounceCyborg(character, rank, join_message) callHook("latespawn", list(character)) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 83bb2ae1322..bdf93fbd4eb 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -890,6 +890,21 @@ icon_state = "hesphiastos_alt_rainbow" models_allowed = list("Hesphiastos Industries alt.") +/datum/sprite_accessory/hair/ipc/fluff + fluff = 1 + +/datum/sprite_accessory/hair/ipc/fluff/lumi_face //Lumi Fluff hair + name = "Lumi Face" + icon_state = "lumi_face" + +/datum/sprite_accessory/hair/ipc/fluff/lumi_blush //Lumi Fluff hair + name = "Lumi Blush" + icon_state = "lumi_blush" + +/datum/sprite_accessory/hair/ipc/fluff/lumi_waiting //Lumi Fluff hair + name = "Lumi Waiting" + icon_state = "lumi_waiting" + /* /////////////////////////////////// / =---------------------------= / @@ -1292,6 +1307,11 @@ name = "Rough-Cropped Mane" icon_state = "rough" +/datum/sprite_accessory/hair/vulpkanin/vulp_hair_raine + name = "Raine" + icon_state = "vulp_hair_raine" + gender = FEMALE + /datum/sprite_accessory/hair/vox species_allowed = list("Vox") glasses_over = 1 @@ -1410,6 +1430,42 @@ name = "Wildflowers" icon_state = "diona_wildflower" +//Kidan Hairstyles, sprites by Travelling Merchant + +/datum/sprite_accessory/hair/kidan + species_allowed = list("Kidan") + glasses_over = 1 + do_colouration = 0 + +/datum/sprite_accessory/hair/kidan/hollow_horns + name = "Hollow Horns" + icon_state = "kidan_hollow_horns" + +/datum/sprite_accessory/hair/kidan/wide_horns + name = "Wide Horns" + icon_state = "kidan_wide_horns" + +/datum/sprite_accessory/hair/kidan/curled_horns + name = "Curled Horns" + icon_state = "kidan_curled_horns" + +/datum/sprite_accessory/hair/kidan/hawk_horn + name = "Hawk Horn" + icon_state = "kidan_hawk_horn" + +/datum/sprite_accessory/hair/kidan/kidan_bull_horns + name = "Bull Horns" + icon_state = "kidan_bull_horns" + +/datum/sprite_accessory/hair/kidan/kidan_broken_bull_horns + name = "Broken Bull Horns" + icon_state = "kidan_broken_bull_horns" + +/datum/sprite_accessory/hair/kidan/kidan_tall_horns + name = "Tall Horns" + icon_state = "kidan_tall_horns" + + // Apollo-specific /datum/sprite_accessory/hair/wryn @@ -2517,6 +2573,17 @@ name = "Moth Antennae" icon_state = "kidan_moth" +/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Long + name = "Mantie Long" + icon_state = "kidan_Mantie_Long" + +/datum/sprite_accessory/head_accessory/kidan/kidan_Mantie_Curled + name = "Mantie Curled" + icon_state = "kidan_Mantie_Curled" + +/datum/sprite_accessory/head_accessory/kidan/kidan_very_short + name = "Very Short" + icon_state = "kidan_very_short" /* BODY MARKINGS */ diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 1cb1bc5f3b0..4cbbe9c51c9 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -210,5 +210,5 @@ return /mob/proc/adjust_bodytemperature(amount, min_temp = 0, max_temp = INFINITY) - if(bodytemperature > min_temp && bodytemperature < max_temp) + if(bodytemperature >= min_temp && bodytemperature <= max_temp) bodytemperature = Clamp(bodytemperature + amount, min_temp, max_temp) \ No newline at end of file diff --git a/code/modules/modular_computers/NTNet/NTNet_relay.dm b/code/modules/modular_computers/NTNet/NTNet_relay.dm index 2ae0c251f20..436070470ea 100644 --- a/code/modules/modular_computers/NTNet/NTNet_relay.dm +++ b/code/modules/modular_computers/NTNet/NTNet_relay.dm @@ -2,7 +2,7 @@ /obj/machinery/ntnet_relay name = "NTNet Quantum Relay" desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile." - use_power = 2 + use_power = ACTIVE_POWER_USE active_power_usage = 10000 //10kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational. Used to be 20 but that actually drained the smes one round idle_power_usage = 100 icon = 'icons/obj/stationobjs.dmi' @@ -38,9 +38,9 @@ /obj/machinery/ntnet_relay/process() if(operable()) - use_power = 2 + use_power = ACTIVE_POWER_USE else - use_power = 1 + use_power = IDLE_POWER_USE update_icon() diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 832f5558cd8..36c4409fb34 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -7,7 +7,7 @@ var/list/global_modular_computers = list() name = "modular computer" desc = "An advanced computer." - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 var/hardware_flag = 0 // A flag that describes this device type var/last_power_usage = 0 // Power usage during last tick diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index 3be4a091301..60f711ad960 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -24,7 +24,7 @@ if(!check_functionality()) return FALSE - var/obj/item/paper/P = new/obj/item/paper(get_turf(holder)) + var/obj/item/paper/P = new/obj/item/paper(holder.drop_location()) // Damaged printer causes the resulting paper to be somewhat harder to read. if(damage > damage_malfunction) diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index 7ba6ba5751a..4fe833e08ae 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -282,21 +282,9 @@ obj/machinery/lapvend/attackby(obj/item/I, mob/user) atom_say("Insufficient funds in account.") return 0 else - var/paid = customer_account.charge(total_price, - transaction_purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].", - terminal_name = name, - terminal_id = name, - dest_name = vendor_account.owner_name) + customer_account.charge(total_price, vendor_account, + "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].", + name, customer_account.owner_name, "Sale of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"].", + customer_account.owner_name) - if(paid) - vendor_account.money += total_price - var/datum/transaction/T = new() - T.target_name = customer_account.owner_name - T.purpose = "Purchase of [(devtype == 1) ? "laptop computer" : "tablet microcomputer"]" - T.amount = "[total_price]" - T.source_terminal = name - T.date = current_date_string - T.time = station_time_timestamp() - vendor_account.transaction_log.Add(T) - return 1 - return 0 + return 1 diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm index ed102005ed5..19e6dfef3f7 100644 --- a/code/modules/nano/modules/crew_monitor.dm +++ b/code/modules/nano/modules/crew_monitor.dm @@ -6,7 +6,7 @@ return 1 var/turf/T = get_turf(nano_host()) if(!T || !is_level_reachable(T.z)) - to_chat(usr, "Unable to establish a connection: You're too far away from the station!") + to_chat(usr, "Unable to establish a connection: You're too far away from the station!") return 0 if(href_list["track"]) if(isAI(usr)) diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm index c97a3e505c3..a7edb67407f 100644 --- a/code/modules/ninja/martial_art.dm +++ b/code/modules/ninja/martial_art.dm @@ -87,8 +87,7 @@ "[A]\ puts you in a [hold_name]! You are unable to speak!") step_to(D,get_step(D,D.dir),1) - D.grabbedby(A, 1) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A, 1) if(G) G.state = GRAB_NECK @@ -136,8 +135,7 @@ return A.pointed(D) /datum/martial_art/ninja_martial_art/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D) //Instant aggressive grab - D.grabbedby(A) - var/obj/item/grab/G = A.get_active_hand() + var/obj/item/grab/G = D.grabbedby(A) if(G) G.state = GRAB_AGGRESSIVE diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 201455f7a9e..2b699c36530 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -13,7 +13,7 @@ var/list/alldepartments = list() var/long_range_enabled = 0 // Can we send messages off the station? req_one_access = list(access_lawyer, access_heads, access_armory) - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 active_power_usage = 200 @@ -207,7 +207,7 @@ var/list/alldepartments = list() set name = "Eject ID Card" set src in oview(1) - if(usr.restrained()) + if(usr.incapacitated()) return if(scan) diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm index c0455b872b2..4203b5abfff 100644 --- a/code/modules/paperwork/frames.dm +++ b/code/modules/paperwork/frames.dm @@ -35,8 +35,6 @@ icon_state = "[icon_base]-photo" else if(istype(displayed, /obj/structure/sign/poster)) icon_state = "[icon_base]-[(displayed.icon_state in wide_posters) ? "wposter" : "poster"]" - else if(istype(displayed, /obj/item/canvas)) - icon_state = "[icon_base]-canvas-[displayed.icon_state]" else icon_state = "[icon_base]-paper" @@ -61,7 +59,7 @@ if(istype(I, /obj/item/screwdriver)) if(displayed) playsound(src, I.usesound, 100, 1) - user.visible_message("[user] unfastens \the [displayed] out of \the [src].", "You unfasten \the [displayed] out of \the [src].") + user.visible_message("[user] unfastens \the [displayed] out of \the [src].", "You unfasten \the [displayed] out of \the [src].") if(istype(displayed, /obj/structure/sign/poster)) var/obj/structure/sign/poster/P = displayed @@ -72,10 +70,10 @@ name = initial(name) update_icon() else - to_chat(user, "There is nothing to remove from \the [src].") + to_chat(user, "There is nothing to remove from \the [src].") else if(istype(I, /obj/item/crowbar)) playsound(src, I.usesound, 100, 1) - user.visible_message("[user] breaks down \the [src].", "You break down \the [src].") + user.visible_message("[user] breaks down \the [src].", "You break down \the [src].") for(var/A in contents) if(istype(A, /obj/structure/sign/poster)) var/obj/structure/sign/poster/P = A @@ -91,7 +89,7 @@ insert(I) update_icon() else - to_chat(user, "\The [src] already contains \a [displayed].") + to_chat(user, "\The [src] already contains \a [displayed].") else return ..() @@ -214,10 +212,10 @@ /obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/screwdriver)) playsound(src, I.usesound, 100, 1) - user.visible_message("[user] begins to unfasten \the [src] from the wall.", "You begin to unfasten \the [src] from the wall.") + user.visible_message("[user] begins to unfasten \the [src] from the wall.", "You begin to unfasten \the [src] from the wall.") if(do_after(user, 100 * I.toolspeed, target = src)) playsound(src, I.usesound, 100, 1) - user.visible_message("[user] unfastens \the [src] from the wall.", "You unfasten \the [src] from the wall.") + user.visible_message("[user] unfastens \the [src] from the wall.", "You unfasten \the [src] from the wall.") frame.forceMove(user.loc) frame = null if(explosive) @@ -231,7 +229,7 @@ if(!tilted) to_chat(user, "\The [src] needs to be already tilted before being rigged with \the [I].") return 1 - user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].") + user.visible_message("[user] is fiddling around behind \the [src].", "You begin to secure \the [I] behind \the [src].") if(do_after(user, 150, target = src)) if(explosive || !tilted) return diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 831b496bab7..586138f1845 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -32,6 +32,8 @@ return if(over_object == M) + if(!remove_item_from_storage(M)) + M.unEquip(src) M.put_in_hands(src) else if(istype(over_object, /obj/screen)) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index ed5b7c1cfd4..a8a0c8ddd19 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -7,7 +7,7 @@ var/insert_anim = "bigscanner1" anchored = 1 density = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 30 active_power_usage = 200 power_channel = EQUIP @@ -207,7 +207,7 @@ var/image/img //and puts a matching for(var/j = 1, j <= temp_overlays.len, j++) //gray overlay onto the copy if(copy.ico.len) - if(findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent")) + if(findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent") || findtext(copy.ico[j], "rep")) img = image('icons/obj/bureaucracy.dmi', "paper_stamp-circle") else if(findtext(copy.ico[j], "deny")) img = image('icons/obj/bureaucracy.dmi', "paper_stamp-x") diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 5a101629c94..3aa21c5a5d0 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -72,8 +72,13 @@ icon_state = "stamp-clown" item_color = "clown" -/obj/item/stamp/centcom +/obj/item/stamp/rep name = "Nanotrasen Representative's rubber stamp" + icon_state = "stamp-rep" + item_color = "rep" + +/obj/item/stamp/centcom + name = "Central Command rubber stamp" icon_state = "stamp-cent" item_color = "centcom" diff --git a/code/modules/pda/utilities.dm b/code/modules/pda/utilities.dm index 55403b372cc..e144841a144 100644 --- a/code/modules/pda/utilities.dm +++ b/code/modules/pda/utilities.dm @@ -41,24 +41,24 @@ icon = "heart-o" /datum/data/pda/utility/scanmode/medical/scan_mob(mob/living/C as mob, mob/living/user as mob) - C.visible_message("[user] has analyzed [C]'s vitals!") + C.visible_message("[user] has analyzed [C]'s vitals!") - user.show_message("Analyzing Results for [C]:") - user.show_message("\t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]", 1) - user.show_message("\t Damage Specifics: [C.getOxyLoss() > 50 ? "" : ""][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "" : ""][C.getToxLoss()]-[C.getFireLoss() > 50 ? "" : ""][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "" : ""][C.getBruteLoss()]", 1) - user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) + user.show_message("Analyzing Results for [C]:") + user.show_message("\t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]", 1) + user.show_message("\t Damage Specifics: [C.getOxyLoss() > 50 ? "" : ""][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "" : ""][C.getToxLoss()]-[C.getFireLoss() > 50 ? "" : ""][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "" : ""][C.getBruteLoss()]", 1) + user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("\t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) if(C.timeofdeath && (C.stat == DEAD || (C.status_flags & FAKEDEATH))) - user.show_message("\t Time of Death: [station_time_timestamp("hh:mm:ss", C.timeofdeath)]") + user.show_message("\t Time of Death: [station_time_timestamp("hh:mm:ss", C.timeofdeath)]") if(istype(C, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("Localized Damage, Brute/Burn:",1) + user.show_message("Localized Damage, Brute/Burn:",1) if(length(damaged)>0) for(var/obj/item/organ/external/org in damaged) - user.show_message("\t [capitalize(org.name)]: [org.brute_dam > 0 ? "[org.brute_dam]" : "0"]-[org.burn_dam > 0 ? "[org.burn_dam]" : "0"]", 1) + user.show_message("\t [capitalize(org.name)]: [org.brute_dam > 0 ? "[org.brute_dam]" : "0"]-[org.burn_dam > 0 ? "[org.burn_dam]" : "0"]", 1) else - user.show_message("\t Limbs are OK.",1) + user.show_message("\t Limbs are OK.",1) /datum/data/pda/utility/scanmode/dna base_name = "DNA Scanner" @@ -68,9 +68,9 @@ if(istype(C, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C if(!istype(H.dna, /datum/dna)) - to_chat(user, "No fingerprints found on [H]") + to_chat(user, "No fingerprints found on [H]") else - to_chat(user, "[H]'s Fingerprints: [md5(H.dna.uni_identity)]") + to_chat(user, "[H]'s Fingerprints: [md5(H.dna.uni_identity)]") scan_blood(C, user) /datum/data/pda/utility/scanmode/dna/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob) @@ -78,27 +78,27 @@ /datum/data/pda/utility/scanmode/dna/proc/scan_blood(atom/A, mob/user) if(!A.blood_DNA) - to_chat(user, "No blood found on [A]") + to_chat(user, "No blood found on [A]") if(A.blood_DNA) qdel(A.blood_DNA) else - to_chat(user, "Blood found on [A]. Analysing...") + to_chat(user, "Blood found on [A]. Analysing...") spawn(15) for(var/blood in A.blood_DNA) - to_chat(user, "Blood type: [A.blood_DNA[blood]]\nDNA: [blood]") + to_chat(user, "Blood type: [A.blood_DNA[blood]]\nDNA: [blood]") /datum/data/pda/utility/scanmode/halogen base_name = "Halogen Counter" icon = "exclamation-circle" /datum/data/pda/utility/scanmode/halogen/scan_mob(mob/living/C as mob, mob/living/user as mob) - C.visible_message("[user] has analyzed [C]'s radiation levels!") + C.visible_message("[user] has analyzed [C]'s radiation levels!") - user.show_message("Analyzing Results for [C]:") + user.show_message("Analyzing Results for [C]:") if(C.radiation) - user.show_message("Radiation Level: [C.radiation > 0 ? "[C.radiation]" : "0"]") + user.show_message("Radiation Level: [C.radiation > 0 ? "[C.radiation]" : "0"]") else - user.show_message("No radiation detected.") + user.show_message("No radiation detected.") /datum/data/pda/utility/scanmode/reagent base_name = "Reagent Scanner" @@ -194,7 +194,7 @@ // notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents" // feature to the PDA, which would better convey the availability of the feature, but this will work for now. // Inform the user - to_chat(user, "Paper scanned and OCRed to notekeeper.")//concept of scanning paper copyright brainoblivion 2009 + to_chat(user, "Paper scanned and OCRed to notekeeper.")//concept of scanning paper copyright brainoblivion 2009 else - to_chat(user, "Error scanning [A].") + to_chat(user, "Error scanning [A].") diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 3ba1a4b5210..a0df2084b2f 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -47,7 +47,7 @@ desc = "A control terminal for the area electrical systems." icon_state = "apc0" anchored = 1 - use_power = 0 + use_power = NO_POWER_USE req_access = list(access_engine_equip) var/spooky=0 var/area/area diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index ae64d5d4d6e..ed1458c1cae 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -1,3 +1,5 @@ +#define HEALPERCABLE 3 +#define MAXCABLEPERHEAL 8 /////////////////////////////// //CABLE STRUCTURE /////////////////////////////// @@ -149,7 +151,7 @@ By design, d1 is the smallest direction and d2 is the highest if(c.d1 == 12 || c.d2 == 12) c.qdel()*/ ///// Z-Level Stuff - investigate_log("was cut by [key_name(usr, usr.client)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires") + investigate_log("was cut by [key_name(usr, 1)] in [get_area(user)]([T.x], [T.y], [T.z] - [ADMIN_JMP(T)])","wires") qdel(src) // qdel return @@ -531,23 +533,44 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( if(!S.is_robotic() || user.a_intent != INTENT_HELP || S.open == 2) return ..() - if(S.burn_dam) - if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP) - if(H == user) - if(!do_mob(user, H, 10)) - return 1 - var/cable_to_use = 0 - for(cable_to_use in 1 to 5) - if(cable_to_use == amount || (cable_to_use * 3) >= S.burn_dam) - break - use(cable_to_use) - S.heal_damage(0, (cable_to_use * 3), 0, 1) - user.visible_message("\The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].") - else if(S.open != 2) - to_chat(user, "The damage is far too severe to patch over externally.") - return 1 - else if(S.open != 2) + if(S.burn_dam > ROBOLIMB_SELF_REPAIR_CAP) + to_chat(user, "The damage is far too severe to patch over externally.") + return + + if(!S.burn_dam) to_chat(user, "Nothing to fix!") + return + + if(H == user) + if(!do_mob(user, H, 10)) + return 0 + var/cable_used = 0 + var/childlist + if(!isnull(S.children)) + childlist = S.children.Copy() + var/parenthealed = FALSE + while(cable_used <= MAXCABLEPERHEAL && amount >= 1) + var/obj/item/organ/external/E + if(S.burn_dam) + E = S + else if(LAZYLEN(childlist)) + E = pick_n_take(childlist) + if(!E.burn_dam || !E.is_robotic()) + continue + else if(S.parent && !parenthealed) + E = S.parent + parenthealed = TRUE + if(!E.burn_dam || !E.is_robotic()) + break + else + break + while(cable_used <= MAXCABLEPERHEAL && E.burn_dam && amount >= 1) + use(1) + cable_used += 1 + E.heal_damage(0, HEALPERCABLE, 0, 1) + user.visible_message("\The [user] repairs some burn damage on \the [M]'s [E.name] with \the [src].") + return 1 + else return ..() @@ -820,3 +843,6 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list( var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white") color = cablecolor update_icon() + +#undef MAXCABLEPERHEAL +#undef HEALPERCABLE diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 8c9ee3eda0d..7bbb5ac20f9 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -4,7 +4,7 @@ icon_state = "teg" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/obj/machinery/atmospherics/binary/circulator/cold_circ var/obj/machinery/atmospherics/binary/circulator/hot_circ @@ -244,4 +244,4 @@ /obj/machinery/power/generator/power_change() ..() - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 42f7cbde657..8f9d9fb14cd 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -24,7 +24,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 icon = 'icons/obj/machines/gravity_generator.dmi' anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE unacidable = 1 var/sprite_number = 0 @@ -101,7 +101,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 active_power_usage = 3000 power_channel = ENVIRON sprite_number = 8 - use_power = 1 + use_power = IDLE_POWER_USE interact_offline = 1 var/on = 1 var/breaker = 1 @@ -287,7 +287,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 /obj/machinery/gravity_generator/main/proc/set_state(var/new_state) charging_state = POWER_IDLE on = new_state - use_power = on ? 2 : 1 + use_power = on ? ACTIVE_POWER_USE : IDLE_POWER_USE // Sound the alert if gravity was just enabled or disabled. var/alert = 0 var/area/area = get_area(src) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index df12267015f..f83b00ec0d3 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -133,7 +133,7 @@ desc = "A lighting fixture." anchored = 1 layer = 5 // They were appearing under mobs which is a little weird - Ostaf - use_power = 2 + use_power = ACTIVE_POWER_USE idle_power_usage = 2 active_power_usage = 20 power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list @@ -258,10 +258,10 @@ on = 0 set_light(0) else - use_power = 2 + use_power = ACTIVE_POWER_USE set_light(BR, PO, CO) else - use_power = 1 + use_power = IDLE_POWER_USE set_light(0) active_power_usage = (brightness_range * 10) @@ -484,7 +484,7 @@ // create a light tube/bulb item and put it in the user's hand - var/obj/item/light/L = new light_type() + var/obj/item/light/L = new light_type(get_turf(user)) L.status = status L.rigged = rigged L.brightness_range = brightness_range @@ -499,7 +499,7 @@ L.update() L.add_fingerprint(user) - user.put_in_active_hand(L) //puts it in our active hand + user.put_in_hands(L) //puts it in our active hand status = LIGHT_EMPTY update() @@ -576,7 +576,7 @@ /obj/machinery/light/blob_act() if(prob(75)) - broken() + qdel(src) // timed process diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 2892d0245b2..bf2563fe310 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -6,7 +6,7 @@ icon_state = "portgen0_0" density = 1 anchored = 0 - use_power = 0 + use_power = NO_POWER_USE var/active = 0 var/power_gen = 5000 diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 15b47a47635..0e255a804fe 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -12,7 +12,7 @@ anchored = 1.0 on_blueprints = TRUE var/datum/powernet/powernet = null - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 @@ -297,7 +297,7 @@ //source is an object caused electrocuting (airlock, grille, etc) //No animations will be performed by this proc. /proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0) - if(!istype(M)) + if(!istype(M)) return 0 if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb @@ -305,7 +305,7 @@ var/mob/living/carbon/human/H = M if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves - if(G.siemens_coefficient == 0) + if(G.siemens_coefficient == 0) return 0 //to avoid spamming with insulated glvoes on var/area/source_area diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index d54deb2f6f1..a85d9e880bd 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -8,7 +8,7 @@ var/global/list/rad_collectors = list() anchored = 0 density = 1 req_access = list(access_engine_equip) -// use_power = 0 +// use_power = NO_POWER_USE var/obj/item/tank/plasma/P = null var/last_power = 0 var/active = 0 @@ -148,4 +148,3 @@ var/global/list/rad_collectors = list() flick("ca_deactive", src) update_icons() return - diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 3a5a059d670..0e9bdd8ddf3 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -6,7 +6,7 @@ anchored = 1 density = 0 unacidable = 1 - use_power = 0 + use_power = NO_POWER_USE light_range = 4 layer = OBJ_LAYER + 0.1 var/obj/machinery/field/generator/FG1 = null diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index a6c86d3f2ef..0bcde54af4b 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -7,7 +7,7 @@ density = 1 req_access = list(access_engine_equip) - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 10 active_power_usage = 300 @@ -167,7 +167,7 @@ /* if((severity == 1)&&prob(1)&&prob(1)) if(src.active) src.active = 0 - src.use_power = 1 */ + src.use_power = IDLE_POWER_USE */ return 1 diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 11651ff13fe..0f281c634e3 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -26,7 +26,7 @@ field_generator power level display icon_state = "Field_Gen" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE armor = list(melee = 25, bullet = 10, laser = 100, energy = 100, bomb = 0, bio = 0, rad = 0) var/const/num_power_levels = 6 // Total number of power level icon has var/power_level = 0 diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 02a015ba6d5..69153cb4d89 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -6,7 +6,7 @@ icon_state = "TheSingGen" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/energy = 0 var/creation_type = /obj/singularity diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index dfbedc07ad2..c6c6de434c2 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -281,7 +281,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin icon_state = "none" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 var/construction_state = 0 @@ -408,10 +408,10 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin if(construction_state < 3)//Was taken apart, update state update_state() if(use_power) - use_power = 0 + use_power = NO_POWER_USE construction_state = temp_state if(construction_state >= 3) - use_power = 1 + use_power = IDLE_POWER_USE update_icon() return 1 return 0 diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 42fbb784f49..bf20ef45140 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -6,7 +6,7 @@ reference = "control_box" anchored = 0 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 500 active_power_usage = 10000 construction_state = 0 @@ -42,7 +42,7 @@ /obj/machinery/particle_accelerator/control_box/update_state() if(construction_state < 3) - use_power = 0 + use_power = NO_POWER_USE assembled = 0 active = 0 for(var/obj/structure/particle_accelerator/part in connected_parts) @@ -52,7 +52,7 @@ connected_parts = list() return if(!part_scan()) - use_power = 1 + use_power = IDLE_POWER_USE active = 0 connected_parts = list() @@ -147,9 +147,9 @@ ..() if(stat & NOPOWER) active = 0 - use_power = 0 + use_power = NO_POWER_USE else if(!stat && construction_state <= 3) - use_power = 1 + use_power = IDLE_POWER_USE update_icon() if((stat & NOPOWER) || (!stat && construction_state <= 3)) //Only update the part icons if something's changed (i.e. any of the above condition sets are met). @@ -231,13 +231,13 @@ log_game("PA Control Computer turned ON by [key_name(usr)] in ([x],[y],[z])") use_log += text("\[[time_stamp()]\] [key_name(usr)] has turned on the PA Control Computer.") if(active) - use_power = 2 + use_power = ACTIVE_POWER_USE for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = strength part.powered = 1 part.update_icon() else - use_power = 1 + use_power = IDLE_POWER_USE for(var/obj/structure/particle_accelerator/part in connected_parts) part.strength = null part.powered = 0 @@ -276,4 +276,4 @@ popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() - return \ No newline at end of file + return diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index a2025376e9d..7342c1f26c1 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -8,7 +8,7 @@ icon_state = "sp_base" anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 0 active_power_usage = 0 var/id = 0 @@ -279,7 +279,7 @@ icon_state = "computer" anchored = 1 density = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 250 var/icon_screen = "solar" var/icon_keyboard = "power_key" diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 20f4031a8ce..e4e3275ef26 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -10,7 +10,7 @@ icon_state = "tracker" anchored = 1 density = 1 - use_power = 0 + use_power = NO_POWER_USE var/id = 0 var/sun_angle = 0 // sun angle as set by sun datum @@ -82,4 +82,4 @@ icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" w_class = WEIGHT_CLASS_SMALL - origin_tech = "engineering=2;programming=1" \ No newline at end of file + origin_tech = "engineering=2;programming=1" diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 762d442a2a9..4f7e7e9c895 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -8,7 +8,7 @@ desc = "A power-generating treadmill." layer = 2.2 anchored = 1 - use_power = 0 + use_power = NO_POWER_USE var/speed = 0 var/friction = 0.15 // lose this much speed every ptick diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm index 08a2104383d..9d16a9c2123 100644 --- a/code/modules/projectiles/firing.dm +++ b/code/modules/projectiles/firing.dm @@ -40,6 +40,12 @@ if(!istype(targloc) || !istype(curloc) || !BB) return 0 BB.ammo_casing = src + + if(target && get_dist(user, target) <= 1) //Point blank shot must always hit + target.bullet_act(BB, BB.def_zone) + QDEL_NULL(BB) + return 1 + if(targloc == curloc) if(target) //if the target is right on our location we go straight to bullet_act() target.bullet_act(BB, BB.def_zone) diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm index c279abdc5c1..5c78613fbdf 100644 --- a/code/modules/projectiles/guns/dartgun.dm +++ b/code/modules/projectiles/guns/dartgun.dm @@ -58,11 +58,11 @@ /obj/item/gun/dartgun/examine(mob/user) if(..(user, 2)) if(beakers.len) - to_chat(user, "[src] contains:") for(var/obj/item/reagent_containers/glass/beaker/B in beakers) if(B.reagents && B.reagents.reagent_list.len) for(var/datum/reagent/R in B.reagents.reagent_list) - to_chat(user, "[R.volume] units of [R.name]") /obj/item/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/dart_cartridge)) @@ -99,7 +99,7 @@ return B.forceMove(src) beakers += B - to_chat(user, "You slot [B] into [src].") src.updateUsrDialog() /obj/item/gun/dartgun/can_shoot() diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index a154691d0a8..85ec203e063 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -124,7 +124,7 @@ if(!suppressed) playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) else if(isliving(loc)) - to_chat(loc, "[src] silently charges up.") + to_chat(loc, "[src] silently charges up.") update_icon() overheat = FALSE @@ -172,7 +172,6 @@ damage_type = BRUTE flag = "bomb" range = 3 - log_override = TRUE var/pressure_decrease = 0.25 var/turf_aoe = FALSE @@ -218,7 +217,9 @@ for(var/mob/living/L in range(1, target_turf) - firer - target) var/armor = L.run_armor_check(def_zone, flag, "", "", armour_penetration) L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor) - to_chat(L, "You're struck by a [name]!") + L.visible_message("[L] is hit by \a [src]!", + "You are hit by \a [src]!") + add_attack_logs(firer, L, "Shot with a [type]") //Modkits diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 94f397b45bf..f6d84635c08 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -27,7 +27,7 @@ if(no_den_usage) var/area/A = get_area(user) if(istype(A, /area/wizard_station)) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") + to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") return else no_den_usage = 0 @@ -72,7 +72,7 @@ return /obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj) - to_chat(user, "The [name] whizzles quietly.") + to_chat(user, "The [name] whizzles quietly.") return /obj/item/gun/magic/suicide_act(mob/user) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index cae9d11cbb6..e00c6e16724 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -38,7 +38,7 @@ if(no_den_usage) var/area/A = get_area(user) if(istype(A, /area/wizard_station)) - to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") + to_chat(user, "You know better than to violate the security of The Den, best wait until you leave to use [src].") return else no_den_usage = 0 diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index d4d232d2ed7..cf291fba675 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -4,7 +4,7 @@ anchored = 1 icon = 'icons/obj/chemical.dmi' icon_state = "dispenser" - use_power = 0 + use_power = NO_POWER_USE idle_power_usage = 40 var/ui_title = "Chem Dispenser 5000" var/energy = 100 diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 16914c77c4d..2d031d9c2c5 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -4,7 +4,7 @@ anchored = 1 icon = 'icons/obj/chemical.dmi' icon_state = "mixer0b" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 40 var/obj/item/reagent_containers/beaker = null var/desired_temp = 300 @@ -154,4 +154,4 @@ beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... data["beakerContents"] = beakerContents - return data \ No newline at end of file + return data diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 90f9ed47eec..2a7dac0f48d 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -4,7 +4,7 @@ anchored = 1 icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 var/obj/item/reagent_containers/beaker = null var/obj/item/storage/pill_bottle/loaded_pill_bottle = null @@ -416,4 +416,4 @@ to_chat(user, "You can't use the [name] while it's panel is opened!") return 1 else - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index 8296550d8f9..ee2ac418555 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "mixer0" circuit = /obj/item/circuitboard/pandemic - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 var/temp_html = "" var/wait = null @@ -294,4 +294,4 @@ ..() return else - ..() \ No newline at end of file + ..() diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index ce5ed918932..5948d29e4cd 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -4,7 +4,7 @@ icon_state = "juicer1" layer = 2.9 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 5 active_power_usage = 100 pass_flags = PASSTABLE @@ -33,7 +33,6 @@ /obj/item/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0), //Blender Stuff - /obj/item/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0), /obj/item/reagent_containers/food/snacks/grown/tomato = list("ketchup" = 0), /obj/item/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), /obj/item/reagent_containers/food/snacks/grown/oat = list("flour" = -5), @@ -58,6 +57,7 @@ var/list/juice_items = list ( //Juicer Stuff + /obj/item/reagent_containers/food/snacks/grown/soybeans = list("soymilk" = 0), /obj/item/reagent_containers/food/snacks/grown/corn = list("corn_starch" = 0), /obj/item/reagent_containers/food/snacks/grown/tomato = list("tomatojuice" = 0), /obj/item/reagent_containers/food/snacks/grown/carrot = list("carrotjuice" = 0), @@ -446,4 +446,4 @@ var/amount = O.reagents.total_volume O.reagents.trans_to(beaker, amount) if(!O.reagents.total_volume) - remove_object(O) \ No newline at end of file + remove_object(O) diff --git a/code/modules/reagents/chemistry/reagents/drugs.dm b/code/modules/reagents/chemistry/reagents/drugs.dm index a2bd35ae75a..77c4b08f359 100644 --- a/code/modules/reagents/chemistry/reagents/drugs.dm +++ b/code/modules/reagents/chemistry/reagents/drugs.dm @@ -302,13 +302,13 @@ M.AdjustWeakened(-2.5) M.adjustStaminaLoss(-2) M.SetSleeping(0) - M.status_flags |= GOTTAGOREALLYFAST + M.status_flags |= GOTTAGOFAST_METH if(prob(50)) M.adjustBrainLoss(1.0) ..() /datum/reagent/methamphetamine/on_mob_delete(mob/living/M) - M.status_flags &= ~GOTTAGOREALLYFAST + M.status_flags &= ~GOTTAGOFAST_METH ..() /datum/reagent/methamphetamine/overdose_process(mob/living/M, severity) @@ -590,7 +590,7 @@ M.AdjustStunned(-2) M.AdjustWeakened(-2) M.adjustStaminaLoss(-2) - M.status_flags |= GOTTAGOREALLYFAST + M.status_flags |= GOTTAGOFAST_METH M.Jitter(3) M.adjustBrainLoss(0.5) if(prob(5)) @@ -598,7 +598,7 @@ ..() /datum/reagent/lube/ultra/on_mob_delete(mob/living/M) - M.status_flags &= ~GOTTAGOREALLYFAST + M.status_flags &= ~GOTTAGOFAST_METH ..() /datum/reagent/lube/ultra/overdose_process(mob/living/M, severity) diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 199edb72fb4..7779cb91d85 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -397,7 +397,7 @@ if(13 to INFINITY) to_chat(M, "You suddenly ignite in a holy fire!") for(var/mob/O in viewers(M, null)) - O.show_message(text("[] suddenly bursts into flames!", M), 1) + O.show_message(text("[] suddenly bursts into flames!", M), 1) M.fire_stacks = min(5,M.fire_stacks + 3) M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard? @@ -513,4 +513,4 @@ if(istype(O, /obj/item/clothing/shoes/galoshes)) var/t_loc = get_turf(O) qdel(O) - new /obj/item/clothing/shoes/galoshes/dry(t_loc) \ No newline at end of file + new /obj/item/clothing/shoes/galoshes/dry(t_loc) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 39c2e8c78fb..bcbce7f8af8 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -52,7 +52,7 @@ /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) - holder.my_atom.visible_message("The solution spews out a metalic foam!") var/datum/effect_system/foam_spread/s = new() s.set_up(created_volume, location, holder, MFOAM_IRON) @@ -480,4 +480,4 @@ if(B && B.data) var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] if(D) - D.Devolve() \ No newline at end of file + D.Devolve() diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 771214661b4..ced02f2e48f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -73,6 +73,9 @@ icon_state = "medivend_hypo" safety_hypo = TRUE +/obj/item/reagent_containers/hypospray/safety/ert + list_reagents = list("omnizine" = 30) + /obj/item/reagent_containers/hypospray/CMO list_reagents = list("omnizine" = 30) @@ -158,4 +161,4 @@ /obj/item/reagent_containers/hypospray/autoinjector/nanocalcium/attack(mob/living/M, mob/user) if(..()) - playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1) \ No newline at end of file + playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 20, 1) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 1a22f664ad5..eb588200265 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -377,7 +377,7 @@ found = 1 break if(!found) - to_chat(usr, "[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.") + to_chat(usr, "[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.") return var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) transfer_fingerprints_to(NC) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index c7e276cae17..3bb3c237d07 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -258,6 +258,7 @@ return /obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd) + . = TRUE if(our_rpd.mode == RPD_ROTATE_MODE) rotate() else if(our_rpd.mode == RPD_FLIP_MODE) @@ -265,4 +266,4 @@ else if(our_rpd.mode == RPD_DELETE_MODE) our_rpd.delete_single_pipe(user, src) else - ..() + return ..() diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 476028b4532..9de8033a00f 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -335,7 +335,7 @@ // timed process // charge the gas reservoir and perform flush if ready /obj/machinery/disposal/process() - use_power = 0 + use_power = NO_POWER_USE if(stat & BROKEN) // nothing can happen if broken return @@ -356,13 +356,13 @@ if(stat & NOPOWER) // won't charge if no power return - use_power = 1 + use_power = IDLE_POWER_USE if(mode != 1) // if off or ready, no need to charge return // otherwise charge - use_power = 2 + use_power = ACTIVE_POWER_USE var/atom/L = loc // recharging from loc turf @@ -760,12 +760,8 @@ return if(T.intact && istype(T,/turf/simulated/floor)) //intact floor, pop the tile var/turf/simulated/floor/F = T - //F.health = 100 - F.burnt = 1 - F.intact = 0 - F.levelupdate() - new /obj/item/stack/tile(H) // add to holder so it will be thrown with other stuff - F.icon_state = "Floor[F.burnt ? "1" : ""]" + new F.builtin_tile.type(H) + F.remove_tile(null,TRUE,FALSE) if(direction) // direction is specified if(istype(T, /turf/space)) // if ended in space, then range is unlimited diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 8b2f7c4197f..1b1b5c0ffa9 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -134,6 +134,7 @@ name = "package wrapper" icon = 'icons/obj/items.dmi' icon_state = "deliveryPaper" + singular_name = "package wrapper" flags = NOBLUDGEON amount = 25 max_amount = 25 diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index bba85a5ff00..5a54bf54005 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -543,14 +543,22 @@ build_path = /obj/item/assembly/timer category = list("initial", "Miscellaneous") -/datum/design/voice_analyser - name = "Voice Analyser" - id = "voice_analyser" +/datum/design/voice_analyzer + name = "Voice Analyzer" + id = "voice_analyzer" build_type = AUTOLATHE materials = list(MAT_METAL = 500, MAT_GLASS = 50) build_path = /obj/item/assembly/voice category = list("initial", "Miscellaneous") +/datum/design/noise_analyser + name = "Noise Analyser" + id = "Noise_analyser" + build_type = AUTOLATHE + materials = list(MAT_METAL = 100, MAT_GLASS = 10) + build_path = /obj/item/assembly/voice/noise + category = list("initial", "Miscellaneous") + /datum/design/light_tube name = "Light Tube" id = "light_tube" @@ -848,38 +856,6 @@ build_path = /obj/item/videocam category = list("initial", "Miscellaneous") -/datum/design/canvas - name = "11px by 11px Canvas" - id = "canvas" - build_type = AUTOLATHE - materials = list(MAT_METAL = 50) - build_path = /obj/item/canvas - category = list("initial", "Miscellaneous") - -/datum/design/canvas/nineteenXnineteen - name = "19px by 19px Canvas" - id = "canvas19x19" - build_type = AUTOLATHE - materials = list(MAT_METAL = 50) - build_path = /obj/item/canvas/nineteenXnineteen - category = list("initial", "Miscellaneous") - -/datum/design/canvas/twentythreeXnineteen - name = "23px by 19px Canvas" - id = "canvas23x19" - build_type = AUTOLATHE - materials = list(MAT_METAL = 70) - build_path = /obj/item/canvas/twentythreeXnineteen - category = list("initial", "Miscellaneous") - -/datum/design/canvas/twentythreeXtwentythree - name = "23px by 23px Canvas" - id = "canvas23x23" - build_type = AUTOLATHE - materials = list(MAT_METAL = 100) - build_path = /obj/item/canvas/twentythreeXtwentythree - category = list("initial", "Miscellaneous") - /datum/design/logic_board name = "Logic Circuit" id = "logic_board" @@ -904,4 +880,4 @@ build_type = AUTOLATHE materials = list(MAT_GLASS = 2500) //1.25 glass sheets, broken mirrors will return a shard (1 sheet) build_path = /obj/item/mounted/mirror - category = list("initial", "Miscellaneous") \ No newline at end of file + category = list("initial", "Miscellaneous") diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 57886d2972c..cc6305319c7 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -272,6 +272,16 @@ build_path = /obj/item/circuitboard/mechfab category = list("Research Machinery") +/datum/design/podfab + name = "Machine Board (Spacepod Fabricator)" + desc = "The circuit board for an Spacepod Fabricator" + id = "podfab" + req_tech = list("programming" = 3, "engineering" = 3) + build_type = IMPRINTER + materials = list(MAT_GLASS = 1000) + build_path = /obj/item/circuitboard/podfab + category = list("Research Machinery") + /datum/design/mech_recharger name = "Machine Board (Mech Bay Recharger)" desc = "The circuit board for a Mech Bay Recharger." diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index a7fe42063ff..b5840d82265 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -323,6 +323,17 @@ build_path = /obj/item/organ/internal/cyberimp/arm/toolset category = list("Misc", "Medical") +/datum/design/cyberimp_diagnostic_hud + name = "Diagnostic HUD implant" + desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see. Wiggle eyes to control." + id = "ci-diaghud" + req_tech = list("materials" = 5, "engineering" = 4, "programming" = 4, "biotech" = 4) + build_type = PROTOLATHE | MECHFAB + construction_time = 50 + materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 500, MAT_GOLD = 500) + build_path = /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic + category = list("Misc", "Medical") + /datum/design/cyberimp_medical_hud name = "Medical HUD implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." @@ -345,6 +356,17 @@ build_path = /obj/item/organ/internal/cyberimp/eyes/hud/security category = list("Misc", "Medical") +/datum/design/cyberimp_meson + name = "Meson scanner implant" + desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else." + id = "ci-mesonhud" + req_tech = list("materials" = 4, "biotech" = 4, "engineering" = 4) + build_type = PROTOLATHE | MECHFAB + construction_time = 50 + materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500, MAT_GOLD = 300) + build_path = /obj/item/organ/internal/cyberimp/eyes/meson + category = list("Misc", "Medical") + /datum/design/cyberimp_xray name = "X-Ray implant" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." @@ -537,4 +559,4 @@ build_type = PROTOLATHE | MECHFAB materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500) build_path = /obj/item/organ/internal/lungs/cybernetic/upgraded - category = list("Medical") \ No newline at end of file + category = list("Medical") diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 8bdf6771df1..1036bb6e188 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -60,3 +60,23 @@ materials = list(MAT_METAL = 500, MAT_GLASS = 300) build_path = /obj/item/camera/digital category = list("Miscellaneous") + +/datum/design/safety_muzzle + name = "Safety Muzzle" + desc = "Produce a lockable muzzle keyed to security ID cards" + id = "safetymuzzle" + req_tech = list("materials" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL=500, MAT_GLASS=50) + build_path = /obj/item/clothing/mask/muzzle/safety + category = list("Miscellaneous") + +/datum/design/shock_muzzle + name = "Shock Muzzle" + desc = "Produce a modified safety muzzle that includes an electric shock pack and a slot for a trigger assembly." + id = "shockmuzzle" + req_tech = list("materials" = 1, "engineering" = 1) + build_type = PROTOLATHE + materials = list(MAT_METAL=500, MAT_GLASS=50) + build_path = /obj/item/clothing/mask/muzzle/safety/shock + category = list("Miscellaneous") diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index e504216fe38..f6e4f2c0877 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -21,7 +21,7 @@ icon_state = "h_lathe" density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/recentlyExperimented = 0 var/mob/trackedIan var/mob/trackedRuntime diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 86d507d34de..88ecedbf555 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -50,7 +50,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() name = "Messaging Server" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 @@ -199,7 +199,7 @@ var/obj/machinery/blackbox_recorder/blackbox name = "Blackbox Recorder" density = 1 anchored = 1.0 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 var/list/messages = list() //Stores messages of non-standard frequencies @@ -377,4 +377,4 @@ proc/feedback_add_details(var/variable,var/details) if(!FV) return - FV.add_details(details) \ No newline at end of file + FV.add_details(details) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 8d18df1ee07..aebbeb4bb9c 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -426,7 +426,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, var/key = usr.key //so we don't lose the info during the spawn delay if(!(being_built.build_type & PROTOLATHE)) g2g = 0 - message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!") + message_admins("Protolathe exploit attempted by [key_name(usr, TRUE)]!") if(g2g) //If input is incorrect, nothing happens var/new_coeff = coeff * being_built.lathe_time_factor @@ -502,7 +502,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, power = max(2000, power) if(!(being_built.build_type & IMPRINTER)) g2g = 0 - message_admins("Circuit imprinter exploit attempted by [key_name(usr, usr.client)]!") + message_admins("Circuit imprinter exploit attempted by [key_name(usr, TRUE)]!") if(g2g) //Again, if input is wrong, do nothing add_wait_message("Imprinting Circuit. Please Wait...", IMPRINTER_DELAY) diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 51b4f8512e1..1e884e35c3a 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/machines/research.dmi' density = 1 anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE var/busy = 0 var/hacked = 0 var/disabled = 0 @@ -130,4 +130,4 @@ use_power(min(1000, (amount_inserted / 100))) overlays += "[initial(name)]_[stack_name]" sleep(10) - overlays -= "[initial(name)]_[stack_name]" \ No newline at end of file + overlays -= "[initial(name)]_[stack_name]" diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 0e9053bbb44..8b0675d90de 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -248,7 +248,7 @@ But I like HTML, so back to no sanitizing.*/ var/message = interpreter.GetVar("$content") - var/regex/bannedTags = new ("(Plants needs to be ready to harvest to perform full data scan.") //Because space dna is actually magic return if(plants[H.myseed.type]) - to_chat(user, "Plant data already present in local storage.") + to_chat(user, "Plant data already present in local storage.") return plants[H.myseed.type] = 1 - to_chat(user, "Plant data added to local storage.") + to_chat(user, "Plant data added to local storage.") //animals if(isanimal(target) || is_type_in_typecache(target, non_simple_animals)) @@ -100,19 +100,19 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ to_chat(user, "No compatible DNA detected") return if(animals[target.type]) - to_chat(user, "Animal data already present in local storage.") + to_chat(user, "Animal data already present in local storage.") return animals[target.type] = 1 - to_chat(user, "Animal data added to local storage.") + to_chat(user, "Animal data added to local storage.") //humans if(ishuman(target)) var/mob/living/carbon/human/H = target if(dna[H.dna.uni_identity]) - to_chat(user, "Humanoid data already present in local storage.") + to_chat(user, "Humanoid data already present in local storage.") return dna[H.dna.uni_identity] = 1 - to_chat(user, "Humanoid data added to local storage.") + to_chat(user, "Humanoid data added to local storage.") /obj/item/circuitboard/machine/dna_vault @@ -301,4 +301,4 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/ /obj/machinery/dna_vault/proc/grant_power(mob/living/carbon/human/H, block, power) H.dna.SetSEState(block, 1, 1) H.mutations |= power - genemutcheck(H, block, null, MUTCHK_FORCED) \ No newline at end of file + genemutcheck(H, block, null, MUTCHK_FORCED) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index fe1adce42fb..da559d38d5f 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -47,6 +47,16 @@ to_chat(owner, "Static obfuscates your vision!") owner.flash_eyes(visual = 1) +/obj/item/organ/internal/cyberimp/eyes/meson + name = "Meson scanner implant" + desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else." + eye_colour = "#199900" + implant_color = "#AEFF00" + origin_tech = "materials=4;engineering=4;biotech=4;magnets=4" + vision_flags = SEE_TURFS + see_invisible = SEE_INVISIBLE_MINIMUM + aug_message = "Suddenly, you realize how much of a mess the station really is..." + /obj/item/organ/internal/cyberimp/eyes/xray name = "X-ray implant" desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." @@ -96,6 +106,15 @@ aug_message = "You suddenly see health bars floating above people's heads..." HUD_type = DATA_HUD_MEDICAL_ADVANCED +/obj/item/organ/internal/cyberimp/eyes/hud/diagnostic + name = "Diagnostic HUD implant" + desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see." + eye_colour = "#723E02" + implant_color = "#ff9000" + origin_tech = "materials=4;engineering=4;biotech=4" + aug_message = "You see the diagnostic information of the synthetics around you..." + HUD_type = DATA_HUD_DIAGNOSTIC + /obj/item/organ/internal/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index f9fb2ac20c2..9ab290f5c89 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -12,7 +12,7 @@ /datum/surgery/cybernetic_repair/internal name = "Internal Component Manipulation" steps = list(/datum/surgery_step/robotics/external/unscrew_hatch,/datum/surgery_step/robotics/external/open_hatch,/datum/surgery_step/robotics/manipulate_robotic_organs) - possible_locs = list("eyes", "chest","head","groin","l_arm","r_arm") + possible_locs = list("eyes", "mouth", "chest","head","groin","l_arm","r_arm") requires_organic_bodypart = 0 /datum/surgery/cybernetic_amputation @@ -597,4 +597,4 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message(" [user]'s [tool.name] slips, failing to reprogram [target]'s [affected.name].", " Your [tool.name] slips, failing to reprogram [target]'s [affected.name].") - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 78b1da7f2a9..40a15e91c21 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -26,7 +26,7 @@ /obj/item/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L) if(!is_teleport_allowed(L.z)) - src.visible_message("[src]'s fragments begin rapidly vibrating and blink out of existence.") + src.visible_message("[src]'s fragments begin rapidly vibrating and blink out of existence.") qdel(src) return do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg') diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 38d4fa19e40..09f4ffa7920 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "pad-idle" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 200 active_power_usage = 5000 var/efficiency @@ -61,7 +61,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "pad-idle" anchored = 1 - use_power = 1 + use_power = IDLE_POWER_USE idle_power_usage = 20 active_power_usage = 500 var/stage = 0 diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index b7cf78e5ed2..f0f1654ac30 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -311,7 +311,10 @@ return if(teles_left > 0) - doteleport(user) + if(!doteleport(user)) + telefail() + temp_msg = "ERROR! Target destination unreachable due to interference." + return else telefail() temp_msg = "ERROR!
    Calibration required." diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index 38eb4af18aa..a80b2d3dfa6 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -4,7 +4,59 @@ icon_state = "docwagon2" keytype = /obj/item/key/ambulance var/obj/structure/stool/bed/amb_trolley/bed = null + var/datum/action/ambulance_alarm/AA + var/datum/looping_sound/ambulance_alarm/soundloop +/obj/vehicle/ambulance/New() + . = ..() + AA = new(src) + soundloop = new(list(src), FALSE) + +/datum/action/ambulance_alarm + name = "Toggle Sirens" + icon_icon = 'icons/obj/vehicles.dmi' + button_icon_state = "docwagon2" + check_flags = AB_CHECK_RESTRAINED | AB_CHECK_STUNNED | AB_CHECK_LYING | AB_CHECK_CONSCIOUS + var/toggle_cooldown = 40 + var/cooldown = 0 + + +/datum/action/ambulance_alarm/Trigger() + if(!..()) + return FALSE + + var/obj/vehicle/ambulance/A = target + + if(!istype(A) || !A.soundloop) + return FALSE + + if(world.time < cooldown + toggle_cooldown) + return FALSE + + cooldown = world.time + + if(A.soundloop.muted) + A.soundloop.start() + A.set_light(4,3,"#F70027") + else + A.soundloop.stop() + A.set_light(0) + + +/datum/looping_sound/ambulance_alarm + start_length = 0 + mid_sounds = list('sound/items/WEEOO1.ogg' = 1) + mid_length = 14 + volume = 100 + + +/obj/vehicle/ambulance/post_buckle_mob(mob/living/M) + . = ..() + if(has_buckled_mobs()) + AA.Grant(M) + else + AA.Remove(M) + /obj/item/key/ambulance name = "ambulance key" @@ -56,4 +108,4 @@ to_chat(usr, "You unhook the bed to the ambulance.") else amb.bed = src - to_chat(usr, "You hook the bed to the ambulance.") + to_chat(usr, "You hook the bed to the ambulance.") \ No newline at end of file diff --git a/config/example/config.txt b/config/example/config.txt index c8bdc8cffc9..08792117b1f 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -183,6 +183,9 @@ CHECK_RANDOMIZER ## GitHub address # GITHUBURL http://example.org +## Discord address +# DISCORDURL http://example.org + ## Donations address # DONATIONSURL http://example.org diff --git a/config/example/custom_sprites.txt b/config/example/custom_sprites.txt index 471764270d4..45d1d66058b 100644 --- a/config/example/custom_sprites.txt +++ b/config/example/custom_sprites.txt @@ -1,5 +1,7 @@ Each entry should be composed of 2 parts, divided by a colon (:) with no spaces, in order to work. Failure to do so will result in that entry being disregarded by the code. -- The first part should be either "cyborg", "ai", "hologram", "pai", or "drone". This tells the code what type of custom sprite this entry is for. The "ai" option is for AI core displays, while "hologram" is for AI hologram projections. +- The first part should be either "cyborg", "ai", "hologram", "pai", "drone", or "screen". This tells the code what type of custom sprite this entry is for. The "ai" option is for AI core displays, while "hologram" is for AI hologram projections. - The second part should be the ckey of the player this entry is for. This tells the code who it works for and also is used to retrieve the proper sprite for them to use. +- If the entry is a custom screen, it will need a 3rd part which is the screen name. This tells the code which screen to use, as well allows for someone to have more then one custom screen. + example:example \ No newline at end of file diff --git a/html/changelog.html b/html/changelog.html index cd3ddf53e86..3b8a02a212d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,499 @@ -->
    +

    30 September 2018

    +

    Purpose updated:

    +
      +
    • Fixes various message format overflows.
    • +
    +

    datlo updated:

    +
      +
    • Made the poison pen available to traitor librarians
    • +
    +

    variableundefined updated:

    +
      +
    • One click antagonist giving antag to people in restricted job.
    • +
    + +

    29 September 2018

    +

    Dapocalypse updated:

    +
      +
    • Removes extra penlight given to plasmemes.
    • +
    +

    DarkPyrolord updated:

    +
      +
    • Pyro's fluff item
    • +
    +

    Kyep updated:

    +
      +
    • Fixed several bugs with blob, including lateround blobs not generating biohazard alerts, blobs missing out on early resources they should have, and a bug with blob storage being broken that prevented blobs getting any resources.
    • +
    +

    NoWolfie updated:

    +
      +
    • New Pyr'kus cult floor and wall sprite.
    • +
    +

    Triiodine updated:

    +
      +
    • Nukies spawning with cybernetic organs/limbs
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Removes canvases due to everybody crashing from them.
    • +
    +

    farie82 updated:

    +
      +
    • Headbutting the airlock is more consistent.
    • +
    • refactored the airlock code.
    • +
    • Using multitools and such on a door with a note now doesn't remove the note. Only grabbing with an empty hand now.
    • +
    + +

    28 September 2018

    +

    DarkPyrolord updated:

    +
      +
    • Fixes a ten year old atmos bug, fix will cause toxins bombs and plasma fires to be a little less lethal
    • +
    • Readds modkit sprites to items.dm to fix invis fluff item modkits.
    • +
    +

    Farie82 updated:

    +
      +
    • No more broken tile due to getting shot out of disposals.
    • +
    • Point blank shots not hitting the correct person. When multiple people are on the same tile.
    • +
    +

    Kyep updated:

    +
      +
    • The wild west away mission no longer offers hijack traitor status as a potential reward.
    • +
    • Deconstructing/reconstructing the space pod fab no longer turns it into a mech fab. No more mechanics building surprise mechs.
    • +
    • The spacepod fab circuit is now buildable in R&D.
    • +
    • Spacepod fabs now require mechanic access to use, like the mechanic R&D console does.
    • +
    +

    Purpose updated:

    +
      +
    • Mappers can now have Floodlights round-start enabled.
    • +
    +

    Tails2091 updated:

    +
      +
    • Refactored Hallucinations to match contribution guide standards a bit more.
    • +
    +

    Triiodine updated:

    +
      +
    • Fixes jade lipstick being lime.
    • +
    • Adds lime lipstick.
    • +
    • New storage implant icon
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Ambulances now have sirens!
    • +
    • Shadowlings no longer are able to target simple animals (mice)
    • +
    +

    farie82 updated:

    +
      +
    • fixed cling transformed humanoids looking rather pale.
    • +
    • Fixed emagged camera consoles not opening the tabs
    • +
    +

    uc_guy updated:

    +
      +
    • Vox auto equip the nitrogen tank when spawning if possible.
    • +
    • Nitrogen tanks no longer overwrite job items.
    • +
    +

    variableundefined updated:

    +
      +
    • Benjaminfallout's fluff item.
    • +
    • Qdel log is now re-added to the garbage subsystem to enable coders to investigate sources of hard delete.
    • +
    • When you remove a light tube while lying down, the light tube disappear. This no longer happens.
    • +
    • Latejoin AI no longer spawn in naked at arrival shuttles.
    • +
    • Not spawning in with your memory of bank account at roundstart...
    • +
    + +

    27 September 2018

    +

    Anasari updated:

    +
      +
    • You can now deconstruct a fire extinguisher cabinet to yield a single piece of metal. You can construct them for five pieces of metal, with extinguisher included. (Using metal construction menu)
    • +
    +

    Birdtalon updated:

    +
      +
    • Borg modules now add item action buttons if present.
    • +
    • Beepsky responds to attacking him with disarm intent.
    • +
    +

    CornMyCob updated:

    +
      +
    • Adds in a prompt for becoming a headslug.
    • +
    +

    Crazylemon64 updated:

    +
      +
    • Adds a fluff item for ELO
    • +
    +

    DesolateG updated:

    +
      +
    • Added a check to whispering adverbs to prevent double adverbs while whispering.
    • +
    +

    FalseIncarnate updated:

    +
      +
    • Adds mixing bowls, which allow you to cook multiple recipes at the same time! The dinnerware vendor comes pre-stocked with 10!
    • +
    • Adds 2 mixing bowls to the Food Crate from cargo should you need additional. This is the same crate that includes the extra bottle of enzymes.
    • +
    • Burned messes now scale their carbon and "????" content with both physical ingredients and directly inserted reagents while burning in the cooking machines.
    • +
    • Upgraded cooking machines now attempt to evenly distribute reagents from ingredients across all produced results, rather than just the original.
    • +
    +

    Farie82 updated:

    +
      +
    • You can remove notes from an airlock now with the grab intent using an empty hand.
    • +
    +

    Fox McCloud updated:

    +
      +
    • Fixes 128x128 menu location
    • +
    +

    Kyep updated:

    +
      +
    • Refactored shieldgen.dm, fixed a bug which could cause shieldgens to behave improperly under some rare conditions.
    • +
    +

    Purpose updated:

    +
      +
    • CPU Performance tweaks in the Bananaium floor honks & squeaks
    • +
    • Capitalisation correction in automated chef npcs
    • +
    • CPU Performance tweaks in the Xeno Hunter tackles
    • +
    • CPU Performance tweaks in Malf AI
    • +
    • NT Formal clothing now updates to the station names correctly.
    • +
    • Fixes typos in NT Formal clothing
    • +
    • Minimap is now updated
    • +
    • Holopads now use the correct amount of power.
    • +
    • CPU Performance tweaks in the Pipe Dispenser
    • +
    • Blobs now delete light fixtures correctly.
    • +
    • use_power variable is more clearly defined as non-boolean via defines.
    • +
    +

    TDSSS updated:

    +
      +
    • Atmospherics external airlocks can now be controlled by borgs and AIs
    • +
    +

    Triiodine updated:

    +
      +
    • righthand fork sprite being oriented wrong.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Fixes vending machine bank account security. You can now use them with a bank account security level above zero.
    • +
    • Fixes a bunch of \ tags
    • +
    +

    alex-gh updated:

    +
      +
    • Drask no longer take damage from cryokinesis
    • +
    • Cryokinesis deals less damage, but lowers the body temperature a lot more.
    • +
    • Autopsy scanner now prints all times in human readable format.
    • +
    +

    datlo updated:

    +
      +
    • Added the wizard spell Greater Knock, letting them remove all access restrictions on the Cyberiad and master door opening.
    • +
    +

    variableundefined updated:

    +
      +
    • drop_location & AllowDrop() has been ported over from tg. Report unexpected issues with dropping items.
    • +
    • When you late join, extra items you can't equip / hold spawn on the ground instead of in the lobby screen. Including vox medkit etc.
    • +
    • Plasmaman no longer get double the firepower when spawning in as Captain, BS, or sec roles.
    • +
    • Non-human's DNA (Except for IPC, of course) should show up properly in the DNA modifier now.
    • +
    + +

    25 September 2018

    +

    Birdtalon updated:

    +
      +
    • Secure console UI (security records) appears bigger by default.
    • +
    • One-click-antag now respects game-mode's protected jobs.
    • +
    +

    Fox McCloud updated:

    +
      +
    • adds support for 128x128 skin interface pixel size for 4K monitors
    • +
    +

    Purpose updated:

    +
      +
    • Space is now visible under corner pieces of the Intact Empty Ship ruin.
    • +
    + +

    24 September 2018

    +

    Triiodine, Desolate, updated:

    +
      +
    • Things without blood bleeding red when rolled over by a mulebot.
    • +
    + +

    19 September 2018

    +

    Birdtalon updated:

    +
      +
    • Screwdrivers now open fire alarms instead of wirecutters.
    • +
    + +

    18 September 2018

    +

    Birdtalon updated:

    +
      +
    • Laser tag ED-209 bots get the correct names upon construction.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • adds a missing italics tag to nano/templates/song.tmpl
    • +
    + +

    16 September 2018

    +

    Shazbot updated:

    +
      +
    • Adds in the ability to have multiple custom screens.
    • +
    • Adds in Lumi's custom faces.
    • +
    +

    dandykong updated:

    +
      +
    • Internal manipulation surgeries can now be performed on mouths after the head is augmented.
    • +
    +

    variableundefined updated:

    +
      +
    • Contribution.md now properly state that changelog is mandated for all PR.
    • +
    + +

    14 September 2018

    +

    Ty-Omaha updated:

    +
      +
    • Fixes logic with obscure proc adjust_bodytemperature
    • +
    + +

    11 September 2018

    +

    Aurorablade updated:

    +
      +
    • Adds a missing var to cult comms logging.
    • +
    +

    alex-gh updated:

    +
      +
    • It is now possible to heal robotic limbs and IPCs through View Variables
    • +
    +

    variableundefined updated:

    +
      +
    • pAI can no longer use name with special characters that cause their chat messages to disappear.
    • +
    + +

    09 September 2018

    +

    AffectedArc07 updated:

    +
      +
    • You can no longer gib everyone on the server by forcing admins to call verbs with NTSL
    • +
    +

    Agameofscones updated:

    +
      +
    • removes the equip region for the mask slot on holobadge-cords
    • +
    • changes implementation of https://github.com/ParadiseSS13/Paradise/pull/9471 to be smarter and more long term.
    • +
    +

    Kyep updated:

    +
      +
    • Fixed bad spawn points in the Wizard Academy away mission.
    • +
    • The two welding goggles that went missing from the table in atmos have been returned.
    • +
    +

    SkeletalElite updated:

    +
      +
    • The paper in the holoparasite kit now describes both of the Chaos holoparasite's modes
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Nightmare writhing now properly works
    • +
    • Fixes the wire under the door in med maint that led to a wall
    • +
    • Virology now has a hologram
    • +
    +

    nicetoolbox updated:

    +
      +
    • Prevent instant rev victory in rev gamemode
    • +
    • Cryo now heals all your mutated limbs
    • +
    +

    uc_guy updated:

    +
      +
    • Ghosts can no longer eject IDs from fax machines and ID computers.
    • +
    • Fixed exploit that allowed exiled mobs to return to the station
    • +
    +

    variableundefined updated:

    +
      +
    • One-click antag vampire showing up as a changeling on antag HUD.
    • +
    • Claw game should give you token for payment by card properly again.
    • +
    • Mime forcewall now properly last for 30 seconds instead of 10.
    • +
    • The cancel button actually work properly when editing memory now.
    • +
    • A wallet now shows a green card decal by default if there's a card inside.
    • +
    + +

    05 September 2018

    +

    IrkallaEpsilon updated:

    +
      +
    • Adds an attack cooldown on mirrors for all mobs. Yes simple mobs and Xenomorph larvaes included
    • +
    +

    variableundefined updated:

    +
      +
    • Economy code has been slightly refactored. Report issues.
    • +
    • EFTPOS no longer has a name.
    • +
    • All date on transaction log should be in long form like "1 January, 2500 22:00:00".
    • +
    • Negative number is represented by parentheses in transaction log, positive without (Opposite of before).
    • +
    • There's a higher chance of winning $10 in the slot machine now.
    • +
    + +

    04 September 2018

    +

    Flatty updated:

    +
      +
    • Additional icon scaling settings
    • +
    +

    FreeStylaLT updated:

    +
      +
    • New Kidan sprites and accessories
    • +
    +

    IrkallaEpsilon updated:

    +
      +
    • Atmos Grenades wont appear in Surplus anymore due to them virtually being unuseable due to OOC reasons in almost any case.
    • +
    +

    Kyep updated:

    +
      +
    • The power grid in the black market packers away mission has been fixed, and it is no longer possible to effectively skip the entire mission using a crowbar.
    • +
    • Lateround blobs now start off as an infected mouse. By moving around/ventcrawling as a mouse, they can find themselves a good nesting area before they turn into a blob core.
    • +
    • Meth (and ultra-lube, its equivalent for synthetics) now grant less of a speed bonus.
    • +
    +

    Shazbot updated:

    +
      +
    • Now you can actually make xeno borgs.
    • +
    +

    TDSSS updated:

    +
      +
    • Medbelts can now hold hyposprays.
    • +
    +

    Tails2091 updated:

    +
      +
    • Double welding a closet no longer removes welding tool. format: Changed 0 1 booleans to TRUE FALSE.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Secure fridges can be properly emagged
    • +
    • Secure fridges can now be EMP'd to override their access requirements
    • +
    +

    datlo updated:

    +
      +
    • Megaphone now uses the user's speech font (Wingdings/comic sans)
    • +
    +

    nicetoolbox updated:

    +
      +
    • Fixes Plasmamen wizards not counting as fully garbed
    • +
    +

    variableundefined updated:

    +
      +
    • Analyzer are now consistently spelled Analyzer instead of Analyser.
    • +
    • Hivelord remains send the proper feedback about its preservation method to database.
    • +
    • IPC no longer displays their UI / SE in console. Same goes for other invalid subjects. You also can't save their UI / SE anymore.
    • +
    + +

    31 August 2018

    +

    variableundefined updated:

    +
      +
    • Being incapacitated when changing IPC monitor now show a message properly.
    • +
    • Borg & AI say actually work properly now. They no longer become whisper.
    • +
    + +

    30 August 2018

    +

    Alffd updated:

    +
      +
    • Fix emote check of can_speak() to only return if the emote produces sound.
    • +
    +

    Kyep updated:

    +
      +
    • Fixed depot armory shield key not being properly randomized.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Decreases sechailer shitcode
    • +
    + +

    29 August 2018

    +

    Agameofscones updated:

    +
      +
    • Removes stray pixel in RD sechud.
    • +
    +

    Flatty updated:

    +
      +
    • You can now put items on people and take them off while you're riding that sweet, sweet wheelchair.
    • +
    +

    Kyep updated:

    +
      +
    • Fixed various bugs with spider structures (webs, cocoons, etc), such as them not triggering attack animations, not respecting melee cooldowns, being invulnerable to simple_animals and aliens, etc.
    • +
    +

    Superhats updated:

    +
      +
    • Adds Meson and Diagnostic HUD implants.
    • +
    • ERT equipment has been reviewed by Nanotrasen and changed to more appropriately assist the station when called.
    • +
    • Amber Janitor ERT Armor sprite now works.
    • +
    • Field Surgery Belt added for Code Amber Medical ERT
    • +
    +

    Triiodine (Agameofscones) updated:

    +
      +
    • Removed original paramedic EVA sprites
    • +
    • Replaced paramedic EVA sprites with medical hardsuit inspired set.
    • +
    • Added species variants _(Which did not exist before hand)_ to Unathi, Tajaran, Drask, Skrells, & Vulpkanins.
    • +
    • Added the same armor values the basic EVA suit gets (bio 100, rad 20), this puts the paramedic suit in standard with other NT soft suits. edit: Fixed a typo in the santasuit comment, because why not.
    • +
    +

    Ty-Omaha updated:

    +
      +
    • NT Rep stamp no longer stamps as Central Command, they have their own stamp now.
    • +
    +

    variableundefined updated:

    +
      +
    • Cutting wires shouldn't cause a runtime error anymore.
    • +
    • You cannot bola people without at least two legs (on them) anymore.
    • +
    + +

    28 August 2018

    +

    Alffd updated:

    +
      +
    • Fixes emote code to preform mute checking in the same manner as say code.
    • +
    • Adds a new type of muzzle that will shock its wearer when pulsed by an assembly.
    • +
    • Adds a new type of voice trigger assembly that is activated by audible emotes.
    • +
    +

    Birdtalon updated:

    +
      +
    • Fixes torn down posters dropping hypothetical poster when their wall is deconstructed.
    • +
    +

    Flatty updated:

    +
      +
    • IPCs can also change their screen color in addition to the image now
    • +
    +

    Ty-Omaha updated:

    +
      +
    • Harm intent attack animations are red instead of white
    • +
    +

    taukausanake updated:

    +
      +
    • Corrects formatting for the abductor objective messages
    • +
    +

    variableundefined updated:

    +
      +
    • Logging for prayer.
    • +
    • Silicons no longer broadcast their radio message to everyone in hearing range (Only those next to them). Yes, that's a bug, not a feature.
    • +
    + +

    26 August 2018

    +

    Agameofscones updated:

    +
      +
    • Mr. Chang vendor sprite (icon_state: chang).
    • +
    • Three new Mr. Chang vendor slogans.
    • +
    + +

    23 August 2018

    +

    Aurorablade updated:

    +
      +
    • Changes to air Subsystem to make it load faster taken from TG by SpaceManiac.
    • +
    • Attemps to cap dogs you can cough up to 10..then you cough up a plush fox. Totally normal.
    • +
    +

    Birdtalon updated:

    +
      +
    • Fixes unexpected item deletion upon changing species.
    • +
    +

    Kyep updated:

    +
      +
    • Fixed a few bugs (notably, grid check event raising alert level) in the depot.
    • +
    • Fixed hand_tele, bluespace tomatoes, etc not respecting the tele_proof flag of areas.
    • +
    +

    alex-gh updated:

    +
      +
    • Changeling fleshmend no longer overfills their blood.
    • +
    +

    variableundefined updated:

    +
      +
    • Admin logging for kinetic accelerator.
    • +
    • Implantcase no longer disappears when dropped or placed in bag.
    • +
    • Logging to borer infestation.
    • +
    • A runtime with admin ticket.
    • +
    • Defibrillator paddles snap away if you walk away from the defibrillator.
    • +
    • Fixes the discard action not displaying who discarded a card from a hand of card
    • +
    • Fixes deck of card not being removed properly from your pocket when you drag it over your sprite.
    • +
    +

    18 August 2018

    Crazylemon64 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 81816aa78cb..e499c123837 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -6784,3 +6784,349 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-08-18: Crazylemon64: - bugfix: makes AA's map fix not annihilate every map PR in existence +2018-08-23: + Aurorablade: + - tweak: Changes to air Subsystem to make it load faster taken from TG by SpaceManiac. + - tweak: Attemps to cap dogs you can cough up to 10..then you cough up a plush fox. + Totally normal. + Birdtalon: + - bugfix: Fixes unexpected item deletion upon changing species. + Kyep: + - bugfix: Fixed a few bugs (notably, grid check event raising alert level) in the + depot. + - bugfix: Fixed hand_tele, bluespace tomatoes, etc not respecting the tele_proof + flag of areas. + alex-gh: + - bugfix: Changeling fleshmend no longer overfills their blood. + variableundefined: + - rscadd: Admin logging for kinetic accelerator. + - bugfix: Implantcase no longer disappears when dropped or placed in bag. + - rscadd: Logging to borer infestation. + - bugfix: A runtime with admin ticket. + - tweak: Defibrillator paddles snap away if you walk away from the defibrillator. + - bugfix: Fixes the discard action not displaying who discarded a card from a hand + of card + - bugfix: Fixes deck of card not being removed properly from your pocket when you + drag it over your sprite. +2018-08-26: + Agameofscones: + - rscadd: 'Mr. Chang vendor sprite (icon_state: chang).' + - rscadd: Three new Mr. Chang vendor slogans. +2018-08-28: + Alffd: + - bugfix: Fixes emote code to preform mute checking in the same manner as say code. + - rscadd: Adds a new type of muzzle that will shock its wearer when pulsed by an + assembly. + - rscadd: Adds a new type of voice trigger assembly that is activated by audible + emotes. + Birdtalon: + - bugfix: Fixes torn down posters dropping hypothetical poster when their wall is + deconstructed. + Flatty: + - tweak: IPCs can also change their screen color in addition to the image now + Ty-Omaha: + - tweak: Harm intent attack animations are red instead of white + taukausanake: + - bugfix: Corrects formatting for the abductor objective messages + variableundefined: + - rscadd: Logging for prayer. + - bugfix: Silicons no longer broadcast their radio message to everyone in hearing + range (Only those next to them). Yes, that's a bug, not a feature. +2018-08-29: + Agameofscones: + - bugfix: Removes stray pixel in RD sechud. + Flatty: + - bugfix: You can now put items on people and take them off while you're riding + that sweet, sweet wheelchair. + Kyep: + - bugfix: Fixed various bugs with spider structures (webs, cocoons, etc), such as + them not triggering attack animations, not respecting melee cooldowns, being + invulnerable to simple_animals and aliens, etc. + Superhats: + - rscadd: Adds Meson and Diagnostic HUD implants. + - tweak: ERT equipment has been reviewed by Nanotrasen and changed to more appropriately + assist the station when called. + - bugfix: Amber Janitor ERT Armor sprite now works. + - rscadd: Field Surgery Belt added for Code Amber Medical ERT + Triiodine (Agameofscones): + - rscdel: Removed original paramedic EVA sprites + - rscadd: Replaced paramedic EVA sprites with medical hardsuit inspired set. + - rscadd: Added species variants _(Which did not exist before hand)_ to Unathi, + Tajaran, Drask, Skrells, & Vulpkanins. + - rscadd: 'Added the same armor values the basic EVA suit gets (bio 100, rad 20), + this puts the paramedic suit in standard with other NT soft suits. edit: Fixed + a typo in the santasuit comment, because why not.' + Ty-Omaha: + - bugfix: NT Rep stamp no longer stamps as Central Command, they have their own + stamp now. + variableundefined: + - bugfix: Cutting wires shouldn't cause a runtime error anymore. + - bugfix: You cannot bola people without at least two legs (on them) anymore. +2018-08-30: + Alffd: + - bugfix: Fix emote check of can_speak() to only return if the emote produces sound. + Kyep: + - bugfix: Fixed depot armory shield key not being properly randomized. + Ty-Omaha: + - tweak: Decreases sechailer shitcode +2018-08-31: + variableundefined: + - bugfix: Being incapacitated when changing IPC monitor now show a message properly. + - bugfix: Borg & AI say actually work properly now. They no longer become whisper. +2018-09-04: + Flatty: + - rscadd: Additional icon scaling settings + FreeStylaLT: + - rscadd: New Kidan sprites and accessories + IrkallaEpsilon: + - bugfix: Atmos Grenades wont appear in Surplus anymore due to them virtually being + unuseable due to OOC reasons in almost any case. + Kyep: + - bugfix: The power grid in the black market packers away mission has been fixed, + and it is no longer possible to effectively skip the entire mission using a + crowbar. + - tweak: Lateround blobs now start off as an infected mouse. By moving around/ventcrawling + as a mouse, they can find themselves a good nesting area before they turn into + a blob core. + - tweak: Meth (and ultra-lube, its equivalent for synthetics) now grant less of + a speed bonus. + Shazbot: + - bugfix: Now you can actually make xeno borgs. + TDSSS: + - rscadd: Medbelts can now hold hyposprays. + Tails2091: + - bugfix: 'Double welding a closet no longer removes welding tool. format: Changed + 0 1 booleans to TRUE FALSE.' + Ty-Omaha: + - bugfix: Secure fridges can be properly emagged + - rscadd: Secure fridges can now be EMP'd to override their access requirements + datlo: + - bugfix: Megaphone now uses the user's speech font (Wingdings/comic sans) + nicetoolbox: + - bugfix: Fixes Plasmamen wizards not counting as fully garbed + variableundefined: + - tweak: Analyzer are now consistently spelled Analyzer instead of Analyser. + - bugfix: Hivelord remains send the proper feedback about its preservation method + to database. + - tweak: IPC no longer displays their UI / SE in console. Same goes for other invalid + subjects. You also can't save their UI / SE anymore. +2018-09-05: + IrkallaEpsilon: + - bugfix: Adds an attack cooldown on mirrors for all mobs. Yes simple mobs and Xenomorph + larvaes included + variableundefined: + - bugfix: Economy code has been slightly refactored. Report issues. + - rscdel: EFTPOS no longer has a name. + - tweak: All date on transaction log should be in long form like "1 January, 2500 + 22:00:00". + - tweak: Negative number is represented by parentheses in transaction log, positive + without (Opposite of before). + - tweak: There's a higher chance of winning $10 in the slot machine now. +2018-09-09: + AffectedArc07: + - bugfix: You can no longer gib everyone on the server by forcing admins to call + verbs with NTSL + Agameofscones: + - bugfix: removes the equip region for the mask slot on holobadge-cords + - tweak: changes implementation of https://github.com/ParadiseSS13/Paradise/pull/9471 + to be smarter and more long term. + Kyep: + - bugfix: Fixed bad spawn points in the Wizard Academy away mission. + - bugfix: The two welding goggles that went missing from the table in atmos have + been returned. + SkeletalElite: + - bugfix: The paper in the holoparasite kit now describes both of the Chaos holoparasite's + modes + Ty-Omaha: + - bugfix: Nightmare writhing now properly works + - bugfix: Fixes the wire under the door in med maint that led to a wall + - bugfix: Virology now has a hologram + nicetoolbox: + - bugfix: Prevent instant rev victory in rev gamemode + - bugfix: Cryo now heals all your mutated limbs + uc_guy: + - bugfix: Ghosts can no longer eject IDs from fax machines and ID computers. + - bugfix: Fixed exploit that allowed exiled mobs to return to the station + variableundefined: + - bugfix: One-click antag vampire showing up as a changeling on antag HUD. + - bugfix: Claw game should give you token for payment by card properly again. + - bugfix: Mime forcewall now properly last for 30 seconds instead of 10. + - bugfix: The cancel button actually work properly when editing memory now. + - tweak: A wallet now shows a green card decal by default if there's a card inside. +2018-09-11: + Aurorablade: + - bugfix: Adds a missing var to cult comms logging. + alex-gh: + - bugfix: It is now possible to heal robotic limbs and IPCs through View Variables + variableundefined: + - bugfix: pAI can no longer use name with special characters that cause their chat + messages to disappear. +2018-09-14: + Ty-Omaha: + - bugfix: Fixes logic with obscure proc adjust_bodytemperature +2018-09-16: + Shazbot: + - rscadd: Adds in the ability to have multiple custom screens. + - rscadd: Adds in Lumi's custom faces. + dandykong: + - bugfix: Internal manipulation surgeries can now be performed on mouths after the + head is augmented. + variableundefined: + - bugfix: Contribution.md now properly state that changelog is mandated for all + PR. +2018-09-18: + Birdtalon: + - bugfix: Laser tag ED-209 bots get the correct names upon construction. + Ty-Omaha: + - spellcheck: adds a missing italics tag to nano/templates/song.tmpl +2018-09-19: + Birdtalon: + - bugfix: Screwdrivers now open fire alarms instead of wirecutters. +2018-09-24: + Triiodine, Desolate,: + - bugfix: Things without blood bleeding red when rolled over by a mulebot. +2018-09-25: + Birdtalon: + - tweak: Secure console UI (security records) appears bigger by default. + - tweak: One-click-antag now respects game-mode's protected jobs. + Fox McCloud: + - rscadd: adds support for 128x128 skin interface pixel size for 4K monitors + Purpose: + - bugfix: Space is now visible under corner pieces of the Intact Empty Ship ruin. +2018-09-27: + Anasari: + - rscadd: You can now deconstruct a fire extinguisher cabinet to yield a single + piece of metal. You can construct them for five pieces of metal, with extinguisher + included. (Using metal construction menu) + Birdtalon: + - bugfix: Borg modules now add item action buttons if present. + - tweak: Beepsky responds to attacking him with disarm intent. + CornMyCob: + - tweak: Adds in a prompt for becoming a headslug. + Crazylemon64: + - rscadd: Adds a fluff item for ELO + DesolateG: + - bugfix: Added a check to whispering adverbs to prevent double adverbs while whispering. + FalseIncarnate: + - rscadd: Adds mixing bowls, which allow you to cook multiple recipes at the same + time! The dinnerware vendor comes pre-stocked with 10! + - rscadd: Adds 2 mixing bowls to the Food Crate from cargo should you need additional. + This is the same crate that includes the extra bottle of enzymes. + - tweak: Burned messes now scale their carbon and "????" content with both physical + ingredients and directly inserted reagents while burning in the cooking machines. + - tweak: Upgraded cooking machines now attempt to evenly distribute reagents from + ingredients across all produced results, rather than just the original. + Farie82: + - tweak: You can remove notes from an airlock now with the grab intent using an + empty hand. + Fox McCloud: + - bugfix: Fixes 128x128 menu location + Kyep: + - bugfix: Refactored shieldgen.dm, fixed a bug which could cause shieldgens to behave + improperly under some rare conditions. + Purpose: + - tweak: CPU Performance tweaks in the Bananaium floor honks & squeaks + - bugfix: Capitalisation correction in automated chef npcs + - tweak: CPU Performance tweaks in the Xeno Hunter tackles + - tweak: CPU Performance tweaks in Malf AI + - bugfix: NT Formal clothing now updates to the station names correctly. + - spellcheck: Fixes typos in NT Formal clothing + - bugfix: Minimap is now updated + - bugfix: Holopads now use the correct amount of power. + - tweak: CPU Performance tweaks in the Pipe Dispenser + - bugfix: Blobs now delete light fixtures correctly. + - tweak: use_power variable is more clearly defined as non-boolean via defines. + TDSSS: + - bugfix: Atmospherics external airlocks can now be controlled by borgs and AIs + Triiodine: + - bugfix: righthand fork sprite being oriented wrong. + Ty-Omaha: + - bugfix: Fixes vending machine bank account security. You can now use them with + a bank account security level above zero. + - spellcheck: Fixes a bunch of \ tags + alex-gh: + - bugfix: Drask no longer take damage from cryokinesis + - tweak: Cryokinesis deals less damage, but lowers the body temperature a lot more. + - bugfix: Autopsy scanner now prints all times in human readable format. + datlo: + - rscadd: Added the wizard spell Greater Knock, letting them remove all access restrictions + on the Cyberiad and master door opening. + variableundefined: + - tweak: drop_location & AllowDrop() has been ported over from tg. Report unexpected + issues with dropping items. + - tweak: When you late join, extra items you can't equip / hold spawn on the ground + instead of in the lobby screen. Including vox medkit etc. + - bugfix: Plasmaman no longer get double the firepower when spawning in as Captain, + BS, or sec roles. + - bugfix: Non-human's DNA (Except for IPC, of course) should show up properly in + the DNA modifier now. +2018-09-28: + DarkPyrolord: + - bugfix: Fixes a ten year old atmos bug, fix will cause toxins bombs and plasma + fires to be a little less lethal + - bugfix: Readds modkit sprites to items.dm to fix invis fluff item modkits. + Farie82: + - bugfix: No more broken tile due to getting shot out of disposals. + - bugfix: Point blank shots not hitting the correct person. When multiple people + are on the same tile. + Kyep: + - rscdel: The wild west away mission no longer offers hijack traitor status as a + potential reward. + - bugfix: Deconstructing/reconstructing the space pod fab no longer turns it into + a mech fab. No more mechanics building surprise mechs. + - tweak: The spacepod fab circuit is now buildable in R&D. + - tweak: Spacepod fabs now require mechanic access to use, like the mechanic R&D + console does. + Purpose: + - rscadd: Mappers can now have Floodlights round-start enabled. + Tails2091: + - bugfix: Refactored Hallucinations to match contribution guide standards a bit + more. + Triiodine: + - bugfix: Fixes jade lipstick being lime. + - rscadd: Adds lime lipstick. + - rscadd: New storage implant icon + Ty-Omaha: + - rscadd: Ambulances now have sirens! + - tweak: Shadowlings no longer are able to target simple animals (mice) + farie82: + - bugfix: fixed cling transformed humanoids looking rather pale. + - bugfix: Fixed emagged camera consoles not opening the tabs + uc_guy: + - tweak: Vox auto equip the nitrogen tank when spawning if possible. + - bugfix: Nitrogen tanks no longer overwrite job items. + variableundefined: + - rscadd: Benjaminfallout's fluff item. + - tweak: Qdel log is now re-added to the garbage subsystem to enable coders to investigate + sources of hard delete. + - bugfix: When you remove a light tube while lying down, the light tube disappear. + This no longer happens. + - bugfix: Latejoin AI no longer spawn in naked at arrival shuttles. + - bugfix: Not spawning in with your memory of bank account at roundstart... +2018-09-29: + Dapocalypse: + - bugfix: Removes extra penlight given to plasmemes. + DarkPyrolord: + - rscadd: Pyro's fluff item + Kyep: + - bugfix: Fixed several bugs with blob, including lateround blobs not generating + biohazard alerts, blobs missing out on early resources they should have, and + a bug with blob storage being broken that prevented blobs getting any resources. + NoWolfie: + - rscadd: New Pyr'kus cult floor and wall sprite. + Triiodine: + - bugfix: Nukies spawning with cybernetic organs/limbs + Ty-Omaha: + - rscdel: Removes canvases due to everybody crashing from them. + farie82: + - tweak: Headbutting the airlock is more consistent. + - bugfix: refactored the airlock code. + - bugfix: Using multitools and such on a door with a note now doesn't remove the + note. Only grabbing with an empty hand now. +2018-09-30: + Purpose: + - bugfix: Fixes various message format overflows. + datlo: + - tweak: Made the poison pen available to traitor librarians + variableundefined: + - bugfix: One click antagonist giving antag to people in restricted job. diff --git a/icons/atmos/vent_scrubber.dmi b/icons/atmos/vent_scrubber.dmi index dadc7215473..c6b6d6ccfe4 100644 Binary files a/icons/atmos/vent_scrubber.dmi and b/icons/atmos/vent_scrubber.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index d229cd65875..160ee13c6d5 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 49679ae2256..7bc8088aa86 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index b4dea0cfa36..7914273740e 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 80131245d13..10badae1648 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/r_kidan.dmi b/icons/mob/human_races/r_kidan.dmi index 0f84cde5dec..c18e965baa4 100644 Binary files a/icons/mob/human_races/r_kidan.dmi and b/icons/mob/human_races/r_kidan.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index e9d610d754d..d7e258376af 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 8bcbf4146d5..653dfd5dfa9 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/species/drask/helmet.dmi b/icons/mob/species/drask/helmet.dmi index b1ffbe8056f..f3c683d8fdf 100644 Binary files a/icons/mob/species/drask/helmet.dmi and b/icons/mob/species/drask/helmet.dmi differ diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi index 96ce0b8bb71..0259f9c9275 100644 Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index 97f3c7626c4..7c7142516cb 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi index 5e6d99b2ae8..0dcd38e5364 100644 Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index 40474762635..a2626a6fb24 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 98454026846..0a6cf3c9787 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index 14b099f3f45..90dd1190e92 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi index 1d0bcf81f27..6e2c3d9836d 100644 Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi index ce0f9c0e548..add8982a149 100644 Binary files a/icons/mob/species/vulpkanin/helmet.dmi and b/icons/mob/species/vulpkanin/helmet.dmi differ diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi index 6245547df30..61d5e4b3b67 100644 Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index b2954c1146d..c12484b28e4 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/suit_fat.dmi b/icons/mob/suit_fat.dmi index 79bed1d0538..1271be5fd54 100644 Binary files a/icons/mob/suit_fat.dmi and b/icons/mob/suit_fat.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 2448f63b0f8..bef18a0ddcc 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi deleted file mode 100644 index 13e8ee5ebea..00000000000 Binary files a/icons/obj/artstuff.dmi and /dev/null differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index 0b4d8509104..5829e3bb7f5 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index 20372528b02..de22e917ddc 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 559a4b3980b..3d3971cb0a3 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index bde66b8b704..6c186e952e9 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties_overlay.dmi b/icons/obj/clothing/ties_overlay.dmi index 37bbfbf5d25..975059bfeeb 100644 Binary files a/icons/obj/clothing/ties_overlay.dmi and b/icons/obj/clothing/ties_overlay.dmi differ diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi index d64a8c576ba..8aaf2291abd 100644 Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ diff --git a/icons/obj/implants.dmi b/icons/obj/implants.dmi index 8dc2f08fdcb..6ab6a2e74bd 100644 Binary files a/icons/obj/implants.dmi and b/icons/obj/implants.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 5714fcf4c9f..4b53ea70f51 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index d5dcc49c0fc..3bbc5618967 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 11e59ff352b..66dbdc88c10 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/paper_icons/large_stamp-rep.png b/icons/paper_icons/large_stamp-rep.png new file mode 100644 index 00000000000..fd02c7dcf72 Binary files /dev/null and b/icons/paper_icons/large_stamp-rep.png differ diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 151b7444519..212c13bbe8c 100644 Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ diff --git a/icons/turf/walls/cult_wall.dmi b/icons/turf/walls/cult_wall.dmi index 47a76ee5cb3..b097321e714 100644 Binary files a/icons/turf/walls/cult_wall.dmi and b/icons/turf/walls/cult_wall.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index eb99b7dd0fd..0aa6636b335 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -78,6 +78,18 @@ to_chat(src, "The GitHub URL is not set in the server configuration.") return +/client/verb/discord() + set name = "Discord" + set desc = "Join our Discord server." + set hidden = 1 + if(config.discordurl) + if(alert("This will invite you to our Discord server. Are you sure?",,"Yes","No")=="No") + return + src << link(config.discordurl) + else + to_chat(src, "The Discord URL is not set in the server configuration.") + return + /client/verb/donate() set name = "Donate" set desc = "Donate to help with hosting costs." diff --git a/interface/skin.dmf b/interface/skin.dmf index 813abc66b98..e7dec18eba4 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1401,69 +1401,92 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Icons" command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false + saved-params = "is-checked" + elem + name = "&Size" + command = "" + category = "&Icons" saved-params = "is-checked" elem "stretch" name = "&Stretch to fit" command = ".winset \"mapwindow.map.icon-size=0\"" - category = "&Icons" + category = "&Size" is-checked = true can-check = true group = "size" - is-disabled = false saved-params = "is-checked" + elem "icon128" + name = "&128x128 (4x)" + command = ".winset \"mapwindow.map.icon-size=128\"" + category = "&Size" + can-check = true + group = "size" + saved-params = "is-checked" elem "icon96" name = "&96x96 (3x)" command = ".winset \"mapwindow.map.icon-size=96\"" - category = "&Icons" - is-checked = false + category = "&Size" can-check = true group = "size" - is-disabled = false saved-params = "is-checked" elem "icon64" name = "&64x64 (2x)" command = ".winset \"mapwindow.map.icon-size=64\"" - category = "&Icons" - is-checked = false + category = "&Size" can-check = true group = "size" - is-disabled = false saved-params = "is-checked" elem "icon48" name = "&48x48 (1.5x)" command = ".winset \"mapwindow.map.icon-size=48\"" - category = "&Icons" - is-checked = false + category = "&Size" can-check = true group = "size" - is-disabled = false saved-params = "is-checked" elem "icon32" name = "&32x32" command = ".winset \"mapwindow.map.icon-size=32\"" - category = "&Icons" - is-checked = false + category = "&Size" can-check = true group = "size" - is-disabled = false + saved-params = "is-checked" + elem + name = "&Scaling" + command = "" + category = "&Icons" + saved-params = "is-checked" + elem "NN" + name = "&Nearest Neighbor" + command = ".winset \"mapwindow.map.zoom-mode=distort\"" + category = "&Scaling" + can-check = true + group = "scale" + saved-params = "is-checked" + elem "PS" + name = "&Point Sampling" + command = ".winset \"mapwindow.map.zoom-mode=normal\"" + category = "&Scaling" + can-check = true + group = "scale" + saved-params = "is-checked" + elem "BL" + name = "&Bilinear" + command = ".winset \"mapwindow.map.zoom-mode=blur\"" + category = "&Scaling" + can-check = true + group = "scale" saved-params = "is-checked" elem "textmode" name = "&Text" command = ".winset \"menu.textmode.is-checked=true?mapwindow.map.text-mode=true:mapwindow.map.text-mode=false\"" category = "&Icons" - is-checked = false can-check = true group = "" - is-disabled = false saved-params = "is-checked" + elem name = "&Help" command = "" @@ -1674,18 +1697,29 @@ window "rpane" size = 67x16 text = "Changelog" command = "Changelog" - elem "karma" + elem "discordb" type = BUTTON pos = 487,0 - size = 67x16 + size = 60x16 + background-color = #7289DA + text-color = #FFFFFF + font-style = bold + text = "Discord" + command = "discord" + elem "karma" + type = BUTTON + pos = 552,0 + size = 77x16 background-color = #ff8040 + font-style = bold text = "Karma Shop" command = "karmashop" elem "donate" type = BUTTON - pos = 559,0 + pos = 634,0 size = 60x16 - background-color = #8080ff + background-color = #008000 + font-style = bold text = "Donate" command = "Donate" elem "browseb" diff --git a/nano/images/Cyberiad_nanomap_z1.png b/nano/images/Cyberiad_nanomap_z1.png index da0c53c8d50..3e1469e2a95 100644 Binary files a/nano/images/Cyberiad_nanomap_z1.png and b/nano/images/Cyberiad_nanomap_z1.png differ diff --git a/nano/templates/dna_modifier.tmpl b/nano/templates/dna_modifier.tmpl index 59353ff677a..2789a4a7881 100644 --- a/nano/templates/dna_modifier.tmpl +++ b/nano/templates/dna_modifier.tmpl @@ -45,104 +45,158 @@ Used In File(s): D:\Development\SS13-BS12\code\game\dna\dna_modifier.dm
      {{:data.occupant.uniqueEnzymes ? data.occupant.uniqueEnzymes : 'Unknown'}}
    - {{/if}} {{/if}}
    -

    Operations

    -
    - {{:helper.link('Modify U.I.', 'link', {'selectMenuKey' : 'ui'}, data.selectedMenuKey == 'ui' ? 'selected' : null)}} - {{:helper.link('Modify S.E.', 'link', {'selectMenuKey' : 'se'}, data.selectedMenuKey == 'se' ? 'selected' : null)}} - {{:helper.link('Transfer Buffers', 'floppy-o', {'selectMenuKey' : 'buffer'}, data.selectedMenuKey == 'buffer' ? 'selected' : null)}} - {{:helper.link('Rejuvenators', 'plus', {'selectMenuKey' : 'rejuvenators'}, data.selectedMenuKey == 'rejuvenators' ? 'selected' : null)}} -
    - -
     
    - -{{if !data.selectedMenuKey || data.selectedMenuKey == 'ui'}} -

    Modify Unique Identifier

    - {{:helper.displayDNABlocks(data.occupant.uniqueIdentity, data.selectedUIBlock, data.selectedUISubBlock, data.dnaBlockSize, 'UI')}} -
    +

    Operations

    + {{if !data.occupant.isViableSubject || !data.occupant.uniqueIdentity || !data.occupant.structuralEnzymes}} +
    + No operation possible on this subject +
    + {{else}}
    -
    - Target: -
    -
    - {{:helper.link('-', null, {'changeUITarget' : 0}, (data.selectedUITarget > 0) ? null : 'disabled')}} -
     {{:data.selectedUITargetHex}} 
    - {{:helper.link('+', null, {'changeUITarget' : 1}, (data.selectedUITarget < 15) ? null : 'disabled')}} -
    + {{:helper.link('Modify U.I.', 'link', {'selectMenuKey' : 'ui'}, data.selectedMenuKey == 'ui' ? 'selected' : null)}} + {{:helper.link('Modify S.E.', 'link', {'selectMenuKey' : 'se'}, data.selectedMenuKey == 'se' ? 'selected' : null)}} + {{:helper.link('Transfer Buffers', 'floppy-o', {'selectMenuKey' : 'buffer'}, data.selectedMenuKey == 'buffer' ? 'selected' : null)}} + {{:helper.link('Rejuvenators', 'plus', {'selectMenuKey' : 'rejuvenators'}, data.selectedMenuKey == 'rejuvenators' ? 'selected' : null)}}
    -
    -
    - {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseUIRadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} + +
     
    + + {{if !data.selectedMenuKey || data.selectedMenuKey == 'ui'}} +

    Modify Unique Identifier

    + {{:helper.displayDNABlocks(data.occupant.uniqueIdentity, data.selectedUIBlock, data.selectedUISubBlock, data.dnaBlockSize, 'UI')}} +
    +
    +
    + Target: +
    +
    + {{:helper.link('-', null, {'changeUITarget' : 0}, (data.selectedUITarget > 0) ? null : 'disabled')}} +
     {{:data.selectedUITargetHex}} 
    + {{:helper.link('+', null, {'changeUITarget' : 1}, (data.selectedUITarget < 15) ? null : 'disabled')}} +
    -
    -{{else data.selectedMenuKey == 'se'}} -

    Modify Structural Enzymes

    - {{:helper.displayDNABlocks(data.occupant.structuralEnzymes, data.selectedSEBlock, data.selectedSESubBlock, data.dnaBlockSize, 'SE')}} -
    -
    -
    - {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseSERadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} +
    +
    + {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseUIRadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} +
    -
    -{{else data.selectedMenuKey == 'buffer'}} -

    Transfer Buffers

    - {{for data.buffers}} -

    Buffer {{:(index + 1)}}

    -
    -
    -
    - Load Data: + {{else data.selectedMenuKey == 'se'}} +

    Modify Structural Enzymes

    + {{:helper.displayDNABlocks(data.occupant.structuralEnzymes, data.selectedSEBlock, data.selectedSESubBlock, data.dnaBlockSize, 'SE')}} +
    +
    +
    + {{:helper.link('Irradiate Block', 'exclamation-circle', {'pulseSERadiation' : 1}, !data.occupant.isViableSubject ? 'disabled' : null)}} +
    +
    + {{else data.selectedMenuKey == 'buffer'}} +

    Transfer Buffers

    + {{for data.buffers}} +

    Buffer {{:(index + 1)}}

    +
    +
    +
    + Load Data: +
    +
    + {{:helper.link('Subject U.I.', 'link', {'bufferOption' : 'saveUI', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} + {{:helper.link('Subject U.I. + U.E.', 'link', {'bufferOption' : 'saveUIAndUE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} + {{:helper.link('Subject S.E.', 'link', {'bufferOption' : 'saveSE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} + {{:helper.link('From Disk', 'floppy-o', {'bufferOption' : 'loadDisk', 'bufferId' : (index + 1)}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} +
    -
    - {{:helper.link('Subject U.I.', 'link', {'bufferOption' : 'saveUI', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} - {{:helper.link('Subject U.I. + U.E.', 'link', {'bufferOption' : 'saveUIAndUE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} - {{:helper.link('Subject S.E.', 'link', {'bufferOption' : 'saveSE', 'bufferId' : (index + 1)}, !data.hasOccupant ? 'disabled' : null)}} - {{:helper.link('From Disk', 'floppy-o', {'bufferOption' : 'loadDisk', 'bufferId' : (index + 1)}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} + {{if value.data}} +
    +
    + Label: +
    +
    + {{:helper.link(value.label, 'file', {'bufferOption' : 'changeLabel', 'bufferId' : (index + 1)})}} +
    +
    +
    +
    + Subject: +
    +
    + {{:value.owner ? value.owner : 'Unknown'}} +
    +
    +
    +
    + Stored Data: +
    +
    + {{:value.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} + {{:value.ue ? ' + Unique Enzymes' : ''}} +
    +
    + {{else}} +
    +
    + This buffer is empty. +
    +
    + {{/if}} +
    +
    + Options: +
    +
    + {{:helper.link('Clear', 'trash', {'bufferOption' : 'clear', 'bufferId' : (index + 1)}, !value.data ? 'disabled' : null)}} + {{:helper.link('Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1)}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} + {{:helper.link('Block Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1), 'createBlockInjector' : 1}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} + {{:helper.link('Transfer', 'exclamation-circle', {'bufferOption' : 'transfer', 'bufferId' : (index + 1)}, (!data.hasOccupant || !value.data) ? 'disabled' : null)}} + {{:helper.link('Save To Disk', 'floppy-o', {'bufferOption' : 'saveDisk', 'bufferId' : (index + 1)}, (!value.data || !data.hasDisk) ? 'disabled' : null)}} +
    - {{if value.data}} -
    -
    - Label: + {{/for}} + +

    Data Disk

    +
    + {{if data.hasDisk}} + {{if data.disk.data}} +
    +
    + Label: +
    +
    + {{:data.disk.label ? data.disk.label : 'No Label'}} +
    -
    - {{:helper.link(value.label, 'file', {'bufferOption' : 'changeLabel', 'bufferId' : (index + 1)})}} +
    +
    + Subject: +
    +
    + {{:data.disk.owner ? data.disk.owner : 'Unknown'}} +
    -
    -
    -
    - Subject: +
    +
    + Stored Data: +
    +
    + {{:data.disk.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} + {{:data.disk.ue ? ' + Unique Enzymes' : ''}} +
    -
    - {{:value.owner ? value.owner : 'Unknown'}} + {{else}} +
    +
    + Disk is blank. +
    -
    -
    -
    - Stored Data: -
    -
    - {{:value.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} - {{:value.ue ? ' + Unique Enzymes' : ''}} -
    -
    + {{/if}} {{else}}
    - This buffer is empty. + No disk inserted.
    {{/if}} @@ -151,140 +205,82 @@ Used In File(s): D:\Development\SS13-BS12\code\game\dna\dna_modifier.dm Options:
    - {{:helper.link('Clear', 'trash', {'bufferOption' : 'clear', 'bufferId' : (index + 1)}, !value.data ? 'disabled' : null)}} - {{:helper.link('Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1)}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} - {{:helper.link('Block Injector', data.isInjectorReady ? 'pencil' : 'clock-o', {'bufferOption' : 'createInjector', 'bufferId' : (index + 1), 'createBlockInjector' : 1}, (!data.isInjectorReady || !value.data) ? 'disabled' : null)}} - {{:helper.link('Transfer', 'exclamation-circle', {'bufferOption' : 'transfer', 'bufferId' : (index + 1)}, (!data.hasOccupant || !value.data) ? 'disabled' : null)}} - {{:helper.link('Save To Disk', 'floppy-o', {'bufferOption' : 'saveDisk', 'bufferId' : (index + 1)}, (!value.data || !data.hasDisk) ? 'disabled' : null)}} + {{:helper.link('Wipe Disk', 'trash', {'bufferOption' : 'wipeDisk'}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} + {{:helper.link('Eject Disk', 'eject', {'bufferOption' : 'ejectDisk'}, !data.hasDisk ? 'disabled' : null)}}
    - {{/for}} - -

    Data Disk

    -
    - {{if data.hasDisk}} - {{if data.disk.data}} -
    -
    - Label: -
    -
    - {{:data.disk.label ? data.disk.label : 'No Label'}} -
    -
    -
    -
    - Subject: -
    -
    - {{:data.disk.owner ? data.disk.owner : 'Unknown'}} -
    -
    -
    -
    - Stored Data: -
    -
    - {{:data.disk.data == 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}} - {{:data.disk.ue ? ' + Unique Enzymes' : ''}} -
    -
    - {{else}} -
    -
    - Disk is blank. -
    -
    - {{/if}} - {{else}} -
    -
    - No disk inserted. -
    -
    - {{/if}} + {{else data.selectedMenuKey == 'rejuvenators'}} +

    Rejuvenators

    - Options: + Inject:
    - {{:helper.link('Wipe Disk', 'trash', {'bufferOption' : 'wipeDisk'}, (!data.hasDisk || !data.disk.data) ? 'disabled' : null)}} - {{:helper.link('Eject Disk', 'eject', {'bufferOption' : 'ejectDisk'}, !data.hasDisk ? 'disabled' : null)}} + {{:helper.link('5', 'pencil', {'injectRejuvenators' : 5}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('10', 'pencil', {'injectRejuvenators' : 10}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('20', 'pencil', {'injectRejuvenators' : 20}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('30', 'pencil', {'injectRejuvenators' : 30}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} + {{:helper.link('50', 'pencil', {'injectRejuvenators' : 50}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}}
    -
    -{{else data.selectedMenuKey == 'rejuvenators'}} -

    Rejuvenators

    -
    -
    - Inject: -
    -
    - {{:helper.link('5', 'pencil', {'injectRejuvenators' : 5}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('10', 'pencil', {'injectRejuvenators' : 10}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('20', 'pencil', {'injectRejuvenators' : 20}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('30', 'pencil', {'injectRejuvenators' : 30}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} - {{:helper.link('50', 'pencil', {'injectRejuvenators' : 50}, (!data.hasOccupant || !data.beakerVolume) ? 'disabled' : null)}} -
    -
    -
     
    -
    -
    - Beaker: -
    -
    - {{if data.isBeakerLoaded}} - {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
    - {{if data.beakerVolume}} - {{:data.beakerVolume}} units remaining
    +
     
    +
    +
    + Beaker: +
    +
    + {{if data.isBeakerLoaded}} + {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
    + {{if data.beakerVolume}} + {{:data.beakerVolume}} units remaining
    + {{else}} + Beaker is empty + {{/if}} {{else}} - Beaker is empty + No beaker loaded {{/if}} - {{else}} - No beaker loaded - {{/if}} +
    +
    + {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
    -
    - {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{/if}} + +
     
    + + {{if !data.selectedMenuKey || data.selectedMenuKey == 'ui' || data.selectedMenuKey == 'se'}} +

    Radiation Emitter Settings

    +
    +
    + Intensity: +
    +
    + {{:helper.link('-', null, {'radiationIntensity' : 0}, (data.radiationIntensity > 1) ? null : 'disabled')}} +
     {{:data.radiationIntensity}} 
    + {{:helper.link('+', null, {'radiationIntensity' : 1}, (data.radiationIntensity < 10) ? null : 'disabled')}} +
    -
    +
    +
    + Duration: +
    +
    + {{:helper.link('-', null, {'radiationDuration' : 0}, (data.radiationDuration > 2) ? null : 'disabled')}} +
     {{:data.radiationDuration}} 
    + {{:helper.link('+', null, {'radiationDuration' : 1}, (data.radiationDuration < 20) ? null : 'disabled')}} +
    +
    +
    +
    +   +
    +
    + {{:helper.link('Pulse Radiation', 'exclamation-circle', {'pulseRadiation' : 1}, !data.hasOccupant ? 'disabled' : null)}} +
    +
    + {{/if}} {{/if}} - -
     
    - -{{if !data.selectedMenuKey || data.selectedMenuKey == 'ui' || data.selectedMenuKey == 'se'}} -

    Radiation Emitter Settings

    -
    -
    - Intensity: -
    -
    - {{:helper.link('-', null, {'radiationIntensity' : 0}, (data.radiationIntensity > 1) ? null : 'disabled')}} -
     {{:data.radiationIntensity}} 
    - {{:helper.link('+', null, {'radiationIntensity' : 1}, (data.radiationIntensity < 10) ? null : 'disabled')}} -
    -
    -
    -
    - Duration: -
    -
    - {{:helper.link('-', null, {'radiationDuration' : 0}, (data.radiationDuration > 2) ? null : 'disabled')}} -
     {{:data.radiationDuration}} 
    - {{:helper.link('+', null, {'radiationDuration' : 1}, (data.radiationDuration < 20) ? null : 'disabled')}} -
    -
    -
    -
    -   -
    -
    - {{:helper.link('Pulse Radiation', 'exclamation-circle', {'pulseRadiation' : 1}, !data.hasOccupant ? 'disabled' : null)}} -
    -
    -{{/if}} -
     

    @@ -315,4 +311,3 @@ Used In File(s): D:\Development\SS13-BS12\code\game\dna\dna_modifier.dm
    {{/if}} - diff --git a/nano/templates/eftpos.tmpl b/nano/templates/eftpos.tmpl index 663f665d7f9..15f6aae465e 100644 --- a/nano/templates/eftpos.tmpl +++ b/nano/templates/eftpos.tmpl @@ -1,23 +1,22 @@ - -

    {{:data.eftpos_name}}

    -This terminal is {{:data.machine_id}}. Report this code when contacting Nanotrasen IT Support
    +This terminal is {{:data.machine_name}}. Report this code when contacting Nanotrasen IT Support
    {{if data.transaction_locked == 1}}
    {{:helper.link(data.transaction_paid ? 'Reset' : 'Reset (authentication required)', 'unlock', {'choice' : 'toggle_lock'})}}

    -
    Transaction purpose:
    +
    Transaction purpose:
    {{:data.transaction_purpose}}
    - +
    -
    Value:
    +
    Value:
    {{:data.transaction_amount}}
    - +
    Linked account:
    {{:data.linked_account ? data.linked_account : 'None'}}
    @@ -33,15 +32,15 @@ Used In File(s): /code/modules/economy/EFTPOS.dm
    {{:helper.link('Lock in new transaction', 'lock', {'choice' : 'toggle_lock'})}}

    -
    Transaction purpose:
    +
    Transaction purpose:
    {{:helper.link(data.transaction_purpose, 'info', {'choice' : 'trans_purpose'})}}
    - +
    -
    Value:
    +
    Value:
    {{:helper.link(data.transaction_amount, 'usd', {'choice' : 'trans_value'})}}
    - +
    Linked account:
    {{:helper.link(data.linked_account ? data.linked_account : 'None', data.linked_account ? 'user' : 'user-times', {'choice' : 'link_account'})}}
    @@ -49,7 +48,6 @@ Used In File(s): /code/modules/economy/EFTPOS.dm
    {{:helper.link('Change access code', 'key', {'choice' : 'change_code'})}}
    -
    {{:helper.link('Change EFTPOS ID', 'pencil', {'choice' : 'change_id'})}}
    {{:helper.link('Scan card to reset acess code', 'refresh', {'choice' : 'reset'})}}
    -{{/if}} \ No newline at end of file +{{/if}} diff --git a/nano/templates/secure_data.tmpl b/nano/templates/secure_data.tmpl index bba32023a7f..e3e285013c5 100644 --- a/nano/templates/secure_data.tmpl +++ b/nano/templates/secure_data.tmpl @@ -93,7 +93,7 @@ Used In File(s): \code\game\machinery\computer\security.dm {{:helper.link('ID', null, {'sort' : 'id'}, null, 'infoButton')}} {{:helper.link('Rank', null, {'sort' : 'rank'}, null, 'infoButton')}} {{:helper.link('Fingerprints', null, {'sort' : 'fingerprint'}, null, 'infoButton')}} - {{:helper.link('Criminal Status', null, {'sort' : 'name'}, null, 'infoButton')}} + {{:helper.link('Criminal Status', null, {'sort' : 'crimstat'}, null, 'infoButton')}} @@ -231,4 +231,4 @@ Used In File(s): \code\game\machinery\computer\security.dm
    -{{/if}} \ No newline at end of file +{{/if}} diff --git a/nano/templates/song.tmpl b/nano/templates/song.tmpl index 4b4d6669b8f..28ccae0c923 100644 --- a/nano/templates/song.tmpl +++ b/nano/templates/song.tmpl @@ -68,7 +68,7 @@ Used In File(s): \code\game\objects\structures\musician.dm By default, every note is natural and in octave 3. Defining a different state for either is remembered for each note.
    • Example: C,D,E,F,G,A,B will play a C major scale.
    • -
    • After a note has an accidental or octave placed, it will be remembered: C,C4,C#,C3 is C3,C4,C4#,C3#
    • +
    • After a note has an accidental or octave placed, it will be remembered: C,C4,C#,C3 is C3,C4,C4#,C3#

    diff --git a/nano/templates/uplink.tmpl b/nano/templates/uplink.tmpl index d6dcec8d05f..6177ab016a7 100644 --- a/nano/templates/uplink.tmpl +++ b/nano/templates/uplink.tmpl @@ -1,5 +1,5 @@ - @@ -40,7 +40,7 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm

    {{:helper.link( itemValue.Name, 'gear', {'buy_item' : itemValue.obj_path, 'cost' : itemValue.Cost}, itemValue.Cost > data.crystals ? 'disabled' : null, null)}} - {{:itemValue.Cost}}
    - + {{if itemValue.Cost <= data.crystals && data.descriptions}}
    {{:itemValue.Description}} @@ -53,7 +53,11 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
    {{:helper.link('Buy Random (??)' , 'gear', {'buy_item' : 'random'}, data.crystals <= 0 ? 'disabled' : null, null)}}
    - + +
    + {{:helper.link('Refund item in active hand' , 'gear', {refund : 1}, null, null)}} +
    + {{else data.menu == 1}}

    Information Record List:


    @@ -66,7 +70,7 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm {{:helper.link(value.Name, 'gear', {'menu' : 11, 'id' : value.id}, null, null)}}
    {{/for}} - + {{else data.menu == 11}}

    Information Record:


    diff --git a/paradise.dme b/paradise.dme index 70eaa50867a..1bc43410f66 100644 --- a/paradise.dme +++ b/paradise.dme @@ -777,6 +777,7 @@ #include "code\game\objects\items\flag.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\misc.dm" +#include "code\game\objects\items\mixing_bowl.dm" #include "code\game\objects\items\random_items.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\toys.dm" @@ -814,6 +815,7 @@ #include "code\game\objects\items\mountable_frames\air_alarm.dm" #include "code\game\objects\items\mountable_frames\apc_frame.dm" #include "code\game\objects\items\mountable_frames\buttons_switches.dm" +#include "code\game\objects\items\mountable_frames\extinguisher_frame.dm" #include "code\game\objects\items\mountable_frames\fire_alarm.dm" #include "code\game\objects\items\mountable_frames\frames.dm" #include "code\game\objects\items\mountable_frames\intercom.dm" @@ -952,7 +954,6 @@ #include "code\game\objects\items\weapons\tanks\watertank.dm" #include "code\game\objects\random\random.dm" #include "code\game\objects\structures\aliens.dm" -#include "code\game\objects\structures\artstuff.dm" #include "code\game\objects\structures\barsign.dm" #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\coathanger.dm" @@ -1193,7 +1194,6 @@ #include "code\modules\awaymissions\zvis.dm" #include "code\modules\awaymissions\maploader\dmm_suite.dm" #include "code\modules\awaymissions\maploader\reader.dm" -#include "code\modules\awaymissions\maploader\swapmaps.dm" #include "code\modules\awaymissions\maploader\writer.dm" #include "code\modules\awaymissions\mission_code\academy.dm" #include "code\modules\awaymissions\mission_code\beach.dm" diff --git a/tools/icon_merge_tool/icon_merge_tool.py b/tools/icon_merge_tool/icon_merge_tool.py index 8cfd701d8bb..aa8931c30e4 100644 --- a/tools/icon_merge_tool/icon_merge_tool.py +++ b/tools/icon_merge_tool/icon_merge_tool.py @@ -60,7 +60,7 @@ def main(relative_root): path = icon_conflicts[i] print("{}: {}".format("Merging", path)) - common_ancestor_hash = run_shell_command("git merge-base ORIG_HEAD master").strip() + common_ancestor_hash = run_shell_command("git merge-base MERGE_HEAD HEAD").strip() ours_icon = NamedTemporaryFile(delete=False) theirs_icon = NamedTemporaryFile(delete=False)