mirror of
https://github.com/goonstation/goonstation-2016.git
synced 2026-03-20 08:22:37 +00:00
294 lines
6.5 KiB
Plaintext
294 lines
6.5 KiB
Plaintext
/obj/spawner
|
|
name = "object spawner"
|
|
|
|
/obj/spawner/bomb
|
|
name = "bomb"
|
|
icon = 'icons/mob/screen1.dmi'
|
|
icon_state = "x"
|
|
var/btype = 0 //0 = radio, 1= prox, 2=time
|
|
var/explosive = 1 // 0= firebomb
|
|
var/btemp = 1000 // bomb temperature (degC)
|
|
var/active = 0
|
|
|
|
/obj/spawner/bomb/radio
|
|
btype = 0
|
|
|
|
/obj/spawner/bomb/proximity
|
|
btype = 1
|
|
|
|
/obj/spawner/bomb/timer
|
|
btype = 2
|
|
|
|
/obj/spawner/bomb/timer/syndicate
|
|
btemp = 2000
|
|
|
|
//
|
|
/obj/spawner/newbomb
|
|
name = "bomb"
|
|
icon = 'icons/mob/screen1.dmi'
|
|
icon_state = "x"
|
|
var/btype = 0 // 0=radio, 1=prox, 2=time
|
|
var/btemp1 = 1500
|
|
var/btemp2 = 1000 // tank temperatures
|
|
|
|
timer
|
|
btype = 2
|
|
|
|
syndicate
|
|
btemp1 = 1700
|
|
btemp2 = 900
|
|
|
|
proximity
|
|
btype = 1
|
|
|
|
radio
|
|
btype = 0
|
|
|
|
/obj/spawner/bomb/New()
|
|
..()
|
|
|
|
switch (src.btype)
|
|
// radio
|
|
if (0)
|
|
var/obj/item/assembly/radio_bomb/R = new /obj/item/assembly/radio_bomb(src.loc)
|
|
var/obj/item/tank/plasma/p3 = new /obj/item/tank/plasma(R)
|
|
var/obj/item/device/radio/signaler/p1 = new /obj/item/device/radio/signaler(R)
|
|
var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
|
|
R.part1 = p1
|
|
R.part2 = p2
|
|
R.part3 = p3
|
|
p1.master = R
|
|
p2.master = R
|
|
p3.master = R
|
|
R.status = explosive
|
|
p1.b_stat = 0
|
|
p2.status = 1
|
|
p3.air_contents.temperature = btemp + T0C
|
|
|
|
// proximity
|
|
if (1)
|
|
var/obj/item/assembly/proximity_bomb/R = new /obj/item/assembly/proximity_bomb(src.loc)
|
|
var/obj/item/tank/plasma/p3 = new /obj/item/tank/plasma(R)
|
|
var/obj/item/device/prox_sensor/p1 = new /obj/item/device/prox_sensor(R)
|
|
var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
|
|
R.part1 = p1
|
|
R.part2 = p2
|
|
R.part3 = p3
|
|
p1.master = R
|
|
p2.master = R
|
|
p3.master = R
|
|
R.status = explosive
|
|
|
|
p3.air_contents.temperature = btemp + T0C
|
|
p2.status = 1
|
|
|
|
if(src.active)
|
|
R.part1.armed = 1
|
|
R.part1.icon_state = text("motion[]", 1)
|
|
R.c_state(1, src)
|
|
|
|
// timer
|
|
if (2)
|
|
var/obj/item/assembly/time_bomb/R = new /obj/item/assembly/time_bomb(src.loc)
|
|
var/obj/item/tank/plasma/p3 = new /obj/item/tank/plasma(R)
|
|
var/obj/item/device/timer/p1 = new /obj/item/device/timer(R)
|
|
var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
|
|
R.part1 = p1
|
|
R.part2 = p2
|
|
R.part3 = p3
|
|
p1.master = R
|
|
p2.master = R
|
|
p3.master = R
|
|
R.status = explosive
|
|
|
|
p3.air_contents.temperature = btemp + T0C
|
|
p2.status = 1
|
|
|
|
qdel(src)
|
|
|
|
/obj/spawner/newbomb/New()
|
|
..()
|
|
|
|
switch (src.btype)
|
|
// radio
|
|
if (0)
|
|
|
|
var/obj/item/device/transfer_valve/V = new(src.loc)
|
|
var/obj/item/tank/plasma/PT = new(V)
|
|
var/obj/item/tank/oxygen/OT = new(V)
|
|
|
|
var/obj/item/device/radio/signaler/S = new(V)
|
|
|
|
V.tank_one = PT
|
|
V.tank_two = OT
|
|
V.attached_device = S
|
|
|
|
S.master = V
|
|
PT.master = V
|
|
OT.master = V
|
|
|
|
S.b_stat = 0
|
|
|
|
PT.air_contents.temperature = btemp1 + T0C
|
|
OT.air_contents.temperature = btemp2 + T0C
|
|
|
|
V.update_icon()
|
|
|
|
// proximity
|
|
if (1)
|
|
|
|
var/obj/item/device/transfer_valve/V = new(src.loc)
|
|
var/obj/item/tank/plasma/PT = new(V)
|
|
var/obj/item/tank/oxygen/OT = new(V)
|
|
|
|
var/obj/item/device/prox_sensor/P = new(V)
|
|
|
|
V.tank_one = PT
|
|
V.tank_two = OT
|
|
V.attached_device = P
|
|
|
|
P.master = V
|
|
PT.master = V
|
|
OT.master = V
|
|
|
|
|
|
PT.air_contents.temperature = btemp1 + T0C
|
|
OT.air_contents.temperature = btemp2 + T0C
|
|
|
|
V.update_icon()
|
|
|
|
|
|
// timer
|
|
if (2)
|
|
var/obj/item/device/transfer_valve/V = new(src.loc)
|
|
var/obj/item/tank/plasma/PT = new(V)
|
|
var/obj/item/tank/oxygen/OT = new(V)
|
|
|
|
var/obj/item/device/timer/T = new(V)
|
|
|
|
V.tank_one = PT
|
|
V.tank_two = OT
|
|
V.attached_device = T
|
|
|
|
T.master = V
|
|
PT.master = V
|
|
OT.master = V
|
|
T.time = 30
|
|
|
|
PT.air_contents.temperature = btemp1 + T0C
|
|
OT.air_contents.temperature = btemp2 + T0C
|
|
|
|
V.update_icon()
|
|
qdel(src)
|
|
|
|
|
|
/obj/spawner/briefcasebomb/New()
|
|
..()
|
|
|
|
var/obj/item/device/transfer_valve/briefcase/V = new(src.loc)
|
|
var/obj/item/tank/plasma/PT = new(V)
|
|
var/obj/item/tank/oxygen/OT = new(V)
|
|
|
|
var/obj/item/device/timer/T = new(V)
|
|
|
|
V.tank_one = PT
|
|
V.tank_two = OT
|
|
V.attached_device = T
|
|
|
|
T.master = V
|
|
PT.master = V
|
|
OT.master = V
|
|
T.time = 30
|
|
|
|
PT.air_contents.temperature = 170 + T0C
|
|
OT.air_contents.temperature = 20 + T0C
|
|
|
|
qdel(src)
|
|
|
|
/obj/bomberman
|
|
name = "large cartoon bomb"
|
|
desc = "It looks like it's gonna blow."
|
|
icon = 'icons/obj/weapons.dmi'
|
|
icon_state = "dumb_bomb"
|
|
density = 1
|
|
var/exploding = 0
|
|
|
|
New()
|
|
..()
|
|
if(!isturf(src.loc))
|
|
dispose()
|
|
return
|
|
spawn(20)
|
|
explode()
|
|
|
|
Bumped(atom/A)
|
|
if(ismob(A))
|
|
walk(src, get_dir(A, src), 1)
|
|
|
|
Bump(atom/O)
|
|
walk(src, 0)
|
|
|
|
ex_act(severity)
|
|
if(exploding)
|
|
return
|
|
explode()
|
|
|
|
proc/explode()
|
|
exploding = 1
|
|
|
|
if(!isturf(src.loc))
|
|
dispose()
|
|
return
|
|
src.icon = null
|
|
src.anchored = 1
|
|
src.density = 0
|
|
var/list/atom/movable/overlay/boom = list()
|
|
var/list/atom/movable/overlay/boom_tips = list()
|
|
var/list/obj/affected_objs = list()
|
|
var/list/mob/affected_mobs = list()
|
|
var/atom/movable/overlay/animation = new /atom/movable/overlay( src.loc )
|
|
animation.icon_state = "nothing"
|
|
animation.icon = 'icons/effects/effects.dmi'
|
|
for(var/turf/T in oview(3, src))
|
|
if((T.x != src.x && T.y != src.y) || T.density)
|
|
continue
|
|
var/dist = get_dist(src.loc, T)
|
|
var/rel_dir = get_dir(src.loc, T)
|
|
if(dist <= 3)
|
|
for(var/atom/A in T)
|
|
if(istype(A, /mob/living))
|
|
affected_mobs.Add(A)
|
|
if(istype(A, /obj/window) || istype(A, /obj/grille))
|
|
affected_objs.Add(A)
|
|
if(istype(A, /obj/blob))
|
|
affected_objs.Add(A)
|
|
// TODO: Handle more object types?
|
|
if(T.x == src.x && T.y == src.y)
|
|
continue
|
|
var/atom/movable/overlay/A = new /atom/movable/overlay( T )
|
|
A.icon_state = "nothing"
|
|
A.icon = 'icons/effects/effects.dmi'
|
|
A.dir = rel_dir
|
|
|
|
if(dist == 3)
|
|
boom_tips.Add(A)
|
|
else
|
|
boom.Add(A)
|
|
|
|
flick("boom_center", animation)
|
|
for(var/atom/movable/overlay/A in boom)
|
|
flick("boom_segment", A)
|
|
for(var/atom/movable/overlay/A in boom_tips)
|
|
flick("boom_tip", A)
|
|
for(var/mob/M in affected_mobs)
|
|
M.ex_act(3)
|
|
for(var/obj/O in affected_objs)
|
|
// drsingh for Cannot execute null.ex act()
|
|
if (!isnull(O)) O.ex_act(rand(1,2))
|
|
playsound(src.loc, "explosion", 100, 1)
|
|
playsound(src.loc, "sound/effects/explosionfar.ogg", 100, 1, 14)
|
|
sleep(10)
|
|
animation.dispose()
|
|
for(var/atom/movable/overlay/A in (boom + boom_tips))
|
|
A.dispose()
|
|
src.dispose() |