diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm index 207483b04078d..7a474956fbc8f 100644 --- a/code/__byond_version_compat.dm +++ b/code/__byond_version_compat.dm @@ -2,7 +2,7 @@ //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 515 -#define MIN_COMPILER_BUILD 1642 +#define MIN_COMPILER_BUILD 1635 #if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) && !defined(OPENDREAM) //Don't forget to update this part #error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update. diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 69da1c9142db6..9b4a932edf863 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -88,8 +88,8 @@ visuals.layer = beam_layer visuals.update_appearance() Draw() - RegisterSignal(origin, COMSIG_MOVABLE_MOVED, PROC_REF(redrawing)) - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(redrawing)) + RegisterSignals(origin, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(redrawing)) + RegisterSignals(target, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(redrawing)) /** * Triggered by signals set up when the beam is set up. If it's still sane to create a beam, it removes the old beam, creates a new one. Otherwise it kills the beam. @@ -101,7 +101,7 @@ */ /datum/beam/proc/redrawing(atom/movable/mover, atom/oldloc, direction) SIGNAL_HANDLER - if(origin && target && get_dist(origin,target) 9 || interacting_with.z != user.z) + return ITEM_INTERACT_BLOCKING + + if(!length(current_wisps)) + user.balloon_alert(user, "no wisps!") + return + + for(var/index in 0 to (length(current_wisps) - 1)) + addtimer(CALLBACK(src, PROC_REF(fire_wisp), user, interacting_with), index * 0.15 SECONDS) + + set_combo(new_value = 0, user = user) + +/obj/item/cain_and_abel/attack(mob/living/target, mob/living/carbon/human/user) + if(!istype(target) || target.mob_size < MOB_SIZE_LARGE || target.stat == DEAD) + return ..() + + var/old_force = force + var/bonus_value = combo_count || 1 + force = CEILING((bonus_value * damage_boost) * force, 1) + . = ..() + force = old_force + set_combo(new_value = combo_count + 1, user = user) + +/obj/item/cain_and_abel/attack_self(mob/user) + . = ..() + if(.) + return TRUE + throw_mode = (throw_mode == THROW_MODE_CRYSTALS) ? THROW_MODE_LAUNCH : THROW_MODE_CRYSTALS + user.balloon_alert(user, "crystals [throw_mode == THROW_MODE_CRYSTALS ? "activated" : "deactivated"]") + return TRUE + +/obj/item/cain_and_abel/proc/set_combo(new_value, mob/living/user) + combo_count = (new_value <= max_combo) ? new_value : 0 + handle_wisps(user) + +/obj/item/cain_and_abel/proc/handle_wisps(mob/living/user) + var/should_remove = length(current_wisps) > combo_count + var/wisps_to_alter = abs(combo_count - length(current_wisps)) + + for(var/i = 1, i <= wisps_to_alter, i++) + if(!should_remove) + add_wisp(user) + continue + var/obj/my_wisp = current_wisps[i] + remove_wisp(my_wisp) + +/obj/item/cain_and_abel/proc/add_wisp(mob/living/user) + var/obj/effect/overlay/blood_wisp/new_wisp = new(src) + current_wisps += new_wisp + var/list/position = wisp_offsets[length(current_wisps)] + user.vis_contents += new_wisp + new_wisp.pixel_x = position[1] + new_wisp.pixel_y = position[2] + RegisterSignal(new_wisp, COMSIG_QDELETING, PROC_REF(on_wisp_delete)) + +/obj/item/cain_and_abel/proc/on_wisp_delete(datum/source) + SIGNAL_HANDLER + current_wisps -= source + UnregisterSignal(source, COMSIG_QDELETING) + +/obj/item/cain_and_abel/proc/fire_wisp(atom/user, atom/target) + user.fire_projectile(/obj/projectile/dagger_wisp, target) + +/obj/item/cain_and_abel/proc/remove_wisp(obj/wisp_to_remove) + animate(wisp_to_remove, alpha = 0, time = 0.2 SECONDS) + QDEL_IN(wisp_to_remove, 0.2 SECONDS) diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm new file mode 100644 index 0000000000000..55f3d564901e1 --- /dev/null +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm @@ -0,0 +1,26 @@ +/datum/action/cooldown/dagger_swing + name = "Dagger swing" + desc = "Swing your daggers around." + button_icon = 'icons/obj/mining_zones/artefacts.dmi' + button_icon_state = "cain_and_abel" + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + cooldown_time = 20 SECONDS + +/datum/action/cooldown/dagger_swing/Activate(atom/target_atom) + . = ..() + var/mob/living/living_owner = owner + living_owner.apply_status_effect(/datum/status_effect/dagger_swinging) + + var/static/list/possible_sounds = list( + 'sound/items/weapons/cain_and_abel/dagger_slash_1.ogg', + 'sound/items/weapons/cain_and_abel/dagger_slash_2.ogg', + 'sound/items/weapons/cain_and_abel/dagger_slash_3.ogg', + 'sound/items/weapons/cain_and_abel/dagger_slash_4.ogg', + 'sound/items/weapons/cain_and_abel/dagger_slash_5.ogg', + 'sound/items/weapons/cain_and_abel/dagger_slash_6.ogg', + ) + + var/list/sounds_to_pick_from = possible_sounds.Copy() + for(var/index in 0 to 5) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, pick_n_take(sounds_to_pick_from), 65, TRUE), 0.15 SECONDS * index) diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm new file mode 100644 index 0000000000000..a50cc4e177405 --- /dev/null +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_effects.dm @@ -0,0 +1,209 @@ +//effect when we're swinging wildly around +/obj/effect/temp_visual/dagger_slash + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE + layer = ABOVE_HUD_PLANE + icon = 'icons/effects/160x160.dmi' + icon_state = "dagger_slash" + pixel_y = -64 + base_pixel_y = -64 + pixel_x = -64 + base_pixel_x = -64 + duration = 1.75 SECONDS + +/obj/effect/temp_visual/dagger_slash/Initialize() + . = ..() + animate(src, alpha = 0, time = 1.75 SECONDS) + +//flames we collect around our body +/obj/effect/overlay/blood_wisp + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE + layer = ABOVE_HUD_PLANE + icon = 'icons/effects/effects.dmi' + icon_state = "blood_wisp" + light_power = 2 + light_range = 2 + light_color = "#d74e63" + +//blade we hurl +/obj/projectile/dagger + name = "Cain" + icon = 'icons/effects/effects.dmi' + icon_state = "cain_abel_attack" + damage = 10 + range = 9 + light_power = 2 + light_range = 2 + light_color = "#589ac9" + speed = 3 + can_hit_turfs = TRUE + hitsound = 'sound/items/weapons/zipline_hit.ogg' + ///effect we leave by after hit + var/effect_left = /obj/effect/temp_visual/dagger_engraved + +/obj/projectile/dagger/proc/dagger_effects(atom/target) + if(QDELETED(target)) + return null + var/turf/target_turf = get_turf(target) + if(isgroundlessturf(target_turf)) + return null + var/obj/effect/temp_visual/dagger_engraved/engraved = new effect_left(target_turf) + firer.Beam(engraved, icon_state = "chain", icon = 'icons/obj/mining_zones/artefacts.dmi', maxdistance = 9, layer = BELOW_MOB_LAYER) + return engraved + +/obj/projectile/dagger/crystal + effect_left = /obj/effect/temp_visual/dagger_engraved/crystals + +/obj/projectile/dagger/launch + effect_left = /obj/effect/temp_visual/dagger_engraved/launch + +/obj/projectile/dagger/launch/dagger_effects(atom/target) + . = ..() + if(isnull(.)) + return + var/obj/effect/temp_visual/dagger_engraved/launch/launching_dagger = . + launching_dagger.launch(firer) + +//effect when monsters step on our crystals +/obj/effect/temp_visual/dagger_lightning + icon = 'icons/effects/effects.dmi' + icon_state = "lightning" + light_color = "#3d50db" + duration = 1.25 SECONDS + +//dagger engraved to the floor +/obj/effect/temp_visual/dagger_engraved + icon = 'icons/effects/effects.dmi' + icon_state = "cain_abel_engraved" + light_color = "#5767e1" + light_power = 2 + light_range = 2 + duration = 3 SECONDS + +//the dagger thatll launch us toward it +/obj/effect/temp_visual/dagger_engraved/launch + +/obj/effect/temp_visual/dagger_engraved/launch/proc/launch(mob/living/firer) + firer.throw_at(target = src, range = 9, speed = 1, spin = FALSE, gentle = TRUE, throw_type_path = /datum/thrownthing/dagger_launch) + +//throw datum the cain and abel applies +/datum/thrownthing/dagger_launch + ///traits we apply to the user when being launched + var/static/list/traits_on_launch = list( + TRAIT_IMMOBILIZED, + TRAIT_MOVE_FLOATING, + ) + +/datum/thrownthing/dagger_launch/New(thrownthing, target, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone) + . = ..() + if(isnull(thrownthing)) + return + var/atom/thrown_atom = thrownthing + thrown_atom.add_traits(traits_on_launch, REF(src)) + new /obj/effect/temp_visual/mook_dust(get_turf(thrownthing)) + +/datum/thrownthing/dagger_launch/finalize(hit, target) + if(thrownthing) + new /obj/effect/temp_visual/mook_dust(get_turf(thrownthing)) + return ..() + +/datum/thrownthing/dagger_launch/Destroy() + if(thrownthing) + thrownthing.remove_traits(traits_on_launch, REF(src)) + var/obj/effect/temp_visual/dagger_engraved/launch/target_dagger = initial_target?.resolve() + if(istype(target_dagger)) + qdel(target_dagger) + return ..() + +//dagger thatll spring up crystals +/obj/effect/temp_visual/dagger_engraved/crystals + light_power = 1 + light_range = 1 + +/obj/effect/temp_visual/dagger_engraved/crystals/Initialize(mapload) + . = ..() + for(var/index in 0 to 2) + addtimer(CALLBACK(src, PROC_REF(generate_crystals), index), index * 0.5 SECONDS) + +/obj/effect/temp_visual/dagger_engraved/crystals/proc/generate_crystals(range) + if(range == 0) + new /obj/effect/temp_visual/dagger_crystal(get_turf(src)) + return + + playsound(src, 'sound/items/weapons/crystal_dagger_sound.ogg', 60, vary = TRUE, pressure_affected = FALSE) + var/list/turfs_to_crystalize = border_diamond_range_turfs(src, range) + for(var/turf/turf_to_crystalize as anything in turfs_to_crystalize) + new /obj/effect/temp_visual/dagger_crystal(turf_to_crystalize) + +//effect when our whisps hit something +/obj/effect/temp_visual/wisp_explosion + icon = 'icons/effects/effects.dmi' + icon_state = "wisp_hit" + layer = ABOVE_ALL_MOB_LAYER + light_power = 2 + light_range = 2 + light_color = "#d74e63" + duration = 0.5 SECONDS + +/obj/effect/temp_visual/wisp_explosion/Initialize(mapload) + . = ..() + playsound(get_turf(src), 'sound/items/weapons/effects/blood_wisp_explode.ogg', 60, vary = TRUE, pressure_affected = FALSE) + +//painful crystals to step on +/obj/effect/temp_visual/dagger_crystal + icon = 'icons/effects/effects.dmi' + icon_state = "cain_abel_crystal" + duration = 3 SECONDS + light_range = 3 + light_power = 2 + light_color = "#3db9db" + ///damage we apply to mobs who step on us + var/applied_damage = 50 + +/obj/effect/temp_visual/dagger_crystal/Initialize(mapload) + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + + for(var/mob/living/victim in get_turf(src)) + if(victim.mob_size < MOB_SIZE_LARGE) + continue + apply_crystal_effects(victim) + addtimer(CALLBACK(src, PROC_REF(dissappear_gracefully)), duration - 1 SECONDS) + +/obj/effect/temp_visual/dagger_crystal/proc/on_entered(datum/source, mob/living/entered_living) + SIGNAL_HANDLER + if(!istype(entered_living) || entered_living.mob_size < MOB_SIZE_LARGE) + return + apply_crystal_effects(entered_living) + +/obj/effect/temp_visual/dagger_crystal/proc/apply_crystal_effects(mob/living/victim) + victim.apply_status_effect(/datum/status_effect/dagger_stun) + victim.apply_damage(applied_damage, BRUTE) + +/obj/effect/temp_visual/dagger_crystal/proc/dissappear_gracefully() + animate(src, alpha = 0, time = 0.9 SECONDS) + +//wisp we hurl at monsters +/obj/projectile/dagger_wisp + name = "dagger wisp" + damage = 25 + armor_flag = BOMB + light_power = 2 + light_range = 2 + light_color = "#d74e63" + icon = 'icons/effects/effects.dmi' + icon_state = "blood_wisp" + +/obj/projectile/dagger_wisp/Initialize(mapload) + . = ..() + transform = transform.Scale(1, -1) + +/obj/projectile/dagger_wisp/on_hit(atom/target, blocked, pierce_hit) + . = ..() + new /obj/effect/temp_visual/wisp_explosion(get_turf(target)) diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_status_effects.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_status_effects.dm new file mode 100644 index 0000000000000..b42c04e1689e4 --- /dev/null +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_status_effects.dm @@ -0,0 +1,98 @@ +///status effect applied to us when we're wildly swinging +/datum/status_effect/dagger_swinging + id = "dagger swinging" + tick_interval = 0.25 SECONDS + duration = 1.75 SECONDS + alert_type = null + +/datum/status_effect/dagger_swinging/on_apply() + . = ..() + if(!.) + return + var/obj/effect/temp_visual/dagger_slash/slash_effect = new + owner.vis_contents += slash_effect + ADD_TRAIT(owner, TRAIT_TENTACLE_IMMUNE, REF(src)) + RegisterSignal(owner, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) + RegisterSignal(owner, COMSIG_LIVING_CHECK_BLOCK, PROC_REF(block_attack)) + +/datum/status_effect/dagger_swinging/tick(seconds_between_ticks) + if(!isturf(owner.loc)) + return + + var/mob_hit = FALSE + for(var/mob/living/target_mob in oview(owner, 1)) + if(target_mob.mob_size < MOB_SIZE_LARGE) + continue + target_mob.apply_damage(25, BRUTE) + mob_hit = TRUE + + if(mob_hit) + playsound(owner, 'sound/items/weapons/bladeslice.ogg', 75, FALSE) //just play it once + +/datum/status_effect/dagger_swinging/proc/hit_by_projectile(mob/living/swinger, obj/projectile/projectile, hit_area) + SIGNAL_HANDLER + + if(!isturf(owner.loc)) + return NONE + + playsound(swinger, 'sound/items/weapons/parry.ogg', 75, TRUE) + + var/obj/effect/temp_visual/guardian/phase/out/parry_effect = new + parry_effect.pixel_x = rand(-4, 4) + parry_effect.pixel_y = rand(-10, 10) + owner.vis_contents += parry_effect + + projectile.firer = swinger + projectile.set_angle(-projectile.angle) + return COMPONENT_BULLET_PIERCED + +/datum/status_effect/dagger_swinging/proc/block_attack( + mob/living/source, + atom/hitby, + damage, + attack_text, + attack_type, + armour_penetration, + damage_type, + attack_flag, +) + SIGNAL_HANDLER + + if(attack_type == PROJECTILE_ATTACK || damage >= 75 || damage <= 0 || damage_type == STAMINA) + return NONE + + playsound(owner, 'sound/items/weapons/parry.ogg', 75, TRUE) + new /obj/effect/temp_visual/guardian/phase/out(get_turf(owner)) + return SUCCESSFUL_BLOCK + +/datum/status_effect/dagger_swinging/on_remove() + . = ..() + REMOVE_TRAIT(owner, TRAIT_TENTACLE_IMMUNE, REF(src)) + +///status effect applied to enemies who step on crystals +/datum/status_effect/dagger_stun + id = "dagger stun" + tick_interval = STATUS_EFFECT_NO_TICK + duration = 2 SECONDS + alert_type = null + ///overlay we apply to stunned enemies + var/static/mutable_appearance/stun_lightning = mutable_appearance('icons/effects/effects.dmi', "lightning", layer = ABOVE_ALL_MOB_LAYER) + +/datum/status_effect/dagger_stun/on_apply() + . = ..() + if(!.) + return + + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) + ADD_TRAIT(owner, TRAIT_AI_PAUSED, REF(src)) + owner.update_appearance() + +/datum/status_effect/dagger_stun/on_remove() + . = ..() + REMOVE_TRAIT(owner, TRAIT_AI_PAUSED, REF(src)) + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + owner.update_appearance() + +/datum/status_effect/dagger_stun/proc/on_overlays_updated(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + overlays += stun_lightning diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm new file mode 100644 index 0000000000000..529390c26ee83 --- /dev/null +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm @@ -0,0 +1,63 @@ +#define THROW_CRYSTALS_COOLDOWN 15 SECONDS +#define THROW_LAUNCH_COOLDOWN 7 SECONDS + +/obj/item/cain_and_abel/on_thrown(mob/living/carbon/user, atom/target) + . = null + if(!COOLDOWN_FINISHED(src, throw_cooldown)) + user.balloon_alert(user, "on cooldown!") + return + + if(user.incapacitated || HAS_TRAIT(user, TRAIT_NO_THROWING) || !isturf(user.loc) || user.buckled) + user.balloon_alert(user, "unable!") + return + + if(get_dist(target, user) > 9) + user.balloon_alert(user, "too far away!") + return + + var/static/list/throw_options = list( + THROW_MODE_LAUNCH = list( + "cooldown" = THROW_LAUNCH_COOLDOWN, + "projectile" = /obj/projectile/dagger/launch, + ), + THROW_MODE_CRYSTALS = list( + "cooldown" = THROW_CRYSTALS_COOLDOWN, + "projectile" = /obj/projectile/dagger/crystal, + ), + ) + + var/list/throw_settings = throw_options[throw_mode] + COOLDOWN_START(src, throw_cooldown, throw_settings["cooldown"]) + var/atom/dagger = user.fire_projectile(throw_settings["projectile"], target, 'sound/items/weapons/fwoosh.ogg', user) + if(isnull(dagger)) + return + + set_dagger_icon(thrown = TRUE) //when we throw a dagger, we'll only be holding 1 + user.Beam(dagger, icon_state = "chain", icon = 'icons/obj/mining_zones/artefacts.dmi', maxdistance = 9, layer = BELOW_MOB_LAYER) + RegisterSignal(dagger, COMSIG_QDELETING, PROC_REF(reset_dagger_icon)) + RegisterSignal(dagger, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(on_dagger_hit)) + +/obj/item/cain_and_abel/proc/on_dagger_hit(obj/projectile/dagger/source, atom/movable/firer, atom/target, Angle) + SIGNAL_HANDLER + + UnregisterSignal(source, list(COMSIG_QDELETING, COMSIG_PROJECTILE_SELF_ON_HIT)) + if(!ismob(loc)) + return + + var/atom/dagger_visual = source.dagger_effects(target) + if(!QDELETED(dagger_visual)) + RegisterSignal(dagger_visual, COMSIG_QDELETING, PROC_REF(reset_dagger_icon)) + return + + set_dagger_icon(thrown = FALSE) + +/obj/item/cain_and_abel/proc/set_dagger_icon(thrown = FALSE) + inhand_icon_state = "[src::inhand_icon_state][thrown ? "_thrown" : ""]" + update_inhand_icon() + +/obj/item/cain_and_abel/proc/reset_dagger_icon(datum/source) + SIGNAL_HANDLER + set_dagger_icon(thrown = FALSE) + +#undef THROW_CRYSTALS_COOLDOWN +#undef THROW_LAUNCH_COOLDOWN diff --git a/code/modules/mob/living/basic/jungle/leaper/leaper.dm b/code/modules/mob/living/basic/jungle/leaper/leaper.dm index d4f310d07aba1..da957e72117fe 100644 --- a/code/modules/mob/living/basic/jungle/leaper/leaper.dm +++ b/code/modules/mob/living/basic/jungle/leaper/leaper.dm @@ -92,7 +92,7 @@ if(living_overlay) . += living_overlay -/mob/living/basic/leaper/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) +/mob/living/basic/leaper/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE, throw_type_path = /datum/thrownthing) ADD_TRAIT(src, TRAIT_IMMOBILIZED, LEAPING_TRAIT) return ..() diff --git a/code/modules/mob/living/basic/lavaland/mook/mook.dm b/code/modules/mob/living/basic/lavaland/mook/mook.dm index bc8615ff64744..b16f729f247dd 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook.dm @@ -150,7 +150,7 @@ . += ore_overlay -/mob/living/basic/mining/mook/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) +/mob/living/basic/mining/mook/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE, throw_type_path = /datum/thrownthing) change_combatant_state(state = MOOK_ATTACK_ACTIVE) return ..() diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 85b0adb00014e..08d0e8b8851ae 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -103,7 +103,7 @@ if(CanHug(AM) && Adjacent(AM)) return Leap(AM) -/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle, quickstart = TRUE) +/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle, quickstart = TRUE, throw_type_path = /datum/thrownthing) . = ..() if(!.) return diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 499282d312a4e..5d947c86a6f98 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1477,7 +1477,7 @@ /mob/living/carbon/alien/update_stamina() return -/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) +/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE, throw_type_path = /datum/thrownthing) stop_pulling() . = ..() diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 41c285d46a5d8..5f0cc57ba0230 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -109,5 +109,5 @@ hit_human.Paralyze(4 SECONDS) hit_human.emote("scream") -/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE) +/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE, throw_type_path = /datum/thrownthing) return ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) diff --git a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm index 2df0c85f470e1..18980b21b1173 100644 --- a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm +++ b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm @@ -33,7 +33,7 @@ hit_living.electrocute_act(80, src, flags = SHOCK_ILLUSION | SHOCK_NOGLOVES) qdel(src) -/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, gentle, quickstart = TRUE) +/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, gentle, quickstart = TRUE, throw_type_path = /datum/thrownthing) . = ..() if(ishuman(thrower)) var/mob/living/carbon/human/human_thrower = thrower diff --git a/icons/effects/160x160.dmi b/icons/effects/160x160.dmi index 7a9d9041162a9..a63c813149b47 100644 Binary files a/icons/effects/160x160.dmi and b/icons/effects/160x160.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 278edffb855e8..bd776cd78b2a0 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi index 3d8843c85758e..eee115e1392da 100644 Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ diff --git a/icons/obj/mining_zones/artefacts.dmi b/icons/obj/mining_zones/artefacts.dmi index a12fdb670429b..b03508ce84cbf 100644 Binary files a/icons/obj/mining_zones/artefacts.dmi and b/icons/obj/mining_zones/artefacts.dmi differ diff --git a/sound/attributions.txt b/sound/attributions.txt index 76670aede8513..382157887cace 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -221,4 +221,10 @@ sound/items/dice_roll.ogg -- https://freesound.org/people/Crovic/sounds/661935/ sound/items/handling/materials/snow_drop.ogg and sound/items/handling/materials/snow_pick_up.ogg -- https://freesound.org/people/Vrymaa/sounds/775014/ by Vrymaa (CC0) -sound/items/hair-clippers.ogg -- https://freesound.org/people/VIPERSTRONG/sounds/655747/ -- by VIPERSTRONG (CC0) \ No newline at end of file +sound/items/hair-clippers.ogg -- https://freesound.org/people/VIPERSTRONG/sounds/655747/ -- by VIPERSTRONG (CC0) + +sound/items/weapons/cain_and_abel/dagger_slash_1 to dagger_slash_6 -- https://pixabay.com/sound-effects/whooshslash-sounds-different-pitches-vol2-187377/ by Ponjisk + +sound/items/weapons/crystal_dagger_sound.ogg -- https://pixabay.com/sound-effects/breaking-glass-with-feet-45176/ freesound community + +'sound/items/weapons/effects/blood_wisp_explode.ogg' -- https://pixabay.com/sound-effects/fire-sound-effects-224089/ by Alice-soundz diff --git a/sound/items/weapons/cain_and_abel/dagger_slash_1.ogg b/sound/items/weapons/cain_and_abel/dagger_slash_1.ogg new file mode 100644 index 0000000000000..2efbb6591ce62 Binary files /dev/null and b/sound/items/weapons/cain_and_abel/dagger_slash_1.ogg differ diff --git a/sound/items/weapons/cain_and_abel/dagger_slash_2.ogg b/sound/items/weapons/cain_and_abel/dagger_slash_2.ogg new file mode 100644 index 0000000000000..27372a5328228 Binary files /dev/null and b/sound/items/weapons/cain_and_abel/dagger_slash_2.ogg differ diff --git a/sound/items/weapons/cain_and_abel/dagger_slash_3.ogg b/sound/items/weapons/cain_and_abel/dagger_slash_3.ogg new file mode 100644 index 0000000000000..d2cff2890e7d7 Binary files /dev/null and b/sound/items/weapons/cain_and_abel/dagger_slash_3.ogg differ diff --git a/sound/items/weapons/cain_and_abel/dagger_slash_4.ogg b/sound/items/weapons/cain_and_abel/dagger_slash_4.ogg new file mode 100644 index 0000000000000..0f03ef82eb789 Binary files /dev/null and b/sound/items/weapons/cain_and_abel/dagger_slash_4.ogg differ diff --git a/sound/items/weapons/cain_and_abel/dagger_slash_5.ogg b/sound/items/weapons/cain_and_abel/dagger_slash_5.ogg new file mode 100644 index 0000000000000..d404724b8f055 Binary files /dev/null and b/sound/items/weapons/cain_and_abel/dagger_slash_5.ogg differ diff --git a/sound/items/weapons/cain_and_abel/dagger_slash_6.ogg b/sound/items/weapons/cain_and_abel/dagger_slash_6.ogg new file mode 100644 index 0000000000000..f4b120220f40a Binary files /dev/null and b/sound/items/weapons/cain_and_abel/dagger_slash_6.ogg differ diff --git a/sound/items/weapons/crystal_dagger_sound.ogg b/sound/items/weapons/crystal_dagger_sound.ogg new file mode 100644 index 0000000000000..2b55a8b770d24 Binary files /dev/null and b/sound/items/weapons/crystal_dagger_sound.ogg differ diff --git a/sound/items/weapons/effects/blood_wisp_explode.ogg b/sound/items/weapons/effects/blood_wisp_explode.ogg new file mode 100644 index 0000000000000..c097c5523ca9d Binary files /dev/null and b/sound/items/weapons/effects/blood_wisp_explode.ogg differ diff --git a/tgstation.dme b/tgstation.dme index fd819ded94823..62747edf0cdad 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4804,6 +4804,11 @@ #include "code\modules\mining\lavaland\megafauna_loot.dm" #include "code\modules\mining\lavaland\necropolis_chests.dm" #include "code\modules\mining\lavaland\tendril_loot.dm" +#include "code\modules\mining\lavaland\cain_and_abel\_cain_and_abel.dm" +#include "code\modules\mining\lavaland\cain_and_abel\dagger_abilities.dm" +#include "code\modules\mining\lavaland\cain_and_abel\dagger_effects.dm" +#include "code\modules\mining\lavaland\cain_and_abel\dagger_status_effects.dm" +#include "code\modules\mining\lavaland\cain_and_abel\dagger_throw.dm" #include "code\modules\mob\emote.dm" #include "code\modules\mob\inventory.dm" #include "code\modules\mob\login.dm"