diff --git a/code/__defines/admin.dm b/code/__defines/admin.dm index 5f9ada5e98..d2afb7846e 100644 --- a/code/__defines/admin.dm +++ b/code/__defines/admin.dm @@ -39,4 +39,9 @@ #define R_EVENT 0x4000 #define R_HOST 0x8000 //higher than this will overflow -#define R_MAXPERMISSION 0x8000 // This holds the maximum value for a permission. It is used in iteration, so keep it updated. \ No newline at end of file +#define R_MAXPERMISSION 0x8000 // This holds the maximum value for a permission. It is used in iteration, so keep it updated. + +#define SMITE_BREAKLEGS "Break Legs" +#define SMITE_BLUESPACEARTILLERY "Bluespace Artillery" +#define SMITE_SPONTANEOUSCOMBUSTION "Spontaneous Combustion" +#define SMITE_LIGHTNINGBOLT "Lightning Bolt" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 6b038aca4e..9509c49815 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -132,7 +132,8 @@ var/list/admin_verbs_fun = list( /client/proc/editappear, /client/proc/roll_dices, /datum/admins/proc/call_supply_drop, - /datum/admins/proc/call_drop_pod + /datum/admins/proc/call_drop_pod, + /client/proc/smite ) var/list/admin_verbs_spawn = list( diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 358df91af6..28470c376e 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1316,6 +1316,16 @@ feedback_inc("admin_cookies_spawned",1) H << "Your prayers have been answered!! You received the best cookie!" + else if(href_list["adminsmite"]) + if(!check_rights(R_ADMIN|R_FUN)) return + + var/mob/living/carbon/human/H = locate(href_list["adminsmite"]) + if(!ishuman(H)) + usr << "This can only be used on instances of type /mob/living/carbon/human" + return + + owner.smite(H) + else if(href_list["BlueSpaceArtillery"]) if(!check_rights(R_ADMIN|R_FUN)) return @@ -1327,37 +1337,7 @@ if(alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes") return - if(BSACooldown) - src.owner << "Standby! Reload cycle in progress! Gunnary crews ready in five seconds!" - return - - BSACooldown = 1 - spawn(50) - BSACooldown = 0 - - M << "You've been hit by bluespace artillery!" - log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]") - message_admins("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]") - - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = M - S.loc = M.loc - spawn(20) - qdel(S) - - var/turf/simulated/floor/T = get_turf(M) - if(istype(T)) - if(prob(80)) T.break_tile_to_plating() - else T.break_tile() - - if(M.health == 1) - M.gib() - else - M.adjustBruteLoss( min( 99 , (M.health - 1) ) ) - M.Stun(20) - M.Weaken(20) - M.stuttering = 20 + bluespace_artillery(M,src) else if(href_list["CentComReply"]) var/mob/living/L = locate(href_list["CentComReply"]) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index b8fbf77ed3..5469367beb 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,7 +17,7 @@ return var/image/cross = image('icons/obj/storage.dmi',"bible") - msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC): [msg]" + msg = "\icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm new file mode 100644 index 0000000000..9d6f8c02ab --- /dev/null +++ b/code/modules/admin/verbs/smite.dm @@ -0,0 +1,83 @@ +/client/proc/smite(var/mob/living/carbon/human/target in player_list) + set name = "Smite" + set desc = "Abuse a player with various 'special treatments' from a list." + set category = "Fun" + if(!check_rights(R_FUN)) + return + + if(!istype(target)) + return + + var/list/smite_types = list(SMITE_BREAKLEGS,SMITE_BLUESPACEARTILLERY,SMITE_SPONTANEOUSCOMBUSTION,SMITE_LIGHTNINGBOLT) + + var/smite_choice = input("Select the type of SMITE for [target]","SMITE Type Choice") as null|anything in smite_types + if(!smite_choice) + return + + 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.IgniteMob() + target.visible_message("[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.adjustFireLoss(75) + target.visible_message("[target] is struck by lightning!") + + else + return //Injection? Don't print any messages. + + log_and_message_admins("[key_name(src)] has used SMITE ([smite_choice]) on [key_name(target)].") + feedback_add_details("admin_verb","SMITE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/proc/bluespace_artillery(mob/living/target, user) + if(!istype(target)) + return + + if(BSACooldown) + if(user) + to_chat(user,"BSA is still cooling down, please wait!") + return + + BSACooldown = 1 + spawn(50) + BSACooldown = 0 + + to_chat(target,"You've been hit by bluespace artillery!") + log_and_message_admins("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(user ? user : usr)]") + + var/obj/effect/stop/S + S = new /obj/effect/stop + S.victim = target + S.loc = target.loc + spawn(20) + qdel(S) + + var/turf/simulated/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() + else + target.adjustBruteLoss( min( 99 , (target.health - 1) ) ) + target.Stun(20) + target.Weaken(20) + target.stuttering = 20 diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 57c06cbb8e..117cb83935 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -1034,6 +1034,8 @@ Note that amputating the affected organ does in fact remove the infection from t var/obj/item/clothing/suit/space/suit = owner.wear_suit suit.handle_fracture(owner, src) + return 1 + /obj/item/organ/external/proc/mend_fracture() if(robotic >= ORGAN_ROBOT) return 0 //ORGAN_BROKEN doesn't have the same meaning for robot limbs diff --git a/polaris.dme b/polaris.dme index ac467739b1..f6f0390f1b 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1248,6 +1248,7 @@ #include "code\modules\admin\verbs\SDQL.dm" #include "code\modules\admin\verbs\SDQL_2.dm" #include "code\modules\admin\verbs\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\smite.dm" #include "code\modules\admin\verbs\striketeam.dm" #include "code\modules\admin\verbs\ticklag.dm" #include "code\modules\admin\verbs\tripAI.dm"