Merge pull request #515 from Markolie/master

Adds Syndiborg to Nuke Ops, enables shortcuts for borgs/drones, notifies the AI of borg changes
This commit is contained in:
Fox-McCloud
2014-11-23 02:25:40 -05:00
27 changed files with 287 additions and 216 deletions
+1
View File
@@ -267,6 +267,7 @@
#include "code\game\dna\genes\powers.dm"
#include "code\game\dna\genes\vg_disabilities.dm"
#include "code\game\dna\genes\vg_powers.dm"
#include "code\game\gamemodes\antag_spawner.dm"
#include "code\game\gamemodes\events.dm"
#include "code\game\gamemodes\factions.dm"
#include "code\game\gamemodes\game_mode.dm"
+7
View File
@@ -326,6 +326,13 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(dna)
dna.real_name = real_name
if(isrobot(src))
var/mob/living/silicon/robot/R = src
if(oldname != real_name)
R.notify_ai(3, oldname, newname)
if(R.camera)
R.camera.c_tag = real_name
if(oldname)
//update the datacore records! This is goig to be a bit costly.
for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked))
+40 -11
View File
@@ -15,9 +15,6 @@
build_click(src, client.buildmode, params, A)
return
if(stat || lockcharge || weakened || stunned || paralysis)
return
var/list/modifiers = params2list(params)
if(modifiers["middle"])
MiddleClickOn(A)
@@ -32,19 +29,14 @@
CtrlClickOn(A)
return
if(stat || lockcharge || weakened || stunned || paralysis)
return
if(next_move >= world.time)
return
face_atom(A) // change direction to face what you clicked on
if(aiCamera.in_camera_mode)
aiCamera.camera_mode_off()
if(is_component_functioning("camera"))
aiCamera.captureimage(A, usr)
else
src << "<span class='userdanger'>Your camera isn't functional.</span>"
return
/*
cyborg restrained() currently does nothing
if(restrained())
@@ -109,6 +101,43 @@
cycle_modules()
return
//Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks
// for non-doors/apcs
/mob/living/silicon/robot/ShiftClickOn(var/atom/A)
A.BorgShiftClick(src)
/mob/living/silicon/robot/CtrlClickOn(var/atom/A)
A.BorgCtrlClick(src)
/mob/living/silicon/robot/AltClickOn(var/atom/A)
A.BorgAltClick(src)
/atom/proc/BorgShiftClick()
return
/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code.
AIShiftClick()
/atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlClick(user)
/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code.
AICtrlClick()
/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code.
AICtrlClick()
/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code.
AICtrlClick()
/atom/proc/BorgAltClick(var/mob/living/silicon/robot/user)
AltClick(user)
return
/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code.
AIAltClick()
/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code.
AIAltClick()
/*
As with AI, these are not used in click code,
because the code for robots is specific, not generic.
+1 -1
View File
@@ -498,7 +498,7 @@
var/mob/living/silicon/ai/AI = usr
AI.toggle_camera_light()
if("Crew Monitorting")
if("Crew Monitoring")
if(isAI(usr))
var/mob/living/silicon/ai/AI = usr
var/obj/machinery/computer/crew/C = locate(/obj/machinery/computer/crew)
+13
View File
@@ -285,6 +285,19 @@ var/list/uplink_items = list()
item = /obj/mecha/combat/marauder/mauler/loaded
cost = 140
gamemodes = list("nuclear emergency")
/datum/uplink_item/dangerous/syndieborg
name = "Syndicate Cyborg"
desc = "A cyborg designed and programmed for systematic extermination of non-Syndicate personnel."
item = /obj/item/weapon/antag_spawner/borg_tele
cost = 50
gamemodes = list("nuclear emergency")
//for refunding the syndieborg teleporter
/datum/uplink_item/dangerous/syndieborg/spawn_item()
var/obj/item/weapon/antag_spawner/borg_tele/T = ..()
if(istype(T))
T.TC_cost = cost
// Ammunition
+1
View File
@@ -66,6 +66,7 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs
if (BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI
if(!R.emagged)
R.connected_ai = select_active_ai()
R.notify_ai(1)
if (BORG_WIRE_CAMERA)
if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes)
+42
View File
@@ -0,0 +1,42 @@
/obj/item/weapon/antag_spawner
throw_speed = 1
throw_range = 5
w_class = 1.0
var/used = 0
/obj/item/weapon/antag_spawner/proc/spawn_antag(var/client/C, var/turf/T, var/type = "")
return
/obj/item/weapon/antag_spawner/proc/equip_antag(mob/target as mob)
return
/obj/item/weapon/antag_spawner/borg_tele
name = "Syndicate Cyborg Teleporter"
desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field."
icon = 'icons/obj/device.dmi'
icon_state = "locator"
var/TC_cost = 0
/obj/item/weapon/antag_spawner/borg_tele/attack_self(mob/user as mob)
if(used)
user << "The teleporter is out of power."
return
var/list/borg_candicates = get_candidates(BE_OPERATIVE)
if(borg_candicates.len > 0)
used = 1
var/client/C = pick(borg_candicates)
spawn_antag(C, get_turf(src.loc), "syndieborg")
else
user << "<span class='notice'>Unable to connect to Syndicate Command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>"
/obj/item/weapon/antag_spawner/borg_tele/spawn_antag(var/client/C, var/turf/T, var/type = "")
var/datum/effect/effect/system/spark_spread/S = new /datum/effect/effect/system/spark_spread
S.set_up(4, 1, src)
S.start()
var/mob/living/silicon/robot/R = new /mob/living/silicon/robot/syndicate(T)
R.key = C.key
ticker.mode.syndicates += R.mind
ticker.mode.update_synd_icons_added(R.mind)
R.mind.special_role = "syndicate"
R.faction = list("syndicate")
+11 -1
View File
@@ -200,6 +200,10 @@
return list(access_cent_general, access_cent_living, access_cent_storage)
if("Thunderdome Overseer")
return list(access_cent_general, access_cent_thunder)
if("Emergency Response Team")
return list(access_cent_general, access_cent_living, access_cent_storage)
if("Emergency Response Team Leader")
return list(access_cent_general, access_cent_living, access_cent_storage, access_cent_teleporter)
if("Intel Officer")
return list(access_cent_general, access_cent_living)
if("Medical Officer")
@@ -210,6 +214,12 @@
return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage)
if("BlackOps Commander")
return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed)
if("Special Operations Officer")
return get_all_centcom_access()
if("NanoTrasen Navy Officer")
return get_all_centcom_access()
if("NanoTrasen Navy Captain")
return get_all_centcom_access()
if("Supreme Commander")
return get_all_centcom_access()
@@ -447,7 +457,7 @@
return all_jobs
/proc/get_all_centcom_jobs()
return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander")
return list("VIP Guest","Custodian","Thunderdome Overseer","Emergency Response Team","Emergency Response Team Leader","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Special Operations Officer","NanoTrasen Navy Officer","NanoTrasen Navy Captain","Supreme Commander")
//gets the actual job rank (ignoring alt titles)
//this is used solely for sechuds
+1
View File
@@ -73,6 +73,7 @@
sleep(30)
if(R)
R.lockcharge = !R.lockcharge
R.notify_ai(1)
// Activate the cooldown
cooldown = 1
@@ -296,7 +296,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
// --- Cyborg ---
else if (isrobot(M))
jobname = "Cyborg"
var/mob/living/silicon/robot/B = M
jobname = "[B.designation] Cyborg"
// --- Personal AI (pAI) ---
else if (istype(M, /mob/living/silicon/pai))
@@ -698,6 +699,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
/obj/item/device/radio/borg
var/obj/item/device/encryptionkey/keyslot = null//Borg radios can handle a single encryption key
/obj/item/device/radio/borg/syndicate
syndie = 1
keyslot = new /obj/item/device/encryptionkey/syndicate
/obj/item/device/radio/borg/syndicate/New()
..()
set_frequency(SYND_FREQ)
/obj/item/device/radio/borg/attackby(obj/item/weapon/W as obj, mob/user as mob)
// ..()
user.set_machine(src)
@@ -249,6 +249,27 @@ var/list/world_uplinks = list()
src.hidden_uplink.trigger(user)
return 1
return 0
//Refund proc for the borg teleporter (later I'll make a general refund proc if there is demand for it)
/obj/item/device/radio/headset/syndicate/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/antag_spawner/borg_tele))
var/obj/item/weapon/antag_spawner/borg_tele/S = W
if(!S.used)
hidden_uplink.uses += S.TC_cost
qdel(S)
user << "<span class='notice'>Teleporter refunded.</span>"
else
user << "<span class='notice'>This teleporter is already used.</span>"
/obj/item/device/radio/uplink/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/antag_spawner/borg_tele))
var/obj/item/weapon/antag_spawner/borg_tele/S = W
if(!S.used)
hidden_uplink.uses += S.TC_cost
qdel(S)
user << "<span class='notice'>Teleporter refunded.</span>"
else
user << "<span class='notice'>This teleporter is already used.</span>"
// PRESET UPLINKS
// A collection of preset uplinks.
+2 -1
View File
@@ -211,7 +211,8 @@
O.invisibility = 0
O.custom_name = created_name
O.updatename("Default")
if(O.connected_ai)
O.notify_ai(1)
M.brainmob.mind.transfer_to(O)
if(O.mind && O.mind.special_role)
@@ -35,6 +35,7 @@
R.camera.network.Remove(list("Engineering","Medical","MINE"))
R.updatename("Default")
R.status_flags |= CANPUSH
R.notify_ai(2)
R.updateicon()
return 1
@@ -51,6 +52,7 @@
/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R)
if(..()) return 0
R.notify_ai(3, R.name, heldname)
R.name = heldname
R.custom_name = heldname
R.real_name = heldname
@@ -75,6 +77,9 @@
R.key = ghost.key
R.stat = CONSCIOUS
dead_mob_list -= R //please never forget this ever kthx
living_mob_list += R
R.notify_ai(1)
return 1
@@ -371,7 +371,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
if(isliving(user))
user:brainloss += 20
return
if(locate(/obj/item/weapon/implant/traitor) in H.contents || locate(/obj/item/weapon/implant/traitor) in H.contents)
if(locate(/obj/item/weapon/implant/traitor) in H.contents || locate(/obj/item/weapon/implant/loyalty) in H.contents)
H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.")
return 0
else if(H.mind in ticker.mode.traitors)
@@ -49,6 +49,20 @@
sharp = 1
edge = 1
/obj/item/weapon/melee/energy/sword/cyborg
var/hitcost = 500
/obj/item/weapon/melee/energy/sword/cyborg/attack(mob/M, var/mob/living/silicon/robot/R)
if(R.cell)
var/obj/item/weapon/cell/C = R.cell
if(active && !(C.use(hitcost)))
attack_self()
R << "<span class='notice'>It's out of charge!</span>"
return
C.use(hitcost)
..()
return
/obj/item/weapon/melee/energy/sword/pirate
name = "energy cutlass"
desc = "Arrrr matey."
@@ -39,6 +39,7 @@
uneq_all()
src.stat = 1
Paralyse(3)
has_power = 0
else
if(src.module_state_1)
src.cell.use(3)
@@ -55,6 +56,7 @@
Paralyse(3)
src.stat = 0
has_power = 1
else
uneq_all()
src.stat = 1
+39 -1
View File
@@ -72,6 +72,7 @@
var/pose
var/base_icon = ""
var/crisis = 0
var/syndicateborg = 0
/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0)
spark_system = new /datum/effect/effect/system/spark_spread()
@@ -143,6 +144,9 @@
hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
/mob/living/silicon/robot/proc/init(var/alien=0)
if(syndicateborg)
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
return
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
if(mmi.alien || alien)
laws = new /datum/ai_laws/alienmov()
@@ -187,7 +191,7 @@
if(mmi != null && mmi.alien)
modules="Hunter"
modtype = input("Please, select a module!", "Robot", null, null) in modules
designation = modtype
var/module_sprites[0] //Used to store the associations between sprite names and sprite index.
var/channels = list()
@@ -306,6 +310,7 @@
choose_icon(6,module_sprites)
radio.config(channels)
notify_ai(2)
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
if(prefix)
@@ -359,6 +364,7 @@
var/newname
newname = copytext(sanitize(input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text),1,MAX_NAME_LEN)
if (newname != "")
notify_ai(3, name, newname)
custom_name = newname
updatename()
@@ -1395,3 +1401,35 @@
return
else
src << "Your icon has been set. You now require a module reset to change it."
/mob/living/silicon/robot/syndicate
icon_state = "syndie_bloodhound"
lawupdate = 0
scrambledcodes = 1
syndicateborg = 1
modtype = "Synd"
faction = list("syndicate")
designation = "Syndicate"
req_access = list(access_syndicate)
/mob/living/silicon/robot/syndicate/New(loc)
..()
cell.maxcharge = 25000
cell.charge = 25000
radio = new /obj/item/device/radio/borg/syndicate(src)
module = new /obj/item/weapon/robot_module/syndicate(src)
laws = new /datum/ai_laws/syndicate_override()
Namepick()
/mob/living/silicon/robot/proc/notify_ai(var/notifytype, var/oldname, var/newname)
if(!connected_ai)
return
switch(notifytype)
if(1) //New Cyborg
connected_ai << "<br><br><span class='notice'>NOTICE - New cyborg connection detected: <a href='byond://?src=\ref[connected_ai];track2=\ref[connected_ai];track=\ref[src]'>[name]</a></span><br>"
if(2) //New Module
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg module change detected: [name] has loaded the [designation] module.</span><br>"
if(3) //New Name
connected_ai << "<br><br><span class='notice'>NOTICE - Cyborg reclassification detected: [oldname] is now designated as [newname].</span><br>"
@@ -331,14 +331,16 @@
/obj/item/weapon/robot_module/syndicate
name = "syndicate robot module"
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/melee/energy/sword(src)
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src)
src.modules += new /obj/item/weapon/card/emag(src)
return
/obj/item/weapon/robot_module/syndicate/New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/crossbow/cyborg(src)
src.modules += new /obj/item/weapon/card/emag(src)
src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src)
src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.emag = null
return
/obj/item/weapon/robot_module/combat
name = "combat robot module"
@@ -1,145 +0,0 @@
// robot_upgrades.dm
// Contains various borg upgrades.
/obj/item/borg/upgrade/
name = "A borg upgrade module."
desc = "Protected by FRM."
icon = 'icons/obj/module.dmi'
icon_state = "cyborg_upgrade"
var/construction_time = 120
var/construction_cost = list("metal"=10000)
var/locked = 0
var/require_module = 0
var/installed = 0
/obj/item/borg/upgrade/proc/action()
return
/obj/item/borg/upgrade/reset/
name = "Borg module reset board"
desc = "Used to reset a borg's module. Destroys any other upgrades applied to the borg."
icon_state = "cyborg_upgrade1"
require_module = 1
/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R)
R.uneq_all()
del(R.module)
R.module = null
R.modtype = "robot"
R.real_name = "Cyborg [R.ident]"
R.name = R.real_name
R.nopush = 0
R.hands.icon_state = "nomod"
R.base_icon = "robot"
R.icon_state = "robot"
R.updateicon()
return 1
/obj/item/borg/upgrade/flashproof/
name = "Borg Flash-Supression"
desc = "A highly advanced, complicated system for supressing incoming flashes directed at the borg's optical processing system."
construction_cost = list("metal"=10000,"gold"=2000,"silver"=3000,"glass"=2000, "diamond"=5000)
icon_state = "cyborg_upgrade4"
require_module = 1
/obj/item/borg/upgrade/flashproof/New() // Why the fuck does the fabricator make a new instance of all the items?
//desc = "Sunglasses with duct tape." // Why? D:
/obj/item/borg/upgrade/flashproof/action(var/mob/living/silicon/robot/R)
if(R.module)
R.module += src
return 1
/obj/item/borg/upgrade/restart/
name = "Borg emergancy restart module"
desc = "Used to force a restart of a disabled-but-repaired borg, bringing it back online."
construction_cost = list("metal"=60000 , "glass"=5000)
icon_state = "cyborg_upgrade1"
/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R)
if(!R.key)
for(var/mob/dead/observer/ghost in world)
if(ghost.corpse == R && ghost.client)
ghost.client.mob = ghost.corpse
if(R.health < 0)
usr << "You have to repair the borg before using this module!"
return 0
R.stat = 0
return 1
/obj/item/borg/upgrade/vtec/
name = "Borg VTEC Module"
desc = "Used to kick in a borgs VTEC systems, increasing their speed."
construction_cost = list("metal"=80000 , "glass"=6000 , "gold"= 5000)
icon_state = "cyborg_upgrade2"
require_module = 1
/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R)
if(R.speed == -1)
return 0
R.speed--
return 1
/obj/item/borg/upgrade/tasercooler/
name = "Borg Rapid Taser Cooling Module"
desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate.."
construction_cost = list("metal"=80000 , "glass"=6000 , "gold"= 2000, "diamond" = 500)
icon_state = "cyborg_upgrade3"
require_module = 1
/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R)
if(!istype(R.module, /obj/item/weapon/robot_module/security))
R << "Upgrade mounting error! No suitable hardpoint detected!"
usr << "There's no mounting point for the module!"
return 0
var/obj/item/weapon/gun/energy/taser/cyborg/T = locate() in R.module
if(!T)
T = locate() in R.module.contents
if(!T)
T = locate() in R.module.modules
if(!T)
usr << "This cyborg has had its taser removed!"
return 0
if(T.recharge_time <= 2)
R << "Maximum cooling achieved for this hardpoint!"
usr << "There's no room for another cooling unit!"
return 0
else
T.recharge_time = max(2 , T.recharge_time - 4)
return 1
/obj/item/borg/upgrade/jetpack/
name = "Mining Borg Jetpack"
desc = "A carbon dioxide jetpack suitable for low-gravity mining operations"
construction_cost = list("metal"=10000,"plasma"=15000,"uranium" = 20000)
icon_state = "cyborg_upgrade3"
require_module = 1
/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R)
if(!istype(R.module, /obj/item/weapon/robot_module/miner))
R << "Upgrade mounting error! No suitable hardpoint detected!"
usr << "There's no mounting point for the module!"
return 0
else
R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide
for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules)
R.internals = src
R.icon_state="Miner+j"
return 1
+13 -3
View File
@@ -111,21 +111,31 @@
log_say("[key_name(src)] : [message]")
var/desig = "Unknown" //ezmode for taters
if(isrobot(src))
var/mob/living/silicon/S = src
if(S.designation)
desig = trim_left(S.designation)
else
desig = "Default"
else if(isAI(src))
desig = "AI"
message = trim(message)
if (!message)
return
var/message_a = say_quote(message)
var/rendered = "<i><span class='game say'>Robotic Talk, <span class='name'>[name]</span> <span class='message'>[message_a]</span></span></i>"
var/rendered = "<i><span class='game say'>Robotic Talk, <span class='name'>[name] ([desig])</span> <span class='message'>[message_a]</span></span></i>"
for (var/mob/living/S in living_mob_list)
if(S.robot_talk_understand && (S.robot_talk_understand == robot_talk_understand)) // This SHOULD catch everything caught by the one below, but I'm not going to change it.
if(istype(S , /mob/living/silicon/ai))
var/renderedAI = "<i><span class='game say'>Robotic Talk, <a href='byond://?src=\ref[S];track2=\ref[S];track=\ref[src]'><span class='name'>[name]</span></a> <span class='message'>[message_a]</span></span></i>"
var/renderedAI = "<i><span class='game say'>Robotic Talk, <a href='byond://?src=\ref[S];track2=\ref[S];track=\ref[src]'><span class='name'>[name] ([desig])</span></a> <span class='message'>[message_a]</span></span></i>"
S.show_message(renderedAI, 2)
else if(istype(S , /mob/dead/observer) && S.stat == DEAD)
var/rendered2 = "<i><span class='game say'>Robotic Talk, <span class='name'>[name]</span> <a href='byond://?src=\ref[S];follow2=\ref[S];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_a]</span></span></i>"
var/rendered2 = "<i><span class='game say'>Robotic Talk, <span class='name'>[name] ([desig])</span> <a href='byond://?src=\ref[S];follow2=\ref[S];follow=\ref[src]'>(Follow)</a> <span class='message'>[message_a]</span></span></i>"
S.show_message(rendered2, 2)
else
S.show_message(rendered, 2)
@@ -10,6 +10,7 @@
var/list/hud_list[10]
var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
var/designation = ""
var/obj/item/device/camera/siliconcam/aiCamera = null //photography
/mob/living/silicon/proc/cancelAlarm()
+1
View File
@@ -223,6 +223,7 @@
O.loc = loc
O.job = "Cyborg"
O.notify_ai(1)
if(O.mind.assigned_role == "Cyborg")
if(O.mind.role_alt_title == "Android")
+48 -39
View File
@@ -18,31 +18,31 @@
var/charge_tick = 0
var/recharge_time = 10 //Time it takes for shots to recharge (in ticks)
New()
..()
processing_objects.Add(src)
/obj/item/weapon/gun/energy/taser/cyborg/New()
..()
processing_objects.Add(src)
Destroy()
processing_objects.Remove(src)
..()
/obj/item/weapon/gun/energy/taser/cyborg/Destroy()
processing_objects.Remove(src)
..()
process() //Every [recharge_time] ticks, recharge a shot for the cyborg
charge_tick++
if(charge_tick < recharge_time) return 0
charge_tick = 0
/obj/item/weapon/gun/energy/taser/cyborg/process() //Every [recharge_time] ticks, recharge a shot for the cyborg
charge_tick++
if(charge_tick < recharge_time) return 0
charge_tick = 0
if(!power_supply) return 0 //sanity
if(power_supply.charge >= power_supply.maxcharge) return 0 // check if we actually need to recharge
if(!power_supply) return 0 //sanity
if(power_supply.charge >= power_supply.maxcharge) return 0 // check if we actually need to recharge
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
R.cell.use(charge_cost) //Take power from the borg...
power_supply.give(charge_cost) //... to recharge the shot
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
R.cell.use(charge_cost) //Take power from the borg...
power_supply.give(charge_cost) //... to recharge the shot
update_icon()
return 1
update_icon()
return 1
/obj/item/weapon/gun/energy/stunrevolver
@@ -70,30 +70,39 @@
cell_type = "/obj/item/weapon/cell/crap"
var/charge_tick = 0
/obj/item/weapon/gun/energy/crossbow/New()
..()
processing_objects.Add(src)
New()
..()
processing_objects.Add(src)
/obj/item/weapon/gun/energy/crossbow/Destroy()
processing_objects.Remove(src)
..()
/obj/item/weapon/gun/energy/crossbow/process()
charge_tick++
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(1000)
return 1
Destroy()
processing_objects.Remove(src)
..()
process()
charge_tick++
if(charge_tick < 4) return 0
charge_tick = 0
if(!power_supply) return 0
power_supply.give(1000)
/obj/item/weapon/gun/energy/crossbow/update_icon()
return
/obj/item/weapon/gun/energy/crossbow/cyborg/process()
..()
return
/obj/item/weapon/gun/energy/crossbow/cyborg/process_chambered()
if(in_chamber)
return 1
update_icon()
return
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
R.cell.use(100)
in_chamber = new /obj/item/projectile/energy/bolt(src)
return 1
return 0
/obj/item/weapon/gun/energy/crossbow/largecrossbow
name = "Energy Crossbow"
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 150 KiB

+3 -3
View File
@@ -4973,8 +4973,8 @@
"bRG" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/turf/simulated/floor,/area/medical/cryo)
"bRH" = (/obj/structure/table/woodentable,/obj/machinery/light/small/lamp/green,/turf/simulated/floor/wood,/area/medical/psych)
"bRI" = (/obj/structure/table/woodentable,/obj/machinery/computer/med_data/laptop,/obj/machinery/camera{c_tag = "Medbay Psych Office North"; network = list("SS13")},/turf/simulated/floor/wood,/area/medical/psych)
"bRJ" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/wood,/area/medical/psych)
"bRK" = (/obj/machinery/light{dir = 1; on = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/medical/psych)
"bRJ" = (/obj/structure/closet/secure_closet/psychiatrist,/turf/simulated/floor/wood,/area/medical/psych)
"bRK" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/briefcase,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/wood,/area/medical/psych)
"bRL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/carpet,/area/medical/psych)
"bRM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/medical/psych)
"bRN" = (/obj/structure/table/woodentable,/obj/machinery/light/small/lamp/green,/turf/simulated/floor/carpet,/area/medical/psych)
@@ -12549,7 +12549,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLby
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZbDZbDZbHaanFbalbMfbFObFQbFObMgbMhbMibMibMibMjbMibMibMibMkbMibMibMlbMibMibMmbMnbMobMibBRbMqbMrbMsbMtbMsbMubMvbMwbMxbMybMzaaqbMAaaqbMBaaqaaqbGjeAibGjaaqaaqaaqbGbeAfbGiaaqaaqbMHbHGbHGbMIaaqaaqaaqanpbMJaaqaaqaaqbDXaaqaaqbwhaaqbRjanpaaqbMObHQbJEaaqbMRbBJbJCbThaaibMTbMUbMVbMWaaibzBbJKbMXaaqbMYbMZbNabNbbNcbNdabHbNebNfbNgbNhbNibNjbNkaaiaaiaaiaaiaaiaaiaaiaaiaaiaaibNlbNmbNnbNnaaqbNobNpbNqaaiaaiaaiaaiaaiaaiaaiaaibFCaaiaaabNrbNrbNraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaiaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabbNsbNtbNtbNuaaqaaqaaiaaiaaiaaibNvaabaabaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZbDZbDZbKwbKxbKwbNwbHcbHebHcbNxbNybNzbNAbNAbNBbNAbNAbNCbNDbNAbNAbNEbNAbNAbNAbNAbNFbNGayObNHbNIbNJbNKbNJbNLbNMbNNbNObNPbKSaaqaaqaaqbNQayObNRbNSbNTbNUbNVaaqcvWbNXbNYbNZcvXaaqbObbOcbOdaaqbOebOfbOgbOhbOibOjbOkbOlbJGayObJJbJIbLvbLsbLpayObOtbOubOvbLobOxbOybOzbJDbOAbOBbOCbODbOEbOFbzJbOGbOHbOIbOJbOKbOKbOLbOMbONaaqbOObOPbOQbORbOSbOTbOUaaicfQbOWbOXaaibOYbOZbPabPbaaibPcbPdbPebPeaaqbPfbPgbGJaaibPhbPibPjbPkbPkbPjbPkbPlaaiaaabNrbPmbNraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbPnbPobPpbPoaaqaaiaaibPqbPrbPqbPsaaiaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZbDZbDZbPtbPubPtbPvbPvbPwbPvbPvbPxbPvbPvbPvbPybPvbPvbPvbPzbPvbPvbPAbPvbPvbPvbPvbPvbPvbPBbPCbPDbMxbMxbMxbMxbMxbPEbPFbPGbPHbCzacvaaqbPIaaqeApbPKbPKbPKbPJaaqeAqbPMbPMbPMbPNbPObPPbPQbPRayObPSbPTbPUbPUbPVbPWaaqaaqbPXaaqbQcbQbbRpbRobRqaaqeAnbHPbUIbUGbQdbQebQfbQgactbRwbRzbQjbQiaaibQlbQmbQnbQobQpbQqbQrbQsbQtbQuaaqaaqaaqaaqaaqaaJaBpanlaaibQvbQwbQwbQxbPbbQybPbbQzaaibQAbKfbQBbQBaaqbGHbQCbGJaaiaaibQDaaiaaiaaiaaiaaiaaiaaiaaiaaibQEaaiaaiaaiaaiaaiaaiaaiaaiaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbQFbPobPobQGaaiaaibPqbPqbQHbPqbPqaaiaaiaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZbDZbDZbHaanFaDGctmbEcbQIbEcbQJbQKbQLbFObFObQMbFObFObEcbQNbFObFObQObFObFObFObFOcrWbEfaaqcqPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbRabCzaaqbPIaaqbPJbPKbRbbPKbSxaaqbPLbPMbRcbPMbPLaaqbRdbRebRfaaqbRgbRhbRibRtbRkbRlabHbRmbRnabHchhbRrbSMbSJbRAaaqbRsbHPbHPbSRbQdbQebRubRvbQkbOBbSObRyczAbRxbRBbRCbRDaaqcuzbRFbQrbRGbRGbRGaaqbRHbRIbRJbRKbRLbRMbRNaaibQwbQwbQwbRObPbbRPbPbbRQaaibRRbKfbRSbRSaaqbRTbRUbGJaaibRVbRWbRXactbRYbRZbSabSbbScbSdbSebSfbSgbShbSibSjbSkbSlbSmaaiaaiaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabSnaaibQFaaiaaibPqbPqbPqbPqbPqbPqbPqaaiaaiaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZbDZbDZbHaanFaDGctmbEcbQIbEcbQJbQKbQLbFObFObQMbFObFObEcbQNbFObFObQObFObFObFObFOcrWbEfaaqcqPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbRabCzaaqbPIaaqbPJbPKbRbbPKbSxaaqbPLbPMbRcbPMbPLaaqbRdbRebRfaaqbRgbRhbRibRtbRkbRlabHbRmbRnabHchhbRrbSMbSJbRAaaqbRsbHPbHPbSRbQdbQebRubRvbQkbOBbSObRyczAbRxbRBbRCbRDaaqcuzbRFbQrbRGbRGbRGaaqbRHbRIbRKbRJbRLbRMbRNaaibQwbQwbQwbRObPbbRPbPbbRQaaibRRbKfbRSbRSaaqbRTbRUbGJaaibRVbRWbRXactbRYbRZbSabSbbScbSdbSebSfbSgbShbSibSjbSkbSlbSmaaiaaiaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaabSnaaibQFaaiaaibPqbPqbPqbPqbPqbPqbPqaaiaaiaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZbDZbDZaaaaaiaaiaaqayGbSoayHbxgbSpaaqaaqayGanFayHaaqaaqbSqaaqaaqaaqaaqbxgaaqaaqaaqaaqaaqaaqaaqaaqaaqaaqaaqaaqbSraaqaaqaaqbSsbStbSubSvaaqbPJbSwbPKbPKbPJaaqbSybSzbPMbSAbSBabHbSCbSDbSEaaqaaqaaqaaqaaqbSFaaqaaqbSGbSHaaqaaqaaJaaqanpaaqaaqbSIbOqbOqaaqaaqbSKbSLbMLbOpbSNbQhbSPbSQbOoaaqbSSbSTaaqbREbRFbQrbRGbRGbRGaaqbSYbSZbTabTbbTcbTdbTeaaibQwbQwbQwbTfbPbbQybTgbVdactbTibTjbTkbTkayObTlbTmbLXbTnbTobTpbTqbTrbTsbShbShbTtbTubShbTvbShbTwbTxbTybTzbTAbTBbTCacdcogbTEbTFcoYaabaabaabaabaabaabaabaabaabaabaabaabaabaaqaaibTHbTIbTIbPqbPqbPqbPqbPqbPqbPqbPqaaiaaiaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZbDZbDZaaaaaibTJbTKbTLbTMbTNbTObTPbTQaaibTRbTSbTTbTUbTVbTWbTXbTYbTZbTYbTYbTYbTYbTYbTYbTYbTYbTYbTYbTYbTYbTYbTYbUabTYbTYbTYbUbbUcbUdbUeaaqeAobUgbUhbUibUjabHbUkbUlbUmbUnbUoaaqbUpbUqbUrbUsbUtbUtbUtbUtbUubUvbUwbUxbUxbUybUybUzbUAbUBaaqaaqbUCbUDbUEbPYcbhbQebUHbMLbOwbOsaFWbUKbLwbQaaFWbUMbUNanccxjcxkcxhcxicwdcxgaaqcqxbUVbUWbUXbUYbUZbVaaaibVbbQwbQwaaibVcbYdbVeaaiaaqbVfbVgbIwaaqaaqbVhbQCbViaaibVjbVkbVlaaibVmbVnbVnbVobVpbVqbVrbVnbVsbVtbVnbVnbVubVvbVwcpcbVybVzbVAcqoaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaiaaibVCbPqbPqbPqbPqbPqbPqbPqbPqbPqbPqbPqaaiaaiaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabyLbyLbyLbyLbyLbyLbyLbyLbyLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabDZbDZbDZbDZbDZaaaaaaaaibVDbVEbVEbVFbVEbVEbVGbVHaaibVIbVJbVKbVJbVJbVLaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaqbVMaaqaaqbVNaaqbVObVPbVQbVRbVSaaqbVTbVUbVVbVWbVXaMRbVYbVZbWaabHacdacdacdacdbWbatQbzlayObWcayOayObWdbWebWfbWgbWhbWibWjbWkbWlbsobWnbWobWpbWqbWrbWsbWtbWubWvbWwbWxbWyaaqaaqaCZayOayOayObWzaaqaaqeBvaaqalrbqIboGbnUaaibWEbQwbQwbWFbWGbWHbWIbWJaaqaaqbWKaaqaaqbWLbWMbQCbrYaaiaaibWNaaiaaibWObsnbWPbWQbWRbVnbWSbVwbWTbVwbVwbVwbWUbSfbIIaaibWVbWWbWXcdiaabaabaabaabaabaabaabaabaabaabaabaabaabaaibPqbPqbPqbPqbPqbPqbWZbPqbXabPqbPqbPqbPqbPqaaiaaiaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+1 -1
View File
File diff suppressed because one or more lines are too long