Merge branch 'master' of https://github.com/quotefox/Hyper-Station-13
@@ -217,3 +217,12 @@
|
||||
|
||||
#define RULE_OF_THREE(a, b, x) ((a*x)/b)
|
||||
// )
|
||||
|
||||
#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y))
|
||||
|
||||
#define LOGISTIC_FUNCTION(L,k,x,x_0) (L/(1+(NUM_E**(-k*(x-x_0)))))
|
||||
|
||||
/// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s.
|
||||
#define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE)
|
||||
|
||||
#define TILES_TO_PIXELS(tiles) (tiles * PIXELS)
|
||||
|
||||
@@ -158,6 +158,15 @@
|
||||
#define NUTRITION_LEVEL_START_MIN 250
|
||||
#define NUTRITION_LEVEL_START_MAX 400
|
||||
|
||||
//Hyperstation Thirst
|
||||
#define THIRST_LEVEL_THRESHOLD 800 //Set to 0 to stop clamping
|
||||
#define THIRST_LEVEL_QUENCHED 450
|
||||
#define THIRST_LEVEL_THIRSTY 250
|
||||
#define THIRST_LEVEL_PARCHED 150
|
||||
|
||||
#define THIRST_LEVEL_START_MIN 250
|
||||
#define THIRST_LEVEL_START_MAX 400
|
||||
|
||||
//Disgust levels for humans
|
||||
#define DISGUST_LEVEL_MAXEDOUT 150
|
||||
#define DISGUST_LEVEL_DISGUSTED 75
|
||||
|
||||
@@ -306,14 +306,16 @@
|
||||
add_event(null, "nutrition", /datum/mood_event/starving)
|
||||
|
||||
/datum/component/mood/proc/HandleThirst(mob/living/L)
|
||||
if(THIRST_LEVEL_THRESHOLD)
|
||||
L.thirst = clamp(L.thirst, 0, THIRST_LEVEL_THRESHOLD)
|
||||
switch(L.thirst)
|
||||
if(NUTRITION_LEVEL_WELL_FED to INFINITY)
|
||||
if(THIRST_LEVEL_QUENCHED to INFINITY)
|
||||
add_event(null, "thirst", /datum/mood_event/quenched)
|
||||
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_WELL_FED)
|
||||
if(THIRST_LEVEL_THIRSTY to THIRST_LEVEL_QUENCHED)
|
||||
clear_event(null, "thirst")
|
||||
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
|
||||
if(THIRST_LEVEL_PARCHED to THIRST_LEVEL_THIRSTY)
|
||||
add_event(null, "thirst", /datum/mood_event/thirsty)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
if(0 to THIRST_LEVEL_PARCHED)
|
||||
add_event(null, "thirst", /datum/mood_event/dehydrated)
|
||||
|
||||
#undef MINOR_INSANITY_PEN
|
||||
|
||||
@@ -1,4 +1,21 @@
|
||||
#define LIGHTSTOBREAK_MINIMUM 25
|
||||
#define LIGHTSTOBREAK_MAXIMUM 75
|
||||
#define LIGHTSTOBREAK_THRESHOLD 50
|
||||
#define LIGHTSTOBREAK_MAX_CHANCE 50
|
||||
#define LIGHTSTOBREAK_AREA_MIN 1
|
||||
#define LIGHTSTOBREAK_AREA_MAX 2
|
||||
|
||||
/datum/antagonist/nightmare
|
||||
name = "Nightmare"
|
||||
show_in_antagpanel = FALSE
|
||||
show_name_in_check_antagonists = TRUE
|
||||
show_name_in_check_antagonists = TRUE
|
||||
|
||||
/datum/antagonist/nightmare/on_gain()
|
||||
owner.objectives += forge_objective()
|
||||
owner.objectives += new /datum/objective/survive
|
||||
|
||||
/datum/antagonist/nightmare/proc/forge_objective()
|
||||
var/datum/objective/break_lights/O = new
|
||||
O.mode = prob(50) ? TRUE : FALSE
|
||||
antag_memory = "<b>Objectives:<br>1.</b> [O.apply_rules()]<br><b>2.</b> Stay alive until the end."
|
||||
return O
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/datum/objective/break_lights
|
||||
var/mode = FALSE //If true, break all lights in determined area
|
||||
var/list/area_targets = list() //Which areas we have to keep lights broken
|
||||
target_amount = LIGHTSTOBREAK_AREA_MIN
|
||||
var/lightsbroken = 0
|
||||
|
||||
var/safe_areas = list(
|
||||
/area/space,
|
||||
/area/maintenance/solars,
|
||||
/area/maintenance/central, //HOP/Conference room APC
|
||||
/area/ai_monitored,
|
||||
/area/shuttle,
|
||||
/area/engine/engine_smes,
|
||||
/area/security/prison, //If you get unlucky, you'll have to break the lights in armory
|
||||
/area/security/execution)
|
||||
|
||||
/datum/objective/break_lights/proc/apply_rules()
|
||||
if(mode)
|
||||
var/list/valid_areas = list()
|
||||
for(var/obj/machinery/power/apc/C in GLOB.apcs_list)
|
||||
if(C.cell && is_station_level(C.z))
|
||||
var/is_safearea = 1
|
||||
for(var/A in safe_areas)
|
||||
if(istype(C.area, A))
|
||||
is_safearea = 0
|
||||
break
|
||||
if(is_safearea)
|
||||
valid_areas += C.area
|
||||
var/I = rand(LIGHTSTOBREAK_AREA_MIN, LIGHTSTOBREAK_AREA_MAX)
|
||||
for(var/N in 1 to I)
|
||||
var/area2add = pick(valid_areas)
|
||||
if(!locate(area2add) in area_targets)
|
||||
area_targets += area2add
|
||||
else
|
||||
target_amount = rand(LIGHTSTOBREAK_MINIMUM, LIGHTSTOBREAK_MAXIMUM)
|
||||
if(prob(LIGHTSTOBREAK_MAX_CHANCE))
|
||||
if(target_amount > LIGHTSTOBREAK_THRESHOLD)
|
||||
target_amount = LIGHTSTOBREAK_MAXIMUM
|
||||
else if(target_amount > LIGHTSTOBREAK_THRESHOLD)
|
||||
target_amount = LIGHTSTOBREAK_THRESHOLD
|
||||
explanation_text = update_explanation_text()
|
||||
return explanation_text
|
||||
|
||||
/datum/objective/break_lights/update_explanation_text()
|
||||
..()
|
||||
if(mode)
|
||||
if(!area_targets.len)
|
||||
return "Uh oh! Something broke! Report this."
|
||||
. += "There must not be any light sources in the "
|
||||
if(area_targets.len == 1)
|
||||
var/area/A = area_targets[1]
|
||||
. += "[A.name]"
|
||||
else if(area_targets.len == 2)
|
||||
var/area/A = area_targets[1]
|
||||
var/area/B = area_targets[2]
|
||||
. += "[A.name] and [B.name]"
|
||||
else //Won't get here because of define values, but during development you can get here. leaving this here for future purposes
|
||||
var/i = 1
|
||||
for(var/area/A in area_targets)
|
||||
if(i != area_targets.len) . += "[A.name], "
|
||||
else . += "and [A.name]"
|
||||
|
||||
. += " before the end."
|
||||
else
|
||||
. += "Break at least [target_amount] lights with your light eater."
|
||||
|
||||
/datum/objective/break_lights/check_completion()
|
||||
if(completed)
|
||||
return TRUE //An attempt to stop this from being called twice
|
||||
if(!mode)
|
||||
if(lightsbroken >= target_amount)
|
||||
completed = TRUE
|
||||
else
|
||||
var/list/valid_turfs = list()
|
||||
for(var/area/target in area_targets)
|
||||
var/list/cached_area = get_area_turfs(target.type)
|
||||
for(var/turf/A in cached_area)
|
||||
if(!is_station_level(A.z))
|
||||
continue
|
||||
valid_turfs += A
|
||||
for(var/turf/T in valid_turfs)
|
||||
for(var/atom/C in T.contents)
|
||||
/*if(!C?.visibility) //Doesn't compile, add this another time
|
||||
continue*/
|
||||
if(C.light_range > 0)
|
||||
if(C.light_power <= SHADOW_SPECIES_LIGHT_THRESHOLD*2) //Give some leniency for not destroying that unbreakable requests console
|
||||
completed = TRUE
|
||||
else
|
||||
completed = FALSE
|
||||
break
|
||||
if(!completed)
|
||||
break
|
||||
|
||||
return completed
|
||||
|
||||
/datum/objective/break_lights/area
|
||||
mode = TRUE
|
||||
|
||||
|
||||
#undef LIGHTSTOBREAK_MINIMUM
|
||||
#undef LIGHTSTOBREAK_MAXIMUM
|
||||
#undef LIGHTSTOBREAK_THRESHOLD
|
||||
#undef LIGHTSTOBREAK_MAX_CHANCE
|
||||
#undef LIGHTSTOBREAK_AREA_MIN
|
||||
#undef LIGHTSTOBREAK_AREA_MAX
|
||||
@@ -89,6 +89,7 @@
|
||||
if(!panel_open)
|
||||
return
|
||||
anchored = !anchored
|
||||
move_resist = anchored? INFINITY : 100
|
||||
I.play_tool_sound(src)
|
||||
if(generator)
|
||||
disconnectFromGenerator()
|
||||
|
||||
@@ -169,12 +169,22 @@
|
||||
crate_name = "tesla generator crate"
|
||||
|
||||
/datum/supply_pack/engine/teg
|
||||
name = "Thermoelectric Generator"
|
||||
desc = "Contains your very own Thermoelectric Generator. Time to turn cargo into a blazing hellfire, perhaps?"
|
||||
cost = 4000
|
||||
contains = list(/obj/machinery/power/generator)
|
||||
name = "Thermoelectric Generator Assembly"
|
||||
desc = "Contains your very own Thermoelectric Generator Assembly. Time to turn cargo into a blazing hellfire, perhaps?"
|
||||
cost = 3000
|
||||
contains = list(/obj/item/paper/teg,
|
||||
/obj/item/circuitboard/machine/generator,
|
||||
/obj/item/circuitboard/machine/circulator,
|
||||
/obj/item/circuitboard/machine/circulator,
|
||||
/obj/item/stack/cable_coil,
|
||||
/obj/item/stack/sheet/metal/twenty)
|
||||
crate_name = "thermoelectric generator crate"
|
||||
|
||||
/obj/item/paper/teg
|
||||
info = "*The seemingly useful notes have been scribbled over with red and black crayon. Hmm.*"
|
||||
name = "TEG Instructions"
|
||||
color = "red"
|
||||
|
||||
/datum/supply_pack/engine/energy_harvester
|
||||
name = "Energy Harvesting Module"
|
||||
desc = "A Device which upon connection to a node, will harvest the energy and send it to engineerless stations in return for credits, derived from a syndicate powersink model."
|
||||
|
||||
@@ -10,16 +10,8 @@
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
||||
var/obj/item/paper/P = new(C.loc)
|
||||
P.name = "Unstable bluespace anomaly"
|
||||
P.info = "Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name]."
|
||||
P.update_icon()
|
||||
priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
|
||||
/datum/round_event/anomaly/anomaly_bluespace/start()
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -11,16 +11,7 @@
|
||||
announceWhen = 3
|
||||
|
||||
/datum/round_event/anomaly/anomaly_flux/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
||||
var/obj/item/paper/P = new(C.loc)
|
||||
P.name = "Localized hyper-energetic flux wave"
|
||||
P.info = "Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name]."
|
||||
P.update_icon()
|
||||
priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_flux/start()
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -9,16 +9,7 @@
|
||||
announceWhen = 20
|
||||
|
||||
/datum/round_event/anomaly/anomaly_grav/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
||||
var/obj/item/paper/P = new(C.loc)
|
||||
P.name = "Gravitational anomaly"
|
||||
P.info = "Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name]."
|
||||
P.update_icon()
|
||||
priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_grav/start()
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -9,16 +9,7 @@
|
||||
announceWhen = 10
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
else
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
||||
var/obj/item/paper/P = new(C.loc)
|
||||
P.name = "Pyroclastic anomaly"
|
||||
P.info = "Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name]."
|
||||
P.update_icon()
|
||||
priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_pyro/start()
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -11,16 +11,7 @@
|
||||
announceWhen = 3
|
||||
|
||||
/datum/round_event/anomaly/anomaly_vortex/announce(fake)
|
||||
if(prob(90))
|
||||
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
else
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
||||
var/obj/item/paper/P = new(C.loc)
|
||||
P.name = "Vortex anomaly"
|
||||
P.info = "Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]."
|
||||
P.update_icon()
|
||||
priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert")
|
||||
|
||||
/datum/round_event/anomaly/anomaly_vortex/start()
|
||||
var/turf/T = safepick(get_area_turfs(impact_area))
|
||||
|
||||
@@ -12,10 +12,11 @@
|
||||
|
||||
/datum/round_event/aurora_caelus
|
||||
announceWhen = 1
|
||||
startWhen = 9
|
||||
startWhen = 8 //Delayed with sleep()
|
||||
endWhen = 50
|
||||
var/list/aurora_colors = list("#ffd980", "#eaff80", "#eaff80", "#ffd980", "#eaff80", "#A2FFC7", "#9400D3", "#FFC0CB")
|
||||
var/aurora_progress = 0 //this cycles from 1 to 8, slowly changing colors from gentle green to gentle blue
|
||||
var/list/applicable_areas = list()
|
||||
|
||||
/datum/round_event/aurora_caelus/announce()
|
||||
priority_announce("[station_name()]: A harmless cloud of ions is approaching your station, and will exhaust their energy battering the hull. Kinaris Command has approved a short break for all employees to relax and observe this very rare event. During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. We will also play quiet music for you to enjoy and relax. Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. We hope you enjoy the lights.",
|
||||
@@ -25,38 +26,67 @@
|
||||
var/mob/M = V
|
||||
if((M.client.prefs.toggles & SOUND_MIDI) && is_station_level(M.z))
|
||||
M.playsound_local(M, 'sound/ambience/aurora_caelus_new.ogg', 40, FALSE, pressure_affected = FALSE) //ogg is "The Fire is Gone" by Heaven Pierce Her, used in the videogame ULTRAKILL. All respects and credits to the equivalent artists who worked on it.
|
||||
start_checking()
|
||||
|
||||
/datum/round_event/aurora_caelus/proc/start_checking()
|
||||
var/list/turfs_to_check = list()
|
||||
var/x = 1
|
||||
var/y = 1
|
||||
while(TRUE)
|
||||
turfs_to_check += locate(x,y,2) //If the station z-level ever gets changed, change this too. I couldn't find if there's an easy way to get it
|
||||
x++
|
||||
if(x > 255)
|
||||
x = 0
|
||||
y++
|
||||
if(y > 255)
|
||||
break
|
||||
if(!turfs_to_check)
|
||||
CRASH("Aurora Caelus called, but there's no space!")
|
||||
var/tlen = turfs_to_check.len
|
||||
var/i = 0
|
||||
while(i < tlen)
|
||||
i++
|
||||
var/turf/T = turfs_to_check[i]
|
||||
if(!istype(T, /turf/open/space))
|
||||
continue
|
||||
if(i%2500 == 0)
|
||||
sleep(1) //try to spread the lag around a bit
|
||||
var/sure = (!istype(get_step(T, NORTH)?.loc, /area/space)||\
|
||||
!istype(get_step(T, NORTHEAST)?.loc, /area/space)||\
|
||||
!istype(get_step(T, EAST)?.loc, /area/space)||\
|
||||
!istype(get_step(T, SOUTHEAST)?.loc, /area/space)||\
|
||||
!istype(get_step(T, SOUTH)?.loc, /area/space)||\
|
||||
!istype(get_step(T, SOUTHWEST)?.loc, /area/space)||\
|
||||
!istype(get_step(T, WEST)?.loc, /area/space)||\
|
||||
!istype(get_step(T, NORTHWEST)?.loc, /area/space)) //Better than using range()
|
||||
if(sure)
|
||||
applicable_areas += T
|
||||
|
||||
/datum/round_event/aurora_caelus/start()
|
||||
for(var/area in GLOB.sortedAreas)
|
||||
var/area/A = area
|
||||
if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT)
|
||||
for(var/turf/open/space/S in A)
|
||||
S.set_light(S.light_range * 6, S.light_power * 1)
|
||||
for(var/turf/S in applicable_areas)
|
||||
S.set_light(6, 0.8, l_color = aurora_colors[1])
|
||||
|
||||
/datum/round_event/aurora_caelus/tick()
|
||||
if(activeFor % 5 == 0)
|
||||
aurora_progress++
|
||||
if(aurora_progress > LAZYLEN(aurora_colors))
|
||||
aurora_progress = 1
|
||||
var/aurora_color = aurora_colors[aurora_progress]
|
||||
for(var/area in GLOB.sortedAreas)
|
||||
var/area/A = area
|
||||
if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT)
|
||||
for(var/turf/open/space/S in A)
|
||||
S.set_light(l_color = aurora_color)
|
||||
for(var/turf/S in applicable_areas)
|
||||
S.set_light(l_color = aurora_color)
|
||||
|
||||
/datum/round_event/aurora_caelus/end()
|
||||
for(var/area in GLOB.sortedAreas)
|
||||
var/area/A = area
|
||||
if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT)
|
||||
for(var/turf/open/space/S in A)
|
||||
fade_to_black(S)
|
||||
priority_announce("The aurora caelus event is now ending. Starlight conditions will slowly return to normal. When this has concluded, please return to your workplace and continue work as normal. Have a pleasant shift, [station_name()], and thank you for watching with us.",
|
||||
sound = 'sound/misc/notice2.ogg',
|
||||
sender_override = "Kinaris Meteorology Division")
|
||||
sound = 'sound/misc/notice2.ogg',
|
||||
sender_override = "Kinaris Meteorology Division")
|
||||
for(var/S in applicable_areas)
|
||||
fade_to_black(S)
|
||||
|
||||
/datum/round_event/aurora_caelus/proc/fade_to_black(turf/open/space/S)
|
||||
set waitfor = FALSE
|
||||
var/new_light = initial(S.light_range)
|
||||
while(S.light_range > new_light)
|
||||
S.set_light(S.light_range - 0.2)
|
||||
sleep(30)
|
||||
S.set_light(new_light, initial(S.light_power), initial(S.light_color))
|
||||
var/i = 0.8
|
||||
while(i>0)
|
||||
S.set_light(l_power=i)
|
||||
sleep(10)
|
||||
i -= 0.05 //16 seconds
|
||||
S.set_light(initial(S.light_range), initial(S.light_power), initial(S.light_color))
|
||||
|
||||
@@ -35,16 +35,8 @@
|
||||
source = initial(example.name)
|
||||
else if(originMachine)
|
||||
source = originMachine.name
|
||||
if(prob(50))
|
||||
priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert")
|
||||
else
|
||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak
|
||||
for(var/obj/machinery/computer/communications/C in GLOB.machines)
|
||||
if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z))
|
||||
var/obj/item/paper/P = new(C.loc)
|
||||
P.name = "Rampant brand intelligence"
|
||||
P.info = "Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source]."
|
||||
P.update_icon()
|
||||
priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert")
|
||||
|
||||
/datum/round_event/brand_intelligence/start()
|
||||
for(var/obj/machinery/vending/V in GLOB.machines)
|
||||
if(!is_station_level(V.z))
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
spawncount = rand(5, 8)
|
||||
|
||||
/datum/round_event/spider_infestation/announce(fake)
|
||||
priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg')
|
||||
priority_announce("Unidentified lifesigns detected aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg')
|
||||
|
||||
|
||||
/datum/round_event/spider_infestation/start()
|
||||
|
||||
@@ -885,7 +885,7 @@
|
||||
id = /datum/reagent/consumable/ethanol/hotlime_miami
|
||||
results = list(/datum/reagent/consumable/ethanol/hotlime_miami = 2)
|
||||
required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/consumable/ethanol/pina_colada = 1)
|
||||
|
||||
|
||||
/datum/chemical_reaction/commander_and_chief
|
||||
name = "Commander and Chief"
|
||||
id = /datum/reagent/consumable/ethanol/commander_and_chief
|
||||
@@ -899,3 +899,15 @@
|
||||
results = list(/datum/reagent/consumable/wockyslush = 5)
|
||||
required_reagents = list(/datum/reagent/toxin/fentanyl = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/lemon_lime = 1)
|
||||
mix_message = "That thang bleedin’ P!"
|
||||
|
||||
/datum/chemical_reaction/cum_in_a_hot_tub
|
||||
name = "Cum in a Hot Tub"
|
||||
id = /datum/reagent/consumable/ethanol/cum_in_a_hot_tub
|
||||
results = list(/datum/reagent/consumable/ethanol/cum_in_a_hot_tub = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/ethanol/white_russian = 1, /datum/reagent/consumable/ethanol/irish_cream = 0.1)
|
||||
|
||||
/datum/chemical_reaction/cum_in_a_hot_tub/semen
|
||||
name = "Cum in a Hot Tub"
|
||||
id = /datum/reagent/consumable/ethanol/cum_in_a_hot_tub/semen
|
||||
results = list(/datum/reagent/consumable/ethanol/cum_in_a_hot_tub/semen = 3)
|
||||
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/semen = 1, /datum/reagent/consumable/ethanol/irish_cream = 0.1)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
var/nutrition_ratio = 0
|
||||
var/thirst_ratio = 1
|
||||
//thirst_ratio = 1 //Uncomment if something fancy gets added
|
||||
switch(nutrition)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
nutrition_ratio = 0.2
|
||||
@@ -61,7 +61,7 @@
|
||||
if(satiety > 80)
|
||||
nutrition_ratio *= 1.25
|
||||
nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR)
|
||||
thirst = max(0, thirst - thirst_ratio * THIRST_FACTOR)
|
||||
thirst = max(0, thirst - 0.8 * THIRST_FACTOR)
|
||||
blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio)
|
||||
|
||||
//Effects of bloodloss
|
||||
|
||||
@@ -44,4 +44,4 @@
|
||||
thirst -= THIRST_FACTOR/12
|
||||
if(m_intent == MOVE_INTENT_RUN)
|
||||
nutrition -= HUNGER_FACTOR/5
|
||||
thirst -= THIRST_FACTOR/5 //running around depleats thirst more so.
|
||||
thirst -= THIRST_FACTOR/5
|
||||
|
||||
@@ -82,6 +82,18 @@
|
||||
if(changeling)
|
||||
sList2 += "Chemical Storage: " + "[changeling.chem_charges]/[changeling.chem_storage]"
|
||||
sList2 += "Absorbed DNA: "+ "[changeling.absorbedcount]"
|
||||
var/datum/antagonist/nightmare/nightmare = mind.has_antag_datum(/datum/antagonist/nightmare)
|
||||
if(nightmare)
|
||||
for(var/datum/objective/O in mind.objectives)
|
||||
if(istype(O, /datum/objective/break_lights))
|
||||
var/datum/objective/break_lights/BL = O
|
||||
if(BL.mode) //Keeping lights out of areas
|
||||
var/T = "Target Area(s): "
|
||||
for(var/area/I in BL.area_targets)
|
||||
T += "[initial(I.name)], "
|
||||
sList2 += T
|
||||
else //Break number of lights
|
||||
sList2 += "Lights Broken: " + "[BL.lightsbroken]/[BL.target_amount]"
|
||||
if (sList2 != null)
|
||||
stat(null, "[sList2.Join("\n\n")]")
|
||||
|
||||
|
||||
@@ -1243,7 +1243,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
|
||||
// THEY HUNGER
|
||||
var/hunger_rate = HUNGER_FACTOR
|
||||
var/thirst_rate = THIRST_FACTOR
|
||||
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
|
||||
if(mood && mood.sanity > SANITY_DISTURBED)
|
||||
hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
|
||||
@@ -1262,7 +1261,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
hunger_rate = 3 * HUNGER_FACTOR
|
||||
hunger_rate *= H.physiology.hunger_mod
|
||||
H.nutrition = max(0, H.nutrition - hunger_rate)
|
||||
H.thirst = max(0, H.thirst - thirst_rate)
|
||||
|
||||
|
||||
if (H.nutrition > NUTRITION_LEVEL_FULL)
|
||||
@@ -1298,14 +1296,23 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
H.throw_alert("nutrition", /obj/screen/alert/starving)
|
||||
|
||||
/datum/species/proc/handle_thirst(mob/living/carbon/human/H)
|
||||
if(HAS_TRAIT(src, TRAIT_NOTHIRST))
|
||||
return
|
||||
|
||||
//Put more things here if you plan on adding more things. I know this proc is a bit empty at the moment
|
||||
H.thirst -= THIRST_FACTOR
|
||||
|
||||
|
||||
switch(H.thirst)
|
||||
if(NUTRITION_LEVEL_HUNGRY to INFINITY)
|
||||
if(THIRST_LEVEL_THIRSTY to INFINITY)
|
||||
H.clear_alert("thirst")
|
||||
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
|
||||
if(THIRST_LEVEL_PARCHED to THIRST_LEVEL_THIRSTY)
|
||||
H.throw_alert("thirst", /obj/screen/alert/thirsty)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
if(0 to THIRST_LEVEL_PARCHED)
|
||||
H.throw_alert("thirst", /obj/screen/alert/dehydrated)
|
||||
|
||||
|
||||
/datum/species/proc/update_health_hud(mob/living/carbon/human/H)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -183,9 +183,14 @@
|
||||
. = ..()
|
||||
if(!proximity)
|
||||
return
|
||||
if(isopenturf(AM)) //So you can actually melee with it
|
||||
if(isopenturf(AM) && !istype(AM, /turf/open/space) && !istype(AM, /turf/open/lava))
|
||||
var/turf/T = AM
|
||||
if(T.light_power || T.light_range)
|
||||
to_chat(user, "<span class='notice'>[src] consumes the lights in [AM].</span>")
|
||||
T.set_light(0,0)
|
||||
else if(isopenturf(AM))
|
||||
return
|
||||
if(isliving(AM))
|
||||
else if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(iscyborg(AM))
|
||||
var/mob/living/silicon/robot/borg = AM
|
||||
@@ -194,20 +199,40 @@
|
||||
to_chat(borg, "<span class='danger'>Your headlamp is fried! You'll need a human to help replace it.</span>")
|
||||
else
|
||||
for(var/obj/item/O in AM)
|
||||
if(O.light_range && O.light_power)
|
||||
disintegrate(O)
|
||||
if(L.pulling && L.pulling.light_range && isitem(L.pulling))
|
||||
disintegrate(L.pulling)
|
||||
if(O.light_range && O.light_power && !check_plasmaman(O, AM))
|
||||
disintegrate(O, user)
|
||||
if(L.pulling && L.pulling.light_range && isitem(L.pulling) && !check_plasmaman(L.pulling, L))
|
||||
disintegrate(L.pulling, user)
|
||||
else if(isitem(AM))
|
||||
var/obj/item/I = AM
|
||||
if(I.light_range && I.light_power)
|
||||
disintegrate(I)
|
||||
if(I.light_range && I.light_power && !check_plasmaman(AM))
|
||||
disintegrate(I, user)
|
||||
else if(istype(AM, /obj/structure/marker_beacon))
|
||||
var/obj/structure/marker_beacon/I = AM
|
||||
disintegrate(I)
|
||||
disintegrate(I, user)
|
||||
//why the fuck is the marker beacon a structure? who. what. why.
|
||||
else if(istype(AM, /obj/machinery/light))
|
||||
var/obj/machinery/light/L = AM
|
||||
if(L.status == 2) //Assume we just broke the light
|
||||
handle_objectives(user)
|
||||
L.status = 1 //No tube
|
||||
L.update(FALSE)
|
||||
|
||||
/obj/item/light_eater/proc/disintegrate(obj/item/O)
|
||||
/obj/item/light_eater/proc/handle_objectives(mob/living/carbon/human/H)
|
||||
if(!H.mind)
|
||||
return
|
||||
|
||||
if(!H.mind.objectives)
|
||||
return
|
||||
|
||||
for(var/O in H.mind.objectives)
|
||||
if(!istype(O, /datum/objective/break_lights))
|
||||
continue
|
||||
var/datum/objective/break_lights/BL = O
|
||||
if(!BL.mode)
|
||||
BL.lightsbroken++
|
||||
|
||||
/obj/item/light_eater/proc/disintegrate(obj/item/O, user)
|
||||
if(istype(O, /obj/item/pda))
|
||||
var/obj/item/pda/PDA = O
|
||||
PDA.set_light(0)
|
||||
@@ -220,5 +245,21 @@
|
||||
O.burn()
|
||||
playsound(src, 'sound/items/welder.ogg', 50, 1)
|
||||
|
||||
if(is_species(user, /datum/species/shadow/nightmare))
|
||||
handle_objectives(user)
|
||||
|
||||
/obj/item/light_eater/proc/check_plasmaman(obj/item/O, mob/living/carbon/human/user)
|
||||
if(!istype(O, /obj/item/clothing/head/helmet/space/plasmaman))
|
||||
return FALSE
|
||||
var/obj/item/clothing/head/helmet/space/plasmaman/H = O
|
||||
if(H.on)
|
||||
H.on = FALSE
|
||||
H.icon_state = "[initial(H.icon_state)][H.on ? "-light":""]"
|
||||
H.item_state = H.icon_state
|
||||
if(user)
|
||||
user.update_inv_head()
|
||||
to_chat(user, "<span class='warning'>Your [H]'s torch extinguishes!</span>")
|
||||
return TRUE
|
||||
|
||||
#undef HEART_SPECIAL_SHADOWIFY
|
||||
#undef HEART_RESPAWN_THRESHHOLD
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
var/datum/atom_hud/alternate_appearance/AA = v
|
||||
AA.onNewMob(src)
|
||||
nutrition = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX)
|
||||
thirst = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX)
|
||||
. = ..()
|
||||
update_config_movespeed()
|
||||
update_movespeed(TRUE)
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity)
|
||||
|
||||
var/heat = energy_transfer*(1-efficiency)
|
||||
lastgen += energy_transfer*efficiency
|
||||
lastgen += LOGISTIC_FUNCTION(500000,0.0009,delta_temperature,10000)
|
||||
|
||||
hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity
|
||||
cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity
|
||||
|
||||
@@ -81,6 +81,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
current_cycle++
|
||||
if(holder)
|
||||
holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
|
||||
M.thirst += hydration
|
||||
return
|
||||
|
||||
//called when a mob processes chems when dead.
|
||||
|
||||
@@ -2422,3 +2422,19 @@ datum/reagent/consumable/ethanol/creme_de_coconut
|
||||
M.set_drugginess(50)
|
||||
M.adjustStaminaLoss(-2)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/cum_in_a_hot_tub
|
||||
name = "Cum in the Hot Tub"
|
||||
boozepwr = 80
|
||||
color = "#D2D7D9"
|
||||
quality = DRINK_VERYGOOD
|
||||
taste_description = "smooth cream"
|
||||
glass_icon_state = "cum_glass"
|
||||
shot_glass_icon_state = "cum_shot" //I'm funny, I know
|
||||
glass_name = "Cum in the Hot Tub"
|
||||
glass_desc = "Doesn't really leave it to the imagination, eh?"
|
||||
|
||||
/datum/reagent/consumable/ethanol/cum_in_a_hot_tub/semen
|
||||
boozepwr = 65
|
||||
taste_description = "viscous cream"
|
||||
glass_desc = "The name is probably exactly what it is."
|
||||
|
||||
@@ -3,9 +3,6 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/datum/reagent/water/
|
||||
hydration = 10 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/consumable/orangejuice
|
||||
name = "Orange Juice"
|
||||
description = "Both delicious AND rich in Vitamin C, what more do you need?"
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
/datum/reagent/consumable/on_mob_life(mob/living/carbon/M)
|
||||
current_cycle++
|
||||
M.nutrition += nutriment_factor
|
||||
M.thirst += hydration
|
||||
holder.remove_reagent(type, metabolization_rate)
|
||||
|
||||
/datum/reagent/consumable/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
||||
|
||||
@@ -258,12 +258,7 @@
|
||||
glass_name = "glass of water"
|
||||
glass_desc = "The father of all refreshments."
|
||||
shot_glass_icon_state = "shotglassclear"
|
||||
hydration = 5 * REAGENTS_METABOLISM
|
||||
|
||||
//hydration
|
||||
/datum/reagent/water/on_mob_life(mob/living/carbon/M)
|
||||
M.thirst += hydration
|
||||
..()
|
||||
hydration = 10 * REAGENTS_METABOLISM
|
||||
|
||||
/*
|
||||
* Water reaction to turf
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!(organ_flags & ORGAN_FAILING))
|
||||
H.dna.species.handle_digestion(H)
|
||||
H.dna.species.handle_thirst(H)
|
||||
handle_disgust(H)
|
||||
Nutri = locate(/datum/reagent/consumable/nutriment) in H.reagents.reagent_list
|
||||
|
||||
@@ -99,4 +100,4 @@
|
||||
|
||||
/obj/item/organ/stomach/ipc
|
||||
name = "ipc stomach"
|
||||
icon_state = "stomach-ipc"
|
||||
icon_state = "stomach-ipc"
|
||||
|
||||
@@ -34,3 +34,16 @@
|
||||
mob_trait = TRAIT_HEAT
|
||||
gain_text = "<span class='notice'>You body burns with the desire to be bred.</span>"
|
||||
lose_text = "<span class='notice'>You feel more in control of your body and thoughts.</span>"
|
||||
|
||||
/datum/quirk/overweight
|
||||
name = "Overweight"
|
||||
desc = "You're particularly fond of food, and join the round being overweight."
|
||||
value = 0
|
||||
gain_text = "<span class='notice'>You feel a bit chubby!</span>"
|
||||
//no lose_text cause why would there be?
|
||||
|
||||
/datum/quirk/overweight/on_spawn()
|
||||
var/mob/living/M = quirk_holder
|
||||
M.nutrition = rand(NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MAX)
|
||||
M.overeatduration = 100
|
||||
ADD_TRAIT(M, TRAIT_FAT, OBESITY)
|
||||
|
||||
@@ -54,11 +54,21 @@
|
||||
squeak_override = list('sound/voice/gorillaplush.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mammal/lyricalpaws
|
||||
name = "Winter Dawn Plushie"
|
||||
desc = "Winter Dawn in plushie form! Very cuddly."
|
||||
name = "hyena plushie"
|
||||
desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! She's a little yeen in a big labcoat."
|
||||
gender = FEMALE //probably a girl
|
||||
icon = 'hyperstation/icons/obj/plushes.dmi'
|
||||
icon_state = "lyricalpaws"
|
||||
item_state = "lyricalpaws"
|
||||
attack_verb = list("hugged", "cuddled", "embraced")
|
||||
squeak_override = list(
|
||||
'modular_citadel/sound/voice/bark1.ogg' = 1,
|
||||
'modular_citadel/sound/voice/bark2.ogg' = 1
|
||||
)
|
||||
|
||||
/obj/item/toy/plush/mammal/lyricalpaws/attack_self(mob/user)
|
||||
to_chat(user, "<span class='notice'>You pet [src]. You swear she looks up at you.</span>")
|
||||
|
||||
|
||||
/obj/item/toy/plush/mammal/chemlight
|
||||
desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! It looks to glow and sport four arms."
|
||||
|
||||
@@ -103,4 +103,24 @@
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi'
|
||||
icon_state = "keaton"
|
||||
flags_inv = HIDEFACE|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/chloe
|
||||
name = "Fleet Commander's Overcoat"
|
||||
desc = "Custom tailored to warm the cold commanding hearts of the Syndicate's feared XIV'th battle group. Its armour plating has been removed, but its beret remains inside."
|
||||
icon_state = "commissar_greatcoat"
|
||||
item_state = "commissar_greatcoat"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
tauric = TRUE
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/chloe
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/chloe
|
||||
name = "Fleet Commander's Beret"
|
||||
desc = "A beret bearing a worn golden symbol that stikes fear in the hearts of many. It smells faintly of plasma and gunpowder."
|
||||
icon = 'hyperstation/icons/obj/clothing/rewards.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi'
|
||||
icon_state = "commissar_beret"
|
||||
item_state = "commissar_beret"
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 815 B After Width: | Height: | Size: 962 B |
|
Before Width: | Height: | Size: 415 KiB After Width: | Height: | Size: 426 KiB |
|
Before Width: | Height: | Size: 407 KiB After Width: | Height: | Size: 409 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
@@ -306,23 +306,6 @@
|
||||
announcer.announce("CRYOSTORAGE", mob_occupant.real_name, announce_rank, announce_job_title, list())
|
||||
visible_message("<span class='notice'>\The [src] hums and hisses as it moves [mob_occupant.real_name] into storage.</span>")
|
||||
|
||||
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
if(W.loc.loc && (( W.loc.loc == loc ) || (W.loc.loc == control_computer)))
|
||||
continue//means we already moved whatever this thing was in
|
||||
//I'm a professional, okay
|
||||
for(var/T in preserve_items)
|
||||
if(istype(W, T))
|
||||
if(control_computer && control_computer.allow_items)
|
||||
control_computer.frozen_items += W
|
||||
mob_occupant.transferItemToLoc(W, control_computer, TRUE)
|
||||
else
|
||||
mob_occupant.transferItemToLoc(W, loc, TRUE)
|
||||
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
qdel(W)//because we moved all items to preserve away
|
||||
//and yes, this totally deletes their bodyparts one by one, I just couldn't bother
|
||||
|
||||
if(iscyborg(mob_occupant))
|
||||
var/mob/living/silicon/robot/R = occupant
|
||||
if(!istype(R)) return ..()
|
||||
@@ -330,6 +313,24 @@
|
||||
R.contents -= R.mmi
|
||||
qdel(R.mmi)
|
||||
|
||||
QDEL_NULL_LIST(R.contents)
|
||||
else
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
if(W.loc.loc && (( W.loc.loc == loc ) || (W.loc.loc == control_computer)))
|
||||
continue//means we already moved whatever this thing was in
|
||||
//I'm a professional, okay
|
||||
for(var/T in preserve_items)
|
||||
if(istype(W, T))
|
||||
if(control_computer && control_computer.allow_items)
|
||||
control_computer.frozen_items += W
|
||||
mob_occupant.transferItemToLoc(W, control_computer, TRUE)
|
||||
else
|
||||
mob_occupant.transferItemToLoc(W, loc, TRUE)
|
||||
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
qdel(W)//because we moved all items to preserve away
|
||||
//and yes, this totally deletes their bodyparts one by one, I just couldn't bother
|
||||
|
||||
// Ghost and delete the mob.
|
||||
if(!mob_occupant.get_ghost(1))
|
||||
mob_occupant.ghostize(0) // Players who cryo out may not re-enter the round
|
||||
@@ -387,7 +388,7 @@
|
||||
if(target.mind.special_role == ROLE_TRAITOR)
|
||||
alert("<span class='userdanger'>You're a Traitor![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
|
||||
|
||||
if(caught)
|
||||
target.client.cryo_warned = world.time
|
||||
return
|
||||
|
||||
@@ -105,6 +105,12 @@
|
||||
path = /obj/item/toy/plush/mammal/lyricalpaws
|
||||
ckeywhitelist = list("lyricalpaws")
|
||||
|
||||
/datum/gear/lyricalpawssuit
|
||||
name = "Fleet Commander's Overcoat"
|
||||
category = SLOT_IN_BACKPACK
|
||||
path = /obj/item/clothing/suit/hooded/wintercoat/chloe
|
||||
ckeywhitelist = list("lyricalpaws")
|
||||
|
||||
/datum/gear/cherostavikmask
|
||||
name = "Keaton Mask"
|
||||
category = SLOT_IN_BACKPACK
|
||||
|
||||
|
Before Width: | Height: | Size: 422 KiB After Width: | Height: | Size: 424 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 115 KiB |
@@ -1375,6 +1375,7 @@
|
||||
#include "code\modules\antagonists\morph\morph.dm"
|
||||
#include "code\modules\antagonists\morph\morph_antag.dm"
|
||||
#include "code\modules\antagonists\nightmare\nightmare.dm"
|
||||
#include "code\modules\antagonists\nightmare\nightmare_objectives.dm"
|
||||
#include "code\modules\antagonists\ninja\ninja.dm"
|
||||
#include "code\modules\antagonists\nukeop\clownop.dm"
|
||||
#include "code\modules\antagonists\nukeop\nukeop.dm"
|
||||
|
||||