From a07d20d65797f22c3a95170ab7e63d411a1c11a2 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 5 Jun 2015 14:58:35 +0200 Subject: [PATCH] Ports /tg/'s meteor implementation. Merges the two meteor events into one, and now takes severity into consideration instead. Including the basic meteors there are also new types ranging from flaming to radioactive which may drop appropriate types of ore. --- code/game/atoms.dm | 3 - code/game/gamemodes/events/clang.dm | 2 +- code/game/gamemodes/events/dust.dm | 2 +- code/game/gamemodes/meteor/meteor.dm | 6 +- code/game/gamemodes/meteor/meteors.dm | 346 +++++++++++------- code/game/machinery/atmoalter/canister.dm | 5 - code/game/machinery/bots/bots.dm | 4 - code/game/machinery/computer/computer.dm | 10 - code/game/machinery/computer3/computer.dm | 14 +- code/game/machinery/deployable.dm | 9 - code/game/machinery/doors/door.dm | 4 - code/game/machinery/hologram.dm | 4 - code/game/machinery/turrets.dm | 4 - code/game/mecha/mecha.dm | 4 - code/game/objects/effects/aliens.dm | 5 - code/game/objects/items/weapons/weaponry.dm | 4 - code/game/objects/structures.dm | 6 - .../structures/crates_lockers/closets.dm | 7 - .../crates_lockers/closets/statue.dm | 21 +- code/game/objects/structures/displaycase.dm | 7 - code/game/objects/structures/grille.dm | 3 - code/game/objects/structures/inflatable.dm | 3 - code/game/objects/structures/lamarr_cage.dm | 7 - code/game/objects/structures/safe.dm | 5 - code/game/objects/structures/window.dm | 4 - code/game/turfs/simulated/walls.dm | 10 - code/modules/admin/verbs/icarus.dm | 3 +- code/modules/events/event_container.dm | 16 +- code/modules/events/event_dynamic.dm | 1 - code/modules/events/meteors.dm | 59 ++- code/modules/holodeck/HolodeckControl.dm | 10 - .../mob/living/carbon/alien/alien_attacks.dm | 11 - code/modules/mob/living/carbon/human/human.dm | 16 - .../mob/living/carbon/metroid/metroid.dm | 9 - code/modules/mob/living/silicon/ai/ai.dm | 11 - code/modules/mob/living/silicon/pai/pai.dm | 11 - .../modules/mob/living/silicon/robot/robot.dm | 11 - .../power/singularity/containment_field.dm | 3 - code/modules/power/singularity/emitter.dm | 3 - .../power/singularity/field_generator.dm | 3 - .../particle_accelerator.dm | 12 - .../modules/projectiles/projectile/special.dm | 2 +- code/modules/reagents/Chemistry-Machinery.dm | 4 - code/modules/research/circuitprinter.dm | 4 - code/modules/research/destructive_analyzer.dm | 4 - code/modules/research/server.dm | 4 - code/modules/shieldgen/emergency_shield.dm | 14 - code/modules/shieldgen/energy_field.dm | 5 - code/modules/vehicles/vehicle.dm | 4 - icons/obj/meteor.dmi | Bin 11700 -> 4545 bytes 50 files changed, 276 insertions(+), 443 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d40d10bf93..628a707af4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -67,9 +67,6 @@ return flags & INSERT_CONTAINER */ -/atom/proc/meteorhit(obj/meteor as obj) - return - /atom/proc/allow_drop() return 1 diff --git a/code/game/gamemodes/events/clang.dm b/code/game/gamemodes/events/clang.dm index 74fb9ee507..d1b82af940 100644 --- a/code/game/gamemodes/events/clang.dm +++ b/code/game/gamemodes/events/clang.dm @@ -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) diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 13cdb511e8..492b932e46 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -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 diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 335360d40d..593f4a3d22 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -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 diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 06d9b291a2..96367b4a11 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -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/const/meteors_in_wave = 50 -/var/const/meteors_in_small_wave = 10 +//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 -/proc/meteor_wave(var/number = meteors_in_wave) - if(!ticker || wavesecret) - return +/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 - wavesecret = 1 - for(var/i = 0 to number) - spawn(rand(10,100)) - spawn_meteor() - spawn(meteor_wave_delay) - wavesecret = 0 +/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 -/proc/spawn_meteors(var/number = meteors_in_small_wave) +/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(1) //NORTH + starty = world.maxy-(TRANSITIONEDGE+1) + startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + if(2) //EAST + starty = rand((TRANSITIONEDGE+1),world.maxy-(TRANSITIONEDGE+1)) + startx = world.maxx-(TRANSITIONEDGE+1) + if(3) //SOUTH + starty = (TRANSITIONEDGE+1) + startx = rand((TRANSITIONEDGE+1), world.maxx-(TRANSITIONEDGE+1)) + if(4) //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(1) //NORTH + endy = TRANSITIONEDGE + endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) + if(2) //EAST + endy = rand(TRANSITIONEDGE, world.maxy-TRANSITIONEDGE) + endx = TRANSITIONEDGE + if(3) //SOUTH + endy = world.maxy-TRANSITIONEDGE + endx = rand(TRANSITIONEDGE, world.maxx-TRANSITIONEDGE) + if(4) //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) + ram_turf(get_turf(A)) + playsound(src.loc, meteorsound, 40, 1) + get_hit() - if (A) - A.meteorhit(src) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1) - if (--src.hits <= 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) - //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) - qdel(src) - return + //then, ram the turf if it still exists + if(T) + T.ex_act(hitpwr) -/obj/effect/meteor/ex_act(severity) - - if (severity < 4) +//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/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) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index c84d030cc4..21550121cd 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -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("\The [user] hits \the [src] with \a [W]!") diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index ad9a964ca9..803615adaf 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -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() diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index b32f9e9daa..74edf74ea9 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -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() ..() diff --git a/code/game/machinery/computer3/computer.dm b/code/game/machinery/computer3/computer.dm index 902d8ef1a4..6b6a2f8491 100644 --- a/code/game/machinery/computer3/computer.dm +++ b/code/game/machinery/computer3/computer.dm @@ -75,15 +75,15 @@ set name = "Reset Computer" set category = "Object" set src in view(1) - + if(usr.stat || usr.restrained() || usr.lying || !istype(usr, /mob/living)) usr << "You can't do that." return - + if(!Adjacent(usr)) usr << "You can't reach it." return - + Reset() New(var/L, var/built = 0) @@ -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() ..() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index e3c8607b88..73501f283d 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -127,11 +127,6 @@ for reference: dismantle() return -/obj/structure/barricade/meteorhit() - visible_message("\The [src] is smashed apart!") - 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) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 69dc698795..9f5a831b16 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -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) ..() diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 424971cc71..1383bf56e7 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -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) diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index e04034ad93..a3ac073a90 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -399,10 +399,6 @@ qdel(src) return - meteorhit() - qdel(src) - return - attack_hand(mob/user as mob) user.set_machine(src) var/dat = {" diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 2d5c2201bd..32fc2e0123 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -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) diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index d9e88e70e0..cd6d1e76d3 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -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)) diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 867c5155e0..e9670ce4d7 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -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 diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 8039814f4f..1f25043e89 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -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) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index e66d5c488a..7d2ca17eb9 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -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)) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index b59cd62dfa..5458f3da94 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -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") - for(var/mob/M in src) - M.meteorhit(O) - shatter(M) +/obj/structure/closet/statue/ex_act(severity) + for(var/mob/M in src) + 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("[user] strikes [src] with [I].") - if(health <= 0) - for(var/mob/M in src) - shatter(M) + check_health() /obj/structure/closet/statue/MouseDrop_T() return diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 3c5d5ec849..bc6217f774 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -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 )) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index fa7a448bd6..cc154918e6 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -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" diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index cd8fad5ec5..f31b098b5b 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -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 diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 8c3cc5e6f2..13d6694822 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -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 )) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 199635cd0f..0bbfe9f2f0 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -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" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 26bc16e070..1fec557b8d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -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. diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 65b40e1fdf..8015c47c8c 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -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) diff --git a/code/modules/admin/verbs/icarus.dm b/code/modules/admin/verbs/icarus.dm index 1f9b2dd4c4..ef322d40dd 100644 --- a/code/modules/admin/verbs/icarus.dm +++ b/code/modules/admin/verbs/icarus.dm @@ -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) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 3c1aeba23f..cd65ca7ea3 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -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), @@ -168,13 +168,13 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT /datum/event_container/major severity = EVENT_LEVEL_MAJOR available_events = list( - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 1320), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 60), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5)), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 0, list(ASSIGNMENT_ENGINEER = 15), 1), - new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 30), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 1320), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 60), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0,list(ASSIGNMENT_ANY = 5)), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 0, list(ASSIGNMENT_ENGINEER = 15), 1), + new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 30), 1), ) diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 3539130c27..d34fadeb32 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -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) diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index 45d59ca8cd..43093a3de8 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -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() - command_announcement.Announce("The station is now in a meteor shower.", "Meteor Alert") +/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() +/datum/event/meteor_wave/tick() if(activeFor >= next_meteor) - meteor_wave(rand(1,4)) - next_meteor += rand(20,100) + 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 <= 0 ? activeFor + 15 : next_meteor + 1) -/datum/event/meteor_shower/end() - command_announcement.Announce("The station has cleared the meteor shower", "Meteor Alert") +/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 diff --git a/code/modules/holodeck/HolodeckControl.dm b/code/modules/holodeck/HolodeckControl.dm index 45eaf758f9..373c75ceea 100644 --- a/code/modules/holodeck/HolodeckControl.dm +++ b/code/modules/holodeck/HolodeckControl.dm @@ -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() ..() diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index 62768945a3..578059e6e0 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -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) ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 10e165fa5f..718f9c6533 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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. diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 8c97286e3f..d7994b3a60 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -220,15 +220,6 @@ /mob/living/carbon/slime/attack_ui(slot) return -/mob/living/carbon/slime/meteorhit(O as obj) - visible_message("[src] has been hit by [O]") - - 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) ..() diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index c0df651d4b..dd0ba82a56 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -452,17 +452,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) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 99e5684e4e..b0a27ad52f 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -169,17 +169,6 @@ if(3) src << "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." -// 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 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e71db5693d..c7a1d1145c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -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() diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 8b51264460..6ae977735b 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -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) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 11606b3dc1..789a6b13d7 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -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 diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 2f38800637..5532f8ce9e 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -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 diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 6ae932dee1..ec659eca58 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -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 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 9ef0aea43c..6f42a099f1 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -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)) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 7f6da07d67..9d742d726a 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -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)) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index 57812535b6..7c43450ce2 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -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) diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 9b97fecd95..c6cbff2496 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -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" diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index cca8f65b16..a2184d6b79 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -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() ..() diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 15bfa973ed..9918afb068 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -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) diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 074d3abbfa..7b26e1696f 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -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 diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 556e82cd0c..f28b001fef 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -119,10 +119,6 @@ ..() healthcheck() -/obj/vehicle/meteorhit() - explode() - return - /obj/vehicle/blob_act() src.health -= rand(20,40)*fire_dam_coeff healthcheck() diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi index 123a5bdf86e55167b5aaabba0447077b867c0f0d..b9a83d510efe719a384bdd5115768428d73123a2 100644 GIT binary patch literal 4545 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 literal 11700 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 BhbsU8