Merge pull request #14905 from Razharas/Assembly

Some assembly requaired
This commit is contained in:
duncathan salt
2016-01-27 08:03:00 -06:00
20 changed files with 178 additions and 56 deletions
+32
View File
@@ -1146,3 +1146,35 @@ B --><-- A
for(var/atom/location = A.loc, location, location = location.loc)
if(location == src)
return 1
proc/add_to_proximity_list(atom/A, range)
var/turf/T = get_turf(A)
var/list/L = block(locate(T.x - range, T.y - range, T.z), locate(T.x + range, T.y + range, T.z))
for(var/B in L)
var/turf/C = B
C.proximity_checkers |= A
return L
proc/remove_from_proximity_list(atom/A, range)
var/turf/T = get_turf(A)
var/list/L = block(locate(T.x - range, T.y - range, T.z), locate(T.x + range, T.y + range, T.z))
for(var/B in L)
var/turf/C = B
C.proximity_checkers.Remove(A)
proc/shift_proximity(atom/checker, atom/A, range, atom/B, newrange)
var/turf/T = get_turf(A)
var/turf/Q = get_turf(B)
if(T == Q && range == newrange)
return 0
var/list/L = block(locate(T.x - range, T.y - range, T.z), locate(T.x + range, T.y + range, T.z))
var/list/M = block(locate(Q.x - newrange, Q.y - newrange, Q.z), locate(Q.x + newrange, Q.y + newrange, Q.z))
var/list/N = L - M
var/list/O = M - L
for(var/C in N)
var/turf/D = C
D.proximity_checkers.Remove(checker)
for(var/E in O)
var/turf/F = E
F.proximity_checkers |= checker
return 1
+10
View File
@@ -5,6 +5,16 @@
var/area/ai_monitored/area_motion = null
var/alarm_delay = 30 // Don't forget, there's another 3 seconds in queueAlarm()
/obj/machinery/camera/New()
add_to_proximity_list(src, 1) //1 was default of everything
/obj/machinery/camera/Move()
remove_from_proximity_list(src, 1)
..()
/obj/machinery/camera/Destroy()
remove_from_proximity_list(src, 1)
..()
/obj/machinery/camera/process()
// motion camera event loop
-5
View File
@@ -1111,11 +1111,6 @@ var/list/airlock_overlays = list()
//Airlock is passable if it is open (!density), bot has access, and is not bolted shut or powered off)
return !density || (check_access(ID) && !locked && hasPower())
/obj/machinery/door/airlock/HasProximity(atom/movable/AM as mob|obj)
for (var/obj/A in contents)
A.HasProximity(AM)
return
/obj/machinery/door/airlock/emag_act(mob/user)
if(!operating && density && hasPower() && !emagged)
operating = 1
+6
View File
@@ -26,6 +26,10 @@
..() // ..() is EXTREMELY IMPORTANT, never forget to add it
bulb = new /obj/item/device/assembly/flash/handheld(src)
/obj/machinery/flasher/Move()
remove_from_proximity_list(src, range)
..()
/obj/machinery/flasher/power_change()
if (powered() && anchored && bulb)
stat &= ~NOPOWER
@@ -127,11 +131,13 @@
overlays += "[base_state]-s"
anchored = 1
power_change()
add_to_proximity_list(src, range)
else
user << "<span class='notice'>[src] can now be moved.</span>"
overlays.Cut()
anchored = 0
power_change()
remove_from_proximity_list(src, range)
else
..()
+8 -1
View File
@@ -318,6 +318,9 @@
spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME))
Grow()
/obj/structure/alien/egg/Destroy()
remove_from_proximity_list(src, 1)
..()
/obj/structure/alien/egg/attack_paw(mob/living/user)
return attack_hand(user)
@@ -348,10 +351,11 @@
/obj/structure/alien/egg/proc/Grow()
icon_state = "egg"
status = GROWN
add_to_proximity_list(src, 1)
/obj/structure/alien/egg/proc/Burst(kill = 1) //drops and kills the hugger if any is remaining
if(status == GROWN || status == GROWING)
remove_from_proximity_list(src, 1)
icon_state = "egg_hatched"
flick("egg_opening", src)
status = BURSTING
@@ -368,6 +372,9 @@
child.Attach(M)
break
/obj/structure/alien/egg/Move()
remove_from_proximity_list(src, 1)
..()
/obj/structure/alien/egg/bullet_act(obj/item/projectile/Proj)
health -= Proj.damage
@@ -60,11 +60,6 @@
attacher = user
return
/obj/item/device/transfer_valve/HasProximity(atom/movable/AM as mob|obj)
if(!attached_device) return
attached_device.HasProximity(AM)
return
/obj/item/device/transfer_valve/attack_self(mob/user)
user.set_machine(src)
var/dat = {"<B> Valve properties: </B>
@@ -143,9 +143,6 @@
/obj/item/weapon/grenade/chem_grenade/receive_signal()
prime()
/obj/item/weapon/grenade/chem_grenade/HasProximity(atom/movable/AM)
if(nadeassembly)
nadeassembly.HasProximity(AM)
/obj/item/weapon/grenade/chem_grenade/Crossed(atom/movable/AM)
if(nadeassembly)
@@ -181,3 +181,12 @@
stunforce = 5
hitcost = 2500
slot_flags = null
var/obj/item/device/assembly/igniter/sparkler = 0
/obj/item/weapon/melee/baton/cattleprod/New()
..()
sparkler = new (src)
/obj/item/weapon/melee/baton/cattleprod/baton_stun()
if(sparkler.activate())
..()
+2 -2
View File
@@ -117,7 +117,7 @@
qdel(I)
qdel(src)
else if(istype(I, /obj/item/weapon/wirecutters) && !(I.flags & NODROP))
else if(istype(I, /obj/item/device/assembly/igniter) && !(I.flags & NODROP))
var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
if(!remove_item_from_storage(user))
@@ -125,7 +125,7 @@
user.unEquip(I)
user.put_in_hands(P)
user << "<span class='notice'>You fasten the wirecutters to the top of the rod with the cable, prongs outward.</span>"
user << "<span class='notice'>You fasten [I] to the top of the rod with the cable.</span>"
qdel(I)
qdel(src)
+5 -6
View File
@@ -26,6 +26,8 @@
flags = 0
var/list/proximity_checkers = list()
var/image/obscured //camerachunks
/turf/New()
..()
@@ -91,12 +93,9 @@
return 1 //Nothing found to block so return success!
/turf/Entered(atom/movable/M)
var/loopsanity = 100
for(var/atom/A in range(1))
if(loopsanity == 0)
break
loopsanity--
A.HasProximity(M, 1)
for(var/A in proximity_checkers)
var/atom/B = A
B.HasProximity(M)
/turf/proc/is_plasteel_floor()
return 0
+4
View File
@@ -25,6 +25,10 @@
var/const/WIRE_RADIO_RECEIVE = 8 //Allows Pulsed(1) to call Activate()
var/const/WIRE_RADIO_PULSE = 16 //Allows Pulse(1) to send a radio message
/obj/item/device/assembly/proc/on_attach()
/obj/item/device/assembly/proc/on_detach()
/obj/item/device/assembly/proc/holder_movement() //Called when the holder is moved
return
-4
View File
@@ -69,10 +69,6 @@
else
bombtank.release()
/obj/item/device/onetankbomb/HasProximity(atom/movable/AM as mob|obj)
if(bombassembly)
bombassembly.HasProximity(AM)
/obj/item/device/onetankbomb/Crossed(atom/movable/AM as mob|obj) //for mousetraps
if(bombassembly)
bombassembly.Crossed(AM)
-7
View File
@@ -55,13 +55,6 @@
if(master)
master.update_icon()
/obj/item/device/assembly_holder/HasProximity(atom/movable/AM as mob|obj)
if(a_left)
a_left.HasProximity(AM)
if(a_right)
a_right.HasProximity(AM)
/obj/item/device/assembly_holder/Crossed(atom/movable/AM as mob|obj)
if(a_left)
a_left.Crossed(AM)
+42 -17
View File
@@ -9,6 +9,9 @@
var/scanning = 0
var/timing = 0
var/time = 10
var/sensitivity = 1
var/atom/oldloc
var/list/turfs_around = list()
/obj/item/device/assembly/prox_sensor/proc/toggle_scan()
@@ -19,12 +22,19 @@
/obj/item/device/assembly/prox_sensor/New()
..()
SSobj.processing |= src
oldloc = loc
/obj/item/device/assembly/prox_sensor/describe()
if(timing)
return "<span class='notice'>The proximity sensor is arming.</span>"
return "The proximity sensor is [scanning?"armed":"disarmed"]."
/obj/item/device/assembly/prox_sensor/on_attach(datum/wires/w)
handle_move(w.holder)
/obj/item/device/assembly/prox_sensor/on_detach(datum/wires/w)
handle_move(w.holder.loc)
/obj/item/device/assembly/prox_sensor/activate()
if(!..()) return 0//Cooldown check
timing = !timing
@@ -34,12 +44,9 @@
/obj/item/device/assembly/prox_sensor/toggle_secure()
secured = !secured
if(secured)
SSobj.processing |= src
else
if(!secured)
scanning = 0
timing = 0
SSobj.processing.Remove(src)
update_icon()
return secured
@@ -50,7 +57,7 @@
/obj/item/device/assembly/prox_sensor/sense()
if((!secured)||(!scanning)||(cooldown > 0)) return 0
if((!secured)||(cooldown > 0)) return 0
pulse(0)
audible_message("\icon[src] *beep* *beep*", null, 3)
cooldown = 2
@@ -63,21 +70,31 @@
time--
if(time <= 0)
timing = 0
toggle_scan()
toggle_scan(1)
time = initial(time)
handle_move(get_turf(loc))
/obj/item/device/assembly/prox_sensor/dropped()
spawn(0)
sense()
if(scanning)
spawn(0)
sense()
/obj/item/device/assembly/prox_sensor/toggle_scan()
/obj/item/device/assembly/prox_sensor/toggle_scan(scan)
if(!secured) return 0
scanning = !scanning
scanning = scan
if(scanning)
add_to_proximity_list(src, sensitivity)
else
remove_from_proximity_list(src, sensitivity)
oldloc = get_turf(loc)
update_icon()
/obj/item/device/assembly/prox_sensor/proc/sensitivity_change(value)
var/sense = min(max(sensitivity + value, 0), 5)
if(scanning)
shift_proximity(src, oldloc, sensitivity, loc, sense)
sensitivity = sense
/obj/item/device/assembly/prox_sensor/update_icon()
overlays.Cut()
@@ -92,11 +109,15 @@
holder.update_icon()
return
/obj/item/device/assembly/prox_sensor/proc/handle_move(atom/newloc)
if(scanning)
if(shift_proximity(src, oldloc, sensitivity, newloc, sensitivity))
sense()
oldloc = newloc
/obj/item/device/assembly/prox_sensor/Move()
/obj/item/device/assembly/prox_sensor/Move(newloc)
..()
sense()
return
handle_move(newloc)
/obj/item/device/assembly/prox_sensor/interact(mob/user)//TODO: Change this to the wires thingy
@@ -104,7 +125,8 @@
var/second = time % 60
var/minute = (time - second) / 60
var/dat = "<TT><B>Proximity Sensor</B>\n[(timing ? "<A href='?src=\ref[src];time=0'>Arming</A>" : "<A href='?src=\ref[src];time=1'>Not Arming</A>")] [minute]:[second]\n<A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT>"
dat += "<BR><A href='?src=\ref[src];scanning=1'>[scanning?"Armed":"Unarmed"]</A> (Movement sensor active when armed!)"
dat += "<BR><A href='?src=\ref[src];scanning=[scanning?"0'>Armed":"1'>Unarmed"]</A> (Movement sensor active when armed!)"
dat += "<BR>Detection range: <A href='?src=\ref[src];sense=down'>-</A> [sensitivity] <A href='?src=\ref[src];sense=up'>+</A>"
dat += "<BR><BR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>"
user << browse(dat, "window=prox")
@@ -119,8 +141,11 @@
onclose(usr, "prox")
return
if(href_list["sense"])
sensitivity_change(((href_list["sense"] == "up") ? 1 : -1))
if(href_list["scanning"])
toggle_scan()
toggle_scan(text2num(href_list["scanning"]))
if(href_list["time"])
timing = text2num(href_list["time"])
+9 -1
View File
@@ -8,6 +8,8 @@
var/timing = 0
var/time = 5
var/saved_time = 5
var/loop = 0
/obj/item/device/assembly/timer/New()
@@ -46,6 +48,8 @@
cooldown = 2
spawn(10)
process_cooldown()
if(loop)
timing = 1
update_icon()
@@ -55,7 +59,7 @@
if(time <= 0)
timing = 0
timer_end()
time = initial(time)
time = saved_time
/obj/item/device/assembly/timer/update_icon()
@@ -73,6 +77,7 @@
var/second = time % 60
var/minute = (time - second) / 60
var/dat = "<TT><B>Timing Unit</B>\n[(timing ? "<A href='?src=\ref[src];time=0'>Timing</A>" : "<A href='?src=\ref[src];time=1'>Not Timing</A>")] [minute]:[second]\n<A href='?src=\ref[src];tp=-30'>-</A> <A href='?src=\ref[src];tp=-1'>-</A> <A href='?src=\ref[src];tp=1'>+</A> <A href='?src=\ref[src];tp=30'>+</A>\n</TT>"
dat += "<BR><BR><A href='?src=\ref[src];repeat=[(loop ? "0'>Stop repeating" : "1'>Set to repeat")]</A>"
dat += "<BR><BR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat += "<BR><BR><A href='?src=\ref[src];close=1'>Close</A>"
var/datum/browser/popup = new(user, "timer", name)
@@ -95,11 +100,14 @@
bombers += timer_message
log_game("[key_name(usr)] activated [src] attachment for [loc]")
update_icon()
if(href_list["repeat"])
loop = text2num(href_list["repeat"])
if(href_list["tp"])
var/tp = text2num(href_list["tp"])
time += tp
time = min(max(round(time), 1), 600)
saved_time = time
if(href_list["close"])
usr << browse(null, "window=timer")
+50 -4
View File
@@ -11,20 +11,66 @@
verb_exclaim = "beeps"
var/listening = 0
var/recorded = "" //the activation message
var/mode = 1
var/global/list/modes = list("inclusive",
"exclusive",
"recognizer",
"voice sensor")
/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
if(speaker == src)
return
if(listening && !radio_freq)
recorded = raw_message
listening = 0
say("Activation message is '[recorded]'.")
record_speech(speaker, raw_message)
else
if(findtextEx(raw_message, recorded))
if(check_activation(speaker, raw_message))
spawn(10)
pulse(0)
/obj/item/device/assembly/voice/proc/record_speech(atom/movable/speaker, raw_message)
switch(mode)
if(1)
recorded = raw_message
listening = 0
say("Activation message is '[recorded]'.")
if(2)
recorded = raw_message
listening = 0
say("Activation message is '[recorded]'.")
if(3)
recorded = speaker.GetVoice()
listening = 0
say("Your voice pattern is saved.")
if(4)
if(length(raw_message))
spawn(10)
pulse(0)
/obj/item/device/assembly/voice/proc/check_activation(atom/movable/speaker, raw_message)
. = 0
switch(mode)
if(1)
if(findtextEx(raw_message, recorded))
. = 1
if(2)
if(raw_message == recorded)
. = 1
if(3)
if(speaker.GetVoice() == recorded)
. = 1
if(4)
if(length(raw_message))
. = 1
/obj/item/device/assembly/voice/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/device/multitool))
mode %= modes.len
mode++
user << "You set [src] into a [modes[mode]] mode."
listening = 0
recorded = ""
/obj/item/device/assembly/voice/activate()
if(secured)
if(!holder)
+1 -1
View File
@@ -63,7 +63,7 @@
result = /obj/item/weapon/melee/baton/cattleprod
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
/obj/item/stack/rods = 1,
/obj/item/weapon/wirecutters = 1,
/obj/item/device/assembly/igniter = 1,
/obj/item/weapon/stock_parts/cell = 1)
time = 80
parts = list(/obj/item/weapon/stock_parts/cell = 1)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB