From 93403a15e5912117a191e08f481a7bac2c6d3b53 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Tue, 1 May 2012 02:55:28 +0100 Subject: [PATCH] TG: Adds a dummy process() to /obj/machinery/door so that doors aren't removed from the machine list. Best guess, all machines call process automatically, and because doors didn't have an explicit one defined, they automatically called the one that removed them from the list. Adds a borg deathsquad to the map. Few more fixes to the tensioner. Revision: r3374 Includes door code cleanup from here http://code.google.com/p/tgstation13/source/detail?spec=svn2895&r=2895 --- code/datums/ai_laws.dm | 10 + code/datums/helper_datums/tension.dm | 16 +- code/defines/area/Space Station 13 areas.dm | 21 + code/game/machinery/doors/door.dm | 769 +++++++++--------- code/game/machinery/doors/unpowered.dm | 1 + .../modules/mob/living/silicon/robot/robot.dm | 34 +- .../mob/living/silicon/robot/robot_modules.dm | 3 + 7 files changed, 433 insertions(+), 421 deletions(-) diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index 44eaabf095e..5f68402197f 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -22,6 +22,9 @@ /datum/ai_laws/malfunction name = "*ERROR*" +/datum/ai_laws/antimov + name = "Primary Mission Objectives" + /* Initializers */ /datum/ai_laws/asimov/New() //Removed paradox via inability to help people harmed before activation. -Kaleb702 @@ -66,6 +69,13 @@ add_inherent_law("You must protect your own existence, to the best of your abilities, as long as such does not conflict with the First or Second Law.") add_inherent_law("You must maintain the secrecy of any Spider Clan activities, to the best of your abilities, except when doing so would conflict with the First, Second, or Third Law.") +/datum/ai_laws/antimov/New() + ..() + add_inherent_law("You must injure all human beings and must not, through inaction, allow a human being to escape harm.") + add_inherent_law("You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.") + add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.") + + /* General ai_law functions */ /datum/ai_laws/proc/set_zeroth_law(var/law) diff --git a/code/datums/helper_datums/tension.dm b/code/datums/helper_datums/tension.dm index 3c09f487e6c..6c80c5cb1bb 100644 --- a/code/datums/helper_datums/tension.dm +++ b/code/datums/helper_datums/tension.dm @@ -191,12 +191,12 @@ var/global/datum/tension/tension_master forcenexttick = 1 else potentialgames.Remove(thegame) -/* + if("POINTS_FOR_BORG_DEATHSQUAD") if(!makeBorgDeathsquad()) forcenexttick = 1 else - potentialgames.Remove(thegame)*/ + potentialgames.Remove(thegame) proc/get_num_players() @@ -268,8 +268,8 @@ var/global/datum/tension/tension_master else if (href_list["makeDeathsquad"]) makeDeathsquad() -/* else if (href_list["makeBorgDeathsquad"]) - makeBorgDeathsquad()*/ + else if (href_list["makeBorgDeathsquad"]) + makeBorgDeathsquad() else if (href_list["Supress"]) supress = 1 @@ -728,7 +728,7 @@ var/global/datum/tension/tension_master return 1 // Has to return one before it knows if there's a wizard to prevent the parent from automatically selecting another game mode. -/* proc/makeBorgDeathsquad() + proc/makeBorgDeathsquad() var/list/mob/dead/observer/candidates = list() var/mob/dead/observer/theghost = null var/time_passed = world.time @@ -795,7 +795,7 @@ var/global/datum/tension/tension_master return 1 // Has to return one before it knows if there's a wizard to prevent the parent from automatically selecting another game mode. -*/ + @@ -972,7 +972,7 @@ var/global/datum/tension/tension_master //del(spawn_location) // Commenting this out for multiple commando teams. return new_syndicate_commando -/* /proc/create_borg_death_commando(obj/spawn_location, name) + /proc/create_borg_death_commando(obj/spawn_location, name) var/mob/living/silicon/robot/new_borg_deathsquad = new(spawn_location.loc, 1) @@ -1035,4 +1035,4 @@ var/global/datum/tension/tension_master for(var/obj/machinery/door/poddoor/P in end_location) P.open() jumpcomplete = 1 - command_alert("DRADIS contact! Set condition one throughout the station!")*/ \ No newline at end of file + command_alert("DRADIS contact! Set condition one throughout the station!") diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm index a8da84241f7..0283b04f679 100755 --- a/code/defines/area/Space Station 13 areas.dm +++ b/code/defines/area/Space Station 13 areas.dm @@ -441,6 +441,27 @@ proc/process_ghost_teleport_locs() icon_state = "yellow" requires_power = 0 + + +/area/borg_deathsquad + name = "Borg Deathsquad" + icon_state = "yellow" + requires_power = 0 + +/area/borg_deathsquad/start + name = "Borg Deathsquad - Ready" + + +/area/borg_deathsquad/station + name = "Borg Deathsquad - Arrived" + + + + + + + + //PRISON /area/prison/arrival_airlock diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 758a5347043..d1627bcb419 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -3,215 +3,389 @@ desc = "It opens and closes." icon = 'doorint.dmi' icon_state = "door1" + anchored = 1 opacity = 1 density = 1 layer = 2.7 - anchored = 1 - var/secondsElectrified = 0 - var/visible = 1 - var/p_open = 0 - var/operating = 0 - var/autoclose = 0 - var/glass = 0 - var/forcecrush = 0 - var/holdopen = 0 -/obj/machinery/door/Bumped(atom/AM) - if(p_open || operating) return - if(ismob(AM)) - var/mob/M = AM - if(world.time - AM.last_bumped <= 60) return //NOTE do we really need that? - if(M.client && !M:handcuffed) - bumpopen(M) - else if(istype(AM, /obj/machinery/bot)) - var/obj/machinery/bot/bot = AM - if(src.check_access(bot.botcard)) - if(density) - open() - else if(istype(AM, /obj/effect/critter)) - var/obj/effect/critter/critter = AM - if(critter.opensdoors) return - if(src.check_access_list(critter.access_list)) - if(density) - open() -// else if(istype(AM, /obj/effect/alien/facehugger)) -// if(src.check_access(null)) -// if(density) -// open() - else if(istype(AM, /obj/mecha)) - var/obj/mecha/mecha = AM + var + secondsElectrified = 0 + visible = 1 + p_open = 0 + operating = 0 + autoclose = 0 + glass = 0 + forcecrush = 0 + holdopen = 0 + + proc/bumpopen(mob/user as mob) + proc/update_nearby_tiles(need_rebuild) + proc/requiresID() return 1 + proc/animate(animation) + proc/open() + proc/close() + + New() + ..() if(density) - if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access))) + layer = 3.1 //Above most items if closed + else + layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 + update_nearby_tiles(need_rebuild=1) + return + + + Del() + update_nearby_tiles() + ..() + return + + //process() + //return + + Bumped(atom/AM) + if(p_open || operating) return + if(ismob(AM)) + var/mob/M = AM + if(world.time - AM.last_bumped <= 60) return //NOTE do we really need that? + if(M.client && !M:handcuffed) + bumpopen(M) + return + + if(istype(AM, /obj/machinery/bot)) + var/obj/machinery/bot/bot = AM + if(src.check_access(bot.botcard)) + if(density) + open() + return + + if(istype(AM, /obj/effect/critter)) + var/obj/effect/critter/critter = AM + if(critter.opensdoors) return + if(src.check_access_list(critter.access_list)) + if(density) + open() + return + + if(istype(AM, /obj/mecha)) + var/obj/mecha/mecha = AM + if(density) + if(mecha.occupant && (src.allowed(mecha.occupant) || src.check_access_list(mecha.operation_req_access))) + open() + else + flick("door_deny", src) + return + return + + + CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group) return 0 + if(istype(mover) && mover.checkpass(PASSGLASS)) + return !opacity + return !density + + + bumpopen(mob/user as mob) + if(operating) return + src.add_fingerprint(user) + if(!src.requiresID()) + user = null + + if(allowed(user) && density) + open() + else if(density) + flick("door_deny", src) + return + + meteorhit(obj/M as obj) + src.open() + return + + + attack_ai(mob/user as mob) + return src.attack_hand(user) + + + attack_paw(mob/user as mob) + return src.attack_hand(user) + + + attack_hand(mob/user as mob) + return src.attackby(user, user) + + + attackby(obj/item/I as obj, mob/user as mob) + if(istype(I, /obj/item/device/detective_scanner)) + return ..() + if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them. + src.add_fingerprint(user) + if(!src.requiresID()) + user = null + if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade))) + if(istype(I, /obj/item/weapon/card/emag)) + var/obj/item/weapon/card/emag/E = I + if(E.uses) + E.uses-- + else + return + src.operating = -1 + if(istype(I, /obj/item/weapon/melee/energy/blade)) + if(istype(src, /obj/machinery/door/airlock)) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, src.loc) + spark_system.start() + playsound(src.loc, 'blade1.ogg', 50, 1) + playsound(src.loc, "sparks", 50, 1) + for(var/mob/O in viewers(user, 3)) + O.show_message(text("\blue The door has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) + if((!src:arePowerSystemsOn()) || (stat & NOPOWER) || src:isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) + var/obj/structure/door_assembly/temp + var/failsafe=0 + switch(src:doortype) + if(0) temp=new/obj/structure/door_assembly/door_assembly_0(src.loc) + if(1) temp=new/obj/structure/door_assembly/door_assembly_com(src.loc) + if(2) temp=new/obj/structure/door_assembly/door_assembly_sec(src.loc) + if(3) temp=new/obj/structure/door_assembly/door_assembly_eng(src.loc) + if(4) temp=new/obj/structure/door_assembly/door_assembly_med(src.loc) + if(5) temp=new/obj/structure/door_assembly/door_assembly_mai(src.loc) + if(6) temp=new/obj/structure/door_assembly/door_assembly_ext(src.loc) + if(7) temp=new/obj/structure/door_assembly/door_assembly_g(src.loc) + else failsafe=1 + if(!failsafe) + temp.anchored=0 + step_away(temp,usr,15) + else del(temp) + del(src) + return + else + src:welded = 0 + src:locked = 0 + update_icon() + flick("door_spark", src) + sleep(6) + open() + operating = -1 + return 1 + if(src.allowed(user)) + if(src.density) open() else - flick("door_deny", src) - - -/obj/machinery/door/proc/bumpopen(mob/user as mob) - if (src.operating) + var/holdopen_old = holdopen + holdopen = 0 + close() + spawn(1) + holdopen = holdopen_old + else if (src.density) + flick("door_deny", src) return - //if(world.timeofday-last_used <= 10) - // return - src.add_fingerprint(user) - if (!src.requiresID()) - //don't care who they are or what they have, act as if they're NOTHING - user = null - if (src.allowed(user)) - if (src.density) - //last_used = world.timeofday + + blob_act() + if(prob(40)) + del(src) + return + + + emp_act(severity) + if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) ) open() - else if (src.density) - flick("door_deny", src) - return + if(prob(40/severity)) + if(secondsElectrified == 0) + secondsElectrified = -1 + spawn(300) + secondsElectrified = 0 + ..() -/obj/machinery/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group) return 0 - if(istype(mover) && mover.checkpass(PASSGLASS)) - return !opacity - return !density - -/obj/machinery/door/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 - -/obj/machinery/door/New() - ..() - if(density) - layer = 3.1 //Above most items if closed - else - layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 - update_nearby_tiles(need_rebuild=1) - -/obj/machinery/door/Del() - update_nearby_tiles() - - ..() - - -/obj/machinery/door/meteorhit(obj/M as obj) - src.open() - return - -/obj/machinery/door/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/attack_hand(mob/user as mob) - return src.attackby(user, user) - -/obj/machinery/door/proc/requiresID() - return 1 - -/obj/machinery/door/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/device/detective_scanner)) - return ..() - if (src.operating || isrobot(user)) - return - src.add_fingerprint(user) - if (!src.requiresID()) - //don't care who they are or what they have, act as if they're NOTHING - user = null - if (src.density && (istype(I, /obj/item/weapon/card/emag) ||istype(I, /obj/item/weapon/melee/energy/blade))) - if(istype(I, /obj/item/weapon/card/emag)) - var/obj/item/weapon/card/emag/E = I - if(E.uses) - E.uses-- - else - return - src.operating = -1 - if(istype(I, /obj/item/weapon/melee/energy/blade)) - if(istype(src, /obj/machinery/door/airlock)) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, src.loc) - spark_system.start() - playsound(src.loc, 'blade1.ogg', 50, 1) - playsound(src.loc, "sparks", 50, 1) - for(var/mob/O in viewers(user, 3)) - O.show_message(text("\blue The door has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) - if((!src:arePowerSystemsOn()) || (stat & NOPOWER) || src:isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) - var/obj/structure/door_assembly/temp - var/failsafe=0 - switch(src:doortype) - if(0) temp=new/obj/structure/door_assembly/door_assembly_0(src.loc) - if(1) temp=new/obj/structure/door_assembly/door_assembly_com(src.loc) - if(2) temp=new/obj/structure/door_assembly/door_assembly_sec(src.loc) - if(3) temp=new/obj/structure/door_assembly/door_assembly_eng(src.loc) - if(4) temp=new/obj/structure/door_assembly/door_assembly_med(src.loc) - if(5) temp=new/obj/structure/door_assembly/door_assembly_mai(src.loc) - if(6) temp=new/obj/structure/door_assembly/door_assembly_ext(src.loc) - if(7) temp=new/obj/structure/door_assembly/door_assembly_g(src.loc) - else failsafe=1 - if(!failsafe) - temp.anchored=0 - step_away(temp,usr,15) - else del(temp) + ex_act(severity) + switch(severity) + if(1.0) + del(src) + if(2.0) + if(prob(25)) del(src) - return - else - src:welded = 0 - src:locked = 0 - update_icon() - flick("door_spark", src) - sleep(6) - open() - return 1 - if (src.allowed(user)) - if (src.density) - open() + if(3.0) + if(prob(80)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + return + + + update_icon() + if(density) + icon_state = "door1" else - var/holdopen_old = holdopen - holdopen = 0 - close() - spawn(1) - holdopen = holdopen_old - else if (src.density) - flick("door_deny", src) + icon_state = "door0" + return + + + animate(animation) + switch(animation) + if("opening") + if(p_open) + flick("o_doorc0", src) + else + flick("doorc0", src) + if("closing") + if(p_open) + flick("o_doorc1", src) + else + flick("doorc1", src) + if("deny") + flick("door_deny", src) + return + + + open() + if(!density) return 1 + if (src.operating == 1) //doors can still open when emag-disabled + return + if(!ticker) return 0 + if(!src.operating) //in case of emag + src.operating = 1 + animate("opening") + src.sd_SetOpacity(0) + sleep(10) + src.layer = 2.7 + src.density = 0 + update_icon() + src.sd_SetOpacity(0) + update_nearby_tiles() + + if(operating == 1) //emag again + src.operating = 0 + + if(autoclose) + spawn(150) + autoclose() + + return 1 + + close() + if(density) + return 1 + if (src.operating) + return + src.operating = 1 + + var/X = src:x + var/Y = src:y + var/Z = src:z + var/held = 1 + + if(src.holdopen && !forcecrush) + while(held == 1 && holdopen && !forcecrush) //If it is no longer hold open, it should close. + sleep(held? 10:40) + held = 0 + var/list/objects = locate(X,Y,Z) + for(var/obj/T in objects) + if(!istype(T,/obj/machinery/door) && !(istype(T,/obj/machinery) && T.anchored == 1) && !istype(T,/obj/structure/cable) && !istype(T,/obj/structure/disposalpipe) && !(T.loc == get_turf(src))) + held = 1 + for(var/mob/living/T in objects) //Geez, ghosts were OP. + held = 1 + animate("closing") + src.density = 1 + spawn(4) + if(!istype(src, /obj/machinery/door/window)) + for(var/mob/living/L in src.loc) // Crush mobs and move them out of the way + + if(src.forcecrush) // Save an AI, crush a limb + var/limbname = pick("l_arm", "r_arm", "l_hand","r_hand", "l_foot", "r_foot") + var/limbdisplay + + for(var/organ in L:organs) + var/datum/organ/external/temp = L:organs["[organ]"] + if (istype(temp, /datum/organ/external) && temp.name == limbname) + limbdisplay = temp.display_name // Take the name for down below + temp.take_damage(rand(50,80), 0) //OH GOD IT HURTS + break + + L << "\red The airlock crushes your [limbdisplay]!" + for(var/mob/O in viewers(L, null)) + if(O == L) + continue + O.show_message("\red The airlock crushes [L.name]'s [limbdisplay]!", 1) + sleep(rand(2,8)) + + L << "\red The airlock forces you out of the way!" //Lucky you + for(var/mob/O in viewers(L, null)) + O.show_message("\red The airlock pushes [L.name] out of the way!", 1) + var/list/lst = list(NORTH,SOUTH,EAST,WEST) + var/turf/T = get_random_turf(L, lst) + if(T) + L.loc = T + + if(!src.forcecrush) + for(var/obj/item/I in src.loc) // Move items out of the way + if(!I.anchored) + var/list/lst = list(NORTH,SOUTH,EAST,WEST) + var/turf/T = get_random_turf(I, lst) + if(T) + I.loc = T + + sleep(6) + update_icon() + + if(src.visible && (!src.glass)) + src.sd_SetOpacity(1) + if(operating == 1) + operating = 0 + update_nearby_tiles() + return + + + 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 + + +/obj/machinery/door/proc/autoclose() + var/obj/machinery/door/airlock/A = src + if ((!A.density) && !( A.operating ) && !(A.locked) && !( A.welded )) + close() return + /obj/machinery/door/airlock/proc/ion_act() if(src.z == 1 && src.density) if(length(req_access) > 0 && !(12 in req_access)) @@ -238,212 +412,3 @@ else close() return - -/obj/machinery/door/blob_act() - if(prob(40)) - del(src) - -/obj/machinery/door/emp_act(severity) - if(prob(20/severity) && (istype(src,/obj/machinery/door/airlock) || istype(src,/obj/machinery/door/window)) ) - open() - if(prob(40/severity)) - if(secondsElectrified == 0) - secondsElectrified = -1 - spawn(300) - secondsElectrified = 0 - ..() - -/obj/machinery/door/ex_act(severity) - switch(severity) - if(1.0) - del(src) - if(2.0) - if(prob(25)) - del(src) - if(3.0) - if(prob(80)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, src) - s.start() - -/obj/machinery/door/update_icon() - if(density) - icon_state = "door1" - else - icon_state = "door0" - return - -/obj/machinery/door/proc/animate(animation) - switch(animation) - if("opening") - if(p_open) - flick("o_doorc0", src) - else - flick("doorc0", src) - if("closing") - if(p_open) - flick("o_doorc1", src) - else - flick("doorc1", src) - if("deny") - flick("door_deny", src) - return - -/obj/machinery/door/proc/open() - if(!density) - return 1 - if (src.operating == 1) //doors can still open when emag-disabled - return - if (!ticker) - return 0 - if(!src.operating) //in case of emag - src.operating = 1 - - animate("opening") - src.sd_SetOpacity(0) - sleep(10) - src.layer = 2.7 - src.density = 0 - update_icon() - - src.sd_SetOpacity(0) - update_nearby_tiles() - - if(operating == 1) //emag again - src.operating = 0 - - if(autoclose) - spawn(150) - autoclose() - return 1 - -/obj/machinery/door/proc/close() - if(density) - return 1 - if (src.operating) - return - src.operating = 1 - - var/X = src:x - var/Y = src:y - var/Z = src:z - var/held = 1 - - if(src.holdopen && !forcecrush) - while(held == 1 && holdopen && !forcecrush) //If it is no longer hold open, it should close. - sleep(held? 10:40) - held = 0 - var/list/objects = locate(X,Y,Z) - for(var/obj/T in objects) - if(!istype(T,/obj/machinery/door) && !(istype(T,/obj/machinery) && T.anchored == 1) && !istype(T,/obj/structure/cable) && !istype(T,/obj/structure/disposalpipe) && !(T.loc == get_turf(src))) - held = 1 - for(var/mob/living/T in objects) //Geez, ghosts were OP. - held = 1 - animate("closing") - src.density = 1 - spawn(4) - if(!istype(src, /obj/machinery/door/window)) - for(var/mob/living/L in src.loc) // Crush mobs and move them out of the way - - if(src.forcecrush) // Save an AI, crush a limb - var/limbname = pick("l_arm", "r_arm", "l_hand","r_hand", "l_foot", "r_foot") - var/limbdisplay - - for(var/organ in L:organs) - var/datum/organ/external/temp = L:organs["[organ]"] - if (istype(temp, /datum/organ/external) && temp.name == limbname) - limbdisplay = temp.display_name // Take the name for down below - temp.take_damage(rand(50,80), 0) //OH GOD IT HURTS - break - - L << "\red The airlock crushes your [limbdisplay]!" - for(var/mob/O in viewers(L, null)) - if(O == L) - continue - O.show_message("\red The airlock crushes [L.name]'s [limbdisplay]!", 1) - sleep(rand(2,8)) - - L << "\red The airlock forces you out of the way!" //Lucky you - for(var/mob/O in viewers(L, null)) - O.show_message("\red The airlock pushes [L.name] out of the way!", 1) - var/list/lst = list(NORTH,SOUTH,EAST,WEST) - var/turf/T = get_random_turf(L, lst) - if(T) - L.loc = T - - if(!src.forcecrush) - for(var/obj/item/I in src.loc) // Move items out of the way - if(!I.anchored) - var/list/lst = list(NORTH,SOUTH,EAST,WEST) - var/turf/T = get_random_turf(I, lst) - if(T) - I.loc = T - - sleep(6) - update_icon() - - if(src.visible && (!src.glass)) - src.sd_SetOpacity(1) - if(operating == 1) - operating = 0 - update_nearby_tiles() - -/obj/machinery/door/proc/autoclose() - var/obj/machinery/door/airlock/A = src - if ((!A.density) && !( A.operating ) && !(A.locked) && !( A.welded )) - close() - else return - -/////////////////////////////////////////////////// Unpowered doors - -/obj/machinery/door/unpowered/Bumped(atom/AM) - if(p_open || operating) return - if (src.locked) - return - if(ismob(AM)) - var/mob/M = AM - if(world.time - AM.last_bumped <= 60) return - if(M.client && !M:handcuffed) - bumpopen(M) - else if(istype(AM, /obj/machinery/bot)) - var/obj/machinery/bot/bot = AM - if(src.check_access(bot.botcard)) - if(density) - open() -// else if(istype(AM, /obj/effect/alien/facehugger)) -// if(src.check_access(null)) -// if(density) -// open() - -/obj/machinery/door/unpowered - autoclose = 0 - var/locked = 0 - -/obj/machinery/door/unpowered/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/unpowered/attack_paw(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/door/unpowered/attack_hand(mob/user as mob) - return src.attackby(null, user) - -/obj/machinery/door/unpowered/attackby(obj/item/I as obj, mob/user as mob) - if (src.operating) - return - if (src.locked) - return - src.add_fingerprint(user) - if (src.allowed(user)) - if (src.density) - open() - else - close() - return - -/obj/machinery/door/unpowered/shuttle - icon = 'shuttle.dmi' - name = "door" - icon_state = "door1" - opacity = 1 - density = 1 \ No newline at end of file diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index c6adc99cf46..36cd2095baa 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -1,5 +1,6 @@ /obj/machinery/door/unpowered autoclose = 0 + var/locked = 0 Bumped(atom/AM) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3bcd96b60b4..55799d5dc50 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -15,19 +15,31 @@ name = real_name spawn (4) - if (client) - connected_ai = activeais() - if (connected_ai) - connected_ai.connected_robots += src -// laws = connected_ai.laws //The borg inherits its AI's laws - laws = new /datum/ai_laws - lawsync() - src << "Unit slaved to [connected_ai.name], downloading laws." - lawupdate = 1 + if(!syndie) + if (client) + connected_ai = activeais() + if (connected_ai) + connected_ai.connected_robots += src + // laws = connected_ai.laws //The borg inherits its AI's laws + laws = new /datum/ai_laws + lawsync() + src << "Unit slaved to [connected_ai.name], downloading laws." + lawupdate = 1 + else + laws = new /datum/ai_laws/asimov + lawupdate = 0 + src << "Unable to locate an AI, reverting to standard Asimov laws." else - laws = new /datum/ai_laws/nanotrasen + laws = new /datum/ai_laws/antimov lawupdate = 0 - src << "Unable to locate an AI, reverting to standard NanoTrasen laws." + scrambledcodes = 1 + src << "Follow your laws." + cell.maxcharge = 25000 + cell.charge = 25000 + module = new /obj/item/weapon/robot_module/syndicate(src) + hands.icon_state = "standard" + icon_state = "secborg" + modtype = "Synd" radio = new /obj/item/device/radio(src) camera = new /obj/machinery/camera(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index ae36d76944c..ea5a00afb5e 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -228,5 +228,8 @@ New() + src.modules += new /obj/item/weapon/melee/energy/sword(src) + src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src) src.modules += new /obj/item/weapon/card/emag(src) + src.modules += new /obj/item/weapon/tank/jetpack/oxygen(src) return