var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/sensor_mode ) #define CYBORG_POWER_USAGE_MULTIPLIER 2.5 // Multiplier for amount of power cyborgs use. /mob/living/silicon/robot name = "Cyborg" real_name = "Cyborg" icon = 'icons/mob/robots.dmi' icon_state = "robot" maxHealth = 200 health = 200 var/lights_on = 0 // Is our integrated light on? var/used_power_this_tick = 0 var/sight_mode = 0 var/custom_name = "" var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best var/crisis //Admin-settable for combat module use. var/crisis_override = 0 var/integrated_light_power = 5 //Hud stuff var/obj/screen/cells = null var/obj/screen/inv1 = null var/obj/screen/inv2 = null var/obj/screen/inv3 = null //3 Modules can be activated at any one time. var/obj/item/weapon/robot_module/module = null var/module_active = null var/module_state_1 = null var/module_state_2 = null var/module_state_3 = null 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 // Components are basically robot organs. var/list/components = list() var/obj/item/device/mmi/mmi = null var/obj/item/device/pda/ai/rbPDA = null var/opened = 0 var/emagged = 0 var/wiresexposed = 0 var/locked = 1 var/has_power = 1 var/list/req_access = list(access_robotics) var/ident = 0 //var/list/laws = list() var/viewalerts = 0 var/modtype = "Default" var/lower_mod = 0 var/jetpack = 0 var/datum/effect/effect/system/ion_trail_follow/ion_trail = null var/datum/effect/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N var/jeton = 0 var/borgwires = 31 // 0b11111 var/killswitch = 0 var/killswitch_time = 60 var/weapon_lock = 0 var/weaponlock_time = 120 var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default var/lawcheck[1] //For stating laws. var/ioncheck[1] //Ditto. var/lockcharge //Used when locking down a borg to preserve cell charge var/speed = 0 //Cause sec borgs gotta go fast //No they dont! var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them. var/braintype = "Cyborg" /mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0) spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) add_language("Robot Talk", 1) ident = rand(1, 999) updatename("Default") updateicon() if(syndie) if(!cell) cell = new /obj/item/weapon/cell(src) laws = new /datum/ai_laws/antimov() lawupdate = 0 scrambledcodes = 1 cell.maxcharge = 25000 cell.charge = 25000 module = new /obj/item/weapon/robot_module/syndicate(src) hands.icon_state = "standard" icon_state = "secborg" modtype = "Security" init() radio = new /obj/item/device/radio/borg(src) if(!scrambledcodes && !camera) camera = new /obj/machinery/camera(src) camera.c_tag = real_name camera.network = list("SS13","Robots") if(isWireCut(5)) // 5 = BORG CAMERA camera.status = 0 initialize_components() //if(!unfinished) // Create all the robot parts. for(var/V in components) if(V != "power cell") var/datum/robot_component/C = components[V] C.installed = 1 C.wrapped = new C.external_type if(!cell) cell = new /obj/item/weapon/cell(src) cell.maxcharge = 7500 cell.charge = 7500 ..() if(cell) var/datum/robot_component/cell_component = components["power cell"] cell_component.wrapped = cell cell_component.installed = 1 add_robot_verbs() hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100") hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") /mob/living/silicon/robot/proc/init() aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) laws = new /datum/ai_laws/nanotrasen() connected_ai = select_active_ai_with_fewest_borgs() if(connected_ai) connected_ai.connected_robots += src lawsync() photosync() lawupdate = 1 else lawupdate = 0 playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) // setup the PDA and its name /mob/living/silicon/robot/proc/setup_PDA() if (!rbPDA) rbPDA = new/obj/item/device/pda/ai(src) rbPDA.set_name_and_job(custom_name,"[modtype] [braintype]") //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. var/turf/T = get_turf(loc)//To hopefully prevent run time errors. if(T) mmi.loc = T if(mind) mind.transfer_to(mmi.brainmob) mmi = null ..() /mob/living/silicon/robot/proc/pick_module() if(module) return var/list/modules = list("Standard", "Engineering", "Construction", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security") if((crisis && security_level == SEC_LEVEL_RED) || crisis_override) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" modtype = input("Please, select a module!", "Robot", null, null) in modules var/module_sprites[0] //Used to store the associations between sprite names and sprite index. if(module) return switch(modtype) if("Standard") module = new /obj/item/weapon/robot_module/standard(src) module_sprites["Basic"] = "robot_old" module_sprites["Android"] = "droid" module_sprites["Default"] = "robot" module_sprites["Drone"] = "drone-standard" if("Service") module = new /obj/item/weapon/robot_module/butler(src) module_sprites["Waitress"] = "Service" module_sprites["Kent"] = "toiletbot" module_sprites["Bro"] = "Brobot" module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" module_sprites["Drone"] = "drone-service" // How does this even work...? Oh well. if("Clerical") module = new /obj/item/weapon/robot_module/clerical(src) module_sprites["Waitress"] = "Service" module_sprites["Kent"] = "toiletbot" module_sprites["Bro"] = "Brobot" module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" module_sprites["Drone"] = "drone-service" if("Miner") module = new /obj/item/weapon/robot_module/miner(src) module.channels = list("Supply" = 1) if(camera && "Robots" in camera.network) camera.network.Add("MINE") module_sprites["Basic"] = "Miner_old" module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" module_sprites["Drone"] = "drone-medical" if("Crisis") module = new /obj/item/weapon/robot_module/crisis(src) module.channels = list("Medical" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Medical") module_sprites["Basic"] = "Medbot" module_sprites["Standard"] = "surgeon" module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" if("Surgeon") module = new /obj/item/weapon/robot_module/surgeon(src) module.channels = list("Medical" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Medical") module_sprites["Basic"] = "Medbot" module_sprites["Standard"] = "surgeon" module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" module_sprites["Drone"] = "drone-medical" if("Security") module = new /obj/item/weapon/robot_module/security(src) module.channels = list("Security" = 1) module_sprites["Basic"] = "secborg" module_sprites["Red Knight"] = "Security" module_sprites["Black Knight"] = "securityrobot" module_sprites["Bloodhound"] = "bloodhound" module_sprites["Bloodhound - Treaded"] = "secborg+tread" module_sprites["Drone"] = "drone-sec" if("Engineering") module = new /obj/item/weapon/robot_module/engineering(src) module.channels = list("Engineering" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Engineering") module_sprites["Basic"] = "Engineering" module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" module_sprites["Landmate - Treaded"] = "engiborg+tread" module_sprites["Drone"] = "drone-engineer" if("Construction") module = new /obj/item/weapon/robot_module/construction(src) module.channels = list("Engineering" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Engineering") module_sprites["Basic"] = "Engineering" module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" module_sprites["Landmate - Treaded"] = "engiborg+tread" module_sprites["Drone"] = "drone-engineer" if("Janitor") module = new /obj/item/weapon/robot_module/janitor(src) module_sprites["Basic"] = "JanBot2" module_sprites["Mopbot"] = "janitorrobot" module_sprites["Mop Gear Rex"] = "mopgearrex" module_sprites["Drone"] = "drone-janitor" if("Combat") module = new /obj/item/weapon/robot_module/combat(src) module_sprites["Combat Android"] = "droid-combat" module.channels = list("Security" = 1) //languages module.add_languages(src) //Custom_sprite check and entry if (custom_sprite == 1) module_sprites["Custom"] = "[src.ckey]-[modtype]" hands.icon_state = lowertext(modtype) feedback_inc("cyborg_[lowertext(modtype)]",1) updatename() if(modtype == "Medical" || modtype == "Security" || modtype == "Combat") status_flags &= ~CANPUSH choose_icon(6,module_sprites) radio.config(module.channels) /mob/living/silicon/robot/proc/updatename(var/prefix as text) if(prefix) modtype = prefix if(mmi) if(istype(mmi, /obj/item/device/mmi/posibrain)) braintype = "Android" else braintype = "Cyborg" else braintype = "Robot" var/changed_name = "" if(custom_name) changed_name = custom_name else changed_name = "[modtype] [braintype]-[num2text(ident)]" real_name = changed_name name = real_name // if we've changed our name, we also need to update the display name for our PDA setup_PDA() //We also need to update name of internal camera. if (camera) camera.c_tag = changed_name if(!custom_sprite) //Check for custom sprite var/file = file2text("config/custom_sprites.txt") var/lines = text2list(file, "\n") for(var/line in lines) // split & clean up var/list/Entry = text2list(line, "-") for(var/i = 1 to Entry.len) Entry[i] = trim(Entry[i]) if(Entry.len < 2) continue; if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required custom_sprite = 1 icon = 'icons/mob/custom-synthetic.dmi' if(icon_state == "robot") icon_state = "[src.ckey]-Standard" /mob/living/silicon/robot/verb/Namepick() set category = "Robot Commands" if(custom_name) return 0 spawn(0) var/newname newname = input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text if (newname != "") custom_name = newname updatename() updateicon() /mob/living/silicon/robot/verb/cmd_robot_alerts() set category = "Robot Commands" set name = "Show Alerts" robot_alerts() // this verb lets cyborgs see the stations manifest /mob/living/silicon/robot/verb/cmd_station_manifest() set category = "Robot Commands" set name = "Show Crew Manifest" show_station_manifest() /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/alarmlist = alarms[cat] if (alarmlist.len) for (var/area_name in alarmlist) var/datum/alarm/alarm = alarmlist[area_name] dat += "" dat += text("-- [area_name]") if (alarm.sources.len > 1) dat += text("- [alarm.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/self_diagnosis() if(!is_component_functioning("diagnosis unit")) return null var/dat = "[src.name] Self-Diagnosis Report\n" for (var/V in components) var/datum/robot_component/C = components[V] dat += "[C.name]
Brute Damage:[C.brute_damage]
Electronics Damage:[C.electronics_damage]
Powered:[(!C.idle_usage || C.is_powered()) ? "Yes" : "No"]
Toggled:[ C.toggled ? "Yes" : "No"]

