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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