Merge pull request #9694 from PsiOmegaDelta/150605-Meteors

Ports /tg/'s meteors.
This commit is contained in:
Chinsky
2015-06-08 14:17:57 +03:00
54 changed files with 304 additions and 448 deletions

View File

@@ -36,6 +36,7 @@
#include "code\_helpers\lists.dm"
#include "code\_helpers\logging.dm"
#include "code\_helpers\maths.dm"
#include "code\_helpers\matrices.dm"
#include "code\_helpers\mobs.dm"
#include "code\_helpers\names.dm"
#include "code\_helpers\sanitize_values.dm"

17
code/_helpers/matrices.dm Normal file
View File

@@ -0,0 +1,17 @@
/matrix/proc/TurnTo(old_angle, new_angle)
. = new_angle - old_angle
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
/atom/proc/SpinAnimation(speed = 10, loops = -1)
var/matrix/m120 = matrix(transform)
m120.Turn(120)
var/matrix/m240 = matrix(transform)
m240.Turn(240)
var/matrix/m360 = matrix(transform)
speed /= 3 //Gives us 3 equal time segments for our three turns.
//Why not one turn? Because byond will see that the start and finish are the same place and do nothing
//Why not two turns? Because byond will do a flip instead of a turn
animate(src, transform = m120, time = speed, loops)
animate(transform = m240, time = speed)
animate(transform = m360, time = speed)

View File

@@ -67,9 +67,6 @@
return flags & INSERT_CONTAINER
*/
/atom/proc/meteorhit(obj/meteor as obj)
return
/atom/proc/allow_drop()
return 1

View File

@@ -34,7 +34,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
else if (istype(clong, /mob))
if(clong.density || prob(10))
clong.meteorhit(src)
clong.ex_act(1)
else
qdel(src)

View File

@@ -102,7 +102,7 @@ The "dust" will damage the hull of the station causin minor hull breaches.
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
if(ismob(A))
A.meteorhit(src)//This should work for now I guess
A.ex_act(strength)//This should work for now I guess
else if(!istype(A,/obj/machinery/power/emitter) && !istype(A,/obj/machinery/field_generator)) //Protect the singularity from getting released every round!
A.ex_act(strength) //Changing emitter/field gen ex_act would make it immune to bombs and C4

View File

@@ -9,14 +9,16 @@
votable = 0
uplink_welcome = "EVIL METEOR Uplink Console:"
deny_respawn = 1
var/next_wave = METEOR_DELAY
/datum/game_mode/meteor/post_setup()
defer_powernet_rebuild = 2//Might help with the lag
..()
/datum/game_mode/meteor/process()
if(world.time >= METEOR_DELAY)
spawn() spawn_meteors(6)
if(world.time >= next_wave)
next_wave = world.time + meteor_wave_delay
spawn() spawn_meteors(6, meteors_normal)
/datum/game_mode/meteor/declare_completion()
var/text

View File

