-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathdeployable.dm
220 lines (181 loc) · 6.45 KB
/
deployable.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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#define SINGLE "single"
#define METAL 1
#define WOOD 2
#define SAND 3
//Barricades/cover
/obj/structure/barricade
name = "chest high wall"
desc = "Looks like this would make good cover."
anchored = TRUE
density = TRUE
max_integrity = 100
layer = ABOVE_WINDOW_LAYER // Barricades should probably be over windows especially if you can put them on windows
var/proj_pass_rate = 50 //How many projectiles will pass the cover. Lower means stronger cover
var/bar_material = METAL
/obj/structure/barricade/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
make_debris()
qdel(src)
/obj/structure/barricade/proc/make_debris()
return
/obj/structure/barricade/attackby(obj/item/I, mob/user, params)
if(I.tool_behaviour == TOOL_WELDER && !user.combat_mode && bar_material == METAL)
if(atom_integrity < max_integrity)
if(!I.tool_start_check(user, amount=0))
return
to_chat(user, span_notice("You begin repairing [src]..."))
if(I.use_tool(src, user, 40, volume=40))
update_integrity(clamp(atom_integrity + 20, 0, max_integrity))
else
return ..()
/obj/structure/barricade/CanAllowThrough(atom/movable/mover, turf/target)//So bullets will fly over and stuff.
. = ..()
if(locate(/obj/structure/barricade) in get_turf(mover))
return TRUE
else if(istype(mover, /obj/projectile))
if(!anchored)
return TRUE
var/obj/projectile/proj = mover
if(proj.firer && Adjacent(proj.firer))
return TRUE
if(prob(proj_pass_rate))
return TRUE
return FALSE
/////BARRICADE TYPES///////
/obj/structure/barricade/wooden
name = "wooden barricade"
desc = "This space is blocked off by a wooden barricade."
icon = 'icons/obj/structures.dmi'
icon_state = "woodenbarricade"
bar_material = WOOD
var/drop_amount = 3
/obj/structure/barricade/wooden/attackby(obj/item/I, mob/living/user)
if(istype(I,/obj/item/stack/sheet/mineral/wood))
var/obj/item/stack/sheet/mineral/wood/W = I
if(W.amount < 5)
to_chat(user, span_warning("You need at least five wooden planks to make a wall!"))
return
else
to_chat(user, span_notice("You start adding [I] to [src]..."))
if(do_after(user, 5 SECONDS, src))
W.use(5)
new /turf/closed/wall/mineral/wood/nonmetal(get_turf(src))
qdel(src)
return
else if(I.tool_behaviour == TOOL_CROWBAR && !user.combat_mode)
user.visible_message("[user.name] starts prying [src.name] apart.", \
span_notice("You start prying the barricade apart."))
if(I.use_tool(src, user, 190, volume=50))
to_chat(user, span_notice("You disassemble the barricade."))
new /obj/item/stack/sheet/mineral/wood(user.loc, 5)
qdel(src)
else
return ..()
/obj/structure/barricade/wooden/crude
name = "crude plank barricade"
desc = "This space is blocked off by a crude assortment of planks."
icon_state = "woodenbarricade-old"
drop_amount = 1
max_integrity = 50
proj_pass_rate = 65
/obj/structure/barricade/wooden/crude/attackby(obj/item/I, mob/living/user) // Make it so you cant turn crude planks into walls
if(I.tool_behaviour == TOOL_CROWBAR && !user.combat_mode)
user.visible_message("[user.name] starts prying [src.name] apart.", \
span_notice("You start prying the barricade apart."))
if(I.use_tool(src, user, 10 SECONDS, volume=50))
to_chat(user, span_notice("You disassemble the barricade."))
new /obj/item/stack/sheet/mineral/wood(user.loc, 5)
qdel(src)
return
return ..()
/obj/structure/barricade/wooden/crude/snow
desc = "This space is blocked off by a crude assortment of planks. It seems to be covered in a layer of snow."
icon_state = "woodenbarricade-snow-old"
max_integrity = 75
/obj/structure/barricade/wooden/make_debris()
new /obj/item/stack/sheet/mineral/wood(get_turf(src), drop_amount)
/obj/structure/barricade/sandbags
name = "sandbags"
desc = "Bags of sand. Self explanatory."
icon = 'icons/obj/smooth_structures/sandbags.dmi'
icon_state = "sandbags-0"
base_icon_state = "sandbags"
max_integrity = 280
proj_pass_rate = 20
pass_flags = LETPASSTHROW
bar_material = SAND
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_SANDBAGS
canSmoothWith = SMOOTH_GROUP_SANDBAGS + SMOOTH_GROUP_SECURITY_BARRICADE + SMOOTH_GROUP_WALLS
/obj/structure/barricade/sandbags/Initialize(mapload)
. = ..()
AddElement(/datum/element/climbable)
/obj/structure/barricade/security
name = "security barrier"
desc = "A deployable barrier. Provides good cover in fire fights."
icon = 'icons/obj/objects.dmi'
icon_state = "barrier0"
density = FALSE
anchored = FALSE
max_integrity = 180
proj_pass_rate = 20
armor = list(MELEE = 10, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 0)
var/deploy_time = 40
var/deploy_message = TRUE
/obj/structure/barricade/security/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src, PROC_REF(deploy)), deploy_time)
/obj/structure/barricade/security/proc/deploy()
icon_state = "barrier1"
density = TRUE
anchored = TRUE
if(deploy_message)
visible_message(span_warning("[src] deploys!"))
/obj/item/grenade/barrier
name = "barrier grenade"
desc = "Instant cover."
icon = 'icons/obj/grenade.dmi'
icon_state = "flashbang"
item_state = "flashbang"
actions_types = list(/datum/action/item_action/toggle_barrier_spread)
var/mode = SINGLE
/obj/item/grenade/barrier/examine(mob/user)
. = ..()
. += span_notice("Alt-click to toggle modes.")
/obj/item/grenade/barrier/AltClick(mob/living/carbon/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE))
return
toggle_mode(user)
/obj/item/grenade/barrier/proc/toggle_mode(mob/user)
switch(mode)
if(SINGLE)
mode = VERTICAL
if(VERTICAL)
mode = HORIZONTAL
if(HORIZONTAL)
mode = SINGLE
to_chat(user, "[src] is now in [mode] mode.")
/obj/item/grenade/barrier/prime()
new /obj/structure/barricade/security(get_turf(src.loc))
switch(mode)
if(VERTICAL)
var/turf/target_turf = get_step(src, NORTH)
if(!(target_turf.is_blocked_turf()))
new /obj/structure/barricade/security(target_turf)
var/turf/target_turf2 = get_step(src, SOUTH)
if(!(target_turf2.is_blocked_turf()))
new /obj/structure/barricade/security(target_turf2)
if(HORIZONTAL)
var/turf/target_turf = get_step(src, EAST)
if(!(target_turf.is_blocked_turf()))
new /obj/structure/barricade/security(target_turf)
var/turf/target_turf2 = get_step(src, WEST)
if(!(target_turf2.is_blocked_turf()))
new /obj/structure/barricade/security(target_turf2)
qdel(src)
/obj/item/grenade/barrier/ui_action_click(mob/user)
toggle_mode(user)
#undef SINGLE
#undef METAL
#undef WOOD
#undef SAND