diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index a0b792eb5d..b623cee845 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -90,19 +90,6 @@
var/def_zone
pass_flags = PASSTABLE
-/obj/beam/i_beam
- name = "i beam"
- icon = 'projectiles.dmi'
- icon_state = "ibeam"
- var/obj/beam/i_beam/next = null
- var/obj/item/device/infra/master = null
- var/limit = null
- var/visible = 0.0
- var/left = null
- anchored = 1.0
- flags = TABLEPASS
-
-
/obj/bedsheetbin
name = "linen bin"
desc = "A bin for containing bedsheets. It looks rather cosy."
@@ -324,22 +311,12 @@
flags = FPRINT | TABLEPASS
pass_flags = PASSTABLE
pressure_resistance = 50
+// causeerrorheresoifixthis
var/obj/item/master = null
/obj/item/device
icon = 'device.dmi'
-/obj/item/device/detective_scanner
- name = "Scanner"
- desc = "Used to scan objects for DNA and fingerprints."
- icon_state = "forensic0"
- var/amount = 20.0
- var/printing = 0.0
- w_class = 3.0
- item_state = "electronic"
- flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
-
-
/obj/item/device/flash
name = "flash"
desc = "Used for blinding and being an asshole."
@@ -379,59 +356,6 @@
icon_off = "plight0"
brightness_on = 3
-/obj/item/device/analyzer
- desc = "A hand-held environmental scanner which reports current gas levels."
- name = "analyzer"
- icon_state = "atmos"
- item_state = "analyzer"
- w_class = 2.0
- flags = FPRINT | TABLEPASS| CONDUCT | ONBELT
- throwforce = 5
- throw_speed = 4
- throw_range = 20
- m_amt = 30
- g_amt = 20
- origin_tech = "magnets=1;engineering=1"
-
-/obj/item/device/healthanalyzer
- name = "Health Analyzer"
- icon_state = "health"
- item_state = "analyzer"
- desc = "A hand-held body scanner able to distinguish vital signs of the subject."
- flags = FPRINT | ONBELT | TABLEPASS | CONDUCT
- throwforce = 3
- w_class = 1.0
- throw_speed = 5
- throw_range = 10
- m_amt = 200
- origin_tech = "magnets=1;biotech=1"
-
-/obj/item/device/igniter
- name = "igniter"
- desc = "A small electronic device able to ignite combustable substances. Does not function well as a lighter."
- icon_state = "igniter"
- var/status = 1.0
- flags = FPRINT | TABLEPASS| CONDUCT
- item_state = "electronic"
- m_amt = 100
- throwforce = 5
- w_class = 1.0
- throw_speed = 3
- throw_range = 10
-
-/obj/item/device/infra
- name = "Infrared Beam (Security)"
- desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
- icon_state = "infrared0"
- var/obj/beam/i_beam/first = null
- var/state = 0.0
- var/visible = 0.0
- flags = FPRINT | TABLEPASS| CONDUCT
- w_class = 2.0
- item_state = "electronic"
- m_amt = 150
- origin_tech = "magnets=2"
-
/obj/item/device/infra_sensor
name = "Infrared Sensor"
desc = "Scans for infrared beams in the vicinity."
@@ -442,18 +366,6 @@
m_amt = 150
origin_tech = "magnets=2"
-/obj/item/device/t_scanner
- name = "T-ray scanner"
- desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
- icon_state = "t-ray0"
- var/on = 0
- flags = FPRINT|ONBELT|TABLEPASS
- w_class = 2
- item_state = "electronic"
- m_amt = 150
- origin_tech = "magnets=1;engineering=1"
-
-
/obj/item/device/multitool
name = "multitool"
desc = "Used for pulsing wires to test which to cut. Not recommended by doctors."
@@ -469,21 +381,6 @@
g_amt = 20
origin_tech = "magnets=1;engineering=1"
-
-/obj/item/device/prox_sensor
- name = "Proximity Sensor"
- desc = "Used for scanning and alerting when someone enters a certain proximity."
- icon_state = "motion0"
- var/state = 0.0
- var/timing = 0.0
- var/time = null
- flags = FPRINT | TABLEPASS| CONDUCT
- w_class = 2.0
- item_state = "electronic"
- m_amt = 300
- origin_tech = "magnets=1"
-
-
/obj/item/device/shield
name = "shield"
desc = "This is an item which is specially crafted to shield you. It is much like a visible version of the outdated cloaking device."
@@ -496,17 +393,6 @@
throw_range = 5
w_class = 2.0
-/obj/item/device/timer
- name = "timer"
- desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
- icon_state = "timer0"
- item_state = "electronic"
- var/timing = 0.0
- var/time = null
- flags = FPRINT | TABLEPASS| CONDUCT
- w_class = 2.0
- m_amt = 100
-
/obj/item/blueprints
name = "station blueprints"
desc = "Blueprints of the station. There's stamp \"Classified\" and several coffee stains on it."
diff --git a/code/defines/obj/assemblies.dm b/code/defines/obj/assemblies.dm
deleted file mode 100644
index 9e1f3ab0e1..0000000000
--- a/code/defines/obj/assemblies.dm
+++ /dev/null
@@ -1,154 +0,0 @@
-/obj/item/assembly
- name = "assembly"
- icon = 'assemblies.dmi'
- item_state = "assembly"
- var/status = 0.0
- throwforce = 10
- w_class = 3.0
- throw_speed = 4
- throw_range = 10
-
-/obj/item/assembly/a_i_a
- name = "Health-Analyzer/Igniter/Armor Assembly"
- desc = "A health-analyzer, igniter and armor assembly."
- icon_state = "armor-igniter-analyzer"
- var/obj/item/device/healthanalyzer/part1 = null
- var/obj/item/device/igniter/part2 = null
- var/obj/item/clothing/suit/armor/vest/part3 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/m_i_ptank
- desc = "A very intricate igniter and proximity sensor electrical assembly mounted onto top of a plasma tank."
- name = "Proximity/Igniter/Plasma Tank Assembly"
- icon_state = "prox-igniter-tank0"
- var/obj/item/device/prox_sensor/part1 = null
- var/obj/item/device/igniter/part2 = null
- var/obj/item/weapon/tank/plasma/part3 = null
- status = 0.0
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/prox_ignite
- name = "Proximity/Igniter Assembly"
- desc = "A proximity-activated igniter assembly."
- icon_state = "prox-igniter0"
- var/obj/item/device/prox_sensor/part1 = null
- var/obj/item/device/igniter/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/r_i_ptank
- desc = "A very intricate igniter and signaller electrical assembly mounted onto top of a plasma tank."
- name = "Radio/Igniter/Plasma Tank Assembly"
- icon_state = "radio-igniter-tank"
- var/obj/item/device/radio/signaler/part1 = null
- var/obj/item/device/igniter/part2 = null
- var/obj/item/weapon/tank/plasma/part3 = null
- status = 0.0
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/anal_ignite
- name = "Health-Analyzer/Igniter Assembly"
- desc = "A health-analyzer igniter assembly."
- icon_state = "timer-igniter0"
- var/obj/item/device/healthanalyzer/part1 = null
- var/obj/item/device/igniter/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
- item_state = "electronic"
-
-/obj/item/assembly/time_ignite
- name = "Timer/Igniter Assembly"
- desc = "A timer-activated igniter assembly."
- icon_state = "timer-igniter0"
- var/obj/item/device/timer/part1 = null
- var/obj/item/device/igniter/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/t_i_ptank
- desc = "A very intricate igniter and timer assembly mounted onto top of a plasma tank."
- name = "Timer/Igniter/Plasma Tank Assembly"
- icon_state = "timer-igniter-tank0"
- var/obj/item/device/timer/part1 = null
- var/obj/item/device/igniter/part2 = null
- var/obj/item/weapon/tank/plasma/part3 = null
- status = 0.0
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/rad_ignite
- name = "Radio/Igniter Assembly"
- desc = "A radio-activated igniter assembly."
- icon_state = "radio-igniter"
- var/obj/item/device/radio/signaler/part1 = null
- var/obj/item/device/igniter/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/rad_infra
- name = "Signaller/Infrared Assembly"
- desc = "An infrared-activated radio signaller"
- icon_state = "infrared-radio0"
- var/obj/item/device/radio/signaler/part1 = null
- var/obj/item/device/infra/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/rad_prox
- name = "Signaller/Prox Sensor Assembly"
- desc = "A proximity-activated radio signaller."
- icon_state = "prox-radio0"
- var/obj/item/device/radio/signaler/part1 = null
- var/obj/item/device/prox_sensor/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/rad_time
- name = "Signaller/Timer Assembly"
- desc = "A radio signaller activated by a count-down timer."
- icon_state = "timer-radio0"
- var/obj/item/device/radio/signaler/part1 = null
- var/obj/item/device/timer/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/shock_kit
- name = "Shock Kit"
- desc = "This appears to be made from both an Electric Pack and a Helmet."
- icon_state = "shock_kit"
- var/obj/item/clothing/head/helmet/part1 = null
- var/obj/item/device/radio/electropack/part2 = null
- status = 0.0
- w_class = 5.0
- flags = FPRINT | TABLEPASS| CONDUCT
-
-/obj/item/assembly/weld_rod
- desc = "A welding torch with metal rods attached to the flame tip."
- name = "Welder/Rods Assembly"
- icon_state = "welder-rods"
- item_state = "welder"
- var/obj/item/weapon/weldingtool/part1 = null
- var/obj/item/stack/rods/part2 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
- force = 3.0
- throwforce = 5.0
- throw_speed = 1
- throw_range = 5
- w_class = 2.0
-
-/obj/item/assembly/w_r_ignite
- desc = "A welding torch and igniter connected by metal rods."
- name = "Welder/Rods/Igniter Assembly"
- icon_state = "welder-rods-igniter"
- item_state = "welder"
- var/obj/item/weapon/weldingtool/part1 = null
- var/obj/item/stack/rods/part2 = null
- var/obj/item/device/igniter/part3 = null
- status = null
- flags = FPRINT | TABLEPASS| CONDUCT
- force = 3.0
- throwforce = 5.0
- throw_speed = 1
- throw_range = 5
- w_class = 2.0
\ No newline at end of file
diff --git a/code/defines/obj/radio.dm b/code/defines/obj/radio.dm
index b1c335638b..9560c8af9d 100644
--- a/code/defines/obj/radio.dm
+++ b/code/defines/obj/radio.dm
@@ -44,29 +44,6 @@
item_state = "signaler"
var/code = "electronic"
-/obj/item/device/radio/electropack
- name = "Electropack"
- desc = "Dance my monkeys! DANCE!!!"
- icon_state = "electropack0"
- var/code = 2
- var/on = 0
- var/e_pads = 0.0
- frequency = 1449
- w_class = 5.0
- flags = 323
- item_state = "electropack"
-
-/obj/item/device/radio/signaler
- name = "Remote Signaling Device"
- desc = "Used to remotely activate devices."
- icon_state = "signaller"
- item_state = "signaler"
- var/code = 30
- w_class = 1
- frequency = 1457
- var/delay = 0
- var/airlock_wire = null
-
/obj/item/device/radio/intercom
name = "Station Intercom (Radio)"
desc = "Talk through this."
diff --git a/code/defines/obj/spawner/bomb.dm b/code/defines/obj/spawner/bomb.dm
deleted file mode 100644
index 4715f7671e..0000000000
--- a/code/defines/obj/spawner/bomb.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/obj/spawner/bomb
- name = "bomb"
- icon = 'screen1.dmi'
- icon_state = "x"
- var/btype = 0 //0 = radio, 1= prox, 2=time
- var/explosive = 1 // 0= firebomb
- var/btemp = 500 // 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 = 450
-
-/obj/spawner/bomb/suicide
- btype = 3
-
-/obj/spawner/newbomb
- name = "bomb"
- icon = '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 = 150
- btemp2 = 20
-
- proximity
- btype = 1
-
- radio
- btype = 0
\ No newline at end of file
diff --git a/code/game/gamemodes/wizard/spells.dm b/code/game/gamemodes/wizard/spells.dm
index 7cb277452b..c3b16b19cb 100644
--- a/code/game/gamemodes/wizard/spells.dm
+++ b/code/game/gamemodes/wizard/spells.dm
@@ -238,7 +238,7 @@
//DISABLE TECH
-/mob/proc/tech()//Shouldnt this just use the emp() proc?
+/mob/proc/tech()
set category = "Spells"
set name = "Disable Technology"
set desc = "This spell disables all weapons, cameras and most other technology in range."
@@ -252,179 +252,8 @@
usr.say("NEC CANTIO")
usr.spellvoice()
-
- var/turf/myturf = get_turf(usr)
-
- var/obj/overlay/pulse = new/obj/overlay ( myturf )
- pulse.icon = 'effects.dmi'
- pulse.icon_state = "emppulse"
- pulse.name = "emp pulse"
- pulse.anchored = 1
- spawn(20)
- del(pulse)
-
- for(var/obj/item/weapon/W in range(world.view-1, myturf))
-
- if (istype(W, /obj/item/assembly/m_i_ptank) || istype(W, /obj/item/assembly/r_i_ptank) || istype(W, /obj/item/assembly/t_i_ptank))
-
- var/fuckthis
- if(istype(W:part1,/obj/item/weapon/tank/plasma))
- fuckthis = W:part1
- fuckthis:ignite()
- if(istype(W:part2,/obj/item/weapon/tank/plasma))
- fuckthis = W:part2
- fuckthis:ignite()
- if(istype(W:part3,/obj/item/weapon/tank/plasma))
- fuckthis = W:part3
- fuckthis:ignite()
-
-
- for(var/mob/living/M in viewers(world.view-1, myturf))
-
- if(M == usr) continue
-
- if (istype(M, /mob/living/silicon))
- M.take_overall_damage(0,25)
- flick("noise", M:flash)
- M << "\red *BZZZT*"
- M << "\red Warning: Electromagnetic pulse detected."
- if(istype(M, /mob/living/silicon/ai))
- if (prob(30))
- switch(pick(1,2))
- if(1)
- M:cancel_camera()
- if(2)
- M:ai_call_shuttle()
- continue
-
-
- M << "\red Your equipment malfunctions." //Yeah, i realise that this WILL
- //show if theyre not carrying anything
- //that is affected. lazy.
- if (locate(/obj/item/weapon/cloaking_device, M))
- for(var/obj/item/weapon/cloaking_device/S in M)
- S.active = 0
- S.icon_state = "shield0"
-
- if (locate(/obj/item/weapon/gun/energy, M))
- for(var/obj/item/weapon/gun/energy/G in M)
- G.power_supply.charge = 0
- G.update_icon()
-
- if ((istype(M, /mob/living/carbon/human)) && (istype(M:glasses, /obj/item/clothing/glasses/thermal)))
- M << "\red Your thermals malfunction."
- M.eye_blind = 3
- M.eye_blurry = 5
- M.disabilities |= 1
- spawn(100)
- M.disabilities &= ~1
-
- if (locate(/obj/item/device/radio, M))
- for(var/obj/item/device/radio/R in M) //Add something for the intercoms.
- R.broadcasting = 0
- R.listening = 0
-
- if (locate(/obj/item/device/flash, M))
- for(var/obj/item/device/flash/F in M) //Add something for the intercoms.
- F.attack_self()
-
- if (locate(/obj/item/weapon/melee/baton, M))
- for(var/obj/item/weapon/melee/baton/B in M) //Add something for the intercoms.
- B.charges = 0
-
- if(locate(/obj/item/clothing/under/chameleon, M))
- for(var/obj/item/clothing/under/chameleon/C in M) //Add something for the intercoms.
- M << "\red Your jumpsuit malfunctions"
- C.name = "psychedelic"
- C.desc = "Groovy!"
- C.icon_state = "psyche"
- C.color = "psyche"
- spawn(200)
- C.name = "Black Jumpsuit"
- C.icon_state = "bl_suit"
- C.color = "black"
- C.desc = null
-
- M << "\red BZZZT"
-
-
- for(var/obj/machinery/A in range(world.view-1, myturf))
- A.use_power(7500)
-
- var/obj/overlay/pulse2 = new/obj/overlay ( A.loc )
- pulse2.icon = 'effects.dmi'
- pulse2.icon_state = "empdisable"
- pulse2.name = "emp sparks"
- pulse2.anchored = 1
- pulse2.dir = pick(cardinal)
-
- spawn(10)
- del(pulse2)
-
- if(istype(A, /obj/machinery/turret))
- A:enabled = 0
- A:lasers = 0
- A:power_change()
-
- if(istype(A, /obj/machinery/computer) && prob(20))
- A:set_broken()
-
- if(istype(A, /obj/machinery/firealarm) && prob(50))
- A:alarm()
-
- if(istype(A, /obj/machinery/power/smes))
- A:online = 0
- A:charging = 0
- A:output = 0
- A:charge -= 1e6
- if (A:charge < 0)
- A:charge = 0
- spawn(100)
- A:output = initial(A:output)
- A:charging = initial(A:charging)
- A:online = initial(A:online)
-
- if(istype(A, /obj/machinery/door))
- if(prob(20) && (istype(A,/obj/machinery/door/airlock) || istype(A,/obj/machinery/door/window)) )
- A:open()
- if(A:secondsElectrified != 0) continue
- A:secondsElectrified = -1
- spawn(300)
- A:secondsElectrified = 0
-
- if(istype(A, /obj/machinery/power/apc))
- if(A:cell)
- A:cell:charge -= 1000
- if (A:cell:charge < 0)
- A:cell:charge = 0
- A:lighting = 0
- A:equipment = 0
- A:environ = 0
- spawn(600)
- A:equipment = 3
- A:environ = 3
-
- if(istype(A, /obj/machinery/camera))
- A.icon_state = "cameraemp"
- A:network = null //Not the best way but it will do. I think.
- spawn(600)
- A:network = initial(A:network)
- A:icon_state = initial(A:icon_state)
- for(var/mob/living/silicon/ai/O in world)
- if (O.current == A)
- O.cancel_camera()
- O << "Your connection to the camera has been lost."
- for(var/mob/O in world)
- if (istype(O.machine, /obj/machinery/computer/security))
- var/obj/machinery/computer/security/S = O.machine
- if (S.current == A)
- O.machine = null
- S.current = null
- O.reset_view(null)
- O << "The screen bursts into static."
-
- if(istype(A, /obj/machinery/clonepod))
- A:malfunction()
+ empulse(src, 6, 10, nolog=1)
+ return
//BLINK
diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm
index 1bb856cbfa..1ab8e5e178 100644
--- a/code/game/jobs/jobs.dm
+++ b/code/game/jobs/jobs.dm
@@ -364,4 +364,4 @@ var/list/nonhuman_positions = list(
)
/proc/is_important_job(var/job)
- return (job in head_positions) || (job in list("AI", "Cyborg", "Warden", "Detective"))
+ return (job in head_positions) || (job in list("AI", "Cyborg", "Warden", "Detective", "pAI"))//pAI is in here to prevent guest pAI's as they can easily ruin rounds
diff --git a/code/game/objects/bomb.dm b/code/game/objects/bombspawner.dm
similarity index 75%
rename from code/game/objects/bomb.dm
rename to code/game/objects/bombspawner.dm
index 727812b463..f42be47575 100644
--- a/code/game/objects/bomb.dm
+++ b/code/game/objects/bombspawner.dm
@@ -1,3 +1,28 @@
+/* The old single tank bombs that dont really work anymore
+/obj/spawner/bomb
+ name = "bomb"
+ icon = 'screen1.dmi'
+ icon_state = "x"
+ var/btype = 0 //0 = radio, 1= prox, 2=time
+ var/explosive = 1 // 0= firebomb
+ var/btemp = 500 // 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 = 450
+
+/obj/spawner/bomb/suicide
+ btype = 3
+
/obj/spawner/bomb/New()
..()
@@ -16,7 +41,7 @@
p3.master = R
R.status = explosive
p1.b_stat = 0
- p2.status = 1
+ p2.secured = 1
p3.air_contents.temperature = btemp + T0C
// proximity
@@ -34,10 +59,10 @@
R.status = explosive
p3.air_contents.temperature = btemp + T0C
- p2.status = 1
+ p2.secured = 1
if(src.active)
- R.part1.state = 1
+ R.part1.secured = 1
R.part1.icon_state = text("motion[]", 1)
R.c_state(1, src)
@@ -56,7 +81,7 @@
R.status = explosive
p3.air_contents.temperature = btemp + T0C
- p2.status = 1
+ p2.secured = 1
//bombvest
if(3)
var/obj/item/clothing/suit/armor/a_i_a_ptank/R = new /obj/item/clothing/suit/armor/a_i_a_ptank(src.loc)
@@ -75,9 +100,31 @@
R.status = explosive
p4.air_contents.temperature = btemp + T0C
- p2.status = 1
+ p2.secured = 1
del(src)
+*/
+
+/obj/spawner/newbomb
+ name = "bomb"
+ icon = '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 = 150
+ btemp2 = 20
+
+ proximity
+ btype = 1
+
+ radio
+ btype = 0
/obj/spawner/newbomb/New()
@@ -97,7 +144,8 @@
V.tank_two = OT
V.attached_device = S
- S.master = V
+ S.holder = V
+ S.Secure()
PT.master = V
OT.master = V
@@ -121,7 +169,8 @@
V.tank_two = OT
V.attached_device = P
- P.master = V
+ P.holder = V
+ P.Secure()
PT.master = V
OT.master = V
@@ -144,7 +193,8 @@
V.tank_two = OT
V.attached_device = T
- T.master = V
+ T.holder = V
+ T.Secure()
PT.master = V
OT.master = V
T.time = 30
diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm
index 1e49c04339..bf948a919e 100644
--- a/code/game/objects/devices/PDA/cart.dm
+++ b/code/game/objects/devices/PDA/cart.dm
@@ -585,9 +585,6 @@ Code:
active3 = S
if("Send Signal")
- for(var/obj/item/assembly/r_i_ptank/R in world) //Bomblist stuff
- if((R.part1.code == src/radio:code) && (R.part1.frequency == radio:frequency))
- bombers += "[key_name(usr)] has activated a radio bomb (Freq: [format_frequency(radio:frequency)], Code: [radio:code]). Temp = [R.part3.air_contents.temperature-T0C]."
spawn( 0 )
radio:send_signal("ACTIVATE")
return
diff --git a/code/game/objects/devices/igniter.dm b/code/game/objects/devices/igniter.dm
deleted file mode 100644
index 77bf290a8e..0000000000
--- a/code/game/objects/devices/igniter.dm
+++ /dev/null
@@ -1,149 +0,0 @@
-
-/obj/item/device/igniter/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/device/radio/signaler) && !( src.status )))
- var/obj/item/device/radio/signaler/S = W
- if (!( S.b_stat ))
- return
- var/obj/item/assembly/rad_ignite/R = new /obj/item/assembly/rad_ignite( user )
- S.loc = R
- R.part1 = S
- S.layer = initial(S.layer)
- if (user.client)
- user.client.screen -= S
- if (user.r_hand == S)
- user.u_equip(S)
- user.r_hand = R
- else
- user.u_equip(S)
- user.l_hand = R
- S.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- src.add_fingerprint(user)
-
- else if ((istype(W, /obj/item/device/prox_sensor) && !( src.status )))
-
- var/obj/item/assembly/prox_ignite/R = new /obj/item/assembly/prox_ignite( user )
- W.loc = R
- R.part1 = W
- W.layer = initial(W.layer)
- if (user.client)
- user.client.screen -= W
- if (user.r_hand == W)
- user.u_equip(W)
- user.r_hand = R
- else
- user.u_equip(W)
- user.l_hand = R
- W.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- src.add_fingerprint(user)
-
- else if ((istype(W, /obj/item/device/timer) && !( src.status )))
-
- var/obj/item/assembly/time_ignite/R = new /obj/item/assembly/time_ignite( user )
- W.loc = R
- R.part1 = W
- W.layer = initial(W.layer)
- if (user.client)
- user.client.screen -= W
- if (user.r_hand == W)
- user.u_equip(W)
- user.r_hand = R
- else
- user.u_equip(W)
- user.l_hand = R
- W.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- src.add_fingerprint(user)
- else if ((istype(W, /obj/item/device/healthanalyzer) && !( src.status )))
-
- var/obj/item/assembly/anal_ignite/R = new /obj/item/assembly/anal_ignite( user ) // Hehehe anal
- W.loc = R
- R.part1 = W
- W.layer = initial(W.layer)
- if (user.client)
- user.client.screen -= W
- if (user.r_hand == W)
- user.u_equip(W)
- user.r_hand = R
- else
- user.u_equip(W)
- user.l_hand = R
- W.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- src.add_fingerprint(user)
-
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The igniter is ready!")
- else
- user.show_message("\blue The igniter can now be attached!")
- src.add_fingerprint(user)
- return
-
-/obj/item/device/igniter/attack_self(mob/user as mob)
-
- src.add_fingerprint(user)
- spawn( 5 )
- ignite()
- return
- return
-
-/obj/item/device/igniter/proc/ignite()
- if (src.status)
- var/turf/location = src.loc
-
- if (src.master)
- location = src.master.loc
-
- location = get_turf(location)
- if(location)
- location.hotspot_expose(1000,1000)
-
- return
-
-/obj/item/device/igniter/examine()
- set src in view()
-
- ..()
- if ((in_range(src, usr) || src.loc == usr))
- if (src.status)
- usr.show_message("The igniter is ready!")
- else
- usr.show_message("The igniter can be attached!")
- return
diff --git a/code/game/objects/devices/infra_sensor.dm b/code/game/objects/devices/infra_sensor.dm
index a01650b1b9..249552799c 100644
--- a/code/game/objects/devices/infra_sensor.dm
+++ b/code/game/objects/devices/infra_sensor.dm
@@ -10,8 +10,8 @@
/obj/item/device/infra_sensor/proc/burst()
for(var/obj/beam/i_beam/I in range(src.loc))
- I.left = 10
- for(var/obj/item/device/infra/I in range(src.loc))
+ I.left = 8
+/* for(var/obj/item/device/infra/I in range(src.loc))ugh will have to fix this
I.visible = 1
spawn( 0 )
if ((I && I.first))
@@ -22,7 +22,7 @@
spawn( 0 )
if ((I.part2 && I.part2.first))
I.part2.first.vis_spread(1)
- return
+ return*/
return
/obj/item/device/infra_sensor/attack_self(mob/user as mob)
@@ -67,148 +67,4 @@
return
return
-/obj/item/device/infra/proc/hit()
- if (src.master)
- spawn()
- var/datum/signal/signal = new
- signal.data["message"] = "ACTIVATE"
- src.master.receive_signal(signal)
- del(signal)
- return
- else
- for(var/mob/O in hearers(null, null))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- return
-/obj/item/device/infra/process()
- if(!state)
- processing_items.Remove(src)
- return null
-
- if ((!( src.first ) && (src.state && (istype(src.loc, /turf) || (src.master && istype(src.master.loc, /turf))))))
- var/obj/beam/i_beam/I = new /obj/beam/i_beam( (src.master ? src.master.loc : src.loc) )
- //world << "infra spawning beam : \ref[I]"
- I.master = src
- I.density = 1
- I.dir = src.dir
- step(I, I.dir)
- if (I)
- //world << "infra: beam at [I.x] [I.y] [I.z]"
- I.density = 0
- src.first = I
- //world << "infra : vis_spread"
- I.vis_spread(src.visible)
- spawn( 0 )
- if (I)
- //world << "infra: setting limit"
- I.limit = 20
- //world << "infra: processing beam \ref[I]"
- I.process()
- return
- if (!( src.state ))
- //src.first = null
- del(src.first)
- return
-
-/obj/item/device/infra/attackby(obj/item/device/radio/signaler/S as obj, mob/user as mob)
- ..()
- if ((!( istype(S, /obj/item/device/radio/signaler) ) || !( S.b_stat )))
- return
- var/obj/item/assembly/rad_infra/R = new /obj/item/assembly/rad_infra( user )
- S.loc = R
- R.part1 = S
- S.layer = initial(S.layer)
- if (user.client)
- user.client.screen -= S
- if (user.r_hand == S)
- user.u_equip(S)
- user.r_hand = R
- else
- user.u_equip(S)
- user.l_hand = R
- S.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- R.dir = src.dir
- src.add_fingerprint(user)
- return
-
-/obj/item/device/infra/attack_self(mob/user as mob)
- user.machine = src
- var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n", (src.state ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src)))
- user << browse(dat, "window=infra")
- onclose(user, "infra")
- return
-
-/obj/item/device/infra/Topic(href, href_list)
- ..()
- if (usr.stat || usr.restrained())
- return
- if ((usr.contents.Find(src) || usr.contents.Find(src.master) || in_range(src, usr) && istype(src.loc, /turf)))
- usr.machine = src
- if (href_list["state"])
- src.state = !( src.state )
- src.icon_state = text("infrared[]", src.state)
- if (src.master)
- src.master:c_state(src.state, src)
- if(state)
- processing_items.Add(src)
- if (href_list["visible"])
- src.visible = !( src.visible )
- spawn( 0 )
- if (src.first)
- src.first.vis_spread(src.visible)
- return
- if (!( src.master ))
- if (istype(src.loc, /mob))
- attack_self(src.loc)
- else
- for(var/mob/M in viewers(1, src))
- if (M.client)
- src.attack_self(M)
- //Foreach goto(211)
- else
- if (istype(src.master.loc, /mob))
- src.attack_self(src.master.loc)
- else
- for(var/mob/M in viewers(1, src.master))
- if (M.client)
- src.attack_self(M)
- //Foreach goto(287)
- else
- usr << browse(null, "window=infra")
- onclose(usr, "infra")
- return
- return
-
-/obj/item/device/infra/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/item/device/infra/attack_hand()
- //src.first = null
- del(src.first)
- ..()
- return
-
-/obj/item/device/infra/Move()
- var/t = src.dir
- ..()
- src.dir = t
- //src.first = null
- del(src.first)
- return
-
-/obj/item/device/infra/verb/rotate()
- set name = "Rotate Infrared Laser"
- set category = "Object"
- set src in usr
-
- src.dir = turn(src.dir, 90)
- return
\ No newline at end of file
diff --git a/code/game/objects/devices/proxy_sensor.dm b/code/game/objects/devices/proxy_sensor.dm
deleted file mode 100644
index 3b5c75c654..0000000000
--- a/code/game/objects/devices/proxy_sensor.dm
+++ /dev/null
@@ -1,171 +0,0 @@
-/obj/item/device/prox_sensor/dropped()
- spawn(0)
- src.sense()
- return
- return
-
-/obj/item/device/prox_sensor/proc/c_state(n)
- src.icon_state = text("motion[]", n)
-
- if(src.master)
- src.master:c_state(n)
-
- return
-
-/obj/item/device/prox_sensor/proc/sense()
- if (src.state)
- if (src.master)
- spawn(0)
- src.master.receive_signal()
- return
- else
- for(var/mob/O in hearers(null, null))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- return
-
-/obj/item/device/prox_sensor/process()
- if (src.timing)
- if (src.time > 0)
- if(!src.state)
- src.c_state(2)
- src.time = round(src.time) - 1
- else
- time()
- src.time = 0
- src.timing = 0
- if (!src.master)
- if (istype(src.loc, /mob))
- attack_self(src.loc)
- else
- for(var/mob/M in viewers(1, src))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- else
- if (istype(src.master.loc, /mob))
- src.attack_self(src.master.loc)
- else
- for(var/mob/M in viewers(1, src.master))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- else
- processing_items.Remove(src)
- return
- return
-
-/obj/item/device/prox_sensor/proc/time()
- if (src.state == 0)
- src.state = !( src.state )
- src.icon_state = text("motion[]", src.state)
- if (src.master)
- src.master:c_state(src.state, src)
- return
-
-/obj/item/device/prox_sensor/HasProximity(atom/movable/AM as mob|obj)
- if (istype(AM, /obj/beam))
- return
- if (AM.move_speed < 12)
- src.sense()
- return
-
-/obj/item/device/prox_sensor/attackby(obj/item/device/radio/signaler/S as obj, mob/user as mob)
- ..()
- if ((!( istype(S, /obj/item/device/radio/signaler) ) || !( S.b_stat )))
- return
- var/obj/item/assembly/rad_prox/R = new /obj/item/assembly/rad_prox( user )
- S.loc = R
- R.part1 = S
- S.layer = initial(S.layer)
- if (user.client)
- user.client.screen -= S
- if (user.r_hand == S)
- user.u_equip(S)
- user.r_hand = R
- else
- user.u_equip(S)
- user.l_hand = R
- S.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- R.dir = src.dir
- src.add_fingerprint(user)
- return
-
-/obj/item/device/prox_sensor/attack_self(mob/user as mob)
- if (user.stat || user.restrained() || user.lying)
- return
- if ((user.contents.Find(src) || user.contents.Find(src.master) || get_dist(src, user) <= 1 && istype(src.loc, /turf)))
- user.machine = src
- var/second = src.time % 60
- var/minute = (src.time - second) / 60
- var/dat = text("Proximity Sensor\n[] []:[]\n- - + +\n", (src.timing ? text("Arming", src) : text("Not Arming", src)), minute, second, src, src, src, src)
- dat += "
[state?"Armed":"Unarmed"] (Movement sensor active when armed!)"
- dat += "
Close"
- user << browse(dat, "window=prox")
- onclose(user, "prox")
- else
- user << browse(null, "window=prox")
- user.machine = null
- return
-
-/obj/item/device/prox_sensor/Topic(href, href_list)
- ..()
- if (usr.stat || usr.restrained() || usr.lying)
- return
- if ((usr.contents.Find(src) || usr.contents.Find(src.master) || (get_dist(src, usr) <= 1) && istype(src.loc, /turf)))
- usr.machine = src
- if (href_list["state"])
- src.state = !( src.state )
- src.icon_state = text("motion[]", src.state)
- if (src.master)
- src.master:c_state(src.state, src)
- if(state)
- processing_items.Add(src)
-
- if (href_list["time"])
- src.timing = text2num(href_list["time"])
- if(timing)
- src.c_state(1)
-
- if (href_list["tp"])
- var/tp = text2num(href_list["tp"])
- src.time += tp
- src.time = min(max(round(src.time), 0), 600)
-
- if (href_list["close"])
- usr << browse(null, "window=prox")
- usr.machine = null
- return
-
- if (!src.master)
- if (istype(src.loc, /mob))
- attack_self(src.loc)
- else
- for(var/mob/M in viewers(1, src))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- else
- if (istype(src.master.loc, /mob))
- src.attack_self(src.master.loc)
- else
- for(var/mob/M in viewers(1, src.master))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- else
- usr << browse(null, "window=prox")
- return
- return
-
-/obj/item/device/prox_sensor/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/item/device/prox_sensor/Move()
- ..()
- src.sense()
- return
\ No newline at end of file
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index c6ea31a2c5..131e81c83d 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -9,6 +9,16 @@ PLANT ANALYZER
MASS SPECTROMETER
*/
+/obj/item/device/t_scanner
+ name = "T-ray scanner"
+ desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
+ icon_state = "t-ray0"
+ var/on = 0
+ flags = FPRINT|ONBELT|TABLEPASS
+ w_class = 2
+ item_state = "electronic"
+ m_amt = 150
+ origin_tech = "magnets=1;engineering=1"
/obj/item/device/t_scanner/attack_self(mob/user)
@@ -49,6 +59,17 @@ MASS SPECTROMETER
if(M)
M.invisibility = 2
+/obj/item/device/detective_scanner
+ name = "Scanner"
+ desc = "Used to scan objects for DNA and fingerprints."
+ icon_state = "forensic0"
+ var/amount = 20.0
+ var/printing = 0.0
+ w_class = 3.0
+ item_state = "electronic"
+ flags = FPRINT | TABLEPASS | ONBELT | CONDUCT | USEDELAY
+
+
/obj/item/device/detective_scanner/attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
..()
@@ -142,6 +163,20 @@ MASS SPECTROMETER
//Foreach goto(186)
return
+
+/obj/item/device/healthanalyzer
+ name = "Health Analyzer"
+ icon_state = "health"
+ item_state = "analyzer"
+ desc = "A hand-held body scanner able to distinguish vital signs of the subject."
+ flags = FPRINT | ONBELT | TABLEPASS | CONDUCT
+ throwforce = 3
+ w_class = 1.0
+ throw_speed = 5
+ throw_range = 10
+ m_amt = 200
+ origin_tech = "magnets=1;biotech=1"
+
/obj/item/device/healthanalyzer/attack(mob/M as mob, mob/user as mob)
if ((user.mutations & CLOWN || user.brainloss >= 60) && prob(50))
user << text("\red You try to analyze the floor's vitals!")
@@ -187,6 +222,21 @@ MASS SPECTROMETER
src.add_fingerprint(user)
return
+
+/obj/item/device/analyzer
+ desc = "A hand-held environmental scanner which reports current gas levels."
+ name = "analyzer"
+ icon_state = "atmos"
+ item_state = "analyzer"
+ w_class = 2.0
+ flags = FPRINT | TABLEPASS| CONDUCT | ONBELT
+ throwforce = 5
+ throw_speed = 4
+ throw_range = 20
+ m_amt = 30
+ g_amt = 20
+ origin_tech = "magnets=1;engineering=1"
+
/obj/item/device/analyzer/attack_self(mob/user as mob)
if (user.stat)
diff --git a/code/game/objects/devices/timer.dm b/code/game/objects/devices/timer.dm
deleted file mode 100644
index c70ba9db75..0000000000
--- a/code/game/objects/devices/timer.dm
+++ /dev/null
@@ -1,156 +0,0 @@
-/obj/item/device/timer/proc/time()
- src.c_state(0)
-
- if (src.master)
- spawn( 0 )
- var/datum/signal/signal = new
- signal.source = src
- signal.data["message"] = "ACTIVATE"
- src.master.receive_signal(signal)
- del(signal)
- return
- else
- for(var/mob/O in hearers(null, null))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- return
-
-//*****RM
-
-
-/obj/item/device/timer/proc/c_state(n)
- src.icon_state = text("timer[]", n)
-
- if(src.master)
- src.master:c_state(n)
-
- return
-
-//*****
-
-/obj/item/device/timer/process()
- if (src.timing)
- if (src.time > 0)
- src.time = round(src.time) - 1
- if(time<5)
- src.c_state(2)
- else
- // they might increase the time while it is timing
- src.c_state(1)
- else
- time()
- src.time = 0
- src.timing = 0
- if (!src.master)
- if (istype(src.loc, /mob))
- attack_self(src.loc)
- else
- for(var/mob/M in viewers(1, src))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- else
- if (istype(src.master.loc, /mob))
- src.attack_self(src.master.loc)
- else
- for(var/mob/M in viewers(1, src.master))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- else
- // If it's not timing, reset the icon so it doesn't look like it's still about to go off.
- src.c_state(0)
- processing_items.Remove(src)
-
- return
-
-/obj/item/device/timer/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if (istype(W, /obj/item/device/radio/signaler) )
- var/obj/item/device/radio/signaler/S = W
- if(!S.b_stat)
- return
-
- var/obj/item/assembly/rad_time/R = new /obj/item/assembly/rad_time( user )
- S.loc = R
- R.part1 = S
- S.layer = initial(S.layer)
- if (user.client)
- user.client.screen -= S
- if (user.r_hand == S)
- user.u_equip(S)
- user.r_hand = R
- else
- user.u_equip(S)
- user.l_hand = R
- S.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- R.dir = src.dir
- src.add_fingerprint(user)
- R.add_fingerprint(user)
- return
-
-/obj/item/device/timer/attack_self(mob/user as mob)
- ..()
- if (user.stat || user.restrained() || user.lying)
- return
- if ((user.contents.Find(src) || user.contents.Find(src.master) || get_dist(src, user) <= 1 && istype(src.loc, /turf)))
- user.machine = src
- var/second = src.time % 60
- var/minute = (src.time - second) / 60
- var/dat = text("Timing Unit\n[] []:[]\n- - + +\n", (src.timing ? text("Timing", src) : text("Not Timing", src)), minute, second, src, src, src, src)
- dat += "
Close"
- user << browse(dat, "window=timer")
- onclose(user, "timer")
- else
- user << browse(null, "window=timer")
- user.machine = null
-
- return
-
-/obj/item/device/timer/Topic(href, href_list)
- ..()
- if (usr.stat || usr.restrained() || usr.lying)
- return
- if ((usr.contents.Find(src) || usr.contents.Find(src.master) || in_range(src, usr) && istype(src.loc, /turf)))
- usr.machine = src
- if (href_list["time"])
- src.timing = text2num(href_list["time"])
- if(timing)
- src.c_state(1)
- processing_items.Add(src)
-
- if (href_list["tp"])
- var/tp = text2num(href_list["tp"])
- src.time += tp
- src.time = min(max(round(src.time), 0), 600)
-
- if (href_list["close"])
- usr << browse(null, "window=timer")
- usr.machine = null
- return
-
- if (!src.master)
- if (istype(src.loc, /mob))
- attack_self(src.loc)
- else
- for(var/mob/M in viewers(1, src))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- else
- if (istype(src.master.loc, /mob))
- src.attack_self(src.master.loc)
- else
- for(var/mob/M in viewers(1, src.master))
- if (M.client && (M.machine == src.master || M.machine == src))
- src.attack_self(M)
- src.add_fingerprint(usr)
- else
- usr << browse(null, "window=timer")
- return
- return
\ No newline at end of file
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index b63fa41129..1add3f87b1 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -37,28 +37,37 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
if(distance < devastation_range)
for(var/atom/object in T.contents)
spawn()
- object.ex_act(1)
+ if(object)
+ object.ex_act(1)
if(prob(5))
- T.ex_act(2)
+ if(T)
+ T.ex_act(2)
else
- T.ex_act(1)
+ if(T)
+ T.ex_act(1)
else if(distance < heavy_impact_range)
for(var/atom/object in T.contents)
spawn()
- object.ex_act(2)
- T.ex_act(2)
+ if(object)
+ object.ex_act(2)
+ if(T)
+ T.ex_act(2)
else if (distance == heavy_impact_range)
for(var/atom/object in T.contents)
- object.ex_act(2)
+ if(object)
+ object.ex_act(2)
if(prob(15) && devastation_range > 2 && heavy_impact_range > 2)
secondaryexplosion(T, 1)
else
- T.ex_act(2)
+ if(T)
+ T.ex_act(2)
else if(distance <= light_impact_range)
for(var/atom/object in T.contents)
spawn()
- object.ex_act(3)
- T.ex_act(3)
+ if(object)
+ object.ex_act(3)
+ if(T)
+ T.ex_act(3)
for(var/mob/living/carbon/mob in T)
flick("flash", mob:flash)
diff --git a/code/game/objects/items/assemblies.dm b/code/game/objects/items/shock_kit.dm
similarity index 75%
rename from code/game/objects/items/assemblies.dm
rename to code/game/objects/items/shock_kit.dm
index ec26bac1e7..2d77f26e9d 100644
--- a/code/game/objects/items/assemblies.dm
+++ b/code/game/objects/items/shock_kit.dm
@@ -1,3 +1,13 @@
+/obj/item/assembly/shock_kit
+ name = "Shock Kit"
+ desc = "This appears to be made from both an Electric Pack and a Helmet."
+ icon_state = "shock_kit"
+ var/obj/item/clothing/head/helmet/part1 = null
+ var/obj/item/device/radio/electropack/part2 = null
+ var/status = 0.0
+ w_class = 5.0
+ flags = FPRINT | TABLEPASS| CONDUCT
+
/obj/item/assembly/shock_kit/Del()
//src.part1 = null
del(src.part1)
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index bb0ccde607..8742e50df1 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -4,6 +4,39 @@ GETLINEEEEEEEEEEEEEEEEEEEEE
(well not really but it should)
*/
+/obj/item/assembly/weld_rod
+ desc = "A welding torch with metal rods attached to the flame tip."
+ name = "Welder/Rods Assembly"
+ icon_state = "welder-rods"
+ item_state = "welder"
+ var/obj/item/weapon/weldingtool/part1 = null
+ var/obj/item/stack/rods/part2 = null
+ var/status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+ force = 3.0
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 2.0
+
+/obj/item/assembly/w_r_ignite
+ desc = "A welding torch and igniter connected by metal rods."
+ name = "Welder/Rods/Igniter Assembly"
+ icon_state = "welder-rods-igniter"
+ item_state = "welder"
+ var/obj/item/weapon/weldingtool/part1 = null
+ var/obj/item/stack/rods/part2 = null
+ var/obj/item/device/igniter/part3 = null
+ var/status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+ force = 3.0
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 2.0
+
+
+//TODO:Change this over to a slightly better build system
/obj/item/weapon/flamethrower
name = "flamethrower"
icon_state = "flamethrower"
@@ -79,7 +112,7 @@ GETLINEEEEEEEEEEEEEEEEEEEEE
if (istype(W, /obj/item/device/igniter))
var/obj/item/device/igniter/I = W
- if (!( I.status ))
+ if (!( I.secured ))
return
var/obj/item/assembly/weld_rod/S = src
var/obj/item/assembly/w_r_ignite/R = new /obj/item/assembly/w_r_ignite( user )
@@ -127,7 +160,7 @@ GETLINEEEEEEEEEEEEEEEEEEEEE
src.part3.loc = T
src.part1.master = null
src.part2.master = null
- src.part3.master = null
+ src.part3.holder = null
src.part1 = null
src.part2 = null
src.part3 = null
@@ -221,7 +254,7 @@ GETLINEEEEEEEEEEEEEEEEEEEEE
S.part2.master = R
R.part3 = S.part3
S.part3.loc = R
- S.part3.master = R
+ S.part3.holder = R
S.layer = initial(S.layer)
if (user.client)
user.client.screen -= S
diff --git a/code/game/objects/radio/electropack.dm b/code/game/objects/radio/electropack.dm
index d5bc926fdb..3a0d8277df 100644
--- a/code/game/objects/radio/electropack.dm
+++ b/code/game/objects/radio/electropack.dm
@@ -1,3 +1,15 @@
+/obj/item/device/radio/electropack
+ name = "Electropack"
+ desc = "Dance my monkeys! DANCE!!!"
+ icon_state = "electropack0"
+ var/code = 2
+ var/on = 0
+ var/e_pads = 0.0
+ frequency = 1449
+ w_class = 5.0
+ flags = 323
+ item_state = "electropack"
+
/obj/item/device/radio/electropack/examine()
set src in view()
diff --git a/code/game/objects/radio/signaler.dm b/code/game/objects/radio/signaler.dm
index 5e4c6cb110..b5068e1193 100644
--- a/code/game/objects/radio/signaler.dm
+++ b/code/game/objects/radio/signaler.dm
@@ -1,15 +1,91 @@
+/obj/item/device/radio/signaler
+ name = "Remote Signaling Device"
+ desc = "Used to remotely activate devices."
+ icon = 'new_assemblies.dmi'
+ icon_state = "signaller"
+ item_state = "signaler"
+ var/code = 30
+ w_class = 1
+ frequency = 1457
+ var/delay = 0
+ var/airlock_wire = null
-/*
-/obj/item/device/radio/signaler/examine()
- set src in view()
- ..()
- if ((in_range(src, usr) || src.loc == usr))
- if (src.b_stat)
- usr.show_message("\blue The signaler can be attached and modified!")
+ var
+ secured = 1
+ small_icon_state_left = "signaller_left"
+ small_icon_state_right = "signaller_right"
+ list/small_icon_state_overlays = null
+ obj/holder = null
+ cooldown = 0//To prevent spam
+
+ proc
+ Activate()//Called when this assembly is pulsed by another one
+ Secure()//Code that has to happen when the assembly is ready goes here
+ Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
+ Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
+ Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
+
+
+ IsAssembly()
+ return 1
+
+
+ Process_cooldown()
+ cooldown--
+ if(cooldown <= 0) return 0
+ spawn(10)
+ Process_cooldown()
+ return 1
+
+
+ Activate()
+ if((!secured) || (cooldown > 0))
+ return 0
+ cooldown = 2
+ send_signal()
+ spawn(10)
+ Process_cooldown()
+ return 0
+
+
+ Secure()
+ if(secured)
+ return 0
+ secured = 1
+ return 1
+
+
+ Unsecure()
+ if(!secured)
+ return 0
+ secured = 0
+ return 1
+
+
+ Attach_Assembly(var/obj/A, var/mob/user)
+ holder = new/obj/item/device/assembly_holder(get_turf(src))
+ if(holder:attach(A,src,user))
+ user.show_message("\blue You attach the [A.name] to the [src.name]!")
+ return 1
+ return 0
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.IsAssembly())
+ var/obj/item/device/D = W
+ if((!D:secured) && (!src.secured))
+ Attach_Assembly(D,user)
+ if(isscrewdriver(W))
+ if(src.secured)
+ Unsecure()
+ user.show_message("\blue The [src.name] can now be attached!")
+ else
+ Secure()
+ user.show_message("\blue The [src.name] is ready!")
+ return
else
- usr.show_message("\blue The signaler can not be modified or attached!")
- return
-*/
+ ..()
+ return
/obj/item/device/radio/signaler/attack_self(mob/user as mob, flag1)
user.machine = src
@@ -53,23 +129,28 @@ Code:
/obj/item/device/radio/signaler/receive_signal(datum/signal/signal)
- if(!signal || (signal.encryption != code))
- return
+ if(cooldown > 0) return 0
+ if(!signal || (signal.encryption != code)) return 0
if (!( src.wires & 2 ))
return
if(istype(src.loc, /obj/machinery/door/airlock) && src.airlock_wire && src.wires & 1)
-// world << "/obj/.../signaler/r_signal([signal]) has master = [src.master] and type [(src.master?src.master.type : "none")]"
-// world << "[src.airlock_wire] - [src] - [usr] - [signal]"
var/obj/machinery/door/airlock/A = src.loc
A.pulse(src.airlock_wire)
-// src.master:r_signal(signal)
- if(src.master && (src.wires & 1))
- src.master.receive_signal(signal)
+ if((src.holder) && (holder.IsAssemblyHolder()) && (secured) && (src.wires & 1))
+ spawn(0)
+ holder:Process_Activation(src)
+ return
+// src.holder.receive_signal(signal)
+
for(var/mob/O in hearers(1, src.loc))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ cooldown = 2
+ spawn(10)
+ Process_cooldown()
return
+
/obj/item/device/radio/signaler/proc/send_signal(message="ACTIVATE")
if(last_transmission && world.time < (last_transmission + TRANSMISSION_DELAY))
@@ -79,8 +160,9 @@ Code:
if (!( src.wires & 4 ))
return
- var/time = time2text(world.realtime,"hh:mm:ss")
- lastsignalers.Add("[time] : [usr.key] used [src] @ location ([src.loc.x],[src.loc.y],[src.loc.z]) : [format_frequency(frequency)]/[code]")
+ if((usr)&&(ismob(usr)))
+ var/time = time2text(world.realtime,"hh:mm:ss")
+ lastsignalers.Add("[time] : [usr.key] used [src] @ location ([src.loc.x],[src.loc.y],[src.loc.z]) : [format_frequency(frequency)]/[code]")
var/datum/signal/signal = new
signal.source = src
@@ -95,7 +177,7 @@ Code:
//..()
if (usr.stat)
return
- if ((usr.contents.Find(src) || (usr.contents.Find(src.master) || (in_range(src, usr) && istype(src.loc, /turf)))))
+ if ((usr.contents.Find(src) || (usr.contents.Find(src.holder) || (in_range(src, usr) && istype(src.loc, /turf)))))
usr.machine = src
if (href_list["freq"])
..()
diff --git a/code/game/objects/spawners/bomb.dm b/code/game/objects/spawners/bomb.dm
deleted file mode 100644
index 9e81222490..0000000000
--- a/code/game/objects/spawners/bomb.dm
+++ /dev/null
@@ -1,80 +0,0 @@
-/obj/spawner/bomb/New()
- ..()
-
- switch (src.btype)
- // radio
- if (0)
- var/obj/item/assembly/r_i_ptank/R = new /obj/item/assembly/r_i_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/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/m_i_ptank/R = new /obj/item/assembly/m_i_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/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.state = 1
- R.part1.icon_state = text("motion[]", 1)
- R.c_state(1, src)
-
- // timer
- if (2)
- var/obj/item/assembly/t_i_ptank/R = new /obj/item/assembly/t_i_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/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
- //bombvest
- if(3)
- var/obj/item/clothing/suit/armor/a_i_a_ptank/R = new /obj/item/clothing/suit/armor/a_i_a_ptank(src.loc)
- var/obj/item/weapon/tank/plasma/p4 = new /obj/item/weapon/tank/plasma(R)
- var/obj/item/device/healthanalyzer/p1 = new /obj/item/device/healthanalyzer(R)
- var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R)
- var/obj/item/clothing/suit/armor/vest/p3 = new /obj/item/clothing/suit/armor/vest(R)
- R.part1 = p1
- R.part2 = p2
- R.part3 = p3
- R.part4 = p4
- p1.master = R
- p2.master = R
- p3.master = R
- p4.master = R
- R.status = explosive
-
- p4.air_contents.temperature = btemp +T0C
- p2.status = 1
-
- del(src)
\ No newline at end of file
diff --git a/code/game/objects/tank.dm b/code/game/objects/tank.dm
index 7972c48406..39a5e60ba1 100644
--- a/code/game/objects/tank.dm
+++ b/code/game/objects/tank.dm
@@ -388,105 +388,6 @@
/obj/item/weapon/tank/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if (istype(W, /obj/item/assembly/rad_ignite))
- var/obj/item/assembly/rad_ignite/S = W
- if (!( S.status ))
- return
- var/obj/item/assembly/r_i_ptank/R = new
-
- R.part1 = S.part1
- S.part1.loc = R
- S.part1.master = R
-
- R.part2 = S.part2
- S.part2.loc = R
- S.part2.master = R
-
- src.master = R
- R.part3 = src
-
- user.put_in_hand(R)
- user.before_take_item(src)
- src.loc = R
-
- S.part1 = null
- S.part2 = null
- del(S)
- if (istype(W, /obj/item/assembly/prox_ignite))
- var/obj/item/assembly/prox_ignite/S = W
- if (!( S.status ))
- return
- var/obj/item/assembly/m_i_ptank/R = new
- R.part1 = S.part1
- S.part1.loc = R
- S.part1.master = R
-
- R.part2 = S.part2
- S.part2.loc = R
- S.part2.master = R
-
- src.master = R
- R.part3 = src
-
- user.put_in_hand(R)
- user.before_take_item(src)
- src.loc = R
-
- S.part1 = null
- S.part2 = null
- del(S)
-
- if (istype(W, /obj/item/assembly/time_ignite))
- var/obj/item/assembly/time_ignite/S = W
- if (!( S.status ))
- return
- var/obj/item/assembly/t_i_ptank/R = new
- R.part1 = S.part1
- S.part1.loc = R
- S.part1.master = R
-
- R.part2 = S.part2
- S.part2.loc = R
- S.part2.master = R
-
- src.master = R
- R.part3 = src
-
- user.put_in_hand(R)
- user.before_take_item(src)
- src.loc = R
-
- S.part1 = null
- S.part2 = null
- del(S)
- if (istype(W, /obj/item/assembly/a_i_a))
- var/obj/item/assembly/a_i_a/S = W
- if (!( S.status ))
- return
- var/obj/item/clothing/suit/armor/a_i_a_ptank/R = new
- R.part1 = S.part1
- S.part1.loc = R
- S.part1.master = R
-
- R.part2 = S.part2
- S.part2.loc = R
- S.part2.master = R
-
- R.part3 = S.part3
- S.part3.loc = R
- S.part3.master = R
-
- src.master = R
- R.part4 = src
-
- user.put_in_hand(R)
- user.before_take_item(src)
- src.loc = R
-
- S.part1 = null
- S.part2 = null
- S.part3 = null
- del(S)
// PantsNote: More flamethrower assembly code. WOO!
if (istype(W, /obj/item/assembly/w_r_ignite))
var/obj/item/assembly/w_r_ignite/S = W
diff --git a/code/game/objects/assemblies.dm b/code/game/objects/transfer_valve.dm
similarity index 89%
rename from code/game/objects/assemblies.dm
rename to code/game/objects/transfer_valve.dm
index 258d1962fa..08d481ba1f 100644
--- a/code/game/objects/assemblies.dm
+++ b/code/game/objects/transfer_valve.dm
@@ -10,6 +10,11 @@
var/valve_open = 0
var/toggle = 1
+ proc
+ Process_Activation(var/obj/item/device/D)
+
+ IsAssemblyHolder()
+ return 1
attackby(obj/item/item, mob/user)
if(istype(item, /obj/item/weapon/tank))
@@ -29,25 +34,31 @@
user << "\blue You attach the tank to the transfer valve!"
update_icon()
-
- else if(istype(item, /obj/item/device/radio/signaler) || istype(item, /obj/item/device/timer) || istype(item, /obj/item/device/infra) || istype(item, /obj/item/device/prox_sensor))
+//TODO: Have this take an assemblyholder
+ else if(item.IsAssembly())
+ if(item:secured)
+ user << "\red The device is secured!"
+ return
if(attached_device)
user << "\red There is already an device attached to the valve, remove it first!"
return
-
+ user.remove_from_mob(item)
attached_device = item
- user.drop_item()
item.loc = src
- user << "\blue You attach the [item] to the valve controls!"
- item.master = src
+ user << "\blue You attach the [item] to the valve controls and secure it!"
+ item:holder = src
+ item:Secure()
bombers += "[key_name(user)] attached a [item] to a transfer valve."
message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.")
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
attacher = key_name(user)
+ return
-
+ HasProximity(atom/movable/AM as mob|obj)
+ if(!attached_device) return
+ attached_device.HasProximity(AM)
return
@@ -86,7 +97,7 @@
if(href_list["rem_device"])
if(attached_device)
attached_device.loc = get_turf(src)
- attached_device.master = null
+ attached_device:holder = null
attached_device = null
update_icon()
if(href_list["device"])
@@ -97,7 +108,7 @@
src.add_fingerprint(usr)
return
- receive_signal(signal)
+ Process_Activation(var/obj/item/device/D)
if(toggle)
toggle = 0
toggle_valve()
@@ -144,7 +155,7 @@
var/datum/gas_mixture/temp
temp = tank_one.air_contents.remove_ratio(1)
tank_two.air_contents.merge(temp)
-
+
split_gases()
if (!valve_open || !tank_one || !tank_two)
return
@@ -174,7 +185,7 @@
src.update_icon()
sleep(10)
src.update_icon()
-
+
else if(valve_open==1 && (tank_one && tank_two))
split_gases()
valve_open = 0
diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm
index 15c7662938..8a42daab04 100644
--- a/code/game/objects/weapons.dm
+++ b/code/game/objects/weapons.dm
@@ -89,465 +89,6 @@
/obj/mine/New()
icon_state = "uglyminearmed"
-/obj/item/assembly/proc/c_state(n, O as obj)
- return
-
-//*****RM
-
-/obj/item/assembly/time_ignite/premade/New()
- ..()
- part1 = new(src)
- part2 = new(src)
- part1.master = src
- part2.master = src
- //part2.status = 0
-
-/obj/item/assembly/time_ignite/Del()
- del(part1)
- del(part2)
- ..()
-
-/obj/item/assembly/time_ignite/attack_self(mob/user as mob)
- if (src.part1)
- src.part1.attack_self(user, src.status)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/time_ignite/receive_signal()
- if (!status)
- return
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- src.part2.ignite()
- return
-
-/obj/decal/ash/attack_hand(mob/user as mob)
- usr << "\blue The ashes slip through your fingers."
- del(src)
- return
-
-/obj/item/assembly/time_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part1.master = null
- src.part1 = null
- src.part2.loc = T
- src.part2.master = null
- src.part2 = null
-
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The timer is now secured!", 1)
- else
- user.show_message("\blue The timer is now unsecured!", 1)
- src.part2.status = src.status
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/time_ignite/c_state(n)
- src.icon_state = text("timer-igniter[]", n)
- return
-
-//***********
-
-/obj/item/assembly/anal_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part1.master = null
- src.part1 = null
- src.part2.loc = T
- src.part2.master = null
- src.part2 = null
-
- del(src)
- return
- if (( istype(W, /obj/item/weapon/screwdriver) ))
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The analyzer is now secured!", 1)
- else
- user.show_message("\blue The analyzer is now unsecured!", 1)
- src.part2.status = src.status
- src.add_fingerprint(user)
- if(( istype(W, /obj/item/clothing/suit/armor/vest) ) && src.status)
- var/obj/item/assembly/a_i_a/R = new
- R.part1 = part1
- R.part1.master = R
- part1 = null
-
- R.part2 = part2
- R.part2.master = R
- part2 = null
-
- user.put_in_hand(R)
- user.before_take_item(W)
- R.part3 = W
- R.part3.master = R
- del(src)
-
-/* WTF THIS SHIT? It is working? Shouldn't. --rastaf0
- W.loc = R
- R.part1 = W
- R.part2 = W
- W.layer = initial(W.layer)
- if (user.client)
- user.client.screen -= W
- if (user.r_hand == W)
- user.u_equip(W)
- user.r_hand = R
- else
- user.u_equip(W)
- user.l_hand = R
- W.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part3 = src
- R.layer = 20
- R.loc = user
- src.add_fingerprint(user)
-*/
- return
-/* else if ((istype(W, /obj/item/device/timer) && !( src.status )))
-
- var/obj/item/assembly/time_ignite/R = new /obj/item/assembly/time_ignite( user )
- W.loc = R
- R.part1 = W
- W.layer = initial(W.layer)
- if (user.client)
- user.client.screen -= W
- if (user.r_hand == W)
- user.u_equip(W)
- user.r_hand = R
- else
- user.u_equip(W)
- user.l_hand = R
- W.master = R
- src.master = R
- src.layer = initial(src.layer)
- user.u_equip(src)
- if (user.client)
- user.client.screen -= src
- src.loc = R
- R.part2 = src
- R.layer = 20
- R.loc = user
- src.add_fingerprint(user)
-*/
-/obj/item/assembly/a_i_a/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part1.master = null
- src.part1 = null
- src.part2.loc = T
- src.part2.master = null
- src.part2 = null
- src.part3.loc = T
- src.part3.master = null
- src.part3 = null
-
- del(src)
- return
- if (( istype(W, /obj/item/weapon/screwdriver) ))
- if (!src.status && (!part1||!part2||!part3))
- user << "\red You cannot finish the assembly, not all components are in place!"
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The armor is now secured!", 1)
- else
- user.show_message("\blue The armor is now unsecured!", 1)
- src.add_fingerprint(user)
-
-/obj/item/assembly/a_i_a/Del()
- //src.part1 = null
- del(src.part1)
- //src.part2 = null
- del(src.part2)
- del(src.part3)
- ..()
- return
-//*****
-
-/obj/item/assembly/rad_time/Del()
- //src.part1 = null
- del(src.part1)
- //src.part2 = null
- del(src.part2)
- ..()
- return
-
-/obj/item/assembly/rad_time/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
-
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part2.loc = T
- src.part1.master = null
- src.part2.master = null
- src.part1 = null
- src.part2 = null
- //SN src = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The signaler is now secured!", 1)
- else
- user.show_message("\blue The signaler is now unsecured!", 1)
- src.part1.b_stat = !( src.status )
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_time/attack_self(mob/user as mob)
- src.part1.attack_self(user, src.status)
- src.part2.attack_self(user, src.status)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_time/receive_signal(datum/signal/signal)
- if (signal.source == src.part2)
- src.part1.send_signal("ACTIVATE")
- return
-//*******************
-/obj/item/assembly/rad_prox/c_state(n)
- src.icon_state = "prox-radio[n]"
- return
-
-/obj/item/assembly/rad_prox/Del()
- //src.part1 = null
- del(src.part1)
- //src.part2 = null
- del(src.part2)
- ..()
- return
-
-/obj/item/assembly/rad_prox/HasProximity(atom/movable/AM as mob|obj)
- if (istype(AM, /obj/beam))
- return
- if (AM.move_speed < 12)
- src.part2.sense()
- return
-
-/obj/item/assembly/rad_prox/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part2.loc = T
- src.part1.master = null
- src.part2.master = null
- src.part1 = null
- src.part2 = null
- //SN src = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The proximity sensor is now secured!", 1)
- else
- user.show_message("\blue The proximity sensor is now unsecured!", 1)
- src.part1.b_stat = !( src.status )
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_prox/attack_self(mob/user as mob)
- src.part1.attack_self(user, src.status)
- src.part2.attack_self(user, src.status)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_prox/receive_signal(datum/signal/signal)
- if (signal.source == src.part2)
- src.part1.send_signal("ACTIVATE")
- return
-
-/obj/item/assembly/rad_prox/Move()
- ..()
- src.part2.sense()
- return
-
-/obj/item/assembly/rad_prox/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/item/assembly/rad_prox/dropped()
- spawn( 0 )
- src.part2.sense()
- return
- return
-//************************
-/obj/item/assembly/rad_infra/c_state(n)
- src.icon_state = text("infrared-radio[]", n)
- return
-
-/obj/item/assembly/rad_infra/Del()
- del(src.part1)
- del(src.part2)
- ..()
- return
-
-/obj/item/assembly/rad_infra/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part2.loc = T
- src.part1.master = null
- src.part2.master = null
- src.part1 = null
- src.part2 = null
- //SN src = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The infrared laser is now secured!", 1)
- else
- user.show_message("\blue The infrared laser is now unsecured!", 1)
- src.part1.b_stat = !( src.status )
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_infra/attack_self(mob/user as mob)
- src.part1.attack_self(user, src.status)
- src.part2.attack_self(user, src.status)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_infra/receive_signal(datum/signal/signal)
-
- if (signal.source == src.part2)
- src.part1.send_signal("ACTIVATE")
- return
-
-/obj/item/assembly/rad_infra/verb/rotate()
- set name = "Rotate Assembly"
- set category = "Object"
- set src in usr
-
- src.dir = turn(src.dir, 90)
- src.part2.dir = src.dir
- src.add_fingerprint(usr)
- return
-
-/obj/item/assembly/rad_infra/Move()
-
- var/t = src.dir
- ..()
- src.dir = t
- //src.part2.first = null
- del(src.part2.first)
- return
-
-/obj/item/assembly/rad_infra/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/item/assembly/rad_infra/attack_hand(M)
- del(src.part2.first)
- ..()
- return
-
-/obj/item/assembly/prox_ignite/HasProximity(atom/movable/AM as mob|obj)
-
- if (istype(AM, /obj/beam))
- return
- if (AM.move_speed < 12 && src.part1)
- src.part1.sense()
- return
-
-/obj/item/assembly/prox_ignite/dropped()
- spawn( 0 )
- src.part1.sense()
- return
- return
-
-/obj/item/assembly/prox_ignite/Del()
- del(src.part1)
- del(src.part2)
- ..()
- return
-
-/obj/item/assembly/prox_ignite/c_state(n)
- src.icon_state = text("prox-igniter[]", n)
- return
-
-/obj/item/assembly/prox_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part2.loc = T
- src.part1.master = null
- src.part2.master = null
- src.part1 = null
- src.part2 = null
- //SN src = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The proximity sensor is now secured! The igniter now works!", 1)
- else
- user.show_message("\blue The proximity sensor is now unsecured! The igniter will not work.", 1)
- src.part2.status = src.status
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/prox_ignite/attack_self(mob/user as mob)
-
- if (src.part1)
- src.part1.attack_self(user, src.status)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/prox_ignite/receive_signal()
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- src.part2.ignite()
- return
-
-/obj/item/assembly/rad_ignite/Del()
- del(src.part1)
- del(src.part2)
- ..()
- return
-
/obj/item/weapon/directions/attack_hand(mob/user as mob)
if (istype(usr, /mob/living/carbon/human))
if (prob(50))
@@ -565,478 +106,6 @@
return
return
-/obj/item/assembly/rad_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/turf/T = src.loc
- if (ismob(T))
- T = T.loc
- src.part1.loc = T
- src.part2.loc = T
- src.part1.master = null
- src.part2.master = null
- src.part1 = null
- src.part2 = null
- //SN src = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/screwdriver) ))
- return
- src.status = !( src.status )
- if (src.status)
- user.show_message("\blue The radio is now secured! The igniter now works!", 1)
- else
- user.show_message("\blue The radio is now unsecured! The igniter will not work.", 1)
- src.part2.status = src.status
- src.part1.b_stat = !( src.status )
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_ignite/attack_self(mob/user as mob)
-
- if (src.part1)
- src.part1.attack_self(user, src.status)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/rad_ignite/receive_signal()
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- src.part2.ignite()
- return
-
-/obj/item/assembly/m_i_ptank/c_state(n)
-
- src.icon_state = text("prox-igniter-tank[]", n)
- return
-
-/obj/item/assembly/m_i_ptank/HasProximity(atom/movable/AM as mob|obj)
- if (istype(AM, /obj/beam))
- return
- if (AM.move_speed < 12 && src.part1)
- src.part1.sense()
- return
-
-
-//*****RM
-/obj/item/assembly/m_i_ptank/Bump(atom/O)
- spawn(0)
- //world << "miptank bumped into [O]"
- if(src.part1.state)
- //world << "sending signal"
- receive_signal()
- else
- //world << "not active"
- ..()
-
-/obj/item/assembly/m_i_ptank/proc/prox_check()
- if(!part1 || !part1.state)
- return
- for(var/atom/A in view(1, src.loc))
- if(A!=src && !istype(A, /turf/space) && !isarea(A))
- //world << "[A]:[A.type] was sensed"
- src.part1.sense()
- break
-
- spawn(10)
- prox_check()
-
-
-//*****
-
-
-/obj/item/assembly/m_i_ptank/dropped()
-
- spawn( 0 )
- part1.sense()
- return
- return
-
-/obj/item/assembly/m_i_ptank/examine()
- ..()
- part3.examine()
-
-/obj/item/assembly/m_i_ptank/Del()
-
- //src.part1 = null
- del(src.part1)
- //src.part2 = null
- del(src.part2)
- //src.part3 = null
- del(src.part3)
- ..()
- return
-
-/obj/item/assembly/m_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if (istype(W, /obj/item/device/analyzer))
- src.part3.attackby(W, user)
- return
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/obj/item/assembly/prox_ignite/R = new(get_turf(src.loc))
- R.part1 = src.part1
- R.part1.master = R
- R.part1.loc = R
- R.part2 = src.part2
- R.part2.master = R
- R.part2.loc = R
- if (user.get_inactive_hand()==src)
- user.put_in_inactive_hand(part3)
- else
- part3.loc = src.loc
- src.part1 = null
- src.part2 = null
- src.part3 = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/weldingtool)&&W:welding ))
- return
- if (!( src.status ))
- src.status = 1
- bombers += "[key_name(user)] welded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]"
- message_admins("[key_name_admin(user)] welded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]")
- user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
- else
- src.status = 0
- bombers += "[key_name(user)] unwelded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]"
- user << "\blue The hole has been closed."
- src.part2.status = src.status
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/m_i_ptank/attack_self(mob/user as mob)
-
- playsound(src.loc, 'armbomb.ogg', 100, 1)
- src.part1.attack_self(user, 1)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/m_i_ptank/receive_signal()
- //world << "miptank [src] got signal"
- for(var/mob/O in hearers(1, null))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- //Foreach goto(19)
-
- if ((src.status && prob(90)))
- //world << "sent ignite() to [src.part3]"
- src.part3.ignite()
- else
- if(!src.status)
- src.part3.release()
- src.part1.state = 0.0
-
- return
-
-/obj/item/assembly/m_i_ptank/emp_act(severity)
-
- if(istype(part3,/obj/item/weapon/tank/plasma) && prob(100/severity))
- part3.ignite()
- ..()
-
-//*****RM
-
-/obj/item/assembly/t_i_ptank/c_state(n)
-
- src.icon_state = text("timer-igniter-tank[]", n)
- return
-
-/obj/item/assembly/t_i_ptank/examine()
- ..()
- src.part3.examine()
-
-/obj/item/assembly/t_i_ptank/Del()
-
- //src.part1 = null
- del(src.part1)
- //src.part2 = null
- del(src.part2)
- //src.part3 = null
- del(src.part3)
- ..()
- return
-
-/obj/item/assembly/t_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
-
- if (istype(W, /obj/item/device/analyzer))
- src.part3.attackby(W, user)
- return
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/obj/item/assembly/time_ignite/R = new(get_turf(src.loc))
- R.part1 = src.part1
- R.part1.master = R
- R.part1.loc = R
- R.part2 = src.part2
- R.part2.master = R
- R.part2.loc = R
- if (user.get_inactive_hand()==src)
- user.put_in_inactive_hand(part3)
- else
- part3.loc = src.loc
- src.part1 = null
- src.part2 = null
- src.part3 = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding))
- return
- if (!( src.status ))
- src.status = 1
- bombers += "[key_name(user)] welded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]"
- message_admins("[key_name_admin(user)] welded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]")
- user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
- else
- if(src)
- src.status = 0
- bombers += "[key_name(user)] unwelded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]"
- user << "\blue The hole has been closed."
- src.part2.status = src.status
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/t_i_ptank/attack_self(mob/user as mob)
-
- src.part1.attack_self(user, 1)
- playsound(src.loc, 'armbomb.ogg', 100, 1)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/t_i_ptank/receive_signal()
- //world << "tiptank [src] got signal"
- for(var/mob/O in hearers(1, null))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- //Foreach goto(19)
- if ((src.status && prob(90)))
- //world << "sent ignite() to [src.part3]"
- src.part3.ignite()
- else
- if(!src.status)
- src.part3.release()
- return
-
-/obj/item/assembly/t_i_ptank/emp_act(severity)
- if(istype(part3,/obj/item/weapon/tank/plasma) && prob(100/severity))
- part3.ignite()
- ..()
-
-/obj/item/assembly/r_i_ptank/examine()
- ..()
- src.part3.examine()
-
-/obj/item/assembly/r_i_ptank/Del()
-
- //src.part1 = null
- del(src.part1)
- //src.part2 = null
- del(src.part2)
- //src.part3 = null
- del(src.part3)
- ..()
- return
-
-/obj/item/assembly/r_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
-
- if (istype(W, /obj/item/device/analyzer))
- src.part3.attackby(W, user)
- return
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/obj/item/assembly/rad_ignite/R = new(get_turf(src.loc))
- R.part1 = src.part1
- R.part1.master = R
- R.part1.loc = R
- R.part2 = src.part2
- R.part2.master = R
- R.part2.loc = R
- if (user.get_inactive_hand()==src)
- user.put_in_inactive_hand(part3)
- else
- part3.loc = src.loc
- src.part1 = null
- src.part2 = null
- src.part3 = null
- del(src)
- return
- if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding ))
- return
- if (!( src.status ))
- src.status = 1
- bombers += "[key_name(user)] welded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]"
- message_admins("[key_name_admin(user)] welded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]")
- user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
- else
- src.status = 0
- bombers += "[key_name(user)] unwelded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]"
- user << "\blue The hole has been closed."
- src.part2.status = src.status
- src.part1.b_stat = !( src.status )
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/r_i_ptank/emp_act(severity)
- if(istype(part3,/obj/item/weapon/tank/plasma) && prob(100/severity))
- part3.ignite()
- ..()
-
-//*****RM
-
-/obj/item/clothing/suit/armor/a_i_a_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
- ..()
- if (istype(W, /obj/item/device/analyzer))
- src.part4.attackby(W, user)
- return
- if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
- var/obj/item/assembly/a_i_a/R = new(get_turf(src.loc))
- R.part1 = src.part1
- R.part1.master = R
- R.part1.loc = R
- R.part2 = src.part2
- R.part2.master = R
- R.part2.loc = R
- R.part3 = src.part3
- R.part3.master = R
- R.part3.loc = R
- if (user.get_inactive_hand()==src)
- user.put_in_inactive_hand(part4)
- else
- part4.loc = src.loc
- src.part1 = null
- src.part2 = null
- src.part3 = null
- src.part4 = null
- del(src)
- return
- if (( istype(W, /obj/item/weapon/weldingtool) && W:welding))
- return
- if (!( src.status ))
- src.status = 1
- bombers += "[key_name(user)] welded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]"
- message_admins("[key_name_admin(user)] welded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]")
- user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
- else
- src.status = 0
- bombers += "[key_name(user)] unwelded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]"
- user << "\blue The hole has been closed."
-// src.part3.status = src.status
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/r_i_ptank/attack_self(mob/user as mob)
- playsound(src.loc, 'armbomb.ogg', 100, 1)
- src.part1.attack_self(user, 1)
- src.add_fingerprint(user)
- return
-
-/obj/item/assembly/r_i_ptank/receive_signal()
- //world << "riptank [src] got signal"
- for(var/mob/O in hearers(1, null))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
- //Foreach goto(19)
- if ((src.status && prob(90)))
- //world << "sent ignite() to [src.part3]"
- src.part3.ignite()
- else
- if(!src.status)
- src.part3.release()
- return
-
-/obj/beam/i_beam/proc/hit()
- //world << "beam \ref[src]: hit"
- if (src.master)
- //world << "beam hit \ref[src]: calling master \ref[master].hit"
- src.master.hit()
- //SN src = null
- del(src)
- return
-
-/obj/beam/i_beam/proc/vis_spread(v)
- //world << "i_beam \ref[src] : vis_spread"
- src.visible = v
- spawn( 0 )
- if (src.next)
- //world << "i_beam \ref[src] : is next [next.type] \ref[next], calling spread"
- src.next.vis_spread(v)
- return
- return
-
-/obj/beam/i_beam/proc/process()
- //world << "i_beam \ref[src] : process"
-
- if ((src.loc.density || !( src.master )))
- //SN src = null
- // world << "beam hit loc [loc] or no master [master], deleting"
- del(src)
- return
- //world << "proccess: [src.left] left"
-
- if (src.left > 0)
- src.left--
- if (src.left < 1)
- if (!( src.visible ))
- src.invisibility = 101
- else
- src.invisibility = 0
- else
- src.invisibility = 0
-
-
- //world << "now [src.left] left"
- var/obj/beam/i_beam/I = new /obj/beam/i_beam( src.loc )
- I.master = src.master
- I.density = 1
- I.dir = src.dir
- //world << "created new beam \ref[I] at [I.x] [I.y] [I.z]"
- step(I, I.dir)
-
- if (I)
- //world << "step worked, now at [I.x] [I.y] [I.z]"
- if (!( src.next ))
- //world << "no src.next"
- I.density = 0
- //world << "spreading"
- I.vis_spread(src.visible)
- src.next = I
- spawn( 0 )
- //world << "limit = [src.limit] "
- if ((I && src.limit > 0))
- I.limit = src.limit - 1
- //world << "calling next process"
- I.process()
- return
- else
- //world << "is a next: \ref[next], deleting beam \ref[I]"
- //I = null
- del(I)
- else
- //src.next = null
- //world << "step failed, deleting \ref[src.next]"
- del(src.next)
- spawn( 10 )
- src.process()
- return
- return
-
-/obj/beam/i_beam/Bump()
- del(src)
- return
-
-/obj/beam/i_beam/Bumped()
- src.hit()
- return
-
-/obj/beam/i_beam/HasEntered(atom/movable/AM as mob|obj)
- if (istype(AM, /obj/beam))
- return
- spawn( 0 )
- src.hit()
- return
- return
-
-/obj/beam/i_beam/Del()
- del(src.next)
- ..()
- return
-
/atom/proc/ex_act()
return
diff --git a/code/game/turf.dm b/code/game/turf.dm
index 002e1faa77..c5937d4cbc 100644
--- a/code/game/turf.dm
+++ b/code/game/turf.dm
@@ -23,6 +23,9 @@
return
return
+/turf/ex_act(severity)
+ return 0
+
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
if (!mover || !isturf(mover.loc))
return 1
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 948a74b8b8..a6586af452 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -133,20 +133,24 @@ var/showadminmessages = 1
if(jobban_isbanned(M, job))
jobs += "[dd_replacetext(job, " ", " ")] "
else
- jobs += "[dd_replacetext(job, " ", " ")] " //why doesn't this work the stupid cunt
+ jobs += "[dd_replacetext(job, " ", " ")] "
if(jobban_isbanned(M, "Captain"))
jobs += "Captain "
else
- jobs += "Captain " //why doesn't this work the stupid cunt
+ jobs += "Captain "
if(jobban_isbanned(M, "Syndicate"))
jobs += "
[dd_replacetext("Syndicate", " ", " ")] "
else
- jobs += "
[dd_replacetext("Syndicate", " ", " ")] " //why doesn't this work the stupid cunt
+ jobs += "
[dd_replacetext("Syndicate", " ", " ")] "
+ if(jobban_isbanned(M, "pAI"))
+ jobs += "
pAI "
+ else
+ jobs += "
pAI "
body = "
[jobs]
"
dat = "[header][body]"
- usr << browse(dat, "window=jobban2;size=600x150")
+ usr << browse(dat, "window=jobban2;size=600x180")
return
if(href_list["jobban3"])
@@ -1317,13 +1321,7 @@ var/showadminmessages = 1
var/ok = 0
switch(href_list["secretsadmin"])
if("clear_bombs")
- for(var/obj/item/assembly/r_i_ptank/O in world)
- del(O)
- for(var/obj/item/assembly/m_i_ptank/O in world)
- del(O)
- for(var/obj/item/assembly/t_i_ptank/O in world)
- del(O)
- ok = 1
+ //I do nothing
if("list_bombers")
var/dat = "Bombing List
"
for(var/l in bombers)
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index e69de29bb2..535ed36ceb 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -0,0 +1,102 @@
+/*
+Desc: Sorta a hack/workaround to get interfaceish things into this engine.
+ To use an interface just override the proc in your object and set it to return true.
+ If an object returns true for one of these it should have ALL of the commented out procs and vars defined in its class.
+*/
+
+
+
+/*
+Name: IsAssembly
+Desc: If true is an assembly that can work with the holder
+*/
+/obj/proc/IsAssembly()
+ return 0
+/*
+ var
+ secured = 1
+ small_icon_state_left = null
+ small_icon_state_right = null
+ list/small_icon_state_overlays = null
+ obj/holder = null
+ cooldown = 0//To prevent spam
+
+ proc
+ Activate()//Called when this assembly is pulsed by another one
+ Secure()//Code that has to happen when the assembly is ready goes here
+ Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
+ Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
+ Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
+
+
+ IsAssembly()
+ return 1
+
+
+ Process_cooldown()
+ cooldown--
+ if(cooldown <= 0) return 0
+ spawn(10)
+ Process_cooldown()
+ return 1
+
+
+ Activate()
+ if((!secured) || (cooldown > 0))//Make sure to add something using cooldown or such to prevent spam
+ return 0
+ cooldown = 2
+ spawn(10)
+ Process_cooldown()
+ return 0
+
+
+ Secure()
+ if(secured)
+ return 0
+ secured = 1
+ return 1
+
+
+ Unsecure()
+ if(!secured)
+ return 0
+ secured = 0
+ return 1
+
+
+ Attach_Assembly(var/obj/A, var/mob/user)
+ holder = new/obj/item/device/assembly_holder(get_turf(src))
+ if(holder:attach(A,src,user))
+ user.show_message("\blue You attach the [A.name] to the [src.name]!")
+ return 1
+ return 0
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.IsAssembly())
+ var/obj/item/device/D = W
+ if((!D:secured) && (!src.secured))
+ Attach_Assembly(D,user)
+ if(isscrewdriver(W))
+ if(src.secured)
+ Unsecure()
+ user.show_message("\blue The [src.name] can now be attached!")
+ else
+ Secure()
+ user.show_message("\blue The [src.name] is ready!")
+ return
+ else
+ ..()
+ return
+*/
+
+/*
+Name: IsAssemblyHolder
+Desc: If true is an object that can hold an assemblyholder object
+*/
+/obj/proc/IsAssemblyHolder()
+ return 0
+/*
+ proc
+ Process_Activation(var/obj/item/device/D)
+*/
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
new file mode 100644
index 0000000000..397deb7c12
--- /dev/null
+++ b/code/modules/assembly/holder.dm
@@ -0,0 +1,172 @@
+/obj/item/device/assembly_holder
+ name = "Assembly"
+ desc = "Holds various devices"//Fix this by adding dynamic desc
+ icon = 'new_assemblies.dmi'
+ icon_state = "holder"
+ flags = FPRINT | TABLEPASS| CONDUCT
+ item_state = "electronic"
+ m_amt = 100
+ throwforce = 5
+ w_class = 1.0
+ throw_speed = 3
+ throw_range = 10
+
+ var
+ secured = 0
+ obj/item/device/assembly_left = null
+ obj/item/device/assembly_right = null
+ //The "other" thing will go here
+
+ proc
+ attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user)
+ Process_Activation(var/obj/item/device/D)
+
+
+ IsAssemblyHolder()
+ return 1
+
+
+ attach(var/obj/item/device/D, var/obj/item/device/D2, var/mob/user)
+ if((!D)||(!D2)) return 0
+ if((!D.IsAssembly())||(!D2.IsAssembly())) return 0
+ if((D:secured)||(D2:secured)) return 0
+ if(user)
+ user.remove_from_mob(D)
+ user.remove_from_mob(D2)
+ D:holder = src
+ D2:holder = src
+ D.loc = src
+ D2.loc = src
+ assembly_left = D
+ assembly_right = D2
+ src.name = "[D.name] [D2.name] assembly"
+ update_icon()
+ return 1
+
+
+ update_icon()
+ src.overlays = null
+ if(assembly_left)
+ src.overlays += assembly_left:small_icon_state_left
+ for(var/O in assembly_left:small_icon_state_overlays)
+ src.overlays += text("[]_l", O)
+ if(assembly_right)
+ src.overlays += assembly_right:small_icon_state_right
+ for(var/O in assembly_right:small_icon_state_overlays)
+ src.overlays += text("[]_r", O)
+// if(other)
+// other.update_icon()
+
+
+ examine()
+ set src in view()
+ ..()
+ if ((in_range(src, usr) || src.loc == usr))
+ if (src.secured)
+ usr.show_message("The [src.name] is ready!")
+ else
+ usr.show_message("The [src.name] can be attached!")
+ return
+
+
+ HasProximity(atom/movable/AM as mob|obj)
+ if(!assembly_left || !assembly_right) return 0
+ assembly_left.HasProximity(AM)
+ assembly_right.HasProximity(AM)
+
+
+ Move()//I dont like this but it will do for now
+ var/t = src.dir
+ ..()
+ if(istype(assembly_left,/obj/item/device/infra))
+ assembly_left.dir = t
+ del(assembly_left:first)
+ if(istype(assembly_right,/obj/item/device/infra))
+ assembly_right.dir = t
+ del(assembly_right:first)
+ return
+
+
+ attack_hand()//I dont like this one either
+ if(istype(assembly_left,/obj/item/device/infra))
+ del(assembly_left:first)
+ if(istype(assembly_right,/obj/item/device/infra))
+ del(assembly_right:first)
+ ..()
+ return
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(isscrewdriver(W))
+ if(!assembly_left || !assembly_right)
+ user.show_message("\red Assembly part missing!")
+ return
+ if(src.secured)
+ src.secured = 0
+ assembly_left:Unsecure()
+ assembly_right:Unsecure()
+ user.show_message("\blue The [src.name] can now be taken apart!")
+ else
+ src.secured = 1
+ assembly_left:Secure()
+ assembly_right:Secure()
+ user.show_message("\blue The [src.name] is ready!")
+ update_icon()
+ return
+ else
+ ..()
+ return
+
+
+ attack_self(mob/user as mob)
+ src.add_fingerprint(user)
+ if(src.secured)
+ if(!assembly_left || !assembly_right)
+ user.show_message("\red Assembly part missing!")
+ return
+ if(istype(assembly_left,assembly_right.type))//If they are the same type it causes issues due to window code
+ switch(alert("Which side would you like to use?",,"Left","Right"))
+ if("Left")
+ assembly_left.attack_self(user)
+ if("Right")
+ assembly_right.attack_self(user)
+ return
+ else
+ assembly_left.attack_self(user)
+ assembly_right.attack_self(user)
+ else
+ var/turf/T = get_turf(src)
+ if(!T) return 0
+ if(assembly_left)
+ assembly_left:holder = null
+ assembly_left.loc = T
+ if(assembly_right)
+ assembly_right:holder = null
+ assembly_right.loc = T
+ spawn(0)
+ del(src)
+ return
+
+
+ Process_Activation(var/obj/item/device/D)
+ if(!D) return 0
+ if(assembly_left == D)
+ assembly_right:Activate()
+ //If anymore things can be on a holder this will have to be edited
+ else if(assembly_right == D)
+ assembly_left:Activate()
+// else if(assemblyother == D)
+// assembly_left.Activate()
+// assembly_right.Activate()
+ return 1
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
new file mode 100644
index 0000000000..a1c250bdc8
--- /dev/null
+++ b/code/modules/assembly/igniter.dm
@@ -0,0 +1,110 @@
+/obj/item/device/igniter
+ name = "igniter"
+ desc = "A small electronic device able to ignite combustable substances. Does not function well as a lighter."
+ icon = 'new_assemblies.dmi'
+ icon_state = "igniter"
+ flags = FPRINT | TABLEPASS| CONDUCT
+ item_state = "electronic"
+ m_amt = 100
+ throwforce = 5
+ w_class = 1.0
+ throw_speed = 3
+ throw_range = 10
+
+ var
+ secured = 1
+ small_icon_state_left = "igniter_left"
+ small_icon_state_right = "igniter_right"
+ list/small_icon_state_overlays = null
+ obj/holder = null
+ cooldown = 0
+
+ proc
+ Activate()//Called when this assembly is pulsed by another one
+ Secure()
+ Unsecure()
+ Attach_Assembly(var/obj/A, var/mob/user)
+ Process_cooldown()
+
+
+ IsAssembly()
+ return 1
+
+
+ Process_cooldown()
+ src.cooldown--
+ if(src.cooldown <= 0) return 0
+ spawn(10)
+ src.Process_cooldown()
+ return 1
+
+
+ Activate()
+ if((!secured) || (cooldown > 0))
+ return 0
+ var/turf/location = get_turf(src.loc)
+ if(location)
+ location.hotspot_expose(1000,1000)
+ cooldown = 2
+ spawn(10)
+ Process_cooldown()
+ return 1
+
+
+ Secure()
+ if(secured)
+ return 0
+ secured = 1
+ return 1
+
+
+ Unsecure()
+ if(!secured)
+ return 0
+ secured = 0
+ return 1
+
+
+ Attach_Assembly(var/obj/A, var/mob/user)
+ holder = new/obj/item/device/assembly_holder(get_turf(src))
+ if(holder:attach(A,src,user))
+ user.show_message("\blue You attach the [A.name] to the [src.name]!")
+ return 1
+ return 0
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.IsAssembly())
+ var/obj/item/device/D = W
+ if((!D:secured) && (!src.secured))
+ Attach_Assembly(D,user)
+ if(isscrewdriver(W))
+ if(src.secured)
+ Unsecure()
+ user.show_message("\blue The [src.name] can now be attached!")
+ else
+ Secure()
+ user.show_message("\blue The [src.name] is ready!")
+ return
+ else
+ ..()
+ return
+
+
+ attack_self(mob/user as mob)
+ src.add_fingerprint(user)
+ spawn( 5 )
+ Activate()
+ return
+ return
+
+
+ examine()
+ set src in view()
+ ..()
+ if ((in_range(src, usr) || src.loc == usr))
+ if (src.secured)
+ usr.show_message("The [src.name] is ready!")
+ else
+ usr.show_message("The [src.name] can be attached!")
+ return
\ No newline at end of file
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
new file mode 100644
index 0000000000..99983779aa
--- /dev/null
+++ b/code/modules/assembly/infrared.dm
@@ -0,0 +1,338 @@
+/obj/item/device/infra
+ name = "Infrared Beam"
+ desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
+ icon = 'new_assemblies.dmi'
+ icon_state = "infrared_old"
+ flags = FPRINT | TABLEPASS| CONDUCT
+ w_class = 2.0
+ item_state = "electronic"
+ m_amt = 150
+ origin_tech = "magnets=2"
+ var
+ secured = 0
+ small_icon_state_left = "infrared_left"
+ small_icon_state_right = "infrared_right"
+ list/small_icon_state_overlays = null
+ obj/holder = null
+ cooldown = 0//To prevent spam
+ scanning = 0
+ visible = 0
+ obj/beam/i_beam/first = null
+
+ proc
+ Activate()//Called when this assembly is pulsed by another one
+ Secure()//Code that has to happen when the assembly is ready goes here
+ Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
+ Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
+ Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
+ beam_trigger()
+
+
+ IsAssembly()
+ return 1
+
+
+ Process_cooldown()
+ cooldown--
+ if(cooldown <= 0) return 0
+ spawn(10)
+ Process_cooldown()
+ return 1
+
+
+ Activate()
+ if((!secured) || (cooldown > 0))
+ return 0
+ cooldown = 2
+ src.scanning = !src.scanning
+ update_icon()
+ spawn(10)
+ Process_cooldown()
+ return 0
+
+
+ Secure()
+ if(secured)
+ return 0
+ secured = 1
+ processing_items.Add(src)//removal is taken care of it process()
+ return 1
+
+
+ Unsecure()
+ if(!secured)
+ return 0
+ secured = 0
+ return 1
+
+
+ Attach_Assembly(var/obj/A, var/mob/user)
+ holder = new/obj/item/device/assembly_holder(get_turf(src))
+ if(holder:attach(A,src,user))
+ user.show_message("\blue You attach the [A.name] to the [src.name]!")
+ return 1
+ return 0
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.IsAssembly())
+ var/obj/item/device/D = W
+ if((!D:secured) && (!src.secured))
+ Attach_Assembly(D,user)
+ if(isscrewdriver(W))
+ if(src.secured)
+ Unsecure()
+ user.show_message("\blue The [src.name] can now be attached!")
+ else
+ Secure()
+ user.show_message("\blue The [src.name] is ready!")
+ return
+ else
+ ..()
+ return
+
+
+ update_icon()
+ src.overlays = null
+ src.small_icon_state_overlays = list()
+ if(scanning)
+ src.overlays += text("infrared_old2")
+ src.small_icon_state_overlays += text("infrared_on")
+
+ if(holder)
+ holder.update_icon()
+ return
+
+
+ process()
+ if(!scanning)
+ if(!src.first)
+ del(src.first)
+
+ if ((!( src.first ) && (src.secured && (istype(src.loc, /turf) || (src.holder && istype(src.holder.loc, /turf))))))
+ var/obj/beam/i_beam/I = new /obj/beam/i_beam( (src.holder ? src.holder.loc : src.loc) )
+ I.master = src
+ I.density = 1
+ I.dir = src.dir
+ step(I, I.dir)
+ if (I)
+ I.density = 0
+ src.first = I
+ I.vis_spread(src.visible)
+ spawn( 0 )
+ if (I)
+ //world << "infra: setting limit"
+ I.limit = 8
+ //world << "infra: processing beam \ref[I]"
+ I.process()
+ return
+
+ if(!secured)
+ processing_items.Remove(src)
+ return
+
+
+ attack_hand()
+ del(src.first)
+ ..()
+ return
+
+
+ Move()
+ var/t = src.dir
+ ..()
+ src.dir = t
+ del(src.first)
+ return
+
+
+ beam_trigger()
+ if((!secured)||(!scanning)||(cooldown > 0)) return 0
+ if((holder)&&(holder.IsAssemblyHolder()))
+ spawn(0)
+ holder:Process_Activation(src)
+ return
+ for(var/mob/O in hearers(null, null))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ cooldown = 2
+ spawn(10)
+ Process_cooldown()
+ return
+
+
+ attack_self(mob/user as mob)
+ if(!secured) return
+ user.machine = src
+ var/dat = text("Infrared Laser\nStatus: []
\nVisibility: []
\n", (src.scanning ? text("On", src) : text("Off", src)), (src.visible ? text("Visible", src) : text("Invisible", src)))
+ dat += "
Refresh"
+ dat += "
Close"
+ user << browse(dat, "window=infra")
+ onclose(user, "infra")
+ return
+
+
+ Topic(href, href_list)
+ ..()
+ if(get_dist(src, usr) <= 1)
+ if (href_list["state"])
+ src.scanning = !(src.scanning)
+ update_icon()
+
+ if (href_list["visible"])
+ src.visible = !(src.visible)
+ spawn( 0 )
+ if (src.first)
+ src.first.vis_spread(src.visible)
+
+ if (href_list["close"])
+ usr << browse(null, "window=infra")
+ return
+
+ if(usr)
+ src.attack_self(usr)
+
+ else
+ usr << browse(null, "window=infra")
+ onclose(usr, "infra")
+ return
+ return
+
+
+ verb/rotate()//This really could be better but I dont want to redo it right now
+ set name = "Rotate Infrared Laser"
+ set category = "Object"
+ set src in usr
+
+ src.dir = turn(src.dir, 90)
+ return
+
+
+ examine()
+ set src in view()
+ ..()
+ if ((in_range(src, usr) || src.loc == usr))
+ if (src.secured)
+ usr.show_message("The [src.name] is ready!")
+ else
+ usr.show_message("The [src.name] can be attached!")
+ return
+
+
+
+
+
+
+
+
+/***************************IBeam*********************************/
+
+/obj/beam/i_beam
+ name = "i beam"
+ icon = 'projectiles.dmi'
+ icon_state = "ibeam"
+ var/obj/beam/i_beam/next = null
+ var/obj/item/device/infra/master = null
+ var/limit = null
+ var/visible = 0.0
+ var/left = null
+// var/master = null
+ anchored = 1.0
+ flags = TABLEPASS
+
+
+/obj/beam/i_beam/proc/hit()
+ //world << "beam \ref[src]: hit"
+ if (src.master)
+ //world << "beam hit \ref[src]: calling master \ref[master].hit"
+ src.master.beam_trigger()
+ //SN src = null
+ del(src)
+ return
+
+/obj/beam/i_beam/proc/vis_spread(v)
+ //world << "i_beam \ref[src] : vis_spread"
+ src.visible = v
+ spawn( 0 )
+ if (src.next)
+ //world << "i_beam \ref[src] : is next [next.type] \ref[next], calling spread"
+ src.next.vis_spread(v)
+ return
+ return
+
+/obj/beam/i_beam/proc/process()
+ //world << "i_beam \ref[src] : process"
+
+ if ((src.loc.density || !( src.master )))
+ //SN src = null
+ // world << "beam hit loc [loc] or no master [master], deleting"
+ del(src)
+ return
+ //world << "proccess: [src.left] left"
+
+ if (src.left > 0)
+ src.left--
+ if (src.left < 1)
+ if (!( src.visible ))
+ src.invisibility = 101
+ else
+ src.invisibility = 0
+ else
+ src.invisibility = 0
+
+
+ //world << "now [src.left] left"
+ var/obj/beam/i_beam/I = new /obj/beam/i_beam( src.loc )
+ I.master = src.master
+ I.density = 1
+ I.dir = src.dir
+ //world << "created new beam \ref[I] at [I.x] [I.y] [I.z]"
+ step(I, I.dir)
+
+ if (I)
+ //world << "step worked, now at [I.x] [I.y] [I.z]"
+ if (!( src.next ))
+ //world << "no src.next"
+ I.density = 0
+ //world << "spreading"
+ I.vis_spread(src.visible)
+ src.next = I
+ spawn( 0 )
+ //world << "limit = [src.limit] "
+ if ((I && src.limit > 0))
+ I.limit = src.limit - 1
+ //world << "calling next process"
+ I.process()
+ return
+ else
+ //world << "is a next: \ref[next], deleting beam \ref[I]"
+ //I = null
+ del(I)
+ else
+ //src.next = null
+ //world << "step failed, deleting \ref[src.next]"
+ del(src.next)
+ spawn( 10 )
+ src.process()
+ return
+ return
+
+/obj/beam/i_beam/Bump()
+ del(src)
+ return
+
+/obj/beam/i_beam/Bumped()
+ src.hit()
+ return
+
+/obj/beam/i_beam/HasEntered(atom/movable/AM as mob|obj)
+ if (istype(AM, /obj/beam))
+ return
+ spawn( 0 )
+ src.hit()
+ return
+ return
+
+/obj/beam/i_beam/Del()
+ del(src.next)
+ ..()
+ return
\ No newline at end of file
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
new file mode 100644
index 0000000000..a21d677fd0
--- /dev/null
+++ b/code/modules/assembly/proximity.dm
@@ -0,0 +1,217 @@
+/obj/item/device/prox_sensor
+ name = "proximity sensor"
+ desc = "Used for scanning and alerting when someone enters a certain proximity."
+ icon = 'new_assemblies.dmi'
+ icon_state = "prox"
+ flags = FPRINT | TABLEPASS| CONDUCT
+ w_class = 2.0
+ item_state = "electronic"
+ m_amt = 300
+ origin_tech = "magnets=1"
+
+ var
+ secured = 0
+ small_icon_state_left = "prox_left"
+ small_icon_state_right = "prox_right"
+ list/small_icon_state_overlays = null
+ obj/holder = null
+ scanning = 0
+ cooldown = 0//To prevent spam
+ timing = 0
+ time = 0
+
+ proc
+ Activate()//Called when this assembly is pulsed by another one
+ Secure()//Code that has to happen when the assembly is ready goes here
+ Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
+ Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
+ Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
+ toggle_scan()
+ sense()
+
+
+ IsAssembly()
+ return 1
+
+
+ Process_cooldown()
+ src.cooldown--
+ if(src.cooldown <= 0) return 0
+ spawn(10)
+ src.Process_cooldown()
+ return 1
+
+
+ Activate()
+ if((!secured) || (cooldown > 0))
+ return 0
+ cooldown = 2
+ src.timing = !src.timing
+ update_icon()
+ spawn(10)
+ Process_cooldown()
+ return 0
+
+
+ Secure()
+ if(secured) return 0
+ secured = 1
+ processing_items.Add(src)//removal is taken care of it process()
+ return 1
+
+
+ Unsecure()
+ if(!secured) return 0
+ secured = 0
+ return 1
+
+
+ Attach_Assembly(var/obj/A, var/mob/user)
+ holder = new/obj/item/device/assembly_holder(get_turf(src))
+ if(holder:attach(A,src,user))
+ user.show_message("\blue You attach the [A.name] to the [src.name]!")
+ return 1
+ return 0
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.IsAssembly())
+ var/obj/item/device/D = W
+ if((!D:secured) && (!src.secured))
+ Attach_Assembly(D,user)
+ if(isscrewdriver(W))
+ if(src.secured)
+ Unsecure()
+ user.show_message("\blue The [src.name] can now be attached!")
+ else
+ Secure()
+ user.show_message("\blue The [src.name] is ready!")
+ return
+ else
+ ..()
+ return
+
+
+ HasProximity(atom/movable/AM as mob|obj)
+ if (istype(AM, /obj/beam))
+ return
+ if (AM.move_speed < 12)
+ src.sense()
+ return
+
+
+ sense()
+ if((!secured)||(!scanning)||(cooldown > 0)) return 0
+ if((holder)&&(holder.IsAssemblyHolder()))
+ spawn(0)
+ holder:Process_Activation(src)
+ return
+ for(var/mob/O in hearers(null, null))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ cooldown = 2
+ spawn(10)
+ Process_cooldown()
+ return
+
+
+ process()
+ if((src.timing) && (src.time >= 0))
+ src.time--
+ if(src.time <= 0)
+ src.timing = 0
+ src.time = 0
+ toggle_scan()
+
+ if(!secured)
+ if(scanning)
+ scanning = 0
+ src.timing = 0
+ processing_items.Remove(src)
+ update_icon()
+ return
+
+
+ dropped()
+ spawn(0)
+ src.sense()
+ return
+ return
+
+
+ toggle_scan()
+ if(!secured) return 0
+ scanning = !scanning
+ update_icon()
+
+
+ update_icon()
+ src.overlays = null
+ src.small_icon_state_overlays = list()
+ if(timing)
+ src.overlays += text("prox_timing")
+ src.small_icon_state_overlays += text("prox_timing")
+ if(scanning)
+ src.overlays += text("prox_scanning")
+ src.small_icon_state_overlays += text("prox_scanning")
+ if(holder)
+ holder.update_icon()
+ return
+
+
+ Move()
+ ..()
+ src.sense()
+ return
+
+
+ examine()
+ set src in view()
+ ..()
+ if ((in_range(src, usr) || src.loc == usr))
+ if (src.secured)
+ usr.show_message("The [src.name] is ready!")
+ else
+ usr.show_message("The [src.name] can be attached!")
+ return
+
+
+ attack_self(mob/user as mob)
+ if(!secured)
+ user.show_message("\red The [src.name] is unsecured!")
+ return 0
+ var/second = src.time % 60
+ var/minute = (src.time - second) / 60
+ var/dat = text("Proximity Sensor\n[] []:[]\n- - + +\n", (src.timing ? text("Arming", src) : text("Not Arming", src)), minute, second, src, src, src, src)
+ dat += "
[scanning?"Armed":"Unarmed"] (Movement sensor active when armed!)"
+ dat += "
Refresh"
+ dat += "
Close"
+ user << browse(dat, "window=prox")
+ onclose(user, "prox")
+ return
+
+
+ Topic(href, href_list)
+ ..()
+ if(get_dist(src, usr) <= 1)
+ if (href_list["scanning"])
+ toggle_scan()
+
+ if (href_list["time"])
+ src.timing = text2num(href_list["time"])
+ update_icon()
+
+ if (href_list["tp"])
+ var/tp = text2num(href_list["tp"])
+ src.time += tp
+ src.time = min(max(round(src.time), 0), 600)
+
+ if (href_list["close"])
+ usr << browse(null, "window=prox")
+ return
+
+ if(usr)
+ src.attack_self(usr)
+
+ else
+ usr << browse(null, "window=prox")
+ return
\ No newline at end of file
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
new file mode 100644
index 0000000000..e70f1307b8
--- /dev/null
+++ b/code/modules/assembly/signaler.dm
@@ -0,0 +1,2 @@
+//Signalers are now an assembly item, not sure if I should put it in here.
+//Currently in game/objects/radio/signaler.dm
\ No newline at end of file
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
new file mode 100644
index 0000000000..dbd1022e1c
--- /dev/null
+++ b/code/modules/assembly/timer.dm
@@ -0,0 +1,180 @@
+/obj/item/device/timer
+ name = "timer"
+ desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
+ icon = 'new_assemblies.dmi'
+ icon_state = "timer"
+ item_state = "electronic"
+ flags = FPRINT | TABLEPASS| CONDUCT
+ w_class = 2.0
+ m_amt = 100
+ var
+ secured = 0
+ small_icon_state_left = "timer_left"
+ small_icon_state_right = "timer_right"
+ list/small_icon_state_overlays = null
+ obj/holder = null
+ cooldown = 0//To prevent spam
+ timing = 0
+ time = 0
+
+ proc
+ Activate()//Called when this assembly is pulsed by another one
+ Secure()//Code that has to happen when the assembly is ready goes here
+ Unsecure()//Code that has to happen when the assembly is taken off of the ready state goes here
+ Attach_Assembly(var/obj/A, var/mob/user)//Called when an assembly is attacked by another
+ Process_cooldown()//Call this via spawn(10) to have it count down the cooldown var
+ timer_end()
+
+ IsAssembly()
+ return 1
+
+
+ Process_cooldown()
+ cooldown--
+ if(cooldown <= 0) return 0
+ spawn(10)
+ Process_cooldown()
+ return 1
+
+
+ Activate()
+ if((!secured) || (cooldown > 0))
+ return 0
+ cooldown = 2
+ src.timing = !src.timing
+ update_icon()
+ spawn(10)
+ Process_cooldown()
+ return 0
+
+
+ Secure()
+ if(secured)
+ return 0
+ processing_items.Add(src)//removal is taken care of it process()
+ secured = 1
+ return 1
+
+
+ Unsecure()
+ if(!secured)
+ return 0
+ secured = 0
+ return 1
+
+
+ Attach_Assembly(var/obj/A, var/mob/user)
+ holder = new/obj/item/device/assembly_holder(get_turf(src))
+ if(holder:attach(A,src,user))
+ user.show_message("\blue You attach the [A.name] to the [src.name]!")
+ return 1
+ return 0
+
+
+ attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(W.IsAssembly())
+ var/obj/item/device/D = W
+ if((!D:secured) && (!src.secured))
+ Attach_Assembly(D,user)
+ if(isscrewdriver(W))
+ if(src.secured)
+ Unsecure()
+ user.show_message("\blue The [src.name] can now be attached!")
+ else
+ Secure()
+ user.show_message("\blue The [src.name] is ready!")
+ return
+ else
+ ..()
+ return
+
+
+ timer_end()
+ if((!secured)||(cooldown > 0)) return 0
+ if((holder)&&(holder.IsAssemblyHolder()))
+ spawn(0)
+ holder:Process_Activation(src)
+ return
+ for(var/mob/O in hearers(null, null))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ cooldown = 2
+ spawn(10)
+ Process_cooldown()
+ return
+
+
+ process()
+ if((src.timing) && (src.time >= 0))
+ src.time--
+ if(src.time <= 0)
+ src.timing = 0
+ src.time = 0
+ timer_end()
+ update_icon()
+
+ if(!secured)
+ src.timing = 0
+ processing_items.Remove(src)
+ update_icon()
+ return
+
+
+ update_icon()
+ src.overlays = null
+ src.small_icon_state_overlays = list()
+ if(timing)
+ src.overlays += text("timer_timing")
+ src.small_icon_state_overlays += text("timer_timing")
+ if(holder)
+ holder.update_icon()
+ return
+
+
+ examine()
+ set src in view()
+ ..()
+ if ((in_range(src, usr) || src.loc == usr))
+ if (src.secured)
+ usr.show_message("The [src.name] is ready!")
+ else
+ usr.show_message("The [src.name] can be attached!")
+ return
+
+
+ attack_self(mob/user as mob)
+ if(!secured)
+ user.show_message("\red The [src.name] is unsecured!")
+ return 0
+ var/second = src.time % 60
+ var/minute = (src.time - second) / 60
+ var/dat = text("Timing Unit\n[] []:[]\n- - + +\n", (src.timing ? text("Timing", src) : text("Not Timing", src)), minute, second, src, src, src, src)
+ dat += "
Refresh"
+ dat += "
Close"
+ user << browse(dat, "window=timer")
+ onclose(user, "timer")
+ return
+
+
+ Topic(href, href_list)
+ ..()
+ if(get_dist(src, usr) <= 1)
+
+ if (href_list["time"])
+ src.timing = text2num(href_list["time"])
+ update_icon()
+
+ if (href_list["tp"])
+ var/tp = text2num(href_list["tp"])
+ src.time += tp
+ src.time = min(max(round(src.time), 0), 600)
+
+ if (href_list["close"])
+ usr << browse(null, "window=timer")
+ return
+
+ if(usr)
+ src.attack_self(usr)
+
+ else
+ usr << browse(null, "window=timer")
+ return
\ No newline at end of file
diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm
index 25e9828ab6..ac73e41362 100644
--- a/code/modules/chemical/Chemistry-Tools.dm
+++ b/code/modules/chemical/Chemistry-Tools.dm
@@ -28,8 +28,8 @@
reagents = R
R.my_atom = src
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/assembly/time_ignite) && !stage && path != 2)
+ attackby(obj/item/weapon/W as obj, mob/user as mob)//TODO:Have grenades use the new assembly things
+ if(istype(W,/obj/item/device/assembly_holder) && !stage && path != 2)
path = 1
user << "\blue You add [W] to the metal casing."
playsound(src.loc, 'Screwdriver2.ogg', 25, -3)
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index 1840f22b0c..9026b74447 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -161,6 +161,8 @@ var/datum/paiController/paiController // Global handler for pAI candidates
proc/requestRecruits()
for(var/mob/dead/observer/O in world)
+ if(jobban_isbanned(O, "pAI"))
+ continue
if(asked.Find(O.key))
if(world.time < asked[O.key] + askDelay)
continue
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 08171f9cc7..a90cdef592 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1269,6 +1269,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
onclose(user, "mob[name]")
return
+
+
/mob/proc/u_equip(W as obj)
if (W == r_hand)
r_hand = null
@@ -1280,8 +1282,18 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
back = null
else if (W == wear_mask)
wear_mask = null
-
update_clothing()
+ return
+
+
+//Attemps to remove an object on a mob. Will not move it to another area or such, just removes from the mob.
+/mob/proc/remove_from_mob(var/obj/O)
+ src.u_equip(O)
+ if (src.client)
+ src.client.screen -= O
+ O.layer = initial(O.layer)
+ O.screen_loc = null
+ return 1
/mob/proc/ret_grab(obj/list_container/mobl/L as obj, flag)
diff --git a/code/modules/power/Ultralight.dm b/code/unused/Ultralight.dm
similarity index 100%
rename from code/modules/power/Ultralight.dm
rename to code/unused/Ultralight.dm
diff --git a/code/unused/assemblies.dm b/code/unused/assemblies.dm
new file mode 100644
index 0000000000..3409df89d0
--- /dev/null
+++ b/code/unused/assemblies.dm
@@ -0,0 +1,951 @@
+/*/obj/item/assembly
+ name = "assembly"
+ icon = 'assemblies.dmi'
+ item_state = "assembly"
+ var/status = 0.0
+ throwforce = 10
+ w_class = 3.0
+ throw_speed = 4
+ throw_range = 10
+
+/obj/item/assembly/a_i_a
+ name = "Health-Analyzer/Igniter/Armor Assembly"
+ desc = "A health-analyzer, igniter and armor assembly."
+ icon_state = "armor-igniter-analyzer"
+ var/obj/item/device/healthanalyzer/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ var/obj/item/clothing/suit/armor/vest/part3 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/m_i_ptank
+ desc = "A very intricate igniter and proximity sensor electrical assembly mounted onto top of a plasma tank."
+ name = "Proximity/Igniter/Plasma Tank Assembly"
+ icon_state = "prox-igniter-tank0"
+ var/obj/item/device/prox_sensor/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ var/obj/item/weapon/tank/plasma/part3 = null
+ status = 0.0
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/prox_ignite
+ name = "Proximity/Igniter Assembly"
+ desc = "A proximity-activated igniter assembly."
+ icon_state = "prox-igniter0"
+ var/obj/item/device/prox_sensor/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/r_i_ptank
+ desc = "A very intricate igniter and signaller electrical assembly mounted onto top of a plasma tank."
+ name = "Radio/Igniter/Plasma Tank Assembly"
+ icon_state = "radio-igniter-tank"
+ var/obj/item/device/radio/signaler/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ var/obj/item/weapon/tank/plasma/part3 = null
+ status = 0.0
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/anal_ignite
+ name = "Health-Analyzer/Igniter Assembly"
+ desc = "A health-analyzer igniter assembly."
+ icon_state = "timer-igniter0"
+ var/obj/item/device/healthanalyzer/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+ item_state = "electronic"
+
+/obj/item/assembly/time_ignite
+ name = "Timer/Igniter Assembly"
+ desc = "A timer-activated igniter assembly."
+ icon_state = "timer-igniter0"
+ var/obj/item/device/timer/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/t_i_ptank
+ desc = "A very intricate igniter and timer assembly mounted onto top of a plasma tank."
+ name = "Timer/Igniter/Plasma Tank Assembly"
+ icon_state = "timer-igniter-tank0"
+ var/obj/item/device/timer/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ var/obj/item/weapon/tank/plasma/part3 = null
+ status = 0.0
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/rad_ignite
+ name = "Radio/Igniter Assembly"
+ desc = "A radio-activated igniter assembly."
+ icon_state = "radio-igniter"
+ var/obj/item/device/radio/signaler/part1 = null
+ var/obj/item/device/igniter/part2 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/rad_infra
+ name = "Signaller/Infrared Assembly"
+ desc = "An infrared-activated radio signaller"
+ icon_state = "infrared-radio0"
+ var/obj/item/device/radio/signaler/part1 = null
+ var/obj/item/device/infra/part2 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/rad_prox
+ name = "Signaller/Prox Sensor Assembly"
+ desc = "A proximity-activated radio signaller."
+ icon_state = "prox-radio0"
+ var/obj/item/device/radio/signaler/part1 = null
+ var/obj/item/device/prox_sensor/part2 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+
+/obj/item/assembly/rad_time
+ name = "Signaller/Timer Assembly"
+ desc = "A radio signaller activated by a count-down timer."
+ icon_state = "timer-radio0"
+ var/obj/item/device/radio/signaler/part1 = null
+ var/obj/item/device/timer/part2 = null
+ status = null
+ flags = FPRINT | TABLEPASS| CONDUCT
+*/
+
+/obj/item/assembly/time_ignite/premade/New()
+ ..()
+ part1 = new(src)
+ part2 = new(src)
+ part1.master = src
+ part2.master = src
+ //part2.status = 0
+
+/obj/item/assembly/time_ignite/Del()
+ del(part1)
+ del(part2)
+ ..()
+
+/obj/item/assembly/time_ignite/attack_self(mob/user as mob)
+ if (src.part1)
+ src.part1.attack_self(user, src.status)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/time_ignite/receive_signal()
+ if (!status)
+ return
+ for(var/mob/O in hearers(1, src.loc))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ src.part2.Activate()
+ return
+
+/obj/decal/ash/attack_hand(mob/user as mob)
+ usr << "\blue The ashes slip through your fingers."
+ del(src)
+ return
+
+/obj/item/assembly/time_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part1.master = null
+ src.part1 = null
+ src.part2.loc = T
+ src.part2.master = null
+ src.part2 = null
+
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/screwdriver) ))
+ return
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The timer is now secured!", 1)
+ else
+ user.show_message("\blue The timer is now unsecured!", 1)
+ src.part2.secured = src.status
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/time_ignite/c_state(n)
+ src.icon_state = text("timer-igniter[]", n)
+ return
+
+//***********
+
+/obj/item/assembly/anal_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part1.master = null
+ src.part1 = null
+ src.part2.loc = T
+ src.part2.master = null
+ src.part2 = null
+
+ del(src)
+ return
+ if (( istype(W, /obj/item/weapon/screwdriver) ))
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The analyzer is now secured!", 1)
+ else
+ user.show_message("\blue The analyzer is now unsecured!", 1)
+ src.part2.secured = src.status
+ src.add_fingerprint(user)
+ if(( istype(W, /obj/item/clothing/suit/armor/vest) ) && src.status)
+ var/obj/item/assembly/a_i_a/R = new
+ R.part1 = part1
+ R.part1.master = R
+ part1 = null
+
+ R.part2 = part2
+ R.part2.master = R
+ part2 = null
+
+ user.put_in_hand(R)
+ user.before_take_item(W)
+ R.part3 = W
+ R.part3.master = R
+ del(src)
+
+/* WTF THIS SHIT? It is working? Shouldn't. --rastaf0
+ W.loc = R
+ R.part1 = W
+ R.part2 = W
+ W.layer = initial(W.layer)
+ if (user.client)
+ user.client.screen -= W
+ if (user.r_hand == W)
+ user.u_equip(W)
+ user.r_hand = R
+ else
+ user.u_equip(W)
+ user.l_hand = R
+ W.master = R
+ src.master = R
+ src.layer = initial(src.layer)
+ user.u_equip(src)
+ if (user.client)
+ user.client.screen -= src
+ src.loc = R
+ R.part3 = src
+ R.layer = 20
+ R.loc = user
+ src.add_fingerprint(user)
+*/
+ return
+/* else if ((istype(W, /obj/item/device/timer) && !( src.status )))
+
+ var/obj/item/assembly/time_ignite/R = new /obj/item/assembly/time_ignite( user )
+ W.loc = R
+ R.part1 = W
+ W.layer = initial(W.layer)
+ if (user.client)
+ user.client.screen -= W
+ if (user.r_hand == W)
+ user.u_equip(W)
+ user.r_hand = R
+ else
+ user.u_equip(W)
+ user.l_hand = R
+ W.master = R
+ src.master = R
+ src.layer = initial(src.layer)
+ user.u_equip(src)
+ if (user.client)
+ user.client.screen -= src
+ src.loc = R
+ R.part2 = src
+ R.layer = 20
+ R.loc = user
+ src.add_fingerprint(user)
+*/
+
+/obj/item/assembly/proc/c_state(n, O as obj)
+ return
+
+/obj/item/assembly/a_i_a/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part1.master = null
+ src.part1 = null
+ src.part2.loc = T
+ src.part2.master = null
+ src.part2 = null
+ src.part3.loc = T
+ src.part3.master = null
+ src.part3 = null
+
+ del(src)
+ return
+ if (( istype(W, /obj/item/weapon/screwdriver) ))
+ if (!src.status && (!part1||!part2||!part3))
+ user << "\red You cannot finish the assembly, not all components are in place!"
+ return
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The armor is now secured!", 1)
+ else
+ user.show_message("\blue The armor is now unsecured!", 1)
+ src.add_fingerprint(user)
+
+/obj/item/assembly/a_i_a/Del()
+ //src.part1 = null
+ del(src.part1)
+ //src.part2 = null
+ del(src.part2)
+ del(src.part3)
+ ..()
+ return
+//*****
+
+/obj/item/assembly/rad_time/Del()
+ //src.part1 = null
+ del(src.part1)
+ //src.part2 = null
+ del(src.part2)
+ ..()
+ return
+
+/obj/item/assembly/rad_time/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part2.loc = T
+ src.part1.master = null
+ src.part2.master = null
+ src.part1 = null
+ src.part2 = null
+ //SN src = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/screwdriver) ))
+ return
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The signaler is now secured!", 1)
+ else
+ user.show_message("\blue The signaler is now unsecured!", 1)
+ src.part1.b_stat = !( src.status )
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_time/attack_self(mob/user as mob)
+ src.part1.attack_self(user, src.status)
+ src.part2.attack_self(user, src.status)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_time/receive_signal(datum/signal/signal)
+ if (signal.source == src.part2)
+ src.part1.send_signal("ACTIVATE")
+ return
+//*******************
+/obj/item/assembly/rad_prox/c_state(n)
+ src.icon_state = "prox-radio[n]"
+ return
+
+/obj/item/assembly/rad_prox/Del()
+ //src.part1 = null
+ del(src.part1)
+ //src.part2 = null
+ del(src.part2)
+ ..()
+ return
+
+/obj/item/assembly/rad_prox/HasProximity(atom/movable/AM as mob|obj)
+ if (istype(AM, /obj/beam))
+ return
+ if (AM.move_speed < 12)
+ src.part2.sense()
+ return
+
+/obj/item/assembly/rad_prox/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part2.loc = T
+ src.part1.master = null
+ src.part2.master = null
+ src.part1 = null
+ src.part2 = null
+ //SN src = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/screwdriver) ))
+ return
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The proximity sensor is now secured!", 1)
+ else
+ user.show_message("\blue The proximity sensor is now unsecured!", 1)
+ src.part1.b_stat = !( src.status )
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_prox/attack_self(mob/user as mob)
+ src.part1.attack_self(user, src.status)
+ src.part2.attack_self(user, src.status)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_prox/receive_signal(datum/signal/signal)
+ if (signal.source == src.part2)
+ src.part1.send_signal("ACTIVATE")
+ return
+
+/obj/item/assembly/rad_prox/Move()
+ ..()
+ src.part2.sense()
+ return
+
+/obj/item/assembly/rad_prox/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/item/assembly/rad_prox/dropped()
+ spawn( 0 )
+ src.part2.sense()
+ return
+ return
+//************************
+/obj/item/assembly/rad_infra/c_state(n)
+ src.icon_state = text("infrared-radio[]", n)
+ return
+
+/obj/item/assembly/rad_infra/Del()
+ del(src.part1)
+ del(src.part2)
+ ..()
+ return
+
+/obj/item/assembly/rad_infra/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part2.loc = T
+ src.part1.master = null
+ src.part2.master = null
+ src.part1 = null
+ src.part2 = null
+ //SN src = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/screwdriver) ))
+ return
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The infrared laser is now secured!", 1)
+ else
+ user.show_message("\blue The infrared laser is now unsecured!", 1)
+ src.part1.b_stat = !( src.status )
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_infra/attack_self(mob/user as mob)
+ src.part1.attack_self(user, src.status)
+ src.part2.attack_self(user, src.status)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_infra/receive_signal(datum/signal/signal)
+
+ if (signal.source == src.part2)
+ src.part1.send_signal("ACTIVATE")
+ return
+
+/obj/item/assembly/rad_infra/verb/rotate()
+ set name = "Rotate Assembly"
+ set category = "Object"
+ set src in usr
+
+ src.dir = turn(src.dir, 90)
+ src.part2.dir = src.dir
+ src.add_fingerprint(usr)
+ return
+
+/obj/item/assembly/rad_infra/Move()
+
+ var/t = src.dir
+ ..()
+ src.dir = t
+ //src.part2.first = null
+ del(src.part2.first)
+ return
+
+/obj/item/assembly/rad_infra/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/item/assembly/rad_infra/attack_hand(M)
+ del(src.part2.first)
+ ..()
+ return
+
+/obj/item/assembly/prox_ignite/HasProximity(atom/movable/AM as mob|obj)
+
+ if (istype(AM, /obj/beam))
+ return
+ if (AM.move_speed < 12 && src.part1)
+ src.part1.sense()
+ return
+
+/obj/item/assembly/prox_ignite/dropped()
+ spawn( 0 )
+ src.part1.sense()
+ return
+ return
+
+/obj/item/assembly/prox_ignite/Del()
+ del(src.part1)
+ del(src.part2)
+ ..()
+ return
+
+/obj/item/assembly/prox_ignite/c_state(n)
+ src.icon_state = text("prox-igniter[]", n)
+ return
+
+/obj/item/assembly/prox_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part2.loc = T
+ src.part1.master = null
+ src.part2.master = null
+ src.part1 = null
+ src.part2 = null
+ //SN src = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/screwdriver) ))
+ return
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The proximity sensor is now secured! The igniter now works!", 1)
+ else
+ user.show_message("\blue The proximity sensor is now unsecured! The igniter will not work.", 1)
+ src.part2.secured = src.status
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/prox_ignite/attack_self(mob/user as mob)
+
+ if (src.part1)
+ src.part1.attack_self(user, src.status)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/prox_ignite/receive_signal()
+ for(var/mob/O in hearers(1, src.loc))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ src.part2.Activate()
+ return
+
+/obj/item/assembly/rad_ignite/Del()
+ del(src.part1)
+ del(src.part2)
+ ..()
+ return
+
+
+
+/obj/item/assembly/rad_ignite/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/turf/T = src.loc
+ if (ismob(T))
+ T = T.loc
+ src.part1.loc = T
+ src.part2.loc = T
+ src.part1.master = null
+ src.part2.master = null
+ src.part1 = null
+ src.part2 = null
+ //SN src = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/screwdriver) ))
+ return
+ src.status = !( src.status )
+ if (src.status)
+ user.show_message("\blue The radio is now secured! The igniter now works!", 1)
+ else
+ user.show_message("\blue The radio is now unsecured! The igniter will not work.", 1)
+ src.part2.secured = src.status
+ src.part1.b_stat = !( src.status )
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_ignite/attack_self(mob/user as mob)
+
+ if (src.part1)
+ src.part1.attack_self(user, src.status)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/rad_ignite/receive_signal()
+ for(var/mob/O in hearers(1, src.loc))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ src.part2.Activate()
+ return
+
+/obj/item/assembly/m_i_ptank/c_state(n)
+
+ src.icon_state = text("prox-igniter-tank[]", n)
+ return
+
+/obj/item/assembly/m_i_ptank/HasProximity(atom/movable/AM as mob|obj)
+ if (istype(AM, /obj/beam))
+ return
+ if (AM.move_speed < 12 && src.part1)
+ src.part1.sense()
+ return
+
+
+//*****RM
+/obj/item/assembly/m_i_ptank/Bump(atom/O)
+ spawn(0)
+ //world << "miptank bumped into [O]"
+ if(src.part1.secured)
+ //world << "sending signal"
+ receive_signal()
+ else
+ //world << "not active"
+ ..()
+
+/obj/item/assembly/m_i_ptank/proc/prox_check()
+ if(!part1 || !part1.secured)
+ return
+ for(var/atom/A in view(1, src.loc))
+ if(A!=src && !istype(A, /turf/space) && !isarea(A))
+ //world << "[A]:[A.type] was sensed"
+ src.part1.sense()
+ break
+
+ spawn(10)
+ prox_check()
+
+
+//*****
+
+
+/obj/item/assembly/m_i_ptank/dropped()
+
+ spawn( 0 )
+ part1.sense()
+ return
+ return
+
+/obj/item/assembly/m_i_ptank/examine()
+ ..()
+ part3.examine()
+
+/obj/item/assembly/m_i_ptank/Del()
+
+ //src.part1 = null
+ del(src.part1)
+ //src.part2 = null
+ del(src.part2)
+ //src.part3 = null
+ del(src.part3)
+ ..()
+ return
+
+/obj/item/assembly/m_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if (istype(W, /obj/item/device/analyzer))
+ src.part3.attackby(W, user)
+ return
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/obj/item/assembly/prox_ignite/R = new(get_turf(src.loc))
+ R.part1 = src.part1
+ R.part1.master = R
+ R.part1.loc = R
+ R.part2 = src.part2
+ R.part2.master = R
+ R.part2.loc = R
+ if (user.get_inactive_hand()==src)
+ user.put_in_inactive_hand(part3)
+ else
+ part3.loc = src.loc
+ src.part1 = null
+ src.part2 = null
+ src.part3 = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/weldingtool)&&W:welding ))
+ return
+ if (!( src.status ))
+ src.status = 1
+ bombers += "[key_name(user)] welded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]"
+ message_admins("[key_name_admin(user)] welded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]")
+ user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
+ else
+ src.status = 0
+ bombers += "[key_name(user)] unwelded a prox bomb. Temp: [src.part3.air_contents.temperature-T0C]"
+ user << "\blue The hole has been closed."
+ src.part2.secured = src.status
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/m_i_ptank/attack_self(mob/user as mob)
+
+ playsound(src.loc, 'armbomb.ogg', 100, 1)
+ src.part1.attack_self(user, 1)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/m_i_ptank/receive_signal()
+ //world << "miptank [src] got signal"
+ for(var/mob/O in hearers(1, null))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ //Foreach goto(19)
+
+ if ((src.status && prob(90)))
+ //world << "sent ignite() to [src.part3]"
+ src.part3.ignite()
+ else
+ if(!src.status)
+ src.part3.release()
+ src.part1.secured = 0.0
+
+ return
+
+/obj/item/assembly/m_i_ptank/emp_act(severity)
+
+ if(istype(part3,/obj/item/weapon/tank/plasma) && prob(100/severity))
+ part3.ignite()
+ ..()
+
+//*****RM
+
+/obj/item/assembly/t_i_ptank/c_state(n)
+
+ src.icon_state = text("timer-igniter-tank[]", n)
+ return
+
+/obj/item/assembly/t_i_ptank/examine()
+ ..()
+ src.part3.examine()
+
+/obj/item/assembly/t_i_ptank/Del()
+
+ //src.part1 = null
+ del(src.part1)
+ //src.part2 = null
+ del(src.part2)
+ //src.part3 = null
+ del(src.part3)
+ ..()
+ return
+
+/obj/item/assembly/t_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+
+ if (istype(W, /obj/item/device/analyzer))
+ src.part3.attackby(W, user)
+ return
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/obj/item/assembly/time_ignite/R = new(get_turf(src.loc))
+ R.part1 = src.part1
+ R.part1.master = R
+ R.part1.loc = R
+ R.part2 = src.part2
+ R.part2.master = R
+ R.part2.loc = R
+ if (user.get_inactive_hand()==src)
+ user.put_in_inactive_hand(part3)
+ else
+ part3.loc = src.loc
+ src.part1 = null
+ src.part2 = null
+ src.part3 = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding))
+ return
+ if (!( src.status ))
+ src.status = 1
+ bombers += "[key_name(user)] welded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]"
+ message_admins("[key_name_admin(user)] welded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]")
+ user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
+ else
+ if(src)
+ src.status = 0
+ bombers += "[key_name(user)] unwelded a time bomb. Temp: [src.part3.air_contents.temperature-T0C]"
+ user << "\blue The hole has been closed."
+ src.part2.secured = src.status
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/t_i_ptank/attack_self(mob/user as mob)
+
+ src.part1.attack_self(user, 1)
+ playsound(src.loc, 'armbomb.ogg', 100, 1)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/t_i_ptank/receive_signal()
+ //world << "tiptank [src] got signal"
+ for(var/mob/O in hearers(1, null))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ //Foreach goto(19)
+ if ((src.status && prob(90)))
+ //world << "sent ignite() to [src.part3]"
+ src.part3.ignite()
+ else
+ if(!src.status)
+ src.part3.release()
+ return
+
+/obj/item/assembly/t_i_ptank/emp_act(severity)
+ if(istype(part3,/obj/item/weapon/tank/plasma) && prob(100/severity))
+ part3.ignite()
+ ..()
+
+/obj/item/assembly/r_i_ptank/examine()
+ ..()
+ src.part3.examine()
+
+/obj/item/assembly/r_i_ptank/Del()
+
+ //src.part1 = null
+ del(src.part1)
+ //src.part2 = null
+ del(src.part2)
+ //src.part3 = null
+ del(src.part3)
+ ..()
+ return
+
+/obj/item/assembly/r_i_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+
+ if (istype(W, /obj/item/device/analyzer))
+ src.part3.attackby(W, user)
+ return
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/obj/item/assembly/rad_ignite/R = new(get_turf(src.loc))
+ R.part1 = src.part1
+ R.part1.master = R
+ R.part1.loc = R
+ R.part2 = src.part2
+ R.part2.master = R
+ R.part2.loc = R
+ if (user.get_inactive_hand()==src)
+ user.put_in_inactive_hand(part3)
+ else
+ part3.loc = src.loc
+ src.part1 = null
+ src.part2 = null
+ src.part3 = null
+ del(src)
+ return
+ if (!( istype(W, /obj/item/weapon/weldingtool) && W:welding ))
+ return
+ if (!( src.status ))
+ src.status = 1
+ bombers += "[key_name(user)] welded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]"
+ message_admins("[key_name_admin(user)] welded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]")
+ user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
+ else
+ src.status = 0
+ bombers += "[key_name(user)] unwelded a radio bomb. Temp: [src.part3.air_contents.temperature-T0C]"
+ user << "\blue The hole has been closed."
+ src.part2.secured = src.status
+ src.part1.b_stat = !( src.status )
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/r_i_ptank/emp_act(severity)
+ if(istype(part3,/obj/item/weapon/tank/plasma) && prob(100/severity))
+ part3.ignite()
+ ..()
+
+
+/obj/item/clothing/suit/armor/a_i_a_ptank/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ ..()
+ if (istype(W, /obj/item/device/analyzer))
+ src.part4.attackby(W, user)
+ return
+ if ((istype(W, /obj/item/weapon/wrench) && !( src.status )))
+ var/obj/item/assembly/a_i_a/R = new(get_turf(src.loc))
+ R.part1 = src.part1
+ R.part1.master = R
+ R.part1.loc = R
+ R.part2 = src.part2
+ R.part2.master = R
+ R.part2.loc = R
+ R.part3 = src.part3
+ R.part3.master = R
+ R.part3.loc = R
+ if (user.get_inactive_hand()==src)
+ user.put_in_inactive_hand(part4)
+ else
+ part4.loc = src.loc
+ src.part1 = null
+ src.part2 = null
+ src.part3 = null
+ src.part4 = null
+ del(src)
+ return
+ if (( istype(W, /obj/item/weapon/weldingtool) && W:welding))
+ return
+ if (!( src.status ))
+ src.status = 1
+ bombers += "[key_name(user)] welded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]"
+ message_admins("[key_name_admin(user)] welded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]")
+ user.show_message("\blue A pressure hole has been bored to the plasma tank valve. The plasma tank can now be ignited.", 1)
+ else
+ src.status = 0
+ bombers += "[key_name(user)] unwelded a suicide bomb. Temp: [src.part4.air_contents.temperature-T0C]"
+ user << "\blue The hole has been closed."
+// src.part3.status = src.status
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/r_i_ptank/attack_self(mob/user as mob)
+ playsound(src.loc, 'armbomb.ogg', 100, 1)
+ src.part1.attack_self(user, 1)
+ src.add_fingerprint(user)
+ return
+
+/obj/item/assembly/r_i_ptank/receive_signal()
+ //world << "riptank [src] got signal"
+ for(var/mob/O in hearers(1, null))
+ O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ //Foreach goto(19)
+ if ((src.status && prob(90)))
+ //world << "sent ignite() to [src.part3]"
+ src.part3.ignite()
+ else
+ if(!src.status)
+ src.part3.release()
+ return
+
+
+//*****RM
\ No newline at end of file
diff --git a/icons/changelog.html b/icons/changelog.html
index 1f36593c7c..16b0170672 100644
--- a/icons/changelog.html
+++ b/icons/changelog.html
@@ -45,6 +45,15 @@ Stuff which is in development and not yet visible to players or just code relate
(is. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit tho. Thanks. -->
+5 August 2011.
+
+ - Mport updated:
+
+ - The various assemblies should be working now.
+ - Old style bombs and suicide vests temporarily removed.
+
+
+
3 August 2011.
- Superxpdude updated:
diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi
new file mode 100644
index 0000000000..879c4833c5
Binary files /dev/null and b/icons/obj/assemblies/new_assemblies.dmi differ
diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm
index 163d968694..7f44a86d36 100644
--- a/maps/tgstation.2.0.8.dmm
+++ b/maps/tgstation.2.0.8.dmm
@@ -4858,7 +4858,7 @@
"bPv" = (/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"bPw" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact"; level = 2},/obj/machinery/meter,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bPx" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
-"bPy" = (/obj/table,/obj/item/assembly/time_ignite/premade{pixel_x = -3; pixel_y = -2},/obj/item/assembly/time_ignite/premade{pixel_x = 5; pixel_y = -7},/obj/item/assembly/time_ignite/premade{pixel_x = 5; pixel_y = 5},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
+"bPy" = (/obj/table,/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bPz" = (/obj/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/table,/obj/item/device/radio/signaler{pixel_x = 6; pixel_y = 5},/obj/item/device/radio/signaler{pixel_x = 0; pixel_y = 8},/obj/item/device/radio/signaler{pixel_x = -8; pixel_y = 5},/obj/item/device/radio/signaler{pixel_x = -2; pixel_y = -2},/turf/simulated/floor{icon_state = "white"},/area/toxins/lab)
"bPA" = (/obj/grille,/obj/window/reinforced{dir = 4},/obj/window/reinforced{dir = 1},/obj/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple{color = "blue"; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bPB" = (/obj/window/reinforced,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/hor)
@@ -5797,7 +5797,7 @@
"chy" = (/obj/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_mothership)
"chz" = (/obj/table,/obj/item/weapon/gun/projectile/automatic/mini_uzi,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_mothership)
"chA" = (/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_mothership)
-"chB" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership)
+"chB" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "Shuttle Bay Blast Door"},/area/syndicate_mothership)
"chC" = (/obj/stool,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_mothership)
"chD" = (/obj/rack,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile/shotgun/combat,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_mothership)
"chE" = (/obj/rack,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile/silenced,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_mothership)
@@ -5925,7 +5925,7 @@
"cjW" = (/obj/grille,/obj/window/reinforced,/obj/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership)
"cjX" = (/obj/grille,/obj/window/reinforced{dir = 4},/obj/window/reinforced,/obj/window/reinforced{dir = 1},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership)
"cjY" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_mothership)
-"cjZ" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'icons/obj/doors/rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area/syndicate_mothership)
+"cjZ" = (/turf/unsimulated/wall{desc = "Why it no open!"; icon = 'rapid_pdoor.dmi'; icon_state = "pdoor1"; name = "External Airlock"},/area/syndicate_mothership)
"cka" = (/obj/landmark{name = "Nuclear-Closet"},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start)
"ckb" = (/obj/grille,/obj/window/reinforced,/obj/window/reinforced{dir = 1},/obj/window/reinforced{dir = 8},/turf/unsimulated/floor{name = "plating"},/area/syndicate_mothership)
"ckc" = (/obj/stool/chair{dir = 4},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start)
@@ -6889,7 +6889,7 @@
"cCy" = (/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station)
"cCz" = (/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station)
"cCA" = (/obj/item/weapon/spacecash,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/planet/clown)
-"cCB" = (/mob/living/carbon/metroid{desc = "A tamed other thing. Very smart looking."; icon = 'icons/obj/otherthing.dmi'; icon_state = "otherthing"; name = "Tamed Otherthing"; toxloss = 0; voice_message = "gurgles"; voice_name = "otherthing"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"cCB" = (/mob/living/carbon/metroid{desc = "A tamed other thing. Very smart looking."; icon = 'otherthing.dmi'; icon_state = "otherthing"; name = "Tamed Otherthing"; toxloss = 0; voice_message = "gurgles"; voice_name = "otherthing"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"cCC" = (/obj/grille,/obj/window/reinforced,/obj/window/reinforced{dir = 4},/obj/window/reinforced{dir = 8},/turf/unsimulated/floor,/area/wizard_station)
"cCD" = (/obj/stool,/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/wizard_station)
"cCE" = (/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
diff --git a/tgstation.dme b/tgstation.dme
index 8a379ee320..3543c78caf 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -23,7 +23,6 @@
#define FILE_DIR "code/defines/mob/living/silicon"
#define FILE_DIR "code/defines/obj"
#define FILE_DIR "code/defines/obj/clothing"
-#define FILE_DIR "code/defines/obj/spawner"
#define FILE_DIR "code/defines/procs"
#define FILE_DIR "code/FEA"
#define FILE_DIR "code/game"
@@ -69,7 +68,6 @@
#define FILE_DIR "code/game/objects/items/weapons"
#define FILE_DIR "code/game/objects/radio"
#define FILE_DIR "code/game/objects/secstorage"
-#define FILE_DIR "code/game/objects/spawners"
#define FILE_DIR "code/game/objects/stacks"
#define FILE_DIR "code/game/objects/storage"
#define FILE_DIR "code/game/verbs"
@@ -124,6 +122,7 @@
#define FILE_DIR "icons/misc"
#define FILE_DIR "icons/mob"
#define FILE_DIR "icons/obj"
+#define FILE_DIR "icons/obj/assemblies"
#define FILE_DIR "icons/obj/atmospherics"
#define FILE_DIR "icons/obj/clothing"
#define FILE_DIR "icons/obj/doors"
@@ -250,7 +249,6 @@
#include "code\defines\mob\living\silicon\pai.dm"
#include "code\defines\mob\living\silicon\robot.dm"
#include "code\defines\mob\living\silicon\silicon.dm"
-#include "code\defines\obj\assemblies.dm"
#include "code\defines\obj\closet.dm"
#include "code\defines\obj\clothing.dm"
#include "code\defines\obj\computer.dm"
@@ -277,7 +275,6 @@
#include "code\defines\obj\clothing\mask.dm"
#include "code\defines\obj\clothing\shoes.dm"
#include "code\defines\obj\clothing\suit.dm"
-#include "code\defines\obj\spawner\bomb.dm"
#include "code\defines\procs\AStar.dm"
#include "code\defines\procs\captain_announce.dm"
#include "code\defines\procs\church_name.dm"
@@ -476,10 +473,9 @@
#include "code\game\mecha\working\firefighter.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"
-#include "code\game\objects\assemblies.dm"
#include "code\game\objects\biomass.dm"
#include "code\game\objects\blood.dm"
-#include "code\game\objects\bomb.dm"
+#include "code\game\objects\bombspawner.dm"
#include "code\game\objects\cleaner.dm"
#include "code\game\objects\closets.dm"
#include "code\game\objects\displaycase.dm"
@@ -506,6 +502,7 @@
#include "code\game\objects\tables_racks.dm"
#include "code\game\objects\tank.dm"
#include "code\game\objects\toys.dm"
+#include "code\game\objects\transfer_valve.dm"
#include "code\game\objects\traps.dm"
#include "code\game\objects\weapons.dm"
#include "code\game\objects\window.dm"
@@ -543,22 +540,18 @@
#include "code\game\objects\devices\chameleonproj.dm"
#include "code\game\objects\devices\flash.dm"
#include "code\game\objects\devices\flashlight.dm"
-#include "code\game\objects\devices\igniter.dm"
#include "code\game\objects\devices\infra_sensor.dm"
#include "code\game\objects\devices\multitool.dm"
#include "code\game\objects\devices\paicard.dm"
#include "code\game\objects\devices\powersink.dm"
-#include "code\game\objects\devices\proxy_sensor.dm"
#include "code\game\objects\devices\scanners.dm"
#include "code\game\objects\devices\shields.dm"
#include "code\game\objects\devices\taperecorder.dm"
-#include "code\game\objects\devices\timer.dm"
#include "code\game\objects\devices\PDA\cart.dm"
#include "code\game\objects\devices\PDA\PDA.dm"
#include "code\game\objects\devices\PDA\radio.dm"
#include "code\game\objects\devices\PDA\uplink.dm"
#include "code\game\objects\items\apc_frame.dm"
-#include "code\game\objects\items\assemblies.dm"
#include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\candle.dm"
#include "code\game\objects\items\clothing.dm"
@@ -566,6 +559,7 @@
#include "code\game\objects\items\helper_procs.dm"
#include "code\game\objects\items\item.dm"
#include "code\game\objects\items\robot_parts.dm"
+#include "code\game\objects\items\shock_kit.dm"
#include "code\game\objects\items\trash.dm"
#include "code\game\objects\items\weapons\AI_modules.dm"
#include "code\game\objects\items\weapons\cameras.dm"
@@ -605,7 +599,6 @@
#include "code\game\objects\secstorage\sbriefcase.dm"
#include "code\game\objects\secstorage\secstorage.dm"
#include "code\game\objects\secstorage\ssafe.dm"
-#include "code\game\objects\spawners\bomb.dm"
#include "code\game\objects\stacks\glass.dm"
#include "code\game\objects\stacks\metal.dm"
#include "code\game\objects\stacks\minerals.dm"
@@ -657,6 +650,12 @@
#include "code\modules\admin\verbs\ticklag.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\assembly\assembly.dm"
+#include "code\modules\assembly\holder.dm"
+#include "code\modules\assembly\igniter.dm"
+#include "code\modules\assembly\infrared.dm"
+#include "code\modules\assembly\proximity.dm"
+#include "code\modules\assembly\signaler.dm"
+#include "code\modules\assembly\timer.dm"
#include "code\modules\chemical\Chemistry-Holder.dm"
#include "code\modules\chemical\Chemistry-Machinery.dm"
#include "code\modules\chemical\Chemistry-Reagents.dm"