Buffs the uplink thermal safe drill (#21312)

* commit stuff for safety

* making sure this shit saves

* I am commiting every 5 frames now, sorry. I lost 25 frames as the file got corrupted

* 45 frames

* 51 total frames now

* 55

* 65

* 70 frames

* 75

* 80 frames almost there

* Behold, a useful uplink item.

* removes debug message

* Apply suggestions from code review

Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com>

---------

Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com>
This commit is contained in:
Qwertytoforty
2023-06-28 15:38:55 +01:00
committed by GitHub
co-authored by S34N
parent 27a9a57787
commit 032b065214
10 changed files with 156 additions and 9 deletions
+2
View File
@@ -54,6 +54,8 @@
#define STATUS_EFFECT_HOPE /datum/status_effect/hope // Healing that scales when injured (but not in deep crit), and nice messages to keep the hope
#define STATUS_EFFECT_DRILL_PAYBACK /datum/status_effect/drill_payback // Slight antistun and healing, along with visual effect. Works only in range of the vault, and for 30 seconds after it ends.
/////////////
// DEBUFFS //
/////////////
+4
View File
@@ -99,6 +99,10 @@
/obj/screen/fullscreen/impaired
icon_state = "impairedoverlay"
/obj/screen/fullscreen/payback
icon_state = "payback"
show_when_dead = TRUE
/obj/screen/fullscreen/flash
icon = 'icons/mob/screen_gen.dmi'
screen_loc = "WEST,SOUTH to EAST,NORTH"
+37
View File
@@ -547,6 +547,43 @@
else
to_chat(owner, "<span class='cultitalic'>[pick(un_hopeful_messages)]</span>")
/datum/status_effect/drill_payback
duration = -1
status_type = STATUS_EFFECT_UNIQUE
alert_type = null
var/drilled_successfully = FALSE
var/times_warned = 0
var/obj/structure/safe/drilled
/datum/status_effect/drill_payback/on_creation(mob/living/new_owner, obj/structure/safe/S)
drilled = S
return ..()
/datum/status_effect/drill_payback/on_apply()
owner.overlay_fullscreen("payback", /obj/screen/fullscreen/payback, 0)
addtimer(CALLBACK(src, PROC_REF(payback_phase_2)), 2.7 SECONDS)
return TRUE
/datum/status_effect/drill_payback/proc/payback_phase_2()
owner.clear_fullscreen("payback")
owner.overlay_fullscreen("payback", /obj/screen/fullscreen/payback, 1)
/datum/status_effect/drill_payback/tick() //They are not staying down. This will be a fight.
if(!drilled_successfully && (get_dist(owner, drilled) >= 9)) //We don't want someone drilling the safe at arivals then raiding bridge with the buff
to_chat(owner, "<span class='userdanger'>Get back to the safe, they are going to get the drill!</span>")
times_warned++
if(times_warned >= 6)
owner.remove_status_effect(STATUS_EFFECT_DRILL_PAYBACK)
return
if(owner.stat != DEAD)
owner.adjustBruteLoss(-3)
owner.adjustFireLoss(-3)
owner.adjustStaminaLoss(-25)
/datum/status_effect/drill_payback/on_remove()
. = ..()
owner.clear_fullscreen("payback")
/datum/status_effect/thrall_net
id = "thrall_net"
tick_interval = 2 SECONDS
+3 -3
View File
@@ -410,10 +410,10 @@
// DEVICES AND TOOLS
/datum/uplink_item/device_tools/diamond_drill
name = "Diamond Tipped Thermal Safe Drill"
desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Guaranteed 100% jam proof."
name = "Amplifying Diamond Tipped Thermal Safe Drill"
desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Comes with built in security detection and nanite system, to keep you up if security comes a-knocking."
reference = "DDRL"
item = /obj/item/thermal_drill/diamond_drill
item = /obj/item/thermal_drill/diamond_drill/syndicate
cost = 1
uplinktypes = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
+3 -3
View File
@@ -373,10 +373,10 @@
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
/datum/uplink_item/device_tools/thermal_drill // Nukies get Diamond Tipped Thermal Safe Drill instead
name = "Thermal Safe Drill"
desc = "A tungsten carbide thermal drill with magnetic clamps for the purpose of drilling hardened objects. Guaranteed 100% jam proof."
name = "Amplifying Thermal Safe Drill"
desc = "A tungsten carbide thermal drill with magnetic clamps for the purpose of drilling hardened objects. Comes with built in security detection and nanite system, to keep you up if security comes a-knocking."
reference = "DRL"
item = /obj/item/thermal_drill
item = /obj/item/thermal_drill/syndicate
cost = 1
excludefrom = list(UPLINK_TYPE_NUCLEAR, UPLINK_TYPE_SST)
@@ -6,8 +6,11 @@
w_class = WEIGHT_CLASS_GIGANTIC
force = 15.0
var/time_multiplier = 1
var/payback = FALSE
var/spotted = FALSE
var/datum/looping_sound/thermal_drill/soundloop
var/datum/effect_system/spark_spread/spark_system
var/datum/song/song
/obj/item/thermal_drill/New()
..()
@@ -15,14 +18,54 @@
spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(1, 0, src)
spark_system.attach(src)
song = new(src, SSinstruments.synthesizer_instrument_ids)
/obj/item/thermal_drill/Destroy()
QDEL_NULL(soundloop)
QDEL_NULL(spark_system)
QDEL_NULL(song)
return ..()
/obj/item/thermal_drill/attack_self(mob/user)
add_fingerprint(user)
ui_interact(user)
/obj/item/thermal_drill/ui_data(mob/user)
return song.ui_data(user)
/obj/item/thermal_drill/ui_interact(mob/user)
if(!payback)
return
song.ui_interact(user)
/obj/item/thermal_drill/ui_act(action, params)
if(..())
return
return song.ui_act(action, params)
/**
* Whether the instrument should stop playing
*
* Arguments:
* * user - The user
*/
/obj/item/thermal_drill/proc/should_stop_playing(mob/user)
if(!payback && spotted)
return TRUE
return FALSE
/obj/item/thermal_drill/syndicate
name = "amplified thermal safe drill"
desc = "A tungsten carbide thermal drill with magnetic clamps for the purpose of drilling hardened objects. Comes with an inbuilt morale booster and security detector, to assist in drilling."
payback = TRUE
/obj/item/thermal_drill/diamond_drill
name = "diamond tipped thermal safe drill"
desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Guaranteed 100% jam proof."
icon_state = "diamond_drill"
time_multiplier = 0.5
/obj/item/thermal_drill/diamond_drill/syndicate
name = "amplified diamond tipped thermal safe drill"
desc = "A diamond tipped thermal drill with magnetic clamps for the purpose of quickly drilling hardened objects. Comes with an inbuilt morale booster and security detector, to assist in drilling."
payback = TRUE
@@ -78,7 +78,7 @@
/obj/item/clothing/gloves/color/latex/nitrile, // 0 TC
/obj/item/clothing/mask/gas/clown_hat, // 0TC
/obj/item/grenade/plastic/c4, // 1TC
/obj/item/thermal_drill/diamond_drill, // 1TC
/obj/item/thermal_drill/diamond_drill/syndicate, // 1TC
/obj/item/encryptionkey/syndicate) // 2TC
var/static/list/implant = list( // 40TC
+54 -2
View File
@@ -62,6 +62,8 @@ GLOBAL_LIST_EMPTY(safes)
var/drill_y_offset = -3
/// Used by [/obj/item/paper/safe_code] to tell the codes through a paper spawned on map load.
var/known_by = list()
/// Who placed the drill on the safe. Used to trigger the status effect
var/mob/living/carbon/human/driller
/obj/structure/safe/Initialize(mapload)
. = ..()
@@ -83,9 +85,10 @@ GLOBAL_LIST_EMPTY(safes)
drill.soundloop.stop()
drill.forceMove(loc)
drill = null
driller = null
QDEL_NULL(progress_bar)
QDEL_NULL(drill_overlay)
clear_payback() //Lets not leave the overlay if an admin deletes the safe during the event
return ..()
/obj/structure/safe/process()
@@ -96,6 +99,8 @@ GLOBAL_LIST_EMPTY(safes)
add_overlay(progress_bar)
if(prob(DRILL_SPARK_CHANCE))
drill.spark_system.start()
if(!drill.spotted && drill.payback)
security_check()
/obj/structure/safe/examine(mob/user)
. = ..()
@@ -149,14 +154,17 @@ GLOBAL_LIST_EMPTY(safes)
drill_start_time = world.time
drill.soundloop.start()
update_icon()
driller = user
START_PROCESSING(SSobj, src)
if("Turn Off")
if(do_after(user, 2 SECONDS, target = src))
if(do_after(user, 10 SECONDS, target = src)) //Can't be too easy to turn off
deltimer(drill_timer)
drill_timer = null
drill.soundloop.stop()
cut_overlay(progress_bar)
update_icon()
driller.remove_status_effect(STATUS_EFFECT_DRILL_PAYBACK)
driller = null
STOP_PROCESSING(SSobj, src)
if("Remove Drill")
if(drill_timer)
@@ -322,6 +330,43 @@ GLOBAL_LIST_EMPTY(safes)
add_fingerprint(usr)
/obj/structure/safe/proc/security_check()
if(get_dist(src, driller) >= 9)
return //You need to be near the drill if you want to get the buff.
for(var/mob/living/carbon/human/H in view(9, src))
if(H.job in list("Security Officer", "Detective", "Warden", "Head of Security", "Captain", "Clown") || H.mind.special_role == SPECIAL_ROLE_ERT)
if(H.mind && H.mind.special_role && H.mind.special_role != SPECIAL_ROLE_ERT)
continue
drill.spotted = TRUE
security_assualt_in_progress()
return
for(var/mob/living/carbon/human/H in view(9, driller))
if(H.job in list("Security Officer", "Detective", "Warden", "Head of Security", "Captain", "Clown") || H.mind.special_role == SPECIAL_ROLE_ERT)
if(H.mind && H.mind.special_role && H.mind.special_role != SPECIAL_ROLE_ERT)
continue
drill.spotted = TRUE
security_assualt_in_progress()
return
/obj/structure/safe/proc/security_assualt_in_progress()
drill.atom_say("Security spotted. Nanites deployed. Give them <b>hell.</b>")
driller.apply_status_effect(STATUS_EFFECT_DRILL_PAYBACK, src)
drill.song.start_playing(driller)
notify_ghosts("Security assault in progress in [get_area(src)]!", enter_link="<a href=?src=[UID()];follow=1>(Click to jump to!)</a>", source = src, action = NOTIFY_FOLLOW)
for(var/mob/dead/observer/O in GLOB.player_list)
O.overlay_fullscreen("payback", /obj/screen/fullscreen/payback, 0)
addtimer(CALLBACK(src, PROC_REF(ghost_payback_phase_2)), 2.7 SECONDS)
/obj/structure/safe/proc/ghost_payback_phase_2()
for(var/mob/dead/observer/O in GLOB.player_list)
O.clear_fullscreen("payback")
O.overlay_fullscreen("payback", /obj/screen/fullscreen/payback, 1)
addtimer(CALLBACK(src, PROC_REF(ghost_payback_phase_2)), 2 MINUTES)
/obj/structure/safe/proc/clear_payback()
for(var/mob/dead/observer/O in GLOB.player_list)
O.clear_fullscreen("payback")
/**
* Called every dial turn to determine whether the safe should unlock or not.
*/
@@ -361,6 +406,13 @@ GLOBAL_LIST_EMPTY(safes)
playsound(loc, 'sound/machines/ding.ogg', 50, 1)
cut_overlay(progress_bar)
update_icon()
if(drill.payback)
var/datum/status_effect/drill_payback/D = driller.has_status_effect(STATUS_EFFECT_DRILL_PAYBACK)
if(D)
D.drilled_successfully = TRUE
addtimer(CALLBACK(driller, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_DRILL_PAYBACK), 30 SECONDS) //Give them time to escape
drill.payback = FALSE //Can't be used again / no more adding timers
drill.song.stop_playing()
STOP_PROCESSING(SSobj, src)
/**
+9
View File
@@ -414,3 +414,12 @@
var/obj/structure/musician/M = parent
return M.should_stop_playing(user)
// subtype for thermal drills
/datum/song/thermal_drill
/datum/song/thermal_drill/should_stop_playing(mob/user)
. = ..()
if(.)
return TRUE
var/obj/item/thermal_drill/D = parent
return D.should_stop_playing(user)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.6 MiB