From f55aafcc6845250e1004e8a36a06443b46b04ea6 Mon Sep 17 00:00:00 2001 From: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com> Date: Tue, 22 Nov 2022 02:21:18 -0500 Subject: [PATCH] Adds the Marksman Revolver from Ultrakill, with coinflipping and splitshotting! (#70612) ## About The Pull Request Ultrakill is a neat game that I like, and I like to add fun things from things I like. This PR adds the marksman revolver as an admin-only weapon, complete with coin flipping and splitshotting mechanics! [Have a video demonstration!](https://streamable.com/5x4mnj) Basically, right clicking on a visible tile flips a coin towards a random adjacent tile to the one you targeted. Shooting the coin projectile with the hitscan primary fire while it's within one tile of the target will trigger a splitshot. Those two child splitshots will roughly follow the priority order of Ultrakill (prioritizing coins [for even more splits!], then nearby mobs, then less nearby mobs, then other random stuff nearby). I plan to add other stuff for the shots to prioritize like fuel tanks, windows, and others. I'm still working out some of the finer details of balance and more closely matching how it works to UK (while still working in the realm of SS13), and of course I hope to get unique sprites/sounds/whatever. ## Why It's Good For The Game Adds more funny/unique things for admins to spawn in. ## Changelog :cl: Ryll/Shaps add: Added the Marksman Revolver, for admins to spawn. /:cl: --- code/__DEFINES/traits.dm | 3 + .../temporary_visuals/projectiles/muzzle.dm | 3 + .../temporary_visuals/projectiles/tracer.dm | 6 + .../projectiles/ammunition/energy/special.dm | 6 + .../projectiles/guns/energy/special.dm | 61 ++++++ .../projectiles/projectile/bullets/special.dm | 173 ++++++++++++++++++ icons/obj/weapons/guns/projectiles_tracer.dmi | Bin 5572 -> 5564 bytes sound/effects/coin2.ogg | Bin 0 -> 12198 bytes 8 files changed, 252 insertions(+) create mode 100644 sound/effects/coin2.ogg diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index e0ff56dd136..4cb05789f4e 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -976,3 +976,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define LEFT_ARM_TRAIT "left_arm" #define RIGHT_LEG_TRAIT "right_leg" #define LEFT_LEG_TRAIT "left_leg" + +/// This target has recently been shot by a marksman coin and is very briefly immune to being hit by one again to prevent recursion +#define TRAIT_RECENTLY_COINED "trait_recently_coined" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm index 9b7794bf61c..808a4f50559 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm @@ -38,3 +38,6 @@ /obj/effect/projectile/muzzle/sniper icon_state = "sniper" + +/obj/effect/projectile/muzzle/bullet + icon_state = "muzzle_bullet" diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index ed350c25c69..14b7f43a822 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -59,6 +59,12 @@ name = "solar beam" icon_state = "solar" +/obj/effect/projectile/tracer/solar/thin + icon_state = "solar_thin" + +/obj/effect/projectile/tracer/solar/thinnest + icon_state = "solar_thinnest" + //BEAM RIFLE /obj/effect/projectile/tracer/tracer/beam_rifle icon_state = "tracer_beam" diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index 6f3ddb5fd86..bedfab7b235 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -68,3 +68,9 @@ projectile_type = /obj/projectile/beam/shrink select_name = "shrink ray" e_cost = 200 + +/obj/item/ammo_casing/energy/marksman + projectile_type = /obj/projectile/bullet/marksman + select_name = "marksman nanoshot" + e_cost = 0 + fire_sound = 'sound/weapons/gun/revolver/shot_alt.ogg' diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index bc362f23471..1d6a02144a1 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -375,3 +375,64 @@ /obj/item/gun/energy/tesla_cannon/Initialize(mapload) . = ..() AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) + +/obj/item/gun/energy/marksman_revolver + name = "marksman revolver" + desc = "Uses electric pulses to fire microscopic pieces of metal at incredibly high speeds. Alternate fire flips a coin that can be targeted for extra firepower." + icon = 'icons/obj/weapons/guns/ballistic.dmi' + icon_state = "revolver" + ammo_type = list(/obj/item/ammo_casing/energy/marksman) + fire_sound = 'sound/weapons/gun/revolver/shot_alt.ogg' + automatic_charge_overlays = FALSE + /// How many coins we can have at a time. Set to 0 for infinite + var/max_coins = 4 + /// How many coins we currently have available + var/coin_count = 0 + /// How long it takes to regen a coin + var/coin_regen_rate = 2 SECONDS + /// The cooldown for regenning coins + COOLDOWN_DECLARE(coin_regen_cd) + +/obj/item/gun/energy/marksman_revolver/Initialize(mapload) + . = ..() + coin_count = max_coins + +/obj/item/gun/energy/marksman_revolver/examine(mob/user) + . = ..() + if(max_coins) + . += "It currently has [coin_count] out of [max_coins] coins, and takes [coin_regen_rate/10] seconds to recharge each one." + else + . += "It has infinite coins available for use." + +/obj/item/gun/energy/marksman_revolver/process(delta_time) + if(!max_coins || coin_count >= max_coins) + STOP_PROCESSING(SSobj, src) + return + + if(COOLDOWN_FINISHED(src, coin_regen_cd)) + if(ismob(loc)) + var/mob/owner = loc + owner.playsound_local(owner, 'sound/machines/ding.ogg', 20) + coin_count++ + COOLDOWN_START(src, coin_regen_cd, coin_regen_rate) + +/obj/item/gun/energy/marksman_revolver/afterattack_secondary(atom/target, mob/living/user, params) + if(!can_see(user, get_turf(target), length = 9)) + return ..() + + if(max_coins && coin_count <= 0) + to_chat(user, span_warning("You don't have any coins right now!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(max_coins) + START_PROCESSING(SSobj, src) + coin_count = max(0, coin_count - 1) + + var/turf/target_turf = get_offset_target_turf(target, rand(-1, 1), rand(-1, 1)) // choose a random tile adjacent to the clicked one + playsound(user.loc, 'sound/effects/coin2.ogg', 50, TRUE) + user.visible_message(span_warning("[user] flips a coin towards [target]!"), span_danger("You flip a coin towards [target]!")) + var/obj/projectile/bullet/coin/new_coin = new(get_turf(user), target_turf, user) + new_coin.preparePixelProjectile(target_turf, user) + new_coin.fire() + + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index 06dc98ed84d..09a0fbf3bc4 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -38,3 +38,176 @@ var/mob/living/living_target = target living_target.set_silence_if_lower(20 SECONDS) + + +// Marksman Revolver + Ricochet Coin + +/// Marksman Shot +/obj/projectile/bullet/marksman + name = "marksman nanoshot" + hitscan = TRUE + damage = 30 + tracer_type = /obj/effect/projectile/tracer/solar + muzzle_type = /obj/effect/projectile/muzzle/bullet + impact_type = /obj/effect/projectile/impact/sniper + /// How many ricochets deep this is, for tracer size + var/ricoshot_level = 0 + +/obj/projectile/bullet/marksman/Initialize(mapload, obj/item/ammo_casing/casing, incoming_ricoshot_level) + . = ..() + if(isnum(incoming_ricoshot_level)) + ricoshot_level = incoming_ricoshot_level + + switch(ricoshot_level) + if(0) + tracer_type = /obj/effect/projectile/tracer/solar/thinnest + if(1) + tracer_type = /obj/effect/projectile/tracer/solar/thin + if(2 to INFINITY) + tracer_type = /obj/effect/projectile/tracer/solar + +/obj/projectile/bullet/marksman/scan_moved_turf() + var/turf/cur_turf = get_turf(src) // check to see if we're passing over a turf with a coin on it + var/obj/projectile/bullet/coin/coin_check = cur_turf ? locate(/obj/projectile/bullet/coin) in cur_turf.contents : null + + if(!coin_check || (ricoshot_level == 0 && get_dist(coin_check.target_turf, coin_check) >= 1) || coin_check.used) // no coin, keep trucking + return ..() + + coin_check.check_splitshot(firer, src) + Impact(coin_check) + +/// Marksman Coin +/obj/projectile/bullet/coin + name = "marksman coin" + icon_state = "coinshot" + pixel_speed_multiplier = 0.333 + speed = 1 + damage = 5 + color = "#dbdd4c" + + /// Save the turf we're aiming for for future use + var/turf/target_turf + /// Coins are valid while within a tile of their target tile, and can only be directly ricoshot during this time. + var/valid = FALSE + /// When a coin has been activated, is is marked as used, so that it is taken out of consideration for any further ricochets + var/used = FALSE + /// When this coin is targeted with a valid splitshot, it creates this many child splitshots + var/num_of_splitshots = 2 + /// The crosshair icon put on the targeted turf for the user- so we can remove it from their images when done + var/image/crosshair_indicator + /// The mob who originally flipped this coin, as a matter of convenience, may be able tto be removed + var/mob/original_firer + +/obj/projectile/bullet/coin/Initialize(mapload, turf/the_target, mob/original_firer) + src.original_firer = original_firer + target_turf = the_target + range = (get_dist(original_firer, target_turf) + 3) * 3 // 3 tiles past the origin (the *3 is because Range() ticks 3 times a tile because of the slower speed) + + . = ..() + + if(!istype(original_firer) || !original_firer.client) + return + + var/client/firing_client = original_firer.client + crosshair_indicator = image('icons/obj/supplypods_32x32.dmi', target_turf, "LZ") + firing_client.images += crosshair_indicator + +/obj/projectile/bullet/coin/Destroy() + remove_crosshair_indicator() + return ..() + +// the coin must be on the target turf to be directly targetable +/obj/projectile/bullet/coin/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + if(!valid && get_dist(loc, target_turf) < 1) + original_firer?.playsound_local(src, 'sound/machines/ping.ogg', 30) + valid = TRUE + else if(valid && get_dist(loc, target_turf) > 1) + valid = FALSE + remove_crosshair_indicator() + +/// Remove the crosshair indicator from the original firer if it exists +/obj/projectile/bullet/coin/proc/remove_crosshair_indicator() + if(original_firer?.client && crosshair_indicator) + original_firer.client.images -= crosshair_indicator + QDEL_NULL(crosshair_indicator) + +/// We've been shot by a marksman revolver shot, or the ricochet off another coin, check if we can actually ricochet. The forced var being TRUE means it's a ricochet from another coin +/obj/projectile/bullet/coin/proc/check_splitshot(mob/living/shooter, obj/projectile/bullet/marksman/incoming_shot, forced = FALSE) + if(!forced && get_dist(src, target_turf) > 1) + return FALSE + + used = TRUE + var/turf/cur_tur = get_turf(src) + cur_tur.visible_message(span_nicegreen("[incoming_shot] impacts [src] and splits!")) + iterate_splitshots(shooter, incoming_shot) + QDEL_IN(src, 0.25 SECONDS) // may not be needed + +/// Now we actually create all the splitshots, loop through however many splits we'll create and fire them +/obj/projectile/bullet/coin/proc/iterate_splitshots(mob/living/shooter, obj/projectile/incoming_shot) + for(var/i in 1 to num_of_splitshots) + fire_splitshot(incoming_shot) + +/// Shoot an individual splitshot at a new target +/obj/projectile/bullet/coin/proc/fire_splitshot(obj/projectile/bullet/marksman/incoming_shot) + var/atom/next_target = find_next_target() + + ADD_TRAIT(next_target, TRAIT_RECENTLY_COINED, "[type]") + addtimer(TRAIT_CALLBACK_REMOVE(next_target, TRAIT_RECENTLY_COINED, "[type]"), 0.5 SECONDS) + var/outgoing_ricoshot_level = incoming_shot.ricoshot_level + 1 + var/obj/projectile/bullet/marksman/new_splitshot = new /obj/projectile/bullet/marksman(get_turf(src), null, outgoing_ricoshot_level) + //Shooting Code: + new_splitshot.original = next_target + new_splitshot.fired_from = incoming_shot.fired_from + new_splitshot.firer = incoming_shot.firer + new_splitshot.damage = 2 * incoming_shot.damage + + var/current_turf = get_turf(src) + var/target_turf = get_turf(next_target) + + if(Adjacent(current_turf, target_turf)) + new_splitshot.fire(get_angle(current_turf, target_turf), direct_target = next_target) + else + new_splitshot.preparePixelProjectile(next_target, get_turf(src)) + new_splitshot.fire() + + if(istype(next_target, /obj/projectile/bullet/coin)) // handle further splitshot checks + var/obj/projectile/bullet/coin/our_coin = next_target + our_coin.check_splitshot(incoming_shot.firer, new_splitshot, forced = TRUE) + +/// Find what the splitshots will want to target next, with the order roughly based off the UK coin +/obj/projectile/bullet/coin/proc/find_next_target() + var/list/valid_targets = shuffle(oview(4, loc)) + valid_targets -= firer + + for(var/obj/projectile/bullet/coin/iter_coin in valid_targets) + if(!iter_coin.used) // this will prevent shooting itself as well + return iter_coin + + var/list/possible_victims = list() + + for(var/mob/living/iter_living in valid_targets) + if(HAS_TRAIT(iter_living, TRAIT_RECENTLY_COINED) || iter_living.stat != CONSCIOUS) + continue + + if(get_dist(src, iter_living) <= 2) // prioritize close mobs + return iter_living + possible_victims += iter_living + + if(possible_victims.len) + return pick(possible_victims) + + var/list/static/prioritized_targets = list(/obj/structure/reagent_dispensers, /obj/item/grenade, /obj/structure/window) + for(var/iter_type in prioritized_targets) + for(var/already_coined_tries in 1 to 3) + var/atom/iter_type_check = locate(iter_type) in valid_targets + if(iter_type_check) + if(HAS_TRAIT(iter_type_check, TRAIT_RECENTLY_COINED)) + valid_targets -= iter_type_check + continue + else + return iter_type_check + + for(var/atom/last_ditch in valid_targets) + if(!HAS_TRAIT(last_ditch, TRAIT_RECENTLY_COINED)) + return last_ditch diff --git a/icons/obj/weapons/guns/projectiles_tracer.dmi b/icons/obj/weapons/guns/projectiles_tracer.dmi index b4edd672ac9faa854b511bfa41b0d7fd414aa5ef..b66fa7b7aaf969929721fa6513e18fa0468a62e9 100644 GIT binary patch literal 5564 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 literal 5572 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 literal 0 HcmV?d00001