diff --git a/code/modules/projectiles/guns/energy/hooklauncher.dm b/code/modules/projectiles/guns/energy/hooklauncher.dm index 2c170544a0..79ddf7443d 100644 --- a/code/modules/projectiles/guns/energy/hooklauncher.dm +++ b/code/modules/projectiles/guns/energy/hooklauncher.dm @@ -5,12 +5,14 @@ /obj/item/weapon/gun/energy/hooklauncher name = "gravity whip" desc = "A large, strange gauntlet." + icon = 'icons/obj/gun2.dmi' icon_state = "gravwhip" item_state = "gravwhip" fire_sound_text = "laser blast" fire_delay = 15 charge_cost = 300 + charge_meter = FALSE cell_type = /obj/item/weapon/cell/device/weapon projectile_type = /obj/item/projectile/energy/hook @@ -29,7 +31,6 @@ cell_type = /obj/item/weapon/cell/device/weapon/recharge/alien battery_lock = TRUE charge_cost = 400 - charge_meter = FALSE projectile_type = /obj/item/projectile/energy/hook/ring diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm new file mode 100644 index 0000000000..0b0678894f --- /dev/null +++ b/code/modules/projectiles/guns/magic.dm @@ -0,0 +1,60 @@ +/* + * "Magic" "Guns" + */ + +/obj/item/weapon/gun/magic + name = "staff of nothing" + desc = "This staff is boring to watch because even though it came first you've seen everything it can do in other staves for years." + icon = 'icons/obj/wizard.dmi' + icon_state = "staffofnothing" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_magic.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_magic.dmi', + ) + fire_sound = 'sound/weapons/emitter.ogg' + w_class = ITEMSIZE_HUGE + projectile_type = null + var/checks_antimagic = TRUE + var/max_charges = 6 + var/charges = 0 + var/recharge_rate = 4 + var/charge_tick = 0 + var/can_charge = TRUE + +/obj/item/weapon/gun/magic/consume_next_projectile() + if(checks_antimagic && locate(/obj/item/weapon/nullrod) in usr) return null + if(!ispath(projectile_type)) return null + if(charges <= 0) return null + + charges -= 1 + + return new projectile_type(src) + +/obj/item/weapon/gun/magic/Initialize() + . = ..() + charges = max_charges + if(can_charge) + START_PROCESSING(SSobj, src) + +/obj/item/weapon/gun/magic/Destroy() + if(can_charge) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/weapon/gun/magic/process() + if (charges >= max_charges) + charge_tick = 0 + return + charge_tick++ + if(charge_tick < recharge_rate) + return 0 + charge_tick = 0 + charges++ + return 1 + +/obj/item/weapon/gun/magic/handle_click_empty(mob/user) + if (user) + user.visible_message("*wzhzhzh*", "The [name] whizzles quietly.") + else + src.visible_message("*wzhzh*") + playsound(src, 'sound/weapons/empty.ogg', 100, 1) diff --git a/code/modules/projectiles/guns/magic/fireball.dm b/code/modules/projectiles/guns/magic/fireball.dm new file mode 100644 index 0000000000..4abe3e286e --- /dev/null +++ b/code/modules/projectiles/guns/magic/fireball.dm @@ -0,0 +1,17 @@ + +/obj/item/weapon/gun/magic/firestaff + name = "flaming staff" + desc = "A long, everburning torch." + icon = 'icons/obj/wizard.dmi' + icon_state = "staffoffire" + item_state = "staff" + fire_sound = 'sound/weapons/emitter.ogg' + w_class = ITEMSIZE_HUGE + checks_antimagic = TRUE + max_charges = 6 + charges = 0 + recharge_rate = 4 + charge_tick = 0 + can_charge = TRUE + + projectile_type = /obj/item/projectile/energy/fireball diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8ef1bfe2a6..6cd885f0c1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -739,6 +739,8 @@ shot_from = launcher.name silenced = launcher.silenced + if(user) + firer = user return launch_projectile(target, target_zone, user, params, angle_override, forced_spread) diff --git a/code/modules/projectiles/projectile/hook.dm b/code/modules/projectiles/projectile/hook.dm index ee5fd6c471..3e98319ebd 100644 --- a/code/modules/projectiles/projectile/hook.dm +++ b/code/modules/projectiles/projectile/hook.dm @@ -27,13 +27,15 @@ var/list/help_messages = list("slaps", "pokes", "nudges", "bumps", "pinches") var/done_mob_unique = FALSE // Has the projectile already done something to a mob? + var/datum/beam/chain = null + /obj/item/projectile/energy/hook/launch_projectile(atom/target, target_zone, mob/user, params, angle_override, forced_spread = 0) var/expected_distance = get_dist(target, loc) range = expected_distance // So the hook hits the ground if no mob is hit. target_distance = expected_distance if(firer) // Needed to ensure later checks in impact and on hit function. launcher_intent = firer.a_intent - firer.Beam(src,icon_state=beam_state,icon='icons/effects/beam.dmi',time=60, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=1) + chain = firer.Beam(src,icon_state=beam_state,icon='icons/effects/beam.dmi',time=60, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time=1) if(launcher_intent) switch(launcher_intent) @@ -58,10 +60,22 @@ ..() // Does the regular launching stuff. +/obj/item/projectile/energy/hook/after_move() + if(chain) + var/origin_turf = get_turf(firer) + var/target_turf = get_turf(src) + if(!chain.static_beam && (origin_turf != chain.origin_oldloc || target_turf != chain.target_oldloc)) + chain.origin_oldloc = origin_turf //so we don't keep checking against their initial positions, leading to endless Reset()+Draw() calls + chain.target_oldloc = target_turf + chain.Reset() + chain.Draw() + return + /obj/item/projectile/energy/hook/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) if(..()) perform_intent_unique(target) + /obj/item/projectile/energy/hook/on_impact(var/atom/A) perform_intent_unique(get_turf(A)) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm new file mode 100644 index 0000000000..9fcc1c1979 --- /dev/null +++ b/code/modules/projectiles/projectile/magic.dm @@ -0,0 +1,20 @@ + +/obj/item/projectile/energy/fireball + name = "fireball" + icon_state = "fireball2" + damage = 15 + damage_type = BURN + check_armour = "bomb" + armor_penetration = 25 // It's a great ball of fire. + + combustion = TRUE + +/obj/item/projectile/energy/fireball/on_hit(var/atom/target, var/blocked = 0) + new /obj/effect/explosion(get_turf(target)) + explosion(target, -1, 0, 2) + ..() + +/obj/item/projectile/energy/fireball/on_impact(var/atom/target) + new /obj/effect/explosion(get_turf(target)) + explosion(target, -1, 0, 2) + ..() diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 5555d0e1ad..88f6dbf028 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/items/lefthand_magic.dmi b/icons/mob/items/lefthand_magic.dmi new file mode 100644 index 0000000000..11552b79ff Binary files /dev/null and b/icons/mob/items/lefthand_magic.dmi differ diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi index fa92a768f3..6a128a9e57 100644 Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ diff --git a/icons/mob/items/righthand_magic.dmi b/icons/mob/items/righthand_magic.dmi new file mode 100644 index 0000000000..490deebcf4 Binary files /dev/null and b/icons/mob/items/righthand_magic.dmi differ diff --git a/icons/mob/items/righthand_melee.dmi b/icons/mob/items/righthand_melee.dmi index 916f610112..12f370d048 100644 Binary files a/icons/mob/items/righthand_melee.dmi and b/icons/mob/items/righthand_melee.dmi differ diff --git a/icons/obj/gun2.dmi b/icons/obj/gun2.dmi index 38a4148c20..a5c13c95c4 100644 Binary files a/icons/obj/gun2.dmi and b/icons/obj/gun2.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 40cec418bc..cb79babe03 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index b7d095f87a..0878311519 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 81ae815980..f11d4a2cdb 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3161,6 +3161,7 @@ #include "code\modules\projectiles\brokenguns\projectile.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\launcher.dm" +#include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\modular_guns.dm" #include "code\modules\projectiles\guns\projectile.dm" #include "code\modules\projectiles\guns\vox.dm" @@ -3198,6 +3199,7 @@ #include "code\modules\projectiles\guns\launcher\pneumatic.dm" #include "code\modules\projectiles\guns\launcher\rocket.dm" #include "code\modules\projectiles\guns\launcher\syringe_gun.dm" +#include "code\modules\projectiles\guns\magic\fireball.dm" #include "code\modules\projectiles\guns\magnetic\bore.dm" #include "code\modules\projectiles\guns\magnetic\gasthrower.dm" #include "code\modules\projectiles\guns\magnetic\magnetic.dm" @@ -3232,6 +3234,7 @@ #include "code\modules\projectiles\projectile\explosive.dm" #include "code\modules\projectiles\projectile\force.dm" #include "code\modules\projectiles\projectile\hook.dm" +#include "code\modules\projectiles\projectile\magic.dm" #include "code\modules\projectiles\projectile\magnetic.dm" #include "code\modules\projectiles\projectile\pellets.dm" #include "code\modules\projectiles\projectile\scatter.dm"