From c07034f45abd2b7dbb2c47a969de3397f765f77f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 27 May 2017 20:55:08 -0500 Subject: [PATCH 1/2] The kinetic crusher can now gain bonus effects via trophies gained by killing bosses with it --- code/__DEFINES/status_effects.dm | 1 - code/__DEFINES/status_effects.dm.rej | 13 + code/datums/status_effects/debuffs.dm | 10 - code/datums/status_effects/neutral.dm | 18 ++ .../temporary_visuals/miscellaneous.dm | 4 +- .../mining/equipment/kinetic_crusher.dm | 280 +++++++++++++++--- .../mining/lavaland/necropolis_chests.dm | 58 +++- .../hostile/megafauna/bubblegum.dm | 1 + .../hostile/megafauna/colossus.dm | 10 +- .../simple_animal/hostile/megafauna/dragon.dm | 1 + .../hostile/megafauna/hierophant.dm | 11 + .../hostile/megafauna/megafauna.dm | 12 + icons/obj/lavaland/artefacts.dmi | Bin 12662 -> 17595 bytes tgstation.dme | 1 + 14 files changed, 350 insertions(+), 70 deletions(-) create mode 100644 code/__DEFINES/status_effects.dm.rej create mode 100644 code/datums/status_effects/neutral.dm 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 d19bc538563341f897cc62ab60e18d01950575a7..41c1ba56cd3dfc6f328323578ad8973ddfc7c3d9 100644 GIT binary patch literal 17595 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 Date: Mon, 5 Jun 2017 23:10:02 -0500 Subject: [PATCH 2/2] cleanup --- code/__DEFINES/status_effects.dm | 9 +++++++++ code/__DEFINES/status_effects.dm.rej | 13 ------------- 2 files changed, 9 insertions(+), 13 deletions(-) delete mode 100644 code/__DEFINES/status_effects.dm.rej diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 3b3736b4b5..6735ef95e9 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -40,3 +40,12 @@ #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/__DEFINES/status_effects.dm.rej b/code/__DEFINES/status_effects.dm.rej deleted file mode 100644 index b02f09d005..0000000000 --- a/code/__DEFINES/status_effects.dm.rej +++ /dev/null @@ -1,13 +0,0 @@ -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