-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathmining_tools.dm
177 lines (149 loc) · 6.45 KB
/
mining_tools.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
// 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 = 15
energy_drain = 10
force = 15
harmful = FALSE
/// Time in deciseconds it takes to drill
var/drill_delay = 7
/// Affects if it can bust through reinforced walls (DRILL_HARDENED)
var/drill_level = DRILL_BASIC
/obj/item/mecha_parts/mecha_equipment/drill/Initialize(mapload)
. = ..()
AddComponent(/datum/component/butchering, 50, 100)
/obj/item/mecha_parts/mecha_equipment/drill/action_checks(atom/target)
if(isspaceturf(target))
return FALSE
return ..()
/obj/item/mecha_parts/mecha_equipment/drill/action(atom/target)
if(isobj(target))
var/obj/target_obj = target
if(target_obj.resistance_flags & UNACIDABLE)
return
target.visible_message(span_warning("[chassis] starts to drill [target]."), \
span_userdanger("[chassis] starts to drill [target]..."), \
span_italics("You hear drilling."))
if(do_after_cooldown(target))
set_ready_state(FALSE)
log_message("Started drilling [target]", LOG_MECHA)
var/drilling = FALSE
while(do_after_mecha(target, drilling ? drill_delay : 0))
drilling = TRUE
if(isliving(target))
drill_mob(target, chassis.occupant)
playsound(src,'sound/weapons/drill.ogg',40,1)
else if(isturf(target))
var/turf/T = target
playsound(src,'sound/weapons/drill.ogg',40,1)
if(!T.drill_act(src)) // finished drilling
break
else if(target.uses_integrity)
target.take_damage(15, BRUTE, 0, FALSE, get_dir(chassis, target))
playsound(src,'sound/weapons/drill.ogg',40,1)
else
break
set_ready_state(TRUE)
/turf/proc/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
return
/turf/closed/wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
drill.log_message("Drilled through [src]", LOG_MECHA)
take_damage(100, BRUTE, MELEE, sound_effect=FALSE)
return uses_integrity // keep drilling until it can't anymore
/turf/closed/wall/r_wall/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
if(drill.drill_level < DRILL_HARDENED)
drill.occupant_message(span_danger("[src] is too durable to drill through."))
return
return ..()
/turf/closed/mineral/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
for(var/turf/closed/mineral/M in range(drill.chassis,1))
if(get_dir(drill.chassis,M)&drill.chassis.dir)
M.attempt_drill()
drill.log_message("Drilled through [src]", LOG_MECHA)
drill.move_ores()
/turf/open/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill)
for(var/turf/open/floor/plating/asteroid/M in range(1, drill.chassis))
if((get_dir(drill.chassis,M)&drill.chassis.dir) && !M.dug)
M.getDug()
drill.log_message("Drilled through [src]", LOG_MECHA)
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 && 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 as obj)
if(..())
if(istype(M, /obj/mecha/working) || istype(M, /obj/mecha/combat))
return 1
return 0
/obj/item/mecha_parts/mecha_equipment/drill/attach(obj/mecha/M)
..()
var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
butchering.butchering_enabled = TRUE
/obj/item/mecha_parts/mecha_equipment/drill/detach(atom/moveto)
..()
var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
butchering.butchering_enabled = FALSE
/obj/item/mecha_parts/mecha_equipment/drill/proc/drill_mob(mob/living/target, mob/living/user)
target.visible_message(span_danger("[chassis] is drilling [target] with [src]!"), \
span_userdanger("[chassis] is drilling you with [src]!"))
log_combat(user, target, "drilled", "[name]", "(COMBAT MODE: [user.combat_mode ? "ON" : "OFF"]) (DAMTYPE: [uppertext(damtype)])")
if(target.stat == DEAD && target.getBruteLoss() >= 200)
log_combat(user, target, "gibbed", name)
if(LAZYLEN(target.butcher_results) || LAZYLEN(target.guaranteed_butcher_results))
var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering)
butchering.Butcher(chassis, target)
else
target.gib()
else
//drill makes a hole
var/obj/item/bodypart/target_part = target.get_bodypart(ran_zone(BODY_ZONE_CHEST))
target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, target.run_armor_check(target_part, MELEE))
//blood splatters
var/splatter_dir = get_dir(chassis, target)
if(isalien(target))
new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target.drop_location(), splatter_dir)
else
var/splatter_color = null
if(iscarbon(target))
var/mob/living/carbon/carbon_target = target
splatter_color = carbon_target.dna.blood_type.color
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target.drop_location(), splatter_dir, splatter_color)
//organs go everywhere
if(target_part && prob(10 * drill_level))
target_part.dismember(BRUTE)
/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"
equip_cooldown = 10
drill_delay = 4
drill_level = DRILL_HARDENED
force = 15
/obj/item/mecha_parts/mecha_equipment/mining_scanner
name = "exosuit mining scanner"
desc = "Equipment for engineering and combat exosuits. It will automatically check surrounding rock for useful minerals."
icon_state = "mecha_analyzer"
selectable = 0
equip_cooldown = 15
active = FALSE // this one's handled manually
var/scanning_time = 0
/obj/item/mecha_parts/mecha_equipment/mining_scanner/Initialize(mapload)
. = ..()
START_PROCESSING(SSfastprocess, src)
/obj/item/mecha_parts/mecha_equipment/mining_scanner/process()
if(!loc)
STOP_PROCESSING(SSfastprocess, src)
qdel(src)
if(istype(loc, /obj/mecha/working) && scanning_time <= world.time)
var/obj/mecha/working/mecha = loc
if(!mecha.occupant)
return
scanning_time = world.time + equip_cooldown
mineral_scan_pulse(get_turf(src))
#undef DRILL_BASIC
#undef DRILL_HARDENED