diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 7b3dcbf899d..0db0dff7ea1 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -91,10 +91,18 @@ var/C = chassis.loc set_ready_state(0) chassis.use_power(energy_drain) - . = do_after(chassis.occupant, equip_cooldown, target=target) + . = do_after(chassis.occupant, equip_cooldown, target = target) set_ready_state(1) - if(!chassis || chassis.loc != C || src != chassis.selected) - return 0 + if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target) & chassis.dir)) + return FALSE + +/obj/item/mecha_parts/mecha_equipment/proc/do_after_mecha(atom/target, delay) + if(!chassis) + return + var/C = chassis.loc + . = do_after(chassis.occupant, delay, target = target) + if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target) & chassis.dir)) + return FALSE /obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/mecha/M) if(istype(M)) diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 635f1718134..445d881ee50 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -1,54 +1,69 @@ + // Drill, Diamond drill, Mining scanner +#define DRILL_BASIC 1 +#define DRILL_HARDENED 2 + /obj/item/mecha_parts/mecha_equipment/drill name = "exosuit drill" desc = "Equipment for engineering and combat exosuits. This is the drill that'll pierce the heavens!" icon_state = "mecha_drill" - equip_cooldown = 30 + equip_cooldown = 15 energy_drain = 10 force = 15 + sharp = TRUE + var/drill_delay = 7 + var/drill_level = DRILL_BASIC /obj/item/mecha_parts/mecha_equipment/drill/action(atom/target) if(!action_checks(target)) return - if(istype(target, /turf/space)) + if(isspaceturf(target)) return if(isobj(target)) var/obj/target_obj = target - if(target_obj.unacidable && !istype(target_obj, /obj/mecha)) + if(target_obj.unacidable && !ismecha(target_obj)) occupant_message("[target] is too durable to drill through.") return target.visible_message("[chassis] starts to drill [target].", "[chassis] starts to drill [target]...", - blind_message = "You hear drilling.") + "You hear drilling.") + if(do_after_cooldown(target)) + set_ready_state(FALSE) + log_message("Started drilling [target]") if(isturf(target)) var/turf/T = target T.drill_act(src) - else - log_message("Drilled through [target]") + set_ready_state(TRUE) + return + while(do_after_mecha(target, drill_delay)) if(isliving(target)) - if(istype(src , /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill)) - drill_mob(target, chassis.occupant, 120) - else - drill_mob(target, chassis.occupant) + drill_mob(target, chassis.occupant) + playsound(src, 'sound/weapons/drill.ogg', 40, TRUE) + else if(istype(target, /obj)) + var/obj/O = target + //O.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target)) + O.ex_act(2)//TO-DO-OBJECT-DAMAGE: Kill off when everything is damageable + playsound(src, 'sound/weapons/drill.ogg', 40, TRUE) else - target.ex_act(2) + set_ready_state(TRUE) + return + set_ready_state(TRUE) /turf/proc/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) return -/turf/simulated/floor/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - ex_act(1) - /turf/simulated/wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - ex_act(2) + if(drill.do_after_mecha(src, 60 / drill.drill_level)) + drill.log_message("Drilled through [src]") + dismantle_wall(TRUE, FALSE) /turf/simulated/wall/r_wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - if(istype(drill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill)) - if(drill.do_after_cooldown(src))//To slow down how fast mechs can drill through the station + if(drill.drill_level >= DRILL_HARDENED) + if(drill.do_after_mecha(src, 120 / drill.drill_level)) drill.log_message("Drilled through [src]") - ex_act(3) + dismantle_wall(TRUE, FALSE) else drill.occupant_message("[src] is too durable to drill through.") @@ -59,24 +74,17 @@ drill.log_message("Drilled through [src]") drill.move_ores() -/turf/simulated/floor/plating/asteroid/airless/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) - if(istype(drill, /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill)) - for(var/turf/simulated/floor/plating/asteroid/airless/M in range(1, src)) - M.gets_drilled() - else - for(var/turf/simulated/floor/plating/asteroid/airless/M in range(1, drill.chassis)) - if(get_dir(drill.chassis, M) & drill.chassis.dir) - M.gets_drilled() +/turf/simulated/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) + for(var/turf/simulated/floor/plating/asteroid/M in range(1, drill.chassis)) + if((get_dir(drill.chassis, M) & drill.chassis.dir) && !M.dug) + M.gets_dug() drill.log_message("Drilled through [src]") drill.move_ores() /obj/item/mecha_parts/mecha_equipment/drill/proc/move_ores() - if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment) - var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in chassis:cargo - if(ore_box) - for(var/obj/item/stack/ore/ore in range(1, chassis)) - if(get_dir(chassis, ore) & chassis.dir) - ore.Move(ore_box) + if(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in chassis.equipment && istype(chassis, /obj/mecha/working/ripley)) + var/obj/mecha/working/ripley/R = chassis //we could assume that it's a ripley because it has a clamp, but that's ~unsafe~ and ~bad practice~ + R.collect_ore() /obj/item/mecha_parts/mecha_equipment/drill/can_attach(obj/mecha/M) if(..()) @@ -84,25 +92,44 @@ return 1 return 0 -/obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/user, var/drill_damage=80) - target.visible_message("[chassis] drills [target] with [src].", \ - "[chassis] drills [target] with [src].") +/obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/user) + target.visible_message("[chassis] is drilling [target] with [src]!", + "[chassis] is drilling you with [src]!") add_attack_logs(user, target, "DRILLED with [src] (INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") - if(target.stat == DEAD && target.butcher_results) - target.harvest(chassis) // Butcher the mob with our drill. + if(target.stat == DEAD && target.getBruteLoss() >= 200) + add_attack_logs(user, target, "gibbed") + if(LAZYLEN(target.butcher_results)) + target.harvest(chassis) // Butcher the mob with our drill. + else + target.gib() else - target.take_organ_damage(drill_damage) + var/splatter_dir = get_dir(chassis, target) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/target_part = H.get_organ(ran_zone("chest")) + H.apply_damage(10, BRUTE, "chest", H.run_armor_check(target_part, "melee")) - if(target) - target.Paralyse(10) + //blood splatters + blood_color = H.dna.species.blood_color + new /obj/effect/temp_visual/dir_setting/bloodsplatter(H.drop_location(), splatter_dir, blood_color) + + //organs go everywhere + if(target_part && prob(10 * drill_level)) + target_part.droplimb() + else + target.adjustBruteLoss(10) + if(isalien(target)) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target.drop_location(), splatter_dir) /obj/item/mecha_parts/mecha_equipment/drill/diamonddrill name = "diamond-tipped exosuit drill" desc = "Equipment for engineering and combat exosuits. This is an upgraded version of the drill that'll pierce the heavens!" icon_state = "mecha_diamond_drill" origin_tech = "materials=4;engineering=4" - equip_cooldown = 20 + equip_cooldown = 10 + drill_delay = 4 + drill_level = DRILL_HARDENED force = 15 @@ -111,35 +138,27 @@ desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals." icon_state = "mecha_analyzer" selectable = 0 - equip_cooldown = 30 - var/scanning = 0 + equip_cooldown = 15 + var/scanning_time = 0 -/obj/item/mecha_parts/mecha_equipment/mining_scanner/attach(obj/mecha/M) +/obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize(mapload) . = ..() - START_PROCESSING(SSobj, src) - M.occupant_sight_flags |= SEE_TURFS - if(M.occupant) - M.occupant.update_sight() + START_PROCESSING(SSfastprocess, src) -/obj/item/mecha_parts/mecha_equipment/mining_scanner/detach() - chassis.occupant_sight_flags &= ~SEE_TURFS - STOP_PROCESSING(SSobj, src) - if(chassis.occupant) - chassis.occupant.update_sight() +/obj/item/mecha_parts/mecha_equipment/mining_scanner/Destroy() + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/item/mecha_parts/mecha_equipment/mining_scanner/process() if(!loc) + STOP_PROCESSING(SSfastprocess, src) qdel(src) - if(scanning) - return - if(istype(loc,/obj/mecha/working)) + if(istype(loc, /obj/mecha/working) && scanning_time <= world.time) var/obj/mecha/working/mecha = loc if(!mecha.occupant) return - var/list/occupant = list() - occupant |= mecha.occupant - scanning = 1 - mineral_scan_pulse(occupant,get_turf(loc)) - spawn(equip_cooldown) - scanning = 0 + scanning_time = world.time + equip_cooldown + mineral_scan_pulse(get_turf(src)) + +#undef DRILL_BASIC +#undef DRILL_HARDENED \ No newline at end of file diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 185ce411d9a..b4ec817c4cc 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -509,18 +509,20 @@ return /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma - equip_cooldown = 20 + equip_cooldown = 10 name = "217-D Heavy Plasma Cutter" desc = "A device that shoots resonant plasma bursts at extreme velocity. The blasts are capable of crushing rock and demloishing solid obstacles." icon_state = "mecha_plasmacutter" item_state = "plasmacutter" + lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/guns_righthand.dmi' energy_drain = 30 origin_tech = "materials=3;plasmatech=4;engineering=3" projectile = /obj/item/projectile/plasma/adv/mech fire_sound = 'sound/weapons/laser.ogg' -/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/M as obj) +/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/can_attach(obj/mecha/M) if(istype(M, /obj/mecha/working)) if(M.equipment.len