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