@@ -1,167 +1,259 @@
/var/const/meteor_wave_delay = 625 //minimum wait between waves in tenths of seconds
//set to at least 100 unless you want evarr ruining every round
/var/wavesecret = 0
/var/const/meteors_in_wave = 50
/var/const/meteors_in_small_wave = 10
/proc/meteor_wave(var/number = meteors_in_wave)
if(!ticker || wavesecret)
return
//Meteors probability of spawning during a given wave
/var/list/meteors_normal = list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \
/obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3) //for normal meteor event
wavesecret = 1
for(var/i = 0 to number)
spawn(rand(10,100))
spawn_meteor()
spawn(meteor_wave_delay)
wavesecret = 0
/var/list/meteors_threatening = list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, \
/obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3) //for threatening meteor event
/proc/spawn_meteors(var/number = meteors_in_small_wave)
/var/list/meteors_catastrophic = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \
/obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event
/var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event
///////////////////////////////
//Meteor spawning global procs
///////////////////////////////
/proc/spawn_meteors(var/number = 10, var/list/meteortypes)
for(var/i = 0; i < number; i++)
spawn(0)
spawn_meteor()
spawn_meteor(meteortypes)
/proc/spawn_meteor()
var/startx
var/starty
var/endx
var/endy
/proc/spawn_meteor(var/list/meteortypes)
var/turf/pickedstart
var/turf/pickedgoal
var/max_i = 10//number of tries to spawn meteor.
do
switch(pick(1,2,3,4))
if(1) //NORTH
starty = world.maxy-(TRANSITIONEDGE+1)
startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
endy = TRANSITIONEDGE
endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
if(2) //EAST
starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1))
startx = world.maxx-(TRANSITIONEDGE+1)
endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE)
endx = TRANSITIONEDGE
if(3) //SOUTH
starty = (TRANSITIONEDGE+1)
startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
endy = world.maxy-TRANSITIONEDGE
endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
if(4) //WEST
starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1))
startx = (TRANSITIONEDGE+1)
endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE)
endx = world.maxx-TRANSITIONEDGE
pickedstart = locate(startx, starty, 1)
pickedgoal = locate(endx, endy, 1)
while (!istype(pickedstart, /turf/space))
var/startSide = pick(cardinal)
pickedstart = spaceDebrisStartLoc(startSide, 1)
pickedgoal = spaceDebrisFinishLoc(startSide, 1)
max_i--
if(max_i<=0) return
while (!istype(pickedstart, /turf/space)) //FUUUCK, should never happen.
var/obj/effect/meteor/M
switch(rand(1, 100))
if(1 to 10)
M = new /obj/effect/meteor/big( pickedstart )
if(11 to 75)
M = new /obj/effect/meteor( pickedstart )
if(76 to 100)
M = new /obj/effect/meteor/small( pickedstart )
if(max_i<=0)
return
var/Me = pickweight(meteortypes)
var/obj/effect/meteor/M = new Me(pickedstart)
M.dest = pickedgoal
M.z_original = 1
spawn(0)
walk_towards(M, M.dest, 1)
return
/proc/spaceDebrisStartLoc(startSide, Z)
var/starty
var/startx
switch(startSide)
if(NORTH)
starty = world.maxy-(TRANSITIONEDGE+1)
startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
if(EAST)
starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1))
startx = world.maxx-(TRANSITIONEDGE+1)
if(SOUTH)
starty = (TRANSITIONEDGE+1)
startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1))
if(WEST)
starty = rand((TRANSITIONEDGE+1), world.maxy-(TRANSITIONEDGE+1))
startx = (TRANSITIONEDGE+1)
var/turf/T = locate(startx, starty, Z)
return T
/proc/spaceDebrisFinishLoc(startSide, Z)
var/endy
var/endx
switch(startSide)
if(NORTH)
endy = TRANSITIONEDGE
endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
if(EAST)
endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE)
endx = TRANSITIONEDGE
if(SOUTH)
endy = world.maxy-TRANSITIONEDGE
endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE)
if(WEST)
endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE)
endx = world.maxx-TRANSITIONEDGE
var/turf/T = locate(endx, endy, Z)
return T
///////////////////////
//The meteor effect
//////////////////////
/obj/effect/meteor
name = "meteor"
name = "the concept of meteor"
desc = "You should probably run instead of gawking at this."
icon = 'icons/obj/meteor.dmi'
icon_state = "flaming"
icon_state = "small"
density = 1
anchored = 1.0
var/hits = 1
var/detonation_chance = 15
var/power = 4
var/power_step = 1
anchored = 1
var/hits = 4
var/hitpwr = 2 //Level of ex_act to be called on hit.
var/dest
pass_flags = PASSTABLE
var/heavy = 0
var/meteorsound = 'sound/effects/meteorimpact.ogg'
var/z_original = 1
/obj/effect/meteor/small
name = "small meteor"
icon_state = "smallf"
pass_flags = PASSTABLE | PASSGRILLE
power = 2
var/meteordrop = /obj/item/weapon/ore/iron
var/dropamt = 2
/obj/effect/meteor/Move()
if(z != z_original || loc == dest)
qdel(src)
return
. = ..() //process movement...
if(.)//.. if did move, ram the turf we get in
var/turf/T = get_turf(loc)
ram_turf(T)
if(prob(10) && !istype(T, /turf/space))//randomly takes a 'hit' from ramming
get_hit()
return .
/obj/effect/meteor/Destroy()
walk(src,0) //this cancels the walk_towards() proc
..()
/obj/effect/meteor/New()
..()
SpinAnimation()
/obj/effect/meteor/Bump(atom/A)
spawn(0)
if(A)
A.meteorhit(src)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
if (--src.hits <= 0)
ram_turf(get_turf(A))
playsound(src.loc, meteorsound, 40, 1)
get_hit()
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof.
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field_generator) && \
prob(detonation_chance))
explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0)
/obj/effect/meteor/proc/ram_turf(var/turf/T)
//first bust whatever is in the turf
for(var/atom/A in T)
if(A != src)
A.ex_act(hitpwr)
//then, ram the turf if it still exists
if(T)
T.ex_act(hitpwr)
//process getting 'hit' by colliding with a dense object
//or randomly when ramming turfs
/obj/effect/meteor/proc/get_hit()
hits--
if(hits <= 0)
make_debris()
meteor_effect(heavy)
qdel(src)
/obj/effect/meteor/ex_act()
return
/obj/effect/meteor/ex_act(severity)
if (severity < 4)
qdel(src)
return
/obj/effect/meteor/big
name = "big meteor"
hits = 5
power = 1
ex_act(severity)
return
Bump(atom/A)
spawn(0)
//Prevent meteors from blowing up the singularity's containment.
//Changing emitter and generator ex_act would result in them being bomb and C4 proof
if(!istype(A,/obj/machinery/power/emitter) && \
!istype(A,/obj/machinery/field_generator))
if(--src.hits <= 0)
qdel(src) //Dont blow up singularity containment if we get stuck there.
if (A)
for(var/mob/M in player_list)
var/turf/T = get_turf(M)
if(!T || T.z != src.z)
continue
shake_camera(M, 3, get_dist(M.loc, src.loc) > 20 ? 1 : 3)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
explosion(src.loc, 0, 1, 2, 3, 0)
if (--src.hits <= 0)
if(prob(detonation_chance) && !istype(A, /obj/structure/grille))
explosion(loc, power, power + power_step, power + power_step * 2, power + power_step * 3, 0)
qdel(src)
return
/obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/pickaxe))
qdel(src)
return
..()
/obj/effect/meteor/touch_map_edge()
qdel(src)
/obj/effect/meteor/proc/make_debris()
for(var/throws = dropamt, throws > 0, throws--)
var/obj/item/O = new meteordrop(get_turf(src))
O.throw_at(dest, 5, 10)
/obj/effect/meteor/proc/meteor_effect(var/sound=1)
if(sound)
for(var/mob/M in player_list)
var/turf/T = get_turf(M)
if(!T || T.z != src.z)
continue
var/dist = get_dist(M.loc, src.loc)
shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10)
///////////////////////
//Meteor types
///////////////////////
//Dust
/obj/effect/meteor/dust
name = "space dust"
icon_state = "dust"
pass_flags = PASSTABLE | PASSGRILLE
hits = 1
hitpwr = 3
meteorsound = 'sound/weapons/throwtap.ogg'
meteordrop = /obj/item/weapon/ore/glass
//Medium-sized
/obj/effect/meteor/medium
name = "meteor"
dropamt = 3
/obj/effect/meteor/medium/meteor_effect()
..(heavy)
explosion(src.loc, 0, 1, 2, 3, 0)
//Large-sized
/obj/effect/meteor/big
name = "big meteor"
icon_state = "large"
hits = 6
heavy = 1
dropamt = 4
/obj/effect/meteor/big/meteor_effect()
..(heavy)
explosion(src.loc, 1, 2, 3, 4, 0)
//Flaming meteor
/obj/effect/meteor/flaming
name = "flaming meteor"
icon_state = "flaming"
hits = 5
heavy = 1
meteorsound = 'sound/effects/bamf.ogg'
meteordrop = /obj/item/weapon/ore/phoron
/obj/effect/meteor/flaming/meteor_effect()
..(heavy)
explosion(src.loc, 1, 2, 3, 4, 0, 0, 5)
//Radiation meteor
/obj/effect/meteor/irradiated
name = "glowing meteor"
icon_state = "glowing"
heavy = 1
meteordrop = /obj/item/weapon/ore/uranium
/obj/effect/meteor/irradiated/meteor_effect()
..(heavy)
explosion(src.loc, 0, 0, 4, 3, 0)
new /obj/effect/decal/cleanable/greenglow(get_turf(src))
for(var/mob/living/L in view(5, src))
L.apply_effect(40, IRRADIATE)
//Station buster Tunguska
/obj/effect/meteor/tunguska
name = "tunguska meteor"
icon_state = "flaming"
desc = "Your life briefly passes before your eyes the moment you lay them on this monstruosity"
hits = 30
hitpwr = 1
heavy = 1
meteorsound = 'sound/effects/bamf.ogg'
meteordrop = /obj/item/weapon/ore/phoron
/obj/effect/meteor/tunguska/meteor_effect()
..(heavy)
explosion(src.loc, 5, 10, 15, 20, 0)
/obj/effect/meteor/tunguska/Bump()
..()
if(prob(20))
explosion(src.loc,2,4,6,8)

