From 577669920f1c8d1fdfe1fc2d1f7d82cd99cc6c15 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Tue, 24 Apr 2012 20:28:38 +0100 Subject: [PATCH] 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 --- code/defines/procs/gamehelpers.dm | 202 ++++++++++++++++++++++-------- code/modules/mob/living/say.dm | 24 +++- 2 files changed, 170 insertions(+), 56 deletions(-) diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm index dd97fea6c59..fcd244a61f6 100644 --- a/code/defines/procs/gamehelpers.dm +++ b/code/defines/procs/gamehelpers.dm @@ -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= 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