mirror of
https://github.com/Sandstorm-Station/Sandstorm-Station-13.git
synced 2026-08-20 19:57:56 +01:00
1144 lines
43 KiB
Plaintext
1144 lines
43 KiB
Plaintext
//boss chests
|
|
//gladiator
|
|
/obj/structure/closet/crate/necropolis/gladiator
|
|
name = "gladiator chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/gladiator/crusher
|
|
name = "dreadful gladiator chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/gladiator/PopulateContents()
|
|
new /obj/item/shield/riot/tower/swat/gladiator(src)
|
|
new /obj/item/borg/upgrade/modkit/shielding(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/gladiator/crusher/PopulateContents()
|
|
new /obj/item/shield/riot/tower/swat/gladiator(src)
|
|
new /obj/item/melee/zweihander(src)
|
|
new /obj/item/crusher_trophy/gladiator(src)
|
|
|
|
/obj/item/shield/riot/tower/swat/gladiator
|
|
name = "\proper Gladiator's shield"
|
|
desc = "A very powerful and near indestructible shield, reinforced with drake and goliath hide. Can be used as a raft on lava."
|
|
icon = 'sandcode/icons/obj/shields.dmi'
|
|
righthand_file = 'sandcode/icons/mob/inhands/equipment/shields_righthand.dmi'
|
|
lefthand_file = 'sandcode/icons/mob/inhands/equipment/shields_lefthand.dmi'
|
|
icon_state = "gladiator"
|
|
item_state = "gladiator"
|
|
resistance_flags = FIRE_PROOF | UNACIDABLE | INDESTRUCTIBLE
|
|
shield_flags = SHIELD_FLAGS_DEFAULT | SHIELD_BASH_ALWAYS_DISARM | SHIELD_BASH_GROUND_SLAM_DISARM
|
|
slowdown = 0
|
|
shieldbash_cooldown = 6 SECONDS
|
|
shieldbash_stamcost = 5
|
|
shieldbash_knockback = 2
|
|
shieldbash_brutedamage = 10
|
|
shieldbash_stamdmg = 25
|
|
shieldbash_stagger_duration = 4.5 SECONDS
|
|
shieldbash_push_distance = 2
|
|
max_integrity = 350
|
|
block_chance = 50
|
|
can_shatter = FALSE
|
|
repair_material = /obj/item/stack/sheet/animalhide/goliath_hide
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
|
|
/obj/item/shield/riot/tower/swat/gladiator/AltClick(mob/user)
|
|
if(isliving(user))
|
|
if(do_after(user, 20, target = src))
|
|
new /obj/vehicle/ridden/lavaboat/dragon/gladiator(get_turf(user))
|
|
qdel(src)
|
|
|
|
/obj/vehicle/ridden/lavaboat/dragon/gladiator
|
|
name = "\proper Gladiator's surfboard"
|
|
desc = "This thing can be used to cross lava rivers... I guess. Alt click to turn into back into a shield."
|
|
icon = 'sandcode/icons/obj/shields.dmi'
|
|
icon_state = "raft"
|
|
|
|
/obj/vehicle/ridden/lavaboat/dragon/gladiator/Initialize()
|
|
..()
|
|
var/datum/component/riding/D = LoadComponent(/datum/component/riding)
|
|
D.vehicle_move_delay = 1
|
|
D.allowed_turf_typecache = typecacheof(/turf/open) //thanks Bob for telling me it was on purpose
|
|
D.keytype = null
|
|
|
|
/obj/vehicle/ridden/lavaboat/dragon/gladiator/AltClick(mob/user)
|
|
..()
|
|
if(isliving(user))
|
|
if(do_after(user, 20, target = src))
|
|
new /obj/item/shield/riot/tower/swat/gladiator(get_turf(user))
|
|
qdel(src)
|
|
|
|
//bubblegum
|
|
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
|
|
new /obj/item/clothing/suit/space/hostile_environment(src)
|
|
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
|
|
new /obj/item/borg/upgrade/modkit/shotgun(src)
|
|
new /obj/item/gun/magic/staff/spellblade(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents()
|
|
new /obj/item/clothing/suit/space/hostile_environment(src)
|
|
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
|
|
new /obj/item/crusher_trophy/demon_claws(src)
|
|
new /obj/item/gun/magic/staff/spellblade(src)
|
|
|
|
/mob/living/simple_animal/hostile/megafauna/bubblegum/hard
|
|
name = "enraged bubblegum chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/bubblegum/hard/PopulateContents()
|
|
new /obj/item/crucible(src)
|
|
new /obj/item/gun/ballistic/revolver/doublebarrel/super(src)
|
|
new /obj/item/clothing/suit/space/hardsuit/deathsquad/praetor(src)
|
|
new /obj/item/borg/upgrade/modkit/shotgun(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/bubblegum/hard/crusher
|
|
name = "enraged bloody bubblegum chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/bubblegum/hard/crusher/PopulateContents()
|
|
new /obj/item/crucible(src)
|
|
new /obj/item/gun/ballistic/revolver/doublebarrel/super(src)
|
|
new /obj/item/clothing/suit/space/hardsuit/deathsquad/praetor(src)
|
|
new /obj/item/crusher_trophy/demon_claws(src)
|
|
|
|
//super shotty changes (meat hook instead of bursto)
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super
|
|
burst_size = 1
|
|
actions_types = list(/datum/action/item_action/toggle_hook)
|
|
icon = 'sandcode/icons/obj/guns/projectile.dmi'
|
|
icon_state = "heckgun"
|
|
lefthand_file = 'sandcode/icons/mob/inhands/weapons/guns_lefthand.dmi'
|
|
righthand_file = 'sandcode/icons/mob/inhands/weapons/guns_righthand.dmi'
|
|
item_state = "heckgun"
|
|
sharpness = SHARP_EDGED
|
|
force = 15
|
|
inhand_x_dimension = 0
|
|
inhand_y_dimension = 0
|
|
var/recharge_rate = 4
|
|
var/charge_tick = 0
|
|
var/toggled = FALSE
|
|
var/obj/item/ammo_box/magazine/internal/shot/alternate_magazine
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super/Initialize()
|
|
. = ..()
|
|
if(!alternate_magazine)
|
|
alternate_magazine = new /obj/item/ammo_box/magazine/internal/shot/dual/heck/hook(src)
|
|
START_PROCESSING(SSobj, src)
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super/attack_self(mob/living/user)
|
|
if(toggled)
|
|
return 0
|
|
else
|
|
..()
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super/process()
|
|
if(toggled)
|
|
charge_tick++
|
|
if(charge_tick < recharge_rate)
|
|
return 0
|
|
charge_tick = 0
|
|
chambered.newshot()
|
|
return 1
|
|
else
|
|
..()
|
|
|
|
/obj/item/ammo_box/magazine/internal/shot/dual/heck/hook
|
|
name = "hookshot internal magazine"
|
|
max_ammo = 1
|
|
ammo_type = /obj/item/ammo_casing/magic/hook/heck
|
|
|
|
/obj/item/ammo_casing/magic/hook/heck
|
|
projectile_type = /obj/item/projectile/heckhook
|
|
|
|
/obj/item/projectile/heckhook //had to create a separate, non-child projectile because otherwise there would be conflicts when calling parent procs.
|
|
name = "hook"
|
|
icon_state = "hook"
|
|
icon = 'icons/obj/lavaland/artefacts.dmi'
|
|
pass_flags = PASSTABLE
|
|
damage = 10
|
|
armour_penetration = 100
|
|
damage_type = BRUTE
|
|
hitsound = 'sound/effects/splat.ogg'
|
|
knockdown = 0
|
|
var/chain
|
|
|
|
/obj/item/projectile/heckhook/fire(setAngle)
|
|
if(firer)
|
|
chain = firer.Beam(src, icon_state = "chain", time = INFINITY, maxdistance = INFINITY)
|
|
..()
|
|
|
|
/obj/item/projectile/heckhook/on_hit(atom/target)
|
|
. = ..()
|
|
var/atom/A = target
|
|
A.visible_message("<span class='danger'>[A] is snagged by [firer]'s hook!</span>")
|
|
new /datum/forced_movement(firer, get_turf(A), 1, TRUE)
|
|
|
|
/obj/item/projectile/heckhook/Destroy()
|
|
qdel(chain)
|
|
return ..()
|
|
|
|
/datum/action/item_action/toggle_hook
|
|
name = "Toggle Hook"
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super/ui_action_click(mob/user, action)
|
|
if(istype(action, /datum/action/item_action/toggle_hook))
|
|
toggle_hook(user)
|
|
else
|
|
..()
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super/proc/toggle_hook(mob/living/user)
|
|
var/current_mag = magazine
|
|
var/alt_mag = alternate_magazine
|
|
magazine = alt_mag
|
|
alternate_magazine = current_mag
|
|
toggled = !toggled
|
|
if(toggled)
|
|
to_chat(user, "You will now fire a hookshot.")
|
|
else
|
|
to_chat(user, "You will now fire normal shotgun rounds.")
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super/sawoff(mob/user)
|
|
to_chat(user, "<span class='warning'>Why would you mutilate this work of art?</span>")
|
|
return
|
|
|
|
/obj/item/gun/ballistic/revolver/doublebarrel/super/upgraded
|
|
desc = "It was fearsome before, now it's even worse with an internal system that makes it fire both barrels at once."
|
|
burst_size = 2
|
|
burst_shot_delay = 1
|
|
|
|
//crucible
|
|
/obj/item/crucible
|
|
name = "Crucible Sword"
|
|
desc = "Made from pure argent energy, this sword can cut through flesh like butter."
|
|
icon = 'sandcode/icons/obj/1x2.dmi'
|
|
icon_state = "crucible0"
|
|
var/icon_state_on = "crucible1"
|
|
lefthand_file = 'sandcode/icons/mob/inhands/weapons/swords_lefthand.dmi'
|
|
righthand_file = 'sandcode/icons/mob/inhands/weapons/swords_righthand.dmi'
|
|
item_state = "crucible0"
|
|
force = 3
|
|
throwforce = 5
|
|
throw_speed = 3
|
|
throw_range = 5
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
var/w_class_on = WEIGHT_CLASS_HUGE
|
|
hitsound = "swing_hit"
|
|
var/hitsound_on = 'sound/weapons/bladeslice.ogg'
|
|
armour_penetration = 50
|
|
light_color = "#ff0000"//BLOOD RED
|
|
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
|
block_chance = 0
|
|
var/block_chance_on = 50
|
|
max_integrity = 400
|
|
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
|
|
resistance_flags = FIRE_PROOF
|
|
var/brightness_on = 6
|
|
total_mass = 1
|
|
var/total_mass_on = TOTAL_MASS_MEDIEVAL_WEAPON
|
|
var/wielded
|
|
var/item_state_on = "crucible1"
|
|
|
|
/obj/item/crucible/Initialize()
|
|
. = ..()
|
|
RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/wield)
|
|
RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/unwield)
|
|
|
|
/obj/item/crucible/ComponentInitialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=25, icon_wielded="crucible1", wieldsound = 'sound/weapons/saberon.ogg', unwieldsound = 'sound/weapons/saberoff.ogg')
|
|
|
|
/obj/item/crucible/suicide_act(mob/living/carbon/user)
|
|
if(wielded)
|
|
user.visible_message("<span class='suicide'>[user] DOOMs themselves with the [src]!</span>")
|
|
|
|
var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
|
|
var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
|
|
B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
|
|
var/randdir
|
|
for(var/i in 1 to 24)//like a headless chicken!
|
|
if(user.is_holding(src))
|
|
randdir = pick(GLOB.alldirs)
|
|
user.Move(get_step(user, randdir),randdir)
|
|
user.emote("spin")
|
|
if (i == 3 && myhead)
|
|
myhead.drop_limb()
|
|
sleep(3)
|
|
else
|
|
user.visible_message("<span class='suicide'>[user] panics and starts choking to death!</span>")
|
|
return OXYLOSS
|
|
|
|
|
|
else
|
|
user.visible_message("<span class='suicide'>[user] begins beating [user.p_them()]self to death with \the [src]'s handle! It probably would've been cooler if [user.p_they()] turned it on first!</span>")
|
|
return BRUTELOSS
|
|
|
|
/obj/item/crucible/update_icon_state()
|
|
if(wielded)
|
|
icon_state = "crucible[wielded]"
|
|
else
|
|
icon_state = "crucible0"
|
|
clean_blood()
|
|
|
|
/obj/item/crucible/attack(mob/target, mob/living/carbon/human/user)
|
|
var/def_zone = user.zone_selected
|
|
if(ishuman(target))
|
|
var/mob/living/carbon/human/H = target
|
|
if(H.getarmor(def_zone, "melee") < 35)
|
|
if((user.zone_selected != BODY_ZONE_CHEST) && (user.zone_selected != BODY_ZONE_HEAD) && (user.zone_selected != BODY_ZONE_PRECISE_GROIN))
|
|
..()
|
|
var/obj/item/bodypart/bodyp= H.get_bodypart(def_zone)
|
|
bodyp.dismember()
|
|
else
|
|
..()
|
|
else if(user.zone_selected == BODY_ZONE_CHEST && H.health <= 0)
|
|
..()
|
|
H.spill_organs()
|
|
else if(user.zone_selected == BODY_ZONE_HEAD && H.health <= 0)
|
|
..()
|
|
var/obj/item/bodypart/bodyp= H.get_bodypart(def_zone)
|
|
bodyp.drop_limb()
|
|
else
|
|
..()
|
|
else
|
|
..()
|
|
|
|
/obj/item/crucible/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
|
if(!wielded)
|
|
return BLOCK_NONE
|
|
return ..()
|
|
|
|
/obj/item/crucible/proc/wield(mob/living/carbon/M)
|
|
wielded = TRUE
|
|
sharpness = SHARP_EDGED
|
|
w_class = w_class_on
|
|
total_mass = total_mass_on
|
|
hitsound = hitsound_on
|
|
item_state = item_state_on
|
|
block_chance = block_chance_on
|
|
START_PROCESSING(SSobj, src)
|
|
set_light(brightness_on)
|
|
AddElement(/datum/element/sword_point)
|
|
|
|
/obj/item/crucible/proc/unwield()
|
|
wielded = FALSE
|
|
sharpness = initial(sharpness)
|
|
w_class = initial(w_class)
|
|
total_mass = initial(total_mass)
|
|
hitsound = "swing_hit"
|
|
block_chance = initial(block_chance)
|
|
item_state = initial(item_state)
|
|
STOP_PROCESSING(SSobj, src)
|
|
set_light(0)
|
|
RemoveElement(/datum/element/sword_point)
|
|
|
|
/obj/item/crucible/process()
|
|
if(wielded)
|
|
open_flame()
|
|
else
|
|
STOP_PROCESSING(SSobj, src)
|
|
|
|
/obj/item/crucible/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
|
if(!wielded)
|
|
return BLOCK_NONE
|
|
return ..()
|
|
|
|
/obj/item/crucible/ignition_effect(atom/A, mob/user)
|
|
if(!wielded)
|
|
return FALSE
|
|
var/in_mouth = ""
|
|
if(iscarbon(user))
|
|
var/mob/living/carbon/C = user
|
|
if(C.wear_mask)
|
|
in_mouth = ", barely missing [user.p_their()] nose"
|
|
. = "<span class='warning'>[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [A.name] in the process.</span>"
|
|
playsound(loc, hitsound, get_clamped_volume(), 1, -1)
|
|
add_fingerprint(user)
|
|
|
|
//praetor suit and helmet
|
|
/obj/item/clothing/suit/space/hardsuit/deathsquad/praetor
|
|
name = "Praetor Suit"
|
|
desc = "And those that tasted the bite of his sword named him... The Doom Slayer."
|
|
armor = list("melee" = 75, "bullet" = 55, "laser" = 55, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
|
strip_delay = 130
|
|
icon = 'sandcode/icons/obj/clothing/suits.dmi'
|
|
icon_state = "praetor"
|
|
mob_overlay_icon = 'sandcode/icons/mob/clothing/suit.dmi'
|
|
anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/suit_digi.dmi'
|
|
item_state = "praetor"
|
|
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad/praetor
|
|
slowdown = 0
|
|
mutantrace_variation = STYLE_DIGITIGRADE | STYLE_NO_ANTHRO_ICON
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
|
|
|
/obj/item/clothing/head/helmet/space/hardsuit/deathsquad/praetor
|
|
name = "Praetor Suit helmet"
|
|
desc = "That's one doomed space marine."
|
|
armor = list("melee" = 75, "bullet" = 55, "laser" = 55, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
|
strip_delay = 130
|
|
icon = 'sandcode/icons/obj/clothing/hats.dmi'
|
|
icon_state = "praetor"
|
|
mob_overlay_icon = 'sandcode/icons/mob/clothing/head.dmi'
|
|
anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/head_muzzled.dmi'
|
|
mutantrace_variation = STYLE_MUZZLE | STYLE_NO_ANTHRO_ICON
|
|
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
|
|
|
//drake
|
|
/obj/structure/closet/crate/necropolis/dragon/PopulateContents()
|
|
new /obj/item/borg/upgrade/modkit/knockback(src)
|
|
var/loot = rand(1,4)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/melee/ghost_sword(src)
|
|
if(2)
|
|
new /obj/item/lava_staff(src)
|
|
if(3)
|
|
new /obj/item/book/granter/spell/sacredflame(src)
|
|
new /obj/item/gun/magic/wand/fireball(src)
|
|
if(4)
|
|
new /obj/item/dragons_blood(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents()
|
|
new /obj/item/crusher_trophy/tail_spike(src)
|
|
var/loot = rand(1,4)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/melee/ghost_sword(src)
|
|
if(2)
|
|
new /obj/item/lava_staff(src)
|
|
if(3)
|
|
new /obj/item/book/granter/spell/sacredflame(src)
|
|
new /obj/item/gun/magic/wand/fireball(src)
|
|
if(4)
|
|
new /obj/item/dragons_blood(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/hard
|
|
name = "enraged dragon chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/hard/PopulateContents()
|
|
new /obj/item/melee/ghost_sword(src)
|
|
new /obj/item/lava_staff(src)
|
|
new /obj/item/book/granter/spell/sacredflame(src)
|
|
new /obj/item/gun/magic/wand/fireball(src)
|
|
new /obj/item/borg/upgrade/modkit/knockback(src)
|
|
new /obj/item/dragons_blood(src)
|
|
new /obj/item/clothing/neck/necklace/memento_mori/king(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/hard/crusher
|
|
name = "enraged fiery dragon chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/dragon/hard/crusher/PopulateContents()
|
|
new /obj/item/melee/ghost_sword(src)
|
|
new /obj/item/lava_staff(src)
|
|
new /obj/item/book/granter/spell/sacredflame(src)
|
|
new /obj/item/gun/magic/wand/fireball(src)
|
|
new /obj/item/dragons_blood(src)
|
|
new /obj/item/clothing/neck/necklace/memento_mori/king(src)
|
|
new /obj/item/crusher_trophy/tail_spike(src)
|
|
|
|
//ghost sword buff because it is dogshit
|
|
/obj/item/melee/ghost_sword
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
|
|
/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
|
|
. = ..()
|
|
force = 0
|
|
throwforce = 0
|
|
armour_penetration = 0
|
|
var/ghost_counter = ghost_check()
|
|
force = clamp((ghost_counter * 2.5), 15, 25)
|
|
throwforce = clamp((ghost_counter * 2), 5, 18)
|
|
armour_penetration = clamp((ghost_counter * 3), 0, 35)
|
|
sharpness = SHARP_NONE
|
|
if(ghost_counter >= 4)
|
|
sharpness = SHARP_POINTY
|
|
user.visible_message("<span class='danger'>[user] strikes with the force of [ghost_counter] vengeful spirits!</span>")
|
|
|
|
/obj/item/melee/ghost_sword/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
|
var/ghost_counter = ghost_check()
|
|
final_block_chance = clamp((ghost_counter * 5), 10, 50)
|
|
owner.visible_message("<span class='danger'>[owner] is protected by a ring of [ghost_counter] ghosts!</span>")
|
|
return ..()
|
|
|
|
/obj/item/clothing/neck/necklace/memento_mori/king
|
|
name = "amulet of kings"
|
|
desc = "An amulet that shows everyone who the true emperor is."
|
|
icon = 'sandcode/icons/obj/clothing/neck.dmi'
|
|
icon_state = "dragon_amulet"
|
|
item_state = "dragon_amulet"
|
|
mob_overlay_icon = 'sandcode/icons/mob/clothing/neck.dmi'
|
|
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
|
|
|
|
//colossus
|
|
/obj/structure/closet/crate/necropolis/colossus/PopulateContents()
|
|
new /obj/item/bluecrystal(src)
|
|
new /obj/item/organ/vocal_cords/colossus(src)
|
|
new /obj/item/borg/upgrade/modkit/bolter(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents()
|
|
new /obj/item/bluecrystal(src)
|
|
new /obj/item/organ/vocal_cords/colossus(src)
|
|
new /obj/item/crusher_trophy/blaster_tubes(src)
|
|
|
|
//crystal choosing thing from colosssus
|
|
/obj/item/bluecrystal
|
|
name = "\improper blue crystal"
|
|
desc = "It's very shiny... one may wonder what it does."
|
|
icon = 'sandcode/icons/obj/lavaland/artefacts.dmi'
|
|
icon_state = "bluecrystal"
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
var/list/choices = list(
|
|
"Clown" = /obj/machinery/anomalous_crystal/honk,
|
|
"Theme Warp" = /obj/machinery/anomalous_crystal/theme_warp,
|
|
"Bolter" = /obj/machinery/anomalous_crystal/emitter,
|
|
"Dark Revival" = /obj/machinery/anomalous_crystal/dark_reprise,
|
|
"Lightgeist Healers" = /obj/machinery/anomalous_crystal/helpers,
|
|
"Refresher" = /obj/machinery/anomalous_crystal/refresher,
|
|
"Possessor" = /obj/machinery/anomalous_crystal/possessor
|
|
)
|
|
var/list/methods = list(
|
|
"touch",
|
|
"speech",
|
|
"heat",
|
|
"bullet",
|
|
"energy",
|
|
"bomb",
|
|
"bumping",
|
|
"weapon",
|
|
"magic"
|
|
)
|
|
|
|
/obj/item/bluecrystal/attack_self(mob/user)
|
|
var/choice = input(user, "Choose your destiny", "Crystal") as null|anything in choices
|
|
var/method = input(user, "Choose your activation method", "Crystal") as null|anything in methods
|
|
if(!choice || !method)
|
|
return
|
|
playsound(user.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE)
|
|
var/choosey = choices[choice]
|
|
var/obj/machinery/anomalous_crystal/A = new choosey(user.loc)
|
|
A.activation_method = method
|
|
to_chat(user, "<span class='userdanger'>[A] appears under your feet as the [src] breaks apart!</span>")
|
|
qdel(src)
|
|
|
|
//normal chests
|
|
/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
|
|
var/loot = rand(1,34)
|
|
new /obj/item/stock_parts/cell/high/plus/argent(src)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/shared_storage/red(src)
|
|
return list(/obj/item/shared_storage/red)
|
|
if(2)
|
|
new /obj/item/clothing/suit/space/hardsuit/cult(src)
|
|
return list(/obj/item/clothing/suit/space/hardsuit/cult)
|
|
if(3)
|
|
new /obj/item/soulstone/anybody(src)
|
|
return list(/obj/item/soulstone/anybody)
|
|
if(4)
|
|
new /obj/item/katana/cursed(src)
|
|
return list(/obj/item/katana/cursed)
|
|
if(5)
|
|
new /obj/item/clothing/glasses/godeye(src)
|
|
return list(/obj/item/clothing/glasses/godeye)
|
|
if(6)
|
|
new /obj/item/reagent_containers/glass/bottle/potion/flight(src)
|
|
return list(/obj/item/reagent_containers/glass/bottle/potion/flight)
|
|
if(7)
|
|
new /obj/item/pickaxe/diamond(src)
|
|
return list(/obj/item/pickaxe/diamond)
|
|
if(8)
|
|
if(prob(50))
|
|
new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src)
|
|
return list(/obj/item/disk/design_disk/modkit_disc/resonator_blast)
|
|
else
|
|
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
|
|
return list(/obj/item/disk/design_disk/modkit_disc/rapid_repeater)
|
|
if(9)
|
|
new /obj/item/rod_of_asclepius(src)
|
|
return list(/obj/item/rod_of_asclepius)
|
|
if(10)
|
|
new /obj/item/organ/heart/cursed/wizard(src)
|
|
return list(/obj/item/organ/heart/cursed/wizard)
|
|
if(11)
|
|
new /obj/item/ship_in_a_bottle(src)
|
|
return list(/obj/item/ship_in_a_bottle)
|
|
if(12)
|
|
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/damaged(src)
|
|
return list(/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker)
|
|
if(13)
|
|
new /obj/item/jacobs_ladder(src)
|
|
return list(/obj/item/jacobs_ladder)
|
|
if(14)
|
|
new /obj/item/nullrod/scythe/talking(src)
|
|
return list(/obj/item/nullrod/scythe/talking)
|
|
if(15)
|
|
new /obj/item/nullrod/armblade(src)
|
|
return list(/obj/item/nullrod/armblade)
|
|
if(16)
|
|
new /obj/item/guardiancreator(src)
|
|
return list(/obj/item/guardiancreator)
|
|
if(17)
|
|
if(prob(50))
|
|
new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src)
|
|
return list(/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe)
|
|
else
|
|
new /obj/item/disk/design_disk/modkit_disc/bounty(src)
|
|
return list(/obj/item/disk/design_disk/modkit_disc/bounty)
|
|
if(18)
|
|
new /obj/item/warp_cube/red(src)
|
|
return list(/obj/item/warp_cube/red)
|
|
if(19)
|
|
new /obj/item/wisp_lantern(src)
|
|
return list(/obj/item/wisp_lantern)
|
|
if(20)
|
|
new /obj/item/immortality_talisman(src)
|
|
return list(/obj/item/immortality_talisman)
|
|
if(21)
|
|
new /obj/item/gun/magic/hook(src)
|
|
return list(/obj/item/gun/magic/hook)
|
|
if(22)
|
|
new /obj/item/voodoo(src)
|
|
return list(/obj/item/voodoo)
|
|
if(23)
|
|
new /obj/item/grenade/clusterbuster/inferno(src)
|
|
return list(/obj/item/grenade/clusterbuster/inferno)
|
|
if(24)
|
|
new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src)
|
|
new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/damaged(src)
|
|
return list(/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor, /obj/item/reagent_containers/food/drinks/bottle/holywater/hell)
|
|
if(25)
|
|
new /obj/item/book/granter/spell/summonitem(src)
|
|
return list(/obj/item/book/granter/spell/summonitem)
|
|
if(26)
|
|
new /obj/item/book_of_babel(src)
|
|
return list(/obj/item/book_of_babel)
|
|
if(27)
|
|
new /obj/item/borg/upgrade/modkit/lifesteal(src)
|
|
new /obj/item/bedsheet/cult(src)
|
|
return list(/obj/item/borg/upgrade/modkit/lifesteal, /obj/item/bedsheet/cult)
|
|
if(28)
|
|
new /obj/item/clothing/neck/necklace/memento_mori(src)
|
|
return list(/obj/item/clothing/neck/necklace/memento_mori)
|
|
if(29)
|
|
new /obj/item/gun/magic/staff/door(src)
|
|
return list(/obj/item/gun/magic/staff/door)
|
|
if(30)
|
|
new /obj/item/katana/necropolis(src)
|
|
return list(/obj/item/katana/necropolis)
|
|
if(31)
|
|
new /obj/item/gun/ballistic/shotgun/boltaction(src)
|
|
return list(/obj/item/gun/ballistic/shotgun/boltaction)
|
|
if(32)
|
|
new /obj/item/gun/magic/staff/locker/trashy
|
|
return list(/obj/item/gun/magic/staff/locker)
|
|
if(33)
|
|
new /obj/item/clothing/accessory/fireresist(src)
|
|
return list(/obj/item/clothing/accessory/fireresist)
|
|
if(34)
|
|
new /obj/item/clothing/accessory/lavawalk(src)
|
|
return list(/obj/item/clothing/accessory/lavawalk)
|
|
|
|
/obj/item/gun/magic/staff/locker/trashy
|
|
max_charges = 1
|
|
recharge_rate = 150 //should take a literal 5 minutes to recharge a single shot
|
|
|
|
/obj/item/clothing/accessory/fireresist
|
|
name = "fire resistance medal"
|
|
desc = "A golden medal. Capable of making any jumpsuit able to withstand fire."
|
|
icon_state = "gold"
|
|
var/stored_name = ""
|
|
var/stored_desc = ""
|
|
var/stored_resistance_flags = 0
|
|
var/stored_heat_protection = 0
|
|
var/stored_max_heat_protection_temperature = 0
|
|
|
|
/obj/item/clothing/accessory/fireresist/attach(obj/item/clothing/under/U, user)
|
|
. = ..()
|
|
stored_name = U.name
|
|
stored_desc = U.desc
|
|
stored_resistance_flags = U.resistance_flags
|
|
stored_max_heat_protection_temperature = U.max_heat_protection_temperature
|
|
stored_heat_protection = U.heat_protection
|
|
U.name = "fireproofed " + U.name
|
|
U.desc += " It has been fireproofed with [src]."
|
|
U.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
|
U.heat_protection = FULL_BODY
|
|
U.resistance_flags |= FIRE_PROOF
|
|
|
|
/obj/item/clothing/accessory/fireresist/detach(obj/item/clothing/under/U, user)
|
|
. = ..()
|
|
U.name = stored_name
|
|
U.desc = stored_desc
|
|
U.max_heat_protection_temperature = stored_max_heat_protection_temperature
|
|
U.heat_protection = stored_heat_protection
|
|
U.resistance_flags = stored_resistance_flags
|
|
|
|
/obj/item/clothing/accessory/lavawalk
|
|
name = "lava walking medal"
|
|
desc = "A golden medal. Capable of making any jumpsuit completely lava proof for a brief window of time."
|
|
icon_state = "gold"
|
|
actions_types = list(/datum/action/item_action/lavawalk)
|
|
var/cool_down = 0
|
|
var/cooldown_time = 1200 //two full minutes
|
|
var/effectduration = 100 //10 seconds of lava walking
|
|
var/storedimmunities = list()
|
|
|
|
/obj/item/clothing/accessory/lavawalk/on_uniform_equip(obj/item/clothing/under/U, user)
|
|
. = ..()
|
|
var/mob/living/L = U.loc
|
|
if(L && istype(L))
|
|
for(var/datum/action/A in actions_types)
|
|
A.Grant(L)
|
|
|
|
/obj/item/clothing/accessory/lavawalk/on_uniform_dropped(obj/item/clothing/under/U, user)
|
|
. = ..()
|
|
var/mob/living/L = U.loc
|
|
if(L && istype(L))
|
|
for(var/datum/action/A in actions_types)
|
|
A.Remove(L)
|
|
|
|
/datum/action/item_action/lavawalk
|
|
name = "Lava Walk"
|
|
desc = "Become immune to lava for a brief period of time."
|
|
|
|
/obj/item/clothing/accessory/lavawalk/ui_action_click(mob/user, actiontype)
|
|
if(istype(actiontype, /datum/action/item_action/lavawalk))
|
|
if(world.time >= cool_down)
|
|
var/mob/living/L = user
|
|
if(istype(L))
|
|
storedimmunities = L.weather_immunities.Copy()
|
|
L.weather_immunities |= list("ash", "lava")
|
|
cool_down = world.time + cooldown_time
|
|
addtimer(CALLBACK(src, .proc/reset_user, L), effectduration)
|
|
|
|
/obj/item/clothing/accessory/lavawalk/proc/reset_user(mob/living/user)
|
|
user.weather_immunities = storedimmunities
|
|
storedimmunities = list()
|
|
|
|
//Nerfing those on the chest because too OP yada yada
|
|
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/damaged
|
|
name = "damaged inquisitor's hardsuit"
|
|
desc = "It's not really in good shape, but still serves decent protection."
|
|
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/damaged
|
|
clothing_flags = THICKMATERIAL // no space protection
|
|
armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
|
|
|
|
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor/damaged
|
|
name = "damaged inquisitor's hardsuit helmet"
|
|
clothing_flags = THICKMATERIAL // no space protection
|
|
armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
|
|
|
|
/obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/damaged
|
|
name = "damaged berserker's hardsuit"
|
|
desc = "It's not really in good shape, but still serves decent protection."
|
|
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/damaged
|
|
clothing_flags = THICKMATERIAL // no space protection
|
|
armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
|
|
|
|
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/beserker/damaged
|
|
name = "damaged berserker's hardsuit helmet"
|
|
clothing_flags = THICKMATERIAL // no space protection
|
|
armor = list("melee" = 65, "bullet" = 25, "laser" = 20, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 100, "acid" = 40)
|
|
|
|
/obj/item/stock_parts/cell/high/plus/argent
|
|
name = "Argent Energy Cell"
|
|
desc = "Harvested from the necropolis, this autocharging energy cell can be crushed to provide a temporary 90% damage reduction bonus. Also useful for research."
|
|
self_recharge = 1
|
|
maxcharge = 1500 //only barely better than a normal power cell now
|
|
chargerate = 700 //good recharge time doe
|
|
icon = 'sandcode/icons/obj/items_and_weapons.dmi'
|
|
icon_state = "argentcell"
|
|
ratingdesc = FALSE
|
|
rating = 6
|
|
custom_materials = list(/datum/material/glass=500, /datum/material/uranium=250, /datum/material/plasma=1000, /datum/material/diamond=500)
|
|
var/datum/status_effect/onuse = /datum/status_effect/blooddrunk/argent
|
|
|
|
/obj/item/stock_parts/cell/high/plus/argent/attack_self(mob/user)
|
|
..()
|
|
user.visible_message("<span class='danger'>[user] crushes the [src] in his hands, absorbing it's energy!</span>")
|
|
playsound(user.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, TRUE)
|
|
var/mob/living/M = user
|
|
M.apply_status_effect(onuse)
|
|
qdel(src)
|
|
|
|
/obj/item/stock_parts/cell/high/plus/argent/ComponentInitialize()
|
|
. = ..()
|
|
AddElement(/datum/element/empprotection, EMP_PROTECT_SELF)
|
|
|
|
/obj/item/katana/necropolis
|
|
force = 25 //Wouldn't want a miner walking around with a 40 damage melee around now, would we?
|
|
armour_penetration = 33
|
|
block_chance = 0 //blocky bad
|
|
|
|
/obj/item/immortality_talisman
|
|
w_class = WEIGHT_CLASS_SMALL //why the fuck are they large anyways
|
|
|
|
//legion
|
|
/obj/structure/closet/crate/necropolis/tendril/legion_loot
|
|
name = "screeching legion crate"
|
|
|
|
/obj/structure/closet/crate/necropolis/tendril/legion_loot/PopulateContents()
|
|
var/obj/structure/closet/crate/necropolis/tendril/N = new /obj/structure/closet/crate/necropolis/tendril()
|
|
var/list/weedeater = N.PopulateContents()
|
|
for(var/loot in weedeater)
|
|
new loot(src)
|
|
qdel(N)
|
|
|
|
/obj/structure/closet/crate/necropolis/legion
|
|
name = "echoing legion crate"
|
|
|
|
/obj/structure/closet/crate/necropolis/legion/PopulateContents()
|
|
new /obj/item/staff/storm(src)
|
|
new /obj/item/crusher_trophy/golden_skull(src)
|
|
new /obj/item/borg/upgrade/modkit/skull(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/legion/hard
|
|
name = "enraged echoing legion crate"
|
|
|
|
/obj/structure/closet/crate/necropolis/legion/hard/PopulateContents()
|
|
new /obj/item/staff/storm(src)
|
|
new /obj/item/clothing/mask/gas/dagoth(src)
|
|
new /obj/item/crusher_trophy/golden_skull(src)
|
|
new /obj/item/borg/upgrade/modkit/skull(src)
|
|
var/obj/structure/closet/crate/necropolis/tendril/T = new /obj/structure/closet/crate/necropolis/tendril //Yup, i know, VERY spaghetti code.
|
|
var/obj/item/L
|
|
for(var/i = 0, i < 3, i++)
|
|
L = T.PopulateContents()
|
|
for(var/loot in L)
|
|
new loot(src)
|
|
qdel(T)
|
|
|
|
//dagoth ur mask
|
|
/obj/item/clothing/mask/gas/dagoth
|
|
name = "Golden Mask"
|
|
desc = "Such a grand and intoxicating innocence."
|
|
icon = 'sandcode/icons/obj/clothing/masks.dmi'
|
|
mob_overlay_icon = 'sandcode/icons/mob/clothing/mask.dmi'
|
|
anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/head_muzzled.dmi'
|
|
icon_state = "dagoth"
|
|
item_state = "dagoth"
|
|
actions_types = list(/datum/action/item_action/ashstorm)
|
|
flash_protect = 2
|
|
armor = list("melee" = 10, "bullet" = 10, "laser" = 10,"energy" = 10, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)//HOW CAN YOU KILL A GOD?
|
|
var/static/list/excluded_areas = list(/area/reebe/city_of_cogs)
|
|
var/storm_type = /datum/weather/ash_storm
|
|
var/storm_cooldown = 0
|
|
w_class = WEIGHT_CLASS_BULKY //its a fucking full metal mask man
|
|
mutantrace_variation = STYLE_MUZZLE | STYLE_NO_ANTHRO_ICON
|
|
|
|
/datum/action/item_action/ashstorm
|
|
name = "Summon Ash Storm"
|
|
desc = "Bring the wrath of the sixth house upon the area where you stand."
|
|
|
|
/obj/item/clothing/mask/gas/dagoth/ui_action_click(mob/user, action)
|
|
if(istype(action, /datum/action/item_action/ashstorm))
|
|
if(storm_cooldown > world.time)
|
|
to_chat(user, "<span class='warning'>The [src] is still recharging!</span>")
|
|
return
|
|
|
|
var/area/user_area = get_base_area(user)
|
|
var/turf/user_turf = get_turf(user)
|
|
if(!user_area || !user_turf || (user_area.type in excluded_areas))
|
|
to_chat(user, "<span class='warning'>Something is preventing you from using the [src] here.</span>")
|
|
return
|
|
var/datum/weather/A
|
|
for(var/V in SSweather.processing)
|
|
var/datum/weather/W = V
|
|
if((user_turf.z in W.impacted_z_levels) && W.area_type == user_area.type)
|
|
A = W
|
|
break
|
|
|
|
if(A)
|
|
if(A.stage != END_STAGE)
|
|
if(A.stage == WIND_DOWN_STAGE)
|
|
to_chat(user, "<span class='warning'>The storm is already ending! It would be a waste to use the [src] now.</span>")
|
|
return
|
|
user.visible_message("<span class='warning'>[user] gazes into the sky with [src], seemingly repelling the current storm!</span>", \
|
|
"<span class='notice'>You gaze intently skyward, dispelling the storm!</span>")
|
|
playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
|
|
A.wind_down()
|
|
log_game("[user] ([key_name(user)]) has dispelled a storm at [AREACOORD(user_turf)]")
|
|
return
|
|
else
|
|
A = new storm_type(list(user_turf.z))
|
|
A.name = "staff storm"
|
|
log_game("[user] ([key_name(user)]) has summoned [A] at [AREACOORD(user_turf)]")
|
|
if (is_special_character(user))
|
|
message_admins("[A] has been summoned in [ADMIN_VERBOSEJMP(user_turf)] by [user] ([key_name_admin(user)], a non-antagonist")
|
|
A.area_type = user_area.type
|
|
A.telegraph_duration = 100
|
|
A.end_duration = 100
|
|
|
|
user.visible_message("<span class='warning'>[user] gazes skyward with his [src], terrible red lightning strikes seem to accompany them!</span>", \
|
|
"<span class='notice'>You gaze skyward with [src], calling down a terrible storm!</span>")
|
|
playsound(user, 'sound/magic/staff_change.ogg', 200, 0)
|
|
A.telegraph()
|
|
storm_cooldown = world.time + 200
|
|
else
|
|
..()
|
|
|
|
//glaurung (needs unique loot and crusher trophy)
|
|
/obj/structure/closet/crate/necropolis/glaurung
|
|
name = "drake chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/glaurung/PopulateContents()
|
|
new /obj/item/borg/upgrade/modkit/knockback(src)
|
|
var/loot = rand(1,4)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/melee/ghost_sword(src)
|
|
if(2)
|
|
new /obj/item/lava_staff(src)
|
|
if(3)
|
|
new /obj/item/book/granter/spell/sacredflame(src)
|
|
new /obj/item/gun/magic/wand/fireball(src)
|
|
if(4)
|
|
new /obj/item/dragons_blood(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/glaurung/crusher
|
|
name = "wise drake chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/glaurung/crusher/PopulateContents()
|
|
new /obj/item/crusher_trophy/tail_spike(src)
|
|
var/loot = rand(1,4)
|
|
switch(loot)
|
|
if(1)
|
|
new /obj/item/melee/ghost_sword(src)
|
|
if(2)
|
|
new /obj/item/lava_staff(src)
|
|
if(3)
|
|
new /obj/item/book/granter/spell/sacredflame(src)
|
|
new /obj/item/gun/magic/wand/fireball(src)
|
|
if(4)
|
|
new /obj/item/dragons_blood(src)
|
|
|
|
//Sif stuff
|
|
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Sword Of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
|
|
|
|
/*Videos on what the sword can do:
|
|
**
|
|
**Attacking: ---------- https://bungdeep.com/Sif/Sword_of_the_Forsaken_Attack.mp4
|
|
**Butchering: --------- https://bungdeep.com/Sif/Sword_of_the_Forsaken_Butcher.mp4
|
|
**Dodging: ------------ https://bungdeep.com/Sif/Sword_of_the_Forsaken_Block_Melee.png
|
|
**Projectile Dodging: - https://bungdeep.com/Sif/Sword_of_the_Forsaken_Block.png
|
|
**
|
|
*/
|
|
/obj/item/melee/sword_of_the_forsaken
|
|
name = "Sword of the Forsaken"
|
|
desc = "A glowing giant heavy blade that grows and slightly shrinks in size depending on the wielder's strength."
|
|
icon = 'sandcode/icons/obj/lavaland/sif.dmi'
|
|
icon_state = "sword_of_the_forsaken"
|
|
item_state = "sword_of_the_forsaken"
|
|
lefthand_file = 'sandcode/icons/mob/inhands/item_lefthand.dmi'
|
|
righthand_file = 'sandcode/icons/mob/inhands/item_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_HUGE
|
|
force = 20 //slight buff because 15 just doesn't cut it for megafauna loot... hehe "cut it"
|
|
throwforce = 10
|
|
block_chance = 20 //again, slight buff
|
|
armour_penetration = 200 //the armor penetration is really what makes this unique and actually worth it so boomp it
|
|
hitsound = 'sandcode/sound/sif/sif_slash.ogg'
|
|
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut", "gutted", "gored")
|
|
sharpness = SHARP_EDGED
|
|
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
|
|
//Enables the sword to butcher bodies
|
|
/obj/item/melee/sword_of_the_forsaken/Initialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/butchering, 50, 100, 10)
|
|
|
|
//Sword blocking attacks, really hard to block projectiles but still possible.
|
|
/obj/item/melee/sword_of_the_forsaken/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
|
|
if(attack_type == ATTACK_TYPE_PROJECTILE)
|
|
final_block_chance = 10 //half as much what you get in melee
|
|
return ..()
|
|
|
|
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=End of Sworf Of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
|
|
|
|
|
|
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Necklace Of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
|
|
|
|
/*Videos on what the necklace can do:
|
|
**
|
|
**Binding the necklace to yourself: ------- https://bungdeep.com/Sif/Necklace_of_the_Forsaken_Binding.mp4
|
|
**Reviving when died: --------------------- https://bungdeep.com/Sif/Necklace_of_the_Forsaken_Death_Revive.mp4
|
|
**Becomes a cosmetic item after it is used: https://bungdeep.com/Sif/Necklace_of_the_Forsaken_Revive_Used.png
|
|
**
|
|
*/
|
|
/obj/item/clothing/neck/necklace/necklace_of_the_forsaken
|
|
name = "Necklace of the Forsaken"
|
|
desc = "A rose gold necklace with a small static ember that burns inside of the black gem stone, making it warm to the touch."
|
|
icon = 'sandcode/icons/obj/lavaland/sif.dmi'
|
|
icon_state = "necklace_forsaken_active"
|
|
actions_types = list(/datum/action/item_action/hands_free/necklace_of_the_forsaken)
|
|
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
|
var/mob/living/carbon/active_owner
|
|
var/numUses = 1
|
|
|
|
/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/item_action_slot_check(slot)
|
|
return (..() && (slot == SLOT_NECK))
|
|
|
|
/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/dropped(mob/user)
|
|
..()
|
|
if(active_owner)
|
|
remove_necklace()
|
|
|
|
//Apply a temp buff until the necklace is used
|
|
/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/temp_buff(mob/living/carbon/human/user)
|
|
to_chat(user, "<span class='warning'>You feel as if you have a second chance at something, but you're not sure what.</span>")
|
|
if(do_after(user, 40, target = user))
|
|
to_chat(user, "<span class='notice'>The ember warms you...</span>")
|
|
ADD_TRAIT(user, TRAIT_NOHARDCRIT, "necklace_of_the_forsaken")//less chance of being gibbed
|
|
active_owner = user
|
|
|
|
//Revive the user and remove buffs
|
|
/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/second_chance()
|
|
icon_state = "necklace_forsaken_active"
|
|
if(!active_owner)
|
|
return
|
|
var/mob/living/carbon/C = active_owner
|
|
active_owner = null
|
|
to_chat(C, "<span class='userdanger'>You feel a scorching burn fill your body and limbs!</span>")
|
|
C.revive(TRUE, FALSE)
|
|
remove_necklace() //remove buffs
|
|
|
|
//Remove buffs
|
|
/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/proc/remove_necklace()
|
|
icon_state = "necklace_forsaken_active"
|
|
if(!active_owner)
|
|
return
|
|
REMOVE_TRAIT(active_owner, TRAIT_NOHARDCRIT, "necklace_of_the_forsaken")
|
|
active_owner = null //just in case
|
|
|
|
//Add action
|
|
/datum/action/item_action/hands_free/necklace_of_the_forsaken
|
|
check_flags = NONE
|
|
name = "Necklace of the Forsaken"
|
|
desc = "Bind the necklaces ember to yourself, so that next time you activate it, it will revive or fully heal you whether dead or knocked out. (Beware of being gibbed)"
|
|
|
|
//What happens when the user clicks on datum
|
|
/datum/action/item_action/hands_free/necklace_of_the_forsaken/Trigger()
|
|
var/obj/item/clothing/neck/necklace/necklace_of_the_forsaken/MM = target
|
|
if(MM.numUses <= 0)//skip if it has already been used up
|
|
return
|
|
if(!MM.active_owner)//apply bind if there is no active owner
|
|
if(iscarbon(owner))
|
|
MM.temp_buff(owner)
|
|
src.desc = "Revive or fully heal yourself, but you can only do this once! Can be used when knocked out or dead."
|
|
to_chat(MM.active_owner, "<span class='userdanger'>You have binded the ember to yourself! The next time you use the necklace it will heal you!</span>")
|
|
else if(MM.numUses >= 1 && MM.active_owner)//revive / heal then remove usage
|
|
MM.second_chance()
|
|
MM.numUses = 0
|
|
MM.icon_state = "necklace_forsaken"
|
|
MM.desc = "A rose gold necklace that used to have a bright burning ember inside of it."
|
|
src.desc = "The necklaces ember has already been used..."
|
|
|
|
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=End of Necklace of The Forsaken=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=//
|
|
|
|
|
|
//Sifs loot chest
|
|
/obj/structure/closet/crate/necropolis/sif
|
|
name = "Great Brown Wolf Sif's chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/sif/PopulateContents()
|
|
new /obj/item/melee/sword_of_the_forsaken(src)
|
|
new /obj/item/clothing/neck/necklace/necklace_of_the_forsaken(src)
|
|
new /obj/item/borg/upgrade/modkit/critical(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/sif/crusher
|
|
name = "Great Brown Wolf Sif's infinity chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/sif/crusher/PopulateContents()
|
|
new /obj/item/melee/sword_of_the_forsaken(src)
|
|
new /obj/item/clothing/neck/necklace/necklace_of_the_forsaken(src)
|
|
new /obj/item/crusher_trophy/dark_energy(src)
|
|
|
|
|
|
//Rogue process loot
|
|
/obj/structure/closet/crate/necropolis/rogue
|
|
name = "Rogue's chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/rogue/PopulateContents()
|
|
new /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer(src)
|
|
new /obj/item/rogue(src)
|
|
|
|
/obj/structure/closet/crate/necropolis/rogue/crusher
|
|
name = "Corrupted Rogue's chest"
|
|
|
|
/obj/structure/closet/crate/necropolis/rogue/crusher/PopulateContents()
|
|
new /obj/item/gun/energy/kinetic_accelerator/premiumka/bdminer(src)
|
|
new /obj/item/crusher_trophy/brokentech(src)
|
|
new /obj/item/rogue(src)
|
|
|
|
/obj/item/rogue
|
|
name = "\proper Rogue's Drill"
|
|
desc = "A drill coupled with an internal mechanism that produces shockwaves on demand. Serves as a very robust melee."
|
|
sharpness = SHARP_EDGED
|
|
icon = 'sandcode/icons/obj/mining.dmi'
|
|
icon_state = "roguedrill"
|
|
lefthand_file = 'sandcode/icons/mob/inhands/equipment/mining_lefthand.dmi'
|
|
righthand_file = 'sandcode/icons/mob/inhands/equipment/mining_righthand.dmi'
|
|
item_state = "roguedrill"
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
tool_behaviour = TOOL_MINING
|
|
toolspeed = 0.1
|
|
slot_flags = ITEM_SLOT_BELT
|
|
custom_materials = list(/datum/material/diamond=10000, /datum/material/titanium=20000, /datum/material/plasma=20000)
|
|
usesound = 'sound/weapons/drill.ogg'
|
|
hitsound = 'sound/weapons/drill.ogg'
|
|
attack_verb = list("drilled")
|
|
var/cooldowntime = 50
|
|
var/cooldown = 0
|
|
var/range = 7
|
|
|
|
/obj/item/rogue/ComponentInitialize()
|
|
. = ..()
|
|
AddComponent(/datum/component/two_handed, force_unwielded=5, force_wielded=20)
|
|
|
|
/obj/item/rogue/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
|
|
. = ..()
|
|
if(user.a_intent == INTENT_HARM)
|
|
var/datum/component/two_handed/TH = GetComponent(/datum/component/two_handed)
|
|
if(TH.wielded && isliving(target) && proximity_flag && cooldown <= world.time)
|
|
cooldown = world.time + (cooldowntime * 0.5)
|
|
playsound(src,'sound/misc/crunch.ogg', 200, 1)
|
|
var/mob/living/M = target
|
|
M.DefaultCombatKnockdown(40)
|
|
M.adjustStaminaLoss(20)
|
|
else if(TH.wielded)
|
|
if(cooldown < world.time)
|
|
cooldown = world.time + cooldowntime
|
|
playsound(src,'sound/misc/crunch.ogg', 200, 1)
|
|
var/list/hit_things = list()
|
|
var/turf/T = get_turf(get_step(user, user.dir))
|
|
var/ogdir = user.dir
|
|
var/turf/otherT = get_step(T, turn(ogdir, 90))
|
|
var/turf/otherT2 = get_step(T, turn(ogdir, -90))
|
|
for(var/i in 1 to range)
|
|
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
|
|
new /obj/effect/temp_visual/small_smoke/halfsecond(otherT)
|
|
new /obj/effect/temp_visual/small_smoke/halfsecond(otherT2)
|
|
for(var/mob/living/L in T.contents)
|
|
if(L != src && !(L in hit_things))
|
|
L.Stun(20)
|
|
L.adjustBruteLoss(10)
|
|
hit_things += L
|
|
for(var/mob/living/L in otherT.contents)
|
|
if(L != src && !(L in hit_things))
|
|
L.Stun(20)
|
|
L.adjustBruteLoss(10)
|
|
hit_things += L
|
|
for(var/mob/living/L in otherT2.contents)
|
|
if(L != src && !(L in hit_things))
|
|
L.Stun(20)
|
|
L.adjustBruteLoss(10)
|
|
hit_things += L
|
|
if(ismineralturf(T))
|
|
var/turf/closed/mineral/M = T
|
|
M.gets_drilled(user)
|
|
if(ismineralturf(otherT))
|
|
var/turf/closed/mineral/M = otherT
|
|
M.gets_drilled(user)
|
|
if(ismineralturf(otherT2))
|
|
var/turf/closed/mineral/M = otherT2
|
|
M.gets_drilled(user)
|
|
T = get_step(T, ogdir)
|
|
otherT = get_step(otherT, ogdir)
|
|
otherT2 = get_step(otherT2, ogdir)
|
|
sleep(2)
|