mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2026-08-22 20:26:47 +01:00
Did you know Mosley pulls from downstreams without knowing what he pulls?
AKA [PORT] Refactors smiting, adds smite build mode tgstation/tgstation#55327 !! NOT!! A!! RUNNING!! BUILD!! LIGHTNING IS BROKEN IMMERSE IS COMMENTED OUT HALF OF THIS SHIT IS BROKEN DO NOT BASE YOURSELF ON THIS BUILD!!
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
/// Fires an absurd amount of bullets at the target
|
||||
/datum/smite/berforate
|
||||
name = ":B:erforate"
|
||||
/// Determines how fucked the target is
|
||||
var/hatred
|
||||
/datum/smite/berforate/configure(client/user)
|
||||
var/static/list/how_fucked_is_this_dude = list("A little", "A lot", "So fucking much", "FUCK THIS DUDE")
|
||||
hatred = input(user, "How much do you hate this guy?") in how_fucked_is_this_dude
|
||||
/datum/smite/berforate/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if (!iscarbon(target))
|
||||
to_chat(user, "<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/repetitions
|
||||
var/shots_per_limb_per_rep = 2
|
||||
var/damage
|
||||
switch (hatred)
|
||||
if ("A little")
|
||||
repetitions = 1
|
||||
damage = 5
|
||||
if ("A lot")
|
||||
repetitions = 2
|
||||
damage = 8
|
||||
if ("So fucking much")
|
||||
repetitions = 3
|
||||
damage = 10
|
||||
if ("FUCK THIS DUDE")
|
||||
repetitions = 4
|
||||
damage = 10
|
||||
var/mob/living/carbon/dude = target
|
||||
var/list/open_adj_turfs = get_adjacent_open_turfs(dude)
|
||||
var/list/wound_bonuses = list(15, 70, 110, 250)
|
||||
var/delay_per_shot = 1
|
||||
var/delay_counter = 1
|
||||
dude.Immobilize(5 SECONDS)
|
||||
for (var/wound_bonus_rep in 1 to repetitions)
|
||||
for (var/_limb in dude.bodyparts)
|
||||
var/obj/item/bodypart/limb = _limb
|
||||
var/shots_this_limb = 0
|
||||
for (var/_iter_turf in shuffle(open_adj_turfs))
|
||||
var/turf/iter_turf = _iter_turf
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/firing_squad, dude, iter_turf, limb.body_zone, wound_bonuses[wound_bonus_rep], damage), delay_counter)
|
||||
delay_counter += delay_per_shot
|
||||
shots_this_limb += 1
|
||||
if (shots_this_limb > shots_per_limb_per_rep)
|
||||
break
|
||||
@@ -0,0 +1,17 @@
|
||||
/// Slashes up the target
|
||||
/datum/smite/bloodless
|
||||
name = ":B:loodless"
|
||||
/datum/smite/bloodless/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/carbon_target = target
|
||||
for(var/_limb in carbon_target.bodyparts)
|
||||
var/obj/item/bodypart/limb = _limb
|
||||
var/type_wound = pick(list(/datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
limb.force_wound_upwards(type_wound, smited = TRUE)
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
limb.force_wound_upwards(type_wound, smited = TRUE)
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe))
|
||||
limb.force_wound_upwards(type_wound, smited = TRUE)
|
||||
@@ -0,0 +1,13 @@
|
||||
/// Gives the target critically bad wounds
|
||||
/datum/smite/boneless
|
||||
name = ":B:oneless"
|
||||
/datum/smite/boneless/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if (!iscarbon(target))
|
||||
to_chat(user, "<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/carbon_target = target
|
||||
for(var/_limb in carbon_target.bodyparts)
|
||||
var/obj/item/bodypart/limb = _limb
|
||||
var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate))
|
||||
limb.force_wound_upwards(type_wound, smited = TRUE)
|
||||
@@ -0,0 +1,9 @@
|
||||
/// Bonks the target
|
||||
/datum/smite/bonk
|
||||
name = "Bonk"
|
||||
|
||||
/datum/smite/bonk/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
playsound(target, 'modular_splurt/sound/misc/bonk.ogg', 100, 1)
|
||||
target.AddElement(/datum/element/squish, 60 SECONDS)
|
||||
to_chat(target, "<span class='warning big'>Bonk.</span>")
|
||||
@@ -0,0 +1,13 @@
|
||||
#define BOOKIFY_TIME (2 SECONDS)
|
||||
/// Turns the target into a book
|
||||
/datum/smite/bookify
|
||||
name = "Bookify"
|
||||
|
||||
/datum/smite/bookify/effect(client/user, mob/living/carbon/human/target as mob)
|
||||
. = ..()
|
||||
var/mutable_appearance/book_appearance = mutable_appearance('icons/obj/library.dmi', "book")
|
||||
var/mutable_appearance/transform_scanline = mutable_appearance('modular_splurt/icons/effects/effects.dmi', "transform_effect")
|
||||
target.transformation_animation(book_appearance, time = BOOKIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/bookify, target), BOOKIFY_TIME)
|
||||
playsound(target, 'modular_splurt/sound/misc/bookify.ogg', 60, 1)
|
||||
#undef BOOKIFY_TIME
|
||||
@@ -0,0 +1,6 @@
|
||||
/// Inflicts crippling brain damage on the target
|
||||
/datum/smite/brain_damage
|
||||
name = "Brain damage"
|
||||
/datum/smite/brain_damage/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, BRAIN_DAMAGE_DEATH - 1, BRAIN_DAMAGE_DEATH - 1)
|
||||
@@ -0,0 +1,14 @@
|
||||
#define BREADIFY_TIME (5 SECONDS)
|
||||
|
||||
/// Turns the target into bread
|
||||
/datum/smite/bread
|
||||
name = "Bread"
|
||||
|
||||
/datum/smite/bread/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
var/mutable_appearance/bread_appearance = mutable_appearance('icons/obj/food/burgerbread.dmi', "bread")
|
||||
var/mutable_appearance/transform_scanline = mutable_appearance('icons/effects/effects.dmi', "transform_effect")
|
||||
target.transformation_animation(bread_appearance,time = BREADIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/breadify, target), BREADIFY_TIME)
|
||||
|
||||
#undef BREADIFY_TIME
|
||||
@@ -0,0 +1,32 @@
|
||||
#define BSA_CHANCE_TO_BREAK_TILE_TO_PLATING 80
|
||||
#define BSA_MAX_DAMAGE 99
|
||||
#define BSA_PARALYZE_TIME (40 SECONDS)
|
||||
#define BSA_STUTTER_TIME (40 SECONDS)
|
||||
|
||||
/// Fires the BSA at the target
|
||||
/datum/smite/bsa
|
||||
name = "Bluespace Artillery Device"
|
||||
|
||||
/datum/smite/bsa/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
|
||||
explosion(target.loc, 0, 0, 0, 0)
|
||||
|
||||
var/turf/open/floor/target_turf = get_turf(target)
|
||||
if (istype(target_turf))
|
||||
if (prob(BSA_CHANCE_TO_BREAK_TILE_TO_PLATING))
|
||||
target_turf.break_tile_to_plating()
|
||||
else
|
||||
target_turf.break_tile()
|
||||
|
||||
if (target.health <= 1)
|
||||
target.gib(1, 1)
|
||||
else
|
||||
target.adjustBruteLoss(min(BSA_MAX_DAMAGE, target.health - 1))
|
||||
target.DefaultCombatKnockdown(BSA_PARALYZE_TIME)
|
||||
target.stuttering = 20
|
||||
|
||||
#undef BSA_CHANCE_TO_BREAK_TILE_TO_PLATING
|
||||
#undef BSA_MAX_DAMAGE
|
||||
#undef BSA_PARALYZE_TIME
|
||||
#undef BSA_STUTTER_TIME
|
||||
@@ -0,0 +1,10 @@
|
||||
/// Cluwneifies the target
|
||||
/datum/smite/cluwne
|
||||
name = "Cluwne"
|
||||
|
||||
/datum/smite/cluwne/effect(client/user, mob/living/carbon/human/target as mob)
|
||||
. = ..()
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
|
||||
return
|
||||
target.cluwneify()
|
||||
@@ -0,0 +1,18 @@
|
||||
/// Throws a custom pie at the target
|
||||
/datum/smite/custompie
|
||||
name = "Custom Pie"
|
||||
|
||||
/datum/smite/custompie/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/A = new()
|
||||
if(!A.reagents)
|
||||
var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num|null
|
||||
if(amount)
|
||||
A.create_reagents(amount)
|
||||
if(A.reagents)
|
||||
var/chosen_id = choose_reagent_id(usr)
|
||||
if(chosen_id)
|
||||
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num|null
|
||||
if(amount)
|
||||
A.reagents.add_reagent(chosen_id, amount)
|
||||
A.splat(target)
|
||||
@@ -0,0 +1,31 @@
|
||||
/// Docks the target's pay
|
||||
/datum/smite/dock_pay
|
||||
name = "Dock Pay"
|
||||
|
||||
/datum/smite/dock_pay/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if (!iscarbon(target))
|
||||
to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/dude = target
|
||||
var/obj/item/card/id/card = dude.get_idcard(TRUE)
|
||||
if (!card)
|
||||
to_chat(user, span_warning("[dude] does not have an ID card on!"), confidential = TRUE)
|
||||
return
|
||||
if (!card.registered_account)
|
||||
to_chat(user, span_warning("[dude] does not have an ID card with an account!"), confidential = TRUE)
|
||||
return
|
||||
if (card.registered_account.account_balance == 0)
|
||||
to_chat(user, span_warning("ID Card lacks any funds. No pay to dock."))
|
||||
return
|
||||
var/new_cost = input("How much pay are we docking? Current balance: [card.registered_account.account_balance] credits.", "BUDGET CUTS") as num|null
|
||||
if (!new_cost)
|
||||
return
|
||||
if (!(card.registered_account.has_money(new_cost)))
|
||||
to_chat(user, span_warning("ID Card lacked funds. Emptying account."))
|
||||
card.registered_account.bank_card_talk("[new_cost] credits deducted from your account based on performance review.")
|
||||
card.registered_account.account_balance = 0
|
||||
else
|
||||
card.registered_account.account_balance = card.registered_account.account_balance - new_cost
|
||||
card.registered_account.bank_card_talk("[new_cost] credits deducted from your account based on performance review.")
|
||||
SEND_SOUND(target, 'sound/machines/buzz-sigh.ogg')
|
||||
@@ -0,0 +1,7 @@
|
||||
/// Sends the target a fake adminhelp sound
|
||||
/datum/smite/fake_bwoink
|
||||
name = "Fake bwoink"
|
||||
|
||||
/datum/smite/fake_bwoink/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
SEND_SOUND(target, 'sound/effects/adminhelp.ogg')
|
||||
@@ -0,0 +1,12 @@
|
||||
/// Their Final Message
|
||||
/datum/smite/finalmessage
|
||||
name = "Final Message"
|
||||
|
||||
/datum/smite/finalmessage/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
var/mob/living/C = target
|
||||
if(C.stat == DEAD)
|
||||
to_chat(usr, "<span class='warning'>[C] is dead!")
|
||||
return
|
||||
else
|
||||
C.goodbye()
|
||||
@@ -0,0 +1,7 @@
|
||||
/// Throws a fireball down at the target
|
||||
/datum/smite/fireball
|
||||
name = "Fireball"
|
||||
|
||||
/datum/smite/fireball/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
new /obj/effect/temp_visual/target(get_turf(target))
|
||||
@@ -0,0 +1,7 @@
|
||||
/// Fry the target
|
||||
/datum/smite/fry
|
||||
name = "Fry"
|
||||
|
||||
/datum/smite/fry/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
target.fry()
|
||||
@@ -0,0 +1,7 @@
|
||||
/// Gibs the target
|
||||
/datum/smite/gib
|
||||
name = "Gib"
|
||||
|
||||
/datum/smite/gib/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
target.gib(FALSE)
|
||||
@@ -0,0 +1,10 @@
|
||||
/// "Fully immerses" the player, making them manually breathe and blink
|
||||
/*/datum/smite/immerse
|
||||
name = "Fully Immerse"
|
||||
|
||||
/datum/smite/immerse/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
immerse_player(target)
|
||||
SEND_SOUND(target, sound('sound/misc/roleplay.ogg'))
|
||||
to_chat(target, span_boldnotice("Please roleplay appropriately, okay?"))
|
||||
*/
|
||||
@@ -0,0 +1,15 @@
|
||||
/// Ties the target's shoes
|
||||
/datum/smite/knot_shoes
|
||||
name = "Knot Shoes"
|
||||
|
||||
/datum/smite/knot_shoes/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if (!iscarbon(target))
|
||||
to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/dude = target
|
||||
var/obj/item/clothing/shoes/sick_kicks = dude.shoes
|
||||
if (!sick_kicks?.can_be_tied)
|
||||
to_chat(user, span_warning("[dude] does not have knottable shoes!"), confidential = TRUE)
|
||||
return
|
||||
sick_kicks.adjust_laces(SHOES_KNOTTED)
|
||||
@@ -0,0 +1,17 @@
|
||||
/// Strikes the target with a lightning bolt
|
||||
/*/datum/smite/lightning
|
||||
name = "Lightning bolt"
|
||||
|
||||
/datum/smite/lightning/effect(client/user, mob/living/carbon/human/target as mob)
|
||||
. = ..()
|
||||
if(prob(75))
|
||||
playsound(target, 'modular_splurt/sound/misc/NOW.ogg', 75, FALSE)
|
||||
sleep(4 SECONDS)
|
||||
var/turf/T = get_step(get_step(user, NORTH), NORTH)
|
||||
T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5)
|
||||
target.adjustFireLoss(75)
|
||||
target.electrocution_animation(40)
|
||||
to_chat(target, "<span class='userdanger'>The gods have punished you for your sins!</span>")
|
||||
*/
|
||||
|
||||
//BROKEN!!! FIX LATER!!
|
||||
@@ -0,0 +1,21 @@
|
||||
/// Rips off all the limbs of the target
|
||||
/datum/smite/nugget
|
||||
name = "Nugget"
|
||||
|
||||
/datum/smite/nugget/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
|
||||
if (!iscarbon(target))
|
||||
to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/carbon_target = target
|
||||
var/timer = 2 SECONDS
|
||||
for (var/_limb in carbon_target.bodyparts)
|
||||
var/obj/item/bodypart/limb = _limb
|
||||
if (limb.body_part == HEAD || limb.body_part == CHEST)
|
||||
continue
|
||||
addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart/, dismember)), timer)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), carbon_target, 'modular_splurt/sound/effects/cartoon_pop.ogg', 70), timer)
|
||||
addtimer(CALLBACK(carbon_target, TYPE_PROC_REF(/mob/living/, spin), 4, 1), timer - 0.4 SECONDS)
|
||||
timer += 2 SECONDS
|
||||
@@ -0,0 +1,7 @@
|
||||
/// Turns the target into a pickle
|
||||
/datum/smite/pickle
|
||||
name = "Pickle"
|
||||
|
||||
/datum/smite/pickle/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
target.turn_into_pickle()
|
||||
@@ -0,0 +1,8 @@
|
||||
/// Throws a pie at the target
|
||||
/datum/smite/pie
|
||||
name = "Pie"
|
||||
|
||||
/datum/smite/pie/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target))
|
||||
creamy.splat(target)
|
||||
@@ -0,0 +1,8 @@
|
||||
/// Turns the user into a sliding puzzle
|
||||
/datum/smite/puzzle
|
||||
name = "Puzzle"
|
||||
|
||||
/datum/smite/puzzle/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if(!puzzle_imprison(target))
|
||||
to_chat(user, "<span class='warning'>Imprisonment failed!</span>", confidential = TRUE)
|
||||
@@ -0,0 +1,17 @@
|
||||
/// Throw an immovable rod at the target
|
||||
/datum/smite/rod
|
||||
name = "Immovable Rod"
|
||||
var/force_looping = FALSE
|
||||
|
||||
/datum/smite/rod/configure(client/user)
|
||||
var/loop_input = tgui_alert(usr,"Would you like this rod to force-loop across space z-levels?", "Loopy McLoopface", list("Yes", "No"))
|
||||
|
||||
force_looping = (loop_input == "Yes")
|
||||
|
||||
/datum/smite/rod/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
var/turf/target_turf = get_turf(target)
|
||||
var/startside = pick(GLOB.cardinals)
|
||||
var/turf/start_turf = spaceDebrisStartLoc(startside, target_turf.z)
|
||||
var/turf/end_turf = spaceDebrisFinishLoc(startside, target_turf.z)
|
||||
new /obj/effect/immovablerod(start_turf, end_turf, target, force_looping)
|
||||
@@ -0,0 +1,12 @@
|
||||
/// Gives the target fake scars
|
||||
/datum/smite/scarify
|
||||
name = "Scarify"
|
||||
|
||||
/datum/smite/scarify/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if(!iscarbon(target))
|
||||
to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/dude = target
|
||||
dude.generate_fake_scars(rand(1, 4))
|
||||
to_chat(dude, span_warning("You feel your body grow jaded and torn..."))
|
||||
@@ -0,0 +1,15 @@
|
||||
/// Ties the target's shoes
|
||||
/datum/smite/shoes
|
||||
name = "Knot Shoes"
|
||||
|
||||
/datum/smite/shoes/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
var/obj/item/clothing/shoes/sick_kicks = C.shoes
|
||||
if(!sick_kicks?.can_be_tied)
|
||||
to_chat(usr,"<span class='warning'>[C] does not have knottable shoes!</span>")
|
||||
return
|
||||
sick_kicks.adjust_laces(SHOES_KNOTTED)
|
||||
@@ -0,0 +1,17 @@
|
||||
/// A smite, used by admins to punish players, or for their own amusement
|
||||
/datum/smite
|
||||
/// The name of the smite, shown in the menu
|
||||
var/name
|
||||
|
||||
/// Should this smite write to logs?
|
||||
var/should_log = TRUE
|
||||
|
||||
/// Called once after either choosing the option to smite a player, or when selected in smite build mode.
|
||||
/// Use this to prompt the user configuration options.
|
||||
/// Return FALSE if the smite should not be used.
|
||||
/datum/smite/proc/configure(client/user)
|
||||
|
||||
/// The effect of the smite, make sure to call this in your own smites
|
||||
/datum/smite/proc/effect(client/user, mob/living/target)
|
||||
if (should_log)
|
||||
user.punish_log(target, name)
|
||||
@@ -0,0 +1,21 @@
|
||||
#define SUPPLY_POD_FIRE_RANGE
|
||||
|
||||
/// Throws a supply pod at the target, with no item inside
|
||||
/datum/smite/supply_pod
|
||||
name = "Supply Pod"
|
||||
|
||||
// punish_log() is handled by the centcom_podlauncher datum
|
||||
should_log = FALSE
|
||||
|
||||
/datum/smite/supply_pod/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
var/datum/centcom_podlauncher/plaunch = new(user)
|
||||
plaunch.specificTarget = target
|
||||
plaunch.launchChoice = 0
|
||||
plaunch.damageChoice = 1
|
||||
plaunch.explosionChoice = 1
|
||||
plaunch.temp_pod.damage = 40 // bring the mother fuckin ruckus
|
||||
plaunch.temp_pod.explosionSize = list(0, 0, 0, SUPPLY_POD_FIRE_RANGE)
|
||||
plaunch.temp_pod.effectStun = TRUE
|
||||
|
||||
#undef SUPPLY_POD_FIRE_RANGE
|
||||
@@ -0,0 +1,49 @@
|
||||
#define SUPPLY_POD_QUICK_DAMAGE 40
|
||||
#define SUPPLY_POD_QUICK_FIRE_RANGE 2
|
||||
|
||||
/// Quickly throws a supply pod at the target, optionally with an item
|
||||
/datum/smite/supply_pod_quick
|
||||
name = "Supply Pod (Quick)"
|
||||
|
||||
/// What is sent down with the pod
|
||||
var/target_path
|
||||
|
||||
/datum/smite/supply_pod_quick/configure(client/user)
|
||||
var/attempted_target_path = input(
|
||||
user,
|
||||
"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):",
|
||||
"Typepath",
|
||||
"/obj/item/reagent_containers/food/snacks/grown/harebell",
|
||||
) as null|text
|
||||
if (isnull(attempted_target_path)) //The user pressed "Cancel"
|
||||
return FALSE
|
||||
|
||||
if (attempted_target_path == "empty")
|
||||
target_path = null
|
||||
return
|
||||
|
||||
// if you didn't type empty, we want to load the pod with a delivery
|
||||
var/delivery = text2path(attempted_target_path)
|
||||
if(!ispath(delivery))
|
||||
delivery = pick_closest_path(attempted_target_path)
|
||||
if(!delivery)
|
||||
alert(user, "ERROR: Incorrect / improper path given.")
|
||||
return FALSE
|
||||
target_path = delivery
|
||||
|
||||
/datum/smite/supply_pod_quick/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
|
||||
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
|
||||
var/obj/structure/closet/supplypod/centcompod/pod = new(pick(get_area_turfs(pod_storage_area)))
|
||||
pod.damage = SUPPLY_POD_QUICK_DAMAGE
|
||||
pod.explosionSize = list(0, 0, 0, SUPPLY_POD_QUICK_FIRE_RANGE)
|
||||
pod.effectStun = TRUE
|
||||
|
||||
if (!isnull(target_path))
|
||||
new target_path(pod)
|
||||
|
||||
new /obj/effect/pod_landingzone(get_turf(target), pod)
|
||||
|
||||
#undef SUPPLY_POD_QUICK_DAMAGE
|
||||
#undef SUPPLY_POD_QUICK_FIRE_RANGE
|
||||
@@ -0,0 +1,16 @@
|
||||
/// Tableslam the target
|
||||
/datum/smite/tabletide
|
||||
name = "Table Tideslam"
|
||||
|
||||
/datum/smite/tabletide/effect(client/user, mob/living/target)
|
||||
. = ..()
|
||||
priority_announce(html_decode("[target] has brought the wrath of the gods upon themselves and is now being tableslammed across the station. Please stand by."), null, 'sound/misc/announce.ogg', "CentCom")
|
||||
var/list/areas = list()
|
||||
for(var/area/A in world)
|
||||
if(A.z == SSmapping.station_start)
|
||||
areas += A
|
||||
SEND_SOUND(target, sound('modular_splurt/sound/misc/slamofthenorthstar.ogg',volume=60))
|
||||
for(var/area/A in areas)
|
||||
for(var/obj/structure/table/T in A)
|
||||
T.tablepush(target, target)
|
||||
sleep(1)
|
||||
@@ -1,26 +0,0 @@
|
||||
/client/proc/bluespace_artillery(mob/M in GLOB.mob_list)
|
||||
if(!holder || !check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/mob/living/target = M
|
||||
|
||||
if(!isliving(target))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living", confidential = TRUE)
|
||||
return
|
||||
|
||||
explosion(target.loc, 0, 0, 0, 0)
|
||||
|
||||
var/turf/open/floor/T = get_turf(target)
|
||||
if(istype(T))
|
||||
if(prob(80))
|
||||
T.break_tile_to_plating()
|
||||
else
|
||||
T.break_tile()
|
||||
|
||||
if(target.health <= 1)
|
||||
target.gib(1, 1)
|
||||
else
|
||||
target.adjustBruteLoss(min(99,(target.health - 1)))
|
||||
target.DefaultCombatKnockdown(400)
|
||||
target.stuttering = 20
|
||||
|
||||
@@ -1283,266 +1283,34 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
|
||||
busy_toggling_fov = FALSE
|
||||
|
||||
/client/proc/smite(mob/living/carbon/human/target as mob)
|
||||
/client/proc/smite(mob/living/target as mob)
|
||||
set name = "Smite"
|
||||
set category = "Admin.Fun"
|
||||
if(!check_rights(R_ADMIN) || !check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/list/punishment_list = list(
|
||||
ADMIN_PUNISHMENT_PIE,
|
||||
ADMIN_PUNISHMENT_CUSTOM_PIE,
|
||||
ADMIN_PUNISHMENT_FIREBALL,
|
||||
ADMIN_PUNISHMENT_LIGHTNING,
|
||||
ADMIN_PUNISHMENT_BRAINDAMAGE,
|
||||
ADMIN_PUNISHMENT_BSA,
|
||||
ADMIN_PUNISHMENT_GIB,
|
||||
ADMIN_PUNISHMENT_SUPPLYPOD_QUICK,
|
||||
ADMIN_PUNISHMENT_SUPPLYPOD,
|
||||
ADMIN_PUNISHMENT_MAZING,
|
||||
ADMIN_PUNISHMENT_ROD,
|
||||
ADMIN_PUNISHMENT_SHOES,
|
||||
ADMIN_PUNISHMENT_PICKLE,
|
||||
ADMIN_PUNISHMENT_FRY,
|
||||
ADMIN_PUNISHMENT_CRACK,
|
||||
ADMIN_PUNISHMENT_BLEED,
|
||||
ADMIN_PUNISHMENT_SCARIFY,
|
||||
ADMIN_PUNISHMENT_CLUWNE,
|
||||
ADMIN_PUNISHMENT_GOODBYE,
|
||||
ADMIN_PUNISHMENT_TABLETIDESTATIONWIDE,
|
||||
ADMIN_PUNISHMENT_FAKEBWOINK,
|
||||
ADMIN_PUNISHMENT_NUGGET,
|
||||
ADMIN_PUNISHMENT_BREADIFY,
|
||||
ADMIN_PUNISHMENT_BOOKIFY,
|
||||
ADMIN_PUNISHMENT_BONK)
|
||||
|
||||
var/punishment = tgui_input_list(usr, "Choose a punishment", "Divine Smiting", punishment_list)
|
||||
var/punishment = tgui_input_list(usr, "Choose a punishment", "DIVINE SMITING", GLOB.smites)
|
||||
|
||||
if(QDELETED(target) || !punishment)
|
||||
return
|
||||
|
||||
switch(punishment)
|
||||
if(ADMIN_PUNISHMENT_LIGHTNING)
|
||||
if(prob(75))
|
||||
playsound(target, 'modular_splurt/sound/misc/NOW.ogg', 75, FALSE)
|
||||
sleep(4 SECONDS)
|
||||
var/turf/T = get_step(get_step(target, NORTH), NORTH)
|
||||
T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5)
|
||||
target.adjustFireLoss(75)
|
||||
target.electrocution_animation(40)
|
||||
to_chat(target, "<span class='userdanger'>The gods have punished you for your sins!</span>")
|
||||
if(ADMIN_PUNISHMENT_BRAINDAMAGE)
|
||||
target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199)
|
||||
if(ADMIN_PUNISHMENT_GIB)
|
||||
target.gib(FALSE)
|
||||
if(ADMIN_PUNISHMENT_BSA)
|
||||
bluespace_artillery(target)
|
||||
if(ADMIN_PUNISHMENT_FIREBALL)
|
||||
new /obj/effect/temp_visual/target(get_turf(target))
|
||||
if(ADMIN_PUNISHMENT_ROD)
|
||||
var/turf/T = get_turf(target)
|
||||
var/startside = pick(GLOB.cardinals)
|
||||
var/turf/startT = spaceDebrisStartLoc(startside, T.z)
|
||||
var/turf/endT = spaceDebrisFinishLoc(startside, T.z)
|
||||
new /obj/effect/immovablerod(startT, endT,target)
|
||||
if(ADMIN_PUNISHMENT_SUPPLYPOD_QUICK)
|
||||
var/target_path = input(usr,"Enter typepath of an atom you'd like to send with the pod (type \"empty\" to send an empty pod):" ,"Typepath","/obj/item/reagent_containers/food/snacks/grown/harebell") as null|text
|
||||
var/area/pod_storage_area = locate(/area/centcom/supplypod/podStorage) in GLOB.sortedAreas
|
||||
var/obj/structure/closet/supplypod/centcompod/pod = new(pick(get_area_turfs(pod_storage_area))) //Lets not runtime
|
||||
pod.damage = 40
|
||||
pod.explosionSize = list(0,0,0,2)
|
||||
pod.effectStun = TRUE
|
||||
if (isnull(target_path)) //The user pressed "Cancel"
|
||||
return
|
||||
if (target_path != "empty")//if you didn't type empty, we want to load the pod with a delivery
|
||||
var/delivery = text2path(target_path)
|
||||
if(!ispath(delivery))
|
||||
delivery = pick_closest_path(target_path)
|
||||
if(!delivery)
|
||||
alert("ERROR: Incorrect / improper path given.")
|
||||
new delivery(pod)
|
||||
new /obj/effect/pod_landingzone(get_turf(target), pod)
|
||||
if(ADMIN_PUNISHMENT_SUPPLYPOD)
|
||||
var/datum/centcom_podlauncher/plaunch = new(usr)
|
||||
if(!holder)
|
||||
return
|
||||
plaunch.specificTarget = target
|
||||
plaunch.launchChoice = 0
|
||||
plaunch.damageChoice = 1
|
||||
plaunch.explosionChoice = 1
|
||||
plaunch.temp_pod.damage = 40//bring the mother fuckin ruckus
|
||||
plaunch.temp_pod.explosionSize = list(0,0,0,2)
|
||||
plaunch.temp_pod.effectStun = TRUE
|
||||
return //We return here because punish_log() is handled by the centcom_podlauncher datum
|
||||
var/smite_path = GLOB.smites[punishment]
|
||||
var/datum/smite/smite = new smite_path
|
||||
var/configuration_success = smite.configure(usr)
|
||||
if (configuration_success == FALSE)
|
||||
return
|
||||
smite.effect(src, target)
|
||||
|
||||
if(ADMIN_PUNISHMENT_MAZING)
|
||||
if(!puzzle_imprison(target))
|
||||
to_chat(usr,"<span class='warning'>Imprisonment failed!</span>")
|
||||
return
|
||||
if(ADMIN_PUNISHMENT_PIE)
|
||||
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/creamy = new(get_turf(target))
|
||||
creamy.splat(target)
|
||||
if(ADMIN_PUNISHMENT_CUSTOM_PIE)
|
||||
var/obj/item/reagent_containers/food/snacks/pie/cream/nostun/A = new()
|
||||
if(!A.reagents)
|
||||
var/amount = input(usr, "Specify the reagent size of [A]", "Set Reagent Size", 50) as num|null
|
||||
if(amount)
|
||||
A.create_reagents(amount)
|
||||
if(A.reagents)
|
||||
var/chosen_id = choose_reagent_id(usr)
|
||||
if(chosen_id)
|
||||
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num|null
|
||||
if(amount)
|
||||
A.reagents.add_reagent(chosen_id, amount)
|
||||
A.splat(target)
|
||||
if(ADMIN_PUNISHMENT_CRACK)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/squish_part = i
|
||||
var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate))
|
||||
squish_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
if(ADMIN_PUNISHMENT_BLEED)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/slice_part = i
|
||||
var/type_wound = pick(list(/datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe))
|
||||
slice_part.force_wound_upwards(type_wound, smited=TRUE)
|
||||
if(ADMIN_PUNISHMENT_SCARIFY)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
var/mob/living/carbon/dude = target
|
||||
dude.generate_fake_scars(rand(1, 4))
|
||||
to_chat(dude, "<span class='warning'>You feel your body grow jaded and torn...</span>")
|
||||
if(ADMIN_PUNISHMENT_PERFORATE)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>", confidential = TRUE)
|
||||
return
|
||||
|
||||
var/list/how_fucked_is_this_dude = list("A little", "A lot", "So fucking much", "FUCK THIS DUDE")
|
||||
var/hatred = input("How much do you hate this guy?") in how_fucked_is_this_dude
|
||||
var/repetitions
|
||||
var/shots_per_limb_per_rep = 2
|
||||
var/damage
|
||||
switch(hatred)
|
||||
if("A little")
|
||||
repetitions = 1
|
||||
damage = 5
|
||||
if("A lot")
|
||||
repetitions = 2
|
||||
|
||||
damage = 8
|
||||
if("So fucking much")
|
||||
repetitions = 3
|
||||
damage = 10
|
||||
if("FUCK THIS DUDE")
|
||||
repetitions = 4
|
||||
damage = 10
|
||||
|
||||
var/mob/living/carbon/dude = target
|
||||
var/list/open_adj_turfs = get_adjacent_open_turfs(dude)
|
||||
var/list/wound_bonuses = list(15, 70, 110, 250)
|
||||
|
||||
var/delay_per_shot = 1
|
||||
var/delay_counter = 1
|
||||
|
||||
dude.Immobilize(5 SECONDS)
|
||||
for(var/wound_bonus_rep in 1 to repetitions)
|
||||
for(var/i in dude.bodyparts)
|
||||
var/obj/item/bodypart/slice_part = i
|
||||
var/shots_this_limb = 0
|
||||
for(var/t in shuffle(open_adj_turfs))
|
||||
var/turf/iter_turf = t
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(firing_squad), dude, iter_turf, slice_part.body_zone, wound_bonuses[wound_bonus_rep], damage), delay_counter)
|
||||
delay_counter += delay_per_shot
|
||||
shots_this_limb++
|
||||
if(shots_this_limb > shots_per_limb_per_rep)
|
||||
break
|
||||
if(ADMIN_PUNISHMENT_PICKLE)
|
||||
target.turn_into_pickle()
|
||||
if(ADMIN_PUNISHMENT_FRY)
|
||||
target.fry()
|
||||
|
||||
if(ADMIN_PUNISHMENT_SHOES)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
|
||||
return
|
||||
var/mob/living/carbon/C = target
|
||||
var/obj/item/clothing/shoes/sick_kicks = C.shoes
|
||||
if(!sick_kicks?.can_be_tied)
|
||||
to_chat(usr,"<span class='warning'>[C] does not have knottable shoes!</span>")
|
||||
return
|
||||
sick_kicks.adjust_laces(SHOES_KNOTTED)
|
||||
if(ADMIN_PUNISHMENT_CLUWNE)
|
||||
if(!iscarbon(target))
|
||||
to_chat(usr,"<span class='warning'>This must be used on a carbon mob.</span>")
|
||||
return
|
||||
target.cluwneify()
|
||||
if(ADMIN_PUNISHMENT_GOODBYE) //sandstorm punish :) it starts here
|
||||
var/mob/living/C = target
|
||||
if(C.stat == DEAD)
|
||||
to_chat(usr, "<span class='warning'>[C] is dead!")
|
||||
return
|
||||
else
|
||||
C.goodbye() //sandstorm punish and ends here.
|
||||
if(ADMIN_PUNISHMENT_TABLETIDESTATIONWIDE) //SPLURT punishments start here
|
||||
priority_announce(html_decode("[target] has brought the wrath of the gods upon themselves and is now being tableslammed across the station. Please stand by."), null, 'sound/misc/announce.ogg', "CentCom")
|
||||
var/list/areas = list()
|
||||
for(var/area/A in world)
|
||||
if(A.z == SSmapping.station_start)
|
||||
areas += A
|
||||
SEND_SOUND(target, sound('modular_splurt/sound/misc/slamofthenorthstar.ogg',volume=60))
|
||||
for(var/area/A in areas)
|
||||
for(var/obj/structure/table/T in A)
|
||||
T.tablepush(target, target)
|
||||
sleep(1)
|
||||
if(ADMIN_PUNISHMENT_FAKEBWOINK)
|
||||
SEND_SOUND(target, 'sound/effects/adminhelp.ogg')
|
||||
if(ADMIN_PUNISHMENT_NUGGET)
|
||||
if (!iscarbon(target))
|
||||
return
|
||||
var/mob/living/carbon/carbon_target = target
|
||||
var/timer = 2 SECONDS
|
||||
for (var/_limb in carbon_target.bodyparts)
|
||||
var/obj/item/bodypart/limb = _limb
|
||||
if (limb.body_part == HEAD || limb.body_part == CHEST)
|
||||
continue
|
||||
addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart, dismember)), timer)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), carbon_target, 'modular_splurt/sound/effects/cartoon_pop.ogg', 70), timer)
|
||||
addtimer(CALLBACK(carbon_target, TYPE_PROC_REF(/mob/living, spin), 4, 1), timer - 0.4 SECONDS)
|
||||
timer += 2 SECONDS
|
||||
if(ADMIN_PUNISHMENT_BREADIFY)
|
||||
#define BREADIFY_TIME (5 SECONDS)
|
||||
var/mutable_appearance/bread_appearance = mutable_appearance('icons/obj/food/burgerbread.dmi', "bread")
|
||||
var/mutable_appearance/transform_scanline = mutable_appearance('modular_splurt/icons/effects/effects.dmi', "transform_effect")
|
||||
target.transformation_animation(bread_appearance, time = BREADIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
|
||||
addtimer(CALLBACK(src, PROC_REF(breadify), target), BREADIFY_TIME)
|
||||
#undef BREADIFY_TIME
|
||||
if(ADMIN_PUNISHMENT_BOOKIFY)
|
||||
#define BOOKIFY_TIME (2 SECONDS)
|
||||
var/mutable_appearance/book_appearance = mutable_appearance('icons/obj/library.dmi', "book")
|
||||
var/mutable_appearance/transform_scanline = mutable_appearance('modular_splurt/icons/effects/effects.dmi', "transform_effect")
|
||||
target.transformation_animation(book_appearance, time = BOOKIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
|
||||
addtimer(CALLBACK(src, PROC_REF(bookify), target), BOOKIFY_TIME)
|
||||
playsound(target, 'modular_splurt/sound/misc/bookify.ogg', 60, 1)
|
||||
#undef BOOKIFY_TIME
|
||||
if(ADMIN_PUNISHMENT_BONK)
|
||||
playsound(target, 'modular_splurt/sound/misc/bonk.ogg', 100, 1)
|
||||
target.AddElement(/datum/element/squish, 60 SECONDS)
|
||||
to_chat(target, "<span class='warning big'>Bonk.</span>")
|
||||
|
||||
punish_log(target, punishment)
|
||||
/proc/breadify(atom/movable/target)
|
||||
var/obj/item/reagent_containers/food/snacks/store/bread/plain/funnyBread = new(get_turf(target))
|
||||
target.forceMove(funnyBread)
|
||||
|
||||
/proc/bookify(atom/movable/target)
|
||||
var/obj/item/reagent_containers/food/snacks/store/book/funnyBook = new(get_turf(target))
|
||||
target.forceMove(funnyBook)
|
||||
funnyBook.name = "Book of " + target.name
|
||||
/**
|
||||
* firing_squad is a proc for the :B:erforate smite to shoot each individual bullet at them, so that we can add actual delays without sleep() nonsense
|
||||
*
|
||||
@@ -1569,10 +1337,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
divine_wrath.fire()
|
||||
|
||||
/client/proc/punish_log(var/whom, var/punishment)
|
||||
var/msg = "[key_name_admin(usr)] punished [key_name_admin(whom)] with [punishment]."
|
||||
var/msg = "[key_name_admin(src)] punished [key_name_admin(whom)] with [punishment]."
|
||||
message_admins(msg)
|
||||
admin_ticket_log(whom, msg)
|
||||
log_admin("[key_name(usr)] punished [key_name(whom)] with [punishment].")
|
||||
log_admin("[key_name(src)] punished [key_name(whom)] with [punishment].")
|
||||
|
||||
/client/proc/trigger_centcom_recall()
|
||||
if(!check_rights(R_ADMIN))
|
||||
|
||||
Reference in New Issue
Block a user