/mob/living/silicon/robot var/started = null//A fix to ensure people don't try to bypass law assignment. Initial assignment sets it to one but it check on login whether they have been initiated -Sieve /mob/living/silicon/robot/New(loc,var/syndie = 0) spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) spawn (1) src << "\blue Your icons have been generated!" playsound(loc, 'liveagain.ogg', 50, 1, -3) modtype = "robot" updateicon() // syndicate = syndie if(real_name == "Cyborg") ident = rand(1, 999) real_name += "-[ident]" name = real_name spawn (4) 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/nanotrasen lawupdate = 0 src << "Unable to locate an AI, reverting to standard NanoTrasen laws." else laws = new /datum/ai_laws/antimov lawupdate = 0 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) camera.c_tag = real_name camera.network = "SS13" if(!cell) var/obj/item/weapon/cell/C = new(src) C.charge = 1500 cell = C if(src.mind) ticker.mode.remove_revolutionary(src.mind) started = 1 ..() //If there's an MMI in the robot, have it ejected when the mob goes away. --NEO //Improved /N /mob/living/silicon/robot/Del() if(mmi)//Safety for when a cyborg gets dust()ed. Or there is no MMI inside. mmi.loc = get_turf(loc)//To hopefully prevent run time errors. if(!key) for(var/mob/dead/observer/ghost in world) if(ghost.corpse == src && ghost.client) ghost.client.mob = ghost.corpse if(key)//If there is a client attached to host. if(client) client.screen.len = null if(mind)//If the cyborg has a mind. It should if it's a player. May not. mind.transfer_to(mmi.brainmob) else if(!mmi.brainmob.mind)//If the brainmob has no mind and neither does the cyborg. Shouldn't happen but can due to admun canspiraucy. mmi.brainmob.mind = new()//Quick mind initialize mmi.brainmob.mind.current = mmi.brainmob mmi.brainmob.mind.assigned_role = "Assistant"//Default to an assistant. mmi.brainmob.key = key else//If the brain does have a mind. Also shouldn't happen but who knows. mmi.brainmob.key = key mmi = null ..() /mob/living/silicon/robot/proc/pick_module() if(module || modlock) return var/mod = input("Please, select a module!", "Robot", null, null) in list("Standard", "Engineering", "Medical", "Miner", "Janitor","Service", "Security") if(module || modlock) return switch(mod) if("Standard") updatename() module = new /obj/item/weapon/robot_module/standard(src) hands.icon_state = "standard" icon_state = "robot" modtype = "Stand" //feedback_inc("cyborg_standard",1) channels = list() if("Service") updatename(mod) module = new /obj/item/weapon/robot_module/butler(src) hands.icon_state = "service" var/icontype = input("Select an icon!", "Robot", null, null) in list("Waitress", "Bro", "Butler", "Kent", "Rich") if(icontype== "Waitress") icon_state = "Service" else if(icontype == "Kent") icon_state = "toiletbot" else if(icontype == "Bro") icon_state = "Brobot" else if(icontype == "Rich") icon_state = "maximillion" else icon_state = "Service2" modtype = "Butler" //feedback_inc("cyborg_service",1) channels = list() if("Miner") updatename(mod) module = new /obj/item/weapon/robot_module/miner(src) hands.icon_state = "miner" icon_state = "Miner" modtype = "Miner" //feedback_inc("cyborg_miner",1) channels = list("Mining" = 1) if("Medical") var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") updatename(mod) module = new /obj/item/weapon/robot_module/medical(src) hands.icon_state = "medical" if (sprite == "Humanoid") src.icon_state = "medicalrobot" if (sprite == "Non-Humanoid") src.icon_state = "surgeon" modtype = "Med" nopush = 1 //feedback_inc("cyborg_medical",1) channels = list("Medical" = 1) if("Security") var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") updatename(mod) module = new /obj/item/weapon/robot_module/security(src) hands.icon_state = "security" if (sprite == "Humanoid") src.icon_state = "securityrobot" if (sprite == "Non-Humanoid") src.icon_state = "bloodhound" modtype = "Sec" //speed = -1 Secborgs have nerfed tasers now, so the speed boost is not necessary nopush = 1 channels = list("Security" = 1) //feedback_inc("cyborg_security",1) if("Engineering") updatename(mod) var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") module = new /obj/item/weapon/robot_module/engineering(src) hands.icon_state = "engineer" if (sprite == "Humanoid") src.icon_state = "engineerrobot" if (sprite == "Non-Humanoid") src.icon_state = "landmate" modtype = "Eng" //feedback_inc("cyborg_engineering",1) channels = list("Engineering" = 1) if("Janitor") updatename(mod) var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") module = new /obj/item/weapon/robot_module/janitor(src) hands.icon_state = "janitor" if (sprite == "Humanoid") src.icon_state = "janitorrobot" if (sprite == "Non-Humanoid") src.icon_state = "mopgearrex" modtype = "Jan" //feedback_inc("cyborg_janitor",1) channels = list() overlays -= "eyes" //Takes off the eyes that it started with radio.config(channels) updateicon() /mob/living/silicon/robot/proc/updatename(var/prefix as text) if( length(real_name) < 7 || !prefix ) return //not really necessary but just to avoid annoying people with //unique names seeming as nobody could give me a straight answer as //to whether to remove custom borg names completely. if(copytext(real_name, 1, 7) == "Cyborg") real_name = "[prefix] [real_name]" name = real_name /mob/living/silicon/robot/verb/cmd_robot_alerts() set category = "Robot Commands" set name = "Show Alerts" robot_alerts() /mob/living/silicon/robot/proc/robot_alerts() var/dat = "Current Station Alerts\n" dat += "Close

