From efbb1331670f1963a3d9d944a1a87ea255974708 Mon Sep 17 00:00:00 2001 From: Fikou Date: Thu, 4 Feb 2021 08:46:08 +0100 Subject: [PATCH] Adds powerup system, refactors ctf pickups and powerup mine subtypes into it (#56605) --- code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/status_effects.dm | 4 + code/datums/status_effects/buffs.dm | 48 +++++++ code/game/objects/effects/mines.dm | 89 ------------- code/game/objects/effects/powerup.dm | 126 ++++++++++++++++++ code/game/objects/items/flamethrower.dm | 9 ++ code/modules/admin/fun_balloon.dm | 6 +- code/modules/awaymissions/capture_the_flag.dm | 44 +----- .../mining/lavaland/necropolis_chests.dm | 5 +- code/modules/projectiles/guns/ballistic.dm | 10 ++ code/modules/projectiles/guns/energy.dm | 8 ++ code/modules/projectiles/guns/magic.dm | 6 + icons/hud/screen_alert.dmi | Bin 109961 -> 110845 bytes tgstation.dme | 1 + 14 files changed, 218 insertions(+), 140 deletions(-) create mode 100644 code/game/objects/effects/powerup.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index c211b501fc1..d7bb6714614 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -611,6 +611,8 @@ #define COMSIG_GRILL_COMPLETED "item_grill_completed" ///Called when an armor plate is successfully applied to an object #define COMSIG_ARMOR_PLATED "armor_plated" +///Called when an item gets recharged by the ammo powerup +#define COMSIG_ITEM_RECHARGED "item_recharged" ///from base of [/obj/item/proc/tool_check_callback]: (mob/living/user) #define COMSIG_TOOL_IN_USE "tool_in_use" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 2c4a7bad3b0..57c9708bff4 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -33,6 +33,10 @@ #define STATUS_EFFECT_DETERMINED /datum/status_effect/determined //currently in a combat high from being seriously wounded +#define STATUS_EFFECT_LIGHTNINGORB /datum/status_effect/lightningorb //Speed from a lightning orb! + +#define STATUS_EFFECT_MAYHEM /datum/status_effect/mayhem //Total bloodbath. Activated by orb of mayhem pickup/bottle of mayhem item. + ///////////// // DEBUFFS // ///////////// diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index e710cc06e0e..84c315993b1 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -462,3 +462,51 @@ name = "Blessing of Wounded Soldier" desc = "Some people seek power through redemption, one thing many people don't know is that battle is the ultimate redemption and wounds let you bask in eternal glory." icon_state = "wounded_soldier" + +/datum/status_effect/lightningorb + id = "Lightning Orb" + duration = 30 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/lightningorb + +/datum/status_effect/lightningorb/on_apply() + . = ..() + owner.add_movespeed_modifier(/datum/movespeed_modifier/yellow_orb) + to_chat(owner, "You feel fast!") + +/datum/status_effect/lightningorb/on_remove() + . = ..() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/yellow_orb) + to_chat(owner, "You slow down.") + +/atom/movable/screen/alert/status_effect/lightningorb + name = "Lightning Orb" + desc = "The speed surges through you!" + icon_state = "lightningorb" + +/datum/status_effect/mayhem + id = "Mayhem" + duration = 2 MINUTES + /// The chainsaw spawned by the status effect + var/obj/item/chainsaw/doomslayer/chainsaw + +/datum/status_effect/mayhem/on_apply() + . = ..() + to_chat(owner, "RIP AND TEAR") + SEND_SOUND(owner, sound('sound/hallucinations/veryfar_noise.ogg')) + new /datum/hallucination/delusion(owner, forced = TRUE, force_kind = "demon", duration = duration, skip_nearby = FALSE) + chainsaw = new(get_turf(owner)) + owner.log_message("entered a blood frenzy", LOG_ATTACK) + ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT) + owner.drop_all_held_items() + owner.put_in_hands(chainsaw, forced = TRUE) + chainsaw.attack_self(owner) + owner.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,25) + to_chat(owner, "KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!") + var/datum/client_colour/colour = owner.add_client_colour(/datum/client_colour/bloodlust) + QDEL_IN(colour, 1.1 SECONDS) + +/datum/status_effect/mayhem/on_remove() + . = ..() + to_chat(owner, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.") + owner.log_message("exited a blood frenzy", LOG_ATTACK) + QDEL_NULL(chainsaw) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 9080f136e76..50488d59f4d 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -130,95 +130,6 @@ name = "bwoink mine" sound = 'sound/effects/adminhelp.ogg' -/obj/effect/mine/pickup - name = "pickup" - desc = "pick me up" - icon = 'icons/effects/effects.dmi' - icon_state = "electricity2" - density = FALSE - var/duration = 0 - -/obj/effect/mine/pickup/Initialize() - . = ..() - animate(src, pixel_y = 4, time = 20, loop = -1) - -/obj/effect/mine/pickup/triggermine(mob/victim) - if(triggered) - return - triggered = 1 - invisibility = INVISIBILITY_ABSTRACT - mineEffect(victim) - qdel(src) - - -/obj/effect/mine/pickup/bloodbath - name = "Red Orb" - desc = "You feel angry just looking at it." - duration = 1200 //2min - color = "#FF0000" - var/mob/living/doomslayer - var/obj/item/chainsaw/doomslayer/chainsaw - -/obj/effect/mine/pickup/bloodbath/mineEffect(mob/living/carbon/victim) - if(!victim.client || !istype(victim)) - return - to_chat(victim, "RIP AND TEAR") - - INVOKE_ASYNC(src, .proc/blood_delusion, victim) - - chainsaw = new(victim.loc) - victim.log_message("entered a blood frenzy", LOG_ATTACK) - - ADD_TRAIT(chainsaw, TRAIT_NODROP, CHAINSAW_FRENZY_TRAIT) - victim.drop_all_held_items() - victim.put_in_hands(chainsaw, forced = TRUE) - chainsaw.attack_self(victim) - victim.reagents.add_reagent(/datum/reagent/medicine/adminordrazine,25) - to_chat(victim, "KILL, KILL, KILL! YOU HAVE NO ALLIES ANYMORE, KILL THEM ALL!") - - var/datum/client_colour/colour = victim.add_client_colour(/datum/client_colour/bloodlust) - QDEL_IN(colour, 11) - doomslayer = victim - RegisterSignal(src, COMSIG_PARENT_QDELETING, .proc/end_blood_frenzy) - QDEL_IN(WEAKREF(src), duration) - -/obj/effect/mine/pickup/bloodbath/proc/end_blood_frenzy() - if(doomslayer) - to_chat(doomslayer, "Your bloodlust seeps back into the bog of your subconscious and you regain self control.") - doomslayer.log_message("exited a blood frenzy", LOG_ATTACK) - if(chainsaw) - qdel(chainsaw) - -/obj/effect/mine/pickup/bloodbath/proc/blood_delusion(mob/living/carbon/victim) - new /datum/hallucination/delusion(victim, TRUE, "demon", duration, 0) - -/obj/effect/mine/pickup/healing - name = "Blue Orb" - desc = "You feel better just looking at it." - color = "#0000FF" - -/obj/effect/mine/pickup/healing/mineEffect(mob/living/carbon/victim) - if(!victim.client || !istype(victim)) - return - to_chat(victim, "You feel great!") - victim.revive(full_heal = TRUE, admin_revive = TRUE) - -/obj/effect/mine/pickup/speed - name = "Yellow Orb" - desc = "You feel faster just looking at it." - color = "#FFFF00" - duration = 300 - -/obj/effect/mine/pickup/speed/mineEffect(mob/living/carbon/victim) - if(!victim.client || !istype(victim)) - return - to_chat(victim, "You feel fast!") - victim.add_movespeed_modifier(/datum/movespeed_modifier/yellow_orb) - sleep(duration) - victim.remove_movespeed_modifier(/datum/movespeed_modifier/yellow_orb) - to_chat(victim, "You slow down.") - - /// These mines spawn pellet_clouds around them when triggered /obj/effect/mine/shrapnel name = "shrapnel mine" diff --git a/code/game/objects/effects/powerup.dm b/code/game/objects/effects/powerup.dm new file mode 100644 index 00000000000..7d68f9e5352 --- /dev/null +++ b/code/game/objects/effects/powerup.dm @@ -0,0 +1,126 @@ +/obj/effect/powerup + name = "power-up" + icon = 'icons/effects/effects.dmi' + density = FALSE + anchored = TRUE + resistance_flags = INDESTRUCTIBLE + /// How long in deciseconds it will take for the powerup to respawn, if no value it won't respawn + var/respawn_time + /// How long the powerup stays on the ground, if no value it will stay forever + var/lifetime + /// Message given when powerup is picked up + var/pickup_message + /// Sound played when powerup is picked up + var/pickup_sound + /// Cooldown for the powerup to respawn after it's been used + COOLDOWN_DECLARE(respawn_cooldown) + +/obj/effect/powerup/Initialize() + ..() + if(lifetime) + QDEL_IN(src, lifetime) + +/obj/effect/powerup/Crossed(atom/movable/movable_atom) + . = ..() + trigger(movable_atom) + +/obj/effect/powerup/Bump(atom/bumped_atom) + trigger(bumped_atom) + +/obj/effect/powerup/Bumped(atom/movable/movable_atom) + trigger(movable_atom) + +/// Triggers the effect of the powerup on the target, returns FALSE if the target is not /mob/living, is dead or the cooldown hasn't finished, returns TRUE otherwise +/obj/effect/powerup/proc/trigger(mob/living/target) + if(!istype(target) || target.stat == DEAD) + return FALSE + if(respawn_time) + if(!COOLDOWN_FINISHED(src, respawn_cooldown)) + return FALSE + COOLDOWN_START(src, respawn_cooldown, respawn_time) + alpha = 100 + addtimer(VARSET_CALLBACK(src, alpha, initial(alpha)), respawn_time) + else + qdel(src) + if(pickup_message) + to_chat(target, "[pickup_message]") + if(pickup_sound) + playsound(get_turf(target), pickup_sound, 50, TRUE, -1) + return TRUE + +/obj/effect/powerup/health + name = "health pickup" + desc = "Blessing from the havens." + icon = 'icons/obj/storage.dmi' + icon_state = "medicalpack" + respawn_time = 30 SECONDS + pickup_message = "Health restored!" + pickup_sound = 'sound/magic/staff_healing.ogg' + /// How much the pickup heals when picked up + var/heal_amount = 50 + /// Does this pickup fully heal when picked up + var/full_heal = FALSE + /// If full heal, does this do an admin level heal? + var/admin_heal = FALSE + +/obj/effect/powerup/health/trigger(mob/living/target) + . = ..() + if(!.) + return + if(full_heal) + target.fully_heal(admin_heal) + else if(heal_amount) + target.heal_ordered_damage(heal_amount, list(BRUTE, BURN)) + +/obj/effect/powerup/health/full + name = "mega health pickup" + desc = "Now this is what I'm talking about." + icon_state = "duffel-med" + full_heal = TRUE + +/obj/effect/powerup/ammo + name = "ammo pickup" + desc = "You like revenge, right? Everybody likes revenge! Well, let's go get some!" + icon = 'icons/obj/storage.dmi' + icon_state = "ammobox" + respawn_time = 30 SECONDS + pickup_message = "Ammunition reloaded!" + pickup_sound = 'sound/weapons/gun/shotgun/rack.ogg' + +/obj/effect/powerup/ammo/trigger(mob/living/target) + . = ..() + if(!.) + return + for(var/obj/item/gun in target.GetAllContents()) + if(!isgun(gun) && !istype(gun, /obj/item/flamethrower)) + continue + SEND_SIGNAL(gun, COMSIG_ITEM_RECHARGED) + +/obj/effect/powerup/ammo/ctf + icon = 'icons/effects/effects.dmi' + icon_state = "at_shield1" + respawn_time = FALSE + lifetime = 30 SECONDS + +/obj/effect/powerup/speed + name = "Lightning Orb" + desc = "You feel faster just looking at it." + icon_state = "electricity2" + pickup_sound = 'sound/magic/lightningshock.ogg' + +/obj/effect/powerup/speed/trigger(mob/living/target) + . = ..() + if(!.) + return + target.apply_status_effect(STATUS_EFFECT_LIGHTNINGORB) + +/obj/effect/powerup/mayhem + name = "Orb of Mayhem" + desc = "You feel angry just looking at it." + icon_state = "impact_laser" + +/obj/effect/powerup/mayhem/trigger(mob/living/target) + . = ..() + if(!.) + return + target.apply_status_effect(STATUS_EFFECT_MAYHEM) diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 6318e85b3ad..1d50421d7bd 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -236,6 +236,7 @@ if(create_with_tank) ptank = new /obj/item/tank/internals/plasma/full(src) update_icon() + RegisterSignal(src, COMSIG_ITEM_RECHARGED, .proc/instant_refill) /obj/item/flamethrower/full create_full = TRUE @@ -259,3 +260,11 @@ /obj/item/assembly/igniter/proc/ignite_turf(obj/item/flamethrower/F,turf/open/location,release_amount = 0.05) F.default_ignite(location,release_amount) + +/obj/item/flamethrower/proc/instant_refill() + if(ptank) + ptank.air_contents.assert_gas(/datum/gas/plasma) + ptank.air_contents.gases[/datum/gas/plasma][MOLES] = (10*ONE_ATMOSPHERE)*ptank.volume/(R_IDEAL_GAS_EQUATION*T20C) + else + ptank = new /obj/item/tank/internals/plasma/full(src) + update_icon() diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 6a12116852c..5790c685681 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -170,11 +170,7 @@ var/mob/living/M = AM M.forceMove(get_turf(LA)) to_chat(M, "You're trapped in a deadly arena! To escape, you'll need to drag a severed head to the escape portals.", confidential = TRUE) - INVOKE_ASYNC(src, .proc/do_bloodbath, M) - -/obj/effect/forcefield/arena_shuttle_entrance/proc/do_bloodbath(mob/living/L) - var/obj/effect/mine/pickup/bloodbath/B = new (L) - B.mineEffect(L) + M.apply_status_effect(STATUS_EFFECT_MAYHEM) /area/shuttle_arena name = "arena" diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index d7e02b5a54d..89474732cdc 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -4,7 +4,6 @@ #define FLAG_RETURN_TIME 200 // 20 seconds #define INSTAGIB_RESPAWN 50 //5 seconds #define DEFAULT_RESPAWN 150 //15 seconds -#define AMMO_DROP_LIFETIME 300 #define CTF_REQUIRED_PLAYERS 4 /obj/item/ctf @@ -184,8 +183,7 @@ ///assoc list for classes. If there's only one, it'll just equip. Otherwise, it lets you pick which outfit! var/list/ctf_gear = list("white" = /datum/outfit/ctf) var/instagib_gear = /datum/outfit/ctf/instagib - var/ammo_type = /obj/effect/ctf/ammo - + var/ammo_type = /obj/effect/powerup/ammo/ctf // Fast paced gameplay, no real time for burn infections. var/player_traits = list(TRAIT_NEVER_WOUNDED) @@ -670,45 +668,6 @@ alpha = 100 resistance_flags = INDESTRUCTIBLE -/obj/effect/ctf/ammo - name = "ammo pickup" - desc = "You like revenge, right? Everybody likes revenge! Well, \ - let's go get some!" - icon = 'icons/effects/effects.dmi' - icon_state = "at_shield1" - layer = ABOVE_MOB_LAYER - alpha = 255 - invisibility = 0 - -/obj/effect/ctf/ammo/Initialize(mapload) - ..() - QDEL_IN(src, AMMO_DROP_LIFETIME) - -/obj/effect/ctf/ammo/Crossed(atom/movable/AM) - . = ..() - reload(AM) - -/obj/effect/ctf/ammo/Bump(atom/A) - reload(A) - -/obj/effect/ctf/ammo/Bumped(atom/movable/AM) - reload(AM) - -/obj/effect/ctf/ammo/proc/reload(mob/living/M) - if(!ishuman(M)) - return - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) - if(M in CTF.spawned_mobs) - var/outfit = CTF.spawned_mobs[M] - var/datum/outfit/O = new outfit - for(var/obj/item/gun/G in M) - qdel(G) - O.equip(M) - to_chat(M, "Ammunition reloaded!") - playsound(get_turf(M), 'sound/weapons/gun/shotgun/rack.ogg', 50, TRUE, -1) - qdel(src) - break - /obj/effect/ctf/dead_barricade name = "dead barrier" desc = "It provided cover in fire fights. And now it's gone." @@ -774,5 +733,4 @@ #undef FLAG_RETURN_TIME #undef INSTAGIB_RESPAWN #undef DEFAULT_RESPAWN -#undef AMMO_DROP_LIFETIME #undef CTF_REQUIRED_PLAYERS diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 0d53a79dc20..9ac3f955ce8 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -1075,12 +1075,11 @@ /obj/item/mayhem/attack_self(mob/user) for(var/mob/living/carbon/human/H in range(7,user)) - var/obj/effect/mine/pickup/bloodbath/B = new(H) - INVOKE_ASYNC(B, /obj/effect/mine/pickup/bloodbath/.proc/mineEffect, H) + H.apply_status_effect(STATUS_EFFECT_MAYHEM) to_chat(user, "You shatter the bottle!") playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE) message_admins("[ADMIN_LOOKUPFLW(user)] has activated a bottle of mayhem!") - log_combat(user, null, "activated a bottle of mayhem", src) + user.log_message("activated a bottle of mayhem", LOG_ATTACK) qdel(src) //Colossus diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 352a40a1a54..df51f04f080 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -124,6 +124,7 @@ else chamber_round(replace_new_round = TRUE) update_icon() + RegisterSignal(src, COMSIG_ITEM_RECHARGED, .proc/instant_reload) /obj/item/gun/ballistic/vv_edit_var(vname, vval) . = ..() @@ -612,6 +613,15 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( process_fire(user, user, FALSE) . = TRUE +/obj/item/gun/ballistic/proc/instant_reload() + if(magazine) + magazine.top_off() + else + if(!mag_type) + return + magazine = new mag_type(src) + chamber_round() + update_icon() /obj/item/suppressor name = "suppressor" diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index a9f92eeb6ad..5cae6c77ea0 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -44,6 +44,7 @@ if(selfcharge) START_PROCESSING(SSobj, src) update_icon() + RegisterSignal(src, COMSIG_ITEM_RECHARGED, .proc/instant_recharge) /obj/item/gun/energy/ComponentInitialize() . = ..() @@ -243,3 +244,10 @@ playsound(user, BB.hitsound, 50, TRUE) cell.use(E.e_cost) . = "[user] casually lights [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src]. Damn." + +/obj/item/gun/energy/proc/instant_recharge() + if(!cell) + return + cell.charge = cell.maxcharge + recharge_newshot(no_cyborg_drain = TRUE) + update_icon() diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 896876c118e..fdff86776af 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -54,6 +54,7 @@ chambered = new ammo_type(src) if(can_charge) START_PROCESSING(SSobj, src) + RegisterSignal(src, COMSIG_ITEM_RECHARGED, .proc/instant_recharge) /obj/item/gun/magic/Destroy() @@ -89,3 +90,8 @@ switch(var_name) if(NAMEOF(src, charges)) recharge_newshot() + +/obj/item/gun/magic/proc/instant_recharge() + charges = max_charges + recharge_newshot() + update_icon() diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index fb35edddf6224f3f564230d3665ffeef9cfba270..ca92a6c390c79e77948331ce049c18a48086e06a 100755 GIT binary patch delta 10819 zcmYkCWmFwa)TMCkd*9EnwiUrROPQIj@MrB`yK`Z2v~iA-3WKYPEk<+4HK#^`ThVsG|- zKCbf}FUL+Jz3As<$Ly$u{)j{P%9Sd<56THJqNFOM@CLB5PH6AESW)dtm46Nx*2c^H zY8+YBa+@k#IR9{^Nb(JDngK9;sC-FB-3*HSb+BQ>u=)-Z-_&iqkwDA)J`I)|kYqjg zjJNt`=*!evI_sEy_j$q99B#-`=1@g$2j){9Wd(P)SorUHmK2VR(m6dU`7?zolwI9lX<5I=Hl2CL_VF3IeFx(;W+nM)ga7YnC zoi)#oRc-plVA0wT+6tgdK^9iS%Y-kRlU zJPq03rT-?e`aWbdFQ6Pwo&A-`ltz!V?m%;&Il-QO*E7mLhk%LwooxqZblNkWBAz>Y z;o14z-tTxJW3`b*H(E<~g5aMxbM4iezVO=9RQu%JtG?jc9sDuSX{JX)C16T}^09>4 zvesx;&+ON5yiFs@iVu}>*XDZq4%drF<`R`)t7Z}ajZvam#w$vuFm?nK! zJb`;H21A=v{aRgCFw<;EH?tFM{UEYryFi3F4RtpQKGr)=Eze+25+xgxI$fRZvpv%p zua0duQ0S2jQmlcU7ssnFsjlHCn;qm4i$q%eax~jCYL=MCl%=0|qJ7tD7Vq!SRSQ1Q zigA9_##;X{l~c z!f_N&DfX+BN=}QQXp^E;!0epRz$b-Oo(s3nIXNOR0XZ_x%BbF7QM!2U-DpU|VlKWo z_83{Rgk$4=Px|v+$Kc}Mc)(l6SNVXY8rl!7xtE|TTc5++r^$0RQ1&G_=<;C+m~0c( zg?%~-=6fJ3uF>faP$kB=BO%4gELGF3ES`W3O(sj)eW;16t6Uk!BPa^Kk^GXxNc#xm zdGD1dWX(g1lqnTDC38*x-x;eXV)GnaxDmo?9|9i;kXeZCw@ig^7q~)ixF9kov?tDI-b13Lo3-mXj833KpXUBOy=Zn==tv zE7-b5a79A(chrzYLknn9*w^*Ur`79j0w&dz@MFv0v2nCKwWL1$<8(kZ-#y=}6+>cu z*>4k8jXd67g*K5)Fx5NOlp;2!LQgBuZPChHln!oVb?ZnE=hO#WYsdY|S=t>q?>MWb z$>(H#&ujSU(C_VYFN=vA_vRPV*-J(@$K9JVagZM~ArB7f@dwJ*S^97)+?Z|e{#K78 zy*5v~!O##qdX;VO_Br4_8w;p_Tlq{EpxcBO;9j)Ls(F_k>P}NuxnNtt`nR1+ZaYMb z=LOIpS!o@8@ySi@j|W=ksiTR+0WuX|NN3zsrN)$Ld46&J zYR|Z!hu7UVv0-hz{1;%srcjPY9}ln z(nt7^(2DIQyq*((QDwKrvK%#3+(d^VTy9-0-O8QIY%|2vZ-JpxvFu%NJx!OJrdMzD zG>>sn0Kl`47ii*N4jWu6etV=pwEu!`z({?N>eNcPKm5uNcYt|y`UFZ@W#8{>>VC<( z{O{sElO0mj&ylzw8JFQY%^Vet`;(Y{7%iBRP<v?i3I(*v zWQ7nCOKlO%A;f|1do{w4IoH(M4I#IszV-&%U34vrfP7RDn6D0#IDr#m{9+)7uIqXF zr?;(3HUZ>^=vtO%nIpeT(t}AoMFv{fya!(k6UGSte3YnEB7gM4Qh5aOgrYlk>f7|u zl9N+@K?`36^oRRzu%*lnBSxoB%y(QKlScmSlX&Pz)mETy@<9nZy=t>C>E9Bv@p zj3eU*GSmJ8Fu|Knk4PE(@~=Iy{jw|D>uj+YdP%^n!@JoC{RJN?WpARu_(P9JNF!o#MPH2|C(8%HT5M<)LaOg$P98<#puPK-vjT24`#W{u z10e=W0($^|5RU4=BIHT>Y&Q=}4#NR1 zX?r6Pl}A&h!#jU&W^}ea8h0Zf@Lz zIA7|ICq#`WQz)8ec3HWCbWLjdqalVg>$5#>lal)S!~zZZOEznhZTDKnxE{JnDF>MH zo898YwpyF?ni1I~-G_PX0O(XxT+zVP#AFid?Vi++IY}!>9{lBLKSlLpJTn{HWDA*D zZzv**-fx&-(SZBkt~*kj0hdZ9;7t7K8Y}XW)#coCk)*7!6<>zbBBdNQLgXwAgGE&v z3!@N6wgOaVk12J&d*fc~aib(q5;J3WD%z=f&M2W%{*NfQRba&%a61&vKFC4Vyl;95 zDiGSaTTVXP1+HQt(mAx|G^ak7$fjO5TW(+eY&Td8Vb;0r$q}O?c`&8befbkp7BMNE zgo5xrqIVomhWn=)V$tVHzz3{n@&c6BCCg;zVWq**Ajw1*aI-{BTjGbISi^8d<9<}a zQRzfZWGPKW@lDSFtX8|iP4UDsi8&Q*rHM6X%WQAEks+SXCtPAgTy96TK4XHp&l)9W%|vZ{`c#&06{87#Fada_W4Q!{obDyAIvW(KT0U8gxdxFY``fTBr)yNdAe;SGs{B4C@hrgqgrgRbZ8rn^e1{h9I;TW$ z3+t+_&Z9yfE~Aw?SgpBY+yQAFKtT=1q)#F8p+QR=@GeQ_b3F)T*7fxf!r(SGL5mDZ`zo?jaF@lr(U? zcNYTBeZ21vp(K9Vgf$e*ZxQb6i_ncS0YqB^?D_C3g6joIz=v1D;5ThuLr@s*L-H7w z^JiwN9mL3EIWA+&8A>O4kG9Mh$-+Y1+lCHF0FhrIgwr=#Up9S@0FIK=lh%YxX(;}~ ztfbGM7)eIIZz$97HC9zg=0-~EN?cMoi7bSpCOh^Q$LY-ey*Y-B86=HXSs*7NqGrGYtURbW5x)i{4UsC`J6~5Eb=@GzvL)u83NU6A;;F zV7s|75iv#BPLvxk<>w1{E4EfSpZ4so!F1?=X3L-iK9TI}<{xe6l@AcKSq1NCh?*cZ z$1fR@Q~A*JEJB12g2crNxRsMlc*ErqH#@pRzrU^$%)6nNjuH55QCx>>p2|N>!CH9q zH*xw6KVUiz5VC>9+|6k&VYnwS01_;SWg(I+!JMS`oFV~cXD;g3j}#MT1nMLrx;@hl z9W1IISxjOy7=bel0>5l<6wncH5JUwYc_p{u1S)#kGZ5V~zL5FeI`X=v0LXd6ln75p zA({P&fA|7^g;8HS+R4r$l;j6|`yyVOMeyQRH1c9E_-Xt;TOYHPg~YyNCR^zHf?DBO z!-0CYOxM}dJmektj`)4xBO?)oSijZZSWcpS|EO%;SY63Ss)=X8EJoPREo4}-ww}0! z5t0R1GUz$!VLqJAzcdqKBT{EY1F`G(@9AGKMbgBPZhn6Mz7w_Sa*Iz$02=*6T$h18 zfO{h)d&Fa%nudc1S8Kk_hkmVFy5%9R%}xL8|JPIWZiyprYm1-~Skwan^{^cW=N>fH=4xs}Zh#+Cpcb+@3#eUv+#0W_|-dV>(Czbtk>Otn#nBRM{q%%-kv) zoA53TxSrdb#$JB0rmP7rs}CCMEa}gm)>ZkG_Q}mY=3zC!F(u0wAxr16-nms96&Bb zLxDLS2UZdIo;s!Xr0I5Ey;M~fgMt-VwVm4XulI7D?Xc?Tizv7XN!M1N>oQ* z_ycY=nM2oRsUG!oG{LQazV&&0mr`DS-cab((ZgF$+ok=7w(A(9c%5ytHb!Y^lKU1# z{1&E!Cdw%r>kRa5EI(^z6*{ z7SVq~dj+HY)$4{34Li-1Vg+Cr8wv5yzSS3xU`+41j|KmX6+b!i%DqY>0-7FA&10zc zT`jA=kzQV2+V(ftSr8Z`W~B5Qa#v+Dyj_3cd6NLvxmh*ovMRzI^u=={{rlUdUGlvV zg+~+ggWO25BFeIxa!UEh2fOJ7-xVJ69%x9EgJYJ}z0rv>@hlI6gs6V^pBM_>-p>6ZYiclShcyhKc8{i>vB1d3ul13h zv>Uj4Td(u9E$otEK1^~Dlfk^kzd}ycz;Wtxy5$<Q;vT*>8 zAF8~(P5VnkR5wKYK|Ba}Huiu6Oo$@#V}R$^#ANZaCrW=1Hg6;Er!k6eQ@uR9+P3yJ zSQ(M|!X{!r=5z7K3l`LBXISUH(i>(Q;?RJut#)-E?~0GA<%8;MJ!PDV%Q)sbUx@P0 zYa-`hMuw6`U62bHLnR7?)>l>zJ6(TrJ7j8UAJ7Sj64s}y!=|P2K1ZOfC{~AKBLHv< zc90RdJs@z&!fv&bzP}E3mGb3?BW`c*ygTBKOZm1Uv2m zl+O@%_c9d@z`d2<;F3!VowOz`HPRxB=jJ+5wg@GFN?G&Ir+|Afi2;crcSVZ4LtV{$ z#Wc)#MN2?71`Q4f=l65Fw<$f)u8Y9+PZ1@41vD2nUIxBCfp>VI1H^SZzqmfi#aGZz zW~1Hr{v&|Jya1v`^-ru^%fa3-SyCD2XdZlTQIH28uBN?&#O8|a`HUeS(Zl7NEy|pv zPl1GZns*?G>VSCWZA#EvCLDZEb8xM^0c_Q_#oar1U5`gO4Cr<{asVnbK%Q7Oi^>+0 zbD~E2&A#hk)5JeFtUef1GlLb%NO@r&7=tm8!=Oz>m!t2!`H`1hIff?_GZHy{YB|ED zn%6U@KJ{Wsq{QV4=QFJQ-l+*0*+m+TGM#w(Bx6(R*PJ?1B40fg1#n%PKY<}(preZ} zu3j+Bqs?tO~k)?rB`c;*Z@E6qa zAHfDD4Ijb(eiHY68+pSL$OKpFRA-^vlkz#je3=Yg;mQVX$B^j8=C|skWRInu8px+C zuM-J0L&VoBqduO^L}`3V8QGd~bDq`Cz#xU_C*Ptt^Nd*kT&GX@`uutvijCP7_o$Ef>v4E}of+%}Gd=M<$s4Cv)q^IUc=&J5OfT_-Z@C-oPi=W0KZoB!DYS@r}ii?x^PJcwrsd zi})8@(>&XTu-MHln6V15amdlODp52>?~>Wi8R;PzkNs#faPbZE}*&1?t>Z zM%D0=4Za%;@6ST>hKr3&Ha{|10B}J_4}dOb*wI^#5jTqnIC5+3=ylZYse>KWI*VX#CRMug@X_ zBTu(fi>kM2mi`yz>qA&Mki;s!qke@>oB8@?Bu2 zma?7?wb?)TOsdxc5}!;MX%K;lYR|?lj*oASWssRETYECQ&v(U-;t^wq>}GRc^QYRr zvb}Non-`}U0v8UZcd&skYg>wj{Arynj?2H@+>-HwZ(3ivK-HVc{{kiedRF?y2*LzB z-}=NKcXQnS*o<*Qu?*MIYhA!>)>FW%aqZlbLgoVV*AD1x*-a7q;?E25-k+>t(U(&L z@x00WhKn=F%9Bsq7|s4ky>}jQ-#%zu!U7sahG2&*Sgrho`e)p@%-OG zsQ-qu*WZfpu>#_ZGrX}YC=sH@m!Q@e9D*KCwF`yz1*Ku}QBr?IjRx45s!WJVxE&am zR1K3C-thrJpgO~v?GzNh4IX9`y1W40GqgtsXRDd-?W}Y>n;_H99lm?uggVHpDed)Q z$nRmC5$63==1{whN}YedlVCFh244-g>%Ot}d31CXfXNUI@Xlgi^2JX|!hIM0D2_-B zvB4a50$DIqk@A&bqUuOAdp@r$t|!kU8<{&)%{r2<1`lBjCnJz#*9_nDcc^;)FXQ zTJ{glOG={JdL*vkbvQdQvNoP{jx-AjSH115J@oL|wBZuh!a+-P9Q*|B-A7%u(c{1A z?aRyQrsChU-i)|?K(ZC66;+)J24d=h1y%s1Y384f%7%FMz*9c&?k8^*g4+$=4TaX8q_hvFweq{{DLV9@(M$w+FY zwuBcAQ%B5I6b@kin}>pd2ofz zRB@lFtjiMM7x-89di!Ja`ZK&(BS>|{)c@-$-xCuRHJwy2Y1kL#(s?|*zp_GI#BCWm z1OyAP=?v_=GCUuTPbs*BCjBiolOhOjHYIlYp!VawO2D%RHCbvv5erkxTgBbMiFOLWLTMw2iI zAkWX4Pw-Y$F0d@5oDt!I)MCJE@34n^yWd*r_LyYU)~eS$2;TY-)q+3;J*ZrtpTMV% z4&dvxhEIEKLTk46BAG>lAEjU;q^uvpp$Ht%fnj22$AS&qZNPf$3xn@?0#E)y6=0x3 zrlnJ%W}HR;Y|J_O%_8;DV!UFp1^i&&xYh2QprfI|jJ{WO>r1xUGyP6**$D;5qfjtM z!`Gsh=JznAp?W;_jMm(ze_R&AL!)7LcSyQhRFDVLDpQs1VmPTNQF$J^5{1 z*-he>jRsc%>z{T~kKZP@y|7|40AVQxd^(;2PLBN|c4>9u62d-(Ip{DyV9Q&Q2MZ}52!xC0VuH7KWbMx}1=i5T@V z6cDvM4m7qJnZ+buG9O@}X#p(%@C@DVFyY9^v+G#6obM5}cE71>;PxBh%X$bz53pg! z5VaWD&`I#ofu=d6r`cpS1+@&{%ed5fiZDo2R}~x9h5hRGl=UYNt4F-+jpb$Sh_kyM0ifz3 z1jM|u^%42S5Q`{E4;Ajr!^zhod5@Lt*7-{Ylu@P=)khTfYtI8xd?75`b^UMt`Kg< zHwU{1U994im4N9I6rs8idG^ZZ@uvEXhEy7pfiZ(6S2VpD`hDiVWZF_RPXaj`0#Y?I z4Zw(k)Cxulk!0Va4byidjnN~E&M)}|wq^k%`Y|EE&$J*74H9!T^%jeoQ2E zWlT~MqDc`dzUgXfYE^+Pe za}UB}RUzf4_@6+xo&++-vZpT5{bIj%DYCtaI;h#%5l2#t`JJm};Du^PvY9KCa)kGn zD@K)|m6N*LO5ncxL`z{OBN1yWKt_`ACCam%3||qW`6Aq`e=t=}(s>ywlIgGdhRH~a zxva%koLcdr4w6Op+)(8Stqp!^pgZmJeT`%387Fs?2e>*p7N}ZCx7Cl(CRnNu6528Hzz{tmO88{&1AQX{jr{lA2@#&^JPg74K^_Kn` zb?_Id1b0R30zfrbr2GKp(y6f?`i?mlFBHZ_6ic|?CJJkk;}aMEHNC+>KkDG2=~^xN z%*7bitrQ_b>mlO$<_HalKk?6Hz2wGmUM|;zYVQ9^?ik(6PvDVso<4ab-kc0I+Cew4 zZz<^T>*(0nJFKi&Ugdrc^wH5VY$@r)c#2@uOJqv`i8?AtqaPcE(JSgC(y4|wEWW?+ zQ!~CmJwpD>qtkzeMLh`)%3AA=KPg^74O8#pq>6R-w9~=Y;6ELTG=mi|&L_9kW{AJ%KLe|zbgS_P#9=v%yZR=d3K->jYYVb-yoE$;wsD9_p++zJ{s#gqy z8URZ-abzbB65~D^rz1kw=vTNpxe!uS_3>G375@a@J3*%Hfz`mf4w8_{QdthB?v*G| zJP(3qgg^x~SNVD4v2klxm2_qktHoZq^jPg|bOZae*LXXVwz|ukKNs}BK2-Qvp&vOD zI$;skIZqLsGYCh5rWH&W79dV6;EHTJKpvD_WS07F1uoHGap5_%SZ?s^+p81!b%VeD zK_+R#r7L&Eqh@Ozg1|_H<|5Y3T{OsOn*BTE{K zKT&v{W~@@M^-Db2 z?d`c$Hy|apdz1YBD;-s#O;NG7W&F{yg^vFOM=OCD+f}37fB&4j7*}W4OaC|CGqz<5 zl3r52ga5(YcTV4~?|A{&#Os3{D_6a)wXF)Z?f$7zmb_T%7#klz;e(@F3wBJIGZaJd zIwyR2pys6ME&7yE^?Y9+pEe6$wl~dElFlH&O5j5`F}~F2*FTLNsvJa?kbm@g9lO@R zH|we5!_nf7_RC`I?XeP`wl<*-nlX!dkw=geTUtu&7E}`x5-z4W{%@4m@Gx2)p)e3Q z{yu2s9gz%;I+V-My!<*h!7;n&Qdvemx~$lp#=CUAtb$4E5U1v`o>J`|P8i&BTkM$5 z>#qC;1$yv@*MFM5B`$_P2ztc?%ICU?YQWV%>?^u$HLXCn@F&C;t0mch;1oJsAw>&C9 zSutS=l=(gVSTkzc>1p@_f}qd0>S!5aqYKavdexBswWrsJD-rH(REBNRUc aL$Jm%$smD>Il(Z{GyZZ!PEm delta 9928 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 C{9kAQ diff --git a/tgstation.dme b/tgstation.dme index 042d46d3a6f..ddf88660cba 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -959,6 +959,7 @@ #include "code\game\objects\effects\overlays.dm" #include "code\game\objects\effects\phased_mob.dm" #include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\powerup.dm" #include "code\game\objects\effects\proximity.dm" #include "code\game\objects\effects\spiders.dm" #include "code\game\objects\effects\step_triggers.dm"