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