diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 834097bd44..3b3736b4b5 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -30,7 +30,6 @@ // DEBUFFS // ///////////// -#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark #define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run #define STATUS_EFFECT_MANIAMOTOR /datum/status_effect/maniamotor //disrupts, damages, and confuses the affected as long as they're in range of the motor diff --git a/code/__DEFINES/status_effects.dm.rej b/code/__DEFINES/status_effects.dm.rej new file mode 100644 index 0000000000..b02f09d005 --- /dev/null +++ b/code/__DEFINES/status_effects.dm.rej @@ -0,0 +1,13 @@ +diff a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm (rejected hunks) +@@ -42,3 +41,11 @@ + #define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes + + #define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage ++ ++///////////// ++// NEUTRAL // ++///////////// ++ ++#define STATUS_EFFECT_SIGILMARK /datum/status_effect/sigil_mark ++ ++#define STATUS_EFFECT_CRUSHERDAMAGETRACKING /datum/status_effect/crusher_damage //tracks total kinetic crusher damage on a target diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 92ee2e6462..f2e1972e23 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -1,15 +1,5 @@ //Largely negative status effects go here, even if they have small benificial effects -/datum/status_effect/sigil_mark //allows the affected target to always trigger sigils while mindless - id = "sigil_mark" - duration = -1 - alert_type = null - var/stat_allowed = DEAD //if owner's stat is below this, will remove itself - -/datum/status_effect/sigil_mark/tick() - if(owner.stat < stat_allowed) - qdel(src) - /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" duration = -1 diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm new file mode 100644 index 0000000000..0946408323 --- /dev/null +++ b/code/datums/status_effects/neutral.dm @@ -0,0 +1,18 @@ +//entirely neutral or internal status effects go here + +/datum/status_effect/sigil_mark //allows the affected target to always trigger sigils while mindless + id = "sigil_mark" + duration = -1 + alert_type = null + var/stat_allowed = DEAD //if owner's stat is below this, will remove itself + +/datum/status_effect/sigil_mark/tick() + if(owner.stat < stat_allowed) + qdel(src) + +/datum/status_effect/crusher_damage //tracks the damage dealt to this mob by kinetic crushers + id = "crusher_damage" + duration = -1 + status_type = STATUS_EFFECT_UNIQUE + alert_type = null + var/total_damage = 0 diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index c3cf2a5103..6fd0530935 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -169,7 +169,9 @@ /obj/effect/temp_visual/fire icon = 'icons/effects/fire.dmi' icon_state = "3" - duration = 20 + light_range = 3 + light_color = LIGHT_COLOR_FIRE + duration = 10 /obj/effect/temp_visual/revenant name = "spooky lights" diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 15d6c6afc5..6d8a99c1a2 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -5,9 +5,7 @@ item_state = "mining_hammer1" name = "proto-kinetic crusher" desc = "An early design of the proto-kinetic accelerator, it is little more than an combination of various mining tools cobbled together, forming a high-tech club. \ - While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna.\ - \nMark a mob with the destabilizing force, then hit them in melee to activate it for extra damage. Extra damage if backstabbed in this fashion. \ - This weapon is only particularly effective against large creatures." + While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna." force = 20 //As much as a bone spear, but this is significantly more annoying to carry around due to requiring the use of both hands at all times w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK @@ -21,9 +19,97 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") sharpness = IS_SHARP + var/list/trophies = list() var/charged = TRUE var/charge_time = 14 +/obj/item/weapon/twohanded/required/mining_hammer/Destroy() + for(var/a in trophies) + qdel(a) + trophies = null + return ..() + +/obj/item/weapon/twohanded/required/mining_hammer/examine(mob/living/user) + ..() + to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do 50 damage.") + to_chat(user, "Does 80 damage if the target is backstabbed, instead of 50.") + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()].") + +/obj/item/weapon/twohanded/required/mining_hammer/attackby(obj/item/A, mob/living/user) + if(istype(A, /obj/item/weapon/crowbar)) + if(LAZYLEN(trophies)) + to_chat(user, "You remove [src]'s trophies.") + playsound(loc, A.usesound, 100, 1) + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.remove_from(src, user) + else + to_chat(user, "There are no trophies on [src].") + else if(istype(A, /obj/item/crusher_trophy)) + var/obj/item/crusher_trophy/T = A + T.add_to(src, user) + else + return ..() + +/obj/item/weapon/twohanded/required/mining_hammer/attack(mob/living/target, mob/living/carbon/user) + var/datum/status_effect/crusher_damage/C = target.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + var/target_health = target.health + ..() + for(var/t in trophies) + if(!QDELETED(target)) + var/obj/item/crusher_trophy/T = t + T.on_melee_hit(target, user) + if(!QDELETED(C) && !QDELETED(target)) + C.total_damage += target_health - target.health //we did some damage, but let's not assume how much we did + +/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/living/user, proximity_flag) + if(!proximity_flag && charged)//Mark a target, or mine a tile. + var/turf/proj_turf = user.loc + if(!isturf(proj_turf)) + return + var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf) + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.on_projectile_fire(D, user) + D.preparePixelProjectile(target, get_turf(target), user) + D.firer = user + D.hammer_synced = src + playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) + D.fire() + charged = FALSE + icon_state = "mining_hammer1_uncharged" + addtimer(CALLBACK(src, .proc/Recharge), charge_time) + return + if(proximity_flag && isliving(target)) + var/mob/living/L = target + var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK) + if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK)) + return + var/datum/status_effect/crusher_damage/C = L.has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + var/target_health = L.health + for(var/t in trophies) + var/obj/item/crusher_trophy/T = t + T.on_mark_detonation(target, user) + new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) + var/backstab_dir = get_dir(user, L) + var/def_check = L.getarmor(type = "bomb") + if((user.dir & backstab_dir) && (L.dir & backstab_dir)) + L.apply_damage(80, BRUTE, blocked = def_check) + playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong + else + L.apply_damage(50, BRUTE, blocked = def_check) + if(!QDELETED(C) && !QDELETED(L)) + C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did + +/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge() + if(!charged) + charged = TRUE + icon_state = "mining_hammer1" + playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) + +//destablizing force /obj/item/projectile/destabilizer name = "destabilizing force" icon_state = "pulse1" @@ -42,8 +128,13 @@ /obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0) if(isliving(target)) var/mob/living/L = target + var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(STATUS_EFFECT_CRUSHERMARK) - CM.hammer_synced = hammer_synced + if(hammer_synced) + CM.hammer_synced = hammer_synced + for(var/t in hammer_synced.trophies) + var/obj/item/crusher_trophy/T = t + T.on_mark_application(target, CM, had_effect) var/target_turf = get_turf(target) if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf @@ -51,36 +142,153 @@ M.gets_drilled(firer) ..() -/obj/item/weapon/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag) - if(!proximity_flag && charged)//Mark a target, or mine a tile. - var/turf/proj_turf = user.loc - if(!isturf(proj_turf)) - return - var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf) - D.preparePixelProjectile(target, get_turf(target), user) - D.hammer_synced = src - playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, 1) - D.fire() - charged = FALSE - icon_state = "mining_hammer1_uncharged" - addtimer(CALLBACK(src, .proc/Recharge), charge_time) - return - if(proximity_flag && isliving(target)) - var/mob/living/L = target - var/datum/status_effect/crusher_mark/CM = L.has_status_effect(STATUS_EFFECT_CRUSHERMARK) - if(!CM || CM.hammer_synced != src || !L.remove_status_effect(STATUS_EFFECT_CRUSHERMARK)) - return - new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) - var/backstab_dir = get_dir(user, L) - var/def_check = L.getarmor(type = "bomb") - if((user.dir & backstab_dir) && (L.dir & backstab_dir)) - L.apply_damage(80, BRUTE, blocked = def_check) - playsound(user, 'sound/weapons/Kenetic_accel.ogg', 100, 1) //Seriously who spelled it wrong - else - L.apply_damage(50, BRUTE, blocked = def_check) +//trophies +/obj/item/crusher_trophy + name = "tail spike" + desc = "A strange spike with no usage." + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "tail_spike" + var/bonus_value = 10 //if it has a bonus effect, this is how much that effect is + var/denied_type = /obj/item/crusher_trophy -/obj/item/weapon/twohanded/required/mining_hammer/proc/Recharge() - if(!charged) - charged = TRUE - icon_state = "mining_hammer1" - playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) +/obj/item/crusher_trophy/examine(mob/living/user) + ..() + to_chat(user, "Causes [effect_desc()] when attached to a kinetic crusher.") + +/obj/item/crusher_trophy/proc/effect_desc() + return "errors" + +/obj/item/crusher_trophy/attackby(obj/item/A, mob/living/user) + if(istype(A, /obj/item/weapon/twohanded/required/mining_hammer)) + add_to(A, user) + else + ..() + +/obj/item/crusher_trophy/proc/add_to(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user) + for(var/t in H.trophies) + var/obj/item/crusher_trophy/T = t + if(istype(T, denied_type) || istype(src, T.denied_type)) + to_chat(user, "You can't seem to attach [src] to [H]. Maybe remove a few trophies?") + return FALSE + H.trophies += src + forceMove(H) + to_chat(user, "You attach [src] to [H].") + return TRUE + +/obj/item/crusher_trophy/proc/remove_from(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user) + forceMove(get_turf(H)) + H.trophies -= src + return TRUE + +/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user +/obj/item/crusher_trophy/proc/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user +/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before +/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user + +//ash drake +/obj/item/crusher_trophy/tail_spike + desc = "A spike taken from a ash drake's tail." + denied_type = /obj/item/crusher_trophy/tail_spike + bonus_value = 5 + +/obj/item/crusher_trophy/tail_spike/effect_desc() + return "mark detonation to do [bonus_value] damage to nearby creatures and push them back" + +/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user) + for(var/mob/living/L in oview(2, user)) + if(L.stat == DEAD) + continue + playsound(L, 'sound/magic/Fireball.ogg', 20, 1) + new /obj/effect/temp_visual/fire(L.loc) + addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done + L.adjustBruteLoss(bonus_value) + +/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user) + if(!target.anchored || ismegafauna(target)) //megafauna will always be pushed + step(target, get_dir(user, target)) + +//bubblegum +/obj/item/crusher_trophy/demon_claws + name = "demon claws" + desc = "A set of blood-drenched claws from a massive demon's hand." + icon_state = "demon_claws" + gender = PLURAL + denied_type = /obj/item/crusher_trophy/demon_claws + bonus_value = 10 + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + +/obj/item/crusher_trophy/demon_claws/effect_desc() + return "melee hits to do [bonus_value * 0.2] more damage and heal you for [bonus_value * 0.1]; this effect is increased by 500% during mark detonation" + +/obj/item/crusher_trophy/demon_claws/add_to(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user) + . = ..() + if(.) + H.force += bonus_value * 0.2 + H.force_unwielded += bonus_value * 0.2 + H.force_wielded += bonus_value * 0.2 + +/obj/item/crusher_trophy/demon_claws/remove_from(obj/item/weapon/twohanded/required/mining_hammer/H, mob/living/user) + . = ..() + if(.) + H.force -= bonus_value * 0.2 + H.force_unwielded -= bonus_value * 0.2 + H.force_wielded -= bonus_value * 0.2 + +/obj/item/crusher_trophy/demon_claws/on_melee_hit(mob/living/target, mob/living/user) + user.heal_ordered_damage(bonus_value * 0.1, damage_heal_order) + +/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user) + target.adjustBruteLoss(bonus_value * 0.8) + user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order) + +//colossus +/obj/item/crusher_trophy/blaster_tubes + name = "blaster tubes" + desc = "The blaster tubes from a colossus's arm." + icon_state = "blaster_tubes" + gender = PLURAL + denied_type = /obj/item/crusher_trophy/blaster_tubes + bonus_value = 15 + var/deadly_shot = FALSE + +/obj/item/crusher_trophy/blaster_tubes/effect_desc() + return "mark detonation to make the next destabilizer shot deal [bonus_value] damage but move slower" + +/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) + if(deadly_shot) + marker.name = "deadly [marker.name]" + marker.icon_state = "chronobolt" + marker.damage = bonus_value + marker.nodamage = FALSE + marker.speed = 2 + deadly_shot = FALSE + +/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user) + deadly_shot = TRUE + addtimer(CALLBACK(src, .proc/reset_deadly_shot), 300, TIMER_OVERRIDE) + +/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot() + deadly_shot = FALSE + +//hierophant +/obj/item/crusher_trophy/vortex_talisman + name = "vortex talisman" + desc = "A glowing trinket that was originally the Hierophant's beacon." + icon_state = "vortex_talisman" + denied_type = /obj/item/crusher_trophy/vortex_talisman + +/obj/item/crusher_trophy/vortex_talisman/effect_desc() + return "mark detonation to create a barrier you can pass" + +/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user) + var/turf/T = get_turf(user) + new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass! + var/turf/otherT = get_step(T, turn(user.dir, 90)) + if(otherT) + new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) + otherT = get_step(T, turn(user.dir, -90)) + if(otherT) + new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) + +/obj/effect/temp_visual/hierophant/wall/crusher + duration = 75 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 8a3f4ee633..bcf1e872e5 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -488,6 +488,13 @@ if(4) new /obj/item/weapon/dragons_blood(src) +/obj/structure/closet/crate/necropolis/dragon/crusher + name = "firey dragon chest" + +/obj/structure/closet/crate/necropolis/dragon/crusher/PopulateContents() + ..() + new /obj/item/crusher_trophy/tail_spike(src) + /obj/item/weapon/melee/ghost_sword name = "\improper spectral blade" desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly." @@ -700,7 +707,26 @@ icon_state = "lavastaff_warn" duration = 50 -///Bubblegum +//Bubblegum +/obj/structure/closet/crate/necropolis/bubblegum + name = "bubblegum chest" + +/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() + var/loot = rand(1,3) + switch(loot) + if(1) + new /obj/item/mayhem(src) + if(2) + new /obj/item/blood_contract(src) + if(3) + new /obj/item/weapon/gun/magic/staff/spellblade(src) + +/obj/structure/closet/crate/necropolis/bubblegum/crusher + name = "bloody bubblegum chest" + +/obj/structure/closet/crate/necropolis/bubblegum/crusher/PopulateContents() + ..() + new /obj/item/crusher_trophy/demon_claws(src) /obj/item/mayhem name = "mayhem in a bottle" @@ -716,19 +742,6 @@ playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1) qdel(src) -/obj/structure/closet/crate/necropolis/bubblegum - name = "bubblegum chest" - -/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() - var/loot = rand(1,3) - switch(loot) - if(1) - new /obj/item/mayhem(src) - if(2) - new /obj/item/blood_contract(src) - if(3) - new /obj/item/weapon/gun/magic/staff/spellblade(src) - /obj/item/blood_contract name = "blood contract" icon = 'icons/obj/wizard.dmi' @@ -773,6 +786,23 @@ qdel(src) +//Colossus +/obj/structure/closet/crate/necropolis/colossus + name = "colossus chest" + +/obj/structure/closet/crate/necropolis/colossus/PopulateContents() + var/list/choices = subtypesof(/obj/machinery/anomalous_crystal) + var/random_crystal = pick(choices) + new random_crystal(src) + new /obj/item/organ/vocal_cords/colossus(src) + +/obj/structure/closet/crate/necropolis/colossus/crusher + name = "angelic colossus chest" + +/obj/structure/closet/crate/necropolis/colossus/crusher/PopulateContents() + ..() + new /obj/item/crusher_trophy/blaster_tubes(src) + //Hierophant /obj/item/weapon/hierophant_club name = "hierophant club" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 2645ebcef7..6a7bff2ed2 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -44,6 +44,7 @@ Difficulty: Hard ranged = 1 pixel_x = -32 del_on_death = 1 + crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) loot = list(/obj/structure/closet/crate/necropolis/bubblegum) blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME var/charging = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index fd42582317..e77702ac19 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -46,7 +46,8 @@ Difficulty: Very Hard del_on_death = 1 medal_type = MEDAL_PREFIX score_type = COLOSSUS_SCORE - loot = list(/obj/effect/spawner/lootdrop/anomalous_crystal, /obj/item/organ/vocal_cords/colossus) + crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher) + loot = list(/obj/structure/closet/crate/necropolis/colossus) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) deathmessage = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/magic/demon_dies.ogg' @@ -444,13 +445,6 @@ Difficulty: Very Hard /obj/machinery/anomalous_crystal/ex_act() ActivationReaction(null, ACTIVATE_BOMB) -/obj/effect/spawner/lootdrop/anomalous_crystal - name = "anomalous crystal spawner" - -/obj/effect/spawner/lootdrop/anomalous_crystal/Initialize() - loot = subtypesof(/obj/machinery/anomalous_crystal) - . = ..() - /obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing observer_desc = "This crystal strips and equips its targets as clowns." possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 1c1fc8fb9e..d8b6f9039a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -51,6 +51,7 @@ Difficulty: Medium move_to_delay = 10 ranged = 1 pixel_x = -16 + crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher) loot = list(/obj/structure/closet/crate/necropolis/dragon) butcher_results = list(/obj/item/weapon/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/animalhide/ashdrake = 10, /obj/item/stack/sheet/bone = 30) var/swooping = NONE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index fad0ab17df..6d44df978e 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -78,6 +78,9 @@ Difficulty: Hard internal = new/obj/item/device/gps/internal/hierophant(src) spawned_beacon = new(loc) +/mob/living/simple_animal/hostile/megafauna/hierophant/spawn_crusher_loot() + new /obj/item/crusher_trophy/vortex_talisman(get_turf(spawned_beacon)) + /mob/living/simple_animal/hostile/megafauna/hierophant/Life() . = ..() if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client) @@ -461,6 +464,12 @@ Difficulty: Hard return ..() /obj/effect/temp_visual/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0) + if(mover == caster.pulledby) + return TRUE + if(istype(mover, /obj/item/projectile)) + var/obj/item/projectile/P = mover + if(P.firer == caster) + return TRUE if(mover == caster) return TRUE return FALSE @@ -589,6 +598,8 @@ Difficulty: Hard do_damage(get_turf(src)) /obj/effect/temp_visual/hierophant/blast/proc/do_damage(turf/T) + if(!damage) + return for(var/mob/living/L in T.contents - hit_things) //find and damage mobs... hit_things += L if((friendly_fire_check && caster && caster.faction_check_mob(L)) || L.stat == DEAD) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 9b8e037d61..ec72989474 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -34,6 +34,7 @@ /obj/structure/barricade, /obj/machinery/field, /obj/machinery/power/emitter) + var/list/crusher_loot var/medal_type = MEDAL_PREFIX var/score_type = BOSS_SCORE var/elimination = 0 @@ -44,6 +45,10 @@ layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = 2 // Easier to click on in melee, they're giant targets anyway +/mob/living/simple_animal/hostile/megafauna/Initialize(mapload) + . = ..() + apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + /mob/living/simple_animal/hostile/megafauna/Destroy() QDEL_NULL(internal) . = ..() @@ -52,12 +57,19 @@ if(health > 0) return else + var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) + if(C && crusher_loot) + if(C.total_damage >= maxHealth * 0.60) //if you do at least 60% of its health with the crusher, you'll get the item + spawn_crusher_loot() if(!admin_spawned) SSblackbox.set_details("megafauna_kills","[initial(name)]") if(!elimination) //used so the achievment only occurs for the last legion to die. grant_achievement(medal_type,score_type) ..() +/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot() + loot = crusher_loot + /mob/living/simple_animal/hostile/megafauna/gib() if(health > 0) return diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi index d19bc53856..41c1ba56cd 100644 Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ diff --git a/tgstation.dme b/tgstation.dme index f61256862c..f3e03b151a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -335,6 +335,7 @@ #include "code\datums\status_effects\buffs.dm" #include "code\datums\status_effects\debuffs.dm" #include "code\datums\status_effects\gas.dm" +#include "code\datums\status_effects\neutral.dm" #include "code\datums\status_effects\status_effect.dm" #include "code\datums\weather\weather.dm" #include "code\datums\weather\weather_types.dm"