diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index e29cd98105a..ded891ee6cd 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -8,13 +8,11 @@ var/obj/item/target = null var/creator = null anchored = 1.0 + var/precision = 1 // how close to the portal you will teleport. 0 = on the portal, 1 = adjacent /obj/effect/portal/Bumped(mob/M as mob|obj) src.teleport(M) -/obj/effect/portal/Crossed(AM as mob|obj) - src.teleport(AM) - /obj/effect/portal/New(loc, turf/target, creator, lifespan=300) portals += src src.loc = loc @@ -32,6 +30,9 @@ if(istype(creator, /obj/item/weapon/hand_tele)) var/obj/item/weapon/hand_tele/O = creator O.active_portals-- + else if(istype(creator, /obj/item/weapon/gun/energy/wormhole_projector)) + var/obj/item/weapon/gun/energy/wormhole_projector/P = creator + P.portal_destroyed(src) return ..() /obj/effect/portal/proc/teleport(atom/movable/M as mob|obj) @@ -39,11 +40,10 @@ return if(M.anchored&&istype(M, /obj/mecha)) return - if(icon_state == "portal1") - return if (!( target )) qdel(src) return if (istype(M, /atom/movable)) - do_teleport(M, target, 1) ///You will appear adjacent to the beacon + do_teleport(M, target, precision) ///You will appear adjacent to the beacon + diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm index 0fdf7c951e8..5004ad7e4b6 100644 --- a/code/modules/projectiles/ammunition/energy.dm +++ b/code/modules/projectiles/ammunition/energy.dm @@ -120,4 +120,16 @@ projectile_type = /obj/item/projectile/energy/disabler select_name = "disable" e_cost = 50 - fire_sound = "sound/weapons/taser.ogg" \ No newline at end of file + fire_sound = "sound/weapons/taser.ogg" + +/obj/item/ammo_casing/energy/wormhole + projectile_type = /obj/item/projectile/beam/wormhole + e_cost = 0 + fire_sound = "sound/weapons/pulse3.ogg" + var/obj/item/weapon/gun/energy/wormhole_projector/gun = null + select_name = "blue" + +/obj/item/ammo_casing/energy/wormhole/orange + projectile_type = /obj/item/projectile/beam/wormhole/orange + select_name = "orange" + diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 372f37e31cf..f2392adfea0 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -135,3 +135,48 @@ item_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) cell_type = "/obj/item/weapon/stock_parts/cell" + + +/obj/item/weapon/gun/energy/wormhole_projector + name = "bluespace wormhole projector" + desc = "A projector that emits high density quantum-coupled bluespace beams." + ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange) + item_state = null + icon_state = "wormhole_projector" + var/obj/effect/portal/blue + var/obj/effect/portal/orange + +/obj/item/weapon/gun/energy/wormhole_projector/update_icon() + icon_state = "[initial(icon_state)][select]" + return + +/obj/item/weapon/gun/energy/wormhole_projector/attack_self(mob/living/user as mob) + select_fire(user) + +/obj/item/weapon/gun/energy/wormhole_projector/process_chamber() + ..() + select_fire() + +/obj/item/weapon/gun/energy/wormhole_projector/proc/portal_destroyed(var/obj/effect/portal/P) + if(P.icon_state == "portal") + blue = null + if(orange) + orange.target = null + else + orange = null + if(blue) + blue.target = null + +/obj/item/weapon/gun/energy/wormhole_projector/proc/create_portal(var/obj/item/projectile/beam/wormhole/W) + var/obj/effect/portal/P = new /obj/effect/portal(get_turf(W), null, src) + P.precision = 0 + if(W.name == "bluespace beam") + qdel(blue) + blue = P + else + qdel(orange) + P.icon_state = "portal1" + orange = P + if(orange && blue) + blue.target = get_turf(orange) + orange.target = get_turf(blue) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 4f1060ea6ad..b2040e81a23 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -4,6 +4,7 @@ damage = 0 damage_type = BURN flag = "energy" + color = "#FFFF00" /obj/item/projectile/energy/electrode diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 516700e63ce..b0ebaea5d08 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -148,4 +148,31 @@ obj/item/projectile/kinetic/New() /obj/item/effect/kinetic_blast/New() spawn(4) - qdel(src) \ No newline at end of file + qdel(src) + +/obj/item/projectile/beam/wormhole + name = "bluespace beam" + icon_state = "spark" + hitsound = "sparks" + damage = 3 + var/obj/item/weapon/gun/energy/wormhole_projector/gun + color = "#33CCFF" + +/obj/item/projectile/beam/wormhole/orange + name = "orange bluespace beam" + color = "#FF6600" + +/obj/item/projectile/beam/wormhole/New(var/obj/item/ammo_casing/energy/wormhole/casing) + if(casing) + gun = casing.gun + +/obj/item/ammo_casing/energy/wormhole/New(var/obj/item/weapon/gun/energy/wormhole_projector/wh) + gun = wh + +/obj/item/projectile/beam/wormhole/on_hit(var/atom/target) + if(ismob(target)) + ..() + return + if(!gun) + qdel(src) + gun.create_portal(src) \ No newline at end of file diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index c585150a334..4533404d996 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -141,6 +141,16 @@ datum/design/ionrifle build_path = /obj/item/weapon/gun/energy/ionrifle locked = 1 +datum/design/wormhole_projector + name = "Bluespace Wormhole Projector" + desc = "A projector that emits high density quantum-coupled bluespace beams." + id = "wormholeprojector" + req_tech = list("combat" = 6, "materials" = 6, "bluespace" = 4) + build_type = PROTOLATHE + materials = list("$silver" = 1000, "$metal" = 5000, "$diamond" = 3000) + build_path = /obj/item/weapon/gun/energy/wormhole_projector + locked = 1 + datum/design/reciever name = "Modular Reciever" desc = "A prototype modular reciever and trigger assembly for a variety of firearms." diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index 04c7a4e3057..aa1e2caa740 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 402f750f901..40f2cc27342 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index e10e9746760..f39f6bbce81 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 3c4391f406b..4efc2e40adf 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 779ae57a030..cedaea84001 100644 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