View File

@@ -240,11 +240,6 @@ update_flag
healthcheck()
..()
/obj/machinery/portable_atmospherics/canister/meteorhit(var/obj/O as obj)
src.health = 0
healthcheck()
return
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(!istype(W, /obj/item/weapon/wrench) && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
visible_message("<span class='warning'>\The [user] hits \the [src] with \a [W]!</span>")

View File

@@ -86,10 +86,6 @@
..()
healthcheck()
/obj/machinery/bot/meteorhit()
src.explode()
return
/obj/machinery/bot/blob_act()
src.health -= rand(20,40)*fire_dam_coeff
healthcheck()

View File

@@ -20,16 +20,6 @@
return 0
return 1
/obj/machinery/computer/meteorhit(var/obj/O as obj)
for(var/x in verbs)
verbs -= x
set_broken()
var/datum/effect/effect/system/smoke_spread/smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread)
smoke.set_up(5, 0, src)
smoke.start()
return
/obj/machinery/computer/emp_act(severity)
if(prob(20/severity)) set_broken()
..()

View File

@@ -199,14 +199,6 @@
// todo does this do enough
meteorhit(var/obj/O as obj)
for(var/x in verbs)
verbs -= x
set_broken()
return
emp_act(severity)
if(prob(20/severity)) set_broken()
..()

