diff --git a/baystation12.dme b/baystation12.dme
index a61e3eb7b11..35d7c754fdd 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -6,230 +6,14 @@
// BEGIN_FILE_DIR
#define FILE_DIR .
#define FILE_DIR "code"
-#define FILE_DIR "code/__HELPERS"
-#define FILE_DIR "code/ATMOSPHERICS"
-#define FILE_DIR "code/ATMOSPHERICS/components"
-#define FILE_DIR "code/ATMOSPHERICS/components/binary_devices"
-#define FILE_DIR "code/ATMOSPHERICS/components/trinary_devices"
-#define FILE_DIR "code/ATMOSPHERICS/components/unary"
-#define FILE_DIR "code/controllers"
-#define FILE_DIR "code/datums"
-#define FILE_DIR "code/datums/diseases"
-#define FILE_DIR "code/datums/diseases/advance"
-#define FILE_DIR "code/datums/diseases/advance/symptoms"
-#define FILE_DIR "code/datums/helper_datums"
-#define FILE_DIR "code/datums/organs"
-#define FILE_DIR "code/datums/spells"
-#define FILE_DIR "code/defines"
-#define FILE_DIR "code/defines/obj"
-#define FILE_DIR "code/defines/procs"
-#define FILE_DIR "code/FEA"
-#define FILE_DIR "code/game"
-#define FILE_DIR "code/game/area"
-#define FILE_DIR "code/game/gamemodes"
-#define FILE_DIR "code/game/gamemodes/autotraitor"
-#define FILE_DIR "code/game/gamemodes/blob"
-#define FILE_DIR "code/game/gamemodes/blob/blobs"
-#define FILE_DIR "code/game/gamemodes/changeling"
-#define FILE_DIR "code/game/gamemodes/cult"
-#define FILE_DIR "code/game/gamemodes/epidemic"
-#define FILE_DIR "code/game/gamemodes/events"
-#define FILE_DIR "code/game/gamemodes/events/holidays"
-#define FILE_DIR "code/game/gamemodes/extended"
-#define FILE_DIR "code/game/gamemodes/malfunction"
-#define FILE_DIR "code/game/gamemodes/meme"
-#define FILE_DIR "code/game/gamemodes/meteor"
-#define FILE_DIR "code/game/gamemodes/nuclear"
-#define FILE_DIR "code/game/gamemodes/revolution"
-#define FILE_DIR "code/game/gamemodes/sandbox"
-#define FILE_DIR "code/game/gamemodes/traitor"
-#define FILE_DIR "code/game/gamemodes/wizard"
-#define FILE_DIR "code/game/jobs"
-#define FILE_DIR "code/game/jobs/job"
-#define FILE_DIR "code/game/machinery"
-#define FILE_DIR "code/game/machinery/atmoalter"
-#define FILE_DIR "code/game/machinery/bots"
-#define FILE_DIR "code/game/machinery/camera"
-#define FILE_DIR "code/game/machinery/computer"
-#define FILE_DIR "code/game/machinery/doors"
-#define FILE_DIR "code/game/machinery/embedded_controller"
-#define FILE_DIR "code/game/machinery/kitchen"
-#define FILE_DIR "code/game/machinery/pipe"
-#define FILE_DIR "code/game/machinery/telecomms"
-#define FILE_DIR "code/game/magic"
-#define FILE_DIR "code/game/mecha"
-#define FILE_DIR "code/game/mecha/combat"
-#define FILE_DIR "code/game/mecha/equipment"
-#define FILE_DIR "code/game/mecha/equipment/tools"
-#define FILE_DIR "code/game/mecha/equipment/weapons"
-#define FILE_DIR "code/game/mecha/medical"
-#define FILE_DIR "code/game/mecha/working"
-#define FILE_DIR "code/game/objects"
-#define FILE_DIR "code/game/objects/closets"
-#define FILE_DIR "code/game/objects/closets/secure"
-#define FILE_DIR "code/game/objects/effects"
-#define FILE_DIR "code/game/objects/effects/decals"
-#define FILE_DIR "code/game/objects/effects/decals/Cleanable"
-#define FILE_DIR "code/game/objects/effects/spawners"
-#define FILE_DIR "code/game/objects/items"
-#define FILE_DIR "code/game/objects/items/devices"
-#define FILE_DIR "code/game/objects/items/devices/PDA"
-#define FILE_DIR "code/game/objects/items/devices/radio"
-#define FILE_DIR "code/game/objects/items/robot"
-#define FILE_DIR "code/game/objects/items/stacks"
-#define FILE_DIR "code/game/objects/items/stacks/sheets"
-#define FILE_DIR "code/game/objects/items/stacks/tiles"
-#define FILE_DIR "code/game/objects/items/weapons"
-#define FILE_DIR "code/game/objects/items/weapons/grenades"
-#define FILE_DIR "code/game/objects/items/weapons/implants"
-#define FILE_DIR "code/game/objects/items/weapons/melee"
-#define FILE_DIR "code/game/objects/items/weapons/storage"
-#define FILE_DIR "code/game/objects/items/weapons/tanks"
-#define FILE_DIR "code/game/objects/storage"
-#define FILE_DIR "code/game/objects/structures"
-#define FILE_DIR "code/game/objects/structures/crates_lockers"
-#define FILE_DIR "code/game/objects/structures/crates_lockers/closets"
-#define FILE_DIR "code/game/objects/structures/crates_lockers/closets/secure"
-#define FILE_DIR "code/game/objects/structures/stool_bed_chair_nest"
-#define FILE_DIR "code/game/structure"
-#define FILE_DIR "code/game/turfs"
-#define FILE_DIR "code/game/turfs/simulated"
-#define FILE_DIR "code/game/turfs/space"
-#define FILE_DIR "code/game/turfs/unsimulated"
-#define FILE_DIR "code/game/vehicles"
-#define FILE_DIR "code/game/verbs"
-#define FILE_DIR "code/js"
-#define FILE_DIR "code/modules"
-#define FILE_DIR "code/modules/admin"
-#define FILE_DIR "code/modules/admin/DB ban"
-#define FILE_DIR "code/modules/admin/permissionverbs"
-#define FILE_DIR "code/modules/admin/verbs"
-#define FILE_DIR "code/modules/assembly"
-#define FILE_DIR "code/modules/awaymissions"
-#define FILE_DIR "code/modules/awaymissions/maploader"
-#define FILE_DIR "code/modules/client"
-#define FILE_DIR "code/modules/clothing"
-#define FILE_DIR "code/modules/clothing/glasses"
-#define FILE_DIR "code/modules/clothing/gloves"
-#define FILE_DIR "code/modules/clothing/head"
-#define FILE_DIR "code/modules/clothing/masks"
-#define FILE_DIR "code/modules/clothing/shoes"
-#define FILE_DIR "code/modules/clothing/spacesuits"
-#define FILE_DIR "code/modules/clothing/suits"
-#define FILE_DIR "code/modules/clothing/under"
-#define FILE_DIR "code/modules/clothing/under/jobs"
-#define FILE_DIR "code/modules/customitems"
-#define FILE_DIR "code/modules/destilery"
-#define FILE_DIR "code/modules/DetectiveWork"
-#define FILE_DIR "code/modules/events"
-#define FILE_DIR "code/modules/flufftext"
-#define FILE_DIR "code/modules/food"
-#define FILE_DIR "code/modules/genetics"
-#define FILE_DIR "code/modules/icon generation"
-#define FILE_DIR "code/modules/library"
-#define FILE_DIR "code/modules/liquid"
-#define FILE_DIR "code/modules/maps"
-#define FILE_DIR "code/modules/mining"
-#define FILE_DIR "code/modules/mob"
-#define FILE_DIR "code/modules/mob/dead"
-#define FILE_DIR "code/modules/mob/dead/observer"
-#define FILE_DIR "code/modules/mob/living"
-#define FILE_DIR "code/modules/mob/living/blob"
-#define FILE_DIR "code/modules/mob/living/carbon"
-#define FILE_DIR "code/modules/mob/living/carbon/alien"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/humanoid/caste"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/larva"
-#define FILE_DIR "code/modules/mob/living/carbon/alien/special"
-#define FILE_DIR "code/modules/mob/living/carbon/brain"
-#define FILE_DIR "code/modules/mob/living/carbon/human"
-#define FILE_DIR "code/modules/mob/living/carbon/metroid"
-#define FILE_DIR "code/modules/mob/living/carbon/monkey"
-#define FILE_DIR "code/modules/mob/living/silicon"
-#define FILE_DIR "code/modules/mob/living/silicon/ai"
-#define FILE_DIR "code/modules/mob/living/silicon/ai/freelook"
-#define FILE_DIR "code/modules/mob/living/silicon/decoy"
-#define FILE_DIR "code/modules/mob/living/silicon/pai"
-#define FILE_DIR "code/modules/mob/living/silicon/robot"
-#define FILE_DIR "code/modules/mob/living/simple_animal"
-#define FILE_DIR "code/modules/mob/living/simple_animal/friendly"
-#define FILE_DIR "code/modules/mob/living/simple_animal/hostile"
-#define FILE_DIR "code/modules/mob/living/simple_animal/hostile/retaliate"
-#define FILE_DIR "code/modules/mob/new_player"
-#define FILE_DIR "code/modules/paperwork"
-#define FILE_DIR "code/modules/power"
-#define FILE_DIR "code/modules/power/antimatter"
-#define FILE_DIR "code/modules/power/singularity"
-#define FILE_DIR "code/modules/power/singularity/particle_accelerator"
-#define FILE_DIR "code/modules/projectiles"
-#define FILE_DIR "code/modules/projectiles/ammunition"
-#define FILE_DIR "code/modules/projectiles/guns"
-#define FILE_DIR "code/modules/projectiles/guns/energy"
-#define FILE_DIR "code/modules/projectiles/guns/projectile"
-#define FILE_DIR "code/modules/projectiles/projectile"
-#define FILE_DIR "code/modules/reagents"
-#define FILE_DIR "code/modules/reagents/reagent_containers"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food/drinks/bottle"
-#define FILE_DIR "code/modules/reagents/reagent_containers/food/snacks"
-#define FILE_DIR "code/modules/reagents/reagent_containers/glass"
-#define FILE_DIR "code/modules/reagents/reagent_containers/glass/bottle"
-#define FILE_DIR "code/modules/recycling"
-#define FILE_DIR "code/modules/research"
-#define FILE_DIR "code/modules/research/xenoarchaeology"
-#define FILE_DIR "code/modules/scripting"
-#define FILE_DIR "code/modules/scripting/AST"
-#define FILE_DIR "code/modules/scripting/AST/Operators"
-#define FILE_DIR "code/modules/scripting/Implementations"
-#define FILE_DIR "code/modules/scripting/Interpreter"
-#define FILE_DIR "code/modules/scripting/Parser"
-#define FILE_DIR "code/modules/scripting/Scanner"
-#define FILE_DIR "code/modules/security levels"
-#define FILE_DIR "code/modules/surgery"
#define FILE_DIR "code/TriDimension"
-#define FILE_DIR "code/unused"
-#define FILE_DIR "code/unused/beast"
-#define FILE_DIR "code/unused/computer2"
-#define FILE_DIR "code/unused/disease2"
-#define FILE_DIR "code/unused/gamemodes"
-#define FILE_DIR "code/unused/hivebot"
-#define FILE_DIR "code/unused/mining"
-#define FILE_DIR "code/unused/optics"
-#define FILE_DIR "code/unused/pda2"
-#define FILE_DIR "code/unused/powerarmor"
-#define FILE_DIR "code/unused/spacecraft"
#define FILE_DIR "code/WorkInProgress"
-#define FILE_DIR "code/WorkInProgress/AI_Visibility"
-#define FILE_DIR "code/WorkInProgress/animusstation"
-#define FILE_DIR "code/WorkInProgress/Apples"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn"
-#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Economy"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Jungle"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Rust"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/ShieldGen"
#define FILE_DIR "code/WorkInProgress/Cael_Aislinn/Supermatter"
-#define FILE_DIR "code/WorkInProgress/carn"
-#define FILE_DIR "code/WorkInProgress/Chinsky"
-#define FILE_DIR "code/WorkInProgress/Cib"
-#define FILE_DIR "code/WorkInProgress/Cib/amorph"
-#define FILE_DIR "code/WorkInProgress/Mini"
-#define FILE_DIR "code/WorkInProgress/Mloc"
-#define FILE_DIR "code/WorkInProgress/organs"
-#define FILE_DIR "code/WorkInProgress/Ported"
-#define FILE_DIR "code/WorkInProgress/Ported/Abi79"
-#define FILE_DIR "code/WorkInProgress/Ported/Bureaucracy"
-#define FILE_DIR "code/WorkInProgress/Ported/Spawners"
-#define FILE_DIR "code/WorkInProgress/Sigyn"
-#define FILE_DIR "code/WorkInProgress/Sigyn/Department Sec"
-#define FILE_DIR "code/WorkInProgress/Sigyn/Softcurity"
-#define FILE_DIR "code/WorkInProgress/SkyMarshal"
#define FILE_DIR "code/WorkInProgress/Susan"
-#define FILE_DIR "code/WorkInProgress/Tastyfish"
-#define FILE_DIR "code/WorkInProgress/virus2"
-#define FILE_DIR "code/WorkInProgress/virus2/Disease2"
-#define FILE_DIR "code/WorkInProgress/Wrongnumber"
-#define FILE_DIR "code/ZAS"
#define FILE_DIR "html"
#define FILE_DIR "icons"
#define FILE_DIR "icons/48x48"
@@ -251,9 +35,6 @@
#define FILE_DIR "icons/Testing"
#define FILE_DIR "icons/turf"
#define FILE_DIR "icons/vending_icons"
-#define FILE_DIR "interface"
-#define FILE_DIR "maps"
-#define FILE_DIR "maps/RandomZLevels"
#define FILE_DIR "sound"
#define FILE_DIR "sound/AI"
#define FILE_DIR "sound/ambience"
@@ -270,8 +51,6 @@
#define FILE_DIR "sound/violin"
#define FILE_DIR "sound/voice"
#define FILE_DIR "sound/weapons"
-#define FILE_DIR "tools"
-#define FILE_DIR "tools/Redirector"
// END_FILE_DIR
// BEGIN_PREFERENCES
#define DEBUG
@@ -1219,6 +998,7 @@
#include "code\modules\mob\living\simple_animal\friendly\mouse.dm"
#include "code\modules\mob\living\simple_animal\friendly\mushroom.dm"
#include "code\modules\mob\living\simple_animal\friendly\slime.dm"
+#include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm"
#include "code\modules\mob\living\simple_animal\friendly\tomato.dm"
#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
#include "code\modules\mob\living\simple_animal\hostile\bear.dm"
diff --git a/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm b/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm
index d3407e0dba8..3c07e1f2060 100644
--- a/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Economy/Accounts.dm
@@ -112,7 +112,7 @@ var/global/obj/machinery/account_database/centcomm_account_db
dat += "Confirm identity: [held_card ? held_card : "-----"]
"
if(access_level > 0)
- dat += "Toggle remote access to this database (warning!)"
+ dat += "[activated ? "Disable" : "Enable"] remote access
"
dat += "You may not edit accounts at this terminal, only create and view them.
"
if(creating_new_account)
dat += "
"
diff --git a/code/WorkInProgress/Mini/ATM.dm b/code/WorkInProgress/Mini/ATM.dm
index 68f9315182a..9578c3a2a3d 100644
--- a/code/WorkInProgress/Mini/ATM.dm
+++ b/code/WorkInProgress/Mini/ATM.dm
@@ -43,7 +43,7 @@ log transactions
if(stat & NOPOWER)
return
- if(linked_db && linked_db.stat & NOPOWER)
+ if(linked_db && ( (linked_db.stat & NOPOWER) || !linked_db.activated ) )
linked_db = null
authenticated_account = null
src.visible_message("\red \icon[src] [src] buzzes rudely, \"Connection to remote database lost.\"")
@@ -68,7 +68,7 @@ log transactions
/obj/machinery/atm/proc/reconnect_database()
for(var/obj/machinery/account_database/DB in world)
- if(DB.z == src.z && !DB.stat & NOPOWER)
+ if( DB.z == src.z && !(DB.stat & NOPOWER) && DB.activated )
linked_db = DB
break
@@ -259,7 +259,7 @@ log transactions
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
else
- usr << "\red \icon[src] incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining."
+ usr << "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining."
previous_account_number = tried_account_num
playsound(src, 'buzz-sigh.ogg', 50, 1)
else
@@ -279,6 +279,8 @@ log transactions
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
+ usr << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'"
+
previous_account_number = tried_account_num
if("withdrawal")
var/amount = max(text2num(href_list["funds_amount"]),0)
@@ -342,8 +344,8 @@ log transactions
held_card = I
if("logout")
authenticated_account = null
- usr << browse(null,"window=atm")
- return
+ //usr << browse(null,"window=atm")
+
src.attack_hand(usr)
//create the most effective combination of notes to make up the requested amount
@@ -385,3 +387,14 @@ log transactions
I = P.id
if(I)
authenticated_account = linked_db.attempt_account_access(I.associated_account_number)
+ if(authenticated_account)
+ human_user << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'"
+
+ //create a transaction log entry
+ var/datum/transaction/T = new()
+ T.target_name = authenticated_account.owner_name
+ T.purpose = "Remote terminal access"
+ T.source_terminal = machine_id
+ T.date = current_date_string
+ T.time = worldtime2text()
+ authenticated_account.transaction_log.Add(T)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 4a825fde0ec..62dfb126bf5 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -270,5 +270,12 @@
W.loc = src
src.flash1 = W
user << "\blue You insert the flash into the eye socket!"
+ else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
+ user << "\blue You install some manipulators and modify the head, creating a functional spider-bot!"
+ new /mob/living/simple_animal/spiderbot(get_turf(loc))
+ user.drop_item()
+ del(W)
+ del(src)
+ return
return
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index b972e2f9f80..fe3a0db56c5 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -10,14 +10,13 @@
var/construction_time = 75
var/searching = 0
var/askDelay = 10 * 60 * 1
-
+ var/mob/living/carbon/brain/brainmob = null
req_access = list(access_robotics)
var/locked = 0
- var/mob/living/carbon/brain/brainmob = null//The current occupant.
var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm.
attack_self(mob/user as mob)
- if(!brainmob && searching == 0)
+ if(!brainmob.key && searching == 0)
//Start the process of searching for a new user.
user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process."
icon_state = "posibrain-searching"
@@ -37,7 +36,7 @@
spawn(0)
if(!C) return
var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round")
- if(!C || brainmob) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
+ if(!C || brainmob.key) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
else if (response == "Never for this round")
@@ -47,25 +46,10 @@
proc/transfer_personality(var/mob/candidate)
- var/mob/living/carbon/brain/B = new(src)
-
src.searching = 0
-
- src.brainmob = B
src.brainmob.mind = candidate.mind
-
- src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
- src.brainmob.real_name = src.brainmob.name
- src.name = "positronic brain ([src.brainmob.name])"
- src.brainmob.loc = src
- src.brainmob.container = src
- src.brainmob.robot_talk_understand = 1
- src.brainmob.stat = 0
- src.brainmob.silent = 0
- src.brainmob.brain_op_stage = 4.0
src.brainmob.key = candidate.key
- dead_mob_list -= src.brainmob
- living_mob_list += src.brainmob
+ src.name = "positronic brain ([src.brainmob.name])"
src.brainmob << "You are a positronic brain, brought into existence on [station_name()]."
src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
@@ -101,7 +85,7 @@
var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n"
msg += ""
- if(src.brainmob)
+ if(src.brainmob.key)
switch(src.brainmob.stat)
if(CONSCIOUS)
if(!src.brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk
@@ -124,4 +108,19 @@
brainmob.emp_damage += rand(10,20)
if(3)
brainmob.emp_damage += rand(0,10)
+ ..()
+
+/obj/item/device/posibrain/New()
+
+ src.brainmob = new(src)
+ src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ src.brainmob.real_name = src.brainmob.name
+ src.brainmob.loc = src
+ src.brainmob.container = src
+ src.brainmob.robot_talk_understand = 1
+ src.brainmob.stat = 0
+ src.brainmob.silent = 0
+ src.brainmob.brain_op_stage = 4.0
+ dead_mob_list -= src.brainmob
+
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 1c2adbf7a6e..6a5407e3a92 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -106,7 +106,7 @@
var/list/listening = hearers(1, src)
listening -= src
- //listening += src
+ listening += src
var/list/heard = list()
for (var/mob/M in listening)
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
new file mode 100644
index 00000000000..cebc50e79be
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -0,0 +1,275 @@
+/mob/living/simple_animal/spiderbot
+
+ min_oxy = 0
+ max_tox = 0
+ max_co2 = 0
+ minbodytemp = 0
+ maxbodytemp = 500
+
+ var/obj/item/device/radio/borg/radio = null
+ var/mob/living/silicon/ai/connected_ai = null
+ var/obj/item/weapon/cell/cell = null
+ var/obj/machinery/camera/camera = null
+ var/obj/item/device/mmi/mmi = null
+ var/list/req_access = list(access_robotics)
+
+ name = "spider-bot"
+ desc = "A skittering robotic friend!"
+ icon = 'icons/mob/robots.dmi'
+ icon_state = "spiderbot-chassis"
+ icon_living = "spiderbot-chassis"
+ icon_dead = "spiderbot-smashed"
+ small = 1
+ speak_emote = list("beeps","clicks","chirps")
+ health = 10
+ maxHealth = 10
+ attacktext = "shocks"
+ attacktext = "shocks"
+ melee_damage_lower = 1
+ melee_damage_upper = 3
+ response_help = "pets"
+ response_disarm = "shoos"
+ response_harm = "stomps on"
+ wander = 0
+ speed = -1 //Spiderbots gotta go fast.
+
+/mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob)
+
+ if(istype(O, /obj/item/device/mmi) || istype(O, /obj/item/device/posibrain))
+ var/obj/item/device/mmi/B = O
+ if(src.mmi) //There's already a brain in it.
+ user << "\red There's already a brain in [src]!"
+ return
+ if(!B.brainmob)
+ user << "\red Sticking an empty MMI into the frame would sort of defeat the purpose."
+ return
+ if(!B.brainmob.key)
+ var/ghost_can_reenter = 0
+ if(B.brainmob.mind)
+ for(var/mob/dead/observer/G in player_list)
+ if(G.can_reenter_corpse && G.mind == B.brainmob.mind)
+ ghost_can_reenter = 1
+ break
+ if(!ghost_can_reenter)
+ user << "[O] is completely unresponsive; there's no point."
+ return
+
+ if(B.brainmob.stat == DEAD)
+ user << "\red [O] is dead. Sticking it into the frame would sort of defeat the purpose."
+ return
+
+ if(jobban_isbanned(B.brainmob, "Cyborg"))
+ user << "\red [O] does not seem to fit."
+ return
+
+ user << "\blue You install [O] in [src]!"
+
+ user.drop_item()
+ src.mmi = O
+ src.transfer_personality(O)
+
+ O.loc = src
+ src.update_icon()
+ return 1
+
+ if (istype(O, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = O
+ if (WT.remove_fuel(0))
+ if(health < maxHealth)
+ health += pick(1,1,1,2,2,3)
+ if(health > maxHealth)
+ health = maxHealth
+ add_fingerprint(user)
+ for(var/mob/W in viewers(user, null))
+ W.show_message(text("\red [user] has spot-welded some of the damage to [src]!"), 1)
+ else
+ user << "\blue [src] is undamaged!"
+ else
+ user << "Need more welding fuel!"
+ return
+ else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda))
+ if (!mmi)
+ user << "\red There's no reason to swipe your ID - the spiderbot has no brain to remove."
+ return 0
+
+ var/obj/item/weapon/card/id/id_card
+
+ if(istype(O, /obj/item/weapon/card/id))
+ id_card = O
+ else
+ var/obj/item/device/pda/pda = O
+ id_card = pda.id
+
+ if(check_access(id_card))
+ user << "\blue You swipe your access card and pop the brain out of [src]."
+ eject_brain()
+ return 1
+ else
+ user << "\red You swipe your card, with no effect."
+ return 0
+ else if (istype(O, /obj/item/weapon/card/emag))
+ if (!mmi)
+ user << "\red What exactly would that accomplish? The spiderbot has no brain to remove."
+ return 0
+ user << "\blue You short out the security protocols and overload [src]'s cell."
+
+ for(var/mob/M in viewers(src, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red [src] makes an odd warbling noise, fizzles, and explodes.")
+
+ eject_brain()
+ Die()
+
+ else
+ if(O.force)
+ var/damage = O.force
+ if (O.damtype == HALLOSS)
+ damage = 0
+ adjustBruteLoss(damage)
+ for(var/mob/M in viewers(src, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
+ else
+ usr << "\red This weapon is ineffective, it does no damage."
+ for(var/mob/M in viewers(src, null))
+ if ((M.client && !( M.blinded )))
+ M.show_message("\red [user] gently taps [src] with the [O]. ")
+
+/mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj)
+
+ src.mind = M.brainmob.mind
+ src.mind.key = M.brainmob.key
+ src.name = "spider-bot ([M.brainmob.name])"
+
+/mob/living/simple_animal/spiderbot/proc/update_icon()
+ if(mmi)
+ if (istype(mmi,/obj/item/device/mmi))
+ icon_state = "spiderbot-chassis-mmi"
+ icon_living = "spiderbot-chassis-mmi"
+ else
+ icon_state = "spiderbot-chassis-posi"
+ icon_living = "spiderbot-chassis-posi"
+ else
+ icon_state = "spiderbot-chassis"
+ icon_living = "spiderbot-chassis"
+
+/mob/living/simple_animal/spiderbot/proc/eject_brain()
+ if(mmi)
+ var/turf/T = get_turf(loc)
+ if(T)
+ mmi.loc = T
+ if(mind) mind.transfer_to(mmi.brainmob)
+ mmi = null
+ src.name = "spider-bot"
+ update_icon()
+
+/mob/living/simple_animal/spiderbot/Del()
+ eject_brain()
+ ..()
+
+/mob/living/simple_animal/spiderbot/New()
+
+ radio = new /obj/item/device/radio/borg(src)
+ camera = new /obj/machinery/camera(src)
+ camera.c_tag = "Spiderbot-[real_name]"
+ camera.network = list("SS13")
+
+ ..()
+
+/mob/living/simple_animal/spiderbot/Die()
+
+ living_mob_list -= src
+ dead_mob_list += src
+
+ if(camera)
+ camera.status = 0
+
+ robogibs(src.loc, viruses)
+ src.Del()
+ return
+
+/mob/living/simple_animal/spiderbot/proc/check_access(obj/item/weapon/card/id/I)
+
+ var/list/L = req_access
+ if(!L.len) //no access requirements.
+ return 1
+ if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
+ return 0
+ for(var/req in req_access)
+ if(!(req in I.access)) //doesn't have this access
+ return 0
+ return 1
+
+//copy paste from alien/larva, if that func is updated please update this one also
+/mob/living/simple_animal/spiderbot/verb/ventcrawl()
+ set name = "Crawl through Vent"
+ set desc = "Enter an air vent and crawl through the pipe system."
+ set category = "Spiderbot"
+
+// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
+// return
+ var/obj/machinery/atmospherics/unary/vent_pump/vent_found
+ var/welded = 0
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
+ if(!v.welded)
+ vent_found = v
+ break
+ else
+ welded = 1
+ if(vent_found)
+ if(vent_found.network&&vent_found.network.normal_members.len)
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
+ if(temp_vent.loc == loc)
+ continue
+ vents.Add(temp_vent)
+ var/list/choices = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
+ if(vent.loc.z != loc.z)
+ continue
+ var/atom/a = get_turf(vent)
+ choices.Add(a.loc)
+ var/turf/startloc = loc
+ var/obj/selection = input("Select a destination.", "Duct System") in choices
+ var/selection_position = choices.Find(selection)
+ if(loc==startloc)
+ var/obj/target_vent = vents[selection_position]
+ if(target_vent)
+ /*
+ for(var/mob/O in oviewers(src, null))
+ if ((O.client && !( O.blinded )))
+ O.show_message(text("[src] scrambles into the ventillation ducts!"), 1)
+ */
+ loc = target_vent.loc
+ else
+ src << "\blue You need to remain still while entering a vent."
+ else
+ src << "\blue This vent is not connected to anything."
+ else if(welded)
+ src << "\red That vent is welded."
+ else
+ src << "\blue You must be standing on or beside an air vent to enter it."
+ return
+
+//copy paste from alien/larva, if that func is updated please update this one alsoghost
+/mob/living/simple_animal/spiderbot/verb/hide()
+ set name = "Hide"
+ set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
+ set category = "Spiderbot"
+
+ if (layer != TURF_LAYER+0.2)
+ layer = TURF_LAYER+0.2
+ src << text("\blue You are now hiding.")
+ /*
+ for(var/mob/O in oviewers(src, null))
+ if ((O.client && !( O.blinded )))
+ O << text("[] scurries to the ground!", src)
+ */
+ else
+ layer = MOB_LAYER
+ src << text("\blue You have stopped hiding.")
+ /*
+ for(var/mob/O in oviewers(src, null))
+ if ((O.client && !( O.blinded )))
+ O << text("[] slowly peaks up from the ground...", src)
+ */
\ No newline at end of file
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index a5f92e97676..e0e658ed6fb 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen1_Midnight.dmi b/icons/mob/screen1_Midnight.dmi
index 8b63ff84366..94f4e23e6a8 100644
Binary files a/icons/mob/screen1_Midnight.dmi and b/icons/mob/screen1_Midnight.dmi differ
diff --git a/icons/mob/screen1_Orange.dmi b/icons/mob/screen1_Orange.dmi
index 37d0a49cda3..7ef1d84d897 100644
Binary files a/icons/mob/screen1_Orange.dmi and b/icons/mob/screen1_Orange.dmi differ
diff --git a/icons/mob/screen1_old.dmi b/icons/mob/screen1_old.dmi
index 2994f9fd7b5..fb2d2c21c59 100644
Binary files a/icons/mob/screen1_old.dmi and b/icons/mob/screen1_old.dmi differ
diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi
index a4a72b0a380..554d31c0837 100644
Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