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