View File

@@ -127,11 +127,6 @@ for reference:
dismantle()
return
/obj/structure/barricade/meteorhit()
visible_message("<span class='danger'>\The [src] is smashed apart!</span>")
dismantle()
return
/obj/structure/barricade/blob_act()
src.health -= 25
if (src.health <= 0)
@@ -252,10 +247,6 @@ for reference:
anchored = !anchored
icon_state = "barrier[src.locked]"
meteorhit()
src.explode()
return
blob_act()
src.health -= 25
if (src.health <= 0)

View File

@@ -146,10 +146,6 @@
else do_animate("deny")
return
/obj/machinery/door/meteorhit(obj/M as obj)
src.open()
return
/obj/machinery/door/bullet_act(var/obj/item/projectile/Proj)
..()

View File

@@ -200,10 +200,6 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
qdel(src)
return
/obj/machinery/hologram/meteorhit()
qdel(src)
return
/obj/machinery/hologram/holopad/Destroy()
for (var/mob/living/silicon/ai/master in masters)
clear_holo(master)

View File

@@ -399,10 +399,6 @@
qdel(src)
return
meteorhit()
qdel(src)
return
attack_hand(mob/user as mob)
user.set_machine(src)
var/dat = {"<html>

View File

@@ -648,10 +648,6 @@
return
*/
//TODO
/obj/mecha/meteorhit()
return ex_act(rand(1,3))//should do for now
/obj/mecha/emp_act(severity)
if(get_charge())
use_power((cell.charge/2)/severity)

View File

@@ -82,11 +82,6 @@
healthcheck()
return
/obj/effect/alien/resin/meteorhit()
health-=50
healthcheck()
return
/obj/effect/alien/resin/hitby(AM as mob|obj)
..()
for(var/mob/O in viewers(src, null))

View File

@@ -217,10 +217,6 @@
health = 0
healthcheck()
/obj/effect/energy_net/meteorhit()
health = 0
healthcheck()
/obj/effect/energy_net/attack_hand(var/mob/user)
var/mob/living/carbon/human/H = user

View File

@@ -32,9 +32,6 @@
if(prob(50))
qdel(src)
/obj/structure/meteorhit(obj/O as obj)
qdel(src)
/obj/structure/attack_tk()
return
@@ -50,9 +47,6 @@
if(3.0)
return
/obj/structure/meteorhit(obj/O as obj)
qdel(src)
/obj/structure/New()
..()
if(climbable)

View File

@@ -210,13 +210,6 @@
A.loc = src.loc
qdel(src)
/obj/structure/closet/meteorhit(obj/O as obj)
if(O.icon_state == "flaming")
for(var/mob/M in src)
M.meteorhit(O)
src.dump_contents()
qdel(src)
/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(src.opened)
if(istype(W, /obj/item/weapon/grab))

View File

@@ -80,12 +80,15 @@
/obj/structure/closet/statue/toggle()
return
/obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
/obj/structure/closet/statue/proc/check_health()
if(health <= 0)
for(var/mob/M in src)
shatter(M)
/obj/structure/closet/statue/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
check_health()
return
/obj/structure/closet/statue/attack_generic(var/mob/user, damage, attacktext, environment_smash)
@@ -97,19 +100,17 @@
for(var/mob/M in src)
shatter(M)
/obj/structure/closet/statue/meteorhit(obj/O as obj)
if(O.icon_state == "flaming")
/obj/structure/closet/statue/ex_act(severity)
for(var/mob/M in src)
M.meteorhit(O)
shatter(M)
M.ex_act(severity)
health -= 60 / severity
check_health()
/obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob)
health -= I.force
user.do_attack_animation(src)
visible_message("<span class='danger'>[user] strikes [src] with [I].</span>")
if(health <= 0)
for(var/mob/M in src)
shatter(M)
check_health()
/obj/structure/closet/statue/MouseDrop_T()
return

