mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-18 21:53:22 +00:00
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.
300 lines
10 KiB
Plaintext
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
|