Files
Bubberstation/code/modules/mining/minebot.dm
Joan Lung 3cba04eb83 Improves mining voucher choices and minebots (#35633)
cl Joan
tweak: The crusher kit now includes an advanced mining scanner.
tweak: The resonator kit now includes webbing and a small extinguisher.
tweak: The minebot kit now includes a minebot passthrough kinetic accelerator module, which will cause kinetic accelerator shots to pass through minebots. The welding goggles have been replaced with a welding helmet, allowing you to wear mesons and still be able to repair the minebot without eye damage.
feature: You can now install kinetic accelerator modkits on minebots. Some exceptions may apply. Crowbar to remove modkits.
balance: Minebots now shoot 33% faster by default(3 seconds to 2). The minebot cooldown upgrade still produces a fire rate of 1 second.
balance: Minebots are now slightly less likely to sit in melee like idiots, and are now healed for 15 instead of 10 when welded.
balance: Sentient minebots are penalized; they cannot have armor and melee upgrades installed, and making them sentient will override those upgrades if they were installed. In addition, they move very slightly slower and have their kinetic accelerator's cooldown increased by 1 second.
/cl

the basic scanner sucks ass and nobody wants to use it, it's actually hilarious
also in those stats: minebot picked a mere 6 more times than the conscription kit, because it's an idiot drone, easy to accidentally hit, and did I mention how much it likes going into melee?

tbh it's quite possible the extra buffs aren't needed, just the passthrough module, but it's better to go a little too far rather than not far enough.
2018-02-20 09:49:49 +13:00

300 lines
10 KiB
Plaintext

/**********************Mining drone**********************/
#define MINEDRONE_COLLECT 1
#define MINEDRONE_ATTACK 2
/mob/living/simple_animal/hostile/mining_drone
name = "nanotrasen minebot"
desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife."
gender = NEUTER
icon = 'icons/mob/aibots.dmi'
icon_state = "mining_drone"
icon_living = "mining_drone"
status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH
mouse_opacity = MOUSE_OPACITY_ICON
faction = list("neutral")
a_intent = INTENT_HARM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
move_to_delay = 10
health = 125
maxHealth = 125
melee_damage_lower = 15
melee_damage_upper = 15
obj_damage = 10
environment_smash = ENVIRONMENT_SMASH_NONE
check_friendly_fire = TRUE
stop_automated_movement_when_pulled = TRUE
attacktext = "drills"
attack_sound = 'sound/weapons/circsawhit.ogg'
sentience_type = SENTIENCE_MINEBOT
speak_emote = list("states")
wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver,
/obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron,
/obj/item/stack/ore/bananium, /obj/item/stack/ore/titanium)
healable = 0
loot = list(/obj/effect/decal/cleanable/robot_debris)
del_on_death = TRUE
var/mode = MINEDRONE_COLLECT
var/light_on = 0
var/datum/action/innate/minedrone/toggle_light/toggle_light_action
var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action
var/datum/action/innate/minedrone/dump_ore/dump_ore_action
var/obj/item/gun/energy/kinetic_accelerator/minebot/stored_gun
/mob/living/simple_animal/hostile/mining_drone/Initialize()
. = ..()
stored_gun = new(src)
toggle_light_action = new()
toggle_light_action.Grant(src)
toggle_mode_action = new()
toggle_mode_action.Grant(src)
dump_ore_action = new()
dump_ore_action.Grant(src)
var/obj/item/implant/radio/mining/imp = new(src)
imp.implant(src)
access_card = new /obj/item/card/id(src)
var/datum/job/mining/M = new
access_card.access = M.get_access()
SetCollectBehavior()
/mob/living/simple_animal/hostile/mining_drone/sentience_act()
..()
check_friendly_fire = 0
/mob/living/simple_animal/hostile/mining_drone/examine(mob/user)
..()
var/t_He = p_they(TRUE)
var/t_him = p_them()
var/t_s = p_s()
if(health < maxHealth)
if(health >= maxHealth * 0.5)
to_chat(user, "<span class='warning'>[t_He] look[t_s] slightly dented.</span>")
else
to_chat(user, "<span class='boldwarning'>[t_He] look[t_s] severely dented!</span>")
to_chat(user, "<span class='notice'>Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. <b>[max(0, LAZYLEN(contents) - 1)] Stored Ore</b>\n\
Field repairs can be done with a welder.")
if(stored_gun && stored_gun.max_mod_capacity)
to_chat(user, "<b>[stored_gun.get_remaining_mod_capacity()]%</b> mod capacity remaining.")
for(var/A in stored_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
to_chat(user, "<span class='notice'>There is \a [M] installed, using <b>[M.cost]%</b> capacity.</span>")
/mob/living/simple_animal/hostile/mining_drone/welder_act(mob/living/user, obj/item/I)
. = TRUE
if(mode == MINEDRONE_ATTACK)
to_chat(user, "<span class='info'>[src] can't be repaired while in attack mode!</span>")
return
if(maxHealth == health)
to_chat(user, "<span class='info'>[src] is at full integrity.</span>")
return
if(I.use_tool(src, user, 0, volume=40))
adjustBruteLoss(-15)
to_chat(user, "<span class='info'>You repair some of the armor on [src].</span>")
/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner))
to_chat(user, "<span class='info'>You instruct [src] to drop any collected ore.</span>")
DropOre()
return
if(istype(I, /obj/item/crowbar) || istype(I, /obj/item/borg/upgrade/modkit))
I.melee_attack_chain(user, stored_gun, params)
return
..()
/mob/living/simple_animal/hostile/mining_drone/death()
DropOre(0)
if(stored_gun)
for(var/obj/item/borg/upgrade/modkit/M in stored_gun.modkits)
M.uninstall(stored_gun)
deathmessage = "blows apart!"
..()
/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/M)
if(M.a_intent == INTENT_HELP)
toggle_mode()
switch(mode)
if(MINEDRONE_COLLECT)
to_chat(M, "<span class='info'>[src] has been set to search and store loose ore.</span>")
if(MINEDRONE_ATTACK)
to_chat(M, "<span class='info'>[src] has been set to attack hostile wildlife.</span>")
return
..()
/mob/living/simple_animal/hostile/mining_drone/CanPass(atom/movable/O)
if(istype(O, /obj/item/projectile/kinetic))
var/obj/item/projectile/kinetic/K = O
if(K.kinetic_gun)
for(var/A in K.kinetic_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
if(istype(M, /obj/item/borg/upgrade/modkit/minebot_passthrough))
return TRUE
if(istype(O, /obj/item/projectile/destabilizer))
return TRUE
return ..()
/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior()
mode = MINEDRONE_COLLECT
idle_vision_range = 9
search_objects = 2
wander = TRUE
ranged = FALSE
minimum_distance = 1
retreat_distance = null
icon_state = "mining_drone"
to_chat(src, "<span class='info'>You are set to collect mode. You can now collect loose ore.</span>")
/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior()
mode = MINEDRONE_ATTACK
idle_vision_range = 7
search_objects = 0
wander = FALSE
ranged = TRUE
retreat_distance = 2
minimum_distance = 1
icon_state = "mining_drone_offense"
to_chat(src, "<span class='info'>You are set to attack mode. You can now attack from range.</span>")
/mob/living/simple_animal/hostile/mining_drone/AttackingTarget()
if(istype(target, /obj/item/stack/ore) && mode == MINEDRONE_COLLECT)
CollectOre()
return
if(isliving(target))
SetOffenseBehavior()
return ..()
/mob/living/simple_animal/hostile/mining_drone/OpenFire(atom/A)
if(CheckFriendlyFire(A))
return
stored_gun.afterattack(A, src) //of the possible options to allow minebots to have KA mods, would you believe this is the best?
/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre()
for(var/obj/item/stack/ore/O in range(1, src))
O.forceMove(src)
/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1)
if(!contents.len)
if(message)
to_chat(src, "<span class='notice'>You attempt to dump your stored ore, but you have none.</span>")
return
if(message)
to_chat(src, "<span class='notice'>You dump your stored ore.</span>")
for(var/obj/item/stack/ore/O in contents)
O.forceMove(drop_location())
/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_ATTACK)
SetCollectBehavior()
else
SetOffenseBehavior()
//Actions for sentient minebots
/datum/action/innate/minedrone
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'icons/mob/actions/actions_mecha.dmi'
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, "<span class='notice'>You toggle your light [user.light_on ? "on" : "off"].</span>")
/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**********************/
//Melee
/obj/item/device/mine_bot_upgrade
name = "minebot melee upgrade"
desc = "A minebot upgrade."
icon_state = "door_electronics"
icon = 'icons/obj/module.dmi'
/obj/item/device/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/M, mob/user, proximity)
if(!istype(M) || !proximity)
return
upgrade_bot(M, user)
/obj/item/device/mine_bot_upgrade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(M.melee_damage_upper != initial(M.melee_damage_upper))
to_chat(user, "[src] already has a combat upgrade installed!")
return
M.melee_damage_lower += 7
M.melee_damage_upper += 7
qdel(src)
//Health
/obj/item/device/mine_bot_upgrade/health
name = "minebot armor upgrade"
/obj/item/device/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/M, mob/user)
if(M.maxHealth != initial(M.maxHealth))
to_chat(user, "[src] already has reinforced armor!")
return
M.maxHealth += 45
M.updatehealth()
qdel(src)
//AI
/obj/item/slimepotion/slime/sentience/mining
name = "minebot AI upgrade"
desc = "Can be used to grant sentience to minebots. Is incompatable with minebot armor and melee upgrades, and will override them."
icon_state = "door_electronics"
icon = 'icons/obj/module.dmi'
sentience_type = SENTIENCE_MINEBOT
var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values
var/base_damage_add = 1 //this thus disables other minebot upgrades
var/base_speed_add = 1
var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module
/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/SM)
if(istype(SM, /mob/living/simple_animal/hostile/mining_drone))
var/mob/living/simple_animal/hostile/mining_drone/M = SM
M.maxHealth = initial(M.maxHealth) + base_health_add
M.melee_damage_lower = initial(M.melee_damage_lower) + base_damage_add
M.melee_damage_upper = initial(M.melee_damage_upper) + base_damage_add
M.move_to_delay = initial(M.move_to_delay) + base_speed_add
if(M.stored_gun)
M.stored_gun.overheat_time += base_cooldown_add
#undef MINEDRONE_COLLECT
#undef MINEDRONE_ATTACK