diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index ef3c21fcdca..2481003dd0e 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -1,7 +1,7 @@
// AI (i.e. game AI, not the AI player) controlled bots
/obj/machinery/bot
- icon = 'icons/obj/aibots.dmi'
+ icon = 'icons/mob/npc/aibots.dmi'
layer = MOB_LAYER
light_range = 3
use_power = POWER_USE_OFF
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index b3dbd9a6431..bcc18986875 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -1057,7 +1057,10 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
/obj/item/do_pickup_animation(atom/target, var/image/pickup_animation = image(icon, loc, icon_state, ABOVE_ALL_MOB_LAYER, dir, pixel_x, pixel_y))
if(!isturf(loc))
return
- pickup_animation.overlays = overlays
+ if(overlays.len)
+ pickup_animation.overlays = overlays
+ if(underlays.len)
+ pickup_animation.underlays = underlays
. = ..()
/obj/item/proc/throw_fail_consequences(var/mob/living/carbon/C)
diff --git a/code/modules/cargo/bounties/bot.dm b/code/modules/cargo/bounties/bot.dm
index 69e54a475e8..9688af6cc94 100644
--- a/code/modules/cargo/bounties/bot.dm
+++ b/code/modules/cargo/bounties/bot.dm
@@ -14,10 +14,10 @@
required_count = 3
random_count = 1
wanted_types = list(/mob/living/bot/farmbot)
-
+
/datum/bounty/item/bot/medbot
- name = "Medbot"
- description = "We were unable to recruit a sufficient number of qualified medical professionals this month. Ship us a few medbots to fill the void."
+ name = "Medibot"
+ description = "We were unable to recruit a sufficient number of qualified medical professionals this month. Ship us a few medibots to fill the void."
reward_low = 5500
reward_high = 6000
required_count = 2
diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm
index 5430986f7fd..f0f48e6de99 100644
--- a/code/modules/integrated_electronics/subtypes/output.dm
+++ b/code/modules/integrated_electronics/subtypes/output.dm
@@ -209,7 +209,7 @@
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2)
/obj/item/integrated_circuit/output/sound/medbot
- name = "medbot sound circuit"
+ name = "medibot sound circuit"
desc = "A miniature speaker is attached to this component, used to annoy patients while they get pricked by a medbot."
sounds = list(
"surgeon" = 'sound/voice/medbot/msurgeon.ogg',
diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm
index d3538605bac..257b78a6083 100644
--- a/code/modules/mob/living/bot/bot.dm
+++ b/code/modules/mob/living/bot/bot.dm
@@ -3,7 +3,7 @@
accent = ACCENT_TTS
health = 20
maxHealth = 20
- icon = 'icons/obj/aibots.dmi'
+ icon = 'icons/mob/npc/aibots.dmi'
layer = MOB_LAYER
universal_speak = TRUE
density = FALSE
diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm
index 0a0aaf30f91..f423c66fa3a 100644
--- a/code/modules/mob/living/bot/cleanbot.dm
+++ b/code/modules/mob/living/bot/cleanbot.dm
@@ -360,7 +360,7 @@ var/list/cleanbot_types // Going to use this to generate a list of types once th
/obj/item/bucket_sensor
name = "proxy bucket"
desc = "It's a bucket. With a sensor attached."
- icon = 'icons/obj/aibots.dmi'
+ icon = 'icons/mob/npc/aibots.dmi'
icon_state = "bucket_proxy"
force = 3
throwforce = 10
diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm
index 776bab2dd61..f4a9cf06fff 100644
--- a/code/modules/mob/living/bot/farmbot.dm
+++ b/code/modules/mob/living/bot/farmbot.dm
@@ -7,7 +7,7 @@
/mob/living/bot/farmbot
name = "Farmbot"
desc = "The botanist's best friend. Various farming equipment seems haphazardly attached to it."
- icon = 'icons/obj/aibots.dmi'
+ icon = 'icons/mob/npc/aibots.dmi'
icon_state = "farmbot0"
health = 50
maxHealth = 50
@@ -176,7 +176,7 @@
target = source
frustration = 0
break
-
+
/mob/living/bot/farmbot/proc/pathfind(var/atom/A)
var/t = get_dir(A, src) // Turf with the tray is impassable, so a* can't navigate directly to it
@@ -324,7 +324,7 @@
/obj/item/farmbot_arm_assembly
name = "water tank/robot arm assembly"
desc = "A water tank with a robot arm permanently grafted to it."
- icon = 'icons/obj/aibots.dmi'
+ icon = 'icons/mob/npc/aibots.dmi'
icon_state = "water_arm"
var/build_step = 0
var/created_name = "Farmbot"
diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm
index 7b00a301b8c..787fb3e7e5e 100644
--- a/code/modules/mob/living/bot/medbot.dm
+++ b/code/modules/mob/living/bot/medbot.dm
@@ -1,12 +1,12 @@
/mob/living/bot/medbot
- name = "Medbot"
+ name = "Medibot"
desc = "A little medical robot. He looks somewhat underwhelmed."
icon_state = "medibot0"
req_one_access = list(access_medical, access_robotics)
-
- var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
botcard_access = list(access_medical, access_morgue, access_surgery, access_pharmacy, access_virology, access_genetics)
+ var/obj/item/storage/firstaid/firstaid_item
+
//AI vars
var/frustration = 0
var/list/path = list()
@@ -29,6 +29,13 @@
var/treatment_emag = /singleton/reagent/toxin
var/declare_treatment = 0 //When attempting to treat a patient, should it notify everyone wearing medhuds?
+/mob/living/bot/medbot/Initialize()
+ var/list/firstaid_types = typesof(/obj/item/storage/firstaid)
+ var/firstaid_to_use = pick(firstaid_types)
+ firstaid_item = new firstaid_to_use(src)
+
+ . = ..()
+
/mob/living/bot/medbot/Destroy()
QDEL_NULL(reagent_glass)
@@ -55,11 +62,13 @@
if(!path)
path = list()
if(path.len)
+ icon_state = "medibots"
step_to(src, path[1])
path -= path[1]
++frustration
if(get_dist(src, patient) > 7 || frustration > 8)
patient = null
+ icon_state = "medibot[on]"
else
for(var/mob/living/carbon/human/H in view(7, src)) // Time to find a patient!
if(valid_healing_target(H))
@@ -99,8 +108,7 @@
patient = null
return
- icon_state = "medibots"
- visible_message("[src] is trying to inject [H]!")
+ visible_message(SPAN_WARNING("[src] is trying to inject [H]!"))
if(declare_treatment)
var/area/location = get_area(src)
broadcast_medical_hud_message("[src] is treating [H] in [location]", src)
@@ -111,22 +119,26 @@
reagent_glass.reagents.trans_to_mob(H, injection_amount, CHEM_BLOOD)
else
H.reagents.add_reagent(t, injection_amount)
- visible_message("[src] injects [H] with the syringe!")
+ visible_message(SPAN_WARNING("[src] injects [H] with the syringe!"))
currently_healing = 0
update_icon()
/mob/living/bot/medbot/update_icon()
- cut_overlays()
- if(skin)
- add_overlay("medskin_[skin]")
+ if(!underlays.len)
+ underlays += image(firstaid_item.icon, firstaid_item.icon_state)
+ var/matrix/M = matrix()
+ var/image/ha_image = image('icons/obj/device.dmi', "health")
+ M.Translate(5, 0)
+ ha_image.transform = M
+ underlays += ha_image
if(currently_healing)
- icon_state = "medibots"
+ icon_state = "mediboth"
else
icon_state = "medibot[on]"
/mob/living/bot/medbot/attack_hand(var/mob/user)
if (!has_ui_access(user))
- to_chat(user, "The unit's interface refuses to unlock!")
+ to_chat(user, SPAN_WARNING("The unit's interface refuses to unlock!"))
return
var/dat = ""
@@ -167,15 +179,15 @@
/mob/living/bot/medbot/attackby(var/obj/item/O, var/mob/user)
if(istype(O, /obj/item/reagent_containers/glass))
if(locked)
- to_chat(user, "You cannot insert a beaker because the panel is locked.")
+ to_chat(user, SPAN_NOTICE("You cannot insert a beaker because the panel is locked."))
return
if(!isnull(reagent_glass))
- to_chat(user, "There is already a beaker loaded.")
+ to_chat(user, SPAN_NOTICE("There is already a beaker loaded."))
return
user.drop_from_inventory(O,src)
reagent_glass = O
- to_chat(user, "You insert [O].")
+ to_chat(user, SPAN_NOTICE("You insert [O]."))
return 1
else
..()
@@ -187,7 +199,7 @@
add_fingerprint(usr)
if (!has_ui_access(usr))
- to_chat(usr, "Insufficient permissions.")
+ to_chat(usr, SPAN_WARNING("Insufficient permissions."))
return
if (href_list["power"])
@@ -220,7 +232,7 @@
reagent_glass.forceMove(get_turf(src))
reagent_glass = null
else
- to_chat(usr, "You cannot eject the beaker because the panel is locked.")
+ to_chat(usr, SPAN_NOTICE("You cannot eject the beaker because the panel is locked."))
else if (href_list["declaretreatment"] && (!locked || issilicon(usr)))
declare_treatment = !declare_treatment
@@ -242,9 +254,9 @@
. = ..()
if(!emagged)
if(user)
- to_chat(user, "You short out [src]'s reagent synthesis circuits.")
- visible_message("[src] buzzes oddly!")
- flick("medibot_spark", src)
+ to_chat(user, SPAN_WARNING("You short out [src]'s reagent synthesis circuits."))
+ visible_message(SPAN_WARNING("[src] buzzes oddly!"))
+ flick_overlay("medibot_spark", src)
patient = null
currently_healing = 0
emagged = 1
@@ -254,11 +266,13 @@
ignored |= user
/mob/living/bot/medbot/explode()
- on = 0
- visible_message("[src] blows apart!")
+ on = FALSE
+ visible_message(SPAN_DANGER("\The [src] blows apart!"))
var/turf/Tsec = get_turf(src)
-
- new /obj/item/storage/firstaid(Tsec)
+ if(firstaid_item)
+ firstaid_item.forceMove(Tsec)
+ firstaid_item.contents = null
+ firstaid_item = null
new /obj/item/device/assembly/prox_sensor(Tsec)
new /obj/item/device/healthanalyzer(Tsec)
if (prob(50))
@@ -320,34 +334,27 @@
return
if(contents.len >= 1)
- to_chat(user, "You need to empty [src] out first.")
+ to_chat(user, SPAN_NOTICE("You need to empty [src] out first."))
return
var/obj/item/firstaid_arm_assembly/A = new /obj/item/firstaid_arm_assembly
- if(istype(src, /obj/item/storage/firstaid/fire))
- A.skin = "ointment"
- else if(istype(src, /obj/item/storage/firstaid/toxin))
- A.skin = "tox"
- else if(istype(src, /obj/item/storage/firstaid/o2))
- A.skin = "o2"
-
- if(A.skin)
- A.add_overlay("kit_skin_[A.skin]")
+ A.underlays += image(icon, icon_state)
+ A.firstaid_item = src
qdel(S)
user.put_in_hands(A)
- to_chat(user, "You add the robot arm to the first aid kit.")
+ to_chat(user, SPAN_NOTICE("You add the robot arm to the first aid kit."))
qdel(src)
/obj/item/firstaid_arm_assembly
name = "first aid/robot arm assembly"
desc = "A first aid kit with a robot arm permanently grafted to it."
- icon = 'icons/obj/aibots.dmi'
+ icon = 'icons/mob/npc/aibots.dmi'
icon_state = "firstaid_arm"
+ w_class = ITEMSIZE_NORMAL
var/build_step = 0
var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess
- var/skin = null //Same as medbot, set to tox or ointment for the respective kits.
- w_class = ITEMSIZE_NORMAL
+ var/obj/item/storage/firstaid/firstaid_item // store the firstaid type if it blows up
/obj/item/firstaid_arm_assembly/attackby(obj/item/W as obj, mob/user as mob)
..()
@@ -365,20 +372,25 @@
user.drop_from_inventory(W,get_turf(src))
qdel(W)
build_step++
- to_chat(user, "You add the health sensor to [src].")
- name = "First aid/robot arm/health analyzer assembly"
- add_overlay("na_scanner")
+ to_chat(user, SPAN_NOTICE("You add the health sensor to [src]."))
+ name = "first-aid/robot arm/health analyzer assembly"
+ var/matrix/M = matrix()
+ var/image/ha_image = image('icons/obj/device.dmi', "health")
+ M.Translate(5, 0)
+ ha_image.transform = M
+ underlays += ha_image
return 1
if(1)
if(isprox(W))
user.drop_from_inventory(W,get_turf(src))
qdel(W)
- to_chat(user, "You complete the Medibot! Beep boop.")
+ to_chat(user, SPAN_NOTICE("You complete the Medibot! Beep boop."))
var/turf/T = get_turf(src)
var/mob/living/bot/medbot/S = new /mob/living/bot/medbot(T)
- S.skin = skin
S.name = created_name
+ S.underlays = src.underlays
S.update_icon()
+ S.firstaid_item = firstaid_item
qdel(src)
return 1
diff --git a/html/changelogs/wezzy_radarputamaskon.yml b/html/changelogs/wezzy_radarputamaskon.yml
new file mode 100644
index 00000000000..a0db6db6c38
--- /dev/null
+++ b/html/changelogs/wezzy_radarputamaskon.yml
@@ -0,0 +1,41 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: Wowzewow(Wezzy)
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Adds new sprites and updates sprite generation for medbots."
diff --git a/icons/mob/npc/aibots.dmi b/icons/mob/npc/aibots.dmi
index 7a6a723c0f0..b06da66797c 100644
Binary files a/icons/mob/npc/aibots.dmi and b/icons/mob/npc/aibots.dmi differ
diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi
deleted file mode 100644
index 980abdab750..00000000000
Binary files a/icons/obj/aibots.dmi and /dev/null differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index c2056a25b2a..cbf4c164ec2 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