This commit is contained in:
QuoteFox
2021-02-25 11:15:19 +00:00
44 changed files with 409 additions and 145 deletions
+9
View File
@@ -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)
+9
View File
@@ -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
+6 -4
View File
@@ -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()
+14 -4
View File
@@ -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."
+2 -10
View File
@@ -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))
+1 -10
View File
@@ -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))
+1 -10
View File
@@ -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))
+1 -10
View File
@@ -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))
+1 -10
View File
@@ -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))
+53 -23
View File
@@ -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))
+2 -10
View File
@@ -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))
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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
+1
View File
@@ -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)
+1 -1
View File
@@ -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
+2 -1
View File
@@ -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)
+12 -2
View File
@@ -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."
+21 -1
View File
@@ -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"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 815 B

After

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 KiB

After

Width:  |  Height:  |  Size: 426 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 407 KiB

After

Width:  |  Height:  |  Size: 409 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 101 KiB

+19 -18
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 422 KiB

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 115 KiB

+1
View File
@@ -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"