View File

@@ -43,13 +43,6 @@
occupied = 0
qdel(src)
/obj/structure/displaycase/meteorhit(obj/O as obj)
new /obj/item/weapon/material/shard( src.loc )
new /obj/item/weapon/gun/energy/captain( src.loc )
qdel(src)
/obj/structure/displaycase/proc/healthcheck()
if (src.health <= 0)
if (!( src.destroyed ))

View File

@@ -19,9 +19,6 @@
/obj/structure/grille/blob_act()
qdel(src)
/obj/structure/grille/meteorhit(var/obj/M)
qdel(src)
/obj/structure/grille/update_icon()
if(destroyed)
icon_state = "[initial(icon_state)]-b"

View File

@@ -63,9 +63,6 @@
/obj/structure/inflatable/blob_act()
deflate(1)
/obj/structure/inflatable/meteorhit()
deflate(1)
/obj/structure/inflatable/attack_hand(mob/user as mob)
add_fingerprint(user)
return

View File

@@ -39,13 +39,6 @@
Break()
qdel(src)
/obj/structure/lamarr/meteorhit(obj/O as obj)
new /obj/item/weapon/material/shard( src.loc )
Break()
qdel(src)
/obj/structure/lamarr/proc/healthcheck()
if (src.health <= 0)
if (!( src.destroyed ))

View File

@@ -167,11 +167,6 @@ obj/structure/safe/blob_act()
obj/structure/safe/ex_act(severity)
return
obj/structure/safe/meteorhit(obj/O as obj)
return
//FLOOR SAFES
/obj/structure/safe/floor
name = "floor safe"