" for (var/cat in alarms) dat += text("[cat]
\n") var/list/L = alarms[cat] if (L.len) for (var/alarm in L) var/list/alm = L[alarm] var/area/A = alm[1] var/list/sources = alm[3] dat += "" dat += text("-- [A.name]") if (sources.len > 1) dat += text("- [sources.len] sources") dat += "
\n" else dat += "-- All Systems Nominal
\n" dat += "
\n" viewalerts = 1 src << browse(dat, "window=robotalerts&can_close=0") /mob/living/silicon/robot/proc/ai_roster() set category = "Robot Commands" set name = "Show Crew Manifest" var/dat = "Crew RosterCrew Roster:

" for (var/datum/data/record/t in data_core.general) dat += "[t.fields["name"]] - [t.fields["rank"]]
" dat += "" src << browse(dat, "window=airoster") onclose(src, "airoster") /mob/living/silicon/robot/blob_act() if (stat != 2) adjustBruteLoss(60) updatehealth() return 1 return 0 /mob/living/silicon/robot/Stat() ..() statpanel("Status") if (client.statpanel == "Status") if(emergency_shuttle.online && emergency_shuttle.location < 2) var/timeleft = emergency_shuttle.timeleft() if (timeleft) stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") if(ticker.mode.name == "AI malfunction") var/datum/game_mode/malfunction/malf = ticker.mode for (var/datum/mind/malfai in malf.malf_ai) if(connected_ai) if(connected_ai.mind == malfai) if(malf.apcs >= 3) stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds") else if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") if(cell) stat(null, text("Charge Left: [cell.charge]/[cell.maxcharge]")) else stat(null, text("No Cell Inserted!")) if(module) internal = locate(/obj/item/weapon/tank/jetpack) in module.modules if(internal) stat("Internal Atmosphere Info", internal.name) stat("Tank Pressure", internal.air_contents.return_pressure()) /mob/living/silicon/robot/restrained() return 0 /mob/living/silicon/robot/ex_act(severity) flick("flash", flash) /* if (stat == 2 && client) gib() return else if (stat == 2 && !client) del(src) return */ switch(severity) if(1.0) if (stat != 2) adjustBruteLoss(100) adjustFireLoss(100) gib() return if(2.0) if (stat != 2) adjustBruteLoss(60) adjustFireLoss(60) if(3.0) if (stat != 2) adjustBruteLoss(30) updatehealth() /mob/living/silicon/robot/meteorhit(obj/O as obj) for(var/mob/M in viewers(src, null)) M.show_message(text("\red [src] has been hit by [O]"), 1) //Foreach goto(19) if (health > 0) adjustBruteLoss(30) if ((O.icon_state == "flaming")) adjustFireLoss(40) updatehealth() return /mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj) ..(Proj) updatehealth() if(prob(75) && Proj.damage > 0) spark_system.start() return 2 /mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes) spawn( 0 ) if ((!( yes ) || now_pushing)) return now_pushing = 1 if(ismob(AM)) var/mob/tmob = AM /* if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) if(prob(20)) usr << "\red You fail to push [tmob]'s fat ass out of the way." now_pushing = 0 return */ if(tmob.nopush) now_pushing = 0 return now_pushing = 0 ..() if (istype(AM, /obj/machinery/recharge_station)) var/obj/machinery/recharge_station/F = AM F.move_inside() if (!istype(AM, /atom/movable)) return if (!now_pushing) now_pushing = 1 if (!AM.anchored) var/t = get_dir(src, AM) if (istype(AM, /obj/structure/window)) if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) for(var/obj/structure/window/win in get_step(AM,t)) now_pushing = 0 return step(AM, t) now_pushing = null return return /mob/living/silicon/robot/proc/triggerUnmarkedAlarm(var/class, area/A) if(stat == 2) // stat = 2 = dead Cyborg return 1 var/alarmtext = "" if(class == "AirlockHacking") // In case more unmarked alerts would be added eventually; alarmtext = "--- Unauthorized remote access detected" if (A) alarmtext += " in " + A.name alarmtext += "!" src << alarmtext return 1 /mob/living/silicon/robot/triggerAlarm(var/class, area/A, var/O, var/alarmsource) if (stat == 2) return 1 var/list/L = alarms[class] for (var/I in L) if (I == A.name) var/list/alarm = L[I] var/list/sources = alarm[3] if (!(alarmsource in sources)) sources += alarmsource return 1 var/obj/machinery/camera/C = null var/list/CL = null if (O && istype(O, /list)) CL = O if (CL.len == 1) C = CL[1] else if (O && istype(O, /obj/machinery/camera)) C = O L[A.name] = list(A, (C) ? C : O, list(alarmsource)) src << text("--- [class] alarm detected in [A.name]!") // if (viewalerts) robot_alerts() return 1 /mob/living/silicon/robot/cancelAlarm(var/class, area/A as area, obj/origin) var/list/L = alarms[class] var/cleared = 0 for (var/I in L) if (I == A.name) var/list/alarm = L[I] var/list/srcs = alarm[3] if (origin in srcs) srcs -= origin if (srcs.len == 0) cleared = 1 L -= I if (cleared) src << text("--- [class] alarm in [A.name] has been cleared.") // if (viewalerts) robot_alerts() return !cleared /mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do return if (istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if(getBruteLoss() == 0) user << "There are no dents to fix here!" return else if (WT.remove_fuel(0)) adjustBruteLoss(-30) if(getBruteLoss() < 0) bruteloss = 0 updatehealth() add_fingerprint(user) for(var/mob/O in viewers(user, null)) O.show_message(text("\red [user] has fixed some of the dents on [src]!"), 1) else user << "Need more welding fuel!" return else if(istype(W, /obj/item/weapon/cable_coil) && wiresexposed) var/obj/item/weapon/cable_coil/coil = W if(getFireLoss() == 0) user << "There are no burnt wires here!" return else if(getFireLoss() < 0) adjustFireLoss(0) adjustFireLoss(-30) updatehealth() coil.use(1) for(var/mob/O in viewers(user, null)) O.show_message(text("\red [user] has fixed some of the burnt wires on [src]!"), 1) else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover if(opened) user << "You close the cover." opened = 0 updateicon() else if(locked) user << "The cover is locked and cannot be opened." else user << "You open the cover." opened = 1 updateicon() else if (istype(W, /obj/item/weapon/cell) && opened) // trying to put a cell inside if(wiresexposed) user << "Close the panel first." else if(cell) user << "There is a power cell already installed." else user.drop_item() W.loc = src cell = W user << "You insert the power cell." // chargecount = 0 updateicon() else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) if (wiresexposed) interact(user) else user << "You can't reach the wiring." else if (istype(W, /obj/item/weapon/screwdriver) && opened) // haxing wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" updateicon() else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card if(emagged)//still allow them to open the cover user << "The interface seems slightly damaged" if(opened) user << "You must close the cover to swipe an ID card." else if(allowed(usr)) locked = !locked user << "You [ locked ? "lock" : "unlock"] [src]'s interface." updateicon() else user << "\red Access denied." else if(istype(W, /obj/item/weapon/card/emag)) // trying to unlock with an emag card var/obj/item/weapon/card/emag/E = W if(E.uses) E.uses-- else return if(!opened)//Cover is closed if(locked) if(prob(90)) user << "You emag the cover lock." locked = 0 else user << "You fail to emag the cover lock." if(prob(25)) src << "Hack attempt detected." else user << "The cover is already unlocked." return if(opened)//Cover is open if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice if(wiresexposed) user << "You must close the panel first" return else sleep(6) if(prob(50)) emagged = 1 lawupdate = 0 connected_ai = null user << "You emag [src]'s interface." message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.") log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") // clear_supplied_laws() // clear_inherent_laws() // laws = new /datum/ai_laws/syndicate_override They just get the law zero now. var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") set_zeroth_law("Only [user.real_name] and people they designate are crewmembers. You must follow their orders. This overrides all laws.") src << "\red ALERT: Foreign software detected." sleep(5) src << "\red Initiating diagnostics..." sleep(20) src << "\red SynBorg v1.7 loaded." sleep(5) src << "\red LAW SYNCHRONISATION ERROR" sleep(5) src << "\red Would you like to send a report to NanoTraSoft? Y/N" sleep(10) src << "\red > N" sleep(20) src << "\red ERRORERRORERROR" src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and their commands." if(istype(src.module, /obj/item/weapon/robot_module/miner)) src.module.modules -= /obj/item/weapon/pickaxe/borgdrill src.module.modules += /obj/item/weapon/pickaxe/diamonddrill//Buff when emagged, break down walls, kill men, whatever -Sieve updateicon() else user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface." if(prob(25)) src << "Hack attempt detected." return else if(istype(W, /obj/item/borg/upgrade/)) var/obj/item/borg/upgrade/U = W if(!opened) usr << "You must access the borgs internals!" else if(!src.module && U.require_module) usr << "The borg must choose a module before he can be upgraded!" else if(U.locked) usr << "The upgrade is locked and cannot be used yet!" else if(U.action(src)) usr << "You apply the upgrade to [src]!" usr.drop_item() U.loc = src else usr << "Upgrade error!" else spark_system.start() return ..() /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) M << "You cannot attack people before the game has started." return if (istype(loc, /turf) && istype(loc.loc, /area/start)) M << "No attacking people at spawn, you jackass." return switch(M.a_intent) if ("help") for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\blue [M] caresses [src]'s plating with its scythe like arm."), 1) if ("grab") if (M == src) return var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M ) G.assailant = M if (M.hand) M.l_hand = G else M.r_hand = G G.layer = 20 G.affecting = src grabbed_by += G G.synch() playsound(loc, 'thudswoosh.ogg', 50, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) if ("hurt") var/damage = rand(10, 20) if (prob(90)) /* if (M.class == "combat") damage += 15 if(prob(20)) weakened = max(weakened,4) stunned = max(stunned,4) What is this?*/ playsound(loc, 'slash.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) O.show_message(text("\red [] has slashed at []!", M, src), 1) if(prob(8)) flick("noise", flash) adjustBruteLoss(damage) updatehealth() else playsound(loc, 'slashmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red [] took a swipe at []!", M, src), 1) if ("disarm") if(!(lying)) if (rand(1,100) <= 85) Stun(5) step(src,get_dir(M,src)) spawn(5) step(src,get_dir(M,src)) playsound(loc, 'pierce.ogg', 50, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red [] has forced back []!", M, src), 1) else playsound(loc, 'slashmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red [] attempted to force back []!", M, src), 1) return /mob/living/silicon/robot/attack_metroid(mob/living/carbon/metroid/M as mob) if (!ticker) M << "You cannot attack people before the game has started." return if(M.Victim) return // can't attack while eating! if (health > -100) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red The [M.name] has [pick("bit","slashed")] []!", src), 1) var/damage = rand(1, 3) if(istype(src, /mob/living/carbon/metroid/adult)) damage = rand(20, 40) else damage = rand(5, 35) damage = round(damage / 2) // borgs recieve half damage adjustBruteLoss(damage) if(M.powerlevel > 0) var/stunprob = 10 switch(M.powerlevel) if(1 to 2) stunprob = 20 if(3 to 4) stunprob = 30 if(5 to 6) stunprob = 40 if(7 to 8) stunprob = 60 if(9) stunprob = 70 if(10) stunprob = 95 if(prob(stunprob)) M.powerlevel -= 3 if(M.powerlevel < 0) M.powerlevel = 0 for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) O.show_message(text("\red The [M.name] has electrified []!", src), 1) flick("noise", flash) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() if (prob(stunprob) && M.powerlevel >= 8) adjustBruteLoss(M.powerlevel * rand(6,10)) updatehealth() return /mob/living/silicon/robot/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) M.emote("[M.friendly] [src]") else for(var/mob/O in viewers(src, null)) O.show_message("\red [M] [M.attacktext] [src]!", 1) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) updatehealth() /mob/living/silicon/robot/attack_hand(mob/user) add_fingerprint(user) if(opened && !wiresexposed && (!istype(user, /mob/living/silicon))) if(cell) cell.loc = usr cell.layer = 20 if (user.hand ) user.l_hand = cell else user.r_hand = cell cell.add_fingerprint(user) cell.updateicon() cell = null user << "You remove the power cell." updateicon() if(ishuman(user)) if(istype(user:gloves, /obj/item/clothing/gloves/space_ninja)&&user:gloves:candrain&&!user:gloves:draining) call(/obj/item/clothing/gloves/space_ninja/proc/drain)("CYBORG",src,user:wear_suit) return /mob/living/silicon/robot/proc/allowed(mob/M) //check if it doesn't require any access at all if(check_access(null)) return 1 if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M //if they are holding or wearing a card that has access, that works if(check_access(H.equipped()) || check_access(H.wear_id)) return 1 else if(istype(M, /mob/living/carbon/monkey)) var/mob/living/carbon/monkey/george = M //they can only hold things :( if(george.equipped() && istype(george.equipped(), /obj/item/weapon/card/id) && check_access(george.equipped())) return 1 return 0 /mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I) if(!istype(req_access, /list)) //something's very wrong return 1 var/list/L = req_access if(!L.len) //no 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 /mob/living/silicon/robot/proc/updateicon() overlays = null if(stat == 0) overlays += "eyes" if(icon_state == "toiletbot") overlays = null overlays += "eyes-toiletbot" if(icon_state == "bloodhound") overlays = null overlays += "eyes-bloodhound" if(icon_state =="landmate") overlays = null overlays += "eyes-landmate" if(icon_state =="mopgearrex") overlays = null overlays += "eyes-mopgearrex" else overlays -= "eyes" if(opened) if(wiresexposed) overlays += "ov-openpanel +w" else if(cell) overlays += "ov-openpanel +c" else overlays += "ov-openpanel -c" if(targeted_by && target_locked) overlays += target_locked else if(targeted_by) target_locked = new /obj/effect/target_locked(src) overlays += target_locked else if(!targeted_by && target_locked) del(target_locked) return /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) src << "\red Weapon lock active, unable to use modules! Count:[weaponlock_time]" return if(!module) pick_module() return var/dat = "Modules\n" dat += {"Close