" return dat /mob/living/silicon/robot/verb/toggle_lights() set category = "Robot Commands" set name = "Toggle Lights" lights_on = !lights_on usr << "You [lights_on ? "enable" : "disable"] your integrated light." if(lights_on) SetLuminosity(6) // 1.5x luminosity of flashlight else SetLuminosity(0) /mob/living/silicon/robot/verb/self_diagnosis_verb() set category = "Robot Commands" set name = "Self Diagnosis" if(!is_component_functioning("diagnosis unit")) src << "\red Your self-diagnosis component isn't functioning." var/datum/robot_component/CO = get_component("diagnosis unit") if (!cell_use_power(CO.active_usage)) src << "\red Low Power." var/dat = self_diagnosis() src << browse(dat, "window=robotdiagnosis") /mob/living/silicon/robot/verb/toggle_component() set category = "Robot Commands" set name = "Toggle Component" set desc = "Toggle a component, conserving power." var/list/installed_components = list() for(var/V in components) if(V == "power cell") continue var/datum/robot_component/C = components[V] if(C.installed) installed_components += V var/toggle = input(src, "Which component do you want to toggle?", "Toggle Component") as null|anything in installed_components if(!toggle) return var/datum/robot_component/C = components[toggle] if(C.toggled) C.toggled = 0 src << "\red You disable [C.name]." else C.toggled = 1 src << "\red You enable [C.name]." /mob/living/silicon/robot/blob_act() if (stat != 2) adjustBruteLoss(60) updatehealth() return 1 return 0 // this function shows information about the malf_ai gameplay type in the status screen /mob/living/silicon/robot/show_malf_ai() ..() 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)]") return 0 // this function displays jetpack pressure in the stat panel /mob/living/silicon/robot/proc/show_jetpack_pressure() // if you have a jetpack, show the internal tank pressure var/obj/item/weapon/tank/jetpack/current_jetpack = installed_jetpack() if (current_jetpack) stat("Internal Atmosphere Info", current_jetpack.name) stat("Tank Pressure", current_jetpack.air_contents.return_pressure()) // this function returns the robots jetpack, if one is installed /mob/living/silicon/robot/proc/installed_jetpack() if(module) return (locate(/obj/item/weapon/tank/jetpack) in module.modules) return 0 // this function displays the cyborgs current cell charge in the stat panel /mob/living/silicon/robot/proc/show_cell_power() if(cell) stat(null, text("Charge Left: [round(cell.percent())]%")) stat(null, text("Cell Rating: [round(cell.maxcharge)]")) // Round just in case we somehow get crazy values stat(null, text("Power Cell Load: [round(used_power_this_tick)]W")) else stat(null, text("No Cell Inserted!")) // update the status screen display /mob/living/silicon/robot/Stat() ..() statpanel("Status") if (client.statpanel == "Status") show_cell_power() show_jetpack_pressure() stat(null, text("Lights: [lights_on ? "ON" : "OFF"]")) /mob/living/silicon/robot/restrained() return 0 /mob/living/silicon/robot/ex_act(severity) if(!blinded) flick("flash", flash) 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.status_flags & CANPUSH)) 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/triggerAlarm(var/class, area/A, list/cameralist, var/source) if (stat == 2) return 1 ..() queueAlarm(text("--- [class] alarm detected in [A.name]!"), class) /mob/living/silicon/robot/cancelAlarm(var/class, area/A as area, obj/origin) var/has_alarm = ..() if (!has_alarm) queueAlarm(text("--- [class] alarm in [A.name] has been cleared."), class, 0) // if (viewalerts) robot_alerts() return has_alarm /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(opened) // Are they trying to insert something? for(var/V in components) var/datum/robot_component/C = components[V] if(!C.installed && istype(W, C.external_type)) C.installed = 1 C.wrapped = W C.install() user.drop_item() W.loc = null var/obj/item/robot_parts/robot_component/WC = W if(istype(WC)) C.brute_damage = WC.brute C.electronics_damage = WC.burn usr << "\blue You install the [W.name]." return if (istype(W, /obj/item/weapon/weldingtool)) if (src == user) user << "You lack the reach to be able to repair yourself." return if (!getBruteLoss()) user << "Nothing to fix here!" return var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0)) adjustBruteLoss(-30) 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/stack/cable_coil) && (wiresexposed || istype(src,/mob/living/silicon/robot/drone))) if (!getFireLoss()) user << "Nothing to fix here!" return var/obj/item/stack/cable_coil/coil = W if (coil.use(1)) adjustFireLoss(-30) updatehealth() 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) if(cell) user << "You close the cover." opened = 0 updateicon() else if(wiresexposed && isWireCut(1) && isWireCut(2) && isWireCut(3) && isWireCut(4) && isWireCut(5)) //Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob. if(!mmi) user << "\The [src] has no brain to remove." return user << "You jam the crowbar into the robot and begin levering [mmi]." sleep(30) user << "You damage some parts of the chassis, but eventually manage to rip out [mmi]!" var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc) C.l_leg = new/obj/item/robot_parts/l_leg(C) C.r_leg = new/obj/item/robot_parts/r_leg(C) C.l_arm = new/obj/item/robot_parts/l_arm(C) C.r_arm = new/obj/item/robot_parts/r_arm(C) C.updateicon() new/obj/item/robot_parts/chest(loc) src.Del() else // Okay we're not removing the cell or an MMI, but maybe something else? var/list/removable_components = list() for(var/V in components) if(V == "power cell") continue var/datum/robot_component/C = components[V] if(C.installed == 1 || C.installed == -1) removable_components += V var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components if(!remove) return var/datum/robot_component/C = components[remove] var/obj/item/robot_parts/robot_component/I = C.wrapped user << "You remove \the [I]." if(istype(I)) I.brute = C.brute_damage I.burn = C.electronics_damage I.loc = src.loc if(C.installed == 1) C.uninstall() C.installed = 0 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 var/datum/robot_component/C = components["power cell"] 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." C.installed = 1 C.wrapped = W C.install() //This will mean that removing and replacing a power cell will repair the mount, but I don't care at this point. ~Z C.brute_damage = 0 C.electronics_damage = 0 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 && !cell) // haxing wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" updateicon() else if(istype(W, /obj/item/weapon/screwdriver) && opened && cell) // radio if(radio) radio.attackby(W,user)//Push it to the radio to let it handle everything else user << "Unable to locate a radio." updateicon() else if(istype(W, /obj/item/device/encryptionkey/) && opened) if(radio)//sanityyyyyy radio.attackby(W,user)//GTFO, you have your own procs else user << "Unable to locate a radio." 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 if(!opened)//Cover is closed if(locked) if(prob(90)) var/obj/item/weapon/card/emag/emag = W emag.uses-- user << "You emag the cover lock." locked = 0 else user << "You fail to emag the cover lock." 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 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 he designates as being such are Syndicate Agents.") src << "\red ALERT: Foreign software detected." sleep(5) src << "\red Initiating diagnostics..." sleep(20) src << "\red SynBorg v1.7.1 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 << "Obey these laws:" laws.show_laws(src) src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands." if(src.module && istype(src.module, /obj/item/weapon/robot_module/miner)) for(var/obj/item/weapon/pickaxe/borgdrill/D in src.module.modules) del(D) src.module.modules += new /obj/item/weapon/pickaxe/diamonddrill(src.module) src.module.rebuild() updateicon() else user << "You fail to hack [src]'s interface." 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 if( !(istype(W, /obj/item/device/robotanalyzer) || istype(W, /obj/item/device/healthanalyzer)) ) spark_system.start() return ..() /mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/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] glomps []!", src), 1) var/damage = rand(1, 3) if(M.is_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/M as mob) if(M.melee_damage_upper == 0) M.emote("[M.friendly] [src]") else if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) for(var/mob/O in viewers(src, null)) O.show_message("\red [M] [M.attacktext] [src]!", 1) M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])") src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])") 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))) var/datum/robot_component/cell_component = components["power cell"] if(cell) cell.updateicon() cell.add_fingerprint(user) user.put_in_active_hand(cell) user << "You remove \the [cell]." cell = null cell_component.wrapped = null cell_component.installed = 0 updateicon() else if(cell_component.installed == -1) cell_component.installed = 0 var/obj/item/broken_device = cell_component.wrapped user << "You remove \the [broken_device]." user.put_in_active_hand(broken_device) /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.get_active_hand()) || 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.get_active_hand() && istype(george.get_active_hand(), /obj/item/weapon/card/id) && check_access(george.get_active_hand())) 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) //have one of the required accesses return 1 return 0 /mob/living/silicon/robot/proc/updateicon() overlays.Cut() if(stat == 0) overlays += "eyes" overlays.Cut() overlays += "eyes-[icon_state]" else overlays -= "eyes" if(opened && custom_sprite == 1) //Custom borgs also have custom panels, heh if(wiresexposed) overlays += "[src.ckey]-openpanel +w" else if(cell) overlays += "[src.ckey]-openpanel +c" else overlays += "[src.ckey]-openpanel -c" if(opened) if(wiresexposed) overlays += "ov-openpanel +w" else if(cell) overlays += "ov-openpanel +c" else overlays += "ov-openpanel -c" if(module_active && istype(module_active,/obj/item/borg/combat/shield)) overlays += "[icon_state]-shield" if(modtype == "Combat") var/base_icon = "" base_icon = icon_state if(module_active && istype(module_active,/obj/item/borg/combat/mobility)) icon_state = "[icon_state]-roll" else icon_state = base_icon return //Call when target overlay should be added/removed /mob/living/silicon/robot/update_targeted() if(!targeted_by && target_locked) del(target_locked) updateicon() if (targeted_by && target_locked) overlays += target_locked /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 += {" 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") /mob/living/silicon/robot/Topic(href, href_list) ..() if(usr != src) return if (href_list["showalerts"]) robot_alerts() return if (href_list["mod"]) var/obj/item/O = locate(href_list["mod"]) if (istype(O) && (O.loc == src)) O.attack_self(src) if (href_list["act"]) var/obj/item/O = locate(href_list["act"]) if (!istype(O)) return if(!((O in src.module.modules) || (O == src.module.emag))) return 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(!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(!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 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) module_state_1 = null contents -= O else if(module_state_2 == O) module_state_2 = null contents -= O else if(module_state_3 == O) 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/radio_menu() radio.interact(src)//Just use the radio's Topic() instead of bullshit special-snowflake code /mob/living/silicon/robot/Move(a, b, flag) . = ..() if(module) if(module.type == /obj/item/weapon/robot_module/janitor) var/turf/tile = loc if(isturf(tile)) tile.clean_blood() if (istype(tile, /turf/simulated)) var/turf/simulated/S = tile S.dirt = 0 for(var/A in tile) if(istype(A, /obj/effect)) if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay)) del(A) else if(istype(A, /obj/item)) var/obj/item/cleaned_item = A cleaned_item.clean_blood() else if(istype(A, /mob/living/carbon/human)) var/mob/living/carbon/human/cleaned_human = A if(cleaned_human.lying) if(cleaned_human.head) cleaned_human.head.clean_blood() cleaned_human.update_inv_head(0) if(cleaned_human.wear_suit) cleaned_human.wear_suit.clean_blood() cleaned_human.update_inv_wear_suit(0) else if(cleaned_human.w_uniform) cleaned_human.w_uniform.clean_blood() cleaned_human.update_inv_w_uniform(0) if(cleaned_human.shoes) cleaned_human.shoes.clean_blood() cleaned_human.update_inv_shoes(0) cleaned_human.clean_blood(1) cleaned_human << "\red [src] cleans your face!" return /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 //Disconnect it's camera so it's not so easily tracked. if(src.camera) src.camera.network = list() cameranet.removeCamera(src.camera) /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 and will deactivate your camera system." var/mob/living/silicon/robot/R = src if(R) R.UnlinkSelf() R << "Buffers flushed and reset. Camera system shutdown. All systems operational." src.verbs -= /mob/living/silicon/robot/proc/ResetSecurityCodes /mob/living/silicon/robot/mode() set name = "Activate Held Object" set category = "IC" set src = usr var/obj/item/W = get_active_hand() if (W) W.attack_self(src) return /mob/living/silicon/robot/proc/choose_icon(var/triesleft, var/list/module_sprites) if(triesleft<1 || !module_sprites.len) return else triesleft-- var/icontype if (custom_sprite == 1) icontype = "Custom" triesleft = 0 else icontype = input("Select an icon! [triesleft ? "You have [triesleft] more chances." : "This is your last try."]", "Robot", null, null) in module_sprites if(icontype) icon_state = module_sprites[icontype] else src << "Something is badly wrong with the sprite selection. Harass a coder." icon_state = module_sprites[1] return overlays -= "eyes" updateicon() if (triesleft >= 1) var/choice = input("Look at your icon - is this what you want?") in list("Yes","No") if(choice=="No") choose_icon(triesleft, module_sprites) else triesleft = 0 return else src << "Your icon has been set. You now require a module reset to change it." /mob/living/silicon/robot/proc/sensor_mode() //Medical/Security HUD controller for borgs set name = "Set Sensor Augmentation" set category = "Robot Commands" set desc = "Augment visual feed with internal sensor overlays." toggle_sensor_mode() /mob/living/silicon/robot/proc/add_robot_verbs() src.verbs |= robot_verbs_default /mob/living/silicon/robot/proc/remove_robot_verbs() src.verbs -= robot_verbs_default // Uses power from cyborg's cell. Returns 1 on success or 0 on failure. // Properly converts using CELLRATE now! Amount is in Joules. /mob/living/silicon/robot/proc/cell_use_power(var/amount = 0) // No cell inserted if(!cell) return 0 // Power cell is empty. if(cell.charge == 0) return 0 if(cell.use(amount * CELLRATE * CYBORG_POWER_USAGE_MULTIPLIER)) used_power_this_tick += amount * CYBORG_POWER_USAGE_MULTIPLIER return 1 return 0 /mob/living/silicon/robot/binarycheck() if(is_component_functioning("comms")) var/datum/robot_component/RC = get_component("comms") use_power(RC.active_usage) return 1 return 0