View File

@@ -125,10 +125,6 @@
/obj/structure/window/blob_act()
shatter()
/obj/structure/window/meteorhit()
shatter()
//TODO: Make full windows a separate type of window.
//Once a full window, it will always be a full window, so there's no point
//having the same type for both.

View File

@@ -233,16 +233,6 @@ var/list/global/wall_cache = list()
// F.sd_LumReset() //TODO: ~Carn
return
/turf/simulated/wall/meteorhit(obj/M as obj)
var/rotting = (locate(/obj/effect/overlay/wallrot) in src)
if (prob(15) && !rotting)
dismantle_wall()
else if(prob(70) && !rotting)
ChangeTurf(/turf/simulated/floor/plating)
else
ReplaceWithLattice()
return 0
/turf/simulated/wall/proc/radiate()
var/total_radiation = material.radioactivity + (reinf_material ? reinf_material.radioactivity / 2 : 0)
if(!total_radiation)

View File

@@ -111,11 +111,10 @@ proc/Icarus_FireCannon(var/turf/target)
target = locate(x, y, target.z)
// Finally fire the fucker.
var/obj/effect/meteor/small/projectile = new (start)
var/obj/effect/meteor/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)

View File

@@ -153,7 +153,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 75, list(ASSIGNMENT_ENGINEER = 60)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_SCIENTIST = 10)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 50, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_shower, 0, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 2.5, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5),

View File

@@ -71,7 +71,6 @@ var/list/event_last_fired = list()
possibleEvents[/datum/event/spacevine] = 10 + 5 * active_with_role["Engineer"]
if(minutes_passed >= 30) // Give engineers time to set up engine
possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"]
possibleEvents[/datum/event/meteor_shower] = 20 * active_with_role["Engineer"]
possibleEvents[/datum/event/blob] = 10 * active_with_role["Engineer"]
if(active_with_role["Medical"] > 0)

View File

@@ -1,44 +1,39 @@
//meteor storms are much heavier
/datum/event/meteor_wave
startWhen = 6
endWhen = 33
/datum/event/meteor_wave/setup()
endWhen = rand(15,30) * 3
/datum/event/meteor_wave/announce()
command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
/datum/event/meteor_wave/tick()
if(IsMultiple(activeFor, 3))
meteor_wave(rand(2,5))
/datum/event/meteor_wave/end()
command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
//
/datum/event/meteor_shower
startWhen = 5
endWhen = 7
var/next_meteor = 6
var/waves = 1
/datum/event/meteor_shower/setup()
waves = rand(2,5)
/datum/event/meteor_wave/setup()
waves = severity * rand(1,3)
/datum/event/meteor_shower/announce()
/datum/event/meteor_wave/announce()
switch(severity)
if(EVENT_LEVEL_MAJOR)
command_announcement.Announce("Meteors have been detected on collision course with the station.", "Meteor Alert", new_sound = 'sound/AI/meteors.ogg')
else
command_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert")
//meteor showers are lighter and more common,
/datum/event/meteor_shower/tick()
if(activeFor >= next_meteor)
meteor_wave(rand(1,4))
next_meteor += rand(20,100)
/datum/event/meteor_wave/tick()
if(waves && activeFor >= next_meteor)
spawn() spawn_meteors(severity * rand(1,2), get_meteors())
next_meteor += rand(15, 30) / severity
waves--
if(waves <= 0)
endWhen = activeFor + 1
else
endWhen = next_meteor + 1
endWhen = (waves ? next_meteor + 1 : activeFor + 15)
/datum/event/meteor_shower/end()
/datum/event/meteor_wave/end()
switch(severity)
if(EVENT_LEVEL_MAJOR)
command_announcement.Announce("The station has cleared the meteor storm.", "Meteor Alert")
else
command_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert")
/datum/event/meteor_wave/proc/get_meteors()
switch(severity)
if(EVENT_LEVEL_MAJOR)
return meteors_catastrophic
if(EVENT_LEVEL_MODERATE)
return meteors_threatening
else
return meteors_normal

