The icarus gun now acts as a spotter. The Icarus can now be fired via adminverbs.

This commit is contained in:
SkyMarshal
2015-02-08 04:03:19 -07:00
parent dadea3c7fa
commit 84c40171e7
7 changed files with 153 additions and 82 deletions
+3
View File
@@ -109,6 +109,9 @@ var/list/admin_verbs_fun = list(
var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_atom, /*allows us to spawn instances*/
/client/proc/respawn_character,
/client/proc/FireLaser,
/client/proc/FireCannons,
/client/proc/ChangeIcarusPosition,
/client/proc/virus2_editor
)
var/list/admin_verbs_server = list(
+125
View File
@@ -0,0 +1,125 @@
/client/proc/FireLaser()
set name = "Fire the Icarus lasers"
set desc = "Fires a laser bolt at your position. You should only do this as a(n) (a)ghost"
set category = "Fun"
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_FireLaser(get_turf(src.mob))
/client/proc/FireCannons()
set name = "Fire the Icarus cannons"
set desc = "Fires an explosive missile at your position. You should only do this as a(n) (a)ghost."
set category = "Fun"
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_FireCannon(get_turf(src.mob))
/client/proc/ChangeIcarusPosition()
set name = "Adjust Icarus Position"
set desc = "Lets you chose the position of the Icarus in regards to the map."
set category = "Fun"
if(!src.holder)
src << "Only administrators may use this command."
return
Icarus_SetPosition(src)
var/icarus_position = SOUTH
proc/Icarus_FireLaser(var/turf/target)
// Find the world edge to fire from.
var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
var/x_off = x != target.x ? abs(target.x - x) : INFINITY
var/y_off = y != target.y ? abs(target.y - y) : INFINITY
// Get the minimum number of steps using the rise/run shit.
var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
// Now we can get the location of the start.
x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
var/turf/start = locate(x, y, target.z)
// should step down as:
// 1000, 500, 333, 250, 200, 167, 142, 125, 111, 100, 90
var/damage = 1000
for(var/i in 2 to 12)
var/obj/item/projectile/beam/in_chamber = new (start)
in_chamber.original = target
in_chamber.starting = start
in_chamber.silenced = 1
in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
in_chamber.damage = damage
in_chamber.kill_count = 500
in_chamber.process()
damage -= damage / i
sleep(-1)
// Let everyone know what hit them.
var/obj/item/projectile/beam/in_chamber = new (start)
in_chamber.original = target
in_chamber.starting = start
in_chamber.silenced = 0
in_chamber.yo = icarus_position & NORTH ? -1 : icarus_position & SOUTH ? 1 : 0
in_chamber.xo = icarus_position & EAST ? -1 : icarus_position & WEST ? 1 : 0
in_chamber.kill_count = 500
in_chamber.damage = 0
in_chamber.name = "point defense laser"
in_chamber.firer = "Icarus" // Never displayed, but we want this to display the hit message.
in_chamber.process()
proc/Icarus_FireCannon(var/turf/target)
// Find the world edge to fire from.
var/x = icarus_position & EAST ? world.maxx : icarus_position & WEST ? 1 : target.x
var/y = icarus_position & NORTH ? world.maxy : icarus_position & SOUTH ? 1 : target.y
var/x_off = x != target.x ? abs(target.x - x) : INFINITY
var/y_off = y != target.y ? abs(target.y - y) : INFINITY
// Get the minimum number of steps using the rise/run shit.
var/iterations = round(min(x_off, y_off)) - 14 // We cannot fire straight from the edge since teleport thing.
// Now we can get the location of the start.
x = target.x + (icarus_position & EAST ? iterations : icarus_position & WEST ? -iterations : 0)
y = target.y + (icarus_position & NORTH ? iterations : icarus_position & SOUTH ? -iterations : 0)
var/turf/start = locate(x, y, target.z)
// Now we find the corresponding turf on the other side of the level.
// Yeah, yeah. Overuse of the terinary operator. So sue me.
x = icarus_position & EAST ? 1 : icarus_position & WEST ? world.maxx : target.x
y = icarus_position & NORTH ? 1 : icarus_position & SOUTH ? world.maxy : target.y
x_off = x != target.x ? abs(target.x - x) : INFINITY
y_off = y != target.y ? abs(target.y - y) : INFINITY
iterations = round(min(x_off, y_off))
x = target.x + (icarus_position & EAST ? -iterations : icarus_position & WEST ? iterations : 0)
y = target.y + (icarus_position & NORTH ? -iterations : icarus_position & SOUTH ? iterations : 0)
target = locate(x, y, target.z)
// Finally fire the fucker.
var/obj/effect/meteor/small/projectile = new (start)
projectile.dest = target
projectile.name = "main gun projectile" // stealthy
projectile.hits = 6
projectile.detonation_chance = 99 // it's a missile/cannon round thing!
// Make sure it travels
spawn(0)
walk_towards(projectile, projectile.dest, 1)
proc/Icarus_SetPosition(var/user)
var/global/list/directions = list("North" = 1, "North East" = 5, "East" = 4, "South East" = 6, "South" = 2, "South West" = 10, "West" = 8, "North West" = 9)
var/direction = input(user, "Where should the Icarus fire from?", "Icarus Comms") as null|anything in directions
if(!direction)
return
icarus_position = directions[direction]
@@ -17,19 +17,19 @@
mode = 0
charge_cost = 100
fire_sound = 'sound/weapons/Taser.ogg'
user << "\red [src.name] is now set to stun."
user << "\red \The [src] is now set to stun."
projectile_type = /obj/item/projectile/beam/stun
if(0)
mode = 1
charge_cost = 100
fire_sound = 'sound/weapons/Laser.ogg'
user << "\red [src.name] is now set to kill."
user << "\red \The [src] is now set to kill."
projectile_type = /obj/item/projectile/beam
if(1)
mode = 2
charge_cost = 200
fire_sound = 'sound/weapons/pulse.ogg'
user << "\red [src.name] is now set to DESTROY."
user << "\red \The [name] is now set to DESTROY."
projectile_type = /obj/item/projectile/beam/pulse
return
@@ -55,7 +55,7 @@
fire_delay = 10
attack_self(mob/living/user as mob)
user << "\red [src.name] has three settings, and they are all DESTROY."
user << "\red \The [src] has three settings, and they are all DESTROY."
+13 -19
View File
@@ -235,43 +235,37 @@ obj/item/weapon/gun/energy/staff/focus
zoom()
// Serves as a target spotter for the Icarus.
/obj/item/weapon/gun/energy/icarus
name = "\improper N.D.V. Icarus"
desc = "It feels like the fate of the Exodus in your hands. SO STOP FUCKING IT UP. It's set to fire point defense lasers.."
name = "rubber ducky"
desc = "It's a cute rubber duck. With an evil gleam in it's eye."
projectile_type = "/obj/item/projectile/icarus/pointdefense"
icon = 'icons/obj/watercloset.dmi'
icon_state = "rubberducky"
item_state = "rubberducky"
charge_cost = 0
silenced = 1
var/popgun = 1
attack_self(mob/living/user as mob)
if(popgun)
popgun = 0
desc = "It feels like the fate of the Exodus in your hands. SO STOP FUCKING IT UP. It's set to fire the main guns."
if(projectile_type == "/obj/item/projectile/icarus/pointdefense")
projectile_type = "/obj/item/projectile/icarus/guns"
user << "You switch to using the main guns."
user << "You inform the Icarus to switch to the main guns."
else
popgun = 1
desc = "It feels like the fate of the Exodus in your hands. SO STOP FUCKING IT UP. It's set to fire point defense lasers.."
projectile_type = "/obj/item/projectile/icarus/pointdefense"
user << "You switch to using the point-defense lasers."
user << "You inform the Icarus to switch to the point-defense lasers."
. = ..()
update_icon()
return
verb/fuckshitup()
set name = "fuckshitup"
set desc = "This will kill a lot of people."
set hidden = 1
verb/SetIcarusAngle()
set src in usr
set name = "Set Firing Angle"
set desc = "Sets the angle from which the icarus will fire."
set category = "Object"
popgun = 0
desc = "It feels like the fate of the Exodus is in your han- wait, what the hell ARE YOU DOING!?"
projectile_type = "/obj/item/projectile/icarus/torpedo"
usr << "You tell the crew to load the highly illegal phasic torpedos. After the mutiny has been put down, you are ready to burn the world."
Icarus_SetPosition(usr)
/obj/item/weapon/gun/energy/variable
+1 -1
View File
@@ -113,7 +113,7 @@ var/list/beam_master = list()
/obj/item/projectile/beam/emitter
name = "emitter beam"
icon_state = "emitter"
damage = 30
damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm
/obj/item/projectile/beam/lastertag/blue
name = "lasertag beam"
+6 -58
View File
@@ -140,66 +140,14 @@
/obj/item/projectile/icarus/pointdefense
process()
// should step down as:
// 1000, 500, 333, 250, 200, 167, 142, 125, 111, 100, 90
var/damage = 1000
for(var/i in 2 to 12)
var/obj/item/projectile/beam/in_chamber = new (src.loc)
in_chamber.original = original
in_chamber.starting = starting
in_chamber.shot_from = shot_from
in_chamber.silenced = silenced
in_chamber.current = current
in_chamber.yo = yo
in_chamber.xo = xo
in_chamber.damage = damage
in_chamber.process()
damage -= damage / i
sleep(-1)
// Let everyone know what hit them.
var/obj/item/projectile/beam/in_chamber = new (src.loc)
in_chamber.original = original
in_chamber.name = "point defense laser"
in_chamber.starting = starting
in_chamber.shot_from = shot_from
in_chamber.silenced = 0
in_chamber.firer = "Icarus" // Never displayed, but we want this to display the hit message.
in_chamber.current = current
in_chamber.yo = yo
in_chamber.xo = xo
in_chamber.damage = 0
in_chamber.process()
Icarus_FireLaser(get_turf(original))
spawn(1)
del src
return
/obj/item/projectile/icarus/guns
process()
var/turf/location = get_turf(src)
//Find the world endge targetted.
var/x = xo > 0 ? (world.maxx - location.x) / xo : xo < 0 ? (-location.x) / xo : 1.#INF
var/y = yo > 0 ? (world.maxy - location.y) / yo : yo < 0 ? (-location.y) / yo : 1.#INF
// Get the minimum number of steps using the rise/run shit.
var/iterations = round(min(x,y)) - 1
var/turf/target = locate(location.x + iterations * xo, location.y + iterations * yo, location.z)
var/turf/start = get_step(location, get_dir(location, target))
var/obj/effect/meteor/small/projectile = new (start) // Let's not squish the firer.
projectile.dest = target
projectile.name = "main gun projectile" // stealthy
projectile.hits = 6
projectile.detonation_chance = 99 // it's a missile/cannon round thing!
spawn(0)
projectile.throw_at(projectile.dest, 1.#INF, 5)
walk_towards(projectile, projectile.dest, 1)
spawn(1)
del src
return
/obj/item/projectile/icarus/torpedo
//TODO
/obj/item/projectile/icarus/guns/process()
Icarus_FireCannon(get_turf(original))
spawn
del src
return