diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index e199536e985..f2bbb5df6c1 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -37,7 +37,8 @@
#define ui_alien_head "4:12,1:5" //aliens
#define ui_alien_oclothing "5:14,1:5" //aliens
-#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs
+#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs
+#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index a6fc1a6b2c2..8525c6ab23c 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -98,6 +98,13 @@
mymob.throw_icon.icon_state = "store"
mymob.throw_icon.name = "store"
mymob.throw_icon.screen_loc = ui_borg_store
+
+//Headlamp
+ mymob:lamp_button = new /obj/screen()
+ mymob:lamp_button.icon = 'icons/mob/screen1_robot.dmi'
+ mymob:lamp_button.icon_state = "lamp0"
+ mymob:lamp_button.name = "Toggle Headlamp"
+ mymob:lamp_button.screen_loc = ui_borg_lamp
//Temp
mymob.bodytemp = new /obj/screen()
@@ -165,7 +172,7 @@
mymob.client.screen = null
- mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.rest, mymob.sleep, mymob.mach )
+ mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon, mymob:lamp_button) //, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += src.adding + src.other
return
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 74692bd2aaf..3c1bcfd0ef2 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -378,6 +378,11 @@
if(isrobot(usr))
var/mob/living/silicon/robot/R = usr
R.sensor_mode()
+
+ if("Toggle Headlamp")
+ if(isrobot(usr))
+ var/mob/living/silicon/robot/R = usr
+ R.control_headlamp()
if("module1")
if(istype(usr, /mob/living/silicon/robot))
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index e9678fff949..5704bb08eb1 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -59,6 +59,8 @@
for(var/obj/effect/glowshroom/G in orange(2, usr)) //Very small radius
G.visible_message("\The [G] withers away!")
qdel(G)
+ for(var/mob/living/silicon/robot/borg in T.contents)
+ borg.update_headlamp(1, charge_max)
for(var/mob/living/carbon/human/H in T.contents)
for(var/obj/item/device/flashlight/F in H)
if(is_type_in_list(F, blacklisted_lights))
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 364babf4a89..b0d483137b7 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -38,7 +38,9 @@
R.languages = list()
R.speech_synthesizer_langs = list()
R.notify_ai(2)
- R.updateicon()
+ R.jetpackoverlay = 0
+ R.update_icons()
+ R.update_headlamp()
R.add_language("Robot Talk", 1)
return 1
@@ -156,7 +158,8 @@
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"
+ R.jetpackoverlay = 1
+ R.update_icons()
return 1
/obj/item/borg/upgrade/ddrill
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index 60296dde007..cf9427242d8 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -51,6 +51,7 @@
update_canmove()
if(camera)
camera.status = 0
+ update_headlamp(1) //So borg lights are disabled when killed.
if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station
var/obj/machinery/recharge_station/RC = loc
@@ -60,8 +61,7 @@
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
- updateicon()
- update_fire()
+ update_icons()
tod = worldtime2text() //weasellos time of death patch
if(mind) mind.store_memory("Time of death: [tod]", 0)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 524268be43e..995a7a60f33 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -66,7 +66,7 @@
//Some tidying-up.
flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT logo and the subscript: 'Nanotrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'"
- updateicon()
+ update_icons()
/mob/living/silicon/robot/drone/init()
laws = new /datum/ai_laws/drone()
@@ -80,7 +80,7 @@
real_name = "maintenance drone ([rand(100,999)])"
name = real_name
-/mob/living/silicon/robot/drone/updateicon()
+/mob/living/silicon/robot/drone/update_icons()
overlays.Cut()
if(stat == 0)
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 47f515401dc..1b5c2df4cff 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -15,11 +15,7 @@
if(istype(O,/obj/item/borg/sight))
var/obj/item/borg/sight/S = O
sight_mode &= ~S.sight_mode
- else if(istype(O, /obj/item/device/flashlight))
- var/obj/item/device/flashlight/F = O
- if(F.on)
- F.on = 0
- F.update_brightness(src)
+
if(client)
client.screen -= O
contents -= O
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 5400fa55d9d..173a155a479 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -42,7 +42,8 @@
if (is_component_functioning("power cell") && cell)
if(src.cell.charge <= 0)
uneq_all()
- src.stat = 1
+ update_headlamp(1)
+ src.stat = UNCONSCIOUS
has_power = 0
for(var/V in components)
var/datum/robot_component/C = components[V]
@@ -63,6 +64,9 @@
for(var/V in components)
var/datum/robot_component/C = components[V]
C.consume_power()
+
+ var/amt = Clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell.
+ cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick
if(!is_component_functioning("actuator"))
Paralyse(3)
@@ -71,7 +75,8 @@
has_power = 1
else
uneq_all()
- src.stat = 1
+ src.stat = UNCONSCIOUS
+ update_headlamp(1)
Paralyse(3)
/mob/living/silicon/robot/proc/handle_regular_status_updates()
@@ -324,7 +329,7 @@
src.module_state_2:screen_loc = ui_inv2
if(src.module_state_3)
src.module_state_3:screen_loc = ui_inv3
- updateicon()
+ update_icons()
/mob/living/silicon/robot/proc/process_locks()
if(weapon_lock)
@@ -358,8 +363,6 @@
overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing")
if(on_fire)
overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing")
- update_icons()
- return
/mob/living/silicon/robot/fire_act()
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 941aecfb36f..691568c5631 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -22,6 +22,7 @@ var/list/robot_verbs_default = list(
var/obj/screen/inv1 = null
var/obj/screen/inv2 = null
var/obj/screen/inv3 = null
+ var/obj/screen/lamp_button = null
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
var/obj/screen/robot_modules_background
@@ -74,6 +75,12 @@ var/list/robot_verbs_default = list(
var/braintype = "Cyborg"
var/base_icon = ""
var/crisis = 0
+
+ var/lamp_max = 10 //Maximum brightness of a borg lamp. Set as a var for easy adjusting.
+ var/lamp_intensity = 0 //Luminosity of the headlamp. 0 is off. Higher settings than the minimum require power.
+ var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
+
+ var/jetpackoverlay = 0
var/obj/item/borg/sight/hud/sec/sechud = null
var/obj/item/borg/sight/hud/med/healthhud = null
@@ -92,7 +99,8 @@ var/list/robot_verbs_default = list(
robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
ident = rand(1, 999)
updatename("Default")
- updateicon()
+ update_icons()
+ update_headlamp()
radio = new /obj/item/device/radio/borg(src)
common_radio = radio
@@ -364,7 +372,7 @@ var/list/robot_verbs_default = list(
custom_name = newname
updatename()
- updateicon()
+ update_icons()
/mob/living/silicon/robot/verb/cmd_robot_alerts()
set category = "Robot Commands"
@@ -683,7 +691,7 @@ var/list/robot_verbs_default = list(
if(cell)
user << "You close the cover."
opened = 0
- updateicon()
+ update_icons()
else if(wiresexposed && wires.IsAllCut())
//Cell is out, wires are exposed, remove MMI, produce damaged chassis, baleet original mob.
if(!mmi)
@@ -735,7 +743,7 @@ var/list/robot_verbs_default = list(
else
user << "You open the cover."
opened = 1
- updateicon()
+ update_icons()
else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
var/datum/robot_component/C = components["power cell"]
@@ -765,14 +773,14 @@ var/list/robot_verbs_default = list(
else if(istype(W, /obj/item/weapon/screwdriver) && opened && !cell) // haxing
wiresexposed = !wiresexposed
user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
- updateicon()
+ update_icons()
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()
+ update_icons()
else if(istype(W, /obj/item/device/encryptionkey/) && opened)
if(radio)//sanityyyyyy
@@ -789,7 +797,7 @@ var/list/robot_verbs_default = list(
if(allowed(usr))
locked = !locked
user << "You [ locked ? "lock" : "unlock"] [src]'s interface."
- updateicon()
+ update_icons()
else
user << "\red Access denied."
@@ -871,7 +879,7 @@ var/list/robot_verbs_default = list(
if(src.module && istype(src.module, /obj/item/weapon/robot_module/medical))
for(var/obj/item/weapon/borg_defib/F in src.module.modules)
F.safety = 0
- updateicon()
+ update_icons()
return
/mob/living/silicon/robot/verb/unlock_own_cover()
@@ -882,7 +890,7 @@ var/list/robot_verbs_default = list(
switch(alert("You can not lock your cover again, are you sure?\n (You can still ask for a human to lock it)", "Unlock Own Cover", "Yes", "No"))
if("Yes")
locked = 0
- updateicon()
+ update_icons()
usr << "You unlock your cover."
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
@@ -991,7 +999,7 @@ var/list/robot_verbs_default = list(
user.put_in_active_hand(cell)
user << "You remove \the [cell]."
cell = null
- updateicon()
+ update_icons()
if(!opened && (!istype(user, /mob/living/silicon)))
if (user.a_intent == "help")
@@ -1023,12 +1031,10 @@ var/list/robot_verbs_default = list(
return 1
return 0
-/mob/living/silicon/robot/proc/updateicon()
+/mob/living/silicon/robot/update_icons()
overlays.Cut()
- if(stat == 0)
- overlays += "eyes"
- overlays.Cut()
+ if(stat != DEAD && !(paralysis || stunned || weakened)) //Not dead, not stunned.
overlays += "eyes-[icon_state]"
else
overlays -= "eyes"
@@ -1059,16 +1065,16 @@ var/list/robot_verbs_default = list(
icon_state = "[base_icon]-roll"
else
icon_state = base_icon
- return
-
-/mob/living/silicon/robot/proc/updatefire()
- return
+
+ if(jetpackoverlay)
+ overlays += "minerjetpack-[icon_state]"
+ update_fire()
//Call when target overlay should be added/removed
/mob/living/silicon/robot/update_targeted()
if(!targeted_by && target_locked)
qdel(target_locked)
- updateicon()
+ update_icons()
if (targeted_by && target_locked)
overlays += target_locked
@@ -1189,6 +1195,32 @@ var/list/robot_verbs_default = list(
/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/proc/control_headlamp()
+ if(stat || lamp_recharging)
+ src << "This function is currently offline."
+ return
+
+//Some sort of magical "modulo" thing which somehow increments lamp power by 2, until it hits the max and resets to 0.
+ lamp_intensity = (lamp_intensity+2) % (lamp_max+2)
+ src << "[lamp_intensity ? "Headlamp power set to Level [lamp_intensity/2]" : "Headlamp disabled."]"
+ update_headlamp()
+
+/mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0, var/cooldown = 100)
+ set_light(0)
+
+ if(lamp_intensity && (turn_off || stat))
+ src << "Your headlamp has been deactivated."
+ lamp_intensity = 0
+ lamp_recharging = 1
+ spawn(cooldown) //10 seconds by default, if the source of the deactivation does not keep stat that long.
+ lamp_recharging = 0
+ else
+ set_light(light_range + lamp_intensity)
+
+ if(lamp_button)
+ lamp_button.icon_state = "lamp[lamp_intensity]"
+
+ update_icons()
/mob/living/silicon/robot/Move(a, b, flag)
@@ -1309,8 +1341,7 @@ var/list/robot_verbs_default = list(
lockcharge = null
return
- overlays -= "eyes"
- updateicon()
+ update_icons()
if (triesleft >= 1)
var/choice = input("Look at your icon - is this what you want?") in list("Yes","No")
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index a34e61662b0..22617da947a 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -83,7 +83,6 @@
New()
- src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded(src)
src.modules += new /obj/item/weapon/extinguisher(src)
@@ -103,7 +102,6 @@
)
New()
- src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/device/healthanalyzer/advanced(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
@@ -153,7 +151,6 @@
)
New()
- src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
@@ -203,7 +200,6 @@
New()
- src.modules += new /obj/item/device/flashlight/seclite(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/loaded/robot(src)
@@ -219,7 +215,6 @@
New()
- src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
@@ -239,7 +234,6 @@
New()
- src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
@@ -309,7 +303,6 @@
New()
- src.modules += new /obj/item/device/flashlight/lantern(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.modules += new /obj/item/weapon/wrench(src)
@@ -327,7 +320,6 @@
/obj/item/weapon/robot_module/deathsquad/New()
src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/cyborg(src)
@@ -341,7 +333,6 @@
/obj/item/weapon/robot_module/syndicate/New()
src.modules += new /obj/item/device/flash/cyborg(src)
- 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/printer(src)
src.modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
@@ -356,7 +347,6 @@
name = "combat robot module"
New()
- src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src)
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index 39053002542..19566a82d88 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi
index 1796092eae0..9dfa63e5f19 100644
Binary files a/icons/mob/screen1_robot.dmi and b/icons/mob/screen1_robot.dmi differ