View File

@@ -158,16 +158,6 @@
emergencyShutdown()
..()
/obj/machinery/computer/HolodeckControl/meteorhit(var/obj/O as obj)
emergencyShutdown()
..()
/obj/machinery/computer/HolodeckControl/emp_act(severity)
emergencyShutdown()
..()
/obj/machinery/computer/HolodeckControl/ex_act(severity)
emergencyShutdown()
..()

View File

@@ -3,17 +3,6 @@
/mob/living/carbon/alien/attack_ui(slot_id)
return
/mob/living/carbon/alien/meteorhit(O as obj)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message(text("\red [] has been hit by []", src, O), 1)
if (health > 0)
adjustBruteLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25))
adjustFireLoss(30)
updatehealth()
return
/mob/living/carbon/alien/attack_hand(mob/living/carbon/M as mob)
..()

View File

@@ -177,22 +177,6 @@
apply_damage(rand(30,40), BRUTE, affecting, run_armor_check(affecting, "melee"))
return
/mob/living/carbon/human/meteorhit(O as obj)
for(var/mob/M in viewers(src, null))
if ((M.client && !( M.blinded )))
M.show_message("\red [src] has been hit by [O]", 1)
if (health > 0)
var/obj/item/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
if(!affecting) return
if (istype(O, /obj/effect/immovablerod))
if(affecting.take_damage(101, 0))
UpdateDamageIcon()
else
if(affecting.take_damage((istype(O, /obj/effect/meteor/small) ? 10 : 25), 30))
UpdateDamageIcon()
updatehealth()
return
/mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default.
if(!config.use_loyalty_implants && !override) return // Nuh-uh.

View File

@@ -220,15 +220,6 @@
/mob/living/carbon/slime/attack_ui(slot)
return
/mob/living/carbon/slime/meteorhit(O as obj)
visible_message("<span class='warning'>[src] has been hit by [O]</span>")
adjustBruteLoss((istype(O, /obj/effect/meteor/small) ? 10 : 25))
adjustFireLoss(30)
updatehealth()
return
/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob)
..()

View File

@@ -430,17 +430,6 @@ var/list/ai_verbs_default = list(
return
/mob/living/silicon/ai/meteorhit(obj/O as obj)
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [] has been hit by []", src, O), 1)
//Foreach goto(19)
if (health > 0)
adjustBruteLoss(30)
if ((O.icon_state == "flaming"))
adjustFireLoss(40)
updatehealth()
return
/mob/living/silicon/ai/reset_view(atom/A)
if(camera)
camera.set_light(0)

View File

@@ -169,17 +169,6 @@
if(3)
src << "<font color=green>You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.</font>"
// See software.dm for Topic()
/mob/living/silicon/pai/meteorhit(obj/O as obj)
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [] has been hit by []", src, O), 1)
if (src.health > 0)
src.adjustBruteLoss(30)
if ((O.icon_state == "flaming"))
src.adjustFireLoss(40)
src.updatehealth()
return
/mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C)
if(istype(usr, /mob/living))
var/mob/living/U = usr

View File

@@ -450,17 +450,6 @@
/mob/living/silicon/robot/restrained()
return 0
/mob/living/silicon/robot/meteorhit(obj/O as obj)
for(var/mob/M in viewers(src, null))
M.show_message(text("\red [src] has been hit by [O]"), 1)
//Foreach goto(19)
if (health > 0)
adjustBruteLoss(30)
if ((O.icon_state == "flaming"))
adjustFireLoss(40)
updatehealth()
return
/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
if(prob(75) && Proj.damage > 0) spark_system.start()

View File

@@ -36,9 +36,6 @@
/obj/machinery/containment_field/ex_act(severity)
return 0
/obj/machinery/containment_field/meteorhit()
return 0
/obj/machinery/containment_field/HasProximity(atom/movable/AM as mob|obj)
if(istype(AM,/mob/living/silicon) && prob(40))
shock(AM)

View File

