From 329ba4d823d4c4311f1c359a5261a61215bb94ff Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 17 Jul 2020 12:53:43 -0700 Subject: [PATCH 01/85] Update gas_mixture.dm --- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 7af823e8a9..d4f571af6b 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -43,6 +43,11 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) var/list/dummy = get_gases() for(var/gas in dummy) dummy[gas] = get_moles(gas) + dummy["TEMP"] = return_temperature() + dummy["PRESSURE"] = return_pressure() + dummy["HEAT CAPACITY"] = heat_capacity() + dummy["TOTAL MOLES"] = total_moles() + dummy["VOLUME"] = return_volume() return debug_variable("gases (READ ONLY)", dummy, 0, src) /datum/gas_mixture/vv_get_dropdown() From f1abe0651bc0b81a08899e81dcbb9468177e90af Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 17 Jul 2020 12:54:48 -0700 Subject: [PATCH 02/85] Update gas_mixture.dm --- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index d4f571af6b..069a91ce13 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -48,6 +48,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) dummy["HEAT CAPACITY"] = heat_capacity() dummy["TOTAL MOLES"] = total_moles() dummy["VOLUME"] = return_volume() + dummy["THERMAL ENERGY"] = themral_energy() return debug_variable("gases (READ ONLY)", dummy, 0, src) /datum/gas_mixture/vv_get_dropdown() From 20381927e4177d35d5facc240bb9fd6ea6957725 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sat, 18 Jul 2020 19:18:42 -0700 Subject: [PATCH 03/85] Update projectile.dm --- code/modules/projectiles/projectile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7c988ca730..d0c8a1e8d6 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -49,7 +49,7 @@ var/pixel_move_interrupted = FALSE /// Pixels moved per second. - var/pixels_per_second = TILES_TO_PIXELS(12.5) + var/pixels_per_second = TILES_TO_PIXELS(17.5) /// The number of pixels we increment by. THIS IS NOT SPEED, DO NOT TOUCH THIS UNLESS YOU KNOW WHAT YOU ARE DOING. In general, lower values means more linetrace accuracy up to a point at cost of performance. var/pixel_increment_amount From 512174b782c156a0a976708f0beef5f8b8d282b9 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 19 Jul 2020 20:07:16 -0700 Subject: [PATCH 04/85] Update subsystems.dm --- code/__DEFINES/subsystems.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index bf76f8a523..4792f16ef3 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -152,11 +152,11 @@ var/list/po = A.priority_overlays;\ if(LAZYLEN(rm)){\ A.overlays -= rm;\ - rm.Cut();\ + rm = null;\ }\ if(LAZYLEN(ad)){\ A.overlays |= ad;\ - ad.Cut();\ + ad = null;\ }\ if(LAZYLEN(po)){\ A.overlays |= po;\ From 6ac765eca5d492427181c04b457e20eba6202b3c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 19 Jul 2020 20:08:56 -0700 Subject: [PATCH 05/85] Update subsystems.dm --- code/__DEFINES/subsystems.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 4792f16ef3..88f34e7080 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -161,5 +161,8 @@ if(LAZYLEN(po)){\ A.overlays |= po;\ }\ + else{\ + A.priority_overlays = null;\ + }\ A.flags_1 &= ~OVERLAY_QUEUED_1;\ } From 5c189b310e95159beb9257c6ee5a58ed5c18cc9b Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 20 Jul 2020 15:43:48 -0700 Subject: [PATCH 06/85] ok, snaxi --- code/modules/power/apc.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 19e32bae0b..3f9ca4f1b7 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -935,6 +935,9 @@ return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])" /obj/machinery/power/apc/proc/update() + var/old_light = area.power_light + var/old_equip = area.power_equip + var/old_environ = area.power_environ if(operating && !shorted && !failure_timer) area.power_light = (lighting > 1) area.power_equip = (equipment > 1) @@ -943,7 +946,8 @@ area.power_light = FALSE area.power_equip = FALSE area.power_environ = FALSE - area.power_change() + if(old_light != area.power_light || old_equip != area.power_equip || old_environ != area.power_environ) + area.power_change() /obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic() if(IsAdminGhost(user)) From 944a91e44dd179a4c7f6df2aba5d3b3569303135 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 20 Jul 2020 15:55:41 -0700 Subject: [PATCH 07/85] Update subsystems.dm --- code/__DEFINES/subsystems.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 88f34e7080..a6bd7a1c8e 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -152,11 +152,11 @@ var/list/po = A.priority_overlays;\ if(LAZYLEN(rm)){\ A.overlays -= rm;\ - rm = null;\ + A.remove_overlays = null;\ }\ if(LAZYLEN(ad)){\ A.overlays |= ad;\ - ad = null;\ + A.add_overlays = null;\ }\ if(LAZYLEN(po)){\ A.overlays |= po;\ From 6e08865b367406e10e5442f6a3ae3f64dd97ff98 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 20 Jul 2020 17:30:35 -0700 Subject: [PATCH 08/85] Update topic.dm --- code/modules/admin/topic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 042a6e0fe9..1e3d1e93e3 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -863,7 +863,7 @@ if(jobban_isbanned(M, ROLE_TRAITOR) || isbanned_dept) dat += "Traitor" else - dat += "Traitor" + dat += "Traitor" //Changeling if(jobban_isbanned(M, ROLE_CHANGELING) || isbanned_dept) From 3e0403a7e996c5d5d1afa69b244785eb7f39d836 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 02:22:42 +0100 Subject: [PATCH 09/85] BEEPSKY FASHION --- code/datums/beepsky_fashion.dm | 75 ++++++++++++++++ code/datums/dog_fashion.dm | 2 - code/modules/clothing/head/_head.dm | 1 + code/modules/clothing/head/collectable.dm | 1 + code/modules/clothing/suits/wiz_robe.dm | 1 + .../mob/living/simple_animal/bot/secbot.dm | 80 ++++++++++++++++-- icons/mob/secbot_head.dmi | Bin 0 -> 364 bytes tgstation.dme | 1 + 8 files changed, 152 insertions(+), 9 deletions(-) create mode 100644 code/datums/beepsky_fashion.dm create mode 100644 icons/mob/secbot_head.dmi diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm new file mode 100644 index 0000000000..d9de8e6d7f --- /dev/null +++ b/code/datums/beepsky_fashion.dm @@ -0,0 +1,75 @@ +//similar to dog_fashion, but for beepsky, who has far more refined fashion tastes +/datum/beepsky_fashion + var/name + var/desc + + var/icon_file = 'icons/mob/secbot_head.dmi' + var/obj_icon_state + var/obj_alpha + var/obj_color + + //emotes + var/death_emote + var/capture_one + var/capture_two + var/infraction + var/taunt + var/attack_one + var/attack_two + +/datum/beepsky_fashion/proc/get_overlay(var/dir) + if(icon_file && obj_icon_state) + var/image/beepsky_overlay = image(icon_file, obj_icon_state, dir = dir) + beepsky_overlay.alpha = obj_alpha + beepsky_overlay.color = obj_color + return beepsky_overlay + +/datum/beepsky_fashion/proc/apply(mob/living/simple_animal/bot/secbot/beepers) //set the emote depending on the fashion datum, if nothing set, turn it back to how it was initially + //assume name and description is always set, because otherwise, what would be the point of beepsky fashion? + src.name = name + src.desc = desc + if(death_emote) + beepers.death_emote = death_emote + else + beepers.death_emote = initial(beepers.death_emote) + + if(capture_one) + beepers.capture_one = capture_one + else + beepers.capture_one = initial(beepers.capture_one) + + if(capture_two) + beepers.capture_two = capture_two + else + beepers.capture_two = initial(beepers.capture_two) + + if(infraction) + beepers.infraction = infraction + else + beepers.infraction = initial(beepers.infraction) + + if(infraction) + beepers.taunt = taunt + else + beepers.taunt = initial(beepers.taunt) + + if(attack_one) + beepers.attack_one = attack_one + else + beepers.attack_one = initial(beepers.attack_one) + + if(attack_two) + beepers.attack_two = attack_two + else + beepers.attack_two = initial(beepers.attack_two) + +//actual fashions from here on out +/datum/beepsky_fashion/wizard + name = "Archmage Beepsky" + desc = "A secbot stolen from the wizard federation." + death_emote = "BOT casts EI NATH on themselves!" + capture_one = "BOT is casting cable ties on CRIMINAL!" + capture_two = "BOT is casting cable ties on you!" + infraction = "Magical disturbance of magnitude THREAT_LEVEL detected!" + attack_one = "BOT casts magic missile on CRIMINAL!" + attack_two = "BOT casts magic missile on you!" diff --git a/code/datums/dog_fashion.dm b/code/datums/dog_fashion.dm index 744f57c391..2e80feac67 100644 --- a/code/datums/dog_fashion.dm +++ b/code/datums/dog_fashion.dm @@ -38,7 +38,6 @@ corgI.color = obj_color return corgI - /datum/dog_fashion/head icon_file = 'icons/mob/corgi_head.dmi' @@ -53,7 +52,6 @@ name = "Sous chef REAL_NAME" desc = "Your food will be taste-tested. All of it." - /datum/dog_fashion/head/captain name = "Captain REAL_NAME" desc = "Probably better than the last captain." diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 475e7a4e51..0854d9c270 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -8,6 +8,7 @@ var/blockTracking = 0 //For AI tracking var/can_toggle = null dynamic_hair_suffix = "+generic" + var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this hat to a secbot /obj/item/clothing/head/Initialize() . = ..() diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 314142d0cc..71b3e2e144 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -116,6 +116,7 @@ icon_state = "wizard" dog_fashion = /datum/dog_fashion/head/blue_wizard + beepsky_fashion = /datum/beepsky_fashion/wizard /obj/item/clothing/head/collectable/hardhat name = "collectable hard hat" diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 047dc7b7a3..c513168e47 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -9,6 +9,7 @@ equip_delay_other = 50 resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = /datum/dog_fashion/head/blue_wizard + beepsky_fashion = /datum/beepsky_fashion/wizard var/magic_flags = SPELL_WIZARD_HAT /obj/item/clothing/head/wizard/ComponentInitialize() diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index cfff3eb751..669828a0e9 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -33,6 +33,17 @@ var/check_records = TRUE //Does it check security records? var/arrest_type = FALSE //If true, don't handcuff + var/obj/item/clothing/head/bot_hat + + //emotes (BOT is replaced with bot name, CRIMINAL with criminal name, THREAT_LEVEL with threat level) + var/death_emote = "BOT blows apart!" + var/capture_one = "BOT is trying to put zipties on CRIMINAL!" + var/capture_two = "BOT is trying to put zipties on you!" + var/infraction = "Level THREAT_LEVEL infraction alert!" + var/taunt = "BOT points at CRIMINAL!" + var/attack_one = "BOT has stunned CRIMINAL!" + var/attack_two = "BOT has stunned you!" + /mob/living/simple_animal/bot/secbot/beepsky name = "Officer Beep O'sky" desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." @@ -49,6 +60,34 @@ resize = 0.8 update_transform() +/mob/living/simple_animal/bot/secbot/proc/process_emote(var/emote_type, var/atom/criminal, var/threat) + var/emote = "The continuity of space itself collapses around [src]. You should probably report that to someone higher up." + switch(emote_type) + if("DEATH") + emote = death_emote + if("CAPTURE_ONE") + emote = capture_one + if("CAPTURE_TWO") + emote = capture_two + if("INFRACTION") + emote = infraction + if("TAUNT") + emote = taunt + if("ATTACK_PME") + emote = attack_one + if("ATTACK_TWO") + emote = attack_two + + //now replace pieces of the text with the information we have + if(!taunt) + emote = replacetext(emote, "BOT", name) + else + emote = replacetext(emote, "BOT", "[name]") //needs to be bold if its a taunt + if(criminal) + emote = replacetext(emote, "CRIMINAL", criminal.name) + if(threat) + emote = replacetext(emote, "THREAT_LEVEL", threat) + return emote /mob/living/simple_animal/bot/secbot/beepsky/explode() var/atom/Tsec = drop_location() @@ -185,11 +224,38 @@ Auto Patrol: []"}, ..() if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return + if(istype(W, /obj/item/clothing/head)) + attempt_place_on_head(user, W) + return if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. retaliate(user) if(special_retaliate_after_attack(user)) return +/mob/living/simple_animal/bot/secbot/proc/attempt_place_on_head(mob/user, obj/item/clothing/head/H) + if(user && !user.temporarilyRemoveItemFromInventory(H)) + to_chat(user, "\The [H] is stuck to your hand, you cannot put it on [src]'s head!") + return + if(bot_hat) + to_chat("\[src] already has a hat, and the laws of physics disallow him from wearing a second!") + if(H.beepsky_fashion) + bot_hat = H + H.forceMove(src) + else + to_chat(user, "You set [H] on [src]'s head, but it falls off!") + H.forceMove(drop_location()) + +/mob/living/simple_animal/bot/secbot/proc/update_beepsky_fluff() + var/datum/beepsky_fashion/BF = new bot_hat.beepsky_fashion + if(BF) + BF.apply(src) + +/mob/living/simple_animal/bot/secbot/regenerate_icons() + ..() + if(bot_hat) + update_beepsky_fluff() + add_overlay(bot_hat.beepsky_fashion.get_overlay()) + /mob/living/simple_animal/bot/secbot/emag_act(mob/user) . = ..() if(emagged == 2) @@ -233,8 +299,8 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/proc/cuff(mob/living/carbon/C) mode = BOT_ARREST playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) - C.visible_message("[src] is trying to put zipties on [C]!",\ - "[src] is trying to put zipties on you!") + C.visible_message("[process_emote("CAPTURE_ONE", C)]",\ + "[process_emote("CAPTURE_TWO", C)]") if(do_after(src, 60, FALSE, C)) attempt_handcuff(C) @@ -267,8 +333,8 @@ Auto Patrol: []"}, if(declare_arrests) var/area/location = get_area(src) speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel) - C.visible_message("[src] has stunned [C]!",\ - "[src] has stunned you!") + C.visible_message("[process_emote("ATTACK_ONE", C)]",\ + "[process_emote("ATTACK_TWO", C)]") /mob/living/simple_animal/bot/secbot/handle_automated_action() if(!..()) @@ -391,9 +457,9 @@ Auto Patrol: []"}, else if(threatlevel >= 4) target = C oldtarget_name = C.name - speak("Level [threatlevel] infraction alert!") + speak(process_emote("INFRACTION", target, threatlevel)) playsound(loc, pick('sound/voice/beepsky/criminal.ogg', 'sound/voice/beepsky/justice.ogg', 'sound/voice/beepsky/freeze.ogg'), 50, FALSE) - visible_message("[src] points at [C.name]!") + visible_message(process_emote("TAUNT", target, threatlevel)) mode = BOT_HUNT INVOKE_ASYNC(src, .proc/handle_automated_action) break @@ -408,7 +474,7 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/explode() walk_to(src,0) - visible_message("[src] blows apart!") + visible_message("[process_emote("DEATH")]") var/atom/Tsec = drop_location() var/obj/item/bot_assembly/secbot/Sa = new (Tsec) diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_head.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2a246b8e42281de745b6e6f33e38fb98f88ee343 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|ep#Yx{*8>L*Fze-WJ5A+rpQ{-* zi#_nb7MHXCfwGJxL4Lsu4$p3+0XeBvArU1msl~}fnFS@8`FRWs6?1~a3W`dEamT(fM}DM!{wS9@nM3 z0S$}>1`OW}8SbPqsDJ#ont@kLNW4pA;f2><*1q37n?2!<%#ue*j}2?qFZlfW%;HU! zZ^GB+XS{!Kt)No2^O?XMiO2vp`;GrTKRql_ytMASX6a8a1+UJz%-0Hg?cVSye0-7A z?e{-h;uycjQjMb=_A=>D*$uVrHR3gZ*uy>ph-c{kJIIvaA>uI2`~Oj(6B#^R{an^L HB{Ts5a*&WH literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 9314992c5f..4f9e52622a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -352,6 +352,7 @@ #include "code\datums\ai_laws.dm" #include "code\datums\armor.dm" #include "code\datums\beam.dm" +#include "code\datums\beepsky_fashion.dm" #include "code\datums\browser.dm" #include "code\datums\callback.dm" #include "code\datums\chatmessage.dm" From 1ed035e4a3a7926e21e1081140c19aeb6e7dba25 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 02:29:41 +0100 Subject: [PATCH 10/85] move --- code/modules/mob/living/simple_animal/bot/secbot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 669828a0e9..94c4e3251c 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -249,11 +249,11 @@ Auto Patrol: []"}, var/datum/beepsky_fashion/BF = new bot_hat.beepsky_fashion if(BF) BF.apply(src) + regenerate_icons() /mob/living/simple_animal/bot/secbot/regenerate_icons() ..() if(bot_hat) - update_beepsky_fluff() add_overlay(bot_hat.beepsky_fashion.get_overlay()) /mob/living/simple_animal/bot/secbot/emag_act(mob/user) From 47ff13c539d3ab5a1f8c305ddf48b845602ec78e Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 02:37:21 +0100 Subject: [PATCH 11/85] apply the overlay --- code/modules/mob/living/simple_animal/bot/secbot.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 94c4e3251c..c03b36d087 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -241,6 +241,7 @@ Auto Patrol: []"}, if(H.beepsky_fashion) bot_hat = H H.forceMove(src) + update_beepsky_fluff() else to_chat(user, "You set [H] on [src]'s head, but it falls off!") H.forceMove(drop_location()) @@ -254,7 +255,8 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/regenerate_icons() ..() if(bot_hat) - add_overlay(bot_hat.beepsky_fashion.get_overlay()) + var/datum/beepsky_fashion/fashion = new bot_hat.beepsky_fashion + add_overlay(fashion.get_overlay()) /mob/living/simple_animal/bot/secbot/emag_act(mob/user) . = ..() From 4832069181b63b1f2901a87df77a3c6a23828540 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 20 Jul 2020 18:57:09 -0700 Subject: [PATCH 12/85] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 440ee1fbc1..27019df500 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -224,6 +224,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/needs_update = savefile_needs_update(S) if(needs_update == -2) //fatal, can't load any data return 0 + + . = TRUE //general preferences S["ooccolor"] >> ooccolor @@ -440,6 +442,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(needs_update == -2) //fatal, can't load any data return 0 + . = TRUE + //Species var/species_id S["species"] >> species_id From 4daf71d99e8bfecd2cf72904737b2476aecfbdbc Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 03:34:50 +0100 Subject: [PATCH 13/85] woo it works --- code/datums/beepsky_fashion.dm | 5 +++-- .../mob/living/simple_animal/bot/secbot.dm | 8 +++++++- icons/mob/secbot_head.dmi | Bin 364 -> 370 bytes 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index d9de8e6d7f..0cc0c91f7d 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -26,8 +26,8 @@ /datum/beepsky_fashion/proc/apply(mob/living/simple_animal/bot/secbot/beepers) //set the emote depending on the fashion datum, if nothing set, turn it back to how it was initially //assume name and description is always set, because otherwise, what would be the point of beepsky fashion? - src.name = name - src.desc = desc + beepers.name = name + beepers.desc = desc if(death_emote) beepers.death_emote = death_emote else @@ -65,6 +65,7 @@ //actual fashions from here on out /datum/beepsky_fashion/wizard + obj_icon_state = "wizard" name = "Archmage Beepsky" desc = "A secbot stolen from the wizard federation." death_emote = "BOT casts EI NATH on themselves!" diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index c03b36d087..479ad1ee09 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -242,6 +242,7 @@ Auto Patrol: []"}, bot_hat = H H.forceMove(src) update_beepsky_fluff() + regenerate_icons() else to_chat(user, "You set [H] on [src]'s head, but it falls off!") H.forceMove(drop_location()) @@ -250,12 +251,17 @@ Auto Patrol: []"}, var/datum/beepsky_fashion/BF = new bot_hat.beepsky_fashion if(BF) BF.apply(src) - regenerate_icons() /mob/living/simple_animal/bot/secbot/regenerate_icons() ..() if(bot_hat) var/datum/beepsky_fashion/fashion = new bot_hat.beepsky_fashion + if(!fashion.obj_icon_state) + fashion.obj_icon_state = bot_hat.icon_state + if(!fashion.obj_alpha) + fashion.obj_alpha = bot_hat.alpha + if(!fashion.obj_color) + fashion.obj_color = bot_hat.color add_overlay(fashion.get_overlay()) /mob/living/simple_animal/bot/secbot/emag_act(mob/user) diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_head.dmi index 2a246b8e42281de745b6e6f33e38fb98f88ee343..5e1e57f71c7c9019fce3c3c837687157d6967430 100644 GIT binary patch delta 58 zcmV-A0LB080`dZoPXTL@P)IAOJhLjXC`E~jGbOXA7^I7fGp#5wHxYE6 Q3jkZx8lN(P>MfDIud;U-H2?qr delta 52 zcmV-40L%aK0_*~iPXT3-P)H?7iHkEOv#1!Po{KZBC^0t`#5UwoR&e!m0h Date: Mon, 20 Jul 2020 20:09:13 -0700 Subject: [PATCH 14/85] sigh --- code/modules/client/preferences.dm | 56 +++++++++---------- code/modules/client/preferences_savefile.dm | 26 ++++----- .../modules/client/preferences_savefile.dm | 8 +-- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8b4c28a1f4..5607654d5c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -83,24 +83,24 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/gender = MALE //gender of character (well duh) var/age = 30 //age of character var/underwear = "Nude" //underwear type - var/undie_color = "FFF" + var/undie_color = "FFFFFF" var/undershirt = "Nude" //undershirt type - var/shirt_color = "FFF" + var/shirt_color = "FFFFFF" var/socks = "Nude" //socks type - var/socks_color = "FFF" + var/socks_color = "FFFFFF" var/backbag = DBACKPACK //backpack type var/jumpsuit_style = PREF_SUIT //suit/skirt var/hair_style = "Bald" //Hair type - var/hair_color = "000" //Hair color + var/hair_color = "000000" //Hair color var/facial_hair_style = "Shaved" //Face hair type - var/facial_hair_color = "000" //Facial hair color + var/facial_hair_color = "000000" //Facial hair color var/skin_tone = "caucasian1" //Skin color var/use_custom_skin_tone = FALSE - var/eye_color = "000" //Eye color + var/eye_color = "000000" //Eye color var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFF", - "mcolor2" = "FFF", - "mcolor3" = "FFF", + var/list/features = list("mcolor" = "FFFFFF", + "mcolor2" = "FFFFFF", + "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", @@ -131,23 +131,23 @@ GLOBAL_LIST_EMPTY(preferences_datums) "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, - "cock_color" = "fff", + "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, - "balls_color" = "fff", + "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, - "breasts_color" = "fff", + "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, - "vag_color" = "fff", + "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, @@ -1697,7 +1697,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("hair") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null if(new_hair) - hair_color = sanitize_hexcolor(new_hair) + hair_color = sanitize_hexcolor(new_hair, 6) if("hair_style") var/new_hair_style @@ -1714,7 +1714,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("facial") var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference","#"+facial_hair_color) as color|null if(new_facial) - facial_hair_color = sanitize_hexcolor(new_facial) + facial_hair_color = sanitize_hexcolor(new_facial, 6) if("facial_hair_style") var/new_facial_hair_style @@ -1739,7 +1739,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("undie_color") var/n_undie_color = input(user, "Choose your underwear's color.", "Character Preference", "#[undie_color]") as color|null if(n_undie_color) - undie_color = sanitize_hexcolor(n_undie_color) + undie_color = sanitize_hexcolor(n_undie_color, 6) if("undershirt") var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_list @@ -1749,7 +1749,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("shirt_color") var/n_shirt_color = input(user, "Choose your undershirt's color.", "Character Preference", "#[shirt_color]") as color|null if(n_shirt_color) - shirt_color = sanitize_hexcolor(n_shirt_color) + shirt_color = sanitize_hexcolor(n_shirt_color, 6) if("socks") var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in GLOB.socks_list @@ -1759,12 +1759,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("socks_color") var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", "#[socks_color]") as color|null if(n_socks_color) - socks_color = sanitize_hexcolor(n_socks_color) + socks_color = sanitize_hexcolor(n_socks_color, 6) if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null if(new_eyes) - eye_color = sanitize_hexcolor(new_eyes) + eye_color = sanitize_hexcolor(new_eyes, 6) if("species") var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_race_names @@ -1809,7 +1809,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_mutantcolor == "#000000") features["mcolor"] = pref_species.default_color else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin - features["mcolor"] = sanitize_hexcolor(new_mutantcolor) + features["mcolor"] = sanitize_hexcolor(new_mutantcolor, 6) else to_chat(user, "Invalid color. Your color is not bright enough.") @@ -1820,7 +1820,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_mutantcolor == "#000000") features["mcolor2"] = pref_species.default_color else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin - features["mcolor2"] = sanitize_hexcolor(new_mutantcolor) + features["mcolor2"] = sanitize_hexcolor(new_mutantcolor, 6) else to_chat(user, "Invalid color. Your color is not bright enough.") @@ -1831,7 +1831,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_mutantcolor == "#000000") features["mcolor3"] = pref_species.default_color else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin - features["mcolor3"] = sanitize_hexcolor(new_mutantcolor) + features["mcolor3"] = sanitize_hexcolor(new_mutantcolor, 6) else to_chat(user, "Invalid color. Your color is not bright enough.") @@ -1959,7 +1959,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if (new_horn_color == "#000000") features["horns_color"] = "85615A" else - features["horns_color"] = sanitize_hexcolor(new_horn_color) + features["horns_color"] = sanitize_hexcolor(new_horn_color, 6) if("wings") var/new_wings @@ -1973,7 +1973,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if (new_wing_color == "#000000") features["wings_color"] = "#FFFFFF" else - features["wings_color"] = sanitize_hexcolor(new_wing_color) + features["wings_color"] = sanitize_hexcolor(new_wing_color, 6) if("frills") var/new_frills @@ -2147,7 +2147,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_cockcolor == "#000000") features["cock_color"] = pref_species.default_color else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) - features["cock_color"] = sanitize_hexcolor(new_cockcolor) + features["cock_color"] = sanitize_hexcolor(new_cockcolor, 6) else to_chat(user,"Invalid color. Your color is not bright enough.") @@ -2187,7 +2187,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_ballscolor == "#000000") features["balls_color"] = pref_species.default_color else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) - features["balls_color"] = sanitize_hexcolor(new_ballscolor) + features["balls_color"] = sanitize_hexcolor(new_ballscolor, 6) else to_chat(user,"Invalid color. Your color is not bright enough.") @@ -2214,7 +2214,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_breasts_color == "#000000") features["breasts_color"] = pref_species.default_color else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) - features["breasts_color"] = sanitize_hexcolor(new_breasts_color) + features["breasts_color"] = sanitize_hexcolor(new_breasts_color, 6) else to_chat(user,"Invalid color. Your color is not bright enough.") @@ -2236,7 +2236,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_vagcolor == "#000000") features["vag_color"] = pref_species.default_color else if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) - features["vag_color"] = sanitize_hexcolor(new_vagcolor) + features["vag_color"] = sanitize_hexcolor(new_vagcolor, 6) else to_chat(user,"Invalid color. Your color is not bright enough.") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 440ee1fbc1..943be5dbf3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -623,14 +623,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car facial_hair_style = sanitize_inlist(facial_hair_style, GLOB.facial_hair_styles_list) underwear = sanitize_inlist(underwear, GLOB.underwear_list) undershirt = sanitize_inlist(undershirt, GLOB.undershirt_list) - undie_color = sanitize_hexcolor(undie_color, 3, FALSE, initial(undie_color)) - shirt_color = sanitize_hexcolor(shirt_color, 3, FALSE, initial(shirt_color)) + undie_color = sanitize_hexcolor(undie_color, 6, FALSE, initial(undie_color)) + shirt_color = sanitize_hexcolor(shirt_color, 6, FALSE, initial(shirt_color)) socks = sanitize_inlist(socks, GLOB.socks_list) - socks_color = sanitize_hexcolor(socks_color, 3, FALSE, initial(socks_color)) + socks_color = sanitize_hexcolor(socks_color, 6, FALSE, initial(socks_color)) age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age)) - hair_color = sanitize_hexcolor(hair_color, 3, 0) - facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0) - eye_color = sanitize_hexcolor(eye_color, 3, 0) + hair_color = sanitize_hexcolor(hair_color, 6, FALSE) + facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE) + eye_color = sanitize_hexcolor(eye_color, 6, FALSE) var/static/allow_custom_skintones if(isnull(allow_custom_skintones)) @@ -641,12 +641,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones - GLOB.nonstandard_skin_tones, initial(skin_tone)) - features["horns_color"] = sanitize_hexcolor(features["horns_color"], 3, FALSE, "85615a") - features["wings_color"] = sanitize_hexcolor(features["wings_color"], 3, FALSE, "FFFFFF") + features["horns_color"] = sanitize_hexcolor(features["horns_color"], 6, FALSE, "85615a") + features["wings_color"] = sanitize_hexcolor(features["wings_color"], 6, FALSE, "FFFFFF") backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag)) jumpsuit_style = sanitize_inlist(jumpsuit_style, GLOB.jumpsuitlist, initial(jumpsuit_style)) uplink_spawn_loc = sanitize_inlist(uplink_spawn_loc, GLOB.uplink_spawn_loc_list, initial(uplink_spawn_loc)) - features["mcolor"] = sanitize_hexcolor(features["mcolor"], 3, 0) + features["mcolor"] = sanitize_hexcolor(features["mcolor"], 6, FALSE) features["tail_lizard"] = sanitize_inlist(features["tail_lizard"], GLOB.tails_list_lizard) features["tail_human"] = sanitize_inlist(features["tail_human"], GLOB.tails_list_human) features["snout"] = sanitize_inlist(features["snout"], GLOB.snouts_list) @@ -690,10 +690,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE) features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE) features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, DEF_VAGINA_SHAPE) - features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, FALSE, "FFF") - features["cock_color"] = sanitize_hexcolor(features["cock_color"], 3, FALSE, "FFF") - features["balls_color"] = sanitize_hexcolor(features["balls_color"], 3, FALSE, "FFF") - features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, FALSE, "FFF") + features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 6, FALSE, "FFFFFF") + features["cock_color"] = sanitize_hexcolor(features["cock_color"], 6, FALSE, "FFFFFF") + features["balls_color"] = sanitize_hexcolor(features["balls_color"], 6, FALSE, "FFFFFF") + features["vag_color"] = sanitize_hexcolor(features["vag_color"], 6, FALSE, "FFFFFF") features["breasts_visibility"] = sanitize_inlist(features["breasts_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) features["cock_visibility"] = sanitize_inlist(features["cock_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) features["balls_visibility"] = sanitize_inlist(features["balls_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index c747c4cf32..bbd71d22e3 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -7,12 +7,12 @@ features["ipc_antenna"] = sanitize_inlist(features["ipc_antenna"], GLOB.ipc_antennas_list) //Citadel features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"])) - if(!features["mcolor2"] || features["mcolor"] == "#000") + if(!features["mcolor2"] || features["mcolor"] == "#000000") features["mcolor2"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") - if(!features["mcolor3"] || features["mcolor"] == "#000") + if(!features["mcolor3"] || features["mcolor"] == "#000000") features["mcolor3"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") - features["mcolor2"] = sanitize_hexcolor(features["mcolor2"], 3, 0) - features["mcolor3"] = sanitize_hexcolor(features["mcolor3"], 3, 0) + features["mcolor2"] = sanitize_hexcolor(features["mcolor2"], 6, FALSE) + features["mcolor3"] = sanitize_hexcolor(features["mcolor3"], 6, FALSE) /datum/preferences/proc/cit_character_pref_save(savefile/S) From 5347b9f6a5e19b8623fe9e0ed7a1e233c42307af Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 20 Jul 2020 21:33:03 -0700 Subject: [PATCH 15/85] Update keybindings.dm --- code/__DEFINES/admin/keybindings.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/admin/keybindings.dm b/code/__DEFINES/admin/keybindings.dm index 3efc26c7d5..fcfe7c5e58 100644 --- a/code/__DEFINES/admin/keybindings.dm +++ b/code/__DEFINES/admin/keybindings.dm @@ -1,6 +1,6 @@ // Defines for managed input/keybinding system. /// Max length of a keypress command before it's considered to be a forged packet/bogus command -#define MAX_KEYPRESS_COMMANDLENGTH 16 +#define MAX_KEYPRESS_COMMANDLENGTH 32 /// Maximum keys that can be bound to one button #define MAX_COMMANDS_PER_KEY 5 /// Maximum keys per keybind From 1450b11b01c8be1f56f04fdb40461f53415b3f07 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 20 Jul 2020 21:37:44 -0700 Subject: [PATCH 16/85] sigh --- code/_onclick/hud/parallax.dm | 2 +- code/datums/traits/negative.dm | 2 +- code/game/atoms_movement.dm | 2 ++ code/game/objects/structures/life_candle.dm | 2 +- code/modules/antagonists/revenant/revenant.dm | 2 +- code/modules/mob/living/life.dm | 4 ++-- code/modules/mob/living/living.dm | 2 +- .../modules/mob/living/simple_animal/hostile/jungle/leaper.dm | 2 +- 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index d8ef1c525a..94374c5cb6 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -128,7 +128,7 @@ deltimer(C.parallax_animate_timer) var/datum/callback/CB = CALLBACK(src, .proc/update_parallax_motionblur, C, animatedir, new_parallax_movedir, newtransform) if(skip_windups) - CB.Invoke() + CB.InvokeAsync() else C.parallax_animate_timer = addtimer(CB, min(shortesttimer, PARALLAX_LOOP_TIME), TIMER_CLIENT_TIME|TIMER_STOPPABLE) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 8f902fa088..cdf54d5d9c 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -453,7 +453,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) gain_text = "You feel cold-blooded." lose_text = "You feel more warm-blooded." - /datum/quirk/monophobia +/datum/quirk/monophobia name = "Monophobia" desc = "You will become increasingly stressed when not in company of others, triggering panic reactions ranging from sickness to heart attacks." value = -3 // Might change it to 4. diff --git a/code/game/atoms_movement.dm b/code/game/atoms_movement.dm index 68db17f076..db9424d983 100644 --- a/code/game/atoms_movement.dm +++ b/code/game/atoms_movement.dm @@ -6,6 +6,7 @@ // To be removed on step_ conversion // All this work to prevent a second bump /atom/movable/Move(atom/newloc, direct=0) + set waitfor = FALSE //n o . = FALSE if(!newloc || newloc == loc) return @@ -52,6 +53,7 @@ //////////////////////////////////////// /atom/movable/Move(atom/newloc, direct) + set waitfor = FALSE //n o var/atom/movable/pullee = pulling var/turf/T = loc if(!moving_from_pull) diff --git a/code/game/objects/structures/life_candle.dm b/code/game/objects/structures/life_candle.dm index ddd334a9e4..5dc0bcdab5 100644 --- a/code/game/objects/structures/life_candle.dm +++ b/code/game/objects/structures/life_candle.dm @@ -38,7 +38,7 @@ linked_minds |= user.mind update_icon() - float(linked_minds.len) + INVOKE_ASYNC(src, /atom/movable.proc/float, linked_minds.len) if(linked_minds.len) START_PROCESSING(SSobj, src) set_light(lit_luminosity) diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index d0ef5a83ce..21ccd425a3 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -112,7 +112,7 @@ if(stasis) return if(revealed && essence <= 0) - death() + INVOKE_ASYNC(src, .proc/death) if(unreveal_time && world.time >= unreveal_time) unreveal_time = 0 revealed = FALSE diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1993d86b74..7100749a9a 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -3,7 +3,7 @@ * Splits off into PhysicalLife() and BiologicalLife(). Override those instead of this. */ /mob/living/proc/Life(seconds, times_fired) - set waitfor = FALSE // yeah hey we're kind of on a subsystem, no sleeping will be tolerated here! + SHOULD_NOT_SLEEP(TRUE) if(mob_transforming) return @@ -80,7 +80,7 @@ handle_diginvis() //AI becomes unable to see mob if((movement_type & FLYING) && !(movement_type & FLOATING)) //TODO: Better floating - float(on = TRUE) + INVOKE_ASYNC(src, /atom/movable.proc/float, TRUE) if(!loc) return FALSE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 892518d6ba..c09493e1b1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -802,7 +802,7 @@ else throw_alert("gravity", /obj/screen/alert/weightless) if(!override && !is_flying()) - float(!has_gravity) + INVOKE_ASYNC(src, .proc/float, !has_gravity) /mob/living/float(on) if(throwing) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm index 51f61fa158..a4edb21479 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -81,7 +81,7 @@ /obj/structure/leaper_bubble/Initialize() . = ..() - float(on = TRUE) + INVOKE_ASYNC(src, /atom/movable.proc/float, TRUE) QDEL_IN(src, 100) /obj/structure/leaper_bubble/Destroy() From 99a2068dd2977a221f530001f88370a455ae9a66 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 16:26:51 +0100 Subject: [PATCH 17/85] its cool and hip --- code/datums/beepsky_fashion.dm | 35 +++++++++++++++++++ .../mob/living/simple_animal/bot/secbot.dm | 29 +++++++++------ 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index 0cc0c91f7d..f8a72890b3 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -8,6 +8,8 @@ var/obj_alpha var/obj_color + var/stun_sound //sound that replaces the stun attack when set + //emotes var/death_emote var/capture_one @@ -63,6 +65,9 @@ else beepers.attack_two = initial(beepers.attack_two) +/datum/beepsky_fashion/proc/stun_attack(mob/living/carbon/C) //fired when beepsky does a stun attack with the fashion worn, for sounds/overlays/etc + return + //actual fashions from here on out /datum/beepsky_fashion/wizard obj_icon_state = "wizard" @@ -74,3 +79,33 @@ infraction = "Magical disturbance of magnitude THREAT_LEVEL detected!" attack_one = "BOT casts magic missile on CRIMINAL!" attack_two = "BOT casts magic missile on you!" + +/datum/beepsky_fashion/cowboy + obj_icon_state = "cowboy" + name = "Sheriff Beepsky" + desc = "The sheriff of this here station." + capture_one = "BOT is tying CRIMINAL up!" + capture_two = "BOT is tying you up!" + infraction = "Outlaws with a bounty of THREAT_LEVEL000 space dollars detected!" + attack_one = "BOT unloads his revolver onto CRIMINAL!" + attack_two = "BOT unloads his revolver onto you!" + +/datum/beepsky_fashion/chef + obj_icon_state = "chef" + name = "Chef Beepsky" + desc = "Cooking up the finest foods the station has ever seen." + death_emote = "Mamma-mia!" + infraction = "Grade THREAT_LEVEL prosciutto detected!" + attack_one = "BOT slices wildly with a cleaver towards CRIMINAL!" + attack_two = "BOT slices wildly with a cleaver towards you!" + +/datum/beepsky_fashion/cat + obj_icon_state = "cat" + name = "OwOfficer Bweepskwee" + desc = "A beepsky unit with cat ears. Why?" + death_emote = "Nya!" + capture_one = "BOT is tying CRIMINAL up!!" + capture_two = "BOT is tying you up!" + infraction = "Wevel THREAT_LEVEL infwactwion awert!!!" + attack_one = "BOT shoves CRIMINAL onto a table!" + attack_two = "BOT shoves you onto a table!" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 479ad1ee09..bdaf018333 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -34,6 +34,7 @@ var/arrest_type = FALSE //If true, don't handcuff var/obj/item/clothing/head/bot_hat + var/datum/beepsky_fashion/stored_fashion //emotes (BOT is replaced with bot name, CRIMINAL with criminal name, THREAT_LEVEL with threat level) var/death_emote = "BOT blows apart!" @@ -73,7 +74,7 @@ emote = infraction if("TAUNT") emote = taunt - if("ATTACK_PME") + if("ATTACK_ONE") emote = attack_one if("ATTACK_TWO") emote = attack_two @@ -249,20 +250,22 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/proc/update_beepsky_fluff() var/datum/beepsky_fashion/BF = new bot_hat.beepsky_fashion + stored_fashion = BF if(BF) BF.apply(src) /mob/living/simple_animal/bot/secbot/regenerate_icons() ..() if(bot_hat) - var/datum/beepsky_fashion/fashion = new bot_hat.beepsky_fashion - if(!fashion.obj_icon_state) - fashion.obj_icon_state = bot_hat.icon_state - if(!fashion.obj_alpha) - fashion.obj_alpha = bot_hat.alpha - if(!fashion.obj_color) - fashion.obj_color = bot_hat.color - add_overlay(fashion.get_overlay()) + if(!stored_fashion) + stored_fashion = new bot_hat.beepsky_fashion + if(!stored_fashion.obj_icon_state) + stored_fashion.obj_icon_state = bot_hat.icon_state + if(!stored_fashion.obj_alpha) + stored_fashion.obj_alpha = bot_hat.alpha + if(!stored_fashion.obj_color) + stored_fashion.obj_color = bot_hat.color + add_overlay(stored_fashion.get_overlay()) /mob/living/simple_animal/bot/secbot/emag_act(mob/user) . = ..() @@ -323,16 +326,22 @@ Auto Patrol: []"}, /mob/living/simple_animal/bot/secbot/proc/stun_attack(mob/living/carbon/C) var/judgement_criteria = judgement_criteria() - playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) icon_state = "secbot-c" addtimer(CALLBACK(src, /atom/.proc/update_icon), 2) var/threat = 5 if(ishuman(C)) + if(stored_fashion) + stored_fashion.stun_attack(C) + if(stored_fashion.stun_sound) + playsound(src, stun_sound, 50, TRUE, -1) + else + playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) C.stuttering = 5 C.DefaultCombatKnockdown(100) var/mob/living/carbon/human/H = C threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) else + playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) C.DefaultCombatKnockdown(100) C.stuttering = 5 threat = C.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons)) From 8e2c76db7c004c3d998c87448348e776322d880e Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 16:42:59 +0100 Subject: [PATCH 18/85] two more --- code/datums/beepsky_fashion.dm | 25 ++++++++++++++++++- .../mob/living/simple_animal/bot/secbot.dm | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index f8a72890b3..201ab86457 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -108,4 +108,27 @@ capture_two = "BOT is tying you up!" infraction = "Wevel THREAT_LEVEL infwactwion awert!!!" attack_one = "BOT shoves CRIMINAL onto a table!" - attack_two = "BOT shoves you onto a table!" \ No newline at end of file + attack_two = "BOT shoves you onto a table!" + +/datum/beepsky_fashion/cake //nothing else. it's just beepsky. with a cake on his head. + obj_icon_state = "cake" + +/datum/beepsky_fashion/captain + obj_icon_state = "captain" + name = "Captainsky" + desc = "The real captain of this station." + capture_one = "BOT is lecturing CRIMINAL on why he is the captain!" + capture_two = "BOT is lecturing you on why he is the captain!" + infraction = "Level THREAT_LEVEL greytider detected." + attack_one = "BOT beats CRIMINAL with the chain of command!" + attack_two = "BOT beats you with the chain of command!" + +/datum/beepsky_fashion/king + obj_icon_state = "king" + name = "King Beepsky" + desc = "He who has ascended to bare the right of king, sits atop the throne." + capture_one = "BOT is calling the guards onto CRIMINAL!" + capture_two = "BOT is calling the guards onto you!" + infraction = "Treason of level THREAT_LEVEL detected!" + attack_one = "BOT strikes CRIMINAL with his kingly authority!" + attack_two = "BOT strikes you with his kingly authority!" diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index bdaf018333..729bb4d33c 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -333,7 +333,7 @@ Auto Patrol: []"}, if(stored_fashion) stored_fashion.stun_attack(C) if(stored_fashion.stun_sound) - playsound(src, stun_sound, 50, TRUE, -1) + playsound(src, stored_fashion.stun_sound, 50, TRUE, -1) else playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) C.stuttering = 5 From 0942b4679650a468d84f47e3c9d6acd7f17bf51f Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 18:43:58 +0100 Subject: [PATCH 19/85] more fashions --- code/datums/beepsky_fashion.dm | 26 ++++++++---------- .../mob/living/simple_animal/bot/secbot.dm | 16 +++++++++++ icons/mob/secbot_head.dmi | Bin 370 -> 1001 bytes 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index 201ab86457..bbf3812770 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -30,40 +30,28 @@ //assume name and description is always set, because otherwise, what would be the point of beepsky fashion? beepers.name = name beepers.desc = desc + + //set each variable in beepsky if its defined here, otherwise set it to its initial value just in case if(death_emote) beepers.death_emote = death_emote - else - beepers.death_emote = initial(beepers.death_emote) if(capture_one) beepers.capture_one = capture_one - else - beepers.capture_one = initial(beepers.capture_one) if(capture_two) beepers.capture_two = capture_two - else - beepers.capture_two = initial(beepers.capture_two) if(infraction) beepers.infraction = infraction - else - beepers.infraction = initial(beepers.infraction) if(infraction) beepers.taunt = taunt - else - beepers.taunt = initial(beepers.taunt) if(attack_one) beepers.attack_one = attack_one - else - beepers.attack_one = initial(beepers.attack_one) if(attack_two) beepers.attack_two = attack_two - else - beepers.attack_two = initial(beepers.attack_two) /datum/beepsky_fashion/proc/stun_attack(mob/living/carbon/C) //fired when beepsky does a stun attack with the fashion worn, for sounds/overlays/etc return @@ -132,3 +120,13 @@ infraction = "Treason of level THREAT_LEVEL detected!" attack_one = "BOT strikes CRIMINAL with his kingly authority!" attack_two = "BOT strikes you with his kingly authority!" + +/datum/beepsky_fashion/pirate + obj_icon_state = "pirate" + name = "Beepsbeard the Pirate" + desc = "Sailor of the seven seas, all sea-faring bots fear the one known as Beepsbeard." + capture_one = "BOT is making CRIMINAL walk the plank!" + capture_two = "BOT is making you walk the plank!" + infraction = "Enemy vessel spotted with threat level THREAT_LEVEL!" + attack_one = "BOT strikes CRIMINAL with his cutlass!" + attack_two = "BOT strikes you with his cutlass!" diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 729bb4d33c..752644dbb5 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -45,6 +45,8 @@ var/attack_one = "BOT has stunned CRIMINAL!" var/attack_two = "BOT has stunned you!" + var/stun_sound = + /mob/living/simple_animal/bot/secbot/beepsky name = "Officer Beep O'sky" desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." @@ -240,6 +242,7 @@ Auto Patrol: []"}, if(bot_hat) to_chat("\[src] already has a hat, and the laws of physics disallow him from wearing a second!") if(H.beepsky_fashion) + to_chat(user, "You set [H] on [src]'s head.") bot_hat = H H.forceMove(src) update_beepsky_fluff() @@ -289,6 +292,19 @@ Auto Patrol: []"}, if(!on) return if(iscarbon(A)) + if(bot_hat) + to_chat(A, "You knock [bot_hat] off of [src]'s head!") + bot_hat.forceMove(get_turf(src)) + //reset all emotes/sounds + death_emote = initial(death_emote) + capture_one = initial(capture_one) + capture_two = initial(capture_two) + infraction = initial(infraction) + taunt = initial(taunt) + attack_one = initial(attack_one) + attack_two = initial(attack_two) + bot_hat = null + qdel(stored_fashion) var/mob/living/carbon/C = A if(CHECK_MOBILITY(C, MOBILITY_MOVE|MOBILITY_USE|MOBILITY_STAND) || arrest_type) // CIT CHANGE - makes sentient secbots check for canmove rather than !isstun. stun_attack(A) diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_head.dmi index 5e1e57f71c7c9019fce3c3c837687157d6967430..18ad326684b381b7d8639feddd65e248030d9850 100644 GIT binary patch delta 919 zcmV;I18Ds60_g{TiBL{Q4GJ0x0000DNk~Le0002M0001>2m=5B0B!b@ZvX%Qdr(YN zMZmzo11@i{m;ehxl?+Fn11v;QMgs*+b_H06DOQ>XQNVCv1i6lLta(?XaZ+_&PgX@b zlV(aREG&(UjQ{`u|Ns9%K|x3;AQl!DLPA1GNlE+fs_UCNAMeE-T3T9{X*rmfnBU*u zz`(%b=wLwymxIs;Vd`Cxfyy=&QGE#lnP_unFeQ1QS%f?C&h& zGsePpxtpW+EUiNS1+r(yE4(edItW0%Tpen0C!fL%+kZN|0UObve^*b(sPu!VU|0F1^;A=7CY;K0=D^l}~nqKJw zWu|+&IEHw1zMZmBu-Smebt!K^1EYZf!#6{QJE;unAOEdp;1v@R?-E&f;q{lb?>En8 zPq-tqRO2Xzy-fO3c0+A@jd%?p_OQ Date: Tue, 21 Jul 2020 18:48:17 +0100 Subject: [PATCH 20/85] sprites --- icons/mob/secbot_head.dmi | Bin 1001 -> 1003 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_head.dmi index 18ad326684b381b7d8639feddd65e248030d9850..6a41392bdff6f6f8080086e40bf6548f8b009f2d 100644 GIT binary patch delta 39 xcmV+?0NDTO2kQrrxB-)qxrG+t{t{ejloee4T)<%m03MK9)Ku6ZSF=(9mjZ2^5dZ)H delta 37 vcmV+=0NVfS2k8fpxB-!oxrG!|giC?4f~%hkIN$*N%vqdUGazlVQ~{R)N=Fc1 From 5c88253f938bce38d056ce7a1b0f19c524396fa7 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 22:58:13 +0100 Subject: [PATCH 21/85] lots more hats --- code/datums/beepsky_fashion.dm | 86 +++++++++++++++++- code/modules/clothing/head/collectable.dm | 7 ++ code/modules/clothing/head/hardhat.dm | 1 + code/modules/clothing/head/jobs.dm | 4 + code/modules/clothing/head/misc.dm | 16 +++- code/modules/clothing/head/misc_special.dm | 3 + .../mob/living/simple_animal/bot/bot.dm | 5 +- .../mob/living/simple_animal/bot/secbot.dm | 25 +++-- icons/mob/secbot_head.dmi | Bin 1003 -> 1402 bytes 9 files changed, 133 insertions(+), 14 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index bbf3812770..25b9a750aa 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -8,7 +8,8 @@ var/obj_alpha var/obj_color - var/stun_sound //sound that replaces the stun attack when set + var/list/stun_sounds //sound that replaces the stun attack when set + var/ignore_sound = FALSE //whether to ignore sounds entirely or not //emotes var/death_emote @@ -18,6 +19,9 @@ var/taunt var/attack_one var/attack_two + var/patrol_emote + var/list/arrest_texts //first is for not-cuffing, second is for cuffing + var/arrest_emote /datum/beepsky_fashion/proc/get_overlay(var/dir) if(icon_file && obj_icon_state) @@ -53,6 +57,15 @@ if(attack_two) beepers.attack_two = attack_two + if(patrol_emote) + beepers.patrol_emote = patrol_emote + + if(arrest_texts) + beepers.arrest_texts = arrest_texts + + if(arrest_emote) + beepers.arrest_emote = arrest_emote + /datum/beepsky_fashion/proc/stun_attack(mob/living/carbon/C) //fired when beepsky does a stun attack with the fashion worn, for sounds/overlays/etc return @@ -67,6 +80,15 @@ infraction = "Magical disturbance of magnitude THREAT_LEVEL detected!" attack_one = "BOT casts magic missile on CRIMINAL!" attack_two = "BOT casts magic missile on you!" + patrol_emote = "Beginning search for magical disturbances." + arrest_emote = "ARREST_TYPE level THREAT_LEVEL magical practitioner CRIMINAL in LOCATION." + stun_sounds = list('sound/magic/lightningbolt.ogg', + 'sound/magic/fireball.ogg', + 'sound/weapons/zapbang.ogg', + 'sound/magic/knock.ogg', + 'sound/magic/fleshtostone.ogg', + 'sound/effects/magic.ogg', + 'sound/magic/disintegrate.ogg') /datum/beepsky_fashion/cowboy obj_icon_state = "cowboy" @@ -77,6 +99,12 @@ infraction = "Outlaws with a bounty of THREAT_LEVEL000 space dollars detected!" attack_one = "BOT unloads his revolver onto CRIMINAL!" attack_two = "BOT unloads his revolver onto you!" + patrol_emote = "Engaging bounty hunting protocols." + arrest_emote = "ARREST_TYPE outlaw CRIMINAL with a bounty of THREAT_LEVEL000 in LOCATION." + stun_sounds = list('sound/weapons/Gunshot.ogg', + 'sound/weapons/Gunshot2.ogg', + 'sound/weapons/Gunshot3.ogg', + 'sound/weapons/Gunshot4.ogg') /datum/beepsky_fashion/chef obj_icon_state = "chef" @@ -84,8 +112,13 @@ desc = "Cooking up the finest foods the station has ever seen." death_emote = "Mamma-mia!" infraction = "Grade THREAT_LEVEL prosciutto detected!" - attack_one = "BOT slices wildly with a cleaver towards CRIMINAL!" - attack_two = "BOT slices wildly with a cleaver towards you!" + attack_one = "BOT CQCs CRIMINAL!" + attack_two = "BOT CQCs you!" + patrol_emote = "Beginning search for the bad prosciutto." + arrest_texts = list("Frying", "Grilling") //any good secoff knows the difference + arrest_emote = "ARREST_TYPE grade THREAT_LEVEL prosciutto CRIMINAL in LOCATION." + stun_sounds = list('sound/weapons/cqchit1.ogg', + 'sound/weapons/cqchit2.ogg') /datum/beepsky_fashion/cat obj_icon_state = "cat" @@ -97,9 +130,25 @@ infraction = "Wevel THREAT_LEVEL infwactwion awert!!!" attack_one = "BOT shoves CRIMINAL onto a table!" attack_two = "BOT shoves you onto a table!" + patrol_emote = "Enwgagwing patwol mwode." + arrest_texts = list("Dwetwaining", "Awwesting") + arrest_emote = "ARREST_TYPE wevel THREAT_LEVEL scwumbwag CRIMINAL in LOCATION. Nya." + ignore_sound = TRUE //we instead make the stunned person fire the nya emote + +/datum/beepsky_fashion/cat/stun_attack(var/mob/living/carbon/C) //makes a fake table under you on hit, makes cat people nya when hit + if(iscatperson(C)) + C.emote("nya") + var/turf/target_turf = get_turf(C) + if(target_turf && !(C.lying)) //slams you on a table if you're standing up + playsound(src, 'sound/weapons/tap.ogg', 50, 1) + var/obj/effect/overlay_holder = new(target_turf) + var/image/table_overlay = image('icons/obj/smooth_structures/table.dmi', "table") + overlay_holder.add_overlay(table_overlay) + QDEL_IN(1, overlay_holder) /datum/beepsky_fashion/cake //nothing else. it's just beepsky. with a cake on his head. obj_icon_state = "cake" + desc = "It's a secbot, wearing a cake on his head!" /datum/beepsky_fashion/captain obj_icon_state = "captain" @@ -110,6 +159,10 @@ infraction = "Level THREAT_LEVEL greytider detected." attack_one = "BOT beats CRIMINAL with the chain of command!" attack_two = "BOT beats you with the chain of command!" + patrol_emote = "Uselessness protocols engaged." + arrest_texts = list("Demoting", "Firing") + arrest_emote = "ARREST_TYPE level THREAT_LEVEL lesser crewmember CRIMINAL in LOCATION." + stun_sounds = list('sound/weapons/chainhit.ogg') /datum/beepsky_fashion/king obj_icon_state = "king" @@ -120,6 +173,13 @@ infraction = "Treason of level THREAT_LEVEL detected!" attack_one = "BOT strikes CRIMINAL with his kingly authority!" attack_two = "BOT strikes you with his kingly authority!" + patrol_emote = "Searching for peasants to beat up." + arrest_texts = list("Knighting", "Executing") + arrest_emote = "ARREST_TYPE level THREAT_LEVEL peasant CRIMINAL in LOCATION." + stun_sounds = list('sound/weapons/punch1.ogg', + 'sound/weapons/punch2.ogg', + 'sound/weapons/punch3.ogg', + 'sound/weapons/punch4.ogg') /datum/beepsky_fashion/pirate obj_icon_state = "pirate" @@ -130,3 +190,23 @@ infraction = "Enemy vessel spotted with threat level THREAT_LEVEL!" attack_one = "BOT strikes CRIMINAL with his cutlass!" attack_two = "BOT strikes you with his cutlass!" + patrol_emote = "Searching for enemy vessels to board." + arrest_texts = list("Boarding" "Sinking") + arrest_emote = "ARREST_TYPE level THREAT_LEVEL vessel CRIMINAL in LOCATION." + stun_sounds = list('sound/weapons/bladeslice.ogg') + +/datum/beepsky_fashion/engineer + obj_icon_state = "engineer" + desc = "He fixes criminals with a wrench to the face." + capture_one = "BOT is tying CRIMINAL up!" + capture_two = "BOT is tying you up!" + infraction = "Structural integrity issue spotted with threat level THREAT_LEVEL" + attack_one = "BOT strikes CRIMINAL with his wrench!" + attack_two = "BOT strikes you with his wrench!" + arrest_texts = list("Fixing", "Repairing") + arrest_emote = "ARREST_TYPE level THREAT_LEVEL structural issue in LOCATION" + stun_sounds = list('sound/weapons/genhit.ogg') + +/datum/beepsky_fashion/tophat + obj_icon_state = "tophat" + desc = "It's a secbot, wearing a top hat! How fancy." \ No newline at end of file diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 71b3e2e144..20cb7cc824 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -27,7 +27,9 @@ icon_state = "chef" item_state = "chef" dynamic_hair_suffix = "" + dog_fashion = /datum/dog_fashion/head/chef + beepsky_fashion = /datum/beepsky_fashion/chef /obj/item/clothing/head/collectable/paper name = "collectable paper hat" @@ -42,6 +44,8 @@ icon_state = "tophat" item_state = "that" + beepsky_fashion = /datum/beepsky_fashion/tophat + /obj/item/clothing/head/collectable/captain name = "collectable captain's hat" desc = "A collectable hat that'll make you look just like a real comdom!" @@ -49,6 +53,7 @@ item_state = "caphat" dog_fashion = /datum/dog_fashion/head/captain + beepsky_fashion = /datum/beepsky_fashion/captain /obj/item/clothing/head/collectable/police name = "collectable police officer's hat" @@ -91,6 +96,7 @@ item_state = "pirate" dog_fashion = /datum/dog_fashion/head/pirate + beepsky_fashion = /datum/beepsky_fashion/pirate /obj/item/clothing/head/collectable/kitty name = "collectable kitty ears" @@ -100,6 +106,7 @@ dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/kitty + beepsky_fashion = /datum/beepsky_fashion/cat /obj/item/clothing/head/collectable/rabbitears name = "collectable rabbit ears" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 80d0b7c8a8..10ea027610 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -15,6 +15,7 @@ dynamic_hair_suffix = "+generic" dog_fashion = /datum/dog_fashion/head + beepsky_fashion = /datum/beepsky_fashion/hardhat /obj/item/clothing/head/hardhat/ComponentInitialize() diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 638a0c2f23..5af694ea1b 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -13,7 +13,9 @@ strip_delay = 10 equip_delay_other = 10 dynamic_hair_suffix = "" + dog_fashion = /datum/dog_fashion/head/chef + beepsky_fashion = /datum/beepsky_fashion/chef /obj/item/clothing/head/chefhat/suicide_act(mob/user) user.visible_message("[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.") @@ -33,7 +35,9 @@ flags_inv = 0 armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50) strip_delay = 60 + dog_fashion = /datum/dog_fashion/head/captain + beepsky_fashion = /datum/beepsky_fashion/captain //Captain: This is no longer space-worthy /obj/item/clothing/head/caphat/parade diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 73675257e4..5e6124b23d 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -20,9 +20,11 @@ desc = "It's an amish looking hat." icon_state = "tophat" item_state = "that" - dog_fashion = /datum/dog_fashion/head throwforce = 1 + dog_fashion = /datum/dog_fashion/head + beepsky_fashion = /datum/beepsky_fashion/tophat + /obj/item/clothing/head/canada name = "striped red tophat" desc = "It smells like fresh donut holes. / Il sent comme des trous de beignets frais." @@ -126,7 +128,9 @@ desc = "Yarr." icon_state = "pirate" item_state = "pirate" + dog_fashion = /datum/dog_fashion/head/pirate + beepsky_fashion = /datum/beepsky_fashion/pirate /obj/item/clothing/head/pirate/captain name = "pirate captain hat" @@ -205,6 +209,7 @@ item_state = "sombrero" desc = "You can practically taste the fiesta." flags_inv = HIDEHAIR + dog_fashion = /datum/dog_fashion/head/sombrero /obj/item/clothing/head/sombrero/green @@ -213,6 +218,7 @@ item_state = "greensombrero" desc = "As elegant as a dancing cactus." flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + dog_fashion = null /obj/item/clothing/head/sombrero/shamebrero @@ -220,6 +226,7 @@ icon_state = "shamebrero" item_state = "shamebrero" desc = "Once it's on, it never comes off." + dog_fashion = null /obj/item/clothing/head/sombrero/shamebrero/Initialize() @@ -248,6 +255,7 @@ item_state = "that" cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + dog_fashion = /datum/dog_fashion/head/santa /obj/item/clothing/head/jester @@ -286,6 +294,8 @@ resistance_flags = FIRE_PROOF dynamic_hair_suffix = "" + beepsky_fashion = /datum/beepsky_fashion/king + /obj/item/clothing/head/crown/fancy name = "magnificent crown" desc = "A crown worn by only the highest emperors of the land space." @@ -391,7 +401,9 @@ name = "cowboy hat" desc = "A standard brown cowboy hat, yeehaw." icon_state = "cowboyhat" - item_state= "cowboyhat" + item_state = "cowboyhat" + + beepsky_fashion = /datum/beepsky_fashion/cowboy /obj/item/clothing/head/cowboyhat/black name = "black cowboy hat" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 54561c8a24..1d9c3dd325 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -50,6 +50,8 @@ flags_cover = HEADCOVERSEYES heat = 1000 + beepsky_fashion = /datum/beepsky_fashion/cake + /obj/item/clothing/head/hardhat/cakehat/process() var/turf/location = src.loc if(ishuman(location)) @@ -131,6 +133,7 @@ dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/kitty + beepsky_fashion = /datum/beepsky_fashion/cat /obj/item/clothing/head/kitty/equipped(mob/living/carbon/human/user, slot) if(ishuman(user) && slot == SLOT_HEAD) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index a347b04e50..ac995bdeaf 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -102,6 +102,9 @@ var/can_salute = TRUE var/salute_delay = 60 SECONDS + //emotes/speech stuff + var/patrol_emote = "Engaging patrol mode." + /mob/living/simple_animal/bot/proc/get_mode() if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. if(paicard) @@ -628,7 +631,7 @@ Pass a positive integer as an argument to override a bot's default speed. return mode = BOT_PATROL else // no patrol target, so need a new one - speak("Engaging patrol mode.") + speak(patrol_emote) find_patrol_target() tries++ return diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 752644dbb5..e2ab01b7bd 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -44,8 +44,8 @@ var/taunt = "BOT points at CRIMINAL!" var/attack_one = "BOT has stunned CRIMINAL!" var/attack_two = "BOT has stunned you!" - - var/stun_sound = + var/list/arrest_texts = list("Detaining", "Arresting") + var/arrest_emote = "ARREST_TYPE level THREAT_LEVEL scumbag CRIMINAL in LOCATION." /mob/living/simple_animal/bot/secbot/beepsky name = "Officer Beep O'sky" @@ -63,7 +63,7 @@ resize = 0.8 update_transform() -/mob/living/simple_animal/bot/secbot/proc/process_emote(var/emote_type, var/atom/criminal, var/threat) +/mob/living/simple_animal/bot/secbot/proc/process_emote(var/emote_type, var/atom/criminal, var/threat, var/arrest = -1, var/location) var/emote = "The continuity of space itself collapses around [src]. You should probably report that to someone higher up." switch(emote_type) if("DEATH") @@ -80,16 +80,22 @@ emote = attack_one if("ATTACK_TWO") emote = attack_two + if("ARREST") + emote = arrest_emote //now replace pieces of the text with the information we have - if(!taunt) + if(emote_type != "TAUNT" && emote_type != "ARREST") emote = replacetext(emote, "BOT", name) else - emote = replacetext(emote, "BOT", "[name]") //needs to be bold if its a taunt + emote = replacetext(emote, "BOT", "[name]") //needs to be bold if its a taunt or an arrest text if(criminal) emote = replacetext(emote, "CRIMINAL", criminal.name) if(threat) emote = replacetext(emote, "THREAT_LEVEL", threat) + if(arrest > -1) + emote = replacetext(emote, "ARREST_TYPE", arrest_texts[arrest + 1]) + if(location) + emote = replacetext(emote, "LOCATION", location) return emote /mob/living/simple_animal/bot/secbot/beepsky/explode() @@ -303,6 +309,9 @@ Auto Patrol: []"}, taunt = initial(taunt) attack_one = initial(attack_one) attack_two = initial(attack_two) + arrest_texts = initial(arrest_texts) + arrest_emote = initial(arrest_emote) + patrol_emote = initial(patrol_emote) bot_hat = null qdel(stored_fashion) var/mob/living/carbon/C = A @@ -348,8 +357,8 @@ Auto Patrol: []"}, if(ishuman(C)) if(stored_fashion) stored_fashion.stun_attack(C) - if(stored_fashion.stun_sound) - playsound(src, stored_fashion.stun_sound, 50, TRUE, -1) + if(stored_fashion.stun_sounds && !stored_fashion.ignore_sound) + playsound(src, pick(stored_fashion.stun_sounds), 50, TRUE, -1) else playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) C.stuttering = 5 @@ -365,7 +374,7 @@ Auto Patrol: []"}, log_combat(src,C,"stunned") if(declare_arrests) var/area/location = get_area(src) - speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel) + speak(process_emote("ARREST", C, threat, arrest_type, location), radio_channel) C.visible_message("[process_emote("ATTACK_ONE", C)]",\ "[process_emote("ATTACK_TWO", C)]") diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_head.dmi index 6a41392bdff6f6f8080086e40bf6548f8b009f2d..09b28cad68fba0ef223d895c84ae0c3774ed1517 100644 GIT binary patch delta 1375 zcmV-l1)%!t2l@&niBL{Q4GJ0x0000DNk~Le0002s0002s2m=5B04?*H(*OVfz>y^` ze=IC4jg5@}005(LQvd(|K|w(l78XK6LP<$UbzV#X8|I;G>e=q>_@4@Ws>~L^!l$4Y+zrPJ`Zot66mXSx@ z00001bW%=J06^y0W&i*HuzFNjbVOxyV{&P5bZKvH004NLjgh|&f-n%q=k_TYSdCF} zbukdbAn$O}gI>^*pb@68RW;@3e{Wz;f3(auctijI1FT6z zK~#90?c94)+CUV>;Xt?-BBekte*#)TMcY!b_v`onSltbvZQb2hjWN>x9;Y*o@7d%W z6Q+NhX`=`L007tqC8OXL%K2Wt6j$<{Q1oA|)~eME=hZVR#c?HG<(?|_jKjI=zgn+1 z>UDpGoIfgU`gfw%`NwU-JhK|buwO?zuJDtZx<=t-5>-7@<1g0Q)k^~CW zeyzQ3z}G^)x#_;wHD5{JGk_@=42FY&w?OXa+MTDyv*+FhbIiN_q`w)k-|c$}2E*ZS z;3ovW8d(hPWP44Hc-S9m`tPA7?{M7zU?&s3mk3uc% zM&odY;=ITwd%g5);tJLNP44H?`;T__%^z=jqup^Jmgi+Y=~>SC0ZipR*0T9FNB@{R4($U7+&GivI=x0000000000_b9ku zyMsLJ;K23m-3sm3vgUs@?V4bE@xz0I>CMl}>!%Hd_G=mQ*&k16cD3Mex*2OaJ-qpO zdHu9Ov0uxQAI)YLPiQtfx>|6!ndWo}1tB`O?#YiI>ZzH4S!c}8-(@%hW=;05x| zqc7oD<$8gr{`=Gio`(mVZER^Ci2;wkUVLq3ZUy&iUoUNCF86ESzHfYU9)IY$^5f^F zA6u9M000000002~O&RxZMX$%Sq8rS0z@qnecd-8pF)Dh0cNhD=prZG8+4p}!(fd30 hf9(GN004l8?HsI002ovPDHLkV1o1_ua^J- delta 973 zcmV;;12X*j3hM_YiBL{Q4GJ0x0000DNk~Le0002M0001>2m=5B0B!b@ZvX%QdyyqB zf1`0ybzVsi zmuWeen3&(+-@w4Y;^^$l&CU3He73Ev|Ej7eC@2HyR89Z@00DGTPE!Ct=GbNc005JE zR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`fAmvu@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5sXVhPu_#4}i!&v&s2HS+i!-e#F*g;&Hbf{(PAn)% z%*-RKF26h}zmlM`g3KZyi=eXX%)E5MR%WE85#jz4TxygRT>V_YVFv&nkXqDKf7l^c z0007iNkldQ#3$wV7|~pI|yI3VVQTh8_Q1imI3W#e6Pqk5_B#+d)x`(!#MT zc#nwtuu1S9A5|~=i}^G+UD6IY4Lzms>6i5%>fcQ}+LwRqRejg~00000e*ggZzGj2@ zRpavi2O>V3&F4R^7?=0+@%XG=Ahbl^ad|(l;(}q#06oXm{k)71=Ck;B+;3do z&x`nFh1ePGGp_FEJKx^}00000000Ou=C&+5B&d4Xznii&i^al(m#_)u&IA)wz3lHS z<1@y>cDhArU#1ETXv}K0e_pKu394T9Z|2*?W?T;HV7RPIby=V)t3bkPyp!>NZ~2_ycoS5;?B7gSZ#UaIya5~CY(wFyGRB=z zds6R=FToxEmM=lo%l>Y{`?{|0!yAZ)0RR910002s%hb)|H@}$_fA{kuzI#|Suicg6 z@_t^%cMB)nzwfxZpO^97gA*B`=eWFpSMlB1)#3mE000000D!mld*9pds9=}A3F71-?cvg005l7N`*=1^kyCA00000NkvXXu0mjfm`d5^ From 3a520bba3f35401a6a036476e4cdf830e9f7f87a Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 21 Jul 2020 23:45:04 +0100 Subject: [PATCH 22/85] more hats --- code/datums/beepsky_fashion.dm | 51 +++++++++++++++++++------- code/modules/clothing/head/hardhat.dm | 2 +- code/modules/clothing/head/misc.dm | 3 ++ icons/mob/secbot_head.dmi | Bin 1402 -> 1536 bytes 4 files changed, 41 insertions(+), 15 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index 25b9a750aa..3e81a3122c 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -1,6 +1,6 @@ //similar to dog_fashion, but for beepsky, who has far more refined fashion tastes /datum/beepsky_fashion - var/name + var/name //not setting the name and desc makes them go to the default var/desc var/icon_file = 'icons/mob/secbot_head.dmi' @@ -11,17 +11,23 @@ var/list/stun_sounds //sound that replaces the stun attack when set var/ignore_sound = FALSE //whether to ignore sounds entirely or not - //emotes - var/death_emote - var/capture_one - var/capture_two - var/infraction - var/taunt - var/attack_one - var/attack_two - var/patrol_emote + //emotes (don't set them if you want the default value) + var/death_emote //what is said when beepsky dies + var/capture_one //what is said when cuffing someone + var/capture_two //what is said when cuffing someone, directly to the person being cuffed + var/infraction //the level of threat detected + var/taunt // beepsky pointing at a criminal + var/attack_one //text when attacking criminal + var/attack_two //text when attacking criminal, but directly to the criminal + var/patrol_emote //engaging patrol text var/list/arrest_texts //first is for not-cuffing, second is for cuffing - var/arrest_emote + var/arrest_emote //text stating that you're cuffing some criminal C with a threat of level X in location Y + + //for reference, the following words are replaced when processed before speech: + //LOCATION = the location passed, if any (this is only used by arrest_emote) + //CRIMINAL = the name of the criminal (this is used by everything but patrol_emote and infraction) + //BOT = the name of the bot (this can be used on any of the emotes) + //THREAT_LEVEL = the level of the threat detected (can be used on arrest_emote and infraction) /datum/beepsky_fashion/proc/get_overlay(var/dir) if(icon_file && obj_icon_state) @@ -48,7 +54,7 @@ if(infraction) beepers.infraction = infraction - if(infraction) + if(taunt) beepers.taunt = taunt if(attack_one) @@ -78,6 +84,7 @@ capture_one = "BOT is casting cable ties on CRIMINAL!" capture_two = "BOT is casting cable ties on you!" infraction = "Magical disturbance of magnitude THREAT_LEVEL detected!" + taunt = "BOT points his staff towards CRIMINAL!" attack_one = "BOT casts magic missile on CRIMINAL!" attack_two = "BOT casts magic missile on you!" patrol_emote = "Beginning search for magical disturbances." @@ -97,6 +104,7 @@ capture_one = "BOT is tying CRIMINAL up!" capture_two = "BOT is tying you up!" infraction = "Outlaws with a bounty of THREAT_LEVEL000 space dollars detected!" + taunt = "BOT aims his revolver towards CRIMINAL!" attack_one = "BOT unloads his revolver onto CRIMINAL!" attack_two = "BOT unloads his revolver onto you!" patrol_emote = "Engaging bounty hunting protocols." @@ -112,6 +120,7 @@ desc = "Cooking up the finest foods the station has ever seen." death_emote = "Mamma-mia!" infraction = "Grade THREAT_LEVEL prosciutto detected!" + taunt = "BOT glares at CRIMINAL." attack_one = "BOT CQCs CRIMINAL!" attack_two = "BOT CQCs you!" patrol_emote = "Beginning search for the bad prosciutto." @@ -128,6 +137,7 @@ capture_one = "BOT is tying CRIMINAL up!!" capture_two = "BOT is tying you up!" infraction = "Wevel THREAT_LEVEL infwactwion awert!!!" + taunt = "BOT points at CRIMINAL and nyas!" attack_one = "BOT shoves CRIMINAL onto a table!" attack_two = "BOT shoves you onto a table!" patrol_emote = "Enwgagwing patwol mwode." @@ -148,6 +158,7 @@ /datum/beepsky_fashion/cake //nothing else. it's just beepsky. with a cake on his head. obj_icon_state = "cake" + name = "Cakesky" desc = "It's a secbot, wearing a cake on his head!" /datum/beepsky_fashion/captain @@ -191,12 +202,13 @@ attack_one = "BOT strikes CRIMINAL with his cutlass!" attack_two = "BOT strikes you with his cutlass!" patrol_emote = "Searching for enemy vessels to board." - arrest_texts = list("Boarding" "Sinking") + arrest_texts = list("Boarding", "Sinking") arrest_emote = "ARREST_TYPE level THREAT_LEVEL vessel CRIMINAL in LOCATION." stun_sounds = list('sound/weapons/bladeslice.ogg') /datum/beepsky_fashion/engineer obj_icon_state = "engineer" + name = "Chief Engineer Beepsky" desc = "He fixes criminals with a wrench to the face." capture_one = "BOT is tying CRIMINAL up!" capture_two = "BOT is tying you up!" @@ -209,4 +221,15 @@ /datum/beepsky_fashion/tophat obj_icon_state = "tophat" - desc = "It's a secbot, wearing a top hat! How fancy." \ No newline at end of file + name = "Fancy Beepsky" + desc = "It's a secbot, wearing a top hat! How fancy." + +/datum/beepsky_fashion/fedora + obj_icon_state = "fedora" + name = "Fedorasky" + desc = "It's a secbot, wearing a fedora!" + +/datum/beepsky_fashion/sombrero + obj_icon_state = "sombrero" + name = "Sombrerosky" + desc = "A secbot wearing a sombrero. Truly, a hombre to all." diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 10ea027610..12a4a43ca7 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -15,7 +15,7 @@ dynamic_hair_suffix = "+generic" dog_fashion = /datum/dog_fashion/head - beepsky_fashion = /datum/beepsky_fashion/hardhat + beepsky_fashion = /datum/beepsky_fashion/engineer /obj/item/clothing/head/hardhat/ComponentInitialize() diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 5e6124b23d..d55c3a00af 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -193,6 +193,8 @@ desc = "A really cool hat if you're a mobster. A really lame hat if you're not." pocket_storage_component_path = /datum/component/storage/concrete/pockets/small + beepsky_fashion = /datum/beepsky_fashion/fedora + /obj/item/clothing/head/fedora/suicide_act(mob/user) if(user.gender == FEMALE) return 0 @@ -211,6 +213,7 @@ flags_inv = HIDEHAIR dog_fashion = /datum/dog_fashion/head/sombrero + beepsky_fashion = /datum/beepsky_fashion/sombrero /obj/item/clothing/head/sombrero/green name = "green sombrero" diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_head.dmi index 09b28cad68fba0ef223d895c84ae0c3774ed1517..2d6b7c9cbabaf6e79393d7d9a340daa45dbb4c19 100644 GIT binary patch delta 1449 zcmYLJc~H^`6#l8Tre<17x+cffPOM)AL?&Vn;eFFn?&4B!^ z;TD0=LZ{2ARC9B4`N$Cn1OkOZ&CJYfPM?-r1D}Pj1p)yYjmG2gR4TQnrw50_6&DxV zf}nOnLTiKCd{hydORpZrw9& z3jk_z6vD+nt#V~1Hoyp_|7PtzCco(}P^96y_w{}R1v5m7vcc#Xu;n7u*+=C}TD8g_ zW0h-iQ~M0UDt(%|>d0O)&`?!q0(jfp=kISM%Eca~S46wGJL_UsNAMEp=p;HjcsJa# za^VR)CBH4H86+^#@PjLm#?Y$Jg6{-Y_7)G?gA6e?W8b$)zpb{4)|xDg>>@Dz;gdSf zo2+$`I9i*+)u_wN6Txbn>wU%8#{vT}f#cc|#&dR*KGV-EXfDnnVjWr35m`x5s<&kT zd{M<3f|0hm`-4HDLMwI_UlRpsV!wC<|{HJ}W65qxSxihn*dZHr{_cZsMGw+W>|(*`%Cef88LdSldcn z{>ryMp7N4u*x(b7)-0!Aqm`kbNfso2quQd2l@ST`LyJXE%1DgODBCs5DhT(0mV%Ew z!*$%YGGaCc;j{fi`SDGkVt-wyog~z5YG}RAzc3Yk+G?daBKWYuUo_~A_DeU^p`v{V z@OPHi@`%^CU&7*4Tw(>7*Y+_d8ti9nmS(Y=HlEE)&c0ur(BZteK2@)V6ZLgS&n!+j z_okDEiDRFVt0#3h&}G$e_J>+pXiWf)%NVrPQHwvx8Lnot$9_;^XE~#9p6r( zJfFyO2xovSR(yUmcwQdshdOT@B*S5`4FoWV*Kap%8xWHiQ#Q=){&U!AH$BsiRYp))Oh5C2ehVOH)t2dBrIMI~R}X zkU!R*Jjs3KJP(rxZk0|{-&&oj0~uNC1+5(M9*0W+lfhnoE5ECeX{jrY z!e`vNb&lQEW>~?fE9!yrcV;@Mw4m@&241O394EhQsiBL{Q4GJ0x0000DNk~Le0002s0002s2m=5B04?*H(*OVfz>y_t zf8yxu%gxRBe0;X8t^ca3C@3gMIsg?F6&)QNCMG5_F)#X8|I;G>FaY%L!R+kpaBy&xl$0~SzYT6~z`($kkw@JC0004WQchC< zK<3zH00026dQ@0+L}hbha%pgMX>V=-e*k!#jgh|&f-n%q=k_TYSdCF}bukdbAn$O} zgI>^(7#YZ>IXB68RW;@3e{Wz;f3(auctijI1FT6zK~#90?c94) z+CUV>;Xt?-BBekt0$M>u+fuRj>-Yay-3_2^-Q8D>G1C4Xr!$W4+2kA(rhlAiqX+;1 z0N4g4qu>_G`Ch&hSMr@u^k1#kf2!3C=hZVR#c?HG<(?|_jKjI=zgn+1>UDpGoIfgU z`gfA@alX`Q zRpORqI&i*%_J?VK^Yv8c<@Htniac+-FRh1Y`hLs)PoF%0t?TD&-TJNnvQy`?ULODe z000000E*C#ItAuQveWH`j>`hIUu(BJoySGx-EPwB^%DOCrXYEe1PauCt-Wr**FwIz z>Au%BUrFCHfGHRZhJ%5(e?ac%+MTDyv*+FhbIiN_q`w)k-|c$}2E*ZS;3c?8k4-S&(%< z2LJ#700000!2MI}HNAd&(A54-?&qxC@I6GV3*-g-)c#HG=hEAce?l$nM&odY;=ITw zd%g5);tJLNP44H?`;T__%^z=jqup^Jmgi+Y=~>SCCMl}>!%Hd_G=mQ*&k16cD3Mex*2OaJ-qpOdHu9Ov0uxQ zAI)YLPiQtfx>|6!ndWo}1tB`O?#YiI>ZzH%_kTjs`#bi3?Ee4&0Dy<& Y7f(^b07*qoM6N<$g1NDkeE Date: Wed, 22 Jul 2020 00:07:15 +0100 Subject: [PATCH 23/85] further emotes --- code/datums/beepsky_fashion.dm | 23 +++++++++++++++---- .../mob/living/simple_animal/bot/bot.dm | 3 ++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index 3e81a3122c..a6e0a81dcd 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -20,6 +20,7 @@ var/attack_one //text when attacking criminal var/attack_two //text when attacking criminal, but directly to the criminal var/patrol_emote //engaging patrol text + var/patrol_fail_emote //failing to engage patrol text var/list/arrest_texts //first is for not-cuffing, second is for cuffing var/arrest_emote //text stating that you're cuffing some criminal C with a threat of level X in location Y @@ -66,6 +67,9 @@ if(patrol_emote) beepers.patrol_emote = patrol_emote + if(patrol_fail_emote) + beepers.patrol_fail_emote = patrol_fail_emote + if(arrest_texts) beepers.arrest_texts = arrest_texts @@ -88,6 +92,7 @@ attack_one = "BOT casts magic missile on CRIMINAL!" attack_two = "BOT casts magic missile on you!" patrol_emote = "Beginning search for magical disturbances." + patrol_fail_emote = "Failure to find magical disturbances. Recallibrating." arrest_emote = "ARREST_TYPE level THREAT_LEVEL magical practitioner CRIMINAL in LOCATION." stun_sounds = list('sound/magic/lightningbolt.ogg', 'sound/magic/fireball.ogg', @@ -108,6 +113,7 @@ attack_one = "BOT unloads his revolver onto CRIMINAL!" attack_two = "BOT unloads his revolver onto you!" patrol_emote = "Engaging bounty hunting protocols." + patrol_fail_emote = "Unable to find any bounties due to error. Rebooting." arrest_emote = "ARREST_TYPE outlaw CRIMINAL with a bounty of THREAT_LEVEL000 in LOCATION." stun_sounds = list('sound/weapons/Gunshot.ogg', 'sound/weapons/Gunshot2.ogg', @@ -124,6 +130,7 @@ attack_one = "BOT CQCs CRIMINAL!" attack_two = "BOT CQCs you!" patrol_emote = "Beginning search for the bad prosciutto." + patrol_fail_emote = "All prosciutto is stale. Rebooting." arrest_texts = list("Frying", "Grilling") //any good secoff knows the difference arrest_emote = "ARREST_TYPE grade THREAT_LEVEL prosciutto CRIMINAL in LOCATION." stun_sounds = list('sound/weapons/cqchit1.ogg', @@ -132,7 +139,7 @@ /datum/beepsky_fashion/cat obj_icon_state = "cat" name = "OwOfficer Bweepskwee" - desc = "A beepsky unit with cat ears. Why?" + desc = "A beepsky unit with cat ears. Catgirl science has gone too far." death_emote = "Nya!" capture_one = "BOT is tying CRIMINAL up!!" capture_two = "BOT is tying you up!" @@ -140,7 +147,8 @@ taunt = "BOT points at CRIMINAL and nyas!" attack_one = "BOT shoves CRIMINAL onto a table!" attack_two = "BOT shoves you onto a table!" - patrol_emote = "Enwgagwing patwol mwode." + patrol_emote = "Enwgagwing patwol mwodies.." + patrol_fail_emote = "Unawbwle two stwawt patwollies. Nya." arrest_texts = list("Dwetwaining", "Awwesting") arrest_emote = "ARREST_TYPE wevel THREAT_LEVEL scwumbwag CRIMINAL in LOCATION. Nya." ignore_sound = TRUE //we instead make the stunned person fire the nya emote @@ -149,12 +157,14 @@ if(iscatperson(C)) C.emote("nya") var/turf/target_turf = get_turf(C) - if(target_turf && !(C.lying)) //slams you on a table if you're standing up - playsound(src, 'sound/weapons/tap.ogg', 50, 1) + if(target_turf) //slams you on a fake table + playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) var/obj/effect/overlay_holder = new(target_turf) + overlay_holder.name = "Catboy Table" + overlay_holder.desc = "Where bad catboys go." var/image/table_overlay = image('icons/obj/smooth_structures/table.dmi', "table") overlay_holder.add_overlay(table_overlay) - QDEL_IN(1, overlay_holder) + QDEL_IN(overlay_holder, 10) /datum/beepsky_fashion/cake //nothing else. it's just beepsky. with a cake on his head. obj_icon_state = "cake" @@ -171,6 +181,7 @@ attack_one = "BOT beats CRIMINAL with the chain of command!" attack_two = "BOT beats you with the chain of command!" patrol_emote = "Uselessness protocols engaged." + patrol_fail_emote = "Unit has been found as useless. Rebooting." arrest_texts = list("Demoting", "Firing") arrest_emote = "ARREST_TYPE level THREAT_LEVEL lesser crewmember CRIMINAL in LOCATION." stun_sounds = list('sound/weapons/chainhit.ogg') @@ -185,6 +196,7 @@ attack_one = "BOT strikes CRIMINAL with his kingly authority!" attack_two = "BOT strikes you with his kingly authority!" patrol_emote = "Searching for peasants to beat up." + patrol_fail_emote = "Peasants are using dark magic. Recallibrating." arrest_texts = list("Knighting", "Executing") arrest_emote = "ARREST_TYPE level THREAT_LEVEL peasant CRIMINAL in LOCATION." stun_sounds = list('sound/weapons/punch1.ogg', @@ -202,6 +214,7 @@ attack_one = "BOT strikes CRIMINAL with his cutlass!" attack_two = "BOT strikes you with his cutlass!" patrol_emote = "Searching for enemy vessels to board." + patrol_fail_emote = "No way to engage enemy vessels. Rebooting." arrest_texts = list("Boarding", "Sinking") arrest_emote = "ARREST_TYPE level THREAT_LEVEL vessel CRIMINAL in LOCATION." stun_sounds = list('sound/weapons/bladeslice.ogg') diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index ac995bdeaf..3ad19deeac 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -104,6 +104,7 @@ //emotes/speech stuff var/patrol_emote = "Engaging patrol mode." + var/patrol_fail_emote = "Unable to start patrol." /mob/living/simple_animal/bot/proc/get_mode() if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player. @@ -615,7 +616,7 @@ Pass a positive integer as an argument to override a bot's default speed. if(tries >= BOT_STEP_MAX_RETRIES) //Bot is trapped, so stop trying to patrol. auto_patrol = 0 tries = 0 - speak("Unable to start patrol.") + speak(patrol_fail_emote) return From 0706ac9d2a535db1be0231f2ff1a88456c2083d9 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 22 Jul 2020 00:14:26 +0100 Subject: [PATCH 24/85] woops --- .../mob/living/simple_animal/bot/secbot.dm | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index e2ab01b7bd..5934f7ea69 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -226,6 +226,23 @@ Auto Patrol: []"}, retaliate(H) if(special_retaliate_after_attack(H)) return + if(H.a_intent == INTENT_HELP && bot_hat) + to_chat(A, "You knock [bot_hat] off of [src]'s head!") + bot_hat.forceMove(get_turf(src)) + //reset all emotes/sounds + death_emote = initial(death_emote) + capture_one = initial(capture_one) + capture_two = initial(capture_two) + infraction = initial(infraction) + taunt = initial(taunt) + attack_one = initial(attack_one) + attack_two = initial(attack_two) + arrest_texts = initial(arrest_texts) + arrest_emote = initial(arrest_emote) + patrol_emote = initial(patrol_emote) + bot_hat = null + qdel(stored_fashion) + return return ..() @@ -298,22 +315,6 @@ Auto Patrol: []"}, if(!on) return if(iscarbon(A)) - if(bot_hat) - to_chat(A, "You knock [bot_hat] off of [src]'s head!") - bot_hat.forceMove(get_turf(src)) - //reset all emotes/sounds - death_emote = initial(death_emote) - capture_one = initial(capture_one) - capture_two = initial(capture_two) - infraction = initial(infraction) - taunt = initial(taunt) - attack_one = initial(attack_one) - attack_two = initial(attack_two) - arrest_texts = initial(arrest_texts) - arrest_emote = initial(arrest_emote) - patrol_emote = initial(patrol_emote) - bot_hat = null - qdel(stored_fashion) var/mob/living/carbon/C = A if(CHECK_MOBILITY(C, MOBILITY_MOVE|MOBILITY_USE|MOBILITY_STAND) || arrest_type) // CIT CHANGE - makes sentient secbots check for canmove rather than !isstun. stun_attack(A) From 6a4264085c56972758639188d2b547d308f00b44 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 22 Jul 2020 00:17:03 +0100 Subject: [PATCH 25/85] woops 2: electric boogaloo --- code/modules/mob/living/simple_animal/bot/secbot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 5934f7ea69..de811cc644 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -227,7 +227,7 @@ Auto Patrol: []"}, if(special_retaliate_after_attack(H)) return if(H.a_intent == INTENT_HELP && bot_hat) - to_chat(A, "You knock [bot_hat] off of [src]'s head!") + to_chat(H, "You knock [bot_hat] off of [src]'s head!") bot_hat.forceMove(get_turf(src)) //reset all emotes/sounds death_emote = initial(death_emote) From 9fc669b4ea7725f99256a6ae6966d55f601187f1 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 22 Jul 2020 02:09:49 -0700 Subject: [PATCH 26/85] Update changeling.dm --- code/modules/antagonists/changeling/changeling.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 3267f2bdc1..d06ebe9d9d 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -20,6 +20,8 @@ var/datum/changelingprofile/first_prof = null var/dna_max = 6 //How many extra DNA strands the changeling can store for transformation. var/absorbedcount = 0 + /// did we get succed by another changeling + var/hostile_absorbed = FALSE var/trueabsorbs = 0//dna gained using absorb, not dna sting var/chem_charges = 20 var/chem_storage = 75 From 30e7483e893e51fbbaa9f2b6d88d9d6418fa322d Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 22 Jul 2020 02:10:24 -0700 Subject: [PATCH 27/85] Update absorb.dm --- code/modules/antagonists/changeling/powers/absorb.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 3e2ff6f3dd..208fefee70 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -92,7 +92,7 @@ var/datum/antagonist/changeling/target_ling = target.mind.has_antag_datum(/datum/antagonist/changeling) - if(target_ling)//If the target was a changeling, suck out their extra juice and objective points! + if(target_ling && !target_ling.hostile_absorbed)//If the target was a changeling, suck out their extra juice and objective points! to_chat(user, "[target] was one of us. We have absorbed their power.") target_ling.remove_changeling_powers() changeling.geneticpoints += round(target_ling.geneticpoints/2) @@ -102,6 +102,7 @@ changeling.chem_storage += round(target_ling.chem_storage/2) changeling.chem_charges += min(target_ling.chem_charges, changeling.chem_storage) target_ling.chem_charges = 0 + target_ling.hostile_absorbed = TRUE target_ling.chem_storage = 0 changeling.absorbedcount += (target_ling.absorbedcount) target_ling.stored_profiles.len = 1 From 919edfa2fd08cf940d0d6218466d892381415821 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 22 Jul 2020 02:11:20 -0700 Subject: [PATCH 28/85] Update revive.dm --- code/modules/antagonists/changeling/powers/revive.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm index 6c2220648d..f98c2e8ee4 100644 --- a/code/modules/antagonists/changeling/powers/revive.dm +++ b/code/modules/antagonists/changeling/powers/revive.dm @@ -36,8 +36,10 @@ . = ..() if(!.) return - - if(HAS_TRAIT(user, CHANGELING_DRAIN) || ((user.stat != DEAD) && !(HAS_TRAIT(user, TRAIT_DEATHCOMA)))) + var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist_changeling) + if(!changeling) + return FALSE + if(changeling.hostile_absorbed || ((user.stat != DEAD) && !(HAS_TRAIT(user, TRAIT_DEATHCOMA)))) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.purchasedpowers -= src return FALSE From 0acf7b82d5a35f852fad55b6522fe7dcd5e228f1 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 22 Jul 2020 02:20:10 -0700 Subject: [PATCH 29/85] Update revive.dm --- code/modules/antagonists/changeling/powers/revive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm index f98c2e8ee4..e7e83a6796 100644 --- a/code/modules/antagonists/changeling/powers/revive.dm +++ b/code/modules/antagonists/changeling/powers/revive.dm @@ -36,7 +36,7 @@ . = ..() if(!.) return - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist_changeling) + var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(!changeling) return FALSE if(changeling.hostile_absorbed || ((user.stat != DEAD) && !(HAS_TRAIT(user, TRAIT_DEATHCOMA)))) From ed1e8c4221c244ef0513a99bbd695e8233c19d86 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 22 Jul 2020 15:43:58 +0100 Subject: [PATCH 30/85] support for masks --- code/datums/beepsky_fashion.dm | 14 ++++- code/modules/clothing/head/_head.dm | 2 +- code/modules/clothing/masks/_masks.dm | 1 + .../mob/living/simple_animal/bot/secbot.dm | 52 ++++++++++-------- ...secbot_head.dmi => secbot_accessories.dmi} | Bin 5 files changed, 43 insertions(+), 26 deletions(-) rename icons/mob/{secbot_head.dmi => secbot_accessories.dmi} (100%) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index a6e0a81dcd..058a005aa8 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -3,7 +3,7 @@ var/name //not setting the name and desc makes them go to the default var/desc - var/icon_file = 'icons/mob/secbot_head.dmi' + var/icon_file = 'icons/mob/secbot_accessories.dmi' //we sell secbots and secbot accessories var/obj_icon_state var/obj_alpha var/obj_color @@ -246,3 +246,15 @@ obj_icon_state = "sombrero" name = "Sombrerosky" desc = "A secbot wearing a sombrero. Truly, a hombre to all." + +/datum/beepsky_fashion/santa + obj_icon_state = "santa" + name = "Saint Beepsky" + desc = "Have you been a level 7 infraction this holiday season?" + capture_one = "BOT is tying CRIMINAL up with fairy lights!" + capture_two = "BOT is tying you up with fairy lights!" + infraction = "Level THREAT_LEVEL threat to holiday cheer spotted!" + attack_one = "BOT crushes CRIMINAL with their holiday spirit!" + attack_two = "BOT crushes you with their holiday spirit!" + arrest_emote = "ARREST_TYPE level THREAT_LEVEL threat to holiday cheer in LOCATION" + diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 0854d9c270..49ffa27214 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -8,7 +8,7 @@ var/blockTracking = 0 //For AI tracking var/can_toggle = null dynamic_hair_suffix = "+generic" - var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this hat to a secbot + var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this to a secbot /obj/item/clothing/head/Initialize() . = ..() diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 7df38661e5..55b14e2d5f 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -8,6 +8,7 @@ var/modifies_speech = FALSE var/mask_adjusted = 0 var/adjusted_flags = null + var/datum/beepsky_fashion/beepsky_fashion //the associated datum for applying this to a secbot /obj/item/clothing/mask/attack_self(mob/user) if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index de811cc644..cec25f50c0 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -33,7 +33,7 @@ var/check_records = TRUE //Does it check security records? var/arrest_type = FALSE //If true, don't handcuff - var/obj/item/clothing/head/bot_hat + var/obj/item/clothing/head/bot_accessory var/datum/beepsky_fashion/stored_fashion //emotes (BOT is replaced with bot name, CRIMINAL with criminal name, THREAT_LEVEL with threat level) @@ -226,9 +226,9 @@ Auto Patrol: []"}, retaliate(H) if(special_retaliate_after_attack(H)) return - if(H.a_intent == INTENT_HELP && bot_hat) - to_chat(H, "You knock [bot_hat] off of [src]'s head!") - bot_hat.forceMove(get_turf(src)) + if(H.a_intent == INTENT_HELP && bot_accessory) + to_chat(H, "You knock [bot_accessory] off of [src]'s head!") + bot_accessory.forceMove(get_turf(src)) //reset all emotes/sounds death_emote = initial(death_emote) capture_one = initial(capture_one) @@ -240,7 +240,7 @@ Auto Patrol: []"}, arrest_texts = initial(arrest_texts) arrest_emote = initial(arrest_emote) patrol_emote = initial(patrol_emote) - bot_hat = null + bot_accessory = null qdel(stored_fashion) return @@ -250,7 +250,7 @@ Auto Patrol: []"}, ..() if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return - if(istype(W, /obj/item/clothing/head)) + if(istype(W, /obj/item/clothing/head) || istype(W, /obj/item/clothing/mask)) attempt_place_on_head(user, W) return if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. @@ -258,39 +258,43 @@ Auto Patrol: []"}, if(special_retaliate_after_attack(user)) return -/mob/living/simple_animal/bot/secbot/proc/attempt_place_on_head(mob/user, obj/item/clothing/head/H) +/mob/living/simple_animal/bot/secbot/proc/attempt_place_on_head(mob/user, obj/item/I) if(user && !user.temporarilyRemoveItemFromInventory(H)) to_chat(user, "\The [H] is stuck to your hand, you cannot put it on [src]'s head!") return - if(bot_hat) - to_chat("\[src] already has a hat, and the laws of physics disallow him from wearing a second!") - if(H.beepsky_fashion) - to_chat(user, "You set [H] on [src]'s head.") - bot_hat = H + if(bot_accessory) + to_chat("\[src] already has an accessory, and the laws of physics disallow him from wearing a second!") + return + if(istype(I, /obj/item/clothing/head) + var/obj/item/clothing/head/H = I + if(H.beepsky_fashion) + stored_fashion = new H.beepsky_fashion + else + //it must be a mask + var/obj/item/clothing/mask/M = I + if(M.beepsky_fashion) + stored_fashion = new M.beepsky_fashion + if(stored_fashion) + to_chat(user, "You set [I] on [src].") + bot_accessory = H H.forceMove(src) - update_beepsky_fluff() + stored_fashion.apply(src) regenerate_icons() else to_chat(user, "You set [H] on [src]'s head, but it falls off!") H.forceMove(drop_location()) -/mob/living/simple_animal/bot/secbot/proc/update_beepsky_fluff() - var/datum/beepsky_fashion/BF = new bot_hat.beepsky_fashion - stored_fashion = BF - if(BF) - BF.apply(src) - /mob/living/simple_animal/bot/secbot/regenerate_icons() ..() - if(bot_hat) + if(bot_accessory) if(!stored_fashion) - stored_fashion = new bot_hat.beepsky_fashion + stored_fashion = new bot_accessory.beepsky_fashion if(!stored_fashion.obj_icon_state) - stored_fashion.obj_icon_state = bot_hat.icon_state + stored_fashion.obj_icon_state = bot_accessory.icon_state if(!stored_fashion.obj_alpha) - stored_fashion.obj_alpha = bot_hat.alpha + stored_fashion.obj_alpha = bot_accessory.alpha if(!stored_fashion.obj_color) - stored_fashion.obj_color = bot_hat.color + stored_fashion.obj_color = bot_accessory.color add_overlay(stored_fashion.get_overlay()) /mob/living/simple_animal/bot/secbot/emag_act(mob/user) diff --git a/icons/mob/secbot_head.dmi b/icons/mob/secbot_accessories.dmi similarity index 100% rename from icons/mob/secbot_head.dmi rename to icons/mob/secbot_accessories.dmi From a607130e3cd8283758baa1ac68fe89836d332940 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 22 Jul 2020 16:24:35 +0100 Subject: [PATCH 31/85] please compile --- .../mob/living/simple_animal/bot/secbot.dm | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index cec25f50c0..e0d65b13da 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -259,30 +259,30 @@ Auto Patrol: []"}, return /mob/living/simple_animal/bot/secbot/proc/attempt_place_on_head(mob/user, obj/item/I) - if(user && !user.temporarilyRemoveItemFromInventory(H)) - to_chat(user, "\The [H] is stuck to your hand, you cannot put it on [src]'s head!") + if(user && !user.temporarilyRemoveItemFromInventory(I)) + to_chat(user, "\The [I] is stuck to your hand, you cannot put it on [src]'s head!") return if(bot_accessory) to_chat("\[src] already has an accessory, and the laws of physics disallow him from wearing a second!") return - if(istype(I, /obj/item/clothing/head) + if(istype(I, /obj/item/clothing/head)) var/obj/item/clothing/head/H = I if(H.beepsky_fashion) stored_fashion = new H.beepsky_fashion else //it must be a mask var/obj/item/clothing/mask/M = I - if(M.beepsky_fashion) - stored_fashion = new M.beepsky_fashion + if(M.beepsky_fashion) + stored_fashion = new M.beepsky_fashion if(stored_fashion) to_chat(user, "You set [I] on [src].") - bot_accessory = H - H.forceMove(src) + bot_accessory = I + I.forceMove(src) stored_fashion.apply(src) regenerate_icons() else - to_chat(user, "You set [H] on [src]'s head, but it falls off!") - H.forceMove(drop_location()) + to_chat(user, "You set [I] on [src]'s head, but it falls off!") + I.forceMove(drop_location()) /mob/living/simple_animal/bot/secbot/regenerate_icons() ..() @@ -468,7 +468,6 @@ Auto Patrol: []"}, look_for_perp() bot_patrol() - return /mob/living/simple_animal/bot/secbot/proc/back_to_idle() From 6c308ec420b7801932da6533aa79531c28d0c2d6 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 22 Jul 2020 16:34:37 +0100 Subject: [PATCH 32/85] more accessories --- icons/mob/secbot_accessories.dmi | Bin 1536 -> 1723 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/secbot_accessories.dmi b/icons/mob/secbot_accessories.dmi index 2d6b7c9cbabaf6e79393d7d9a340daa45dbb4c19..76637b031ced7280754dccbbd3bce0de33100058 100644 GIT binary patch delta 1491 zcmYk6c~sI_6vux=j$@iuT9j$pHlE7Vw4BlmYh1>utcYAD3>!7vMidt`mmg(@PFY&H zB}l82=}7L1Cb(;$W{w(&;p6}o+c67bi@`HzI`jUx@4R#GyYGAN=blF}XMPcIrAeEH=s?IdqcGWkt8!9f(bN2o!;XEGOYx>Fhq<>pb zm(`>GLz#8fB$KOr_=g#YQB^DKX8jsv!{1n2;$&_)*t+Qi>G+clQ}2|&jzLp6I%DBu z;;P$5@LS04vLm>oFwE{DNO8uw;H|!nW4&Z@w7V}m*8*|pQzY$kp(V#!p*RJt`~m8D zYF_dL&x#4BFZ9}ryN`}sgI{TqH{P=!nvcW~?-F7y;w~XA&U{fjq2uBy38NL6Q2?;K z!p{plj7%j-W}*V8eJuJD(x7vMcTHI(h{88R$NHkcWVD_ zCO=WjMLd?S#@EUNOG)2C6RE-%iebu7MxOXeCNxL<@E7r^NyHWvIZgLeF8{u$ zBfF{!F?0~9?2gq1{L@_UY#8a8MPYBTp(~o;4MM?CLKGQ-(_gE-l_jqdNk_p; zD=NyALxJZUh($kbZ@d|~qI=+eljkSqr(ym(v&fBmX1L;7ge&^|M01xDsl0l4IC$wA z&t(5%!vd2!xe|O-T2g&Jd4FgVs>y;i5#7|*yKKU7N>)~u!t2=~5U5y(s>+nnCoY)F zUS%D&uUkq@{VvHv@0*BT-#_{!4Pis{Ggz2|7a;HHYx!5F-ZE}RWYq-01`RZK&DNo| zju<8@OuguXFiOBh^tB3{3$I&qODW0)MK^-v%#6A<4WlI~n^;pN>x$pYp-%6*Z;1e| z))}2)nHX!!KUfL|P^TztGlsQjS&^eWjS2bhAp&uH{jNy^9E5H;T0(L6v8Zz>FmA1> z*_NrPv}7{ryB*Kk#oAMAYdK+T*$6gvXB07}1da+0ZU^;!V1X^2=WAc~(;|+TQ>oOm zVQj|_g8W_Fj*w?O%Z6M{u&cKGTs znRxGI?mJ z^!j?yvNlHb6qN+6B&Wj(3@y**QH9!rASn19Wm@_H68pSO^WoOOo6dCIfEthWy`Fr@ z1x)Nax@md4dx=kO@})tz=D^3zbsiFK%S|vuIluYq(0m^2kdxB0Jft8%ZIdY$I}>>_ zVW#j6Z&W?<9HdheWOWu?=KeLF(ZiXZUc3vw*KXK1X|R*0*6l(}B92SFPkx|f`qnv@#Z*&@gC2L=Z0vR9HyM-|dQ<*eL_hOII7 z%EHxy@$oO++}xteWNJG*Gm;v_YoFf0<(#3v_)0W>Jj%km6Z7M#ZOt%m$@qBlb1wzR z8-OKqB+X&HgS`^}a1RLE5yxX?kZ+WY(da28e2ty0+FKg(=ev}43V6lsshzVYW3NrQl$V>18t9$+_Pr(vCzgI=z|Y&?tM*9f<$nOC-1^Y~ delta 1302 zcmV+x1?l>`4S)=g77qa62m=5B0NbBPVgLXDe`gBGEiTSlk^?OIykd{Q!1ij7D?MX?@D7aysi-Lb!qGGID102Bqi z9rccWjqEp0%t94ja$fjDh}F}AvLvIeogHcdvRhy(iYov8!xvDBme98d+%o_G1OG`x zK~#90?cHft8c7t!@rGuPw1fbY2|^6P5k!q_LonMey>@PVjhq+uBW-``oxcgO}FJ%kal4HVru~aJA4?y+1 zfAaZd4UNPJr+bd~AD=+3Qu$|*>=*fbz(TfQ-#|Y5pcH$MwUmf{XFj{C)BTl`cTg@@ zD&_$&6=wUlN>smGU+*uzedh{E6|&!*XDXFkSc#bl6L0bOhtq<@+h6s|_0|3qc|L0W zcz2okCd;;~WPkc)|G!$_uld$i{$;QFf7e|f0000000000{8}49)ngt-o3)y&T@7)8xytJ$;^ zsD8P=8L;}B@%VS^22#vxji|90uu*GR3Yx7}tC?7!`sMml)eZMOoMLXS&*qbsf0?iK zWHa$DofX6q3sk>c|9V2#Gn``HXhc!`jG8C)QIu2=KmKz`1*%`J4*&oF00000007)C z?X_ZEAQ$kf9c;NqYzH0p4n)7myHD%WPuEj!=G$s-o4<~@jIT`XT0SA0000000000z}@Ms z73%`IfM31m{pXGmMXU?t0xml{N#Fiby?+0Xe&0G_ufMyyYma5WJO61@Njn@|{cvYz zuzbH<-^@4MGgoMDXqnK&!{N{x%YKoMe!9Y=+XefB#kL27{pI`R`tg9hf0+FMW*i6L z>=*gLXmoXjN27z=1^bI#A6|dEM88}=h-Z7T_adG$ar|CyH)e@tzszsUbeJ^XjZGgW z9DwXs`G3k`%KhuE4*&oF000000R9Km8@7{m-^TYdhE5^FOnZLc}B@cq*qbn=KxjJreneVG>!nAX*2XHzbpN-GYFV4@+*YWAC{POa0GT*?&e7|(R%ICM| z!m_b05cy Date: Wed, 22 Jul 2020 16:37:15 +0100 Subject: [PATCH 33/85] more --- icons/mob/secbot_accessories.dmi | Bin 1723 -> 1725 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/secbot_accessories.dmi b/icons/mob/secbot_accessories.dmi index 76637b031ced7280754dccbbd3bce0de33100058..b6c7bad6fa3ec04db33e02db164c5645aeab6aeb 100644 GIT binary patch delta 217 zcmV;~04D#t4ZRJpJOO{gdQ@0+L}hbha%pgMX>V=-0C=2@lEDswFbsyz>?szw8l&RX zi-8yp@(u+GYmkj}iv*wEp$AT6q?fANVoGJb delta 215 zcmV;|04V>x4Z97nJOO{edQ@0+L}hbha%pgMX>V=-0C=2@(ydZ+B9wL z+NIGn4)q;SPPtgY9HhoReX$*!42I=D^4$Rmskj%9vJ&~T=xAq$nt*H+Zh=%3RsQ=h RUv6-panGK8X|o3cwgdzUW{v;= From a155f2425308ffd9f89b9779d9d2f63d40e7acff Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 22 Jul 2020 16:53:51 +0100 Subject: [PATCH 34/85] let santa hat go on --- code/modules/clothing/head/misc.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index d55c3a00af..e005915f74 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -260,6 +260,7 @@ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT dog_fashion = /datum/dog_fashion/head/santa + beepsky_fashion = /datum/beepsky_fashion/santa /obj/item/clothing/head/jester name = "jester hat" From e0e2cd561a6d59d776ee6d69cab3615a0303ee08 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 22 Jul 2020 11:38:26 -0700 Subject: [PATCH 35/85] Update revive.dm --- code/modules/antagonists/changeling/powers/revive.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm index e7e83a6796..f193fb6736 100644 --- a/code/modules/antagonists/changeling/powers/revive.dm +++ b/code/modules/antagonists/changeling/powers/revive.dm @@ -40,7 +40,6 @@ if(!changeling) return FALSE if(changeling.hostile_absorbed || ((user.stat != DEAD) && !(HAS_TRAIT(user, TRAIT_DEATHCOMA)))) - var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) changeling.purchasedpowers -= src return FALSE From 66e4d98141fdb6d7b6155ba3a7a023dc8c959954 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 22 Jul 2020 16:59:51 -0700 Subject: [PATCH 36/85] Update datacore.dm --- code/datums/datacore.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 94940b3855..cf942f077f 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -78,6 +78,8 @@ /datum/datacore/proc/manifest() for(var/mob/dead/new_player/N in GLOB.player_list) + if(!N?.client) + continue if(N.new_character) log_manifest(N.ckey,N.new_character.mind,N.new_character) if(ishuman(N.new_character)) From 697cef017bd081fc29714aa46dcfd64b7231eb1e Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 22 Jul 2020 23:43:57 -0700 Subject: [PATCH 37/85] Update living.dm --- code/modules/mob/living/living.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c09493e1b1..e57298d234 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -802,7 +802,7 @@ else throw_alert("gravity", /obj/screen/alert/weightless) if(!override && !is_flying()) - INVOKE_ASYNC(src, .proc/float, !has_gravity) + INVOKE_ASYNC(src, /atom/movable.proc/float, !has_gravity) /mob/living/float(on) if(throwing) From 2290823ace31c53373f2cf52e593e0b39a540d42 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 23 Jul 2020 14:40:36 +0100 Subject: [PATCH 38/85] fixes hat removal --- code/modules/mob/living/simple_animal/bot/secbot.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index e0d65b13da..351bf10d7d 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -227,9 +227,12 @@ Auto Patrol: []"}, if(special_retaliate_after_attack(H)) return if(H.a_intent == INTENT_HELP && bot_accessory) + to_chat(H, "You knock [bot_accessory] off of [src]'s head!") bot_accessory.forceMove(get_turf(src)) - //reset all emotes/sounds + //reset all emotes/sounds and name/desc + name = initial(name) + desc = initial(desc) death_emote = initial(death_emote) capture_one = initial(capture_one) capture_two = initial(capture_two) @@ -240,8 +243,11 @@ Auto Patrol: []"}, arrest_texts = initial(arrest_texts) arrest_emote = initial(arrest_emote) patrol_emote = initial(patrol_emote) + arrest_texts = initial(arrest_texts) + arrest_emote = initial(arrest_emote) bot_accessory = null qdel(stored_fashion) + regenerate_icons() return return ..() From 55754023baf97174c479d119da9b9267182ed1bb Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 23 Jul 2020 10:32:21 -0700 Subject: [PATCH 39/85] Update gas_mixture.dm --- code/modules/atmospherics/gasmixtures/gas_mixture.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index 069a91ce13..e86b249be6 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) dummy["HEAT CAPACITY"] = heat_capacity() dummy["TOTAL MOLES"] = total_moles() dummy["VOLUME"] = return_volume() - dummy["THERMAL ENERGY"] = themral_energy() + dummy["THERMAL ENERGY"] = thermal_energy() return debug_variable("gases (READ ONLY)", dummy, 0, src) /datum/gas_mixture/vv_get_dropdown() From 3dac7e4b43f269e81dbd6fad1d1fe9b741620f17 Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 19:44:02 +0200 Subject: [PATCH 40/85] Update generic_positive_events.dm --- code/datums/mood_events/generic_positive_events.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 95177f6869..8f98917ed3 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -196,3 +196,7 @@ description = "That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this.\n" mood_change = 4 timeout = 4 MINUTES + +/datum/mood_event/cleared_stomach + description = "Feels nice to get that out of the way!\n" + mood_change = 3 From b18356c95d4973e6890cc3605d24255edca842e1 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 23 Jul 2020 18:47:34 +0100 Subject: [PATCH 41/85] requested changes --- code/datums/beepsky_fashion.dm | 39 ------ .../mob/living/simple_animal/bot/secbot.dm | 115 ++++++++++++------ 2 files changed, 75 insertions(+), 79 deletions(-) diff --git a/code/datums/beepsky_fashion.dm b/code/datums/beepsky_fashion.dm index 058a005aa8..1156822c93 100644 --- a/code/datums/beepsky_fashion.dm +++ b/code/datums/beepsky_fashion.dm @@ -37,45 +37,6 @@ beepsky_overlay.color = obj_color return beepsky_overlay -/datum/beepsky_fashion/proc/apply(mob/living/simple_animal/bot/secbot/beepers) //set the emote depending on the fashion datum, if nothing set, turn it back to how it was initially - //assume name and description is always set, because otherwise, what would be the point of beepsky fashion? - beepers.name = name - beepers.desc = desc - - //set each variable in beepsky if its defined here, otherwise set it to its initial value just in case - if(death_emote) - beepers.death_emote = death_emote - - if(capture_one) - beepers.capture_one = capture_one - - if(capture_two) - beepers.capture_two = capture_two - - if(infraction) - beepers.infraction = infraction - - if(taunt) - beepers.taunt = taunt - - if(attack_one) - beepers.attack_one = attack_one - - if(attack_two) - beepers.attack_two = attack_two - - if(patrol_emote) - beepers.patrol_emote = patrol_emote - - if(patrol_fail_emote) - beepers.patrol_fail_emote = patrol_fail_emote - - if(arrest_texts) - beepers.arrest_texts = arrest_texts - - if(arrest_emote) - beepers.arrest_emote = arrest_emote - /datum/beepsky_fashion/proc/stun_attack(mob/living/carbon/C) //fired when beepsky does a stun attack with the fashion worn, for sounds/overlays/etc return diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 351bf10d7d..9281206a6a 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -98,6 +98,68 @@ emote = replacetext(emote, "LOCATION", location) return emote +/mob/living/simple_animal/bot/secbot/proc/apply_fashion(var/datum/beepsky_fashion/fashion) + stored_fashion = new fashion + if(stored_fashion.name) + name = stored_fashion.name + + if(stored_fashion.desc) + desc = stored_fashion.desc + + if(stored_fashion.death_emote) + death_emote = stored_fashion.death_emote + + if(stored_fashion.capture_one) + capture_one = stored_fashion.capture_one + + if(stored_fashion.capture_two) + capture_two = stored_fashion.capture_two + + if(stored_fashion.infraction) + infraction = stored_fashion.infraction + + if(stored_fashion.taunt) + taunt = stored_fashion.taunt + + if(stored_fashion.attack_one) + attack_one = stored_fashion.attack_one + + if(stored_fashion.attack_two) + attack_two = stored_fashion.attack_two + + if(stored_fashion.patrol_emote) + patrol_emote = stored_fashion.patrol_emote + + if(stored_fashion.patrol_fail_emote) + patrol_fail_emote = stored_fashion.patrol_fail_emote + + if(stored_fashion.arrest_texts) + arrest_texts = stored_fashion.arrest_texts + + if(stored_fashion.arrest_emote) + arrest_emote = stored_fashion.arrest_emote + +/mob/living/simple_animal/bot/secbot/proc/reset_fashion() + bot_accessory.forceMove(get_turf(src)) + //reset all emotes/sounds and name/desc + name = initial(name) + desc = initial(desc) + death_emote = initial(death_emote) + capture_one = initial(capture_one) + capture_two = initial(capture_two) + infraction = initial(infraction) + taunt = initial(taunt) + attack_one = initial(attack_one) + attack_two = initial(attack_two) + arrest_texts = initial(arrest_texts) + arrest_emote = initial(arrest_emote) + patrol_emote = initial(patrol_emote) + arrest_texts = initial(arrest_texts) + arrest_emote = initial(arrest_emote) + bot_accessory = null + qdel(stored_fashion) + regenerate_icons() + /mob/living/simple_animal/bot/secbot/beepsky/explode() var/atom/Tsec = drop_location() new /obj/item/stock_parts/cell/potato(Tsec) @@ -229,25 +291,7 @@ Auto Patrol: []"}, if(H.a_intent == INTENT_HELP && bot_accessory) to_chat(H, "You knock [bot_accessory] off of [src]'s head!") - bot_accessory.forceMove(get_turf(src)) - //reset all emotes/sounds and name/desc - name = initial(name) - desc = initial(desc) - death_emote = initial(death_emote) - capture_one = initial(capture_one) - capture_two = initial(capture_two) - infraction = initial(infraction) - taunt = initial(taunt) - attack_one = initial(attack_one) - attack_two = initial(attack_two) - arrest_texts = initial(arrest_texts) - arrest_emote = initial(arrest_emote) - patrol_emote = initial(patrol_emote) - arrest_texts = initial(arrest_texts) - arrest_emote = initial(arrest_emote) - bot_accessory = null - qdel(stored_fashion) - regenerate_icons() + reset_fashion() return return ..() @@ -256,7 +300,7 @@ Auto Patrol: []"}, ..() if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry. return - if(istype(W, /obj/item/clothing/head) || istype(W, /obj/item/clothing/mask)) + if(istype(W, /obj/item/clothing/head)) attempt_place_on_head(user, W) return if(!istype(W, /obj/item/screwdriver) && (W.force) && (!target) && (W.damtype != STAMINA) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. @@ -264,31 +308,22 @@ Auto Patrol: []"}, if(special_retaliate_after_attack(user)) return -/mob/living/simple_animal/bot/secbot/proc/attempt_place_on_head(mob/user, obj/item/I) - if(user && !user.temporarilyRemoveItemFromInventory(I)) - to_chat(user, "\The [I] is stuck to your hand, you cannot put it on [src]'s head!") +/mob/living/simple_animal/bot/secbot/proc/attempt_place_on_head(mob/user, obj/item/clothing/head/H) + if(user && !user.temporarilyRemoveItemFromInventory(H)) + to_chat(user, "\The [H] is stuck to your hand, you cannot put it on [src]'s head!") return if(bot_accessory) to_chat("\[src] already has an accessory, and the laws of physics disallow him from wearing a second!") return - if(istype(I, /obj/item/clothing/head)) - var/obj/item/clothing/head/H = I - if(H.beepsky_fashion) - stored_fashion = new H.beepsky_fashion + + if(H.beepsky_fashion) + to_chat(user, "You set [H] on [src].") + bot_accessory = H + H.forceMove(src) + apply_fashion(H.beepsky_fashion) else - //it must be a mask - var/obj/item/clothing/mask/M = I - if(M.beepsky_fashion) - stored_fashion = new M.beepsky_fashion - if(stored_fashion) - to_chat(user, "You set [I] on [src].") - bot_accessory = I - I.forceMove(src) - stored_fashion.apply(src) - regenerate_icons() - else - to_chat(user, "You set [I] on [src]'s head, but it falls off!") - I.forceMove(drop_location()) + to_chat(user, "You set [H] on [src]'s head, but it falls off!") + H.forceMove(drop_location()) /mob/living/simple_animal/bot/secbot/regenerate_icons() ..() From 9d89158fdab434e2dcc5a5e2319f5f659c9c511f Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 19:48:41 +0200 Subject: [PATCH 42/85] Update cuts.dm --- code/datums/wounds/cuts.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm index 0ab3bbd5f8..e6e4aeedb6 100644 --- a/code/datums/wounds/cuts.dm +++ b/code/datums/wounds/cuts.dm @@ -152,6 +152,11 @@ user.visible_message("[user] licks the wounds on [victim]'s [limb.name].", "You lick some of the wounds on [victim]'s [limb.name]", ignored_mobs=victim) to_chat(victim, "[user] licks the wounds on your [limb.name]! minimum_flow) try_handling(user) From 2ddd2942b9a0197759ada934014aecb564206eaa Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 19:54:34 +0200 Subject: [PATCH 43/85] Add files via upload --- sound/voice/catpeople/distressed.ogg | Bin 0 -> 16815 bytes sound/voice/catpeople/license.txt | 2 ++ sound/voice/catpeople/puking.ogg | Bin 0 -> 32516 bytes 3 files changed, 2 insertions(+) create mode 100644 sound/voice/catpeople/distressed.ogg create mode 100644 sound/voice/catpeople/license.txt create mode 100644 sound/voice/catpeople/puking.ogg diff --git a/sound/voice/catpeople/distressed.ogg b/sound/voice/catpeople/distressed.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cebe73dffcd09ffccf2c56ed8bff7f854ecff2fe GIT binary patch literal 16815 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 z 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 LWu3e*7Xbbb&3lu` literal 0 HcmV?d00001 From 673188bc7e29459254bef8f121dc1449b0df3006 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 23 Jul 2020 18:57:24 +0100 Subject: [PATCH 44/85] please show the hat --- code/modules/mob/living/simple_animal/bot/secbot.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 9281206a6a..e3d9725714 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -139,6 +139,8 @@ if(stored_fashion.arrest_emote) arrest_emote = stored_fashion.arrest_emote + regenerate_icons() + /mob/living/simple_animal/bot/secbot/proc/reset_fashion() bot_accessory.forceMove(get_turf(src)) //reset all emotes/sounds and name/desc From 967dfb7bc4dbf143b97cf56c9f84af8ade495b1e Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 19:59:08 +0200 Subject: [PATCH 45/85] Update other_reagents.dm --- .../chemistry/reagents/other_reagents.dm | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 5c5821381e..02eb198388 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2336,3 +2336,54 @@ reagent_state = SOLID color = "#E6E6DA" taste_mult = 0 + + +/datum/reagent/hairball + name = "Hairball" + description = "A bundle of keratinous bits and fibers, not easily digestible." + reagent_state = SOLID + can_synth = FALSE + metabolization_rate = 0.05 * REAGENTS_METABOLISM + taste_description = "wet hair" + var/amount = 0 + var/knotted = 0 + +/datum/reagent/hairball/on_mob_life(mob/living/carbon/M) + amount = M.reagents.get_reagent_amount(/datum/reagent/hairball) + + if(amount < 10) + knotted = 0 + + if(prob(10)) + M.losebreath += 1 + M.emote("cough") + to_chat(M, "You clear your throat.") + + if(amount >= 10) + + if(knotted == 0) + to_chat(M, "You feel a knot in your stomach.") + knotted = 1 + + if(prob(5 + amount/2)) // don't want this to cause too much damage + M.losebreath += 2 + to_chat(M, "You feel a knot in your throat.") + M.emote("cough") + + else if(prob(amount - 4)) + to_chat(M, "Your stomach feels awfully bloated.") + playsound(M,'sound/voice/catpeople/distressed.ogg', 50, FALSE) + M.visible_message("[M] seems distressed!.", ignored_mobs=M) + + else if(prob(amount - 8)) + knotted = 0 + playsound(M,'sound/voice/catpeople/puking.ogg', 110, FALSE) + M.Immobilize(30) + sleep(30) + M.visible_message("[M] throws up a hairball! Disgusting!", ignored_mobs=M) + new /obj/item/toy/plush/Hairball(get_turf(M)) + to_chat(M, "Aaaah that's better!") + SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "cleared_stomach", /datum/mood_event/cleared_stomach, name) + M.reagents.del_reagent(/datum/reagent/hairball) + ..() + From 5463673831cf4a2a5ae334702150726eca67737d Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 23 Jul 2020 19:02:50 +0100 Subject: [PATCH 46/85] fuck --- code/modules/mob/living/simple_animal/bot/secbot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index e3d9725714..e6a9adf9ac 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -159,7 +159,7 @@ arrest_texts = initial(arrest_texts) arrest_emote = initial(arrest_emote) bot_accessory = null - qdel(stored_fashion) + stored_fashion = null regenerate_icons() /mob/living/simple_animal/bot/secbot/beepsky/explode() From 80f2766314b7a93ec715e993e76596af74359571 Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 20:11:29 +0200 Subject: [PATCH 47/85] Update plushes.dm --- code/game/objects/items/plushes.dm | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 00a9ff22f4..af529f764f 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -8,6 +8,7 @@ resistance_flags = FLAMMABLE var/list/squeak_override //Weighted list; If you want your plush to have different squeak sounds use this var/stuffed = TRUE //If the plushie has stuffing in it + var/unstuffable = FALSE //for plushies that can't be stuffed var/obj/item/grenade/grenade //You can remove the stuffing from a plushie and add a grenade to it for *nefarious uses* //--love ~<3-- gender = NEUTER @@ -174,6 +175,9 @@ /obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params) if(I.get_sharpness()) if(!grenade) + if(unstuffable) + to_chat(user, "Nothing to do here.") + return if(!stuffed) to_chat(user, "You already murdered it!") return @@ -187,6 +191,11 @@ grenade = null return if(istype(I, /obj/item/grenade)) + if(unstuffable) + to_chat(user, "No... you should destroy it now!") + sleep(10) + SEND_SOUND(user, 'sound/weapons/armbomb.ogg') + return if(stuffed) to_chat(user, "You need to remove some stuffing first!") return @@ -743,3 +752,14 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) attack_verb = list("headbutt", "scritched", "bit") squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) can_random_spawn = FALSE + + +/obj/item/toy/plush/Hairball + name = "Hairball" + desc = "A bundle of undigested fibers and scales. Yuck." + icon_state = "Hairball" + unstuffable = TRUE + young = TRUE // Your own mouth-baby. + squeak_override = list('sound/misc/splort.ogg'=1) + attack_verb = list("sploshed", "splorted", "slushed") + can_random_spawn = FALSE From e81d1abf033e4ae5221f34e04732ff74facffbd8 Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 20:15:48 +0200 Subject: [PATCH 48/85] Add files via upload --- icons/obj/plushes.dmi | Bin 12729 -> 13484 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index 3abb25d8b285a92a63f3e42071ce0ca3b435fb0f..11d02a46cc9bb2bd4574aacb89a791971495db4f 100644 GIT binary patch literal 13484 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 literal 12729 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 W15luB%)$SX0Vv9<%2Y@h2mcq75}KU= From e6dd213a2a299866d171746cf2dd81cb7903a77d Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 20:26:11 +0200 Subject: [PATCH 49/85] Update recipes_misc.dm --- code/datums/components/crafting/recipes/recipes_misc.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 86d1e77661..214c1b1427 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -324,6 +324,13 @@ result = /obj/item/toy/sword/cx subcategory = CAT_MISCELLANEOUS category = CAT_MISC + +/datum/crafting_recipe/catgirlplushie + name = "Catgirl Plushie" + reqs = list(/obj/item/toy/plush/hairball = 3) + result = /obj/item/toy/plush/catgirl + subcategory = CAT_MISCELLANEOUS + category = CAT_MISC //////////// //Unsorted// From 2c4ed01b756c475a0c0f7f08c193f0981d211325 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 23 Jul 2020 13:28:54 -0500 Subject: [PATCH 50/85] Automatic changelog generation for PR #12848 [ci skip] --- html/changelogs/AutoChangeLog-pr-12848.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12848.yml diff --git a/html/changelogs/AutoChangeLog-pr-12848.yml b/html/changelogs/AutoChangeLog-pr-12848.yml new file mode 100644 index 0000000000..0e9bc70dbb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12848.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - tweak: "sanitization now doesn't cut off 15.7 or something million possible colors from character preferences (instead of only allowing 16 values for R G and B, it now allows 256 each)" From e4f0a84404f6954ec91e425457f8f9b62441c226 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 23 Jul 2020 19:33:26 +0100 Subject: [PATCH 51/85] cut overlay --- code/modules/mob/living/simple_animal/bot/secbot.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index e6a9adf9ac..9d45b96831 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -159,7 +159,6 @@ arrest_texts = initial(arrest_texts) arrest_emote = initial(arrest_emote) bot_accessory = null - stored_fashion = null regenerate_icons() /mob/living/simple_animal/bot/secbot/beepsky/explode() @@ -339,6 +338,10 @@ Auto Patrol: []"}, if(!stored_fashion.obj_color) stored_fashion.obj_color = bot_accessory.color add_overlay(stored_fashion.get_overlay()) + else + if(stored_fashion) + cut_overlay(stored_fashion.get_overlay()) + stored_fashion = null /mob/living/simple_animal/bot/secbot/emag_act(mob/user) . = ..() From 464402ec6d729a3d0b93ba6b247ca2522b7a4375 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 23 Jul 2020 13:41:20 -0500 Subject: [PATCH 52/85] Automatic changelog generation for PR #12821 [ci skip] --- html/changelogs/AutoChangeLog-pr-12821.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12821.yml diff --git a/html/changelogs/AutoChangeLog-pr-12821.yml b/html/changelogs/AutoChangeLog-pr-12821.yml new file mode 100644 index 0000000000..7861bbc536 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12821.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - balance: "projectiles are by default 17.5 tiles per second instead of 12.5" From a2381755e161b89cf9971f6ce529a206cc3b7e0f Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 20:52:29 +0200 Subject: [PATCH 53/85] Update cuts.dm nomenclature error --- code/datums/wounds/cuts.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm index e6e4aeedb6..085e1be479 100644 --- a/code/datums/wounds/cuts.dm +++ b/code/datums/wounds/cuts.dm @@ -152,10 +152,10 @@ user.visible_message("[user] licks the wounds on [victim]'s [limb.name].", "You lick some of the wounds on [victim]'s [limb.name]", ignored_mobs=victim) to_chat(victim, "[user] licks the wounds on your [limb.name]! minimum_flow) From 554e764be8cc8abd9d7a487e9f88aed409a74ba2 Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 21:00:26 +0200 Subject: [PATCH 54/85] Update cuts.dm dang speededit --- code/datums/wounds/cuts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/wounds/cuts.dm b/code/datums/wounds/cuts.dm index 085e1be479..fea657ffee 100644 --- a/code/datums/wounds/cuts.dm +++ b/code/datums/wounds/cuts.dm @@ -155,7 +155,7 @@ if( ismoth(victim) || iscatperson(victim) || ismonkey(victim) ) // Yep you can lick monkeys. user.reagents.add_reagent(/datum/reagent/hairball, 2) - else if( ishumanbasic(victim) || isflyperson(victim) || islizard(victim) || isdullahan(victim) || ismammal(victim) ||) + else if( ishumanbasic(victim) || isflyperson(victim) || islizard(victim) || isdullahan(victim) || ismammal(victim) ) user.reagents.add_reagent(/datum/reagent/hairball, 1) if(blood_flow > minimum_flow) From b2a0d00eee8df41e967554b4571a002a6878bb47 Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 21:13:41 +0200 Subject: [PATCH 55/85] Update plushes.dm --- code/game/objects/items/plushes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index af529f764f..13ad1134a4 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -754,7 +754,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) can_random_spawn = FALSE -/obj/item/toy/plush/Hairball +/obj/item/toy/plush/hairball name = "Hairball" desc = "A bundle of undigested fibers and scales. Yuck." icon_state = "Hairball" From 21ef5fb1b73de1ec8e986200dbeb8cdfb9fcb2f0 Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 21:14:46 +0200 Subject: [PATCH 56/85] Update other_reagents.dm --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 02eb198388..32d2c779b5 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2381,7 +2381,7 @@ M.Immobilize(30) sleep(30) M.visible_message("[M] throws up a hairball! Disgusting!", ignored_mobs=M) - new /obj/item/toy/plush/Hairball(get_turf(M)) + new /obj/item/toy/plush/hairball(get_turf(M)) to_chat(M, "Aaaah that's better!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "cleared_stomach", /datum/mood_event/cleared_stomach, name) M.reagents.del_reagent(/datum/reagent/hairball) From 5d7dfd327ca7b2f023c4ede4af591c4a2f0ac2b9 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 23 Jul 2020 12:22:55 -0700 Subject: [PATCH 57/85] FUCK --- code/__HELPERS/sanitize_values.dm | 116 +++++++++++++++++++++++------- 1 file changed, 91 insertions(+), 25 deletions(-) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index cbe1817233..21ae7df940 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -51,40 +51,106 @@ return default return default -/proc/sanitize_hexcolor(color, desired_format=3, include_crunch=0, default) +#define RGB_FORMAT_INVALID 0 +#define RGB_FORMAT_SHORT 1 +#define RGB_FORMAT_LONG 2 + +/** + * Sanitizes a hexadecimal color. + * + * @params + * * color - input color, 3 or 6 characters without the #. + * * desired_format - 3 or 6 characters without the potential #. can only put in 3 or 6 here. + * * include_crunch - do we put a # at the start + * * default - default color. must be 3 or 6 characters with or without #. + * * default_replacement - what we replace broken letters with. + */ +/proc/sanitize_hexcolor(color, desired_format = 3, include_crunch = 0, default = "ffffff", default_replacement = "f") + if(!istext(default) || (length(default) < 3)) + CRASH("Default should be a text string of RGB format, with or without the crunch, 3 or 6 characters. Default was instead [default]") + if(!istext(default_replacement) || length(default_replacement) != 1)) + CRASH("Invalid default_replacement: [default_replacement]") + switch(text2ascii(default_replacement)) + if(48 to 57) + if(97 to 102) + if(65 to 70) + else // yeah yeah i know 3 empty if's.. + CRASH("Invalid default_replacement: [default_replacement]") var/crunch = include_crunch ? "#" : "" if(!istext(color)) - color = "" + color = default - var/start = 1 + (text2ascii(color, 1) == 35) var/len = length(color) - var/char = "" - // RRGGBB -> RGB but awful - var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3 + // get rid of crunch + if(len && color[1] == "#") + if(len >= 2) + color = copytext(color, 2) - . = "" - var/i = start - while(i <= len) + switch(desired_format) + if(3) + desired_format = RGB_FORMAT_SHORT + if(6) + desired_format = RGB_FORMAT_LONG + else + CRASH("Invalid desired_format: [desired_format]. Must be 3 or 6.") + var/current_format = RGB_FORMAT_INVALID + switch(length(color)) + if(3) + current_format = RGB_FORMAT_SHORT + if(6) + current_format = RGB_FORMAT_LONG + else + current_format = RGB_FORMAT_INVALID + + if(current_format == RGB_FORMAT_INVALID) // nah + color = default // process default + if(color[1] == "#") // we checked default was at least 3 chars long earlier + color = copytext(color, 2) + len = length(color) + switch(len) + if(3) + current_format = RGB_FORMAT_SHORT + if(6) + current_format = RGB_FORMAT_LONG + else + CRASH("Default was not 3 or 6 RGB hexadecimal characters: [default]") + + var/sanitized = "" + // first, sanitize hex + for(var/i in 1 to len) char = color[i] switch(text2ascii(char)) - if(48 to 57) //numbers 0 to 9 - . += char - if(97 to 102) //letters a to f - . += char - if(65 to 70) //letters A to F - . += lowertext(char) + if(48 to 57) // 0 to 9 + sanitized += char + if(97 to 102) // a to f + sanitized += char + if(65 to 70) // A to F (capitalized!) + sanitized += lowertext(char) else - break - i += length(char) - if(convert_to_shorthand && i <= len) //skip next one - i += length(color[i]) + sanitized += lowertext(default_replacement) + // do we need to convert? + if(desired_format == current_format) + return crunch + sanitized // no + // yes + if((desired_format == RGB_FORMAT_SHORT) && (current_format == RGB_FORMAT_LONG)) // downconvert + var/temp = "" + // we could do some math but we're lazy and in practice floor()ing this. + for(var/i in 1 to 6 step 2) + temp += sanitized[i] + sanitized = temp + else if((desired_format == RGB_FORMAT_LONG) && (current_format == RGB_FORMAT_SHORT)) // upconvert + var/temp = "" + for(var/i in 1 to 3) + temp += sanitized[i] + temp += sanitized[i] + sanitized = temp + else + CRAHS("Invalid desired_format and current_format pair: [desired_format], [current_format]. Could not determine which way to convert.") + return crunch + sanitized - if(length_char(.) != desired_format) - if(default) - return default - return crunch + repeat_string(desired_format, "0") - - return crunch + . +#undef RGB_FORMAT_INVALID +#undef RGB_FORMAT_SHORT +#undef RGB_FORMAT_LONG /proc/sanitize_ooccolor(color) if(length(color) != length_char(color)) From 59bd63471e4b86f142dc5fb5ba4e8c602cec1ef7 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 23 Jul 2020 12:23:13 -0700 Subject: [PATCH 58/85] sigh --- code/__HELPERS/sanitize_values.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 21ae7df940..4d726c926a 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -68,7 +68,7 @@ /proc/sanitize_hexcolor(color, desired_format = 3, include_crunch = 0, default = "ffffff", default_replacement = "f") if(!istext(default) || (length(default) < 3)) CRASH("Default should be a text string of RGB format, with or without the crunch, 3 or 6 characters. Default was instead [default]") - if(!istext(default_replacement) || length(default_replacement) != 1)) + if(!istext(default_replacement) || (length(default_replacement) != 1)) CRASH("Invalid default_replacement: [default_replacement]") switch(text2ascii(default_replacement)) if(48 to 57) From 758d746e96def1d4903149218cabfc906ae4393a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 23 Jul 2020 12:25:02 -0700 Subject: [PATCH 59/85] compile --- code/__HELPERS/sanitize_values.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 4d726c926a..e53bf275d6 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -56,7 +56,7 @@ #define RGB_FORMAT_LONG 2 /** - * Sanitizes a hexadecimal color. + * Sanitizes a hexadecimal color. Always outputs lowercase. * * @params * * color - input color, 3 or 6 characters without the #. @@ -70,6 +70,7 @@ CRASH("Default should be a text string of RGB format, with or without the crunch, 3 or 6 characters. Default was instead [default]") if(!istext(default_replacement) || (length(default_replacement) != 1)) CRASH("Invalid default_replacement: [default_replacement]") + default_replacement = lowertext(default_replacement) switch(text2ascii(default_replacement)) if(48 to 57) if(97 to 102) @@ -116,6 +117,7 @@ CRASH("Default was not 3 or 6 RGB hexadecimal characters: [default]") var/sanitized = "" + var/char = "" // first, sanitize hex for(var/i in 1 to len) char = color[i] @@ -127,7 +129,7 @@ if(65 to 70) // A to F (capitalized!) sanitized += lowertext(char) else - sanitized += lowertext(default_replacement) + sanitized += default_replacement // do we need to convert? if(desired_format == current_format) return crunch + sanitized // no @@ -145,7 +147,7 @@ temp += sanitized[i] sanitized = temp else - CRAHS("Invalid desired_format and current_format pair: [desired_format], [current_format]. Could not determine which way to convert.") + CRASH("Invalid desired_format and current_format pair: [desired_format], [current_format]. Could not determine which way to convert.") return crunch + sanitized #undef RGB_FORMAT_INVALID From 4da365851fb4726033278036fe567a19b8cf689a Mon Sep 17 00:00:00 2001 From: Iatots <5155917+Iatots@users.noreply.github.com> Date: Thu, 23 Jul 2020 21:27:00 +0200 Subject: [PATCH 60/85] up to regulations now. --- code/modules/reagents/chemistry/reagents/other_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 32d2c779b5..518b3d823f 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2365,7 +2365,7 @@ to_chat(M, "You feel a knot in your stomach.") knotted = 1 - if(prob(5 + amount/2)) // don't want this to cause too much damage + if(prob(5 + amount * 0.5)) // don't want this to cause too much damage M.losebreath += 2 to_chat(M, "You feel a knot in your throat.") M.emote("cough") From cbe0cad1a416a5f955a2b3f2aab689b7611e791c Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 23 Jul 2020 12:41:33 -0700 Subject: [PATCH 61/85] fix --- code/__HELPERS/sanitize_values.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index e53bf275d6..9080e04eca 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -86,6 +86,9 @@ if(len && color[1] == "#") if(len >= 2) color = copytext(color, 2) + else + color = "" + len = length(color) switch(desired_format) if(3) From 03f0d76a8e193d7d136295c34f5d09be623eafab Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Thu, 23 Jul 2020 13:23:45 -0700 Subject: [PATCH 62/85] yeah ok --- code/__HELPERS/mobs.dm | 6 +++--- code/__HELPERS/sanitize_values.dm | 2 +- code/datums/dna.dm | 12 ++++++------ code/modules/client/preferences.dm | 6 +++--- code/modules/mob/living/carbon/human/species.dm | 11 +++++------ .../mob/living/carbon/human/species_types/bugmen.dm | 2 +- .../living/carbon/human/species_types/furrypeople.dm | 2 +- .../mob/living/carbon/human/species_types/humans.dm | 2 +- .../living/carbon/human/species_types/jellypeople.dm | 4 ++-- .../living/carbon/human/species_types/podpeople.dm | 2 +- .../mob/living/carbon/human/species_types/vampire.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 6 +++--- 12 files changed, 28 insertions(+), 29 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index f8f6bca31a..ca12567b59 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -145,9 +145,9 @@ continue if(!S.ckeys_allowed) snowflake_ipc_antenna_list[S.name] = mspath - var/color1 = random_short_color() - var/color2 = random_short_color() - var/color3 = random_short_color() + var/color1 = random_color() + var/color2 = random_color() + var/color3 = random_color() var/body_model = MALE switch(intended_gender) diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index 9080e04eca..0441e0bcb7 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -65,7 +65,7 @@ * * default - default color. must be 3 or 6 characters with or without #. * * default_replacement - what we replace broken letters with. */ -/proc/sanitize_hexcolor(color, desired_format = 3, include_crunch = 0, default = "ffffff", default_replacement = "f") +/proc/sanitize_hexcolor(color, desired_format = 3, include_crunch = 0, default = rgb(218, 72, 255), default_replacement = "f") if(!istext(default) || (length(default) < 3)) CRASH("Default should be a text string of RGB format, with or without the crunch, 3 or 6 characters. Default was instead [default]") if(!istext(default_replacement) || (length(default_replacement) != 1)) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 23b6704080..8d80bc3f36 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -131,9 +131,9 @@ L[DNA_FACIAL_HAIR_COLOR_BLOCK] = sanitize_hexcolor(H.facial_hair_color) L[DNA_SKIN_TONE_BLOCK] = construct_block(GLOB.skin_tones.Find(H.skin_tone), GLOB.skin_tones.len) L[DNA_EYE_COLOR_BLOCK] = sanitize_hexcolor(H.eye_color) - L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"]) - L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"]) - L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"]) + L[DNA_COLOR_ONE_BLOCK] = sanitize_hexcolor(features["mcolor"], 6) + L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6) + L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6) if(!GLOB.mam_tails_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list) L[DNA_MUTANTTAIL_BLOCK] = construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len) @@ -239,11 +239,11 @@ if(DNA_HAIR_STYLE_BLOCK) setblock(uni_identity, blocknumber, construct_block(GLOB.hair_styles_list.Find(H.hair_style), GLOB.hair_styles_list.len)) if(DNA_COLOR_ONE_BLOCK) - sanitize_hexcolor(features["mcolor"]) + sanitize_hexcolor(features["mcolor"], 6) if(DNA_COLOR_TWO_BLOCK) - sanitize_hexcolor(features["mcolor2"]) + sanitize_hexcolor(features["mcolor2"], 6) if(DNA_COLOR_THREE_BLOCK) - sanitize_hexcolor(features["mcolor3"]) + sanitize_hexcolor(features["mcolor3"], 6) if(DNA_MUTANTTAIL_BLOCK) construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len) if(DNA_MUTANTEAR_BLOCK) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7f29efddb1..75e914ea68 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1798,11 +1798,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) //Now that we changed our species, we must verify that the mutant colour is still allowed. var/temp_hsv = RGBtoHSV(features["mcolor"]) - if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3])) + if(features["mcolor"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3])) features["mcolor"] = pref_species.default_color - if(features["mcolor2"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3])) + if(features["mcolor2"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3])) features["mcolor2"] = pref_species.default_color - if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3])) + if(features["mcolor3"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3])) features["mcolor3"] = pref_species.default_color if("custom_species") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index db0fa8d6c6..ba6fde421d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -7,7 +7,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/id // if the game needs to manually check your race to do something not included in a proc here, it will use this var/limbs_id //this is used if you want to use a different species limb sprites. Mainly used for angels as they look like humans. var/name // this is the fluff name. these will be left generic (such as 'Lizardperson' for the lizard race) so servers can change them to whatever - var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race + var/default_color = "#FFFFFF" // if alien colors are disabled, this is the color that will be used by that race var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows var/has_field_of_vision = TRUE @@ -854,10 +854,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/g = (H.dna.features["body_model"] == FEMALE) ? "f" : "m" var/list/colorlist = list() var/husk = HAS_TRAIT(H, TRAIT_HUSK) - colorlist += husk ? ReadRGB("#a3a3a3") :ReadRGB("[H.dna.features["mcolor"]]0") - colorlist += husk ? ReadRGB("#a3a3a3") :ReadRGB("[H.dna.features["mcolor2"]]0") - colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor3"]]0") - colorlist += list(0,0,0, hair_alpha) + colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor"]]00") + colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor2"]]00") + colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor3"]]00") + colorlist += husk ? list(0, 0, 0) : list(0, 0, 0, hair_alpha) for(var/index in 1 to colorlist.len) colorlist[index] /= 255 @@ -1031,7 +1031,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.apply_overlay(BODY_FRONT_LAYER) H.apply_overlay(HORNS_LAYER) - /* * Equip the outfit required for life. Replaces items currently worn. */ diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 6a9e9d0b13..a51dadb523 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -5,7 +5,7 @@ default_color = "00FF00" species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR,CAN_SCAR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG - mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", + mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 203f8fa289..d87b0c074c 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -5,7 +5,7 @@ icon_limbs = DEFAULT_BODYPART_ICON_CITADEL species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,CAN_SCAR) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST - mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", + mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 1868bd22df..b164fb1ba0 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -4,7 +4,7 @@ default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,CAN_SCAR) - mutant_bodyparts = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None") + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None") use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 31f326fd53..e97db7aced 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -7,7 +7,7 @@ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,WINGCOLOR) mutantlungs = /obj/item/organ/lungs/slime mutant_heart = /obj/item/organ/heart/slime - mutant_bodyparts = list("mcolor" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") + mutant_bodyparts = list("mcolor" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "mam_snouts" = "None", "taur" = "None", "deco_wings" = "None") inherent_traits = list(TRAIT_TOXINLOVER) meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime gib_types = list(/obj/effect/gibspawner/slime, /obj/effect/gibspawner/slime/bodypartless) @@ -443,7 +443,7 @@ default_color = "00FFFF" species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR) inherent_traits = list(TRAIT_TOXINLOVER) - mutant_bodyparts = list("mcolor" = "FFF", "mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None") + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", "mam_body_markings" = "Plain", "mam_snouts" = "None", "taur" = "None") say_mod = "says" hair_color = "mutcolor" hair_alpha = 160 //a notch brighter so it blends better. diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 36a1d52cba..4806d4a6a1 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -64,7 +64,7 @@ name = "Anthromorphic Plant" id = "podweak" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS) - mutant_bodyparts = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") + mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") limbs_id = "pod" light_nutrition_gain_factor = 3 light_bruteheal = -0.2 diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index f720aa7f8a..9c9220132c 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -5,7 +5,7 @@ species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD) inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutant_bodyparts = list("mcolor" = "FFF", "tail_human" = "None", "ears" = "None", "deco_wings" = "None") + mutant_bodyparts = list("mcolor" = "FFFFFF", "tail_human" = "None", "ears" = "None", "deco_wings" = "None") exotic_bloodtype = "U" use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM mutant_heart = /obj/item/organ/heart/vampire diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 711f90a629..07c80322ae 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -490,9 +490,9 @@ //body marking memes var/list/colorlist = list() colorlist.Cut() - colorlist += ReadRGB("[H.dna.features["mcolor"]]0") - colorlist += ReadRGB("[H.dna.features["mcolor2"]]0") - colorlist += ReadRGB("[H.dna.features["mcolor3"]]0") + colorlist += ReadRGB("[H.dna.features["mcolor"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor2"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += list(0,0,0, S.hair_alpha) for(var/index=1, index<=colorlist.len, index++) colorlist[index] = colorlist[index]/255 From 6f0860d1d3dfc704c63046f59f38628c023753f6 Mon Sep 17 00:00:00 2001 From: dapnee <33661984+dapnee@users.noreply.github.com> Date: Thu, 23 Jul 2020 16:36:54 -0600 Subject: [PATCH 63/85] What if Meta Arrivals Weren't An Eye Sore? Whack of you to assume this is kosher to make arrivals look like shit like that. --- _maps/map_files/MetaStation/MetaStation.dmm | 1235 +++++++++---------- 1 file changed, 601 insertions(+), 634 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index d6e413f1de..f8b44323a7 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2292,8 +2292,7 @@ /turf/open/floor/plating, /area/crew_quarters/fitness/recreation) "aeD" = ( -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "aeE" = ( /obj/effect/spawner/structure/window/reinforced, @@ -3116,9 +3115,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"afQ" = ( -/turf/open/floor/plating, -/area/hallway/primary/port) "afR" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -3188,8 +3184,14 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "afZ" = ( -/obj/structure/girder, -/turf/open/floor/plating, +/obj/machinery/camera{ + c_tag = "Arrivals - Lounge"; + dir = 4 + }, +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "aga" = ( /obj/effect/turf_decal/tile/neutral{ @@ -3670,8 +3672,10 @@ /turf/open/floor/plasteel/dark, /area/security/prison) "agQ" = ( -/obj/item/electronics/airlock, -/turf/open/floor/plating, +/obj/machinery/holopad{ + pixel_y = -15 + }, +/turf/open/floor/carpet, /area/hallway/primary/port) "agR" = ( /obj/machinery/airalarm{ @@ -4281,9 +4285,7 @@ }, /area/maintenance/fore) "ahT" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, +/turf/open/floor/carpet, /area/hallway/primary/port) "ahU" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -4802,13 +4804,14 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "aiT" = ( -/obj/effect/decal/cleanable/oil{ - icon_state = "floor5" +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/obj/machinery/light{ + dir = 4 }, -/area/hallway/primary/port) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "aiU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/neutral{ @@ -4830,9 +4833,13 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) "aiW" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg1" +/obj/structure/chair/comfy{ + dir = 8 }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "aiX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -4936,12 +4943,11 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "ajk" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "platingdmg3" +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 3 }, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "ajl" = ( /obj/item/soap/deluxe, @@ -5035,8 +5041,10 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "ajs" = ( -/obj/item/stack/sheet/metal/ten, -/turf/open/floor/plating, +/obj/item/kirbyplants{ + icon_state = "plant-08" + }, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "ajt" = ( /obj/structure/closet{ @@ -5059,8 +5067,20 @@ /turf/open/floor/plasteel/dark, /area/security/warden) "aju" = ( -/obj/item/stack/sheet/mineral/wood/twenty, -/turf/open/floor/plating, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/hallway/primary/port) "ajv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -6921,9 +6941,17 @@ /turf/open/floor/plating, /area/maintenance/fore) "amv" = ( -/obj/item/stack/sheet/metal/ten, -/obj/item/wrench, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, /area/hallway/primary/port) "amw" = ( /obj/structure/window/reinforced, @@ -6961,10 +6989,6 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) -"amB" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/hallway/primary/port) "amC" = ( /obj/structure/chair{ dir = 4 @@ -24081,9 +24105,10 @@ icon_state = "map-right-MS"; pixel_y = 32 }, -/turf/open/floor/plasteel/white/corner{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, +/turf/open/floor/plasteel, /area/hallway/secondary/entry) "aVE" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -31733,28 +31758,22 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white/corner, +/turf/open/floor/plasteel, /area/hallway/secondary/entry) "bjX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/plasteel/cafeteria, +/area/hallway/secondary/entry) "bjY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bjZ" = ( @@ -31814,6 +31833,12 @@ dir = 1 }, /obj/structure/cable, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bke" = ( @@ -31826,6 +31851,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bkf" = ( @@ -31845,6 +31873,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bkg" = ( @@ -32823,39 +32854,23 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, /obj/structure/cable/yellow{ icon_state = "1-2" }, /obj/structure/cable/yellow{ icon_state = "2-4" }, -/turf/open/floor/plasteel/white/corner, +/turf/open/floor/plasteel, /area/hallway/secondary/entry) "blU" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor, /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"blV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "blW" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -32864,7 +32879,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -32875,7 +32889,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -32890,7 +32903,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -32904,7 +32916,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -32918,7 +32929,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -32931,10 +32941,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) "bmc" = ( @@ -32944,8 +32957,8 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -32956,6 +32969,9 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bme" = ( @@ -33830,30 +33846,9 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bnL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/newscaster{ - pixel_x = 28; - pixel_y = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) "bnR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/sign/mining, -/turf/open/floor/plasteel, +/obj/structure/chair/comfy, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "bnS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -33863,7 +33858,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, /turf/open/floor/plasteel, @@ -33878,6 +33873,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "bnU" = ( @@ -34956,29 +34954,19 @@ "bqc" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white/corner, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, /area/hallway/secondary/entry) "bqd" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "bqj" = ( @@ -34987,7 +34975,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, /turf/open/floor/plasteel, @@ -36217,16 +36205,10 @@ /area/hallway/secondary/entry) "bso" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white/corner, +/turf/open/floor/plasteel, /area/hallway/secondary/entry) "bsu" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -36236,7 +36218,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, /turf/open/floor/plasteel, @@ -36248,6 +36230,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) "bsw" = ( @@ -37020,29 +37003,25 @@ /area/hallway/secondary/entry) "btY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/machinery/camera{ - c_tag = "Port Primary Hallway - Port"; - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/port) "btZ" = ( -/obj/machinery/light{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) "bua" = ( @@ -37847,26 +37826,23 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bvK" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bvL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "2-4" }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white/corner, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, /area/hallway/secondary/entry) "bvT" = ( /obj/structure/disposalpipe/segment{ @@ -37878,15 +37854,16 @@ /turf/open/floor/plating, /area/maintenance/department/science/xenobiology) "bvV" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) "bvW" = ( @@ -38677,28 +38654,36 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/structure/cable/yellow{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bxC" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/turf/open/floor/plasteel, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bxD" = ( /obj/effect/turf_decal/tile/blue{ - dir = 4 + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bxL" = ( @@ -38718,15 +38703,13 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, /obj/structure/cable/yellow{ icon_state = "1-4" }, -/obj/structure/cable/yellow{ - icon_state = "2-4" +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) "bxO" = ( @@ -39609,23 +39592,14 @@ /turf/open/floor/plasteel/dark, /area/aisat) "bzw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/newscaster{ - pixel_x = 28; - pixel_y = 1 +/obj/machinery/door/airlock{ + name = "Port Emergency Storage" }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) +/turf/open/floor/plating, +/area/maintenance/port) "bzx" = ( /turf/closed/wall, /area/security/vacantoffice) @@ -40285,45 +40259,22 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"bBd" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "bBf" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/structure/table/wood, +/obj/machinery/light_switch{ + pixel_x = -28 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/folder, +/turf/open/floor/wood, +/area/security/vacantoffice) "bBg" = ( /turf/open/floor/wood, /area/security/vacantoffice) "bBh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/chips, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "bBi" = ( /obj/structure/table/wood, @@ -41039,33 +40990,29 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) -"bCI" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"bCI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) +/turf/open/floor/plating, +/area/maintenance/port) "bCJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/item/storage/toolbox/emergency, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/area/maintenance/port) "bCK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -41074,66 +41021,35 @@ /turf/open/floor/plating, /area/maintenance/starboard) "bCL" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm{ - pixel_y = -24 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/wood, +/area/security/vacantoffice) "bCM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/radio/intercom{ - pixel_y = -28 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/security/vacantoffice) "bCN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/machinery/door/firedoor, -/obj/machinery/power/apc{ - areastring = "/area/hallway/secondary/entry"; - dir = 8; - name = "Arrivals APC"; - pixel_x = -26 - }, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "bCP" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-right-MS"; - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/plating, +/area/crew_quarters/toilet/auxiliary) "bCQ" = ( /obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "2-8" +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/turf/open/floor/plasteel, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bCR" = ( /obj/machinery/power/apc/highcap/five_k{ @@ -41143,7 +41059,7 @@ }, /obj/structure/cable/yellow, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 + dir = 9 }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) @@ -41152,9 +41068,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bCV" = ( @@ -41792,44 +41705,43 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bEo" = ( -/obj/machinery/door/airlock{ - name = "Port Emergency Storage" - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/storage/box/lights/mixed, /obj/structure/cable/yellow{ icon_state = "1-2" }, /turf/open/floor/plating, /area/maintenance/port) "bEp" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/port) "bEq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/security/vacantoffice) -"bEs" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/machinery/newscaster{ - pixel_y = 32 +/obj/structure/light_construct{ + dir = 8 }, /turf/open/floor/wood, /area/security/vacantoffice) -"bEt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +"bEs" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/entry"; + dir = 4; + name = "Arrivals APC"; + pixel_x = 26 + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"bEt" = ( +/obj/structure/chair/comfy{ dir = 8 }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/grimy, /area/hallway/primary/port) "bEu" = ( /obj/machinery/door/airlock{ @@ -42811,14 +42723,11 @@ /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bGj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/machinery/vending/cola/random, +/obj/machinery/newscaster{ + pixel_x = -30 }, -/obj/machinery/door/firedoor, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/dark, /area/hallway/primary/port) "bGk" = ( /obj/structure/cable/yellow{ @@ -42842,8 +42751,9 @@ /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) "bGm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/shower{ + dir = 8 }, /turf/open/floor/plasteel, /area/crew_quarters/toilet/auxiliary) @@ -43438,18 +43348,20 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bHJ" = ( -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/machinery/light/small{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/newscaster{ + pixel_x = 28; + pixel_y = 1 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "bHK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 }, /turf/open/floor/wood, /area/security/vacantoffice) @@ -43463,9 +43375,11 @@ /turf/open/floor/carpet, /area/security/vacantoffice) "bHM" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/hallway/primary/port) "bHN" = ( /obj/machinery/shower{ dir = 4 @@ -44151,9 +44065,10 @@ /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "bJj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27;37" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -44191,26 +44106,23 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bJp" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/port) "bJq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/storage/box/lights/mixed, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plating, /area/maintenance/port) "bJr" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "bJs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -44224,9 +44136,6 @@ /obj/item/radio/intercom{ pixel_x = -29 }, -/obj/machinery/light/small{ - dir = 8 - }, /turf/open/floor/wood, /area/security/vacantoffice) "bJu" = ( @@ -44250,8 +44159,10 @@ /turf/open/floor/carpet, /area/security/vacantoffice) "bJw" = ( -/obj/structure/chair/office{ - dir = 8 +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 }, /turf/open/floor/carpet, /area/security/vacantoffice) @@ -44260,15 +44171,6 @@ dir = 8; pixel_x = 24 }, -/obj/structure/table/wood, -/obj/item/camera_film{ - pixel_x = 6; - pixel_y = 7 - }, -/obj/item/camera_film{ - pixel_x = -3; - pixel_y = 5 - }, /turf/open/floor/wood, /area/security/vacantoffice) "bJy" = ( @@ -44956,15 +44858,11 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bKX" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;27;37" +/obj/structure/chair/comfy{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/plasteel/grimy, +/area/hallway/primary/port) "bKY" = ( /obj/machinery/power/apc{ areastring = "/area/security/vacantoffice"; @@ -45730,7 +45628,7 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "bMC" = ( -/obj/structure/chair/office, +/obj/structure/chair/office/dark, /turf/open/floor/wood, /area/security/vacantoffice) "bMD" = ( @@ -45993,19 +45891,15 @@ /turf/open/floor/carpet, /area/bridge/showroom/corporate) "bNd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Port Primary Hallway - Mining Shuttle"; - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/plating, +/area/maintenance/port) "bNe" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -46049,17 +45943,11 @@ /turf/open/floor/wood, /area/bridge/showroom/corporate) "bNh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/pen/red, +/turf/open/floor/wood, +/area/security/vacantoffice) "bNi" = ( /obj/structure/window/reinforced{ dir = 8 @@ -46322,12 +46210,17 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "bNK" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "bNL" = ( /obj/structure/table, /obj/item/stock_parts/subspace/transmitter, @@ -47710,9 +47603,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, /turf/open/floor/plating, /area/crew_quarters/toilet/auxiliary) "bQQ" = ( @@ -79125,13 +79015,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/firedoor, /obj/structure/sign/poster/official/random{ pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "dhQ" = ( @@ -79209,14 +79096,11 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "dhZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +/obj/structure/urinal{ + pixel_y = 29 }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/plating, +/area/crew_quarters/toilet/auxiliary) "dib" = ( /obj/structure/table/wood, /obj/item/lipstick{ @@ -79252,10 +79136,6 @@ /area/hallway/secondary/entry) "did" = ( /obj/structure/table/wood, -/obj/machinery/light_switch{ - pixel_x = -28 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/item/folder, /turf/open/floor/wood, /area/security/vacantoffice) @@ -79271,13 +79151,11 @@ /turf/open/floor/wood, /area/crew_quarters/theatre) "dig" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 +/obj/item/kirbyplants{ + icon_state = "plant-03" }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/security/vacantoffice) +/turf/open/floor/plasteel/grimy, +/area/hallway/primary/port) "dih" = ( /obj/machinery/light/small, /obj/structure/sign/poster/official/random{ @@ -79850,20 +79728,10 @@ /turf/open/space/basic, /area/space) "djW" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, -/area/hallway/primary/port) +/area/maintenance/port) "djX" = ( /obj/structure/closet/crate/coffin, /obj/machinery/door/window/eastleft{ @@ -81264,6 +81132,12 @@ }, /turf/closed/wall, /area/maintenance/starboard) +"dQg" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27;37" + }, +/turf/open/floor/plating, +/area/maintenance/port) "dYu" = ( /obj/machinery/door/airlock/external{ name = "Auxiliary Airlock" @@ -81274,9 +81148,16 @@ /turf/open/floor/plating, /area/hallway/secondary/entry) "eiS" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/toilet/auxiliary) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Port Primary Hallway - True Port"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/port) "eoK" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -81380,6 +81261,12 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) +"fDG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/toilet/auxiliary) "fFM" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -81589,12 +81476,25 @@ /turf/open/floor/plasteel, /area/engine/atmos) "iSt" = ( -/obj/machinery/door/airlock/grunge, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) +"jdf" = ( +/obj/machinery/door/airlock{ + id_tag = "AuxShower"; + name = "Shower" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/security/vacantoffice) +/area/crew_quarters/toilet/auxiliary) "jeV" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -81662,15 +81562,18 @@ /turf/open/floor/plasteel, /area/engine/atmos) "jBe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/sign/poster/official/random{ - pixel_y = -32 - }, /turf/open/floor/plasteel, /area/hallway/primary/port) "jKK" = ( @@ -81702,15 +81605,23 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"jRo" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster{ + pixel_y = 32 + }, +/obj/item/clipboard, +/obj/item/paper, +/turf/open/floor/wood, +/area/security/vacantoffice) "kfu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/white, @@ -81789,15 +81700,18 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "kQP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=6-Port-Central"; + location = "5-Customs" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 + dir = 4 }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -81843,6 +81757,9 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "lws" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, /turf/open/floor/carpet, /area/security/vacantoffice) "lzk" = ( @@ -81920,31 +81837,34 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) "maP" = ( -/obj/item/storage/toolbox/emergency, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/open/floor/plating{ - icon_state = "panelscorched" +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/area/maintenance/port) +/turf/open/floor/plasteel, +/area/hallway/primary/port) "mcS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 + dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/sign/map/left{ - desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; - icon_state = "map-left-MS"; - pixel_y = -32 +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -28 + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/secondary/entry) "mjJ" = ( /obj/machinery/nuclearbomb/beer{ pixel_x = 2; @@ -81956,6 +81876,12 @@ /obj/structure/lattice, /turf/closed/wall, /area/crew_quarters/cryopod) +"mot" = ( +/obj/structure/chair/office/dark{ + dir = 8 + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "mvj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -81997,17 +81923,11 @@ }, /area/maintenance/port/aft) "nhy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/effect/landmark/event_spawn, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "njd" = ( @@ -82293,9 +82213,22 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) "pHS" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "pMX" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82340,6 +82273,13 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"qkY" = ( +/obj/machinery/door/airlock/grunge, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/vacantoffice) "qqg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -82419,11 +82359,18 @@ /turf/open/floor/plasteel, /area/security/prison) "rbE" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) +/obj/machinery/firealarm{ + pixel_y = -24 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "roa" = ( /obj/structure/chair/stool, /obj/machinery/light/small{ @@ -82472,19 +82419,16 @@ /turf/closed/wall, /area/quartermaster/miningoffice) "rNX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /obj/effect/turf_decal/tile/neutral{ - dir = 1 + dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=6-Port-Central"; - location = "5-Customs" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/structure/sign/poster/official/random{ + pixel_y = -32 }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) "rQK" = ( @@ -82555,15 +82499,16 @@ /turf/open/floor/plasteel, /area/engine/atmos) "syk" = ( -/obj/machinery/door/airlock{ - id_tag = "AuxShower"; - name = "Shower" +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "1-2" }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, -/area/crew_quarters/toilet/auxiliary) +/area/hallway/primary/port) "sFv" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82615,6 +82560,10 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"sZN" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/maintenance/port) "tap" = ( /obj/machinery/power/apc/auto_name/east, /obj/structure/cable/yellow{ @@ -82623,33 +82572,14 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) "tre" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-4" +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/white/corner, -/area/hallway/secondary/entry) +/turf/open/floor/plating, +/area/maintenance/port) "tsx" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -82682,6 +82612,13 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"tUa" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/maintenance/port) "tVY" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -82807,6 +82744,18 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) +"vuY" = ( +/obj/structure/table/wood, +/obj/item/camera_film{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/item/camera_film{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/security/vacantoffice) "vxG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -82861,10 +82810,21 @@ /turf/open/floor/plating, /area/security/prison) "wlH" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /turf/open/floor/plasteel, -/area/maintenance/port) +/area/hallway/primary/port) "wmt" = ( /obj/effect/decal/cleanable/flour, /turf/open/floor/plating, @@ -82921,7 +82881,10 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) "xfI" = ( -/obj/machinery/vending/cola/random, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/port) "xgC" = ( @@ -82936,13 +82899,21 @@ /turf/open/floor/plasteel/white, /area/science/circuit) "xmb" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/cable/yellow{ - icon_state = "1-2" +/obj/structure/sign/map/left{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-left-MS"; + pixel_y = -32 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/port) "xse" = ( @@ -83021,26 +82992,22 @@ /turf/open/floor/plasteel, /area/security/prison) "xLL" = ( -/obj/structure/table/wood, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; + icon_state = "map-right-MS"; + pixel_y = -32 }, -/turf/open/floor/wood, -/area/security/vacantoffice) +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "xTV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/security/vacantoffice) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -96315,7 +96282,7 @@ bxL bvJ bxB bCQ -bBd +bCH bCH bEn dic @@ -96568,18 +96535,18 @@ bjV bnK bqb bbI -btT +bJr bvK bxC -bEp -bJp -rbE alK alK alK alK alK alK +dQg +alK +alK alK bPF asa @@ -96822,7 +96789,7 @@ bgv biv bjW blT -bnL +bso bqc bso bso @@ -96833,9 +96800,9 @@ tre bCI bEo bJj -xTV +bbL bJq -bKX +bbL bbL bbL bPG @@ -97079,20 +97046,20 @@ bbK biw bjX blU -baE -baE -baE -baE -baE -baE -baE -jPu -bCJ +aiT +bEs +bHJ +aiT +iSt +mcS alK auF -maP -bJr +bCJ +tUa alK +apz +aob +alC aqK aqO alC @@ -97335,21 +97302,21 @@ beL bgw bix bjY -blV +bqd baE -afQ -afQ -afQ -afZ -afQ baE +baE +baE +bqd +nhy +alK djW bNd +sZN alK -wlH -bHJ -pHS -alK +amZ +aob +aob oWR aob bPH @@ -97593,15 +97560,15 @@ bgx biy bjZ blW -baE +ajk afZ -afQ +bHM ajs -afQ -afQ -baE -bBf -kQP +jBe +pHS +bzx +bzx +bzx bzx bzx bzx @@ -97850,13 +97817,13 @@ bgy biz bka blX -baE -afQ -afQ -afQ -afQ -afQ -baE +bnR +ahT +ahT +bKX +jPu +rbE +xTV bBf bCL bEq @@ -98105,19 +98072,19 @@ bda beO bgz biA -bnR +bka blY aeD agQ -afQ -afQ -afQ -afQ -baE +ahT +aeD +kQP rNX -jBe bzx bBg +bBg +bBg +bBg pZb bJu bKZ @@ -98364,16 +98331,16 @@ bgA biz bkb blZ -baE +bnR ahT -afQ -afQ +ahT +bKX aju -afQ -baE -bBh -xmb -iSt +syk +qkY +bGk +bGk +bGk bGk bKZ bHL @@ -98621,18 +98588,18 @@ bpt bcW bkc bma -baE -ahT +bBh +bEt aiW -afQ +dig amv -afQ -baE -bBf +wlH +bzx +bBi bCM -bzx -bzx -bHM +bBg +bBg +bBg bJv drp heE @@ -98879,21 +98846,21 @@ bcW dhP bqd baE -aiT -ajk -afQ -amB -afQ baE -djW -bsx +baE +baE +bqd xfI bzx -bEs +jRo +mot +bBg +bBg +bBg bJw lws bMC -xLL +bOg bzx bRe xDn @@ -99135,18 +99102,18 @@ bgC biB bkd bmb -baE -baE -baE -baE -baE -baE -baE -bBf +bEp +bGj +bJp +eiS +jBe +xmb +bzx +vuY bNh bNK -bzx -dig +bBg +bBg bJx bLa bMD @@ -99396,12 +99363,12 @@ bnS bqj bsu btY -bqj -bsu -bEt -nhy -mcS -bvW +maP +xLL +bzx +bzx +bzx +bzx bzx bzx bzx @@ -99655,7 +99622,7 @@ bsv btZ bvV bxN -bGj +bvW dhZ bCP bvW @@ -99913,9 +99880,9 @@ baE bvW bxO bvW -bvW -bvW -bvW +dhZ +fDG +jdf bGm bHO bvW @@ -100173,7 +100140,7 @@ bzA bBm bCR bvW -syk +bvW bvW bvW bLd @@ -100429,7 +100396,7 @@ bxQ bzB bBn bCS -eiS +bBn bQN dih bvW From a655502d9aaf34789ded91dbacf945d137400284 Mon Sep 17 00:00:00 2001 From: Lin Date: Thu, 23 Jul 2020 22:58:00 +0000 Subject: [PATCH 64/85] tabs! --- code/modules/mob/living/carbon/human/examine.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 77137c7239..285134201f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -163,8 +163,8 @@ msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n" else msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" - for(var/datum/wound/W in BP.wounds) - msg += "[W.get_examine_description(user)]\n" + for(var/datum/wound/W in BP.wounds) + msg += "[W.get_examine_description(user)]\n" for(var/X in disabled) var/obj/item/bodypart/BP = X From 30a6ddd96342e964a70eaa3c36148e097229e7ab Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 23 Jul 2020 18:18:20 -0500 Subject: [PATCH 65/85] Automatic changelog generation for PR #12857 [ci skip] --- html/changelogs/AutoChangeLog-pr-12857.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12857.yml diff --git a/html/changelogs/AutoChangeLog-pr-12857.yml b/html/changelogs/AutoChangeLog-pr-12857.yml new file mode 100644 index 0000000000..4f8062dc24 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12857.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - rscadd: "beepsky can now wear hats" From e0915621a8a72b3c2bea28031f99e973c2d0e49b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 23 Jul 2020 18:20:09 -0500 Subject: [PATCH 66/85] Automatic changelog generation for PR #12878 [ci skip] --- html/changelogs/AutoChangeLog-pr-12878.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12878.yml diff --git a/html/changelogs/AutoChangeLog-pr-12878.yml b/html/changelogs/AutoChangeLog-pr-12878.yml new file mode 100644 index 0000000000..a0e85b248a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12878.yml @@ -0,0 +1,4 @@ +author: "Linzolle" +delete-after: True +changes: + - bugfix: "wounds now have a description on examine" From 5683013907c108b58c4520e8c1992021149dc4c9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 24 Jul 2020 00:10:34 +0000 Subject: [PATCH 67/85] Automatic changelog compile [ci skip] --- html/changelog.html | 50 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 37 ++++++++++++++++ html/changelogs/AutoChangeLog-pr-12816.yml | 4 -- html/changelogs/AutoChangeLog-pr-12821.yml | 4 -- html/changelogs/AutoChangeLog-pr-12828.yml | 9 ---- html/changelogs/AutoChangeLog-pr-12848.yml | 4 -- html/changelogs/AutoChangeLog-pr-12854.yml | 4 -- html/changelogs/AutoChangeLog-pr-12856.yml | 4 -- html/changelogs/AutoChangeLog-pr-12857.yml | 4 -- html/changelogs/AutoChangeLog-pr-12860.yml | 4 -- html/changelogs/AutoChangeLog-pr-12861.yml | 4 -- html/changelogs/AutoChangeLog-pr-12866.yml | 4 -- html/changelogs/AutoChangeLog-pr-12867.yml | 9 ---- html/changelogs/AutoChangeLog-pr-12869.yml | 5 --- html/changelogs/AutoChangeLog-pr-12878.yml | 4 -- 15 files changed, 87 insertions(+), 63 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12816.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12821.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12828.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12848.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12854.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12856.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12857.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12860.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12861.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12866.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12867.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12869.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12878.yml diff --git a/html/changelog.html b/html/changelog.html index d0731d740c..9145e2a7ff 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,56 @@ -->
+

