diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 4fde338ba54..adc7d61e76e 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -498,3 +498,28 @@ name = "gar glasses" icon_state = "gar" item_state = "gar" + +/obj/item/clothing/glasses/godeye + name = "eye of god" + desc = "A strange eye, said to have been torn from an omniscient creature that used to roam the wastes." + icon_state = "godeye" + item_state = "godeye" + vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS + darkness_view = 8 + scan_reagents = 1 + flags = NODROP + invis_view = SEE_INVISIBLE_MINIMUM + +/obj/item/clothing/glasses/godeye/attackby(obj/item/weapon/W as obj, mob/user as mob, params) + if(istype(W, src) && W != src && W.loc == user) + if(W.icon_state == "godeye") + W.icon_state = "doublegodeye" + W.item_state = "doublegodeye" + W.desc = "A pair of strange eyes, said to have been torn from an omniscient creature that used to roam the wastes. There's no real reason to have two, but that isn't stopping you." + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.update_inv_wear_mask() + else + user << "The eye winks at you and vanishes into the abyss, you feel really unlucky." + qdel(src) + ..() \ No newline at end of file diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm new file mode 100644 index 00000000000..27a703b7443 --- /dev/null +++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm @@ -0,0 +1,215 @@ +/obj/structure/closet/crate/necropolis/dragon + name = "dragon chest" + +/obj/structure/closet/crate/necropolis/dragon/New() + ..() + var/loot = rand(1,4) + switch(loot) + if(1) + new /obj/item/weapon/melee/ghost_sword(src) + if(2) + new /obj/item/weapon/lava_staff(src) + if(3) + new /obj/item/weapon/spellbook/oneuse/sacredflame(src) + new /obj/item/weapon/gun/magic/wand/fireball(src) + if(4) + new /obj/item/weapon/dragons_blood(src) + +// Spectral Blade + +/obj/item/weapon/melee/ghost_sword + name = "spectral blade" + desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly." + icon_state = "spectral" + item_state = "spectral" + flags = CONDUCT + sharp = 1 + edge = 1 + w_class = 4 + force = 1 + throwforce = 1 + hitsound = 'sound/effects/ghost2.ogg' + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") + var/summon_cooldown = 0 + var/list/mob/dead/observer/spirits + +/obj/item/weapon/melee/ghost_sword/New() + ..() + spirits = list() + processing_objects.Add(src) + poi_list |= src + +/obj/item/weapon/melee/ghost_sword/Destroy() + for(var/mob/dead/observer/G in spirits) + G.invisibility = initial(G.invisibility) + spirits.Cut() + processing_objects.Remove(src) + poi_list -= src + . = ..() + +/obj/item/weapon/melee/ghost_sword/attack_self(mob/user) + if(summon_cooldown > world.time) + to_chat(user, "You just recently called out for aid. You don't want to annoy the spirits.") + return + to_chat(user, "You call out for aid, attempting to summon spirits to your side.") + + notify_ghosts("[user] is raising their [src], calling for your help!", enter_link="(Click to help)", source = user, action = NOTIFY_FOLLOW) + + summon_cooldown = world.time + 600 + +/obj/item/weapon/melee/ghost_sword/Topic(href, href_list) + if(href_list["follow"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost)) + ghost.ManualFollow(src) + +/obj/item/weapon/melee/ghost_sword/process() + ghost_check() + +/obj/item/weapon/melee/ghost_sword/proc/ghost_check() + var/ghost_counter = 0 + var/turf/T = get_turf(src) + var/list/contents = T.GetAllContents() + var/mob/dead/observer/current_spirits = list() + + for(var/mob/dead/observer/O in player_list) + if(is_type_in_list(O.following, contents)) + ghost_counter++ + O.invisibility = 0 + current_spirits |= O + + for(var/mob/dead/observer/G in spirits - current_spirits) + G.invisibility = initial(G.invisibility) + + spirits = current_spirits + + return ghost_counter + +/obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) + force = 0 + var/ghost_counter = ghost_check() + + force = Clamp((ghost_counter * 4), 0, 75) + user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") + ..() + +/obj/item/weapon/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) + var/ghost_counter = ghost_check() + final_block_chance += Clamp((ghost_counter * 5), 0, 75) + owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") + return ..() + +// Blood + +/obj/item/weapon/dragons_blood + name = "bottle of dragons blood" + desc = "You're not actually going to drink this, are you?" + icon = 'icons/obj/wizard.dmi' + icon_state = "vial" + +/obj/item/weapon/dragons_blood/attack_self(mob/living/carbon/human/user) + if(!istype(user)) + return + + var/mob/living/carbon/human/H = user + var/random = rand(1,3) + + switch(random) + if(1) + to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise.") + H.set_species("Skeleton") + if(2) + to_chat(user, "Power courses through you! You can now shift your form at will.") + if(user.mind) + var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new + user.mind.AddSpell(D) + if(3) + to_chat(user, "You feel like you could walk straight through lava now.") + H.weather_immunities |= "lava" + + playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1) + qdel(src) + +/datum/disease/transformation/dragon + name = "dragon transformation" + cure_text = "nothing" + cures = list("adminordrazine") + agent = "dragon's blood" + desc = "What do dragons have to do with Space Station 13?" + stage_prob = 20 + severity = BIOHAZARD + visibility_flags = 0 + stage1 = list("Your bones ache.") + stage2 = list("Your skin feels scaley.") + stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.") + stage4 = list("Your blood burns.") + stage5 = list("You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason.") + new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser + +//Lava Staff + +/obj/item/weapon/lava_staff + name = "staff of lava" + desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?" + icon_state = "staffofstorms" + item_state = "staffofstorms" + icon = 'icons/obj/guns/magic.dmi' + slot_flags = SLOT_BACK + item_state = "staffofstorms" + w_class = 4 + force = 25 + damtype = BURN + hitsound = 'sound/weapons/sear.ogg' + var/turf_type = /turf/unsimulated/floor/lava // /turf/simulated/floor/plating/lava/smooth once Lavaland turfs are added + var/transform_string = "lava" + var/reset_turf_type = /turf/simulated/floor/plating/airless/asteroid // /turf/simulated/floor/plating/asteroid/basalt once Lavaland turfs are added + var/reset_string = "basalt" + var/create_cooldown = 100 + var/create_delay = 30 + var/reset_cooldown = 50 + var/timer = 0 + var/banned_turfs + +/obj/item/weapon/lava_staff/New() + . = ..() + banned_turfs = typecacheof(list(/turf/space/transit, /turf/unsimulated)) + +/obj/item/weapon/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + ..() + if(timer > world.time) + return + + if(is_type_in_typecache(target, banned_turfs)) + return + + if(target in view(user.client.view, get_turf(user))) + + var/turf/simulated/T = get_turf(target) + if(!istype(T)) + return + if(!istype(T, turf_type)) + var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T) + L.alpha = 0 + animate(L, alpha = 255, time = create_delay) + user.visible_message("[user] points [src] at [T]!") + timer = world.time + create_delay + 1 + if(do_after(user, create_delay, target = T)) + user.visible_message("[user] turns \the [T] into [transform_string]!") + message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP).") + log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).") + T.ChangeTurf(turf_type) + timer = world.time + create_cooldown + qdel(L) + else + timer = world.time + qdel(L) + return + else + user.visible_message("[user] turns \the [T] into [reset_string]!") + T.ChangeTurf(reset_turf_type) + timer = world.time + reset_cooldown + playsound(T,'sound/magic/Fireball.ogg', 200, 1) + +/obj/effect/overlay/temp/lavastaff + icon_state = "lavastaff_warn" + duration = 50 \ No newline at end of file diff --git a/code/modules/mining/lavaland/loot/bubblegum_loot.dm b/code/modules/mining/lavaland/loot/bubblegum_loot.dm new file mode 100644 index 00000000000..fbc5ec2d945 --- /dev/null +++ b/code/modules/mining/lavaland/loot/bubblegum_loot.dm @@ -0,0 +1,81 @@ +/obj/structure/closet/crate/necropolis/bubblegum + name = "bubblegum chest" + +/obj/structure/closet/crate/necropolis/bubblegum/New() + ..() + 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) + +// Mayhem + +/obj/item/mayhem + name = "mayhem in a bottle" + desc = "A magically infused bottle of blood, the scent of which will drive anyone nearby into a murderous frenzy." + icon = 'icons/obj/wizard.dmi' + icon_state = "vial" + +/obj/item/mayhem/attack_self(mob/user) + for(var/mob/living/carbon/human/H in range(7,user)) + spawn() + var/obj/effect/mine/pickup/bloodbath/B = new(H) + B.mineEffect(H) + to_chat(user, "You shatter the bottle!") + playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1) + qdel(src) + +// Blood Contract + +/obj/item/blood_contract + name = "blood contract" + icon = 'icons/obj/wizard.dmi' + icon_state = "scroll2" + color = "#FF0000" + desc = "Mark your target for death." + var/used = FALSE + +/obj/item/blood_contract/attack_self(mob/user) + if(used) + return + + used = TRUE + var/choice = input(user,"Who do you want dead?","Choose Your Victim") as null|anything in player_list + + if(!choice) + used = FALSE + return + else if(!isliving(choice)) + to_chat(user, "[choice] is already dead!") + used = FALSE + return + else if(choice == user) + user << "You feel like writing your own name into a cursed death warrant would be unwise." + used = FALSE + return + else + var/mob/living/L = choice + + message_admins("[key_name_admin(L)] has been marked for death by [key_name_admin(user)].") + log_admin("[key_name(L)] has been marked for death by [key_name(user)].") + + var/datum/objective/survive/survive = new + survive.owner = L.mind + L.mind.objectives += survive + to_chat(L, "You've been marked for death! Don't let the demons get you!") + L.color = "#FF0000" + spawn() + var/obj/effect/mine/pickup/bloodbath/B = new(L) + B.mineEffect(L) + + for(var/mob/living/carbon/human/H in player_list) + if(H == L) + continue + to_chat(H, "You have an overwhelming desire to kill [L]. They have been marked red! Go kill them!") + H.put_in_hands(new /obj/item/weapon/kitchen/knife/butcher(H)) + + qdel(src) \ No newline at end of file diff --git a/code/modules/mining/lavaland/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm similarity index 100% rename from code/modules/mining/lavaland/colossus_loot.dm rename to code/modules/mining/lavaland/loot/colossus_loot.dm diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm new file mode 100644 index 00000000000..f06fd25d428 --- /dev/null +++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm @@ -0,0 +1,188 @@ +/obj/item/weapon/hierophant_staff + name = "Hierophant's staff" + desc = "A large club with intense magic power infused into it." + icon_state = "hierophant_staff" + item_state = "hierophant_staff" + icon = 'icons/obj/guns/magic.dmi' + slot_flags = SLOT_BACK + w_class = 4 + force = 20 + hitsound = "swing_hit" + //hitsound = 'sound/weapons/sonic_jackhammer.ogg' + actions_types = list(/datum/action/item_action/vortex_recall, /datum/action/item_action/toggle_unfriendly_fire) + var/cooldown_time = 20 //how long the cooldown between non-melee ranged attacks is + var/chaser_cooldown = 101 //how long the cooldown between firing chasers at mobs is + var/chaser_timer = 0 //what our current chaser cooldown is + var/timer = 0 //what our current cooldown is + var/blast_range = 3 //how long the cardinal blast's walls are + var/obj/effect/hierophant/rune //the associated rune we teleport to + var/teleporting = FALSE //if we ARE teleporting + var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets + +/obj/item/weapon/hierophant_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + ..() + var/turf/T = get_turf(target) + if(!T || timer > world.time) + return + timer = world.time + CLICK_CD_MELEE //by default, melee attacks only cause melee blasts, and have an accordingly short cooldown + if(proximity_flag) + spawn(0) + aoe_burst(T, user) + add_logs(user, target, "fired 3x3 blast at", src) + else + if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it) + spawn(0) + cardinal_blasts(T, user) + timer = world.time + cooldown_time + else if(target in view(5, get_turf(user))) //if the target is in view, hit it + timer = world.time + cooldown_time + if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one! + chaser_timer = world.time + chaser_cooldown + new /obj/effect/overlay/temp/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check) + add_logs(user, target, "fired a chaser at", src) + else + spawn(0) + cardinal_blasts(T, user) //otherwise, just do cardinal blast + add_logs(user, target, "fired cardinal blast at", src) + else + to_chat(user, "That target is out of range!") //too far away + +/obj/item/weapon/hierophant_staff/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/toggle_unfriendly_fire) //toggle friendly fire... + friendly_fire_check = !friendly_fire_check + to_chat(user, "You toggle friendly fire [friendly_fire_check ? "off":"on"]!") + return + if(user.get_active_hand() != src && user.get_inactive_hand() != src) //you need to hold the staff to teleport + to_chat(user, "You need to hold the staff in your hands to [rune ? "teleport with it" : "create a rune"]!") + return + if(!rune) + if(isturf(user.loc)) + user.visible_message("[user] holds [src] carefully in front of them, moving it in a strange pattern...", \ + "You start creating a hierophant rune to teleport to...") + timer = world.time + 51 + if(do_after(user, 50, target = user)) + var/turf/T = get_turf(user) + playsound(T,'sound/magic/Blind.ogg', 200, 1, -4) + new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user) + var/obj/effect/hierophant/H = new/obj/effect/hierophant(T) + rune = H + user.update_action_buttons_icon() + user.visible_message("[user] creates a strange rune beneath them!", \ + "You create a hierophant rune, which you can teleport yourself and any allies to at any time!\n\ + You can remove the rune to place a new one by striking it with the staff.") + else + timer = world.time + else + to_chat(user, "You need to be on solid ground to produce a rune!") + return + if(get_dist(user, rune) <= 2) //rune too close abort + to_chat(user, "You are too close to the rune to teleport to it!") + return + if(is_blocked_turf(get_turf(rune))) + to_chat(user, "The rune is blocked by something, preventing teleportation!") + return + teleporting = TRUE //start channel + user.update_action_buttons_icon() + user.visible_message("[user] starts to glow faintly...") + timer = world.time + 50 + if(do_after(user, 40, target = user) && rune) + var/turf/T = get_turf(rune) + var/turf/source = get_turf(user) + if(is_blocked_turf(T)) + teleporting = FALSE + to_chat(user, "The rune is blocked by something, preventing teleportation!") + user.update_action_buttons_icon() + return + new /obj/effect/overlay/temp/hierophant/telegraph(T, user) + new /obj/effect/overlay/temp/hierophant/telegraph(source, user) + playsound(T,'sound/magic/blink.ogg', 200, 1) + //playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1) + playsound(source,'sound/magic/blink.ogg', 200, 1) + //playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1) + if(!do_after(user, 3, target = user) || !rune) //no walking away shitlord + teleporting = FALSE + if(user) + user.update_action_buttons_icon() + return + if(is_blocked_turf(T)) + teleporting = FALSE + to_chat(user, "The rune is blocked by something, preventing teleportation!") + user.update_action_buttons_icon() + return + add_logs(user, rune, "teleported self from ([source.x],[source.y],[source.z]) to") + new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user) + new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user) + for(var/t in RANGE_TURFS(1, T)) + var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies + B.damage = 30 + for(var/t in RANGE_TURFS(1, source)) + var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies + B.damage = 30 + for(var/mob/living/L in range(1, source)) + spawn(0) + teleport_mob(source, L, T, user) //regardless, take all mobs near us along + sleep(6) //at this point the blasts detonate + else + timer = world.time + teleporting = FALSE + if(user) + user.update_action_buttons_icon() + +/obj/item/weapon/hierophant_staff/proc/teleport_mob(turf/source, mob/M, turf/target, mob/user) + var/turf/turf_to_teleport_to = get_step(target, get_dir(source, M)) //get position relative to caster + if(!turf_to_teleport_to || is_blocked_turf(turf_to_teleport_to)) + return + animate(M, alpha = 0, time = 2, easing = EASE_OUT) //fade out + sleep(1) + if(!M) + return + M.visible_message("[M] fades out!") + sleep(2) + if(!M) + return + M.forceMove(turf_to_teleport_to) + sleep(1) + if(!M) + return + animate(M, alpha = 255, time = 2, easing = EASE_IN) //fade IN + sleep(1) + if(!M) + return + M.visible_message("[M] fades in!") + if(user != M) + add_logs(user, M, "teleported", null, "from ([source.x],[source.y],[source.z])") + +/obj/item/weapon/hierophant_staff/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay + if(!T) + return + new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user) + playsound(T,'sound/magic/blink.ogg', 200, 1) + //playsound(T,'sound/effects/bin_close.ogg', 200, 1) + sleep(2) + new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check) + for(var/d in cardinal) + spawn(0) + blast_wall(T, d, user) + +/obj/item/weapon/hierophant_staff/proc/blast_wall(turf/T, dir, mob/living/user) //make a wall of blasts blast_range tiles long + if(!T) + return + var/range = blast_range + var/turf/previousturf = T + var/turf/J = get_step(previousturf, dir) + for(var/i in 1 to range) + if(!J) + return + new /obj/effect/overlay/temp/hierophant/blast(J, user, friendly_fire_check) + previousturf = J + J = get_step(previousturf, dir) + +/obj/item/weapon/hierophant_staff/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target + if(!T) + return + new /obj/effect/overlay/temp/hierophant/telegraph(T, user) + playsound(T,'sound/magic/blink.ogg', 200, 1) + //playsound(T,'sound/effects/bin_close.ogg', 200, 1) + sleep(2) + for(var/t in RANGE_TURFS(1, T)) + new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check) \ No newline at end of file diff --git a/code/modules/mining/lavaland/loot/legion_loot.dm b/code/modules/mining/lavaland/loot/legion_loot.dm new file mode 100644 index 00000000000..49e64f3349e --- /dev/null +++ b/code/modules/mining/lavaland/loot/legion_loot.dm @@ -0,0 +1,52 @@ +/obj/item/weapon/staff/storm + name = "staff of storms" + desc = "An ancient staff retrieved from the remains of Legion. The wind stirs as you move it." + icon_state = "staffofstorms" + item_state = "staffofstorms" + icon = 'icons/obj/guns/magic.dmi' + slot_flags = SLOT_BACK + item_state = "staffofstorms" + w_class = 4 + force = 25 + damtype = BURN + hitsound = 'sound/weapons/sear.ogg' + var/storm_type = /datum/weather/ash_storm + var/storm_cooldown = 0 + +/obj/item/weapon/staff/storm/attack_self(mob/user) + if(storm_cooldown > world.time) + to_chat(user, "The staff is still recharging!") + return + + var/area/user_area = get_area(user) + var/datum/weather/A + var/z_level_name = space_manager.levels_by_name[user.z] + for(var/V in weather_master.existing_weather) + var/datum/weather/W = V + if(W.target_z == z_level_name && 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, "The storm is already ending! It would be a waste to use the staff now.") + return + user.visible_message("[user] holds [src] skywards as an orange beam travels into the sky!", \ + "You hold [src] skyward, dispelling the storm!") + playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0) + A.wind_down() + return + else + A = new storm_type + A.name = "staff storm" + A.area_type = user_area.type + A.target_z = z_level_name + A.telegraph_duration = 100 + A.end_duration = 100 + + user.visible_message("[user] holds [src] skywards as red lightning crackles into the sky!", \ + "You hold [src] skyward, calling down a terrible storm!") + playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0) + A.telegraph() + storm_cooldown = world.time + 200 \ No newline at end of file diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm new file mode 100644 index 00000000000..39b2a0c7228 --- /dev/null +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -0,0 +1,105 @@ +//Shared Bag + +//Internal +/obj/item/weapon/storage/backpack/shared + name = "paradox bag" + desc = "Somehow, it's in two places at once." + max_combined_w_class = 60 + max_w_class = 3 + +//External +/obj/item/device/shared_storage + name = "paradox bag" + desc = "Somehow, it's in two places at once." + icon = 'icons/obj/storage.dmi' + icon_state = "cultpack" + slot_flags = SLOT_BACK + var/obj/item/weapon/storage/backpack/shared/bag + +/obj/item/device/shared_storage/red + name = "paradox bag" + desc = "Somehow, it's in two places at once." + +/obj/item/device/shared_storage/red/New() + ..() + if(!bag) + var/obj/item/weapon/storage/backpack/shared/S = new(src) + var/obj/item/device/shared_storage/blue = new(loc) + + bag = S + blue.bag = S + +/obj/item/device/shared_storage/attackby(obj/item/W, mob/user, params) + if(bag) + bag.forceMove(user) + bag.attackby(W, user, params) + +/obj/item/device/shared_storage/attack_hand(mob/living/carbon/user) + if(!iscarbon(user)) + return + if(loc == user && user.back && user.back == src) + if(bag) + bag.forceMove(user) + bag.attack_hand(user) + else + ..() + +/obj/item/device/shared_storage/MouseDrop(atom/over_object) + if(iscarbon(usr)) + var/mob/M = usr + + if(!over_object) + return + + if (istype(usr.loc, /obj/mecha)) + return + + if(!M.restrained() && !M.stat) + playsound(loc, "rustle", 50, 1, -5) + + if(istype(over_object, /obj/screen/inventory/hand)) + if(!M.unEquip(src)) + return + M.put_in_active_hand(src) + + add_fingerprint(usr) + + +//Potion of Flight + +/obj/item/weapon/reagent_containers/glass/bottle/potion + icon = 'icons/obj/lavaland/artefacts.dmi' + icon_state = "potionflask" + +/obj/item/weapon/reagent_containers/glass/bottle/potion/flight + name = "strange elixir" + desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'." + list_reagents = list("flightpotion" = 5) + +/obj/item/weapon/reagent_containers/glass/bottle/potion/update_icon() + if(reagents.total_volume) + icon_state = "potionflask" + else + icon_state = "potionflask_empty" + +/datum/reagent/flightpotion + name = "Flight Potion" + id = "flightpotion" + description = "Strange mutagenic compound of unknown origins." + reagent_state = LIQUID + color = "#FFEBEB" + +/datum/reagent/flightpotion/reaction_mob(mob/living/M, method = TOUCH, reac_volume, show_message = 1) + if(ishuman(M) && M.stat != DEAD) + var/mob/living/carbon/human/H = M + if(H.species.name != "Human" || reac_volume < 5) // implying xenohumans are holy + if(method == INGEST && show_message) + to_chat(H, "You feel nothing but a terrible aftertaste.") + return ..() + + to_chat(H, "A terrible pain travels down your back as wings burst out!") + H.set_species("Angel") + playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1, -1) + H.adjustBruteLoss(20) + H.emote("scream") + ..() \ No newline at end of file diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 1a5866a5e4a..f492ad715e2 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -13,7 +13,7 @@ /obj/structure/closet/crate/necropolis/tendril/New() ..() // uncomment me once these items are being implemented - /*var/loot = rand(1,25) + var/loot = rand(1,25) switch(loot) if(1) new /obj/item/device/shared_storage/red(src) @@ -36,7 +36,7 @@ if(9) new /obj/item/organ/brain/alien(src) if(10) - new /obj/item/organ/heart/cursed(src) + new /obj/item/organ/heart/cursed(src)/* if(11) new /obj/item/ship_in_a_bottle(src) if(12) @@ -67,556 +67,4 @@ new /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src) if(25) - new /obj/item/weapon/spellbook/oneuse/summonitem(src)*/ - -///Bosses - -//Dragon - -/obj/structure/closet/crate/necropolis/dragon - name = "dragon chest" - -/obj/structure/closet/crate/necropolis/dragon/New() - ..() - var/loot = rand(1,4) - switch(loot) - if(1) - new /obj/item/weapon/melee/ghost_sword(src) - if(2) - new /obj/item/weapon/lava_staff(src) - if(3) - new /obj/item/weapon/spellbook/oneuse/sacredflame(src) - new /obj/item/weapon/gun/magic/wand/fireball(src) - if(4) - new /obj/item/weapon/dragons_blood(src) - -/obj/item/weapon/melee/ghost_sword - name = "spectral blade" - desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly." - icon_state = "spectral" - item_state = "spectral" - flags = CONDUCT - sharp = 1 - edge = 1 - w_class = 4 - force = 1 - throwforce = 1 - hitsound = 'sound/effects/ghost2.ogg' - attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended") - var/summon_cooldown = 0 - var/list/mob/dead/observer/spirits - -/obj/item/weapon/melee/ghost_sword/New() - ..() - spirits = list() - processing_objects.Add(src) - poi_list |= src - -/obj/item/weapon/melee/ghost_sword/Destroy() - for(var/mob/dead/observer/G in spirits) - G.invisibility = initial(G.invisibility) - spirits.Cut() - processing_objects.Remove(src) - poi_list -= src - . = ..() - -/obj/item/weapon/melee/ghost_sword/attack_self(mob/user) - if(summon_cooldown > world.time) - to_chat(user, "You just recently called out for aid. You don't want to annoy the spirits.") - return - to_chat(user, "You call out for aid, attempting to summon spirits to your side.") - - notify_ghosts("[user] is raising their [src], calling for your help!", enter_link="(Click to help)", source = user, action = NOTIFY_FOLLOW) - - summon_cooldown = world.time + 600 - -/obj/item/weapon/melee/ghost_sword/Topic(href, href_list) - if(href_list["follow"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - ghost.ManualFollow(src) - -/obj/item/weapon/melee/ghost_sword/process() - ghost_check() - -/obj/item/weapon/melee/ghost_sword/proc/ghost_check() - var/ghost_counter = 0 - var/turf/T = get_turf(src) - var/list/contents = T.GetAllContents() - var/mob/dead/observer/current_spirits = list() - - for(var/mob/dead/observer/O in player_list) - if(is_type_in_list(O.following, contents)) - ghost_counter++ - O.invisibility = 0 - current_spirits |= O - - for(var/mob/dead/observer/G in spirits - current_spirits) - G.invisibility = initial(G.invisibility) - - spirits = current_spirits - - return ghost_counter - -/obj/item/weapon/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) - force = 0 - var/ghost_counter = ghost_check() - - force = Clamp((ghost_counter * 4), 0, 75) - user.visible_message("[user] strikes with the force of [ghost_counter] vengeful spirits!") - ..() - -/obj/item/weapon/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type) - var/ghost_counter = ghost_check() - final_block_chance += Clamp((ghost_counter * 5), 0, 75) - owner.visible_message("[owner] is protected by a ring of [ghost_counter] ghosts!") - return ..() - -// Blood - -/obj/item/weapon/dragons_blood - name = "bottle of dragons blood" - desc = "You're not actually going to drink this, are you?" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - -/obj/item/weapon/dragons_blood/attack_self(mob/living/carbon/human/user) - if(!istype(user)) - return - - var/mob/living/carbon/human/H = user - var/random = rand(1,3) - - switch(random) - if(1) - to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise.") - H.set_species("Skeleton") - if(2) - to_chat(user, "Power courses through you! You can now shift your form at will.") - if(user.mind) - var/obj/effect/proc_holder/spell/targeted/shapeshift/dragon/D = new - user.mind.AddSpell(D) - if(3) - to_chat(user, "You feel like you could walk straight through lava now.") - H.weather_immunities |= "lava" - - playsound(user.loc,'sound/items/drink.ogg', rand(10,50), 1) - qdel(src) - -/datum/disease/transformation/dragon - name = "dragon transformation" - cure_text = "nothing" - cures = list("adminordrazine") - agent = "dragon's blood" - desc = "What do dragons have to do with Space Station 13?" - stage_prob = 20 - severity = BIOHAZARD - visibility_flags = 0 - stage1 = list("Your bones ache.") - stage2 = list("Your skin feels scaley.") - stage3 = list("You have an overwhelming urge to terrorize some peasants.", "Your teeth feel sharper.") - stage4 = list("Your blood burns.") - stage5 = list("You're a fucking dragon. However, any previous allegiances you held still apply. It'd be incredibly rude to eat your still human friends for no reason.") - new_form = /mob/living/simple_animal/hostile/megafauna/dragon/lesser - -//Lava Staff - -/obj/item/weapon/lava_staff - name = "staff of lava" - desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?" - icon_state = "staffofstorms" - item_state = "staffofstorms" - icon = 'icons/obj/guns/magic.dmi' - slot_flags = SLOT_BACK - item_state = "staffofstorms" - w_class = 4 - force = 25 - damtype = BURN - hitsound = 'sound/weapons/sear.ogg' - var/turf_type = /turf/unsimulated/floor/lava // /turf/simulated/floor/plating/lava/smooth once Lavaland turfs are added - var/transform_string = "lava" - var/reset_turf_type = /turf/simulated/floor/plating/airless/asteroid // /turf/simulated/floor/plating/asteroid/basalt once Lavaland turfs are added - var/reset_string = "basalt" - var/create_cooldown = 100 - var/create_delay = 30 - var/reset_cooldown = 50 - var/timer = 0 - var/banned_turfs - -/obj/item/weapon/lava_staff/New() - . = ..() - banned_turfs = typecacheof(list(/turf/space/transit, /turf/unsimulated)) - -/obj/item/weapon/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - ..() - if(timer > world.time) - return - - if(is_type_in_typecache(target, banned_turfs)) - return - - if(target in view(user.client.view, get_turf(user))) - - var/turf/simulated/T = get_turf(target) - if(!istype(T)) - return - if(!istype(T, turf_type)) - var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T) - L.alpha = 0 - animate(L, alpha = 255, time = create_delay) - user.visible_message("[user] points [src] at [T]!") - timer = world.time + create_delay + 1 - if(do_after(user, create_delay, target = T)) - user.visible_message("[user] turns \the [T] into [transform_string]!") - message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (JMP).") - log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).") - T.ChangeTurf(turf_type) - timer = world.time + create_cooldown - qdel(L) - else - timer = world.time - qdel(L) - return - else - user.visible_message("[user] turns \the [T] into [reset_string]!") - T.ChangeTurf(reset_turf_type) - timer = world.time + reset_cooldown - playsound(T,'sound/magic/Fireball.ogg', 200, 1) - -/obj/effect/overlay/temp/lavastaff - icon_state = "lavastaff_warn" - duration = 50 - -// Bubblegum - -/obj/structure/closet/crate/necropolis/bubblegum - name = "bubblegum chest" - -/obj/structure/closet/crate/necropolis/bubblegum/New() - ..() - 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) - -// Mayhem - -/obj/item/mayhem - name = "mayhem in a bottle" - desc = "A magically infused bottle of blood, the scent of which will drive anyone nearby into a murderous frenzy." - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - -/obj/item/mayhem/attack_self(mob/user) - for(var/mob/living/carbon/human/H in range(7,user)) - spawn() - var/obj/effect/mine/pickup/bloodbath/B = new(H) - B.mineEffect(H) - to_chat(user, "You shatter the bottle!") - playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1) - qdel(src) - -// Blood Contract - -/obj/item/blood_contract - name = "blood contract" - icon = 'icons/obj/wizard.dmi' - icon_state = "scroll2" - color = "#FF0000" - desc = "Mark your target for death." - var/used = FALSE - -/obj/item/blood_contract/attack_self(mob/user) - if(used) - return - - used = TRUE - var/choice = input(user,"Who do you want dead?","Choose Your Victim") as null|anything in player_list - - if(!choice) - used = FALSE - return - else if(!isliving(choice)) - to_chat(user, "[choice] is already dead!") - used = FALSE - return - else if(choice == user) - user << "You feel like writing your own name into a cursed death warrant would be unwise." - used = FALSE - return - else - var/mob/living/L = choice - - message_admins("[key_name_admin(L)] has been marked for death by [key_name_admin(user)].") - log_admin("[key_name(L)] has been marked for death by [key_name(user)].") - - var/datum/objective/survive/survive = new - survive.owner = L.mind - L.mind.objectives += survive - to_chat(L, "You've been marked for death! Don't let the demons get you!") - L.color = "#FF0000" - spawn() - var/obj/effect/mine/pickup/bloodbath/B = new(L) - B.mineEffect(L) - - for(var/mob/living/carbon/human/H in player_list) - if(H == L) - continue - to_chat(H, "You have an overwhelming desire to kill [L]. They have been marked red! Go kill them!") - H.put_in_hands(new /obj/item/weapon/kitchen/knife/butcher(H)) - - qdel(src) - -// Legion - -// Staff of Storms - -/obj/item/weapon/staff/storm - name = "staff of storms" - desc = "An ancient staff retrieved from the remains of Legion. The wind stirs as you move it." - icon_state = "staffofstorms" - item_state = "staffofstorms" - icon = 'icons/obj/guns/magic.dmi' - slot_flags = SLOT_BACK - item_state = "staffofstorms" - w_class = 4 - force = 25 - damtype = BURN - hitsound = 'sound/weapons/sear.ogg' - var/storm_type = /datum/weather/ash_storm - var/storm_cooldown = 0 - -/obj/item/weapon/staff/storm/attack_self(mob/user) - if(storm_cooldown > world.time) - to_chat(user, "The staff is still recharging!") - return - - var/area/user_area = get_area(user) - var/datum/weather/A - var/z_level_name = space_manager.levels_by_name[user.z] - for(var/V in weather_master.existing_weather) - var/datum/weather/W = V - if(W.target_z == z_level_name && 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, "The storm is already ending! It would be a waste to use the staff now.") - return - user.visible_message("[user] holds [src] skywards as an orange beam travels into the sky!", \ - "You hold [src] skyward, dispelling the storm!") - playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0) - A.wind_down() - return - else - A = new storm_type - A.name = "staff storm" - A.area_type = user_area.type - A.target_z = z_level_name - A.telegraph_duration = 100 - A.end_duration = 100 - - user.visible_message("[user] holds [src] skywards as red lightning crackles into the sky!", \ - "You hold [src] skyward, calling down a terrible storm!") - playsound(user, 'sound/magic/Staff_Change.ogg', 200, 0) - A.telegraph() - storm_cooldown = world.time + 200 - -// Hierophant - -//Hierophant - -/obj/item/weapon/hierophant_staff - name = "Hierophant's staff" - desc = "A large club with intense magic power infused into it." - icon_state = "hierophant_staff" - item_state = "hierophant_staff" - icon = 'icons/obj/guns/magic.dmi' - slot_flags = SLOT_BACK - w_class = 4 - force = 20 - hitsound = "swing_hit" - //hitsound = 'sound/weapons/sonic_jackhammer.ogg' - actions_types = list(/datum/action/item_action/vortex_recall, /datum/action/item_action/toggle_unfriendly_fire) - var/cooldown_time = 20 //how long the cooldown between non-melee ranged attacks is - var/chaser_cooldown = 101 //how long the cooldown between firing chasers at mobs is - var/chaser_timer = 0 //what our current chaser cooldown is - var/timer = 0 //what our current cooldown is - var/blast_range = 3 //how long the cardinal blast's walls are - var/obj/effect/hierophant/rune //the associated rune we teleport to - var/teleporting = FALSE //if we ARE teleporting - var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets - -/obj/item/weapon/hierophant_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - ..() - var/turf/T = get_turf(target) - if(!T || timer > world.time) - return - timer = world.time + CLICK_CD_MELEE //by default, melee attacks only cause melee blasts, and have an accordingly short cooldown - if(proximity_flag) - spawn(0) - aoe_burst(T, user) - add_logs(user, target, "fired 3x3 blast at", src) - else - if(ismineralturf(target) && get_dist(user, target) < 6) //target is minerals, we can hit it(even if we can't see it) - spawn(0) - cardinal_blasts(T, user) - timer = world.time + cooldown_time - else if(target in view(5, get_turf(user))) //if the target is in view, hit it - timer = world.time + cooldown_time - if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one! - chaser_timer = world.time + chaser_cooldown - new /obj/effect/overlay/temp/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check) - add_logs(user, target, "fired a chaser at", src) - else - spawn(0) - cardinal_blasts(T, user) //otherwise, just do cardinal blast - add_logs(user, target, "fired cardinal blast at", src) - else - to_chat(user, "That target is out of range!") //too far away - -/obj/item/weapon/hierophant_staff/ui_action_click(mob/user, actiontype) - if(actiontype == /datum/action/item_action/toggle_unfriendly_fire) //toggle friendly fire... - friendly_fire_check = !friendly_fire_check - to_chat(user, "You toggle friendly fire [friendly_fire_check ? "off":"on"]!") - return - if(user.get_active_hand() != src && user.get_inactive_hand() != src) //you need to hold the staff to teleport - to_chat(user, "You need to hold the staff in your hands to [rune ? "teleport with it" : "create a rune"]!") - return - if(!rune) - if(isturf(user.loc)) - user.visible_message("[user] holds [src] carefully in front of them, moving it in a strange pattern...", \ - "You start creating a hierophant rune to teleport to...") - timer = world.time + 51 - if(do_after(user, 50, target = user)) - var/turf/T = get_turf(user) - playsound(T,'sound/magic/Blind.ogg', 200, 1, -4) - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user) - var/obj/effect/hierophant/H = new/obj/effect/hierophant(T) - rune = H - user.update_action_buttons_icon() - user.visible_message("[user] creates a strange rune beneath them!", \ - "You create a hierophant rune, which you can teleport yourself and any allies to at any time!\n\ - You can remove the rune to place a new one by striking it with the staff.") - else - timer = world.time - else - to_chat(user, "You need to be on solid ground to produce a rune!") - return - if(get_dist(user, rune) <= 2) //rune too close abort - to_chat(user, "You are too close to the rune to teleport to it!") - return - if(is_blocked_turf(get_turf(rune))) - to_chat(user, "The rune is blocked by something, preventing teleportation!") - return - teleporting = TRUE //start channel - user.update_action_buttons_icon() - user.visible_message("[user] starts to glow faintly...") - timer = world.time + 50 - if(do_after(user, 40, target = user) && rune) - var/turf/T = get_turf(rune) - var/turf/source = get_turf(user) - if(is_blocked_turf(T)) - teleporting = FALSE - to_chat(user, "The rune is blocked by something, preventing teleportation!") - user.update_action_buttons_icon() - return - new /obj/effect/overlay/temp/hierophant/telegraph(T, user) - new /obj/effect/overlay/temp/hierophant/telegraph(source, user) - playsound(T,'sound/magic/blink.ogg', 200, 1) - //playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1) - playsound(source,'sound/magic/blink.ogg', 200, 1) - //playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1) - if(!do_after(user, 3, target = user) || !rune) //no walking away shitlord - teleporting = FALSE - if(user) - user.update_action_buttons_icon() - return - if(is_blocked_turf(T)) - teleporting = FALSE - to_chat(user, "The rune is blocked by something, preventing teleportation!") - user.update_action_buttons_icon() - return - add_logs(user, rune, "teleported self from ([source.x],[source.y],[source.z]) to") - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user) - new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user) - for(var/t in RANGE_TURFS(1, T)) - var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies - B.damage = 30 - for(var/t in RANGE_TURFS(1, source)) - var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies - B.damage = 30 - for(var/mob/living/L in range(1, source)) - spawn(0) - teleport_mob(source, L, T, user) //regardless, take all mobs near us along - sleep(6) //at this point the blasts detonate - else - timer = world.time - teleporting = FALSE - if(user) - user.update_action_buttons_icon() - -/obj/item/weapon/hierophant_staff/proc/teleport_mob(turf/source, mob/M, turf/target, mob/user) - var/turf/turf_to_teleport_to = get_step(target, get_dir(source, M)) //get position relative to caster - if(!turf_to_teleport_to || is_blocked_turf(turf_to_teleport_to)) - return - animate(M, alpha = 0, time = 2, easing = EASE_OUT) //fade out - sleep(1) - if(!M) - return - M.visible_message("[M] fades out!") - sleep(2) - if(!M) - return - M.forceMove(turf_to_teleport_to) - sleep(1) - if(!M) - return - animate(M, alpha = 255, time = 2, easing = EASE_IN) //fade IN - sleep(1) - if(!M) - return - M.visible_message("[M] fades in!") - if(user != M) - add_logs(user, M, "teleported", null, "from ([source.x],[source.y],[source.z])") - -/obj/item/weapon/hierophant_staff/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay - if(!T) - return - new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user) - playsound(T,'sound/magic/blink.ogg', 200, 1) - //playsound(T,'sound/effects/bin_close.ogg', 200, 1) - sleep(2) - new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check) - for(var/d in cardinal) - spawn(0) - blast_wall(T, d, user) - -/obj/item/weapon/hierophant_staff/proc/blast_wall(turf/T, dir, mob/living/user) //make a wall of blasts blast_range tiles long - if(!T) - return - var/range = blast_range - var/turf/previousturf = T - var/turf/J = get_step(previousturf, dir) - for(var/i in 1 to range) - if(!J) - return - new /obj/effect/overlay/temp/hierophant/blast(J, user, friendly_fire_check) - previousturf = J - J = get_step(previousturf, dir) - -/obj/item/weapon/hierophant_staff/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target - if(!T) - return - new /obj/effect/overlay/temp/hierophant/telegraph(T, user) - playsound(T,'sound/magic/blink.ogg', 200, 1) - //playsound(T,'sound/effects/bin_close.ogg', 200, 1) - sleep(2) - for(var/t in RANGE_TURFS(1, T)) - new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check) \ No newline at end of file + new /obj/item/weapon/spellbook/oneuse/summonitem(src)*/ \ No newline at end of file diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index f74ebda9d34..97966c61dac 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 938d810a612..fd2947d7d69 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/paradise.dme b/paradise.dme index 9776de13d69..e048b75e41a 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1451,8 +1451,13 @@ #include "code\modules\mining\laborcamp\laborshuttle.dm" #include "code\modules\mining\laborcamp\laborstacker.dm" #include "code\modules\mining\lavaland\ash_flora.dm" -#include "code\modules\mining\lavaland\colossus_loot.dm" #include "code\modules\mining\lavaland\necropolis_chests.dm" +#include "code\modules\mining\lavaland\loot\ashdragon_loot.dm" +#include "code\modules\mining\lavaland\loot\bubblegum_loot.dm" +#include "code\modules\mining\lavaland\loot\colossus_loot.dm" +#include "code\modules\mining\lavaland\loot\hierophant_loot.dm" +#include "code\modules\mining\lavaland\loot\legion_loot.dm" +#include "code\modules\mining\lavaland\loot\tendril_loot.dm" #include "code\modules\mob\abilities.dm" #include "code\modules\mob\death.dm" #include "code\modules\mob\emote.dm"