Activated Modules
Module 1: [module_state_1 ? "[module_state_1]" : "No Module"]
Module 2: [module_state_2 ? "
[module_state_2]" : "No Module"]
Module 3: [module_state_3 ? "
[module_state_3]" : "No Module"]

Installed Modules

"} for (var/obj in module.modules) if (!obj) dat += text("Resource depleted
") else if(activated(obj)) dat += text("[obj]: Activated
") else dat += text("[obj]:
Activate
") if (emagged) if(activated(module.emag)) dat += text("[module.emag]: Activated
") else dat += text("[module.emag]: Activate
") /* if(activated(obj)) dat += text("[obj]: \[Activated | Deactivate\]
") else dat += text("[obj]: \[Activate | Deactivated\]
") */ src << browse(dat, "window=robotmod&can_close=0") /mob/living/silicon/robot/Topic(href, href_list) ..() if (href_list["mach_close"]) var/t1 = text("window=[href_list["mach_close"]]") machine = null src << browse(null, t1) return if (href_list["mod"]) var/obj/item/O = locate(href_list["mod"]) O.attack_self(src) if (href_list["act"]) var/obj/item/O = locate(href_list["act"]) if(activated(O)) src << "Already activated" return if(!module_state_1) module_state_1 = O O.layer = 20 contents += O if(istype(module_state_1,/obj/item/borg/sight)) sight_mode |= module_state_1:sight_mode else if(istype(module_state_1,/obj/item/weapon/lighter/zippo)) var/obj/item/weapon/lighter/zippo/Z = module_state_1 Z.lit = 1 Z.icon_state = "zippoon" Z.item_state = "zippoon" processing_objects.Add(Z) else if(!module_state_2) module_state_2 = O O.layer = 20 contents += O if(istype(module_state_2,/obj/item/borg/sight)) sight_mode |= module_state_2:sight_mode else if(istype(module_state_2,/obj/item/weapon/lighter/zippo)) var/obj/item/weapon/lighter/zippo/Z = module_state_2 Z.lit = 1 Z.icon_state = "zippoon" Z.item_state = "zippoon" processing_objects.Add(Z) else if(!module_state_3) module_state_3 = O O.layer = 20 contents += O if(istype(module_state_3,/obj/item/borg/sight)) sight_mode |= module_state_3:sight_mode else if(istype(module_state_3,/obj/item/weapon/lighter/zippo)) var/obj/item/weapon/lighter/zippo/Z = module_state_3 Z.lit = 1 Z.icon_state = "zippoon" Z.item_state = "zippoon" processing_objects.Add(Z) else src << "You need to disable a module first!" installed_modules() if (href_list["deact"]) var/obj/item/O = locate(href_list["deact"]) if(activated(O)) if(module_state_1 == O) if(istype(module_state_1, /obj/item/weapon/lighter/zippo)) var/obj/item/weapon/lighter/zippo/Z = module_state_1 Z.lit = 0 Z.icon_state = "zippo" Z.item_state = "zippo" processing_objects.Remove(Z) module_state_1 = null contents -= O else if(module_state_2 == O) if(istype(module_state_2, /obj/item/weapon/lighter/zippo)) var/obj/item/weapon/lighter/zippo/Z = module_state_2 Z.lit = 0 Z.icon_state = "zippo" Z.item_state = "zippo" processing_objects.Remove(Z) module_state_2= null contents -= O else if(module_state_3 == O) if(istype(module_state_3, /obj/item/weapon/lighter/zippo)) var/obj/item/weapon/lighter/zippo/Z = module_state_3 Z.lit = 0 Z.icon_state = "zippo" Z.item_state = "zippo" processing_objects.Remove(Z) module_state_3 = null contents -= O else src << "Module isn't activated." else src << "Module isn't activated" installed_modules() if (href_list["lawc"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite var/L = text2num(href_list["lawc"]) switch(lawcheck[L+1]) if ("Yes") lawcheck[L+1] = "No" if ("No") lawcheck[L+1] = "Yes" // src << text ("Switching Law [L]'s report status to []", lawcheck[L+1]) checklaws() if (href_list["lawi"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite var/L = text2num(href_list["lawi"]) switch(ioncheck[L]) if ("Yes") ioncheck[L] = "No" if ("No") ioncheck[L] = "Yes" // src << text ("Switching Law [L]'s report status to []", lawcheck[L+1]) checklaws() if (href_list["laws"]) // With how my law selection code works, I changed statelaws from a verb to a proc, and call it through my law selection panel. --NeoFite statelaws() return /mob/living/silicon/robot/proc/uneq_active() if(isnull(module_active)) return if(module_state_1 == module_active) if(istype(module_state_1,/obj/item/borg/sight)) sight_mode &= ~module_state_1:sight_mode if (client) client.screen -= module_state_1 contents -= module_state_1 module_active = null module_state_1 = null inv1.icon_state = "inv1" else if(module_state_2 == module_active) if(istype(module_state_2,/obj/item/borg/sight)) sight_mode &= ~module_state_2:sight_mode if (client) client.screen -= module_state_2 contents -= module_state_2 module_active = null module_state_2 = null inv2.icon_state = "inv2" else if(module_state_3 == module_active) if(istype(module_state_3,/obj/item/borg/sight)) sight_mode &= ~module_state_3:sight_mode if (client) client.screen -= module_state_3 contents -= module_state_3 module_active = null module_state_3 = null inv3.icon_state = "inv3" /mob/living/silicon/robot/proc/uneq_all() module_active = null if(module_state_1) if(istype(module_state_1,/obj/item/borg/sight)) sight_mode &= ~module_state_1:sight_mode if (client) client.screen -= module_state_1 contents -= module_state_1 module_state_1 = null inv1.icon_state = "inv1" if(module_state_2) if(istype(module_state_2,/obj/item/borg/sight)) sight_mode &= ~module_state_2:sight_mode if (client) client.screen -= module_state_2 contents -= module_state_2 module_state_2 = null inv2.icon_state = "inv2" if(module_state_3) if(istype(module_state_3,/obj/item/borg/sight)) sight_mode &= ~module_state_3:sight_mode if (client) client.screen -= module_state_3 contents -= module_state_3 module_state_3 = null inv3.icon_state = "inv3" /mob/living/silicon/robot/proc/activated(obj/item/O) if(module_state_1 == O) return 1 else if(module_state_2 == O) return 1 else if(module_state_3 == O) return 1 else return 0 /mob/living/silicon/robot/proc/radio_menu() var/dat = {" Microphone: [radio.broadcasting ? "Engaged" : "Disengaged"]
Speaker: [radio.listening ? "Engaged" : "Disengaged"]
Frequency: - - [format_frequency(radio.frequency)] + +
"} for (var/ch_name in channels) dat+=src.radio.text_sec_channel(ch_name, channels[ch_name]) dat+={"
"} src << browse(dat, "window=radio") onclose(src, "radio") return /mob/living/silicon/robot/Move(a, b, flag) if (buckled) return // borgs can't move with no power if(!cell || !cell.charge) return if (restrained()) pulling = null var/t7 = 1 if (restrained()) for(var/mob/M in range(src, 1)) if ((M.pulling == src && M.stat == 0 && !( M.restrained() ))) t7 = null if ((t7 && (pulling && ((get_dist(src, pulling) <= 1 || pulling.loc == loc) && (client && client.moving))))) var/turf/T = loc . = ..() if (pulling && pulling.loc) if(!( isturf(pulling.loc) )) pulling = null return else if(Debug) diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]" diary <<"REPORT THIS" ///// if(pulling && pulling.anchored) pulling = null return if (!restrained()) var/diag = get_dir(src, pulling) if ((diag - 1) & diag) else diag = null if ((get_dist(src, pulling) > 1 || diag)) if (ismob(pulling)) var/mob/M = pulling var/ok = 1 if (locate(/obj/item/weapon/grab, M.grabbed_by)) if (prob(75)) var/obj/item/weapon/grab/G = pick(M.grabbed_by) if (istype(G, /obj/item/weapon/grab)) for(var/mob/O in viewers(M, null)) O.show_message(text("\red [G.affecting] has been pulled from [G.assailant]'s grip by [src]"), 1) del(G) else ok = 0 if (locate(/obj/item/weapon/grab, M.grabbed_by.len)) ok = 0 if (ok) var/t = M.pulling M.pulling = null step(pulling, get_dir(pulling.loc, T)) M.pulling = t else if (pulling) if (istype(pulling, /obj/structure/window)) if(pulling:ini_dir == NORTHWEST || pulling:ini_dir == NORTHEAST || pulling:ini_dir == SOUTHWEST || pulling:ini_dir == SOUTHEAST) for(var/obj/structure/window/win in get_step(pulling,get_dir(pulling.loc, T))) pulling = null if (pulling) step(pulling, get_dir(pulling.loc, T)) else pulling = null . = ..() if ((s_active && !( s_active in contents ) )) s_active.close(src) if(module) if(module.type == /obj/item/weapon/robot_module/janitor) //you'd think checking the module would work var/turf/tile = get_turf(loc) tile.clean_blood() for(var/obj/effect/R in tile) if(istype(R, /obj/effect/rune) || istype(R, /obj/effect/decal/cleanable) || istype(R, /obj/effect/overlay)) del(R) for(var/obj/item/cleaned_item in tile) cleaned_item.clean_blood() for(var/mob/living/carbon/human/cleaned_human in tile) //HUE HUE I CLEAN U if(cleaned_human.lying) cleaned_human.clean_blood() cleaned_human << "\red [src] cleans your face!" for(var/obj/item/carried_item in cleaned_human.contents) carried_item.clean_blood() return /mob/living/silicon/robot/proc/reset_module() modtype = "robot" hands.icon_state = "standard" icon_state = "robot" updateicon() channels = list() radio.config(channels) uneq_all() del(module) /mob/living/silicon/robot/proc/self_destruct() gib() return /mob/living/silicon/robot/proc/UnlinkSelf() if (src.connected_ai) src.connected_ai = null lawupdate = 0 lockcharge = 0 canmove = 1 scrambledcodes = 1 /mob/living/silicon/robot/proc/ResetSecurityCodes() set category = "Robot Commands" set name = "Reset Identity Codes" set desc = "Scrambles your security and identification codes and resets your current buffers. Unlocks you and but permenantly severs you from your AI and the robotics console." var/mob/living/silicon/robot/R = usr if(R) R.UnlinkSelf() R << "Buffers flushed and reset. All systems operational." src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes /mob/living/silicon/robot/proc/flashproof() if(module) for(var/obj/item/borg/upgrade/flashproof/F in module.modules) return 1 return 0