diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 418537a8f34..83cc1be2771 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -40,49 +40,6 @@ layer = 99 mouse_opacity = 0 -/obj/shieldgen - name = "shield generator" - desc = "Used to seal minor hull breaches." - icon = 'objects.dmi' - icon_state = "shieldoff" - var/active = 0 - var/health = 100 - var/malfunction = 0 - density = 1 - opacity = 0 - anchored = 0 - pressure_resistance = 2*ONE_ATMOSPHERE - -/obj/shieldwallgen - name = "shieldwall thing" - desc = "dont know" - icon = 'wizard.dmi' - icon_state = "dontknow" - var/active = 0 - var/range = 1 - density = 0 - opacity = 0 - anchored = 0 - pressure_resistance = 2*ONE_ATMOSPHERE - -/obj/shield - name = "shield" - desc = "An energy shield." - icon = 'effects.dmi' - icon_state = "shieldsparkles" - density = 1 - opacity = 0 - anchored = 1 - -/obj/shieldwall - name = "shield" - desc = "An energy shield." - icon = 'effects.dmi' - icon_state = "test" - density = 1 - opacity = 0 - anchored = 1 - /obj/admins name = "admins" var/rank = null diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index c6352856b0d..1044959b6ef 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -62,7 +62,7 @@ max_i-- if(max_i<=0) return - while (!istype(pickedstart, /turf/space) || locate(/obj/shield in pickedstart) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen. + while (!istype(pickedstart, /turf/space) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen. var/obj/meteor/M diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm new file mode 100644 index 00000000000..65b877e00aa --- /dev/null +++ b/code/game/machinery/shieldgen.dm @@ -0,0 +1,455 @@ +/obj/machinery/shieldgen + name = "Shield generator" + desc = "Used to seal minor hull breaches." + icon = 'objects.dmi' + icon_state = "shieldoff" + var/active = 0 + var/health = 100 + var/malfunction = 0 + density = 1 + opacity = 0 + anchored = 0 + pressure_resistance = 2*ONE_ATMOSPHERE + +/obj/machinery/shieldwallgen + name = "Shield Generator" + desc = "A shield generator." + icon = 'wizard.dmi' + icon_state = "dontknow" + anchored = 0 + density = 1 + req_access = list(access_security) + var/Varedit_start = 0 + var/Varpower = 0 + var/active = 0 + var/power = 1 //fuck that, powered forever for now + var/state = 0 + var/steps = 0 + var/last_check = 0 + var/check_delay = 10 + var/recalc = 0 + var/locked = 0 + var/destroyed = 0 + flags = FPRINT | CONDUCT + +/obj/machinery/shield + name = "shield" + desc = "An energy shield." + icon = 'effects.dmi' + icon_state = "shieldsparkles" + density = 1 + opacity = 1 + anchored = 1 + +/obj/machinery/shieldwall + name = "Shield" + desc = "An energy shield." + icon = 'effects.dmi' + icon_state = "shieldwall" + anchored = 1 + density = 1 + var/active = 1 +// var/power = 10 + var/delay = 5 + var/last_active + var/mob/U + var/obj/machinery/shieldwallgen/gen_primary + var/obj/machinery/shieldwallgen/gen_secondary + + +/obj/machinery/shieldgen/Del() + for(var/obj/machinery/shield/shield_tile in deployed_shields) + del(shield_tile) + + ..() + +/obj/machinery/shieldgen/var/list/obj/machinery/shield/deployed_shields + +/obj/machinery/shieldgen/proc + shields_up() + if(active) return 0 + + for(var/turf/target_tile in range(2, src)) + if (istype(target_tile,/turf/space) && !(locate(/obj/machinery/shield) in target_tile)) + if (malfunction && prob(33) || !malfunction) + deployed_shields += new /obj/machinery/shield(target_tile) + + src.anchored = 1 + src.active = 1 + src.icon_state = malfunction ? "shieldonbr":"shieldon" + + spawn src.process() + + shields_down() + if(!active) return 0 + + for(var/obj/machinery/shield/shield_tile in deployed_shields) + del(shield_tile) + + src.anchored = 0 + src.active = 0 + src.icon_state = malfunction ? "shieldoffbr":"shieldoff" + +/obj/machinery/shieldgen/process() + if(active) + src.icon_state = malfunction ? "shieldonbr":"shieldon" + + if(malfunction) + while(prob(10)) + del(pick(deployed_shields)) + + spawn(30) + src.process() + return + +/obj/machinery/shieldgen/proc/checkhp() + if(health <= 30) + src.malfunction = 1 + if(health <= 10 && prob(75)) + del(src) + if (active) + src.icon_state = malfunction ? "shieldonbr":"shieldon" + else + src.icon_state = malfunction ? "shieldoffbr":"shieldoff" + return + +/obj/machinery/shieldgen/meteorhit(obj/O as obj) + src.health -= 25 + if (prob(5)) + src.malfunction = 1 + src.checkhp() + return + +/obj/machinery/shield/meteorhit(obj/O as obj) + if (prob(75)) + del(src) + return + +/obj/machinery/shieldgen/ex_act(severity) + switch(severity) + if(1.0) + src.health -= 75 + src.checkhp() + if(2.0) + src.health -= 30 + if (prob(15)) + src.malfunction = 1 + src.checkhp() + if(3.0) + src.health -= 10 + src.checkhp() + return + +/obj/machinery/shield/ex_act(severity) + switch(severity) + if(1.0) + if (prob(75)) + del(src) + if(2.0) + if (prob(50)) + del(src) + if(3.0) + if (prob(25)) + del(src) + return + +/obj/machinery/shieldgen/attack_hand(mob/user as mob) + if (src.active) + for(var/mob/viwer in viewers(world.view, src.loc)) + viwer << text("\icon[] [user] deactivated the shield generator.", src) + shields_down() + + else + for(var/mob/viwer in viewers(world.view, src.loc)) + viwer << text("\icon[] [user] activated the shield generator.", src) + shields_up() + + +////FIELD GEN START //shameless copypasta from fieldgen, yes + + +/* doesn't works for some reason. +/obj/machinery/shieldwallgen/proc/get_connection() + var/turf/T = src.loc + if(!istype(T, /turf/simulated/floor)) + return + + for(var/obj/cable/C in T) + if(C.d1 == 0) + return C.netnum + + return 0 +*/ + +/obj/machinery/shieldwallgen/attack_hand(mob/user as mob) + if(state == 1) + if(!src.locked) + if(power == 1) + if(src.active >= 1) + src.active = 0 + // icon_state = "Field_Gen" + user << "You turn off the shield generator." + // src.cleanup() + else + src.active = 1 + // icon_state = "Field_Gen +a" + user << "You turn on the shield generator." + else + user << "The shield generator needs to be powered by wire underneath." + else + user << "The controls are locked!" + else + user << "The shield generator needs to be firmly secured to the floor first." + src.add_fingerprint(user) + +/obj/machinery/shieldwallgen/attack_ai(mob/user as mob) + if(state == 1) + if(power == 1) + if(src.active >= 1) + user << "You turn off the field generator." + src.active = 0 + else + src.active = 1 + // icon_state = "Field_Gen +a" + user << "You turn on the field generator." + else + user << "The shield generator needs to be powered by wire underneath." + else + user << "The shield generator needs to be firmly secured to the floor first." + src.add_fingerprint(user) + +/obj/machinery/shieldwallgen/New() + ..() + return + +/obj/machinery/shieldwallgen/process() + + if(src.Varedit_start == 1) + if(src.active == 0) + src.active = 1 + src.state = 1 +// src.power = 1 + src.anchored = 1 +// icon_state = "Field_Gen +a" + Varedit_start = 0 + + if(src.active == 1) + if(!src.state == 1) + src.active = 0 + return + spawn(1) + setup_field(1) + spawn(2) + setup_field(2) + spawn(3) + setup_field(4) + spawn(4) + setup_field(8) + src.active = 2 + if(src.active >= 1) + if(Varpower == 0) + if(src.power == 0) + for(var/mob/M in viewers(src)) + M.show_message("\red The [src.name] shuts down due to lack of power!") + // icon_state = "Field_Gen" + src.active = 0 + spawn(1) + src.cleanup(1) + spawn(1) + src.cleanup(2) + spawn(1) + src.cleanup(4) + spawn(1) + src.cleanup(8) + +/obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0) + var/turf/T = src.loc + var/turf/T2 = src.loc + var/obj/machinery/shieldwallgen/G + var/steps = 0 + var/oNSEW = 0 + + if(!NSEW)//Make sure its ran right + return + + if(NSEW == 1) + oNSEW = 2 + else if(NSEW == 2) + oNSEW = 1 + else if(NSEW == 4) + oNSEW = 8 + else if(NSEW == 8) + oNSEW = 4 + + for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for another generator + T = get_step(T2, NSEW) + T2 = T + steps += 1 + if(locate(/obj/machinery/shieldwallgen) in T) + G = (locate(/obj/machinery/shieldwallgen) in T) + steps -= 1 + if(!G.active) + return + G.cleanup(oNSEW) + break + + if(isnull(G)) + return + + T2 = src.loc + + for(var/dist = 0, dist < steps, dist += 1) // creates each field tile + var/field_dir = get_dir(T2,get_step(T2, NSEW)) + T = get_step(T2, NSEW) + T2 = T + var/obj/machinery/shieldwall/CF = new/obj/machinery/shieldwall/(src, G) //(ref to this gen, ref to connected gen) + CF.loc = T + CF.dir = field_dir + + +/obj/machinery/shieldwallgen/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/wrench)) + if(active) + user << "Turn off the field generator first." + return + + else if(state == 0) + state = 1 + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user << "You secure the external reinforcing bolts to the floor." + src.anchored = 1 + return + + else if(state == 1) + state = 0 + playsound(src.loc, 'Ratchet.ogg', 75, 1) + user << "You undo the external reinforcing bolts." + src.anchored = 0 + return + + if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) + if (src.allowed(user)) + src.locked = !src.locked + user << "Controls are now [src.locked ? "locked." : "unlocked."]" + else + user << "\red Access denied." + + else + src.add_fingerprint(user) + user << "\red You hit the [src.name] with your [W.name]!" + for(var/mob/M in viewers(src)) + if(M == user) continue + M.show_message("\red The [src.name] has been hit with the [W.name] by [user.name]!") + +/obj/machinery/shieldwallgen/proc/cleanup(var/NSEW) + var/obj/machinery/shieldwall/F + var/obj/machinery/shieldwallgen/G + var/turf/T = src.loc + var/turf/T2 = src.loc + + for(var/dist = 0, dist <= 9, dist += 1) // checks out to 8 tiles away for fields + T = get_step(T2, NSEW) + T2 = T + if(locate(/obj/machinery/shieldwall) in T) + F = (locate(/obj/machinery/shieldwall) in T) + del(F) + + if(locate(/obj/machinery/shieldwallgen) in T) + G = (locate(/obj/machinery/shieldwallgen) in T) + if(!G.active) + break + +/obj/machinery/shieldwallgen/Del() + src.cleanup(1) + src.cleanup(2) + src.cleanup(4) + src.cleanup(8) + ..() + + + + +/obj/machinery/shield + New() + src.dir = pick(1,2,3,4) + + ..() + + update_nearby_tiles(need_rebuild=1) + + Del() + update_nearby_tiles() + + ..() + + CanPass(atom/movable/mover, turf/target, height, air_group) + if(!height || air_group) return 0 + else return ..() + + proc/update_nearby_tiles(need_rebuild) + if(!air_master) return 0 + + var/turf/simulated/source = loc + var/turf/simulated/north = get_step(source,NORTH) + var/turf/simulated/south = get_step(source,SOUTH) + var/turf/simulated/east = get_step(source,EAST) + var/turf/simulated/west = get_step(source,WEST) + + if(need_rebuild) + if(istype(source)) //Rebuild/update nearby group geometry + if(source.parent) + air_master.groups_to_rebuild += source.parent + else + air_master.tiles_to_update += source + if(istype(north)) + if(north.parent) + air_master.groups_to_rebuild += north.parent + else + air_master.tiles_to_update += north + if(istype(south)) + if(south.parent) + air_master.groups_to_rebuild += south.parent + else + air_master.tiles_to_update += south + if(istype(east)) + if(east.parent) + air_master.groups_to_rebuild += east.parent + else + air_master.tiles_to_update += east + if(istype(west)) + if(west.parent) + air_master.groups_to_rebuild += west.parent + else + air_master.tiles_to_update += west + else + if(istype(source)) air_master.tiles_to_update += source + if(istype(north)) air_master.tiles_to_update += north + if(istype(south)) air_master.tiles_to_update += south + if(istype(east)) air_master.tiles_to_update += east + if(istype(west)) air_master.tiles_to_update += west + + return 1 + + +//////////////Contaiment Field START + + +/obj/machinery/shieldwall/New(var/obj/machinery/shieldwallgen/A, var/obj/machinery/shieldwallgen/B) + ..() + src.gen_primary = A + src.gen_secondary = B + spawn(1) + src.sd_SetLuminosity(5) + +/obj/machinery/shieldwall/attack_hand(mob/user as mob) + return + + +/obj/machinery/shieldwall/process() + if(isnull(gen_primary)||isnull(gen_secondary)) + del(src) + return + + if(!(gen_primary.active)||!(gen_secondary.active)) + del(src) + return \ No newline at end of file diff --git a/code/game/objects/shieldgen.dm b/code/game/objects/shieldgen.dm deleted file mode 100644 index 073cf622804..00000000000 --- a/code/game/objects/shieldgen.dm +++ /dev/null @@ -1,236 +0,0 @@ -/obj/shieldgen/Del() - for(var/obj/shield/shield_tile in deployed_shields) - del(shield_tile) - - ..() - -/obj/shieldgen/var/list/obj/shield/deployed_shields - -/obj/shieldgen/proc - shields_up() - if(active) return 0 - - for(var/turf/target_tile in range(2, src)) - if (istype(target_tile,/turf/space) && !(locate(/obj/shield) in target_tile)) - if (malfunction && prob(33) || !malfunction) - deployed_shields += new /obj/shield(target_tile) - - src.anchored = 1 - src.active = 1 - src.icon_state = malfunction ? "shieldonbr":"shieldon" - - spawn src.process() - - shields_down() - if(!active) return 0 - - for(var/obj/shield/shield_tile in deployed_shields) - del(shield_tile) - - src.anchored = 0 - src.active = 0 - src.icon_state = malfunction ? "shieldoffbr":"shieldoff" - -/obj/shieldgen/proc/process() - if(active) - src.icon_state = malfunction ? "shieldonbr":"shieldon" - - if(malfunction) - while(prob(10)) - del(pick(deployed_shields)) - - spawn(30) - src.process() - return - -/obj/shieldgen/proc/checkhp() - if(health <= 30) - src.malfunction = 1 - if(health <= 10 && prob(75)) - del(src) - if (active) - src.icon_state = malfunction ? "shieldonbr":"shieldon" - else - src.icon_state = malfunction ? "shieldoffbr":"shieldoff" - return - -/obj/shieldgen/meteorhit(obj/O as obj) - src.health -= 25 - if (prob(5)) - src.malfunction = 1 - src.checkhp() - return - -/obj/shield/meteorhit(obj/O as obj) - if (prob(75)) - del(src) - return - -/obj/shieldgen/ex_act(severity) - switch(severity) - if(1.0) - src.health -= 75 - src.checkhp() - if(2.0) - src.health -= 30 - if (prob(15)) - src.malfunction = 1 - src.checkhp() - if(3.0) - src.health -= 10 - src.checkhp() - return - -/obj/shield/ex_act(severity) - switch(severity) - if(1.0) - if (prob(75)) - del(src) - if(2.0) - if (prob(50)) - del(src) - if(3.0) - if (prob(25)) - del(src) - return - -/obj/shieldgen/attack_hand(mob/user as mob) - if (active) - for(var/mob/viwer in viewers(world.view, src.loc)) - viwer << text("\icon[] [user] deactivated the shield generator.", src) - - shields_down() - - else - for(var/mob/viwer in viewers(world.view, src.loc)) - viwer << text("\icon[] [user] activated the shield generator.", src) - - shields_up() - -/obj/shieldwallgen/attack_hand(mob/user as mob) - /* - if (!active) - for(var/mob/O in viewers(world.view, src.loc)) - O << text("\icon[] [user] activated the shield generator.", src) - - var/xa - var/ya - var/piece - var/atom/A - - for(xa=(-range), xa<((range*2)+(1-range)), xa++) - for(ya=(-range), ya<((range*2)+(1-range)), ya++) - if ( (xa != range && xa != -range) && (ya != range && ya != -range) ) - continue - if(xa == -range && ya == range) piece = NORTHWEST - if(xa == range && ya == range) piece = NORTHEAST - if(xa == -range && ya == -range) piece = SOUTHWEST - if(xa == range && ya == -range) piece = SOUTHEAST - if( (xa != range && xa != -range) && ya == range) piece = NORTH - if( (xa != range && xa != -range) && ya == -range) piece = SOUTH - if( xa == range && (ya != range && ya != -range)) piece = EAST - if( xa == -range && (ya != range && ya != -range)) piece = WEST - - A = locate((src.x + xa),(src.y + ya),src.z) - if (!A.density) - var/obj/shieldwall/created = new /obj/shieldwall ( locate((src.x + xa),(src.y + ya),src.z) ) - created.dir = piece - A:updatecell = 0 - A:buildlinks() - - src.anchored = 1 - src.active = 1 - else - for(var/mob/O in viewers(world.view, src.loc)) - O << text("\icon[] [user] deactivated the shield generator.", src) - var/tile - var/tilepick - var/xa - var/ya - for(xa=(-range), xa<((range*2)+(1-range)), xa++) - for(ya=(-range), ya<((range*2)+(1-range)), ya++) - if ( (xa != range && xa != -range) && (ya != range && ya != -range) ) - continue - tilepick = null - tile = locate( (src.x + xa),(src.y + ya),src.z ) - tilepick = locate(/obj/shieldwall) in tile - if(tilepick) del(tilepick) - tile:updatecell = 1 - tile:buildlinks() - src.anchored = 0 - src.active = 0 - */ - -/obj/shieldgen/attack_paw(mob/user as mob) - if (active) - for(var/mob/O in viewers(world.view, src.loc)) - O << text("\icon[] [user] deactivated the shield generator.", src) - - shields_down() - - else - for(var/mob/O in viewers(world.view, src.loc)) - O << text("\icon[] [user] activated the shield generator.", src) - - shields_up() - -/obj/shield - New() - src.dir = pick(1,2,3,4) - - ..() - - update_nearby_tiles(need_rebuild=1) - - Del() - update_nearby_tiles() - - ..() - - CanPass(atom/movable/mover, turf/target, height, air_group) - if(!height || air_group) return 0 - else return ..() - - proc/update_nearby_tiles(need_rebuild) - if(!air_master) return 0 - - var/turf/simulated/source = loc - var/turf/simulated/north = get_step(source,NORTH) - var/turf/simulated/south = get_step(source,SOUTH) - var/turf/simulated/east = get_step(source,EAST) - var/turf/simulated/west = get_step(source,WEST) - - if(need_rebuild) - if(istype(source)) //Rebuild/update nearby group geometry - if(source.parent) - air_master.groups_to_rebuild += source.parent - else - air_master.tiles_to_update += source - if(istype(north)) - if(north.parent) - air_master.groups_to_rebuild += north.parent - else - air_master.tiles_to_update += north - if(istype(south)) - if(south.parent) - air_master.groups_to_rebuild += south.parent - else - air_master.tiles_to_update += south - if(istype(east)) - if(east.parent) - air_master.groups_to_rebuild += east.parent - else - air_master.tiles_to_update += east - if(istype(west)) - if(west.parent) - air_master.groups_to_rebuild += west.parent - else - air_master.tiles_to_update += west - else - if(istype(source)) air_master.tiles_to_update += source - if(istype(north)) air_master.tiles_to_update += north - if(istype(south)) air_master.tiles_to_update += south - if(istype(east)) air_master.tiles_to_update += east - if(istype(west)) air_master.tiles_to_update += west - - return 1 \ No newline at end of file diff --git a/goonstation.dme b/goonstation.dme index a58f38eaab6..4bbd974aeb4 100644 --- a/goonstation.dme +++ b/goonstation.dme @@ -348,6 +348,7 @@ #include "code\game\machinery\rechargestation.dm" #include "code\game\machinery\robot_fabricator.dm" #include "code\game\machinery\seed_extractor.dm" +#include "code\game\machinery\shieldgen.dm" #include "code\game\machinery\singularity.dm" #include "code\game\machinery\sink.dm" #include "code\game\machinery\Sleeper.dm" @@ -443,7 +444,6 @@ #include "code\game\objects\object_procs.dm" #include "code\game\objects\portals.dm" #include "code\game\objects\secure_closets.dm" -#include "code\game\objects\shieldgen.dm" #include "code\game\objects\sign_decals.dm" #include "code\game\objects\stool.dm" #include "code\game\objects\structures.dm" diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index e3f93622668..81d69e91842 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