mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-29 16:18:01 +01:00
Highlander Patch (#20211)
* Highlander changes * Prevents losing your claymore F O R E V E R * Adds partial bloodthirst sating from attacking * Reworks bloodthirst * Forgot to push this * Adds a disk-capture mechanic * Changes based on feedback * Bugfixes * Makes the pinpointer functional
This commit is contained in:
@@ -91,7 +91,7 @@ var/bomb_set
|
||||
if (istype(I, /obj/item/weapon/disk/nuclear))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
I.forceMove(src)
|
||||
auth = I
|
||||
add_fingerprint(user)
|
||||
return
|
||||
@@ -496,6 +496,20 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
poi_list |= src
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/weapon/disk/nuclear/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/weapon/claymore/highlander))
|
||||
var/obj/item/weapon/claymore/highlander/H = I
|
||||
if(H.nuke_disk)
|
||||
user << "<span class='notice'>Wait... what?</span>"
|
||||
qdel(H.nuke_disk)
|
||||
H.nuke_disk = null
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] captures [src]!</span>", "<span class='userdanger'>You've got the disk! Defend it with your life!</span>")
|
||||
loc = H
|
||||
H.nuke_disk = src
|
||||
return 1
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/disk/nuclear/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is \
|
||||
going delta! It looks like they're comitting suicide.</span>")
|
||||
|
||||
@@ -82,10 +82,14 @@
|
||||
var/highlander_claymores = 0
|
||||
/obj/item/weapon/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS
|
||||
desc = "<b><i>THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!</i></b>\nActivate it in your hand to point to the nearest victim."
|
||||
flags = CONDUCT | NODROP
|
||||
slot_flags = null
|
||||
block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY
|
||||
attack_verb = list("brutalized", "eviscerated", "disemboweled", "hacked", "carved", "cleaved", "gored") //ONLY THE MOST VISCERAL ATTACK VERBS
|
||||
attack_verb = list("brutalized", "eviscerated", "disemboweled", "hacked", "carved", "cleaved") //ONLY THE MOST VISCERAL ATTACK VERBS
|
||||
var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE
|
||||
var/announced = FALSE //IF WE ARE THE ONLY ONE LEFT STANDING
|
||||
var/bloodthirst_level = 0 //HOW THIRSTY WE ARE FOR BLOOD
|
||||
var/obj/item/weapon/disk/nuclear/nuke_disk //OUR STORED NUKE DISK
|
||||
|
||||
/obj/item/weapon/claymore/highlander/New()
|
||||
..()
|
||||
@@ -95,19 +99,27 @@ var/highlander_claymores = 0
|
||||
/obj/item/weapon/claymore/highlander/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
highlander_claymores--
|
||||
if(nuke_disk)
|
||||
nuke_disk.forceMove(get_turf(src))
|
||||
nuke_disk.visible_message("<span class='warning'>The nuke disk is vulnerable!</span>")
|
||||
nuke_disk = null
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/claymore/highlander/process()
|
||||
if(isliving(loc))
|
||||
var/mob/living/L = loc
|
||||
if(L.stat != DEAD)
|
||||
if(!announced)
|
||||
handle_bloodthirst(L)
|
||||
if(announced || admin_spawned || highlander_claymores > 1)
|
||||
return
|
||||
announced = TRUE
|
||||
L.fully_heal()
|
||||
world << "<span class='userdanger'>[L.real_name] IS THE ONLY ONE LEFT STANDING!</span>"
|
||||
world << "<span class='userdanger'>[uppertext(L.real_name)] IS THE ONLY ONE LEFT STANDING!</span>"
|
||||
world << sound('sound/misc/highlander_only_one.ogg')
|
||||
L << "<span class='notice'>YOU ARE THE ONLY ONE LEFT STANDING!</span>"
|
||||
for(var/obj/item/weapon/bloodcrawl/B in L)
|
||||
qdel(B)
|
||||
|
||||
/obj/item/weapon/claymore/highlander/pickup(mob/living/user)
|
||||
user << "<span class='notice'>The power of Scotland protects you! You are shielded from all stuns and knockdowns.</span>"
|
||||
@@ -120,12 +132,18 @@ var/highlander_claymores = 0
|
||||
/obj/item/weapon/claymore/highlander/examine(mob/user)
|
||||
..()
|
||||
user << "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade."
|
||||
if(nuke_disk)
|
||||
user << "<span class='boldwarning'>It's holding the nuke disk!</span>"
|
||||
|
||||
/obj/item/weapon/claymore/highlander/attack(mob/living/target, mob/living/user)
|
||||
var/old_target_stat = target.stat
|
||||
. = ..()
|
||||
bloodthirst_level = max(bloodthirst_level - (target.mind && target.mind.special_role == "highlander" ? 15 : 5), 0)
|
||||
if(target && target.stat == DEAD && old_target_stat != DEAD && target.mind && target.mind.special_role == "highlander")
|
||||
user.fully_heal() //STEAL THE LIFE OF OUR FALLEN FOES
|
||||
if(bloodthirst_level >= 30)
|
||||
user << "<span class='notice'>[src] shakes greedily as it devours [target]'s soul. Its bloodthirst is quenched for the moment...</span>"
|
||||
bloodthirst_level = 0
|
||||
add_notch(user)
|
||||
target.visible_message("<span class='warning'>[target] crumbles to dust beneath [user]'s blows!</span>", "<span class='userdanger'>As you fall, your body crumbles to dust!</span>")
|
||||
target.dust()
|
||||
@@ -138,6 +156,7 @@ var/highlander_claymores = 0
|
||||
closest_victim = H
|
||||
if(!closest_victim)
|
||||
user << "<span class='warning'>[src] thrums for a moment and falls dark. Perhaps there's nobody nearby.</span>"
|
||||
return
|
||||
user << "<span class='danger'>[src] thrums and points to the [dir2text(get_dir(user, closest_victim))].</span>"
|
||||
|
||||
/obj/item/weapon/claymore/highlander/IsReflect()
|
||||
@@ -196,6 +215,22 @@ var/highlander_claymores = 0
|
||||
name = new_name
|
||||
playsound(user, 'sound/items/Screwdriver2.ogg', 50, 1)
|
||||
|
||||
/obj/item/weapon/claymore/highlander/proc/handle_bloodthirst(mob/living/S) //THE BLADE THIRSTS FOR BLOOD AND WILL PUNISH THE WEAK OR PACIFISTIC
|
||||
bloodthirst_level += (1 + min(notches, 10))
|
||||
if(bloodthirst_level == 30)
|
||||
S << "<span class='warning'>[src] shudders in your hand. It hungers for battle...</span>"
|
||||
if(bloodthirst_level == 60)
|
||||
S << "<span class='boldwarning'>[src] trembles violently. Kill someone already!</span>"
|
||||
if(bloodthirst_level == 90)
|
||||
S << "<span class='userdanger'>[src] starts shaking viciously! Shed blood or it'll give you away!</span>"
|
||||
if(bloodthirst_level >= 120)
|
||||
var/turf/T = get_turf(S)
|
||||
for(var/mob/M in player_list - S)
|
||||
if(M.z == T.z)
|
||||
M << "<span class='userdanger'>THERE IS A COWARD WHO DOES NOT FIGHT TO THE [uppertext(dir2text(get_dir(M, T)))]. THEIR NAME IS [uppertext(S.real_name)] - SLAUGHTER THEM.</span>"
|
||||
S << "<span class='notice'>you fucked up</span>"
|
||||
bloodthirst_level = 100
|
||||
|
||||
/obj/item/weapon/katana
|
||||
name = "katana"
|
||||
desc = "Woefully underpowered in D20"
|
||||
|
||||
@@ -1,60 +1,78 @@
|
||||
/client/proc/only_one()
|
||||
var/highlander = FALSE
|
||||
/client/proc/only_one() //Gives everyone kilts, berets, claymores, and pinpointers, with the objective to hijack the emergency shuttle.
|
||||
if(!ticker || !ticker.mode)
|
||||
alert("The game hasn't started yet!")
|
||||
return
|
||||
highlander = TRUE
|
||||
|
||||
world << "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>"
|
||||
world << sound('sound/misc/highlander.ogg')
|
||||
|
||||
for(var/obj/item/weapon/disk/nuclear/N in poi_list)
|
||||
N.relocate() //Gets it out of bags and such
|
||||
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
if(H.stat == DEAD || !(H.client)) continue
|
||||
|
||||
ticker.mode.traitors += H.mind
|
||||
H.mind.special_role = "highlander"
|
||||
|
||||
H.dna.species.specflags |= NOGUNS //nice try jackass
|
||||
|
||||
var/datum/objective/steal/steal_objective = new
|
||||
steal_objective.owner = H.mind
|
||||
steal_objective.set_target(new /datum/objective_item/steal/nukedisc)
|
||||
H.mind.objectives += steal_objective
|
||||
|
||||
var/datum/objective/hijack/hijack_objective = new
|
||||
hijack_objective.explanation_text = "Escape on the shuttle alone. Ensure nobody else makes it out."
|
||||
hijack_objective.owner = H.mind
|
||||
H.mind.objectives += hijack_objective
|
||||
|
||||
H.mind.announce_objectives()
|
||||
|
||||
for (var/obj/item/I in H)
|
||||
if (istype(I, /obj/item/weapon/implant))
|
||||
continue
|
||||
qdel(I)
|
||||
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt/highlander(H), slot_w_uniform)
|
||||
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_ears)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), slot_head)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(H.loc), slot_l_store)
|
||||
|
||||
var/obj/item/weapon/card/id/W = new(H)
|
||||
W.icon_state = "centcom"
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Highlander"
|
||||
W.registered_name = H.real_name
|
||||
W.flags |= NODROP
|
||||
W.update_label(H.real_name)
|
||||
H.equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
var/obj/item/weapon/claymore/highlander/H1 = new(H)
|
||||
H.put_in_hands(H1)
|
||||
H1.pickup(H)
|
||||
if(H.stat == DEAD || !(H.client))
|
||||
continue
|
||||
H.make_scottish()
|
||||
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] used THERE CAN BE ONLY ONE!</span>")
|
||||
log_admin("[key_name(usr)] used THERE CAN BE ONLY ONE.")
|
||||
addtimer(SSshuttle.emergency, "request", 50, FALSE, null, 1)
|
||||
|
||||
/mob/living/carbon/human/proc/make_scottish()
|
||||
ticker.mode.traitors += mind
|
||||
mind.special_role = "highlander"
|
||||
dna.species.specflags |= NOGUNS //nice try jackass
|
||||
|
||||
var/datum/objective/steal/steal_objective = new
|
||||
steal_objective.owner = mind
|
||||
steal_objective.set_target(new /datum/objective_item/steal/nukedisc)
|
||||
mind.objectives += steal_objective
|
||||
|
||||
var/datum/objective/hijack/hijack_objective = new
|
||||
hijack_objective.explanation_text = "Escape on the shuttle alone. Ensure that nobody else makes it out."
|
||||
hijack_objective.owner = mind
|
||||
mind.objectives += hijack_objective
|
||||
|
||||
mind.announce_objectives()
|
||||
|
||||
for(var/obj/item/I in src)
|
||||
if(istype(I, /obj/item/weapon/implant))
|
||||
continue
|
||||
qdel(I)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/kilt/highlander(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(src), slot_ears)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_l_store)
|
||||
for(var/obj/item/weapon/pinpointer/P in src)
|
||||
P.attack_self(src)
|
||||
var/obj/item/weapon/card/id/W = new(src)
|
||||
W.icon_state = "centcom"
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "Highlander"
|
||||
W.registered_name = real_name
|
||||
W.flags |= NODROP
|
||||
W.update_label(real_name)
|
||||
equip_to_slot_or_del(W, slot_wear_id)
|
||||
|
||||
var/obj/item/weapon/claymore/highlander/H1 = new(src)
|
||||
if(!highlander)
|
||||
H1.admin_spawned = TRUE //To prevent announcing
|
||||
put_in_hands(H1)
|
||||
H1.pickup(src) //For the stun shielding
|
||||
|
||||
var/obj/item/weapon/bloodcrawl/antiwelder = new(src)
|
||||
antiwelder.name = "compulsion of honor"
|
||||
antiwelder.desc = "You are unable to hold anything in this hand until you're the last one left!"
|
||||
antiwelder.icon_state = "bloodhand_right"
|
||||
put_in_hands(antiwelder)
|
||||
|
||||
src << "<span class='boldannounce'>Your [H1.name] cries out for blood. Join in the slaughter, lest you be claimed yourself...\n\
|
||||
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>"
|
||||
|
||||
/proc/only_me()
|
||||
if(!ticker || !ticker.mode)
|
||||
alert("The game hasn't started yet!")
|
||||
|
||||
@@ -332,6 +332,9 @@
|
||||
data_core.manifest_inject(humanc)
|
||||
AnnounceArrival(humanc, rank)
|
||||
AddEmploymentContract(humanc)
|
||||
if(highlander)
|
||||
humanc << "<span class='userdanger'><i>THERE CAN BE ONLY ONE!!!</i></span>"
|
||||
humanc.make_scottish()
|
||||
|
||||
joined_player_list += character.ckey
|
||||
|
||||
|
||||
Reference in New Issue
Block a user