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 01/34] 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 02/34] 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 03/34] 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 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 04/34] 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 21:37:44 -0700
Subject: [PATCH 05/34] 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 06/34] 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 07/34] 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 08/34] 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 09/34] 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 10/34] 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 11/34] 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 12/34] 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 13/34] 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 14/34] 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 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 15/34] 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 16/34] 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 17/34] 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 18/34] 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 19/34] 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 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 20/34] 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 21/34] 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 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 22/34] 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 673188bc7e29459254bef8f121dc1449b0df3006 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Thu, 23 Jul 2020 18:57:24 +0100
Subject: [PATCH 23/34] please show the hat
---
code/modules/mob/living/simple_animal/bot/secbot.dm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 9281206a6a..e3d9725714 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -139,6 +139,8 @@
if(stored_fashion.arrest_emote)
arrest_emote = stored_fashion.arrest_emote
+ regenerate_icons()
+
/mob/living/simple_animal/bot/secbot/proc/reset_fashion()
bot_accessory.forceMove(get_turf(src))
//reset all emotes/sounds and name/desc
From 5463673831cf4a2a5ae334702150726eca67737d Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Thu, 23 Jul 2020 19:02:50 +0100
Subject: [PATCH 24/34] fuck
---
code/modules/mob/living/simple_animal/bot/secbot.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index e3d9725714..e6a9adf9ac 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -159,7 +159,7 @@
arrest_texts = initial(arrest_texts)
arrest_emote = initial(arrest_emote)
bot_accessory = null
- qdel(stored_fashion)
+ stored_fashion = null
regenerate_icons()
/mob/living/simple_animal/bot/secbot/beepsky/explode()
From e4f0a84404f6954ec91e425457f8f9b62441c226 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Thu, 23 Jul 2020 19:33:26 +0100
Subject: [PATCH 25/34] cut overlay
---
code/modules/mob/living/simple_animal/bot/secbot.dm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index e6a9adf9ac..9d45b96831 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -159,7 +159,6 @@
arrest_texts = initial(arrest_texts)
arrest_emote = initial(arrest_emote)
bot_accessory = null
- stored_fashion = null
regenerate_icons()
/mob/living/simple_animal/bot/secbot/beepsky/explode()
@@ -339,6 +338,10 @@ Auto Patrol: []"},
if(!stored_fashion.obj_color)
stored_fashion.obj_color = bot_accessory.color
add_overlay(stored_fashion.get_overlay())
+ else
+ if(stored_fashion)
+ cut_overlay(stored_fashion.get_overlay())
+ stored_fashion = null
/mob/living/simple_animal/bot/secbot/emag_act(mob/user)
. = ..()
From a655502d9aaf34789ded91dbacf945d137400284 Mon Sep 17 00:00:00 2001
From: Lin
Date: Thu, 23 Jul 2020 22:58:00 +0000
Subject: [PATCH 26/34] tabs!
---
code/modules/mob/living/carbon/human/examine.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 77137c7239..285134201f 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -163,8 +163,8 @@
msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] stuck to [t_his] [BP.name]!\n"
else
msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n"
- for(var/datum/wound/W in BP.wounds)
- msg += "[W.get_examine_description(user)]\n"
+ for(var/datum/wound/W in BP.wounds)
+ msg += "[W.get_examine_description(user)]\n"
for(var/X in disabled)
var/obj/item/bodypart/BP = X
From 30a6ddd96342e964a70eaa3c36148e097229e7ab Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Thu, 23 Jul 2020 18:18:20 -0500
Subject: [PATCH 27/34] Automatic changelog generation for PR #12857 [ci skip]
---
html/changelogs/AutoChangeLog-pr-12857.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-12857.yml
diff --git a/html/changelogs/AutoChangeLog-pr-12857.yml b/html/changelogs/AutoChangeLog-pr-12857.yml
new file mode 100644
index 0000000000..4f8062dc24
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12857.yml
@@ -0,0 +1,4 @@
+author: "timothyteakettle"
+delete-after: True
+changes:
+ - rscadd: "beepsky can now wear hats"
From e0915621a8a72b3c2bea28031f99e973c2d0e49b Mon Sep 17 00:00:00 2001
From: CitadelStationBot
Date: Thu, 23 Jul 2020 18:20:09 -0500
Subject: [PATCH 28/34] Automatic changelog generation for PR #12878 [ci skip]
---
html/changelogs/AutoChangeLog-pr-12878.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-12878.yml
diff --git a/html/changelogs/AutoChangeLog-pr-12878.yml b/html/changelogs/AutoChangeLog-pr-12878.yml
new file mode 100644
index 0000000000..a0e85b248a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-12878.yml
@@ -0,0 +1,4 @@
+author: "Linzolle"
+delete-after: True
+changes:
+ - bugfix: "wounds now have a description on examine"
From 5683013907c108b58c4520e8c1992021149dc4c9 Mon Sep 17 00:00:00 2001
From: Changelogs
Date: Fri, 24 Jul 2020 00:10:34 +0000
Subject: [PATCH 29/34] Automatic changelog compile [ci skip]
---
html/changelog.html | 50 ++++++++++++++++++++++
html/changelogs/.all_changelog.yml | 37 ++++++++++++++++
html/changelogs/AutoChangeLog-pr-12816.yml | 4 --
html/changelogs/AutoChangeLog-pr-12821.yml | 4 --
html/changelogs/AutoChangeLog-pr-12828.yml | 9 ----
html/changelogs/AutoChangeLog-pr-12848.yml | 4 --
html/changelogs/AutoChangeLog-pr-12854.yml | 4 --
html/changelogs/AutoChangeLog-pr-12856.yml | 4 --
html/changelogs/AutoChangeLog-pr-12857.yml | 4 --
html/changelogs/AutoChangeLog-pr-12860.yml | 4 --
html/changelogs/AutoChangeLog-pr-12861.yml | 4 --
html/changelogs/AutoChangeLog-pr-12866.yml | 4 --
html/changelogs/AutoChangeLog-pr-12867.yml | 9 ----
html/changelogs/AutoChangeLog-pr-12869.yml | 5 ---
html/changelogs/AutoChangeLog-pr-12878.yml | 4 --
15 files changed, 87 insertions(+), 63 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-pr-12816.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12821.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12828.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12848.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12854.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12856.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12857.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12860.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12861.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12866.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12867.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12869.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-12878.yml
diff --git a/html/changelog.html b/html/changelog.html
index d0731d740c..9145e2a7ff 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,56 @@
-->
+
24 July 2020
+
EmeraldSundisk updated:
+
+ - Adds a CMO office, along with Virology and Genetics labs to Omega Station
+ - Adds a second chemistry station to the chemistry lab
+ - Adjusts the locations of some objects in medical to accommodate these new additions
+ - Relocates the morgue
+ - Relocates items in impacted areas of maintenance as well as the library
+ - Fixes an air line Bartholomew somehow knocked out
+
+
Linzolle updated:
+
+ - wounds now have a description on examine
+
+
Owai-Seek updated:
+
+ - Meatball Sub, Meatloaf + Meatloaf Slices, Bear Chili, Mashed Potatoes
+ - Buttered Potatoes, Fancy Cracker Pack, Spiral Soup, Sweet and Sour Chicken
+ - Organised the Food DMI a bit.
+ - Deleted some stray pixels on some sprites.
+ - Nuggie boxes are now centered correctly.
+ - Icons for the the food items in this PR.
+
+
Sneakyrat6 updated:
+
+ - Fixes dressers not giving you undies
+ - Fixes Snaxi not loading properly because of typos
+ - You can now burn photos
+
+
Zandario updated:
+
+ - Murdered **tipes** and gave birth to **is**.
+
+
silicons updated:
+
+ - sanitization now doesn't cut off 15.7 or something million possible colors from character preferences (instead of only allowing 16 values for R G and B, it now allows 256 each)
+ - projectiles are by default 17.5 tiles per second instead of 12.5
+
+
timothyteakettle updated:
+
+ - due to recent innovative research in the medical field, you now have bones
+ - zombie claws are now sharp and do less damage, but can destroy non-lifeforms far faster
+ - zombies now take less stamina damage
+ - beepsky can now wear hats
+
+
zeroisthebiggay updated:
+
+ - rad and kravglove sprites
+
+
23 July 2020
DeltaFire15 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 45d8e6ebe5..6e4efc1963 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -26476,3 +26476,40 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: tendril chests being empty
zeroisthebiggay:
- rscadd: fetish content
+2020-07-24:
+ EmeraldSundisk:
+ - rscadd: Adds a CMO office, along with Virology and Genetics labs to Omega Station
+ - rscadd: Adds a second chemistry station to the chemistry lab
+ - tweak: Adjusts the locations of some objects in medical to accommodate these new
+ additions
+ - tweak: Relocates the morgue
+ - tweak: Relocates items in impacted areas of maintenance as well as the library
+ - bugfix: Fixes an air line Bartholomew somehow knocked out
+ Linzolle:
+ - bugfix: wounds now have a description on examine
+ Owai-Seek:
+ - rscadd: Meatball Sub, Meatloaf + Meatloaf Slices, Bear Chili, Mashed Potatoes
+ - rscadd: Buttered Potatoes, Fancy Cracker Pack, Spiral Soup, Sweet and Sour Chicken
+ - tweak: Organised the Food DMI a bit.
+ - tweak: Deleted some stray pixels on some sprites.
+ - tweak: Nuggie boxes are now centered correctly.
+ - imageadd: Icons for the the food items in this PR.
+ Sneakyrat6:
+ - bugfix: Fixes dressers not giving you undies
+ - bugfix: Fixes Snaxi not loading properly because of typos
+ - rscadd: You can now burn photos
+ Zandario:
+ - spellcheck: Murdered **tipes** and gave birth to **is**.
+ silicons:
+ - tweak: sanitization now doesn't cut off 15.7 or something million possible colors
+ from character preferences (instead of only allowing 16 values for R G and B,
+ it now allows 256 each)
+ - balance: projectiles are by default 17.5 tiles per second instead of 12.5
+ timothyteakettle:
+ - rscadd: due to recent innovative research in the medical field, you now have bones
+ - tweak: zombie claws are now sharp and do less damage, but can destroy non-lifeforms
+ far faster
+ - tweak: zombies now take less stamina damage
+ - rscadd: beepsky can now wear hats
+ zeroisthebiggay:
+ - imageadd: rad and kravglove sprites
diff --git a/html/changelogs/AutoChangeLog-pr-12816.yml b/html/changelogs/AutoChangeLog-pr-12816.yml
deleted file mode 100644
index a984be4d5f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12816.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "due to recent innovative research in the medical field, you now have bones"
diff --git a/html/changelogs/AutoChangeLog-pr-12821.yml b/html/changelogs/AutoChangeLog-pr-12821.yml
deleted file mode 100644
index 7861bbc536..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12821.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - balance: "projectiles are by default 17.5 tiles per second instead of 12.5"
diff --git a/html/changelogs/AutoChangeLog-pr-12828.yml b/html/changelogs/AutoChangeLog-pr-12828.yml
deleted file mode 100644
index 411f16a545..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12828.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "Owai-Seek"
-delete-after: True
-changes:
- - rscadd: "Meatball Sub, Meatloaf + Meatloaf Slices, Bear Chili, Mashed Potatoes"
- - rscadd: "Buttered Potatoes, Fancy Cracker Pack, Spiral Soup, Sweet and Sour Chicken"
- - tweak: "Organised the Food DMI a bit."
- - tweak: "Deleted some stray pixels on some sprites."
- - tweak: "Nuggie boxes are now centered correctly."
- - imageadd: "Icons for the the food items in this PR."
diff --git a/html/changelogs/AutoChangeLog-pr-12848.yml b/html/changelogs/AutoChangeLog-pr-12848.yml
deleted file mode 100644
index 0e9bc70dbb..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12848.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "silicons"
-delete-after: True
-changes:
- - tweak: "sanitization now doesn't cut off 15.7 or something million possible colors from character preferences (instead of only allowing 16 values for R G and B, it now allows 256 each)"
diff --git a/html/changelogs/AutoChangeLog-pr-12854.yml b/html/changelogs/AutoChangeLog-pr-12854.yml
deleted file mode 100644
index 01f47e4c48..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12854.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Zandario"
-delete-after: True
-changes:
- - spellcheck: "Murdered **tipes** and gave birth to **is**."
diff --git a/html/changelogs/AutoChangeLog-pr-12856.yml b/html/changelogs/AutoChangeLog-pr-12856.yml
deleted file mode 100644
index 5fb888910b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12856.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "zeroisthebiggay"
-delete-after: True
-changes:
- - imageadd: "rad and kravglove sprites"
diff --git a/html/changelogs/AutoChangeLog-pr-12857.yml b/html/changelogs/AutoChangeLog-pr-12857.yml
deleted file mode 100644
index 4f8062dc24..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12857.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - rscadd: "beepsky can now wear hats"
diff --git a/html/changelogs/AutoChangeLog-pr-12860.yml b/html/changelogs/AutoChangeLog-pr-12860.yml
deleted file mode 100644
index 9703a35a80..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12860.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Sneakyrat6"
-delete-after: True
-changes:
- - rscadd: "You can now burn photos"
diff --git a/html/changelogs/AutoChangeLog-pr-12861.yml b/html/changelogs/AutoChangeLog-pr-12861.yml
deleted file mode 100644
index 448a343017..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12861.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Sneakyrat6"
-delete-after: True
-changes:
- - bugfix: "Fixes dressers not giving you undies"
diff --git a/html/changelogs/AutoChangeLog-pr-12866.yml b/html/changelogs/AutoChangeLog-pr-12866.yml
deleted file mode 100644
index 3a7e6d6972..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12866.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Sneakyrat6"
-delete-after: True
-changes:
- - bugfix: "Fixes Snaxi not loading properly because of typos"
diff --git a/html/changelogs/AutoChangeLog-pr-12867.yml b/html/changelogs/AutoChangeLog-pr-12867.yml
deleted file mode 100644
index 8f06bc7a06..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12867.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-author: "EmeraldSundisk"
-delete-after: True
-changes:
- - rscadd: "Adds a CMO office, along with Virology and Genetics labs to Omega Station"
- - rscadd: "Adds a second chemistry station to the chemistry lab"
- - tweak: "Adjusts the locations of some objects in medical to accommodate these new additions"
- - tweak: "Relocates the morgue"
- - tweak: "Relocates items in impacted areas of maintenance as well as the library"
- - bugfix: "Fixes an air line Bartholomew somehow knocked out"
diff --git a/html/changelogs/AutoChangeLog-pr-12869.yml b/html/changelogs/AutoChangeLog-pr-12869.yml
deleted file mode 100644
index c83506457b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12869.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "zombie claws are now sharp and do less damage, but can destroy non-lifeforms far faster"
- - tweak: "zombies now take less stamina damage"
diff --git a/html/changelogs/AutoChangeLog-pr-12878.yml b/html/changelogs/AutoChangeLog-pr-12878.yml
deleted file mode 100644
index a0e85b248a..0000000000
--- a/html/changelogs/AutoChangeLog-pr-12878.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Linzolle"
-delete-after: True
-changes:
- - bugfix: "wounds now have a description on examine"
From 332dae9ee187a67d41f76f5a983820f39c12014d Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Fri, 24 Jul 2020 01:31:07 +0100
Subject: [PATCH 30/34] beepsky now replaces THREAT_LEVEL with the threat
---
code/modules/mob/living/simple_animal/bot/secbot.dm | 2 ++
1 file changed, 2 insertions(+)
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 9d45b96831..910b9f2a92 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -82,6 +82,8 @@
emote = attack_two
if("ARREST")
emote = arrest_emote
+ if("THREAT_LEVEL")
+ emote = threat
//now replace pieces of the text with the information we have
if(emote_type != "TAUNT" && emote_type != "ARREST")
From 68d46e5f0da5e2e1ad00711f0ff7e2eb19180932 Mon Sep 17 00:00:00 2001
From: CameronWoof
Date: Thu, 23 Jul 2020 17:41:08 -0700
Subject: [PATCH 31/34] gives aloe an item icon
---
icons/obj/hydroponics/harvest.dmi | Bin 88306 -> 88669 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index d7800fc0a539c9d2c895f14b1537dbda6011ef3e..7474bb87abd9e4327965819f1d6c90f5169efe9d 100644
GIT binary patch
delta 20378
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ͳH2UKs!vw){A_7ZW<*H7yfj;
zLVx2hw{toU=pRm(1|Tckx|j_*>`>XmpAF$2zEQ(rx-Jp2_t$k$!G^Jcl>G
zNXHDvu?j>wr624Ffe0vy&Q2!&N{TPz47ga^dfNmm#rD=qd-MD@t`cU_G#^u`+MJ@7
z4$~g$9VHRRO%|NK=v<2!!~UoOX{&0#ihod>!2vKYrIl5-<-F0=5;+ffBUfd9i9@PH
zzkgru^rC$U(72@xCJqYOdle>rB;%z7f6p~@xd9Yc=|1U=JtVsM8{Rj6ErF6#4#ddv
zaw8yA4gRh}=g6MPxe)AF{lyyUTQ(TajqB!A>}W9g^>g0o$rd_GM$U(un1uct-7GdX
z02BjqNsxJE<8xNB=Qg_oTjFV#=rf8kCW2Ns5%hv4^dcqPly9K2!sqv~xY9||jFWS<
z>N8rT(3R}wcHtKskHr|Ne#re4QNY{(X>928l;k+gEX{4J%Mv;eD>g$3Kt{Gv)+5nFqKVx9ypM9=^C^b%-Mn~^=p7V~
zrpC@l^W@$LM-6R4{LuLh6KuB>>l9k(*1_X3zwTiwWD_q3jH`S@H*0boeZI;)o%rB_
zRbRj7gOgfr#)0GFHS@R$q<+VHMOfD?(OXlLtvX-OThCSHnx<$R=3hd;U#FS^;f{-)
qalTKCReob)#jD-8W^YZdRyrtsvx6(hDJcNNcx=yIuq-?4jrkv$kD`kJ
delta 19972
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