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:
Sim
2024-10-08 01:50:15 -03:00
parent c762535169
commit c8983e1b03
40 changed files with 585 additions and 308 deletions
+46
View File
@@ -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
+17
View File
@@ -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)
+13
View File
@@ -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)
+9
View File
@@ -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>")
+13
View File
@@ -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)
+14
View File
@@ -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
+32
View File
@@ -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
+10
View File
@@ -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()
+18
View File
@@ -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)
+31
View File
@@ -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')
+7
View File
@@ -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')
+12
View File
@@ -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()
+7
View File
@@ -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))
+7
View File
@@ -0,0 +1,7 @@
/// Fry the target
/datum/smite/fry
name = "Fry"
/datum/smite/fry/effect(client/user, mob/living/target)
. = ..()
target.fry()
+7
View File
@@ -0,0 +1,7 @@
/// Gibs the target
/datum/smite/gib
name = "Gib"
/datum/smite/gib/effect(client/user, mob/living/target)
. = ..()
target.gib(FALSE)
+10
View File
@@ -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?"))
*/
+15
View File
@@ -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)
+17
View File
@@ -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!!
+21
View File
@@ -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
+7
View File
@@ -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()
+8
View File
@@ -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)
+8
View File
@@ -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)
+17
View File
@@ -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)
+12
View File
@@ -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..."))
+15
View File
@@ -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)
+17
View File
@@ -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)
+21
View File
@@ -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
+16
View File
@@ -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)
-26
View File
@@ -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
+17 -249
View File
@@ -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))