diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index c71c333258b..0f74c6c1c59 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -693,6 +693,8 @@
qdel(src)
/**********************Mining drone**********************/
+#define MINEDRONE_COLLECT 1
+#define MINEDRONE_ATTACK 2
/mob/living/simple_animal/hostile/mining_drone
name = "nanotrasen minebot"
@@ -701,7 +703,6 @@
icon_state = "mining_drone"
icon_living = "mining_drone"
status_flags = CANSTUN|CANWEAKEN|CANPUSH
- stop_automated_movement_when_pulled = 1
mouse_opacity = 1
faction = list("neutral")
a_intent = I_HARM
@@ -718,6 +719,7 @@
melee_damage_upper = 15
environment_smash = 0
check_friendly_fire = 1
+ stop_automated_movement_when_pulled = 1
attacktext = "drills"
attack_sound = 'sound/weapons/circsawhit.ogg'
ranged = 1
@@ -730,18 +732,43 @@
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
/obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
/obj/item/weapon/ore/bananium, /obj/item/weapon/ore/tranquillite, /obj/item/weapon/ore/glass)
+ healable = 0
+ var/mode = MINEDRONE_COLLECT
+ var/light_on = 0
-/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I as obj, mob/user as mob, params)
+ var/datum/action/innate/minedrone/toggle_light/toggle_light_action
+ var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action
+ var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
+ var/datum/action/innate/minedrone/dump_ore/dump_ore_action
+
+/mob/living/simple_animal/hostile/mining_drone/New()
+ ..()
+ toggle_light_action = new()
+ toggle_light_action.Grant(src)
+ toggle_meson_vision_action = new()
+ toggle_meson_vision_action.Grant(src)
+ toggle_mode_action = new()
+ toggle_mode_action.Grant(src)
+ dump_ore_action = new()
+ dump_ore_action.Grant(src)
+
+ SetCollectBehavior()
+
+/mob/living/simple_animal/hostile/mining_drone/sentience_act()
+ AIStatus = AI_OFF
+ check_friendly_fire = 0
+
+/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = I
if(W.welding && !stat)
- if(FindTarget())//if the bot has anything to shoot at, to prevent combat repair cheesing
+ if(AIStatus != AI_OFF && AIStatus != AI_IDLE)
to_chat(user, "[src] is moving around too much to repair!")
return
if(maxHealth == health)
to_chat(user, "[src] is at full integrity.")
else
- adjustHealth(-10)//actually repairs the bot, not damages it
+ adjustBruteLoss(-10)
to_chat(user, "You repair some of the armor on [src].")
return
if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner))
@@ -754,27 +781,23 @@
..()
visible_message("[src] is destroyed!")
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
- DropOre()
+ DropOre(0)
qdel(src)
return
-/mob/living/simple_animal/hostile/mining_drone/New()
- ..()
- SetCollectBehavior()
-
/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
if(M.a_intent == I_HELP)
- switch(search_objects)
- if(0)
- SetCollectBehavior()
+ toggle_mode()
+ switch(mode)
+ if(MINEDRONE_COLLECT)
to_chat(M, "[src] has been set to search and store loose ore.")
- if(2)
- SetOffenseBehavior()
+ if(MINEDRONE_ATTACK)
to_chat(M, "[src] has been set to attack hostile wildlife.")
return
..()
/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior()
+ mode = MINEDRONE_COLLECT
idle_vision_range = 9
search_objects = 2
wander = 1
@@ -782,8 +805,10 @@
minimum_distance = 1
retreat_distance = null
icon_state = "mining_drone"
+ to_chat(src, "You are set to collect mode. You can now collect loose ore.")
/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior()
+ mode = MINEDRONE_ATTACK
idle_vision_range = 7
search_objects = 0
wander = 0
@@ -791,9 +816,10 @@
retreat_distance = 1
minimum_distance = 2
icon_state = "mining_drone_offense"
+ to_chat(src, "You are set to attack mode. You can now attack from range.")
/mob/living/simple_animal/hostile/mining_drone/AttackingTarget()
- if(istype(target, /obj/item/weapon/ore))
+ if(istype(target, /obj/item/weapon/ore) && mode == MINEDRONE_COLLECT)
CollectOre()
return
..()
@@ -808,18 +834,84 @@
O.forceMove(src)
return
-/mob/living/simple_animal/hostile/mining_drone/proc/DropOre()
+/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1)
if(!contents.len)
+ if(message)
+ to_chat(src, "You attempt to dump your stored ore, but you have none.")
return
+ if(message)
+ to_chat(src, "You dump your stored ore.")
for(var/obj/item/weapon/ore/O in contents)
contents -= O
O.forceMove(loc)
return
-/mob/living/simple_animal/hostile/mining_drone/adjustHealth()
- if(search_objects)
+/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount)
+ if(mode != MINEDRONE_ATTACK && amount > 0)
SetOffenseBehavior()
- ..()
+ . = ..()
+
+/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode()
+ switch(mode)
+ if(MINEDRONE_COLLECT)
+ SetOffenseBehavior()
+ if(MINEDRONE_ATTACK)
+ SetCollectBehavior()
+ else //This should never happen.
+ mode = MINEDRONE_COLLECT
+ SetCollectBehavior()
+
+//Actions for sentient minebots
+
+/datum/action/innate/minedrone
+ check_flags = AB_CHECK_CONSCIOUS
+ background_icon_state = "bg_default"
+
+/datum/action/innate/minedrone/toggle_light
+ name = "Toggle Light"
+ button_icon_state = "mech_lights_off"
+
+/datum/action/innate/minedrone/toggle_light/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+
+ if(user.light_on)
+ user.set_light(0)
+ else
+ user.set_light(6)
+ user.light_on = !user.light_on
+ to_chat(user, "You toggle your light [user.light_on ? "on" : "off"].")
+
+/datum/action/innate/minedrone/toggle_meson_vision
+ name = "Toggle Meson Vision"
+ button_icon_state = "meson"
+
+/datum/action/innate/minedrone/toggle_meson_vision/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+
+ if(user.sight & SEE_TURFS)
+ user.sight &= ~SEE_TURFS
+ user.see_invisible = SEE_INVISIBLE_LIVING
+ else
+ user.sight |= SEE_TURFS
+ user.see_invisible = SEE_INVISIBLE_MINIMUM
+
+ to_chat(user, "You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].")
+
+/datum/action/innate/minedrone/toggle_mode
+ name = "Toggle Mode"
+ button_icon_state = "mech_cycle_equip_off"
+
+/datum/action/innate/minedrone/toggle_mode/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+ user.toggle_mode()
+
+/datum/action/innate/minedrone/dump_ore
+ name = "Dump Ore"
+ button_icon_state = "mech_eject"
+
+/datum/action/innate/minedrone/dump_ore/Activate()
+ var/mob/living/simple_animal/hostile/mining_drone/user = owner
+ user.DropOre()
/**********************Minebot Upgrades**********************/
@@ -832,8 +924,8 @@
icon_state = "door_electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
-/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
- if(!istype(M))
+/obj/item/device/mine_bot_ugprade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity)
+ if(!istype(M) || !proximity)
return
upgrade_bot(M, user)
@@ -881,6 +973,10 @@
icon_state = "door_electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
sentience_type = SENTIENCE_MINEBOT
+ origin_tech = "programming=6"
+
+#undef MINEDRONE_COLLECT
+#undef MINEDRONE_ATTACK
/**********************Mining drone kit**********************/
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index 3269c8ae7b5..0804b76bc11 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