Merge branch 'master' into cargocratetglass
This commit is contained in:
@@ -222,18 +222,23 @@
|
||||
|
||||
/obj/effect/vr_clean_master/Initialize()
|
||||
. = ..()
|
||||
vr_area = get_area(src)
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
vr_area = get_base_area(src)
|
||||
if(!vr_area)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES, TIMER_LOOP)
|
||||
|
||||
/obj/effect/vr_clean_master/proc/clean_up()
|
||||
if (vr_area)
|
||||
for (var/obj/item/ammo_casing/casing in vr_area)
|
||||
qdel(casing)
|
||||
for(var/obj/effect/decal/cleanable/C in vr_area)
|
||||
qdel(C)
|
||||
for (var/A in corpse_party)
|
||||
var/mob/M = A
|
||||
if(M && M.stat == DEAD && get_area(M) == vr_area)
|
||||
qdel(M)
|
||||
corpse_party -= M
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
if (!vr_area)
|
||||
qdel(src)
|
||||
return
|
||||
var/list/contents = get_sub_areas_contents(src)
|
||||
for (var/obj/item/ammo_casing/casing in contents)
|
||||
qdel(casing)
|
||||
for(var/obj/effect/decal/cleanable/C in contents)
|
||||
qdel(C)
|
||||
for (var/A in corpse_party)
|
||||
var/mob/M = A
|
||||
if(!QDELETED(M) && (M in contents) && M.stat == DEAD)
|
||||
qdel(M)
|
||||
corpse_party -= M
|
||||
addtimer(CALLBACK(src, .proc/clean_up), 3 MINUTES)
|
||||
|
||||
@@ -845,7 +845,11 @@
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_LAVALAND];jobban4=[REF(M)]'><font color=red>Lavaland</font></a></td>"
|
||||
else
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_LAVALAND];jobban4=[REF(M)]'>Lavaland</a></td>"
|
||||
|
||||
// Ghost cafe
|
||||
if(jobban_isbanned(M,ROLE_GHOSTCAFE))
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_GHOSTCAFE];jobban4=[REF(M)]'><font color=red>Lavaland</font></a></td>"
|
||||
else
|
||||
dat += "<td width='20%'><a href='?src=[REF(src)];[HrefToken()];jobban3=[ROLE_GHOSTCAFE];jobban4=[REF(M)]'>Lavaland</a></td>"
|
||||
dat += "</tr></table>"
|
||||
|
||||
//Antagonist (Orange)
|
||||
@@ -2878,6 +2882,8 @@
|
||||
return
|
||||
if(SSdbcore.Connect())
|
||||
var/datum/DBQuery/query_get_mentor = SSdbcore.NewQuery("SELECT id FROM [format_table_name("mentor")] WHERE ckey = '[ckey]'")
|
||||
if(!query_get_mentor.warn_execute())
|
||||
return
|
||||
if(query_get_mentor.NextRow())
|
||||
to_chat(usr, "<span class='danger'>[ckey] is already a mentor.</span>")
|
||||
return
|
||||
|
||||
@@ -541,7 +541,9 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
var/list/areas_all = list()
|
||||
var/list/areas_with_APC = list()
|
||||
var/list/areas_with_multiple_APCs = list()
|
||||
var/list/sub_areas_APC = list()
|
||||
var/list/areas_with_air_alarm = list()
|
||||
var/list/sub_areas_air_alarm = list()
|
||||
var/list/areas_with_RC = list()
|
||||
var/list/areas_with_light = list()
|
||||
var/list/areas_with_LS = list()
|
||||
@@ -578,6 +580,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
if(!A)
|
||||
dat += "Skipped over [APC] in invalid location, [APC.loc]."
|
||||
continue
|
||||
LAZYSET(sub_areas_APC, A.type, get_sub_areas(A, FALSE))
|
||||
if(!(A.type in areas_with_APC))
|
||||
areas_with_APC.Add(A.type)
|
||||
else if(A.type in areas_all)
|
||||
@@ -585,10 +588,11 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
CHECK_TICK
|
||||
|
||||
for(var/obj/machinery/airalarm/AA in GLOB.machines)
|
||||
var/area/A = get_area(AA)
|
||||
var/area/A = get_base_area(AA)
|
||||
if(!A) //Make sure the target isn't inside an object, which results in runtimes.
|
||||
dat += "Skipped over [AA] in invalid location, [AA.loc].<br>"
|
||||
continue
|
||||
LAZYSET(sub_areas_air_alarm, A.type, get_sub_areas(A, FALSE))
|
||||
if(!(A.type in areas_with_air_alarm))
|
||||
areas_with_air_alarm.Add(A.type)
|
||||
CHECK_TICK
|
||||
@@ -638,8 +642,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
areas_with_camera.Add(A.type)
|
||||
CHECK_TICK
|
||||
|
||||
var/list/areas_without_APC = areas_all - areas_with_APC
|
||||
var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm
|
||||
var/list/areas_without_APC = areas_all - (areas_with_APC + flatten_list(sub_areas_APC))
|
||||
var/list/areas_without_air_alarm = areas_all - (areas_with_air_alarm + flatten_list(sub_areas_air_alarm))
|
||||
var/list/areas_without_RC = areas_all - areas_with_RC
|
||||
var/list/areas_without_light = areas_all - areas_with_light
|
||||
var/list/areas_without_LS = areas_all - areas_with_LS
|
||||
@@ -656,12 +660,18 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
dat += "<h1>AREAS WITH MULTIPLE APCS:</h1>"
|
||||
for(var/areatype in areas_with_multiple_APCs)
|
||||
dat += "[areatype]<br>"
|
||||
if(sub_areas_APC[areatype])
|
||||
dat += " SUB-AREAS:<br> "
|
||||
dat += jointext(sub_areas_APC[areatype], "<br> ")
|
||||
CHECK_TICK
|
||||
|
||||
if(areas_without_air_alarm.len)
|
||||
dat += "<h1>AREAS WITHOUT AN AIR ALARM:</h1>"
|
||||
for(var/areatype in areas_without_air_alarm)
|
||||
dat += "[areatype]<br>"
|
||||
if(sub_areas_air_alarm[areatype])
|
||||
dat += " SUB-AREAS:<br> "
|
||||
dat += jointext(sub_areas_air_alarm[areatype], "<br> ")
|
||||
CHECK_TICK
|
||||
|
||||
if(areas_without_RC.len)
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
|
||||
|
||||
if(name == initial(name))
|
||||
name = "[get_area_name(src)] Air Alarm"
|
||||
name = "[get_area_name(src, get_base_area = TRUE)] Air Alarm"
|
||||
|
||||
power_change()
|
||||
set_frequency(frequency)
|
||||
@@ -250,7 +250,7 @@
|
||||
"danger_level" = danger_level,
|
||||
)
|
||||
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
data["atmos_alarm"] = A.atmosalm
|
||||
data["fire_alarm"] = A.fire
|
||||
|
||||
@@ -386,7 +386,7 @@
|
||||
send_signal(device_id, list("checks" = text2num(params["val"])^2), usr)
|
||||
. = TRUE
|
||||
if("set_external_pressure", "set_internal_pressure")
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
var/target = input("New target pressure:", name, A.air_vent_info[device_id][(action == "set_external_pressure" ? "external" : "internal")]) as num|null
|
||||
if(!isnull(target) && !..())
|
||||
send_signal(device_id, list("[action]" = target), usr)
|
||||
@@ -420,12 +420,12 @@
|
||||
apply_mode()
|
||||
. = TRUE
|
||||
if("alarm")
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(A.atmosalert(2, src))
|
||||
post_alert(2)
|
||||
. = TRUE
|
||||
if("reset")
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(A.atmosalert(0, src))
|
||||
post_alert(0)
|
||||
. = TRUE
|
||||
@@ -456,7 +456,7 @@
|
||||
return 0
|
||||
|
||||
/obj/machinery/airalarm/proc/refresh_all()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
for(var/id_tag in A.air_vent_names)
|
||||
var/list/I = A.air_vent_info[id_tag]
|
||||
if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time)
|
||||
@@ -507,7 +507,7 @@
|
||||
return "Flood"
|
||||
|
||||
/obj/machinery/airalarm/proc/apply_mode()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
switch(mode)
|
||||
if(AALARM_MODE_SCRUBBING)
|
||||
for(var/device_id in A.air_scrub_names)
|
||||
@@ -645,7 +645,7 @@
|
||||
|
||||
icon_state = "alarm1"
|
||||
var/overlay_state = AALARM_OVERLAY_OFF
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
switch(max(danger_level, A.atmosalm))
|
||||
if(0)
|
||||
add_overlay(AALARM_OVERLAY_GREEN)
|
||||
@@ -715,7 +715,7 @@
|
||||
return
|
||||
|
||||
var/datum/signal/alert_signal = new(list(
|
||||
"zone" = get_area_name(src),
|
||||
"zone" = get_area_name(src, get_base_area = TRUE),
|
||||
"type" = "Atmospheric"
|
||||
))
|
||||
if(alert_level==2)
|
||||
@@ -728,7 +728,7 @@
|
||||
frequency.post_signal(src, alert_signal, range = -1)
|
||||
|
||||
/obj/machinery/airalarm/proc/apply_danger_level()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
|
||||
var/new_area_danger_level = 0
|
||||
for(var/obj/machinery/airalarm/AA in A)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
icon_state = "relief_valve-t-map"
|
||||
can_unwrench = TRUE
|
||||
construction_type = /obj/item/pipe/binary
|
||||
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
|
||||
var/opened = FALSE
|
||||
var/open_pressure = ONE_ATMOSPHERE * 3
|
||||
var/close_pressure = ONE_ATMOSPHERE
|
||||
@@ -50,9 +51,11 @@
|
||||
if(!is_operational())
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air_contents = airs[1]
|
||||
var/our_pressure = air_contents.return_pressure()
|
||||
if(opened && our_pressure < close_pressure)
|
||||
var/datum/gas_mixture/air_one = airs[1]
|
||||
var/datum/gas_mixture/air_two = airs[2]
|
||||
var/air_one_pressure = air_one.return_pressure()
|
||||
var/our_pressure = abs(air_one_pressure - air_two.return_pressure())
|
||||
if(opened && air_one_pressure < close_pressure)
|
||||
close()
|
||||
else if(!opened && our_pressure >= open_pressure)
|
||||
open()
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon = 'icons/obj/atmospherics/components/relief_valve.dmi'
|
||||
icon_state = "relief_valve-e-map"
|
||||
can_unwrench = TRUE
|
||||
interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE
|
||||
var/opened = FALSE
|
||||
var/open_pressure = ONE_ATMOSPHERE * 3
|
||||
var/close_pressure = ONE_ATMOSPHERE
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
id_tag = assign_uid_vents()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/Destroy()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if (A)
|
||||
A.air_vent_names -= id_tag
|
||||
A.air_vent_info -= id_tag
|
||||
@@ -155,7 +155,7 @@
|
||||
"sigtype" = "status"
|
||||
))
|
||||
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(!A.air_vent_names[id_tag])
|
||||
name = "\improper [A.name] vent pump #[A.air_vent_names.len + 1]"
|
||||
A.air_vent_names[id_tag] = name
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
filter_types += gas_id2path(f)
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy()
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if (A)
|
||||
A.air_scrub_names -= id_tag
|
||||
A.air_scrub_info -= id_tag
|
||||
@@ -112,7 +112,7 @@
|
||||
"sigtype" = "status"
|
||||
))
|
||||
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(!A.air_scrub_names[id_tag])
|
||||
name = "\improper [A.name] air scrubber #[A.air_scrub_names.len + 1]"
|
||||
A.air_scrub_names[id_tag] = name
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//3-Way Manifold
|
||||
/obj/machinery/atmospherics/pipe/heat_exchanging/manifold
|
||||
icon_state = "manifold"
|
||||
icon_state = "manifold-2"
|
||||
|
||||
name = "pipe manifold"
|
||||
desc = "A manifold composed of regular pipes."
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
#define AMMO_DROP_LIFETIME 300
|
||||
#define CTF_REQUIRED_PLAYERS 4
|
||||
|
||||
|
||||
|
||||
/obj/item/twohanded/ctf
|
||||
name = "banner"
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
@@ -210,7 +208,6 @@
|
||||
toggle_all_ctf(user)
|
||||
return
|
||||
|
||||
|
||||
people_who_want_to_play |= user.ckey
|
||||
var/num = people_who_want_to_play.len
|
||||
var/remaining = CTF_REQUIRED_PLAYERS - num
|
||||
@@ -438,9 +435,9 @@
|
||||
. = FALSE
|
||||
if(istype(target, /obj/structure/barricade/security/ctf))
|
||||
. = TRUE
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
if(istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/shielded/ctf))
|
||||
if(isliving(target))
|
||||
var/mob/living/H = target
|
||||
if((RED_TEAM in H.faction) || (BLUE_TEAM in H.faction))
|
||||
. = TRUE
|
||||
|
||||
// RED TEAM GUNS
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE
|
||||
|
||||
/obj/item/clothing/head/hooded/cloakhood/drake
|
||||
name = "drake helm"
|
||||
@@ -90,4 +90,4 @@
|
||||
armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100)
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF | GOLIATH_RESISTANCE
|
||||
|
||||
@@ -30,6 +30,9 @@
|
||||
|
||||
/mob/living/carbon/monkey/handle_mutations_and_radiation()
|
||||
if(radiation)
|
||||
if(radiation > RAD_MOB_MUTATE && prob((radiation - RAD_MOB_MUTATE) / 25))
|
||||
gorillize()
|
||||
return
|
||||
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
|
||||
if(!IsKnockdown())
|
||||
emote("collapse")
|
||||
@@ -41,10 +44,6 @@
|
||||
randmutb()
|
||||
emote("gasp")
|
||||
domutcheck()
|
||||
|
||||
if(radiation > RAD_MOB_MUTATE * 2 && prob(50))
|
||||
gorillize()
|
||||
return
|
||||
if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB))
|
||||
vomit(10, TRUE)
|
||||
return ..()
|
||||
|
||||
@@ -53,11 +53,11 @@
|
||||
if(NONE)
|
||||
return FALSE
|
||||
if(POWER_REQ_ALL)
|
||||
return !T || !A || ((!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
return !T || !A || ((!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
if(POWER_REQ_CLOCKCULT)
|
||||
for(var/obj/effect/clockwork/sigil/transmission/ST in range(src, SIGIL_ACCESS_RANGE))
|
||||
return FALSE
|
||||
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.power_equip || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
return !T || !A || (!istype(T, /turf/open/floor/clockwork) && (!A.powered(EQUIP) || isspaceturf(T)) && !is_type_in_list(loc, list(/obj/item, /obj/mecha)))
|
||||
|
||||
/mob/living/silicon/ai/updatehealth()
|
||||
if(status_flags & GODMODE)
|
||||
@@ -100,7 +100,7 @@
|
||||
sleep(50)
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/AIarea = get_area(src)
|
||||
if(AIarea && AIarea.power_equip)
|
||||
if(AIarea && AIarea.powered(EQUIP))
|
||||
if(!isspaceturf(T))
|
||||
ai_restore_power()
|
||||
return
|
||||
@@ -120,7 +120,7 @@
|
||||
var/PRP //like ERP with the code, at least this stuff is no more 4x sametext
|
||||
for (PRP=1, PRP<=4, PRP++)
|
||||
T = get_turf(src)
|
||||
AIarea = get_area(src)
|
||||
AIarea = get_base_area(src)
|
||||
if(AIarea)
|
||||
for (var/obj/machinery/power/apc/APC in AIarea)
|
||||
if (!(APC.stat & BROKEN))
|
||||
@@ -134,7 +134,7 @@
|
||||
to_chat(src, "Lost connection with the APC!")
|
||||
aiRestorePowerRoutine = POWER_RESTORATION_SEARCH_APC
|
||||
return
|
||||
if(AIarea.power_equip)
|
||||
if(AIarea.powered(EQUIP))
|
||||
if(!isspaceturf(T))
|
||||
ai_restore_power()
|
||||
return
|
||||
|
||||
@@ -479,31 +479,33 @@ Difficulty: Very Hard
|
||||
NewTerrainTables = /obj/structure/table/abductor
|
||||
|
||||
/obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method)
|
||||
if(..())
|
||||
var/area/A = get_area(src)
|
||||
if(!A.outdoors && !(A in affected_targets))
|
||||
for(var/atom/Stuff in A)
|
||||
if(isturf(Stuff))
|
||||
var/turf/T = Stuff
|
||||
if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
|
||||
var/turf/open/O = T.ChangeTurf(NewTerrainFloors, flags = CHANGETURF_INHERIT_AIR)
|
||||
if(prob(florachance) && NewFlora.len && !is_blocked_turf(O, TRUE))
|
||||
var/atom/Picked = pick(NewFlora)
|
||||
new Picked(O)
|
||||
continue
|
||||
if(iswallturf(T) && NewTerrainWalls)
|
||||
T.ChangeTurf(NewTerrainWalls)
|
||||
continue
|
||||
if(istype(Stuff, /obj/structure/chair) && NewTerrainChairs)
|
||||
var/obj/structure/chair/Original = Stuff
|
||||
var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
|
||||
C.setDir(Original.dir)
|
||||
qdel(Stuff)
|
||||
continue
|
||||
if(istype(Stuff, /obj/structure/table) && NewTerrainTables)
|
||||
new NewTerrainTables(Stuff.loc)
|
||||
continue
|
||||
affected_targets += A
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
for(var/i in get_sub_areas(src))
|
||||
var/area/A = i
|
||||
if(A.outdoors || (A in affected_targets))
|
||||
continue
|
||||
affected_targets += A
|
||||
for(var/stuff in A)
|
||||
var/atom/target = stuff
|
||||
if(isturf(target))
|
||||
var/turf/T = target
|
||||
if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors)
|
||||
var/turf/open/O = T.ChangeTurf(NewTerrainFloors, flags = CHANGETURF_INHERIT_AIR)
|
||||
if(NewFlora.len && prob(florachance) && !is_blocked_turf(O, TRUE))
|
||||
var/atom/Picked = pick(NewFlora)
|
||||
new Picked(O)
|
||||
else if(iswallturf(T) && NewTerrainWalls)
|
||||
T.ChangeTurf(NewTerrainWalls)
|
||||
else if(NewTerrainChairs && istype(target, /obj/structure/chair))
|
||||
var/obj/structure/chair/Original = target
|
||||
var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
|
||||
C.setDir(Original.dir)
|
||||
qdel(target)
|
||||
else if(NewTerrainTables && istype(target, /obj/structure/table))
|
||||
new NewTerrainTables(target.loc)
|
||||
qdel(target)
|
||||
|
||||
/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with
|
||||
observer_desc = "This crystal generates a projectile when activated."
|
||||
|
||||
@@ -170,7 +170,7 @@ Difficulty: Medium
|
||||
to_chat(user, "<span class='warning'>The staff is still recharging!</span>")
|
||||
return
|
||||
|
||||
var/area/user_area = get_area(user)
|
||||
var/area/user_area = get_base_area(user)
|
||||
var/turf/user_turf = get_turf(user)
|
||||
if(!user_area || !user_turf || (user_area.type in excluded_areas))
|
||||
to_chat(user, "<span class='warning'>Something is preventing you from using the staff here.</span>")
|
||||
|
||||
+37
-45
@@ -56,6 +56,8 @@
|
||||
integrity_failure = 50
|
||||
var/damage_deflection = 10
|
||||
resistance_flags = FIRE_PROOF
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50)
|
||||
req_access = list(ACCESS_ENGINE_EQUIP)
|
||||
interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON
|
||||
|
||||
var/lon_range = 1.5
|
||||
@@ -148,12 +150,40 @@
|
||||
if(terminal)
|
||||
terminal.connect_to_network()
|
||||
|
||||
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
|
||||
if (!req_access)
|
||||
req_access = list(ACCESS_ENGINE_EQUIP)
|
||||
if (!armor)
|
||||
armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50)
|
||||
..()
|
||||
/obj/machinery/power/apc/Initialize(mapload, ndir, building = FALSE)
|
||||
. = ..()
|
||||
var/area/A = get_base_area(src)
|
||||
if(!building)
|
||||
has_electronics = APC_ELECTRONICS_SECURED
|
||||
// is starting with a power cell installed, create it and set its charge level
|
||||
if(cell_type)
|
||||
cell = new cell_type
|
||||
cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
|
||||
|
||||
//if area isn't specified use current
|
||||
if(areastring)
|
||||
area = get_area_instance_from_text(areastring)
|
||||
if(!area)
|
||||
area = A
|
||||
stack_trace("Bad areastring path for [src], [src.areastring]")
|
||||
else if(isarea(A) && !areastring)
|
||||
area = A
|
||||
if(auto_name)
|
||||
name = "\improper [A.name] APC"
|
||||
update_icon()
|
||||
|
||||
make_terminal()
|
||||
update_nightshift_auth_requirement()
|
||||
|
||||
else
|
||||
area = A
|
||||
opened = APC_COVER_OPENED
|
||||
operating = FALSE
|
||||
name = "\improper [A.name] APC"
|
||||
stat |= MAINT
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
GLOB.apcs_list += src
|
||||
|
||||
wires = new /datum/wires/apc(src)
|
||||
@@ -164,9 +194,6 @@
|
||||
src.tdir = dir // to fix Vars bug
|
||||
setDir(SOUTH)
|
||||
|
||||
if(auto_name)
|
||||
name = "\improper [get_area(src)] APC"
|
||||
|
||||
switch(tdir)
|
||||
if(NORTH)
|
||||
pixel_y = 23
|
||||
@@ -176,14 +203,6 @@
|
||||
pixel_x = 24
|
||||
if(WEST)
|
||||
pixel_x = -25
|
||||
if (building)
|
||||
area = get_area(src)
|
||||
opened = APC_COVER_OPENED
|
||||
operating = FALSE
|
||||
name = "[area.name] APC"
|
||||
stat |= MAINT
|
||||
src.update_icon()
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
/obj/machinery/power/apc/Destroy()
|
||||
GLOB.apcs_list -= src
|
||||
@@ -217,33 +236,6 @@
|
||||
terminal.setDir(tdir)
|
||||
terminal.master = src
|
||||
|
||||
/obj/machinery/power/apc/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!mapload)
|
||||
return
|
||||
has_electronics = APC_ELECTRONICS_SECURED
|
||||
// is starting with a power cell installed, create it and set its charge level
|
||||
if(cell_type)
|
||||
cell = new cell_type
|
||||
cell.charge = start_charge * cell.maxcharge / 100 // (convert percentage to actual value)
|
||||
|
||||
var/area/A = src.loc.loc
|
||||
|
||||
//if area isn't specified use current
|
||||
if(areastring)
|
||||
src.area = get_area_instance_from_text(areastring)
|
||||
if(!src.area)
|
||||
src.area = A
|
||||
stack_trace("Bad areastring path for [src], [src.areastring]")
|
||||
else if(isarea(A) && src.areastring == null)
|
||||
src.area = A
|
||||
update_icon()
|
||||
|
||||
make_terminal()
|
||||
update_nightshift_auth_requirement()
|
||||
|
||||
addtimer(CALLBACK(src, .proc/update), 5)
|
||||
|
||||
/obj/machinery/power/apc/examine(mob/user)
|
||||
. = ..()
|
||||
if(stat & BROKEN)
|
||||
@@ -1432,7 +1424,7 @@
|
||||
return
|
||||
for(var/A in GLOB.ai_list)
|
||||
var/mob/living/silicon/ai/I = A
|
||||
if(get_area(I) == area)
|
||||
if(get_base_area(I) == area)
|
||||
return
|
||||
|
||||
failure_timer = max(failure_timer, round(duration))
|
||||
|
||||
@@ -294,7 +294,7 @@
|
||||
cut_overlays()
|
||||
switch(status) // set icon_states
|
||||
if(LIGHT_OK)
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if(emergency_mode || (A && A.fire))
|
||||
icon_state = "[base_state]_emergency"
|
||||
else
|
||||
@@ -323,7 +323,7 @@
|
||||
var/CO = bulb_colour
|
||||
if(color)
|
||||
CO = color
|
||||
var/area/A = get_area(src)
|
||||
var/area/A = get_base_area(src)
|
||||
if (A && A.fire)
|
||||
CO = bulb_emergency_colour
|
||||
else if (nightshift_enabled)
|
||||
|
||||
@@ -382,6 +382,7 @@
|
||||
return null
|
||||
|
||||
/area/proc/get_apc()
|
||||
var/target = base_area ? base_area : src
|
||||
for(var/obj/machinery/power/apc/APC in GLOB.apcs_list)
|
||||
if(APC.area == src)
|
||||
if(APC.area == target)
|
||||
return APC
|
||||
@@ -374,14 +374,18 @@
|
||||
desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use."
|
||||
modifier = 2.5
|
||||
minebot_upgrade = FALSE
|
||||
var/decreased
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
KA.overheat_time -= modifier
|
||||
var/old = KA.overheat_time
|
||||
KA.overheat_time = max(0, KA.overheat_time - modifier)
|
||||
decreased = old - KA.overheat_time
|
||||
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/gun/energy/kinetic_accelerator/KA)
|
||||
KA.overheat_time += modifier
|
||||
KA.overheat_time += decreased
|
||||
..()
|
||||
|
||||
/obj/item/borg/upgrade/modkit/cooldown/minebot
|
||||
|
||||
@@ -212,7 +212,7 @@ Consuming extracts:
|
||||
taste = "sugar and starlight"
|
||||
|
||||
/obj/item/slime_cookie/bluespace/do_effect(mob/living/M, mob/user)
|
||||
var/list/L = get_area_turfs(get_area(get_turf(M)))
|
||||
var/list/L = get_sub_areas_turfs(get_area(M))
|
||||
var/turf/target
|
||||
while (L.len && !target)
|
||||
var/I = rand(1, L.len)
|
||||
|
||||
@@ -12,6 +12,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
var/datum/map_template/hilbertshotel/lore/hotelRoomTempLore
|
||||
var/list/activeRooms = list()
|
||||
var/list/storedRooms = list()
|
||||
var/list/checked_in_ckeys = list()
|
||||
var/storageTurf
|
||||
//Lore Stuff
|
||||
var/ruinSpawned = FALSE
|
||||
@@ -44,7 +45,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
|
||||
/obj/item/hilbertshotel/proc/promptAndCheckIn(mob/user)
|
||||
var/chosenRoomNumber = input(user, "What number room will you be checking into?", "Room Number") as null|num
|
||||
if(!chosenRoomNumber)
|
||||
if(!chosenRoomNumber || !user.CanReach(src))
|
||||
return
|
||||
if(chosenRoomNumber > SHORT_REAL_LIMIT)
|
||||
to_chat(user, "<span class='warning'>You have to check out the first [SHORT_REAL_LIMIT] rooms before you can go to a higher numbered one!</span>")
|
||||
@@ -52,8 +53,8 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
if((chosenRoomNumber < 1) || (chosenRoomNumber != round(chosenRoomNumber)))
|
||||
to_chat(user, "<span class='warning'>That is not a valid room number!</span>")
|
||||
return
|
||||
if(ismob(loc))
|
||||
if(user == loc) //Not always the same as user
|
||||
if(!isturf(loc))
|
||||
if((loc == user) || (loc.loc == user) || (loc.loc in user.contents) || (loc in user.GetAllContents(type))) //short circuit, first three checks are cheaper and covers almost all cases (loc.loc covers hotel in box in backpack).
|
||||
forceMove(get_turf(user))
|
||||
if(!storageTurf) //Blame subsystems for not allowing this to be in Initialize
|
||||
if(!GLOB.hhStorageTurf)
|
||||
@@ -63,13 +64,13 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
GLOB.hhStorageTurf = locate(storageReservation.bottom_left_coords[1]+1, storageReservation.bottom_left_coords[2]+1, storageReservation.bottom_left_coords[3])
|
||||
else
|
||||
storageTurf = GLOB.hhStorageTurf
|
||||
checked_in_ckeys |= user.ckey //if anything below runtimes, guess you're outta luck!
|
||||
if(tryActiveRoom(chosenRoomNumber, user))
|
||||
return
|
||||
if(tryStoredRoom(chosenRoomNumber, user))
|
||||
return
|
||||
sendToNewRoom(chosenRoomNumber, user)
|
||||
|
||||
|
||||
/obj/item/hilbertshotel/proc/tryActiveRoom(var/roomNumber, var/mob/user)
|
||||
if(activeRooms["[roomNumber]"])
|
||||
var/datum/turf_reservation/roomReservation = activeRooms["[roomNumber]"]
|
||||
@@ -102,6 +103,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/// This is a BLOCKING OPERATION. Note the room load call, and the block reservation calls.
|
||||
/obj/item/hilbertshotel/proc/sendToNewRoom(var/roomNumber, var/mob/user)
|
||||
var/datum/turf_reservation/roomReservation = SSmapping.RequestBlockReservation(hotelRoomTemp.width, hotelRoomTemp.height)
|
||||
if(ruinSpawned)
|
||||
@@ -200,7 +202,6 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
name = "Hilbert's Hotel Storage"
|
||||
mappath = '_maps/templates/hilbertshotelstorage.dmm'
|
||||
|
||||
|
||||
//Turfs and Areas
|
||||
/turf/closed/indestructible/hotelwall
|
||||
name = "hotel wall"
|
||||
@@ -359,6 +360,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337)
|
||||
. = ..()
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
parentSphere?.checked_in_ckeys -= M.ckey
|
||||
if(M.mind)
|
||||
var/stillPopulated = FALSE
|
||||
var/list/currentLivingMobs = GetAllContents(/mob/living) //Got to catch anyone hiding in anything
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
//#define VORE_SOUND_FALLOFF 0.05
|
||||
#define VORE_SOUND_FALLOFF 0.1
|
||||
#define VORE_SOUND_RANGE 3
|
||||
|
||||
//
|
||||
// Belly system 2.0, now using objects instead of datums because EH at datums.
|
||||
@@ -164,7 +165,12 @@
|
||||
. = ..()
|
||||
|
||||
// Called whenever an atom enters this belly
|
||||
/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc)
|
||||
/obj/belly/Entered(atom/movable/thing, atom/OldLoc)
|
||||
. = ..()
|
||||
var/mob/living/L //for chat messages and blindness
|
||||
if(isliving(thing))
|
||||
L = thing
|
||||
L.become_blind("belly_[REF(src)]")
|
||||
if(OldLoc in contents)
|
||||
return //Someone dropping something (or being stripdigested)
|
||||
|
||||
@@ -175,7 +181,7 @@
|
||||
if(vore_sound && !recent_sound)
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
for(var/mob/living/H in get_hearers_in_view(VORE_SOUND_RANGE, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & EATING_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
@@ -189,11 +195,14 @@
|
||||
SEND_SOUND(H,eating)
|
||||
recent_sound = TRUE
|
||||
|
||||
//Messages if it's a mob
|
||||
if(isliving(thing))
|
||||
var/mob/living/M = thing
|
||||
if(desc)
|
||||
to_chat(M, "<span class='notice'><B>[desc]</B></span>")
|
||||
if(L && desc)
|
||||
to_chat(L, "<span class='notice'><B>[desc]</B></span>")
|
||||
|
||||
/obj/belly/Exited(atom/movable/AM, atom/newloc)
|
||||
. = ..()
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
L.cure_blind("belly_[REF(src)]")
|
||||
|
||||
// Release all contents of this belly into the owning mob's location.
|
||||
// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
|
||||
@@ -214,7 +223,6 @@
|
||||
continue
|
||||
L.absorbed = FALSE
|
||||
L.stop_sound_channel(CHANNEL_PREYLOOP)
|
||||
L.cure_blind("belly_[REF(src)]")
|
||||
SEND_SIGNAL(OW, COMSIG_CLEAR_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred)
|
||||
SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey)
|
||||
SEND_SIGNAL(OW, COMSIG_ADD_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred)
|
||||
@@ -229,7 +237,7 @@
|
||||
if(release_sound && !recent_sound)
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
for(var/mob/living/H in get_hearers_in_view(VORE_SOUND_RANGE, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & EATING_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
@@ -237,7 +245,7 @@
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
var/sound/releasement = GLOB.pred_release_sounds[release_sound]
|
||||
SEND_SOUND(H,releasement)
|
||||
H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
else if(H && H in contents && H.client)
|
||||
var/sound/releasement = GLOB.prey_release_sounds[release_sound]
|
||||
SEND_SOUND(H,releasement)
|
||||
@@ -262,7 +270,6 @@
|
||||
var/mob/living/OW = owner
|
||||
if(ML.client)
|
||||
ML.stop_sound_channel(CHANNEL_PREYLOOP) //Stop the internal loop, it'll restart if the isbelly check on next tick anyway
|
||||
ML.cure_blind("belly_[REF(src)]")
|
||||
SEND_SIGNAL(OW, COMSIG_CLEAR_MOOD_EVENT, "fedpred", /datum/mood_event/fedpred)
|
||||
SEND_SIGNAL(ML, COMSIG_CLEAR_MOOD_EVENT, "fedprey", /datum/mood_event/fedprey)
|
||||
SEND_SIGNAL(OW, COMSIG_ADD_MOOD_EVENT, "emptypred", /datum/mood_event/emptypred)
|
||||
@@ -294,7 +301,7 @@
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
var/sound/releasement = GLOB.pred_release_sounds[release_sound]
|
||||
SEND_SOUND(H,releasement)
|
||||
H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
else if(H && H in contents && H.client)
|
||||
var/sound/releasement = GLOB.prey_release_sounds[release_sound]
|
||||
SEND_SOUND(H,releasement)
|
||||
@@ -325,7 +332,6 @@
|
||||
|
||||
for(var/mob/living/M in contents)
|
||||
M.updateVRPanel()
|
||||
M.become_blind("belly_[REF(src)]")
|
||||
|
||||
// Setup the autotransfer checks if needed
|
||||
if(transferlocation != null && autotransferchance > 0)
|
||||
@@ -345,13 +351,11 @@
|
||||
if(!(content in src) || !istype(target))
|
||||
return
|
||||
content.forceMove(target)
|
||||
for(var/mob/living/M in contents)
|
||||
M.cure_blind("belly_[REF(src)]")
|
||||
// target.nom_mob(content, target.owner)
|
||||
|
||||
if(vore_sound && !recent_sound && !silent)
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
for(var/mob/living/H in get_hearers_in_view(VORE_SOUND_RANGE, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & EATING_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
@@ -359,7 +363,7 @@
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
var/sound/eating = GLOB.pred_vore_sounds[vore_sound]
|
||||
SEND_SOUND(H,eating)
|
||||
H.playsound_local(owner.loc, eating, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
else if(H && H in contents && H.client)
|
||||
var/sound/eating = GLOB.prey_vore_sounds[vore_sound]
|
||||
SEND_SOUND(H,eating)
|
||||
@@ -576,7 +580,7 @@
|
||||
var/sound/struggle_rustle = sound(get_sfx("rustle"))
|
||||
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
for(var/mob/living/H in get_hearers_in_view(VORE_SOUND_RANGE, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & EATING_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
@@ -584,14 +588,14 @@
|
||||
if(is_wet)
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
SEND_SOUND(H,pred_struggle_snuggle)
|
||||
H.playsound_local(owner.loc, pred_struggle_snuggle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
else if(H && H in contents && H.client)
|
||||
SEND_SOUND(H,prey_struggle_snuggle)
|
||||
|
||||
else
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client)
|
||||
SEND_SOUND(H, struggle_rustle)
|
||||
H.playsound_local(owner.loc, struggle_rustle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc)))
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
return SSBELLIES_PROCESSED
|
||||
|
||||
next_process = times_fired + (6 SECONDS/wait) //Set up our next process time.
|
||||
var/to_update = FALSE
|
||||
var/play_sound //Potential sound to play at the end to avoid code duplication.
|
||||
var/to_update = FALSE //Did anything update worthy happen?
|
||||
|
||||
/////////////////////////// Auto-Emotes ///////////////////////////
|
||||
if(contents.len && next_emote <= times_fired)
|
||||
@@ -40,7 +41,7 @@
|
||||
if(M.client.prefs.cit_toggles & DIGESTION_NOISES)
|
||||
var/sound/preyloop = sound('sound/vore/prey/loop.ogg')
|
||||
M.playsound_local(get_turf(src),preyloop, 80,0, channel = CHANNEL_PREYLOOP)
|
||||
M.next_preyloop = (world.time + 51 SECONDS)
|
||||
M.next_preyloop = (world.time + 52 SECONDS)
|
||||
|
||||
|
||||
/////////////////////////// Exit Early ////////////////////////////
|
||||
@@ -71,18 +72,9 @@
|
||||
|
||||
for (var/mob/living/M in contents)
|
||||
if(prob(25))
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
SEND_SOUND(H,pred_digest)
|
||||
else if(H && H in contents && H.client)
|
||||
SEND_SOUND(H,prey_digest)
|
||||
if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES)
|
||||
SEND_SOUND(M,prey_digest)
|
||||
play_sound = pick(pred_digest)
|
||||
|
||||
//Pref protection!
|
||||
if (!M.digestable || M.absorbed)
|
||||
@@ -108,18 +100,9 @@
|
||||
M.visible_message("<span class='notice'>You watch as [owner]'s form loses its additions.</span>")
|
||||
|
||||
owner.nutrition += 400 // so eating dead mobs gives you *something*.
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
SEND_SOUND(H,pred_death)
|
||||
else if(H && H in contents && H.client)
|
||||
SEND_SOUND(H,prey_death)
|
||||
play_sound = pick(pred_death)
|
||||
if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES)
|
||||
SEND_SOUND(M,prey_death)
|
||||
M.stop_sound_channel(CHANNEL_PREYLOOP)
|
||||
digestion_death(M)
|
||||
owner.update_icons()
|
||||
@@ -142,19 +125,9 @@
|
||||
if(digest_mode == DM_HEAL)
|
||||
for (var/mob/living/M in contents)
|
||||
if(prob(25))
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
SEND_SOUND(H,pred_digest)
|
||||
else if(H && H in contents && H.client)
|
||||
SEND_SOUND(H,prey_digest)
|
||||
|
||||
if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES)
|
||||
SEND_SOUND(M,prey_digest)
|
||||
play_sound = pick(pred_digest)
|
||||
if(M.stat != DEAD)
|
||||
if(owner.nutrition >= NUTRITION_LEVEL_STARVING && (M.health < M.maxHealth))
|
||||
M.adjustBruteLoss(-3)
|
||||
@@ -165,18 +138,10 @@
|
||||
//for when you just want people to squelch around
|
||||
if(digest_mode == DM_NOISY)
|
||||
if(prob(35))
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
SEND_SOUND(H,pred_digest)
|
||||
else if(H && H in contents && H.client)
|
||||
SEND_SOUND(H,prey_digest)
|
||||
for(var/mob/M in contents)
|
||||
if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES)
|
||||
SEND_SOUND(M,prey_digest)
|
||||
play_sound = pick(pred_digest)
|
||||
|
||||
|
||||
//////////////////////////// DM_ABSORB ////////////////////////////
|
||||
@@ -185,18 +150,9 @@
|
||||
for (var/mob/living/M in contents)
|
||||
|
||||
if(prob(10))//Less often than gurgles. People might leave this on forever.
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
SEND_SOUND(H,pred_digest)
|
||||
else if(H && H in contents && H.client)
|
||||
SEND_SOUND(H,prey_digest)
|
||||
if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES)
|
||||
SEND_SOUND(M,prey_digest)
|
||||
play_sound = pick(pred_digest)
|
||||
|
||||
if(M.absorbed)
|
||||
continue
|
||||
@@ -262,18 +218,9 @@
|
||||
to_chat(owner, "<span class='warning'>[digest_alert_owner]</span>")
|
||||
to_chat(M, "<span class='warning'>[digest_alert_prey]</span>")
|
||||
M.visible_message("<span class='notice'>You watch as [owner]'s guts loudly rumble as it finishes off a meal.</span>")
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/living/H in get_hearers_in_view(3, owner))
|
||||
if(!H.client || !(H.client.prefs.cit_toggles & DIGESTION_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, H)
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
SEND_SOUND(H,pred_death)
|
||||
else if(H && H in contents && H.client)
|
||||
SEND_SOUND(H,prey_death)
|
||||
play_sound = pick(pred_death)
|
||||
if(M && M.client && M.client.prefs.cit_toggles & DIGESTION_NOISES)
|
||||
SEND_SOUND(M,prey_death)
|
||||
M.spill_organs(FALSE,TRUE,TRUE)
|
||||
M.stop_sound_channel(CHANNEL_PREYLOOP)
|
||||
digestion_death(M)
|
||||
@@ -293,6 +240,19 @@
|
||||
if(istype(T,/obj/item/reagent_containers/food) || istype(T,/obj/item/organ))
|
||||
digest_item(T)
|
||||
|
||||
/////////////////////////// Make any noise ///////////////////////////
|
||||
if(play_sound)
|
||||
if((world.time + NORMIE_HEARCHECK) > last_hearcheck)
|
||||
LAZYCLEARLIST(hearing_mobs)
|
||||
for(var/mob/M in hearers(VORE_SOUND_RANGE, owner))
|
||||
if(!M.client || !(M.client.prefs.cit_toggles & DIGESTION_NOISES))
|
||||
continue
|
||||
LAZYADD(hearing_mobs, M)
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/M in hearing_mobs) //so we don't fill the whole room with the sound effect
|
||||
if(M && M.client && (isturf(M.loc) || (M.loc != src.contents))) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
|
||||
M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
//these are all external sound triggers now, so it's ok.
|
||||
if(to_update)
|
||||
for(var/mob/living/M in contents)
|
||||
if(M.client)
|
||||
|
||||
Reference in New Issue
Block a user