Files
goonstation-2016/code/obj/spawner.dm
2016-03-06 20:52:14 +01:00

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()