TG: Borg radios now work while they're recharging

MMIs/pAIs/lockers in the dark can now hear.  This was done by changing the area
check for hearing to a range instead of view, and then doing a line of sight
calculation for each mob that can't hear naturally and checking if it's clear.
Revision: r3180
Author: 	 VivianFoxfoot
This commit is contained in:
Ren Erthilo
2012-04-24 20:28:38 +01:00
parent b4117291f8
commit 577669920f
2 changed files with 170 additions and 56 deletions
+148 -54
View File
@@ -101,60 +101,6 @@
//turfs += centerturf
return turfs
/proc/get_mobs_in_view(var/R, var/atom/source)
// Returns a list of mobs in range of R from source. Used in radio and say code.
var/turf/T = get_turf(source)
var/list/hear = hearers(R, T)
var/list/V = view(R, T)
// Search for closets:
for(var/obj/structure/closet/C in V)
for(var/mob/M in C.contents)
if(M.client)
hear += M
// Cryos:
for(var/obj/machinery/atmospherics/unary/cryo_cell/C in V)
if(C.occupant)
if(C.occupant.client)
hear += C.occupant
// Intelicards
for(var/obj/item/device/aicard/C in V)
for(var/mob/living/silicon/ai/M in C)
if(M.client)
hear += M
// Brains/MMIs/pAIs
for(var/mob/living/carbon/brain/C in world)
if(get_turf(C) in V)
hear += C
for(var/mob/living/silicon/pai/C in world)
if(get_turf(C) in V)
hear += C
// Personal AIs
for(var/obj/item/device/paicard/C in V)
if(C.pai)
if(C.pai.client)
hear += C.pai
// Exosuits
for(var/obj/mecha/C in V)
if(C.occupant)
if(C.occupant.client)
hear += C.occupant
// Disposal Machines
for(var/obj/machinery/disposal/C in V)
for(var/mob/M in C.contents)
if(M.client)
hear += M
return hear
/proc/get_dist_euclidian(atom/Loc1 as turf|mob|obj,atom/Loc2 as turf|mob|obj)
var/dx = Loc1.x - Loc2.x
var/dy = Loc1.y - Loc2.y
@@ -189,6 +135,154 @@
turfs += T
return turfs
/proc/get_mobs_in_view(var/R, var/atom/source)
// Returns a list of mobs in range of R from source. Used in radio and say code.
var/turf/T = get_turf(source)
var/list/hear = hearers(R, T)
var/list/V = range(R, T)
// Search for closets:
for(var/obj/structure/closet/C in V)
for(var/mob/M in C.contents)
if(isInSight(source,C))
if(M.client)
hear += M
// Cryos:
for(var/obj/machinery/atmospherics/unary/cryo_cell/C in V)
if(C.occupant)
if(isInSight(source,C))
if(C.occupant.client)
hear += C.occupant
// Intelicards
for(var/obj/item/device/aicard/C in V)
for(var/mob/living/silicon/ai/M in C)
if(isInSight(source,C))
if(M.client)
hear += M
// Kind of a hacky fix, but should fix most cases without undo issues.
for(var/mob/M as mob in V)
for(var/obj/item/device/aicard/C in M.contents)
for(var/mob/living/silicon/ai/A in C)
if(isInSight(source,A))
if(A.client)
hear += A
// Soulstones
for(var/obj/item/device/soulstone/C in V)
for(var/mob/living/simple_animal/shade/M in C)
if(isInSight(source,C))
if(M.client)
hear += M
// Kind of a hacky fix, but should fix most cases without undo issues.
for(var/mob/M as mob in V)
for(var/obj/item/device/soulstone/C in M.contents)
for(var/mob/living/simple_animal/shade/A in C)
if(isInSight(source,A))
if(A.client)
hear += A
// Brains/MMIs/pAIs
for(var/mob/living/carbon/brain/C in world)
if(get_turf(C) in V)
if(isInSight(source,C))
hear += C
for(var/mob/living/silicon/pai/C in world)
if(get_turf(C) in V)
if(isInSight(source,C))
hear += C
/* -- Handled above. WHY IS THIS HERE? WHYYYYYYY
// Personal AIs
for(var/obj/item/device/paicard/C in V)
if(C.pai)
if(isInSight(source,C))
if(C.pai.client)
hear += C.pai
*/
// Exosuits
for(var/obj/mecha/C in V)
if(C.occupant)
if(isInSight(source,C))
if(C.occupant.client)
hear += C.occupant
// Disposal Machines
for(var/obj/machinery/disposal/C in V)
for(var/mob/M in C.contents)
if(isInSight(source,C))
if(M.client)
hear += M
//Borg rechargers
for(var/obj/machinery/recharge_station/C in V)
if(C.occupant)
if(isInSight(source,C))
if(C.occupant.client)
hear += C.occupant
for(var/obj/item/device/radio/theradio in V)
if(isInSight(source,theradio))
hear += theradio
return hear
#define SIGN(X) ((X<0)?-1:1)
proc
inLineOfSight(X1,Y1,X2,Y2,Z=1,PX1=16.5,PY1=16.5,PX2=16.5,PY2=16.5)
var/turf/T
if(X1==X2)
if(Y1==Y2)
return 1 //Light cannot be blocked on same tile
else
var/s = SIGN(Y2-Y1)
Y1+=s
while(Y1!=Y2)
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
Y1+=s
else
var
m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1))
b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles
signX = SIGN(X2-X1)
signY = SIGN(Y2-Y1)
if(X1<X2)
b+=m
while(X1!=X2 || Y1!=Y2)
if(round(m*X1+b-Y1))
Y1+=signY //Line exits tile vertically
else
X1+=signX //Line exits tile horizontally
T=locate(X1,Y1,Z)
if(T.opacity)
return 0
return 1
proc/isInSight(var/atom/A, var/atom/B)
var/turf/Aturf = get_turf(A)
var/turf/Bturf = get_turf(B)
if(!Aturf || !Bturf)
return 0
if(inLineOfSight(Aturf.x,Aturf.y, Bturf.x,Bturf.y,Aturf.z))
return 1
else
return 0
proc/check_can_reach(atom/user, atom/target)
if(!in_range(user,target))
return 0
+22 -2
View File
@@ -32,8 +32,6 @@
if (!message)
return
log_say("[name]/[key] : [message]")
if (length(message) >= 1)
if (miming && copytext(message, 1, 2) != "*")
return
@@ -315,8 +313,11 @@
listening += src
*/
/* Handing this section over to get_mobs_in_view which was written with radiocode update
var/turf/T = get_turf(src)
listening = hearers(message_range, T)
for (var/O in listening)
world << O
var/list/V = view(message_range, T)
var/list/W = V
@@ -335,6 +336,21 @@
if (M.client && M.client.ghost_ears)
listening|=M
*/
listening = get_mobs_in_view(message_range, src)
for(var/mob/M in world)
if (!M.client)
continue //skip monkeys and leavers
if (istype(M, /mob/new_player))
continue
if(M.stat == 2 && M.client.ghost_ears)
listening|=M
var/turf/T = get_turf(src)
var/list/V = view(message_range, T)
var/list/W = V
var/list/eavesdroppers = get_mobs_in_view(7, src)
for(var/mob/M in listening)
eavesdroppers.Remove(M)
@@ -368,6 +384,8 @@
spawn(0)
O.hear_talk(src, message)
var/list/heard_a = list() // understood us
var/list/heard_b = list() // didn't understand us
@@ -520,6 +538,8 @@
M << speech_bubble
spawn(30) del(speech_bubble)
log_say("[name]/[key] : [message]")
/obj/effect/speech_bubble