@@ -93,9 +93,6 @@
src.use_power = 1 */
return 1
/obj/machinery/containment_field/meteorhit()
return 0
/obj/machinery/power/emitter/process()
if(stat & (BROKEN))
return

View File

@@ -166,9 +166,6 @@ field_generator power level display
else
..()
/obj/machinery/containment_field/meteorhit()
return 0
/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj, /obj/item/projectile/beam))
power += Proj.damage * EMITTER_DAMAGE_POWER_TRANSFER

View File

@@ -163,12 +163,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
qdel(src)
return
/obj/structure/particle_accelerator/meteorhit()
if(prob(50))
qdel(src)
return
/obj/structure/particle_accelerator/update_icon()
switch(construction_state)
if(0,1)
@@ -351,12 +345,6 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
/obj/machinery/particle_accelerator/meteorhit()
if(prob(50))
qdel(src)
return
/obj/machinery/particle_accelerator/proc/update_state()
return 0

View File

@@ -59,7 +59,7 @@
if(src)//Do not add to this if() statement, otherwise the meteor won't delete them
if(A)
A.meteorhit(src)
A.ex_act(3)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
for(var/mob/M in range(10, src))

View File

@@ -48,10 +48,6 @@
if (prob(50))
qdel(src)
/obj/machinery/chem_master/meteorhit()
qdel(src)
return
/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
if(istype(B, /obj/item/weapon/reagent_containers/glass))

View File

@@ -83,10 +83,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
if(prob(50))
qdel(src)
/obj/machinery/r_n_d/circuit_imprinter/meteorhit()
qdel(src)
return
/obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials()
var/t = 0
for(var/f in materials)

View File

@@ -31,10 +31,6 @@ Note: Must be placed within 3 tiles of the R&D Console
T += S.rating
decon_mod = T * 0.1
/obj/machinery/r_n_d/destructive_analyzer/meteorhit()
qdel(src)
return
/obj/machinery/r_n_d/destructive_analyzer/update_icon()
if(panel_open)
icon_state = "d_analyzer_t"

View File

@@ -71,10 +71,6 @@
produce_heat()
delay = initial(delay)
/obj/machinery/r_n_d/server/meteorhit(var/obj/O as obj)
griefProtection()
..()
/obj/machinery/r_n_d/server/emp_act(severity)
griefProtection()
..()

View File

@@ -59,13 +59,6 @@
..()
/obj/machinery/shield/meteorhit()
src.health -= max_health*0.75 //3/4 health as damage
check_failure()
opacity = 1
spawn(20) if(src) opacity = 0
return
/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
@@ -225,13 +218,6 @@
update_icon()
return
/obj/machinery/shieldgen/meteorhit(obj/O as obj)
src.health -= max_health*0.25 //A quarter of the machine's health
if (prob(5))
src.malfunction = 1
src.checkhp()
return
/obj/machinery/shieldgen/ex_act(severity)
switch(severity)
if(1.0)

View File

@@ -27,11 +27,6 @@
/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj)
Stress(Proj.damage / 10)
/obj/effect/energy_field/meteorhit(obj/effect/meteor/M as obj)
if(M)
walk(M,0)
Stress(2)
/obj/effect/energy_field/proc/Stress(var/severity)
strength -= severity

View File

@@ -383,7 +383,7 @@
defer_powernet_rebuild = 1
// Let's just make this one loop.
for(var/atom/X in orange(pull_radius,src))
X.singularity_pull(src, STAGE_FIVE)
spawn() X.singularity_pull(src, STAGE_FIVE)
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 0

View File

@@ -119,10 +119,6 @@
..()
healthcheck()
/obj/vehicle/meteorhit()
explode()
return
/obj/vehicle/blob_act()
src.health -= rand(20,40)*fire_dam_coeff
healthcheck()

View File

@@ -0,0 +1,5 @@
author: PsiOmegaDelta
delete-after: True
changes:
- rscadd: "Ports /tg/'s meteor event. Meteors now appear to be more accurate, come in a greater variety, and may drop ores on their final destruction."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB