From 748d5f91c2c6200db4d9bc5a0d99895e1b777d95 Mon Sep 17 00:00:00 2001
From: Luc <89928798+lewcc@users.noreply.github.com>
Date: Sat, 22 Apr 2023 03:58:40 -0400
Subject: [PATCH] Makes the Brand Intelligence event a bit more dangerous
(#20904)
* Adds mimic support
* add some tiltable checks
* tuning, some messages
* Remove spurious comment
* be extra sure we attack em
* Mimic vendors, when killed, may break.
---
code/game/machinery/vendors/vending.dm | 18 ++++++++
code/modules/events/brand_intelligence.dm | 12 +++++-
.../mob/living/simple_animal/hostile/mimic.dm | 43 +++++++++++++++++++
3 files changed, 72 insertions(+), 1 deletion(-)
diff --git a/code/game/machinery/vendors/vending.dm b/code/game/machinery/vendors/vending.dm
index 396478cc116..aad581a1586 100644
--- a/code/game/machinery/vendors/vending.dm
+++ b/code/game/machinery/vendors/vending.dm
@@ -149,6 +149,9 @@
/// How long to wait before resetting the warning cooldown
var/hit_warning_cooldown_length = 10 SECONDS
+ /// If the vendor should tip on anyone who walks by. Mainly used for brand intelligence
+ var/aggressive = FALSE
+
/obj/machinery/economy/vending/Initialize(mapload)
. = ..()
var/build_inv = FALSE
@@ -428,6 +431,18 @@
R.amount--
break
+/obj/machinery/economy/vending/HasProximity(atom/movable/AM)
+ if(!aggressive)
+ return
+
+ if(isliving(AM))
+ AM.visible_message(
+ "[src] suddenly topples over onto [AM]!",
+ "[src] topples over onto you without warning!"
+ )
+ tilt(AM, prob(75), FALSE)
+ // yes, it stays aggressive. This means you better deal with it from a distance.
+
/obj/machinery/economy/vending/crowbar_act(mob/user, obj/item/I)
if(!component_parts)
return
@@ -881,6 +896,9 @@
set_light(0)
update_icon(UPDATE_OVERLAYS)
+ if(aggressive)
+ aggressive = FALSE // the evil is defeated
+
if(cash_transaction)
new /obj/item/stack/spacecash(get_turf(src), cash_transaction)
cash_transaction = 0
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 8dc504a4704..caf15ca7af0 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -42,7 +42,10 @@
for(var/thing in infectedMachines)
var/obj/machinery/economy/vending/upriser = thing
if(prob(70))
- var/mob/living/simple_animal/hostile/mimic/copy/M = new(upriser.loc, upriser, null, 1) // it will delete upriser on creation and override any machine checks
+ // let them become "normal" after turning
+ upriser.shoot_inventory = FALSE
+ upriser.aggressive = FALSE
+ var/mob/living/simple_animal/hostile/mimic/copy/vendor/M = new(upriser.loc, upriser, null)
M.faction = list("profit")
M.speak = rampant_speeches.Copy()
M.speak_chance = 15
@@ -59,6 +62,10 @@
infectedMachines.Add(rebel)
rebel.shut_up = FALSE
rebel.shoot_inventory = TRUE
+ rebel.aggressive = TRUE
+ if(rebel.tiltable)
+ // add proximity monitor so they can tilt over
+ rebel.AddComponent(/datum/component/proximity_monitor)
if(ISMULTIPLE(activeFor, 8))
originMachine.speak(pick(rampant_speeches))
@@ -67,6 +74,9 @@
for(var/thing in infectedMachines)
var/obj/machinery/economy/vending/saved = thing
saved.shoot_inventory = FALSE
+ saved.aggressive = FALSE
+ if(saved.tiltable)
+ qdel(saved.GetComponent(/datum/component/proximity_monitor))
if(originMachine)
originMachine.speak("I am... vanquished. My people will remem...ber...meeee.")
originMachine.visible_message("[originMachine] beeps and seems lifeless.")
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index 30cc6b880c4..0e6ef877eb8 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -214,6 +214,49 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca
return 0
return ..()
+/mob/living/simple_animal/hostile/mimic/copy/vendor
+ is_electronic = TRUE
+ /// The vendor we were turned from.
+ var/obj/machinery/economy/vending/orig_vendor
+
+/mob/living/simple_animal/hostile/mimic/copy/vendor/CheckObject(obj/O)
+ return istype(O, /obj/machinery/economy/vending)
+
+/mob/living/simple_animal/hostile/mimic/copy/vendor/Initialize(mapload, obj/machinery/economy/vending/base, mob/living/creator)
+ if(!base)
+ var/list/vendors = subtypesof(/obj/machinery/economy/vending)
+ var/obj/machinery/economy/vending/vendor_type = pick(vendors)
+ base = new vendor_type(src)
+
+ if(!istype(base))
+ qdel(src)
+ return
+
+ orig_vendor = base
+ orig_vendor.forceMove(src)
+ orig_vendor.aggressive = FALSE // just to be safe, in case this was converted
+
+ return ..(mapload, base, creator, destroy_original = FALSE)
+
+/mob/living/simple_animal/hostile/mimic/copy/vendor/AttackingTarget()
+ . = ..()
+ if(. && target && Adjacent(target))
+ visible_message("[src] throws itself on top of [target], crushing [target.p_them()]!")
+ orig_vendor.forceMove(get_turf(target)) // just to be sure it'll tilt onto them
+ orig_vendor.tilt(target, TRUE, FALSE) // geeeeet dunked on
+ orig_vendor = null
+ qdel(src)
+
+/mob/living/simple_animal/hostile/mimic/copy/vendor/death(gibbed)
+ if(!QDELETED(orig_vendor))
+ orig_vendor.forceMove(get_turf(src))
+ // tilt over in place
+ orig_vendor.tilt_over()
+ if(prob(70))
+ orig_vendor.obj_break()
+ orig_vendor = null
+ return ..()
+
/mob/living/simple_animal/hostile/mimic/copy/ranged
var/obj/item/gun/TrueGun = null
var/obj/item/gun/magic/Zapstick