mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
367 lines
13 KiB
Plaintext
367 lines
13 KiB
Plaintext
/client/proc/smite(var/mob/living/carbon/human/target in GLOB.player_list)
|
|
set name = "Smite"
|
|
set desc = "Abuse a player with various 'special treatments' from a list."
|
|
set category = "Fun.Do Not"
|
|
if(!check_rights(R_FUN))
|
|
return
|
|
|
|
if(!istype(target))
|
|
return
|
|
|
|
var/list/smite_types = list(SMITE_BREAKLEGS,SMITE_BLUESPACEARTILLERY,SMITE_SPONTANEOUSCOMBUSTION,SMITE_LIGHTNINGBOLT,
|
|
SMITE_SHADEKIN_ATTACK,SMITE_SHADEKIN_NOMF,SMITE_AD_SPAM,SMITE_REDSPACE_ABDUCT,SMITE_AUTOSAVE,SMITE_AUTOSAVE_WIDE,SMITE_SPICEREQUEST,SMITE_PEPPERNADE,SMITE_TERROR,
|
|
SMITE_PIE, SMITE_SPICE, SMITE_HOTDOG) //CHOMP Add pie, spicy air and hot dog
|
|
|
|
var/smite_choice = tgui_input_list(usr, "Select the type of SMITE for [target]","SMITE Type Choice", smite_types)
|
|
if(!smite_choice)
|
|
return
|
|
|
|
log_and_message_admins("has used SMITE ([smite_choice]) on [key_name(target)].", src)
|
|
feedback_add_details("admin_verb","SMITE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
|
|
|
switch(smite_choice)
|
|
if(SMITE_BREAKLEGS)
|
|
var/broken_legs = 0
|
|
var/obj/item/organ/external/left_leg = target.get_organ(BP_L_LEG)
|
|
if(left_leg && left_leg.fracture())
|
|
broken_legs++
|
|
var/obj/item/organ/external/right_leg = target.get_organ(BP_R_LEG)
|
|
if(right_leg && right_leg.fracture())
|
|
broken_legs++
|
|
if(!broken_legs)
|
|
to_chat(src,"[target] didn't have any breakable legs, sorry.")
|
|
|
|
if(SMITE_BLUESPACEARTILLERY)
|
|
bluespace_artillery(target,src)
|
|
|
|
if(SMITE_SPONTANEOUSCOMBUSTION)
|
|
target.adjust_fire_stacks(10)
|
|
target.ignite_mob()
|
|
target.visible_message(span_danger("[target] bursts into flames!"))
|
|
|
|
if(SMITE_LIGHTNINGBOLT)
|
|
var/turf/T = get_step(get_step(target, NORTH), NORTH)
|
|
T.Beam(target, icon_state="lightning[rand(1,12)]", time = 5)
|
|
target.electrocute_act(75,def_zone = BP_HEAD)
|
|
target.visible_message(span_danger("[target] is struck by lightning!"))
|
|
|
|
if(SMITE_SHADEKIN_ATTACK)
|
|
var/turf/Tt = get_turf(target) //Turf for target
|
|
|
|
if(target.loc != Tt)
|
|
return //Too hard to attack someone in something
|
|
|
|
var/turf/Ts //Turf for shadekin
|
|
|
|
//Try to find nondense turf
|
|
for(var/direction in GLOB.cardinal)
|
|
var/turf/T = get_step(target,direction)
|
|
if(T && !T.density)
|
|
Ts = T //Found shadekin spawn turf
|
|
if(!Ts)
|
|
return //Didn't find shadekin spawn turf
|
|
|
|
var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts)
|
|
//Abuse of shadekin
|
|
shadekin.real_name = shadekin.name
|
|
shadekin.init_vore(TRUE)
|
|
shadekin.ability_flags |= 0x1
|
|
shadekin.phase_shift()
|
|
shadekin.ai_holder.give_target(target)
|
|
shadekin.ai_holder.hostile = FALSE
|
|
shadekin.ai_holder.mauling = TRUE
|
|
shadekin.Life()
|
|
//Remove when done
|
|
spawn(10 SECONDS)
|
|
if(shadekin)
|
|
shadekin.death()
|
|
|
|
if(SMITE_SHADEKIN_NOMF)
|
|
var/static/list/kin_types = list(
|
|
"Red Eyes (Dark)" = /mob/living/simple_mob/shadekin/red/dark,
|
|
"Red Eyes (Light)" = /mob/living/simple_mob/shadekin/red/white,
|
|
"Red Eyes (Brown)" = /mob/living/simple_mob/shadekin/red/brown,
|
|
"Blue Eyes (Dark)" = /mob/living/simple_mob/shadekin/blue/dark,
|
|
"Blue Eyes (Light)" = /mob/living/simple_mob/shadekin/blue/white,
|
|
"Blue Eyes (Brown)" = /mob/living/simple_mob/shadekin/blue/brown,
|
|
"Purple Eyes (Dark)" = /mob/living/simple_mob/shadekin/purple/dark,
|
|
"Purple Eyes (Light)" = /mob/living/simple_mob/shadekin/purple/white,
|
|
"Purple Eyes (Brown)" = /mob/living/simple_mob/shadekin/purple/brown,
|
|
"Yellow Eyes (Dark)" = /mob/living/simple_mob/shadekin/yellow/dark,
|
|
"Yellow Eyes (Light)" = /mob/living/simple_mob/shadekin/yellow/white,
|
|
"Yellow Eyes (Brown)" = /mob/living/simple_mob/shadekin/yellow/brown,
|
|
"Green Eyes (Dark)" = /mob/living/simple_mob/shadekin/green/dark,
|
|
"Green Eyes (Light)" = /mob/living/simple_mob/shadekin/green/white,
|
|
"Green Eyes (Brown)" = /mob/living/simple_mob/shadekin/green/brown,
|
|
"Orange Eyes (Dark)" = /mob/living/simple_mob/shadekin/orange/dark,
|
|
"Orange Eyes (Light)" = /mob/living/simple_mob/shadekin/orange/white,
|
|
"Orange Eyes (Brown)" = /mob/living/simple_mob/shadekin/orange/brown,
|
|
"Rivyr (Unique)" = /mob/living/simple_mob/shadekin/blue/rivyr)
|
|
var/kin_type = tgui_input_list(usr, "Select the type of shadekin for [target] nomf","Shadekin Type Choice", kin_types)
|
|
if(!kin_type || !target)
|
|
return
|
|
|
|
|
|
kin_type = kin_types[kin_type]
|
|
|
|
var/myself = tgui_alert(usr, "Control the shadekin yourself or delete pred and prey after?","Control Shadekin?",list("Control","Cancel","Delete"))
|
|
if(!myself || myself == "Cancel" || !target)
|
|
return
|
|
|
|
var/turf/Tt = get_turf(target)
|
|
|
|
if(target.loc != Tt)
|
|
return //Can't nom when not exposed
|
|
|
|
//Begin abuse
|
|
target.transforming = TRUE //Cheap hack to stop them from moving
|
|
var/mob/living/simple_mob/shadekin/shadekin = new kin_type(Tt)
|
|
shadekin.real_name = shadekin.name
|
|
shadekin.init_vore(TRUE)
|
|
shadekin.can_be_drop_pred = TRUE
|
|
shadekin.dir = SOUTH
|
|
shadekin.ability_flags |= 0x1
|
|
shadekin.phase_shift() //Homf
|
|
shadekin.comp.dark_energy = initial(shadekin.comp.dark_energy)
|
|
//For fun
|
|
sleep(1 SECOND)
|
|
shadekin.dir = WEST
|
|
sleep(1 SECOND)
|
|
shadekin.dir = EAST
|
|
sleep(1 SECOND)
|
|
shadekin.dir = SOUTH
|
|
sleep(1 SECOND)
|
|
shadekin.audible_message(span_vwarning(span_bold("[shadekin]") + " belches loudly!"), runemessage = "URRRRRP")
|
|
sleep(2 SECONDS)
|
|
shadekin.phase_shift()
|
|
target.transforming = FALSE //Undo cheap hack
|
|
|
|
if(myself == "Control") //Put admin in mob
|
|
shadekin.ckey = ckey
|
|
|
|
else //Permakin'd
|
|
to_chat(target,span_danger("You're carried off into The Dark by the [shadekin]. Who knows if you'll find your way back?"))
|
|
target.ghostize()
|
|
qdel(target)
|
|
qdel(shadekin)
|
|
|
|
|
|
if(SMITE_REDSPACE_ABDUCT)
|
|
redspace_abduction(target, src)
|
|
|
|
if(SMITE_AUTOSAVE)
|
|
fake_autosave(target, src)
|
|
|
|
if(SMITE_AUTOSAVE_WIDE)
|
|
fake_autosave(target, src, TRUE)
|
|
|
|
if(SMITE_AD_SPAM)
|
|
if(target.client)
|
|
target.client.create_fake_ad_popup_multiple(/atom/movable/screen/popup/default, 15)
|
|
|
|
if(SMITE_TERROR)
|
|
if(ishuman(target))
|
|
target.fear = 200
|
|
|
|
if(SMITE_PEPPERNADE)
|
|
var/obj/item/grenade/chem_grenade/teargas/grenade = new /obj/item/grenade/chem_grenade/teargas
|
|
grenade.loc = target.loc
|
|
to_chat(target,span_warning("GRENADE?!"))
|
|
grenade.detonate()
|
|
|
|
if(SMITE_SPICEREQUEST)
|
|
var/obj/item/reagent_containers/food/condiment/spacespice/spice = new /obj/item/reagent_containers/food/condiment/spacespice
|
|
spice.loc = target.loc
|
|
to_chat(target,"A bottle of spices appears at your feet... be careful what you wish for!")
|
|
|
|
if(SMITE_PIE) //CHOMP Add
|
|
new/obj/effect/decal/cleanable/pie_smudge(get_turf(target))
|
|
playsound(target, 'sound/effects/slime_squish.ogg', 100, 1, get_rand_frequency(), falloff = 5)
|
|
target.Weaken(1)
|
|
target.visible_message(span_danger("[target] is struck by pie!"))
|
|
|
|
if(SMITE_SPICE) //CHOMP Add
|
|
to_chat(target, span_warning("Spice spice baby!"))
|
|
target.eye_blurry = max(target.eye_blurry, 25)
|
|
target.Blind(10)
|
|
target.Stun(5)
|
|
target.Weaken(5)
|
|
playsound(target, 'sound/effects/spray2.ogg', 100, 1, get_rand_frequency(), falloff = 5)
|
|
|
|
if(SMITE_HOTDOG)
|
|
playsound(target, 'sound/effects/whistle.ogg', 50, 1, get_rand_frequency(), falloff = 5)
|
|
sleep(2 SECONDS)
|
|
target.Stun(10)
|
|
if(ishuman(target))
|
|
if(target.head)
|
|
target.unEquip(target.head)
|
|
if(target.wear_suit)
|
|
target.unEquip(target.wear_suit)
|
|
var/obj/item/clothing/suit = new /obj/item/clothing/suit/storage/hooded/foodcostume/hotdog
|
|
var/obj/item/clothing/hood = new /obj/item/clothing/head/hood_vr/hotdog_hood
|
|
target.equip_to_slot_if_possible(suit, slot_wear_suit, 0, 0, 1)
|
|
target.equip_to_slot_if_possible(hood, slot_head, 0, 0, 1)
|
|
sleep(5 SECONDS)
|
|
qdel(suit)
|
|
qdel(hood)
|
|
else
|
|
return //Injection? Don't print any messages.
|
|
|
|
/proc/bluespace_artillery(mob/living/target, user)
|
|
if(!istype(target))
|
|
return
|
|
|
|
var/real_user = user ? user : usr
|
|
var/user_name = real_user ? key_name(real_user) : "Remotely (Discord)"
|
|
|
|
to_chat(target,"You've been hit by bluespace artillery!")
|
|
log_and_message_admins("has been hit by Bluespace Artillery fired by [user_name]", target)
|
|
|
|
target.setMoveCooldown(2 SECONDS)
|
|
|
|
var/turf/simulated/floor/T = get_turf(target)
|
|
if(istype(T))
|
|
if(prob(80)) T.break_tile_to_plating()
|
|
else T.break_tile()
|
|
|
|
playsound(T, get_sfx("explosion"), 100, 1, get_rand_frequency(), falloff = 5) // get_sfx() is so that everyone gets the same sound
|
|
|
|
if(target.health < 10)
|
|
target.gib()
|
|
else
|
|
target.adjustBruteLoss( max( 99 , (target.health - 1) ) )
|
|
target.Stun(20)
|
|
target.Weaken(20)
|
|
target.stuttering = 20
|
|
|
|
var/redspace_abduction_z
|
|
|
|
/area/redspace_abduction
|
|
name = "Another Time And Place"
|
|
requires_power = FALSE
|
|
dynamic_lighting = FALSE
|
|
|
|
/proc/redspace_abduction(mob/living/target, user)
|
|
if(redspace_abduction_z < 0)
|
|
to_chat(user,span_warning("The abduction z-level is already being created. Please wait."))
|
|
return
|
|
if(!redspace_abduction_z)
|
|
redspace_abduction_z = -1
|
|
to_chat(user,span_warning("This is the first use of the verb this shift, it will take a minute to configure the abduction z-level. It will be z[world.maxz+1]."))
|
|
var/z = ++world.maxz
|
|
world.max_z_changed()
|
|
for(var/x = 1 to world.maxx)
|
|
for(var/y = 1 to world.maxy)
|
|
var/turf/T = locate(x,y,z)
|
|
new /area/redspace_abduction(T)
|
|
T.ChangeTurf(/turf/unsimulated/fake_space)
|
|
T.plane = -100
|
|
CHECK_TICK
|
|
redspace_abduction_z = z
|
|
|
|
if(!target || !user)
|
|
return
|
|
|
|
var/size_of_square = 26
|
|
var/halfbox = round(size_of_square*0.5)
|
|
target.transforming = TRUE
|
|
to_chat(target,span_danger("You feel a strange tug, deep inside. You're frozen in momentarily..."))
|
|
to_chat(user,span_notice("Beginning vis_contents copy to abduction site, player mob is frozen."))
|
|
sleep(1 SECOND)
|
|
//Lower left corner of a working box
|
|
var/llc_x = max(0,halfbox-target.x) + min(target.x+halfbox, world.maxx) - size_of_square
|
|
var/llc_y = max(0,halfbox-target.y) + min(target.y+halfbox, world.maxy) - size_of_square
|
|
|
|
//Copy them all
|
|
for(var/x = llc_x to llc_x+size_of_square)
|
|
for(var/y = llc_y to llc_y+size_of_square)
|
|
var/turf/T_src = locate(x,y,target.z)
|
|
var/turf/T_dest = locate(x,y,redspace_abduction_z)
|
|
T_dest.vis_contents.Cut()
|
|
T_dest.vis_contents += T_src
|
|
T_dest.density = T_src.density
|
|
T_dest.opacity = T_src.opacity
|
|
CHECK_TICK
|
|
|
|
//Feather the edges
|
|
for(var/x = llc_x to llc_x+1) //Left
|
|
for(var/y = llc_y to llc_y+size_of_square)
|
|
if(prob(50))
|
|
var/turf/T = locate(x,y,redspace_abduction_z)
|
|
T.density = FALSE
|
|
T.opacity = FALSE
|
|
T.vis_contents.Cut()
|
|
|
|
for(var/x = llc_x+size_of_square-1 to llc_x+size_of_square) //Right
|
|
for(var/y = llc_y to llc_y+size_of_square)
|
|
if(prob(50))
|
|
var/turf/T = locate(x,y,redspace_abduction_z)
|
|
T.density = FALSE
|
|
T.opacity = FALSE
|
|
T.vis_contents.Cut()
|
|
|
|
for(var/x = llc_x to llc_x+size_of_square) //Top
|
|
for(var/y = llc_y+size_of_square-1 to llc_y+size_of_square)
|
|
if(prob(50))
|
|
var/turf/T = locate(x,y,redspace_abduction_z)
|
|
T.density = FALSE
|
|
T.opacity = FALSE
|
|
T.vis_contents.Cut()
|
|
|
|
for(var/x = llc_x to llc_x+size_of_square) //Bottom
|
|
for(var/y = llc_y to llc_y+1)
|
|
if(prob(50))
|
|
var/turf/T = locate(x,y,redspace_abduction_z)
|
|
T.density = FALSE
|
|
T.opacity = FALSE
|
|
T.vis_contents.Cut()
|
|
|
|
target.forceMove(locate(target.x,target.y,redspace_abduction_z))
|
|
to_chat(target,span_danger("The tug relaxes, but everything around you looks... slightly off."))
|
|
to_chat(user, span_notice("The mob has been moved. ([admin_jump_link(target, check_rights_for(usr.client, R_HOLDER))])"))
|
|
|
|
target.transforming = FALSE
|
|
|
|
/proc/fake_autosave(var/mob/living/target, var/client/user, var/wide)
|
|
if(!istype(target) || !target.client)
|
|
to_chat(user, span_warning("Skipping [target] because they are not a /mob/living or have no client."))
|
|
return
|
|
|
|
if(wide)
|
|
for(var/mob/living/L in orange(user.view, user.mob))
|
|
fake_autosave(L, user)
|
|
return
|
|
|
|
target.setMoveCooldown(10 SECONDS)
|
|
|
|
to_chat(target, "<span class='notice' style='font: small-caps bold large monospace!important'>Autosaving your progress, please wait...</span>")
|
|
target << 'sound/effects/ding.ogg'
|
|
|
|
var/static/list/bad_tips = list(
|
|
"Did you know that black shoes protect you from electrocution while hacking?",
|
|
"Did you know that airlocks always have a wire that disables ID checks?",
|
|
"You can always find at least 3 pairs of glowing purple gloves in maint!",
|
|
"Phoron is not toxic if you've had a soda within 30 seconds of exposure!",
|
|
"Space Mountain Wind makes you immune to damage from space for 30 seconds!",
|
|
"A mask and air tank are all you need to be safe in space!",
|
|
"When exploring maintenance, wearing no shoes makes you move faster!",
|
|
"Did you know that the bartender's shotgun is loaded with harmless ammo?",
|
|
"Did you know that the tesla and singulo only need containment for 5 minutes?")
|
|
|
|
var/tip = pick(bad_tips)
|
|
to_chat(target, "<span class='notice' style='font: small-caps bold large monospace!important'>Tip of the day:</span><br><span class='notice'>[tip]</span>")
|
|
|
|
var/atom/movable/screen/loader = new(target)
|
|
loader.name = "Autosaving..."
|
|
loader.desc = "A disc icon that represents your game autosaving. Please wait."
|
|
loader.icon = 'icons/obj/discs_vr.dmi'
|
|
loader.icon_state = "quicksave"
|
|
loader.screen_loc = "NORTH-1, EAST-1"
|
|
target.client.screen += loader
|
|
|
|
spawn(10 SECONDS)
|
|
if(target)
|
|
to_chat(target, "<span class='notice' style='font: small-caps bold large monospace!important'>Autosave complete!</span>")
|
|
if(target.client)
|
|
target.client.screen -= loader
|