24 July 2020

+

EmeraldSundisk updated:

+
    +
  • Adds a CMO office, along with Virology and Genetics labs to Omega Station
  • +
  • Adds a second chemistry station to the chemistry lab
  • +
  • Adjusts the locations of some objects in medical to accommodate these new additions
  • +
  • Relocates the morgue
  • +
  • Relocates items in impacted areas of maintenance as well as the library
  • +
  • Fixes an air line Bartholomew somehow knocked out
  • +
+

Linzolle updated:

+
    +
  • wounds now have a description on examine
  • +
+

Owai-Seek updated:

+
    +
  • Meatball Sub, Meatloaf + Meatloaf Slices, Bear Chili, Mashed Potatoes
  • +
  • Buttered Potatoes, Fancy Cracker Pack, Spiral Soup, Sweet and Sour Chicken
  • +
  • Organised the Food DMI a bit.
  • +
  • Deleted some stray pixels on some sprites.
  • +
  • Nuggie boxes are now centered correctly.
  • +
  • Icons for the the food items in this PR.
  • +
+

Sneakyrat6 updated:

+
    +
  • Fixes dressers not giving you undies
  • +
  • Fixes Snaxi not loading properly because of typos
  • +
  • You can now burn photos
  • +
+

Zandario updated:

+
    +
  • Murdered **tipes** and gave birth to **is**.
  • +
+

silicons updated:

+
    +
  • sanitization now doesn't cut off 15.7 or something million possible colors from character preferences (instead of only allowing 16 values for R G and B, it now allows 256 each)
  • +
  • projectiles are by default 17.5 tiles per second instead of 12.5
  • +
+

timothyteakettle updated:

+
    +
  • due to recent innovative research in the medical field, you now have bones
  • +
  • zombie claws are now sharp and do less damage, but can destroy non-lifeforms far faster
  • +
  • zombies now take less stamina damage
  • +
  • beepsky can now wear hats
  • +
+

zeroisthebiggay updated:

+
    +
  • rad and kravglove sprites
  • +
+

23 July 2020

DeltaFire15 updated: