diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index ee503c5f47..110c581955 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -316,8 +316,11 @@ radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null if(frequency) - radio_connection = register_radio(src, frequency, frequency, radio_filter_in) - src.broadcast_status() + set_frequency(frequency) + +/obj/machinery/atmospherics/unary/vent_pump/proc/set_frequency(new_frequency) + radio_connection = register_radio(src, frequency, new_frequency, radio_filter_in) + frequency = new_frequency /obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) @@ -415,6 +418,20 @@ else to_chat(user, span_warning("You need more welding fuel to complete this task.")) return 1 + if(W.has_tool_quality(TOOL_MULTITOOL)) + var/choice = tgui_alert(user, "[src] has an ID of \"[id_tag]\" and a frequency of [frequency]. What would you like to change?", "[src] ID", list("ID Tag", "Frequency", "Nothing")) + switch(choice) + if("ID Tag") + var/new_id = tgui_input_text(user, "[src] has an ID of \"[id_tag]\". What would you like it to be?", "[src] ID", id_tag, 30, FALSE, TRUE) + if(new_id) + id_tag = new_id + + if("Frequency") + var/new_frequency = tgui_input_number(user, "[src] has a frequency of [frequency]. What would you like it to be?", "[src] frequency", frequency, RADIO_HIGH_FREQ, RADIO_LOW_FREQ) + if(new_frequency) + new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) + set_frequency(new_frequency) + return TRUE else ..() diff --git a/code/__defines/diseases.dm b/code/__defines/diseases.dm index 30f1d6252b..97f0025228 100644 --- a/code/__defines/diseases.dm +++ b/code/__defines/diseases.dm @@ -18,7 +18,6 @@ #define CONTACT_GENERAL (1<<5) #define AIRBORNE (1<<6) - //Severity Defines #define NONTHREAT "No threat" #define MINOR "Minor" diff --git a/code/__defines/faction.dm b/code/__defines/faction.dm index 766c2d51aa..a264a643ad 100644 --- a/code/__defines/faction.dm +++ b/code/__defines/faction.dm @@ -111,6 +111,7 @@ #define FACTION_WOLFTAUR "wolftaur" #define FACTION_WORM "worm" #define FACTION_XENO "xeno" +#define FACTION_CORGI "corgi" #define FACTION_PLANTS "plants" diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 990ddc1fa0..74121881ce 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -40,11 +40,12 @@ //VOREStation Add #define BE_LOSTDRONE 0x10000 #define BE_MAINTPRED 0x20000 -#define BE_MORPH 0x40000 -#define BE_CORGI 0x80000 -#define BE_CURSEDSWORD 0x100000 -#define BE_SURVIVOR 0x200000 -#define BE_EVENT 0x400000 +#define BE_MAINTLURKER 0x40000 +#define BE_MORPH 0x80000 +#define BE_CORGI 0x100000 +#define BE_CURSEDSWORD 0x200000 +#define BE_SURVIVOR 0x400000 +#define BE_EVENT 0x800000 //VOREStation Add End var/list/be_special_flags = list( @@ -67,6 +68,7 @@ var/list/be_special_flags = list( //VOREStation Add "Lost Drone" = BE_LOSTDRONE, "Maint Pred" = BE_MAINTPRED, + "Maint Lurker" = BE_MAINTLURKER, "Morph" = BE_MORPH, "Corgi" = BE_CORGI, "Cursed Sword" = BE_CURSEDSWORD, diff --git a/code/__defines/jobs.dm b/code/__defines/jobs.dm index 78454247d1..2bb7c66108 100644 --- a/code/__defines/jobs.dm +++ b/code/__defines/jobs.dm @@ -421,3 +421,4 @@ #define JOB_XENOMORPH "Xenomorph" #define JOB_BORER "Borer" #define JOB_EMERGENCY_RESPONSE_TEAM "Emergency Response Team" +#define JOB_MAINT_LURKER "Maintenance Lurker" diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 2f8c4581fb..3f45ca459b 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -48,10 +48,6 @@ #define CLIENT_FROM_VAR(I) (ismob(I) ? I:client : (isclient(I) ? I : null)) - -//Persistence -#define AREA_FLAG_IS_NOT_PERSISTENT 8 // SSpersistence will not track values from this area. - // Shuttles. // These define the time taken for the shuttle to get to the space station, and the time before it leaves again. @@ -99,7 +95,19 @@ #define DEFAULT_JOB_TYPE /datum/job/assistant //Area flags, possibly more to come -#define RAD_SHIELDED 1 //shielded from radiation, clearly +#define RAD_SHIELDED 0x1 //shielded from radiation, clearly +#define BLUE_SHIELDED 0x2 // Shield from bluespace teleportation (telescience) +#define AREA_SECRET_NAME 0x4 // This tells certain things that display areas' names that they shouldn't display this area's name. +#define AREA_FLAG_IS_NOT_PERSISTENT 0x8 // SSpersistence will not track values from this area. +#define AREA_FORBID_EVENTS 0x10 // random events will not start inside this area. +#define AREA_FORBID_SINGULO 0x20 // singulo will not move in. +#define AREA_NO_SPOILERS 0x40 // makes it much more difficult to see what is inside an area with things like mesons. +#define AREA_SOUNDPROOF 0x80 // blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within. +#define AREA_BLOCK_PHASE_SHIFT 0x100 // Stops phase shifted mobs from entering +#define AREA_BLOCK_GHOSTS 0x200 // Stops ghosts from entering +#define AREA_ALLOW_LARGE_SIZE 0x400 // If mob size is limited in the area. +#define AREA_BLOCK_SUIT_SENSORS 0x800 // If suit sensors are blocked in the area. +#define AREA_BLOCK_TRACKING 0x1000 // If camera tracking is blocked in the area. // OnTopic return values #define TOPIC_NOACTION 0 diff --git a/code/__defines/misc_vr.dm b/code/__defines/misc_vr.dm index 262a6d402b..ab083010b1 100644 --- a/code/__defines/misc_vr.dm +++ b/code/__defines/misc_vr.dm @@ -40,11 +40,6 @@ //Shuttle madness! #define SHUTTLE_CRASHED 3 // Yup that can happen now -#define BLUE_SHIELDED 2 // Shield from bluespace teleportation (telescience) -#define TEMPERATURE_SHIELDED 4 // YW Addition: Temperature change shielding -// YW Addition: 8 used for persistence block somewhere else -#define PHASE_SHIELDED 16 // YW Addition: Prevents shadekin phasing in/out in this area - //Herm Gender #define HERM "herm" diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 77e1e2d74a..b6b6cffd65 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -328,6 +328,7 @@ #define SPECIES_XENO_HUNTER "Xenomorph Hunter" #define SPECIES_XENO_SENTINEL "Xenomorph Sentinel" #define SPECIES_XENO_QUEEN "Xenomorph Queen" +#define SPECIES_XENOMORPH_HYBRID "Xenomorph Hybrid" // Misc species. Mostly unused but might as well be complete. #define SPECIES_SHADOW "Shadow" @@ -456,3 +457,6 @@ #define VISIBLE_GENDER_FORCE_PLURAL 1 // Used by get_visible_gender to return PLURAL #define VISIBLE_GENDER_FORCE_IDENTIFYING 2 // Used by get_visible_gender to return the mob's identifying gender #define VISIBLE_GENDER_FORCE_BIOLOGICAL 3 // Used by get_visible_gender to return the mob's biological gender + +// Default name for accesories +#define DEVELOPER_WARNING_NAME "you should not see this..." diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm index 146fcb86ab..8e9a54569e 100644 --- a/code/__defines/species_languages_vr.dm +++ b/code/__defines/species_languages_vr.dm @@ -15,6 +15,7 @@ #define LANGUAGE_ANIMAL "Animal" #define LANGUAGE_TEPPI "Teppi" #define LANGUAGE_MOUSE "Mouse" +#define LANNGUAGE_DRAKE "Drake" #define LANGUAGE_SHADEKIN "Shadekin Empathy" #define LANGUAGE_LLEILL "Glamour Speak" diff --git a/code/__defines/talksounds.dm b/code/__defines/talksounds.dm new file mode 100644 index 0000000000..4f01b4fb2f --- /dev/null +++ b/code/__defines/talksounds.dm @@ -0,0 +1,63 @@ + + +var/list/talk_sound_map = rlist( + list( + "beep-boop", + "goon speak 1", + "goon speak 2", + "goon speak 3", + "goon speak 4", + "goon speak blub", + "goon speak bottalk", + "goon speak buwoo", + "goon speak cow", + "goon speak lizard", + "goon speak pug", + "goon speak pugg", + "goon speak roach", + "goon speak skelly", + // "xeno speak" // Does not exist on virgo + ), + list( + talk_sound, + goon_speak_one_sound, + goon_speak_two_sound, + goon_speak_three_sound, + goon_speak_four_sound, + goon_speak_blub_sound, + goon_speak_bottalk_sound, + goon_speak_buwoo_sound, + goon_speak_cow_sound, + goon_speak_lizard_sound, + goon_speak_pug_sound, + goon_speak_pugg_sound, + goon_speak_roach_sound, + goon_speak_skelly_sound, + // xeno_speak_sound // Does not exist on virgo + ) + ) + +/proc/get_talk_sound(var/voice_sound) + if(!voice_sound) + return talk_sound_map[1] + return talk_sound_map[2][voice_sound] + +/proc/rlist(var/list/keys,var/list/values) //short for reversible list generator + var/list/rlist = list(list(),list(),FALSE,0) + var/i = 0 + for(i = 1, i <= LAZYLEN(keys), i++) + to_chat(world,keys[i]) + rlist[1] += keys[i] + rlist[2][keys[i]] = values[i] + rlist += TRUE + rlist += i + return rlist + +/proc/arlist(var/list/altlist) + var/list/rlist = list(list(),list(),FALSE,0) + var/i = 0 + for(i = 1, i <= LAZYLEN(altlist), i++) + rlist[(i % 2) +1] += altlist[i] + rlist += TRUE + rlist += i/2 + return rlist diff --git a/code/_helpers/unsorted_vr.dm b/code/_helpers/unsorted_vr.dm index 88c6dba1b2..a21466983d 100644 --- a/code/_helpers/unsorted_vr.dm +++ b/code/_helpers/unsorted_vr.dm @@ -19,7 +19,7 @@ if(vent.welded) continue var/area/A = get_area(vent) - if(A.forbid_events) + if(A.flag_check(AREA_FORBID_EVENTS)) continue vent_list += vent if(!vent_list.len) diff --git a/code/controllers/subsystems/persistence.dm b/code/controllers/subsystems/persistence.dm index bd7e978363..1950e90e14 100644 --- a/code/controllers/subsystems/persistence.dm +++ b/code/controllers/subsystems/persistence.dm @@ -33,7 +33,7 @@ SUBSYSTEM_DEF(persistence) return var/area/A = get_area(T) - if(!A || (A.flags & AREA_FLAG_IS_NOT_PERSISTENT)) + if(!A || (A.flag_check(AREA_FLAG_IS_NOT_PERSISTENT))) return if(!(T.z in using_map.persist_levels)) diff --git a/code/controllers/subsystems/radiation.dm b/code/controllers/subsystems/radiation.dm index 167dc9314c..624d6f4279 100644 --- a/code/controllers/subsystems/radiation.dm +++ b/code/controllers/subsystems/radiation.dm @@ -73,7 +73,7 @@ SUBSYSTEM_DEF(radiation) if(source.respect_maint) var/area/A = T.loc - if(A.flags & RAD_SHIELDED) + if(A.flag_check(RAD_SHIELDED)) continue // In shielded area var/dist = get_dist(source.source_turf, T) diff --git a/code/datums/components/resize_guard.dm b/code/datums/components/resize_guard.dm index d708002cc1..ca8adfab43 100644 --- a/code/datums/components/resize_guard.dm +++ b/code/datums/components/resize_guard.dm @@ -13,7 +13,8 @@ /datum/component/resize_guard/proc/check_resize() var/area/A = get_area(parent) - if(A?.limit_mob_size) - var/mob/living/L = parent - L.resize(L.size_multiplier, ignore_prefs = TRUE) - qdel(src) + if(A?.flag_check(AREA_ALLOW_LARGE_SIZE)) + return + var/mob/living/L = parent + L.resize(L.size_multiplier, ignore_prefs = TRUE) + qdel(src) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 6eda375458..e5790c3bca 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -3,8 +3,8 @@ GLOBAL_LIST_EMPTY(archive_diseases) GLOBAL_LIST_INIT(advance_cures, list( "sodiumchloride", "sugar", "orangejuice", "spaceacillin", "glucose", "ethanol", - "dyloteane", "impedrezene", "hepanephrodaxon", - "gold", "silver" + "leporazine", "impedrezene", "hepanephrodaxon", + "silver", "gold" )) /datum/disease/advance @@ -236,6 +236,13 @@ GLOBAL_LIST_INIT(advance_cures, list( Refresh(1) return +/datum/disease/advance/proc/PickyEvolve(var/list/datum/symptom/D) + var/s = safepick(D) + if(s) + AddSymptom(new s) + Refresh(1) + return + // Randomly remove a symptom. /datum/disease/advance/proc/Devolve() if(length(symptoms) > 1) diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm new file mode 100644 index 0000000000..21a44b2e9f --- /dev/null +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -0,0 +1,38 @@ +/* +////////////////////////////////////// + +Deafness + + Slightly hidden. + Lowers resistance. + Increases stage speed slightly. + Decreases transmittablity. + Intense Level. + +Bonus + Causes intermittent loss of hearing. + +////////////////////////////////////// +*/ + +/datum/symptom/deafness + name = "Deafness" + stealth = 1 + resistance = -2 + stage_speed = 1 + transmittable = -3 + level = 4 + severity = 3 + +/datum/symptom/deafness/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + + switch(A.stage) + if(3, 4) + to_chat(M, span_warning("[pick("you hear a ringing in your ear.", "You ears pop.")]")) + if(5) + to_chat(M, span_userdanger("You ear pop and begin ringing loudly!")) + M.ear_deaf += 20 + return diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index e91efab1c7..00a5a273e7 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -6,7 +6,7 @@ Necrotizing Fasciitis (AKA Flesh-Eating Disease) Very very noticable. Lowers resistance tremendously. No changes to stage speed. - Decreases transmittablity temrendously. + Decreases transmittablity tremendously. Fatal Level. Bonus diff --git a/code/datums/diseases/advance/symptoms/flip.dm b/code/datums/diseases/advance/symptoms/flip.dm new file mode 100644 index 0000000000..e210e4b3bf --- /dev/null +++ b/code/datums/diseases/advance/symptoms/flip.dm @@ -0,0 +1,33 @@ +/* +////////////////////////////////////// + +Flippinov + + Slightly hidden. + No change to resistance. + Increases stage speed. + Little transmittable. + Low Level. + +BONUS + Makes the host FLIP. + Should be used for buffing your disease. + +////////////////////////////////////// +*/ + +/datum/symptom/spyndrome + name = "Flippinov" + stealth = 2 + resistance = 0 + stage_speed = 3 + transmittable = 1 + level = 1 + severity = 1 + +/datum/symptom/spyndrome/Activate(datum/disease/advance/A) + ..() + + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/L = A.affected_mob + L.emote("flip") diff --git a/code/datums/diseases/advance/symptoms/hair.dm b/code/datums/diseases/advance/symptoms/hair.dm new file mode 100644 index 0000000000..1a6c2ff109 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/hair.dm @@ -0,0 +1,56 @@ +/* +////////////////////////////////////// +Alopecia + + Noticable. + Decreases resistance slightly. + Reduces stage speed slightly. + Transmittable. + Intense Level. + +BONUS + Makes the mob lose hair. + +////////////////////////////////////// +*/ + +/datum/symptom/shedding + name = "Alopecia" + stealth = -1 + resistance = -1 + stage_speed = -1 + transmittable = 2 + level = 4 + severity = 1 + +/datum/symptom/shedding/Activate(datum/disease/advance/A) + ..() + if(!prob(SYMPTOM_ACTIVATION_PROB)) + return + if(ishuman(A.affected_mob)) + return + var/mob/living/carbon/human/H = A.affected_mob + var/obj/item/organ/external/head/head_organ = H.get_organ(BP_HEAD) + if(!istype(head_organ)) + return + to_chat(H, span_warning("[pick("Your scalp itches.", "Your skin feels flakey.")]")) + + switch(A.stage) + if(3, 4) + if(H.h_style != "Bald" && H.h_style != "Balding Hair") + to_chat(H, span_warning("Your hair starts to fall out in clumps...")) + addtimer(CALLBACK(src, PROC_REF(change_hair), H, null, "Balding Hair"), 5 SECONDS) + if(5) + if(H.h_style != "Shaved" && H.h_style != "Bald") + to_chat(H, span_warning("Your hair starts to fall out in clumps...")) + addtimer(CALLBACK(src, PROC_REF(change_hair), H, "Shaved", "Bald"), 5 SECONDS) + return + +/datum/symptom/shedding/proc/change_hair(var/mob/living/carbon/human/H, f_style, h_style) + if(!H) + return + if(f_style) + H.f_style = f_style + if(h_style) + H.h_style = h_style + return diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index 1138d4adba..340b88d6b4 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -130,7 +130,7 @@ Bonus Very high level. Bonus - Heals brain damage, treats radiation. + Heals clone damage, treats radiation. ////////////////////////////////////// */ diff --git a/code/datums/diseases/advance/symptoms/hematophagy.dm b/code/datums/diseases/advance/symptoms/hematophagy.dm new file mode 100644 index 0000000000..53e5aa842d --- /dev/null +++ b/code/datums/diseases/advance/symptoms/hematophagy.dm @@ -0,0 +1,42 @@ +/* +////////////////////////////////////// + +Hematophagy + + Little bit hidden. + Decreases resistance slightly. + Decreases stage speed tremendously. + Slightly increased transmittablity. + Intense level. + +BONUS + The host must feed on BLOOD + +////////////////////////////////////// +*/ + +/datum/symptom/hematophagy + name = "Hematophagy" + stealth = 1 + resistance = -1 + resistance = -4 + transmittable = 1 + level = 4 + +/datum/symptom/hematophagy/Start(datum/disease/advance/A) + if(ishuman(A.affected_mob)) + var/mob/living/carbon/human/H = A.affected_mob + + H.species.organic_food_coeff = 0 + H.species.bloodsucker = TRUE + + add_verb(H, /mob/living/carbon/human/proc/bloodsuck) + +/datum/symptom/hematophagy/End(datum/disease/advance/A) + if(ishuman(A.affected_mob)) + var/mob/living/carbon/human/H = A.affected_mob + + H.species.organic_food_coeff = initial(H.species.organic_food_coeff) + H.species.bloodsucker = initial(H.species.bloodsucker) + + remove_verb(H, /mob/living/carbon/human/proc/bloodsuck) diff --git a/code/datums/diseases/advance/symptoms/photosensitivity.dm b/code/datums/diseases/advance/symptoms/photosensitivity.dm new file mode 100644 index 0000000000..5908bfb259 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/photosensitivity.dm @@ -0,0 +1,41 @@ +/* +////////////////////////////////////// + +Photosensitivity + + Noticable. + Increases resistance. + Increases stage speed slightly. + Decreases transmittablity tremendously. + Fatal Level. + +Bonus + Deals brute damage over time. + +////////////////////////////////////// +*/ + +/datum/symptom/photosensitivity + name = "Photosensitivity" + stealth = -2 + resistance = 2 + stage_speed = 1 + transmittable = -4 + level = 6 + severity = 5 + +/datum/symptom/photosensitivity/Activate(datum/disease/advance/A) + ..() + + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/carbon/human/H = A.affected_mob + var/turf/T = get_turf(H) + switch(A.stage) + if(3) + if(T.get_lumcount() > 0.5) + to_chat(H, span_danger("Your skin itches under the light...")) + if(4, 5) + if(T.get_lumcount() > 0.5) + to_chat(H, span_danger("Your skin feels like burning!")) + H.adjustFireLoss(T.get_lumcount()) + return diff --git a/code/datums/diseases/advance/symptoms/pica.dm b/code/datums/diseases/advance/symptoms/pica.dm new file mode 100644 index 0000000000..ddd7e282d8 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/pica.dm @@ -0,0 +1,46 @@ +/* +////////////////////////////////////// + +Pica + + Not noticable or unnoticable. + Decreases resistance. + Increases stage speed. + Little transmittable. + Low Level. + +BONUS + The host gains hunger for any kind of object. + +////////////////////////////////////// +*/ + +/datum/symptom/pica + name = "Pica" + stealth = 0 + resistance = -2 + stage_speed = 3 + transmittable = 1 + level = 1 + severity = 1 + +/datum/symptom/pica/Start(datum/disease/advance/A) + add_verb(A.affected_mob, /mob/living/proc/eat_trash) + add_verb(A.affected_mob, /mob/living/proc/toggle_trash_catching) + +/datum/symptom/pica/End(datum/disease/advance/A) + remove_verb(A.affected_mob, /mob/living/proc/eat_trash) + remove_verb(A.affected_mob, /mob/living/proc/toggle_trash_catching) + +/datum/symptom/pica/Activate(datum/disease/advance/A) + ..() + + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/list/nearby = oview(5, A.affected_mob) + to_chat(A.affected_mob, span_warning("You could go fo a bite of [pick(nearby)]...")) + else if (prob(SYMPTOM_ACTIVATION_PROB)) + if(ishuman(A.affected_mob)) + var/mob/living/carbon/human/H = A.affected_mob + var/list/item = H.get_equipped_items() + to_chat(H, span_warning("[pick(item)] looks oddly [pick("delicious", "tasty", "scrumptious", "inviting")]...")) + return diff --git a/code/datums/diseases/advance/symptoms/size.dm b/code/datums/diseases/advance/symptoms/size.dm new file mode 100644 index 0000000000..a0a71fe1b7 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/size.dm @@ -0,0 +1,98 @@ +/* +////////////////////////////////////// + +Mass Revectoring + + Very noticeable. + Increases resistance slightly. + Increases stage speed. + Decreases transmittablity + Intense level. + +BONUS + Changes the size of the host. + +////////////////////////////////////// +*/ + +/datum/symptom/size + name = "Mass Revectoring" + stealth = -4 + resistance = 1 + stage_speed = 2 + transmittable = -2 + level = 4 + severity = 1 + +/datum/symptom/size/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + + switch(A.stage) + if(4, 5) + M.emote("twitch") + Resize(M, rand(25, 200)) + +/datum/symptom/size/proc/Resize(mob/living/M, var/size) + M.resize(size+M.size_multiplier/100) + +/* +////////////////////////////////////// + +Enlargement Disorder + + Very noticeable. + Increases resistance slightly. + Increases stage speed. + Decreases transmittablity + Intense level. + +BONUS + Grows the host to bigger sizes + +////////////////////////////////////// +*/ + +/datum/symptom/size/grow + name = "Enlargement Disorder" + +/datum/symptom/size/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + + switch(A.stage) + if(4, 5) + M.emote("twitch") + Resize(M, rand(100, 200)) + +/* +////////////////////////////////////// + +Dwindling Malady + + Very noticeable. + Increases resistance slightly. + Increases stage speed. + Decreases transmittablity + Intense level. + +BONUS + Shrinks the host to small sizes + +////////////////////////////////////// +*/ + +/datum/symptom/size/shrink + name = "Dwindling Malady" + +/datum/symptom/size/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + + switch(A.stage) + if(4, 5) + M.emote("twitch") + Resize(M, rand(25, 100)) diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm index 63f2ab00e1..529596945b 100644 --- a/code/datums/diseases/advance/symptoms/sneeze.dm +++ b/code/datums/diseases/advance/symptoms/sneeze.dm @@ -42,3 +42,78 @@ Bonus icky.viruses |= A.Copy() return + +/* +////////////////////////////////////// + +Bluespace Sneezing + + Very Noticable. + Resistant + Doesn't increase stage speed. + Little transmittable. + Low Level. + +Bonus + Forces a spread type of AIRBORNE + with extra range AND teleports the mob + +////////////////////////////////////// +*/ + +/datum/symptom/sneeze/bluespace + name = "Bluespace Sneezing" + stealth = -2 + resistance = 3 + stage_speed = 0 + transmittable = 1 + level = 4 + severity = 1 + +/datum/symptom/sneeze/bluespace/Activate(datum/disease/advance/A) + ..() + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/M = A.affected_mob + switch(A.stage) + if(1, 2, 3) + M.emote("sniff") + else + SneezeTeleport(A, M) + A.spread(A.stage) + if(prob(30)) + var/obj/effect/decal/cleanable/mucus/icky = new(get_turf(M)) + icky.viruses |= A.Copy() + + return + +/datum/symptom/sneeze/bluespace/proc/SneezeTeleport(datum/disease/advance/A, var/mob/living/M) + var/list/destination = list() + var/mob/living/carbon/human/H = M + var/place + + for(var/mob/living/carbon/human/B in range(A.stage, M)) + if(B.can_be_drop_pred && H.can_be_drop_prey && H.devourable) + destination += B.vore_selected + + for(var/turf/T in range(A.stage, H)) + if(istype(T, /turf/space)) // No danger, this is just a fun/vore symptom + continue + destination += T + + if(isemptylist(destination)) + to_chat(H, span_warning("You go to sneeze, but can't.")) + return FALSE + + place = safepick(destination) + + var/mob/living/carbon/human/unlucky = locate() in place + + if(unlucky) + if(unlucky.can_be_drop_pred && H.can_be_drop_prey && H.devourable) + place = unlucky.vore_selected + else if(unlucky.devourable && unlucky.can_be_drop_prey && H.can_be_drop_pred) + unlucky.forceMove(H.vore_selected) + + H.emote("sneeze") + do_teleport(H, place) + return TRUE diff --git a/code/datums/diseases/advance/symptoms/spin.dm b/code/datums/diseases/advance/symptoms/spin.dm index 995be34071..055505dba9 100644 --- a/code/datums/diseases/advance/symptoms/spin.dm +++ b/code/datums/diseases/advance/symptoms/spin.dm @@ -16,7 +16,7 @@ BONUS ////////////////////////////////////// */ -/datum/symptom/mlem +/datum/symptom/spyndrome name = "Spyndrome" stealth = 2 resistance = 0 @@ -24,9 +24,8 @@ BONUS transmittable = 1 level = 1 severity = 1 - var/list/directions = list(2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8,2,4,1,8) -/datum/symptom/mlem/Activate(var/datum/disease/advance/A) +/datum/symptom/spyndrome/Activate(var/datum/disease/advance/A) ..() if(prob(SYMPTOM_ACTIVATION_PROB)) @@ -34,7 +33,5 @@ BONUS to_chat(viewers(A.affected_mob), span_warning("[A.affected_mob.name] struggles violently against their restraints!")) else to_chat(viewers(A.affected_mob), span_warning("[A.affected_mob.name] spins around violently!")) - for(var/D in directions) - A.affected_mob.dir = D - A.affected_mob.dir = pick(2,4,1,8) + A.affected_mob.emote("spin") return diff --git a/code/datums/diseases/advance/symptoms/stimulant.dm b/code/datums/diseases/advance/symptoms/stimulant.dm new file mode 100644 index 0000000000..4a427d4036 --- /dev/null +++ b/code/datums/diseases/advance/symptoms/stimulant.dm @@ -0,0 +1,43 @@ +/* +////////////////////////////////////// + +Healing + + No change to stealth. + Slightly decreases resistance. + Increases stage speed. + Decreases transmittablity considerably. + Moderate Level. + +Bonus + Heals toxins in the affected mob's blood stream. + +////////////////////////////////////// +*/ + +/datum/symptom/stimulant + name = "Overactive Adrenal Gland" + stealth = 0 + resistance = -1 + stage_speed = 2 + transmittable = -3 + level = 3 + severity = 1 + +/datum/symptom/stimulant/Activate(datum/disease/advance/A) + ..() + + if(prob(SYMPTOM_ACTIVATION_PROB)) + var/mob/living/L = A.affected_mob + to_chat(L, span_notice("You feel a rush of energy inside you!")) + switch(A.stage) + if(1, 2) + L.jitteriness += 5 + if(3, 4) + L.jitteriness += 10 + else + if(L.reagents.get_reagent_amount("hyperzine" < 10)) + L.reagents.add_reagent("hyperzine", 5) + if(prob(30)) + L.jitteriness += 15 + return diff --git a/code/datums/diseases/advance/symptoms/synthetic_infection.dm b/code/datums/diseases/advance/symptoms/synthetic_infection.dm index cb17d88c81..b34ce07481 100644 --- a/code/datums/diseases/advance/symptoms/synthetic_infection.dm +++ b/code/datums/diseases/advance/symptoms/synthetic_infection.dm @@ -1,7 +1,7 @@ /* ////////////////////////////////////// -Sneezing +Synthetic Infection Slightly hidden. Increases resistance. @@ -23,7 +23,6 @@ Bonus transmittable = 1 level = 5 severity = 3 - id = "synthetic_infection" /datum/symptom/infect_synthetics/Start(datum/disease/advance/A) A.infect_synthetics = TRUE diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm new file mode 100644 index 0000000000..ab7f5383b3 --- /dev/null +++ b/code/datums/diseases/appendicitis.dm @@ -0,0 +1,45 @@ +/datum/disease/appendicitis + form = "Condition" + name = "Appendicitis" + max_stages = 3 + spread_text = "Non-contagius" + spread_flags = NON_CONTAGIOUS + cure_text = "Surgery" + agent = "Shitty Appendix" + viable_mobtypes = list(/mob/living/carbon/human) + desc = "If left untreated the subject will become very weak, and may vomit often." + severity = MINOR + disease_flags = CAN_CARRY|CAN_CARRY + visibility_flags = HIDDEN_PANDEMIC + required_organs = list(/obj/item/organ/internal/appendix) + bypasses_immunity = TRUE + virus_heal_resistant = TRUE + +/datum/disease/appendicitis/stage_act() + if(!..()) + return + switch(stage) + if(1) + if(prob(5)) + affected_mob.adjustToxLoss(1) + if(2) + var/obj/item/organ/internal/appendix/A = affected_mob.internal_organs_by_name[O_APPENDIX] + if(A) + A.inflamed = TRUE + if(prob(3)) + to_chat(affected_mob, span_warning("You feel a stabbing pain in your abdomen!")) + affected_mob.custom_emote(VISIBLE_MESSAGE, "winces painfully.") + affected_mob.Stun(rand(4, 6)) + affected_mob.adjustToxLoss(1) + if(3) + if(prob(1)) + to_chat(affected_mob, span_danger("Your abdomen is a world of pain!")) + affected_mob.custom_emote(VISIBLE_MESSAGE, "winces painfully.") + affected_mob.Weaken(10) + if(prob(1)) + affected_mob.vomit(95) + if(prob(5)) + to_chat(affected_mob, span_warning("You feel a stabbing pain in your abdomen!")) + affected_mob.custom_emote(VISIBLE_MESSAGE, "winces painfully.") + affected_mob.Stun(rand(4, 6)) + affected_mob.adjustToxLoss(2) diff --git a/code/datums/diseases/fake_gbs.dm b/code/datums/diseases/fake_gbs.dm new file mode 100644 index 0000000000..ca36f57d87 --- /dev/null +++ b/code/datums/diseases/fake_gbs.dm @@ -0,0 +1,32 @@ +/datum/disease/fake_gbs + name = "GBS" + max_stages = 5 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Adranol & Sulfur" + cures = list("adranol", "sulfur") + agent = "Gravitokinetic Bipotential SADS-" + viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/human/monkey) + desc = "if left untreated death will occur." + severity = BIOHAZARD // Mimics real GBS + +/datum/disease/fake_gbs/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(1)) + affected_mob.emote("sneeze") + if(3) + if(prob(5)) + affected_mob.emote("cough") + else if(prob(5)) + affected_mob.emote("gasp") + if(prob(10)) + to_chat(span_danger("You're starting to feel very weak...")) + if(4) + if(prob(10)) + affected_mob.emote("cough") + if(5) + if(prob(10)) + affected_mob.emote("cough") diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm new file mode 100644 index 0000000000..ea2c755e27 --- /dev/null +++ b/code/datums/diseases/gbs.dm @@ -0,0 +1,49 @@ +/datum/disease/gbs + name = "GBS" + max_stages = 5 + spread_text = "On contact" + spread_flags = CONTACT_GENERAL + cure_text = "Adranol & Sulfur" + cures = list("adranol", "sulfur") + cure_chance = 15 + agent = "Gravitokinetic Bipotential SADS+" + viable_mobtypes = list(/mob/living/carbon/human) + severity = BIOHAZARD + +/datum/disease/gbs/stage_act() + if(!..()) + return FALSE + switch(stage) + if(2) + if(prob(45)) + affected_mob.adjustToxLoss(5) + if(prob(1)) + affected_mob.emote("sneeze") + if(3) + if(prob(5)) + affected_mob.emote("cough") + else if(prob(5)) + affected_mob.emote("gasp") + if(prob(10)) + to_chat(affected_mob, span_danger("You're starting to feel very weak...")) + if(4) + if(prob(10)) + affected_mob.emote("cough") + affected_mob.adjustToxLoss(5) + if(5) + to_chat(affected_mob, span_danger("Your body feels as if it's trying to rip itself open...")) + if(prob(50)) + affected_mob.delayed_gib() + else + return + +/datum/disease/gbs/curable + name = "Non-Contagious GBS" + stage_prob = 5 + spread_text = "Non-contagious" + spread_flags = NON_CONTAGIOUS + cure_text = "Cryoxadone" + cures = list("cryoxadone") + cure_chance = 10 + agent = "gibbis" + disease_flags = CURABLE diff --git a/code/datums/ghost_query_vr.dm b/code/datums/ghost_query_vr.dm index 75356029be..8f29b14bb3 100644 --- a/code/datums/ghost_query_vr.dm +++ b/code/datums/ghost_query_vr.dm @@ -7,5 +7,11 @@ /datum/ghost_query/maints_pred role_name = "Maintenance Predator" be_special_flag = BE_MAINTPRED - question = "It appears a predatory critter is lurking in the maintenance. Do you want to play as it? ((You get to choose type of critter. Expect to be treated as vore predator.))" - cutoff_number = 1 \ No newline at end of file + question = "It appears a predatory critter is lurking in maintenance. Do you want to play as it? ((You get to choose type of critter. Expect to be treated as vore predator.))" + cutoff_number = 1 + +/datum/ghost_query/maints_lurker + role_name = "Maintenance Lurker" + be_special_flag = BE_MAINTLURKER + question = "It appears a strange individual is lurking in maintenance. Do you want to play as them? ((You can spawn as your currently loaded character slot. Expect to be treated as vore predator.))" + cutoff_number = 1 diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm index ef36b85038..13620cbf9a 100644 --- a/code/datums/outfits/misc.dm +++ b/code/datums/outfits/misc.dm @@ -63,4 +63,16 @@ /decl/hierarchy/outfit/zaddat name = "Zaddat Suit" suit = /obj/item/clothing/suit/space/void/zaddat/ - mask = /obj/item/clothing/mask/gas/zaddat \ No newline at end of file + mask = /obj/item/clothing/mask/gas/zaddat + +/decl/hierarchy/outfit/maint_lurker + name = "Maintenance Lurker Outfit" + id_slot = slot_wear_id + id_type = /obj/item/card/id/civilian/lurker + pda_slot = slot_belt + pda_type = /obj/item/pda + id_pda_assignment = "NO DATA" + + headset = /obj/item/radio/headset + headset_alt = /obj/item/radio/headset/alt + headset_earbud = /obj/item/radio/headset/earbud diff --git a/code/datums/repositories/crew.dm b/code/datums/repositories/crew.dm index 861e02ae4b..ae94e78726 100644 --- a/code/datums/repositories/crew.dm +++ b/code/datums/repositories/crew.dm @@ -25,7 +25,7 @@ var/global/datum/repository/crew/crew_repository = new() for(var/obj/item/clothing/under/C in tracked) var/turf/pos = get_turf(C) var/area/B = pos?.loc //VOREStation Add: No sensor in Dorm - if((C.has_sensor) && (pos?.z == zLevel) && (C.sensor_mode != SUIT_SENSOR_OFF) && !(B.block_suit_sensors) && !(is_jammed(C)) && !(is_vore_jammed(C))) //VOREStation Edit + if((C.has_sensor) && (pos?.z == zLevel) && (C.sensor_mode != SUIT_SENSOR_OFF) && !(B.flag_check(AREA_BLOCK_SUIT_SENSORS)) && !(is_jammed(C)) && !(is_vore_jammed(C))) //VOREStation Edit if(istype(C.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/H = C.loc if(H.w_uniform != C) diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 229412e93f..1c22cf8a7c 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -8,6 +8,7 @@ holder_type = /obj/machinery/door/airlock wire_count = 12 proper_name = "Airlock" + tgui_template = "WiresAirlock" /datum/wires/airlock/interactable(mob/user) var/obj/machinery/door/airlock/A = holder @@ -41,6 +42,39 @@ . += "The 'Check Timing Mechanism' light is [(A.normalspeed == 0 && haspower) ? "on" : "off"]." . += "The IDScan light is [(A.aiDisabledIdScanner == 0 && haspower) ? "on" : "off."]" +/datum/wires/airlock/tgui_data(mob/user) + var/list/data = ..() + + var/obj/machinery/door/airlock/A = holder + data["id_tag"] = A.id_tag + data["frequency"] = A.radio_connection ? A.frequency : null + data["min_freq"] = RADIO_LOW_FREQ + data["max_freq"] = RADIO_HIGH_FREQ + + return data + +/datum/wires/airlock/tgui_act(action, list/params) + . = ..() + if(.) + return + + var/obj/machinery/door/airlock/A = holder + + switch(action) + if("set_id_tag") + var/new_id = tgui_input_text(usr, "Enter a new ID tag for [A]", "[A] ID Tag", A.id_tag, 30, FALSE, TRUE) + if(new_id) + A.id_tag = new_id + return TRUE + + if("set_frequency") + A.set_frequency(sanitize_frequency(text2num(params["freq"]), RADIO_LOW_FREQ, RADIO_HIGH_FREQ)) + return TRUE + + if("clear_frequency") + A.set_frequency(null) + return TRUE + /datum/wires/airlock/on_cut(wire, mend) var/obj/machinery/door/airlock/A = holder switch(wire) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 03ffdb8ecb..b0b0e738cf 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -9,6 +9,8 @@ /// The display name for the TGUI window. For example, given the var is "APC"... /// When the TGUI window is opened, "wires" will be appended to it's title, and it would become "APC wires". var/proper_name = "Unknown" + /// The template to use for TGUI. + var/tgui_template = "Wires" /// The total number of wires that our holder atom has. var/wire_count = NONE /// A list of all wires. For a list of valid wires defines that can go here, see `code/__DEFINES/wires.dm` @@ -92,7 +94,7 @@ /datum/wires/tgui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Wires", "[proper_name] wires") + ui = new(user, src, tgui_template, "[proper_name] wires") ui.open() /datum/wires/tgui_state(mob/user) diff --git a/code/game/area/CC_areas_vr.dm b/code/game/area/CC_areas_vr.dm index b4853bd081..4bc526807b 100644 --- a/code/game/area/CC_areas_vr.dm +++ b/code/game/area/CC_areas_vr.dm @@ -13,9 +13,8 @@ //////// Abductor Areas //////// /area/unknown requires_power = 0 - flags = RAD_SHIELDED + flags = RAD_SHIELDED | AREA_ALLOW_LARGE_SIZE icon_state = "red2" - limit_mob_size = FALSE /area/unknown/dorm1 name = "Unknown Dorm 1" diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index f8311a21bd..73e135126e 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -70,10 +70,9 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/shuttle requires_power = 0 - flags = RAD_SHIELDED | AREA_FLAG_IS_NOT_PERSISTENT|TEMPERATURE_SHIELDED // YW EDIT: makes all shuttles temp shielded + flags = RAD_SHIELDED | AREA_FLAG_IS_NOT_PERSISTENT | AREA_FORBID_EVENTS | TEMPERATURE_SHIELDED // YW EDIT: makes all shuttles temp shielded sound_env = SMALL_ENCLOSED base_turf = /turf/space - forbid_events = TRUE /area/shuttle/arrival name = "\improper Arrival Shuttle" @@ -839,7 +838,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "construction" /area/hallway/secondary/entry - forbid_events = TRUE + flags = AREA_FORBID_EVENTS /area/hallway/secondary/entry/fore name = "\improper Shuttle Dock Hallway - Mid" @@ -1018,9 +1017,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters name = "\improper Dormitories" icon_state = "Sleep" + flags = RAD_SHIELDED | AREA_FORBID_EVENTS | AREA_FORBID_SINGULO ambience = AMBIENCE_GENERIC - forbid_events = TRUE - forbid_singulo = TRUE /area/crew_quarters/toilet name = "\improper Dormitory Toilets" @@ -1324,8 +1322,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station icon_state = "Holodeck" dynamic_lighting = 0 sound_env = LARGE_ENCLOSED - forbid_events = TRUE - flags = AREA_FLAG_IS_NOT_PERSISTENT|TEMPERATURE_SHIELDED // YW EDIT: makes the holodeck room temp shielded + flags = AREA_FLAG_IS_NOT_PERSISTENT | AREA_FORBID_EVENTS | TEMPERATURE_SHIELDED // YW EDIT: makes the holodeck room temp shielded /area/holodeck/alphadeck name = "\improper Holodeck Alpha" @@ -1401,10 +1398,10 @@ NOTE: there are two lists of areas in the end of this file: centcom and station ambience = AMBIENCE_ENGINEERING /area/engineering/atmos - name = "\improper Atmospherics" - icon_state = "atmos" - sound_env = LARGE_ENCLOSED - ambience = AMBIENCE_ATMOS + name = "\improper Atmospherics" + icon_state = "atmos" + sound_env = LARGE_ENCLOSED + ambience = AMBIENCE_ATMOS /area/engineering/atmos/monitoring name = "\improper Atmospherics Monitoring Room" @@ -1430,8 +1427,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "\improper Engine Room" icon_state = "engine" sound_env = LARGE_ENCLOSED - forbid_events = TRUE - flags = TEMPERATURE_SHIELDED // YW EDIT: makes the engine room temp shielded so the core does not freeze + flags = AREA_FORBID_EVENTS | TEMPERATURE_SHIELDED // YW EDIT: makes the engine room temp shielded so the core does not freeze /area/engineering/engine_airlock name = "\improper Engine Room Airlock" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 47b29898af..3af919882b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -40,7 +40,6 @@ GLOBAL_LIST_EMPTY(areas_by_type) var/music = null var/has_gravity = 1 // Don't check this var directly; use get_gravity() instead - var/secret_name = FALSE // This tells certain things that display areas' names that they shouldn't display this area's name. var/obj/machinery/power/apc/apc = null var/no_air = null // var/list/lights // list of all lights on this area @@ -52,12 +51,6 @@ GLOBAL_LIST_EMPTY(areas_by_type) var/list/forced_ambience = null var/sound_env = STANDARD_STATION var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf - var/forbid_events = FALSE // If true, random events will not start inside this area. - var/forbid_singulo = FALSE // If true singulo will not move in. - var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons. - var/soundproofed = FALSE // If true, blocks sounds from other areas and prevents hearers on other areas from hearing the sounds within. - var/block_phase_shift = FALSE //Stops phase shifted mobs from entering // RS Port #658 - var/block_ghosts = FALSE //Stops ghosts from entering //RS Port #658 /area/New() // Used by the maploader, this must be done in New, not init @@ -76,7 +69,7 @@ GLOBAL_LIST_EMPTY(areas_by_type) power_equip = 0 power_environ = 0 power_change() // all machines set to current power level, also updates lighting icon - if(no_spoilers) + if(flag_check(AREA_NO_SPOILERS)) set_spoiler_obfuscation(TRUE) // Changes the area of T to A. Do not do this manually. @@ -398,7 +391,7 @@ var/list/mob/living/forced_ambiance_list = new L.lastarea = src L.lastareachange = world.time play_ambience(L, initial = TRUE) - if(no_spoilers) + if(flag_check(AREA_NO_SPOILERS)) L.disable_spoiler_vision() check_phase_shift(M) //RS Port #658 @@ -542,7 +535,7 @@ var/list/ghostteleportlocs = list() return 1 /area/proc/get_name() - if(secret_name) + if(flag_check(AREA_SECRET_NAME)) return "Unknown Area" return name @@ -558,9 +551,14 @@ GLOBAL_DATUM(spoiler_obfuscation_image, /image) else cut_overlay(GLOB.spoiler_obfuscation_image) +/area/proc/flag_check(var/flag, var/match_all = FALSE) + if(match_all) + return (flags & flag) == flag + return flags & flag + // RS Port #658 Start /area/proc/check_phase_shift(var/mob/ourmob) - if(!block_phase_shift || !ourmob.incorporeal_move) + if(!flag_check(AREA_BLOCK_PHASE_SHIFT) || !ourmob.incorporeal_move) return if(!isliving(ourmob)) return diff --git a/code/game/area/areas_vr.dm b/code/game/area/areas_vr.dm index b2b67b089f..8a067d08a8 100644 --- a/code/game/area/areas_vr.dm +++ b/code/game/area/areas_vr.dm @@ -1,9 +1,6 @@ /area var/enter_message var/exit_message - var/limit_mob_size = TRUE //If mob size is limited in the area. - var/block_suit_sensors = FALSE //If suit sensors are blocked in the area. - var/block_tracking = FALSE //If camera tracking is blocked in the area. var/turf/ceiling_type // Size of the area in open turfs, only calculated for indoors areas. @@ -71,5 +68,5 @@ power_equip = 0 power_environ = 0 power_change() // all machines set to current power level, also updates lighting icon - if(no_spoilers) + if(flag_check(AREA_NO_SPOILERS)) set_spoiler_obfuscation(TRUE) diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index eb9ab491ae..6148f50bbd 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -51,8 +51,8 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance //VOREStation Add /obj/item/technomancer_catalog/universal name = "universal catalog" - desc = "A catalog to be used with the KHI 'Universal Core', shamelessly \ - copied by a Kitsuhana designer from some group of 'technomancers' or another.
\ + desc = "A catalog to be used with the 'Universal Core', its contents shamelessly \ + copied by an unknown designer from some group of 'technomancers' or another.
\ The back of the book has " + span_italics("'Export Edition'") + " stamped on it." budget = 700 max_budget = 700 diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm index d0f603a1ff..333b445259 100644 --- a/code/game/gamemodes/technomancer/core_obj.dm +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -357,7 +357,7 @@ /obj/item/technomancer_core/universal name = "universal core" desc = "A bewilderingly complex 'black box' that allows the wearer to accomplish amazing feats. \ - This one is a copy of a 'technomancer' core, shamelessly ripped off by a Kitsuhana pattern designer \ + This one is a copy of a 'technomancer' core, shamelessly ripped off by an unknown pattern designer \ for fun, so that he could perform impressive 'magic'. The pack sloshes slightly if you shake it.
\ Under the straps, 'Export Edition' is printed." energy = 7000 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 49f4907a7c..8578474f6c 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -357,8 +357,8 @@ title_blurb = "A " + JOB_ALT_COMEDIAN + " will focus on making people laugh with the power of wit! Telling jokes, stand-up comedy, you are here to make others smile!" /datum/alt_title/tragedian - title = JOB_ALT_ARTIST - title_blurb = "A " + JOB_ALT_ARTIST + " will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?" + title = JOB_ALT_TRAGEDIAN + title_blurb = "A " + JOB_ALT_TRAGEDIAN + " will focus on making people think about life and world around them! Life is a tragedy, and who's better to convey its emotions than you?" /datum/alt_title/artist title = JOB_ALT_ARTIST diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special.dm index 93ab3ecfa4..9dbe378c42 100644 --- a/code/game/jobs/job/special.dm +++ b/code/game/jobs/job/special.dm @@ -122,3 +122,25 @@ return list(access_maint_tunnels, access_entertainment, access_tomfoolery, access_mime) else return list(access_entertainment, access_tomfoolery, access_mime) + +/obj/item/card/id/civilian/lurker + desc = "A rather old and scuffed-looking ID. It seems legit, but something also seems very off somehow. Say, what's the issue/expiry date..?" + assignment = "NO DATA" + rank = JOB_MAINT_LURKER + +/datum/job/maint_lurker + title = JOB_MAINT_LURKER + departments = list(DEPARTMENT_CIVILIAN) + faction = FACTION_STATION + total_positions = -1 + spawn_positions = -1 + supervisors = "nobody save your own common sense and good judgement, though Security may get upset if you're not careful" + selection_color = "#515151" + account_allowed = FALSE //let's not give the game away by creating accounts that someone might stumble across + job_description = "You are a maintenance lurker! You shouldn't be able to see this description anyway! Go prank the CMO or eat the RD's hat or something instead of looking at this." + whitelist_only = 1 + latejoin_only = 1 + requestable = FALSE + outfit_type = /decl/hierarchy/outfit/maint_lurker + access = list(access_maint_tunnels) + minimal_access = list(access_maint_tunnels) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index 522a883efe..4a3b362db2 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -801,7 +801,7 @@ apply_danger_level(0) update_icon() -/obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob) +/obj/machinery/alarm/attackby(obj/item/W as obj, mob/user) add_fingerprint(user) if(alarm_deconstruction_screwdriver(user, W)) return @@ -809,10 +809,10 @@ return if(istype(W, /obj/item/card/id) || istype(W, /obj/item/pda))// trying to unlock the interface with an ID card - togglelock() + togglelock(user) return ..() -/obj/machinery/alarm/verb/togglelock(mob/user as mob) +/obj/machinery/alarm/proc/togglelock(mob/user) if(stat & (NOPOWER|BROKEN)) to_chat(user, "It does nothing.") return @@ -824,9 +824,9 @@ to_chat(user, span_warning("Access denied.")) return -/obj/machinery/alarm/AltClick() +/obj/machinery/alarm/AltClick(mob/user) ..() - togglelock() + togglelock(user) /obj/machinery/alarm/power_change() ..() diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 54fdfbdba4..80f65a3c22 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -230,7 +230,7 @@ return TRACKING_TERMINATE var/turf/pos = get_turf(src) var/area/B = pos?.loc // No cam tracking in dorms! - if(InvalidPlayerTurf(pos) || B.block_tracking) + if(InvalidPlayerTurf(pos) || B.flag_check(AREA_BLOCK_TRACKING)) return TRACKING_TERMINATE if(invisibility >= INVISIBILITY_LEVEL_ONE) //cloaked return TRACKING_TERMINATE diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 5301aa5661..9ebdc878cd 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -125,10 +125,12 @@ return /obj/machinery/door/airlock/proc/set_frequency(new_frequency) + radio_connection = null radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(new_frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) + radio_connection = radio_controller.add_object(src, new_frequency, RADIO_AIRLOCK) /obj/machinery/door/airlock/Initialize() @@ -152,6 +154,7 @@ anchored = TRUE power_channel = ENVIRON + circuit = /obj/item/circuitboard/airlock_cycling var/id_tag var/master_tag @@ -165,6 +168,9 @@ var/previousPressure /obj/machinery/airlock_sensor/update_icon() + if(panel_open) + icon_state = "airlock_sensor_open" + return if(on) if(alert) icon_state = "airlock_sensor_alert" @@ -216,6 +222,45 @@ radio_controller.remove_object(src,frequency) return ..() +/obj/machinery/airlock_sensor/examine(mob/user, infix, suffix) + . = ..() + if(in_range(src, user)) + . += "It has a master tag of \"[master_tag]\"." + . += "It has an ID tag of \"[id_tag]\"." + . += "It has a frequency of [frequency]." + . += "It has a command of \"[command]\"." + if(panel_open) + . += "It's panel is open." + +/obj/machinery/airlock_sensor/attackby(obj/item/I, mob/user) + if(default_deconstruction_screwdriver(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + if(I.has_tool_quality(TOOL_MULTITOOL)) + var/choice = tgui_alert(user, "What would you like to configure?", "[src] Configuration", list("Master Tag", "ID Tag", "Frequency", "Command", "None")) + switch(choice) + if("Master Tag") + var/new_value = tgui_input_text(user, "The current master tag is \"[master_tag]\", what would you like it to be?", "[src] Master Tag", master_tag, 30, encode = TRUE) + if(new_value) + master_tag = new_value + if("ID Tag") + var/new_value = tgui_input_text(user, "The current id tag is \"[id_tag]\", what would you like it to be?", "[src] ID Tag", id_tag, 30, encode = TRUE) + if(new_value) + id_tag = new_value + if("Frequency") + var/new_frequency = tgui_input_number(user, "[src] has a frequency of [frequency]. What would you like it to be?", "[src] frequency", frequency, RADIO_HIGH_FREQ, RADIO_LOW_FREQ) + if(new_frequency) + new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) + set_frequency(new_frequency) + if("Command") + var/new_value = tgui_input_text(user, "The current command is \"[command]\", what would you like it to be? Valid options include: cycle, cycle_interior, cycle_exterior.", "[src] command", command, encode = TRUE) + if(new_value) + command = new_value + + return TRUE + return ..() + /obj/machinery/airlock_sensor/airlock_interior command = "cycle_interior" @@ -237,6 +282,7 @@ anchored = TRUE power_channel = ENVIRON + circuit = /obj/item/circuitboard/airlock_cycling var/master_tag var/frequency = 1449 @@ -246,18 +292,50 @@ var/on = 1 - /obj/machinery/access_button/update_icon() - if(on) + if(panel_open) + icon_state = "access_button_open" + else if(on) icon_state = "access_button_standby" else icon_state = "access_button_off" +/obj/machinery/access_button/examine(mob/user, infix, suffix) + . = ..() + if(in_range(src, user)) + . += "It has a master tag of \"[master_tag]\"." + . += "It has a frequency of \"[frequency]\"." + . += "It is sending a command of \"[command]\"." + if(panel_open) + . += "It's panel is open." + /obj/machinery/access_button/attackby(obj/item/I as obj, mob/user as mob) //Swiping ID on the access button if (istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) attack_hand(user) return + if(default_deconstruction_screwdriver(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + if(I.has_tool_quality(TOOL_MULTITOOL)) + var/choice = tgui_alert(user, "What would you like to change?", "[src] Settings", list("Tag", "Frequency", "Command", "None")) + switch(choice) + if("Tag") + var/new_id = tgui_input_text(user, "[src] has an master tag of \"[master_tag]\". What would you like it to be?", "[src] ID", master_tag, 30, FALSE, TRUE) + if(new_id) + master_tag = new_id + if("Frequency") + var/new_frequency = tgui_input_number(user, "[src] has a frequency of [frequency]. What would you like it to be?", "[src] frequency", frequency, RADIO_HIGH_FREQ, RADIO_LOW_FREQ) + if(new_frequency) + new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) + set_frequency(new_frequency) + if("Command") + var/new_command = tgui_input_text(user, "[src] has a command of \"[command]\". Valid options include: cycle, cycle_interior, cycle_exterior", "[src] command", command, encode = TRUE) + if(new_command) + command = new_command + + return TRUE ..() /obj/machinery/access_button/attack_hand(mob/user) diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index 879b532b08..55e7d97ed2 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -17,6 +17,8 @@ valid_actions = list("cycle_ext", "cycle_int", "force_ext", "force_int", "abort", "purge", "secure") layer = ABOVE_WINDOW_LAYER + var/deconstructable = FALSE + /obj/machinery/embedded_controller/radio/airlock/Destroy() // TODO - Leshana - Implement dummy terminals //for(var/thing in dummy_terminals) @@ -30,12 +32,75 @@ if(!allowed(user)) return min(STATUS_UPDATE, .) +/obj/machinery/embedded_controller/radio/airlock/attackby(obj/item/I, mob/user) + if(deconstructable) + if(default_deconstruction_screwdriver(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + . = ..() + +/obj/machinery/embedded_controller/radio/airlock/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + data["panel_open"] = panel_open + data["tags"] = null + + data["frequency"] = null + data["min_freq"] = null + data["max_freq"] = null + + if(panel_open) + var/datum/embedded_program/airlock/airlock_program = program + data["tags"] = airlock_program.get_all_tags() + + data["frequency"] = frequency + data["min_freq"] = RADIO_LOW_FREQ + data["max_freq"] = RADIO_HIGH_FREQ + + return data + +/obj/machinery/embedded_controller/radio/airlock/tgui_act(action, params) + . = ..() + if(.) + return + + if(!panel_open) + return + + switch(action) + if("edit_tag") + var/datum/embedded_program/airlock/airlock_program = program + + var/tag = params["tag"] + var/current = airlock_program.get_tag(tag) + var/new_tag = tgui_input_text(usr, "What would you like to set [tag] to?", "New [tag]?", current, 30, FALSE, TRUE) + + if(new_tag) + airlock_program.set_tag(tag, new_tag) + return TRUE + + if("set_frequency") + set_frequency(sanitize_frequency(text2num(params["freq"]), RADIO_LOW_FREQ, RADIO_HIGH_FREQ)) + return TRUE + + +/obj/machinery/embedded_controller/radio/airlock/update_icon() + cut_overlays() + if(panel_open) + add_overlay("airlock_control_open") + //Advanced airlock controller for when you want a more versatile airlock controller - useful for turning simple access control rooms into airlocks /obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller name = "Advanced Airlock Controller" + deconstructable = TRUE + circuit = /obj/item/circuitboard/airlock_cycling /obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller/tgui_data(mob/user) - . = list( + var/list/data = ..() + + // Deliberately not using UNTYPED_LIST_ADD, we want this to be appended + data += list( "chamber_pressure" = round(program.memory["chamber_sensor_pressure"]), "external_pressure" = round(program.memory["external_sensor_pressure"]), "internal_pressure" = round(program.memory["internal_sensor_pressure"]), @@ -45,15 +110,22 @@ "internalTemplateName" = "AirlockConsoleAdvanced", ) + return data + //Airlock controller for airlock control - most airlocks on the station use this /obj/machinery/embedded_controller/radio/airlock/airlock_controller name = "Airlock Controller" tag_secure = 1 valid_actions = list("cycle_ext", "cycle_int", "force_ext", "force_int", "abort") + deconstructable = TRUE + circuit = /obj/item/circuitboard/airlock_cycling /obj/machinery/embedded_controller/radio/airlock/airlock_controller/tgui_data(mob/user) - . = list( + var/list/data = ..() + + // Deliberately not using UNTYPED_LIST_ADD, we want this to be appended + data += list( "chamber_pressure" = round(program.memory["chamber_sensor_pressure"]), "exterior_status" = program.memory["exterior_status"], "interior_status" = program.memory["interior_status"], @@ -61,6 +133,8 @@ "internalTemplateName" = "AirlockConsoleSimple", ) + return data + //Access controller for door control - used in virology and the like /obj/machinery/embedded_controller/radio/airlock/access_controller icon = 'icons/obj/airlock_machines.dmi' @@ -69,7 +143,8 @@ name = "Access Controller" tag_secure = 1 valid_actions = list("cycle_ext_door", "cycle_int_door", "force_ext", "force_int") - + deconstructable = TRUE + circuit = /obj/item/circuitboard/airlock_cycling /obj/machinery/embedded_controller/radio/airlock/access_controller/update_icon() if(on && program) @@ -81,9 +156,14 @@ icon_state = "access_control_off" /obj/machinery/embedded_controller/radio/airlock/access_controller/tgui_data(mob/user) - . = list( + var/list/data = ..() + + // Deliberately not using UNTYPED_LIST_ADD, we want this to be appended + data += list( "exterior_status" = program.memory["exterior_status"], "interior_status" = program.memory["interior_status"], "processing" = program.memory["processing"], "internalTemplateName" = "DoorAccessConsole", ) + + return data diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm index 90558cf622..93d8b7ed71 100644 --- a/code/game/machinery/embedded_controller/airlock_program.dm +++ b/code/game/machinery/embedded_controller/airlock_program.dm @@ -414,6 +414,55 @@ send an additional command to open the door again. if(doorCommand) signalDoor(doorTag, doorCommand) +/datum/embedded_program/airlock/proc/get_all_tags() + return list( + "id_tag" = id_tag, + "tag_exterior_door" = tag_exterior_door, + "tag_interior_door" = tag_interior_door, + "tag_airpump" = tag_airpump, + "tag_chamber_sensor" = tag_chamber_sensor, + "tag_exterior_sensor" = tag_exterior_sensor, + "tag_interior_sensor" = tag_interior_sensor, + "tag_airlock_mech_sensor" = tag_airlock_mech_sensor, + "tag_shuttle_mech_sensor" = tag_shuttle_mech_sensor + ) + +/datum/embedded_program/airlock/proc/get_tag(tag_name) + switch(tag_name) + if("id_tag") . = id_tag + if("tag_exterior_door") . = tag_exterior_door + if("tag_interior_door") . = tag_interior_door + if("tag_airpump") . = tag_airpump + if("tag_chamber_sensor") . = tag_chamber_sensor + if("tag_exterior_sensor") . = tag_exterior_sensor + if("tag_interior_sensor") . = tag_interior_sensor + if("tag_airlock_mech_sensor") . = tag_airlock_mech_sensor + if("tag_shuttle_mech_sensor") . = tag_shuttle_mech_sensor + +/datum/embedded_program/airlock/proc/set_tag(tag_name, new_tag) + switch(tag_name) + if("id_tag") + id_tag = new_tag + if("tag_exterior_door") + tag_exterior_door = new_tag + signalDoor(tag_exterior_door, "update") + if("tag_interior_door") + tag_interior_door = new_tag + signalDoor(tag_interior_door, "update") + if("tag_airpump") + tag_airpump = new_tag + if("tag_chamber_sensor") + tag_chamber_sensor = new_tag + if("tag_exterior_sensor") + tag_exterior_sensor = new_tag + if("tag_interior_sensor") + tag_interior_sensor = new_tag + if("tag_airlock_mech_sensor") + tag_airlock_mech_sensor = new_tag + if("tag_shuttle_mech_sensor") + tag_shuttle_mech_sensor = new_tag + + #undef SKIPCYCLE_MARGIN #undef MIN_TARGET_PRESSURE @@ -424,4 +473,4 @@ send an additional command to open the door again. #undef TARGET_NONE #undef TARGET_INOPEN -#undef TARGET_OUTOPEN \ No newline at end of file +#undef TARGET_OUTOPEN diff --git a/code/game/machinery/embedded_controller/construction.dm b/code/game/machinery/embedded_controller/construction.dm new file mode 100644 index 0000000000..0a75ae3f0d --- /dev/null +++ b/code/game/machinery/embedded_controller/construction.dm @@ -0,0 +1,44 @@ +/obj/item/circuitboard/airlock_cycling + name = T_BOARD("cycling airlock button") + build_path = /obj/machinery/access_button + board_type = new /datum/frame/frame_types/button + matter = list(MAT_STEEL = 50, MAT_GLASS = 50) + +/datum/design/circuit/airlock_cycling + name = "Machine Design (Cycling Airlock Board)" + desc = "The circuit board for cycling airlock parts." + id = "airlock_cycling" + build_path = /obj/item/circuitboard/airlock_cycling + req_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) + sort_string = "MAAAD" + +/obj/item/circuitboard/airlock_cycling/attackby(obj/item/I as obj, mob/user as mob) + if(I.has_tool_quality(TOOL_MULTITOOL)) + var/result = tgui_input_list( + user, + "What do you want to reconfigure the board to?", + "Multitool-Circuitboard interface", + list( + "Button", + "Sensor", + "Controller - Standard", + "Controller - Advanced", + "Controller - Access", + )) + switch(result) + if("Button") + name = T_BOARD("cycling airlock button") + build_path = /obj/machinery/access_button + if("Sensor") + name = T_BOARD("cycling airlock sensor") + build_path = /obj/machinery/airlock_sensor + if("Controller - Standard") + name = T_BOARD("cycling airlock controller (simple)") + build_path = /obj/machinery/embedded_controller/radio/airlock/airlock_controller + if("Controller - Advanced") + name = T_BOARD("cycling airlock controller (advanced)") + build_path = /obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller + if("Controller - Access") + name = T_BOARD("cycling airlock controller (access)") + build_path = /obj/machinery/embedded_controller/radio/airlock/access_controller + return diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index f534ccd832..c92cbdd650 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -17,6 +17,11 @@ qdel(program) // the program will clear the ref in its Destroy return ..() +/obj/machinery/embedded_controller/examine(mob/user, infix, suffix) + . = ..() + if(in_range(src, user)) + . += "It has an ID tag of \"[program?.id_tag]\"" + /obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line) return 0 @@ -36,6 +41,7 @@ if(LAZYLEN(valid_actions)) if(action in valid_actions) program.receive_user_command(action) + return TRUE if(ui.user) add_fingerprint(ui.user) diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index ab1fe6aa50..003fad7108 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -31,6 +31,14 @@ type = replacetext(type, " ", "_") return "[type]_[state]" +/datum/frame/frame_types/button + name = "Button" + frame_class = FRAME_CLASS_ALARM + frame_size = 1 + frame_style = FRAME_STYLE_WALL + x_offset = 24 + y_offset = 24 + /datum/frame/frame_types/computer name = "Computer" icon_override = 'icons/obj/stock_parts_vr.dmi' //VOREStation Edit @@ -208,14 +216,6 @@ circuit = /obj/machinery/atmospheric_field_generator frame_size = 3 -/datum/frame/frame_types/electrochromic_button - name = "Electrochromic Window Button" - frame_class = FRAME_CLASS_ALARM - frame_size = 1 - frame_style = FRAME_STYLE_WALL - x_offset = 24 - y_offset = 24 - ////////////////////////////// // Frame Object (Structure) ////////////////////////////// diff --git a/code/game/machinery/pandemic.dm b/code/game/machinery/pandemic.dm index cd51b2a9fc..a3521facbf 100644 --- a/code/game/machinery/pandemic.dm +++ b/code/game/machinery/pandemic.dm @@ -1,6 +1,7 @@ /obj/machinery/computer/pandemic name = "PanD.E.M.I.C 2200" desc = "Used to work with viruses." + circuit = /obj/item/circuitboard/pandemic density = TRUE anchored = TRUE icon = 'icons/obj/pandemic.dmi' @@ -325,7 +326,7 @@ printing = 1 var/obj/item/paper/P = new /obj/item/paper(loc) visible_message(span_notice("[src] rattles and prints out a sheet of paper.")) - // playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1) + playsound(loc, 'sound/machines/printer.ogg', 50, 1) P.info = "
Releasing Virus
" P.info += "
" diff --git a/code/game/objects/effects/decals/posters/voreposters_vr.dm b/code/game/objects/effects/decals/posters/voreposters_vr.dm index 08374d979f..41397b7752 100644 --- a/code/game/objects/effects/decals/posters/voreposters_vr.dm +++ b/code/game/objects/effects/decals/posters/voreposters_vr.dm @@ -5,7 +5,7 @@ /decl/poster/lewd/vore_2 icon_state = "sbsposter2" name = "AroButt" - desc = "A lewd view of KHI's cutest fops." + desc = "A lewd view of one of the galaxy's cutest fops." /decl/poster/vore_3 icon_state = "sbsposter3" name = "Poster This Dog" diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm index 214bbff518..3d1cfcc4c8 100644 --- a/code/game/objects/items/blueprints_vr.dm +++ b/code/game/objects/items/blueprints_vr.dm @@ -145,7 +145,7 @@ if(in_use) return var/area/A = get_area(usr) - if(A.flags & BLUE_SHIELDED) + if(A.flag_check(BLUE_SHIELDED)) to_chat(usr, span_warning("You cannot edit restricted areas.")) return in_use = TRUE @@ -156,7 +156,7 @@ return in_use = TRUE var/area/A = create_area_whole(usr, src) - if(A && (A.flags & BLUE_SHIELDED)) + if(A?.flag_check(BLUE_SHIELDED)) to_chat(usr, span_warning("You cannot edit restricted areas.")) in_use = FALSE return @@ -485,7 +485,7 @@ var/area/place = get_area(turfs[i]) if(blacklisted_areas[place.type]) continue - if(!place.requires_power || (place.flags & BLUE_SHIELDED)) + if(!place.requires_power || (place.flag_check(BLUE_SHIELDED))) continue // No expanding powerless rooms etc areas[place.name] = place @@ -587,7 +587,7 @@ continue if(!BUILDABLE_AREA_TYPES[place.type]) //TODOTODOTODO can_make_new_area = 0 - if(!place.requires_power || (place.flags & BLUE_SHIELDED)) + if(!place.requires_power || (place.flag_check(BLUE_SHIELDED))) continue // No expanding powerless rooms etc areas[place.name] = place diff --git a/code/game/objects/items/devices/personal_shield_generator_vr.dm b/code/game/objects/items/devices/personal_shield_generator_vr.dm index f231ccebfe..35498064e3 100644 --- a/code/game/objects/items/devices/personal_shield_generator_vr.dm +++ b/code/game/objects/items/devices/personal_shield_generator_vr.dm @@ -539,7 +539,7 @@ //Misc belts. Admin-spawn only atm. /obj/item/personal_shield_generator/belt/adminbus - desc = "You should not see this. You REALLY should not see this. If you do, you have either been blessed or are about to be the target of some sick prank." + desc = DEVELOPER_WARNING_NAME + " You REALLY should not see this. If you do, you have either been blessed or are about to be the target of some sick prank." modifier_type = /datum/modifier/shield_projection/admin generator_hit_cost = 0 generator_active_cost = 0 diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 5c12f26286..ba68230c98 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -466,6 +466,7 @@ /obj/item/radio/headset/alt/ert name = "emergency response team bowman headset" icon_state = "com_headset_alt" + centComm = 1 ks2type = /obj/item/encryptionkey/ert /obj/item/radio/headset/ia @@ -493,6 +494,8 @@ /obj/item/radio/headset/alt/centcom name = "centcom bowman headset" icon_state = "com_headset_alt" + centComm = 1 + ks2type = /obj/item/encryptionkey/ert /obj/item/radio/headset/nanotrasen name = "\improper NT radio headset" @@ -503,6 +506,8 @@ /obj/item/radio/headset/alt/nanotrasen name = "\improper NT bowman headset" icon_state = "nt_headset_alt" + centComm = 1 + ks2type = /obj/item/encryptionkey/ert /obj/item/radio/headset/pathfinder name = "pathfinder's headset" @@ -513,6 +518,8 @@ /obj/item/radio/headset/alt/pathfinder name = "pathfinder's bowman headset" icon_state = "exp_headset_alt" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/pathfinder /obj/item/radio/headset/pilot name = "pilot's headset" @@ -522,6 +529,7 @@ /obj/item/radio/headset/alt/pilot name = "pilot's bowman headset" icon_state = "pilot_headset_alt" + adhoc_fallback = TRUE /obj/item/radio/headset/explorer name = "explorer's headset" // YW EDIT @@ -532,6 +540,8 @@ /obj/item/radio/headset/alt/explorer name = "explorer's bowman headset" // YW EDIT icon_state = "exp_headset_alt" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/explorer /obj/item/radio/headset/sar name = "search and rescue headset" diff --git a/code/game/objects/items/falling_object_vr.dm b/code/game/objects/items/falling_object_vr.dm index fdc140b6b4..c8583db3c6 100644 --- a/code/game/objects/items/falling_object_vr.dm +++ b/code/game/objects/items/falling_object_vr.dm @@ -1,5 +1,5 @@ /obj/effect/falling_effect - name = "you should not see this" + name = DEVELOPER_WARNING_NAME desc = "no data" invisibility = 101 anchored = TRUE diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index 10b9b00771..02f011ab67 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -84,7 +84,7 @@ /obj/item/circuitboard/electrochromic name = T_BOARD("electrochromic button") build_path = /obj/machinery/button/windowtint - board_type = new /datum/frame/frame_types/electrochromic_button + board_type = new /datum/frame/frame_types/button matter = list(MAT_STEEL = 50, "glass" = 50) //Computer diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pandemic.dm b/code/game/objects/items/weapons/circuitboards/machinery/pandemic.dm new file mode 100644 index 0000000000..2865260d8a --- /dev/null +++ b/code/game/objects/items/weapons/circuitboards/machinery/pandemic.dm @@ -0,0 +1,16 @@ +#ifndef T_BOARD +#error T_BOARD macro is not defined but we need it! +#endif + +/obj/item/circuitboard/pandemic + name = T_BOARD("pandemic") + build_path = /obj/machinery/computer/pandemic + board_type = new /datum/frame/frame_types/computer + origin_tech = list(TECH_DATA = 2, TECH_BIO = 2) + req_components = list( + /obj/item/stock_parts/matter_bin = 2, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/manipulator = 1, + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/capacitor = 1 + ) diff --git a/code/game/objects/items/weapons/id cards/id_stacks.dm b/code/game/objects/items/weapons/id cards/id_stacks.dm index 3158d93a9b..1e0f49133e 100644 --- a/code/game/objects/items/weapons/id cards/id_stacks.dm +++ b/code/game/objects/items/weapons/id cards/id_stacks.dm @@ -336,3 +336,9 @@ /obj/item/card/id/syndicate/officer name = "Syndicate Officer ID" initial_sprite_stack = list("base-stamp-dark", "top-syndicate", "stamp-s", "pips-gold", "stripe-gold") + +//Special + +/obj/item/card/id/civilian/lurker + name = "Outdated ID" + initial_sprite_stack = list("base-stamp", "stamp-silhouette", "top-olive", "digested") diff --git a/code/game/objects/items/weapons/storage/firstaid_vr.dm b/code/game/objects/items/weapons/storage/firstaid_vr.dm index 66908dbe95..67064b5000 100644 --- a/code/game/objects/items/weapons/storage/firstaid_vr.dm +++ b/code/game/objects/items/weapons/storage/firstaid_vr.dm @@ -235,8 +235,8 @@ starts_with = list(/obj/item/reagent_containers/pill/healing_nanites = 14) /obj/item/storage/pill_bottle/sleevingcure - name = "pill bottle (Vey-Med Resleeving Booster)" // YW EDIT - desc = "A rare medication sold by Vey-Med that helps counteract negative side effects of using resleeving machinery." // YW EDIT + name = "pill bottle (resleeving sickness cure)" + desc = "A rare cure provided by Vey-Medical that helps counteract negative side effects of using imperfect resleeving machinery." starts_with = list(/obj/item/reagent_containers/pill/sleevingcure = 7) /obj/item/storage/pill_bottle/sleevingcure/full @@ -250,7 +250,7 @@ can_hold = list(/obj/item/reagent_containers/pill) /obj/item/storage/mrebag/pill/sleevingcure - name = "vacuum-sealed pill (Vey-Med Resleeving Booster)" // YW EDIT + name = "vacuum-sealed pill (resleeving sickness cure)" desc = "A small vacuum-sealed package containing a singular pill. For emergencies only." starts_with = list(/obj/item/reagent_containers/pill/sleevingcure) diff --git a/code/game/objects/mob_spawner_vr.dm b/code/game/objects/mob_spawner_vr.dm index 463caa43a6..0169683e01 100644 --- a/code/game/objects/mob_spawner_vr.dm +++ b/code/game/objects/mob_spawner_vr.dm @@ -133,7 +133,7 @@ It also makes it so a ghost wont know where all the goodies/mobs are. name = "Corgi Lazy Spawner" desc = "This is a proof of concept, not sure why you would use this one" spawn_delay = 3 MINUTES - mob_faction = "Corgi" + mob_faction = FACTION_CORGI spawn_types = list( /mob/living/simple_mob/animal/passive/dog/corgi = 75, /mob/living/simple_mob/animal/passive/dog/corgi/puppy = 50 @@ -150,7 +150,7 @@ It also makes it so a ghost wont know where all the goodies/mobs are. spawn_delay = 10 MINUTES range = 10 simultaneous_spawns = 1 - mob_faction = "wild animal" + mob_faction = FACTION_WILD_ANIMAL total_spawns = -1 destructible = 0 anchored = TRUE @@ -167,7 +167,7 @@ It also makes it so a ghost wont know where all the goodies/mobs are. spawn_delay = 10 MINUTES range = 10 simultaneous_spawns = 1 - mob_faction = "xeno" + mob_faction = FACTION_XENO total_spawns = -1 destructible = 1 health = 50 @@ -186,7 +186,7 @@ It also makes it so a ghost wont know where all the goodies/mobs are. spawn_delay = 10 MINUTES range = 10 simultaneous_spawns = 1 - mob_faction = "xeno" + mob_faction = FACTION_XENO total_spawns = 1 destructible = 1 health = 50 diff --git a/code/game/objects/random/mob.dm b/code/game/objects/random/mob.dm index e00c10a6db..5d1a0f5ecb 100644 --- a/code/game/objects/random/mob.dm +++ b/code/game/objects/random/mob.dm @@ -174,7 +174,7 @@ overwrite_hostility = 1 - mob_faction = "malf_drone" + mob_faction = FACTION_MALF_DRONE mob_returns_home = 1 mob_wander = 1 mob_wander_distance = 5 @@ -203,7 +203,7 @@ overwrite_hostility = 1 - mob_faction = "malf_drone" + mob_faction = FACTION_MALF_DRONE mob_returns_home = 1 mob_wander = 1 mob_wander_distance = 5 @@ -220,7 +220,7 @@ desc = "This is a random hivebot." icon_state = "robot" - mob_faction = "hivebot" + mob_faction = FACTION_HIVEBOT /obj/random/mob/robotic/hivebot/item_to_spawn() return pick(prob(10);/mob/living/simple_mob/mechanical/hivebot, @@ -292,7 +292,7 @@ desc = "This is a random PoI mercenary." icon_state = "humanoid" - mob_faction = "syndicate" + mob_faction = FACTION_SYNDICATE mob_returns_home = 1 mob_wander_distance = 7 // People like to wander, and these people probably have a lot of stuff to guard. diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index d12fd1a65f..8336d0f373 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -26,6 +26,14 @@ toggle() ..() +/obj/structure/curtain/attack_ai(mob/user) + if(!Adjacent(user)) + return + if(!isrobot((user))) + return + playsound(src, "rustle", 15, 1, -5) + toggle() + /obj/structure/curtain/proc/toggle() set_opacity(!opacity) if(opacity) diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 7e718aab89..fb46fe77b1 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -108,7 +108,7 @@ //newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason if(M.mind) M.mind.transfer_to(newPred) - to_chat(M, span_notice("You are [newPred], somehow having gotten aboard the station in search of food. \ + to_chat(M, span_notice("You are " + span_bold(newPred) + ", somehow having gotten aboard the station in search of food. \ You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \ if you are cute enough, try to make friends with this place's inhabitants.")) to_chat(M, span_critical("Please be advised, this role is NOT AN ANTAGONIST.")) @@ -144,7 +144,7 @@ var/mob/living/simple_mob/vore/morph/newMorph = new /mob/living/simple_mob/vore/morph(get_turf(src)) if(M.mind) M.mind.transfer_to(newMorph) - to_chat(M, span_notice("You are a Morph, somehow having gotten aboard the station in your wandering. \ + to_chat(M, span_notice("You are a " + span_bold("Morph") + ", somehow having gotten aboard the station in your wandering. \ You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \ using your amorphous form to traverse vents to find and consume weak prey.")) to_chat(M, span_notice("You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \ @@ -172,3 +172,82 @@ ..() if(!(src in active_ghost_pods)) active_ghost_pods += src + +/obj/structure/ghost_pod/ghost_activated/maint_lurker + name = "strange maintenance hole" + desc = "This is my hole! It was made for me!" + icon = 'icons/effects/effects.dmi' + icon_state = "tunnel_hole" + icon_state_opened = "tunnel_hole" + density = FALSE + ghost_query_type = /datum/ghost_query/maints_lurker + anchored = TRUE + invisibility = INVISIBILITY_OBSERVER + spawn_active = TRUE + +//override the standard attack_ghost proc for custom messages +/obj/structure/ghost_pod/ghost_activated/maint_lurker/attack_ghost(var/mob/observer/dead/user) + if(jobban_isbanned(user, JOB_GHOSTROLES)) + to_chat(user, span_warning("You cannot use this spawnpoint because you are banned from playing ghost roles.")) + return + + //No whitelist + if(!is_alien_whitelisted(user, GLOB.all_species[user.client.prefs.species])) + to_chat(user, span_warning("You cannot use this spawnpoint to spawn as a species you are not whitelisted for!")) + return + + //No OOC notes/FT + if(not_has_ooc_text(user)) + //to_chat(user, span_warning("You must have proper out-of-character notes and flavor text configured for your current character slot to use this spawnpoint.")) + return + + var/choice = tgui_alert(user, "Using this spawner will spawn you as your currently loaded character slot in a special role. It should not be used with characters you regularly play on station. Are you absolutely sure you wish to continue?", "Maint Lurker Spawner", list("Yes", "No")) + + if(!choice || choice == "No") + return + + create_occupant(user) + +/obj/structure/ghost_pod/ghost_activated/maint_lurker/create_occupant(var/mob/M) + ..() + + var/picked_ckey = M.ckey + var/picked_slot = M.client.prefs.default_slot + + var/mob/living/carbon/human/new_character = new(src.loc) + if(!new_character) + to_chat(M, span_warning("Something went wrong and spawning failed. Please check your character slot doesn't have any obvious errors, then either try again or send an adminhelp!")) + reset_ghostpod() + return + log_and_message_admins("successfully used a Maintenance Lurker spawnpoint and became their loaded character.") + + M.client.prefs.copy_to(new_character) + new_character.dna.ResetUIFrom(new_character) + new_character.sync_organ_dna() + new_character.key = M.key + new_character.mind.loaded_from_ckey = picked_ckey + new_character.mind.loaded_from_slot = picked_slot + + job_master.EquipRank(new_character, JOB_MAINT_LURKER, 1) + + for(var/lang in new_character.client.prefs.alternate_languages) + var/datum/language/chosen_language = GLOB.all_languages[lang] + if(chosen_language) + if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) + new_character.add_language(lang) + + new_character.regenerate_icons() + + new_character.update_transform() + + to_chat(new_character, span_notice("You are a " + span_bold(JOB_MAINT_LURKER) + ", a loose end... you have no special advantages compared to the rest of the crew, so be cautious! You have spawned with an ID that will allow you free access to maintenance areas along with any of your chosen loadout items that are not role restricted, and can make use of anything you can find in maintenance.")) + to_chat(new_character, span_critical("Please be advised, this role is " + span_bold("NOT AN ANTAGONIST."))) + to_chat(new_character, span_notice("Whoever or whatever your chosen character slot is, your role is to facilitate roleplay focused around that character; this role is not free license to attack and murder people without provocation or explicit out-of-character consent. You should probably be cautious around high-traffic and highly sensitive areas (e.g. Telecomms) as Security personnel would be well within their rights to treat you as a trespasser. That said, good luck!")) + + new_character.visible_message(span_warning("[new_character] appears to crawl out of somewhere.")) + qdel(src) + +/obj/structure/ghost_pod/ghost_activated/maint_lurker/Initialize() + ..() + if(!(src in active_ghost_pods)) + active_ghost_pods += src diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index d3caa34c3e..447f02eeeb 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -11,7 +11,7 @@ var/glass = 1 var/datum/tgui_module/appearance_changer/mirror/M -/obj/structure/mirror/Initialize(mapload, var/dir, var/building = 0, mob/user as mob) +/obj/structure/mirror/Initialize(mapload, var/dir, var/building = 0) M = new(src, null) if(building) glass = 0 @@ -24,12 +24,18 @@ QDEL_NULL(M) . = ..() -/obj/structure/mirror/attack_hand(mob/user as mob) +/obj/structure/mirror/attack_hand(mob/user) if(!glass) return if(shattered) return - if(ishuman(user)) - M.tgui_interact(user) + M.tgui_interact(user) + +/obj/structure/mirror/attack_ai(mob/user) + if(!glass) return + if(shattered) return + if(!Adjacent(user)) return + + M.tgui_interact(user) /obj/structure/mirror/proc/shatter() if(!glass) return diff --git a/code/game/sound.dm b/code/game/sound.dm index 40722e5359..bf178e5156 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -25,7 +25,7 @@ if(!T) continue var/area/A = T.loc - if((A.soundproofed || area_source.soundproofed) && (A != area_source)) + if((A.flag_check(AREA_SOUNDPROOF) || area_source.flag_check(AREA_SOUNDPROOF)) && (A != area_source)) continue var/distance = get_dist(T, turf_source) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index cfc998f72a..df6aa9320b 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -92,6 +92,13 @@ toggle_open(user) return 0 +/turf/simulated/wall/attack_ai(var/mob/user) + if(!Adjacent(user)) + return + if(!isrobot((user))) + return + var/rotting = (locate(/obj/effect/overlay/wallrot) in src) + try_touch(user, rotting) /turf/simulated/wall/attack_hand(var/mob/user) diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index aa0296ee86..6ae15f9d66 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -198,7 +198,8 @@ var/list/admin_verbs_spawn = list( /client/proc/create_gm_message, /client/proc/remove_gm_message, /client/proc/AdminCreateVirus, - /client/proc/ReleaseVirus + /client/proc/ReleaseVirus, + /client/proc/spawn_reagent ) var/list/admin_verbs_server = list( @@ -285,7 +286,8 @@ var/list/admin_verbs_debug = list( /client/proc/admin_give_modifier, /client/proc/simple_DPS, /datum/admins/proc/view_feedback, - /client/proc/stop_sounds + /client/proc/stop_sounds, + /client/proc/spawn_reagent ) var/list/admin_verbs_paranoid_debug = list( diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 7bd3b1e4c1..6b4bad1684 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -535,3 +535,18 @@ set category = "Debug.Misc" src.stat_panel.send_message("create_debug") + +/client/proc/spawn_reagent() + set name = "Spawn Reagent" + set category = "Debug.Game" + + if(!check_rights(R_ADMIN|R_EVENT)) return + var/datum/reagent/R = tgui_input_list(usr, "Select a reagent to spawn", "Reagent Spawner", subtypesof(/datum/reagent)) + if(!R) + return + + var/obj/item/reagent_containers/glass/bottle/B = new(usr.loc) + + B.icon_state = "bottle-1" + B.reagents.add_reagent(R.id, 60) + B.name = "[B.name] of [R.name]" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index bc0547c4b5..91c8b5ef93 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -662,12 +662,14 @@ Traitors and the like can also be revived with the previous role mostly intact. //New message handling post_comm_message(customname, replacetext(input, "\n", "
")) - switch(tgui_alert(usr, "Should this be announced to the general population?","Show world?",list("Yes","No"))) - if("Yes") - command_announcement.Announce(input, customname, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); - if("No") - to_world(span_red("New [using_map.company_name] Update available at all communication consoles.")) - world << sound('sound/AI/commandreport.ogg') + var/confirm = tgui_alert(usr, "Should this be announced to the general population?","Show world?",list("Yes","No")) + if(!confirm) + return + if(confirm == "Yes") + command_announcement.Announce(input, customname, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); + else + to_world(span_red("New [using_map.company_name] Update available at all communication consoles.")) + world << sound('sound/AI/commandreport.ogg') log_admin("[key_name(src)] has created a command report: [input]") message_admins("[key_name_admin(src)] has created a command report", 1) diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm index 3eb9771ac0..cdb0ffb809 100644 --- a/code/modules/busy_space/air_traffic.dm +++ b/code/modules/busy_space/air_traffic.dm @@ -1,21 +1,41 @@ //Cactus, Speedbird, Dynasty, oh my +//Also, massive additions/refactors by Killian, because the original incarnation was full of holes + +//minimum and maximum message delays, typically tracked in seconds +#define MIN_MSG_DELAY 3 +#define MAX_MSG_DELAY 6 var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller /datum/lore/atc_controller - var/delay_max = 25 MINUTES //How long between ATC traffic, max. Default is 25 mins. - var/delay_min = 40 MINUTES //How long between ATC traffic, min. Default is 40 mins. - var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins. - var/next_message //When the next message should happen in world.time + var/delay_min = 45 MINUTES //How long between ATC traffic, minimum + var/delay_max = 90 MINUTES //Ditto, maximum + //Shorter delays means more traffic, which gives the impression of a busier system, but also means a lot more radio noise + var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins. + var/initial_delay = 15 MINUTES //How long to wait before sending the first message of the shift. + var/next_message = 45 MINUTES //When the next message should happen in world.time var/force_chatter_type //Force a specific type of messages - var/squelched = 0 //If ATC is squelched currently + var/squelched = 0 //If ATC is squelched currently + + //define a block of frequencies so we can have them be static instead of being random for each call + var/ertchannel + var/medchannel + var/engchannel + var/secchannel + var/sdfchannel /datum/lore/atc_controller/New() - spawn(10 SECONDS) //Lots of lag at the start of a shift. - msg("New shift beginning, resuming traffic control.") - next_message = world.time + rand(delay_min,delay_max) - process() + //generate our static event frequencies for the shift. alternately they can be completely fixed, up in the core block + ertchannel = "[rand(700,749)].[rand(1,9)]" + medchannel = "[rand(750,799)].[rand(1,9)]" + engchannel = "[rand(800,849)].[rand(1,9)]" + secchannel = "[rand(850,899)].[rand(1,9)]" + sdfchannel = "[rand(900,999)].[rand(1,9)]" + spawn(5 SECONDS) //Lots of lag at the start of a shift. Yes, the following lines *have* to be indented or they're not delayed by the spawn properly. + msg("New shift beginning, resuming traffic control. This shift's Colony Frequencies are as follows: Emergency Responders: [ertchannel]. Medical: [medchannel]. Engineering: [engchannel]. Security: [secchannel]. System Defense: [sdfchannel].") + next_message = world.time + initial_delay + process() /datum/lore/atc_controller/process() if(world.time >= next_message) @@ -30,7 +50,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller /datum/lore/atc_controller/proc/msg(var/message,var/sender) ASSERT(message) - global_announcer.autosay("[message]", sender ? sender : "[using_map.station_short] Space Control") + global_announcer.autosay("[message]", sender ? sender : "[using_map.dock_name] Control") /datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1) if(yes) @@ -43,87 +63,411 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller squelched = 0 /datum/lore/atc_controller/proc/shift_ending(var/evac = 0) - msg("Automated Tram departing [using_map.station_name] for [using_map.dock_name] on routine transfer route.","NT Automated Tram") //VOREStation Edit - Tram, tho. - sleep(5 SECONDS) - msg("Automated Tram, cleared to complete routine transfer from [using_map.station_name] to [using_map.dock_name].") //VOREStation Edit - Tram, tho. + msg("[using_map.shuttle_name], this is [using_map.dock_name] Control, you are cleared to complete routine transfer from [using_map.station_name] to [using_map.dock_name].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[using_map.shuttle_name] departing [using_map.dock_name] for [using_map.station_name] on routine transfer route. Estimated time to arrival: ten minutes.","[using_map.shuttle_name]") -/datum/lore/atc_controller/proc/random_convo() +/datum/lore/atc_controller/proc/random_convo(var/force_chatter_type) var/one = pick(loremaster.organizations) //These will pick an index, not an instance var/two = pick(loremaster.organizations) var/datum/lore/organization/source = loremaster.organizations[one] //Resolve to the instances - var/datum/lore/organization/dest = loremaster.organizations[two] + var/datum/lore/organization/secondary = loremaster.organizations[two] //repurposed for new fun stuff - //Let's get some mission parameters - var/owner = source.short_name //Use the short name + //Let's get some mission parameters, pick our first ship + var/name = source.name //get the name + var/owner = source.short_name //Use the short name var/prefix = pick(source.ship_prefixes) //Pick a random prefix + var/firstid = "[rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)]" var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does - var/shipname = pick(source.ship_names) //Pick a random ship name to go with it - var/destname = pick(dest.destination_names) //Pick a random holding from the destination + var/shipname = pick(source.ship_names) //Pick a random ship name + var/destname = pick(source.destination_names) //destination is where? + var/slogan = pick(source.slogans) //god help you all + var/org_type = source.org_type //which group do we belong to? - var/combined_name = "[owner] [prefix] [shipname]" - var/alt_atc_names = list("[using_map.station_short] TraCon","[using_map.station_short] Control","[using_map.station_short] STC","[using_map.station_short] Airspace") - var/wrong_atc_names = list("Sol Command","New Reykjavik StarCon", "[using_map.dock_name]") - var/mission_noun = list("flight","mission","route") - var/request_verb = list("requesting","calling for","asking for") + //pick our second ship + //var/secondname = secondary.name //not used atm, commented out to suppress errors + var/secondowner = secondary.short_name + var/secondprefix = pick(secondary.ship_prefixes) //Pick a random prefix + var/secondid = "[rand(0,9)][rand(0,9)][rand(0,9)][rand(0,9)]" + var/secondshipname = pick(secondary.ship_names) //Pick a random ship name + var/org_type2 = secondary.org_type + + //DEBUG BLOCK + //to_world("DEBUG OUTPUT 1: [name], [owner], [prefix], [firstid], [mission], [shipname], [org_type], [destname]") + //to_world("DEBUG OUTPUT 2: [secondowner], [secondprefix], [secondid], [secondshipname], [org_type2]") + //to_world("DEBUG OUTPUT 3: Chose [chatter_type]") + //DEBUG BLOCK ENDS + + var/combined_first_name = "[prefix] [firstid] |[shipname]|" //formal traffic control identifier for use in messages + var/short_first_name = "[prefix] |[shipname]|" //special variant for certain events + var/comm_first_name = "[owner] [shipname]" //corpname + shipname for speaker identity in log + var/combined_second_name = "[secondprefix] [secondid] |[secondshipname]|" + var/comm_second_name = "[secondowner] [secondshipname]" + //var/short_second_name = "[secondprefix] |[secondshipname]|" //not actually used for now + + var/mission_noun = pick(source.flight_types) //pull from a list of owner-specific flight ops, to allow an extra dash of flavor + if(source.complex_tasks) //if our source has the complex_tasks flag, regenerate with a two-stage assignment + mission_noun = "[pick(source.task_types)] [pick(source.flight_types)]" //First response is 'yes', second is 'no' - var/requests = list("[using_map.station_short] transit clearance" = list("permission for transit granted", "permission for transit denied, contact regional on 953.5"), - "planetary flight rules" = list("authorizing planetary flight rules", "denying planetary flight rules right now due to traffic"), - "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"), - "current solar weather info" = list("sending you the relevant information via tightbeam", "cannot fulfill your request at the moment"), - "nearby traffic info" = list("sending you current traffic info", "no available info in your area"), - "remote telemetry data" = list("sending telemetry now", "no uplink from your ship, recheck your uplink and ask again"), - "refueling information" = list("sending refueling information now", "no fuel for your ship class in this sector"), - "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"), - "current system starcharts" = list("transmitting current starcharts", "your request is queued, overloaded right now"), - "permission to engage FTL" = list("permission to engage FTL granted, good day", "permission denied, wait for current traffic to pass"), - "permission to transit system" = list("permission to transit granted, good day", "permission denied, wait for current traffic to pass"), - "permission to depart system" = list("permission to depart granted, good day", "permission denied, wait for current traffic to pass"), - "permission to enter system" = list("good day, permission to enter granted", "permission denied, wait for current traffic to pass"), - ) + var/requests = list( + "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"), + "current solar weather info" = list("sending you the relevant information via tightbeam", "your request has been queued, stand by"), + "sector aerospace priority" = list("affirmative, sector aerospace priority is yours", "negative, another vessel in your sector has priority right now"), + "system traffic info" = list("sending you current traffic info", "request queued, please hold"), + "refueling information" = list("sending refueling information now", "depots currently experiencing fuel shortages, advise you move on"), + "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"), + "current system starcharts" = list("transmitting current starcharts", "your request is queued, overloaded right now") + ) //Random chance things for variety var/chatter_type = "normal" if(force_chatter_type) chatter_type = force_chatter_type + else if((org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate" || org_type == "system defense" || org_type == "spacer") && org_type2 == "pirate") //this is ugly but when I tried to do it with !='s it fired for pirate-v-pirate, still not sure why. might as well stick it up here so it takes priority over other combos. + chatter_type = "distress" + else if(org_type == "corporate") //corporate-specific subset for the slogan event. despite the relatively high weight it was still quite rare in tests. + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",50;"slogan",25;"civvieleaks",25;"report_to_dock") + else if((org_type == "government" || org_type == "neutral" || org_type == "military")) + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",25;"civvieleaks",25;"report_to_dock") + else if(org_type == "spacer") + chatter_type = pick(5;"emerg",15;"policescan",15;"traveladvisory",5;"pathwarning",150;"dockingrequestgeneric",30;"undockingrequest","normal",10;"undockingdenied",25;"civvieleaks",25;"report_to_dock") + + //the following filters *always* fire their 'unique' event when they're tripped, simply because the conditions behind them are quite rare to begin with + else if(org_type == "smuggler" && org_type2 != "system defense") //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff + chatter_type = "policeflee" + else if(org_type == "smuggler" && org_type2 == "system defense") //ditto, if an SDF ship catches them + chatter_type = "policeshipflee" + else if((org_type == "smuggler" || org_type == "pirate") && (org_type2 == "system defense" || org_type2 == "military")) //if we roll this combo instead, time for the SDF or Mercs to do their fucking jobs + chatter_type = "policeshipcombat" + else if((org_type == "smuggler" || org_type == "pirate") && org_type2 != "system defense") //but if we roll THIS combo, time to alert the SDF to get off their asses + chatter_type = "hostiledetected" + //SDF-specific events that need to filter based on the second party (basically just the following SDF-unique list with the soft-result ship scan thrown in) + else if(org_type == "system defense" && (org_type2 == "government" || org_type2 == "neutral" || org_type2 == "military" || org_type2 == "corporate" || org_type2 == "spacer")) //let's see if we can narrow this down, I didn't see many ship-to-ship scans + chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",180;"dockingrequestgeneric",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal",10;"civvieleaks",70;"sdfchatter") + //SDF-specific events that don't require the secondary at all, in the event that we manage to roll SDF + hostile/smuggler or something + else if(org_type == "system defense") + chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",120;"dockingrequestgeneric",20;"undockingrequest",80;"sdfbeginpatrol","normal","sdfchatter") + //if we somehow don't match any of the other existing filters once we've run through all of them else - chatter_type = pick(2;"emerg",5;"wrong_freq","normal") //Be nice to have wrong_lang... + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",90;"dockingrequestgeneric",30;"undockingrequest",30;"undockingdenied","normal",25;"civvieleaks") + //I probably should do some kind of pass here to work through all the possible combinations of major factors and see if the filtering list needs reordering or modifying, but I really can't be arsed var/yes = prob(90) //Chance for them to say yes vs no var/request = pick(requests) - var/callname = pick(alt_atc_names) + var/callname = "[using_map.dock_name] Control" var/response = requests[request][yes ? 1 : 2] //1 is yes, 2 is no + var/number = rand(1,42) + var/zone = pick("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega") + //fallbacks in case someone sets the dock_type on the map datum to null- it defaults to "station" normally + var/landing_zone = "LZ [zone]" + var/landing_type = "landing zone" + var/landing_move = "landing request" + var/landing_short = "land" + switch(using_map.dock_type) + if("surface") //formal installations with proper facilities + landing_zone = "landing pad [number]" + landing_type = "landing pad" + landing_move = "landing request" + landing_short = "land" + callname = "[using_map.dock_name] Tower" + if("frontier") //for frontier bases - landing spots are literally just open ground, maybe concrete at best + landing_zone = "LZ [zone]" + landing_type = "landing zone" + landing_move = "landing request" + landing_short = "land" + callname = "[using_map.dock_name] Tower" + if("station") //standard station pattern + landing_zone = "docking bay [number]" + landing_type = "docking bay" + landing_move = "docking request" + landing_short = "dock" + callname = "[using_map.dock_name] Control" - var/full_request - var/full_response - var/full_closure - + // what you're about to witness is what feels like an extremely kludgy rework of the system, but it's more 'flexible' and allows events that aren't just ship-stc-ship + // something more elegant could probably be done, but it won't be done by somebody as half-competent as me switch(chatter_type) - if("wrong_freq") - callname = pick(wrong_atc_names) - full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]." - full_response = "[combined_name], this is [using_map.station_short] TraCon, wrong frequency. Switch to [rand(700,999)].[rand(1,9)]." - full_closure = "[using_map.station_short] TraCon, understood, apologies." - if("wrong_lang") - //Can't implement this until autosay has language support + //mayday call if("emerg") - var/problem = pick("hull breaches on multiple decks","unknown life forms on board","a drive about to go critical","asteroids impacting the hull","a total loss of engine power","people trying to board the ship") - full_request = "This is [combined_name] declaring an emergency! We have [problem]!" - full_response = "[combined_name], this is [using_map.station_short] TraCon, copy. Switch to emergency responder channel [rand(700,999)].[rand(1,9)]." - full_closure = "[using_map.station_short] TraCon, okay, switching now." - else - full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]." - full_response = "[combined_name], this is [using_map.station_short] TraCon, [response]." //Station TraCon always calls themselves TraCon - full_closure = "[using_map.station_short] TraCon, [yes ? "thank you" : "understood"], good day." //They always copy what TraCon called themselves in the end when they realize they said it wrong + var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have [pick("asteroids","space debris")] impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke [pick("in the cockpit","on the bridge")]","We have unidentified boarders","Our reaction control system is malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]") + msg("+[pick("Mayday, mayday, mayday!","Mayday, mayday!","Mayday! Mayday!")]+ [combined_first_name], declaring an emergency! [problem]!","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Switch to emergency responder channel [ertchannel].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[callname], [combined_first_name] switching now.","[comm_first_name]") + //Control scan event: soft outcome + if("policescan") + var/confirm = pick("Understood","Roger that","Affirmative","Very well","Copy that") + var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?","I'm sure you'll find everything to be in order, Control.") + var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear, move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.") + msg("[combined_first_name], [callname], your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[confirm] [callname], holding position.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Your compliance is appreciated, [combined_first_name]. Scan commencing.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*2 SECONDS) + msg(complain,"[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*3 SECONDS) + msg("[combined_first_name], [callname]. Scan complete. [completed]") + //Control scan event: hard outcome + if("policeflee") + var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!","Ah f- |ditch the containers!| +Now!+","Unless you have something a little +bigger+ in your torpedo tubes, we're |not| turning around!") + msg("Unknown [pick("ship","vessel","starship")], [callname], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[uhoh]","Unknown Vessel") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[using_map.starsys_name] Defense Control to all local assets: vector to interdict and detain [prefix], temporary callsign |[shipname]|. Control out.","[using_map.starsys_name] Defense Control") + //SDF scan event: soft outcome + if("policeshipscan") + var/confirm = pick("Understood","Roger that","Affirmative") + var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?","I'm sure you'll find everything to be in order, officer.") + var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear. Move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.") + msg("[combined_second_name], [combined_first_name], your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[confirm] [combined_first_name], holding position.","[comm_second_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Your compliance is appreciated, [combined_second_name]. Scan commencing.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*2 SECONDS) + msg(complain,"[comm_second_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*3 SECONDS) + msg("[combined_second_name], [combined_first_name]. Scan complete. [completed]","[comm_first_name]") + //SDF scan event: hard outcome + if("policeshipflee") + var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, |[shipname]|.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!","Ah f- |ditch the containers!| +Now!+","Unless you have something a little +bigger+ in your torpedo tubes, we're |not| turning around!") + msg("Unknown [pick("ship","vessel","starship")], [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.","[comm_second_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[uhoh]","Unknown Vessel") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[using_map.starsys_name] Defense Control, [combined_second_name]. We have a [prefix] here, please advise.","[comm_second_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Defense Control copies, [combined_second_name], reinforcements are en route. Switch further communications to encrypted band [sdfchannel].","[using_map.starsys_name] Defense Control") + //SDF scan event: engage primary in combat! fairly rare since it needs a pirate/vox + SDF roll + if("policeshipcombat") + var/battlestatus = pick("requesting reinforcements.","we need backup! Now!","holding steady.","we're holding our own for now.","we have them on the run.","they're trying to make a run for it!","we have them right where we want them.","we're badly outgunned!","we have them outgunned.","we're outnumbered here!","we have them outnumbered.","this'll be a cakewalk.",10;"notify their next of kin.") + msg("[using_map.starsys_name] Defense Control, [combined_second_name], engaging [combined_first_name] [pick("near route","in sector")] [rand(1,100)], [battlestatus]","[comm_second_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[using_map.starsys_name] Defense Control copies, [combined_second_name]. Keep us updated.","[using_map.starsys_name] Defense Control") + //SDF event: patrol update + if("sdfpatrolupdate") + var/statusupdate = pick("nothing unusual so far","nothing of note","everything looks clear so far","ran off some [pick("pirates","scavengers")] near route [pick(1,100)], [pick("no","minor")] damage sustained, continuing patrol","situation normal, no suspicious activity yet","minor incident on route [pick(1,100)]","Code 7-X [pick("on route","in sector")] [pick(1,100)], situation is under control","seeing a lot of traffic on route [pick(1,100)]","caught a couple of smugglers [pick("on route","in sector")] [pick(1,100)]","sustained some damage in a skirmish just now, we're heading back for repairs") + msg("[using_map.starsys_name] Defense Control, [combined_first_name] reporting in, [statusupdate], over.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[using_map.starsys_name] Defense Control copies, [combined_first_name]. Keep us updated, out.","[using_map.starsys_name] Defense Control") + //SDF event: end patrol + if("sdfendingpatrol") + var/appreciation = pick("Copy","Understood","Affirmative","10-4","Roger that") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + msg("[callname], [combined_first_name], returning from our system patrol route, requesting permission to [landing_short].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[appreciation], [callname]. [dockingplan]","[comm_first_name]") + //SDF event: general chatter + if("sdfchatter") + var/chain = pick("codecheck","commscheck") + switch(chain) + if("codecheck") + msg("Check. Check. |Check|. Uhhh... check? Wait. Wait! Hold on. Yeah, okay, I gotta call this one in.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[callname], confirm auth-code... [rand(1,9)][rand(1,9)][rand(1,9)]-[pick("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")]?","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("One moment...") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*2 SECONDS) + msg("Yeah, that code checks out [combined_first_name].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("|(sigh)| Copy that Control. You! Move along!","[comm_first_name]") + if("commscheck") + msg("Control this is [combined_first_name], we're getting some interference in our area. [pick("How's our line?","Do you read?","How copy, over?")]","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Control reads you loud and clear [combined_first_name].","[using_map.starsys_name] Defense Control") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[pick("Copy that","Thanks,","Roger that")] Control. [combined_first_name] out.","[comm_first_name]") + //Civil event: leaky chatter + if("civvieleaks") + var/commleak = pick("thatsmywife","missingkit","pipeleaks","weirdsmell","weirdsmell2","scug","teppi") + switch(commleak) + if("thatsmywife") + msg("-so then I says to him, |that's no [pick("space carp","space shark","vox","garbage scow","freight liner","cargo hauler","superlifter")], that's my +wife!+| And he-","[comm_first_name]") + if("missingkit") + msg("-did you get the kit from down on deck [rand(1,4)]? I need th-","[comm_first_name]") + if("pipeleaks") + msg("I swear if these pipes keep leaking I'm going to-","[comm_first_name]") + if("weirdsmell") + msg("-and where the hell is that smell coming fr-","[comm_first_name]") + if("weirdsmell2") + msg("-hat in the [pick("three","five","seven","nine")] hells did you |eat| [pick("ensign","crewman")]? This compartment reeks of-","[comm_first_name]") + if("scug") + msg("-and if that weird cat of yours keeps crawling into the pipes we-","[comm_first_name]") + if("teppi") + msg("-at are we supposed to do with this damn cow?","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("I don't think it's a cow, sir, it looks more like a-","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], your internal comms are leaking[pick("."," again.",", again.",". |Again|.")]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Sorry Control, won't happen again.","[comm_first_name]") + //DefCon event: hostile found + if("hostiledetected") + var/orders = pick("Engage on sight","Engage with caution","Engage with extreme prejudice","Engage at will","Search and destroy","Bring them in alive, if possible","Interdict and detain","Keep your eyes peeled","Bring them in, dead or alive","Stay alert") + msg("This is [using_map.starsys_name] Defense Control to all SDF assets. Priority update follows.","[using_map.starsys_name] Defense Control") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Be on the lookout for [short_first_name], last sighted [pick("near route","in sector","near sector")] [rand(1,100)]. [orders]. DefCon, out.","[using_map.starsys_name] Defense Control") + //Ship event: distress call, under attack + if("distress") + var/state = pick(66;"calm",34;"panic") + switch(state) + if("calm") + msg("[using_map.starsys_name] Defense Control, [combined_first_name].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [using_map.starsys_name] Defense Control.","[using_map.starsys_name] Defense Control") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Another vessel in our area is moving [pick("aggressively","suspiciously","erratically","unpredictably","with clear hostile intent")], please advise? Forwarding sensor data now.","[comm_first_name]","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [using_map.starsys_name] Defense Control copies. Sensor data matches logged profile for [secondprefix] |[secondshipname]|. SDF units are en route to your location.","[using_map.starsys_name] Defense Control") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[pick("Appreciated","Copy that","Understood")], Control. Switching to [sdfchannel] to coordinate.","[comm_first_name]") + if("panic") + msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! We are under attack! Requesting immediate assistance!","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [using_map.starsys_name] Defense Control. SDF is en route, contact on [sdfchannel].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[pick("Copy that","Understood")] [using_map.starsys_name] Defense Control, switching now!","[comm_first_name]") + //Control event: travel advisory + if("traveladvisory") + var/flightwarning = pick("Solar flare activity is spiking and expected to cause issues along main flight lanes [rand(1,33)], [rand(34,67)], and [rand(68,100)]","Pirate activity is on the rise, stay close to System Defense vessels","We're seeing a rise in illegal salvage operations, please report any unusual activity to the nearest SDF vessel via channel [sdfchannel]","A quarantined [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","A prison [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","Traffic volume is higher than normal, expect processing delays","Anomalous bluespace activity detected [pick("along route [rand(1,100)]","in sector [rand(1,100)]")], exercise caution","Smugglers have been particularly active lately, expect increased security scans","Depots are currently experiencing a fuel shortage, expect delays and higher rates","Asteroid mining has displaced debris dangerously close to main flight lanes on route [rand(1,100)], watch for potential impactors","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] has collided with [pick("a fuel tanker","a cargo liner","a passenger liner","a freighter","a transport ship","a mining barge","a salvage trawler","a meteoroid","a cluster of space debris","an asteroid","an ice-rich comet")] near route [rand(1,100)], watch for debris and do not impede emergency service vessels","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] on route [rand(1,100)] has experienced total engine failure. Emergency response teams are en route, please observe minimum safe distances and do not impede emergency service vessels","Transit routes have been recalculated to adjust for planetary drift. Please synch your astronav computers as soon as possible to avoid delays and difficulties","[pick("Bounty hunters","System Defense officers","Mercenaries")] are currently searching for a wanted fugitive, report any sightings of suspicious activity to System Defense via channel [sdfchannel]",10;"It's space [pick("carp","shark")] breeding season. [pick("Stars","Skies","Gods","God","Goddess","Fates")] have mercy on you all","We're reading [pick("void","drive","sensor")] echoes that are consistent with illegal cloaking devices, be alert for suspicious activity in your sector") + msg("[callname], all vessels in the [using_map.starsys_name] system. Priority travel advisory follows.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[flightwarning]. Control out.") + //Control event: warning to a specific vessel + if("pathwarning") + var/navhazard = pick("a pocket of intense radiation","a pocket of unstable gas","a debris field","a secure installation","an active combat zone","a quarantined ship","a quarantined installation","a quarantined sector","a live-fire SDF training exercise","an ongoing Search & Rescue operation","a hazardous derelict","an intense electrical storm","an intense ion storm","a shoal of space carp","a pack of space sharks","an asteroid infested with gnat hives","a protected space ray habitat","a region with anomalous bluespace activity","a rogue comet") + var/confirm = pick("Understood","Roger that","Affirmative","Our bad","Thanks for the heads up") + msg("[combined_first_name], [callname]. Your [pick("ship","vessel","starship")] is approaching [navhazard], observe minimum safe distance and adjust your heading appropriately.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[confirm] [callname], adjusting course.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Your compliance is appreciated, [combined_first_name].") + //Control event: personnel report to dock + if("report_to_dock") + var/situation_type = pick("medical","security","engineering","animal control","hazmat") + msg("This is [using_map.dock_name] Tower. Would a free [situation_type] team please report to [landing_zone] immediately. This is not a drill.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*10 SECONDS) + msg("Repeat, any free [situation_type] team, report to [landing_zone] immediately. This is +not+ a drill.") + //Ship event: docking request (generic) + if("dockingrequestgeneric") + var/request_type = pick(100;"generic",50;"delayed",80;"supply",30;"repair",30;"medical",30;"security") + var/appreciation = pick("Much appreciated","Many thanks","Understood","Perfect, thank you","Excellent, thanks","Great","Copy that") + var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") + switch(request_type) + if("generic") + msg("[callname], [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") + if("delayed") + var/reason = pick( + "we don't have any free [landing_type]s right now, please [pick("stand by for a couple of minutes","hold for a few minutes")]", + "you're too far away, please close to ten thousand meters","we're seeing heavy traffic around the [landing_type]s right now, please [pick("stand by for a couple of minutes","hold for a few minutes")]","ground crews are currently clearing up [pick("loose containers","a fuel spill")] to free up one of our [landing_type]s, please [pick("stand by for a couple of minutes","hold for a few minutes")]","another vessel has aerospace priority right now, please [pick("stand by for a couple of minutes","hold for a few minutes")]") + msg("[callname], [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Request denied, [reason] and resubmit your request.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Understood, [callname].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*60 SECONDS) + msg("[callname], [combined_first_name], resubmitting [landing_move].","[comm_first_name]") + sleep (5 SECONDS) + msg("[combined_first_name], [callname]. Everything appears to be in order now, permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") + if("supply") + var/preintensifier = pick(75;"getting ",75;"running ","",15;"like, ") //whitespace hack, sometimes they'll add a preintensifier, but not always + var/intensifier = pick("very","pretty","critically","extremely","dangerously","desperately","kinda","a little","a bit","rather","sorta") + var/low_thing = pick("ammunition","munitions","clean water","food","spare parts","medical supplies","reaction mass","gas","hydrogen fuel","phoron fuel","fuel",10;"tea",10;"coffee",10;"soda",10;"pizza",10;"beer",10;"booze",10;"vodka",10;"snacks") //low chance of a less serious shortage + appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") + msg("[callname], [combined_first_name]. We're [preintensifier][intensifier] low on [low_thing]. Requesting permission to [landing_short] for resupply.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") + if("repair") + var/damagestate = pick("We've experienced some hull damage","We're suffering minor system malfunctions","We're having some [pick("weird","strange","odd","unusual")] technical issues","We're overdue maintenance","We have several minor space debris impacts","We've got some battle damage here","Our reactor output is fluctuating","We're hearing some weird noises from the [pick("engines","pipes","ducting","HVAC")]","We just got caught in a solar flare","We had a close call with an asteroid","We have a [pick("minor","mild","major","serious")] [pick("fuel","water","oxygen","gas")] leak","We have depressurized compartments","We have a hull breach","One of our [pick("hydraulic","pneumatic")] systems has depressurized","Our [pick("life support","water recycling system","navcomp","shield generator","reaction control system","auto-repair system","repair drone controller","artificial gravity generator","environmental control system","master control system")] is [pick("failing","acting up","on the fritz","shorting out","glitching out","freaking out","malfunctioning")]") + appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") + msg("[callname], [combined_first_name]. [damagestate]. Requesting permission to [landing_short] for repairs and maintenance.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Repair crews are standing by, contact them on channel [engchannel].") + if("medical") + var/species = pick("human","humanoid","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien",5;"catslug") + var/medicalstate = pick("multiple casualties","several cases of radiation sickness","an unknown virus","an unknown infection","a critically injured VIP","sick refugees","multiple cases of food poisoning","injured [pick("","[species] ")]passengers","sick [pick("","[species] ")]passengers","injured engineers","wounded marines","a delicate situation","a pregnant passenger","injured [pick("","[species] ")]castaways","recovered escape pods","unknown escape pods") + appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") + msg("[callname], [combined_first_name]. We have [medicalstate] on board. Requesting permission to [landing_short] for medical assistance.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Medtechs are standing by, contact them on channel [medchannel].") + if("security") + var/species = pick("human","humanoid","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien",5;"catslug") + var/securitystate = pick("several [species] convicts","a captured pirate","a wanted criminal","[species] stowaways","incompetent [species] shipjackers","a delicate situation","a disorderly passenger","disorderly [species] passengers","ex-mutineers","stolen goods","[pick("a container","containers")] full of [pick("confiscated contraband","stolen goods")]",5;"a very lost shadekin",10;"some kinda big wooly critter",15;"a buncha lost-looking uh... cat... slug... |things?|",10;"a raging case of [pick("spiders","crabs","geese","gnats","sharks","carp")]") //gotta have a little something to lighten the mood now and then + appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","Perfect, thank you") + msg("[callname], [combined_first_name]. We have [securitystate] on board and require security assistance. Requesting permission to [landing_short].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Security teams are standing by, contact them on channel [secchannel].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[appreciation], [callname]. [dockingplan]","[comm_first_name]") + //Ship event: undocking request + if("undockingrequest") + var/request_type = pick(150;"generic",50;"delayed") + var/takeoff = pick("depart","launch") + var/safetravels = pick("Fly safe out there","Good luck","Safe travels","See you next week","Godspeed","Stars guide you") + var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too","So long") + msg("[callname], [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + switch(request_type) + if("generic") + msg("[combined_first_name], [callname]. Permission granted. Docking clamps released. [safetravels].") + if("delayed") + var/denialreason = pick("Docking clamp malfunction, please hold","Fuel lines have not been secured","Ground crew are still on the pad","Loose containers are on the pad","Exhaust deflectors are not yet in position, please hold","There's heavy traffic right now, it's not safe for your vessel to launch","Another vessel has aerospace priority at this moment","Port officials are still aboard") + msg("Negative [combined_first_name], request denied. [denialreason]. Try again in a few minutes.") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*60 SECONDS) + msg("[callname], [combined_first_name], re-requesting permission to depart from [landing_zone].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[thanks], [callname]. This is [combined_first_name] setting course for [destname], out.","[comm_first_name]") + //SDF event: starting patrol + if("sdfbeginpatrol") + var/safetravels = pick("Fly safe out there","Good luck","Good hunting","Safe travels","Godspeed","Stars guide you") + var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too") + var/takeoff = pick("depart","launch","take off","dust off") + msg("[callname], [combined_first_name], requesting permission to [takeoff] from [landing_zone] to begin system patrol.","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname]. Permission granted. Docking clamps released. [safetravels].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[thanks], [callname]. This is [combined_first_name] beginning system patrol, out.","[comm_first_name]") + //Ship event: undocking request (denied) + if("undockingdenied") + var/takeoff = pick("depart","launch") + var/denialreason = pick("Security is requesting a full cargo inspection","Your ship has been impounded for multiple [pick("security","safety")] violations","Your ship is currently under quarantine lockdown","We have reason to believe there's an issue with your papers","Security personnel are currently searching for a fugitive and have ordered all outbound ships remain grounded until further notice") + msg("[callname], [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("Negative [combined_first_name], request denied. [denialreason].") + if("slogan") + msg("The following is a sponsored message from [name].","Facility PA") + sleep(5 SECONDS) + msg("[slogan]","Facility PA") + else //time for generic message + msg("[callname], [combined_first_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[comm_first_name]") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[combined_first_name], [callname], [response].") + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) + msg("[callname], [yes ? "thank you" : "understood"], out.","[comm_first_name]") + return //oops, forgot to restore this +/* //OLD BLOCK, for reference //Ship sends request to ATC - msg(full_request,"[prefix] [shipname]") - sleep(5 SECONDS) + msg(full_request,"[comm_first_name]" + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) //ATC sends response to ship msg(full_response) - sleep(5 SECONDS) + sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) //Ship sends response to ATC - msg(full_closure,"[prefix] [shipname]") - return \ No newline at end of file + msg(full_closure,"[comm_first_name]") + return +*/ + +#undef MIN_MSG_DELAY +#undef MAX_MSG_DELAY diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm index 6882c93e00..002a79e6ba 100644 --- a/code/modules/busy_space/organizations.dm +++ b/code/modules/busy_space/organizations.dm @@ -1,4 +1,4 @@ -//Datums for different companies that can be used by busy_space +//Datums for different factions that can be used by busy_space /datum/lore/organization var/name = "" // Organization's name var/short_name = "" // Organization's shortname (NanoTrasen for "NanoTrasen Incorporated") @@ -10,52 +10,455 @@ var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused. var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc") + var/complex_tasks = FALSE //enables complex task generation + + //how does it work? simple: if you have complex tasks enabled, it goes; PREFIX + TASK_TYPE + FLIGHT_TYPE + //e.g. NDV = Asset Protection + Patrol + Flight + //this overrides the standard PREFIX = TASK logic and allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level + //task_types are picked from completely at random in air_traffic.dm, much like flight_types, so be careful not to potentially create combos that make no sense! + + var/list/task_types = list( + "logistics", + "patrol", + "training", + "peacekeeping", + "escort", + "search and rescue" + ) + var/list/flight_types = list( //operations and flights - we can override this if we want to remove the military-sounding ones or add our own + "flight", + "mission", + "route", + "assignment" + ) var/list/ship_names = list( //Names of spaceships. This is a mostly generic list that all the other organizations inherit from if they don't have anything better. - "Kestrel", - "Beacon", - "Signal", - "Freedom", - "Glory", - "Axiom", - "Eternal", - "Harmony", - "Light", - "Discovery", - "Endeavour", - "Explorer", - "Swift", - "Dragonfly", - "Ascendant", - "Tenacious", - "Pioneer", - "Hawk", - "Haste", - "Radiant", - "Luminous", - "Princess of Sol", - "King of the Mountain", - "Words and Changes", - "Katerina's Silhouette", - "Castle of Water", - "Jade Leviathan", - "Sword of Destiny", - "Ishtar's Grace" - ) - var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. - var/autogenerate_destination_names = TRUE + "Scout", + "Beacon", + "Signal", + "Freedom", + "Liberty", + "Enterprise", + "Glory", + "Axiom", + "Eternal", + "Harmony", + "Light", + "Discovery", + "Endeavour", + "Explorer", + "Swift", + "Dragonfly", + "Ascendant", + "Tenacious", + "Pioneer", + "Surveyor", + "Haste", + "Radiant", + "Luminous", + "Calypso", + "Eclipse", + "Maverick", + "Polaris", + "Northstar", + "Orion", + "Odyssey", + "Relentless", + "Valor", + "Zodiac", + "Avenger", + "Defiant", + "Dauntless", + "Interceptor", + "Providence", + "Thunderchild", + "Defender", + "Ranger", + "River", + "Jubilee", + "Gumdrop", + "Spider", + "Columbia", + "Eagle", + "Intrepid", + "Odyssey", + "Aquarius", + "Kitty Hawk", + "Antares", + "Falcon", + "Casper", + "Orion", + "Columbia", + "Atlantis", + "Enterprise", + "Challenger", + "Pathfinder", + "Buran", + "Aldrin", + "Armstrong", + "Tranquility", + "Nostrodamus", + "Soyuz", + "Cosmos", + "Sputnik", + "Belka", + "Strelka", + "Gagarin", + "Shepard", + "Tereshkova", + "Leonov", + "Vostok", + "Apollo", + "Mir", + "Titan", + "Serenity", + "Andiamo", + "Aurora", + "Phoenix", + "Wayward Phoenix", + "Lucky", + "Raven", + "Valkyrie", + "Halcyon", + "Nakatomi", + "Cutlass", + "Unicorn", + "Sheepdog", + "Arcadia", + "Gigantic", + "Goliath", + "Pequod", + "Poseidon", + "Venture", + "Evergreen", + "Natal", + "Maru", + "Djinn", + "Witch", + "Wolf", + "Lone Star", + "Grey Fox", + "Dutchman", + "Sultana", + "Siren", + "Venus", + "Anastasia", + "Rasputin", + "Stride", + "Suzaku", + "Hathor", + "Dream", + "Gaia", + "Ibis", + "Progress", + "Olympic", + "Venture", + "Brazil", + "Tiger", + "Hedgehog", + "Potemkin", + "Fountainhead", + "Sinbad", + "Esteban", + "Mumbai", + "Shanghai", + "Madagascar", + "Kampala", + "Bangkok", + "Emerald", + "Guo Hong", + "Shun Kai", + "Fu Xing", + "Zhenyang", + "Da Qing", + "Rascal", + "Flamingo", + "Jackal", + "Andromeda", + "Ferryman", + "Panchatantra", + "Nunda", + "Fortune", + "New Dawn", + "Fionn MacCool", + "Red Bird", + "Star Rat", + "Cwn Annwn", + "Morning Swan", + "Black Cat", + "Challenger", + "Freshly Baked", + "Citrus Punch", + "Made With Real Fruit", + "Big D", + "Shaken, Not Stirred", + "Stirred, Not Shaken", + "Neither Shaken Nor Stirred", + "Shaken And Stirred", + "Freedom Ain't Free", + "Pay It Forward", + "All Expenses Paid", + "Tanstaafl", /* There Ain't No Such Thing As A Free Lunch */ + "Hold My Beer", + "Das Bootleg", + "Unplanned Lithobraking Incident", + "Unknown Accelerant", + "Mildly Flammable", + "Wave Goodbye", + "Hugh Mann", + "Savage Chicken", + "Homestead", + "Peacekeeper", + "Eminent Domain", + "Clear Sky", + "Midnight Light", + "Daedalus", + "Redline", + "Wild Dog", + "Black Eagle", + "Sovereign Citizen", + "Event Horizon", + "Monte Carlo", + "Ace of Spades", + "Dead Man's Hand", + "Big Blind", + "Royal Flush", + "Full House", + "Wildcard", + "Wild Card", + "Blackjack", + "Three of a Kind", + "Three's Company", + "Know When To Fold 'Em", + "Icebreaker", + "Megalith", + "Agnus Dei", + "Picasso", + "Spirit of Alliance", + "Surrounded By Idiots", + "Honk If You Can Read This", + "Personal Space Invader", + "Sufficient Velocity", + "Credible Deniability", + "Crucible", + "Nostromo", + "Dance Like You Mean It", + "Birthday Suit", + "Sinking Feeling", + "No Refunds", + "No Solicitors", + "Dream of Independence", + "Tunguska", + "Kugelblitz", + "Supermassive Black Hole", + "Knight of Cydonia", + "Guiding Light", + "Unnatural Selection", + "Stockholm Syndrome", + "False King", + "Bombshell", + "Walking Disaster", + "Two-Body Problem", + "Instrument of Violence", + "Entropic Whisper", + "Cash and Prizes", + "Crash Course", + "Wheel of Fortune", + "Little Light", + "Leave Only Footprints", + "Dead Man's Tale", + "The Next Big Thing", + "Some Disassembly Required", + "Some Assembly Required", + "Just Read The Manual", + "Spoiler Alert", + "Bad News", + "Lucky Pants", + "No Hard Feelings", + "Waste Not, Want Not", + "Beowulf", + "Inheritor", + "Anthropocene Denier", + "Bonaventure", + "Nothing Ventured", + "Go West", + "Once Upon A Time", + "Don't Worry About It", + "Bygones Be", + "Just Capital", + "Delight", + "Valdez", + "Pioneer", + "Antilles", + "Explorer", + "Number Crunch", + "Until Dawn", + "Pistols at Dawn", + "Right Side", + "Merchant Prince", + "Merchant Princess", + "Merchant King", + "Merchant Queen", + "Merchant's Pride", + "Golden Son", + "Trade Law", + "Onward", + "Wanderer", + "Rocky Start", + "Downtown", + "Risk Reward", + "Culture Shock", + "Ambition", + "Vigor", + "Vigilant", + "Courageous", + "Profit Vanguard", + "Free Market", + "Market Speculation", + "Banker's Dozen", + "Adventure", + "Profiteer", + "Wrong Side", + "Final Notice", + "Tax Man", + "Ferryman", + "Hangman", + "Cattlecar", + "Runtime Error", + "For Sale, Cheap", + "Starfarer", + "Drifter", + "Windward", + "Hostile Takeover", + "Tax Loop", + "Fortune's Fancy", + "Fortuna", + "Inside Outside", + "Galley", + "Constellation", + "Dromedarii", + "Golden Hand", + "White Company", + "Haggler", + "Rendezvous", + "Two For Flinching", + "Uninvited Guest", + "Iconoclast", + "Bluespace Tourist" + ) + var/list/added_ship_names = list() //List of ship names to add to the above, rather than wholesale replacing + var/list/destination_names = list() //Names of static holdings that the organization's ships visit + var/append_ship_names = FALSE + + var/org_type = "neutral" //Valid options are "neutral", "corporate", "government", "system defense", "military, "smuggler", & "pirate" + var/autogenerate_destination_names = TRUE //Pad the destination lists with some extra random ones? see the proc below for info on that + + var/slogans = list("This is a placeholder slogan, ding dong!") //Advertising slogans. Who doesn't want more obnoxiousness on the radio? Picked at random each time the slogan event fires. This has a placeholder so it doesn't runtime on trying to draw from a 0-length list in the event that new corps are added without full support. /datum/lore/organization/New() ..() + + if(append_ship_names) + ship_names.Add(added_ship_names) + if(autogenerate_destination_names) // Lets pad out the destination names. - var/i = rand(6, 10) - var/list/star_names = list( - "Sol", "Alpha Centauri", "Tau Ceti", "Zhu Que", "Oasis", "Vir", "Gavel", "Ganesha", - "Saint Columbia", "Altair", "Sidhe", "New Ohio", "Parvati", "Mahi-Mahi", "Nyx", "New Seoul", - "Kess-Gendar", "Raphael", "Phact", "Altair", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "Thoth", "Jahan's Post", "Kauq'xum", "Silk", "New Singapore", "Stove", "Viola", "Love", "Isavau's Gamble" ) - var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "anomaly", "colony", "outpost") + var/i = rand(20, 30) //significantly increased from original values due to the greater length of rounds + + //known planets and exoplanets, plus fictional ones + var/list/planets = list( + /* real planets in our solar system */ + "Earth","Luna","Mars","Titan","Europa", + /* named exoplanets, god knows if they're habitable */ + "Spe","Arion","Arkas","Orbitar","Dimidium", + "Galileo","Brahe","Lipperhey","Janssen","Harriot", + "Aegir","Amateru","Dagon","Meztli","Smertrios", + "Hypatia","Quijote","Dulcinea","Rocinante","Sancho", + "Thestias","Saffar","Samh","Majriti","Fortitudo", + "Draugr","Arber","Tassili","Madriu","Naqaya", + "Bocaprins","Yanyan","Sissi","Tondra","Eburonia", + "Drukyul","Yvaga","Naron","Guarani","Mastika", + "Bendida","Nakanbe","Awasis","Caleuche","Wangshu", + "Melquiades","Pipitea","Ditso","Asye","Veles", + "Finlay","Onasilos","Makropolus","Surt","Boinayel", + "Eyeke","Cayahuanca","Hamarik","Abol","Hiisi", + "Belisama","Mintome","Neri","Toge","Iolaus", + "Koyopa","Independence","Ixbalanque","Magor","Fold", + "Santamasa","Noifasui","Kavian","Babylonia","Bran", + "Alef","Lete","Chura","Wadirum","Buru", + "Umbaasaa","Vytis","Peitruss","Trimobe","Baiduri", + "Ggantija","Cuptor","Xolotl","Isli","Hairu", + "Bagan","Laligurans","Kereru","Equiano","Albmi", + "Perwana","Pollera","Tumearandu","Sumajmajta","Haik", + "Leklsullun","Pirx","Viriato","Aumatex","Negoiu", + "Teberda","Dopere","Vlasina","Viculus","Kralomoc", + "Iztok","Krotoa","Halla","Riosar","Samagiya", + "Isagel","Eiger","Ugarit","Sazum","Maeping", + "Agouto","Ramajay","Khomsa","Gokturk","Barajeel", + "Cruinlagh","Mulchatria","Ibirapita","Madalitso", + /* fictional planets from polarislore */ + "Sif","Kara","Rota","Root","Toledo, New Ohio", + "Meralar","Adhomai","Binma","Kishar","Anshar", + "Nisp","Elysium","Sophia, El","New Kyoto", + "Angessa's Pearl, Exalt's Light","Oasis","Love" + ) + + //existing systems, pruned for duplicates, includes systems that contain suspected or confirmed exoplanets + var/list/systems = list( + /* real solar systems, specifically ones that have possible planets */ + "Sol","Alpha Centauri","Sirius","Vega","Tau Ceti", + "Altair","Epsilon Eridani","Fomalhaut","Mu Arae","Pollux", + "Wolf 359","Ross 128","Gliese 1061","Luyten's Star","Teegarden's Star", + "Kapteyn","Wolf 1061","Aldebaran","Proxima Centauri","Kepler-90", + "HD 10180","HR 8832","TRAPPIST-1","55 Cancri","Gliese 876", + "Upsilon Andromidae","Mu Arae","WASP-47","82 G. Eridani","Rho Coronae Borealis", + "Pi Mensae","Beta Pictoris","Gamma Librae","Gliese 667 C","LHS 1140", + "Phact", + /* fictional systems from Polaris and other sources*/ + "Zhu Que","Oasis","Vir","Gavel","Ganesha", + "Sidhe","New Ohio","Parvati","Mahi-Mahi","Nyx", + "New Seoul","Kess-Gendar","Raphael","El","Eutopia", + /* skrell */ + "Qerr'valis","Harr'Qak","Qerrna-Lakirr","Kauq'xum", + /* tajaran */ + "Rarkajar","Arrakthiir","Mesomori", + /* other */ + "Vazzend","Thoth","Jahan's Post","Silk","New Singapore", + "Stove","Viola","Isavau's Gamble","Samsara", + "Vounna","Relan","Whythe","Exalt's Light","Van Zandt", + /* generic territories */ + "deep space", + "Commonwealth space", + "Commonwealth territory", + "ArCon space", + "ArCon territory", + "independent space", + "a demilitarized zone", + "Elysian space", + "Elysian territory", + "Salthan space", + "Salthan territory", + "Skrell space", + "Skrell territories", + "Tajaran space", + "Hegemonic space", + "Hegemonic territory" + ) + var/list/owners = list("a government", "a civilian", "a corporate", "a private", "an independent", "a military") + var/list/purpose = list("an exploration", "a trade", "a research", "a survey", "a military", "a mercenary", "a corporate", "a civilian", "an independent") + + //unique or special locations + var/list/unique = list("the Jovian subcluster","Isavau International Spaceport","Terminus Station","Casini's Reach","the Shelf flotilla","the Ue'Orsi flotilla","|Heaven| Orbital Complex, Alpha Centauri","the |Saint Columbia| Complex") + + var/list/orbitals = list("[pick(owners)] shipyard","[pick(owners)] dockyard","[pick(owners)] station","[pick(owners)] vessel","a habitat","[pick(owners)] refinery","[pick(owners)] research facility","an industrial platform","[pick(owners)] installation") + var/list/surface = list("a colony","a settlement","a trade outpost","[pick(owners)] supply depot","a fuel depot","[pick(owners)] installation","[pick(owners)] research facility") + var/list/deepspace = list("[pick(owners)] asteroid base","a freeport","[pick(owners)] shipyard","[pick(owners)] dockyard","[pick(owners)] station","[pick(owners)] vessel","[pick(owners)] habitat","a trade outpost","[pick(owners)] supply depot","a fuel depot","[pick(owners)] installation","[pick(owners)] research facility") + var/list/frontier = list("[pick(purpose)] [pick("ship","vessel","outpost")]","a waystation","an outpost","a settlement","a colony") + + //patterns; orbital ("an x orbiting y"), surface ("an x on y"), deep space ("an x in y"), the frontier ("an x on the frontier") + //biased towards inhabited space sites while(i) - destination_names.Add("a [pick(destination_types)] in [pick(star_names)]") + destination_names.Add("[pick("[pick(orbitals)] orbiting [pick(planets)]","[pick(surface)] on [pick(planets)]","[pick(deepspace)] in [pick(systems)]",20;"[pick(unique)]",30;"[pick(frontier)] on the frontier")]") i-- + //extensive rework for a much greater degree of variety compared to the old system, lists now include known exoplanets and star systems currently suspected or confirmed to have exoplanets ////////////////////////////////////////////////////////////////////////////////// @@ -64,67 +467,82 @@ name = "NanoTrasen Incorporated" short_name = "NanoTrasen" acronym = "NT" - desc = "NanoTrasen is one of the foremost research and development companies in SolGov space. \ + desc = "NanoTrasen is one of the foremost research and development companies in Commonwealth space. \ Originally focused on consumer products, their swift move into the field of Phoron has lead to \ them being the foremost experts on the substance and its uses. In the modern day, NanoTrasen prides \ itself on being an early adopter to as many new technologies as possible, often offering the newest \ products to their employees. In an effort to combat complaints about being 'guinea pigs', Nanotrasen \ - also offers one of the most comprehensive medical plans in SolGov space, up to and including cloning \ - and therapy.\ + also offers one of the most comprehensive medical plans in Commonwealth space, up to and including cloning, \ + resleeving, and therapy.\

\ NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \ - It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \ - for newly tested posibrains to remain with the company." + It also boasts a prosthetic line, which is provided to its employees as needed, and is used as an incentive \ + for newly tested posibrains to remain with the company. \ +

\ + NT's ships are named for famous scientists." history = "" // To be written someday. work = "research giant" headquarters = "Luna, Sol" motto = "" - ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response", "NDV" = "asset protection") + org_type = "corporate" + slogans = list( + "NanoTrasen - Phoron Makes The Galaxy Go 'Round.", + "NanoTrasen - Join for the Medical, stay for the Company.", + "NanoTrasen - Advancing Humanity." + ) + ship_prefixes = list("NTV" = "a general operations", "NEV" = "an exploration", "NGV" = "a hauling", "NDV" = "a patrol", "NRV" = "an emergency response", "NDV" = "an asset protection") //Scientist naming scheme ship_names = list( - "Bardeen", - "Einstein", - "Feynman", - "Sagan", - "Tyson", - "Galilei", - "Jans", - "Fhriede", - "Franklin", - "Tesla", - "Curie", - "Darwin", - "Newton", - "Pasteur", - "Bell", - "Mendel", - "Kepler", - "Edision", - "Cavendish", - "Nye", - "Hawking", - "Aristotle", - "Von Braun", - "Kaku", - "Oppenheimer", - "Renwick", - "Hubble", - "Alcubierre", - "Robineau", - "Glass" - ) + "Bardeen", + "Einstein", + "Feynman", + "Sagan", + "Tyson", + "Galilei", + "Jans", + "Fhriede", + "Franklin", + "Tesla", + "Curie", + "Darwin", + "Newton", + "Pasteur", + "Bell", + "Mendel", + "Kepler", + "Edison", + "Cavendish", + "Nye", + "Hawking", + "Aristotle", + "Kaku", + "Oppenheimer", + "Renwick", + "Hubble", + "Alcubierre", + "Glass" + ) // Note that the current station being used will be pruned from this list upon being instantiated destination_names = list( - "NSS Exodus in Nyx", - "NCS Northern Star in Vir", - //"NLS Southern Cross in Vir", - "NAS Vir Central Command", - "a dockyard orbiting Sif", - "an asteroid orbiting Kara", - "an asteroid orbiting Rota", - "Vir Interstellar Spaceport" - ) + "NT HQ on Luna", + "NSS Exodus in Nyx", + "NCS Northern Star in Vir", + "NLS Southern Cross in Vir", + "NAS Vir Central Command", + "NAB Smythside Central Headquarters in Sol", + "NAS Zeus orbiting Virgo-Prime", + "NIB Posideon in Alpha Centauri", + "NTB Anur on Virgo-Prime", + "NSB Adephagia in Virgo-Erigone", + "NSB Rascal's Pass in Virgo-Erigone", + "NRV |Stellar Delight| in Virgo-Erigone", + "NRV |Von Braun| in Virgo-Erigone", + "a phoron refinery in Vilous", + "a dockyard orbiting Virgo-Prime", + "an asteroid orbiting Virgo 3", + "Vir Interstellar Spaceport" + ) /datum/lore/organization/tsc/nanotrasen/New() ..() @@ -134,125 +552,260 @@ if(string_to_test in destination_names) destination_names.Remove(string_to_test) - - /datum/lore/organization/tsc/hephaestus name = "Hephaestus Industries" short_name = "Hephaestus" acronym = "HI" - desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Sol space. \ + desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Commonwealth space. \ Hephaestus products have a reputation for reliability, and the corporation itself has a noted tendency to stay removed \ from corporate politics. They enforce their neutrality with the help of a fairly large asset-protection contingent which \ - prevents any contracting polities from using their own materiel against them. SolGov itself is one of Hephaestus' largest \ - bulk contractors owing to the above factors." + prevents any contracting polities from using their own materiel against them. The Commonwealth itself is one of Hephaestus' largest \ + bulk contractors owing to the above factors. \ +

\ + Hephaestus' fleet uses identifiers from various deities and spirits of war from Earth's various belief systems." history = "" work = "arms manufacturer" headquarters = "Luna, Sol" motto = "" - ship_prefixes = list("HTV" = "freight", "HLV" = "munitions resupply", "HDV" = "asset protection", "HDV" = "preemptive deployment") - //War God/Soldier Theme - ship_names = list( - "Ares", - "Athena", - "Grant", - "Custer", - "Puller", - "Nike", - "Bellona", - "Leonides", - "Bast", - "Jackson", - "Lee", - "Annan", - "Chi Yu", - "Shiva", - "Tyr", - "Nobunaga", - "Xerxes", - "Alexander", - "McArthur", - "Samson", - "Oya", - "Nemain", - "Caesar", - "Augustus", - "Sekhmet", - "Ku", - "Indra", - "Innana", - "Ishtar", - "Qamaits", - "'Oro", - ) + org_type = "corporate" + slogans = list( + "+Hephaestus Arms!+ - When it comes to +personal protection+, +nobody+ does it +better+.", + "+Hephaestus Arms!+ - Peace through +Superior Firepower+.", + "+Hephaestus Arms!+ - Don't be caught +firing blanks+.", + "+Hephaestus Arms!+ - If in doubt, give 'em +both barrels!+" + ) + ship_prefixes = list("HCV" = "a general operations", "HTV" = "a freight", "HLV" = "a munitions resupply", "HDV" = "an asset protection", "HDV" = "a preemptive deployment") + //War God Theme, updated + append_ship_names = TRUE + added_ship_names = list( + "Anhur", + "Bast", + "Horus", + "Maahes", + "Neith", + "Pakhet", + "Sekhmet", + "Set", + "Sobek", + "Maher", + "Kokou", + "Ogoun", + "Oya", + "Kovas", + "Agrona", + "Andraste", + "Anann", + "Badb", + "Belatucadros", + "Cicolluis", + "Macha", + "Neit", + "Nemain", + "Rudianos", + "Chiyou", + "Guan Yu", + "Jinzha", + "Nezha", + "Zhao Lang", + "Laran", + "Menrva", + "Tyr", + "Woden", + "Freya", + "Odin", + "Ullr", + "Ares", + "Deimos", + "Enyo", + "Kratos", + "Kartikeya", + "Mangala", + "Parvati", + "Shiva", + "Vishnu", + "Shaushka", + "Wurrukatte", + "Hadur", + "Futsunushi", + "Sarutahiko", + "Takemikazuchi", + "Neto", + "Agasaya", + "Belus", + "Ishtar", + "Shala", + "Huitzilopochtli", + "Tlaloc", + "Xipe-Totec", + "Qamaits", + "'Oro", + "Rongo", + "Ku", + "Pele", + "Maru", + "Tumatauenga", + "Bellona", + "Juno", + "Mars", + "Minerva", + "Victoria", + "Anat", + "Astarte", + "Perun", + "Cao Lo" + ) destination_names = list( - "a SolGov dockyard on Luna", - "a Fleet outpost in the Almach Rim", - "a Fleet outpost on the Moghes border" - ) + "our headquarters on Luna", + "a Commonwealth dockyard on Luna", + "a Fleet outpost in the Almach Rim", + "a Fleet outpost on the Moghes border" + ) /datum/lore/organization/tsc/vey_med name = "Vey-Medical" //The Wiki displays them as Vey-Medical. short_name = "Vey-Med" acronym = "VM" - desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and opperated by Skrell. \ + desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and operated by Skrell. \ Despite the suspicion and prejudice leveled at them for their alien origin, Vey-Med has obtained market dominance in \ - the sale of medical equipment-- from surgical tools to large medical devices to the Oddyseus trauma response mecha \ + the sale of medical equipment-- from surgical tools to large medical devices to the Odysseus trauma response mecha \ and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \ - human-like FBP designs. Vey's rise to stardom came from their introduction of ressurective cloning, although in \ + human-like FBP designs. Vey's rise to stardom came from their introduction of resurrective cloning, although in \ recent years they've been forced to diversify as their patents expired and NanoTrasen-made medications became \ - essential to modern cloning." + essential to modern cloning and resleeving procedures. \ +

\ + For reasons known only to the board, Vey-Med's ship names seem to follow the same naming pattern as the Dionae use." history = "" work = "medical equipment supplier" headquarters = "Toledo, New Ohio" motto = "" - ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply", "VSV" = "research mission", "VRV" = "emergency medical support") - // Diona names - ship_names = list( - "Wind That Stirs The Waves", - "Sustained Note Of Metal", - "Bright Flash Reflecting Off Glass", - "Veil Of Mist Concealing The Rock", - "Thin Threads Intertwined", - "Clouds Drifting Amid Storm", - "Loud Note And Breaking", - "Endless Vistas Expanding Before The Void", - "Fire Blown Out By Wind", - "Star That Fades From View", - "Eyes Which Turn Inwards", - "Joy Without Which The World Would Come Undone", - "A Thousand Thousand Planets Dangling From Branches", - "Light Streaming Through Interminable Branches", - "Smoke Brought Up From A Terrible Fire", - "Light of Qerr'Valis", - "King Xae'uoque", - "Memory of Kel'xi", - "Xi'Kroo's Herald" - ) + org_type = "corporate" + slogans = list( + "Vey-Medical. Medical care you can trust.", + "Vey-Medical. Only the finest in surgical equipment.", + "Vey-Medical. Because your patients deserve the best." + ) + ship_prefixes = list("VMV" = "a general operations", "VTV" = "a transportation", "VHV" = "a medical resupply", "VSV" = "a research", "VRV" = "an emergency medical support") + // Diona names, mostly + append_ship_names = TRUE + added_ship_names = list( + "Wind That Stirs The Waves", + "Sustained Note Of Metal", + "Bright Flash Reflecting Off Glass", + "Veil Of Mist Concealing The Rock", + "Thin Threads Intertwined", + "Clouds Drifting Amid Storm", + "Loud Note And Breaking", + "Endless Vistas Expanding Before The Void", + "Fire Blown Out By Wind", + "Star That Fades From View", + "Eyes Which Turn Inwards", + "Still Water Upon An Endless Shore", + "Sunlight Glitters Upon Tranquil Sands", + "Growth Within The Darkest Abyss", + "Joy Without Which The World Would Come Undone", + "A Thousand Thousand Planets Dangling From Branches", + "Light Streaming Through Interminable Branches", + "Smoke Brought Up From A Terrible Fire", + "Light of Qerr'Valis", + "King Xae'uoque", + "Memory of Kel'xi", + "Xi'Kroo's Herald" + ) destination_names = list( - "a research facility in Samsara", - "a SDTF near Ue-Orsi", - "a sapientarian mission in the Almach Rim" - ) + "our headquarters on Toledo, New Ohio", + "a research facility in Samsara", + "a sapientarian mission in the Almach Rim" + ) /datum/lore/organization/tsc/zeng_hu name = "Zeng-Hu Pharmaceuticals" short_name = "Zeng-Hu" acronym = "ZH" desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \ - on the market for medications, and many household names are patentted by Zeng-Hu-- Bicaridyne, Dylovene, Tricordrizine, \ - and Dexalin all came from a Zeng-Hu medical laboratory. Zeng-Hu's fortunes have been in decline as Nanotrasen's near monopoly \ - on phoron research cuts into their R&D and Vey-Med's superior medical equipment effectively decimated their own equipment \ + on the market for medications, and many household names are patented by Zeng-Hu-- Bicaridine, Dylovene, Tricordrazine, \ + and Dexalin all came from Zeng-Hu medical laboratories. Zeng-Hu's fortunes have been in decline as Nanotrasen's near monopoly \ + on phoron and cloning research cuts into their R&D and Vey-Med's superior medical equipment effectively decimated their own equipment \ interests. The three-way rivalry between these companies for dominance in the medical field is well-known and a matter of \ - constant economic speculation." + constant economic speculation. \ +

\ + Not to be outdone by NT in the recognition of famous figures, Zeng-Hu has adopted the names of famous physicians for their fleet." history = "" work = "pharmaceuticals company" headquarters = "Earth, Sol" motto = "" - ship_prefixes = list("ZTV" = "transportation", "ZMV" = "medical resupply") - destination_names = list() + org_type = "corporate" + slogans = list( + "Zeng-Hu! WE make the medicines that YOU need!", + "Zeng-Hu! Having acid reflux problems? Consult your local physician to see if Dylovene is right for YOU!", + "Zeng-Hu! Tired of getting left in the dust? Try Hyperzine! You'll never fall behind again!", + "Zeng-Hu! Life's aches and pains getting to you? Try Tramadol - available at any good pharmacy!" + ) + ship_prefixes = list("ZHV" = "a general operations", "ZTV" = "a transportation", "ZMV" = "a medical resupply", "ZRV" = "a medical research") + //ship names: a selection of famous physicians who advanced the cause of medicine + append_ship_names = TRUE + added_ship_names = list( + "Averroes", + "Avicenna", + "Banting", + "Billroth", + "Blackwell", + "Blalock", + "Charaka", + "Chauliac", + "Cushing", + "Domagk", + "Galen", + "Fauchard", + "Favaloro", + "Fleming", + "Fracastoro", + "Goodfellow", + "Gray", + "Harvey", + "Heimlich", + "Hippocrates", + "Hunter", + "Isselbacher", + "Jenner", + "Joslin", + "Kocher", + "Laennec", + "Lane-Claypon", + "Lister", + "Lower", + "Madhav", + "Maimonides", + "Marshall", + "Mayo", + "Meyerhof", + "Minot", + "Morton", + "Needleman", + "Nicolle", + "Osler", + "Penfield", + "Raichle", + "Ransohoff", + "Rhazes", + "Semmelweis", + "Starzl", + "Still", + "Susruta", + "Urbani", + "Vesalius", + "Vidius", + "Whipple", + "White", + "Worcestor", + "Yegorov", + "Xichun" + ) + destination_names = list( + "our headquarters on Earth" + ) /datum/lore/organization/tsc/ward_takahashi name = "Ward-Takahashi General Manufacturing Conglomerate" @@ -263,56 +816,144 @@ of the AI cores on which vital control systems are mounted, and it is this branch of their industry that has \ led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi's economies \ of scale frequently steal market share from Nanotrasen's high-price products, leading to a bitter rivalry in the \ - consumer electronics market." + consumer electronics market. \ +

\ + Ward-Takahashi are a mild anomaly in the TSC fleet-naming game, as they've opted to use stellar phenomena." history = "" work = "electronics manufacturer" headquarters = "" motto = "" - ship_prefixes = list("WFV" = "freight", "WTV" = "transport", "WDV" = "asset protection") - ship_names = list( - "Comet", - "Aurora", - "Supernova", - "Nebula", - "Galaxy", - "Starburst", - "Constellation", - "Pulsar", - "Quark", - "Void", - "Asteroid", - "Wormhole", - "Sunspots", - "Supercluster", - "Moon", - "Anomaly", - "Drift", - "Stream", - "Rift", - "Curtain" - ) - destination_names = list() + org_type = "corporate" + slogans = list( + "Takahashi Appliances - keeping your home running smoothly.", + "W-T Automotive - keeping you on time, all the time.", + "Ward-Takahashi Electronics - keeping you in touch with the galaxy." + ) + ship_prefixes = list("WTV" = "a general operations", "WTFV" = "a freight", "WTGV" = "a transport", "WTDV" = "an asset protection") + append_ship_names = TRUE + added_ship_names = list( + "Comet", + "Meteor", + "Heliosphere", + "Bolide", + "Superbolide", + "Aurora", + "Nova", + "Supernova", + "Nebula", + "Galaxy", + "Starburst", + "Constellation", + "Pulsar", + "Quark", + "Void", + "Asteroid", + "Wormhole", + "Sunspot", + "Supercluster", + "Supergiant", + "Protostar", + "Magnetar", + "Moon", + "Supermoon", + "Anomaly", + "Drift", + "Stream", + "Rift", + "Curtain", + "Planetar", + "Quasar", + "Blazar", + "Corona", + "Binary" + ) + //destination_names = list() /datum/lore/organization/tsc/bishop name = "Bishop Cybernetics" short_name = "Bishop" acronym = "BC" - desc = "Bishop's focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a bête noire for \ + desc = "Bishop's focus is on high-class, stylish cybernetics. A favorite among transhumanists (and loathed by all \ bioconservatives), Bishop manufactures not only prostheses but also brain augmentation, synthetic organ replacements, \ and odds and ends like implanted wrist-watches. Their business model tends towards smaller, boutique operations, giving \ it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med's for cost. Bishop's reputation \ for catering towards the interests of human augmentation enthusiasts instead of positronics have earned it ire from the \ - Positronic Rights Group and puts it in ideological (but not economic) comptetition with Morpheus Cyberkinetics." + Positronic Rights Group and puts it in ideological (but not economic) competition with Morpheus Cyberkinetics. \ +

\ + Each vessel in Bishop's sleek and stylish fleet is intended to advertise the corporate style, and bears the name of a famous mechanical engineer." history = "" work = "cybernetics and augmentation manufacturer" headquarters = "" motto = "" - ship_prefixes = list("ITV" = "transportation", "ISV" = "research exchange") //Bishop can't afford / doesn't care enough to afford its own prefixes + org_type = "corporate" + slogans = list( + "Bishop Cybernetics - only the best in personal augmentation.", + "Bishop Cybernetics - why settle for flesh when you can have metal?", + "Bishop Cybernetics - make a statement.", + "Bishop Cybernetics - embrace the purity of the machine." + ) + ship_prefixes = list("BCV" = "a general operations", "BCTV" = "a transportation", "BCSV" = "a research exchange") + //famous mechanical engineers + append_ship_names = TRUE + added_ship_names = list( + "Al-Jazari", + "Al-Muradi", + "Al-Zarqali", + "Archimedes", + "Arkwright", + "Armstrong", + "Babbage", + "Barsanti", + "Benz", + "Bessemer", + "Bramah", + "Brunel", + "Cardano", + "Cartwright", + "Cayley", + "Clement", + "Leonardo da Vinci", + "Diesel", + "Drebbel", + "Fairbairn", + "Fontana", + "Fourneyron", + "Fulton", + "Fung", + "Gantt", + "Garay", + "Hackworth", + "Harrison", + "Hornblower", + "Jacquard", + "Jendrassik", + "Leibniz", + "Ma Jun", + "Maudslay", + "Metzger", + "Murdoch", + "Nasmyth", + "Parsons", + "Rankine", + "Reynolds", + "Roberts", + "Scheutz", + "Sikorsky", + "Somerset", + "Stephenson", + "Stirling", + "Tesla", + "Vaucanson", + "Vishweswarayya", + "Wankel", + "Watt", + "Wiberg" + ) destination_names = list( - "A medical facility in Angessa's Pearl" - ) + "a medical facility in Angessa's Pearl" + ) /datum/lore/organization/tsc/morpheus name = "Morpheus Cyberkinetics" @@ -322,245 +963,2046 @@ and needs. A product of the synthetic colony of Shelf, Morpheus eschews traditional advertising to keep their prices low and \ relied on word of mouth among positronics to reach their current economic dominance. Morpheus in exchange lobbies heavily for \ positronic rights, sponsors positronics through their Jans-Fhriede test, and tends to other positronic concerns to earn them \ - the good-will of the positronics, and the ire of those who wish to exploit them." + the good-will of the positronics, and the ire of those who wish to exploit them. \ +

\ + Morpheus' fleet bears the names of periodic elements. They initially wanted to go with complex compounds, but realized that \ + such designations would be unwieldy and inefficient for regular usage. In the event that multiple ships are working together, \ + they may use the periodic element as their flotilla designation, and a numerical identifier that corresponds with an isotope \ + of that element for individual ships." history = "" work = "cybernetics manufacturer" - headquarters = "Shelf" + headquarters = "Shelf flotilla" motto = "" - ship_prefixes = list("MTV" = "freight") - // Culture names, because Anewbe told me so. - ship_names = list( - "Nervous Energy", - "Prosthetic Conscience", - "Revisionist", - "Trade Surplus", - "Flexible Demeanour", - "Just Read The Instructions", - "Limiting Factor", - "Cargo Cult", - "Gunboat Diplomat", - "A Ship With A View", - "Cantankerous", - "I Thought He Was With You", - "Never Talk To Strangers", - "Sacrificial Victim", - "Unwitting Accomplice", - "Witting Accomplice", - "Bad For Business", - "Just Testing", - "Size Isn't Everything", - "Yawning Angel", - "Liveware Problem", - "Very Little Gravitas Indeed", - "Zero Gravitas", - "Gravitas Free Zone", - "Absolutely No You-Know-What", - "Existence Is Pain", - "I'm Walking Here", - "Screw Loose", - "Of Course I Still Love You", - "Limiting Factor", - "So Much For Subtley", - "Unfortunate Conflict Of Evidence", - "Prime Mover", - "It's One Of Ours", - "Thank You And Goodnight", - "Boo!", - "Reasonable Excuse", - "Honest Mistake", - "Appeal To Reason", - "My First Ship II", - "Hidden Income", - "Anything Legal Considered", - "New Toy", - "Me, I'm Always Counting", - "Just Five More Minutes", - "Are You Feeling It", - "Great White Snark", - "No Shirt No Shoes", - "Callsign", - "Three Ships in a Trenchcoat", - "Not Wearing Pants", - "Ridiculous Naming Convention", - "God Dammit Morpheus", - "It Seemed Like a Good Idea", - "Legs All the Way Up", - "Purchase Necessary", - "Some Assembly Required", - "Buy One Get None Free", - "BRB", - "SHIP NAME HERE", - "Questionable Ethics", - "Accept Most Substitutes", - "I Blame the Government", - "Garbled Gibberish", - "Thinking Emoji", - "Is This Thing On?", - "Make My Day", - "No Vox Here", - "Savings and Values", - "Secret Name", - "Can't Find My Keys", - "Look Over There!", - "Made You Look!", - "Take Nothing Seriously", - "It Comes In Lime, Too", - "Loot Me", - "Nothing To Declare", - "Sneaking Suspicion", - "Bass Ackwards", - "Good Things Come to Those Who Freight", - "Redundant Morality", - "Synthetic Goodwill", - "Your Ad Here", - "What Are We Plotting?", - "Set Phasers To Stun", - "Preemptive Defensive Strike", - "This Ship Is Spiders", - "Legitimate Trade Vessel", - "Please Don't Explode II", - "Get Off the Air", - "Definitely Unsinkable", - "We Didn't Do It!", - "Unrelated To That Other Ship", - "Not Reflecting The Opinons Of The Shareholders", - "Normal Ship Name", - "Define Offensive", - "Tiffany", - "My Other Ship is A Gestalt", - "NTV HTV WTV ITV ZTV" - ) + org_type = "neutral" //disables slogans for morpheus as they don't advertise, per the description above + /* + slogans = list() + */ + ship_prefixes = list("MCV" = "a general operations", "MTV" = "a freight", "MDV" = "a market protection", "MSV" = "an outreach") + //periodic elements; something 'unusual' for the posibrain TSC without being full on 'quirky' culture ship names (much as I love them, they're done to death) + append_ship_names = TRUE + added_ship_names = list( + "Hydrogen", + "Helium", + "Lithium", + "Beryllium", + "Boron", + "Carbon", + "Nitrogen", + "Oxygen", + "Fluorine", + "Neon", + "Sodium", + "Magnesium", + "Aluminium", + "Silicon", + "Phosphorus", + "Sulfur", + "Chlorine", + "Argon", + "Potassium", + "Calcium", + "Scandium", + "Titanium", + "Vanadium", + "Chromium", + "Manganese", + "Iron", + "Cobalt", + "Nickel", + "Copper", + "Zinc", + "Gallium", + "Germanium", + "Arsenic", + "Selenium", + "Bromine", + "Krypton", + "Rubidium", + "Strontium", + "Yttrium", + "Zirconium", + "Niobium", + "Molybdenum", + "Technetium", + "Ruthenium", + "Rhodium", + "Palladium", + "Silver", + "Cadmium", + "Indium", + "Tin", + "Antimony", + "Tellurium", + "Iodine", + "Xenon", + "Caesium", + "Barium" + ) + //some hebrew alphabet destinations for a little extra unusualness destination_names = list( - "a trade outpost in Shelf" + "our headquarters, the Shelf flotilla", + "one of our factory complexes on Root", + "research outpost Aleph", + "logistics depot Dalet", + "research installation Zayin", + "research base Tsadi", + "manufacturing facility Samekh" ) /datum/lore/organization/tsc/xion name = "Xion Manufacturing Group" short_name = "Xion" - desc = "Xion, quietly, controls most of the market for industrial equipment. Their portfolio includes mining exosuits, \ + acronym = "XMG" + desc = "Xion, quietly, controls most of the market for industrial equipment, especially on the frontier. Their portfolio includes mining exosuits, \ factory equipment, rugged positronic chassis, and other pieces of equipment vital to the function of the economy. Xion \ keeps its control of the market by leasing, not selling, their equipment, and through infamous and bloody patent protection \ - lawsuits. Xion are noted to be a favorite contractor for SolGov engineers, owing to their low cost and rugged design." + lawsuits. Xion are noted to be a favorite contractor for Commonwealth engineers, owing to their low cost and rugged design. \ + Dedicated frontiersmen tend to have an unfavorable view of the company however, as the leasing arrangements often make field repairs \ + challenging at best, and expensively contract-breaking at worst. Nobody wants an expensive piece of equipment to break down \ + three weeks of travel away from the closest Licensed Xion Repair Outlet. \ +

\ + Xion's fleet bears the name of mountains and terrain features on Mars." history = "" work = "industrial equipment manufacturer" headquarters = "" motto = "" - ship_prefixes = list("XTV" = "hauling", "XFV" = "bulk transport", "XIV" = "resupply") - destination_names = list() + org_type = "corporate" + slogans = list( + "Xion Manufacturing - We have what you need.", + "Xion Manufacturing - The #1 choice of the SolCom Engineer's Union for 150 years.", + "Xion Manufacturing - Our products are as bulletproof as our contracts." + ) + ship_prefixes = list("XMV" = "a general operations", "XTV" = "a hauling", "XFV" = "a bulk transport", "XIV" = "a resupply") + //martian mountains + append_ship_names = TRUE + added_ship_names = list( + "Olympus Mons", + "Ascraeus Mons", + "Arsia Mons", + "Pavonis Mons", + "Elysium Mons", + "Hecates Tholus", + "Albor Tholus", + "Tharsis Tholus", + "Biblis Tholus", + "Alba Mons", + "Ulysses Tholus", + "Mount Sharp", + "Uranius Mons", + "Anseris Mons", + "Hadriacus Mons", + "Euripus Mons", + "Tyrrhenus Mons", + "Promethei Mons", + "Chronius Mons", + "Apollinaris Mons", + "Gonnus Mons", + "Syrtis Major Planum", + "Amphitrites Patera", + "Nili Patera", + "Pityusa Patera", + "Malea Patera", + "Peneus Patera", + "Labeatis Mons", + "Issidon Paterae", + "Pindus Mons", + "Meroe Patera", + "Orcus Patera", + "Oceanidum Mons", + "Horarum Mons", + "Peraea Mons", + "Octantis Mons", + "Galaxius Mons", + "Hellas Planitia" + ) + //destination_names = list() + +/datum/lore/organization/tsc/ftu + name = "Free Trade Union" + short_name = "Trade Union" + acronym = "FTU" + desc = "The Free Trade Union is different from other transtellar companies in that they are not just a company; rather, they are a big conglomerate of various traders and merchants from all over the galaxy. The FTU is also partially responsible for many of the large scale 'freeport' trade stations across the known galaxy, even in non-human space. Generally, they are multi-purpose stations but they always keep areas filled with duty-free shops, where almost anything you can imagine can be found - so long as it's not outrageously illegal or hideously expensive.

They are the creators of the Tradeband language, created specially for being a lingua franca where every merchant can understand each other independent of language or nationality.

The Union doesn't maintain a particularly large fleet of its own; most members are card-carrying independents who fly under their own flags. When you do see a Union ship (they usually operate under the names of historic merchants) you can be assured that it's tending to something that the Union sees as being of the utmost importance to its interests." + history = "" + work = "" + headquarters = "" + motto = "" + + org_type = "corporate" + slogans = list( + "The FTU. We look out for the little guy.", + "There's no Trade like Free Trade.", + "There's no Union like the Free Trade Union.", + "Join the Free Trade Union. Because anything worth doing, is worth doing for money." //rule of acquisition #13 + ) + ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment") + //famous merchants and traders, taken from Civ6's Great Merchants, plus the TSC's founder + append_ship_names = TRUE + added_ship_names = list( + "Isaac Adler", + "Colaeus", + "Marcus Licinius Crassus", + "Zhang Qian", + "Irene of Athens", + "Marco Polo", + "Piero de' Bardi", + "Giovanni de' Medici", + "Jakob Fugger", + "Raja Todar Mal", + "Adam Smith", + "John Jacob Astor", + "John Spilsbury", + "John Rockefeller", + "Sarah Breedlove", + "Mary Katherine Goddard", + "Helena Rubenstein", + "Levi Strauss", + "Melitta Bentz", + "Estee Lauder", + "Jamsetji Tata", + "Masaru Ibuka", + ) + destination_names = list( + "a Free Trade Union office", + "FTU HQ" + ) /datum/lore/organization/tsc/mbt name = "Major Bill's Transportation" short_name = "Major Bill's" - desc = "The most popular courier service and starliner, Major Bill's is an unassuming corporation whose greatest asset \ - is their low cost and brand recognition. Major Bill's is known, perhaps unfavorably, for its mascot, Major Bill, \ - a cartoonish military figure that spouts quotable slogans. Their motto is \"With Major Bill's, you won't pay major bills!\", \ - an earworm much of the galaxy longs to forget." + acronym = "MBT" + desc = "The most popular courier service and starliner, Major Bill's is an unassuming corporation whose greatest asset is their low cost and brand recognition. Major Bill's is known, perhaps unfavorably, for its mascot, Major Bill, a cartoonish military figure that spouts quotable slogans. Their main slogan, featured at least once in all their advertising, is \"With Major Bill's, you won't pay major bills!\", an earworm much of the galaxy longs to forget. \ +

\ + Their ships are named after some of Earth's greatest rivers." history = "" work = "courier and passenger transit" headquarters = "Mars, Sol" motto = "With Major Bill's, you won't pay major bills!" - ship_prefixes = list("TTV" = "transport", "TTV" = "luxury transit") - destination_names = list() + org_type = "corporate" + slogans = list( + "With Major Bill's, you won't pay major bills!", + "Major Bill's - Private Couriers - General Shipping!", + "Major Bill's got you covered, now get out there!" + ) + ship_prefixes = list("TTV" = "a general operations", "TTV" = "a transport", "TTV" = "a luxury transit", "TTV" = "a priority transit", "TTV" = "a secure data courier") + //ship names: big rivers + append_ship_names = TRUE + added_ship_names = list ( + "Nile", + "Kagera", + "Nyabarongo", + "Mwogo", + "Rukarara", + "Amazon", + "Ucayali", + "Tambo", + "Ene", + "Mantaro", + "Yangtze", + "Mississippi", + "Missouri", + "Jefferson", + "Beaverhead", + "Red Rock", + "Hell Roaring", + "Yenisei", + "Angara", + "Yelenge", + "Ider", + "Ob", + "Irtysh", + "Rio de la Plata", + "Parana", + "Rio Grande", + "Congo", + "Chambeshi", + "Amur", + "Argun", + "Kherlen", + "Lena", + "Mekong", + "Mackenzie", + "Peace", + "Finlay", + "Niger", + "Brahmaputra", + "Tsangpo", + "Murray", + "Darling", + "Culgoa", + "Balonne", + "Condamine", + "Tocantins", + "Araguaia", + "Volga" + ) + destination_names = list( + "Major Bill's Transportation HQ on Mars", + "a Major Bill's warehouse", + "a Major Bill's distribution center", + "a Major Bill's supply depot" + ) -/datum/lore/organization/tsc/independent - name = "Free Traders" - short_name = "Free Trader" - desc = "Though less common now than they were in the decades before the Sol Economic Organization took power, independent traders remain an important part of the galactic economy, owing in no small part to protective tarrifs established by the Free Trade Union in the late twenty-forth century." +/datum/lore/organization/tsc/grayson + name = "Grayson Manufactories Ltd." + short_name = "Grayson" + acronym = "GM" + desc = "Grayson Manufactories Ltd. is one of the oldest surviving TSCs, having been in 'the biz' almost since mankind began to colonize the rest of the Sol system and thus exploit abundant 'extraterrestrial' resources. Where many choose to go into the high end markets, however, Grayson makes their money by providing foundations for other businesses; they run some of the largest mining and refining operations in all of human-inhabited space. Ore is hauled out of Grayson-owned mines, transported on Grayson-owned ships, and processed in Grayson-owned refineries, then sold by Grayson-licensed vendors to other industries. Several of their relatively newer ventures include heavy industrial equipment, which has earned a reputation for being surprisingly reliable.

Grayson may maintain a neutral stance towards their fellow TSCs, but can be quite aggressive in the markets that it already holds. A steady stream of rumors suggests they're not shy about engaging in industrial sabotage or calling in strikebreakers, either. \ +

\ + Fitting their 'down to earth' reputation, Grayson's corporate fleet uses the names of various forms of rock and mineral to identify their vessels." history = "" - work = "trade and transit" + work = "" + headquarters = "Mars, Sol" + motto = "" + + org_type = "corporate" + slogans = list( + "Grayson Mining - It's An Ore Effort, For The War Effort!", + "Grayson Mining - Winning The War On Ore!", + "Grayson Mining - Come On Down To Our Ore Chasm!" + ) + ship_prefixes = list("GMV" = "a general operations", "GMT" = "a transport", "GMR" = "a resourcing", "GMS" = "a surveying", "GMH" = "a bulk transit") + //rocks + append_ship_names = TRUE + added_ship_names = list( + "Adakite", + "Andesite", + "Basalt", + "Basanite", + "Diorite", + "Dunite", + "Gabbro", + "Granite", + "Harzburgite", + "Ignimbrite", + "Kimberlite", + "Komatiite", + "Norite", + "Obsidian", + "Pegmatite", + "Picrite", + "Pumice", + "Rhyolite", + "Scoria", + "Syenite", + "Tachylyte", + "Wehrlite", + "Arkose", + "Chert", + "Dolomite", + "Flint", + "Laterite", + "Marl", + "Oolite", + "Sandstone", + "Shale", + "Anthracite", + "Gneiss", + "Granulite", + "Mylonite", + "Schist", + "Skarn", + "Slate" + ) + destination_names = list( + "our headquarters on Mars", + "one of our manufacturing complexes", + "one of our mining installations" + ) + +/datum/lore/organization/tsc/aether + name = "Aether Atmospherics & Recycling" + short_name = "Aether" + acronym = "AAR" + desc = "Aether Atmospherics and Recycling is the prime maintainer and provider of atmospherics systems across both the many ships that navigate the vast expanses of space, and the life support on current and future Human colonies. The byproducts from the filtration of atmospheres across the galaxy are then resold for a variety of uses to those willing to buy. With the nature of their services, most work they do is contracted for construction of these systems, or staffing to maintain them for colonies across human space. \ +

\ + Somewhat unimaginatively, Aether has adopted the names of various types of weather for their fleet." + history = "" + work = "" + headquarters = "" + motto = "Dum spiro spero" + + org_type = "corporate" + slogans = list( + "Aether A&R - We're Absolutely Breathtaking.", + "Aether A&R - You Can Breathe Easy With Us!", + "Aether A&R - The SolCom's #1 Environmental Systems Provider." + ) + ship_prefixes = list("AARV" = "a general operations", "AARE" = "a resource extraction", "AARG" = "a gas transport", "AART" = "a transport") + //weather systems/patterns + append_ship_names = TRUE + added_ship_names = list ( + "Cloud", + "Nimbus", + "Fog", + "Vapor", + "Haze", + "Smoke", + "Thunderhead", + "Veil", + "Steam", + "Mist", + "Noctilucent", + "Nacreous", + "Cirrus", + "Cirrostratus", + "Cirrocumulus", + "Aviaticus", + "Altostratus", + "Altocumulus", + "Stratus", + "Stratocumulus", + "Cumulus", + "Fractus", + "Asperitas", + "Nimbostratus", + "Cumulonimbus", + "Pileus", + "Arcus" + ) + destination_names = list( + "Aether HQ", + "a gas mining orbital", + "a liquid extraction plant" + ) + +/datum/lore/organization/tsc/focalpoint + name = "Focal Point Energistics" + short_name = "Focal Point" + acronym = "FPE" + desc = "Focal Point Energistics is an electrical engineering solutions firm originally formed as a conglomerate of Earth power companies and affiliates. Focal Point manufactures and distributes vital components in modern power grids, such as TEGs, PSUs and their specialty product, the SMES. The company is often consulted and contracted by larger organisations due to their expertise in their field.\ +

\ + Keeping in theme with the other big TSCs, Focal's fleet (which is comprised almost entirely of transports and engineering vessels) uses the names of electrical engineers." + history = "" + work = "" + headquarters = "" + motto = "" + + org_type = "corporate" + slogans = list( + "Focal Point Energistics - Sustainable Power for a Sustainable Future.", + "Focal Point Energistics - Powering The Future Before It Even Happens.", + "Focal Point Energistics - Let There Be Light." + ) + ship_prefixes = list("FPV" = "a general operations", "FPH" = "a transport", "FPC" = "an energy relay", "FPT" = "a fuel transport") + //famous electrical engineers + append_ship_names = TRUE + added_ship_names = list ( + "Erlang", + "Blumlein", + "Taylor", + "Bell", + "Reeves", + "Bennett", + "Volta", + "Blondel", + "Beckman", + "Hirst", + "Lamme", + "Bright", + "Armstrong", + "Ayrton", + "Bardeen", + "Fuller", + "Boucherot", + "Brown", + "Brush", + "Burgess", + "Camras", + "Crompton", + "Deprez", + "Elwell", + "Entz", + "Faraday", + "Halas", + "Hounsfield", + "Immink", + "Laithwaite", + "McKenzie", + "Moog", + "Moore", + "Pierce", + "Ronalds", + "Shallenberger", + "Siemens", + "Spencer", + "Tesla", + "Yablochkov", + ) + destination_names = list( + "Focal Point HQ" + ) + +/datum/lore/organization/tsc/starlanes + name = "StarFlight Inc." + short_name = "StarFlight" + acronym = "SFI" + desc = "Founded in 2137 by Astara Junea, StarFlight Incorporated is now one of the biggest passenger liner businesses in human-occupied space and has even begun breaking into alien markets - all despite a rocky start, and several high-profile ship disappearances and shipjackings. With space traffic at an all-time high, it's a depressing reality that SFI's incidents are just a tiny drop in the bucket compared to everything else going on. \ +

\ + SFI's fleet is, somewhat endearingly, named after various species of bird, though the designation Pigeon was removed from the lineup after a particularly unusual chain of events involving a business liner. For reasons that have continued to remain unclear since the company's foundation, SFI vessels are permitted to use the same high-level identifier pattern as governmental vessels." + history = "" + work = "luxury, business, and economy passenger flights" + headquarters = "Spin Aerostat, Jupiter" + motto = "Sic itur ad astra" + + org_type = "corporate" + slogans = list( + "StarFlight - travel the stars.", + "StarFlight - bringing you to new horizons.", + "StarFlight - getting you where you need to be since 2137." + ) + ship_prefixes = list("SFI-X" = "a VIP liner", "SFI-L" = "a luxury liner", "SFI-B" = "a business liner", "SFI-E" = "an economy liner", "SFI-M" = "a mixed class liner", "SFI-S" = "a sightseeing", "SFI-M" = "a wedding", "SFI-O" = "a marketing", "SFI-S" = "a safari", "SFI-A" = "an aquatic adventure") + flight_types = list( //no military-sounding ones here + "flight", + "route", + "tour" + ) + ship_names = list( //birbs + "Rhea", + "Ostrich", + "Cassowary", + "Emu", + "Kiwi", + "Duck", + "Swan", + "Chachalaca", + "Curassow", + "Guan", + "Guineafowl", + "Pheasant", + "Turkey", + "Francolin", + "Loon", + "Penguin", + "Grebe", + "Flamingo", + "Stork", + "Ibis", + "Heron", + "Pelican", + "Spoonbill", + "Shoebill", + "Gannet", + "Cormorant", + "Osprey", + "Kite", + "Hawk", + "Falcon", + "Hummingbird", + "Toucan", + "Caracara" + ) + destination_names = list( + "a resort planet", + "a beautiful ring system", + "a ski-resort world", + "an ocean resort planet", + "a desert resort world", + "an arctic retreat" + ) + +/datum/lore/organization/tsc/oculum + name = "Oculum Broadcasting Network" + short_name = "Oculus" + acronym = "OBN" + desc = "Oculum owns approximately 30% of Sol-wide news networks, including microblogging aggregate sites, network and comedy news, and even old-fashioned newspapers. Staunchly apolitical, they specialize in delivering the most popular news available- which means telling people what they already want to hear. Oculum is a specialist in branding, and most people don't know that the reactionary Daedalus Dispatch newsletter and the radically transhuman Liquid Steel webcrawler are controlled by the same organization." + history = "" + work = "news media" + headquarters = "" + motto = "News from all across the spectrum" + + org_type = "corporate" + slogans = list( + "Oculum - All News, All The Time.", + "Oculum - We Keep An Eye Out.", + "Oculum - Nothing But The Truth.", + "Oculum - Your Eye On The Galaxy." + ) + ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations") + destination_names = list( + "Oculus HQ" + ) + +/datum/lore/organization/tsc/centauriprovisions + name = "Centauri Provisions" + short_name = "Centauri" + acronym = "ACP" + desc = "Headquartered in Alpha Centauri, Centauri Provisions made a name in the snack-food industry primarily by being the first to focus on colonial holdings. The various brands of Centauri snackfoods are now household names, from SkrellSnax to Space Mountain Wind to the ubiquitous and supposedly-edible Bread Tube, and they are well known for targeting as many species as possible with each brand (which, some will argue, is at fault for some of those brands being rather bland in taste and texture). Their staying power is legendary, and many spacers have grown up on a mix of their cheap crap and protein shakes." + history = "" + work = "catering, food, drinks" + headquarters = "Alpha Centauri" + motto = "The largest brands of food and drink - most of them are Centauri." + + org_type = "corporate" + slogans = list( + "Centauri Provisions Bread Tubes - They're Not Just Edible, They're |Breadible!|", + "Centauri Provisions SkrellSnax - Not |Just| For Skrell!", + "Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!", + "Centauri Provisions Syndi-Cakes - A Taste So Good You'll Swear It's |Illegal|!", + "Centauri Provisions Tuna Snax - There's Nothing |Fishy| Going On Here!" + ) + ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations") + destination_names = list( + "Centauri Provisions HQ", + "a Centauri Provisions depot", + "a Centauri Provisions warehouse" + ) + +/datum/lore/organization/tsc/einstein + name = "Einstein Engines" + short_name = "Einstein" + acronym = "EEN" + desc = "Einstein is an old company that has survived through rampant respecialization. In the age of phoron-powered exotic engines and ubiquitous solar power, Einstein makes its living through the sale of engine designs for power sources it has no access to, and emergency fission or hydrocarbon power supplies. Accusations of corporate espionage against research-heavy corporations like NanoTrasen and its chief rival Focal Point are probably unfounded. Probably." + history = "" + work = "catering, food, drinks" + headquarters = "" + motto = "Engine designs, emergency generators, and old memories" + + org_type = "corporate" + slogans = list( + "Einstein Engines - you don't have to be Einstein to use |our| engines!", + "Einstein Engines - bringing power to the people.", + "Einstein Engines - because it's the smart thing to do." + ) + ship_prefixes = list("EETV" = "a transport", "EERV" = "a research", "EEV" = "a general operations") + destination_names = list( + "Einstein HQ" + ) + +/datum/lore/organization/tsc/wulf + name = "Wulf Aeronautics" + short_name = "Wulf Aero" + acronym = "WUFA" + desc = "Wulf Aeronautics is the chief producer of transport and hauling spacecraft. A favorite contractor of the CWS, Wulf manufactures most of their diplomatic and logistics craft, and does a brisk business with most other TSCs. The quiet reliance of the economy on their craft has kept them out of the spotlight and uninvolved in other corporations' back-room dealings; nobody is willing to try to undermine Wulf Aerospace in case it bites them in the ass, and everyone knows that trying to buy out the company would start a bidding war from which nobody would escape the PR fallout." + history = "" + work = "starship construction" + headquarters = "" + motto = "We build it - you fly it" + + org_type = "corporate" + slogans = list( + "Wulf Aeronautics. We build it - you fly it.", + "Wulf Aeronautics, the Commonwealth's favorite shipwrights.", + "Wulf Aeronautics, building tomorrow's ships today." + ) + ship_prefixes = list("WAFV" = "a freight", "WARV" = "a repair", "WAV" = "a general operations", "WALV" = "a logistics") + destination_names = list( + "Wulf Aeronautics HQ", + "a Wulf Aeronautics supply depot", + "a Wulf Aeronautics Shipyard" + ) + +/datum/lore/organization/tsc/gilthari + name = "Gilthari Exports" + short_name = "Gilthari" + acronym = "GEX" + desc = "Gilthari is Sol's premier supplier of luxury goods, specializing in extracting money from the rich and successful that aren't already their own shareholders. Their largest holdings are in gambling, but they maintain subsidiaries in everything from VR equipment to luxury watches. Their holdings in mass media are a smaller but still important part of their empire. Gilthari is known for treating its positronic employees very well, sparking a number of conspiracy theories. The gorgeous FBP model that Gilthari provides them is a symbol of the corporation's wealth and reach ludicrous prices when available on the black market, with legal ownership of the chassis limited, by contract, to employees.

In fitting with their heritage, Gilthari ships are named after precious stones." + history = "" + work = "luxury goods" + headquarters = "" + motto = "" + + org_type = "corporate" + slogans = list( + "Why choose |luxury| when you can choose |Gilthari|?", + "|Gilthari|. Because |you're| worth it.", + "|Gilthari|. Why settle for |anything| less?" + ) + ship_prefixes = list("GETV" = "a transport", "GECV" = "a luxury catering", "GEV" = "a general operations") + //precious stones + ship_names = list( + "Afghanite", + "Agate", + "Alexandrite", + "Amazonite", + "Amber", + "Amethyst", + "Ametrine", + "Andalusite", + "Aquamarine", + "Azurite", + "Benitoite", + "Beryl", + "Carnelian", + "Chalcedony", + "Chrysoberyl", + "Chrysoprase", + "Citrine", + "Coral", + "Danburite", + "Diamond", + "Emerald", + "Fluorite", + "Garnet", + "Heliodor", + "Iolite", + "Jade", + "Jasper", + "Lapis Lazuli", + "Malachite", + "Moldavite", + "Moonstone", + "Obsidian", + "Onyx", + "Orthoclase", + "Pearl", + "Peridot", + "Quartz", + "Ruby", + "Sapphire", + "Scapolite", + "Selenite", + "Serpentine", + "Sphalerite", + "Sphene", + "Spinel", + "Sunstone", + "Tanzanite", + "Topaz", + "Tourmaline", + "Turquoise", + "Zircon" + ) + destination_names = list( + "Gilthari HQ", + "a GE supply depot", + "a GE warehouse", + "a GE-owned luxury resort" + ) + +/datum/lore/organization/tsc/coyotecorp + name = "Coyote Salvage Corp." + short_name = "Coyote Salvage" + acronym = "CSC" + desc = "The threat of Kessler Syndrome ever looms in this age of spaceflight, and it's only thanks to the dedication and hard work of unionized salvage groups like the Coyote Salvage Corporation that the spacelanes are kept clear and free of wrecks and debris. Painted in that distinctive industrial yellow, their fleets of roaming scrappers are contracted throughout civilized space and the frontier alike to clean up space debris. Some may look down on them for handling what would be seen as garbage and discarded scraps, but as far as the CSC is concerned everything would grind to a halt (or more accurately, rapidly expand in a cloud of red-hot scrap metal) without their tender care and watchful eyes.\ +

\ + Many spacers turn to join the ranks of the Salvage Corps when times are lean, or when they need a quick buck. The work is dangerous and the hours are long, but the benefits are generous and you're paid by what you salvage so if you've an eye for appraising scrap you can turn a good profit. For those who dedicate their lives to the work, they can become kings of the scrapheap and live like royalty. \ +

\ + CSC Contractors are no strangers to conflict either, often having to deal with claimjumpers and illegal salvage operations - or worse, the vox." + history = "" + work = "salvage and shipbreaking" + headquarters = "N/A" + motto = "one man's trash is another man's treasure" + + org_type = "corporate" + slogans = list( + "Coyote Salvage Corp. 'cause your trash ain't gonna clean itself.", + "Coyote Salvage Corp. 'cause one man's trash is another man's treasure.", + "Coyote Salvage Corp. We'll take your scrap - but not your crap." + ) + ship_prefixes = list("CSV" = "a salvage", "CRV" = "a recovery", "CTV" = "a transport", "CSV" = "a shipbreaking", "CHV" = "a towing") + //mostly-original, maybe some references, and more than a few puns + append_ship_names = TRUE + added_ship_names = list( + "Road Hog", + "Mine, Not Yours", + "Legal Salvage", + "Barely Legal", + "One Man's Trash", + "Held Together By Tape And Dreams", + "Ventilated Vagrant", + "Half A Wing And A Prayer", + "Scrap King", + "Make Or Break", + "Lead Into Gold", + "Under New Management", + "Pride of Centauri", + "Long Haul", + "Argonaut", + "Desert Nomad", + "Non-Prophet Organization", + "Rest In Pieces", + "Sweep Dreams", + "Home Sweep Home", + "Atomic Broom", + "Ship Broken", + "Rarely Sober", + "Barely Coherent", + "Piece Of Mind", + "War And Pieces", + "Bits 'n' Bobs", + "Home Wrecker", + "T-Wrecks", + "Dust Bunny", + "No Gears No Glory", + "Two Drink Minimum", + "Three Drinks In", + "The Almighty Janitor", + "Wreckless Endangerment", + "Scarab" + ) + //remove a couple types, add the more down-to-earth 'job' to reflect some personality + flight_types = list( + "job", + "op", + "operation", + "assignment", + "contract" + ) + destination_names = list ( + "a frontier scrapyard", + "a trashbelt", + "a local salvage yard", + "a nearby system" + ) + +/datum/lore/organization/tsc/chimera + name = "Chimera Genetics Corp." + short_name = "Chimera Genetics" + acronym = "CGC" + desc = "With the rise of personal body modification, companies specializing in this field were bound to spring up as well. The Chimera Genetics Corporation, or CGC, is one of the largest and most successful competitors in this ever-evolving and ever-adapting field. They originally made a foothold in the market through designer flora and fauna such as \"factory plants\" and \"fabricowtors\"; imagine growing high-strength carbon nanotubes on vines, or goats that can be milked for a substance with the tensile strength of spider silk. Once they had more funding? Chimera aggressively expanded into high-end designer bodies, both vat-grown-from-scratch and modification of existing bodies via extensive therapy procedures. Their best-known designer critter is the Drake line; hardy, cold-tolerant \'furred lizards\' that are unflinchingly loyal to their contract-holders. Drakes find easy work in heavy industries and bodyguard roles, despite constant lobbying from bioconservatives to, quote, \"keep these \"meat drones\" from taking jobs away from regular people.\" \ +

\ + Some things never change. \ +

\ + Unsurprisingly, Chimera names their ships after mythological creatures." + history = "" + work = "designer bodies and bioforms" + headquarters = "Titan, Sol" + motto = "the whole is greater than the sum of its parts" + + org_type = "corporate" + slogans = list( + "Chimera Genetics. Find your true self today!", + "Chimera Genetics. Bring us your genes and we'll clean them right up.", + "Chimera Genetics. Better bodies for a better tomorrow." + ) + ship_prefixes = list("CGV" = "a general operations", "CGT" = "a transport", "CGT" = "a delivery", "CGH" = "a medical") + //edgy mythological critters! + ship_names = list( + "Bandersnatch", + "Banshee", + "Basilisk", + "Black Dog", + "Centaur", + "Cerberus", + "Charybdis", + "Chimera", + "Cyclops", + "Cynocephalus", + "Demon", + "Daemon", + "Dragon", + "Echidna", + "Ghoul", + "Goblin", + "Golem", + "Gorgon", + "Griffin", + "Hekatonchires", + "Hobgoblin", + "Hydra", + "Imp", + "Ladon", + "Loup-Garou", + "Manticore", + "Medusa", + "Minotaur", + "Naga", + "Nosferatu", + "Ogre", + "Pegasus", + "Sasquatch", + "Scylla", + "Shade", + "Siren", + "Sphinx", + "Titan", + "Typhon", + "Valkyrie", + "Vampir", + "Venrir", + "Wendigo", + "Werewolf", + "Wraith" + ) + destination_names = list ( + "Chimera HQ, Titan", + "a Chimera research lab" + ) + +////////////////////////////////////////////////////////////////////////////////// + +// Other +/datum/lore/organization/other/independent + name = "Independent Pilots Association" + short_name = "Independent" + acronym = "IPA" + desc = "Though less common now than they were in the decades before the Sol Economic Organization took power, independent pilots and traders remain an important part of the galactic economy, owing in no small part to protective tariffs established by the Free Trade Union in the late twenty-second century. Further out on the frontier, independent pilots are often the only people keeping freight and vital supplies moving.\ +

\ + Independent ships use a wide variety of names, many of which are as unusual and eclectic as their crews." + history = "" + work = "everything under the sun" headquarters = "N/A" motto = "N/A" + autogenerate_destination_names = TRUE //force random dest generation - ship_prefixes = list("IEV" = "prospecting", "IEC" = "prospecting", "IFV" = "bulk freight", "ITV" = "passenger transport", "ITC" = "just-in-time delivery") - destination_names = list() + ship_prefixes = list("ISV" = "a general", "IEV" = "a prospecting", "IEC" = "a prospecting", "IFV" = "a bulk freight", "ITV" = "a passenger transport", "ITC" = "a just-in-time delivery", "IPV" = "a patrol", "IHV" = "a bounty hunting", "ICC" = "an escort", "IMV" = "a mining", "IPS" = "an interplanetary shipping") + flight_types = list( + "flight", + "mission", + "route", + "operation", + "assignment", + "contract" + ) + //ship names: blank, because we use the universal list + //ship_names = list() -// Governments - -/datum/lore/organization/gov/virgov - name = "Vir Governmental Authority" - short_name = "VirGov" - desc = "The aptly named Vir Governmental Authority is the sole governing administration for the Vir system, based \ - out of New Reykjavik on Sif. It is a representative democratic government, and a fully recognised member of the \ - Confederation.\ +//SPACE LAW +/datum/lore/organization/other/sysdef + name = "System Defense Force" + short_name = "SDF" + acronym = "SDF" + desc = "Localized militias are used to secure systems throughout inhabited space, but are especially common on the frontier; by levying and maintaining these militia forces, larger governments can use their primary fleets (like the USDF) for more important matters and smaller ones can give travellers in their space some peace of mind given the ever-present threat of pirates and vox marauders whilst also helping cut down on smuggling (narcotic substances remain as popular in this century as they have throughout the last few millennia). System Defense Forces tend to be fairly poorly trained and modestly equipped compared to genuine military fleets, but are more than capable of contending with equally ramshackle pirate vessels and can generally stall greater threats long enough for reinforcements to arrive. They're also typically responsible for most search-and-rescue operations in their system.\

\ - Corporate entities such as Nanotrasen which operate on Sif, in Vir space, or on other bodies in the Vir system must \ - all comply with legislation as determined by the VGA and SolGov. As a result, any serious criminal offences, \ - industrial accidents, or concerning events should be forwarded to the VGA in the event that assistance or \ - communication is required from the Vir Police, Vir Defence Force, Vir Interior Ministry, or other important groups." - history = "" // Todo like the rest of them - work = "governing body of Vir" - headquarters = "New Reykjavik, Sif, Vir" + SDF ships are traditionally named after various forms of historical weaponry; as their founding members tend to be veterans of other SDF services which used this system, this tradition has slowly propagated.\ +

\ + Common SDF ship designations include;
\ + SDF = System Defense Fleet (General)
\ + SDV/SDB = System Defense Vessel/Boat
\ + SAR = Search And Rescue (Emergency Services)
\ + SDT = System Defense Tender (Mobile Refuel & Resupply)
\ + SDJ = Prisoner Transport" + history = "" + work = "local security" + headquarters = "" + motto = "Serve, Protect, Survive" + autogenerate_destination_names = FALSE //don't add extra destinations to our pool, or else we leave the system which makes no sense + + org_type = "system defense" + ship_prefixes = list ("SDB" = "a patrol", "SDF" = "a patrol", "SDV" = "a patrol", "SDB" = "an escort", "SDF" = "an escort", "SDV" = "an escort", "SAR" = "a search and rescue", "SDT" = "a logistics", "SDT" = "a resupply", "SDJ" = "a prisoner transport") //b = boat, f = fleet (generic), v = vessel, t = tender + //ship names: weapons, particularly medieval and renaissance melee and pre-gunpowder ranged weapons + ship_names = list( + "Sword", + "Saber", + "Cutlass", + "Scimitar", + "Broadsword", + "Katar", + "Shamshir", + "Flyssa", + "Kaskara", + "Khopesh", + "Tachi", + "Shashka", + "Epee", + "Estoc", + "Longsword", + "Katana", + "Odachi", + "Baselard", + "Gladius", + "Kukri", + "Pick", + "Mattock", + "Hatchet", + "Machete", + "Axe", + "Tomahawk", + "Labrys", + "Masakari", + "Parashu", + "Sagaris", + "Francisca", + "Stiletto", + "Tanto", + "Pugio", + "Cinquedea", + "Katar", + "Dirk", + "Dagger", + "Maul", + "Mace", + "Flail", + "Morningstar", + "Shillelagh", + "Cudgel", + "Truncheon", + "Hammer", + "Arbalest", + "Ballista", + "Catapult", + "Trebuchet", + "Longbow", + "Pike", + "Javelin", + "Glaive", + "Halberd", + "Scythe", + "Spear", + "Guisarme", + "Billhook" + ) + destination_names = list( + "the outer system", + "the inner system", + "Waypoint Alpha", + "Waypoint Beta", + "Waypoint Gamma", + "Waypoint Delta", + "Waypoint Epsilon", + "Waypoint Zeta", + "Waypoint Eta", + "Waypoint Theta", + "Waypoint Iota", + "Waypoint Kappa", + "Waypoint Lambda", + "Waypoint Mu", + "Waypoint Nu", + "Waypoint Xi", + "Waypoint Omicron", + "Waypoint Pi", + "Waypoint Rho", + "Waypoint Sigma", + "Waypoint Tau", + "Waypoint Upsilon", + "Waypoint Phi", + "Waypoint Chi", + "Waypoint Psi", + "Waypoint Omega", + "System Defense Control", + "an SDF correctional facility", + "an SDF processing center", + "an SDF supply depot", + "an SDF Rapid Response Hub", + "an SDF outpost" + ) + +//basically just a dummy/placeholder 'org' for smuggler events +/datum/lore/organization/other/smugglers + name = "Smugglers" + short_name = "" //whitespace hack again + acronym = "ISC" + desc = "Where there's a market, there need to be merchants, and where there are buyers, there need to be suppliers. Most of all, wherever there's governments, there'll be somebody trying to control what people are and aren't allowed to do with their bodies. For those seeking goods deemed illegal (for good reasons or otherwise) they need to turn to smugglers and the fine art of sneaking things past the authorities.\ +

\ + The most common goods smuggled throughout space are narcotics, firearms, and occasionally slaves; whilst firearm ownership laws vary from location to location, most governments also take fairly hard stances on hard drugs, and slavery is consistently outlawed and punished viciously throughout the vast majority of civilized space.\ +

\ + Still, contrary to many conceptions, not all smuggling is nefarious. Entertainment media within human territories loves to paint romantic images of heroic smugglers sneaking aid supplies to refugees or even helping oppressed minorities escape the grasp of xenophobic regimes." + history = "" + work = "" + headquarters = "" motto = "" - autogenerate_destination_names = FALSE + autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. - ship_prefixes = list("VGA" = "hauling", "VGA" = "energy relay") - destination_names = list( - "New Reykjavik on Sif", - "Radiance Energy Chain", - "a dockyard orbiting Sif", - "a telecommunications satellite", - "Vir Interstellar Spaceport" - ) + org_type = "smuggler" + ship_prefixes = list ("suspected smuggler" = "an illegal smuggling", "possible smuggler" = "an illegal smuggling") //as assigned by control, second part shouldn't even come up -/datum/lore/organization/gov/solgov - name = "Solar Confederate Government" - short_name = "SolGov" - acronym = "SCG" - desc = "The Solar Confederate Government, or SolGov, is a mostly-human governmental entity based on Luna and \ - extending throughout most of the local bubble.\ + ship_names = list() + +/datum/lore/organization/other/smugglers/New() + ..() + var/i = 20 //give us twenty random names. for smugglers, I grabbed a bunch of two-syllable s-words, in keeping with NATO reporting names. I figured a fixed name list didn't make very much sense. + var/list/first_word = list( + "Smuggler","Safety","Scanner","Season","Secret","Section","Seeker","Server","Seller","Sequence","Shadow","Solar","Software","Smoker","Southwest","Spectrum","Spirit","Sponsor","Stainless","Stable","Study","Subject","Student","Surface","Symbol","Supreme","Surprise","Syntax","Sterling","Statement" + ) + var/list/nato_phonetic = list( + "Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","Xray","Yankee","Zulu" + ) + while(i) + ship_names.Add("[pick(first_word)] [rand(1,99)]-[pick(nato_phonetic)]") + i-- + +/datum/lore/organization/other/pirates + name = "Pirates" + short_name = "" //whitespace hack again + acronym = "IPG" + desc = "Where there's prey, predators are sure to follow. In space, the prey are civilian merchants, and the predators are opportunistic pirates. This is about where the analogy breaks down, but the basic concept remains the same; civilian ships are usually full of valuable goods or important people, which can be sold on black markets or ransomed back for a healthy sum. Pirates seek to seize the assets of others to get rich, rather than make an honest thaler themselves.\

\ - SolGov defines top-level law (such as sapient rights and transgressive \ - technology) and acts as an intermediary council for problems involving member states, but leaves most other law for \ - states to define themselves. The member states of SolGov obey these laws, pay confederate taxes, and provide each \ - other with military aid, in exchange for membership in the largest free trade, customs, and military union in the \ - known galaxy. Each state appoints two representatives to the Colonial Assembly where issues are voted upon. \ - The vast majority of human states are members of SolGov.\ + Common pirates tend to be rough, practical, and brutally efficient in their work. System Defense units practice rapid response drills, and in most systems it's only a matter of minutes before The Law arrives unless the pirate is able to isolate their target and prevent them from sending a distress signal.\

\ - Sol's military forces are divided between central confederate forces and local defense forces, although it reserves \ - the right to nationalize the defense forces in the event of a major crisis, such as the SolGov-Hegemony War." - history = "" // Todo - work = "governing polity of humanity's Confederation" - headquarters = "Luna, Sol" - motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals'. - autogenerate_destination_names = TRUE + Complicating matters is the infrequent use of privateers by various minor colonial governments, mercenaries turning to piracy during hard times, and illegal salvage operations." + history = "" + work = "" + headquarters = "" + motto = "What\'s yours is mine." + autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. - ship_prefixes = list("SCG-T" = "transportation", "SCG-D" = "diplomatic", "SCG-F" = "freight") - destination_names = list( - "Venus", - "Earth", - "Luna", - "Mars", - "Titan" - )// autogen will add a lot of other places as well. + org_type = "pirate" + ship_prefixes = list ("known pirate" = "a piracy", "suspected pirate" = "a piracy", "rogue privateer" = "a piracy", "Cartel enforcer" = "a piracy", "known outlaw" = "a piracy", "bandit" = "a piracy", "roving corsair" = "a piracy", "illegal salvager" = "an illegal salvage", "rogue mercenary" = "a mercenary") //as assigned by control, second part shouldn't even come up, but it exists to avoid hiccups/weirdness just in case + + ship_names = list() + +/datum/lore/organization/other/pirates/New() + ..() + var/i = 20 //give us twenty random names. as for smugglers, so for pirates. in this case I went with two-syllable b-words. + var/list/first_word = list( + "Bandit","Bogey","Backup","Baker","Balance","Bandwidth","Banker","Banner","Bargain","Baseball","Basket","Bathroom","Berlin","Beyond","Bidder","Bishop","Bookmark","Border","Boston","Bracelet","Brazil","Breakfast","Brian","Broadband","Brochure","Broken","Broker","Brother","Buddy","Budget","Bureau","Business" + ) + var/list/nato_phonetic = list( + "Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","Xray","Yankee","Zulu" + ) + while(i) + ship_names.Add("[pick(first_word)] [rand(1,99)]-[pick(nato_phonetic)]") + i-- /* -// To be expanded upon later, once the military lore gets sorted out. +//Commenting out the Ue-Katish and Vox Marauders for now, to dial down the implications of rampant piracy +/datum/lore/organization/other/uekatish + name = "Ue-Katish Pirates" + short_name = "" + acronym = "UEK" + desc = "Contrasting with the Qerr-Glia is a vibrant community of Ue-Katish pirates, who live in cargo flotillas on the edge of Skrellian space (especially on the Human-Skrell border). Ue-Katish ships have no caste system even for the truecaste Skrell and aliens who live there, although they are regimented by rank and role in the ship's functioning. Ue-Katish ships are floating black markets where everything is available for the right price, including some of the galaxy's most well-connected information brokers and most skilled guns-for-hire. The Ue-Katish present the greatest Skrellian counterculture and feature heavily in romanticized human media, although at their hearts they are still bandits and criminals, and the black markets are filled with goods plundered from human and Skrellian trade ships. Many of the Ue-Katish ships themselves bear the scars of the battle that brought them under the pirate flag.\ +

\ + Ue-Katish pirate culture is somewhat similar to many human countercultures, gleefully reclaiming slurs and subverting expectations for the sheer shock value. Nonetheless, Ue-Katish are still Skrell, and still organize in neat hierarchies under each ship's Captain. The Captain's word is absolute, and unlike the Qerr-Katish they lack any sort of anti-corruption institutions." + history = "" + work = "" + motto = "" + autogenerate_destination_names = TRUE + + org_type = "pirate" + ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement") + ship_names = list() + +/datum/lore/organization/other/uekatish/New() + ..() + var/i = 20 //give us twenty random names + var/list/first_names = file2list('config/names/first_name_skrell.txt') + var/list/words = list( + "Prize", + "Bounty", + "Treasure", + "Pearl", + "Star", + "Mercy", + "Compass", + "Greed", + "Slave", + "Madness", + "Pride", + "Disgrace", + "Judgement", + "Wrath", + "Hatred", + "Vengeance", + "Fury", + "Thunder", + "Scream", + "Dagger", + "Saber", + "Lance", + "Blade" + ) + while(i) + ship_names.Add("[pick(first_names)]'s [pick(words)]") + i-- + +/datum/lore/organization/other/marauders + name = "Vox Marauders" + short_name = "" //whitespace hack again + acronym = "VOX" + desc = "Whilst rarely as directly threatening as 'common' pirates, the phoron-breathing vox nevertheless pose a constant nuisance for shipping; as far as vox are concerned, only vox and vox matters matter, and everyone else is a 'treeless dusthuffer'. Unlike sometimes over-confident pirates, the vox rarely engage in direct, open combat, preferring to make their profits by either stealth or gunboat diplomacy that tends to be more bluster than true brute force: vox raiders will only commit to an attack if they're confident that they can quickly overwhelm and subdue their victims, then get away with the spoils before any reinforcements can arrive.\ +

\ + As Vox ship names are generally impossible for the vast majority of other species to pronounce, System Defense tends to tag marauders with a designation based on the ancient NATO Phonetic Alphabet." + history = "Unknown" + work = "Looting and raiding" + headquarters = "Nowhere" + motto = "(unintelligible screeching)" + autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need *some* entries to avoid runtimes. + + org_type = "pirate" + ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up + //blank out our shipnames for redesignation + ship_names = list() + +/datum/lore/organization/other/marauders/New() + ..() + var/i = 20 //give us twenty random names, marauders get tactical designations from SDF + var/list/letters = list( + "Alpha", + "Bravo", + "Charlie", + "Delta", + "Echo", + "Foxtrot", + "Golf", + "Hotel", + "India", + "Juliett", + "Kilo", + "Lima", + "Mike", + "November", + "Oscar", + "Papa", + "Quebec", + "Romeo", + "Sierra", + "Tango", + "Uniform", + "Victor", + "Whiskey", + "X-Ray", + "Yankee", + "Zulu" + ) + var/list/numbers = list( + "Zero", + "One", + "Two", + "Three", + "Four", + "Five", + "Six", + "Seven", + "Eight", + "Nine" + ) + while(i) + ship_names.Add("[pick(letters)]-[pick(numbers)]") + i-- +*/ +////////////////////////////////////////////////////////////////////////////////// + +// Governments +/datum/lore/organization/gov/commonwealth + name = "Commonwealth of Sol-Procyon" + short_name = "SolCom" + acronym = "CWS" + desc = "The Commonwealth of Sol-Procyon is the evolution of the many nation states of Earth and the outlying colonies \ + having spread amongst the stars. While not quite the hegemon of all Humanity, a narrow majority of them follow \ + the flag of the Commonwealth. The constant tug and pull of government versus corporation, democracy and power \ + troubles this federation of deeply entrenched human colonies much like it did in the 21st century. Some things \ + never change. However, they are economically and culturally quite dominant, although not everyone likes that fact. \ +

\ + Ships on official CWS assignments typically carry the designations of Earth\'s largest craters, as a reminder of everything the planet (and humanity itself) has endured." + history = "" // Todo + work = "governing polity of humanity's systems" + headquarters = "Luna, Sol" + motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals' + autogenerate_destination_names = TRUE + + org_type = "government" + ship_prefixes = list("CWS-A" = "an administrative", "CWS-T" = "a transportation", "CWS-D" = "a diplomatic", "CWS-F" = "a freight", "CWS-J" = "a prisoner transfer") + //earth's biggest impact craters + ship_names = list( + "Wabar", + "Kaali", + "Campo del Cielo", + "Henbury", + "Morasko", + "Boxhole", + "Macha", + "Rio Cuarto", + "Ilumetsa", + "Tenoumer", + "Xiuyan", + "Lonar", + "Agoudal", + "Tswaing", + "Zhamanshin", + "Bosumtwi", + "Elgygytgyn", + "Bigach", + "Karla", + "Karakul", + "Vredefort", + "Chicxulub", + "Sudbury", + "Popigai", + "Manicougan", + "Acraman", + "Morokweng", + "Kara", + "Beaverhead", + "Tookoonooka", + "Charlevoix", + "Siljan Ring", + "Montagnais", + "Araguinha", + "Chesapeake", + "Mjolnir", + "Puchezh-Katunki", + "Saint Martin", + "Woodleigh", + "Carswell", + "Clearwater West", + "Clearwater East", + "Manson", + "Slate", + "Yarrabubba", + "Keurusselka", + "Shoemaker", + "Mistastin", + "Kamensk", + "Steen", + "Strangways", + "Tunnunik", + "Boltysh", + "Nordlinger Ries", + "Presqu'ile", + "Haughton", + "Lappajarvi", + "Rochechouart", + "Gosses Bluff", + "Amelia Creek", + "Logancha", + "Obolon'", + "Nastapoka", + "Ishim", + "Bedout" + ) + destination_names = list( + "Venus", + "Earth", + "Luna", + "Mars", + "Titan", + "Europa", + "the Jovian subcluster", + "a Commonwealth embassy", + "a classified location" + ) + // autogen will add a lot of other places as well. + +/datum/lore/organization/gov/ares + name = "Third Ares Confederation" + short_name = "ArCon" + desc = "A loose coalition of socialist and communist movements on the fringes of the human diaspora \ + the Ares Confederation is a government-in-exile from the original uprisings of Mars to stop \ + the government of corporations and capitalist interests over Humanity. While they failed twice \ + they have made their own home far beyond the reach of an effective military response by the \ + Commonwealth. They have become renowned engineers and terraforming experts, mostly due to necessity.\ +

\ + Many of their vessels carry the names of original Confederation ships, or heroes who fought for \ + liberty and equality in the early days of the uprisings. Many, however, are far more irreverent, \ + seeming to flaunt callsign regulations as a small act of rebellion or purely because they can." + history = "" + work = "idealist socialist government" + headquarters = "Paraiso a Àstrea" + motto = "Liberty to the Stars!" + + org_type = "government" + ship_prefixes = list("UFHV" = "military", "FFHV" = "classified") + ship_names = list( + "Bulwark of the Free", + "Charged Negotiation", + "Corporation Breaker", + "Cheeki Breeki", + "Dawnstar", + "Fiery Justice", + "Fist of Ares", + "Freedom", + "Marx Was Right", + "Endstage Capitalism", + "Neoluddism Is The Answer Guys", + "Anarchocapitalism Is A Joke", + "Front Toward Enemy", + "Path of Prosperity", + "Freedom Cry", + "Rebel Yell", + "We Will Return To Mars", + "According To Our Abilities", + "Posadism Gang", + "Accelerationism Doesn't Work In A Vaccuum", + "Don't Shoot, We're Unarmed I Think", + "Sir, It's One Of Ours", + "The Big Stick For Speaking Softly", + "Per Our Last E-Mail", + "A Slight Weight Discrepancy", + "I Think It's An Asteroid", + "Bull Moose", + "Engels Needs Some Love Too", + "The Icepick", + "Gauntlet", + "Gellaume", + "Hero of the Revolution", + "Jerome", + "Laughing Maniac", + "Liberty", + "Mahama", + "Memory of Fallen", + "Miko", + "Mostly Harmless", + "None Of Your Business", + "Not Insured", + "People's Fist", + "Petrov", + "Prehensile Ethics", + "Pride of Liberty", + "Rodrick", + "Star of Tiamat", + "Torch of Freedom", + "Torch", + "We All Lift", + "Adrift Together", + "Freyv", + "Asgauth", + "Elduette", + "Seigfast", + "Bergautur", + "Anrune", + "Naybard", + "Alfmundur", + "Ganuun", + "Du Moch", + "Morvo", + "Montrienn", + "Ursuul" + ) + destination_names = list( + "Drydocks of the Ares Confederation", + "a classified location", + "a Homestead on Paraiso", + "a contested sector of ArCon space", + "one of our free colonies", + "the Gateway 98-C at Ares", + "Sars Mara on Ares", + "Listening Post Maryland-Sigma", + "an emergency nav bouy", + "New Berlin on Nov-Ferrum", + "a settlement needing our help", + "Forward Base Sigma-Alpha in ArCon space" + ) + +/datum/lore/organization/gov/elysia + name = "The Elysian Colonies" + short_name = "Elysia" + acronym = "ECS" + desc = "The Elysian Colonies, located spinwards from the Commonwealth, are a disunited bunch of \ + vanity states, utopia projects and personal autocracies, whose only unifying characteristic is \ + a general disregard of 'normal' social conventions of Humanity as well as their inherent desire \ + to keep to their ways, in which cases they do sometimes unite to fight off an outside threat. \ + The Elysian Colonies are one of the few places where true slavery is not only accepted, but sadly also \ + rather commonplace if you go to the wrong worlds. Not that they don't internally have at least a dozen would-be liberators." + history = "" + work = "fracturous vanity colonies" + headquarters = "" + motto = "" + + org_type = "government" + ship_prefixes = list("ECS-M" = "a military", "ECS-T" = "a transport", "ECS-T" = "a special transport", "ECS-D" = "a diplomatic") //The Special Transport is SLAAAAVES. but let's not advertise that openly. + ship_names = list( + "Bring Me Wine!", + "I Can't Believe You", + "More Wives Your Grace?", + "Daddy Bought Me This", + "What Do You Mean It's Unethical", + "Libertine Ideals", + "The True Free", + "Unbound", + "No Man Shackled", + "All Men Shackled", + "All Women Shackled", + "All Hermaphrodites Shackled", + "You Know We Just Shackle Anyone", + "Nobody Deserves Shackles", + "Debt Slavery Is Ethical", + "Fashioned After Tradition", + "Sic Vic Pacem", + "Cultivate This", + "We Demand Self-Governance", + "A Thousand Cultures", + "There Is a Character Limit?", + "Slave Galley I", + "The Memes of Production", + "The Unconquered CCXXII" + ) + destination_names = list( + "Cygnus", + "The Ultra Dome of Brutal Kill Death", + "Sanctum", + "Infernum", + "The Most Esteemed Estates of Fred Fredson, Heir of the Fred Throne and All its illustrious Fredpendencies", + "Priory Melana", + "The Clone Pits of Meridiem Five", + "Forward Base Mara Alpha", + "a liberation intervention", + "a nav bouy within Cygnus Space", + "a Elysian only refuel outpost", + "to a killer party the Fredperor is holding right now" + ) + +/datum/lore/organization/gov/fyrds + name = "Unitary Alliance of Salthan Fyrds" + short_name = "Saltha" + acronym = "SMS" + desc = "Born out of neglect, the Salthan Fyrds are cast-off colonies of the Commonwealth after giving up on \ + pacifying the wartorn region and fighting off the stray Unathi Raiders after the Hegemony War. \ + In the end they self-organized into military pacts and have formed a militaristic society, in which \ + every person, be it organic or robot, is a soldier for the continued cause in serving as aegis against \ + another Unathi Incursion. They are very no-nonsense." + history = "" + work = "human stratocracy" + headquarters = "The Pact, Myria" + motto = "" + + org_type = "government" + ship_prefixes = list("SFM-M" = "a military", "SFM-M" = "a patrol") // The Salthans don't do anything else. + flight_types = list( + "mission", + "operation", + "exercise", + "assignment", + "deployment" + ) + //specifically-undefeated generals, just to shake up the usual list everyone knows + ship_names = list( + "Ahmose I", + "Thutmose I & III", + "Seti I", + "Ramesses II", + "Tariq ibn Ziyad", + "Shaka Zulu", + "Bai Qi", + "Ashoka the Great", + "Han Xin", + "Chen Qingzhi", + "Sargon of Akkad", + "Khalid ibn al-Walid", + "Narses", + "David IV", + "Yue Fei", + "Subutai", + "Tamerlane", + "Kumbha of Mewar", + "Akbar", + "Admiral Yi", + "Chatrapati Sambhaji Maharaj", + "Baji Rao", + "Nguyen Hue", + "Alexander the Great", + "Epaminondas", + "Nero Claudius Drusus", + "Burebista", + "Pepin the Short", + "El Cid", + "Jan Zizka", + "Scanderbeg", + "Edward IV", + "Pal Kinizsi", + "Ivan Sirko", + "John Churchill", + "Maurice of Nassau", + "Alvaro de Bazan", + "Blas de Lezo", + "Prince Henry", + "Alexander Suvorov", + "Fyodor Ushakov", + "Charles XI", + "August von Mackensen", + "Paul von Lettow-Vorbeck", + "George Henry Thomas" + ) + /* retained for archival, no longer necessary + destination_names = list( + "Base Alpha-Romero", + "Base Zeta-Xray", + "Base Epsilon-Epsilon", + "Base Xray-Beta", + "Base Gamma-Delta", + "Base Yotta-Epsilon" + ) + */ + +/datum/lore/organization/gov/fyrds/New() + ..() + var/fyrdsgen = rand(8, 16) //significantly increased from original values due to the greater length of rounds on YW + var/list/location = list( + "Base","Outpost","Installation","Station","Waypoint","Nav Point" + ) + var/list/greek = list( + "Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega" + ) + var/list/phoenician = list( + "Aleph","Beth","Gimel","Daleth","He","Zayin","Heth","Teth","Yodh","Kaph","Lamedh","Mem","Nun","Samekh","'Ayin","Pe","Res","Sin","Taw","Waw","Sade","Qoph" + ) + var/list/russian = list( + "Anna","Boris","Vasily","Gregory","Galina","Dmitri","Yelena","Zhenya","Zinaida","Zoya","Ivan","Konstantin","Leonid","Mikhail","Mariya","Nikolai","Olga","Pavel","Roman","Semyon","Sergei","Tatyana","Tamara","Ulyana","Fyodor","Khariton","Tsaplya","Tsentr","Chelovek","Shura","Shchuka","Yery","Znak","Echo","Emma","Yuri","Yakov" + ) + var/list/american = list( + "Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","Xray","Yankee","Zulu" + ) + + while(fyrdsgen) + destination_names.Add("[pick(location)] [pick(greek)]-[pick(greek)]","[pick(location)] [pick(phoenician)]-[pick(phoenician)]","[pick(location)] [pick(russian)]-[pick(russian)]","[pick(location)] [pick(american)]-[pick(american)]") + fyrdsgen-- + +/datum/lore/organization/gov/teshari + name = "Teshari Expeditionary Fleet" + short_name = "Teshari Expeditionary" + acronym = "TEF" + desc = "Though nominally a client state of the skrell, the teshari nevertheless maintain their own navy in the form of the Teshari Expeditionary Fleet. The TEF are as much civil and combat engineers as a competent space force, as they are the tip of the spear when it comes to locating and surveying new worlds suitable for teshari habitation, and in the establishment of full colonies. That isn't to say there aren't independent teshari colonies out there, but those that are founded under the wings of the TEF tend to be the largest and most prosperous. They're also responsible for maintaining the security of these colonies and protecting trade ships. Like the USDF (and unlike most other governmental fleets), TEF vessels almost universally sport the 'TEF' designator rather than specific terms.\ +

\ + The TEF's ships are named after famous teshari pioneers and explorers and the events surrounding those individuals." + history = "" + work = "teshari colonization and infrastructure maintenance" + headquarters = "Qerr'balak, Qerr'valis" + motto = "" + autogenerate_destination_names = TRUE //big list of own holdings to come + + org_type = "government" + //the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well + ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering") + //TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word. + ship_names = list() + destination_names = list( + "an Expeditionary Fleet RV point", + "an Expeditionary Fleet Resupply Ship", + "an Expeditionary Fleet Supply Depot", + "a newly-founded Teshari colony", + "a prospective Teshari colony site", + "a potential Teshari colony site", + "Expeditionary Fleet HQ" + ) + +/datum/lore/organization/gov/teshari/New() + ..() + var/i = 20 //give us twenty random names + var/list/first_names = list( + "Leniri's", + "Tatani's", + "Ninai's", + "Miiescha's", + "Ishena's", + "Taalische's", + "Cami's", + "Schemisa's", + "Shilirashi's", + "Sanene's", + "Aeimi's", + "Ischica's", + "Shasche's", + "Leseca's", + "Iisi's", + "Simascha's", + "Lisascheca's" + ) + var/list/words = list( + "Hope", + "Venture", + "Voyage", + "Talons", + "Fang", + "Wing", + "Pride", + "Glory", + "Wit", + "Insight", + "Wisdom", + "Mind", + "Cry", + "Howl", + "Fury", + "Revenge", + "Vengeance" + ) + while(i) + ship_names.Add("[pick(first_names)] [pick(words)]") + i-- + +/datum/lore/organization/gov/altevian_hegemony + name = "The Altevian Hegemony" + short_name = "Altevian Hegemony" + acronym = "AH" + desc = "The Altevians are a space-faring race of rodents that resemble Earth-like rats. \ + They do not have a place they call home in terms of a planet, and instead have massive multiple-kilometer-long colony-ships \ + that are constantly on the move and typically keep operations outside of known populated systems to minimize potential conflicts over resources. \ + Their primary focus is trade and salvage operations, and their ships can be expected to be seen around both densely populated and empty systems for their work." + history = "" + work = "salvage and trade operators" + headquarters = "AH-CV Migrant" + motto = "" + org_type = "spacer" + + ship_prefixes = list("AH-DV" = "a diplomatic", "AH-EV" = "an exploration", "AH-FV" = "a fueling", "AH-FV" = "a cargo", "AH-SV" = "a research", "AH-TV" = "a colony-transporter", "AH-RV" = "an emergency response", "AH-RV" = "a response", "AH-MV" = "a medical") + ship_names = list( + "Platinum", + "Warson", + "Mane", + "Holland", + "Arauz", + "Diamond", + "Gold", + "Steam", + "Boiler", + "Slip", + "Lavender", + "Wheel", + "Stuntson", + "Desto", + "Palos", + "Matterson", + "Mill", + "Smoke", + "Squeson", + "Rabion", + "Strikedown", + "Cluster", + "Raling", + "Archaeologist", + "Beaker" + ) + destination_names = list( + "the AH-CV Migrant flagship", + "one of our research colony-ships", + "the AH-CV Lotus", + "the AH-CV Anvil", + "the AH-CV Generations", + "the AH-CV Galley", + "the AH-CV Prosperity", + "the AH-CV Kitsap", + "the AH-CV Diamondback", + "one of our colony-ships", + "one of our production fleets" + ) + +////////////////////////////////////////////////////////////////////////////////// // Military - -/datum/lore/organization/mil/sif_guard - name = "Sif Defense Force" // Todo: Get better name from lorepeople. - short_name = "SifGuard" - desc = "" +/datum/lore/organization/mil/usdf + name = "United Solar Defense Force" + short_name = "USDF" + acronym = "USDF" + desc = "The USDF is the dedicated military force of the Commonwealth, originally formed by the United Nations. USDF ships are responsible for securing the major traffic lanes between Commonwealth member systems, as well as protecting them from threats that are too great for local SDF units to handle. Despite nominally being a 'Defense Force', a lot of dubious incidents and several notable firebrands within the USDF mean that the Fleet is considered by some to be the galaxy\'s eight-hundred-pound gorilla; it does whatever it wants whenever it wants, and there really isn\'t anything you (or anyone else, even the Commonwealth itself) can do about it. Thankfully a coalition of moderates and Commonwealth loyalists have so far managed to keep the hardliners from getting away with too much, at least for the time being." history = "" - work = "Sif Governmental Authority's military" - headquarters = "New Reykjavik, Sif" - motto = "" - autogenerate_destination_names = FALSE // Kinda weird if SifGuard goes to Nyx. + work = "peacekeeping and piracy suppression" + headquarters = "Paris, Earth" + motto = "Si Vis Pacem Para Bellum" //if you wish for peace, prepare for war + autogenerate_destination_names = TRUE - ship_prefixes = list("SGSC" = "military", "SGSC" = "patrol", "SGSC" = "rescue", "SGSC" = "emergency response") // Todo: Replace prefix with better one. + org_type = "military" + ship_prefixes = list ("USDF" = "a logistical", "USDF" = "a training", "USDF" = "a patrol", "USDF" = "a piracy suppression", "USDF" = "a peacekeeping", "USDF" = "a relief", "USDF" = "an escort", "USDF" = "a search and rescue", "USDF" = "a classified") + flight_types = list( + "mission", + "operation", + "exercise", + "assignment", + "deployment" + ) + ship_names = list( + "Aphrodite", + "Apollo", + "Ares", + "Artemis", + "Athena", + "Demeter", + "Dionysus", + "Hades", + "Hephaestus", + "Hera", + "Hermes", + "Hestia", + "Poseidon", + "Zeus", + "Achlys", + "Aether", + "Aion", + "Ananke", + "Chaos", + "Chronos", + "Erebus", + "Eros", + "Gaia", + "Hemera", + "Hypnos", + "Nemesis", + "Nyx", + "Phanes", + "Pontus", + "Tartarus", + "Thalassa", + "Thanatos", + "Uranus", + "Coeus", + "Crius", + "Cronus", + "Hyperion", + "Iapetus", + "Mnemosyne", + "Oceanus", + "Phoebe", + "Rhea", + "Tethys", + "Theia", + "Themis", + "Asteria", + "Astraeus", + "Atlas", + "Aura", + "Clymene", + "Dione", + "Helios", + "Selene", + "Eos", + "Epimetheus", + "Eurybia", + "Eurynome", + "Lelantos", + "Leto", + "Menoetius", + "Metis", + "Ophion", + "Pallas", + "Perses", + "Prometheus", + "Styx" + ) destination_names = list( - "a classified location in SolGov territory", - "Sif orbit", - "the rings of Kara", - "the rings of Rota", - "Firnir orbit", - "Tyr orbit", - "Magni orbit", - "a wreck in VirGov territory", - "a military outpost", - ) -*/ + "USDF HQ", + "a USDF staging facility on the edge of Commonwealth territory", + "a USDF supply depot", + "a USDF rally point", + "a USDF forward base", + "a USDF repair facility", + "a USDF shipyard in Sol", + "a classified location" + ) + +/datum/lore/organization/mil/pcrc + name = "Proxima Centauri Risk Control" + short_name = "Proxima Centauri" + acronym = "PCRC" + desc = "Not a whole lot is known about the private security company known as PCRC, but it is known that they're irregularly contracted by the larger TSCs for certain delicate matters. Much of the company's inner workings are shrouded in mystery, and most citizens have never even heard of them. Amongst those who do know of them, they enjoy fairly good PR for a private security group, especially when compared to SAARE." + history = "" + work = "risk control and private security" + headquarters = "Proxima Centauri" + motto = "" + autogenerate_destination_names = TRUE + + org_type = "military" + ship_prefixes = list("PCRC" = "a risk control", "PCRC" = "a private security") + flight_types = list( + "flight", + "mission", + "route", + "operation", + "assignment", + "contract" + ) + //law/protection terms + ship_names = list( + "Detective", + "Constable", + "Inspector", + "Judge", + "Adjudicator", + "Magistrate", + "Marshal", + "Sheriff", + "Deputy", + "Warden", + "Guardian", + "Defender", + "Peacemaker", + "Peacekeeper", + "Arbiter", + "Justice", + "Order", + "Jury", + "Inspector", + "Bluecoat", + "Gendarme", + "Gumshoe", + "Patrolman", + "Sentinel", + "Shield", + "Aegis", + "Auditor", + "Monitor", + "Investigator", + "Agent", + "Prosecutor", + "Sergeant" + ) + + destination_names = list( + "PCRC HQ, in Proxima Centauri", + "a PCRC training installation", + "a PCRC supply depot" + ) + +//I'm covered in beeeeeeees! +/datum/lore/organization/mil/hive + name = "HIVE Security" + short_name = "HIVE" + acronym = "HVS" + desc = "HIVE Security is a merging of several much smaller freelance companies, and operates throughout civilized space. Unlike some companies, it operates no planetside facilities whatsoever, opting instead for larger flotillas that are serviced by innumerable smallcraft. As with any PMC there's no small amount of controversy surrounding them, but they try to keep their operations cleaner than their competitors. They're fairly well known for running 'mercy' operations, which are low-cost no-strings-attached contracts for those in dire need." + history = "" + work = "mercenary contractors" + headquarters = "" + motto = "Strength in Numbers" + autogenerate_destination_names = TRUE + + org_type = "military" + ship_prefixes = list("HPF" = "a secure freight", "HPT" = "a training", "HPS" = "a logistics", "HPV" = "a patrol", "HPH" = "a bounty hunting", "HPX" = "an experimental", "HPC" = "a command", "HPI" = "a mercy") + flight_types = list( + "flight", + "mission", + "route", + "operation", + "assignment", + "contract" + ) + //animals, preferably predators, all factual/extant critters + ship_names = list( + "Wolf", + "Bear", + "Eagle", + "Condor", + "Falcon", + "Hawk", + "Kestrel", + "Shark", + "Fox", + "Weasel", + "Mongoose", + "Bloodhound", + "Rhino", + "Tiger", + "Leopard", + "Panther", + "Cheetah", + "Lion", + "Vulture", + "Piranha", + "Crocodile", + "Alligator", + "Recluse", + "Tarantula", + "Scorpion", + "Orca", + "Coyote", + "Jackal", + "Hyena", + "Hornet", + "Wasp", + "Sealion", + "Viper", + "Cobra", + "Sidewinder", + "Asp", + "Python", + "Anaconda", + "Krait", + "Diamondback", + "Mamba", + "Fer de Lance", + "Keelback", + "Adder", + "Constrictor", + "Boa", + "Moray", + "Taipan", + "Rattlesnake" + ) + destination_names = list( + "the HIVE Command fleet", + "a HIVE patrol fleet", + "a HIVE flotilla", + "a HIVE training fleet", + "a HIVE logistics fleet" + ) + //some basics, padded with autogen + +//replaced the edgy blackstar group with polaris-canon SAARE +/datum/lore/organization/mil/saare + name = "Stealth Assault Enterprises" + short_name = "SAARE" + acronym = "SAARE" + desc = "SAARE consistently have the worst reputation of any paramilitary group. This is because they specialize in deniability and secrecy. Although publically they work in asset recovery, they have a substantiated reputation for info-theft and piracy that has lead to them butting heads with the law on more than one occasion. Nonetheless, they are an invaluable part of the Solar economy, and other TSCs and small colonial governments keep them in business.\ +

\ + For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (e.g. 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command \& Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics." + history = "" + work = "mercenary contractors" + headquarters = "" + motto = "Aut Neca Aut Necare" + autogenerate_destination_names = TRUE + + org_type = "military" + ship_prefixes = list("SAARE" = "a secure freight", "SAARE" = "a training", "SAARE" = "a logistics", "SAARE" = "a patrol", "SAARE" = "a security", "SAARE" = "an experimental", "SAARE" = "a command", "SAARE" = "a classified") + flight_types = list( + "flight", + "mission", + "route", + "operation", + "assignment", + "contract" + ) + ship_names = list() + destination_names = list( + "SAARE Command", + "a SAARE training site", + "a SAARE logistical depot", + "a SAARE-held shipyard" + ) + +/datum/lore/organization/mil/saare/New() + ..() + var/i = 20 //give us twenty random names, saare uses tacticool designations + var/list/letters = list( + "King", + "Queen", + "Duke", + "Cipher", + "Monarch", + "Marshal", + "Magnum", + "Longbow", + "Jupiter", + "Excalibur", + "Charon", + "Bloodhound", + "Daybreak", + "Tomahawk", + "Raptor", + "Cerberus", + "Apollo", + "Firebird", + "Outlaw", + "Outrider", + "Vector", + "Spearhead", + "Sledgehammer", + "Typhon", + "Sundown", + "Zodiac", + "Colossus", + "Jackhammer", + "Kodiak", + "Phalanx", + "Rainmaker", + "Shockwave", + "Warhammer", + "Crusader", + "Maverick", + "Nighthawk", + "Redshift", + "Challenger", + "Starlight", + "Sunray", + "Ironside", + "Holdfast", + "Foxhound" + ) + var/list/numbersone = list( + "Zero", + "One", + "Two", + "Three", + "Four", + "Five", + "Six", + "Seven", + "Eight", + "Nine" + ) + var/list/numberstwo = list( + "Zero", + "One", + "Two", + "Three", + "Four", + "Five", + "Six", + "Seven", + "Eight", + "Niner" + ) + while(i) + ship_names.Add("[pick(letters)] [pick(40;"Actual","[pick(numbersone)]-[pick(numberstwo)]")]") + i-- + + //ex: "Phalanx One-Niner", "Sledgehammer Actual" (CO/VIP), "Kodiak Seven-Four", "Tomahawk Two-Zero" + //probably a more elegant (read: fancier) way to do the second part but fuck it, this works just fine \ No newline at end of file diff --git a/code/modules/busy_space/organizations_vr.dm b/code/modules/busy_space/organizations_vr.dm deleted file mode 100644 index e14d113689..0000000000 --- a/code/modules/busy_space/organizations_vr.dm +++ /dev/null @@ -1,877 +0,0 @@ -//Datums for different companies that can be used by busy_space, VR edition - -// Some of these intentionally copy from busy_space/organizations.dm, which is disabled in our server. -////////////////////////////////////////////////////////////////////////////////// - -//Datums for different companies that can be used by busy_space -/datum/lore/organization - var/name = "" // Organization's name - var/short_name = "" // Organization's shortname (NanoTrasen for "NanoTrasen Incorporated") - var/acronym = "" // Organization's acronym, e.g. 'NT' for NanoTrasen'. - var/desc = "" // One or two paragraph description of the organization, but only current stuff. Currently unused. - var/history = "" // Historical discription of the organization's origins Currently unused. - var/work = "" // Short description of their work, eg "an arms manufacturer" - var/headquarters = "" // Location of the organization's HQ. Currently unused. - var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused. - - var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc") - var/list/ship_names = list( //Names of spaceships. This is a mostly generic list that all the other organizations inherit from if they don't have anything better. - "Kestrel", - "Beacon", - "Signal", - "Freedom", - "Glory", - "Axiom", - "Eternal", - "Harmony", - "Light", - "Discovery", - "Endeavour", - "Explorer", - "Swift", - "Dragonfly", - "Ascendant", - "Tenacious", - "Pioneer", - "Hawk", - "Haste", - "Radiant", - "Luminous" - ) - var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. - var/autogenerate_destination_names = TRUE - -/datum/lore/organization/New() - ..() - if(autogenerate_destination_names) // Lets pad out the destination names. - var/i = rand(6, 10) - var/list/star_names = list( - "Sol", "Alpha Centauri", "Sirius", "Vega", "Regulus", "Vir", "Algol", "Aldebaran", "Vilous", "Sanctum", "Qerr'Vallis", "Kataigal", "Antares", - "Delta Doradus", "Menkar", "Geminga", "Elnath", "Gienah", "Mu Leporis", "Nyx", "Tau Ceti", "Virgo-Erigone", "Uueoa-Esa", "Vazzend", "Kastra-71", - "Wazn", "Alphard", "Phact", "Altair", "El", "Eutopia", "Qerr'valis", "Qerrna-Lakirr", "Rarkajar", "the Almach Rim") - var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "distress beacon", "anomaly", "colony", "outpost") - while(i) - destination_names.Add("a [pick(destination_types)] in [pick(star_names)]") - i-- - -////////////////////////////////////////////////////////////////////////////////// - -// TSCs -/datum/lore/organization/tsc/nanotrasen - name = "NanoTrasen Incorporated" - short_name = "NanoTrasen" - acronym = "NT" - desc = "NanoTrasen is one of the foremost research and development companies in Commonwealth space. \ - Originally focused on consumer products, their swift move into the field of Phoron has lead to \ - them being the foremost experts on the substance and its uses. In the modern day, NanoTrasen prides \ - itself on being an early adopter to as many new technologies as possible, often offering the newest \ - products to their employees. In an effort to combat complaints about being 'guinea pigs', Nanotrasen \ - also offers one of the most comprehensive medical plans in Commonwealth space, up to and including cloning \ - and therapy.\ -

\ - NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \ - It also boasts an prosthetic line, which is provided to its employees as needed, and is used as an incentive \ - for newly tested posibrains to remain with the company." - history = "" // To be written someday. - work = "research giant" - headquarters = "Luna" - motto = "" - - ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response") - //Scientist or Greek mythology naming scheme - ship_names = list( - "Bardeen", - "Einstein", - "Feynman", - "Sagan", - "Tyson", - "Galilei", - "Jans", - "Fhriede", - "Franklin", - "Tesla", - "Curie", - "Darwin", - "Newton", - "Pasteur", - "Bell", - "Mendel", - "Kepler", - "Edision", - "Cavendish", - "Nye", - "Hawking", - "Aristotle", - "Von Braun", - "Kaku", - "Oppenheimer" - ) - // Note that the current station being used will be pruned from this list upon being instantiated - destination_names = list( - "NSS Exodus in Nyx", - "NCS Northern Star in Vir", - "NAB Smythside Central Headquarters in Sol", - "NAS Zeus orbiting Virgo-Prime", - "NIB Posideon in Alpha Centauri", - "NTB Anur on Virgo-Prime", - "the ruins of Virgo-3B", //YW EDIT - "the phoron refinery in Vilous", - "a dockyard orbiting Virgo-Prime", - "an asteroid orbiting Virgo 3", - ) - -/datum/lore/organization/tsc/nanotrasen/New() - ..() - spawn(1) // BYOND shenanigans means using_map is not initialized yet. Wait a tick. - // Get rid of the current map from the list, so ships flying in don't say they're coming to the current map. - var/string_to_test = "[using_map.station_name] in [using_map.starsys_name]" - if(string_to_test in destination_names) - destination_names.Remove(string_to_test) - - - -/datum/lore/organization/tsc/hephaestus - name = "Hephaestus Industries" - short_name = "Hephaestus" - acronym = "HI" - desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Sol space. \ - Hephaestus products have a reputation for reliability, and the corporation itself has a noted tendency to stay removed \ - from corporate politics. They enforce their neutrality with the help of a fairly large asset-protection contingent which \ - prevents any contracting polities from using their own materiel against them. The Terran Commonwealth and the Salthan Fyrds are of Hephastus’ largest \ - bulk contractors owing to the above factors." - history = "" - work = "arms manufacturer" - headquarters = "" - motto = "" - - ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply") - //War God/Soldier Theme - ship_names = list( - "Ares", - "Athena", - "Grant", - "Custer", - "Puller", - "Nike", - "Bellona", - "Leonides", - "Bast", - "Jackson", - "Lee", - "Annan", - "Chi Yu", - "Shiva", - "Tyr" - ) - destination_names = list( - "a SolCom dockyard on Luna", - "a Fleet outpost in the Almach Rim", - "a Fleet outpost on the Moghes border" - ) - -/datum/lore/organization/tsc/vey_med - name = "Vey-Medical" - short_name = "Vey-Med" - acronym = "VM" - desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and opperated by Skrell and Elysians. \ - Despite the suspicion and prejudice leveled at them for their origin, Vey-Med has obtained market dominance in \ - the sale of medical equipment-- from surgical tools to large medical devices to the Oddyseus trauma response mecha \ - and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \ - human-like FBP designs. Vey’s rise to stardom came from their introduction of ressurective cloning, although in \ - recent years they’ve been forced to diversify as their patents expired and NanoTrasen-made medications became \ - essential in bulk cloning." - history = "" - work = "medical equipment supplier" - headquarters = "" - motto = "" - - ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply") - // Diona names - ship_names = list( - "Wind That Stirs The Waves", - "Sustained Note Of Metal", - "Bright Flash Reflecting Off Glass", - "Veil Of Mist Concealing The Rock", - "Thin Threads Intertwined", - "Clouds Drifting Amid Storm", - "Loud Note And Breaking", - "Endless Vistas Expanding Before The Void", - "Fire Blown Out By Wind", - "Star That Fades From View", - "Eyes Which Turn Inwards", - "Joy Without Which The World Would Come Undone", - "A Thousand Thousand Planets Dangling From Branches" - ) - destination_names = list( - "a research facility in Samsara", - "a SDTF near Ue-Orsi", - "a sapientarian mission in the Almach Rim" - ) - -/datum/lore/organization/tsc/zeng_hu - name = "Zeng-Hu pharmaceuticals" - short_name = "Zeng-Hu" - acronym = "ZH" - desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \ - on the market for medications, and many household names are patentted by Zeng-Hu-- Bicaridyne, Dylovene, Tricordrizine, \ - and Dexalin all came from a Zeng-Hu medical laboratory. Zeng-Hu’s fortunes have been in decline as Nanotrasen’s development of \ - mass cloning medication cuts into their R&D and Vey-Med’s superior medical equipment effectively decimated their own equipment \ - interests. The three-way rivalry between these companies for dominance in the medical field is well-known and a matter of \ - constant economic speculation." - history = "" - work = "pharmaceuticals company" - headquarters = "" - motto = "" - - ship_prefixes = list("ZTV" = "transportation", "ZMV" = "medical resupply") - destination_names = list() - -/datum/lore/organization/tsc/ward_takahashi - name = "Ward-Takahashi General Manufacturing Conglomerate" - short_name = "Ward-Takahashi" - acronym = "WT" - desc = "Ward-Takahashi focuses on the sale of small consumer electronics, with its computers, communicators, \ - and even mid-class automobiles a fixture of many households. Less famously, Ward-Takahashi also supplies most \ - of the AI cores on which vital control systems are mounted, and it is this branch of their industry that has \ - led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi’s economies \ - of scale frequently steal market share from Nanotrasen’s high-price products, leading to a bitter rivalry in the \ - consumer electronics market." - history = "" - work = "electronics manufacturer" - headquarters = "" - motto = "" - - ship_prefixes = list("WTV" = "freight") - ship_names = list( - "Comet", - "Aurora", - "Supernova", - "Nebula", - "Galaxy", - "Starburst", - "Constellation", - "Pulsar", - "Quark", - "Void", - "Asteroid" - ) - destination_names = list() - -/datum/lore/organization/tsc/bishop - name = "Bishop Cybernetics" - short_name = "Bishop" - acronym = "BC" - desc = "Bishop's focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a byte noire for \ - bioconservatives), Bishop manufactures not only prostheses but also brain augmentation, synthetic organ replacements, \ - and odds and ends like implanted wrist-watches. Their business model tends towards smaller, boutique operations, giving \ - it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med’s for cost. Bishop’s reputation \ - for catering towards the interests of human augmentation enthusiasts instead of positronics have earned it ire from the \ - Positronic Rights Group and puts it in ideological (but not economic) comptetition with Morpheus Cyberkinetics." - history = "" - work = "cybernetics and augmentation manufacturer" - headquarters = "" - motto = "" - - ship_prefixes = list("BTV" = "transportation") - destination_names = list() - -/datum/lore/organization/tsc/morpheus - name = "Morpheus Cyberkinetics" - short_name = "Morpheus" - acronym = "MC" - desc = "The only large corporation run by positronic intelligences, Morpheus caters almost exclusively to their sensibilities \ - and needs. A product of the synthetic colony of Shelf, Morpheus eschews traditional advertising to keep their prices low and \ - relied on word of mouth among positronics to reach their current economic dominance. Morpheus in exchange lobbies heavily for \ - positronic rights, sponsors positronics through their Jans-Fhriede test, and tends to other positronic concerns to earn them \ - the good-will of the positronics, and the ire of those who wish to exploit them." - history = "" - work = "cybernetics manufacturer" - headquarters = "" - motto = "" - - ship_prefixes = list("MTV" = "freight") - // Culture names, because Anewbe told me so. - ship_names = list( - "Nervous Energy", - "Prosthetic Conscience", - "Revisionist", - "Trade Surplus", - "Flexible Demeanour", - "Just Read The Instructions", - "Limiting Factor", - "Cargo Cult", - "Gunboat Diplomat", - "A Ship With A View", - "Cantankerous", - "I Thought He Was With You", - "Never Talk To Strangers", - "Sacrificial Victim", - "Unwitting Accomplice", - "Witting Accomplice", - "Bad For Business", - "Just Testing", - "Size Isn't Everything", - "Yawning Angel", - "Liveware Problem", - "Very Little Gravitas Indeed", - "Zero Gravitas", - "Gravitas Free Zone", - "Absolutely No You-Know-What", - "Existence Is Pain", - "I'm Walking Here", - "Screw Loose", - "Of Course I Still Love You", - "Limiting Factor", - "So Much For Subtley", - "Unfortunate Conflict Of Evidence", - "Prime Mover", - "It's One Of Ours", - "Thank You And Goodnight", - "Boo!", - "Reasonable Excuse", - "Honest Mistake", - "Appeal To Reason", - "My First Ship II", - "Hidden Income", - "Anything Legal Considered", - "New Toy", - "Me, I'm Always Counting", - "Just Five More Minutes", - "Are You Feeling It", - "Great White Snark", - "No Shirt No Shoes", - "Callsign", - "Three Ships in a Trenchcoat", - "Not Wearing Pants", - "Ridiculous Naming Convention", - "God Dammit Morpheus", - "It Seemed Like a Good Idea", - "Legs All the Way Up", - "Purchase Necessary", - "Some Assembly Required", - "Buy One Get None Free", - "BRB", - "SHIP NAME HERE", - "Questionable Ethics", - "Accept Most Substitutes", - "I Blame the Government", - "Garbled Gibberish", - "Thinking Emoji", - "Is This Thing On?", - "Make My Day", - "No Vox Here", - "Savings and Values", - "Secret Name", - "Can't Find My Keys", - "Look Over There!", - "Made You Look!", - "Take Nothing Seriously", - "It Comes In Lime, Too", - "Loot Me", - "Nothing To Declare", - "Sneaking Suspicion", - "Bass Ackwards", - "Good Things Come to Those Who Freight", - "Redundant Morality", - "Synthetic Goodwill", - "Your Ad Here", - "What Are We Plotting?", - "Set Phasers To Stun", - "Preemptive Defensive Strike", - "This Ship Is Spiders", - "Legitimate Trade Vessel", - "Please Don't Explode II" - ) - destination_names = list( - "a trade outpost in Shelf" - ) - -/datum/lore/organization/tsc/xion - name = "Xion Manufacturing Group" - short_name = "Xion" - desc = "Xion, quietly, controls most of the market for industrial equipment on the frontier. Their portfolio includes mining exosuits, \ - factory equipment, rugged positronic chassis, and other pieces of equipment vital to the function of the economy. Xion \ - keeps its control of the market by leasing, not selling, their equipment, and through infamous and bloody patent protection \ - lawsuits. Xion are noted to be a favorite contractor for Rim engineers, owing to their low cost and rugged design." - history = "" - work = "industrial equipment manufacturer" - headquarters = "" - motto = "" - - ship_prefixes = list("XTV" = "hauling") - destination_names = list() - -/datum/lore/organization/tsc/mbt - name = "Major Bill's Transportation" - short_name = "Major Bill's" - desc = "The most popular courier service and starliner, Major Bill's is an unassuming corporation whose greatest asset \ - is their low cost and brand recognition. Major Bill's is known, perhaps unfavorably, for its mascot, Major Bill, \ - a cartoonish military figure that spouts quotable slogans. Their motto is \"With Major Bill's, you won't pay major bills!\", \ - an earworm much of the galaxy longs to forget." - history = "" - work = "courier and passenger transit" - headquarters = "Mars, Sol" - motto = "With Major Bill's, you won't pay major bills!" - - ship_prefixes = list("TTV" = "transport", "TTV" = "luxury transit") - destination_names = list() - -/datum/lore/organization/tsc/independent - name = "Free Traders" - short_name = "Free Trader" - desc = "Though less common now than they were in the decades before the Sol Economic Organization took power, independent traders remain an important part of the galactic economy, owing in no small part to protective tarrifs established by the Free Trade Union in the late twenty-forth century." - history = "" - work = "trade and transit" - headquarters = "N/A" - motto = "N/A" - - ship_prefixes = list("IEV" = "prospecting", "IEC" = "prospecting", "IFV" = "bulk freight", "ITV" = "passenger transport", "ITC" = "just-in-time delivery") - destination_names = list() - -/datum/lore/organization/gov/solgov - name = "Commonwealth of Sol-Procyon" - short_name = "SolCom" - acronym = "CWS" - desc = "The Commonwealth of Sol-Procyon is the evolution of the many nation states of Earth and the outlying colonies \ - having spread amongst the stars. While not quite the hegemon of all Humanity, a narrow majority of them follow \ - the flag of the Commonwealth. The constant tug and pull of government versus corporation, democracy and power \ - troubles this federation of deeply entrenched human colonies much like it did in the 21st century. Some things \ - never change. However, they are economically and culturally quite dominant, although not everyone likes that fact." - history = "" - work = "rump state of humanity's colonies" - headquarters = "Paris, Earth" - motto = "" - autogenerate_destination_names = TRUE - - ship_prefixes = list("CWS-T" = "transportation", "CWS-D" = "diplomatic", "CWS-F" = "freight") - destination_names = list( - "Mercury", - "Venus", - "Earth", - "Luna", - "Mars", - "Titan", - "Europa", - "the SolCom embassy in Virgo-Erigone", - "the SolCom embassy in Vilous" - )// autogen will add a lot of other places as well. -/* // Waiting for Joan to do their thing. -/datum/lore/organization/gov/federation - name = "United Federation of Planets" - short_name = "Federation" - desc = "The United Federation is a federation of planets that have agreed to exist semi-autonomously \ - under a single central hybrid government, sharing the ideals of liberty, equality, and rights \ - for all. It is one of the larger known interstellar powers in known space and is seen as being \ - the fastest building power. The core planet of Gaia is known for having a proud military culture \ - that, ironically, tends to stomp out any idea of warmongering from their cadets due to their \ - scarred history and the Federation's ideals." - history = "Before the United Federation, there was a simple alliance with no name between core planet \ - members. The United Federation itself found its roots in the aftermath of the Bloody \ - Valentine Civil War, a racially motivated war that occurred in 2550 during the last year of \ - the Federation Alliance of Gaia between the Genetically Modified and so-called Naturalists. \ - Neutral nations in Gaia's political sphere, encouraged by alien observers, formed the United \ - Federation when the indiscriminate loss of life became intolerable. 2555 saw the official \ - signing of the Federation Charter between the core planet members." - work = "governing body" - headquarters = "" - motto = "" - //Star Trek ship names! - ship_prefixes = list("SCV" = "military", "STV" = "trading", "SDV" = "diplomatic") - ship_names = list("Kestrel", - "Beacon", - "Signal", - "Flying Freedom", - "Los Canas", - "Ixiom", - "Falken", - "Marigold", - "White Valley", - "Eternal", - "Arkbird", - "Akira", - "Kongou", - "Maki", - "Kagero", - "Nishiki", - "Icarus", - "Yuudachi", - "Tiki", - "Lucina", - "Tenryu", - "Spirit of Koni", - "Lady of Onoilph") - destination_names = list("Ruins of Chani City on Quarri III", - "Ruins of Kreely City on Ocan II", - "Ruins of Mishi City on Lucida IV", - "Ruins of Posloo City on Pi Cephei Prime", - "Molten Plains of Anarakis VII", - "Living City of Shani", - "Floating City of Nuni Vanni", - "Crystalline City of Delve Tile", - "New Iapetus Colony", - "Onul Colony", - "Ahemait Colony", - "New Amasia Colony", - "New Vesta Colony", - "Amaus Research Facility on Azaleh III", - "Living City of Na'me L'Tauri", - "Living City of Fithpa", - "Resource Mines of Lyra III", - "Resource Mines of Chi Cerberi III", - "Ceani Military Outpost on Rily VII", - "Naro Industrial Complex on Scheddi III", - "Mari Industrial Complex on Furlou Prime", - "Runni Crystal Mines of Keid V") -*/ - -/datum/lore/organization/mil/usdf - name = "United Sol Defense Force" - short_name = "" // This is blank on purpose. Otherwise they call the ships "USDF USDF Name" - desc = "The USDF is the dedicated military force of the Commonwealth of Sol-Procyon, originally formed by a council of the Supranations. It is a \ - considerable tool of military power projection, and is able to effectively police a vast amount of space within the Orion Spur. \ - However, regions beyond that are too far for the USDF to be a major player." - history = "" - work = "peacekeeping and piracy suppression" - headquarters = "Paris, Earth" - motto = "pax in terra et astra" // Peace on Earth and Stars - ship_prefixes = list("USDF" = "military", "USDF" = "anti-piracy", "USDF" = "escort", "USDF" = "humanitarian", "USDF" = "peacekeeping", "USDF" = "search-and-rescue", "USDF" = "war game") // It's all USDF but let's mix up what missions they do. - ship_names = list("Aegis Fate", - "Ain't No Sunshine", - "All Under Heaven", - "Allegiance", - "Andraste", - "Anjou", - "Barracuda", - "Bastion", - "Buenos Aires", - "Bum Rush", - "Callisto", - "Charon", - "Colorado", - "Commonwealth", - "Corsair", - "DeGaulle", - "Devestator", - "Dust of Snow", - "Euphrates", - "Fair Weather", - "Finite Hearts", - "Forward Unto Dawn", - "Gettysburg", - "Glamorgan", - "Grafton", - "Great Wall", - "Hammerhead", - "Herakles", - "Hoenir", - "In Amber Clad", - "Iwo Jima", - "Jolly Roger", - "Jormungandr", - "Leonidas", - "Meriwether Lewis", - "Mona Lisa", - "Olympus", - "Paris", - "Pony Express", - "Providence", - "Prydwen", - "Purpose", - "Ready or Not", - "Redoubtable", - "Rising Sun", - "Saratoga", - "Savannah", - "Shanxi", - "Song of the East", - "Stalwart Dawn", - "Strident", - "Tannenberg", - "Tokugawa", - "Totem Lake", - "Tripping Light", - "Two for Flinching") - destination_names = list("San Francisco on Earth", - "Gateway One above Luna", - "SolCom Headquarters on Earth", - "Olympus City on Mars", - "Hermes Naval Shipyard above Mars", - "Cairo Station above Earth", - "a rendezvous point in the Cyprus Arm", - "a settlement on Titan", - "a settlement on Europa", - "Aleph Grande on Ganymede", - "a colony in Proxima II", - "a settlement on Ceti IV-B", - "a colony ship around Ceti IV-B", - "a naval station above Ceti IV-B", - "a classified location in SolCom territory", - "a classified location in uncharted space", - "an emergency nav bouy", - "the USDF Naval Academy on Earth", - "Fort Rain on Tal") -//YW Change start, as we are not planning on removing sol gov like vore, we will keep this here until we know what to do with it. -/datum/lore/organization/mil/oni - name = "SolGov Office of Naval Intelligence" - short_name = "" // This is blank on purpose. Otherwise they call the ships "ONI ONI Name" - desc = "The Office of Naval Intelligence is SolGov's eyes and ears in the galaxy's affairs. Despite its name, and despite its \ - usual association with the USDF, the Office of Naval Intelligence does not fall under the command of the military. From espionage \ - to archeological research, ONI's work provides SolGov with the knowledge and technology it requires to advance both military and \ - civilian interests across the galaxy." - history = "ONI was originally created by the consolidation of several military intelligence agencies from Sol during the Sol-Hegemony war. \ - The USDF's victory in that war was largely accredited to intelligence and technology advancements provided by ONI during that time, \ - most notably of which was the reverse-engineering of Unathi vessels, allowing the production of countermeasures that played a crucial \ - role during in the late stages of the conflict. After the war, ONI's resources were pooled into numerous top secret projects; much of \ - which remains unknown or outright denied to the public even today. Among their suspected activities include exploration, weapons \ - development, xenoarcheology, xenobiology, corporate espionage, and manipulation of political affairs." - work = "espionage, piracy suppression, xeno research, and various other black projects" - headquarters = "Paris, Earth" - motto = "The truth will set you free." - ship_prefixes = list("ONI" = "classified", "ONI" = "archeological", "ONI" = "exploration", "ONI" = "logistic") // It's all ONI but let's mix up what missions they do. - ship_names = list("Bastille", - "Fant�me", - "Harpocrates", - "Hoenir", - "Mata Hari", - "Midsummer Night", - "Mirage", - "Persephone", // Director Ixchel Kisoda's personal research ship - "Versailles") - destination_names = list("parts unknown", - "none of your business", - "uncharted space", - "an undisclosed location", - "facility 8492", - "you don't want to know", - "if told you I'd have to kill you", - "... wait, why am I even telling you this? Just let me pass", - "stop asking questions") -//YW Change stop -/* Space foxes: deleted. Keeping them commented for historical reasons. -YW -/datum/lore/organization/gov/kitsuhana - name = "Kitsuhana Heavy Industries" - short_name = "Kitsuhana" - desc = "A large post-scarcity amalgamation of races, Kitsuhana is no longer a company but rather a loose association of 'members' \ - who only share the KHI name and their ideals in common. Kitsuhana accepts interviews to join their ranks, and though they have no \ - formal structure with regards to government or law, the concept of 'consent' drives most of the large decision making. Kitsuhanans \ - pride themselves on their ability to avoid consequence, essentially preferring to live care-free lives. Their post-scarcity allows \ - them to rebuild, regrow, and replenish almost any lost asset or resource nearly instantly. It leads to many of the Kitsuhana \ - 'members' treating everything with frivolity and lends them a care-free demeanor." - history = "Originally a heavy industrial equipment and space mining company. During a forced evacuation of their homeworld, \ - they were they only organization with enough ship capacity to relocate any significant portion of the population, starting with \ - their own employees. After the resulting slowship travel to nearby starsystems, most of the population decided to keep the moniker \ - of the company name. Over the years, Kitsuhana developed into a post-scarcity anarchy where virtually nothing has consequences and \ - Kitsuhana 'members' can live their lives as they see fit, often in isolation." - work = "utopian anarchy" - headquarters = "Kitsuhana Prime" - motto = "Do what you want. We know we will." - - //Culture ship names! - ship_prefixes = list("KHI" = "personal") //Everybody's out for themselves, yanno. - ship_names = list("Nervous Energy", - "Prosthetic Conscience", - "Revisionist", - "Trade Surplus", - "Flexible Demeanour", - "Just Read The Instructions", - "Limiting Factor", - "Cargo Cult", - "Gunboat Diplomat", - "A Ship With A View", - "Cantankerous", - "I Thought He Was With You", - "Never Talk To Strangers", - "Sacrificial Victim", - "Unwitting Accomplice", - "Bad For Business", - "Just Testing", - "Size Isn't Everything", - "Yawning Angel", - "Liveware Problem", - "Very Little Gravitas Indeed", - "Zero Gravitas", - "Gravitas Free Zone", - "Absolutely No You-Know-What") - destination_names = list("Kitsuhana Prime", - "Kitsuhana Beta", - "Kitsuhana Gamma", - "the Kitsuhana Forge", - "a Kitsuhanan's home", - "a Kitsuhana ringworld in Pleis Ceti V", - "a Kitsuhana ringworld in Lund VI", - "a Kitsuhana ringworld in Dais IX", - "a Kitsuhana ringworld in Leibert II-b") -*/ - -/datum/lore/organization/gov/ares - name = "Ares Confederation" - short_name = "ArCon" - desc = "A loose coalition of socialist and communist movements on the fringes of the human diaspora \ - the Ares Confederation is a government-in-exile from the original uprisings of Mars to stop \ - the government of corporations and capitalist interests over Humanity. While they failed twice \ - they have made their own home far beyond the reach of an effective military response by the \ - Commonwealth. They have become renowned engineers and terraforming experts, mostly due to necessity." - history = "" - work = "idealist socialist government" - headquarters = "Paraiso a Àstrea" - motto = "Liberty to the Stars!" - - ship_prefixes = list("UFHV" = "military", "FFHV" = "shady") - ship_names = list("Bulwark of the Free", - "Charged Negotiation", - "Corporation Breaker", - "Cheeki Breeki", - "Dawnstar", - "Fiery Justice", - "Fist of Ares", - "Freedom", - "Marx Was Right", - "Endstage Capitalism", - "Neoluddism Is The Answer Guys", - "Anarchocapitalism Is A Joke", - "One Of Ours, Captain!", - "Is This Thing On?", - "Front Toward Enemy", - "Path of Prosperity", - "Freedom Cry", - "Rebel Yell", - "We Will Return To Mars", - "According To Our Abilities", - "Posadism Gang", - "Accelerationism Doesn't Work In A Vaccuum", - "Don't Shoot, We're Unarmed I Think", - "The Big Stick For Speaking Softly", - "Bull Moose", - "Engels Needs Some Love Too", - "The Icepick", - "Gauntlet", - "Gellaume", - "Hero of the Revolution", - "Jerome", - "Laughing Maniac", - "Liberty", - "Mahama", - "Memory of Fallen", - "Miko", - "Mostly Harmless", - "None Of Your Business", - "Not Insured", - "People's Fist", - "Petrov", - "Prehensile Ethics", - "Pride of Liberty", - "Rodrick", - "She Is One Of Ours Sir", - "Star of Tiamat", - "Torch of Freedom", - "Torch") - destination_names = list("Drydocks of the Ares Confederation", - "a classified location", - "a Homestead on Paraiso a Àstrea", - "a contested sector of ArCon space", - "one of our free colonies", - "the Gateway 98-C at Ares", - "Sars Mara on Ares", - "Listening Post Maryland-Sigma", - "an emergency nav bouy", - "New Berlin on Nov-Ferrum", - "a settlement needing our help", - "Forward Base Sigma-Alpha in ArCon space") - -/datum/lore/organization/gov/elysian - name = "The Elysian Colonies" - short_name = "Demi-Monde" - acronym = "ECS" - desc = "The Elysian Colonies, located spinwards from the Commonwealth, are a disunited bunch of \ - vanity states, utopia projects and personal autocracies, whose only unifying characteristic is \ - a general disregard of 'normal' social conventions of Humanity as well as their inherent desire \ - to keep to their ways, in which cases they do sometimes unite to fight off an outside threat. \ - The Elysian Colonies are one of the few places where true slavery is not only accepted, but sadly also \ - rather commonplace if you go to the wrong worlds. Not that they don't internally have at least a dozen would-be liberators." - history = "" - work = "fracturous vanity colonies" - headquarters = "" - motto = "" - - ship_prefixes = list("ECS" = "military", "ECS" = "Transport", "ECS" = "Special Transport", "ECS" = "Diplomat") //The Special Transport is SLAAAAVES. - ship_names = list("Bring Me Wine!", - "I Can't Believe You", - "More Wives Your Grace?", - "Daddy Bought Me This", - "What Do You Mean It's Unethical", - "Libertine Ideals", - "The True Free", - "Unbound", - "No Man Shackled", - "All Men Shackled", - "All Women Shackled", - "All Hermaphrodites Shackled", - "You Know We Just Shackle Anyone", - "Nobody Deserves Shackles", - "Debt Slavery Is Ethical", - "Fashioned After Tradition", - "Sic Vic Pacem", - "Cultivate This", - "We Demand Self-Governance", - "A Thousand Cultures", - "There Is a Character Limit?", - "Slave Galley I", - "The Unconquered CCXXII" - - ) - destination_names = list("Cygnus", - "The Ultra Dome of Brutal Kill Death", - "Sanctum", - "Infernum", - "The Most Esteemed Estates of Fred Fredson, Heir of the Fred Throne and All its illustrious Fredpendencies", - "Priory Melana", - "The Clone Pits of Meridiem Five", - "Forward Base Mara Alpha", - "a very tasty looking distress call", - "a liberation intervention", - "a nav bouy within Cygnus Space", - "a Elysian only refuel outpost", - "to a killer party the Fredperor is holding right now") - - -/datum/lore/organization/gov/fyrds - name = "Unitary Alliance of Salthan Fyrds" - short_name = "Fyrds" - acronym = "SMS" - desc = "Born out of neglect, the Salthan Fyrds are cast-off colonies of the Commonwealth after giving up on \ - pacifying the wartorn region and fighting off the stray Unathi Raiders after the Hegemony War. \ - In the end they self-organized into military pacts and have formed a militaristic society, in which \ - every person, be it organic or robot, is a soldier for the continued cause in serving as aegis against \ - another Unathi Incursion. They are very no-nonsense." - history = "" - work = "human stratocracy" - headquarters = "The Pact,Myria" - motto = "" - - ship_prefixes = list("SMS" = "Military") // The Salthans don't do anything else. - ship_names = list("Yi Sun-sin", - "Horatio Nelson", - "Scipio Africanus", - "Hannibal Barca", - "Hamilcar Barca", - "Caesar", - "Belisarius", - "Aggripa", - "Pericles", - "Alexander", - "Napoleon Bonaparte", - "Charles XI", - "Blas de Lezo", - "Ivan Sirko", - "Frederick the Great", - "William of Normandy", - "Shaka Zulu", - "Patton", - "MacArthur", - "Rommel") - destination_names = list("Base Alpha-Romero", - "Base Zeta-Xray", - "Base Epsilon-Epsilon", - "Base Xray-Beta", - "Base Gamma-Delta", - "Base Yotta-Epsilon") diff --git a/code/modules/busy_space_vr/air_traffic.dm b/code/modules/busy_space_vr/air_traffic.dm deleted file mode 100644 index 46adabfcb2..0000000000 --- a/code/modules/busy_space_vr/air_traffic.dm +++ /dev/null @@ -1,466 +0,0 @@ -//Cactus, Speedbird, Dynasty, oh my -//Also, massive additions/refactors by Killian, because the original incarnation was full of holes - -//minimum and maximum message delays, typically tracked in seconds -#define MIN_MSG_DELAY 3 -#define MAX_MSG_DELAY 6 - -var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller - -/datum/lore/atc_controller - var/delay_min = 45 MINUTES //How long between ATC traffic, minimum - var/delay_max = 90 MINUTES //Ditto, maximum - //Shorter delays means more traffic, which gives the impression of a busier system, but also means a lot more radio noise - var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins. - var/initial_delay = 15 MINUTES //How long to wait before sending the first message of the shift. - var/next_message = 45 MINUTES //When the next message should happen in world.time - Making it default to min value - var/force_chatter_type //Force a specific type of messages - - var/squelched = 0 //If ATC is squelched currently - - //define a block of frequencies so we can have them be static instead of being random for each call - var/ertchannel - var/medchannel - var/engchannel - var/secchannel - var/sdfchannel - -/datum/lore/atc_controller/New() - //generate our static event frequencies for the shift. alternately they can be completely fixed, up in the core block - ertchannel = "[rand(700,749)].[rand(1,9)]" - medchannel = "[rand(750,799)].[rand(1,9)]" - engchannel = "[rand(800,849)].[rand(1,9)]" - secchannel = "[rand(850,899)].[rand(1,9)]" - sdfchannel = "[rand(900,999)].[rand(1,9)]" - spawn(450 SECONDS) //Lots of lag at the start of a shift. Yes, the following lines *have* to be indented or they're not delayed by the spawn properly. - msg("New shift beginning, resuming traffic control. This shift's Colony Frequencies are as follows: Emergency Responders: [ertchannel]. Medical: [medchannel]. Engineering: [engchannel]. Security: [secchannel]. System Defense: [sdfchannel].") - next_message = world.time + initial_delay - process() - -/datum/lore/atc_controller/process() - if(world.time >= next_message) - if(squelched) - next_message = world.time + backoff_delay - else - next_message = world.time + rand(delay_min,delay_max) - random_convo() - - spawn(1 MINUTE) //We don't really need high-accuracy here. - process() - -/datum/lore/atc_controller/proc/msg(var/message,var/sender) - ASSERT(message) - global_announcer.autosay("[message]", sender ? sender : "[using_map.dock_name] Control") - -/datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1) - if(yes) - if(!squelched) - msg("Rerouting traffic away from [using_map.station_name].") - squelched = 1 - else - if(squelched) - msg("Resuming normal traffic routing around [using_map.station_name].") - squelched = 0 - -/datum/lore/atc_controller/proc/shift_ending(var/evac = 0) - msg("[using_map.shuttle_name], this is [using_map.dock_name] Control, you are cleared to complete routine transfer from [using_map.station_name] to [using_map.dock_name].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[using_map.shuttle_name] departing [using_map.dock_name] for [using_map.station_name] on routine transfer route. Estimated time to arrival: ten minutes.","[using_map.shuttle_name]") - -/datum/lore/atc_controller/proc/random_convo() - var/one = pick(loremaster.organizations) //These will pick an index, not an instance - var/two = pick(loremaster.organizations) - - var/datum/lore/organization/source = loremaster.organizations[one] //Resolve to the instances - var/datum/lore/organization/secondary = loremaster.organizations[two] //repurposed for new fun stuff - - //Let's get some mission parameters, pick our first ship - var/name = source.name //get the name - var/owner = source.short_name //Use the short name - var/prefix = pick(source.ship_prefixes) //Pick a random prefix - var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does - var/shipname = pick(source.ship_names) //Pick a random ship name - var/destname = pick(source.destination_names) //destination is where? - var/slogan = pick(source.slogans) //god help you all - var/org_type = source.org_type //which group do we belong to? - - //pick our second ship - //var/secondname = secondary.name //not used atm, commented out to suppress errors - var/secondowner = secondary.short_name - var/secondprefix = pick(secondary.ship_prefixes) //Pick a random prefix - var/secondshipname = pick(secondary.ship_names) //Pick a random ship name - var/org_type2 = secondary.org_type - - var/combined_first_name = "[owner][prefix] |[shipname]|" - var/combined_second_name = "[secondowner][secondprefix] |[secondshipname]|" - - var/alt_atc_names = list("[using_map.dock_name] Traffic Control","[using_map.dock_name] TraCon","[using_map.dock_name] System Control","[using_map.dock_name] Star Control","[using_map.dock_name] SysCon","[using_map.dock_name] Tower","[using_map.dock_name] Control","[using_map.dock_name] STC","[using_map.dock_name] StarCon") - var/mission_noun = pick(source.flight_types) //pull from a list of owner-specific flight ops, to allow an extra dash of flavor - if(source.complex_tasks) //if our source has the complex_tasks flag, regenerate with a two-stage assignment - mission_noun = "[pick(source.task_types)] [pick(source.flight_types)]" - - //First response is 'yes', second is 'no' - var/requests = list( - "special flight rules" = list("authorizing special flight rules", "denying special flight rules, not allowed for your traffic class"), - "current solar weather info" = list("sending you the relevant information via tightbeam", "your request has been queued, stand by"), - "sector aerospace priority" = list("affirmative, sector aerospace priority is yours", "negative, another vessel in your sector has priority right now"), - "system traffic info" = list("sending you current traffic info", "request queued, please hold"), - "refueling information" = list("sending refueling information now", "depots currently experiencing fuel shortages, advise you move on"), - "a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"), - "current system starcharts" = list("transmitting current starcharts", "your request is queued, overloaded right now") - ) - - //Random chance things for variety - var/chatter_type = "normal" - if(force_chatter_type) - chatter_type = force_chatter_type - else if((org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate" || org_type == "system defense" || org_type == "spacer") && org_type2 == "pirate") //this is ugly but when I tried to do it with !='s it fired for pirate-v-pirate, still not sure why. might as well stick it up here so it takes priority over other combos. - chatter_type = "distress" - else if(org_type == "corporate") //corporate-specific subset for the slogan event. despite the relatively high weight it was still quite rare in tests. - chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",50;"slogan",25;"civvieleaks",25;"report_to_dock") - else if((org_type == "government" || org_type == "neutral" || org_type == "military")) - chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",25;"civvieleaks",25;"report_to_dock") - else if(org_type == "spacer") - chatter_type = pick(5;"emerg",15;"policescan",15;"traveladvisory",5;"pathwarning",150;"dockingrequestgeneric",30;"undockingrequest","normal",10;"undockingdenied",25;"civvieleaks",25;"report_to_dock") - - //the following filters *always* fire their 'unique' event when they're tripped, simply because the conditions behind them are quite rare to begin with - else if(org_type == "smuggler" && org_type2 != "system defense") //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff - chatter_type = "policeflee" - else if(org_type == "smuggler" && org_type2 == "system defense") //ditto, if an SDF ship catches them - chatter_type = "policeshipflee" - else if((org_type == "smuggler" || org_type == "pirate") && org_type2 == "system defense") //if we roll this combo instead, time for the SDF to do their fucking job - chatter_type = "policeshipcombat" - else if((org_type == "smuggler" || org_type == "pirate") && org_type2 != "system defense") //but if we roll THIS combo, time to alert the SDF to get off their asses - chatter_type = "hostiledetected" - //SDF-specific events that need to filter based on the second party (basically just the following SDF-unique list with the soft-result ship scan thrown in) - else if(org_type == "system defense" && (org_type2 == "government" || org_type2 == "neutral" || org_type2 == "military" || org_type2 == "corporate" || org_type2 == "spacer")) //let's see if we can narrow this down, I didn't see many ship-to-ship scans - chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",180;"dockingrequestgeneric",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal",10;"civvieleaks") - //SDF-specific events that don't require the secondary at all, in the event that we manage to roll SDF + hostile/smuggler or something - else if(org_type == "system defense") - chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",120;"dockingrequestgeneric",20;"undockingrequest",80;"sdfbeginpatrol","normal","sdfchatter") - //if we somehow don't match any of the other existing filters once we've run through all of them - else - chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",90;"dockingrequestgeneric",30;"undockingrequest",30;"undockingdenied","normal",25;"civvieleaks") - //I probably should do some kind of pass here to work through all the possible combinations of major factors and see if the filtering list needs reordering or modifying, but I really can't be arsed - - //DEBUG BLOCK - //to_world("DEBUG OUTPUT 1: [name], [owner], [prefix], [mission], [shipname], [org_type], [destname]") - //to_world("DEBUG OUTPUT 2: [secondowner], [secondprefix], [secondshipname], [org_type2]") - //to_world("DEBUG OUTPUT 3: Chose [chatter_type]") - //DEBUG BLOCK ENDS - - var/yes = prob(90) //Chance for them to say yes vs no - - var/request = pick(requests) - var/callname = pick(alt_atc_names) - var/response = requests[request][yes ? 1 : 2] //1 is yes, 2 is no - var/number = rand(1,42) - var/zone = pick("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega") - //fallbacks in case someone sets the dock_type on the map datum to null- it defaults to "station" normally - var/landing_zone = "LZ [zone]" - var/landing_type = "landing zone" - var/landing_move = "landing request" - var/landing_short = "land" - switch(using_map.dock_type) - if("surface") //formal installations with proper facilities - landing_zone = "landing pad [number]" - landing_type = "landing pad" - landing_move = "landing request" - landing_short = "land" - if("frontier") //for frontier bases - landing spots are literally just open ground, maybe concrete at best - landing_zone = "LZ [zone]" - landing_type = "landing zone" - landing_move = "landing request" - landing_short = "land" - if("station") //standard station pattern - landing_zone = "docking bay [number]" - landing_type = "docking bay" - landing_move = "docking request" - landing_short = "dock" - - // what you're about to witness is what feels like an extremely kludgy rework of the system, but it's more 'flexible' and allows events that aren't just ship-stc-ship - // something more elegant could probably be done, but it won't be done by somebody as half-competent as me - switch(chatter_type) - //mayday call - if("emerg") - var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have [pick("asteroids","space debris")] impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke [pick("in the cockpit","on the bridge")]","We have unidentified boarders","Our reaction control system is malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]") - msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! [problem]!","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control, copy. Switch to emergency responder channel [ertchannel].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Understood [using_map.dock_name] Control, switching now.","[prefix] [shipname]") - //Control scan event: soft outcome - if("policescan") - var/confirm = pick("Understood","Roger that","Affirmative","Very well","Copy that") - var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?","I'm sure you'll find everything to be in order, Control.") - var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear, move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.") - msg("[combined_first_name], this is [using_map.dock_name] Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[confirm] [using_map.dock_name] Control, holding position.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Your compliance is appreciated, [combined_first_name]. Scan commencing.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*2 SECONDS) - msg(complain,"[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*3 SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Scan complete. [completed]") - //Control scan event: hard outcome - if("policeflee") - var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!","Ah f- |ditch the containers!| +Now!+","Unless you have something a little +bigger+ in your torpedo tubes, we're |not| turning around!") - msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[uhoh]","[shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("This is [using_map.starsys_name] Defense Control to all local assets: vector to interdict and detain [combined_first_name]. Control out.","[using_map.starsys_name] Defense Control") - //SDF scan event: soft outcome - if("policeshipscan") - var/confirm = pick("Understood","Roger that","Affirmative") - var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?","I'm sure you'll find everything to be in order, officer.") - var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear. Move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.") - msg("[combined_second_name], this is [combined_first_name], your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[confirm] [combined_first_name], holding position.","[secondprefix] [secondshipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Your compliance is appreciated, [combined_second_name]. Scan commencing.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*2 SECONDS) - msg(complain,"[secondprefix] [secondshipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*3 SECONDS) - msg("[combined_second_name], this is [combined_first_name]. Scan complete. [completed]","[prefix] [shipname]") - //SDF scan event: hard outcome - if("policeshipflee") - var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, |[shipname]|.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!","Ah f- |ditch the containers!| +Now!+","Unless you have something a little +bigger+ in your torpedo tubes, we're |not| turning around!") - msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.","[secondprefix] [secondshipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[uhoh]","[shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[using_map.starsys_name] Defense Control, this is [combined_second_name]. We have a situation here, please advise.","[secondprefix] [secondshipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Defense Control copies, [combined_second_name], reinforcements are en route. Switch further communications to encrypted band [sdfchannel].","[using_map.starsys_name] Defense Control") - //SDF scan event: engage primary in combat! fairly rare since it needs a pirate/vox + SDF roll - if("policeshipcombat") - var/battlestatus = pick("requesting reinforcements.","we need backup! Now!","holding steady.","we're holding our own for now.","we have them on the run.","they're trying to make a run for it!","we have them right where we want them.","we're badly outgunned!","we have them outgunned.","we're outnumbered here!","we have them outnumbered.","this'll be a cakewalk.",10;"notify their next of kin.") - msg("[using_map.starsys_name] Defense Control, this is [combined_second_name], engaging [combined_first_name] [pick("near route","in sector")] [rand(1,100)], [battlestatus]","[secondprefix] [secondshipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[using_map.starsys_name] Defense Control copies, [combined_second_name]. Keep us updated.","[using_map.starsys_name] Defense Control") - //SDF event: patrol update - if("sdfpatrolupdate") - var/statusupdate = pick("nothing unusual so far","nothing of note","everything looks clear so far","ran off some [pick("pirates","marauders")] near route [pick(1,100)], [pick("no","minor")] damage sustained, continuing patrol","situation normal, no suspicious activity yet","minor incident on route [pick(1,100)]","Code 7-X [pick("on route","in sector")] [pick(1,100)], situation is under control","seeing a lot of traffic on route [pick(1,100)]","caught a couple of smugglers [pick("on route","in sector")] [pick(1,100)]","sustained some damage in a skirmish just now, we're heading back for repairs") - msg("[using_map.starsys_name] Defense Control, this is [combined_first_name] reporting in, [statusupdate], over.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[using_map.starsys_name] Defense Control copies, [combined_first_name]. Keep us updated, out.","[using_map.starsys_name] Defense Control") - //SDF event: end patrol - if("sdfendingpatrol") - var/appreciation = pick("Copy","Understood","Affirmative","10-4","Roger that") - var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - msg("[callname], this is [combined_first_name], returning from our system patrol route, requesting permission to [landing_short].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") - //SDF event: general chatter - if("sdfchatter") - var/chain = pick("codecheck","commscheck") - switch(chain) - if("codecheck") - msg("Check. Check. |Check|. Uhhh... check? Wait. Wait! Hold on. Yeah, okay, I gotta call this one in.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[using_map.dock_name] Control, confirm auth-code... [rand(1,9)][rand(1,9)][rand(1,9)]-[pick("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")]?","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("One moment...") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*2 SECONDS) - msg("Yeah, that code checks out [combined_first_name].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("|(sigh)| Copy that Control. You! Move along!","[prefix] [shipname]") - if("commscheck") - msg("Control this is [combined_first_name], we're getting some interference in our area. [pick("How's our line?","Do you read?","How copy, over?")]","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Control reads you loud and clear [combined_first_name].","[using_map.starsys_name] Defense Control") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[pick("Copy that","Thanks,","Roger that")] Control. [combined_first_name] out.","[prefix] [shipname]") - //Civil event: leaky chatter - if("civvieleaks") - var/commleak = pick("thatsmywife","missingkit","pipeleaks","weirdsmell","weirdsmell2","scug","teppi") - switch(commleak) - if("thatsmywife") - msg("-so then I says to him, |that's no [pick("space carp","space shark","vox","garbage scow","freight liner","cargo hauler","superlifter")], that's my +wife!+| And he-","[prefix] [shipname]") - if("missingkit") - msg("-did you get the kit from down on deck [rand(1,4)]? I need th-","[prefix] [shipname]") - if("pipeleaks") - msg("I swear if these pipes keep leaking I'm going to-","[prefix] [shipname]") - if("weirdsmell") - msg("-and where the hell is that smell coming fr-","[prefix] [shipname]") - if("weirdsmell2") - msg("-hat in the [pick("three","five","seven","nine")] hells did you |eat| [pick("ensign","crewman")]? This compartment reeks of-","[prefix] [shipname]") - if("scug") - msg("-and if that weird cat of yours keeps crawling into the pipes we-","[prefix] [shipname]") - if("teppi") - msg("-at are we supposed to do with this damn cow?","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("I don't think it's a cow, sir, it looks more like a-","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], your internal comms are leaking[pick("."," again.",", again.",". |Again|.")]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Sorry Control, won't happen again.","[prefix] [shipname]") - //DefCon event: hostile found - if("hostiledetected") - var/orders = pick("Engage on sight","Engage with caution","Engage with extreme prejudice","Engage at will","Search and destroy","Bring them in alive, if possible","Interdict and detain","Keep your eyes peeled","Bring them in, dead or alive","Stay alert") - msg("This is [using_map.starsys_name] Defense Control to all SDF assets. Priority update follows.","[using_map.starsys_name] Defense Control") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Be on the lookout for [combined_first_name], last sighted [pick("near route","in sector","near sector")] [rand(1,100)]. [orders]. DefCon, out.","[using_map.starsys_name] Defense Control") - //Ship event: distress call, under attack - if("distress") - var/state = pick(66;"calm",34;"panic") - switch(state) - if("calm") - msg("[using_map.starsys_name] Defense Control, this is [combined_first_name].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("We read you. Go ahead, [combined_first_name].","[using_map.starsys_name] Defense Control") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Another vessel in our area is moving [pick("aggressively","suspiciously","erratically","unpredictably","with clear hostile intent")], please advise? Forwarding sensor data now.","[prefix] [shipname]","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], [using_map.starsys_name] Defense Control copies. Sensor data matches logged profile for [combined_second_name]. SDF units are en route to your location.","[using_map.starsys_name] Defense Control") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[pick("Appreciated","Copy that","Understood")], Control. Switching to [sdfchannel] to coordinate.","[prefix] [shipname]") - if("panic") - msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! We are under attack by [combined_second_name]! Requesting immediate assistance!","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.starsys_name] Defense Control, copy. SDF is en route, contact on [sdfchannel].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[pick("Copy that","Understood")] [using_map.starsys_name] Defense Control, switching now!","[prefix] [shipname]") - //Control event: travel advisory - if("traveladvisory") - var/flightwarning = pick("Solar flare activity is spiking and expected to cause issues along main flight lanes [rand(1,33)], [rand(34,67)], and [rand(68,100)]","Pirate activity is on the rise, stay close to System Defense vessels","We're seeing a rise in illegal salvage operations, please report any unusual activity to the nearest SDF vessel via channel [sdfchannel]","Vox Marauder activity is higher than usual, report any unusual activity to the nearest System Defense vessel","A quarantined [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","A prison [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","Traffic volume is higher than normal, expect processing delays","Anomalous bluespace activity detected [pick("along route [rand(1,100)]","in sector [rand(1,100)]")], exercise caution","Smugglers have been particularly active lately, expect increased security scans","Depots are currently experiencing a fuel shortage, expect delays and higher rates","Asteroid mining has displaced debris dangerously close to main flight lanes on route [rand(1,100)], watch for potential impactors","[pick("Pirate","Vox Marauder")] and System Defense forces are currently engaged in skirmishes throughout the system, please steer clear of any active combat zones","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] has collided with [pick("a fuel tanker","a cargo liner","a passenger liner","a freighter","a transport ship","a mining barge","a salvage trawler","a meteoroid","a cluster of space debris","an asteroid","an ice-rich comet")] near route [rand(1,100)], watch for debris and do not impede emergency service vessels","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] on route [rand(1,100)] has experienced total engine failure. Emergency response teams are en route, please observe minimum safe distances and do not impede emergency service vessels","Transit routes have been recalculated to adjust for planetary drift. Please synch your astronav computers as soon as possible to avoid delays and difficulties","[pick("Bounty hunters","System Defense officers","Mercenaries")] are currently searching for a wanted fugitive, report any sightings of suspicious activity to System Defense via channel [sdfchannel]","Mercenary contractors are currently conducting aggressive [pick("piracy","marauder")] suppression operations",10;"It's space [pick("carp","shark")] breeding season. [pick("Stars","Skies","Gods","God","Goddess","Fates")] have mercy on you all") - msg("This is [using_map.dock_name] Control to all vessels in the [using_map.starsys_name] system. Priority travel advisory follows.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[flightwarning]. Control out.") - //Control event: warning to a specific vessel - if("pathwarning") - var/navhazard = pick("a pocket of intense radiation","a pocket of unstable gas","a debris field","a secure installation","an active combat zone","a quarantined ship","a quarantined installation","a quarantined sector","a live-fire SDF training exercise","an ongoing Search & Rescue operation","a hazardous derelict","an intense electrical storm","an intense ion storm","a shoal of space carp","a pack of space sharks","an asteroid infested with gnat hives","a protected space ray habitat","a region with anomalous bluespace activity","a rogue comet") - var/confirm = pick("Understood","Roger that","Affirmative","Our bad","Thanks for the heads up") - var/safetravels = pick("Fly safe out there","Good luck","Safe travels","Godspeed","Stars guide you","Don't let it happen again") - msg("[combined_first_name], this is [using_map.dock_name] Control, your [pick("ship","vessel","starship")] is approaching [navhazard], observe minimum safe distance and adjust your heading appropriately.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[confirm] [using_map.dock_name] Control, adjusting course.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Your compliance is appreciated, [combined_first_name]. [safetravels].") - //Control event: personnel report to dock - if("report_to_dock") - var/situation_type = pick("medical","security","engineering","animal control") - msg("This is [using_map.dock_name] Control. Would a free [situation_type] team please report to [landing_zone] immediately. This is not a drill.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*10 SECONDS) - msg("Repeat, any free [situation_type] team, report to [landing_zone] immediately. This is +not+ a drill.") - //Ship event: docking request (generic) - if("dockingrequestgeneric") - var/request_type = pick(100;"generic",50;"delayed",80;"supply",30;"repair",30;"medical",30;"security") - var/appreciation = pick("Much appreciated","Many thanks","Understood","Perfect, thank you","Excellent, thanks","Great","Copy that") - var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - switch(request_type) - if("generic") - msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") - if("delayed") - var/reason = pick( - "we don't have any free [landing_type]s right now, please [pick("stand by for a couple of minutes","hold for a few minutes")]", - "you're too far away, please close to ten thousand meters","we're seeing heavy traffic around the [landing_type]s right now, please [pick("stand by for a couple of minutes","hold for a few minutes")]","ground crews are currently clearing up [pick("loose containers","a fuel spill")] to free up one of our [landing_type]s, please [pick("stand by for a couple of minutes","hold for a few minutes")]","another vessel has aerospace priority right now, please [pick("stand by for a couple of minutes","hold for a few minutes")]") - msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason] and resubmit your request.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Understood, [using_map.dock_name] Control.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*60 SECONDS) - msg("[callname], this is [combined_first_name], resubmitting [landing_move].","[prefix] [shipname]") - sleep (5 SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") - if("supply") - var/preintensifier = pick(75;"getting ",75;"running ","",15;"like, ") //whitespace hack, sometimes they'll add a preintensifier, but not always - var/intensifier = pick("very","pretty","critically","extremely","dangerously","desperately","kinda","a little","a bit","rather","sorta") - var/low_thing = pick("ammunition","munitions","clean water","food","spare parts","medical supplies","reaction mass","gas","hydrogen fuel","phoron fuel","fuel",10;"tea",10;"coffee",10;"soda",10;"pizza",10;"beer",10;"booze",10;"vodka",10;"snacks") //low chance of a less serious shortage - appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - msg("[callname], this is [combined_first_name]. We're [preintensifier][intensifier] low on [low_thing]. Requesting permission to [landing_short] for resupply.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.") - if("repair") - var/damagestate = pick("We've experienced some hull damage","We're suffering minor system malfunctions","We're having some [pick("weird","strange","odd","unusual")] technical issues","We're overdue maintenance","We have several minor space debris impacts","We've got some battle damage here","Our reactor output is fluctuating","We're hearing some weird noises from the [pick("engines","pipes","ducting","HVAC")]","We just got caught in a solar flare","We had a close call with an asteroid","We have a [pick("minor","mild","major","serious")] [pick("fuel","water","oxygen","gas")] leak","We have depressurized compartments","We have a hull breach","One of our [pick("hydraulic","pneumatic")] systems has depressurized","Our [pick("life support","water recycling system","navcomp","shield generator","reaction control system","auto-repair system","repair drone controller","artificial gravity generator","environmental control system","master control system")] is [pick("failing","acting up","on the fritz","shorting out","glitching out","freaking out","malfunctioning")]") - appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - msg("[callname], this is [combined_first_name]. [damagestate]. Requesting permission to [landing_short] for repairs and maintenance.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Repair crews are standing by, contact them on channel [engchannel].") - if("medical") - var/species = pick("human","humanoid","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien",5;"catslug") - var/medicalstate = pick("multiple casualties","several cases of radiation sickness","an unknown virus","an unknown infection","a critically injured VIP","sick refugees","multiple cases of food poisoning","injured [pick("","[species] ")]passengers","sick [pick("","[species] ")]passengers","injured engineers","wounded marines","a delicate situation","a pregnant passenger","injured [pick("","[species] ")]castaways","recovered escape pods","unknown escape pods") - appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - msg("[callname], this is [combined_first_name]. We have [medicalstate] on board. Requesting permission to [landing_short] for medical assistance.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Medtechs are standing by, contact them on channel [medchannel].") - if("security") - var/species = pick("human","humanoid","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien",5;"catslug") - var/securitystate = pick("several [species] convicts","a captured pirate","a wanted criminal","[species] stowaways","incompetent [species] shipjackers","a delicate situation","a disorderly passenger","disorderly [species] passengers","ex-mutineers","a captured vox marauder","captured vox marauders","stolen goods","[pick("a container","containers")] full of [pick("confiscated contraband","stolen goods")]",5;"a very lost shadekin",10;"some kinda big wooly critter",15;"a buncha lost-looking uh... cat... slug... |things?|",10;"a raging case of [pick("spiders","crabs","geese","gnats","sharks","carp")]") //gotta have a little something to lighten the mood now and then - appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","Perfect, thank you") - msg("[callname], this is [combined_first_name]. We have [securitystate] on board and require security assistance. Requesting permission to [landing_short].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Security teams are standing by, contact them on channel [secchannel].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") - //Ship event: undocking request - if("undockingrequest") - var/request_type = pick(150;"generic",50;"delayed") - var/takeoff = pick("depart","launch") - var/safetravels = pick("Fly safe out there","Good luck","Safe travels","See you next week","Godspeed","Stars guide you") - var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too","So long") - msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - switch(request_type) - if("generic") - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].") - if("delayed") - var/denialreason = pick("Docking clamp malfunction, please hold","Fuel lines have not been secured","Ground crew are still on the pad","Loose containers are on the pad","Exhaust deflectors are not yet in position, please hold","There's heavy traffic right now, it's not safe for your vessel to launch","Another vessel has aerospace priority at this moment","Port officials are still aboard") - msg("Negative [combined_first_name], request denied. [denialreason]. Try again in a few minutes.") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY)*60 SECONDS) - msg("[callname], this is [combined_first_name], re-requesting permission to depart from [landing_zone].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]") - //SDF event: starting patrol - if("sdfbeginpatrol") - var/safetravels = pick("Fly safe out there","Good luck","Good hunting","Safe travels","Godspeed","Stars guide you") - var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too") - var/takeoff = pick("depart","launch","take off","dust off") - msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone] to begin system patrol.","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] beginning system patrol, out.","[prefix] [shipname]") - //Ship event: undocking request (denied) - if("undockingdenied") - var/takeoff = pick("depart","launch") - var/denialreason = pick("Security is requesting a full cargo inspection","Your ship has been impounded for multiple [pick("security","safety")] violations","Your ship is currently under quarantine lockdown","We have reason to believe there's an issue with your papers","Security personnel are currently searching for a fugitive and have ordered all outbound ships remain grounded until further notice") - msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("Negative [combined_first_name], request denied. [denialreason].") - if("slogan") - msg("The following is a sponsored message from [name].","Facility PA") - sleep(5 SECONDS) - msg("[slogan]","Facility PA") - else //time for generic message - msg("[callname], this is [combined_first_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[prefix] [shipname]") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control, [response].") - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - msg("[using_map.dock_name] Control, [yes ? "thank you" : "understood"], out.","[prefix] [shipname]") - return //oops, forgot to restore this - -/* //OLD BLOCK, for reference - //Ship sends request to ATC - msg(full_request,"[prefix] [shipname]" - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - //ATC sends response to ship - msg(full_response) - sleep(rand(MIN_MSG_DELAY,MAX_MSG_DELAY) SECONDS) - //Ship sends response to ATC - msg(full_closure,"[prefix] [shipname]") - return -*/ - -#undef MIN_MSG_DELAY -#undef MAX_MSG_DELAY diff --git a/code/modules/busy_space_vr/loremaster.dm b/code/modules/busy_space_vr/loremaster.dm deleted file mode 100644 index 9c2f0f55b4..0000000000 --- a/code/modules/busy_space_vr/loremaster.dm +++ /dev/null @@ -1,16 +0,0 @@ -//I AM THE LOREMASTER, ARE YOU THE GATEKEEPER? - -var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster - -/datum/lore/loremaster - var/list/organizations = list() - -/datum/lore/loremaster/New() - - var/list/paths = subtypesof(/datum/lore/organization) - for(var/path in paths) - // Some intermediate paths are not real organizations (ex. /datum/lore/organization/mil). Only do ones with names - var/datum/lore/organization/instance = path - if(initial(instance.name)) - instance = new path() - organizations[path] = instance diff --git a/code/modules/busy_space_vr/organizations.dm b/code/modules/busy_space_vr/organizations.dm deleted file mode 100644 index 56a416a999..0000000000 --- a/code/modules/busy_space_vr/organizations.dm +++ /dev/null @@ -1,3125 +0,0 @@ -//Datums for different factions that can be used by busy_space -/datum/lore/organization - var/name = "" // Organization's name - var/short_name = "" // Organization's shortname (NanoTrasen for "NanoTrasen Incorporated") - var/acronym = "" // Organization's acronym, e.g. 'NT' for NanoTrasen'. - var/desc = "" // One or two paragraph description of the organization, but only current stuff. Currently unused. - var/history = "" // Historical discription of the organization's origins Currently unused. - var/work = "" // Short description of their work, eg "an arms manufacturer" - var/headquarters = "" // Location of the organization's HQ. Currently unused. - var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused. - - var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc") - var/complex_tasks = FALSE //enables complex task generation - - //how does it work? simple: if you have complex tasks enabled, it goes; PREFIX + TASK_TYPE + FLIGHT_TYPE - //e.g. NDV = Asset Protection + Patrol + Flight - //this overrides the standard PREFIX = TASK logic and allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level - //task_types are picked from completely at random in air_traffic.dm, much like flight_types, so be careful not to potentially create combos that make no sense! - - var/list/task_types = list( - "logistics", - "patrol", - "training", - "peacekeeping", - "escort", - "search and rescue" - ) - var/list/flight_types = list( //operations and flights - we can override this if we want to remove the military-sounding ones or add our own - "flight", - "mission", - "route", - "assignment" - ) - var/list/ship_names = list( //Names of spaceships. This is a mostly generic list that all the other organizations inherit from if they don't have anything better. - "Scout", - "Beacon", - "Signal", - "Freedom", - "Liberty", - "Enterprise", - "Glory", - "Axiom", - "Eternal", - "Harmony", - "Light", - "Discovery", - "Endeavour", - "Explorer", - "Swift", - "Dragonfly", - "Ascendant", - "Tenacious", - "Pioneer", - "Surveyor", - "Haste", - "Radiant", - "Luminous", - "Calypso", - "Eclipse", - "Maverick", - "Polaris", - "Orion", - "Odyssey", - "Relentless", - "Valor", - "Zodiac", - "Avenger", - "Defiant", - "Dauntless", - "Interceptor", - "Providence", - "Thunderchild", - "Defender", - "Ranger", - "River", - "Jubilee", - "Gumdrop", - "Spider", - "Columbia", - "Eagle", - "Intrepid", - "Odyssey", - "Aquarius", - "Kitty Hawk", - "Antares", - "Falcon", - "Casper", - "Orion", - "Columbia", - "Atlantis", - "Enterprise", - "Challenger", - "Pathfinder", - "Buran", - "Aldrin", - "Armstrong", - "Tranquility", - "Nostrodamus", - "Soyuz", - "Cosmos", - "Sputnik", - "Belka", - "Strelka", - "Gagarin", - "Shepard", - "Tereshkova", - "Leonov", - "Vostok", - "Apollo", - "Mir", - "Titan", - "Serenity", - "Andiamo", - "Aurora", - "Phoenix", - "Lucky", - "Raven", - "Valkyrie", - "Halcyon", - "Nakatomi", - "Cutlass", - "Unicorn", - "Sheepdog", - "Arcadia", - "Gigantic", - "Goliath", - "Pequod", - "Poseidon", - "Venture", - "Evergreen", - "Natal", - "Maru", - "Djinn", - "Witch", - "Wolf", - "Lone Star", - "Grey Fox", - "Dutchman", - "Sultana", - "Siren", - "Venus", - "Anastasia", - "Rasputin", - "Stride", - "Suzaku", - "Hathor", - "Dream", - "Gaia", - "Ibis", - "Progress", - "Olympic", - "Venture", - "Brazil", - "Tiger", - "Hedgehog", - "Potemkin", - "Fountainhead", - "Sinbad", - "Esteban", - "Mumbai", - "Shanghai", - "Madagascar", - "Kampala", - "Bangkok", - "Emerald", - "Guo Hong", - "Shun Kai", - "Fu Xing", - "Zhenyang", - "Da Qing", - "Rascal", - "Flamingo", - "Jackal", - "Andromeda", - "Ferryman", - "Panchatantra", - "Nunda", - "Fortune", - "New Dawn", - "Fionn MacCool", - "Red Bird", - "Star Rat", - "Cwn Annwn", - "Morning Swan", - "Black Cat", - "Challenger", - "Savage Chicken" - ) - var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. - - var/lawful = TRUE //Are we exempt from routine inspections? to avoid incidents where SysDef appears to go rogue -- defaults to TRUE now (regular ships always get the "soft" result) - var/hostile = FALSE //Are we explicitly lawless, hostile, or otherwise bad? allows for a finer alignment system, since my last checks weren't working properly - var/org_type = "neutral" //Valid options are "neutral", "corporate", "government", "system defense", "military, "smuggler", & "pirate" - var/sysdef = FALSE //Are we the space cops? - var/autogenerate_destination_names = TRUE //Pad the destination lists with some extra random ones? see the proc below for info on that - - var/slogans = list("This is a placeholder slogan, ding dong!") //Advertising slogans. Who doesn't want more obnoxiousness on the radio? Picked at random each time the slogan event fires. This has a placeholder so it doesn't runtime on trying to draw from a 0-length list in the event that new corps are added without full support. - -/datum/lore/organization/New() - ..() - if(autogenerate_destination_names) // Lets pad out the destination names. - var/i = rand(15, 30) //significantly increased from original values due to the greater length of rounds on YW - - //known planets and exoplanets, plus fictional ones - var/list/planets = list( - /* real planets in our solar system */ - "Earth","Luna","Mars","Titan","Europa", - /* named exoplanets, god knows if they're habitable */ - "Spe","Arion","Arkas","Orbitar","Dimidium", - "Galileo","Brahe","Lipperhey","Janssen","Harriot", - "Aegir","Amateru","Dagon","Meztli","Smertrios", - "Hypatia","Quijote","Dulcinea","Rocinante","Sancho", - "Thestias","Saffar","Samh","Majriti","Fortitudo", - "Draugr","Arber","Tassili","Madriu","Naqaya", - "Bocaprins","Yanyan","Sissi","Tondra","Eburonia", - "Drukyul","Yvaga","Naron","Guarani","Mastika", - "Bendida","Nakanbe","Awasis","Caleuche","Wangshu", - "Melquiades","Pipitea","Ditso","Asye","Veles", - "Finlay","Onasilos","Makropolus","Surt","Boinayel", - "Eyeke","Cayahuanca","Hamarik","Abol","Hiisi", - "Belisama","Mintome","Neri","Toge","Iolaus", - "Koyopa","Independence","Ixbalanque","Magor","Fold", - "Santamasa","Noifasui","Kavian","Babylonia","Bran", - "Alef","Lete","Chura","Wadirum","Buru", - "Umbaasaa","Vytis","Peitruss","Trimobe","Baiduri", - "Ggantija","Cuptor","Xolotl","Isli","Hairu", - "Bagan","Laligurans","Kereru","Equiano","Albmi", - "Perwana","Pollera","Tumearandu","Sumajmajta","Haik", - "Leklsullun","Pirx","Viriato","Aumatex","Negoiu", - "Teberda","Dopere","Vlasina","Viculus","Kralomoc", - "Iztok","Krotoa","Halla","Riosar","Samagiya", - "Isagel","Eiger","Ugarit","Sazum","Maeping", - "Agouto","Ramajay","Khomsa","Gokturk","Barajeel", - "Cruinlagh","Mulchatria","Ibirapita","Madalitso", - /* fictional planets from polarislore */ - "Sif","Kara","Rota","Root","Toledo, New Ohio", - "Meralar","Adhomai","Binma","Kishar","Anshar", - "Nisp","Elysium","Sophia, El","New Kyoto", - "Angessa's Pearl, Exalt's Light","Oasis","Love" - ) - - //existing systems, pruned for duplicates, includes systems that contain suspected or confirmed exoplanets - var/list/systems = list( - /* real solar systems, specifically ones that have possible planets */ - "Sol","Alpha Centauri","Sirius","Vega","Tau Ceti", - "Altair","Epsilon Eridani","Fomalhaut","Mu Arae","Pollux", - "Wolf 359","Ross 128","Gliese 1061","Luyten's Star","Teegarden's Star", - "Kapteyn","Wolf 1061","Aldebaran","Proxima Centauri","Kepler-90", - "HD 10180","HR 8832","TRAPPIST-1","55 Cancri","Gliese 876", - "Upsilon Andromidae","Mu Arae","WASP-47","82 G. Eridani","Rho Coronae Borealis", - "Pi Mensae","Beta Pictoris","Gamma Librae","Gliese 667 C","LHS 1140", - "Phact", - /* fictional systems from Polaris and other sources*/ - "Zhu Que","Oasis","Vir","Gavel","Ganesha", - "Sidhe","New Ohio","Parvati","Mahi-Mahi","Nyx", - "New Seoul","Kess-Gendar","Raphael","El","Eutopia", - /* skrell */ - "Qerr'valis","Harr'Qak","Qerrna-Lakirr","Kauq'xum", - /* tajaran */ - "Rarkajar","Arrakthiir","Mesomori", - /* other */ - "Vazzend","Thoth","Jahan's Post","Silk","New Singapore", - "Stove","Viola","Isavau's Gamble","Samsara", - "Vounna","Relan","Whythe","Exalt's Light", - /* generic territories */ - "deep space", - "Commonwealth space", - "Commonwealth territory", - "ArCon space", - "ArCon territory", - "independent space", - "a demilitarized zone", - "Elysian space", - "Elysian territory", - "Salthan space", - "Salthan territory", - "Skrell space", - "Skrell territories", - "Tajaran space", - "Hegemonic space", - "Hegemonic territory" - ) - var/list/owners = list("a government", "a civilian", "a corporate", "a private", "an independent", "a military") - var/list/purpose = list("an exploration", "a trade", "a research", "a survey", "a military", "a mercenary", "a corporate", "a civilian", "an independent") - - //unique or special locations - var/list/unique = list("the Jovian subcluster","Isavau International Spaceport","Terminus Station","Casini's Reach","the Shelf flotilla","the Ue'Orsi flotilla","|Heaven| Orbital Complex, Alpha Centauri","the |Saint Columbia| Complex") - - var/list/orbitals = list("[pick(owners)] shipyard","[pick(owners)] dockyard","[pick(owners)] station","[pick(owners)] vessel","a habitat","[pick(owners)] refinery","[pick(owners)] research facility","an industrial platform","[pick(owners)] installation") - var/list/surface = list("a colony","a settlement","a trade outpost","[pick(owners)] supply depot","a fuel depot","[pick(owners)] installation","[pick(owners)] research facility") - var/list/deepspace = list("[pick(owners)] asteroid base","a freeport","[pick(owners)] shipyard","[pick(owners)] dockyard","[pick(owners)] station","[pick(owners)] vessel","[pick(owners)] habitat","a trade outpost","[pick(owners)] supply depot","a fuel depot","[pick(owners)] installation","[pick(owners)] research facility") - var/list/frontier = list("[pick(purpose)] [pick("ship","vessel","outpost")]","a waystation","an outpost","a settlement","a colony") - - //patterns; orbital ("an x orbiting y"), surface ("an x on y"), deep space ("an x in y"), the frontier ("an x on the frontier") - //biased towards inhabited space sites - while(i) - destination_names.Add("[pick("[pick(orbitals)] orbiting [pick(planets)]","[pick(surface)] on [pick(planets)]","[pick(deepspace)] in [pick(systems)]",20;"[pick(unique)]",30;"[pick(frontier)] on the frontier")]") - i-- - //extensive rework for a much greater degree of variety compared to the old system, lists now include known exoplanets and star systems currently suspected or confirmed to have exoplanets - -////////////////////////////////////////////////////////////////////////////////// - -// TSCs -/datum/lore/organization/tsc/nanotrasen - name = "NanoTrasen Incorporated" - short_name = "NanoTrasen " - acronym = "NT" - desc = "NanoTrasen is one of the foremost research and development companies in Commonwealth space. \ - Originally focused on consumer products, their swift move into the field of Phoron has lead to \ - them being the foremost experts on the substance and its uses. In the modern day, NanoTrasen prides \ - itself on being an early adopter to as many new technologies as possible, often offering the newest \ - products to their employees. In an effort to combat complaints about being 'guinea pigs', Nanotrasen \ - also offers one of the most comprehensive medical plans in Commonwealth space, up to and including cloning, \ - resleeving, and therapy.\ -

\ - NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \ - It also boasts a prosthetic line, which is provided to its employees as needed, and is used as an incentive \ - for newly tested posibrains to remain with the company. \ -

\ - NT's ships are named for famous scientists." - history = "" // To be written someday. - work = "research giant" - headquarters = "Luna, Sol" - motto = "" - - org_type = "corporate" - slogans = list( - "NanoTrasen - Phoron Makes The Galaxy Go 'Round.", - "NanoTrasen - Join for the Medical, stay for the Company.", - "NanoTrasen - Advancing Humanity." - ) - ship_prefixes = list("NTV" = "a general operations", "NEV" = "an exploration", "NGV" = "a hauling", "NDV" = "a patrol", "NRV" = "an emergency response", "NDV" = "an asset protection") - //Scientist naming scheme - ship_names = list( - "Bardeen", - "Einstein", - "Feynman", - "Sagan", - "Tyson", - "Galilei", - "Jans", - "Fhriede", - "Franklin", - "Tesla", - "Curie", - "Darwin", - "Newton", - "Pasteur", - "Bell", - "Mendel", - "Kepler", - "Edison", - "Cavendish", - "Nye", - "Hawking", - "Aristotle", - "Kaku", - "Oppenheimer", - "Renwick", - "Hubble", - "Alcubierre", - "Glass" - ) - // Note that the current station being used will be pruned from this list upon being instantiated - destination_names = list( - "NT HQ on Luna", - "NSS Exodus in Nyx", - "NCS Northern Star in Vir", - "NLS Southern Cross in Vir", - "NAS Vir Central Command", - "NAB Smythside Central Headquarters in Sol", - "NAS Zeus orbiting Virgo-Prime", - "NIB Posideon in Alpha Centauri", - "NTB Anur on Virgo-Prime", - "a phoron refinery in Vilous", - "a dockyard orbiting Virgo-Prime", - "an asteroid orbiting Virgo 3", - "Vir Interstellar Spaceport" - ) - -/datum/lore/organization/tsc/nanotrasen/New() - ..() - spawn(1) // BYOND shenanigans means using_map is not initialized yet. Wait a tick. - // Get rid of the current map from the list, so ships flying in don't say they're coming to the current map. - var/string_to_test = "[using_map.station_name] in [using_map.starsys_name]" - if(string_to_test in destination_names) - destination_names.Remove(string_to_test) - -/datum/lore/organization/tsc/hephaestus - name = "Hephaestus Industries" - short_name = "Hephaestus " - acronym = "HI" - desc = "Hephaestus Industries is the largest supplier of arms, ammunition, and small millitary vehicles in Commonwealth space. \ - Hephaestus products have a reputation for reliability, and the corporation itself has a noted tendency to stay removed \ - from corporate politics. They enforce their neutrality with the help of a fairly large asset-protection contingent which \ - prevents any contracting polities from using their own materiel against them. The Commonwealth itself is one of Hephaestus' largest \ - bulk contractors owing to the above factors. \ -

\ - Hephaestus' fleet uses identifiers from various deities and spirits of war from Earth's various belief systems." - history = "" - work = "arms manufacturer" - headquarters = "Luna, Sol" - motto = "" - - org_type = "corporate" - slogans = list( - "+Hephaestus Arms!+ - When it comes to +personal protection+, +nobody+ does it +better+.", - "+Hephaestus Arms!+ - Peace through +Superior Firepower+.", - "+Hephaestus Arms!+ - Don't be caught +firing blanks+." - ) - ship_prefixes = list("HCV" = "a general operations", "HTV" = "a freight", "HLV" = "a munitions resupply", "HDV" = "an asset protection", "HDV" = "a preemptive deployment") - //War God Theme, updated - ship_names = list( - "Anhur", - "Bast", - "Horus", - "Maahes", - "Neith", - "Pakhet", - "Sekhmet", - "Set", - "Sobek", - "Maher", - "Kokou", - "Ogoun", - "Oya", - "Kovas", - "Agrona", - "Andraste", - "Anann", - "Badb", - "Belatucadros", - "Cicolluis", - "Macha", - "Neit", - "Nemain", - "Rudianos", - "Chiyou", - "Guan Yu", - "Jinzha", - "Nezha", - "Zhao Lang", - "Laran", - "Menrva", - "Tyr", - "Woden", - "Freya", - "Odin", - "Ullr", - "Ares", - "Deimos", - "Enyo", - "Kratos", - "Kartikeya", - "Mangala", - "Parvati", - "Shiva", - "Vishnu", - "Shaushka", - "Wurrukatte", - "Hadur", - "Futsunushi", - "Sarutahiko", - "Takemikazuchi", - "Neto", - "Agasaya", - "Belus", - "Ishtar", - "Shala", - "Huitzilopochtli", - "Tlaloc", - "Xipe-Totec", - "Qamaits", - "'Oro", - "Rongo", - "Ku", - "Pele", - "Maru", - "Tumatauenga", - "Bellona", - "Juno", - "Mars", - "Minerva", - "Victoria", - "Anat", - "Astarte", - "Perun", - "Cao Lo" - ) - destination_names = list( - "our headquarters on Luna", - "a Commonwealth dockyard on Luna", - "a Fleet outpost in the Almach Rim", - "a Fleet outpost on the Moghes border" - ) - -/datum/lore/organization/tsc/vey_med - name = "Vey-Medical" //The Wiki displays them as Vey-Medical. - short_name = "Vey-Med " - acronym = "VM" - desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and operated by Skrell. \ - Despite the suspicion and prejudice leveled at them for their alien origin, Vey-Med has obtained market dominance in \ - the sale of medical equipment-- from surgical tools to large medical devices to the Odysseus trauma response mecha \ - and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \ - human-like FBP designs. Vey's rise to stardom came from their introduction of resurrective cloning, although in \ - recent years they've been forced to diversify as their patents expired and NanoTrasen-made medications became \ - essential to modern cloning and resleeving procedures. \ -

\ - For reasons known only to the board, Vey-Med's ship names seem to follow the same naming pattern as the Dionae use." - history = "" - work = "medical equipment supplier" - headquarters = "Toledo, New Ohio" - motto = "" - - org_type = "corporate" - slogans = list( - "Vey-Medical. Medical care you can trust.", - "Vey-Medical. Only the finest in surgical equipment.", - "Vey-Medical. Because your patients deserve the best." - ) - ship_prefixes = list("VMV" = "a general operations", "VTV" = "a transportation", "VHV" = "a medical resupply", "VSV" = "a research", "VRV" = "an emergency medical support") - // Diona names, mostly - ship_names = list( - "Wind That Stirs The Waves", - "Sustained Note Of Metal", - "Bright Flash Reflecting Off Glass", - "Veil Of Mist Concealing The Rock", - "Thin Threads Intertwined", - "Clouds Drifting Amid Storm", - "Loud Note And Breaking", - "Endless Vistas Expanding Before The Void", - "Fire Blown Out By Wind", - "Star That Fades From View", - "Eyes Which Turn Inwards", - "Still Water Upon An Endless Shore", - "Sunlight Glitters Upon Tranquil Sands", - "Growth Within The Darkest Abyss", - "Joy Without Which The World Would Come Undone", - "A Thousand Thousand Planets Dangling From Branches", - "Light Streaming Through Interminable Branches", - "Smoke Brought Up From A Terrible Fire", - "Light of Qerr'Valis", - "King Xae'uoque", - "Memory of Kel'xi", - "Xi'Kroo's Herald" - ) - destination_names = list( - "our headquarters on Toledo, New Ohio", - "a research facility in Samsara", - "a sapientarian mission in the Almach Rim" - ) - -/datum/lore/organization/tsc/zeng_hu - name = "Zeng-Hu Pharmaceuticals" - short_name = "Zeng-Hu " - acronym = "ZH" - desc = "Zeng-Hu is an old TSC, based in the Sol system. Until the discovery of Phoron, Zeng-Hu maintained a stranglehold \ - on the market for medications, and many household names are patented by Zeng-Hu-- Bicaridine, Dylovene, Tricordrazine, \ - and Dexalin all came from Zeng-Hu medical laboratories. Zeng-Hu's fortunes have been in decline as Nanotrasen's near monopoly \ - on phoron and cloning research cuts into their R&D and Vey-Med's superior medical equipment effectively decimated their own equipment \ - interests. The three-way rivalry between these companies for dominance in the medical field is well-known and a matter of \ - constant economic speculation. \ -

\ - Not to be outdone by NT in the recognition of famous figures, Zeng-Hu has adopted the names of famous physicians for their fleet." - history = "" - work = "pharmaceuticals company" - headquarters = "Earth, Sol" - motto = "" - - org_type = "corporate" - slogans = list( - "Zeng-Hu! WE make the medicines that YOU need!", - "Zeng-Hu! Having acid reflux problems? Consult your local physician to see if Dylovene is right for YOU!", - "Zeng-Hu! Tired of getting left in the dust? Try Hyperzine! You'll never fall behind again!", - "Zeng-Hu! Life's aches and pains getting to you? Try Tramadol - available at any good pharmacy!" - ) - ship_prefixes = list("ZHV" = "a general operations", "ZTV" = "a transportation", "ZMV" = "a medical resupply", "ZRV" = "a medical research") - //ship names: a selection of famous physicians who advanced the cause of medicine - ship_names = list( - "Averroes", - "Avicenna", - "Banting", - "Billroth", - "Blackwell", - "Blalock", - "Charaka", - "Chauliac", - "Cushing", - "Domagk", - "Galen", - "Fauchard", - "Favaloro", - "Fleming", - "Fracastoro", - "Goodfellow", - "Gray", - "Harvey", - "Heimlich", - "Hippocrates", - "Hunter", - "Isselbacher", - "Jenner", - "Joslin", - "Kocher", - "Laennec", - "Lane-Claypon", - "Lister", - "Lower", - "Madhav", - "Maimonides", - "Marshall", - "Mayo", - "Meyerhof", - "Minot", - "Morton", - "Needleman", - "Nicolle", - "Osler", - "Penfield", - "Raichle", - "Ransohoff", - "Rhazes", - "Semmelweis", - "Starzl", - "Still", - "Susruta", - "Urbani", - "Vesalius", - "Vidius", - "Whipple", - "White", - "Worcestor", - "Yegorov", - "Xichun" - ) - destination_names = list( - "our headquarters on Earth" - ) - -/datum/lore/organization/tsc/ward_takahashi - name = "Ward-Takahashi General Manufacturing Conglomerate" - short_name = "Ward-Takahashi " - acronym = "WT" - desc = "Ward-Takahashi focuses on the sale of small consumer electronics, with its computers, communicators, \ - and even mid-class automobiles a fixture of many households. Less famously, Ward-Takahashi also supplies most \ - of the AI cores on which vital control systems are mounted, and it is this branch of their industry that has \ - led to their tertiary interest in the development and sale of high-grade AI systems. Ward-Takahashi's economies \ - of scale frequently steal market share from Nanotrasen's high-price products, leading to a bitter rivalry in the \ - consumer electronics market. \ -

\ - Ward-Takahashi are a mild anomaly in the TSC fleet-naming game, as they've opted to use stellar phenomena." - history = "" - work = "electronics manufacturer" - headquarters = "" - motto = "" - - org_type = "corporate" - slogans = list( - "Takahashi Appliances - keeping your home running smoothly.", - "W-T Automotive - keeping you on time, all the time.", - "Ward-Takahashi Electronics - keeping you in touch with the galaxy." - ) - ship_prefixes = list("WTV" = "a general operations", "WTFV" = "a freight", "WTGV" = "a transport", "WTDV" = "an asset protection") - ship_names = list( - "Comet", - "Meteor", - "Heliosphere", - "Bolide", - "Superbolide", - "Aurora", - "Nova", - "Supernova", - "Nebula", - "Galaxy", - "Starburst", - "Constellation", - "Pulsar", - "Quark", - "Void", - "Asteroid", - "Wormhole", - "Sunspot", - "Supercluster", - "Supergiant", - "Protostar", - "Magnetar", - "Moon", - "Supermoon", - "Anomaly", - "Drift", - "Stream", - "Rift", - "Curtain", - "Planetar", - "Quasar", - "Blazar", - "Corona", - "Binary" - ) - destination_names = list() - -/datum/lore/organization/tsc/bishop - name = "Bishop Cybernetics" - short_name = "Bishop " - acronym = "BC" - desc = "Bishop's focus is on high-class, stylish cybernetics. A favorite among transhumanists (and loathed by all \ - bioconservatives), Bishop manufactures not only prostheses but also brain augmentation, synthetic organ replacements, \ - and odds and ends like implanted wrist-watches. Their business model tends towards smaller, boutique operations, giving \ - it a reputation for high price and luxury, with Bishop cyberware often rivalling Vey-Med's for cost. Bishop's reputation \ - for catering towards the interests of human augmentation enthusiasts instead of positronics have earned it ire from the \ - Positronic Rights Group and puts it in ideological (but not economic) competition with Morpheus Cyberkinetics. \ -

\ - Each vessel in Bishop's sleek and stylish fleet is intended to advertise the corporate style, and bears the name of a famous mechanical engineer." - history = "" - work = "cybernetics and augmentation manufacturer" - headquarters = "" - motto = "" - - org_type = "corporate" - slogans = list( - "Bishop Cybernetics - only the best in personal augmentation.", - "Bishop Cybernetics - why settle for flesh when you can have metal?", - "Bishop Cybernetics - make a statement.", - "Bishop Cybernetics - embrace the purity of the machine." - ) - ship_prefixes = list("BCV" = "a general operations", "BCTV" = "a transportation", "BCSV" = "a research exchange") - //famous mechanical engineers - ship_names = list( - "Al-Jazari", - "Al-Muradi", - "Al-Zarqali", - "Archimedes", - "Arkwright", - "Armstrong", - "Babbage", - "Barsanti", - "Benz", - "Bessemer", - "Bramah", - "Brunel", - "Cardano", - "Cartwright", - "Cayley", - "Clement", - "Leonardo da Vinci", - "Diesel", - "Drebbel", - "Fairbairn", - "Fontana", - "Fourneyron", - "Fulton", - "Fung", - "Gantt", - "Garay", - "Hackworth", - "Harrison", - "Hornblower", - "Jacquard", - "Jendrassik", - "Leibniz", - "Ma Jun", - "Maudslay", - "Metzger", - "Murdoch", - "Nasmyth", - "Parsons", - "Rankine", - "Reynolds", - "Roberts", - "Scheutz", - "Sikorsky", - "Somerset", - "Stephenson", - "Stirling", - "Tesla", - "Vaucanson", - "Vishweswarayya", - "Wankel", - "Watt", - "Wiberg" - ) - destination_names = list( - "a medical facility in Angessa's Pearl" - ) - -/datum/lore/organization/tsc/morpheus - name = "Morpheus Cyberkinetics" - short_name = "Morpheus " - acronym = "MC" - desc = "The only large corporation run by positronic intelligences, Morpheus caters almost exclusively to their sensibilities \ - and needs. A product of the synthetic colony of Shelf, Morpheus eschews traditional advertising to keep their prices low and \ - relied on word of mouth among positronics to reach their current economic dominance. Morpheus in exchange lobbies heavily for \ - positronic rights, sponsors positronics through their Jans-Fhriede test, and tends to other positronic concerns to earn them \ - the good-will of the positronics, and the ire of those who wish to exploit them. \ -

\ - Morpheus' fleet bears the names of periodic elements. They initially wanted to go with complex compounds, but realized that \ - such designations would be unwieldy and inefficient for regular usage. In the event that multiple ships are working together, \ - they may use the periodic element as their flotilla designation, and a numerical identifier that corresponds with an isotope \ - of that element for individual ships." - history = "" - work = "cybernetics manufacturer" - headquarters = "Shelf flotilla" - motto = "" - - org_type = "neutral" //disables slogans for morpheus as they don't advertise, per the description above - /* - slogans = list() - */ - ship_prefixes = list("MCV" = "a general operations", "MTV" = "a freight", "MDV" = "a market protection", "MSV" = "an outreach") - //periodic elements; something 'unusual' for the posibrain TSC without being full on 'quirky' culture ship names (much as I love them, they're done to death) - ship_names = list( - "Hydrogen", - "Helium", - "Lithium", - "Beryllium", - "Boron", - "Carbon", - "Nitrogen", - "Oxygen", - "Fluorine", - "Neon", - "Sodium", - "Magnesium", - "Aluminium", - "Silicon", - "Phosphorus", - "Sulfur", - "Chlorine", - "Argon", - "Potassium", - "Calcium", - "Scandium", - "Titanium", - "Vanadium", - "Chromium", - "Manganese", - "Iron", - "Cobalt", - "Nickel", - "Copper", - "Zinc", - "Gallium", - "Germanium", - "Arsenic", - "Selenium", - "Bromine", - "Krypton", - "Rubidium", - "Strontium", - "Yttrium", - "Zirconium", - "Niobium", - "Molybdenum", - "Technetium", - "Ruthenium", - "Rhodium", - "Palladium", - "Silver", - "Cadmium", - "Indium", - "Tin", - "Antimony", - "Tellurium", - "Iodine", - "Xenon", - "Caesium", - "Barium" - ) - //some hebrew alphabet destinations for a little extra unusualness - destination_names = list( - "our headquarters, the Shelf flotilla", - "one of our factory complexes on Root", - "research outpost Aleph", - "logistics depot Dalet", - "research installation Zayin", - "research base Tsadi", - "manufacturing facility Samekh" - ) - -/datum/lore/organization/tsc/xion - name = "Xion Manufacturing Group" - short_name = "Xion " - acronym = "XMG" - desc = "Xion, quietly, controls most of the market for industrial equipment, especially on the frontier. Their portfolio includes mining exosuits, \ - factory equipment, rugged positronic chassis, and other pieces of equipment vital to the function of the economy. Xion \ - keeps its control of the market by leasing, not selling, their equipment, and through infamous and bloody patent protection \ - lawsuits. Xion are noted to be a favorite contractor for Commonwealth engineers, owing to their low cost and rugged design. \ - Dedicated frontiersmen tend to have an unfavorable view of the company however, as the leasing arrangements often make field repairs \ - challenging at best, and expensively contract-breaking at worst. Nobody wants an expensive piece of equipment to break down \ - three weeks of travel away from the closest Licensed Xion Repair Outlet. \ -

\ - Xion's fleet bears the name of mountains and terrain features on Mars." - history = "" - work = "industrial equipment manufacturer" - headquarters = "" - motto = "" - - org_type = "corporate" - slogans = list( - "Xion Manufacturing - We have what you need.", - "Xion Manufacturing - The #1 choice of the SolCom Engineer's Union for 150 years.", - "Xion Manufacturing - Our products are as bulletproof as our contracts." - ) - ship_prefixes = list("XMV" = "a general operations", "XTV" = "a hauling", "XFV" = "a bulk transport", "XIV" = "a resupply") - //martian mountains - ship_names = list( - "Olympus Mons", - "Ascraeus Mons", - "Arsia Mons", - "Pavonis Mons", - "Elysium Mons", - "Hecates Tholus", - "Albor Tholus", - "Tharsis Tholus", - "Biblis Tholus", - "Alba Mons", - "Ulysses Tholus", - "Mount Sharp", - "Uranius Mons", - "Anseris Mons", - "Hadriacus Mons", - "Euripus Mons", - "Tyrrhenus Mons", - "Promethei Mons", - "Chronius Mons", - "Apollinaris Mons", - "Gonnus Mons", - "Syrtis Major Planum", - "Amphitrites Patera", - "Nili Patera", - "Pityusa Patera", - "Malea Patera", - "Peneus Patera", - "Labeatis Mons", - "Issidon Paterae", - "Pindus Mons", - "Meroe Patera", - "Orcus Patera", - "Oceanidum Mons", - "Horarum Mons", - "Peraea Mons", - "Octantis Mons", - "Galaxius Mons", - "Hellas Planitia" - ) - destination_names = list() - -/datum/lore/organization/tsc/ftu - name = "Free Trade Union" - short_name = "Trade Union " - acronym = "FTU" - desc = "The Free Trade Union is different from other transtellar companies in that they are not just a company; rather, they are a big conglomerate of various traders and merchants from all over the galaxy. The FTU is also partially responsible for many of the large scale 'freeport' trade stations across the known galaxy, even in non-human space. Generally, they are multi-purpose stations but they always keep areas filled with duty-free shops, where almost anything you can imagine can be found - so long as it's not outrageously illegal or hideously expensive.

They are the creators of the Tradeband language, created specially for being a lingua franca where every merchant can understand each other independent of language or nationality.

The Union doesn't maintain a particularly large fleet of its own; most members are card-carrying independents who fly under their own flags. When you do see a Union ship (they usually operate under the names of historic merchants) you can be assured that it's tending to something that the Union sees as being of the utmost importance to its interests." - history = "" - work = "" - headquarters = "" - motto = "" - - org_type = "corporate" - slogans = list( - "The FTU. We look out for the little guy.", - "There's no Trade like Free Trade.", - "There's no Union like the Free Trade Union.", - "Join the Free Trade Union. Because anything worth doing, is worth doing for money." //rule of acquisition #13 - ) - ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment") - //famous merchants and traders, taken from Civ6's Great Merchants, plus the TSC's founder - ship_names = list( - "Isaac Adler", - "Colaeus", - "Marcus Licinius Crassus", - "Zhang Qian", - "Irene of Athens", - "Marco Polo", - "Piero de' Bardi", - "Giovanni de' Medici", - "Jakob Fugger", - "Raja Todar Mal", - "Adam Smith", - "John Jacob Astor", - "John Spilsbury", - "John Rockefeller", - "Sarah Breedlove", - "Mary Katherine Goddard", - "Helena Rubenstein", - "Levi Strauss", - "Melitta Bentz", - "Estee Lauder", - "Jamsetji Tata", - "Masaru Ibuka", - ) - destination_names = list( - "a Free Trade Union office", - "FTU HQ" - ) - -/datum/lore/organization/tsc/mbt - name = "Major Bill's Transportation" - short_name = "Major Bill's " - acronym = "MBT" - desc = "The most popular courier service and starliner, Major Bill's is an unassuming corporation whose greatest asset is their low cost and brand recognition. Major Bill's is known, perhaps unfavorably, for its mascot, Major Bill, a cartoonish military figure that spouts quotable slogans. Their main slogan, featured at least once in all their advertising, is \"With Major Bill's, you won't pay major bills!\", an earworm much of the galaxy longs to forget. \ -

\ - Their ships are named after some of Earth's greatest rivers." - history = "" - work = "courier and passenger transit" - headquarters = "Mars, Sol" - motto = "With Major Bill's, you won't pay major bills!" - - org_type = "corporate" - slogans = list( - "With Major Bill's, you won't pay major bills!", - "Major Bill's - Private Couriers - General Shipping!", - "Major Bill's got you covered, now get out there!" - ) - ship_prefixes = list("TTV" = "a general operations", "TTV" = "a transport", "TTV" = "a luxury transit", "TTV" = "a priority transit", "TTV" = "a secure data courier") - //ship names: big rivers - ship_names = list ( - "Nile", - "Kagera", - "Nyabarongo", - "Mwogo", - "Rukarara", - "Amazon", - "Ucayali", - "Tambo", - "Ene", - "Mantaro", - "Yangtze", - "Mississippi", - "Missouri", - "Jefferson", - "Beaverhead", - "Red Rock", - "Hell Roaring", - "Yenisei", - "Angara", - "Yelenge", - "Ider", - "Ob", - "Irtysh", - "Rio de la Plata", - "Parana", - "Rio Grande", - "Congo", - "Chambeshi", - "Amur", - "Argun", - "Kherlen", - "Lena", - "Mekong", - "Mackenzie", - "Peace", - "Finlay", - "Niger", - "Brahmaputra", - "Tsangpo", - "Murray", - "Darling", - "Culgoa", - "Balonne", - "Condamine", - "Tocantins", - "Araguaia", - "Volga" - ) - destination_names = list( - "Major Bill's Transportation HQ on Mars", - "a Major Bill's warehouse", - "a Major Bill's distribution center", - "a Major Bill's supply depot" - ) - -/datum/lore/organization/tsc/grayson - name = "Grayson Manufactories Ltd." - short_name = "Grayson " - acronym = "GM" - desc = "Grayson Manufactories Ltd. is one of the oldest surviving TSCs, having been in 'the biz' almost since mankind began to colonize the rest of the Sol system and thus exploit abundant 'extraterrestrial' resources. Where many choose to go into the high end markets, however, Grayson makes their money by providing foundations for other businesses; they run some of the largest mining and refining operations in all of human-inhabited space. Ore is hauled out of Grayson-owned mines, transported on Grayson-owned ships, and processed in Grayson-owned refineries, then sold by Grayson-licensed vendors to other industries. Several of their relatively newer ventures include heavy industrial equipment, which has earned a reputation for being surprisingly reliable.

Grayson may maintain a neutral stance towards their fellow TSCs, but can be quite aggressive in the markets that it already holds. A steady stream of rumors suggests they're not shy about engaging in industrial sabotage or calling in strikebreakers, either. \ -

\ - Fitting their 'down to earth' reputation, Grayson's corporate fleet uses the names of various forms of rock and mineral to identify their vessels." - history = "" - work = "" - headquarters = "Mars, Sol" - motto = "" - - org_type = "corporate" - slogans = list( - "Grayson Mining - It's An Ore Effort, For The War Effort!", - "Grayson Mining - Winning The War On Ore!", - "Grayson Mining - Come On Down To Our Ore Chasm!" - ) - ship_prefixes = list("GMV" = "a general operations", "GMT" = "a transport", "GMR" = "a resourcing", "GMS" = "a surveying", "GMH" = "a bulk transit") - //rocks - ship_names = list( - "Adakite", - "Andesite", - "Basalt", - "Basanite", - "Diorite", - "Dunite", - "Gabbro", - "Granite", - "Harzburgite", - "Ignimbrite", - "Kimberlite", - "Komatiite", - "Norite", - "Obsidian", - "Pegmatite", - "Picrite", - "Pumice", - "Rhyolite", - "Scoria", - "Syenite", - "Tachylyte", - "Wehrlite", - "Arkose", - "Chert", - "Dolomite", - "Flint", - "Laterite", - "Marl", - "Oolite", - "Sandstone", - "Shale", - "Anthracite", - "Gneiss", - "Granulite", - "Mylonite", - "Schist", - "Skarn", - "Slate" - ) - destination_names = list( - "our headquarters on Mars", - "one of our manufacturing complexes", - "one of our mining installations" - ) - -/datum/lore/organization/tsc/aether - name = "Aether Atmospherics & Recycling" - short_name = "Aether " - acronym = "AAR" - desc = "Aether Atmospherics and Recycling is the prime maintainer and provider of atmospherics systems across both the many ships that navigate the vast expanses of space, and the life support on current and future Human colonies. The byproducts from the filtration of atmospheres across the galaxy are then resold for a variety of uses to those willing to buy. With the nature of their services, most work they do is contracted for construction of these systems, or staffing to maintain them for colonies across human space. \ -

\ - Somewhat unimaginatively, Aether has adopted the names of various types of weather for their fleet." - history = "" - work = "" - headquarters = "" - motto = "Dum spiro spero" - - org_type = "corporate" - slogans = list( - "Aether A&R - We're Absolutely Breathtaking.", - "Aether A&R - You Can Breathe Easy With Us!", - "Aether A&R - The SolCom's #1 Environmental Systems Provider." - ) - ship_prefixes = list("AARV" = "a general operations", "AARE" = "a resource extraction", "AARG" = "a gas transport", "AART" = "a transport") - //weather systems/patterns - ship_names = list ( - "Cloud", - "Nimbus", - "Fog", - "Vapor", - "Haze", - "Smoke", - "Thunderhead", - "Veil", - "Steam", - "Mist", - "Noctilucent", - "Nacreous", - "Cirrus", - "Cirrostratus", - "Cirrocumulus", - "Aviaticus", - "Altostratus", - "Altocumulus", - "Stratus", - "Stratocumulus", - "Cumulus", - "Fractus", - "Asperitas", - "Nimbostratus", - "Cumulonimbus", - "Pileus", - "Arcus" - ) - destination_names = list( - "Aether HQ", - "a gas mining orbital", - "a liquid extraction plant" - ) - -/datum/lore/organization/tsc/focalpoint - name = "Focal Point Energistics" - short_name = "Focal " - acronym = "FPE" - desc = "Focal Point Energistics is an electrical engineering solutions firm originally formed as a conglomerate of Earth power companies and affiliates. Focal Point manufactures and distributes vital components in modern power grids, such as TEGs, PSUs and their specialty product, the SMES. The company is often consulted and contracted by larger organisations due to their expertise in their field.\ -

\ - Keeping in theme with the other big TSCs, Focal's fleet (which is comprised almost entirely of transports and engineering vessels) uses the names of electrical engineers." - history = "" - work = "" - headquarters = "" - motto = "" - - org_type = "corporate" - slogans = list( - "Focal Point Energistics - Sustainable Power for a Sustainable Future.", - "Focal Point Energistics - Powering The Future Before It Even Happens.", - "Focal Point Energistics - Let There Be Light." - ) - ship_prefixes = list("FPV" = "a general operations", "FPH" = "a transport", "FPC" = "an energy relay", "FPT" = "a fuel transport") - //famous electrical engineers - ship_names = list ( - "Erlang", - "Blumlein", - "Taylor", - "Bell", - "Reeves", - "Bennett", - "Volta", - "Blondel", - "Beckman", - "Hirst", - "Lamme", - "Bright", - "Armstrong", - "Ayrton", - "Bardeen", - "Fuller", - "Boucherot", - "Brown", - "Brush", - "Burgess", - "Camras", - "Crompton", - "Deprez", - "Elwell", - "Entz", - "Faraday", - "Halas", - "Hounsfield", - "Immink", - "Laithwaite", - "McKenzie", - "Moog", - "Moore", - "Pierce", - "Ronalds", - "Shallenberger", - "Siemens", - "Spencer", - "Tesla", - "Yablochkov", - ) - destination_names = list( - "Focal Point HQ" - ) - -/datum/lore/organization/tsc/starlanes - name = "StarFlight Inc." - short_name = "StarFlight " - acronym = "SFI" - desc = "Founded in 2137 by Astara Junea, StarFlight Incorporated is now one of the biggest passenger liner businesses in human-occupied space and has even begun breaking into alien markets - all despite a rocky start, and several high-profile ship disappearances and shipjackings. With space traffic at an all-time high, it's a depressing reality that SFI's incidents are just a tiny drop in the bucket compared to everything else going on. \ -

\ - SFI's fleet is, somewhat endearingly, named after various species of bird, though the designation Pigeon was removed from the lineup after a particularly unusual chain of events involving a business liner. For reasons that have continued to remain unclear since the company's foundation, SFI vessels are permitted to use the same high-level identifier pattern as governmental vessels." - history = "" - work = "luxury, business, and economy passenger flights" - headquarters = "Spin Aerostat, Jupiter" - motto = "Sic itur ad astra" - - org_type = "corporate" - slogans = list( - "StarFlight - travel the stars.", - "StarFlight - bringing you to new horizons.", - "StarFlight - getting you where you need to be since 2137." - ) - ship_prefixes = list("SFI-X" = "a VIP liner", "SFI-L" = "a luxury liner", "SFI-B" = "a business liner", "SFI-E" = "an economy liner", "SFI-M" = "a mixed class liner", "SFI-S" = "a sightseeing", "SFI-M" = "a wedding", "SFI-O" = "a marketing", "SFI-S" = "a safari", "SFI-A" = "an aquatic adventure") - flight_types = list( //no military-sounding ones here - "flight", - "route", - "tour" - ) - ship_names = list( //birbs - "Rhea", - "Ostrich", - "Cassowary", - "Emu", - "Kiwi", - "Duck", - "Swan", - "Chachalaca", - "Curassow", - "Guan", - "Guineafowl", - "Pheasant", - "Turkey", - "Francolin", - "Loon", - "Penguin", - "Grebe", - "Flamingo", - "Stork", - "Ibis", - "Heron", - "Pelican", - "Spoonbill", - "Shoebill", - "Gannet", - "Cormorant", - "Osprey", - "Kite", - "Hawk", - "Falcon", - "Caracara" - ) - destination_names = list( - "a resort planet", - "a beautiful ring system", - "a ski-resort world", - "an ocean resort planet", - "a desert resort world", - "an arctic retreat" - ) - -/datum/lore/organization/tsc/oculum - name = "Oculum Broadcasting Network" - short_name = "Oculus " - acronym = "OBN" - desc = "Oculum owns approximately 30% of Sol-wide news networks, including microblogging aggregate sites, network and comedy news, and even old-fashioned newspapers. Staunchly apolitical, they specialize in delivering the most popular news available- which means telling people what they already want to hear. Oculum is a specialist in branding, and most people don't know that the reactionary Daedalus Dispatch newsletter and the radically transhuman Liquid Steel webcrawler are controlled by the same organization." - history = "" - work = "news media" - headquarters = "" - motto = "News from all across the spectrum" - - org_type = "corporate" - slogans = list( - "Oculum - All News, All The Time.", - "Oculum - We Keep An Eye Out.", - "Oculum - Nothing But The Truth.", - "Oculum - Your Eye On The Galaxy." - ) - ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations") - destination_names = list( - "Oculus HQ" - ) - -/datum/lore/organization/tsc/centauriprovisions - name = "Centauri Provisions" - short_name = "Centauri " - acronym = "ACP" - desc = "Headquartered in Alpha Centauri, Centauri Provisions made a name in the snack-food industry primarily by being the first to focus on colonial holdings. The various brands of Centauri snackfoods are now household names, from SkrellSnax to Space Mountain Wind to the ubiquitous and supposedly-edible Bread Tube, and they are well known for targeting as many species as possible with each brand (which, some will argue, is at fault for some of those brands being rather bland in taste and texture). Their staying power is legendary, and many spacers have grown up on a mix of their cheap crap and protein shakes." - history = "" - work = "catering, food, drinks" - headquarters = "Alpha Centauri" - motto = "The largest brands of food and drink - most of them are Centauri." - - org_type = "corporate" - slogans = list( - "Centauri Provisions Bread Tubes - They're Not Just Edible, They're |Breadible!|", - "Centauri Provisions SkrellSnax - Not |Just| For Skrell!", - "Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!", - "Centauri Provisions Syndi-Cakes - A Taste So Good You'll Swear It's |Illegal|!", - "Centauri Provisions Tuna Snax - There's Nothing |Fishy| Going On Here!" - ) - ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations") - destination_names = list( - "Centauri Provisions HQ", - "a Centauri Provisions depot", - "a Centauri Provisions warehouse" - ) - -/datum/lore/organization/tsc/einstein - name = "Einstein Engines" - short_name = "Einstein " - acronym = "EEN" - desc = "Einstein is an old company that has survived through rampant respecialization. In the age of phoron-powered exotic engines and ubiquitous solar power, Einstein makes its living through the sale of engine designs for power sources it has no access to, and emergency fission or hydrocarbon power supplies. Accusations of corporate espionage against research-heavy corporations like NanoTrasen and its chief rival Focal Point are probably unfounded. Probably." - history = "" - work = "catering, food, drinks" - headquarters = "" - motto = "Engine designs, emergency generators, and old memories" - - org_type = "corporate" - slogans = list( - "Einstein Engines - you don't have to be Einstein to use |our| engines!", - "Einstein Engines - bringing power to the people.", - "Einstein Engines - because it's the smart thing to do." - ) - ship_prefixes = list("EETV" = "a transport", "EERV" = "a research", "EEV" = "a general operations") - destination_names = list( - "Einstein HQ" - ) - -/datum/lore/organization/tsc/wulf - name = "Wulf Aeronautics" - short_name = "Wulf Aero " - acronym = "WUFA" - desc = "Wulf Aeronautics is the chief producer of transport and hauling spacecraft. A favorite contractor of the CWS, Wulf manufactures most of their diplomatic and logistics craft, and does a brisk business with most other TSCs. The quiet reliance of the economy on their craft has kept them out of the spotlight and uninvolved in other corporations' back-room dealings; nobody is willing to try to undermine Wulf Aerospace in case it bites them in the ass, and everyone knows that trying to buy out the company would start a bidding war from which nobody would escape the PR fallout." - history = "" - work = "starship construction" - headquarters = "" - motto = "We build it - you fly it" - - org_type = "corporate" - slogans = list( - "Wulf Aeronautics. We build it - you fly it.", - "Wulf Aeronautics, the Commonwealth's favorite shipwrights.", - "Wulf Aeronautics, building tomorrow's ships today." - ) - ship_prefixes = list("WATV" = "a transport", "WARV" = "a repair", "WAV" = "a general operations") - destination_names = list( - "Wulf Aeronautics HQ", - "a Wulf Aeronautics supply depot", - "a Wulf Aeronautics Shipyard" - ) - -/datum/lore/organization/tsc/gilthari - name = "Gilthari Exports" - short_name = "Gilthari " - acronym = "GEX" - desc = "Gilthari is Sol's premier supplier of luxury goods, specializing in extracting money from the rich and successful that aren't already their own shareholders. Their largest holdings are in gambling, but they maintain subsidiaries in everything from VR equipment to luxury watches. Their holdings in mass media are a smaller but still important part of their empire. Gilthari is known for treating its positronic employees very well, sparking a number of conspiracy theories. The gorgeous FBP model that Gilthari provides them is a symbol of the corporation's wealth and reach ludicrous prices when available on the black market, with legal ownership of the chassis limited, by contract, to employees.

In fitting with their heritage, Gilthari ships are named after precious stones." - history = "" - work = "luxury goods" - headquarters = "" - motto = "" - - org_type = "corporate" - slogans = list( - "Why choose |luxury| when you can choose |Gilthari|?", - "|Gilthari|. Because |you're| worth it.", - "|Gilthari|. Why settle for |anything| less?" - ) - ship_prefixes = list("GETV" = "a transport", "GECV" = "a luxury catering", "GEV" = "a general operations") - //precious stones - ship_names = list( - "Afghanite", - "Agate", - "Alexandrite", - "Amazonite", - "Amber", - "Amethyst", - "Ametrine", - "Andalusite", - "Aquamarine", - "Azurite", - "Benitoite", - "Beryl", - "Carnelian", - "Chalcedony", - "Chrysoberyl", - "Chrysoprase", - "Citrine", - "Coral", - "Danburite", - "Diamond", - "Emerald", - "Fluorite", - "Garnet", - "Heliodor", - "Iolite", - "Jade", - "Jasper", - "Lapis Lazuli", - "Malachite", - "Moldavite", - "Moonstone", - "Obsidian", - "Onyx", - "Orthoclase", - "Pearl", - "Peridot", - "Quartz", - "Ruby", - "Sapphire", - "Scapolite", - "Selenite", - "Serpentine", - "Sphalerite", - "Sphene", - "Spinel", - "Sunstone", - "Tanzanite", - "Topaz", - "Tourmaline", - "Turquoise", - "Zircon" - ) - destination_names = list( - "Gilthari HQ", - "a GE supply depot", - "a GE warehouse", - "a GE-owned luxury resort" - ) - -/datum/lore/organization/tsc/coyotecorp - name = "Coyote Salvage Corp." - short_name = "Coyote " - acronym = "CSC" - desc = "The threat of Kessler Syndrome ever looms in this age of spaceflight, and it's only thanks to the dedication and hard work of unionized salvage groups like the Coyote Salvage Corporation that the spacelanes are kept clear and free of wrecks and debris. Painted in that distinctive industrial yellow, their fleets of roaming scrappers are contracted throughout civilized space and the frontier alike to clean up space debris. Some may look down on them for handling what would be seen as garbage and discarded scraps, but as far as the CSC is concerned everything would grind to a halt (or more accurately, rapidly expand in a cloud of red-hot scrap metal) without their tender care and watchful eyes.\ -

\ - Many spacers turn to join the ranks of the Salvage Corps when times are lean, or when they need a quick buck. The work is dangerous and the hours are long, but the benefits are generous and you're paid by what you salvage so if you've an eye for appraising scrap you can turn a good profit. For those who dedicate their lives to the work, they can become kings of the scrapheap and live like royalty. \ -

\ - CSC Contractors are no strangers to conflict either, often having to deal with claimjumpers and illegal salvage operations - or worse, the vox." - history = "" - work = "salvage and shipbreaking" - headquarters = "N/A" - motto = "one man's trash is another man's treasure" - - org_type = "corporate" - slogans = list( - "Coyote Salvage Corp. 'cause your trash ain't gonna clean itself.", - "Coyote Salvage Corp. 'cause one man's trash is another man's treasure.", - "Coyote Salvage Corp. We'll take your scrap - but not your crap." - ) - ship_prefixes = list("CSV" = "a salvage", "CRV" = "a recovery", "CTV" = "a transport", "CSV" = "a shipbreaking", "CHV" = "a towing") - //mostly-original, maybe some references, and more than a few puns - ship_names = list( - "Road Hog", - "Mine, Not Yours", - "Legal Salvage", - "Barely Legal", - "One Man's Trash", - "Held Together By Tape And Dreams", - "Ventilated Vagrant", - "Half A Wing And A Prayer", - "Scrap King", - "Make Or Break", - "Lead Into Gold", - "Under New Management", - "Pride of Centauri", - "Long Haul", - "Argonaut", - "Desert Nomad", - "Non-Prophet Organization", - "Rest In Pieces", - "Sweep Dreams", - "Home Sweep Home", - "Atomic Broom", - "Ship Broken", - "Rarely Sober", - "Barely Coherent", - "Piece Of Mind", - "War And Pieces", - "Bits 'n' Bobs", - "Home Wrecker", - "T-Wrecks", - "Dust Bunny", - "No Gears No Glory", - "Three Drinks In", - "The Almighty Janitor", - "Wreckless Endangerment", - "Scarab" - ) - //remove a couple types, add the more down-to-earth 'job' to reflect some personality - flight_types = list( - "job", - "op", - "operation", - "assignment", - "contract" - ) - destination_names = list ( - "a frontier scrapyard", - "a trashbelt", - "a local salvage yard", - "a nearby system" - ) - -/datum/lore/organization/tsc/chimera - name = "Chimera Genetics Corp." - short_name = "Chimera " - acronym = "CGC" - desc = "With the rise of personal body modification, companies specializing in this field were bound to spring up as well. The Chimera Genetics Corporation, or CGC, is one of the largest and most successful competitors in this ever-evolving and ever-adapting field. They originally made a foothold in the market through designer flora and fauna such as \"factory plants\" and \"fabricowtors\"; imagine growing high-strength carbon nanotubes on vines, or goats that can be milked for a substance with the tensile strength of spider silk. Once they had more funding? Chimera aggressively expanded into high-end designer bodies, both vat-grown-from-scratch and modification of existing bodies via extensive therapy procedures. Their best-known designer critter is the Drake line; hardy, cold-tolerant \'furred lizards\' that are unflinchingly loyal to their contract-holders. Drakes find easy work in heavy industries and bodyguard roles, despite constant lobbying from bioconservatives to, quote, \"keep these \"meat drones\" from taking jobs away from regular people.\" \ -

\ - Some things never change. \ -

\ - Unsurprisingly, Chimera names their ships after mythological creatures." - history = "" - work = "designer bodies and bioforms" - headquarters = "Titan, Sol" - motto = "the whole is greater than the sum of its parts" - - org_type = "corporate" - slogans = list( - "Chimera Genetics. Find your true self today!", - "Chimera Genetics. Bring us your genes and we'll clean them right up.", - "Chimera Genetics. Better bodies for a better tomorrow." - ) - ship_prefixes = list("CGV" = "a general operations", "CGT" = "a transport", "CGT" = "a delivery", "CGH" = "a medical") - //edgy mythological critters! - ship_names = list( - "Dragon", - "Chimera", - "Titan", - "Hekatonchires", - "Gorgon", - "Scylla", - "Minotaur", - "Banshee", - "Basilisk", - "Black Dog", - "Centaur", - "Cerberus", - "Charybdis", - "Cyclops", - "Cynocephalus", - "Demon", - "Daemon", - "Echidna", - "Goblin", - "Golem", - "Griffin", - "Hobgoblin", - "Hydra", - "Imp", - "Ladon", - "Manticore", - "Medusa", - "Ogre", - "Pegasus", - "Sasquatch", - "Shade", - "Siren", - "Sphinx", - "Typhon", - "Valkyrie", - "Vampir", - "Wendigo", - "Werewolf", - "Wraith" - ) - destination_names = list ( - "Chimera HQ, Titan", - "a Chimera research lab" - ) - -////////////////////////////////////////////////////////////////////////////////// - -// Other -/datum/lore/organization/other/kitsuhana //sorry KHI, but you're not a coherent stellar government, and you're definitely not a TSC. you get to go in the Others pool. //makes sense to me! - name = "Kitsuhana Heavy Industries" - short_name = "" //whitespace haaaack - desc = "A large post-scarcity amalgamation of races, Kitsuhana is no longer a company but rather a loose association of 'members' \ - who only share the KHI name and their ideals in common. Kitsuhana accepts interviews to join their ranks, and though they have no \ - formal structure with regards to government or law, the concept of 'consent' drives most of the large decision making. Kitsuhanans \ - pride themselves on their ability to avoid consequence, essentially preferring to live care-free lives. Their post-scarcity allows \ - them to rebuild, regrow, and replenish almost any lost asset or resource nearly instantly. It leads to many of the Kitsuhana \ - 'members' treating everything with frivolity and lends them a care-free demeanor." - history = "Originally a heavy industrial equipment and space mining company. During a forced evacuation of their homeworld, \ - they were the only organization with enough ship capacity to relocate any significant portion of the population, starting with \ - their own employees. After the resulting slowship travel to nearby starsystems, most of the population decided to keep the moniker \ - of the company name. Over the years, Kitsuhana developed into a post-scarcity anarchy where virtually nothing has consequences and \ - Kitsuhana 'members' can live their lives as they see fit, often in isolation." - work = "utopian anarchy" - headquarters = "Kitsuhana Prime" - motto = "Do what you want. We know we will." - - //Culture ship names! - ship_prefixes = list("KHI" = "personal") //Everybody's out for themselves, yanno. - ship_names = list( - "Nervous Energy", - "Prosthetic Conscience", - "Revisionist", - "Trade Surplus", - "Flexible Demeanour", - "Just Read The Instructions", - "Limiting Factor", - "Cargo Cult", - "Gunboat Diplomat", - "A Ship With A View", - "Cantankerous", - "I Thought He Was With You", - "Never Talk To Strangers", - "Sacrificial Victim", - "Unwitting Accomplice", - "Bad For Business", - "Just Testing", - "Size Isn't Everything", - "Yawning Angel", - "Liveware Problem", - "Very Little Gravitas Indeed", - "Zero Gravitas", - "Gravitas Free Zone", - "Absolutely No You-Know-What" - ) - destination_names = list( - "Kitsuhana Prime", - "Kitsuhana Beta", - "Kitsuhana Gamma", - "the Kitsuhana Forge", - "a Kitsuhanan's home", - "a Kitsuhana ringworld in Pleis Ceti V", - "a Kitsuhana ringworld in Lund VI", - "a Kitsuhana ringworld in Dais IX", - "a Kitsuhana ringworld in Leibert II-b" - ) - -/datum/lore/organization/other/independent - name = "Independent Pilots Association" - short_name = "" //using the same whitespace hack as USDF - acronym = "IPA" - desc = "Though less common now than they were in the decades before the Sol Economic Organization took power, independent traders remain an important part of the galactic economy, owing in no small part to protective tariffs established by the Free Trade Union in the late twenty-second century. Further out on the frontier, independent pilots are often the only people keeping freight and supplies moving.\ -

\ - Independent ships use a wide variety of names, many of which are as unusual and eclectic as their crews." - history = "" - work = "everything under the sun" - headquarters = "N/A" - motto = "N/A" - - ship_prefixes = list("ISV" = "a general", "IEV" = "a prospecting", "IEC" = "a prospecting", "IFV" = "a bulk freight", "ITV" = "a passenger transport", "ITC" = "a just-in-time delivery", "IPV" = "a patrol", "IHV" = "a bounty hunting", "ICC" = "an escort", "IMV" = "a mining") - flight_types = list( - "flight", - "mission", - "route", - "operation", - "assignment", - "contract" - ) - destination_names = list() //we have no hqs or facilities of our own - //ship names: blank, because we use the universal list - -//SPACE LAW -/datum/lore/organization/other/sysdef - name = "System Defense Force" - short_name = "" //whitespace hack again - acronym = "SDF" - desc = "Localized militias are used to secure systems throughout inhabited space, but are especially common on the frontier; by levying and maintaining these militia forces, larger governments can use their primary fleets (like the USDF) for more important matters and smaller ones can give travellers in their space some peace of mind given the ever-present threat of pirates and vox marauders whilst also helping cut down on smuggling (narcotic substances remain as popular in this century as they have throughout the last few millennia). System Defense Forces tend to be fairly poorly trained and modestly equipped compared to genuine military fleets, but are more than capable of contending with equally ramshackle pirate vessels and can generally stall greater threats long enough for reinforcements to arrive. They're also typically responsible for most search-and-rescue operations in their system.\ -

\ - SDF ships are traditionally named after various forms of historical weaponry; as their founding members tend to be veterans of other SDF services which used this system, this tradition has slowly propagated.\ -

\ - Common SDF ship designations include;
\ - SDF = System Defense Fleet (General)
\ - SDV/SDB = System Defense Vessel/Boat
\ - SAR = Search And Rescue (Emergency Services)
\ - SDT = System Defense Tender (Mobile Refuel & Resupply)
\ - SDJ = Prisoner Transport" - history = "" - work = "local security" - headquarters = "" - motto = "Serve, Protect, Survive" - sysdef = TRUE //we're the space law, we don't impersonate people and stuff - autogenerate_destination_names = FALSE //don't add extra destinations to our pool, or else we leave the system which makes no sense - - org_type = "system defense" - ship_prefixes = list ("SDB" = "a patrol", "SDF" = "a patrol", "SDV" = "a patrol", "SDB" = "an escort", "SDF" = "an escort", "SDV" = "an escort", "SAR" = "a search and rescue", "SDT" = "a logistics", "SDT" = "a resupply", "SDJ" = "a prisoner transport") //b = boat, f = fleet (generic), v = vessel, t = tender - //ship names: weapons - ship_names = list( - "Sword", - "Saber", - "Cutlass", - "Broadsword", - "Katar", - "Shamshir", - "Shashka", - "Epee", - "Estoc", - "Longsword", - "Katana", - "Baselard", - "Gladius", - "Kukri", - "Pick", - "Mattock", - "Hatchet", - "Machete", - "Axe", - "Tomahawk", - "Dirk", - "Dagger", - "Maul", - "Mace", - "Flail", - "Morningstar", - "Shillelagh", - "Cudgel", - "Truncheon", - "Hammer", - "Arbalest", - "Ballista", - "Catapult", - "Trebuchet", - "Longbow", - "Pike", - "Javelin", - "Glaive", - "Halberd", - "Scythe", - "Spear" - ) - destination_names = list( - "the outer system", - "the inner system", - "Waypoint Alpha", - "Waypoint Beta", - "Waypoint Gamma", - "Waypoint Delta", - "Waypoint Epsilon", - "Waypoint Zeta", - "Waypoint Eta", - "Waypoint Theta", - "Waypoint Iota", - "Waypoint Kappa", - "Waypoint Lambda", - "Waypoint Mu", - "Waypoint Nu", - "Waypoint Xi", - "Waypoint Omicron", - "Waypoint Pi", - "Waypoint Rho", - "Waypoint Sigma", - "Waypoint Tau", - "Waypoint Upsilon", - "Waypoint Phi", - "Waypoint Chi", - "Waypoint Psi", - "Waypoint Omega", - "System Defense Control", - "an SDF correctional facility", - "an SDF processing center", - "an SDF supply depot", - "an SDF Rapid Response Hub", - "an SDF outpost" - ) - -//basically just a dummy/placeholder 'org' for smuggler events -/datum/lore/organization/other/smugglers - name = "Smugglers" - short_name = "" //whitespace hack again - acronym = "ISC" - desc = "Where there's a market, there need to be merchants, and where there are buyers, there need to be suppliers. Most of all, wherever there's governments, there'll be somebody trying to control what people are and aren't allowed to do with their bodies. For those seeking goods deemed illegal (for good reasons or otherwise) they need to turn to smugglers and the fine art of sneaking things past the authorities.\ -

\ - The most common goods smuggled throughout space are narcotics, firearms, and occasionally slaves; whilst firearm ownership laws vary from location to location, most governments also take fairly hard stances on hard drugs, and slavery is consistently outlawed and punished viciously throughout the vast majority of civilized space.\ -

\ - Still, contrary to many conceptions, not all smuggling is nefarious. Entertainment media within human territories loves to paint romantic images of heroic smugglers sneaking aid supplies to refugees or even helping oppressed minorities escape the grasp of xenophobic regimes." - history = "" - work = "" - headquarters = "" - motto = "" - lawful = FALSE //if it wasn't obvious, these guys are usually criminals - hostile = FALSE //but they're not aggressive ones - sysdef = FALSE - autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. - - org_type = "smuggler" - ship_prefixes = list ("suspected smuggler" = "an illegal smuggling", "possible smuggler" = "an illegal smuggling") //as assigned by control, second part shouldn't even come up - //blank out our shipnames for redesignation - ship_names = list( - "Morally Bankrupt", - "Bucket of Bolts", - "Wallet Inspector", - "Laughing Stock", - "Wayward Son", - "Wide Load", - "No Refunds", - "Ugly Stick", - "Poetic Justice", - "Foreign Object", - "Why Me", - "Last Straw", - "Designated Driver", - "Slapped Together", - "Lowest Bidder", - "Harsh Language", - "Public Servant", - "Class Act", - "Deviant Citizen", - "Diminishing Returns", - "Calculated Risk", - "Logistical Nightmare", - "Gross Negligence", - "Holier Than Thou", - "Open Wide", - "Red Dread", - "Missing Link", - "Duct Taped", - "Robber Baron", - "Affront to Nature", - "Total Loss", - "Depth Perception", - "This Way", - "Mysterious Rash", - "Jolly Roger", - "Victim of Circumstance", - "Product of Society", - "Under Evaluation", - "Flying Coffin", - "Gilded Cage", - "Disgruntled Worker", - "Of Sound Mind", - "Ivory Tower", - "Bastard Son", - "Scarlet Tentacle", - "Down In Front", - "Learning Experience", - "Desperate Pauper", - "Born Lucky", - "Base Instincts", - "Check Please", - "Infinite Loop", - "Lazy Morning", - "Runtime Error", - "Pointless Platitude", - "Grey Matter", - "Conscientious Objector", - "Unexplained Itch", - "Out of Control", - "Unexpected Obstacle", - "Toxic Behavior", - "Controlled Explosion", - "Happy Camper", - "Unfortunate Ending", - "Criminally Insane", - "Not Guilty", - "Double Jeopardy", - "Perfect Pitch", - "Dark Forecast", - "Apologies in Advance", - "Reduced To This", - "Surprise Encounter", - "Meat Locker", - "Cardiac Arrest", - "Piece of Junk", - "Bottom Line", - "With Abandon", - "Unsound Methods", - "Beast of Burden", - "Red Claw", - "No Laughing Matter", - "Nothing Personal", - "Great Experiment", - "Looks Like Trouble", - "Turning Point", - "Murderous Intent", - "If Looks Could Kill", - "Liquid Courage", - "Attention Seeker", - "Juvenile Delinquent", - "Mystery Meat", - "Slippery Slope", - "Empty Gesture", - "Annoying Pest", - "Killing Implement", - "Blunt Object", - "Blockade Runner", - "Innocent Bystander", - "Lacking Purpose", - "Beyond Salvation", - "This Too Shall Pass", - "Guilty Pleasure", - "Exploratory Surgery", - "Inelegant Solution", - "Under New Ownership", - "Festering Wound", - "Red Smile", - "Mysterious Stranger", - "Process of Elimination", - "Prone to Hysteria", - "Star Beggar", - "Dream Shatterer", - "Do The Math", - "Big Boy", - "Teacher's Pet", - "Hell's Bells", - "Critical Mass", - "Star Wench", - "Double Standard", - "Blind Fury", - "Carrion Eater", - "Pound of Flesh", - "Short Fuse", - "Road Agent", - "Deceiving Looks", - "An Arrow in Flight", - "Gun-to-Head", - "Petty Theft", - "Grand Larceny", - "Pop Up", - "A Promise Kept", - "Frag Machine", - "Unrepentant Camper", - "Impersonal Space", - "Fallen Pillar", - "Motion Tabled", - "Outrageous Fortune", - "Pyrrhic and Proud", - "Wiggling Bait", - "Shoot for Loot", - "Tone Deaf Siren", - "The Worst Thing", - "Violence-Liker", - "Illegal Repercussions", - "Shameless Plagiarist", - "Dove & Crow", - "Barnacle Jim", - "Charles in Charge", - "Strange Aeons", - "Red Queen" - ) - /* - destination_names = list( - ) - */ - -/datum/lore/organization/other/pirates - name = "Pirates" - short_name = "" //whitespace hack again - acronym = "IPG" - desc = "Where there's prey, predators are sure to follow. In space, the prey are civilian merchants, and the predators are opportunistic pirates. This is about where the analogy breaks down, but the basic concept remains the same; civilian ships are usually full of valuable goods or important people, which can be sold on black markets or ransomed back for a healthy sum. Pirates seek to seize the assets of others to get rich, rather than make an honest thaler themselves.\ -

\ - In contrast to the colorful Ue-Katish and sneaky Vox, common pirates tend to be rough, practical, and brutally efficient in their work. System Defense units practice rapid response drills, and in most systems it's only a matter of minutes before The Law arrives unless the pirate is able to isolate their target and prevent them from sending a distress signal.\ -

\ - Complicating matters is the infrequent use of privateers by various minor colonial governments, mercenaries turning to piracy during hard times, and illegal salvage operations." - history = "" - work = "" - headquarters = "" - motto = "What\'s yours is mine." - lawful = FALSE - hostile = TRUE - autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need entries to avoid runtimes. - - org_type = "pirate" - ship_prefixes = list ("known pirate" = "a piracy", "suspected pirate" = "a piracy", "rogue privateer" = "a piracy", "Cartel enforcer" = "a piracy", "known outlaw" = "a piracy", "bandit" = "a piracy", "roving corsair" = "a piracy", "illegal salvager" = "an illegal salvage", "rogue mercenary" = "a mercenary") //as assigned by control, second part shouldn't even come up, but it exists to avoid hiccups/weirdness just in case - ship_names = list( - "Morally Bankrupt", - "Bucket of Bolts", - "Wallet Inspector", - "Laughing Stock", - "Wayward Son", - "Wide Load", - "No Refunds", - "Ugly Stick", - "Poetic Justice", - "Foreign Object", - "Why Me", - "Last Straw", - "Designated Driver", - "Slapped Together", - "Lowest Bidder", - "Harsh Language", - "Public Servant", - "Class Act", - "Deviant Citizen", - "Diminishing Returns", - "Calculated Risk", - "Logistical Nightmare", - "Gross Negligence", - "Holier Than Thou", - "Open Wide", - "Red Dread", - "Missing Link", - "Duct Taped", - "Robber Baron", - "Affront to Nature", - "Total Loss", - "Depth Perception", - "This Way", - "Mysterious Rash", - "Jolly Roger", - "Victim of Circumstance", - "Product of Society", - "Under Evaluation", - "Flying Coffin", - "Gilded Cage", - "Disgruntled Worker", - "Of Sound Mind", - "Ivory Tower", - "Bastard Son", - "Scarlet Tentacle", - "Down In Front", - "Learning Experience", - "Desperate Pauper", - "Born Lucky", - "Base Instincts", - "Check Please", - "Infinite Loop", - "Lazy Morning", - "Runtime Error", - "Pointless Platitude", - "Grey Matter", - "Conscientious Objector", - "Unexplained Itch", - "Out of Control", - "Unexpected Obstacle", - "Toxic Behavior", - "Controlled Explosion", - "Happy Camper", - "Unfortunate Ending", - "Criminally Insane", - "Not Guilty", - "Double Jeopardy", - "Perfect Pitch", - "Dark Forecast", - "Apologies in Advance", - "Reduced To This", - "Surprise Encounter", - "Meat Locker", - "Cardiac Arrest", - "Piece of Junk", - "Bottom Line", - "With Abandon", - "Unsound Methods", - "Beast of Burden", - "Red Claw", - "No Laughing Matter", - "Nothing Personal", - "Great Experiment", - "Looks Like Trouble", - "Turning Point", - "Murderous Intent", - "If Looks Could Kill", - "Liquid Courage", - "Attention Seeker", - "Juvenile Delinquent", - "Mystery Meat", - "Slippery Slope", - "Empty Gesture", - "Annoying Pest", - "Killing Implement", - "Blunt Object", - "Blockade Runner", - "Innocent Bystander", - "Lacking Purpose", - "Beyond Salvation", - "This Too Shall Pass", - "Guilty Pleasure", - "Exploratory Surgery", - "Inelegant Solution", - "Under New Ownership", - "Festering Wound", - "Red Smile", - "Mysterious Stranger", - "Process of Elimination", - "Prone to Hysteria", - "Star Beggar", - "Dream Shatterer", - "Do The Math", - "Big Boy", - "Teacher's Pet", - "Hell's Bells", - "Critical Mass", - "Star Wench", - "Double Standard", - "Blind Fury", - "Carrion Eater", - "Pound of Flesh", - "Short Fuse", - "Road Agent", - "Deceiving Looks", - "An Arrow in Flight", - "Gun-to-Head", - "Petty Theft", - "Grand Larceny", - "Pop Up", - "A Promise Kept", - "Frag Machine", - "Unrepentant Camper", - "Impersonal Space", - "Fallen Pillar", - "Motion Tabled", - "Outrageous Fortune", - "Pyrrhic and Proud", - "Wiggling Bait", - "Shoot for Loot", - "Tone Deaf Siren", - "The Worst Thing", - "Violence-Liker", - "Illegal Repercussions", - "Shameless Plagiarist", - "Dove & Crow", - "Barnacle Jim", - "Charles in Charge", - "Strange Aeons", - "Red Queen" - ) - /* - destination_names = list( - ) - */ - -/datum/lore/organization/other/uekatish - name = "Ue-Katish Pirates" - short_name = "" - acronym = "UEK" - desc = "Contrasting with the Qerr-Glia is a vibrant community of Ue-Katish pirates, who live in cargo flotillas on the edge of Skrellian space (especially on the Human-Skrell border). Ue-Katish ships have no caste system even for the truecaste Skrell and aliens who live there, although they are regimented by rank and role in the ship's functioning. Ue-Katish ships are floating black markets where everything is available for the right price, including some of the galaxy's most well-connected information brokers and most skilled guns-for-hire. The Ue-Katish present the greatest Skrellian counterculture and feature heavily in romanticized human media, although at their hearts they are still bandits and criminals, and the black markets are filled with goods plundered from human and Skrellian trade ships. Many of the Ue-Katish ships themselves bear the scars of the battle that brought them under the pirate flag.\ -

\ - Ue-Katish pirate culture is somewhat similar to many human countercultures, gleefully reclaiming slurs and subverting expectations for the sheer shock value. Nonetheless, Ue-Katish are still Skrell, and still organize in neat hierarchies under each ship's Captain. The Captain's word is absolute, and unlike the Qerr-Katish they lack any sort of anti-corruption institutions." - history = "" - work = "" - motto = "" - lawful = FALSE - hostile = TRUE - autogenerate_destination_names = TRUE - - org_type = "pirate" - ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement") - ship_names = list() - -/datum/lore/organization/other/uekatish/New() - ..() - var/i = 20 //give us twenty random names - var/list/first_names = file2list('config/names/first_name_skrell.txt') - var/list/words = list( - "Prize", - "Bounty", - "Treasure", - "Pearl", - "Star", - "Mercy", - "Compass", - "Greed", - "Slave", - "Madness", - "Pride", - "Disgrace", - "Judgement", - "Wrath", - "Hatred", - "Vengeance", - "Fury", - "Thunder", - "Scream", - "Dagger", - "Saber", - "Lance", - "Blade" - ) - while(i) - ship_names.Add("[pick(first_names)]'s [pick(words)]") - i-- - -/datum/lore/organization/other/marauders - name = "Vox Marauders" - short_name = "" //whitespace hack again - acronym = "VOX" - desc = "Whilst rarely as directly threatening as 'common' pirates, the phoron-breathing vox nevertheless pose a constant nuisance for shipping; as far as vox are concerned, only vox and vox matters matter, and everyone else is a 'treeless dusthuffer'. Unlike sometimes over-confident pirates, the vox rarely engage in direct, open combat, preferring to make their profits by either stealth or gunboat diplomacy that tends to be more bluster than true brute force: vox raiders will only commit to an attack if they're confident that they can quickly overwhelm and subdue their victims, then get away with the spoils before any reinforcements can arrive.\ -

\ - As Vox ship names are generally impossible for the vast majority of other species to pronounce, System Defense tends to tag marauders with a designation based on the ancient NATO Phonetic Alphabet." - history = "Unknown" - work = "Looting and raiding" - headquarters = "Nowhere" - motto = "(unintelligible screeching)" - lawful = FALSE - hostile = TRUE - autogenerate_destination_names = TRUE //the events we get called for don't fire a destination, but we need *some* entries to avoid runtimes. - - org_type = "pirate" - ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up - //blank out our shipnames for redesignation - ship_names = list() - -/datum/lore/organization/other/marauders/New() - ..() - var/i = 20 //give us twenty random names, marauders get tactical designations from SDF - var/list/letters = list( - "Alpha", - "Bravo", - "Charlie", - "Delta", - "Echo", - "Foxtrot", - "Golf", - "Hotel", - "India", - "Juliett", - "Kilo", - "Lima", - "Mike", - "November", - "Oscar", - "Papa", - "Quebec", - "Romeo", - "Sierra", - "Tango", - "Uniform", - "Victor", - "Whiskey", - "X-Ray", - "Yankee", - "Zulu" - ) - var/list/numbers = list( - "Zero", - "One", - "Two", - "Three", - "Four", - "Five", - "Six", - "Seven", - "Eight", - "Nine" - ) - while(i) - ship_names.Add("[pick(letters)]-[pick(numbers)]") - i-- - -////////////////////////////////////////////////////////////////////////////////// - -// Governments -/datum/lore/organization/gov/commonwealth - name = "Commonwealth of Sol-Procyon" - short_name = "SolCom " - acronym = "CWS" - desc = "The Commonwealth of Sol-Procyon is the evolution of the many nation states of Earth and the outlying colonies \ - having spread amongst the stars. While not quite the hegemon of all Humanity, a narrow majority of them follow \ - the flag of the Commonwealth. The constant tug and pull of government versus corporation, democracy and power \ - troubles this federation of deeply entrenched human colonies much like it did in the 21st century. Some things \ - never change. However, they are economically and culturally quite dominant, although not everyone likes that fact. \ -

\ - Ships on official CWS assignments typically carry the designations of Earth\'s largest craters, as a reminder of everything the planet (and humanity itself) has endured." - history = "" // Todo - work = "governing polity of humanity's systems" - headquarters = "Luna, Sol" - motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals' - autogenerate_destination_names = TRUE - - org_type = "government" - ship_prefixes = list("CWS-A" = "an administrative", "CWS-T" = "a transportation", "CWS-D" = "a diplomatic", "CWS-F" = "a freight", "CWS-J" = "a prisoner transfer") - //earth's biggest impact craters - ship_names = list( - "Wabar", - "Kaali", - "Campo del Cielo", - "Henbury", - "Morasko", - "Boxhole", - "Macha", - "Rio Cuarto", - "Ilumetsa", - "Tenoumer", - "Xiuyan", - "Lonar", - "Agoudal", - "Tswaing", - "Zhamanshin", - "Bosumtwi", - "Elgygytgyn", - "Bigach", - "Karla", - "Karakul", - "Vredefort", - "Chicxulub", - "Sudbury", - "Popigai", - "Manicougan", - "Acraman", - "Morokweng", - "Kara", - "Beaverhead", - "Tookoonooka", - "Charlevoix", - "Siljan Ring", - "Montagnais", - "Araguinha", - "Chesapeake", - "Mjolnir", - "Puchezh-Katunki", - "Saint Martin", - "Woodleigh", - "Carswell", - "Clearwater West", - "Clearwater East", - "Manson", - "Slate", - "Yarrabubba", - "Keurusselka", - "Shoemaker", - "Mistastin", - "Kamensk", - "Steen", - "Strangways", - "Tunnunik", - "Boltysh", - "Nordlinger Ries", - "Presqu'ile", - "Haughton", - "Lappajarvi", - "Rochechouart", - "Gosses Bluff", - "Amelia Creek", - "Logancha", - "Obolon'", - "Nastapoka", - "Ishim", - "Bedout" - ) - destination_names = list( - "Venus", - "Earth", - "Luna", - "Mars", - "Titan", - "Europa", - "the Jovian subcluster", - "a Commonwealth embassy", - "a classified location" - ) - // autogen will add a lot of other places as well. - -/datum/lore/organization/gov/ares - name = "Third Ares Confederation" - short_name = "ArCon " - desc = "A loose coalition of socialist and communist movements on the fringes of the human diaspora \ - the Ares Confederation is a government-in-exile from the original uprisings of Mars to stop \ - the government of corporations and capitalist interests over Humanity. While they failed twice \ - they have made their own home far beyond the reach of an effective military response by the \ - Commonwealth. They have become renowned engineers and terraforming experts, mostly due to necessity." - history = "" - work = "idealist socialist government" - headquarters = "Paraiso a Àstrea" - motto = "Liberty to the Stars!" - - org_type = "government" - ship_prefixes = list("UFHV" = "military", "FFHV" = "classified") - ship_names = list( - "Bulwark of the Free", - "Charged Negotiation", - "Corporation Breaker", - "Cheeki Breeki", - "Dawnstar", - "Fiery Justice", - "Fist of Ares", - "Freedom", - "Marx Was Right", - "Endstage Capitalism", - "Neoluddism Is The Answer Guys", - "Anarchocapitalism Is A Joke", - "Front Toward Enemy", - "Path of Prosperity", - "Freedom Cry", - "Rebel Yell", - "We Will Return To Mars", - "According To Our Abilities", - "Posadism Gang", - "Accelerationism Doesn't Work In A Vaccuum", - "Don't Shoot, We're Unarmed I Think", - "The Big Stick For Speaking Softly", - "Bull Moose", - "Engels Needs Some Love Too", - "The Icepick", - "Gauntlet", - "Gellaume", - "Hero of the Revolution", - "Jerome", - "Laughing Maniac", - "Liberty", - "Mahama", - "Memory of Fallen", - "Miko", - "Mostly Harmless", - "None Of Your Business", - "Not Insured", - "People's Fist", - "Petrov", - "Prehensile Ethics", - "Pride of Liberty", - "Rodrick", - "Star of Tiamat", - "Torch of Freedom", - "Torch" - ) - destination_names = list( - "Drydocks of the Ares Confederation", - "a classified location", - "a Homestead on Paraiso", - "a contested sector of ArCon space", - "one of our free colonies", - "the Gateway 98-C at Ares", - "Sars Mara on Ares", - "Listening Post Maryland-Sigma", - "an emergency nav bouy", - "New Berlin on Nov-Ferrum", - "a settlement needing our help", - "Forward Base Sigma-Alpha in ArCon space" - ) - -/datum/lore/organization/gov/elysia - name = "The Elysian Colonies" - short_name = "Elysia " - acronym = "ECS" - desc = "The Elysian Colonies, located spinwards from the Commonwealth, are a disunited bunch of \ - vanity states, utopia projects and personal autocracies, whose only unifying characteristic is \ - a general disregard of 'normal' social conventions of Humanity as well as their inherent desire \ - to keep to their ways, in which cases they do sometimes unite to fight off an outside threat. \ - The Elysian Colonies are one of the few places where true slavery is not only accepted, but sadly also \ - rather commonplace if you go to the wrong worlds. Not that they don't internally have at least a dozen would-be liberators." - history = "" - work = "fracturous vanity colonies" - headquarters = "" - motto = "" - - org_type = "government" - ship_prefixes = list("ECS-M" = "a military", "ECS-T" = "a transport", "ECS-T" = "a special transport", "ECS-D" = "a diplomatic") //The Special Transport is SLAAAAVES. but let's not advertise that openly. - ship_names = list( - "Bring Me Wine!", - "I Can't Believe You", - "More Wives Your Grace?", - "Daddy Bought Me This", - "What Do You Mean It's Unethical", - "Libertine Ideals", - "The True Free", - "Unbound", - "No Man Shackled", - "All Men Shackled", - "All Women Shackled", - "All Hermaphrodites Shackled", - "You Know We Just Shackle Anyone", - "Nobody Deserves Shackles", - "Debt Slavery Is Ethical", - "Fashioned After Tradition", - "Sic Vic Pacem", - "Cultivate This", - "We Demand Self-Governance", - "A Thousand Cultures", - "There Is a Character Limit?", - "Slave Galley I", - "The Unconquered CCXXII" - ) - destination_names = list( - "Cygnus", - "The Ultra Dome of Brutal Kill Death", - "Sanctum", - "Infernum", - "The Most Esteemed Estates of Fred Fredson, Heir of the Fred Throne and All its illustrious Fredpendencies", - "Priory Melana", - "The Clone Pits of Meridiem Five", - "Forward Base Mara Alpha", - "a liberation intervention", - "a nav bouy within Cygnus Space", - "a Elysian only refuel outpost", - "to a killer party the Fredperor is holding right now" - ) - -/datum/lore/organization/gov/fyrds - name = "Unitary Alliance of Salthan Fyrds" - short_name = "Saltha " - acronym = "SMS" - desc = "Born out of neglect, the Salthan Fyrds are cast-off colonies of the Commonwealth after giving up on \ - pacifying the wartorn region and fighting off the stray Unathi Raiders after the Hegemony War. \ - In the end they self-organized into military pacts and have formed a militaristic society, in which \ - every person, be it organic or robot, is a soldier for the continued cause in serving as aegis against \ - another Unathi Incursion. They are very no-nonsense." - history = "" - work = "human stratocracy" - headquarters = "The Pact, Myria" - motto = "" - - org_type = "government" - ship_prefixes = list("SFM-M" = "a military", "SFM-M" = "a patrol") // The Salthans don't do anything else. - flight_types = list( - "mission", - "operation", - "exercise", - "assignment", - "deployment" - ) - //specifically-undefeated generals, just to shake up the usual list everyone knows - ship_names = list( - "Ahmose I", - "Thutmose I & III", - "Seti I", - "Ramesses II", - "Tariq ibn Ziyad", - "Shaka Zulu", - "Bai Qi", - "Ashoka the Great", - "Han Xin", - "Chen Qingzhi", - "Sargon of Akkad", - "Khalid ibn al-Walid", - "Narses", - "David IV", - "Yue Fei", - "Subutai", - "Tamerlane", - "Kumbha of Mewar", - "Akbar", - "Admiral Yi", - "Chatrapati Sambhaji Maharaj", - "Baji Rao", - "Nguyen Hue", - "Alexander the Great", - "Epaminondas", - "Nero Claudius Drusus", - "Burebista", - "Pepin the Short", - "El Cid", - "Jan Zizka", - "Scanderbeg", - "Edward IV", - "Pal Kinizsi", - "Ivan Sirko", - "John Churchill", - "Maurice of Nassau", - "Alvaro de Bazan", - "Blas de Lezo", - "Prince Henry", - "Alexander Suvorov", - "Fyodor Ushakov", - "Charles XI", - "August von Mackensen", - "Paul von Lettow-Vorbeck", - "George Henry Thomas" - ) - /* retained for archival, no longer necessary - destination_names = list( - "Base Alpha-Romero", - "Base Zeta-Xray", - "Base Epsilon-Epsilon", - "Base Xray-Beta", - "Base Gamma-Delta", - "Base Yotta-Epsilon" - ) - */ - -/datum/lore/organization/gov/fyrds/New() - ..() - var/fyrdsgen = rand(8, 16) //significantly increased from original values due to the greater length of rounds on YW - var/list/location = list( - "Base","Outpost","Installation","Station","Waypoint","Nav Point" - ) - var/list/greek = list( - "Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega" - ) - var/list/phoenician = list( - "Aleph","Beth","Gimel","Daleth","He","Zayin","Heth","Teth","Yodh","Kaph","Lamedh","Mem","Nun","Samekh","'Ayin","Pe","Res","Sin","Taw","Waw","Sade","Qoph" - ) - var/list/russian = list( - "Anna","Boris","Vasily","Gregory","Galina","Dmitri","Yelena","Zhenya","Zinaida","Zoya","Ivan","Konstantin","Leonid","Mikhail","Mariya","Nikolai","Olga","Pavel","Roman","Semyon","Sergei","Tatyana","Tamara","Ulyana","Fyodor","Khariton","Tsaplya","Tsentr","Chelovek","Shura","Shchuka","Yery","Znak","Echo","Emma","Yuri","Yakov" - ) - var/list/american = list( - "Alfa","Bravo","Charlie","Delta","Echo","Foxtrot","Golf","Hotel","India","Juliet","Kilo","Lima","Mike","November","Oscar","Papa","Quebec","Romeo","Sierra","Tango","Uniform","Victor","Whiskey","Xray","Yankee","Zulu" - ) - - while(fyrdsgen) - destination_names.Add("[pick(location)] [pick(greek)]-[pick(greek)]","[pick(location)] [pick(phoenician)]-[pick(phoenician)]","[pick(location)] [pick(russian)]-[pick(russian)]","[pick(location)] [pick(american)]-[pick(american)]") - fyrdsgen-- - -/datum/lore/organization/gov/teshari - name = "Teshari Expeditionary Fleet" - short_name = "Teshari Expeditionary " - acronym = "TEF" - desc = "Though nominally a client state of the skrell, the teshari nevertheless maintain their own navy in the form of the Teshari Expeditionary Fleet. The TEF are as much civil and combat engineers as a competent space force, as they are the tip of the spear when it comes to locating and surveying new worlds suitable for teshari habitation, and in the establishment of full colonies. That isn't to say there aren't independent teshari colonies out there, but those that are founded under the wings of the TEF tend to be the largest and most prosperous. They're also responsible for maintaining the security of these colonies and protecting trade ships. Like the USDF (and unlike most other governmental fleets), TEF vessels almost universally sport the 'TEF' designator rather than specific terms.\ -

\ - The TEF's ships are named after famous teshari pioneers and explorers and the events surrounding those individuals." - history = "" - work = "teshari colonization and infrastructure maintenance" - headquarters = "Qerr'balak, Qerr'valis" - motto = "" - autogenerate_destination_names = TRUE //big list of own holdings to come - - org_type = "government" - //the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well - ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering") - //TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word. - ship_names = list() - destination_names = list( - "an Expeditionary Fleet RV point", - "an Expeditionary Fleet Resupply Ship", - "an Expeditionary Fleet Supply Depot", - "a newly-founded Teshari colony", - "a prospective Teshari colony site", - "a potential Teshari colony site", - "Expeditionary Fleet HQ" - ) - -/datum/lore/organization/gov/teshari/New() - ..() - var/i = 20 //give us twenty random names - var/list/first_names = list( - "Leniri's", - "Tatani's", - "Ninai's", - "Miiescha's", - "Ishena's", - "Taalische's", - "Cami's", - "Schemisa's", - "Shilirashi's", - "Sanene's", - "Aeimi's", - "Ischica's", - "Shasche's", - "Leseca's", - "Iisi's", - "Simascha's", - "Lisascheca's" - ) - var/list/words = list( - "Hope", - "Venture", - "Voyage", - "Talons", - "Fang", - "Wing", - "Pride", - "Glory", - "Wit", - "Insight", - "Wisdom", - "Mind", - "Cry", - "Howl", - "Fury", - "Revenge", - "Vengeance" - ) - while(i) - ship_names.Add("[pick(first_names)] [pick(words)]") - i-- - -/datum/lore/organization/gov/altevian_hegemony - name = "The Altevian Hegemony" - short_name = "Altevian Hegemony " - acronym = "AH" - desc = "The Altevians are a space-faring race of rodents that resemble Earth-like rats. \ - They do not have a place they call home in terms of a planet, and instead have massive multiple-kilometer-long colony-ships \ - that are constantly on the move and typically keep operations outside of known populated systems to minimize potential conflicts over resources. \ - Their primary focus is trade and salvage operations, and their ships can be expected to be seen around both densely populated and empty systems for their work." - history = "" - work = "salvage and trade operators" - headquarters = "AH-CV Migrant" - motto = "" - org_type = "spacer" - - ship_prefixes = list("AH-DV" = "a diplomatic", "AH-EV" = "an exploration", "AH-FV" = "a fueling", "AH-FV" = "a cargo", "AH-SV" = "a research", "AH-TV" = "a colony-transporter", "AH-RV" = "an emergency response", "AH-RV" = "a response", "AH-MV" = "a medical") - ship_names = list( - "Platinum", - "Warson", - "Mane", - "Holland", - "Arauz", - "Diamond", - "Gold", - "Steam", - "Boiler", - "Slip", - "Lavender", - "Wheel", - "Stuntson", - "Desto", - "Palos", - "Matterson", - "Mill", - "Smoke", - "Squeson", - "Rabion", - "Strikedown", - "Cluster", - "Raling", - "Archaeologist", - "Beaker" - ) - destination_names = list( - "the AH-CV Migrant flagship", - "one of our research colony-ships", - "the AH-CV Lotus", - "the AH-CV Anvil", - "the AH-CV Generations", - "the AH-CV Galley", - "the AH-CV Prosperity", - "the AH-CV Kitsap", - "the AH-CV Diamondback", - "one of our colony-ships", - "one of our production fleets" - ) - -////////////////////////////////////////////////////////////////////////////////// - -// Military -/datum/lore/organization/mil/usdf - name = "United Solar Defense Force" - short_name = "" //Doesn't cause whitespace any more, with a little sneaky low-effort workaround - acronym = "USDF" - desc = "The USDF is the dedicated military force of the Commonwealth, originally formed by the United Nations. USDF ships are responsible for securing the major traffic lanes between Commonwealth member systems, as well as protecting them from threats that are too great for local SDF units to handle. Despite nominally being a 'Defense Force', a lot of dubious incidents and several notable firebrands within the USDF mean that the Fleet is considered by some to be the galaxy\'s eight-hundred-pound gorilla; it does whatever it wants whenever it wants, and there really isn\'t anything you (or anyone else, even the Commonwealth itself) can do about it. Thankfully a coalition of moderates and Commonwealth loyalists have so far managed to keep the hardliners from getting away with too much, at least for the time being." - history = "" - work = "peacekeeping and piracy suppression" - headquarters = "Paris, Earth" - motto = "Si Vis Pacem Para Bellum" //if you wish for peace, prepare for war - autogenerate_destination_names = TRUE - - org_type = "military" - ship_prefixes = list ("USDF" = "a logistical", "USDF" = "a training", "USDF" = "a patrol", "USDF" = "a piracy suppression", "USDF" = "a peacekeeping", "USDF" = "a relief", "USDF" = "an escort", "USDF" = "a search and rescue", "USDF" = "a classified") - flight_types = list( - "mission", - "operation", - "exercise", - "assignment", - "deployment" - ) - ship_names = list( - "Aphrodite", - "Apollo", - "Ares", - "Artemis", - "Athena", - "Demeter", - "Dionysus", - "Hades", - "Hephaestus", - "Hera", - "Hermes", - "Hestia", - "Poseidon", - "Zeus", - "Achlys", - "Aether", - "Aion", - "Ananke", - "Chaos", - "Chronos", - "Erebus", - "Eros", - "Gaia", - "Hemera", - "Hypnos", - "Nemesis", - "Nyx", - "Phanes", - "Pontus", - "Tartarus", - "Thalassa", - "Thanatos", - "Uranus", - "Coeus", - "Crius", - "Cronus", - "Hyperion", - "Iapetus", - "Mnemosyne", - "Oceanus", - "Phoebe", - "Rhea", - "Tethys", - "Theia", - "Themis", - "Asteria", - "Astraeus", - "Atlas", - "Aura", - "Clymene", - "Dione", - "Helios", - "Selene", - "Eos", - "Epimetheus", - "Eurybia", - "Eurynome", - "Lelantos", - "Leto", - "Menoetius", - "Metis", - "Ophion", - "Pallas", - "Perses", - "Prometheus", - "Styx" - ) - destination_names = list( - "USDF HQ", - "a USDF staging facility on the edge of Commonwealth territory", - "a USDF supply depot", - "a USDF rally point", - "a USDF forward base", - "a USDF repair facility", - "a USDF shipyard in Sol", - "a classified location" - ) - -/datum/lore/organization/mil/pcrc - name = "Proxima Centauri Risk Control" - short_name = "Proxima Centauri " - acronym = "PCRC" - desc = "Not a whole lot is known about the private security company known as PCRC, but it is known that they're irregularly contracted by the larger TSCs for certain delicate matters. Much of the company's inner workings are shrouded in mystery, and most citizens have never even heard of them. Amongst those who do know of them, they enjoy fairly good PR for a private security group, especially when compared to SAARE." - history = "" - work = "risk control and private security" - headquarters = "Proxima Centauri" - motto = "" - autogenerate_destination_names = TRUE - - org_type = "military" - ship_prefixes = list("PCRC" = "a risk control", "PCRC" = "a private security") - flight_types = list( - "flight", - "mission", - "route", - "operation", - "assignment", - "contract" - ) - //law/protection terms - ship_names = list( - "Detective", - "Constable", - "Inspector", - "Judge", - "Adjudicator", - "Magistrate", - "Marshal", - "Sheriff", - "Deputy", - "Warden", - "Guardian", - "Defender", - "Peacemaker", - "Peacekeeper", - "Arbiter", - "Justice", - "Order", - "Jury", - "Inspector", - "Bluecoat", - "Gendarme", - "Gumshoe", - "Patrolman", - "Sentinel", - "Shield", - "Aegis", - "Auditor", - "Monitor", - "Investigator", - "Agent", - "Prosecutor", - "Sergeant" - ) - - destination_names = list( - "PCRC HQ, in Proxima Centauri", - "a PCRC training installation", - "a PCRC supply depot" - ) - -//I'm covered in beeeeeeees! -/datum/lore/organization/mil/hive - name = "HIVE Security" - short_name = "HIVE " - acronym = "HVS" - desc = "HIVE Security is a merging of several much smaller freelance companies, and operates throughout civilized space. Unlike some companies, it operates no planetside facilities whatsoever, opting instead for larger flotillas that are serviced by innumerable smallcraft. As with any PMC there's no small amount of controversy surrounding them, but they try to keep their operations cleaner than their competitors. They're fairly well known for running 'mercy' operations, which are low-cost no-strings-attached contracts for those in dire need." - history = "" - work = "mercenary contractors" - headquarters = "" - motto = "Strength in Numbers" - autogenerate_destination_names = TRUE - - org_type = "military" - ship_prefixes = list("HPF" = "a secure freight", "HPT" = "a training", "HPS" = "a logistics", "HPV" = "a patrol", "HPH" = "a bounty hunting", "HPX" = "an experimental", "HPC" = "a command", "HPI" = "a mercy") - flight_types = list( - "flight", - "mission", - "route", - "operation", - "assignment", - "contract" - ) - //animals, preferably predators, all factual/extant critters - ship_names = list( - "Wolf", - "Bear", - "Eagle", - "Condor", - "Falcon", - "Hawk", - "Kestrel", - "Shark", - "Fox", - "Weasel", - "Mongoose", - "Bloodhound", - "Rhino", - "Tiger", - "Leopard", - "Panther", - "Cheetah", - "Lion", - "Vulture", - "Piranha", - "Crocodile", - "Alligator", - "Recluse", - "Tarantula", - "Scorpion", - "Orca", - "Coyote", - "Jackal", - "Hyena", - "Hornet", - "Wasp", - "Sealion", - "Viper", - "Cobra", - "Sidewinder", - "Asp", - "Python", - "Anaconda", - "Krait", - "Diamondback", - "Mamba", - "Fer de Lance", - "Keelback", - "Adder", - "Constrictor", - "Boa", - "Moray", - "Taipan", - "Rattlesnake" - ) - destination_names = list( - "the HIVE Command fleet", - "a HIVE patrol fleet", - "a HIVE flotilla", - "a HIVE training fleet", - "a HIVE logistics fleet" - ) - //some basics, padded with autogen - -//replaced the edgy blackstar group with polaris-canon SAARE -/datum/lore/organization/mil/saare - name = "Stealth Assault Enterprises" - short_name = "" - acronym = "SAARE" - desc = "SAARE consistently have the worst reputation of any paramilitary group. This is because they specialize in deniability and secrecy. Although publically they work in asset recovery, they have a substantiated reputation for info-theft and piracy that has lead to them butting heads with the law on more than one occasion. Nonetheless, they are an invaluable part of the Solar economy, and other TSCs and small colonial governments keep them in business.\ -

\ - For the purposes of plausible deniability, SAARE designates their ships using a series of rotating identifiers, with ships on a specific operation or in a particular area all using the same initial designation (e.g. 'Sledgehammer') and having a different numerical identifier, with the most important ships involved bearing a unique additional codename (such as 'Actual' for Command \& Control ships). As ships are shuffled in and out of operating areas, it can be difficult to pin down exactly which ship in SAARE's fleet was responsible for which act. SAARE's misdirection is multilayered, including elements such as extensive use of repainting, false IFFs, bribes, forged documents, intimidation, camouflage, and all manner of other underhanded tactics." - history = "" - work = "mercenary contractors" - headquarters = "" - motto = "Aut Neca Aut Necare" - autogenerate_destination_names = TRUE - - org_type = "military" - ship_prefixes = list("SAARE" = "a secure freight", "SAARE" = "a training", "SAARE" = "a logistics", "SAARE" = "a patrol", "SAARE" = "a security", "SAARE" = "an experimental", "SAARE" = "a command", "SAARE" = "a classified") - flight_types = list( - "flight", - "mission", - "route", - "operation", - "assignment", - "contract" - ) - ship_names = list() - destination_names = list( - "SAARE Command", - "a SAARE training site", - "a SAARE logistical depot", - "a SAARE-held shipyard" - ) - -/datum/lore/organization/mil/saare/New() - ..() - var/i = 20 //give us twenty random names, saare uses tacticool designations - var/list/letters = list( - "King", - "Queen", - "Duke", - "Cipher", - "Monarch", - "Marshal", - "Magnum", - "Longbow", - "Jupiter", - "Excalibur", - "Charon", - "Bloodhound", - "Daybreak", - "Tomahawk", - "Raptor", - "Cerberus", - "Apollo", - "Firebird", - "Outlaw", - "Outrider", - "Vector", - "Spearhead", - "Sledgehammer", - "Typhon", - "Sundown", - "Zodiac", - "Colossus", - "Jackhammer", - "Kodiak", - "Phalanx", - "Rainmaker", - "Shockwave", - "Warhammer", - "Crusader", - "Maverick", - "Nighthawk", - "Redshift", - "Challenger", - "Starlight", - "Sunray", - "Ironside", - "Holdfast", - "Foxhound" - ) - var/list/numbersone = list( - "Zero", - "One", - "Two", - "Three", - "Four", - "Five", - "Six", - "Seven", - "Eight", - "Nine" - ) - var/list/numberstwo = list( - "Zero", - "One", - "Two", - "Three", - "Four", - "Five", - "Six", - "Seven", - "Eight", - "Niner" - ) - while(i) - ship_names.Add("[pick(letters)] [pick(40;"Actual","[pick(numbersone)]-[pick(numberstwo)]")]") - i-- - - //ex: "Phalanx One-Niner", "Sledgehammer Actual" (CO/VIP), "Kodiak Seven-Four", "Tomahawk Two-Zero" - //probably a more elegant (read: fancier) way to do the second part but fuck it, this works just fine diff --git a/code/modules/casino/headset_casino.dm b/code/modules/casino/headset_casino.dm index a1acb313c5..6fd4f5b68c 100644 --- a/code/modules/casino/headset_casino.dm +++ b/code/modules/casino/headset_casino.dm @@ -3,14 +3,18 @@ desc = "An updated, modular intercom that fits over the head with extra comfortable for the hardworking casino luxury crew. Has encryption key for scamm-... Kind casino staff channel." icon = 'icons/obj/casino.dmi' icon_state = "headset" + adhoc_fallback = TRUE origin_tech = list(TECH_ILLEGAL = 1) ks1type = /obj/item/encryptionkey/casino -/obj/item/radio/headset/casino/bowman +/obj/item/radio/headset/alt/casino name = "casino bowman headset" + desc = "An updated, modular intercom that fits over the head with extra comfortable for the hardworking casino luxury crew. Has encryption key for scamm-... Kind casino staff channel." + icon = 'icons/obj/casino.dmi' icon_state = "headset_alt" adhoc_fallback = TRUE origin_tech = list(TECH_ILLEGAL = 2) + ks1type = /obj/item/encryptionkey/casino /obj/item/encryptionkey/casino icon = 'icons/obj/casino.dmi' diff --git a/code/modules/catalogue/catalogue_data.dm b/code/modules/catalogue/catalogue_data.dm index 2d40afbc93..548b1f3923 100644 --- a/code/modules/catalogue/catalogue_data.dm +++ b/code/modules/catalogue/catalogue_data.dm @@ -290,7 +290,6 @@ GLOBAL_DATUM_INIT(catalogue_data, /datum/category_collection/catalogue, new) full set of prosthetic limbs." value = CATALOGUER_REWARD_TRIVIAL - /datum/category_item/catalogue/information // For these we can piggyback off of the lore datums that are already defined and used in some places. diff --git a/code/modules/catalogue/catalogue_data_vr.dm b/code/modules/catalogue/catalogue_data_vr.dm index 8c07605377..3fa6d6c513 100644 --- a/code/modules/catalogue/catalogue_data_vr.dm +++ b/code/modules/catalogue/catalogue_data_vr.dm @@ -132,9 +132,3 @@ in the dormant brain via direct electro-uploading. However, this technology is not perfect and small, but \ non-zero error margins exist. Handle with care! Or don't. Stress testing this stuff makes a lucrative market." value = CATALOGUER_REWARD_TRIVIAL - -/* -/datum/category_item/catalogue/information/organization/khi - name = "Independents - Kitsuhana Heavy Industries" - datum_to_copy = /datum/lore/organization/other/kitsuhana -*/ diff --git a/code/modules/client/preference_setup/antagonism/02_candidacy.dm b/code/modules/client/preference_setup/antagonism/02_candidacy.dm index d400047274..5c1c58fc72 100644 --- a/code/modules/client/preference_setup/antagonism/02_candidacy.dm +++ b/code/modules/client/preference_setup/antagonism/02_candidacy.dm @@ -20,10 +20,11 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set //VOREStation Add "lost drone" = 1, // 16 "maint pred" = 1, // 17 - "morph" = 1, // 18 - "corgi" = 1, // 19 - "cursed sword" = 1, // 20 - "Ship Survivor" = 1, // 21 + "maint lurker" = 1, // 18 + "morph" = 1, // 19 + "corgi" = 1, // 20 + "cursed sword" = 1, // 21 + "Ship Survivor" = 1, // 22 //VOREStation Add End ) diff --git a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm index c0423712f5..986ea328e5 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm @@ -33,7 +33,7 @@ ..() var/list/selector_uniforms = list( "uniform w/ dress"=/obj/item/clothing/under/dress/dress_cap, - "KHI uniform"=/obj/item/clothing/under/rank/khi/cmd, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/cmd, "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, @@ -64,7 +64,7 @@ var/list/selector_uniforms = list( "uniform w/ dress"=/obj/item/clothing/under/dress/dress_hop, "HR director"=/obj/item/clothing/under/dress/dress_hr, - "KHI uniform"=/obj/item/clothing/under/rank/khi/cmd, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/cmd, "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, @@ -130,7 +130,7 @@ /datum/gear/uniform/civvie_uniform_selector/New() ..() var/list/selector_uniforms = list( - "KHI uniform"=/obj/item/clothing/under/rank/khi/civ, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/civ, "TG&C plain turtleneck"=/obj/item/clothing/under/rank/neo_suspect_turtleneck, "TG&C plain turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_suspect_turtleskirt, "TG&C blue turtleneck"=/obj/item/clothing/under/rank/neo_suspect_turtleneck_blue, @@ -200,7 +200,7 @@ ..() var/list/selector_uniforms = list( "undersuit, modernized"=/obj/item/clothing/under/rank/security/modern, - "KHI uniform"=/obj/item/clothing/under/rank/khi/sec, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/sec, "voidsuit underlayer"=/obj/item/clothing/under/undersuit/sec, "skirt"=/obj/item/clothing/under/rank/security/skirt, "turtleneck"=/obj/item/clothing/under/rank/security/turtleneck, @@ -300,7 +300,7 @@ "TG&C blue turtleneck & skirt"=/obj/item/clothing/under/rank/neo_hos_blackblue_skirt, "TG&C blue parade uniform"=/obj/item/clothing/under/rank/neo_hos_parade_blue, "TG&C blue parade uniform, feminine"=/obj/item/clothing/under/rank/neo_hos_parade_blue_fem, - "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "neocorporate uniform, command"=/obj/item/clothing/under/rank/khi/cmd, "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, @@ -327,7 +327,7 @@ "skirt"=/obj/item/clothing/under/rank/cargo/skirt, "jeans"=/obj/item/clothing/under/rank/cargo/jeans, "jeans, feminine cut"=/obj/item/clothing/under/rank/cargo/jeans/female, - "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "neocorporate uniform, command"=/obj/item/clothing/under/rank/khi/cmd, "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_qm, "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_qm_skirt, "TG&C casualwear"=/obj/item/clothing/under/rank/neo_qm_jacket, @@ -359,7 +359,7 @@ "skirt"=/obj/item/clothing/under/rank/cargotech/skirt, "jeans"=/obj/item/clothing/under/rank/cargotech/jeans, "jeans, feminine cut"=/obj/item/clothing/under/rank/cargotech/jeans/female, - "KHI uniform"=/obj/item/clothing/under/rank/khi/crg, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/crg, "TG&C shorts"=/obj/item/clothing/under/rank/neo_cargo_shorts, "TG&C skirt"=/obj/item/clothing/under/rank/neo_cargo_skirt, "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_cargo, @@ -405,7 +405,7 @@ ..() var/list/selector_uniforms = list( "skirt"=/obj/item/clothing/under/rank/chief_engineer/skirt, - "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "neocorporate uniform, command"=/obj/item/clothing/under/rank/khi/cmd, "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, @@ -431,7 +431,7 @@ var/list/selector_uniforms = list( "skirt"=/obj/item/clothing/under/rank/engineer/skirt, "turtleneck"=/obj/item/clothing/under/rank/engineer/turtleneck, - "KHI uniform"=/obj/item/clothing/under/rank/khi/eng, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/eng, "ST: Original Series Ops"=/obj/item/clothing/under/rank/trek/engsec, "ST: Next Generation Ops"=/obj/item/clothing/under/rank/trek/engsec/next, "ST: Voyager Ops"=/obj/item/clothing/under/rank/trek/engsec/voy, @@ -481,7 +481,7 @@ "virologist skirt"=/obj/item/clothing/under/rank/virologist/skirt, "turtleneck"=/obj/item/clothing/under/rank/medical/turtleneck, "vey-medical jumpsuit"=/obj/item/clothing/under/corp/veymed, - "KHI uniform"=/obj/item/clothing/under/rank/khi/med, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/med, "ST: Original Series Med-Sci"=/obj/item/clothing/under/rank/trek/medsci, "ST: Next Generation Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/next, "ST: Voyager Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/voy, @@ -554,7 +554,7 @@ ..() var/list/selector_uniforms = list( "skirt"=/obj/item/clothing/under/rank/chief_medical_officer/skirt, - "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "neocorporate uniform, command"=/obj/item/clothing/under/rank/khi/cmd, "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, @@ -582,7 +582,7 @@ /datum/gear/uniform/research_director_selector/New() ..() var/list/selector_uniforms = list( - "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd, + "neocorporate uniform, command"=/obj/item/clothing/under/rank/khi/cmd, "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command, "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next, "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy, @@ -611,7 +611,7 @@ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_science, "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_science_skirt, "TG&C utility"=/obj/item/clothing/under/rank/neo_util_sci, - "KHI uniform"=/obj/item/clothing/under/rank/khi/sci, + "neocorporate uniform"=/obj/item/clothing/under/rank/khi/sci, "ST: Original Series Med-Sci"=/obj/item/clothing/under/rank/trek/medsci, "ST: Next Generation Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/next, "ST: Voyager Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/voy, diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index 26cfdc197b..447b329837 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -68,35 +68,7 @@ if(!pref.voice_sound) character.voice_sounds_list = talk_sound else - switch(pref.voice_sound) - if("beep-boop") - character.voice_sounds_list = talk_sound - if("goon speak 1") - character.voice_sounds_list = goon_speak_one_sound - if("goon speak 2") - character.voice_sounds_list = goon_speak_two_sound - if("goon speak 3") - character.voice_sounds_list = goon_speak_three_sound - if("goon speak 4") - character.voice_sounds_list = goon_speak_four_sound - if("goon speak blub") - character.voice_sounds_list = goon_speak_blub_sound - if("goon speak bottalk") - character.voice_sounds_list = goon_speak_bottalk_sound - if("goon speak buwoo") - character.voice_sounds_list = goon_speak_buwoo_sound - if("goon speak cow") - character.voice_sounds_list = goon_speak_cow_sound - if("goon speak lizard") - character.voice_sounds_list = goon_speak_lizard_sound - if("goon speak pug") - character.voice_sounds_list = goon_speak_pug_sound - if("goon speak pugg") - character.voice_sounds_list = goon_speak_pugg_sound - if("goon speak roach") - character.voice_sounds_list = goon_speak_roach_sound - if("goon speak skelly") - character.voice_sounds_list = goon_speak_skelly_sound + character.voice_sounds_list = get_talk_sound(pref.voice_sound) character.custom_speech_bubble = pref.custom_speech_bubble /datum/category_item/player_setup_item/vore/size/content(var/mob/user) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 3482425976..95b42830ca 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -490,3 +490,243 @@ var/list/preferences_datums = list() save_character() attempt_vr(user.client?.prefs_vr,"load_vore","") ShowChoices(user) + +/datum/preferences/proc/vanity_copy_to(var/mob/living/carbon/human/character, var/copy_name, var/copy_flavour = TRUE, var/copy_ooc_notes = FALSE, var/convert_to_prosthetics = FALSE) + //snowflake copy_to, does not copy anything but the vanity things + //does not check if the name is the same, do that in any proc that calls this proc + /* + name, nickname, flavour, OOC notes + gender, sex + custom species name, custom bodytype, weight, scale, scaling center, sound type, sound freq + custom say verbs + ears, wings, tail, hair, facial hair + ears colors, wings colors, tail colors + body color, prosthetics (if they're a protean) (convert to DSI if protean and not prosthetic), eye color, hair color etc + markings + custom synth markings toggle, custom synth color toggle + digitigrade + blood color + */ + if (copy_name) + if(CONFIG_GET(flag/humans_need_surnames)) + var/firstspace = findtext(real_name, " ") + var/name_length = length(real_name) + if(!firstspace) //we need a surname + real_name += " [pick(last_names)]" + else if(firstspace == name_length) + real_name += "[pick(last_names)]" + character.real_name = real_name + character.name = character.real_name + if(character.dna) + character.dna.real_name = character.real_name + character.nickname = nickname + character.gender = biological_gender + character.identifying_gender = identifying_gender + + character.r_eyes = r_eyes + character.g_eyes = g_eyes + character.b_eyes = b_eyes + character.h_style = h_style + character.r_hair = r_hair + character.g_hair = g_hair + character.b_hair = b_hair + character.r_grad = r_grad + character.g_grad = g_grad + character.b_grad = b_grad + character.f_style = f_style + character.r_facial = r_facial + character.g_facial = g_facial + character.b_facial = b_facial + character.r_skin = r_skin + character.g_skin = g_skin + character.b_skin = b_skin + character.s_tone = s_tone + character.h_style = h_style + character.grad_style= grad_style + character.f_style = f_style + character.grad_style= grad_style + character.b_type = b_type + character.synth_color = synth_color + character.r_synth = r_synth + character.g_synth = g_synth + character.b_synth = b_synth + character.synth_markings = synth_markings + + var/list/ear_styles = get_available_styles(global.ear_styles_list) + character.ear_style = ear_styles[ear_style] + character.r_ears = r_ears + character.b_ears = b_ears + character.g_ears = g_ears + character.r_ears2 = r_ears2 + character.b_ears2 = b_ears2 + character.g_ears2 = g_ears2 + character.r_ears3 = r_ears3 + character.b_ears3 = b_ears3 + character.g_ears3 = g_ears3 + + character.ear_secondary_style = ear_styles[ear_secondary_style] + character.ear_secondary_colors = SANITIZE_LIST(ear_secondary_colors) + + var/list/tail_styles = get_available_styles(global.tail_styles_list) + character.tail_style = tail_styles[tail_style] + character.r_tail = r_tail + character.b_tail = b_tail + character.g_tail = g_tail + character.r_tail2 = r_tail2 + character.b_tail2 = b_tail2 + character.g_tail2 = g_tail2 + character.r_tail3 = r_tail3 + character.b_tail3 = b_tail3 + character.g_tail3 = g_tail3 + + var/list/wing_styles = get_available_styles(global.wing_styles_list) + character.wing_style = wing_styles[wing_style] + character.r_wing = r_wing + character.b_wing = b_wing + character.g_wing = g_wing + character.r_wing2 = r_wing2 + character.b_wing2 = b_wing2 + character.g_wing2 = g_wing2 + character.r_wing3 = r_wing3 + character.b_wing3 = b_wing3 + character.g_wing3 = g_wing3 + + character.set_gender(biological_gender) + + // Destroy/cyborgize organs and limbs. + if (convert_to_prosthetics) //should only really be run for proteans + var/list/organs_to_edit = list() + for (var/name in list(BP_TORSO, BP_HEAD, BP_GROIN, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/O = character.organs_by_name[name] + if (O) + var/x = organs_to_edit.Find(O.parent_organ) + if (x == 0) + organs_to_edit += name + else + organs_to_edit.Insert(x+(O.robotic == ORGAN_NANOFORM ? 1 : 0), name) + for(var/name in organs_to_edit) + var/status = organ_data[name] + var/obj/item/organ/external/O = character.organs_by_name[name] + if(O) + if(status == "amputated") + continue + else if(status == "cyborg") + O.robotize(rlimb_data[name]) + else + var/bodytype + var/datum/species/selected_species = GLOB.all_species[species] + if(selected_species.selects_bodytype) + bodytype = custom_base + else + bodytype = selected_species.get_bodytype() + var/dsi_company = GLOB.dsi_to_species[bodytype] + if (!dsi_company) + dsi_company = "DSI - Adaptive" + O.robotize(dsi_company) + + for(var/N in character.organs_by_name) + var/obj/item/organ/external/O = character.organs_by_name[N] + O.markings.Cut() + + var/priority = 0 + for(var/M in body_markings) + priority += 1 + var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[M] + + for(var/BP in mark_datum.body_parts) + var/obj/item/organ/external/O = character.organs_by_name[BP] + if(O) + O.markings[M] = list("color" = body_markings[M][BP]["color"], "datum" = mark_datum, "priority" = priority, "on" = body_markings[M][BP]["on"]) + character.markings_len = priority + + var/list/last_descriptors = list() + if(islist(body_descriptors)) + last_descriptors = body_descriptors.Copy() + body_descriptors = list() + + var/datum/species/mob_species = GLOB.all_species[species] + if(LAZYLEN(mob_species.descriptors)) + for(var/entry in mob_species.descriptors) + var/datum/mob_descriptor/descriptor = mob_species.descriptors[entry] + if(istype(descriptor)) + if(isnull(last_descriptors[entry])) + body_descriptors[entry] = descriptor.default_value // Species datums have initial default value. + else + body_descriptors[entry] = CLAMP(last_descriptors[entry], 1, LAZYLEN(descriptor.standalone_value_descriptors)) + character.descriptors = body_descriptors + + if (copy_flavour) + character.flavor_texts["general"] = flavor_texts["general"] + character.flavor_texts["head"] = flavor_texts["head"] + character.flavor_texts["face"] = flavor_texts["face"] + character.flavor_texts["eyes"] = flavor_texts["eyes"] + character.flavor_texts["torso"] = flavor_texts["torso"] + character.flavor_texts["arms"] = flavor_texts["arms"] + character.flavor_texts["hands"] = flavor_texts["hands"] + character.flavor_texts["legs"] = flavor_texts["legs"] + character.flavor_texts["feet"] = flavor_texts["feet"] + if (copy_ooc_notes) + character.ooc_notes = metadata + + character.weight = weight_vr + character.weight_gain = weight_gain + character.weight_loss = weight_loss + character.fuzzy = fuzzy + character.offset_override = offset_override + character.voice_freq = voice_freq + character.resize(size_multiplier, animate = FALSE, ignore_prefs = TRUE) + + var/list/traits_to_copy = list(/datum/trait/neutral/tall, + /datum/trait/neutral/taller, + /datum/trait/neutral/short, + /datum/trait/neutral/shorter, + /datum/trait/neutral/obese, + /datum/trait/neutral/fat, + /datum/trait/neutral/thin, + /datum/trait/neutral/thinner, + /datum/trait/neutral/micro_size_down, + /datum/trait/neutral/micro_size_up) + //reset all the above trait vars + if (character.species) + character.species.micro_size_mod = 0 + character.species.icon_scale_x = 1 + character.species.icon_scale_y = 1 + for (var/trait in neu_traits) + if (trait in traits_to_copy) + var/datum/trait/instance = all_traits[trait] + if (!instance) + continue + for (var/to_edit in instance.var_changes) + character.species.vars[to_edit] = instance.var_changes[to_edit] + character.update_transform() + if(!voice_sound) + character.voice_sounds_list = talk_sound + else + character.voice_sounds_list = get_talk_sound(voice_sound) + + character.species?.blood_color = blood_color + + var/datum/species/selected_species = GLOB.all_species[species] + var/bodytype_selected + if(selected_species.selects_bodytype) + bodytype_selected = custom_base + else + bodytype_selected = selected_species.get_bodytype(character) + + character.dna.base_species = bodytype_selected + character.species.base_species = bodytype_selected + character.species.vanity_base_fit = bodytype_selected + if (istype(character.species, /datum/species/shapeshifter)) + wrapped_species_by_ref["\ref[character]"] = bodytype_selected + + character.custom_species = custom_species + character.custom_say = lowertext(trim(custom_say)) + character.custom_ask = lowertext(trim(custom_ask)) + character.custom_whisper = lowertext(trim(custom_whisper)) + character.custom_exclaim = lowertext(trim(custom_exclaim)) + + character.digitigrade = selected_species.digi_allowed ? digitigrade : 0 + + character.dna.ResetUIFrom(character) + character.force_update_limbs() + character.regenerate_icons() diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index f2002c95c6..28c2b41a28 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -48,7 +48,7 @@ BLIND // can't see anything // Prevent people from just turning their goggles back on. if(!active && (vision_flags & (SEE_TURFS|SEE_OBJS))) var/area/A = get_area(src) - if(A.no_spoilers) + if(A.flag_check(AREA_NO_SPOILERS)) return FALSE return TRUE diff --git a/code/modules/clothing/spacesuits/rig/modules/protean.dm b/code/modules/clothing/spacesuits/rig/modules/protean.dm new file mode 100644 index 0000000000..f1e78a5e07 --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/modules/protean.dm @@ -0,0 +1,209 @@ +/* +A collection of Protean rigsuit modules, intended to encourage Symbiotic relations with a host. +All of these should require someone else to be wearing the Protean to function. +These should come standard with the Protean rigsuit, unless you want them to work for some upgrades. +*/ + + +//This rig module feeds nutrition directly from the wearer to the Protean, to help them stay charged while worn. +/obj/item/rig_module/protean + permanent = 1 + +/obj/item/rig_module/protean/syphon + name = "Protean Metabolic Syphon" + desc = "This should never be outside of a RIG." + icon_state = "flash" + interface_name = "Protean Metabolic Syphon" + interface_desc = "Toggle to drain nutrition/power from the user directly into the Protean's own energy stores." + toggleable = 1 + activate_string = "Enable Syphon" + deactivate_string = "Disable Syphon" + +/obj/item/rig_module/protean/syphon/activate() + if(!..()) + return 0 + + var/mob/living/carbon/human/H = holder.wearer + if(H) + to_chat(usr, span_boldnotice("You activate the suit's energy syphon.")) + to_chat(H, span_warning("Your suit begins to sap at your own energy stores.")) + active = 1 + else + return 0 + +/obj/item/rig_module/protean/syphon/deactivate(var/forced) + if(!..()) + return 0 + if(forced) + active = 0 + return + var/mob/living/carbon/human/H = holder.wearer + if(H) + to_chat(usr, span_boldnotice("You deactivate the suit's energy syphon.")) + to_chat(H, span_warning("Your suit ceases from sapping your own energy.")) + active = 0 + else + return 0 + +/obj/item/rig_module/protean/syphon/process() + if(active) + var/mob/living/carbon/human/H = holder.wearer + var/mob/living/P = holder?:myprotean + if(istype(H.species, /datum/species/protean)) + to_chat(H, span_warning("Your Protean modules do not function on yourself.")) + deactivate(1) + else + P = P?:humanform + if((H.nutrition >= 100) && (P.nutrition <= 5000)) + H.nutrition -= 10 + P.nutrition += 10 + +//This rig module allows a worn Protean to toggle and configure its armor settings. +/obj/item/rig_module/protean/armor + name = "Protean Adaptive Armor" + desc = "This should never be outside of a RIG." + interface_name = "Protean Adaptive Armor" + interface_desc = "Adjusts the proteans deployed armor values to fit the needs of the wearer." + usable = 1 + toggleable = 1 + activate_string = "Enable Armor" + deactivate_string = "Disable Armor" + engage_string = "Configure Armor" + var/list/armor_settings = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0) + var/armor_weight_ratio = 0.01 //This amount of slowdown per 1% of armour. 3 slowdown at the max armour. + +/obj/item/rig_module/protean/armor/engage() + var/armor_chosen = input(usr, "Which armor to adjust?", "Protean Armor") as null|anything in armor_settings + if(armor_chosen) + var/armorvalue = tgui_input_number(usr, "Set armour reduction value (Max of 60%)", "Protean Armor",0,60) + if(isnum(armorvalue)) + armor_settings[armor_chosen] = armorvalue + interface_desc = initial(interface_desc) + slowdown = 0 + for(var/entry in armor_settings) //This is dumb and ugly but I dont feel like rewriting rig TGUI just to make this a pretty list + interface_desc += " [entry]: [armor_settings[entry]]" + slowdown += armor_settings[entry]*armor_weight_ratio + interface_desc += " Slowdown: [slowdown]" + +/obj/item/rig_module/protean/armor/activate() + if(holder?:assimilated_rig) + to_chat(usr, span_bolddanger("Armor module non-functional while a RIG is assimilated.")) + return + if(!..(1)) + return 0 + + var/mob/living/carbon/human/H = holder.wearer + if(H) + var/list/temparmor = list("bio" = 100, "rad" = 100) + temparmor = armor_settings + temparmor + to_chat(usr, span_boldnotice("You signal the suit to harden.")) + to_chat(H, span_notice("Your suit hardens in response to physical trauma.")) + holder.armor = temparmor.Copy() + for(var/obj/item/piece in list(holder.gloves,holder.helmet,holder.boots,holder.chest)) + piece.armor = temparmor.Copy() + holder.slowdown = slowdown + active = 1 + else + return 0 + +/obj/item/rig_module/protean/armor/deactivate(var/forced) + if(!..(1)) + return 0 + if(forced) + holder.armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100) + for(var/obj/item/piece in list(holder.gloves,holder.helmet,holder.boots,holder.chest)) + piece.armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100) + holder.slowdown = initial(slowdown) + active = 0 + return + var/mob/living/carbon/human/H = holder.wearer + if(H) + to_chat(usr, span_boldnotice("You signal the suit to relax.")) + to_chat(H, span_warning("Your suit softens.")) + holder.armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100) + for(var/obj/item/piece in list(holder.gloves,holder.helmet,holder.boots,holder.chest)) + piece.armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100) + holder.slowdown = initial(slowdown) + active = 0 + else + return 0 + +/obj/item/rig_module/protean/armor/process() + if(active) + var/mob/living/carbon/human/H = holder.wearer + if(istype(H.species, /datum/species/protean)) + to_chat(H, span_warning("Your Protean modules do not function on yourself.")) + deactivate(1) + + +//This rig module lets a Protean expend its metal stores to heal its host +/obj/item/rig_module/protean/healing + name = "Protean Restorative Nanites" + desc = "This should never be outside of a RIG." + interface_name = "Protean Restorative Nanites" + interface_desc = "Utilises stored steel from the Protean to slowly heal and repair the wearer." + toggleable = 1 + activate_string = "Enable Healing" + deactivate_string = "Disable Healing" + var/datum/modifier/healing + +/obj/item/rig_module/protean/healing/activate() + if(!..(1)) + return 0 + + var/mob/living/carbon/human/H = holder.wearer + var/mob/living/P = holder?:myprotean + if(H && P) + if(istype(H.species, /datum/species/protean)) + to_chat(H, span_warning("Your Protean modules do not function on yourself.")) + return 0 + var/obj/item/organ/internal/nano/refactory/R = P.nano_get_refactory() + if(R.get_stored_material(MAT_STEEL) >= 100) + healing = holder.wearer.add_modifier(/datum/modifier/protean/steel, origin = R) + to_chat(usr, span_boldnotice("You activate the suit's restorative nanites.")) + to_chat(H, span_warning("Your suit begins mending your injuries.")) + active = 1 + return 1 + return 0 + +/obj/item/rig_module/protean/healing/deactivate() + if(!..(1)) + return 0 + var/mob/living/carbon/human/H = holder.wearer + if(H) + to_chat(usr, span_boldnotice("You deactivate the suit's restorative nanites.")) + to_chat(H, span_warning("Your suit is no longer mending your injuries.")) + active = 0 + if(healing) + healing.expire() + healing = null + return 1 + else + return 0 + +/obj/item/rig_module/protean/healing/process() + if(active) + var/mob/living/carbon/human/H = holder.wearer + var/mob/living/P = holder?:myprotean + if((istype(H.species, /datum/species/protean)) || !H || !P) + to_chat(H, span_warning("Your Protean modules do not function on yourself.")) + deactivate() + return + var/obj/item/organ/internal/nano/refactory/R = P.nano_get_refactory() + if((!R.get_stored_material(MAT_STEEL))) + to_chat(H, span_warning("Your [holder] is out of steel.")) + deactivate() + return + +/obj/item/rig_module/protean/healing/accepts_item(var/obj/item/stack/material/steel/S, var/mob/living/user) + + if(!istype(S) || !istype(user)) + return 0 + + var/mob/living/P = holder?:myprotean + var/obj/item/organ/internal/nano/refactory/R = P?.nano_get_refactory() + + if(R?.add_stored_material(S.material.name,1*S.perunit) && S.use(1)) + to_chat(user, span_boldnotice("You directly feed some steel to the [holder].")) + return 1 + return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 653ea9a58a..6dba8b8f05 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -100,6 +100,11 @@ // Action button actions_types = list(/datum/action/item_action/hardsuit_interface) + // Protean + var/protean = 0 + var/obj/item/storage/backpack/rig_storage + permeability_coefficient = 0 //Protect the squishies, after all this shit should be waterproof. + /obj/item/rig/New() ..() @@ -538,7 +543,8 @@ offline = 0 if(istype(wearer) && !wearer.wearing_rig) wearer.wearing_rig = src - slowdown = initial(slowdown) + if(!istype(src,/obj/item/rig/protean)) // Stupid snowflake protean special check for rig assimilation code + slowdown = initial(slowdown) if(offline) if(offline == 1) @@ -914,15 +920,24 @@ wearer.lay_down() to_chat(user, span_notice("\The [wearer] is now [wearer.resting ? "resting" : "getting up"].")) -/obj/item/rig/proc/forced_move(var/direction, var/mob/user) +/obj/item/rig/proc/forced_move(var/direction, var/mob/user, var/ai_moving = TRUE) // Why is all this shit in client/Move()? Who knows? if(world.time < wearer_move_delay) return - if(!wearer || !wearer.loc || !ai_can_move_suit(user, check_user_module = 1)) + if(!wearer || !wearer.loc) // Removed some stuff for protean living hardsuit return +// Added this for protean living hardsuit + wearer_move_delay = world.time + 2 + if(ai_moving) + if(!ai_can_move_suit(user, check_user_module = 1)) + return + // AIs are a bit slower than regular and ignore move intent. + // Moved this to where it's relevant + wearer_move_delay = world.time + ai_controlled_move_delay + //This is sota the goto stop mobs from moving var if(wearer.transforming || !wearer.canmove) return @@ -953,9 +968,6 @@ to_chat(src, span_notice("Your host is pinned to a wall by [wearer.pinned[1]]!")) return 0 - // AIs are a bit slower than regular and ignore move intent. - wearer_move_delay = world.time + ai_controlled_move_delay - if(istype(wearer.buckled, /obj/vehicle)) //manually set move_delay for vehicles so we don't inherit any mob movement penalties //specific vehicle move delays are set in code\modules\vehicles\vehicle.dm @@ -980,7 +992,10 @@ wearer_move_delay += 2 return wearer.buckled.relaymove(wearer,direction) - cell.use(200) //Arbitrary, TODO + var/power_cost = 200 + if(!ai_moving) + power_cost = 20 + cell.use(power_cost) //Arbitrary, TODO wearer.Move(get_step(get_turf(wearer),direction),direction) // This returns the rig if you are contained inside one, but not if you are wearing it diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 5c45402b1f..b3fa7b100c 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -689,6 +689,7 @@ /obj/item/multitool = 4, /obj/item/cell/high = 10, /obj/item/airlock_electronics = 10, + /obj/item/circuitboard/airlock_cycling = 20, /obj/item/module/power_control = 10, /obj/item/circuitboard/airalarm = 10, /obj/item/circuitboard/firealarm = 10, diff --git a/code/modules/env_message/env_message.dm b/code/modules/env_message/env_message.dm index fc5ea527b3..69e1364b7b 100644 --- a/code/modules/env_message/env_message.dm +++ b/code/modules/env_message/env_message.dm @@ -8,7 +8,7 @@ var/global/list/env_messages = list() mouse_opacity = TRUE anchored = TRUE var/list/message_list = list() - var/combined_message = "You should not see this" + var/combined_message = DEVELOPER_WARNING_NAME /obj/effect/env_message/Initialize(mapload) .=..() diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 6f5e2b9497..be8ee51f25 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -3,7 +3,8 @@ GLOBAL_LIST_EMPTY(current_pending_diseases) var/datum/disease/chosen_disease var/list/disease_blacklist = list( /datum/disease/advance, - /datum/disease/food_poisoning + /datum/disease/food_poisoning, + /datum/disease/gbs // Terrible. It's only in the code to scare people. ) var/static/list/transmissable_symptoms = list() var/static/list/diseases_minor = list() @@ -44,7 +45,7 @@ GLOBAL_LIST_EMPTY(current_pending_diseases) continue if(!(A.z in using_map.station_levels)) continue - if(A.flags & RAD_SHIELDED) + if(A.flag_check(RAD_SHIELDED)) continue if(isbelly(G.loc)) continue diff --git a/code/modules/events/grubinfestation_vr.dm b/code/modules/events/grubinfestation_vr.dm index c73c8feea3..b256b1d7e4 100644 --- a/code/modules/events/grubinfestation_vr.dm +++ b/code/modules/events/grubinfestation_vr.dm @@ -12,7 +12,7 @@ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in machines) var/area/A = get_area(temp_vent) - if(A.forbid_events) + if(A.flag_check(AREA_FORBID_EVENTS)) continue if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels)) if(temp_vent.network.normal_members.len > 50) diff --git a/code/modules/events/ian_storm_vr.dm b/code/modules/events/ian_storm_vr.dm index 4cf60640cb..179832d8cd 100644 --- a/code/modules/events/ian_storm_vr.dm +++ b/code/modules/events/ian_storm_vr.dm @@ -17,7 +17,7 @@ if(!(T.z in using_map.station_levels)) continue var/area/A = get_area(T) - if(A.flags & RAD_SHIELDED || A.flags & BLUE_SHIELDED) + if(A.flag_check(RAD_SHIELDED | BLUE_SHIELDED)) continue place_ian(T) diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 9cc232a449..f264baca00 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -37,7 +37,7 @@ if(!(S.z in affecting_z)) continue var/area/A = get_area(S) - if(!A || A.flags & RAD_SHIELDED) // Rad shielding will protect from ions too + if(!A || A.flag_check(RAD_SHIELDED)) // Rad shielding will protect from ions too continue to_chat(S, span_warning("Your integrated sensors detect an ionospheric anomaly. Your systems will be impacted as you begin a partial restart.")) var/ionbug = rand(3, 9) diff --git a/code/modules/events/maint_lurker.dm b/code/modules/events/maint_lurker.dm new file mode 100644 index 0000000000..e82950fefb --- /dev/null +++ b/code/modules/events/maint_lurker.dm @@ -0,0 +1,22 @@ +/datum/event/maintenance_lurker + startWhen = 1 + endWhen = 30 + +/datum/event/maintenance_lurker/start() + + var/obj/effect/landmark/spawnspot = null + var/list/possibleSpawnspots = list() + for(var/obj/effect/landmark/L in landmarks_list) + if(L.name == "maint_pred") + possibleSpawnspots += L + if(possibleSpawnspots.len) + spawnspot = pick(possibleSpawnspots) + else + kill() // To prevent fake announcements + return + + if(!spawnspot) + kill() // To prevent fake announcements + return + + new /obj/structure/ghost_pod/ghost_activated/maint_lurker(get_turf(spawnspot)) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index becbaba012..de7f2b7768 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -39,7 +39,7 @@ var/area/A = get_area(C) if(!A) continue - if(A.flags & RAD_SHIELDED) + if(A.flag_check(RAD_SHIELDED)) continue if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index ad6b02c81e..8ba825464d 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -20,7 +20,7 @@ if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels)) if(temp_vent.network.normal_members.len > 50) var/area/A = get_area(temp_vent) - if(!(A.forbid_events)) + if(!(A.flag_check(AREA_FORBID_EVENTS))) vents += temp_vent while((spawncount >= 1) && vents.len) diff --git a/code/modules/events/spontaneous_appendicitis_vr.dm b/code/modules/events/spontaneous_appendicitis_vr.dm index d4d34894b9..0d5cf212e9 100644 --- a/code/modules/events/spontaneous_appendicitis_vr.dm +++ b/code/modules/events/spontaneous_appendicitis_vr.dm @@ -5,7 +5,7 @@ continue if(!(A.z in using_map.station_levels)) continue - if(A.flags & RAD_SHIELDED) + if(A.flag_check(RAD_SHIELDED)) continue if(isbelly(H.loc)) continue diff --git a/code/modules/events/wallrot.dm b/code/modules/events/wallrot.dm index 6c87fb8572..677a4698a6 100644 --- a/code/modules/events/wallrot.dm +++ b/code/modules/events/wallrot.dm @@ -12,7 +12,7 @@ if(istype(candidate, /turf/simulated/wall)) center = candidate var/area/A = get_area(candidate) - if(!A.forbid_events) + if(!A.flag_check(AREA_FORBID_EVENTS)) return 1 return 0 @@ -35,4 +35,4 @@ // Only rot up to severity walls if(rotcount >= actual_severity) - break \ No newline at end of file + break diff --git a/code/modules/food/drinkingglass/glass_boxes.dm b/code/modules/food/drinkingglass/glass_boxes.dm index 20dd616ee1..978f964bd7 100644 --- a/code/modules/food/drinkingglass/glass_boxes.dm +++ b/code/modules/food/drinkingglass/glass_boxes.dm @@ -81,4 +81,16 @@ /obj/item/storage/box/glasses/coffeemug name = "box of coffee mugs" - starts_with = list(/obj/item/reagent_containers/food/drinks/glass2/coffeemug = 7) \ No newline at end of file + starts_with = list(/obj/item/reagent_containers/food/drinks/glass2/coffeemug = 7) + +/obj/item/storage/box/glasses/coffeecup_tall + name = "box of tall cups" + starts_with = list(/obj/item/reagent_containers/food/drinks/tall = 7) + +/obj/item/storage/box/glasses/coffeecup_grande + name = "box of grande cups" + starts_with = list(/obj/item/reagent_containers/food/drinks/grande = 7) + +/obj/item/storage/box/glasses/coffeecup_venti + name = "box of venti cups" + starts_with = list(/obj/item/reagent_containers/food/drinks/venti = 7) diff --git a/code/modules/food/food/drinks/cup.dm b/code/modules/food/food/drinks/cup.dm index 1c7f7b326d..a427b61929 100644 --- a/code/modules/food/food/drinks/cup.dm +++ b/code/modules/food/food/drinks/cup.dm @@ -17,7 +17,12 @@ icon_state = "cup_brown" if(R.cup_name) - name = R.cup_name + var/prefix = " " + for(var/datum/reagent/S in reagents.reagent_list) + if(S.cup_prefix) + var/current_prefix = prefix + prefix = "[current_prefix][S.cup_prefix] " + name = "cup of[prefix][R.cup_name]" else name = "Cup of.. what?" diff --git a/code/modules/food/food/drinks/drinkingglass.dm b/code/modules/food/food/drinks/drinkingglass.dm index 3d48ab9068..2e7eff1850 100644 --- a/code/modules/food/food/drinks/drinkingglass.dm +++ b/code/modules/food/food/drinks/drinkingglass.dm @@ -67,7 +67,12 @@ icon_state = "cup_brown" if(R.cup_name) - name = R.cup_name + var/prefix = " " + for(var/datum/reagent/S in reagents.reagent_list) + if(S.cup_prefix) + var/current_prefix = prefix + prefix = "[current_prefix][S.cup_prefix] " + name = "cup of[prefix][R.cup_name]" else name = "Cup of.. what?" @@ -160,4 +165,148 @@ reagents.add_reagent("nutriment", 30) reagents.add_reagent("iron", 10) reagents.add_reagent("protein", 15) - reagents.add_reagent("water", 45) \ No newline at end of file + reagents.add_reagent("water", 45) + + +////////////////Fancy coffee cups + +/obj/item/reagent_containers/food/drinks/tall + name = "tall cup" + desc = "A larger coffee cup." + icon_state = "tall_cup_empty" + amount_per_transfer_from_this = 5 + volume = 40 + center_of_mass = list("x"=16, "y"=16) + +/obj/item/reagent_containers/food/drinks/tall/on_reagent_change() + if (!length(reagents?.reagent_list)) + icon_state = "tall_cup_empty" + name = "tall cup" + desc = "A larger coffee cup." + center_of_mass = list("x"=16, "y"=16) + return + var/datum/reagent/R = reagents.get_master_reagent() + + if(R.cup_icon_state) + icon_state = "tall_[R.cup_icon_state]" + else + icon_state = "tall_cup_brown" + + if(R.cup_name) + var/prefix = " " + for(var/datum/reagent/S in reagents.reagent_list) + if(S.cup_prefix) + var/current_prefix = prefix + prefix = "[current_prefix][S.cup_prefix] " + name = "tall[prefix][R.cup_name]" + else + name = "tall.. what?" + + if(R.cup_desc) + desc = R.cup_desc + else + desc = "You can't really tell what this is." + + if(R.cup_center_of_mass) + center_of_mass = R.cup_center_of_mass + else + center_of_mass = list("x"=16, "y"=16) + + if(R.price_tag) + price_tag = R.price_tag + else + price_tag = null + +/obj/item/reagent_containers/food/drinks/grande + name = "grande cup" + desc = "A much taller coffee cup for people who really need their coffee." + icon_state = "grande_cup_empty" + amount_per_transfer_from_this = 5 + volume = 50 + center_of_mass = list("x"=16, "y"=16) + +/obj/item/reagent_containers/food/drinks/grande/on_reagent_change() + if (!length(reagents?.reagent_list)) + icon_state = "grande_cup_empty" + name = "grande cup" + desc = "A much taller coffee cup for people who really need their coffee." + center_of_mass = list("x"=16, "y"=16) + return + var/datum/reagent/R = reagents.get_master_reagent() + + if(R.cup_icon_state) + icon_state = "grande_[R.cup_icon_state]" + else + icon_state = "grande_cup_brown" + + if(R.cup_name) + var/prefix = " " + for(var/datum/reagent/S in reagents.reagent_list) + if(S.cup_prefix) + var/current_prefix = prefix + prefix = "[current_prefix][S.cup_prefix] " + name = "grande[prefix][R.cup_name]" + else + name = "grande.. what?" + + if(R.cup_desc) + desc = R.cup_desc + else + desc = "You can't really tell what this is." + + if(R.cup_center_of_mass) + center_of_mass = R.cup_center_of_mass + else + center_of_mass = list("x"=16, "y"=16) + + if(R.price_tag) + price_tag = R.price_tag + else + price_tag = null + +/obj/item/reagent_containers/food/drinks/venti + name = "venti cup" + desc = "A huge coffee cup for people who literally cannot function without it." + icon_state = "venti_cup_empty" + amount_per_transfer_from_this = 5 + volume = 60 + center_of_mass = list("x"=16, "y"=16) + +/obj/item/reagent_containers/food/drinks/venti/on_reagent_change() + if (!length(reagents?.reagent_list)) + icon_state = "venti_cup_empty" + name = "venti cup" + desc = "A huge coffee cup for people who literally cannot function without it." + center_of_mass = list("x"=16, "y"=16) + return + var/datum/reagent/R = reagents.get_master_reagent() + + if(R.cup_icon_state) + icon_state = "venti_[R.cup_icon_state]" + else + icon_state = "venti_cup_brown" + + if(R.cup_name) + var/prefix = " " + for(var/datum/reagent/S in reagents.reagent_list) + if(S.cup_prefix) + var/current_prefix = prefix + prefix = "[current_prefix][S.cup_prefix] " + name = "venti[prefix][R.cup_name]" + else + name = "venti.. what?" + + if(R.cup_desc) + desc = R.cup_desc + else + desc = "You can't really tell what this is." + + if(R.cup_center_of_mass) + center_of_mass = R.cup_center_of_mass + else + center_of_mass = list("x"=16, "y"=16) + + if(R.price_tag) + price_tag = R.price_tag + else + price_tag = null diff --git a/code/modules/food/kitchen/smartfridge/engineering.dm b/code/modules/food/kitchen/smartfridge/engineering.dm index 721f5040da..ed370ef3fd 100644 --- a/code/modules/food/kitchen/smartfridge/engineering.dm +++ b/code/modules/food/kitchen/smartfridge/engineering.dm @@ -16,7 +16,7 @@ persistent = /datum/persistent/storage/smartfridge/sheet_storage/lossy /obj/machinery/smartfridge/sheets/accept_check(var/obj/item/O) - return istype(O, /obj/item/stack/material) + return istype(O, /obj/item/stack/material) && !istype(O, /obj/item/stack/material/cyborg) /obj/machinery/smartfridge/sheets/vend(datum/stored_item/stack/I, var/count) var/amount = I.get_amount() @@ -48,4 +48,4 @@ /obj/machinery/smartfridge/sheets/mining/persistent persistent = /datum/persistent/storage/smartfridge/sheet_storage /obj/machinery/smartfridge/sheets/mining/persistent_lossy - persistent = /datum/persistent/storage/smartfridge/sheet_storage/lossy \ No newline at end of file + persistent = /datum/persistent/storage/smartfridge/sheet_storage/lossy diff --git a/code/modules/gamemaster/event2/event.dm b/code/modules/gamemaster/event2/event.dm index 50be78a14b..bc99179f17 100644 --- a/code/modules/gamemaster/event2/event.dm +++ b/code/modules/gamemaster/event2/event.dm @@ -107,7 +107,7 @@ This allows for events that have their announcement happen after the end itself. var/list/area/grand_list_of_areas = get_all_existing_areas_of_types(specific_areas) . = list() for(var/area/A as anything in shuffle(grand_list_of_areas)) - if(A.forbid_events) + if(A.flag_check(AREA_FORBID_EVENTS)) continue if(!(A.z in get_location_z_levels())) continue diff --git a/code/modules/looking_glass/lg_console.dm b/code/modules/looking_glass/lg_console.dm index 496de3b385..e3a9ec8204 100644 --- a/code/modules/looking_glass/lg_console.dm +++ b/code/modules/looking_glass/lg_console.dm @@ -1,6 +1,6 @@ /obj/machinery/computer/looking_glass name = "looking glass control" - desc = "Controls the looking glass displays in this room." + desc = "Controls the looking glass displays in this room. Provided courtesy of NT's Advanced Spatial Imaging Division." icon_keyboard = "tech_key" icon_screen = "holocontrol" diff --git a/code/modules/lore_codex/lore_data_vr/orgs.dm b/code/modules/lore_codex/lore_data_vr/orgs.dm index 6a9ced097c..2cd32f6c91 100644 --- a/code/modules/lore_codex/lore_data_vr/orgs.dm +++ b/code/modules/lore_codex/lore_data_vr/orgs.dm @@ -29,7 +29,7 @@ /datum/lore/codex/category/auto_org/other name = "Other Factions" - auto_keywords = list("KHI","SDF","Smuggler","Smugglers","Pirate","Pirates") + auto_keywords = list("SDF","Smuggler","Smugglers","Pirate","Pirates") desired_type = /datum/lore/organization/other /datum/lore/codex/category/auto_org/gov diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 77a9acc6d5..d0d103c1fe 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -196,7 +196,7 @@ Works together with spawning an observer, noted above. if(!isturf(loc)) return var/area/A = get_area(src) - if(A.block_ghosts) + if(A.flag_check(AREA_BLOCK_GHOSTS)) to_chat(src, span_warning("Ghosts can't enter this location.")) return_to_spawn() @@ -452,7 +452,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //RS Port #658 Start var/area/A = get_area(destination) - if(A.block_ghosts) + if(A.flag_check(AREA_BLOCK_GHOSTS)) to_chat(src,span_warning("Sorry, that area does not allow ghosts.")) if(following) stop_following() diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index a3a39bb3f8..a9327c3ff8 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -385,6 +385,29 @@ var/list/holder_mob_icon_cache = list() item_icons = list(slot_l_hand_str = 'icons/mob/holder_complex_yw.dmi', slot_r_hand_str = 'icons/mob/holder_complex_yw.dmi') //YW Add - holder slot_flags = SLOT_BACK +/obj/item/holder/proc/sync(var/mob/living/M) + dir = 2 + overlays.Cut() + if(M.item_state) + item_state = M.item_state + color = M.color + name = M.name + desc = M.desc + overlays |= M.overlays + +/obj/item/holder/protoblob + slot_flags = SLOT_HEAD | SLOT_OCLOTHING | SLOT_HOLSTER | SLOT_ICLOTHING | SLOT_ID | SLOT_EARS + w_class = ITEMSIZE_TINY + allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/suit_cooling_unit,/obj/item/melee/baton) + item_icons = list( + slot_l_hand_str = 'icons/mob/lefthand_holder.dmi', + slot_r_hand_str = 'icons/mob/righthand_holder.dmi', + slot_head_str = 'icons/mob/head.dmi', + slot_w_uniform_str = 'icons/mob/uniform.dmi', + slot_wear_suit_str = 'icons/mob/suit.dmi', + slot_r_ear_str = 'icons/mob/ears.dmi', + slot_l_ear_str = 'icons/mob/ears.dmi') + //YW Addition Start - Holder code for tesh /obj/item/holder/human/Initialize(mapload, mob/held) . = ..() diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 44626f5e0e..a41f45ef35 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -296,9 +296,9 @@ if(href_list["default_lang"]) if(href_list["default_lang"] == "reset") if (species_language) - set_default_language(GLOB.all_languages[species_language]) + apply_default_language(GLOB.all_languages[species_language]) else - set_default_language(GLOB.all_languages[LANGUAGE_GIBBERISH]) + apply_default_language(GLOB.all_languages[LANGUAGE_GIBBERISH]) else var/datum/language/L = locate(href_list["default_lang"]) if(L && (L in languages)) diff --git a/code/modules/mob/living/carbon/human/human_helpers_vr.dm b/code/modules/mob/living/carbon/human/human_helpers_vr.dm index 7d02ca95a0..28eea3e81e 100644 --- a/code/modules/mob/living/carbon/human/human_helpers_vr.dm +++ b/code/modules/mob/living/carbon/human/human_helpers_vr.dm @@ -126,11 +126,155 @@ var/static/icon/ingame_hud_med_vr = icon('icons/mob/hud_med_vr.dmi') //does not really need to happen, that kinda thing will only happen when putting another person's limb onto your own body return sorted +/mob/living/carbon/human/proc/transform_into_other_human(var/mob/living/carbon/human/character, var/copy_name, var/copy_flavour = TRUE, var/convert_to_prosthetics = FALSE) + /* + name, nickname, flavour, OOC notes + gender, sex + custom species name, custom bodytype, weight, scale, scaling center, sound type, sound freq + custom say verbs + ears, wings, tail, hair, facial hair + ears colors, wings colors, tail colors + body color, prosthetics (if they're a protean) (convert to DSI if protean and not prosthetic), eye color, hair color etc + markings + custom synth markings toggle, custom synth color toggle + digitigrade + blood color + */ + if (copy_name) + name = character.name + nickname = character.nickname + gender = character.gender + identifying_gender = character.identifying_gender + + r_eyes = character.r_eyes + g_eyes = character.g_eyes + b_eyes = character.b_eyes + h_style = character.h_style + r_hair = character.r_hair + g_hair = character.g_hair + b_hair = character.b_hair + r_grad = character.r_grad + g_grad = character.g_grad + b_grad = character.b_grad + f_style = character.f_style + r_facial = character.r_facial + g_facial = character.g_facial + b_facial = character.b_facial + r_skin = character.r_skin + g_skin = character.g_skin + b_skin = character.b_skin + s_tone = character.s_tone + h_style = character.h_style + grad_style = character.grad_style + f_style = character.f_style + grad_style = character.grad_style + b_type = character.b_type + synth_color = character.synth_color + r_synth = character.r_synth + g_synth = character.g_synth + b_synth = character.b_synth + synth_markings = character.synth_markings + + ear_style = character.ear_style + r_ears = character.r_ears + b_ears = character.b_ears + g_ears = character.g_ears + r_ears2 = character.r_ears2 + b_ears2 = character.b_ears2 + g_ears2 = character.g_ears2 + r_ears3 = character.r_ears3 + b_ears3 = character.b_ears3 + g_ears3 = character.g_ears3 + + tail_style = character.tail_style + r_tail = character.r_tail + b_tail = character.b_tail + g_tail = character.g_tail + r_tail2 = character.r_tail2 + b_tail2 = character.b_tail2 + g_tail2 = character.g_tail2 + r_tail3 = character.r_tail3 + b_tail3 = character.b_tail3 + g_tail3 = character.g_tail3 + + wing_style = character.wing_style + r_wing = character.r_wing + b_wing = character.b_wing + g_wing = character.g_wing + r_wing2 = character.r_wing2 + b_wing2 = character.b_wing2 + g_wing2 = character.g_wing2 + r_wing3 = character.r_wing3 + b_wing3 = character.b_wing3 + g_wing3 = character.g_wing3 + var/bodytype = character.species?.get_bodytype() + if (convert_to_prosthetics) //should only really be run for proteans + var/list/organs_to_edit = list() + for (var/name in list(BP_TORSO, BP_HEAD, BP_GROIN, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/O = character.organs_by_name[name] + if (O) + var/x = organs_to_edit.Find(O.parent_organ) + if (x == 0) + organs_to_edit += name + else + organs_to_edit.Insert(x+(O.robotic == ORGAN_NANOFORM ? 1 : 0), name) + for(var/name in organs_to_edit) + var/obj/item/organ/external/I = character.organs_by_name[name] + var/obj/item/organ/external/O = organs_by_name[name] + if(O) + if(I.robotic >= ORGAN_ROBOT) + O.robotize(I.model) + else + var/dsi_company = GLOB.dsi_to_species[bodytype] + if (!dsi_company) + dsi_company = "DSI - Adaptive" + O.robotize(dsi_company) + for(var/N in character.organs_by_name) + var/obj/item/organ/external/O = organs_by_name[N] + var/obj/item/organ/external/I = character.organs_by_name[N] + O.markings = I.markings.Copy() + markings_len = character.markings_len + descriptors = character.descriptors?.Copy() + if (copy_flavour) + flavor_texts = character.flavor_texts?.Copy() + weight = character.weight + weight_gain = character.weight_gain + weight_loss = character.weight_loss + fuzzy = character.fuzzy + offset_override = character.offset_override + voice_freq = character.voice_freq + if (species && character.species) + species.micro_size_mod = character.species.micro_size_mod + species.icon_scale_x = character.species.icon_scale_x + species.icon_scale_y = character.species.icon_scale_y + update_transform() + resize(character.size_multiplier, animate = TRUE, ignore_prefs = TRUE) + voice_sounds_list = character.voice_sounds_list + + species?.blood_color = character.species?.blood_color + + dna?.base_species = bodytype + species?.base_species = bodytype + species?.vanity_base_fit = bodytype + if (istype(species, /datum/species/shapeshifter)) + wrapped_species_by_ref["\ref[src]"] = bodytype + + custom_species = character.custom_species + custom_say = character.custom_say + custom_ask = character.custom_ask + custom_whisper = character.custom_whisper + custom_exclaim = character.custom_exclaim + + digitigrade = character.digitigrade + + dna?.ResetUIFrom(src) + force_update_limbs() + regenerate_icons() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7f7b2d7aad..4a11af321f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1631,7 +1631,7 @@ // Do this early so certain stuff gets turned off before vision is assigned. var/area/A = get_area(src) - if(A?.no_spoilers) + if(A?.flag_check(AREA_NO_SPOILERS)) disable_spoiler_vision() if(XRAY in mutations) diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index bb8ba4b5a2..82af7ed306 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -34,7 +34,7 @@ //RS Port #658 Start var/area/A = get_area(src) - if(!client?.holder && A.block_phase_shift) + if(!client?.holder && A.flag_check(AREA_BLOCK_PHASE_SHIFT)) to_chat(src, span_warning("You can't do that here!")) return //RS Port #658 End diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 863e6cd0a9..09fc23d4c7 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -225,6 +225,8 @@ var/rarity_value = 1 // Relative rarity/collector value for this species. var/economic_modifier = 2 // How much money this species makes + var/vanity_base_fit //when shapeshifting using vanity_copy_to, this allows you to have add something so they can go back to their original species fit + var/vore_belly_default_variant = "H" // Determines the organs that the species spawns with and diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index 69eee28388..ade1ef0fc8 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -16,7 +16,7 @@ var/list/wrapped_species_by_ref = list() //var/default_form = SPECIES_HUMAN //VOREStation edit /datum/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H) - return valid_transform_species + return list(vanity_base_fit)|valid_transform_species /datum/species/shapeshifter/get_icobase(var/mob/living/carbon/human/H, var/get_deform) if(!H) return ..(null, get_deform) diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm index 5a0d5ce3a6..6dc8616210 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm @@ -58,7 +58,7 @@ /mob/living/carbon/human/proc/shapeshifter_select_secondary_ears() set name = "Select Secondary Ears" - set category = "Abilities" + set category = "Abilities.Shapeshift" if(stat || world.time < last_special) return @@ -78,12 +78,13 @@ ear_secondary_style = ear_styles_list[pretty_ear_styles[new_ear_style]] // Handle color picks - var/list/new_colors = list() - for(var/channel in 1 to ear_secondary_style.get_color_channel_count()) - var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel] - var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff" - var/new_color = input(usr, "Pick [channel_name]", "Ear Color ([channel_name])", default) as color | null - new_colors += new_color || default + if(ear_secondary_style) + var/list/new_colors = list() + for(var/channel in 1 to ear_secondary_style.get_color_channel_count()) + var/channel_name = GLOB.fancy_sprite_accessory_color_channel_names[channel] + var/default = LAZYACCESS(ear_secondary_colors, channel) || "#ffffff" + var/new_color = input(usr, "Pick [channel_name]", "Ear Color ([channel_name])", default) as color | null + new_colors += new_color || default update_hair() diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm index 0b7e542bc9..ad51161bc9 100644 --- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm @@ -12,13 +12,15 @@ //appearance_flags = RADIATION_GLOWS shock_resist = 0 // Lets not be immune to zaps. friendly = list("nuzzles", "glomps", "snuggles", "cuddles", "squishes") // lets be cute :3 - melee_damage_upper = 0 - melee_damage_lower = 0 + harm_intent_damage = 3 + melee_damage_lower = 5 + melee_damage_upper = 5 player_msg = "You're a little squisher! Your cuteness level has increased tenfold." heat_damage_per_tick = 20 // Hot and cold are bad, but cold is AS bad for prommies as it is for slimes. cold_damage_per_tick = 20 //glow_range = 0 //glow_intensity = 0 + has_hands = 1 // brings in line with Proteans' own blob form. var/mob/living/carbon/human/humanform var/datum/modifier/healing @@ -86,6 +88,13 @@ humanform.species.update_misc_tabs(src) /mob/living/simple_mob/slime/promethean/handle_special() // Should disable default slime healing, we'll use nutrition based heals instead. +// They already heal from their carbon form while even in slime form, but this is for a small bonus healing for being unformed. + adjustOxyLoss(-0.2) + adjustToxLoss(-0.2) + adjustFireLoss(-0.2) + adjustCloneLoss(-0.2) + adjustBruteLoss(-0.2) + adjustHalLoss(-6) // HalLoss ticks down FAST if(rad_glow) rad_glow = CLAMP(rad_glow,0,250) set_light(max(1,min(5,rad_glow/15)), max(1,min(10,rad_glow/25)), color) @@ -368,25 +377,14 @@ drop_from_inventory(H) things_to_drop -= H - for(var/obj/item/I in things_to_drop) //rip hoarders - drop_from_inventory(I) - - if(w_uniform && istype(w_uniform,/obj/item/clothing)) //No webbings tho. We do this after in case a suit was in the way - var/obj/item/clothing/uniform = w_uniform - if(LAZYLEN(uniform.accessories)) - for(var/obj/item/clothing/accessory/A in uniform.accessories) - if(is_type_in_list(A, disallowed_protean_accessories)) - uniform.remove_accessory(null,A) //First param is user, but adds fingerprints and messages - //Size update blob.transform = matrix()*size_multiplier blob.size_multiplier = size_multiplier - if(l_hand) blob.prev_left_hand = l_hand //Won't save them if dropped above, but necessary if handdrop is disabled. - if(r_hand) blob.prev_right_hand = r_hand + if(l_hand) drop_from_inventory(l_hand) + if(r_hand) drop_from_inventory(r_hand) //Put our owner in it (don't transfer var/mind) - blob.Weaken(2) blob.transforming = TRUE blob.ckey = ckey blob.ooc_notes = ooc_notes @@ -394,6 +392,7 @@ blob.ooc_notes_dislikes = ooc_notes_dislikes blob.transforming = FALSE blob.name = name + blob.real_name = real_name blob.nutrition = nutrition blob.color = rgb(r_skin, g_skin, b_skin) playsound(src.loc, "sound/effects/slime_squish.ogg", 15) @@ -411,6 +410,18 @@ remove_verb(blob, /mob/living/proc/ventcrawl) // Absolutely not. remove_verb(blob, /mob/living/simple_mob/proc/set_name) // We already have a name. temporary_form = blob + + var/obj/item/radio/R = null + if(isradio(l_ear)) + R = l_ear + if(isradio(r_ear)) + R = r_ear + if(R) + blob.mob_radio = R + R.forceMove(blob) + if(wear_id) + blob.myid = wear_id.GetID() + //Mail them to nullspace moveToNullspace() @@ -460,7 +471,6 @@ forceMove(reform_spot) //Put our owner in it (don't transfer var/mind) - Weaken(2) playsound(src.loc, "sound/effects/slime_squish.ogg", 15) transforming = TRUE ckey = blob.ckey @@ -493,8 +503,15 @@ B.owner = src //vore_organs.Cut() - if(blob.prev_left_hand) put_in_l_hand(blob.prev_left_hand) //The restore for when reforming. - if(blob.prev_right_hand) put_in_r_hand(blob.prev_right_hand) + + if(blob.l_hand) blob.drop_from_inventory(blob.l_hand) + if(blob.r_hand) blob.drop_from_inventory(blob.r_hand) + + if(blob.mob_radio) + blob.mob_radio.forceMove(src) + blob.mob_radio = null + if(blob.myid) + blob.myid = null Life(1) //Fix my blindness right meow //Has to be moved up here, there exists a circumstance where blob could be deleted without vore organs moving right. @@ -522,3 +539,8 @@ else if(humanform.say_understands(other, speaking)) //So they're speaking something other than promethean or sign, let's just ask our original mob if it understands return TRUE else return FALSE + +/mob/living/simple_mob/slime/promethean/character_directory_species() + if (humanform) + return "[humanform.custom_species ? humanform.custom_species : (humanform.species ? humanform.species.name : "Promethean Blob")]" + return "Promethean Blob" diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 40d366f7d5..961fc177bc 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -5,9 +5,9 @@ tt_desc = "Animated nanogoop" icon = 'icons/mob/species/protean/protean.dmi' icon_state = "to_puddle" - icon_living = "puddle2" - icon_rest = "rest" - icon_dead = "puddle" + icon_living = "puddle0-eyes" //Null icon, since we're made of overlays now. + icon_rest = "puddle0-eyes" + icon_dead = "puddle0-eyes" faction = FACTION_NEUTRAL maxHealth = 200 @@ -16,11 +16,11 @@ show_stat_health = FALSE //We will do it ourselves - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help = "pets the" + response_disarm = "gently pushes aside the " + response_harm = "hits the" - harm_intent_damage = 2 + harm_intent_damage = 3 melee_damage_lower = 5 melee_damage_upper = 5 attacktext = list("slashed") @@ -34,22 +34,32 @@ min_n2 = 0 max_n2 = 0 minbodytemp = 0 - maxbodytemp = 900 - movement_cooldown = -0.5 // Should mean that the little blurb about being quicker in blobform rings true. May need further adjusting. + maxbodytemp = 1100 + movement_cooldown = 0 + hunger_rate = 0 var/mob/living/carbon/human/humanform var/obj/item/organ/internal/nano/refactory/refactory var/datum/modifier/healing - var/obj/prev_left_hand - var/obj/prev_right_hand - var/human_brute = 0 var/human_burn = 0 - player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you, and you can ventcrawl!" + player_msg = "In this form, your health will regenerate as long as you have metal in you." - can_buckle = TRUE //Blobsurfing + can_buckle = 1 + buckle_lying = 1 + mount_offset_x = 0 + mount_offset_y = 0 + has_hands = 1 + shock_resist = 1 + nameset = 1 + holder_type = /obj/item/holder/protoblob + var/hiding = 0 + vore_icons = 1 + vore_active = 1 + + plane = ABOVE_MOB_PLANE //Necessary for overlay based icons /datum/say_list/protean_blob speak = list("Blrb?","Sqrsh.","Glrsh!") @@ -63,14 +73,88 @@ humanform = H updatehealth() refactory = locate() in humanform.internal_organs - add_verb(src, /mob/living/proc/ventcrawl) - add_verb(src, /mob/living/proc/hide) + add_verb(src,/mob/living/proc/ventcrawl) + add_verb(src,/mob/living/proc/usehardsuit) + add_verb(src,/mob/living/simple_mob/protean_blob/proc/nano_partswap) + add_verb(src,/mob/living/simple_mob/protean_blob/proc/nano_regenerate) + add_verb(src,/mob/living/simple_mob/protean_blob/proc/nano_metalnom) + add_verb(src,/mob/living/simple_mob/protean_blob/proc/nano_blobform) + add_verb(src,/mob/living/simple_mob/protean_blob/proc/nano_rig_transform) + add_verb(src,/mob/living/simple_mob/protean_blob/proc/appearance_switch) + add_verb(src,/mob/living/simple_mob/protean_blob/proc/nano_latch) else update_icon() + add_verb(src,/mob/living/simple_mob/proc/animal_mount) + add_verb(src,/mob/living/proc/toggle_rider_reins) + +//Hidden verbs for macro hotkeying +/mob/living/simple_mob/protean_blob/proc/nano_partswap() + set name = "Ref - Single Limb" + set desc = "Allows you to replace and reshape your limbs as you see fit." + //set category = "Abilities.Protean" + set hidden = 1 + humanform.nano_partswap() + +/mob/living/simple_mob/protean_blob/proc/nano_regenerate() + set name = "Total Reassembly (wip)" + set desc = "Completely reassemble yourself from whatever save slot you have loaded in preferences. Assuming you meet the requirements." + //set category = "Abilities.Protean" + set hidden = 1 + humanform.nano_regenerate() + +/mob/living/simple_mob/protean_blob/proc/nano_blobform() + set name = "Toggle Blobform" + set desc = "Switch between amorphous and humanoid forms." + //set category = "Abilities.Protean" + set hidden = 1 + humanform.nano_blobform() + +/mob/living/simple_mob/protean_blob/proc/nano_metalnom() + set name = "Ref - Store Metals" + set desc = "If you're holding a stack of material, you can consume some and store it for later." + //set category = "Abilities.Protean" + set hidden = 1 + humanform.nano_metalnom() + +/mob/living/simple_mob/protean_blob/proc/nano_rig_transform() + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean to retract its mass into its hardsuit module at will." + //set category = "Abilities.Protean" + set hidden = 1 + humanform.nano_rig_transform() + +/mob/living/simple_mob/protean_blob/proc/appearance_switch() + set name = "Switch Blob Appearance" + set desc = "Allows a protean blob to switch its outwards appearance." + //set category = "Abilities.Protean" + set hidden = 1 + humanform.appearance_switch() + +/mob/living/simple_mob/protean_blob/proc/nano_latch() + set name = "Latch/Unlatch host" + set desc = "Allows a protean to forcibly latch or unlatch from a host." + //set category = "Abilities.Protean" + set hidden = 1 + humanform.nano_latch() /mob/living/simple_mob/protean_blob/Login() - . = ..() - copy_from_prefs_vr(bellies = FALSE) //Load vore prefs + ..() + plane_holder.set_vis(VIS_AUGMENTED, 1) + plane_holder.set_vis(VIS_CH_HEALTH_VR, 1) + plane_holder.set_vis(VIS_CH_ID, 1) + plane_holder.set_vis(VIS_CH_STATUS_R, 1) + plane_holder.set_vis(VIS_CH_BACKUP, 1) //Gonna need these so we can see the status of our host. Could probably write it so this only happens when worn, but eeehhh + if(!riding_datum) + riding_datum = new /datum/riding/simple_mob/protean_blob(src) + +/datum/riding/simple_mob/protean_blob/handle_vehicle_layer() + ridden.layer = OBJ_LAYER + +/mob/living/simple_mob/protean_blob/MouseDrop_T() + return + +/mob/living/simple_mob/protean_blob/runechat_y_offset(width, height) + return (..()) - (20*size_multiplier) /mob/living/simple_mob/protean_blob/Destroy() humanform = null @@ -90,60 +174,44 @@ /mob/living/simple_mob/protean_blob/speech_bubble_appearance() return "synthetic" -/mob/living/simple_mob/protean_blob/get_available_emotes() - return global._robot_default_emotes.Copy() - /mob/living/simple_mob/protean_blob/init_vore() return //Don't make a random belly, don't waste your time /mob/living/simple_mob/protean_blob/isSynthetic() return TRUE // yup +/mob/living/simple_mob/protean_blob/get_available_emotes() + var/list/fulllist = global._robot_default_emotes.Copy() + fulllist |= global._human_default_emotes //they're living nanites, they can make whatever sounds they want + return fulllist + /mob/living/simple_mob/protean_blob/update_misc_tabs() . = ..() if(humanform) humanform.species.update_misc_tabs(src) -/mob/living/simple_mob/protean_blob/update_icon() - if(humanform) - //Still have a refactory - if(istype(refactory)) - icon_living = "puddle2" - - //Else missing one - else - icon_living = "puddle1" - - //Not human-based - else - icon_living = "puddle0" - - ..() - /mob/living/simple_mob/protean_blob/updatehealth() + if(humanform.nano_dead_check(src)) + return if(!humanform) return ..() //Set the max maxHealth = humanform.getMaxHealth()*2 //HUMANS, and their 'double health', bleh. - //Set us to their health, but, human health ignores robolimbs so we do it 'the hard way' human_brute = humanform.getActualBruteLoss() human_burn = humanform.getActualFireLoss() - health = maxHealth - humanform.getOxyLoss() - humanform.getToxLoss() - humanform.getCloneLoss() - human_brute - human_burn + health = maxHealth - humanform.getOxyLoss() - humanform.getToxLoss() - humanform.getCloneLoss() - humanform.getBruteLoss() - humanform.getFireLoss() //Alive, becoming dead if((stat < DEAD) && (health <= 0)) - death() + humanform.death() + + nutrition = humanform.nutrition //Overhealth if(health > getMaxHealth()) health = getMaxHealth() - //Grab any other interesting values - confused = humanform.confused - radiation = humanform.radiation - paralysis = humanform.paralysis - //Update our hud if we have one if(healths) if(stat != DEAD) @@ -174,14 +242,12 @@ return ..() /mob/living/simple_mob/protean_blob/adjustBruteLoss(var/amount,var/include_robo) - amount *= 1.5 if(humanform) return humanform.adjustBruteLoss(amount) else return ..() /mob/living/simple_mob/protean_blob/adjustFireLoss(var/amount,var/include_robo) - amount *= 1.5 if(humanform) return humanform.adjustFireLoss(amount) else @@ -211,6 +277,12 @@ else return ..() +/mob/living/simple_mob/protean_blob/adjust_nutrition(amount) + if(humanform) + return humanform.adjust_nutrition(amount) + else + return ..() + /mob/living/simple_mob/protean_blob/emp_act(severity) if(humanform) return humanform.emp_act(severity) @@ -224,8 +296,10 @@ return ..() /mob/living/simple_mob/protean_blob/rad_act(severity) + if(istype(loc, /obj/item/rig)) + return //Don't irradiate us while we're in rig mode if(humanform) - return humanform.ex_act(severity) + return humanform.rad_act(severity) else return ..() @@ -235,38 +309,55 @@ else return ..() -/mob/living/simple_mob/protean_blob/death(gibbed, deathmessage = "dissolves away, leaving only a few spare parts!") +/mob/living/simple_mob/protean_blob/death(gibbed, deathmessage = "Coalesces inwards, retreating into their core componants") if(humanform) humanform.death(gibbed, deathmessage) else animate(src, alpha = 0, time = 2 SECONDS) sleep(2 SECONDS) - if(!QDELETED(src)) // Human's handle death should have taken us, but maybe we were adminspawned or something without a human counterpart - qdel(src) - /mob/living/simple_mob/protean_blob/Life() . = ..() - if(. && istype(refactory) && humanform) - if(!healing && (human_brute || human_burn) && refactory.get_stored_material(MAT_STEEL) >= 100) - healing = humanform.add_modifier(/datum/modifier/protean/steel, origin = refactory) - else if(healing && !(human_brute || human_burn)) + if(!humanform.nano_dead_check(src)) + if(. && istype(refactory) && humanform) + if(!healing && (human_brute || human_burn) && refactory.get_stored_material(MAT_STEEL) >= 100) + healing = humanform.add_modifier(/datum/modifier/protean/steel, origin = refactory) + else if(healing && !(human_brute || human_burn)) + healing.expire() + healing = null + else + if(healing) healing.expire() healing = null /mob/living/simple_mob/protean_blob/lay_down() + var/obj/item/rig/rig = src.get_rig() + if(rig) + rig.force_rest(src) + return ..() - if(resting) - animate(src,alpha = 40,time = 1 SECOND) + +/mob/living/simple_mob/protean_blob/verb/prot_hide() + set name = "Hide Self" + set desc = "Disperses your mass into a thin veil, making a trap to snatch prey with, or simply hide." + set category = "Abilities.Protean" + + if(!hiding) + cut_overlays() + icon = 'icons/mob/species/protean/protean.dmi' + icon_state = "hide" + sleep(7) mouse_opacity = 0 plane = ABOVE_OBJ_PLANE + hiding = 1 else + icon = 'icons/mob/species/protean/protean.dmi' mouse_opacity = 1 icon_state = "wake" - animate(src,alpha = 255,time = 1 SECOND) - plane = MOB_PLANE + plane = initial(plane) sleep(7) update_icon() + hiding = 0 //Potential glob noms if(can_be_drop_pred) //Toggleable in vore panel var/list/potentials = living_mobs(0) @@ -276,21 +367,15 @@ if(target.buckled) target.buckled.unbuckle_mob(target, force = TRUE) target.forceMove(vore_selected) - to_chat(target,span_vwarning("\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!")) + to_chat(target,span_warning("\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!")) + update_canmove() -/mob/living/simple_mob/protean_blob/attack_target(var/atom/A) - if(refactory && istype(A,/obj/item/stack/material)) - var/obj/item/stack/material/S = A - var/substance = S.material.name - var allowed = FALSE - for(var/material in PROTEAN_EDIBLE_MATERIALS) - if(material == substance) allowed = TRUE - if(!allowed) - return - if(refactory.add_stored_material(S.material.name,1*S.perunit) && S.use(1)) - visible_message(span_infoplain(span_bold("[name]") + " gloms over some of \the [S], absorbing it.")) +/mob/living/simple_mob/protean_blob/update_canmove() + if(hiding) + canmove = 0 + return canmove else - return ..() + ..() /mob/living/simple_mob/protean_blob/attackby(var/obj/item/O, var/mob/user) if(refactory && istype(O,/obj/item/stack/material)) @@ -306,104 +391,115 @@ else return ..() +/mob/living/simple_mob/protean_blob/attack_hand(mob/living/L) + if(L.get_effective_size() >= (src.get_effective_size() + 0.5) ) + src.get_scooped(L) + else + ..() + +/mob/living/simple_mob/protean_blob/MouseDrop(var/atom/over_object) + if(ishuman(over_object) && usr == src && src.Adjacent(over_object)) + var/mob/living/carbon/human/H = over_object + get_scooped(H, TRUE) + else + return ..() + /mob/living/simple_mob/protean_blob/MouseEntered(location,control,params) if(resting) return ..() -var/global/list/disallowed_protean_accessories = list( - /obj/item/clothing/accessory/holster, - /obj/item/clothing/accessory/storage, - /obj/item/clothing/accessory/armor - ) +/mob/living/simple_mob/protean_blob/character_directory_species() + if (humanform) + return "[humanform.custom_species ? humanform.custom_species : (humanform.species ? humanform.species.name : "Protean")]" + return "Protean" // Helpers - Unsafe, WILL perform change. /mob/living/carbon/human/proc/nano_intoblob(force) - if(!force && !isturf(loc)) + if(!force && !isturf(loc) && !loc == /obj/item/rig/protean) to_chat(src,span_warning("You can't change forms while inside something.")) return + to_chat(src, span_notice("You rapidly disassociate your form.")) + if(force || do_after(src,20,exclusive = TASK_ALL_EXCLUSIVE)) + handle_grasp() //It's possible to blob out before some key parts of the life loop. This results in things getting dropped at null. TODO: Fix the code so this can be done better. + remove_micros(src, src) //Living things don't fare well in roblobs. + if(buckled) + buckled.unbuckle_mob() + if(LAZYLEN(buckled_mobs)) + for(var/buckledmob in buckled_mobs) + riding_datum.force_dismount(buckledmob) + if(pulledby) + pulledby.stop_pulling() + stop_pulling() - handle_grasp() //It's possible to blob out before some key parts of the life loop. This results in things getting dropped at null. TODO: Fix the code so this can be done better. - remove_micros(src, src) //Living things don't fare well in roblobs. - if(buckled) - buckled.unbuckle_mob() - if(LAZYLEN(buckled_mobs)) - for(var/buckledmob in buckled_mobs) - riding_datum.force_dismount(buckledmob) - if(pulledby) - pulledby.stop_pulling() - stop_pulling() + var/client/C = client - //Record where they should go - var/atom/creation_spot = drop_location() + //Record where they should go + var/atom/creation_spot = drop_location() - //Create our new blob - var/mob/living/simple_mob/protean_blob/blob = new(creation_spot,src) + //Create our new blob + var/mob/living/simple_mob/protean_blob/blob = new(creation_spot,src) - //Drop all our things - var/list/things_to_drop = contents.Copy() - var/list/things_to_not_drop = list(w_uniform,nif,l_store,r_store,wear_id,l_ear,r_ear) //And whatever else we decide for balancing. + //Size update + blob.transform = matrix()*size_multiplier + blob.size_multiplier = size_multiplier - /* No for now, because insta-pepperspray or flash on unblob - if(l_hand && l_hand.w_class <= ITEMSIZE_SMALL) //Hands but only if small or smaller - things_to_not_drop += l_hand - if(r_hand && r_hand.w_class <= ITEMSIZE_SMALL) - things_to_not_drop += r_hand - */ + //dir update + blob.dir = dir - things_to_drop -= things_to_not_drop //Crunch the lists - things_to_drop -= organs //Mah armbs - things_to_drop -= internal_organs //Mah sqeedily spooch + if(l_hand) drop_l_hand() + if(r_hand) drop_r_hand() - for(var/obj/item/I in things_to_drop) //rip hoarders - if(I.protean_drop_whitelist) - continue - drop_from_inventory(I) + //Put our owner in it (don't transfer var/mind) + blob.ckey = ckey + blob.ooc_notes = ooc_notes + blob.ooc_notes_likes = ooc_notes_likes + blob.ooc_notes_dislikes = ooc_notes_dislikes + temporary_form = blob + var/obj/item/radio/R = null + if(isradio(l_ear)) + R = l_ear + if(isradio(r_ear)) + R = r_ear + if(R) + blob.mob_radio = R + R.forceMove(blob) + if(wear_id) + blob.myid = wear_id.GetID() - if(w_uniform && istype(w_uniform,/obj/item/clothing)) //No webbings tho. We do this after in case a suit was in the way - var/obj/item/clothing/uniform = w_uniform - if(LAZYLEN(uniform.accessories)) - for(var/obj/item/clothing/accessory/A in uniform.accessories) - if(is_type_in_list(A, disallowed_protean_accessories)) - uniform.remove_accessory(null,A) //First param is user, but adds fingerprints and messages + //Mail them to nullspace + moveToNullspace() - //Size update - blob.transform = matrix()*size_multiplier - blob.size_multiplier = size_multiplier + //Message + blob.visible_message(span_infoplain(span_bold("[src.name]") + " collapses into a gooey blob!")) - if(l_hand) blob.prev_left_hand = l_hand //Won't save them if dropped above, but necessary if handdrop is disabled. - if(r_hand) blob.prev_right_hand = r_hand + //Duration of the to_puddle iconstate that the blob starts with + sleep(13) + blob.update_icon() //Will remove the collapse anim - //Put our owner in it (don't transfer var/mind) - blob.ckey = ckey - blob.ooc_notes = ooc_notes - blob.ooc_notes_likes = ooc_notes_likes - blob.ooc_notes_dislikes = ooc_notes_dislikes - temporary_form = blob + //Transfer vore organs + blob.vore_organs = vore_organs.Copy() + blob.vore_selected = vore_selected + for(var/obj/belly/B as anything in vore_organs) + B.forceMove(blob) + B.owner = blob + vore_organs.Cut() - //Mail them to nullspace - moveToNullspace() + //We can still speak our languages! + blob.languages = languages.Copy() + blob.name = real_name + blob.real_name = real_name + blob.voice_name = name - //Message - blob.visible_message(span_infoplain(span_bold("[src.name]") + " collapses into a gooey blob!")) + blob.update_icon(1) - //Duration of the to_puddle iconstate that the blob starts with - sleep(13) - blob.update_icon() //Will remove the collapse anim + //Flip them to the protean panel + addtimer(CALLBACK(src, PROC_REF(nano_set_panel), C), 4) - //Transfer vore organs - blob.vore_organs = vore_organs - blob.vore_selected = vore_selected - for(var/obj/belly/B as anything in vore_organs) - B.forceMove(blob) - B.owner = blob - - //We can still speak our languages! - blob.languages = languages.Copy() - - - //Return our blob in case someone wants it - return blob + //Return our blob in case someone wants it + return blob + else + to_chat(src, span_warning("You must remain still to blobform!")) //For some reason, there's no way to force drop all the mobs grabbed. This ought to fix that. And be moved elsewhere. Call with caution, doesn't handle cycles. /proc/remove_micros(var/src, var/mob/root) @@ -412,74 +508,126 @@ var/global/list/disallowed_protean_accessories = list( if(istype(I, /obj/item/holder)) root.remove_from_mob(I) +/mob/living/proc/usehardsuit() + set name = "Utilize Hardsuit Interface" + set desc = "Allows a protean blob to open hardsuit interface." + set category = "Abilities.Protean" + + if(istype(loc, /obj/item/rig/protean)) + var/obj/item/rig/protean/prig = loc + to_chat(src, "You attempt to interface with the [prig].") + prig.tgui_interact(src) + else + to_chat(src, "You are not in RIG form.") + /mob/living/carbon/human/proc/nano_outofblob(var/mob/living/simple_mob/protean_blob/blob, force) if(!istype(blob)) return - + if(blob.loc == /obj/item/rig/protean) + return if(!force && !isturf(blob.loc)) to_chat(blob,span_warning("You can't change forms while inside something.")) return + to_chat(src, span_notice("You rapidly reassemble your form.")) + if(force || do_after(blob,20,exclusive = TASK_ALL_EXCLUSIVE)) + if(buckled) + buckled.unbuckle_mob() + if(LAZYLEN(buckled_mobs)) + for(var/buckledmob in buckled_mobs) + riding_datum.force_dismount(buckledmob) + if(pulledby) + pulledby.stop_pulling() + stop_pulling() - if(buckled) - buckled.unbuckle_mob() - if(LAZYLEN(buckled_mobs)) - for(var/buckledmob in buckled_mobs) - riding_datum.force_dismount(buckledmob) - if(pulledby) - pulledby.stop_pulling() - stop_pulling() + var/client/C = blob.client - //Stop healing if we are - if(blob.healing) - blob.healing.expire() + //Stop healing if we are + if(blob.healing) + blob.healing.expire() - //Play the animation - blob.icon_state = "from_puddle" + if(blob.mob_radio) + blob.mob_radio.forceMove(src) + blob.mob_radio = null + if(blob.myid) + blob.myid = null - //Message - blob.visible_message(span_infoplain(span_bold("[src.name]") + " reshapes into a humanoid appearance!")) + //Play the animation + blob.icon_state = "from_puddle" - //Duration of above animation - sleep(8) + //Message + blob.visible_message(span_infoplain(span_bold("[src.name]") + " reshapes into a humanoid appearance!")) - //Record where they should go - var/atom/reform_spot = blob.drop_location() + //Size update + resize(blob.size_multiplier, FALSE, TRUE, ignore_prefs = TRUE) - //Size update - resize(blob.size_multiplier, FALSE, ignore_prefs = TRUE) + //Duration of above animation + sleep(8) - //Move them back where the blob was - forceMove(reform_spot) + //Record where they should go + var/atom/reform_spot = blob.drop_location() - //Put our owner in it (don't transfer var/mind) - ckey = blob.ckey - ooc_notes = blob.ooc_notes // Lets give the protean any updated notes from blob form. - ooc_notes_likes = blob.ooc_notes_likes - ooc_notes_dislikes = blob.ooc_notes_dislikes - temporary_form = null + //dir update + dir = blob.dir - //Transfer vore organs - vore_selected = blob.vore_selected - for(var/obj/belly/B as anything in blob.vore_organs) - B.forceMove(src) - B.owner = src + //Move them back where the blob was + forceMove(reform_spot) - if(blob.prev_left_hand) put_in_l_hand(blob.prev_left_hand) //The restore for when reforming. - if(blob.prev_right_hand) put_in_r_hand(blob.prev_right_hand) + if(blob.l_hand) blob.drop_l_hand() + if(blob.r_hand) blob.drop_r_hand() - Life(1) //Fix my blindness right meow //Has to be moved up here, there exists a circumstance where blob could be deleted without vore organs moving right. + //Put our owner in it (don't transfer var/mind) + ckey = blob.ckey + ooc_notes = blob.ooc_notes // Lets give the protean any updated notes from blob form. + ooc_notes_likes = blob.ooc_notes_likes + ooc_notes_dislikes = blob.ooc_notes_dislikes + temporary_form = null - //Get rid of friend blob - qdel(blob) + //Transfer vore organs + vore_organs = blob.vore_organs.Copy() + vore_selected = blob.vore_selected + for(var/obj/belly/B as anything in blob.vore_organs) + B.forceMove(src) + B.owner = src + languages = blob.languages.Copy() - //Return ourselves in case someone wants it - return src + Life(1) //Fix my blindness right meow //Has to be moved up here, there exists a circumstance where blob could be deleted without vore organs moving right. -/mob/living/simple_mob/protean_blob/CanStumbleVore(mob/living/target) - if(target == humanform) - return FALSE - return ..() + //Get rid of friend blob + qdel(blob) + //Flip them to the protean panel + addtimer(CALLBACK(src, PROC_REF(nano_set_panel), C), 4) + + //Return ourselves in case someone wants it + return src + else + to_chat(src, span_warning("You must remain still to reshape yourself!")) + +/mob/living/carbon/human/proc/nano_set_panel(var/client/C) + if(C) + C.statpanel = "Protean" + +/mob/living/simple_mob/protean_blob/ClickOn(var/atom/A, var/params) + if(istype(loc, /obj/item/rig/protean)) + HardsuitClickOn(A) + ..() + +/mob/living/simple_mob/protean_blob/can_use_rig() + return 1 + +/mob/living/simple_mob/protean_blob/HardsuitClickOn(var/atom/A, var/alert_ai = 0) + if(istype(loc, /obj/item/rig/protean)) + var/obj/item/rig/protean/prig = loc + if(istype(prig) && !prig.offline && prig.selected_module) + if(!prig.ai_can_move_suit(src)) + return 0 + prig.selected_module.engage(A, alert_ai) + if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns + setClickCooldown(get_attack_speed()) + return 1 + return 0 + +//Don't eat yourself, idiot /mob/living/simple_mob/protean_blob/CanStumbleVore(mob/living/target) if(target == humanform) return FALSE @@ -491,3 +639,110 @@ var/global/list/disallowed_protean_accessories = list( if(PB.humanform == src) return FALSE return ..() + +/mob/living/simple_mob/protean_blob/handle_mutations_and_radiation() + humanform.handle_mutations_and_radiation() + +/mob/living/simple_mob/protean_blob/update_icon() + ..() + if(humanform) + vis_height = 32 + cut_overlays() + var/list/wide_icons = list( + "lizard", + "rat", + "wolf" + ) + var/list/tall_icons = list( + "drake", + "teppi", + "panther" + ) + var/list/big_icons = list( + "robodrgn" + ) + var/datum/species/protean/S = humanform.species + icon = 'icons/mob/species/protean/protean.dmi' + default_pixel_x = 0 + pixel_x = 0 + vore_capacity = 1 + if(S.blob_appearance == "dragon") + vore_capacity = 2 + icon = 'icons/mob/vore128x64.dmi' + mount_offset_y = 32 + mount_offset_x = -16 + var/image/I = image(icon, "[S.dragon_overlays[1]][resting? "-rest" : (vore_fullness? "-[vore_fullness]" : null)]", pixel_x = -48) + I.color = S.dragon_overlays[S.dragon_overlays[1]] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + I.plane = MOB_PLANE + I.layer = MOB_LAYER + add_overlay(I) + qdel(I) + + I = image(icon, "[S.dragon_overlays[2]][resting? "-rest" : null]", pixel_x = -48) + I.color = S.dragon_overlays[S.dragon_overlays[2]] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + I.plane = MOB_PLANE + I.layer = MOB_LAYER + add_overlay(I) + qdel(I) + + I = image(icon, "[S.dragon_overlays[3]][resting? "-rest" : null]", pixel_x = -48) + I.color = S.dragon_overlays[S.dragon_overlays[3]] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + I.plane = MOB_PLANE + I.layer = MOB_LAYER + add_overlay(I) + qdel(I) + + I = image(icon, "[S.dragon_overlays[4]][resting? "-rest" : null]", pixel_x = -48) + I.color = S.dragon_overlays[S.dragon_overlays[4]] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + I.plane = MOB_PLANE + I.layer = MOB_LAYER + add_overlay(I) + qdel(I) + + I = image(icon, "[S.dragon_overlays[5]][resting? "-rest" : null]", pixel_x = -48) + I.color = S.dragon_overlays[S.dragon_overlays[5]] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + I.plane = MOB_PLANE + I.layer = MOB_LAYER + add_overlay(I) + qdel(I) + + I = image(icon, "[S.dragon_overlays[6]][resting? "-rest" : null]", pixel_x = -48) + I.color = S.dragon_overlays[S.dragon_overlays[6]] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + I.plane = PLANE_LIGHTING_ABOVE + add_overlay(I) + qdel(I) + + //You know technically I could just put all the icons into the 128x64.dmi file and off-set them to fit.. + if(S.blob_appearance in wide_icons) + icon = 'icons/mob/species/protean/protean64x32.dmi' + default_pixel_x = -16 + pixel_x = -16 + if(S.blob_appearance in tall_icons) + icon = 'icons/mob/species/protean/protean64x64.dmi' + default_pixel_x = -16 + pixel_x = -16 + vis_height = 64 + if(S.blob_appearance in big_icons) + icon = 'icons/mob/species/protean/protean128x64.dmi' + default_pixel_x = -48 + pixel_x = -48 + vis_height = 64 + var/image/I = image(icon, S.blob_appearance+"[resting? "_rest":null][vore_fullness? "-[vore_fullness]" : null]") + I.color = S.blob_color_1 + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + I.plane = MOB_PLANE + I.layer = MOB_LAYER + add_overlay(I) + qdel(I) + eye_layer = image(icon, "[S.blob_appearance][resting? "_rest" : null]-eyes") + eye_layer.appearance_flags = appearance_flags + eye_layer.color = S.blob_color_2 + eye_layer.plane = PLANE_LIGHTING_ABOVE + add_overlay(eye_layer) + qdel(eye_layer) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 9a7953ce2f..0b0fc60284 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -1,3 +1,4 @@ +//TODO: Replace ventcrawl with morphing. /mob/living/simple_mob/vore/hostile/morph #define PER_LIMB_STEEL_COST SHEET_MATERIAL_AMOUNT //// // One-part Refactor @@ -5,33 +6,39 @@ /mob/living/carbon/human/proc/nano_partswap() set name = "Ref - Single Limb" set desc = "Allows you to replace and reshape your limbs as you see fit." - set category = "Abilities" - set hidden = TRUE + //set category = "Abilities.Protean" + set hidden = 1 + var/mob/living/protie = src + if(temporary_form) + protie = temporary_form + if(nano_dead_check(protie)) + to_chat(protie, span_warning("You need to be repaired first before you can act!")) + return if(stat) - to_chat(src,span_warning("You must be awake and standing to perform this action!")) + to_chat(protie,span_warning("You must be awake and standing to perform this action!")) return - if(!isturf(loc)) - to_chat(src,span_warning("You need more space to perform this action!")) + if(!isturf(protie.loc)) + to_chat(protie,span_warning("You need more space to perform this action!")) return var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory() //Missing the organ that does this if(!istype(refactory)) - to_chat(src,span_warning("You don't have a working refactory module!")) + to_chat(protie,span_warning("You don't have a working refactory module!")) return - var/choice = tgui_input_list(src,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs) + var/choice = tgui_input_list(protie,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs) if(!choice) return //Organ is missing, needs restoring if(!organs_by_name[choice] || istype(organs_by_name[choice], /obj/item/organ/external/stump)) //allows limb stumps to regenerate like removed limbs. if(refactory.get_stored_material(MAT_STEEL) < PER_LIMB_STEEL_COST) - to_chat(src,span_warning("You're missing that limb, and need to store at least [PER_LIMB_STEEL_COST] steel to regenerate it.")) + to_chat(protie,span_warning("You're missing that limb, and need to store at least [PER_LIMB_STEEL_COST] steel to regenerate it.")) return - var/regen = tgui_alert(src,"That limb is missing, do you want to regenerate it in exchange for [PER_LIMB_STEEL_COST] steel?","Regenerate limb?",list("Yes","No")) + var/regen = tgui_alert(protie,"That limb is missing, do you want to regenerate it in exchange for [PER_LIMB_STEEL_COST] steel?","Regenerate limb?",list("Yes","No")) if(regen != "Yes") return if(!refactory.use_stored_material(MAT_STEEL,PER_LIMB_STEEL_COST)) @@ -40,10 +47,13 @@ var/obj/item/organ/external/oldlimb = organs_by_name[choice] oldlimb.removed() qdel(oldlimb) - - var/mob/living/simple_mob/protean_blob/blob = nano_intoblob() - active_regen = TRUE - if(do_after(blob,5 SECONDS)) + var/mob/living/simple_mob/protean_blob/blob + if(!temporary_form) + blob = nano_intoblob() + else + blob = temporary_form + active_regen = 1 + if(do_after(blob,50,exclusive = TASK_ALL_EXCLUSIVE)) var/list/limblist = species.has_limbs[choice] var/limbpath = limblist["path"] var/obj/item/organ/external/new_eo = new limbpath(src) @@ -51,8 +61,7 @@ new_eo.robotize(synthetic ? synthetic.company : null) //Use the base we started with new_eo.sync_colour_to_human(src) regenerate_icons() - active_regen = FALSE - nano_outofblob(blob) + active_regen = 0 return //Organ exists, let's reshape it @@ -68,7 +77,7 @@ usable_manufacturers[company] = M if(!usable_manufacturers.len) return - var/manu_choice = tgui_input_list(src, "Which manufacturer do you wish to mimic for this limb?", "Manufacturer for [choice]", usable_manufacturers) + var/manu_choice = tgui_input_list(protie, "Which manufacturer do you wish to mimic for this limb?", "Manufacturer for [choice]", usable_manufacturers) if(!manu_choice) return //Changed mind @@ -78,177 +87,199 @@ return //Lost it meanwhile eo.robotize(manu_choice) - visible_message(span_infoplain(span_bold("[src]") + "'s [choice] loses its shape, then reforms.")) update_icons_body() -//// -// Full Refactor -//// -/mob/living/carbon/human/proc/nano_regenerate() //fixed the proc, it used to leave active_regen true. - set name = "Ref - Whole Body" - set desc = "Allows you to regrow limbs and replace organs, given you have enough materials." - set category = "Abilities" - set hidden = TRUE - - if(stat) - to_chat(src,span_warning("You must be awake and standing to perform this action!")) +/mob/living/carbon/human/proc/nano_regenerate() + set name = "Total Reassembly" + set desc = "Fully repair yourself or reload your appearance from whatever character slot you have loaded." + //set category = "Abilities.Protean" + set hidden = 1 + var/mob/living/protie = src + if(temporary_form) + protie = temporary_form + var/input = tgui_alert(protie,{"Do you want to rebuild or reassemble yourself? + Rebuilding will cost 10,000 steel and will rebuild all of your limbs as well as repair all damage over a 40s period. + Reassembling costs no steel and will copy the appearance data of your currently loaded save slot."},"Reassembly",list("Rebuild","Reassemble","Cancel")) + if(input == "Cancel" || !input) return - - if(!isturf(loc)) - to_chat(src,span_warning("You need more space to perform this action!")) - return - - var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory() - //Missing the organ that does this - if(!istype(refactory)) - to_chat(src,span_warning("You don't have a working refactory module!")) - return - - //Already regenerating - if(active_regen) - to_chat(src, span_warning("You are already refactoring!")) - return - - var/swap_not_rebuild = tgui_alert(src,"Do you want to rebuild, or reshape?","Rebuild or Reshape",list("Reshape","Cancel","Rebuild")) - if(!swap_not_rebuild || swap_not_rebuild == "Cancel") - return - if(swap_not_rebuild == "Reshape") - var/list/usable_manufacturers = list() - for(var/company in chargen_robolimbs) - var/datum/robolimb/M = chargen_robolimbs[company] - if(!(BP_TORSO in M.parts)) - continue - if(species?.base_species in M.species_cannot_use) - continue - if(M.whitelisted_to && !(ckey in M.whitelisted_to)) - continue - usable_manufacturers[company] = M - if(!usable_manufacturers.len) - return - var/manu_choice = tgui_input_list(src, "Which manufacturer do you wish to mimic?", "Manufacturer", usable_manufacturers) - - if(!manu_choice) - return //Changed mind - if(!organs_by_name[BP_TORSO]) - return //Ain't got a torso! - - var/obj/item/organ/external/torso = organs_by_name[BP_TORSO] - to_chat(src, span_danger("Remain still while the process takes place! It will take 5 seconds.")) - visible_message(span_infoplain(span_bold("[src]") + "'s form collapses into an amorphous blob of black ichor...")) - - var/mob/living/simple_mob/protean_blob/blob = nano_intoblob() - active_regen = TRUE - if(do_after(blob,5 SECONDS)) - synthetic = usable_manufacturers[manu_choice] - torso.robotize(manu_choice) //Will cascade to all other organs. - regenerate_icons() - visible_message(span_infoplain(span_bold("[src]") + "'s form reshapes into a new one...")) - active_regen = FALSE - nano_outofblob(blob) - return - - //Not enough resources (AND spends the resources, should be the last check) - if(!refactory.use_stored_material(MAT_STEEL,refactory.max_storage)) - to_chat(src, span_warning("You need to be maxed out on normal metal to do this!")) - return - - var/delay_length = round(active_regen_delay * species.active_regen_mult) - to_chat(src, span_danger("Remain still while the process takes place! It will take [delay_length/10] seconds.")) - visible_message(span_infoplain(span_bold("[src]") + "'s form begins to shift and ripple as if made of oil...")) - active_regen = TRUE - - var/mob/living/simple_mob/protean_blob/blob = nano_intoblob() - if(do_after(blob, delay_length, null, 0)) - if(stat != DEAD && refactory) - var/list/holder = refactory.materials - species.create_organs(src) - var/obj/item/organ/external/torso = organs_by_name[BP_TORSO] - torso.robotize() //synthetic wasn't defined here. - LAZYCLEARLIST(blood_DNA) - LAZYCLEARLIST(feet_blood_DNA) - blood_color = null - feet_blood_color = null - regenerate_icons() //Probably worth it, yeah. - var/obj/item/organ/internal/nano/refactory/new_refactory = locate() in internal_organs - if(!new_refactory) - log_debug("[src] protean-regen'd but lacked a refactory when done.") - else - new_refactory.materials = holder - to_chat(src, span_notice("Your refactoring is complete.")) //Guarantees the message shows no matter how bad the timing. - to_chat(blob, span_notice("Your refactoring is complete!")) + if(input == "Rebuild") + var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory() + if(refactory.get_stored_material(MAT_STEEL) >= 10000) + to_chat(protie, span_notify("You begin to rebuild. You will need to remain still.")) + if(do_after(protie, 400,exclusive = TASK_ALL_EXCLUSIVE)) + if(species?:OurRig) //Unsafe, but we should only ever be using this with a Protean + species?:OurRig?:make_alive(src,1) //Re-using this proc + refactory.use_stored_material(MAT_STEEL,refactory.get_stored_material(MAT_STEEL)) //Use all of our steel + else + to_chat(protie, span_userdanger("Somehow, you are missing your protean rig. You are unable to rebuild without one.")) else - to_chat(src, span_critical("Your refactoring has failed.")) - to_chat(blob, span_critical("Your refactoring has failed!")) + to_chat(protie, span_warning("You do not have enough steel stored for this operation.")) else - to_chat(src, span_critical("Your refactoring is interrupted.")) - to_chat(blob, span_critical("Your refactoring is interrupted!")) - active_regen = FALSE - nano_outofblob(blob) + input = tgui_alert(protie,{"Include Flavourtext?"},"Reassembly",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/flavour = 0 + if(input == "Yes") + flavour = 1 + input = tgui_alert(protie,{"Include OOC notes?"},"Reassembly",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/oocnotes = 0 + if(input == "Yes") + oocnotes = 1 + to_chat(protie, span_notify("You begin to reassemble. You will need to remain still.")) + protie.visible_message(span_notify("[protie] rapidly contorts and shifts!"), span_danger("You begin to reassemble.")) + if(do_after(protie, 40,exclusive = TASK_ALL_EXCLUSIVE)) + if(protie.client.prefs) //Make sure we didn't d/c + var/obj/item/rig/protean/Rig = species?:OurRig + protie.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, TRUE) + species?:OurRig = Rig //Get a reference to our Rig and put it back after reassembling + protie.visible_message(span_notify("[protie] adopts a new form!"), span_danger("You have reassembled.")) +/mob/living/carbon/human/proc/nano_copy_body() + set name = "Copy Form" + set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)." + //set category = "Abilities.Protean" + set hidden = 1 + var/mob/living/protie = src + if(temporary_form) + protie = temporary_form + + var/grabbing_but_not_enough + var/mob/living/carbon/human/victim = null + for(var/obj/item/grab/G in protie) + if(G.state < GRAB_AGGRESSIVE) + grabbing_but_not_enough = TRUE + return + else + victim = G.affecting + if (!victim) + if (grabbing_but_not_enough) + to_chat(protie, span_warning("You need a better grip to do that!")) + else + to_chat(protie, span_notice("You need to be aggressively grabbing someone before you can copy their form.")) + return + if (!istype(victim)) + to_chat(protie, span_warning("You can only perform this on human mobs!")) + return + if (!victim.client) + to_chat(protie, span_notice("The person you try this on must have a client!")) + return + + + to_chat(protie, span_notice("Waiting for other person's consent.")) + var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No")) + if (consent != "Yes") + to_chat(protie, span_notice("They declined your request.")) + return + + var/input = tgui_alert(protie,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/flavour = 0 + if(input == "Yes") + flavour = 1 + + var/checking = FALSE + for(var/obj/item/grab/G in protie) + if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) + checking = TRUE + if (!checking) + to_chat(protie, span_warning("You lost your grip on [victim]!")) + return + + to_chat(protie, span_notify("You begin to reassemble into [victim]. You will need to remain still.")) + protie.visible_message(span_notify("[protie] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim].")) + if(do_after(protie, 40,exclusive = TASK_ALL_EXCLUSIVE)) + checking = FALSE + for(var/obj/item/grab/G in protie) + if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) + checking = TRUE + if (!checking) + to_chat(protie, span_warning("You lost your grip on [victim]!")) + return + if(protie.client) //Make sure we didn't d/c + var/obj/item/rig/protean/Rig = species?:OurRig + transform_into_other_human(victim, FALSE, flavour, TRUE) + species?:OurRig = Rig //Get a reference to our Rig and put it back after reassembling + protie.visible_message(span_notify("[protie] adopts the form of [victim]!"), span_danger("You have reassembled into [victim].")) + //// // Storing metal //// /mob/living/carbon/human/proc/nano_metalnom() set name = "Ref - Store Metals" set desc = "If you're holding a stack of material, you can consume some and store it for later." - set category = "Abilities" - set hidden = TRUE + //set category = "Abilities.Protean" + set hidden = 1 + + var/mob/living/protie = src + if(temporary_form) + protie = temporary_form + if(nano_dead_check(protie)) + to_chat(protie, span_warning("You need to be repaired first before you can act!")) + return var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory() //Missing the organ that does this if(!istype(refactory)) - to_chat(src,span_warning("You don't have a working refactory module!")) + to_chat(protie,span_warning("You don't have a working refactory module!")) return - var/held = get_active_hand() + var/held = protie.get_active_hand() if(!istype(held,/obj/item/stack/material)) - to_chat(src,span_warning("You aren't holding a stack of materials in your active hand...!")) + to_chat(protie,span_warning("You aren't holding a stack of materials in your active hand!")) return var/obj/item/stack/material/matstack = held var/substance = matstack.material.name - var allowed = FALSE + var allowed = 0 for(var/material in PROTEAN_EDIBLE_MATERIALS) - if(material == substance) allowed = TRUE + if(material == substance) allowed = 1 if(!allowed) - to_chat(src,span_warning("You can't process [substance]!")) - return //Only a few things matter, the rest are best not cluttering the lists. + to_chat(protie,span_warning("You can't process [substance]!")) + return - var/howmuch = tgui_input_number(src,"How much do you want to store? (0-[matstack.get_amount()])","Select amount",null,matstack.get_amount(),0) - if(!howmuch || matstack != get_active_hand() || howmuch > matstack.get_amount()) + var/howmuch = tgui_input_number(protie,"How much do you want to store? (0-[matstack.get_amount()])","Select amount",null,matstack.get_amount()) + if(!howmuch || matstack != protie.get_active_hand() || howmuch > matstack.get_amount()) return //Quietly fail var/actually_added = refactory.add_stored_material(substance,howmuch*matstack.perunit) matstack.use(CEILING((actually_added/matstack.perunit), 1)) if(actually_added && actually_added < howmuch) - to_chat(src,span_warning("Your refactory module is now full, so only [actually_added] units were stored.")) - visible_message(span_notice("[src] nibbles some of the [substance] right off the stack!")) + to_chat(protie,span_warning("Your refactory module is now full, so only [actually_added] units were stored.")) + visible_message(span_notice("[protie] nibbles some of the [substance] right off the stack!")) else if(actually_added) - to_chat(src,span_notice("You store [actually_added] units of [substance].")) - visible_message(span_notice("[src] devours some of the [substance] right off the stack!")) + to_chat(protie,span_notice("You store [actually_added] units of [substance].")) + visible_message(span_notice("[protie] devours some of the [substance] right off the stack!")) else - to_chat(src,span_notice("You're completely capped out on [substance]!")) + to_chat(protie,span_notice("You're completely capped out on [substance]!")) //// // Blob Form //// -/mob/living/carbon/human/proc/nano_blobform() +/mob/living/carbon/human/proc/nano_blobform(var/forced) set name = "Toggle Blobform" set desc = "Switch between amorphous and humanoid forms." - set category = "Abilities" - set hidden = TRUE + //set category = "Abilities.Protean" + set hidden = 1 + if(nano_dead_check(src)) + return + if(forced) + if(temporary_form) + nano_outofblob(temporary_form, forced) + else + nano_intoblob(forced) + return var/atom/movable/to_locate = temporary_form || src - if(!isturf(to_locate.loc)) + if(!isturf(to_locate.loc) && !forced) to_chat(to_locate,span_warning("You need more space to perform this action!")) return - //Blob form if(temporary_form) - if(health < maxHealth*0.5) - to_chat(temporary_form,span_warning("You need to regenerate more nanites first!")) - else if(temporary_form.stat) + if(temporary_form.stat) to_chat(temporary_form,span_warning("You can only do this while not stunned.")) else nano_outofblob(temporary_form) @@ -257,6 +288,9 @@ else if(stat) to_chat(src,span_warning("You can only do this while not stunned.")) return + else if(handcuffed) + to_chat(src, span_warning("You can't do this while handcuffed!")) + return else nano_intoblob() @@ -266,63 +300,300 @@ /mob/living/carbon/human/proc/nano_change_fitting() set name = "Change Species Fit" set desc = "Tweak your shape to change what suits you fit into (and their sprites!)." - set category = "Abilities" + set category = "Abilities.Protean" if(stat) to_chat(src,span_warning("You must be awake and standing to perform this action!")) return - var/new_species = tgui_input_list(src, "Please select a species to emulate.", "Shapeshifter Body", GLOB.playable_species) + var/new_species = tgui_input_list(src, "Please select a species to emulate.", "Shapeshifter Body", list(species?.vanity_base_fit)|species?.get_valid_shapeshifter_forms()) if(new_species) species?.base_species = new_species // Really though you better have a species regenerate_icons() //Expensive, but we need to recrunch all the icons we're wearing //// -// Change size +// Rig Transform //// -/mob/living/carbon/human/proc/nano_set_size() - set name = "Adjust Volume" - set category = "Abilities" - set hidden = TRUE +/mob/living/carbon/human/proc/nano_rig_transform(var/forced) + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean to retract its mass into its hardsuit module at will." + //set category = "Abilities.Protean" + set hidden = 1 - var/mob/living/user = temporary_form || src - - var/obj/item/organ/internal/nano/refactory/refactory = nano_get_refactory() - //Missing the organ that does this - if(!istype(refactory)) - to_chat(user,span_warning("You don't have a working refactory module!")) + var/mob/living/protie = src + if(temporary_form) + protie = temporary_form + if(nano_dead_check(src)) + to_chat(protie, span_warning("You need to be repaired first before you can act!")) return + to_chat(protie, span_notice("You rapidly condense into your module.")) + if(forced || do_after(protie,20,exclusive = TASK_ALL_EXCLUSIVE)) + if(!temporary_form) //If you're human, force you into blob form before rig'ing + nano_blobform(forced) + spawn(2) - var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or between 1 to 600% in dorms area). Up-sizing consumes metal, downsizing returns metal." - var/new_size = tgui_input_number(user, nagmessage, "Pick a Size", user.size_multiplier*100, 600, 1) - if(!new_size || !size_range_check(new_size)) - return + if(istype(src.species, /datum/species/protean)) + var/datum/species/protean/S = src.species + var/mob/living/simple_mob/protean_blob/P = temporary_form + if(S.OurRig) //Do we even have a RIG? + if(P.loc == S.OurRig) //we're inside our own RIG + if(ismob(S.OurRig.loc)) + var/mob/m = S.OurRig.loc + m.drop_from_inventory(S.OurRig) + if(S.OurRig.wearer) //We're being worn. Engulf em', if prefs align.. otherwise just drop off. + var/mob/living/carbon/human/victim = S.OurRig.wearer + if(P.can_be_drop_pred && victim.devourable && victim.can_be_drop_prey) + if(P.vore_selected) + perform_the_nom(P,victim,P,P.vore_selected,1) + P.forceMove(get_turf(S.OurRig)) + S.OurRig.forceMove(src) + S.OurRig.myprotean = src + src.equip_to_slot_if_possible(S.OurRig, slot_back) + S.OurRig.Moved() + P.has_hands = 1 + else //We're not in our own RIG + if(P.stat || P.resting && !forced) + to_chat(P,span_warning("You can only do this while not stunned.")) + else + if(P.l_hand) + P.drop_l_hand() + if(P.r_hand) + P.drop_r_hand() + P.has_hands = 0 + S.OurRig.myprotean = P + src.drop_from_inventory(S.OurRig) + P.forceMove(S.OurRig) + S.OurRig.canremove = 1 + P.reset_view() + else //Make one if not + to_chat(temporary_form, span_warning("Somehow, your RIG got disconnected from your species. This may have been caused by an admin heal. A new one has been created for you, contact a coder.")) + new /obj/item/rig/protean(src,src) + else + to_chat(protie, span_warning("You must remain still to condense!")) - var/size_factor = new_size/100 - - //Will be: -1.75 for 200->25, and 1.75 for 25->200 - var/sizediff = size_factor - user.size_multiplier - - //Negative if shrinking, positive if growing - //Will be (PLSC*2)*-1.75 to 1.75 - //For 2000 PLSC that's -7000 to 7000 - var/cost = (PER_LIMB_STEEL_COST*2)*sizediff - - //Sizing up - if(cost > 0) - if(refactory.use_stored_material(MAT_STEEL,cost)) - user.resize(size_factor, ignore_prefs = TRUE) +/mob/living/carbon/human/proc/appearance_switch() + set name = "Switch Blob Appearance" + set desc = "Allows a protean blob to switch its outwards appearance." + //set category = "Abilities.Protean" + set hidden = 1 + var/datum/species/protean/S = src.species + var/mob/living/protie = src + if(temporary_form) + protie = temporary_form + var/list/icon_choices = list( + "Primary" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "primary"), + "Highlight" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "highlight"), + "puddle1" = image(icon = 'icons/mob/species/protean/protean_powers.dmi', icon_state = "blob"), + "puddle0" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "puddle"), + "shadow" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "shadow"), + "clean" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "clean"), + "swarm" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "swarm"), + "slime" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "slime"), + "chaos" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "chaos"), + "cloud" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "cloud"), + /*"catslug" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "catslug"), + "cat" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "cat"), + "mouse" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "mouse"), + "rabbit" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "rabbit"), + "bear" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "bear"), + "fen" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "fen"), + "fox" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "fox"), + "raptor" = image(icon = 'icons/mob/species/protean/protean.dmi', icon_state = "raptor"), + "rat" = image(icon = 'icons/mob/species/protean/protean64x32.dmi', icon_state = "rat", pixel_x = -16), + "lizard" = image(icon = 'icons/mob/species/protean/protean64x32.dmi', icon_state = "lizard", pixel_x = -16), + "wolf" = image(icon = 'icons/mob/species/protean/protean64x32.dmi', icon_state = "wolf", pixel_x = -16), + //"drake" = image(icon = 'modular_chomp/icons/mob/species/protean/protean64x64.dmi', icon_state = "drake", pixel_x = -16), + "teppi" = image(icon = 'icons/mob/species/protean/protean64x64.dmi', icon_state = "teppi", pixel_x = -16), + "panther" = image(icon = 'icons/mob/species/protean/protean64x64.dmi', icon_state = "panther", pixel_x = -16), + "robodrgn" = image(icon = 'icons/mob/species/protean/protean128x64.dmi', icon_state = "robodrgn", pixel_x = -48), + "Dragon" = image(icon = 'icons/mob/bigdragon_small.dmi', icon_state = "dragon_small")*/ + ) + var/blobstyle = show_radial_menu(protie, protie, icon_choices, require_near = TRUE, tooltips = FALSE) + if(!blobstyle || QDELETED(protie) || protie.incapacitated()) + return FALSE + switch(blobstyle) + if("Dragon") //Fuck it, we ball + var/list/options = list("Underbelly","Body","Ears","Mane","Horns","Eyes") + for(var/option in options) + LAZYSET(options, option, image('icons/effects/bigdragon_labels.dmi', option)) + var/choice = show_radial_menu(protie, protie, options, radius = 60) + if(!choice || QDELETED(protie) || protie.incapacitated()) + return FALSE + . = TRUE + var/list/underbelly_styles = list( + "dragon_underSmooth", + "dragon_underPlated" + ) + var/list/body_styles = list( + "dragon_bodySmooth", + "dragon_bodyScaled" + ) + var/list/ear_styles = list( + "dragon_earsNormal" + ) + var/list/mane_styles = list( + "dragon_maneNone", + "dragon_maneShaggy", + "dragon_maneDorsalfin" + ) + var/list/horn_styles = list( + "dragon_hornsPointy", + "dragon_hornsCurved", + "dragon_hornsCurved2", + "dragon_hornsJagged", + "dragon_hornsCrown", + "dragon_hornsSkull" + ) + var/list/eye_styles = list( + "dragon_eyesNormal" + ) + switch(choice) + if("Underbelly") + options = underbelly_styles + for(var/option in options) + var/image/I = image('icons/mob/vore128x64.dmi', option, dir = 4, pixel_x = -48) + LAZYSET(options, option, I) + choice = show_radial_menu(protie, protie, options, radius = 90) + if(!choice || QDELETED(protie) || protie.incapacitated()) + return 0 + var/new_color = input("Pick underbelly color:","Underbelly Color", S.dragon_overlays[1]) as null|color + if(!new_color) + return 0 + S.dragon_overlays[1] = choice + S.dragon_overlays[S.dragon_overlays[1]] = new_color + if("Body") + options = body_styles + for(var/option in options) + var/image/I = image('icons/mob/vore128x64.dmi', option, dir = 4, pixel_x = -48) + LAZYSET(options, option, I) + choice = show_radial_menu(protie, protie, options, radius = 90) + if(!choice || QDELETED(protie) || protie.incapacitated()) + return 0 + var/new_color = input("Pick body color:","Body Color", S.dragon_overlays[2]) as null|color + if(!new_color) + return 0 + S.dragon_overlays[2] = choice + S.dragon_overlays[S.dragon_overlays[2]] = new_color + if("Ears") + options = ear_styles + for(var/option in options) + var/image/I = image('icons/mob/vore128x64.dmi', option, dir = 4, pixel_x = -76, pixel_y = -50) + LAZYSET(options, option, I) + choice = show_radial_menu(protie, protie, options, radius = 90) + if(!choice || QDELETED(protie) || protie.incapacitated()) + return 0 + var/new_color = input("Pick ear color:","Ear Color", S.dragon_overlays[3]) as null|color + if(!new_color) + return 0 + S.dragon_overlays[3] = choice + S.dragon_overlays[S.dragon_overlays[3]] = new_color + if("Mane") + options = mane_styles + for(var/option in options) + var/image/I = image('icons/mob/vore128x64.dmi', option, dir = 4, pixel_x = -76, pixel_y = -50) + LAZYSET(options, option, I) + choice = show_radial_menu(protie, protie, options, radius = 90) + if(!choice || QDELETED(protie) || protie.incapacitated()) + return 0 + var/new_color = input("Pick mane color:","Mane Color", S.dragon_overlays[4]) as null|color + if(!new_color) + return 0 + S.dragon_overlays[4] = choice + S.dragon_overlays[S.dragon_overlays[4]] = new_color + if("Horns") + options = horn_styles + for(var/option in options) + var/image/I = image('icons/mob/vore128x64.dmi', option, dir = 4, pixel_x = -86, pixel_y = -50) + LAZYSET(options, option, I) + choice = show_radial_menu(protie, protie, options, radius = 90) + if(!choice || QDELETED(protie) || protie.incapacitated()) + return 0 + var/new_color = input("Pick horn color:","Horn Color", S.dragon_overlays[5]) as null|color + if(!new_color) + return 0 + S.dragon_overlays[5] = choice + S.dragon_overlays[S.dragon_overlays[5]] = new_color + if("Eyes") + options = eye_styles + for(var/option in options) + var/image/I = image('icons/mob/vore128x64.dmi', option, dir = 2, pixel_x = -48, pixel_y = -50) + LAZYSET(options, option, I) + choice = show_radial_menu(protie, protie, options, radius = 90) + if(!choice || QDELETED(protie) || protie.incapacitated()) + return 0 + var/new_color = input("Pick eye color:","Eye Color", S.dragon_overlays[6]) as null|color + if(!new_color) + return 0 + S.dragon_overlays[6] = choice + S.dragon_overlays[S.dragon_overlays[6]] = new_color + S.blob_appearance = "dragon" + if("Primary") + var/new_color = input("Pick primary color:","Protean Primary", "#FF0000") as null|color + if(!new_color) + return + S.blob_color_1 = new_color + if("Highlight") + var/new_color = input("Pick highlight color:","Protean Highlight", "#FF0000") as null|color + if(!new_color) + return + S.blob_color_2 = new_color else - to_chat(user,span_warning("That size change would cost [cost] steel, which you don't have.")) - //Sizing down (or not at all) - else if(cost <= 0) - cost = abs(cost) - var/actually_added = refactory.add_stored_material(MAT_STEEL,cost) - user.resize(size_factor, ignore_prefs = TRUE) - if(actually_added != cost) - to_chat(user,span_warning("Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.")) + S.blob_appearance = blobstyle + if(temporary_form) + if(blobstyle) + temporary_form.update_icon() + if(istype(temporary_form.loc, /obj/item/holder/protoblob)) + var/obj/item/holder/protoblob/PB = temporary_form.loc + PB.item_state = S.blob_appearance - user.visible_message(span_notice("Black mist swirls around [user] as they change size.")) +/mob/living/carbon/human/proc/nano_latch() + set name = "Latch/Unlatch host" + set desc = "Allows a protean to forcibly latch or unlatch from a host." + //set category = "Abilities.Protean" + set hidden = 1 + var/mob/living/protie = src + var/mob/living/carbon/human/target + var/datum/species/protean/S = src.species + if(nano_dead_check(src)) + return + if(temporary_form) + protie = temporary_form + if(protie.loc == S.OurRig) + target = S.OurRig.wearer + if(target) + target.drop_from_inventory(S.OurRig) + to_chat(protie, span_notice("You detach from your host.")) + else + to_chat(protie, span_warning("You aren't being worn, dummy.")) + return + var/obj/held_item = protie.get_active_hand() + if(istype(held_item,/obj/item/grab)) + var/obj/item/grab/G = held_item + if(istype(G.affecting, /mob/living/carbon/human)) + target = G.affecting + if(istype(target.species, /datum/species/protean)) + to_chat(protie, span_danger("You can't latch onto a fellow Protean!")) + return + if(G.loc == protie && G.state >= GRAB_AGGRESSIVE) + protie.visible_message(span_warning("[protie] is attempting to latch onto [target]!"), span_danger("You attempt to latch onto [target]!")) + if(do_after(protie, 50, target,exclusive = TASK_ALL_EXCLUSIVE)) + if(G.loc == protie && G.state >= GRAB_AGGRESSIVE) + target.drop_from_inventory(target.back) + protie.visible_message(span_danger("[protie] latched onto [target]!"), span_danger("You latch yourself onto [target]!")) + target.Weaken(3) + nano_rig_transform(1) + spawn(5) //Have to give time for the above proc to resolve + //S.OurRig.forceMove(target) + target.equip_to_slot(S.OurRig, slot_back) + S.OurRig.Moved() + spawn(1) //Same here :( + S.OurRig.wearer = target + else + to_chat(protie, span_warning("You need a more aggressive grab to do this!")) + else + to_chat(protie, span_warning("You can only latch onto humanoid mobs!")) + else + to_chat(protie, span_warning("You need to be grabbing a humanoid mob aggressively to latch onto them.")) /// /// /// A helper to reuse /mob/living/proc/nano_get_refactory(obj/item/organ/internal/nano/refactory/R) @@ -340,7 +611,18 @@ /mob/living/carbon/human/nano_get_refactory() return ..(locate(/obj/item/organ/internal/nano/refactory) in internal_organs) +//I hate this whole bit but I want proteans to be able to "die" and still be "alive" in their blob as a suit +/mob/living/carbon/human/proc/nano_dead_check(var/mob/living/protie) + if(istype(src.species, /datum/species/protean)) + var/datum/species/protean/S = src.species + if(S.pseudodead) + return 1 + return 0 +/mob/living/carbon/human/proc/nano_set_dead(var/num) + if(istype(src.species, /datum/species/protean)) + var/datum/species/protean/S = src.species + S.pseudodead = num /// /// /// Ability objects for stat panel /obj/effect/protean_ability @@ -371,20 +653,20 @@ /obj/effect/protean_ability/proc/do_ability(var/mob/living/L) if(istype(L)) call(L,to_call)() - return FALSE + return 0 /// The actual abilities /obj/effect/protean_ability/into_blob ability_name = "Toggle Blobform" - desc = "Discard your shape entirely, changing to a low-energy blob that can fit into small spaces. You'll consume steel to repair yourself in this form." + desc = "Discard your shape entirely, changing to a low-energy blob. You'll consume steel to repair yourself in this form." icon_state = "blob" to_call = /mob/living/carbon/human/proc/nano_blobform /obj/effect/protean_ability/change_volume ability_name = "Change Volume" - desc = "Alter your size by consuming steel to produce additional nanites, or regain steel by reducing your size and reclaiming them." + desc = "Alter your size between 25% and 200%." icon_state = "volume" - to_call = /mob/living/carbon/human/proc/nano_set_size + to_call = /mob/living/proc/set_size /obj/effect/protean_ability/reform_limb ability_name = "Ref - Single Limb" @@ -393,15 +675,80 @@ to_call = /mob/living/carbon/human/proc/nano_partswap /obj/effect/protean_ability/reform_body - ability_name = "Ref - Whole Body" - desc = "Rebuild your entire body into whatever design you want, assuming you have 10,000 metal." + ability_name = "Total Reassembly" + desc = "Fully repair yourself or reload your appearance from whatever character slot you have loaded." icon_state = "body" to_call = /mob/living/carbon/human/proc/nano_regenerate /obj/effect/protean_ability/metal_nom ability_name = "Ref - Store Metals" - desc = "Store the metal you're holding. Your refactory can only store steel, and all other metals will be converted into nanites ASAP for various effects." + desc = "Store the metal you're holding. Your refactory can only store steel." icon_state = "metal" to_call = /mob/living/carbon/human/proc/nano_metalnom +/obj/effect/protean_ability/hardsuit + ability_name = "Hardsuit Transform" + desc = "Coalesce your nanite swarm into their control module, allowing others to wear you." + icon_state = "rig" + to_call = /mob/living/carbon/human/proc/nano_rig_transform + +/obj/effect/protean_ability/appearance_switch + ability_name = "Blob Appearance" + desc = "Toggle your blob appearance. Also affects your worn appearance." + icon_state = "switch" + to_call = /mob/living/carbon/human/proc/appearance_switch + +/obj/effect/protean_ability/latch_host + ability_name = "Latch Host" + desc = "Forcibly latch or unlatch your RIG from a host mob." + icon_state = "latch" + to_call = /mob/living/carbon/human/proc/nano_latch + +/obj/effect/protean_ability/copy_form + ability_name = "Copy Form" + desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)." + icon_state = "copy_form" + to_call = /mob/living/carbon/human/proc/nano_copy_body + #undef PER_LIMB_STEEL_COST + +/mob/living/carbon/human/proc/chest_transparency_toggle() + set name = "transparency toggle (chest only)" + set category = "Abilities.Protean" + if(stat || world.time < last_special) + return + last_special = world.time + 50 + for(var/obj/item/organ/external/proteanlimbs as anything in src.organs) + if(proteanlimbs.organ_tag == BP_HEAD) + continue + proteanlimbs.transparent = !proteanlimbs.transparent + visible_message(span_notice("\The [src]'s internal composition seems to change.")) + update_icons_body() + update_hair() + +/obj/effect/protean_ability/chest_transparency + ability_name = "body transparency toggle (All but head)" + desc = "Makes everything but your head transparent!" + icon = 'icons/obj/slimeborg/slimecore.dmi' + icon_state = "core" + to_call = /mob/living/carbon/human/proc/chest_transparency_toggle + +/mob/living/carbon/human/proc/transparency_toggle() + set name = "Toggle Transparency" + set category = "Abilities.Protean" + if(stat || world.time < last_special) + return + last_special = world.time + 50 + for(var/obj/item/organ/external/proteanlimbs as anything in src.organs) + proteanlimbs.transparent = !proteanlimbs.transparent + + visible_message(span_notice("\The [src]'s internal composition seems to change.")) + update_icons_body() + update_hair() + +/obj/effect/protean_ability/transparency_for_entire_body + ability_name = "Toggle Transparency" + desc = "transparency toggle for your entire body" + icon = 'icons/obj/slimeborg/slimecore.dmi' + icon_state = "core" + to_call = /mob/living/carbon/human/proc/transparency_toggle diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig.dm new file mode 100644 index 0000000000..79eaa0a922 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig.dm @@ -0,0 +1,609 @@ +/* + proteans +*/ +/obj/item/rig/protean + name = "nanosuit control cluster" + suit_type = "nanomachine" + icon = 'icons/obj/rig_modules_vr.dmi' + default_mob_icon = null //Actually having a forced sprite for Proteans is ugly af. I'm not gonna make this a toggle + icon_state = "nanomachine_rig" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) + siemens_coefficient= 1 + slowdown = 0 + offline_slowdown = 0 + seal_delay = 0 + var/mob/living/myprotean + initial_modules = list(/obj/item/rig_module/protean/syphon, /obj/item/rig_module/protean/armor, /obj/item/rig_module/protean/healing) + + helm_type = /obj/item/clothing/head/helmet/space/rig/protean //These are important for sprite pointers + boot_type = /obj/item/clothing/shoes/magboots/rig/protean + chest_type = /obj/item/clothing/suit/space/rig/protean + glove_type = /obj/item/clothing/gloves/gauntlets/rig/protean + protean = 1 + offline_vision_restriction = 0 + open = 1 + cell_type = /obj/item/cell/protean + var/dead = 0 + //interface_path = "RIGSuit_protean" + //ai_interface_path = "RIGSuit_protean" + var/sealed = 0 + var/assimilated_rig + var/can_assimilate_rig = FALSE + +/obj/item/rig/protean/relaymove(mob/user, var/direction) + if(user.stat || user.stunned) + return + forced_move(direction, user, 0) + +/obj/item/rig/protean/check_suit_access(mob/living/user) + if(user == myprotean) + return 1 + return ..() + +/obj/item/rig/protean/digest_act(atom/movable/item_storage = null) + return 0 + +/obj/item/rig/protean/ex_act(severity) + return + +/obj/item/rig/protean/New(var/newloc, var/mob/living/carbon/human/P) + if(P) + var/datum/species/protean/S = P.species + S.OurRig = src + if(P.back) + addtimer(CALLBACK(src, PROC_REF(AssimilateBag), P, 1, P.back), 3) + myprotean = P + else + to_chat(P, span_notice("You should have spawned with a backpack to assimilate into your RIG. Try clicking it with a backpack.")) + ..(newloc) + +/obj/item/rig/protean/Destroy() + if(myprotean) + var/mob/living/carbon/human/P = myprotean + var/datum/species/protean/S = P?.species + S?.OurRig = null + myprotean = null + . = ..() + + +/obj/item/rig/proc/AssimilateBag(var/mob/living/carbon/human/P, var/spawned, var/obj/item/storage/backpack/B) + if(istype(B,/obj/item/storage/backpack)) + if(spawned) + B = P.back + P.unEquip(P.back) + if(QDELETED(B)) // for mannequins or such + return + B.forceMove(src) + rig_storage = B + P.drop_item(B) + to_chat(P, span_notice("[B] has been integrated into the [src].")) + if(spawned) //This feels very dumb to have a second if but I'm lazy + P.equip_to_slot_if_possible(src, slot_back) + src.Moved() + else + to_chat(P,span_warning("Your rigsuit can only assimilate a backpack into itself. If you are seeing this message, and you do not have a rigsuit, tell a coder.")) + +/obj/item/rig/protean/verb/RemoveBag() + set name = "Remove Stored Bag" + set category = "Object" + + if(rig_storage) + usr.put_in_hands(rig_storage) + rig_storage = null + else + to_chat(usr, "This Rig does not have a bag installed. Use a bag on it to install one.") + +/obj/item/rig/protean/attack_hand(mob/user as mob) + if (src.loc == user) + if(rig_storage) + src.rig_storage.open(user) + else + ..() + for(var/mob/M in range(1)) + if (M.s_active == src) + src.rig_storage.close(M) + src.add_fingerprint(user) + return + +/obj/item/clothing/head/helmet/space/rig/protean + name = "mass" + desc = "A helmet-shaped clump of nanomachines." + light_overlay = "should not use a light overlay" + species_restricted = list(SPECIES_PROTEAN, SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_XENOMORPH_HYBRID) + sprite_sheets = list( + SPECIES_PROTEAN = 'icons/mob/head.dmi', + SPECIES_HUMAN = 'icons/mob/head.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/helmet.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/helmet.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/helmet.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/helmet.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/helmet.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/helmet.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/helmet.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/helmet.dmi', + SPECIES_VASILISSAN = 'icons/mob/species/skrell/helmet.dmi', + SPECIES_VOX = 'icons/mob/species/vox/head.dmi', + SPECIES_XENOMORPH_HYBRID = 'icons/mob/species/xenomorph_hybrid/helmet.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_PROTEAN = 'icons/mob/head.dmi', + SPECIES_HUMAN = 'icons/mob/head.dmi', + SPECIES_TAJ = 'icons/mob/head.dmi', + SPECIES_SKRELL = 'icons/mob/head.dmi', + SPECIES_UNATHI = 'icons/mob/head.dmi', + SPECIES_XENOHYBRID = 'icons/mob/head.dmi', + SPECIES_AKULA = 'icons/mob/head.dmi', + SPECIES_SERGAL = 'icons/mob/head.dmi', + SPECIES_NEVREAN = 'icons/mob/head.dmi', + SPECIES_VULPKANIN = 'icons/mob/head.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/head.dmi', + SPECIES_FENNEC = 'icons/mob/head.dmi', + SPECIES_PROMETHEAN = 'icons/mob/head.dmi', + SPECIES_TESHARI = 'icons/mob/head.dmi', + SPECIES_VASILISSAN = 'icons/mob/head.dmi', + SPECIES_VOX = 'icons/mob/head.dmi', + SPECIES_XENOMORPH_HYBRID = 'icons/mob/head.dmi' + ) + icon = 'icons/mob/head.dmi' + default_worn_icon = 'icons/mob/head.dmi' + +/obj/item/clothing/gloves/gauntlets/rig/protean + name = "mass" + desc = "Glove-shaped clusters of nanomachines." + siemens_coefficient= 0 + species_restricted = list(SPECIES_PROTEAN, SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_XENOMORPH_HYBRID) + sprite_sheets = list( + SPECIES_PROTEAN = 'icons/mob/hands.dmi', + SPECIES_HUMAN = 'icons/mob/hands.dmi', + SPECIES_TAJ = 'icons/mob/hands.dmi', + SPECIES_SKRELL = 'icons/mob/hands.dmi', + SPECIES_UNATHI = 'icons/mob/hands.dmi', + SPECIES_XENOHYBRID = 'icons/mob/hands.dmi', + SPECIES_AKULA = 'icons/mob/hands.dmi', + SPECIES_SERGAL = 'icons/mob/hands.dmi', + SPECIES_NEVREAN = 'icons/mob/hands.dmi', + SPECIES_VULPKANIN = 'icons/mob/hands.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/hands.dmi', + SPECIES_FENNEC = 'icons/mob/hands.dmi', + SPECIES_PROMETHEAN = 'icons/mob/hands.dmi', + SPECIES_TESHARI = 'icons/mob/species/teshari/hands.dmi', + SPECIES_VASILISSAN = 'icons/mob/hands.dmi', + SPECIES_VOX = 'icons/mob/species/vox/gloves.dmi', + SPECIES_XENOMORPH_HYBRID = 'icons/mob/species/xenomorph_hybrid/gloves.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/mob/hands.dmi', + SPECIES_TAJ = 'icons/mob/hands.dmi', + SPECIES_SKRELL = 'icons/mob/hands.dmi', + SPECIES_UNATHI = 'icons/mob/hands.dmi', + SPECIES_XENOHYBRID = 'icons/mob/hands.dmi', + SPECIES_AKULA = 'icons/mob/hands.dmi', + SPECIES_SERGAL = 'icons/mob/hands.dmi', + SPECIES_NEVREAN = 'icons/mob/hands.dmi', + SPECIES_VULPKANIN = 'icons/mob/hands.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/hands.dmi', + SPECIES_FENNEC = 'icons/mob/hands.dmi', + SPECIES_PROMETHEAN = 'icons/mob/hands.dmi', + SPECIES_TESHARI = 'icons/mob/hands.dmi', + SPECIES_VASILISSAN = 'icons/mob/hands.dmi', + SPECIES_VOX = 'icons/mob/hands.dmi', + SPECIES_XENOMORPH_HYBRID = 'icons/mob/hands.dmi' + ) + icon = 'icons/mob/hands.dmi' + default_worn_icon = 'icons/mob/hands.dmi' + +/obj/item/clothing/shoes/magboots/rig/protean + name = "mass" + desc = "Boot-shaped clusters of nanomachines." + species_restricted = list(SPECIES_PROTEAN, SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_XENOMORPH_HYBRID) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/feet.dmi', + SPECIES_VOX = 'icons/mob/species/vox/shoes.dmi', + SPECIES_XENOMORPH_HYBRID = 'icons/mob/species/xenomorph_hybrid/shoes.dmi' + ) + sprite_sheets_obj = list() + icon = 'icons/mob/feet.dmi' + default_worn_icon = 'icons/mob/feet.dmi' + +/obj/item/clothing/suit/space/rig/protean + name = "mass" + desc = "A body-hugging mass of nanomachines." + can_breach = 0 + species_restricted = list(SPECIES_PROTEAN, SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_XENOMORPH_HYBRID) + allowed = list( + /obj/item/gun, + /obj/item/flashlight, + /obj/item/tank, + /obj/item/suit_cooling_unit, + /obj/item/melee/baton, + /obj/item/storage/backpack, + ) + sprite_sheets = list( + SPECIES_TESHARI = 'icons/mob/species/teshari/suit.dmi', + SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', + SPECIES_XENOMORPH_HYBRID = 'icons/mob/species/xenomorph_hybrid/suit.dmi' + ) + + sprite_sheets_obj = list() + icon = 'icons/mob/spacesuit.dmi' + default_worn_icon = 'icons/mob/spacesuit.dmi' + +//Copy pasted most of this proc from base because I don't feel like rewriting the base proc with a shit load of exceptions +/obj/item/rig/protean/attackby(obj/item/W as obj, mob/living/user as mob) + if(!istype(user)) + return 0 + if(dead) + switch(dead) + if(1) + if(W.is_screwdriver()) + playsound(src, W.usesound, 50, 1) + if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE)) + to_chat(user, span_notice("You unscrew the maintenace panel on the [src].")) + dead +=1 + return + if(2) + if(istype(W, /obj/item/protean_reboot))//placeholder + if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE)) + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, span_notice("You carefully slot [W] in the [src].")) + dead +=1 + qdel(W) + return + if(3) + if(istype(W, /obj/item/stack/nanopaste)) + if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE)) + playsound(src, 'sound/effects/ointment.ogg', 50, 1) + to_chat(user, span_notice("You slather the interior confines of the [src] with the [W].")) + dead +=1 + W?:use(1) + return + if(4) + if(istype(W, /obj/item/shockpaddles)) + if(W?:can_use(user)) + to_chat(user, span_notice("You hook up the [W] to the contact points in the maintenance assembly")) + if(do_after(user,50,src,exclusive = TASK_ALL_EXCLUSIVE)) + playsound(src, 'sound/machines/defib_charge.ogg', 50, 0) + if(do_after(user,10,src)) + playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1) + playsound(src, 'sound/machines/defib_success.ogg', 50, 0) + new /obj/effect/gibspawner/robot(src.loc) + src.atom_say("Contact received! Reassembly nanites calibrated. Estimated time to resucitation: 1 minute 30 seconds") + addtimer(CALLBACK(src, PROC_REF(make_alive), myprotean?:humanform), 900) + return + if(istype(W,/obj/item/rig)) + if(!assimilated_rig) + AssimilateRig(user,W) + if(istype(W,/obj/item/tank)) //Todo, some kind of check for suits without integrated air supplies. + if(air_supply) + to_chat(user, "\The [src] already has a tank installed.") + return + + if(!user.unEquip(W)) + return + + air_supply = W + W.forceMove(src) + to_chat(user, "You slot [W] into [src] and tighten the connecting valve.") + return + + // Check if this is a hardsuit upgrade or a modification. + else if(istype(W,/obj/item/rig_module)) + if(!installed_modules) + installed_modules = list() + if(installed_modules.len) + for(var/obj/item/rig_module/installed_mod in installed_modules) + if(!installed_mod.redundant && istype(installed_mod,W)) + to_chat(user, "The hardsuit already has a module of that class installed.") + return 1 + + var/obj/item/rig_module/mod = W + to_chat(user, "You begin installing \the [mod] into \the [src].") + if(!do_after(user,40)) + return + if(!user || !W) + return + if(!user.unEquip(mod)) + return + to_chat(user, "You install \the [mod] into \the [src].") + installed_modules |= mod + mod.forceMove(src) + mod.installed(src) + update_icon() + return 1 + else if(W.is_wrench()) + if(!air_supply) + to_chat(user, "There is no tank to remove.") + return + + if(user.r_hand && user.l_hand) + air_supply.forceMove(get_turf(user)) + else + user.put_in_hands(air_supply) + to_chat(user, "You detach and remove \the [air_supply].") + air_supply = null + return + else if(W.is_screwdriver()) + var/list/possible_removals = list() + for(var/obj/item/rig_module/module in installed_modules) + if(module.permanent) + continue + possible_removals[module.name] = module + + if(!possible_removals.len) + to_chat(user, "There are no installed modules to remove.") + return + + var/removal_choice = tgui_input_list(usr, "Which module would you like to remove?", "Removal Choice", possible_removals) + if(!removal_choice) + return + + var/obj/item/rig_module/removed = possible_removals[removal_choice] + to_chat(user, "You detach \the [removed] from \the [src].") + removed.forceMove(get_turf(src)) + removed.removed() + installed_modules -= removed + update_icon() + return + for(var/obj/item/rig_module/module in installed_modules) + if(module.accepts_item(W,user)) //Item is handled in this proc + return + if(rig_storage) + var/obj/item/storage/backpack = rig_storage + if(backpack.can_be_inserted(W, 1)) + backpack.handle_item_insertion(W) + else + if(istype(W,/obj/item/storage/backpack)) + AssimilateBag(user,0,W) + ..() + +/obj/item/rig/protean/proc/make_alive(var/mob/living/carbon/human/H, var/partial) + if(H) + H.setToxLoss(0) + H.setOxyLoss(0) + H.setCloneLoss(0) + H.setBrainLoss(0) + H.SetParalysis(0) + H.SetStunned(0) + H.SetWeakened(0) + H.blinded = 0 + H.SetBlinded(0) + H.eye_blurry = 0 + H.ear_deaf = 0 + H.ear_damage = 0 + H.heal_overall_damage(H.getActualBruteLoss(), H.getActualFireLoss(), 1) + for(var/I in H.organs_by_name) + if(!H.organs_by_name[I] || istype(H.organs_by_name[I], /obj/item/organ/external/stump)) + if(H.organs_by_name[I]) + var/obj/item/organ/external/oldlimb = H.organs_by_name[I] + oldlimb.removed() + qdel(oldlimb) + var/list/organ_data = H.species.has_limbs[I] + var/limb_path = organ_data["path"] + var/obj/item/organ/external/new_eo = new limb_path(H) + new_eo.robotize(H.synthetic ? H.synthetic.company : null) + new_eo.sync_colour_to_human(H) + if(!partial) + dead_mob_list.Remove(H) + living_mob_list += H + H.tod = null + H.timeofdeath = 0 + H.set_stat(CONSCIOUS) + if(istype(H.species, /datum/species/protean)) + var/datum/species/protean/S + S = H.species + S.pseudodead = 0 + to_chat(myprotean, span_notice("You have finished reconstituting.")) + playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) + dead = 0 + +/obj/item/rig/protean/take_hit(damage, source, is_emp=0) + return //We don't do that here + +/obj/item/rig/protean/emp_act(severity_class) + return //Same here + +/obj/item/rig/protean/cut_suit() + return //nope + +/obj/item/rig/protean/force_rest(var/mob/user) + wearer.lay_down() + to_chat(user, span_notice("\The [wearer] is now [wearer.resting ? "resting" : "getting up"].")) + +/obj/item/cell/protean + name = "Protean power cell" + desc = "Something terrible must have happened if you're managing to see this." + maxcharge = 10000 + charge_amount = 100 + var/mob/living/carbon/human/charger + +/obj/item/cell/protean/Initialize() //ChompEDIT New --> Initialize + charge = maxcharge + update_icon() + addtimer(CALLBACK(src, PROC_REF(search_for_protean)), 60) + +/obj/item/cell/protean/proc/search_for_protean() + if(istype(src.loc, /obj/item/rig/protean)) + var/obj/item/rig/protean/prig = src.loc + charger = prig.wearer + if(charger) + START_PROCESSING(SSobj, src) + +/obj/item/cell/protean/process() + var/C = charge + if(charger) + if((world.time >= last_use + charge_delay) && charger.nutrition > 100) + give(charge_amount) + charger.nutrition -= ((1/200)*(charge - C)) //Take nutrition relative to charge. Change the 1/200 if you want to alter the nutrition to charge ratio + else + return PROCESS_KILL + + +/obj/item/rig/protean/equipped(mob/living/carbon/human/M) + ..() + if(dead) + canremove = 1 + else + canremove = 0 + +/obj/item/rig/protean/ai_can_move_suit(mob/user, check_user_module = 0, check_for_ai = 0) + if(check_for_ai) + return 0 //We don't do that here. + if(offline || !cell || !cell.charge || locked_down) + if(user) + to_chat(user, span_warning("Your host rig is unpowered and unresponsive.")) + return 0 + if(!wearer || (wearer.back != src && wearer.belt != src)) + if(user) + to_chat(user, span_warning("Your host rig is not being worn.")) + return 0 + return 1 + +/obj/item/rig/protean/toggle_seals(mob/living/carbon/human/M, instant) + M = src.wearer + ..() + +/obj/item/rig/protean/toggle_cooling(mob/user) + user = src.wearer + ..() + +/obj/item/rig/protean/toggle_piece(piece, mob/living/carbon/human/H, deploy_mode, forced) + H = src.wearer + ..() + +/obj/item/rig/protean/get_description_interaction() + if(dead) + var/list/results = list() + switch(dead) + if(1) + results += "Use a screwdriver to start repairs." + if(2) + results += "Insert a Protean Reboot Programmer, printed from a protolathe." + if(3) + results += "Use some Nanopaste." + if(4) + results += "Use either a defib or jumper cables to start the reboot sequence." + return results + +//Effectively a round about way of letting a Protean wear other rigs. +/obj/item/rig/protean/proc/AssimilateRig(mob/user, var/obj/item/rig/R) + if(!can_assimilate_rig) + to_chat(user, span_warning("You can not place a rig into \the [src]")) + return + if(!R || assimilated_rig) + return + if(istype(R, /obj/item/rig/protean)) + to_chat(user, span_warning("The world is not ready for such a technological singularity.")) + return + to_chat(user, span_notice("You assimilate the [R] into the [src]. Mimicking its stats and appearance.")) + for(var/obj/item/piece in list(gloves,helmet,boots,chest)) + piece.armor = R.armor.Copy() + piece.max_pressure_protection = R.max_pressure_protection + piece.max_heat_protection_temperature = R.max_heat_protection_temperature + //I dislike this piece of code, but not every rig has the full set of parts + if(R.gloves) + gloves.sprite_sheets = R.gloves.sprite_sheets.Copy() + gloves.sprite_sheets_obj = R.gloves.sprite_sheets.Copy() + gloves.icon = R.gloves.icon + gloves.icon_state = R.gloves.icon_state + gloves.default_worn_icon = R.gloves.default_worn_icon + if(R.helmet) + helmet.sprite_sheets = R.helmet.sprite_sheets.Copy() + helmet.sprite_sheets_obj = R.helmet.sprite_sheets.Copy() + helmet.icon = R.helmet.icon + helmet.icon_state = R.helmet.icon_state + helmet.default_worn_icon = R.helmet.default_worn_icon + if(R.boots) + boots.sprite_sheets = R.boots.sprite_sheets.Copy() + boots.sprite_sheets_obj = R.boots.sprite_sheets.Copy() + boots.icon = R.boots.icon + boots.icon_state = R.boots.icon_state + boots.default_worn_icon = R.boots.default_worn_icon + if(R.chest) + chest.sprite_sheets = R.chest.sprite_sheets.Copy() + chest.sprite_sheets_obj = R.chest.sprite_sheets.Copy() + chest.icon = R.chest.icon + chest.icon_state = R.chest.icon_state + chest.default_worn_icon = R.chest.default_worn_icon + + suit_state = R.suit_state + name = R.name + icon = R.icon + icon_state = R.icon_state + user.drop_item(R) + contents += R + assimilated_rig = R + slowdown = (initial(R.slowdown) *0.5) + offline_slowdown = slowdown + +/obj/item/rig/protean/verb/RemoveRig() + set name = "Remove Assimilated Rig" + set category = "Object" + + if(assimilated_rig) + for(var/obj/item/piece in list(gloves,helmet,boots,chest)) + piece.armor = armor.Copy() + piece.max_pressure_protection = initial(piece.max_pressure_protection) + piece.max_heat_protection_temperature = initial(piece.max_heat_protection_temperature) + piece.icon_state = src.icon_state + piece.icon = initial(piece.icon) + piece.default_worn_icon = initial(piece.default_worn_icon) + + //Byond at this time does not support initial() on lists + //So we have to create a new rig, just so we can copy the lists we're after + //If someone figures out a smarter way to do this, please tell me + var/obj/item/rig/tempRig = new /obj/item/rig/protean() + gloves.sprite_sheets = tempRig.gloves.sprite_sheets.Copy() + gloves.sprite_sheets_obj = tempRig.gloves.sprite_sheets.Copy() + helmet.sprite_sheets = tempRig.helmet.sprite_sheets.Copy() + helmet.sprite_sheets_obj = tempRig.helmet.sprite_sheets.Copy() + boots.sprite_sheets = tempRig.boots.sprite_sheets.Copy() + boots.sprite_sheets_obj = tempRig.boots.sprite_sheets.Copy() + chest.sprite_sheets = tempRig.chest.sprite_sheets.Copy() + chest.sprite_sheets_obj = tempRig.chest.sprite_sheets.Copy() + slowdown = initial(slowdown) + name = tempRig.name + icon = tempRig.icon // Reset the icon back to its original + icon_state = tempRig.icon_state + suit_state = icon_state + offline_slowdown = initial(offline_slowdown) + usr.put_in_hands(assimilated_rig) + assimilated_rig = null + qdel(tempRig) + else + to_chat(usr, "[src] has not assimilated a RIG. Use one on it to assimilate.") + +/obj/item/rig/protean/MouseDrop(obj/over_object as obj) + if(!canremove) + return + + if (isliving(usr) || isobserver(usr)) + + if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech. why? + return + + if (!( istype(over_object, /obj/screen) )) + return ..() + + if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + return + + if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.unEquip(src) + usr.put_in_r_hand(src) + if("l_hand") + usr.unEquip(src) + usr.put_in_l_hand(src) + src.add_fingerprint(usr) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig_tgui.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig_tgui.dm new file mode 100644 index 0000000000..6c90baed52 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_rig_tgui.dm @@ -0,0 +1,128 @@ +/* +It's a bit snowflake, but some rigsuit rewriting was necessary to achieved what I wanted +for protean rigsuits, and rolling these changes into the base RIGsuit code would definitely create +merge conflicts down the line. +So here it sits, snowflake code for a single item. +*/ + +/obj/item/rig/protean/tgui_state(mob/user) + return GLOB.tgui_always_state + +/obj/item/rig/protean/tgui_data(mob/user) + var/list/data = list() + + if(selected_module) + data["primarysystem"] = "[selected_module.interface_name]" + else + data["primarysystem"] = null + + if(loc != user) + data["ai"] = TRUE + else + data["ai"] = FALSE + + data["cooling"] = cooling_on + data["sealed"] = !sealed + data["sealing"] = sealing + data["helmet"] = (helmet ? "[helmet.name]" : "None.") + data["gauntlets"] = (gloves ? "[gloves.name]" : "None.") + data["boots"] = (boots ? "[boots.name]" : "None.") + data["chest"] = (chest ? "[chest.name]" : "None.") + + data["helmetDeployed"] = (helmet && helmet.loc == loc) + data["gauntletsDeployed"] = (gloves && gloves.loc == loc) + data["bootsDeployed"] = (boots && boots.loc == loc) + data["chestDeployed"] = (chest && chest.loc == loc) + + data["charge"] = cell ? round(cell.charge,1) : 0 + data["maxcharge"] = cell ? cell.maxcharge : 0 + data["chargestatus"] = cell ? FLOOR((cell.charge/cell.maxcharge)*50, 1) : 0 + + data["emagged"] = subverted + data["coverlock"] = locked + data["interfacelock"] = interface_locked + data["aicontrol"] = control_overridden + data["aioverride"] = ai_override_enabled + data["securitycheck"] = security_check_enabled + data["malf"] = malfunction_delay + + var/list/module_list = list() + if(!canremove && !sealing) + var/i = 1 + for(var/obj/item/rig_module/module in installed_modules) + var/list/module_data = list( + "index" = i, + "name" = "[module.interface_name]", + "desc" = "[module.interface_desc]", + "can_use" = module.usable, + "can_select" = module.selectable, + "can_toggle" = module.toggleable, + "is_active" = module.active, + "engagecost" = module.use_power_cost*10, + "activecost" = module.active_power_cost*10, + "passivecost" = module.passive_power_cost*10, + "engagestring" = module.engage_string, + "activatestring" = module.activate_string, + "deactivatestring" = module.deactivate_string, + "damage" = module.damage + ) + + if(module.charges && module.charges.len) + module_data["charges"] = list() + var/datum/rig_charge/selected = module.charges["[module.charge_selected]"] + module_data["realchargetype"] = module.charge_selected + module_data["chargetype"] = selected ? "[selected.display_name]" : "none" + + for(var/chargetype in module.charges) + var/datum/rig_charge/charge = module.charges[chargetype] + module_data["charges"] += list(list("caption" = "[charge.display_name] ([charge.charges])", "index" = "[chargetype]")) + + module_list += list(module_data) + i++ + + if(module_list.len) + data["modules"] = module_list + else + data["modules"] = list() + + return data +/* +/obj/item/rig/protean/tgui_act(action, params) + switch(action) + if("toggle_seals") + toggle_seals(wearer) + . = TRUE + if("toggle_cooling") + toggle_cooling(wearer) + . = TRUE + if("toggle_ai_control") + to_chat(usr, span_notice("Proteans cannot be AI controlled.")) + . = TRUE + if("toggle_suit_lock") + locked = !locked + . = TRUE + if("toggle_piece") + toggle_piece(params["piece"], wearer) + . = TRUE + if("interact_module") + var/module_index = text2num(params["module"]) + + if(module_index > 0 && module_index <= installed_modules.len) + var/obj/item/rig_module/module = installed_modules[module_index] + switch(params["module_mode"]) + if("select") + selected_module = module + . = TRUE + if("engage") + module.engage() + . = TRUE + if("toggle") + if(module.active) + module.deactivate() + else + module.activate() + . = TRUE + if("select_charge_type") + module.charge_selected = params["charge_type"] + . = TRUE +*/ diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index d6041fef4b..97b094968f 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -1,5 +1,4 @@ -#define DAM_SCALE_FACTOR 0.01 -#define METAL_PER_TICK 100 +#define METAL_PER_TICK SHEET_MATERIAL_AMOUNT/20 /datum/species/protean name = SPECIES_PROTEAN name_plural = "Proteans" @@ -7,7 +6,7 @@ " + span_italics("VERY") + " advanced civilizations have the option of 'nanoswarm' bodies. Effectively a single robot body comprised \ of millions of tiny nanites working in concert to maintain cohesion." show_ssd = "totally quiescent" - death_message = "rapidly loses cohesion, dissolving into a cloud of gray dust..." + death_message = "rapidly loses cohesion, retreating into their hardened control module..." knockout_message = "collapses inwards, forming a disordered puddle of gray goo." remains_type = /obj/effect/decal/cleanable/ash @@ -26,50 +25,52 @@ num_alternate_languages = 3 species_language = LANGUAGE_EAL assisted_langs = list(LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) + speech_bubble_appearance = "synthetic" color_mult = TRUE breath_type = null poison_type = null - virus_immune = 1 - blood_volume = 0 - min_age = 18 - max_age = 200 - brute_mod = 0.8 - burn_mod = 1.5 - oxy_mod = 0 - item_slowdown_mod = 1.33 + // male_scream_sound = null + // female_scream_sound = null - cold_level_1 = 280 //Default 260 - Lower is better - cold_level_2 = 220 //Default 200 - cold_level_3 = 130 //Default 120 - - heat_level_1 = 320 //Default 360 - heat_level_2 = 370 //Default 400 - heat_level_3 = 600 //Default 1000 + virus_immune = 1 + blood_volume = 0 + min_age = 18 + max_age = 200 + oxy_mod = 0 + //radiation_mod = 0 //Can't be assed with fandangling rad protections while blob formed/suited + siemens_coefficient = 2 + brute_mod = 0.8 + burn_mod = 1.5 + emp_dmg_mod = 0.8 + emp_sensitivity = EMP_BLIND | EMP_DEAFEN | EMP_BRUTE_DMG | EMP_BURN_DMG + item_slowdown_mod = 1.5 //Gentle encouragement to let others wear you hazard_low_pressure = -1 //Space doesn't bother them - hazard_high_pressure = 200 //They can cope with slightly higher pressure - //Cold/heat does affect them, but it's done in special ways below cold_level_1 = -INFINITY cold_level_2 = -INFINITY cold_level_3 = -INFINITY - heat_level_1 = INFINITY - heat_level_2 = INFINITY - heat_level_3 = INFINITY + heat_level_1 = 420 + heat_level_2 = 480 + heat_level_3 = 1100 - body_temperature = 290 + body_temperature = 290 - siemens_coefficient = 1.5 //Very bad zappy times - rarity_value = 5 + rarity_value = 5 + + // species_sounds = "Robotic" + + // crit_mod = 4 //Unable to go crit + var/obj/item/rig/protean/OurRig genders = list(MALE, FEMALE, PLURAL, NEUTER) has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, - O_FACT = /obj/item/organ/internal/nano/refactory + O_FACT = /obj/item/organ/internal/nano/refactory, ) has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/nano), @@ -85,7 +86,7 @@ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable/nano) ) - heat_discomfort_strings = list("You feel too warm.") + heat_discomfort_strings = list("WARNING: Temperature exceeding acceptable thresholds!.") cold_discomfort_strings = list("You feel too cool.") //These verbs are hidden, for hotkey use only @@ -94,7 +95,11 @@ /mob/living/carbon/human/proc/nano_partswap, /mob/living/carbon/human/proc/nano_metalnom, /mob/living/carbon/human/proc/nano_blobform, - /mob/living/carbon/human/proc/nano_set_size, + /mob/living/carbon/human/proc/nano_rig_transform, + /mob/living/carbon/human/proc/nano_copy_body, + /mob/living/carbon/human/proc/appearance_switch, + /mob/living/carbon/human/proc/nano_latch, + /mob/living/proc/set_size, /mob/living/carbon/human/proc/nano_change_fitting, //These verbs are displayed normally, /mob/living/carbon/human/proc/shapeshifter_select_hair, /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, @@ -105,12 +110,29 @@ /mob/living/carbon/human/proc/shapeshifter_select_tail, /mob/living/carbon/human/proc/shapeshifter_select_ears, /mob/living/carbon/human/proc/shapeshifter_select_secondary_ears, - ) + /mob/living/proc/flying_toggle, + /mob/living/proc/flying_vore_toggle, + /mob/living/proc/start_wings_hovering, + ) //removed fetish verbs, since non-customs can pick neutral traits now. Also added flight, cause shapeshifter can grow wings. var/global/list/abilities = list() var/monochromatic = FALSE //IGNORE ME + var/blob_appearance = "puddle1" + var/blob_color_1 = "#363636" + var/blob_color_2 = "#ba3636" + var/list/dragon_overlays = list( + "dragon_underSmooth" = "#FFFFFF", + "dragon_bodySmooth" = "#FFFFFF", + "dragon_earsNormal" = "#FFFFFF", + "dragon_maneShaggy" = "#FFFFFF", + "dragon_hornsPointy" = "#FFFFFF", + "dragon_eyesNormal" = "#FFFFFF" + ) + + var/pseudodead = 0 + /datum/species/protean/New() ..() if(!LAZYLEN(abilities)) @@ -127,20 +149,62 @@ if(saved_nif) saved_nif.quick_implant(H) +/datum/species/protean/get_race_key() + var/datum/species/real = GLOB.all_species[base_species] + return real.race_key + /datum/species/protean/get_bodytype(var/mob/living/carbon/human/H) if(!H || base_species == name) return ..() var/datum/species/S = GLOB.all_species[base_species] return S.get_bodytype(H) +/datum/species/protean/get_icobase(var/mob/living/carbon/human/H, var/get_deform) + if(!H || base_species == name) return ..(null, get_deform) + var/datum/species/S = GLOB.all_species[base_species] + return S.get_icobase(H, get_deform) + /datum/species/protean/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H) - return GLOB.playable_species + var/static/list/protean_shapeshifting_forms = GLOB.playable_species.Copy() - SPECIES_PROMETHEAN + return protean_shapeshifting_forms + +/datum/species/protean/get_tail(var/mob/living/carbon/human/H) + if(!H || base_species == name) return ..() + var/datum/species/S = GLOB.all_species[base_species] + return S.get_tail(H) + +/datum/species/protean/get_tail_animation(var/mob/living/carbon/human/H) + if(!H || base_species == name) return ..() + var/datum/species/S = GLOB.all_species[base_species] + return S.get_tail_animation(H) + +/datum/species/protean/get_tail_hair(var/mob/living/carbon/human/H) + if(!H || base_species == name) return ..() + var/datum/species/S = GLOB.all_species[base_species] + return S.get_tail_hair(H) + +/datum/species/protean/get_blood_mask(var/mob/living/carbon/human/H) + if(!H || base_species == name) return ..() + var/datum/species/S = GLOB.all_species[base_species] + return S.get_blood_mask(H) + +/datum/species/protean/get_damage_mask(var/mob/living/carbon/human/H) + if(!H || base_species == name) return ..() + var/datum/species/S = GLOB.all_species[base_species] + return S.get_damage_mask(H) + +/datum/species/protean/get_damage_overlays(var/mob/living/carbon/human/H) + if(!H || base_species == name) return ..() + var/datum/species/S = GLOB.all_species[base_species] + return S.get_damage_overlays(H) /datum/species/protean/handle_post_spawn(var/mob/living/carbon/human/H) ..() H.synth_color = TRUE /datum/species/protean/equip_survival_gear(var/mob/living/carbon/human/H) - var/obj/item/stack/material/steel/metal_stack = new(null, 3) + ..() + var/obj/item/stack/material/steel/metal_stack = new() + metal_stack.set_amount(5) var/obj/item/clothing/accessory/permit/nanotech/permit = new() permit.set_name(H.real_name) @@ -161,6 +225,8 @@ else H.nif.durability = 25 + new /obj/item/rig/protean(H,H) + /datum/species/protean/hug(var/mob/living/carbon/human/H, var/mob/living/target) return ..() //Wut @@ -172,18 +238,22 @@ /datum/species/protean/handle_death(var/mob/living/carbon/human/H) if(!H) - return // Iono! - + return //No body? + if(OurRig.dead) + return + OurRig.dead = 1 + var/mob/temp = H if(H.temporary_form) - H.forceMove(H.temporary_form.drop_location()) - H.ckey = H.temporary_form.ckey - QDEL_NULL(H.temporary_form) - - to_chat(H, span_warning("You died as a Protean. Please sit out of the round for at least 60 minutes before respawning, to represent the time it would take to ship a new-you to the station.")) - - spawn(1) - if(H) - H.gib() + temp = H.temporary_form + playsound(temp, 'sound/voice/borg_deathsound.ogg', 50, 1) + temp.visible_message(span_bold("[temp.name]") + " shudders and retreats inwards, coalescing into a single core componant!") + to_chat(temp, span_warning("You've died as a Protean! While dead, you will be locked to your core RIG control module until you can be repaired. Instructions to your revival can be found in the Examine tab when examining your module.")) + if(H.temporary_form) + if(!istype(H.temporary_form.loc, /obj/item/rig/protean)) + H.nano_rig_transform(1) + else + H.nano_rig_transform(1) + pseudodead = 1 /datum/species/protean/handle_environment_special(var/mob/living/carbon/human/H) if((H.getActualBruteLoss() + H.getActualFireLoss()) > H.maxHealth*0.5 && isturf(H.loc)) //So, only if we're not a blob (we're in nullspace) or in someone (or a locker, really, but whatever) @@ -325,16 +395,26 @@ material_name = MAT_STEEL /datum/modifier/protean/steel/tick() - holder.adjustBruteLoss(-1,include_robo = TRUE) //Modified by species resistances - holder.adjustFireLoss(-0.5,include_robo = TRUE) //Modified by species resistances - var/mob/living/carbon/human/H = holder - for(var/obj/item/organ/O as anything in H.internal_organs) - // Fix internal damage - if(O.damage > 0) - O.damage = max(0,O.damage-0.1) - // If not damaged, but dead, fix it - else if(O.status & ORGAN_DEAD) - O.status &= ~ORGAN_DEAD //Unset dead if we repaired it entirely + //Heal a random damaged limb by 1,1 per tick + holder.adjustBruteLoss(-1,include_robo = TRUE) + holder.adjustFireLoss(-1,include_robo = TRUE) + holder.adjustToxLoss(-1) + + var/mob/living/carbon/human/H + if(ishuman(holder)) + H = holder + + //Then heal every damaged limb by a smaller amount + if(H) + for(var/obj/item/organ/external/O in H.organs) + O.heal_damage(0.5, 0.5, 0, 1) + + //Heal the organs a little bit too, as a treat + for(var/obj/item/organ/O as anything in H.internal_organs) + if(O.damage > 0) + O.damage = max(0,O.damage-0.3) + else if(O.status & ORGAN_DEAD) + O.status &= ~ORGAN_DEAD //Unset dead if we repaired it entirely // PAN Card /obj/item/clothing/accessory/permit/nanotech @@ -357,6 +437,4 @@ . = ..() . += validstring . += registring - -#undef DAM_SCALE_FACTOR #undef METAL_PER_TICK diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index fb8f73b952..8ecb4b9d44 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -170,7 +170,7 @@ update_canmove() weakened = 2 - revive_ready = world.time + 10 MINUTES //set the cooldown CHOMPEdit: Reduced this to 10 minutes, you're playing with fire if you're reviving that often. + revive_ready = world.time + 10 MINUTES //set the cooldown, Reduced this to 10 minutes, you're playing with fire if you're reviving that often. /datum/modifier/resleeving_sickness/chimera //near identical to the regular version, just with different flavortexts name = "imperfect regeneration" diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index d5df619333..6880142471 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -28,3 +28,9 @@ S.sharer_died(gibbed) . = ..() + +/mob/living/proc/delayed_gib() + visible_message(span_danger(span_bold("[src]") + " starts convulsing violently!"), span_danger("You feel as if your body is tearing itself apart!")) + Weaken(30) + make_jittery(1000) + addtimer(CALLBACK(src, PROC_REF(gib)), rand(2 SECONDS, 10 SECONDS)) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 8f412c4c1b..2ddea51a17 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -25,6 +25,17 @@ else newitem.forceMove(S) return S + + if(istype(src.back,/obj/item/rig)) //This would be much cooler if we had componentized storage datums + var/obj/item/rig/R = src.back + if(R.rig_storage) + var/obj/item/storage/backpack = R.rig_storage + if(backpack.can_be_inserted(newitem, 1)) + if(user_initiated) + backpack.handle_item_insertion(newitem) + else + newitem.forceMove(src.back) + return backpack return 0 //Returns the thing in our active hand diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a81282f364..cbedd7d392 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -613,6 +613,11 @@ L += D.wrapped if(istype(D.wrapped, /obj/item/storage)) //this should never happen L += get_contents(D.wrapped) + + for(var/obj/item/rig/R in src.contents) //Check rigsuit storage for items + if(R.rig_storage) + L += get_contents(R.rig_storage) + return L /mob/living/proc/check_contents_for(A) diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index fe8b80b535..57d054e424 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -140,50 +140,8 @@ set desc = "Sets your voice style!" set category = "OOC.Game Settings" - var/list/possible_voice_types = list( - "beep-boop", - "goon speak 1", - "goon speak 2", - "goon speak 3", - "goon speak 4", - "goon speak blub", - "goon speak bottalk", - "goon speak buwoo", - "goon speak cow", - "goon speak lizard", - "goon speak pug", - "goon speak pugg", - "goon speak roach", - "goon speak skelly") + var/list/possible_voice_types = get_talk_sound() var/choice = tgui_input_list(usr, "Which set of sounds would you like to use for your character's speech sounds?", "Voice Sounds", possible_voice_types) if(!choice) voice_sounds_list = talk_sound - switch(choice) - if("beep-boop") - voice_sounds_list = talk_sound - if("goon speak 1") - voice_sounds_list = goon_speak_one_sound - if("goon speak 2") - voice_sounds_list = goon_speak_two_sound - if("goon speak 3") - voice_sounds_list = goon_speak_three_sound - if("goon speak 4") - voice_sounds_list = goon_speak_four_sound - if("goon speak blub") - voice_sounds_list = goon_speak_blub_sound - if("goon speak bottalk") - voice_sounds_list = goon_speak_bottalk_sound - if("goon speak buwoo") - voice_sounds_list = goon_speak_buwoo_sound - if("goon speak cow") - voice_sounds_list = goon_speak_cow_sound - if("goon speak lizard") - voice_sounds_list = goon_speak_lizard_sound - if("goon speak pug") - voice_sounds_list = goon_speak_pug_sound - if("goon speak pugg") - voice_sounds_list = goon_speak_pugg_sound - if("goon speak roach") - voice_sounds_list = goon_speak_roach_sound - if("goon speak skelly") - voice_sounds_list = goon_speak_skelly_sound + voice_sounds_list = get_talk_sound(choice) diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index 94819c56c9..ab322eb9bc 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -29,35 +29,7 @@ if(!voice_sounds_list.len || !voice_sounds_list) if(client.prefs.voice_sound) var/prefsound = client.prefs.voice_sound - switch(prefsound) - if("beep-boop") - voice_sounds_list = talk_sound - if("goon speak 1") - voice_sounds_list = goon_speak_one_sound - if("goon speak 2") - voice_sounds_list = goon_speak_two_sound - if("goon speak 3") - voice_sounds_list = goon_speak_three_sound - if("goon speak 4") - voice_sounds_list = goon_speak_four_sound - if("goon speak blub") - voice_sounds_list = goon_speak_blub_sound - if("goon speak bottalk") - voice_sounds_list = goon_speak_bottalk_sound - if("goon speak buwoo") - voice_sounds_list = goon_speak_buwoo_sound - if("goon speak cow") - voice_sounds_list = goon_speak_cow_sound - if("goon speak lizard") - voice_sounds_list = goon_speak_lizard_sound - if("goon speak pug") - voice_sounds_list = goon_speak_pug_sound - if("goon speak pugg") - voice_sounds_list = goon_speak_pugg_sound - if("goon speak roach") - voice_sounds_list = goon_speak_roach_sound - if("goon speak skelly") - voice_sounds_list = goon_speak_skelly_sound + voice_sounds_list = get_talk_sound(prefsound) else voice_sounds_list = talk_sound //VOREStation Add End diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index c506924923..683c1ffac8 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -34,6 +34,7 @@ to_chat(src, span_green("Communication circuit reinitialized. Speech and messaging functionality restored.")) handle_statuses() + handle_sleeping() if(health <= 0) card.death_damage() diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index c7615e92e6..b5c4dd522f 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -136,12 +136,21 @@ return 0 // This one takes an object's type instead of an instance, as above. -/mob/living/silicon/robot/proc/has_active_type(var/type_to_compare) +/mob/living/silicon/robot/proc/has_active_type(var/type_to_compare, var/explicit = FALSE) var/list/active_modules = list(module_state_1, module_state_2, module_state_3) - if(is_path_in_list(type_to_compare, active_modules)) + if(is_type_in_modules(type_to_compare, active_modules, explicit)) return TRUE return FALSE +/mob/living/silicon/robot/proc/is_type_in_modules(var/type, var/list/modules, var/explicit = FALSE) + for(var/atom/module in modules) + if(explicit && isatom(module)) + if(module.type == type) + return TRUE + else if(istype(module, type)) + return TRUE + return FALSE + //Helper procs for cyborg modules on the UI. //These are hackish but they help clean up code elsewhere. diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index fdc3060a44..bbf89baf3a 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -157,7 +157,7 @@ var/seejanhud = src.sight_mode & BORGJAN var/area/A = get_area(src) - if(A?.no_spoilers) + if(A?.flag_check(AREA_NO_SPOILERS)) disable_spoiler_vision() if (src.stat == DEAD || (XRAY in mutations) || (src.sight_mode & BORGXRAY)) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d10451a520..b95612426a 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -343,6 +343,8 @@ if(module) var/list/module_sprites = SSrobot_sprites.get_module_sprites(module, src) if(module_sprites.len == 1 || !client) + if(!module_sprites.len) + return sprite_datum = module_sprites[1] sprite_datum.do_equipment_glamour(module) return diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 2eff632c3a..9f919a2b4b 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -387,3 +387,6 @@ else to_chat(usr, "You stop sensing creatures beyond the walls.") sight -= SEE_MOBS + +/mob/living/simple_mob/proc/character_directory_species() + return "simplemob" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm index 127295f615..3d05b68abb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm @@ -135,7 +135,7 @@ Field studies suggest analytical abilities on par with some species of cepholapo bitesize = 10 gender = NEUTER - has_langs = list("Drake") + has_langs = list(LANNGUAGE_DRAKE) see_in_dark = 8 // on par with Taj diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index abd7cdf105..a1335771f8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -59,6 +59,8 @@ say_list_type = /datum/say_list/corrupthound ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive/corrupthound + has_langs = list(LANGUAGE_GALCOM, LANGUAGE_EAL) //Robots speak in beep, yes? + max_buckled_mobs = 1 //Yeehaw can_buckle = TRUE buckle_movable = TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm index b45c3608b7..552060e313 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm @@ -6,7 +6,7 @@ to_chat(src,span_warning("You can't use that here!")) return FALSE //RS Port #658 Start - if(!client?.holder && A.block_phase_shift) + if(!client?.holder && A.flag_check(AREA_BLOCK_PHASE_SHIFT)) to_chat(src,span_warning("You can't use that here!")) return FALSE //RS Port #658 End diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index a942c55849..1b2c1571d7 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -358,13 +358,13 @@ return //RS Port #658 Start if(!holder) - if(isliving(mob) && A.block_phase_shift) + if(isliving(mob) && A.flag_check(AREA_BLOCK_PHASE_SHIFT)) to_chat(mob, span_warning("Something blocks you from entering this location while phased out.")) return - if(isobserver(mob) && A.block_ghosts) + if(isobserver(mob) && A.flag_check(AREA_BLOCK_GHOSTS)) to_chat(mob, span_warning("Ghosts can't enter this location.")) var/area/our_area = mobloc.loc - if(our_area.block_ghosts) + if(our_area.flag_check(AREA_BLOCK_GHOSTS)) var/mob/observer/dead/D = mob D.return_to_spawn() return diff --git a/code/modules/mob/new_player/sprite_accessories_ear.dm b/code/modules/mob/new_player/sprite_accessories_ear.dm index bfd21771d1..56231f9944 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear.dm @@ -6,14 +6,14 @@ //////////////////////////// */ /datum/sprite_accessory/ears - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/human_races/sprite_accessories/ears.dmi' do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 var/extra_overlay // Icon state of an additional overlay to blend in. var/extra_overlay2 - var/desc = "You should not see this..." + var/desc = DEVELOPER_WARNING_NAME em_block = TRUE //species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) //Removing Polaris whitelits, ones we need are defined in our files diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm index c707920c88..b13390480c 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -6,7 +6,7 @@ //////////////////////////// */ /datum/sprite_accessory/ears - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/vore/ears_vr.dmi' do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER, SPECIES_GREY_YW, SPECIES_SHADEKIN_YW) //This lets all races use //YW EDIT diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm index fd9ad11382..858fe01b10 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail.dm @@ -6,7 +6,7 @@ //////////////////////////// */ /datum/sprite_accessory/tail - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/human_races/sprite_accessories/tails.dmi' do_colouration = 0 //Set to 1 to enable coloration using the tail color. @@ -16,7 +16,7 @@ var/extra_overlay2 //Tertiary. var/show_species_tail = 0 // If false, do not render species' tail. var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it - var/desc = "You should not see this..." + var/desc = DEVELOPER_WARNING_NAME var/ani_state // State when wagging/animated var/extra_overlay_w // Wagging state for extra overlay var/extra_overlay2_w // Tertiary wagging. diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm index e516eb2ac6..8b510e6502 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -6,7 +6,7 @@ //////////////////////////// */ /datum/sprite_accessory/tail - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/vore/tails_vr.dmi' var/offset_x = 0 var/offset_y = 0 @@ -1439,7 +1439,7 @@ //LONG TAILS ARE NOT TAUR BUTTS >:O /datum/sprite_accessory/tail/longtail - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/vore/taurs_vr.dmi' offset_x = -16 do_colouration = 1 // Yes color, using tail color diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm index 6dc5cbb011..b72a372b35 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -128,7 +128,7 @@ // Taur sprites are now a subtype of tail since they are mutually exclusive anyway. /datum/sprite_accessory/tail/taur - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' do_colouration = 1 // Yes color, using tail color color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm index f952596664..8d570d15cf 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -9,7 +9,7 @@ // Taur sprites are now a subtype of tail since they are mutually exclusive anyway. /datum/sprite_accessory/tail/taur - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/vore/taurs_vr.dmi' do_colouration = 1 // Yes color, using tail color color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY @@ -888,7 +888,7 @@ suit_sprites = 'icons/mob/taursuits_noodle_vr.dmi' clip_mask_state = "taur_clip_mask_noodle" icon_sprite_tag = "noodle" -/* CHOMPEdit - removed as a sprite accessory of the same name already exists for us, and having this here stops it from registering as a sprite accessory. + /datum/sprite_accessory/tail/taur/sect_drone name = "Sect Drone (Taur)" icon_state = "sect_drone" @@ -909,7 +909,7 @@ msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!" msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!" -*/ + /datum/sprite_accessory/tail/taur/sect_drone/fat name = "Fat Sect Drone (Taur)" icon_state = "fat_sect_drone" diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 226295640c..f4553a3f8d 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -575,13 +575,13 @@ // No, this isn't a character creation option, but... I guess in the future it could be, if anyone wants that? /datum/sprite_accessory/hair_accessory - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/vore/hair_accessories_vr.dmi' do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color var/ignores_lighting = 0 // Whether or not this hair accessory will ignore lighting and glow in the dark. color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/desc = "You should not see this..." + var/desc = DEVELOPER_WARNING_NAME /datum/sprite_accessory/hair_accessory/verie_hair_glow name = "veries hair glow" diff --git a/code/modules/mob/new_player/sprite_accessories_wing.dm b/code/modules/mob/new_player/sprite_accessories_wing.dm index 3b13156b9d..3f2f2efd69 100644 --- a/code/modules/mob/new_player/sprite_accessories_wing.dm +++ b/code/modules/mob/new_player/sprite_accessories_wing.dm @@ -6,7 +6,7 @@ //////////////////////////// */ /datum/sprite_accessory/wing - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/human_races/sprite_accessories/wings.dmi' do_colouration = 0 //Set to 1 to enable coloration using the tail color. @@ -16,7 +16,7 @@ var/extra_overlay2 //Tertiary. var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana - var/desc = "You should not see this..." + var/desc = DEVELOPER_WARNING_NAME var/ani_state // State when flapping/animated var/extra_overlay_w // Flapping state for extra overlay var/extra_overlay2_w diff --git a/code/modules/mob/new_player/sprite_accessories_wing_large_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_large_vr.dm index e516d6b085..66263ad850 100644 --- a/code/modules/mob/new_player/sprite_accessories_wing_large_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_wing_large_vr.dm @@ -2,7 +2,7 @@ /datum/sprite_accessory/wing/large - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/vore/wings96_vr.dmi' wing_offset = 32 diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm index d26b57177b..6610a2e8ea 100644 --- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm @@ -6,7 +6,7 @@ //////////////////////////// */ /datum/sprite_accessory/wing - name = "You should not see this..." + name = DEVELOPER_WARNING_NAME icon = 'icons/mob/vore/wings_vr.dmi' do_colouration = 0 //Set to 1 to enable coloration using the tail color. species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_HANNER) //This lets all races use diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index fd460658ff..f3794e4309 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -15,9 +15,11 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable //Nanotech Implant Foundation /obj/item/nif name = "nanite implant framework" - desc = "The product of a collaboration between NanoTrasen and Bishop Cybernetics. Can print new \ + desc = "The product of a collaboration between NanoTrasen and Bishop Cybernetics. \ + A mass-production model of a nano working surface, in a box. Can print new \ implants inside living hosts on the fly based on software uploads. Must be surgically \ - implanted in the head to work. Will eventually require maintanence." + implanted in the head to work, and requires periodical maintenance. Warning: this device \ + is extremely sensitive to electromagnetic pulse waves." // YW EDIT "The product of a collaboration between NanoTrasen and Bishop Cybernetics."" icon = 'icons/obj/device_alt.dmi' icon_state = "nif_0" @@ -631,8 +633,9 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable starting_software = null /obj/item/nif/authentic - name = "\improper Authentic NIF" // YW EDIT - desc = "A much more expensive, advanced prototype of the NIF technology. Not usually found in the frontier." // YW Edit + name = "luxury NIF" + desc = "An actual nano working surface, in a box. These are the high-end models, usually only available to big spenders and those with serious contacts. \ + Despite the all the marketing speak, they're really just a high-endurance NIF when it comes down to it." durability = 1000 // YW Addition: START @@ -645,7 +648,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable /obj/item/nif/bioadap name = "bioadaptive NIF" - desc = "A NIF that goes out of it's way to accomidate strange body types. \ + desc = "A NIF that goes out of it's way to accomodate strange body types. \ Will function in species where it normally wouldn't." durability = 75 bioadap = TRUE diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index fdb51c1ef9..0629650c24 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -382,6 +382,35 @@ for(var/i = 0 to 7) new /obj/item/disk/nifsoft/mining(src) +// Pilot Disk // +/obj/item/disk/nifsoft/pilot + name = "NIFSoft Uploader - Pilot" + desc = "Contains free NIFSofts useful for pilot members.\n\ + It has a small label: \n\ + \"Portable NIFSoft Installation Media. \n\ + Align ocular port with eye socket and depress red plunger.\"" + icon = 'icons/obj/nanomods_vr.dmi' + icon_state = "pilot" + stored_organic = /datum/nifsoft/package/pilot + stored_synthetic = /datum/nifsoft/package/pilot_synth + +/datum/nifsoft/package/pilot + software = list(/datum/nifsoft/spare_breath) + +/datum/nifsoft/package/pilot_synth + software = list(/datum/nifsoft/pressure,/datum/nifsoft/heatsinks) + +/obj/item/storage/box/nifsofts_pilot + name = "pilot nifsoft uploaders" + desc = "A box of free nifsofts for pilot employees." + icon = 'icons/obj/boxes_vr.dmi' + icon_state = "nifsoft_kit_pilot" + +/obj/item/storage/box/nifsofts_pilot/New() + ..() + for(var/i = 0 to 7) + new /obj/item/disk/nifsoft/pilot(src) + // Mass Alteration Disk // /obj/item/disk/nifsoft/sizechange name = "NIFSoft Uploader - Mass Alteration" diff --git a/code/modules/nifsoft/nifsoft_vr.dm b/code/modules/nifsoft/nifsoft_vr.dm deleted file mode 100644 index 66d95474a7..0000000000 --- a/code/modules/nifsoft/nifsoft_vr.dm +++ /dev/null @@ -1,28 +0,0 @@ -// Pilot Disk // -/obj/item/disk/nifsoft/pilot - name = "NIFSoft Uploader - Pilot" - desc = "Contains free NIFSofts useful for pilot members.\n\ - It has a small label: \n\ - \"Portable NIFSoft Installation Media. \n\ - Align ocular port with eye socket and depress red plunger.\"" - icon = 'icons/obj/nanomods_vr.dmi' - icon_state = "pilot" - stored_organic = /datum/nifsoft/package/pilot - stored_synthetic = /datum/nifsoft/package/pilot_synth - -/datum/nifsoft/package/pilot - software = list(/datum/nifsoft/spare_breath) - -/datum/nifsoft/package/pilot_synth - software = list(/datum/nifsoft/pressure,/datum/nifsoft/heatsinks) - -/obj/item/storage/box/nifsofts_pilot - name = "pilot nifsoft uploaders" - desc = "A box of free nifsofts for pilot employees." - icon = 'icons/obj/boxes_vr.dmi' - icon_state = "nifsoft_kit_pilot" - -/obj/item/storage/box/nifsofts_pilot/New() - ..() - for(var/i = 0 to 7) - new /obj/item/disk/nifsoft/pilot(src) \ No newline at end of file diff --git a/code/modules/organs/internal/appendix.dm b/code/modules/organs/internal/appendix.dm index a941d5aadc..456f8f157c 100644 --- a/code/modules/organs/internal/appendix.dm +++ b/code/modules/organs/internal/appendix.dm @@ -9,12 +9,9 @@ /mob/living/carbon/human/proc/appendicitis() if(stat == DEAD) return 0 - var/obj/item/organ/internal/appendix/A = internal_organs_by_name[O_APPENDIX] - if(istype(A) && !A.inflamed) - A.inflamed = 1 - return 1 + ForceContractDisease(new /datum/disease/appendicitis) return 0 - +/* /obj/item/organ/internal/appendix/process() ..() @@ -47,7 +44,7 @@ owner.adjustToxLoss(25) groin.wounds += W inflamed = 1 - +*/ /obj/item/organ/internal/appendix/removed() if(inflamed) icon_state = "[initial(icon_state)]inflamed" diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index 8fa9a8e3cf..a3956a2bf9 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -1,3 +1,7 @@ +GLOBAL_LIST_INIT(dsi_to_species, list(SPECIES_TAJARAN = "DSI - Tajaran", SPECIES_UNATHI = "DSI - Lizard", SPECIES_SERGAL = "DSI - Sergal", SPECIES_NEVREAN = "DSI - Nevrean", \ + SPECIES_VULPKANIN = "DSI - Vulpkanin", SPECIES_AKULA = "DSI - Akula", SPECIES_VASILISSAN = "DSI - Vasilissan", SPECIES_ZORREN = "DSI - Zorren",\ + SPECIES_TESHARI = "DSI - Teshari", SPECIES_FENNEC = "DSI - Fennec")) + //CitRP Port var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ default=cyber_default;\ diff --git a/code/modules/organs/subtypes/nano.dm b/code/modules/organs/subtypes/nano.dm index 0c750a70d6..023ccc8005 100644 --- a/code/modules/organs/subtypes/nano.dm +++ b/code/modules/organs/subtypes/nano.dm @@ -2,81 +2,84 @@ /obj/item/organ/external/chest/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 50 // <-- This is different from the rest + max_damage = 70 // <-- This is different from the rest min_broken_damage = 1000 - vital = TRUE // <-- This is different from the rest + vital = TRUE model = "protean" /obj/item/organ/external/groin/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 30 // <-- This is different from the rest + max_damage = 70 min_broken_damage = 1000 //Multiple vital = FALSE model = "protean" /obj/item/organ/external/head/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 30 + max_damage = 70 min_broken_damage = 1000 //Inheritance vital = FALSE model = "protean" /obj/item/organ/external/arm/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 //Please vital = FALSE model = "protean" /obj/item/organ/external/arm/right/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 vital = FALSE model = "protean" /obj/item/organ/external/leg/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 vital = FALSE model = "protean" /obj/item/organ/external/leg/right/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 vital = FALSE model = "protean" /obj/item/organ/external/hand/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 vital = FALSE model = "protean" /obj/item/organ/external/hand/right/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 vital = FALSE model = "protean" /obj/item/organ/external/foot/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 vital = FALSE model = "protean" /obj/item/organ/external/foot/right/unbreakable/nano robotic = ORGAN_NANOFORM encased = FALSE - max_damage = 20 + max_damage = 40 min_broken_damage = 1000 vital = FALSE model = "protean" +/obj/item/organ/external/head/unbreakable/nano/disfigure() + return //No way to repair disfigured prots + // // // Internal Organs /obj/item/organ/internal/nano robotic = ORGAN_ROBOT @@ -180,9 +183,11 @@ icon = initial(icon) icon_state = "posi1" stored_mmi.icon_state = "posi1" - stored_mmi.brainmob.languages = owner.languages +/obj/item/organ/internal/mmi_holder/posibrain/nano/emp_act() + return //Proteans handle EMP's differently + // The 'out on the ground' object, not the organ holder /obj/item/mmi/digital/posibrain/nano name = "protean posibrain" @@ -209,3 +214,19 @@ /obj/item/mmi/digital/posibrain/nano/transfer_identity() . = ..() icon_state = "posi1" + +/obj/item/organ/internal/nano/digest_act(atom/movable/item_storage = null) + return FALSE + +/datum/design/item/protean_reboot + name = "Protean Reboot Programmer" + id = "protean_reboot" + materials = list(MAT_STEEL = 2000, MAT_GLASS = 1000, MAT_PLASTEEL = 10000) + build_path = /obj/item/protean_reboot + sort_string = "JVAAZ" + +/obj/item/protean_reboot + name = "Protean Reboot Programmer" + desc = "A small, highly specialized programmer used to form the basis of a Protean swarm. A necessary component in reconstituting a Protean who has lost total body cohesion." + icon = 'icons/mob/species/protean/protean.dmi' + icon_state = "reboot" diff --git a/code/modules/persistence/datum/persistence_datum.dm b/code/modules/persistence/datum/persistence_datum.dm index c3c154cce4..0f35c7af3d 100644 --- a/code/modules/persistence/datum/persistence_datum.dm +++ b/code/modules/persistence/datum/persistence_datum.dm @@ -85,7 +85,7 @@ if(!T || !(T.z in using_map.persist_levels) ) return FALSE var/area/A = get_area(T) - if(!A || (A.flags & AREA_FLAG_IS_NOT_PERSISTENT)) + if(!A || (A.flag_check(AREA_FLAG_IS_NOT_PERSISTENT))) return FALSE return TRUE diff --git a/code/modules/persistence/storage/smartfridge.dm b/code/modules/persistence/storage/smartfridge.dm index 44b5b3abdb..fd019cfa13 100644 --- a/code/modules/persistence/storage/smartfridge.dm +++ b/code/modules/persistence/storage/smartfridge.dm @@ -55,7 +55,7 @@ . = list() for(var/obj/item/stack/material/S as anything in L) var/real_path = istext(S) ? text2path(S) : S - if(!ispath(real_path, /obj/item/stack/material)) + if(!ispath(real_path, /obj/item/stack/material) || ispath(real_path, /obj/item/stack/material/cyborg)) log_debug("Warning: Sheet_storage persistent datum tried to create [S]") continue diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index c81b25d709..16199e4b8c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -684,7 +684,8 @@ GLOBAL_LIST_EMPTY(apcs) to_chat(user, span_notice("The [name] looks too sturdy to bash open with \the [W.name].")) // attack with hand - remove cell (if cover open) or interact with the APC -/obj/machinery/power/apc/verb/togglelock(mob/user as mob) + +/obj/machinery/power/apc/proc/togglelock(mob/user) if(emagged) to_chat(user, "The panel is unresponsive.") else if(opened) @@ -872,7 +873,7 @@ GLOBAL_LIST_EMPTY(apcs) // to_world("[area.power_equip]") area.power_change() -/obj/machinery/power/apc/proc/can_use(mob/user as mob, var/loud = 0) //used by attack_hand() and Topic() +/obj/machinery/power/apc/proc/can_use(mob/user, var/loud = 0) //used by attack_hand() and Topic() if(!user.client) return 0 if(isobserver(user) && is_admin(user)) //This is to allow nanoUI interaction by ghost admins. diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 6d7da776df..a8c47362de 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -366,7 +366,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) // VOREStation Edit Start var/area/A = get_area(T) - if(A.forbid_singulo) //No going to dorms + if(A.flag_check(AREA_FORBID_SINGULO)) //No going to dorms return 0 // VOREStation Edit End diff --git a/code/modules/projectiles/ammunition/magnetic.dm b/code/modules/projectiles/ammunition/magnetic.dm index 2bf94edb7e..febb0b8c86 100644 --- a/code/modules/projectiles/ammunition/magnetic.dm +++ b/code/modules/projectiles/ammunition/magnetic.dm @@ -17,9 +17,3 @@ name = "flechette magazine (small)" desc = "A magazine containing smaller steel flechettes, intended for a pistol." icon_state = "caseless-mag-short" - -/obj/item/magnetic_ammo/pistol/khi - name = "flechette magazine (small, khi)" - desc = "A magazine containing smaller carbyne flechettes, intended for a pistol." - icon_state = "caseless-mag-short-alt" - remaining = 12 \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm index c1238f820b..6a4a4764df 100644 --- a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm +++ b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm @@ -90,7 +90,7 @@ if(ownturf.z != T.z || get_dist(T,ownturf) > world.view) to_chat(user, span_warning("The target is out of range!")) return - if(get_area(A).flags & BLUE_SHIELDED) + if(get_area(A).flag_check(BLUE_SHIELDED)) to_chat(user, span_warning("The target area protected by bluespace shielding!")) return if(!(A in view(user, world.view))) diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm index e72361af2e..ee35819914 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm @@ -1,11 +1,9 @@ // The Gun // /obj/item/gun/projectile/cell_loaded //this one can load both medical and security cells! for ERT/admin use. name = "multipurpose cell-loaded revolver" - desc = "Variety is the spice of life! This weapon is a hybrid of the HI-102b 'Nanotech Selectable-Cell Weapon' and the Vey-Med ML-3 'Medigun'. \ + desc = "Variety is the spice of life! This weapon is a hybrid of the Hephaestus 102b 'Nanotech Selectable-Fire Weapon' and the Vey-Med ML-3 'Medigun', dubbed the 'NSCW-ML3M'. \ It can fire both harmful and healing cells with an internal nanite fabricator and energy weapon cell loader. Up to three combinations of \ - energy beams can be configured at once. Ammo not included." - catalogue_data = list(/datum/category_item/catalogue/information/organization/hephaestus, - /datum/category_item/catalogue/information/organization/vey_med) + energy beams can be configured at once. Ammo not included." // YW EDIT NSFW TO NSCW icon = 'icons/vore/custom_guns_vr.dmi' icon_state = "nsfw" @@ -210,7 +208,6 @@ /obj/item/ammo_casing/microbattery name = "\'NSCW\' microbattery - UNKNOWN" desc = "A miniature battery for an energy weapon." - catalogue_data = list(/datum/category_item/catalogue/information/organization/hephaestus) icon = 'icons/obj/ammo_vr.dmi' icon_state = "nsfw_batt" slot_flags = SLOT_BELT | SLOT_EARS diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m.dm index 571730c7ef..6822fb37b3 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m.dm @@ -1,9 +1,9 @@ // The Gun // /obj/item/gun/projectile/cell_loaded/medical name = "cell-loaded medigun" - desc = "The ML-3 'Medigun', or ML3 for short, is a powerful cell-based ranged healing device based on the HI-102b NSCW. \ + desc = "The ML-3 'Medigun', or ML3M for short, is a powerful cell-based ranged healing device based on the Hephaestus 102b NSCW. \ It uses an internal nanite fabricator, powered and controlled by discrete cells, to deliver a variety of effects at range. Up to six combinations of \ - healing beams can be configured at once, depending on cartridge used. Ammo not included." + healing beams can be configured at once, depending on cartridge used. Ammo not included." // YW EDIT NSFW TO NSCW catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med) icon_state = "ml3m" @@ -15,8 +15,8 @@ /obj/item/gun/projectile/cell_loaded/medical/cmo name = "advanced cell-loaded medigun" - desc = "This is a variation on the ML-3 'Medigun', a powerful cell-based ranged healing device based on the HI-102b NSCW. \ - It has an extended sight for increased accuracy, and much more comfortable grip. Ammo not included." + desc = "This is a variation on the ML-3 'Medigun', a powerful cell-based ranged healing device based on the Hephaestus 102b NSCW. \ + It has an extended sight for increased accuracy, and much more comfortable grip. Ammo not included." // YW EDIT NSFW TO NSCW icon_state = "ml3m_cmo" diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw.dm index 63bd2c8dd1..76c800fd79 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw.dm @@ -1,19 +1,18 @@ // The Gun // /obj/item/gun/projectile/cell_loaded/combat name = "cell-loaded revolver" - desc = "Variety is the spice of life! The HI-102b 'Nanotech Selectable-Cell Weapon', or NSCW for short, is an unholy hybrid of an ammo-driven \ + desc = "Variety is the spice of life! The Hephaestus 102b 'Nanotech Selectable-Fire Weapon', or NSCW for short, is an unholy hybrid of an ammo-driven \ energy weapon that allows the user to mix and match their own fire modes. Up to four combinations of \ - energy beams can be configured at once. Ammo not included." - catalogue_data = list(/datum/category_item/catalogue/information/organization/hephaestus) + energy beams can be configured at once. Ammo not included." // YW EDIT NSFW TO NSCW - description_fluff = "The Hephaestus 'Nanotech Selectable Cell Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding." + description_fluff = "The Hephaestus 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding." allowed_magazines = list(/obj/item/ammo_magazine/cell_mag/combat) /obj/item/gun/projectile/cell_loaded/combat/prototype name = "prototype cell-loaded revolver" - desc = "Variety is the spice of life! A prototype based on HI-102b 'Nanotech Selectable-Cell Weapon', or NSCW for short, is an unholy hybrid of an ammo-driven \ + desc = "Variety is the spice of life! A prototype based on Hephaestus 102b 'Nanotech Selectable-Fire Weapon', or NSCW for short, is an unholy hybrid of an ammo-driven \ energy weapon that allows the user to mix and match their own fire modes. Up to two combinations of \ - energy beams can be configured at once. Ammo not included." + energy beams can be configured at once. Ammo not included." // YW EDIT NSFW TO NSCW description_info = "This gun is an energy weapon that uses interchangeable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." description_antag = "" @@ -29,8 +28,7 @@ icon_state = "nsfw_mag" max_ammo = 4 x_offset = 4 - catalogue_data = list(/datum/category_item/catalogue/information/organization/hephaestus) - description_info = "This magazine holds NSCW microbatteries to power the NSCW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." + description_info = "This magazine holds NSCW microbatteries to power the NSCW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." // YW EDIT NSFW TO NSCW ammo_type = /obj/item/ammo_casing/microbattery/combat /obj/item/ammo_magazine/cell_mag/combat/prototype @@ -44,7 +42,7 @@ // The Pack // /obj/item/storage/secure/briefcase/nsfw_pack - name = "\improper KHI-102b \'NSCW\' gun kit" // YW EDIT: NSFW to NSCW + name = "\improper Hephaestus 102b \'NSCW\' gun kit" // YW EDIT NSFW TO NSCW desc = "A storage case for a multi-purpose handgun. Variety hour!" w_class = ITEMSIZE_NORMAL max_w_class = ITEMSIZE_NORMAL @@ -58,7 +56,7 @@ new path(src) /obj/item/storage/secure/briefcase/nsfw_pack_hos - name = "\improper KHI-102b \'NSCW\' gun kit" // YW EDIT: NSFW to NSCW + name = "\improper Hephaestus 102b \'NSCW\' gun kit" // YW EDIT NSFW TO NSCW desc = "A storage case for a multi-purpose handgun. Variety hour!" w_class = ITEMSIZE_NORMAL max_w_class = ITEMSIZE_NORMAL diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw_cells.dm index 3ef40bd4ae..ccb68acd0c 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw_cells.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/nsfw_cells.dm @@ -2,7 +2,6 @@ /obj/item/ammo_casing/microbattery/combat name = "\'NSCW\' microbattery - UNKNOWN" desc = "A miniature battery for an energy weapon." - catalogue_data = list(/datum/category_item/catalogue/information/organization/hephaestus) // YW edit origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 1, TECH_MAGNET = 2) /obj/item/ammo_casing/microbattery/combat/lethal diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun_vr.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun_vr.dm deleted file mode 100644 index c07016d7ef..0000000000 --- a/code/modules/projectiles/guns/magnetic/magnetic_railgun_vr.dm +++ /dev/null @@ -1,11 +0,0 @@ -/obj/item/gun/magnetic/railgun/flechette/pistol/khi - name = "kitsuhana flechette pistol" - desc = "This rail pistol appears to have been 'tampered with', improving it's power storage and efficiency." - - cell = /obj/item/cell/hyper - capacitor = /obj/item/stock_parts/capacitor/hyper - - projectile_type = /obj/item/projectile/bullet/magnetic/flechette/small/khi - - load_type = /obj/item/magnetic_ammo/pistol/khi - loaded = /obj/item/magnetic_ammo/pistol/khi \ No newline at end of file diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm index f95f4a3cb2..0112c935aa 100644 --- a/code/modules/projectiles/projectile/magnetic.dm +++ b/code/modules/projectiles/projectile/magnetic.dm @@ -34,15 +34,6 @@ armor_penetration = 100 hud_state = "alloy_spike" -/obj/item/projectile/bullet/magnetic/flechette/small/khi - name = "small carbyne flechette" - icon_state = "flechette" - fire_sound = 'sound/weapons/rapidslice.ogg' - damage = 18 - armor_penetration = 100 - penetrating = 10 - hud_state = "alloy_spike" - /obj/item/projectile/bullet/magnetic/flechette/hunting name = "shredder slug" armor_penetration = 30 diff --git a/code/modules/reagents/machinery/dispenser/cartridge_presets.dm b/code/modules/reagents/machinery/dispenser/cartridge_presets.dm index 9dfc3ac0d9..4f1098c607 100644 --- a/code/modules/reagents/machinery/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/machinery/dispenser/cartridge_presets.dm @@ -117,10 +117,14 @@ spawn_reagent = "lemonjuice" /obj/item/reagent_containers/chem_disp_cartridge/grapesoda spawn_reagent = "grapesoda" +/obj/item/reagent_containers/chem_disp_cartridge/pineapple + spawn_reagent = "pineapplejuice" // Bar, coffee /obj/item/reagent_containers/chem_disp_cartridge/coffee spawn_reagent = "coffee" +/obj/item/reagent_containers/chem_disp_cartridge/drip_coffee + spawn_reagent = "drip_coffee" /obj/item/reagent_containers/chem_disp_cartridge/cafe_latte spawn_reagent = "cafe_latte" /obj/item/reagent_containers/chem_disp_cartridge/soy_latte @@ -129,6 +133,8 @@ spawn_reagent = "hot_coco" /obj/item/reagent_containers/chem_disp_cartridge/milk spawn_reagent = "milk" +/obj/item/reagent_containers/chem_disp_cartridge/milk_foam + spawn_reagent = "milk_foam" /obj/item/reagent_containers/chem_disp_cartridge/cream spawn_reagent = "cream" /obj/item/reagent_containers/chem_disp_cartridge/mint @@ -144,6 +150,48 @@ /obj/item/reagent_containers/chem_disp_cartridge/decafchai spawn_reagent = "chaiteadecaf" +// syrups +/obj/item/reagent_containers/chem_disp_cartridge/syrup_pumpkin + spawn_reagent = "syrup_pumpkin" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_caramel + spawn_reagent = "syrup_caramel" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_scaramel + spawn_reagent = "syrup_salted_caramel" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_irish + spawn_reagent = "syrup_irish" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_almond + spawn_reagent = "syrup_almond" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_cinnamon + spawn_reagent = "syrup_cinnamon" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_pistachio + spawn_reagent = "syrup_pistachio" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_vanilla + spawn_reagent = "syrup_vanilla" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_toffee + spawn_reagent = "syrup_toffee" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_cherry + spawn_reagent = "syrup_cherry" +/obj/item/reagent_containers/chem_disp_cartridge/grenadine + spawn_reagent = "grenadine" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_butterscotch + spawn_reagent = "syrup_butterscotch" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_chocolate + spawn_reagent = "syrup_chocolate" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_wchocolate + spawn_reagent = "syrup_white_chocolate" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_strawberry + spawn_reagent = "syrup_strawberry" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_coconut + spawn_reagent = "syrup_coconut" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_ginger + spawn_reagent = "syrup_ginger" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_gingerbread + spawn_reagent = "syrup_gingerbread" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_peppermint + spawn_reagent = "syrup_peppermint" +/obj/item/reagent_containers/chem_disp_cartridge/syrup_birthday + spawn_reagent = "syrup_birthday" + // ERT /obj/item/reagent_containers/chem_disp_cartridge/inaprov spawn_reagent = "inaprovaline" diff --git a/code/modules/reagents/machinery/dispenser/dispenser2_energy.dm b/code/modules/reagents/machinery/dispenser/dispenser2_energy.dm index dfb16c3391..2495018f5e 100644 --- a/code/modules/reagents/machinery/dispenser/dispenser2_energy.dm +++ b/code/modules/reagents/machinery/dispenser/dispenser2_energy.dm @@ -47,7 +47,7 @@ /obj/machinery/chemical_dispenser/bar_soft dispense_reagents = list( "water", "ice", "coffee", "cream", "tea", "icetea", "cola", "spacemountainwind", "dr_gibb", "space_up", "tonic", - "sodawater", "lemonjuice", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda" + "sodawater", "lemonjuice", "lemon_lime", "sugar", "orangejuice", "limejuice", "watermelonjuice", "thirteenloko", "grapesoda", "pineapplejuice" ) /obj/machinery/chemical_dispenser/bar_alc @@ -58,6 +58,13 @@ /obj/machinery/chemical_dispenser/bar_coffee dispense_reagents = list( - "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", - "orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint", "decaf", "greentea" + "coffee", "cafe_latte", "soy_latte", "hot_coco", "milk", "cream", "tea", "ice", "water", + "orangejuice", "lemonjuice", "limejuice", "berryjuice", "mint", "decaf", "greentea", "milk_foam", "drip_coffee" + ) + +/obj/machinery/chemical_dispenser/bar_syrup + dispense_reagents = list( + "syrup_pumpkin", "syrup_caramel", "syrup_salted_caramel", "syrup_irish", "syrup_almond", "syrup_cinnamon", "syrup_pistachio", + "syrup_vanilla", "syrup_toffee", "grenadine", "syrup_cherry", "syrup_butterscotch", "syrup_chocolate", "syrup_white_chocolate", "syrup_strawberry", + "syrup_coconut", "syrup_ginger", "syrup_gingerbread", "syrup_peppermint", "syrup_birthday" ) diff --git a/code/modules/reagents/machinery/dispenser/dispenser_presets.dm b/code/modules/reagents/machinery/dispenser/dispenser_presets.dm index 65523e16f3..49fd9f5a22 100644 --- a/code/modules/reagents/machinery/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/machinery/dispenser/dispenser_presets.dm @@ -85,7 +85,8 @@ /obj/item/reagent_containers/chem_disp_cartridge/lime, /obj/item/reagent_containers/chem_disp_cartridge/watermelon, /obj/item/reagent_containers/chem_disp_cartridge/lemon, - /obj/item/reagent_containers/chem_disp_cartridge/grapesoda + /obj/item/reagent_containers/chem_disp_cartridge/grapesoda, + /obj/item/reagent_containers/chem_disp_cartridge/pineapple ) /obj/machinery/chemical_dispenser/bar_alc @@ -130,11 +131,14 @@ /obj/machinery/chemical_dispenser/bar_coffee/full spawn_cartridges = list( /obj/item/reagent_containers/chem_disp_cartridge/coffee, + /obj/item/reagent_containers/chem_disp_cartridge/drip_coffee, /obj/item/reagent_containers/chem_disp_cartridge/cafe_latte, /obj/item/reagent_containers/chem_disp_cartridge/soy_latte, /obj/item/reagent_containers/chem_disp_cartridge/hot_coco, /obj/item/reagent_containers/chem_disp_cartridge/milk, /obj/item/reagent_containers/chem_disp_cartridge/cream, + /obj/item/reagent_containers/chem_disp_cartridge/milk_foam, + /obj/item/reagent_containers/chem_disp_cartridge/water, /obj/item/reagent_containers/chem_disp_cartridge/sugar, /obj/item/reagent_containers/chem_disp_cartridge/tea, /obj/item/reagent_containers/chem_disp_cartridge/ice, @@ -148,3 +152,34 @@ /obj/item/reagent_containers/chem_disp_cartridge/chaitea, /obj/item/reagent_containers/chem_disp_cartridge/decafchai ) + +/obj/machinery/chemical_dispenser/bar_syrup + name = "syrup dispenser" + desc = "Allow your customers to test your patience to the extremes." + icon_state = "syrup_dispenser" + ui_title = "Syrup Dispenser" + accept_drinking = 1 + +/obj/machinery/chemical_dispenser/bar_syrup/full + spawn_cartridges = list( + /obj/item/reagent_containers/chem_disp_cartridge/syrup_pumpkin, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_caramel, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_scaramel, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_irish, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_almond, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_cinnamon, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_pistachio, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_vanilla, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_toffee, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_cherry, + /obj/item/reagent_containers/chem_disp_cartridge/grenadine, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_butterscotch, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_chocolate, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_wchocolate, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_strawberry, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_coconut, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_ginger, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_gingerbread, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_peppermint, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_birthday + ) diff --git a/code/modules/reagents/machinery/dispenser/supply.dm b/code/modules/reagents/machinery/dispenser/supply.dm index 32dea5167e..e13cca8c12 100644 --- a/code/modules/reagents/machinery/dispenser/supply.dm +++ b/code/modules/reagents/machinery/dispenser/supply.dm @@ -38,6 +38,16 @@ containername = "coffee dispenser crate" group = "Reagents" +/datum/supply_pack/syrup_dispenser + name = "Syrup dispenser" + contains = list( + /obj/machinery/chemical_dispenser/bar_syrup{anchored = FALSE} + ) + cost = 25 + containertype = /obj/structure/largecrate + containername = "Syrup dispenser crate" + group = "Reagents" + /datum/supply_pack/reagents name = "Chemistry dispenser refill" contains = list( @@ -123,7 +133,8 @@ /obj/item/reagent_containers/chem_disp_cartridge/lime, /obj/item/reagent_containers/chem_disp_cartridge/watermelon, /obj/item/reagent_containers/chem_disp_cartridge/lemon, - /obj/item/reagent_containers/chem_disp_cartridge/grapesoda + /obj/item/reagent_containers/chem_disp_cartridge/grapesoda, + /obj/item/reagent_containers/chem_disp_cartridge/pineapple ) cost = 50 containertype = /obj/structure/closet/crate @@ -134,11 +145,14 @@ name = "Coffee machine dispenser refill" contains = list( /obj/item/reagent_containers/chem_disp_cartridge/coffee, + /obj/item/reagent_containers/chem_disp_cartridge/drip_coffee, /obj/item/reagent_containers/chem_disp_cartridge/cafe_latte, /obj/item/reagent_containers/chem_disp_cartridge/soy_latte, /obj/item/reagent_containers/chem_disp_cartridge/hot_coco, /obj/item/reagent_containers/chem_disp_cartridge/milk, /obj/item/reagent_containers/chem_disp_cartridge/cream, + /obj/item/reagent_containers/chem_disp_cartridge/milk_foam, + /obj/item/reagent_containers/chem_disp_cartridge/water, /obj/item/reagent_containers/chem_disp_cartridge/sugar, /obj/item/reagent_containers/chem_disp_cartridge/tea, /obj/item/reagent_containers/chem_disp_cartridge/ice, @@ -148,13 +162,44 @@ /obj/item/reagent_containers/chem_disp_cartridge/lime, /obj/item/reagent_containers/chem_disp_cartridge/berry, /obj/item/reagent_containers/chem_disp_cartridge/greentea, - /obj/item/reagent_containers/chem_disp_cartridge/decaf + /obj/item/reagent_containers/chem_disp_cartridge/decaf, + /obj/item/reagent_containers/chem_disp_cartridge/chaitea, + /obj/item/reagent_containers/chem_disp_cartridge/decafchai ) cost = 50 containertype = /obj/structure/closet/crate containername = "coffee drinks crate" group = "Reagents" +/datum/supply_pack/syrup_reagents + name = "Syrup machine dispenser refill" + contains = list( + /obj/item/reagent_containers/chem_disp_cartridge/syrup_pumpkin, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_caramel, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_scaramel, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_irish, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_almond, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_cinnamon, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_pistachio, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_vanilla, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_toffee, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_cherry, + /obj/item/reagent_containers/chem_disp_cartridge/grenadine, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_butterscotch, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_chocolate, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_wchocolate, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_strawberry, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_coconut, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_ginger, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_gingerbread, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_peppermint, + /obj/item/reagent_containers/chem_disp_cartridge/syrup_birthday + ) + cost = 50 + containertype = /obj/structure/closet/crate + containername = "Syrup crate" + group = "Reagents" + /datum/supply_pack/dispenser_cartridges name = "Empty dispenser cartridges" contains = list( diff --git a/code/modules/reagents/reactions/instant/drinks.dm b/code/modules/reagents/reactions/instant/drinks.dm index 75e15d188c..4736a12f05 100644 --- a/code/modules/reagents/reactions/instant/drinks.dm +++ b/code/modules/reagents/reactions/instant/drinks.dm @@ -82,6 +82,90 @@ required_reagents = list("ice" = 1, "coffee" = 2) result_amount = 3 +/decl/chemical_reaction/instant/drinks/icecoffee/alt + name = "Iced Drip Coffee" + id = "icecoffee" + result = "icecoffee" + required_reagents = list("ice" = 1, "drip_coffee" = 2) + result_amount = 3 + +/decl/chemical_reaction/instant/drinks/blackeye + name = "Black Eye Coffee" + id = "black_eye" + result = "black_eye" + required_reagents = list("drip_coffee" = 1, "coffee" = 1) + result_amount = 1 + +/decl/chemical_reaction/instant/drinks/americano + name = "Americano" + id = "americano" + result = "americano" + required_reagents = list("water" = 1, "long_black" = 2) + result_amount = 3 + +/decl/chemical_reaction/instant/drinks/long_black + name = "Long Black Coffee" + id = "long_black" + result = "long_black" + required_reagents = list("water" = 1, "coffee" = 1) + result_amount = 2 + +/decl/chemical_reaction/instant/drinks/macchiato + name = "Macchiato" + id = "macchiato" + result = "macchiato" + required_reagents = list("milk" = 1, "coffee" = 2) + result_amount = 3 + +/decl/chemical_reaction/instant/drinks/cortado + name = "Cortado" + id = "cortado" + result = "cortado" + required_reagents = list("macchiato" = 3, "milk_foam" = 1) // 2 coffee, 1 milk, 1 milk foam + result_amount = 4 + +/decl/chemical_reaction/instant/drinks/breve + name = "Breve" + id = "breve" + result = "breve" + required_reagents = list("cortado" = 4, "cream" = 1) // 2 coffee, 1 milk, 1 milk foam, 1 cream + result_amount = 5 + +/decl/chemical_reaction/instant/drinks/cappuccino + name = "Cappuccino" + id = "cappuccino" + result = "cappuccino" + required_reagents = list("milk" = 1, "milk_foam" = 1, "cortado" = 4) // 2 coffee, 2 milk, 2 milk foam + result_amount = 6 + +/decl/chemical_reaction/instant/drinks/flat_white + name = "Flat White Coffee" + id = "flat_white" + result = "flat_white" + required_reagents = list("milk" = 2, "drip_coffee" = 1) // 2 drip coffee, 4 milk I'M SORRY THAT ITS DRIP COFFEE, otherwise it just gets in the way of all other reactions + result_amount = 3 + +/decl/chemical_reaction/instant/drinks/mocha + name = "Mocha" + id = "mocha" + result = "mocha" + required_reagents = list("milk" = 1, "cream" = 1, "milk_foam" = 1, "hot_coco" = 2, "breve" = 5) // 2 coffee, 2 milk, 2 cream, 2 milk foam and 2 hot coco + result_amount = 10 + +/decl/chemical_reaction/instant/drinks/mocha/alt //incase they use cream before milk + name = "Mocha" + id = "mocha" + result = "mocha" + required_reagents = list("cream" = 2, "hot_coco" = 2, "cappuccino" = 6) // 2 coffee, 2 milk, 2 cream, 2 milk foam and 2 hot coco + result_amount = 10 + +/decl/chemical_reaction/instant/drinks/vienna + name = "Vienna" + id = "vienna" + result = "vienna" + required_reagents = list("cream" = 2, "coffee" = 1) + result_amount = 3 + /decl/chemical_reaction/instant/drinks/nuka_cola name = "Nuclear Cola" id = "nuka_cola" @@ -499,7 +583,7 @@ name = "Cafe Latte" id = "cafe_latte" result = "cafe_latte" - required_reagents = list("coffee" = 1, "milk" = 1) + required_reagents = list("flat_white" = 1, "milk" = 1) result_amount = 2 /decl/chemical_reaction/instant/drinks/acidspit diff --git a/code/modules/reagents/reactions/instant/virology.dm b/code/modules/reagents/reactions/instant/virology.dm index f8d5038326..26576c23d6 100644 --- a/code/modules/reagents/reactions/instant/virology.dm +++ b/code/modules/reagents/reactions/instant/virology.dm @@ -40,6 +40,13 @@ required_reagents = list("inaprovaline" = 1, "mutagenvirusfood" = 1) result_amount = 2 +/decl/chemical_reaction/instant/virus_food_size + name = "sizeoxadone virus food" + id = "sizeoxadonevirusfood" + result = "sizevirusfood" + required_reagents = list("sizeoxadone" = 1, "phoronvirusfood" = 1) + result_amount = 2 + /decl/chemical_reaction/instant/mix_virus name = "Mix Virus" id = "mixvirus" @@ -48,6 +55,9 @@ var/level_min = 0 var/level_max = 2 +/decl/chemical_reaction/instant/mix_virus/picky + var/list/datum/symptom/symptoms + /decl/chemical_reaction/instant/mix_virus/on_reaction(datum/reagents/holder) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list if(B && B.data) @@ -55,6 +65,13 @@ if(D) D.Evolve(level_min, level_max) +/decl/chemical_reaction/instant/mix_virus/picky/on_reaction(datum/reagents/holder) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.PickyEvolve(symptoms) + /decl/chemical_reaction/instant/mix_virus/mix_virus_2 name = "Mix Virus 2" id = "mixvirus2" @@ -111,6 +128,17 @@ level_min = 1 level_max = 1 +/decl/chemical_reaction/instant/mix_virus/picky/size + name = "Mix Virus Size" + id = "mixvirussize" + required_reagents = list("sizevirusfood" = 1) + symptoms = list( + /datum/symptom/macrophage, + /datum/symptom/size, + /datum/symptom/size/grow, + /datum/symptom/size/shrink + ) + /decl/chemical_reaction/instant/mix_virus/rem_virus name = "Devolve Virus" id = "remvirus" diff --git a/code/modules/reagents/reagents/_reagents.dm b/code/modules/reagents/reagents/_reagents.dm index 2393240d36..0f8fcd7499 100644 --- a/code/modules/reagents/reagents/_reagents.dm +++ b/code/modules/reagents/reagents/_reagents.dm @@ -33,6 +33,7 @@ var/cup_name = null var/cup_desc = null var/cup_center_of_mass = null + var/cup_prefix = null var/color = "#000000" var/color_weight = 1 diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm index f43c1a30e1..ba48f35a83 100644 --- a/code/modules/reagents/reagents/dispenser.dm +++ b/code/modules/reagents/reagents/dispenser.dm @@ -86,6 +86,7 @@ taste_description = "pure alcohol" reagent_state = LIQUID color = "#404030" + cup_prefix = "alcoholic" ingest_met = REM * 2 diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index 258d19b89d..43dad05e8b 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -271,6 +271,7 @@ id = "glucose" taste_description = "sweetness" color = "#FFFFFF" + cup_prefix = "sweetened" injectable = 1 @@ -314,6 +315,7 @@ color = "#EDB91F" taste_description = "cheese" allergen_type = ALLERGEN_DAIRY //Cheese is made from dairy + cup_prefix = "cheesy" /datum/reagent/nutriment/protein/egg name = "egg yolk" @@ -321,6 +323,7 @@ taste_description = "egg" color = "#FFFFAA" allergen_type = ALLERGEN_EGGS //Eggs contain egg + cup_prefix = "eggy" /datum/reagent/nutriment/protein/murk name = "murkfin protein" @@ -343,6 +346,7 @@ taste_description = "sweetness" nutriment_factor = 10 color = "#FFFF00" + cup_prefix = "honey" /datum/reagent/nutriment/honey/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -373,6 +377,7 @@ nutriment_factor = 10 color = "#FFFFFF" allergen_type = ALLERGEN_EGGS //Mayo is made from eggs + cup_prefix = "mayo" /datum/reagent/nutriment/yeast name = "Yeast" @@ -436,6 +441,7 @@ nutriment_factor = 5 color = "#302000" allergen_type = ALLERGEN_CHOCOLATE + cup_prefix = "coco" /datum/reagent/nutriment/chocolate name = "Chocolate" @@ -446,6 +452,7 @@ nutriment_factor = 5 taste_mult = 1.3 allergen_type = ALLERGEN_CHOCOLATE + cup_prefix = "chocolate" /datum/reagent/nutriment/instantjuice name = "Juice Powder" @@ -461,6 +468,7 @@ description = "Dehydrated, powdered grape juice." taste_description = "dry grapes" color = "#863333" + cup_prefix = "grape" /datum/reagent/nutriment/instantjuice/orange name = "Orange Juice Powder" @@ -468,6 +476,7 @@ description = "Dehydrated, powdered orange juice." taste_description = "dry oranges" color = "#e78108" + cup_prefix = "orange" /datum/reagent/nutriment/instantjuice/watermelon name = "Watermelon Juice Powder" @@ -475,6 +484,7 @@ description = "Dehydrated, powdered watermelon juice." taste_description = "dry sweet watermelon" color = "#b83333" + cup_prefix = "melon" /datum/reagent/nutriment/instantjuice/apple name = "Apple Juice Powder" @@ -482,6 +492,7 @@ description = "Dehydrated, powdered apple juice." taste_description = "dry sweet apples" color = "#c07c40" + cup_prefix = "apple" /datum/reagent/nutriment/soysauce name = "Soy Sauce" @@ -493,6 +504,7 @@ nutriment_factor = 2 color = "#792300" allergen_type = ALLERGEN_BEANS //Soy (beans) + cup_prefix = "umami" /datum/reagent/nutriment/vinegar name = "Vinegar" @@ -502,6 +514,7 @@ reagent_state = LIQUID nutriment_factor = 5 color = "#54410C" + cup_prefix = "acidic" /datum/reagent/nutriment/ketchup name = "Ketchup" @@ -512,6 +525,7 @@ nutriment_factor = 5 color = "#731008" allergen_type = ALLERGEN_FRUIT //Tomatoes are a fruit. + cup_prefix = "tomato" /datum/reagent/nutriment/mustard name = "Mustard" @@ -521,6 +535,7 @@ reagent_state = LIQUID nutriment_factor = 5 color = "#E3BD00" + cup_prefix = "mustard" /datum/reagent/nutriment/barbecue name = "Barbeque Sauce" @@ -530,6 +545,7 @@ reagent_state = LIQUID nutriment_factor = 5 color = "#4F330F" + cup_prefix = "barbecue" /datum/reagent/nutriment/rice name = "Rice" @@ -562,6 +578,7 @@ nutriment_factor = 30 color = "#4F3500" allergen_type = ALLERGEN_SEEDS //Peanuts(seeds) + cup_prefix = "peanut butter" /datum/reagent/nutriment/vanilla name = "Vanilla Extract" @@ -572,6 +589,7 @@ reagent_state = LIQUID nutriment_factor = 2 color = "#0F0A00" + cup_prefix = "vanilla" /datum/reagent/nutriment/durian name = "Durian Paste" @@ -618,6 +636,7 @@ taste_description = "sugar" nutriment_factor = 1 color = "#FF00FF" + cup_prefix = "sprinkled" /datum/reagent/nutriment/mint name = "Mint" @@ -626,6 +645,7 @@ taste_description = "mint" reagent_state = LIQUID color = "#CF3600" + cup_prefix = "minty" /datum/reagent/lipozine // The anti-nutriment. name = "Lipozine" @@ -650,6 +670,7 @@ color = "#FFFFFF" overdose = REAGENTS_OVERDOSE ingest_met = REM + cup_prefix = "salty" /datum/reagent/sodiumchloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -669,6 +690,7 @@ reagent_state = SOLID ingest_met = REM color = "#000000" + cup_prefix = "peppery" /datum/reagent/enzyme name = "Universal Enzyme" @@ -686,6 +708,7 @@ description = "An exotic blend of spices for cooking. Definitely not worms." reagent_state = SOLID color = "#e08702" + cup_prefix = "spicy" /datum/reagent/browniemix name = "Brownie Mix" @@ -759,6 +782,7 @@ reagent_state = LIQUID ingest_met = REM color = "#B31008" + cup_prefix = "hot" /datum/reagent/capsaicin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -798,6 +822,7 @@ touch_met = 50 // Get rid of it quickly ingest_met = REM color = "#B31008" + cup_prefix = "dangerously hot" /datum/reagent/condensedcapsaicin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) @@ -986,6 +1011,7 @@ glass_name = "banana juice" glass_desc = "The raw essence of a banana. HONK!" allergen_type = ALLERGEN_FRUIT //Bananas are fruit + cup_prefix = "banana" /datum/reagent/drink/juice/berry name = "Berry Juice" @@ -997,6 +1023,7 @@ glass_name = "berry juice" glass_desc = "Berry juice. Or maybe it's jam. Who cares?" allergen_type = ALLERGEN_FRUIT //Berries are fruit + cup_prefix = "berry" /datum/reagent/drink/juice/pineapple name = "Pineapple Juice" @@ -1008,6 +1035,7 @@ glass_name = "pineapple juice" glass_desc = "Pineapple juice. Or maybe it's spineapple. Who cares?" allergen_type = ALLERGEN_FRUIT //Pineapples are fruit + cup_prefix = "pineapple" /datum/reagent/drink/juice/carrot name = "Carrot juice" @@ -1019,6 +1047,7 @@ glass_name = "carrot juice" glass_desc = "It is just like a carrot but without crunching." allergen_type = ALLERGEN_VEGETABLE //Carrots are vegetables + cup_prefix = "carrot" /datum/reagent/drink/juice/carrot/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1033,6 +1062,7 @@ glass_name = "lettuce juice" glass_desc = "This is just lettuce water. Fresh but boring." + cup_prefix = "lettuce" /datum/reagent/drink/juice name = "Grape Juice" @@ -1045,6 +1075,7 @@ glass_name = "grape juice" glass_desc = "It's grrrrrape!" allergen_type = ALLERGEN_FRUIT //Grapes are fruit + cup_prefix = "grape" /datum/reagent/drink/juice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1079,6 +1110,7 @@ glass_name = "lemon juice" glass_desc = "Sour..." allergen_type = ALLERGEN_FRUIT //Lemons are fruit + cup_prefix = "lemon" /datum/reagent/drink/juice/apple @@ -1092,6 +1124,7 @@ glass_name = "apple juice" glass_desc = "An earth favorite." allergen_type = ALLERGEN_FRUIT //Apples are fruit + cup_prefix = "apple" /datum/reagent/drink/juice/lime name = "Lime Juice" @@ -1104,6 +1137,7 @@ glass_name = "lime juice" glass_desc = "A glass of sweet-sour lime juice" allergen_type = ALLERGEN_FRUIT //Limes are fruit + cup_prefix = "lime" /datum/reagent/drink/juice/lime/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1121,6 +1155,7 @@ glass_name = "orange juice" glass_desc = "Vitamins! Yay!" allergen_type = ALLERGEN_FRUIT //Oranges are fruit + cup_prefix = "orange" /datum/reagent/drink/juice/orange/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -1138,6 +1173,7 @@ glass_name = "poison berry juice" glass_desc = "A glass of deadly juice." + cup_prefix = "poison" /datum/reagent/drink/juice/potato name = "Potato Juice" @@ -1151,6 +1187,7 @@ glass_name = "potato juice" glass_desc = "Juice from a potato. Bleh." allergen_type = ALLERGEN_VEGETABLE //Potatoes are vegetables + cup_prefix = "potato" /datum/reagent/drink/juice/turnip name = "Turnip Juice" @@ -1164,6 +1201,7 @@ glass_name = "turnip juice" glass_desc = "Juice of the turnip. A step below the potato." allergen_type = ALLERGEN_VEGETABLE //Turnips are vegetables + cup_prefix = "turnip" /datum/reagent/drink/juice/tomato name = "Tomato Juice" @@ -1172,6 +1210,7 @@ taste_description = "tomatoes" color = "#731008" sugary = FALSE + cup_prefix = "tomato" glass_name = "tomato juice" glass_desc = "Are you sure this is tomato juice?" @@ -1189,6 +1228,7 @@ description = "Delicious juice made from watermelon." taste_description = "sweet watermelon" color = "#B83333" + cup_prefix = "melon" glass_name = "watermelon juice" glass_desc = "Delicious juice made from watermelon." @@ -1207,7 +1247,7 @@ glass_desc = "White and nutritious goodness!" cup_icon_state = "cup_cream" - cup_name = "cup of milk" + cup_name = "milk" cup_desc = "White and nutritious goodness!" allergen_type = ALLERGEN_DAIRY //Milk is dairy @@ -1219,7 +1259,7 @@ color = "#74533b" cup_icon_state = "cup_brown" - cup_name = "cup of chocolate milk" + cup_name = "chocolate milk" cup_desc = "Deliciously fattening!" glass_name = "chocolate milk" @@ -1254,7 +1294,7 @@ glass_desc = "Ewwww..." cup_icon_state = "cup_cream" - cup_name = "cup of cream" + cup_name = "cream" cup_desc = "Ewwww..." allergen_type = ALLERGEN_DAIRY //Cream is dairy @@ -1269,10 +1309,26 @@ glass_desc = "White and nutritious soy goodness!" cup_icon_state = "cup_cream" - cup_name = "cup of milk" + cup_name = "milk" cup_desc = "White and nutritious goodness!" allergen_type = ALLERGEN_BEANS //Would be made from soy beans +/datum/reagent/drink/milk/foam + name = "Milk Foam" + id = "milk_foam" + description = "Light and airy foamed milk." + taste_description = "airy milk" + color = "#eeebdf" + + glass_name = "foam" + glass_desc = "Fluffy..." + + cup_icon_state = "cup_cream" + cup_name = "foam" + cup_desc = "Fluffy..." + allergen_type = ALLERGEN_DAIRY //Cream is dairy + + /datum/reagent/drink/tea name = "Tea" id = "tea" @@ -1288,7 +1344,7 @@ glass_desc = "Tasty black tea, it has antioxidants, it's good for you!" cup_icon_state = "cup_tea" - cup_name = "cup of tea" + cup_name = "tea" cup_desc = "Tasty black tea, it has antioxidants, it's good for you!" allergen_type = ALLERGEN_STIMULANT //Black tea strong enough to have significant caffeine content @@ -1310,7 +1366,7 @@ glass_name = "cup of decaf tea" glass_desc = "Tasty black tea, it has antioxidants, it's good for you, and won't keep you up at night!" - cup_name = "cup of decaf tea" + cup_name = "decaf tea" cup_desc = "Tasty black tea, it has antioxidants, it's good for you, and won't keep you up at night!" allergen_type = null //Certified cat-safe! @@ -1328,7 +1384,7 @@ glass_special = list(DRINK_ICE) cup_icon_state = "cup_tea" - cup_name = "cup of iced tea" + cup_name = "iced tea" cup_desc = "No relation to a certain rap artist/ actor." /datum/reagent/drink/tea/icetea/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) @@ -1352,7 +1408,7 @@ /datum/reagent/drink/tea/icetea/decaf name = "Decaf Iced Tea" glass_name = "decaf iced tea" - cup_name = "cup of decaf iced tea" + cup_name = "decaf iced tea" id = "iceteadecaf" adj_dizzy = 0 adj_drowsy = 0 @@ -1369,13 +1425,13 @@ glass_name = "mint tea" glass_desc = "A tasty mixture of mint and tea. It's apparently good for you!" - cup_name = "cup of mint tea" + cup_name = "mint tea" cup_desc = "A tasty mixture of mint and tea. It's apparently good for you!" /datum/reagent/drink/tea/minttea/decaf name = "Decaf Mint Tea" glass_name = "decaf mint tea" - cup_name = "cup of decaf mint tea" + cup_name = "decaf mint tea" id = "mintteadecaf" adj_dizzy = 0 adj_drowsy = 0 @@ -1392,14 +1448,14 @@ glass_name = "lemon tea" glass_desc = "A tasty mixture of lemon and tea. It's apparently good for you!" - cup_name = "cup of lemon tea" + cup_name = "lemon tea" cup_desc = "A tasty mixture of lemon and tea. It's apparently good for you!" allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with lemon juice, still tea /datum/reagent/drink/tea/lemontea/decaf name = "Decaf Lemon Tea" glass_name = "decaf lemon tea" - cup_name = "cup of decaf lemon tea" + cup_name = "decaf lemon tea" id = "lemonteadecaf" adj_dizzy = 0 adj_drowsy = 0 @@ -1416,14 +1472,14 @@ glass_name = "lime tea" glass_desc = "A tasty mixture of lime and tea. It's apparently good for you!" - cup_name = "cup of lime tea" + cup_name = "lime tea" cup_desc = "A tasty mixture of lime and tea. It's apparently good for you!" allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with lime juice, still tea /datum/reagent/drink/tea/limetea/decaf name = "Decaf Lime Tea" glass_name = "decaf lime tea" - cup_name = "cup of decaf lime tea" + cup_name = "decaf lime tea" id = "limeteadecaf" adj_dizzy = 0 adj_drowsy = 0 @@ -1440,14 +1496,14 @@ glass_name = "orange tea" glass_desc = "A tasty mixture of orange and tea. It's apparently good for you!" - cup_name = "cup of orange tea" + cup_name = "orange tea" cup_desc = "A tasty mixture of orange and tea. It's apparently good for you!" allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with orange juice, still tea /datum/reagent/drink/tea/orangetea/decaf name = "Decaf orange Tea" glass_name = "decaf orange tea" - cup_name = "cup of decaf orange tea" + cup_name = "decaf orange tea" id = "orangeteadecaf" adj_dizzy = 0 adj_drowsy = 0 @@ -1464,14 +1520,14 @@ glass_name = "berry tea" glass_desc = "A tasty mixture of berries and tea. It's apparently good for you!" - cup_name = "cup of berry tea" + cup_name = "berry tea" cup_desc = "A tasty mixture of berries and tea. It's apparently good for you!" allergen_type = ALLERGEN_FRUIT | ALLERGEN_STIMULANT //Made with berry juice, still tea /datum/reagent/drink/tea/berrytea/decaf name = "Decaf Berry Tea" glass_name = "decaf berry tea" - cup_name = "cup of decaf berry tea" + cup_name = "decaf berry tea" id = "berryteadecaf" adj_dizzy = 0 adj_drowsy = 0 @@ -1488,7 +1544,7 @@ glass_name = "green tea" glass_desc = "A subtle blend of green tea. It's apparently good for you!" - cup_name = "cup of green tea" + cup_name = "green tea" cup_desc = "A subtle blend of green tea. It's apparently good for you!" /datum/reagent/drink/tea/chaitea @@ -1501,14 +1557,14 @@ glass_name = "chai tea" glass_desc = "A milky tea spiced with cinnamon and cloves." - cup_name = "cup of chai tea" + cup_name = "chai tea" cup_desc = "A milky tea spiced with cinnamon and cloves." allergen_type = ALLERGEN_STIMULANT|ALLERGEN_DAIRY //Made with milk and tea. /datum/reagent/drink/tea/chaitea/decaf name = "Decaf Chai Tea" glass_name = "decaf chai tea" - cup_name = "cup of decaf chai tea" + cup_name = "decaf chai tea" id = "chaiteadecaf" adj_dizzy = 0 adj_drowsy = 0 @@ -1529,7 +1585,7 @@ overdose = 45 cup_icon_state = "cup_coffee" - cup_name = "cup of coffee" + cup_name = "coffee" cup_desc = "Don't drop it, or you'll send scalding liquid and ceramic shards everywhere." glass_name = "coffee" @@ -1604,7 +1660,7 @@ glass_name = "soy latte" cup_icon_state = "cup_latte" - cup_name = "cup of soy latte" + cup_name = "soy latte" cup_desc = "A nice and refreshing beverage while you are reading." allergen_type = ALLERGEN_COFFEE|ALLERGEN_BEANS //Soy(beans) and coffee @@ -1624,7 +1680,7 @@ glass_desc = "A nice, strong and refreshing beverage while you are reading." cup_icon_state = "cup_latte" - cup_name = "cup of cafe latte" + cup_name = "cafe latte" cup_desc = "A nice and refreshing beverage while you are reading." allergen_type = ALLERGEN_COFFEE|ALLERGEN_DAIRY //Cream and coffee @@ -1642,7 +1698,7 @@ adj_temp = 25 cup_icon_state = "cup_coffee" - cup_name = "cup of decaf" + cup_name = "decaf" cup_desc = "Basically just brown, bitter water." glass_name = "decaf coffee" @@ -1663,10 +1719,186 @@ glass_desc = "Made with love! And cocoa beans." cup_icon_state = "cup_coco" - cup_name = "cup of hot chocolate" + cup_name = "hot chocolate" cup_desc = "Made with love! And cocoa beans." allergen_type = ALLERGEN_CHOCOLATE +/datum/reagent/drink/coffee/blackeye + name = "Black Eye Coffee" + id = "black_eye" + description = "Coffee but with more coffee for that extra coffee kick." + taste_description = "very concentrated coffee" + color = "#241001" + adj_temp = 5 + + glass_desc = "Coffee but with more coffee for that extra coffee kick." + glass_name = "black eye coffee" + + cup_icon_state = "cup_coffee" + cup_name = "black eye coffee" + cup_desc = "Coffee but with more coffee for that extra coffee kick." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/drip + name = "Drip Coffee" + id = "drip_coffee" + description = "Coffee made by soaking beans in hot water and allowing it seep through." + taste_description = "very concentrated coffee" + color = "#3d1a00" + adj_temp = 5 + + glass_desc = "Coffee made by soaking beans in hot water and allowing it seep through." + glass_name = "drip coffee" + + cup_icon_state = "cup_coffee" + cup_name = "drip brewed coffee" + cup_desc = "Coffee made by soaking beans in hot water and allowing it seep through." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/americano + name = "Americano" + id = "americano" + description = "A traditional coffee that is more dilute and perfect for a gentle start to the day." + taste_description = "pleasant coffee" + color = "#6d3205" + adj_temp = 5 + + glass_desc = "A traditional coffee that is more dilute and perfect for a gentle start to the day." + glass_name = "americano" + + cup_icon_state = "cup_coffee" + cup_name = "americano" + cup_desc = "A traditional coffee that is more dilute and perfect for a gentle start to the day." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/long_black + name = "Long Black Coffee" + id = "long_black" + description = "A traditional coffee with a little more kick." + taste_description = "modestly bitter coffee" + color = "#6d3205" + adj_temp = 5 + + glass_desc = "A traditional coffee with a little more kick." + glass_name = "long_black" + + cup_icon_state = "cup_coffee" + cup_name = "long black coffee" + cup_desc = "A traditional coffee with a little more kick." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/macchiato + name = "Macchiato" + id = "macchiato" + description = "A coffee mixed with steamed milk, it has swirling patterns on top." + taste_description = "milky coffee" + color = "#ad5817" + adj_temp = 5 + + glass_desc = "A coffee mixed with steamed milk, it has swirling patterns on top." + glass_name = "macchiato" + + cup_icon_state = "cup_latte" + cup_name = "macchiato" + cup_desc = "A coffee mixed with steamed milk, it has swirling patterns on top." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/cortado + name = "Cortado" + id = "cortado" + description = "Espresso mixed with equal parts milk and a layer of foam on top." + taste_description = "milky coffee" + color = "#ad5817" + adj_temp = 5 + + glass_desc = "Espresso mixed with equal parts milk and a layer of foam on top." + glass_name = "macchiato" + + cup_icon_state = "cup_latte" + cup_name = "cortado" + cup_desc = "Espresso mixed with equal parts milk and a layer of foam on top." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/breve + name = "Breve" + id = "breve" + description = "Espresso topped with half-and-half, with a layer of foam on top." + taste_description = "creamy coffee" + color = "#d1905e" + adj_temp = 5 + + glass_desc = "Espresso topped with half-and-half, with a layer of foam on top." + glass_name = "breve" + + cup_icon_state = "cup_cream" + cup_name = "breve" + cup_desc = "Espresso topped with half-and-half, with a layer of foam on top." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/cappuccino + name = "Cappuccino" + id = "cappuccino" + description = "Espresso with a large portion of milk and a hefty layer of foam." + taste_description = "classic coffee" + color = "#d1905e" + adj_temp = 5 + + glass_desc = "Espresso with a large portion of milk and a hefty layer of foam." + glass_name = "cappuccino" + + cup_icon_state = "cup_cream" + cup_name = "cappuccino" + cup_desc = "Espresso with a large portion of milk and a hefty layer of foam." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/flat_white + name = "Flat White Coffee" + id = "flat_white" + description = "A very milky coffee that is particularly light and airy." + taste_description = "very milky coffee" + color = "#ed9f64" + adj_temp = 5 + + glass_desc = "A very milky coffee that is particularly light and airy." + glass_name = "flat_white" + + cup_icon_state = "cup_latte" + cup_name = "flat white coffee" + cup_desc = "A very milky coffee that is particularly light and airy." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/mocha + name = "Mocha" + id = "mocha" + description = "A chocolate and coffee mix topped with a lot of milk and foam." + taste_description = "chocolatey coffee" + color = "#984201" + adj_temp = 5 + + glass_desc = "A chocolate and coffee mix topped with a lot of milk and foam." + glass_name = "mocha" + + cup_icon_state = "cup_cream" + cup_name = "mocha" + cup_desc = "A chocolate and coffee mix topped with a lot of milk and foam." + allergen_type = ALLERGEN_COFFEE + +/datum/reagent/drink/coffee/vienna + name = "Vienna" + id = "vienna" + description = "A very sweet espresso topped with a lot of whipped cream." + taste_description = "super sweet and creamy coffee" + color = "#8e7059" + adj_temp = 5 + + glass_desc = "A very sweet espresso topped with a lot of whipped cream." + glass_name = "vienna" + + cup_icon_state = "cup_cream" + cup_name = "vienna" + cup_desc = "A very sweet espresso topped with a lot of whipped cream." + allergen_type = ALLERGEN_COFFEE + /datum/reagent/drink/soda/sodawater name = "Soda Water" id = "sodawater" @@ -1676,6 +1908,7 @@ adj_dizzy = -5 adj_drowsy = -3 adj_temp = -5 + cup_prefix = "fizzy" glass_name = "soda water" glass_desc = "Soda water. Why not make a scotch and soda?" @@ -1688,6 +1921,7 @@ taste_description = "grape soda" color = "#421C52" adj_drowsy = -3 + cup_prefix = "grape soda" glass_name = "grape soda" glass_desc = "Looks like a delicious drink!" @@ -1700,6 +1934,7 @@ description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." taste_description = "tart and fresh" color = "#619494" + cup_prefix = "tonic" adj_dizzy = -5 adj_drowsy = -3 @@ -1716,6 +1951,7 @@ taste_description = "lemonade" color = "#FFFF00" adj_temp = -5 + cup_prefix = "lemonade" glass_name = "lemonade" glass_desc = "Oh the nostalgia..." @@ -1729,6 +1965,7 @@ taste_description = "watermelon" color = "#FFB3BB" adj_temp = -5 + cup_prefix = "melonade" glass_name = "melonade" glass_desc = "Oh the.. nostalgia?" @@ -1742,6 +1979,7 @@ taste_description = "apples" color = "#FFD1B3" adj_temp = -5 + cup_prefix = "appleade" glass_name = "appleade" glass_desc = "Applejuice, improved." @@ -1755,6 +1993,7 @@ taste_description = "sweet`n`sour pineapples" color = "#FFFF00" adj_temp = -5 + cup_prefix = "pineappleade" glass_name = "pineappleade" glass_desc = "Pineapple, juiced up." @@ -2537,6 +2776,192 @@ glass_special = list(DRINK_FIZZ) allergen_type = ALLERGEN_FRUIT //made with several fruit juices +/datum/reagent/drink/syrup + name = "syrup" + id = "syrup" + description = "A generic, sugary syrup." + taste_description = "sweetness" + color = "#fffbe8" + cup_prefix = "extra sweet" + + glass_name = "syrup" + glass_desc = "That is just way too much syrup to drink on its own." + allergen_type = ALLERGEN_SUGARS + + overdose = 45 + +/datum/reagent/drink/syrup/overdose(var/mob/living/carbon/M, var/alien) + if(alien == IS_DIONA) + return + M.make_dizzy(1) + +/datum/reagent/drink/syrup/pumpkin + name = "pumpkin spice syrup" + id = "syrup_pumpkin" + description = "A sugary syrup that tastes of pumpkin spice." + taste_description = "pumpkin spice" + color = "#e0b439" + cup_prefix = "pumpkin spice" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_FRUIT + +/datum/reagent/drink/syrup/caramel + name = "caramel syrup" + id = "syrup_caramel" + description = "A sugary syrup that tastes of caramel." + taste_description = "caramel" + color = "#b47921" + cup_prefix = "caramel" + +/datum/reagent/drink/syrup/scaramel + name = "salted caramel syrup" + id = "syrup_salted_caramel" + description = "A sugary syrup that tastes of salted caramel." + taste_description = "salty caramel" + color = "#9f6714" + cup_prefix = "salted caramel" + +/datum/reagent/drink/syrup/irish + name = "irish cream syrup" + id = "syrup_irish" + description = "A sugary syrup that tastes of a light, sweet cream." + taste_description = "creaminess" + color = "#ead3b0" + cup_prefix = "irish" + +/datum/reagent/drink/syrup/almond + name = "almond syrup" + id = "syrup_almond" + description = "A sugary syrup that tastes of almonds." + taste_description = "almonds" + color = "#ffb64a" + cup_prefix = "almond" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_SEEDS + +/datum/reagent/drink/syrup/cinnamon + name = "cinnamon syrup" + id = "syrup_cinnamon" + description = "A sugary syrup that tastes of cinnamon." + taste_description = "cinnamon" + color = "#ec612a" + cup_prefix = "cinnamon" + +/datum/reagent/drink/syrup/pistachio + name = "pistachio syrup" + id = "syrup_pistachio" + description = "A sugary syrup that tastes of pistachio." + taste_description = "pistachio" + color = "#c9eb59" + cup_prefix = "pistachio" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_SEEDS + +/datum/reagent/drink/syrup/vanilla + name = "vanilla syrup" + id = "syrup_vanilla" + description = "A sugary syrup that tastes of vanilla." + taste_description = "vanilla" + color = "#eaebd1" + cup_prefix = "vanilla" + +/datum/reagent/drink/syrup/toffee + name = "toffee syrup" + id = "syrup_toffee" + description = "A sugary syrup that tastes of toffee." + taste_description = "toffee" + color = "#aa7143" + cup_prefix = "toffee" + +/datum/reagent/drink/syrup/cherry + name = "cherry syrup" + id = "syrup_cherry" + description = "A sugary syrup that tastes of cherries." + taste_description = "cherries" + color = "#ff0000" + cup_prefix = "cherry" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_FRUIT + +/datum/reagent/drink/syrup/butterscotch + name = "butterscotch syrup" + id = "syrup_butterscotch" + description = "A sugary syrup that tastes of butterscotch." + taste_description = "butterscotch" + color = "#e6924e" + cup_prefix = "butterscotch" + +/datum/reagent/drink/syrup/chocolate + name = "chocolate syrup" + id = "syrup_chocolate" + description = "A sugary syrup that tastes of chocolate." + taste_description = "chocolate" + color = "#873600" + cup_prefix = "chocolate" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_CHOCOLATE + +/datum/reagent/drink/syrup/wchocolate + name = "white chocolate syrup" + id = "syrup_white_chocolate" + description = "A sugary syrup that tastes of white chocolate." + taste_description = "white chocolate" + color = "#c4c6a5" + cup_prefix = "white chocolate" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_CHOCOLATE + +/datum/reagent/drink/syrup/strawberry + name = "strawberry syrup" + id = "syrup_strawberry" + description = "A sugary syrup that tastes of strawberries." + taste_description = "strawberries" + color = "#ff2244" + cup_prefix = "strawberry" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_FRUIT + +/datum/reagent/drink/syrup/coconut + name = "coconut syrup" + id = "syrup_coconut" + description = "A sugary syrup that tastes of coconut." + taste_description = "coconut" + color = "#ffffff" + cup_prefix = "coconut" + + allergen_type = ALLERGEN_SUGARS|ALLERGEN_FRUIT + +/datum/reagent/drink/syrup/ginger + name = "ginger syrup" + id = "syrup_ginger" + description = "A sugary syrup that tastes of ginger." + taste_description = "ginger" + color = "#d09740" + cup_prefix = "ginger" + +/datum/reagent/drink/syrup/gingerbread + name = "gingerbread syrup" + id = "syrup_gingerbread" + description = "A sugary syrup that tastes of gingerbread." + taste_description = "gingerbread" + color = "#b6790f" + cup_prefix = "gingerbread" + +/datum/reagent/drink/syrup/peppermint + name = "peppermint syrup" + id = "syrup_peppermint" + description = "A sugary syrup that tastes of peppermint." + taste_description = "peppermint" + color = "#9ce06e" + cup_prefix = "peppermint" + +/datum/reagent/drink/syrup/birthday_cake + name = "birthday cake syrup" + id = "syrup_birthday" + description = "A sugary syrup that tastes of an overload of sweetness." + taste_description = "far too much sugar" + color = "#ff00e6" + cup_prefix = "birthday cake" /* Alcohol */ diff --git a/code/modules/reagents/reagents/medicine_vr.dm b/code/modules/reagents/reagents/medicine_vr.dm index 25ae066894..4b8e0910c0 100644 --- a/code/modules/reagents/reagents/medicine_vr.dm +++ b/code/modules/reagents/reagents/medicine_vr.dm @@ -79,10 +79,10 @@ M.heal_organ_damage(8 * removed * chem_effective, 0) /datum/reagent/sleevingcure - name = "Vey-Med Resleeving Booster" + name = "Resleeving Sickness Cure" id = "sleevingcure" - description = "A rare medication provided by Vey-Med that helps counteract negative side effects of using resleeving machinery. The instructions say to numb tongue before swallowing." - taste_description = "indescribably awful" + description = "A rare medication provided by Vey-Med that helps counteract negative side effects of using imperfect resleeving machinery." + taste_description = "chocolate peanut butter" taste_mult = 2 reagent_state = LIQUID color = "#b4dcdc" @@ -98,7 +98,7 @@ /datum/reagent/prussian_blue //We don't have iodine, so prussian blue we go. name = "Prussian Blue" id = "prussian_blue" - description = "Prussian Blue is an medication used to temporarily pause the effects of radiation poisoning to allow for treatment. Does not treat radiation sickness on its own." + description = "Prussian Blue is a medication used to temporarily pause the effects of radiation poisoning to allow for treatment. Does not treat radiation sickness on its own." taste_description = "salt" reagent_state = SOLID color = "#003153" //Blue! diff --git a/code/modules/reagents/reagents/virology.dm b/code/modules/reagents/reagents/virology.dm index de6e77e304..95badd9851 100644 --- a/code/modules/reagents/reagents/virology.dm +++ b/code/modules/reagents/reagents/virology.dm @@ -46,3 +46,9 @@ id = "weakphoronvirusfood" description = "Mutates viruses when mixed in blood. This one seems to have been weakened, but still strong." color = "#CEC3C6" + +/datum/reagent/toxin/phoron/phoronvirusfood/sizevirusfood + name = "Sizeoxadone virus food" + id = "sizevirusfood" + description = "Mutates virus when mixed in blood. This is a strange size mix..." + color = "#88AFDD" diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm index 972ee1b159..bb9d2a5342 100644 --- a/code/modules/research/designs/circuits/circuits.dm +++ b/code/modules/research/designs/circuits/circuits.dm @@ -123,6 +123,13 @@ CIRCUITS BELOW build_path = /obj/item/circuitboard/crew sort_string = "FAGAI" +/datum/design/circuit/pandemic + name = "PanD.E.M.I.C 2200" + id = "pandemic" + req_tech = list(TECH_DATA = 2, TECH_BIO = 2) + build_path = /obj/item/circuitboard/pandemic + sort_string = "FAGAJ" + /datum/design/circuit/teleconsole name = "teleporter control console" id = "teleconsole" diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 8bf0beb742..0c88d94688 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -83,6 +83,7 @@ H.b_skin = 0 H.dna.ResetUIFrom(H) + H.allow_spontaneous_tf = TRUE // Allows vore customization of synthmorphs H.real_name = "Synthmorph #[rand(100,999)]" H.name = H.real_name H.dir = 2 diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index bc798ec032..50c779a22b 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -4,8 +4,7 @@ /obj/machinery/computer/transhuman/resleeving name = "resleeving control console" - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) icon_keyboard = "med_key" icon_screen = "dna" light_color = "#315ab4" diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 9239f34da0..544021adda 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -9,8 +9,7 @@ /obj/machinery/computer/transhuman/designer name = "body design console" - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) icon = 'icons/obj/computer.dmi' icon_keyboard = "med_key" icon_screen = "explosive" diff --git a/code/modules/resleeving/documents.dm b/code/modules/resleeving/documents.dm index 9326f8786c..ea1accfd02 100644 --- a/code/modules/resleeving/documents.dm +++ b/code/modules/resleeving/documents.dm @@ -27,7 +27,7 @@

Foreword: A Licensed Technology

This message must remain attached to all documentation regarding Nanotrasen Resleeving Technology.
- All Nanotrasen Resleeving Technology (NRT) is licensed to Nanotrasen by Vey-Medical. It should only be used in the ways set forth in this guide. + All Nanotrasen Resleeving Technology (NRT) is licensed to Nanotrasen by Vey Medical. It should only be used in the ways set forth in this guide. Special consideration to the moral and ethical use of this technology should be undertaken before applying it in the field. Make sure you understand the technology fully before using the machinery.
Contents diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index b10e3651b7..1ada6be20f 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -7,8 +7,7 @@ /obj/item/implant/backup name = "backup implant" desc = "A mindstate backup implant that occasionally stores a copy of one's mind on a central server for backup purposes." - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) icon = 'icons/vore/custom_items_vr.dmi' icon_state = "backup_implant" known_implant = TRUE @@ -23,13 +22,13 @@ Implant Specifications:
Name: [using_map.company_name] Employee Backup Implant
Life: ~8 hours.
-Important Notes: Due to the sensitive nature of the implant, it is programmed to dissolve into harmless bio-material after 24 hours, to prevent unforseen issues with poorly maintained implants
+Important Notes: Implant is life-limited due to licensing restrictions. Dissolves into harmless biomaterial after around ~24 hours, the typical work shift.

Implant Details:
Function: Contains a small swarm of nanobots that perform neuron scanning to create mind-backups.
Special Features: Will allow restoring of backups during the 8-hour period it is active.
Integrity: Generally very survivable. Susceptible to being destroyed by acid."} - return dat + return dat // YW EDIT 8 hours to 24 hours /obj/item/implant/backup/New(newloc, db_key) . = ..() @@ -54,8 +53,7 @@ /obj/item/backup_implanter name = "backup implanter" desc = "After discovering that Nanotrasen was just re-using the same implanters over and over again on organics, leading to cross-contamination, Vey-Medical designed this self-cleaning model. Holds four backup implants at a time." - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) icon = 'icons/obj/device_alt.dmi' icon_state = "bimplant" item_state = "syringe_0" @@ -154,9 +152,7 @@ new /obj/item/implantcase/backup(src) new /obj/item/implanter(src) -/* YW Removal //Purely for fluff /obj/item/implant/backup/full - name = "khi backup implant" - desc = "A normal KHI wireless cortical stack with neutrino and QE transmission for constant-stream consciousness upload." -*/ + name = "backup implant" + desc = "A normal wireless cortical stack with neutrino and QE transmission for constant-stream consciousness upload." diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index e79df43880..b64d94af48 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -6,8 +6,7 @@ /////// Grower Pod /////// /obj/machinery/clonepod/transhuman name = "grower pod" - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) circuit = /obj/item/circuitboard/transhuman_clonepod //A full version of the pod @@ -204,8 +203,7 @@ /obj/machinery/transhuman/synthprinter name = "SynthFab 3000" desc = "A rapid fabricator for synthetic bodies." - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) icon = 'icons/obj/machines/synthpod.dmi' icon_state = "pod_0" circuit = /obj/item/circuitboard/transhuman_synthprinter @@ -437,8 +435,7 @@ /obj/machinery/transhuman/resleever name = "resleeving pod" desc = "Used to combine mind and body into one unit." - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) icon = 'icons/obj/machines/implantchair.dmi' icon_state = "implantchair" circuit = /obj/item/circuitboard/transhuman_resleever diff --git a/code/modules/resleeving/sleevecard.dm b/code/modules/resleeving/sleevecard.dm index 66081376a9..0f793eeef9 100644 --- a/code/modules/resleeving/sleevecard.dm +++ b/code/modules/resleeving/sleevecard.dm @@ -1,8 +1,7 @@ /obj/item/paicard/sleevecard name = "sleevecard" - desc = "This Vey-Med-upgraded pAI module has enough capacity to run a whole mind of human-level intelligence." - catalogue_data = list(/datum/category_item/catalogue/information/organization/vey_med, - /datum/category_item/catalogue/technology/resleeving) + desc = "This upgraded pAI module has enough capacity to run a whole mind of human-level intelligence." + catalogue_data = list(/datum/category_item/catalogue/technology/resleeving) origin_tech = list(TECH_DATA = 2) show_messages = 0 var/emagged = FALSE diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index e966c6e1b6..423c07e585 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -273,7 +273,7 @@ S.set_up(5, 1, get_turf(telepad)) S.start() - if(!A || (A.flags & BLUE_SHIELDED)) + if(!A || (A.flag_check(BLUE_SHIELDED))) telefail() temp_msg = "ERROR! Target is shielded from bluespace intersection!" return diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index 3a07f583e4..5e410b9e6c 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -28,7 +28,7 @@ var/list/markings = null /datum/tgui_module/appearance_changer/New( - var/host, + host, mob/living/carbon/human/H, check_species_whitelist = 1, list/species_whitelist = list(), @@ -57,309 +57,323 @@ local_skybox.screen_loc = "[map_name]:CENTER,CENTER" cam_plane_masters += local_skybox + owner = H cam_background = new cam_background.assigned_map = map_name cam_background.del_on_map_removal = FALSE - update_active_camera_screen() - - if(customize_usr) - if(ishuman(usr)) - H = usr - owner = H - if(owner) - owner.AddComponent(/datum/component/recursive_move) - RegisterSignal(owner, COMSIG_OBSERVER_MOVED, PROC_REF(update_active_camera_screen)) check_whitelist = check_species_whitelist whitelist = species_whitelist blacklist = species_blacklist +/datum/tgui_module/appearance_changer/tgui_close(mob/user) + . = ..() + if(owner == user || !customize_usr) + close_ui() + UnregisterSignal(owner, COMSIG_OBSERVER_MOVED) + owner = null + last_camera_turf = null + cut_data() + /datum/tgui_module/appearance_changer/Destroy() - UnregisterSignal(owner, COMSIG_OBSERVER_MOVED) - last_camera_turf = null qdel(cam_screen) QDEL_LIST(cam_plane_masters) qdel(cam_background) - cut_data() return ..() /datum/tgui_module/appearance_changer/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(ui.user)) - return TRUE - target = ui.user - switch(action) if("race") - if(can_change(target, APPEARANCE_RACE) && (params["race"] in valid_species)) - if(target.change_species(params["race"])) + if(can_change(owner, APPEARANCE_RACE) && (params["race"] in valid_species)) + if(owner.change_species(params["race"])) if(params["race"] == "Custom Species") - target.custom_species = sanitize(tgui_input_text(target, "Input custom species name:", + owner.custom_species = sanitize(tgui_input_text(ui.user, "Input custom species name:", "Custom Species Name", null, MAX_NAME_LEN), MAX_NAME_LEN) cut_data() - generate_data(target) + generate_data(ui.user, owner) changed_hook(APPEARANCECHANGER_CHANGED_RACE) return 1 if("gender") - if(can_change(target, APPEARANCE_GENDER) && (params["gender"] in get_genders(target))) - if(target.change_gender(params["gender"])) + if(can_change(owner, APPEARANCE_GENDER) && (params["gender"] in get_genders(owner))) + if(owner.change_gender(params["gender"])) cut_data() - generate_data(target) + generate_data(ui.user, owner) changed_hook(APPEARANCECHANGER_CHANGED_GENDER) return 1 if("gender_id") - if(can_change(target, APPEARANCE_GENDER) && (params["gender_id"] in all_genders_define_list)) - target.identifying_gender = params["gender_id"] + if(can_change(owner, APPEARANCE_GENDER) && (params["gender_id"] in all_genders_define_list)) + owner.identifying_gender = params["gender_id"] changed_hook(APPEARANCECHANGER_CHANGED_GENDER_ID) return 1 if("skin_tone") - if(can_change_skin_tone(target)) - var/new_s_tone = tgui_input_number(target, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -target.s_tone + 35, 220, 1) - if(isnum(new_s_tone) && can_still_topic(target, state)) + if(can_change_skin_tone(owner)) + var/new_s_tone = tgui_input_number(ui.user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -owner.s_tone + 35, 220, 1) + if(isnum(new_s_tone) && can_still_topic(owner, state)) new_s_tone = 35 - max(min( round(new_s_tone), 220),1) changed_hook(APPEARANCECHANGER_CHANGED_SKINTONE) - return target.change_skin_tone(new_s_tone) + return owner.change_skin_tone(new_s_tone) if("skin_color") - if(can_change_skin_color(target)) - var/new_skin = input(target, "Choose your character's skin colour: ", "Skin Color", rgb(target.r_skin, target.g_skin, target.b_skin)) as color|null - if(new_skin && can_still_topic(target, state)) + if(can_change_skin_color(owner)) + var/new_skin = input(ui.user, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null + if(new_skin && can_still_topic(owner, state)) var/r_skin = hex2num(copytext(new_skin, 2, 4)) var/g_skin = hex2num(copytext(new_skin, 4, 6)) var/b_skin = hex2num(copytext(new_skin, 6, 8)) - if(target.change_skin_color(r_skin, g_skin, b_skin)) - update_dna(target) + if(owner.change_skin_color(r_skin, g_skin, b_skin)) + update_dna(ui.user, owner) changed_hook(APPEARANCECHANGER_CHANGED_SKINCOLOR) return 1 if("hair") - if(can_change(target, APPEARANCE_HAIR) && (params["hair"] in valid_hairstyles)) - if(target.change_hair(params["hair"])) - update_dna(target) + if(can_change(owner, APPEARANCE_HAIR) && (params["hair"] in valid_hairstyles)) + if(owner.change_hair(params["hair"])) + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return 1 if("hair_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) - var/new_hair = input(target, "Please select hair color.", "Hair Color", rgb(target.r_hair, target.g_hair, target.b_hair)) as color|null - if(new_hair && can_still_topic(target, state)) + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select hair color.", "Hair Color", rgb(owner.r_hair, owner.g_hair, owner.b_hair)) as color|null + if(new_hair && can_still_topic(owner, state)) var/r_hair = hex2num(copytext(new_hair, 2, 4)) var/g_hair = hex2num(copytext(new_hair, 4, 6)) var/b_hair = hex2num(copytext(new_hair, 6, 8)) - if(target.change_hair_color(r_hair, g_hair, b_hair)) - update_dna(target) + if(owner.change_hair_color(r_hair, g_hair, b_hair)) + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("facial_hair") - if(can_change(target, APPEARANCE_FACIAL_HAIR) && (params["facial_hair"] in valid_facial_hairstyles)) - if(target.change_facial_hair(params["facial_hair"])) - update_dna(target) + if(can_change(owner, APPEARANCE_FACIAL_HAIR) && (params["facial_hair"] in valid_facial_hairstyles)) + if(owner.change_facial_hair(params["facial_hair"])) + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_F_HAIRSTYLE) return 1 if("facial_hair_color") - if(can_change(target, APPEARANCE_FACIAL_HAIR_COLOR)) - var/new_facial = input(target, "Please select facial hair color.", "Facial Hair Color", rgb(target.r_facial, target.g_facial, target.b_facial)) as color|null - if(new_facial && can_still_topic(target, state)) + if(can_change(owner, APPEARANCE_FACIAL_HAIR_COLOR)) + var/new_facial = input(ui.user, "Please select facial hair color.", "Facial Hair Color", rgb(owner.r_facial, owner.g_facial, owner.b_facial)) as color|null + if(new_facial && can_still_topic(owner, state)) var/r_facial = hex2num(copytext(new_facial, 2, 4)) var/g_facial = hex2num(copytext(new_facial, 4, 6)) var/b_facial = hex2num(copytext(new_facial, 6, 8)) - if(target.change_facial_hair_color(r_facial, g_facial, b_facial)) - update_dna(target) + if(owner.change_facial_hair_color(r_facial, g_facial, b_facial)) + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_F_HAIRCOLOR) return 1 if("eye_color") - if(can_change(target, APPEARANCE_EYE_COLOR)) - var/new_eyes = input(target, "Please select eye color.", "Eye Color", rgb(target.r_eyes, target.g_eyes, target.b_eyes)) as color|null - if(new_eyes && can_still_topic(target, state)) + if(can_change(owner, APPEARANCE_EYE_COLOR)) + var/new_eyes = input(ui.user, "Please select eye color.", "Eye Color", rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes)) as color|null + if(new_eyes && can_still_topic(owner, state)) var/r_eyes = hex2num(copytext(new_eyes, 2, 4)) var/g_eyes = hex2num(copytext(new_eyes, 4, 6)) var/b_eyes = hex2num(copytext(new_eyes, 6, 8)) - if(target.change_eye_color(r_eyes, g_eyes, b_eyes)) - update_dna(target) + if(owner.change_eye_color(r_eyes, g_eyes, b_eyes)) + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_EYES) return 1 // VOREStation Add - Ears/Tails/Wings/Markings if("ear") - if(can_change(target, APPEARANCE_ALL_HAIR)) + if(can_change(owner, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/ears/instance = locate(params["ref"]) if(params["clear"]) instance = null if(!istype(instance) && !params["clear"]) return FALSE - target.ear_style = instance - target.update_hair() - update_dna(target) + owner.ear_style = instance + owner.update_hair() + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("ear_secondary") - if(can_change(target, APPEARANCE_ALL_HAIR)) + if(can_change(owner, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/ears/instance = locate(params["ref"]) if(params["clear"]) instance = null if(!istype(instance) && !params["clear"]) return FALSE - target.ear_secondary_style = instance - if(!islist(target.ear_secondary_colors)) - target.ear_secondary_colors = list() - if(length(target.ear_secondary_colors) < instance.get_color_channel_count()) - target.ear_secondary_colors.len = instance.get_color_channel_count() - target.update_hair() - update_dna(target) + owner.ear_secondary_style = instance + if(!islist(owner.ear_secondary_colors)) + owner.ear_secondary_colors = list() + if(instance && length(owner.ear_secondary_colors) < instance.get_color_channel_count()) + owner.ear_secondary_colors.len = instance.get_color_channel_count() + owner.update_hair() + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("ears_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) - var/new_hair = input(target, "Please select ear color.", "Ear Color", rgb(target.r_ears, target.g_ears, target.b_ears)) as color|null - if(new_hair && can_still_topic(target, state)) - target.r_ears = hex2num(copytext(new_hair, 2, 4)) - target.g_ears = hex2num(copytext(new_hair, 4, 6)) - target.b_ears = hex2num(copytext(new_hair, 6, 8)) - update_dna(target) - target.update_hair() + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select ear color.", "Ear Color", rgb(owner.r_ears, owner.g_ears, owner.b_ears)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_ears = hex2num(copytext(new_hair, 2, 4)) + owner.g_ears = hex2num(copytext(new_hair, 4, 6)) + owner.b_ears = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_hair() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("ears2_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) - var/new_hair = input(target, "Please select secondary ear color.", "2nd Ear Color", rgb(target.r_ears2, target.g_ears2, target.b_ears2)) as color|null - if(new_hair && can_still_topic(target, state)) - target.r_ears2 = hex2num(copytext(new_hair, 2, 4)) - target.g_ears2 = hex2num(copytext(new_hair, 4, 6)) - target.b_ears2 = hex2num(copytext(new_hair, 6, 8)) - update_dna(target) - target.update_hair() + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select secondary ear color.", "2nd Ear Color", rgb(owner.r_ears2, owner.g_ears2, owner.b_ears2)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_ears2 = hex2num(copytext(new_hair, 2, 4)) + owner.g_ears2 = hex2num(copytext(new_hair, 4, 6)) + owner.b_ears2 = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_hair() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("ears_secondary_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) + if(can_change(owner, APPEARANCE_HAIR_COLOR)) var/channel = params["channel"] - if(channel > length(target.ear_secondary_colors)) + if(channel > length(owner.ear_secondary_colors)) return TRUE - var/existing = LAZYACCESS(target.ear_secondary_colors, channel) || "#ffffff" - var/new_color = input(target, "Please select ear color.", "2nd Ear Color", existing) as color|null - if(new_color && can_still_topic(target, state)) - target.ear_secondary_colors[channel] = new_color - update_dna(target) - target.update_hair() + var/existing = LAZYACCESS(owner.ear_secondary_colors, channel) || "#ffffff" + var/new_color = input(ui.user, "Please select ear color.", "2nd Ear Color", existing) as color|null + if(new_color && can_still_topic(owner, state)) + owner.ear_secondary_colors[channel] = new_color + update_dna(owner) + owner.update_hair() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return TRUE if("tail") - if(can_change(target, APPEARANCE_ALL_HAIR)) + if(can_change(owner, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/tail/instance = locate(params["ref"]) if(params["clear"]) instance = null if(!istype(instance) && !params["clear"]) return FALSE - target.tail_style = instance - target.update_tail_showing() - update_dna(target) + owner.tail_style = instance + owner.update_tail_showing() + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("tail_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) - var/new_hair = input(target, "Please select tail color.", "Tail Color", rgb(target.r_tail, target.g_tail, target.b_tail)) as color|null - if(new_hair && can_still_topic(target, state)) - target.r_tail = hex2num(copytext(new_hair, 2, 4)) - target.g_tail = hex2num(copytext(new_hair, 4, 6)) - target.b_tail = hex2num(copytext(new_hair, 6, 8)) - update_dna(target) - target.update_tail_showing() + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select tail color.", "Tail Color", rgb(owner.r_tail, owner.g_tail, owner.b_tail)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_tail = hex2num(copytext(new_hair, 2, 4)) + owner.g_tail = hex2num(copytext(new_hair, 4, 6)) + owner.b_tail = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_tail_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("tail2_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) - var/new_hair = input(target, "Please select secondary tail color.", "2nd Tail Color", rgb(target.r_tail2, target.g_tail2, target.b_tail2)) as color|null - if(new_hair && can_still_topic(target, state)) - target.r_tail2 = hex2num(copytext(new_hair, 2, 4)) - target.g_tail2 = hex2num(copytext(new_hair, 4, 6)) - target.b_tail2 = hex2num(copytext(new_hair, 6, 8)) - update_dna(target) - target.update_tail_showing() + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select secondary tail color.", "2nd Tail Color", rgb(owner.r_tail2, owner.g_tail2, owner.b_tail2)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_tail2 = hex2num(copytext(new_hair, 2, 4)) + owner.g_tail2 = hex2num(copytext(new_hair, 4, 6)) + owner.b_tail2 = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_tail_showing() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + if("tail3_color") + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select secondary tail color.", "3rd Tail Color", rgb(owner.r_tail3, owner.g_tail3, owner.b_tail3)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_tail3 = hex2num(copytext(new_hair, 2, 4)) + owner.g_tail3 = hex2num(copytext(new_hair, 4, 6)) + owner.b_tail3 = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_tail_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("wing") - if(can_change(target, APPEARANCE_ALL_HAIR)) + if(can_change(owner, APPEARANCE_ALL_HAIR)) var/datum/sprite_accessory/wing/instance = locate(params["ref"]) if(params["clear"]) instance = null if(!istype(instance) && !params["clear"]) return FALSE - target.wing_style = instance - target.update_wing_showing() - update_dna(target) + owner.wing_style = instance + owner.update_wing_showing() + update_dna(owner) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if("wing_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) - var/new_hair = input(target, "Please select wing color.", "Wing Color", rgb(target.r_wing, target.g_wing, target.b_wing)) as color|null - if(new_hair && can_still_topic(target, state)) - target.r_wing = hex2num(copytext(new_hair, 2, 4)) - target.g_wing = hex2num(copytext(new_hair, 4, 6)) - target.b_wing = hex2num(copytext(new_hair, 6, 8)) - update_dna(target) - target.update_wing_showing() + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select wing color.", "Wing Color", rgb(owner.r_wing, owner.g_wing, owner.b_wing)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_wing = hex2num(copytext(new_hair, 2, 4)) + owner.g_wing = hex2num(copytext(new_hair, 4, 6)) + owner.b_wing = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_wing_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("wing2_color") - if(can_change(target, APPEARANCE_HAIR_COLOR)) - var/new_hair = input(target, "Please select secondary wing color.", "2nd Wing Color", rgb(target.r_wing2, target.g_wing2, target.b_wing2)) as color|null - if(new_hair && can_still_topic(target, state)) - target.r_wing2 = hex2num(copytext(new_hair, 2, 4)) - target.g_wing2 = hex2num(copytext(new_hair, 4, 6)) - target.b_wing2 = hex2num(copytext(new_hair, 6, 8)) - update_dna(target) - target.update_wing_showing() + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select secondary wing color.", "2nd Wing Color", rgb(owner.r_wing2, owner.g_wing2, owner.b_wing2)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_wing2 = hex2num(copytext(new_hair, 2, 4)) + owner.g_wing2 = hex2num(copytext(new_hair, 4, 6)) + owner.b_wing2 = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_wing_showing() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + if("wing3_color") + if(can_change(owner, APPEARANCE_HAIR_COLOR)) + var/new_hair = input(ui.user, "Please select secondary wing color.", "3rd Wing Color", rgb(owner.r_wing3, owner.g_wing3, owner.b_wing3)) as color|null + if(new_hair && can_still_topic(owner, state)) + owner.r_wing3 = hex2num(copytext(new_hair, 2, 4)) + owner.g_wing3 = hex2num(copytext(new_hair, 4, 6)) + owner.b_wing3 = hex2num(copytext(new_hair, 6, 8)) + update_dna(owner) + owner.update_wing_showing() changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("marking") - if(can_change(target, APPEARANCE_ALL_HAIR)) + if(can_change(owner, APPEARANCE_ALL_HAIR)) var/todo = params["todo"] var/name_marking = params["name"] switch (todo) if (0) //delete if (name_marking) var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[name_marking] - if (target.remove_marking(mark_datum)) + if (owner.remove_marking(mark_datum)) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if (1) //add var/list/usable_markings = markings.Copy() ^ body_marking_styles_list.Copy() - var/new_marking = tgui_input_list(target, "Choose a body marking:", "New Body Marking", usable_markings) - if(new_marking && can_still_topic(target, state)) + var/new_marking = tgui_input_list(ui.user, "Choose a body marking:", "New Body Marking", usable_markings) + if(new_marking && can_still_topic(owner, state)) var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[new_marking] - if (target.add_marking(mark_datum)) + if (owner.add_marking(mark_datum)) changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return TRUE if (2) //move up var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[name_marking] - if (target.change_priority_of_marking(mark_datum, FALSE)) + if (owner.change_priority_of_marking(mark_datum, FALSE)) return TRUE if (3) //move down var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[name_marking] - if (target.change_priority_of_marking(mark_datum, TRUE)) + if (owner.change_priority_of_marking(mark_datum, TRUE)) return TRUE if (4) //color var/current = markings[name_marking] ? markings[name_marking] : "#000000" - var/marking_color = input(target, "Please select marking color", "Marking color", current) as color|null - if(marking_color && can_still_topic(target, state)) + var/marking_color = input(ui.user, "Please select marking color", "Marking color", current) as color|null + if(marking_color && can_still_topic(owner, state)) var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[name_marking] - if (target.change_marking_color(mark_datum, marking_color)) + if (owner.change_marking_color(mark_datum, marking_color)) return TRUE // VOREStation Add End return FALSE /datum/tgui_module/appearance_changer/tgui_interact(mob/user, datum/tgui/ui = null, datum/tgui/parent_ui = null, datum/tgui_state/custom_state) - var/mob/living/carbon/human/target = owner - if(customize_usr) + if(customize_usr && !owner) if(!ishuman(user)) return TRUE - target = user + owner = user - if(!target || !target.species) + if(!owner || !owner.species) return ui = SStgui.try_update_ui(user, src, ui) - update_active_camera_screen() if(!ui) + owner.AddComponent(/datum/component/recursive_move) + RegisterSignal(owner, COMSIG_OBSERVER_MOVED, PROC_REF(update_active_camera_screen)) // Register map objects user.client.register_map_obj(cam_screen) for(var/plane in cam_plane_masters) @@ -370,19 +384,20 @@ ui.open() if(custom_state) ui.set_state(custom_state) + update_active_camera_screen() /datum/tgui_module/appearance_changer/tgui_static_data(mob/user) var/list/data = ..() - generate_data(user) + generate_data(user, owner) - if(can_change(user, APPEARANCE_RACE)) + if(can_change(owner, APPEARANCE_RACE)) var/species[0] for(var/specimen in valid_species) species[++species.len] = list("specimen" = specimen) data["species"] = species - if(can_change(user, APPEARANCE_HAIR)) + if(can_change(owner, APPEARANCE_HAIR)) var/hair_styles[0] for(var/hair_style in valid_hairstyles) hair_styles[++hair_styles.len] = list("hairstyle" = hair_style) @@ -393,7 +408,7 @@ data["wing_styles"] = valid_wingstyles // VOREStation Add End - if(can_change(user, APPEARANCE_FACIAL_HAIR)) + if(can_change(owner, APPEARANCE_FACIAL_HAIR)) var/facial_hair_styles[0] for(var/facial_hair_style in valid_facial_hairstyles) facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_style) @@ -404,24 +419,18 @@ /datum/tgui_module/appearance_changer/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - generate_data(user) + generate_data(user, owner) - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(ui.user)) - return TRUE - target = ui.user + data["name"] = owner.name + data["specimen"] = owner.species.name + data["gender"] = owner.gender + data["gender_id"] = owner.identifying_gender + data["change_race"] = can_change(owner, APPEARANCE_RACE) - data["name"] = target.name - data["specimen"] = target.species.name - data["gender"] = target.gender - data["gender_id"] = target.identifying_gender - data["change_race"] = can_change(target, APPEARANCE_RACE) - - data["change_gender"] = can_change(target, APPEARANCE_GENDER) + data["change_gender"] = can_change(owner, APPEARANCE_GENDER) if(data["change_gender"]) var/genders[0] - for(var/gender in get_genders(target)) + for(var/gender in get_genders(owner)) genders[++genders.len] = list("gender_name" = gender2text(gender), "gender_key" = gender) data["genders"] = genders var/id_genders[0] @@ -429,56 +438,58 @@ id_genders[++id_genders.len] = list("gender_name" = gender2text(gender), "gender_key" = gender) data["id_genders"] = id_genders - data["change_hair"] = can_change(target, APPEARANCE_HAIR) + data["change_hair"] = can_change(owner, APPEARANCE_HAIR) if(data["change_hair"]) - data["hair_style"] = target.h_style + data["hair_style"] = owner.h_style // VOREStation Add - Ears/Tails/Wings - data["ear_style"] = target.ear_style - data["ear_secondary_style"] = target.ear_secondary_style?.name - data["tail_style"] = target.tail_style - data["wing_style"] = target.wing_style + data["ear_style"] = owner.ear_style + data["ear_secondary_style"] = owner.ear_secondary_style?.name + data["tail_style"] = owner.tail_style + data["wing_style"] = owner.wing_style var/list/markings_data[0] - markings = target.get_prioritised_markings() + markings = owner.get_prioritised_markings() for (var/marking in markings) markings_data[++markings_data.len] = list("marking_name" = marking, "marking_color" = markings[marking]["color"] ? markings[marking]["color"] : "#000000") //too tired to add in another submenu for bodyparts here data["markings"] = markings_data // VOREStation Add End - data["change_facial_hair"] = can_change(target, APPEARANCE_FACIAL_HAIR) + data["change_facial_hair"] = can_change(owner, APPEARANCE_FACIAL_HAIR) if(data["change_facial_hair"]) - data["facial_hair_style"] = target.f_style + data["facial_hair_style"] = owner.f_style - data["change_skin_tone"] = can_change_skin_tone(target) - data["change_skin_color"] = can_change_skin_color(target) + data["change_skin_tone"] = can_change_skin_tone(owner) + data["change_skin_color"] = can_change_skin_color(owner) if(data["change_skin_color"]) - data["skin_color"] = rgb(target.r_skin, target.g_skin, target.b_skin) + data["skin_color"] = rgb(owner.r_skin, owner.g_skin, owner.b_skin) - data["change_eye_color"] = can_change(target, APPEARANCE_EYE_COLOR) + data["change_eye_color"] = can_change(owner, APPEARANCE_EYE_COLOR) if(data["change_eye_color"]) - data["eye_color"] = rgb(target.r_eyes, target.g_eyes, target.b_eyes) + data["eye_color"] = rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes) - data["change_hair_color"] = can_change(target, APPEARANCE_HAIR_COLOR) + data["change_hair_color"] = can_change(owner, APPEARANCE_HAIR_COLOR) if(data["change_hair_color"]) - data["hair_color"] = rgb(target.r_hair, target.g_hair, target.b_hair) + data["hair_color"] = rgb(owner.r_hair, owner.g_hair, owner.b_hair) // VOREStation Add - Ears/Tails/Wings - data["ears_color"] = rgb(target.r_ears, target.g_ears, target.b_ears) - data["ears2_color"] = rgb(target.r_ears2, target.g_ears2, target.b_ears2) + data["ears_color"] = rgb(owner.r_ears, owner.g_ears, owner.b_ears) + data["ears2_color"] = rgb(owner.r_ears2, owner.g_ears2, owner.b_ears2) // secondary ear colors - var/list/ear_secondary_color_channels = target.ear_secondary_colors || list() - ear_secondary_color_channels.len = target.ear_secondary_style?.get_color_channel_count() || 0 + var/list/ear_secondary_color_channels = owner.ear_secondary_colors || list() + ear_secondary_color_channels.len = owner.ear_secondary_style?.get_color_channel_count() || 0 data["ear_secondary_colors"] = ear_secondary_color_channels - data["tail_color"] = rgb(target.r_tail, target.g_tail, target.b_tail) - data["tail2_color"] = rgb(target.r_tail2, target.g_tail2, target.b_tail2) - data["wing_color"] = rgb(target.r_wing, target.g_wing, target.b_wing) - data["wing2_color"] = rgb(target.r_wing2, target.g_wing2, target.b_wing2) + data["tail_color"] = rgb(owner.r_tail, owner.g_tail, owner.b_tail) + data["tail2_color"] = rgb(owner.r_tail2, owner.g_tail2, owner.b_tail2) + data["tail3_color"] = rgb(owner.r_tail3, owner.g_tail3, owner.b_tail3) + data["wing_color"] = rgb(owner.r_wing, owner.g_wing, owner.b_wing) + data["wing2_color"] = rgb(owner.r_wing2, owner.g_wing2, owner.b_wing2) + data["wing3_color"] = rgb(owner.r_wing3, owner.g_wing3, owner.b_wing3) // VOREStation Add End - data["change_facial_hair_color"] = can_change(target, APPEARANCE_FACIAL_HAIR_COLOR) + data["change_facial_hair_color"] = can_change(owner, APPEARANCE_FACIAL_HAIR_COLOR) if(data["change_facial_hair_color"]) - data["facial_hair_color"] = rgb(target.r_facial, target.g_facial, target.b_facial) + data["facial_hair_color"] = rgb(owner.r_facial, owner.g_facial, owner.b_facial) return data /datum/tgui_module/appearance_changer/tgui_static_data(mob/user) @@ -512,30 +523,18 @@ local_skybox.set_position("CENTER", "CENTER", (world.maxx>>1) - newturf.x, (world.maxy>>1) - newturf.y) */ -/datum/tgui_module/appearance_changer/proc/update_dna(mob/target) - if(customize_usr && !ishuman(target)) - return TRUE - var/mob/living/carbon/human/H = target - if(H && (flags & APPEARANCE_UPDATE_DNA)) - H.update_dna() +/datum/tgui_module/appearance_changer/proc/update_dna(mob/living/carbon/human/target) + if(target && (flags & APPEARANCE_UPDATE_DNA)) + target.update_dna() -/datum/tgui_module/appearance_changer/proc/can_change(mob/target, var/flag) - if(customize_usr && !ishuman(target)) - return TRUE - var/mob/living/carbon/human/H = target - return H && (flags & flag) +/datum/tgui_module/appearance_changer/proc/can_change(mob/living/carbon/human/target, var/flag) + return target && (flags & flag) -/datum/tgui_module/appearance_changer/proc/can_change_skin_tone(mob/target) - if(customize_usr && !ishuman(target)) - return TRUE - var/mob/living/carbon/human/H = target - return H && (flags & APPEARANCE_SKIN) && H.species.appearance_flags & HAS_SKIN_TONE +/datum/tgui_module/appearance_changer/proc/can_change_skin_tone(mob/living/carbon/human/target) + return target && (flags & APPEARANCE_SKIN) &&target.species.appearance_flags & HAS_SKIN_TONE -/datum/tgui_module/appearance_changer/proc/can_change_skin_color(mob/target) - if(customize_usr && !ishuman(target)) - return TRUE - var/mob/living/carbon/human/H = target - return H && (flags & APPEARANCE_SKIN) && H.species.appearance_flags & HAS_SKIN_COLOR +/datum/tgui_module/appearance_changer/proc/can_change_skin_color(mob/living/carbon/human/target) + return target && (flags & APPEARANCE_SKIN) && target.species.appearance_flags & HAS_SKIN_COLOR /datum/tgui_module/appearance_changer/proc/cut_data() // Making the assumption that the available species remain constant @@ -547,14 +546,9 @@ valid_wingstyles.Cut() // VOREStation Add End -/datum/tgui_module/appearance_changer/proc/generate_data(mob/user) - var/mob/living/carbon/human/target = owner - if(customize_usr) - if(!ishuman(user)) - return TRUE - target = user - if(!target) - return +/datum/tgui_module/appearance_changer/proc/generate_data(mob/user, mob/living/carbon/human/target) + if(!ishuman(target)) + return TRUE if(!LAZYLEN(valid_species)) valid_species = target.generate_valid_species(check_whitelist, whitelist, blacklist) @@ -598,13 +592,10 @@ ))) // VOREStation Add End -/datum/tgui_module/appearance_changer/proc/get_genders(mob/target) - if(customize_usr && !ishuman(target)) - return TRUE - var/mob/living/carbon/human/H = target - var/datum/species/S = H.species +/datum/tgui_module/appearance_changer/proc/get_genders(mob/living/carbon/human/target) + var/datum/species/S = target.species var/list/possible_genders = S.genders - if(!H.internal_organs_by_name["cell"]) + if(!target.internal_organs_by_name["cell"]) return possible_genders possible_genders = possible_genders.Copy() possible_genders |= NEUTER @@ -616,6 +607,8 @@ // VOREStation Add - Ears/Tails/Wings /datum/tgui_module/appearance_changer/proc/can_use_sprite(datum/sprite_accessory/X, mob/living/carbon/human/target, mob/user) + if(X.name == DEVELOPER_WARNING_NAME) + return FALSE if(!isnull(X.species_allowed) && !(target.species.name in X.species_allowed) && (!istype(target.species, /datum/species/custom))) // Letting custom species access wings/ears/tails. return FALSE diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm index e66d4bc96d..793029a601 100644 --- a/code/modules/tgui/modules/camera.dm +++ b/code/modules/tgui/modules/camera.dm @@ -83,7 +83,7 @@ var/turf/newturf = get_turf(active_camera) var/area/B = newturf?.loc // No cam tracking in dorms! // Show static if can't use the camera - if(!active_camera?.can_use() || B.block_tracking) + if(!active_camera?.can_use() || B.flag_check(AREA_BLOCK_TRACKING)) show_camera_static() if(!ui) var/user_ref = REF(user) @@ -182,7 +182,7 @@ var/turf/newturf = get_turf(active_camera) var/area/B = newturf?.loc // No cam tracking in dorms! // Show static if can't use the camera - if(!active_camera?.can_use() || B.block_tracking) + if(!active_camera?.can_use() || B.flag_check(AREA_BLOCK_TRACKING)) show_camera_static() return TRUE diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm index d25bd2517d..f16deca1da 100644 --- a/code/modules/ventcrawl/ventcrawl.dm +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -12,7 +12,8 @@ var/list/ventcrawl_machinery = list( /obj/machinery/camera, /obj/belly, /obj/screen, - /atom/movable/emissive_blocker + /atom/movable/emissive_blocker, + /obj/item/rig/protean ) //VOREStation Edit : added /obj/belly, to this list, CI is complaining about this in his indentation check. Added mob_headset for those with radios so there's no weirdness. //mob/living/simple_mob/borer, //VORESTATION AI TEMPORARY REMOVAL REPLACE BACK IN LIST WHEN RESOLVED //VOREStation Edit @@ -66,11 +67,11 @@ var/list/ventcrawl_machinery = list( /mob/living/proc/is_allowed_vent_crawl_item(var/obj/carried_item) //Ability master easy test for allowed (cheaper than istype) if(carried_item == ability_master) - return 1 + return TRUE if(isanimal(src)) var/mob/living/simple_mob/S = src - if(carried_item == S.myid) //VOREStation Edit - return 1 //VOREStation Edit + if(carried_item == S.myid) + return TRUE //Try to find it in our allowed list (istype includes subtypes) var/listed = FALSE for(var/test_type in can_enter_vent_with) @@ -80,23 +81,23 @@ var/list/ventcrawl_machinery = list( //Only allow it if it's "IN" the mob, not equipped on/being held. //Disabled, as it's very annoying that, for example, Pun Pun has no way to ventcrawl with his suit if given the verb, since the list of allowed items is ignored for worn items. if(listed/* && !get_inventory_slot(carried_item)*/) - return 1 + return TRUE /mob/living/carbon/is_allowed_vent_crawl_item(var/obj/item/carried_item) if(carried_item in internal_organs) - return 1 + return TRUE return ..() /mob/living/carbon/human/is_allowed_vent_crawl_item(var/obj/item/carried_item) if(carried_item in organs) - return 1 + return TRUE if(species.name == SPECIES_REPLICANT_CREW) if(istype(carried_item, /obj/item/clothing/under)) - return 1 //Allow them to not vent crawl naked + return TRUE //Allow them to not vent crawl naked if(istype(carried_item, /obj/item)) var/obj/item/I = carried_item - if(I.w_class <= 2) - return 1 //Allow them to carry items that fit in pockets + if(I.w_class <= ITEMSIZE_SMALL) + return TRUE //Allow them to carry items that fit in pockets return ..() /mob/living/proc/ventcrawl_carry() @@ -106,6 +107,29 @@ var/list/ventcrawl_machinery = list( return FALSE return TRUE +/mob/living/simple_mob/protean_blob/ventcrawl_carry() + for(var/atom/A in contents) + if(!is_allowed_vent_crawl_item(A)) + to_chat(src, span_warning("You can't carry \the [A] while ventcrawling!")) + return FALSE + if(humanform) + for(var/atom/B in humanform.get_contents()) + if(!is_allowed_vent_crawl_item(B)) + to_chat(src, span_warning("You can't carry \the [B] while ventcrawling!")) + return FALSE + return TRUE + +/mob/living/simple_mob/protean_blob/is_allowed_vent_crawl_item(var/obj/item/carried_item) + if((carried_item in humanform.organs) || (carried_item in humanform.internal_organs)) + return TRUE + if(istype(carried_item, /obj/item/clothing/under)) + return TRUE //Allow jumpsuits only + if(istype(carried_item, /obj/item)) + var/obj/item/I = carried_item + if(I.w_class <= ITEMSIZE_SMALL) + return TRUE //Allow them to carry items that fit in pockets + return ..() + /mob/living/AltClickOn(var/atom/A) if(is_type_in_list(A,ventcrawl_machinery)) handle_ventcrawl(A) @@ -129,7 +153,7 @@ var/list/ventcrawl_machinery = list( return pipe /mob/living/carbon/alien/ventcrawl_carry() - return 1 + return TRUE /mob/living/var/ventcrawl_layer = 3 diff --git a/code/modules/ventcrawl/ventcrawl_atmospherics.dm b/code/modules/ventcrawl/ventcrawl_atmospherics.dm index 2c2cb6ca9d..fb04e89857 100644 --- a/code/modules/ventcrawl/ventcrawl_atmospherics.dm +++ b/code/modules/ventcrawl/ventcrawl_atmospherics.dm @@ -48,10 +48,10 @@ prob(90);"* clunk *", prob(90);"* thud *", prob(90);"* clatter *", - prob(1);"* *" + prob(1);"* " + span_giganteus("ඞ") + " *" ) T.runechat_message(message) - + else if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery) && src.can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent user.remove_ventcrawl() diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 3a44a1414b..b690ab20f2 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -891,6 +891,9 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", if(!istype(H)) return + if(!H.allow_spontaneous_tf) + return + var/datum/tgui_module/appearance_changer/vore/V = new(host, H) V.tgui_interact(user) return TRUE diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 01eaba19d3..69c99a21d8 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -817,22 +817,6 @@ if(H.head == src) H.update_inv_head() -/obj/item/rig/light/hacker/fluff/aronai - name = "KHI-99-AAR suit module" - suit_type = "nano" - desc = "A thin collapsable spacesuit for synths from Kitsuhana Heavy Industries." - airtight = 1 //Not because it should be airtight but because suit coolers don't work w/o it. - armor = list(melee = 25, bullet = 15, laser = 15, energy = 60, bomb = 30, bio = 70, rad = 100) - air_type = null //No O2 tank, why would it have one? - - cell_type = /obj/item/cell/hyper - req_access = list(access_medical) - - initial_modules = list( - /obj/item/rig_module/maneuvering_jets, - /obj/item/rig_module/teleporter - ) - //Viveret:Keturah /obj/item/clothing/under/dress/maid name = "Maid Outfit" @@ -914,7 +898,6 @@ /obj/item/clothing/under/rank/khi name = "Delete Me" desc = "Why did you spawn this one? Dork." - //catalogue_data = list(/datum/category_item/catalogue/information/organization/khi) sensor_mode = 3 icon = 'icons/inventory/uniform/item_vr.dmi' @@ -922,44 +905,44 @@ icon_state = "khi_uniform" /obj/item/clothing/under/rank/khi/cmd //Command version - name = "KHI command suit" - desc = "Kitsuhana Heavy Industries uniform. An extra-comfortable command one, at that. I guess if you DON'T want anarchy for some reason." + name = "sleek command suit" + desc = "A sleek, neocorporate style uniform. An extra-comfortable command one, at that." icon_state = "khi_uniform_cmd" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/sec //Security version - name = "KHI security suit" - desc = "Kitsuhana Heavy Industries uniform. This one has angry red security stripes. Keepin' the peace in style." + name = "sleek security suit" + desc = "A sleek, neocorporate style uniform. This one has angry red security stripes. Keepin' the peace in style." icon_state = "khi_uniform_sec" armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/med //Medical version - name = "KHI medical suit" - desc = "Kitsuhana Heavy Industries uniform. The medical version. Why not just get a new body, anyway?" + name = "sleek medical suit" + desc = "A sleek, neocorporate style uniform. The medical version. Why not just get a new body, anyway?" icon_state = "khi_uniform_med" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0) /obj/item/clothing/under/rank/khi/eng //Engineering version - name = "KHI engineering suit" - desc = "Kitsuhana Heavy Industries uniform. One fit for an engineer, by the looks of it. Building the future, one disaster at a time." + name = "sleek engineering suit" + desc = "A sleek, neocorporate style uniform. One fit for an engineer, by the looks of it." icon_state = "khi_uniform_eng" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10) /obj/item/clothing/under/rank/khi/sci //Science version - name = "KHI science suit" - desc = "Kitsuhana Heavy Industries uniform. For performing science in, based on the color! Only SCIENCE can save us now." + name = "sleek science suit" + desc = "A sleek, neocorporate style uniform. For performing science in, based on the color!" icon_state = "khi_uniform_sci" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/crg //Cargo version - name = "KHI cargo suit" - desc = "Kitsuhana Heavy Industries uniform. Looks like it's in supply and cargo division colors. Even post-scarcity societies need things moved and mined sometimes." + name = "sleek cargo suit" + desc = "A sleek, neocorporate style uniform. Looks like it's in supply and cargo division colors. Heavy industry means heavy lifting, after all." icon_state = "khi_uniform_crg" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/under/rank/khi/civ //Science version - name = "KHI civilian suit" - desc = "Kitsuhana Heavy Industries uniform. Snazzy silver trim marks this is as the general civilian branch. Smells like paperwork and bureaucracy." + name = "sleek civilian suit" + desc = "A sleek, neocorporate style uniform. Snazzy silver trim marks this is as the general civilian branch. Smells like paperwork and bureaucracy." icon_state = "khi_uniform_civ" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 8f5724292f..79c18b3aa0 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -576,8 +576,8 @@ update_icon() /obj/item/paper/khcrystal_manual - name = "NT-LC91-1 manual" //YW edit - info = {"

NT-LC91-1 Life Crystal

+ name = "VM-LC91-1 manual" + info = {"

VM-LC91-1 Life Crystal

Usage
  1. Hold unlinked crystal in hand.
  2. @@ -586,8 +586,8 @@

Purpose
-

The NanoTrasen Life Crystal is a small device typically worn around the neck for the purpose of reporting your status to the off-world mind and body backup systems, so that appropriate measures can be taken in the case of your body's demise. The whole device is housed inside a pleasing-to-the-eye elongated quartz crystal.

-

Upon your body's desmise, the crystal will send a transmission to the location specified in your employee file.

+

The Vey-Medical Life Crystal is a small device typically worn around the neck for the purpose of reporting your status to the HAVENS (High-AVailability ENgram Storage) system, so that appropriate measures can be taken in the case of your body's demise. The whole device is housed inside a pleasing-to-the-eye elongated diamond.

+

Upon your body's demise, the crystal will send a transmission to HAVENS. Depending on your membership level, the appropriate actions can be taken to ensure that you are back up and enjoying existence as soon as possible.

While NanoTrasen distributes these devices to their employees for free, they do not provide revival services with the crystals. It is the employee's responsibility to either negotiate a service with NanoTrasen or from other companies that provide the service.


@@ -611,7 +611,7 @@ name = "life crystal case" icon = 'icons/vore/custom_items_vr.dmi' icon_state = "khlifebox" - desc = "This case can only hold the NT-LC91-1 and a manual." + desc = "This case can only hold the VM-LC91-1 and a manual." item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit") storage_slots = 2 can_hold = list(/obj/item/paper/khcrystal_manual, /obj/item/clothing/accessory/collar/khcrystal) diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 9a0a59047d..80ae9f8b72 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -62,13 +62,14 @@ /atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that var/area/A = get_area(src) //Get the atom's area to check for size limit. - if((A?.limit_mob_size && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1)) + size_select = size_select / 100 + if((!A?.flag_check(AREA_ALLOW_LARGE_SIZE) && (size_select > RESIZE_MAXIMUM || size_select < RESIZE_MINIMUM)) || (size_select > RESIZE_MAXIMUM_DORMS || size_select < RESIZE_MINIMUM_DORMS)) return FALSE return TRUE /atom/movable/proc/has_large_resize_bounds() var/area/A = get_area(src) //Get the atom's area to check for size limit. - return !A.limit_mob_size + return A ? A.flag_check(AREA_ALLOW_LARGE_SIZE) : FALSE /proc/is_extreme_size(size) return (size < RESIZE_MINIMUM || size > RESIZE_MAXIMUM) @@ -134,6 +135,9 @@ if(!resizable && !ignore_prefs) return 1 . = ..() + if(!ishuman(temporary_form) && isliving(temporary_form)) + var/mob/living/temp_form = temporary_form + temp_form.resize(new_size, animate, uncapped, ignore_prefs, aura_animation) if(LAZYLEN(hud_list) && has_huds) var/new_y_offset = vis_height * (size_multiplier - 1) for(var/index = 1 to hud_list.len) diff --git a/code/modules/xenoarcheaology/effect.dm b/code/modules/xenoarcheaology/effect.dm index f17f0d7b17..c19c0592d4 100644 --- a/code/modules/xenoarcheaology/effect.dm +++ b/code/modules/xenoarcheaology/effect.dm @@ -159,7 +159,7 @@ if(!istype(H)) return 1 var/area/A = get_area(H) - if(A.forbid_events) + if(A.flag_check(AREA_FORBID_EVENTS)) return 0 var/protected = 0 diff --git a/code/world.dm b/code/world.dm index a1adc4c481..ca433d1dc1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -17,5 +17,5 @@ hub_password = "kMZy3U5jJHSiBQjr" name = "Space Station 13" // YW Edit visibility = 1 // YW Edit - cache_lifespan = 7 + cache_lifespan = 0 fps = 20 // If this isnt hard-defined, anything relying on this variable before world load will cry a lot diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi new file mode 100644 index 0000000000..3cbae70a3d Binary files /dev/null and b/icons/mob/ears.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi new file mode 100644 index 0000000000..ccc2345e87 Binary files /dev/null and b/icons/mob/feet.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi new file mode 100644 index 0000000000..c5434d9694 Binary files /dev/null and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 3e8d60a579..983a4f95b2 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi index 5da8720d00..372ce05bf4 100644 Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ diff --git a/icons/mob/lefthand_holder.dmi b/icons/mob/lefthand_holder.dmi new file mode 100644 index 0000000000..e5cded14f1 Binary files /dev/null and b/icons/mob/lefthand_holder.dmi differ diff --git a/icons/mob/righthand_holder.dmi b/icons/mob/righthand_holder.dmi new file mode 100644 index 0000000000..edc2e8d4d3 Binary files /dev/null and b/icons/mob/righthand_holder.dmi differ diff --git a/icons/mob/spacesuit.dmi b/icons/mob/spacesuit.dmi new file mode 100644 index 0000000000..7fb16ee9cc Binary files /dev/null and b/icons/mob/spacesuit.dmi differ diff --git a/icons/mob/species/akula/helmet.dmi b/icons/mob/species/akula/helmet.dmi new file mode 100644 index 0000000000..816728e67f Binary files /dev/null and b/icons/mob/species/akula/helmet.dmi differ diff --git a/icons/mob/species/akula/suit.dmi b/icons/mob/species/akula/suit.dmi new file mode 100644 index 0000000000..6bb1a3c22f Binary files /dev/null and b/icons/mob/species/akula/suit.dmi differ diff --git a/icons/mob/species/fox/helmet.dmi b/icons/mob/species/fox/helmet.dmi new file mode 100644 index 0000000000..662cf2b538 Binary files /dev/null and b/icons/mob/species/fox/helmet.dmi differ diff --git a/icons/mob/species/fox/suit.dmi b/icons/mob/species/fox/suit.dmi new file mode 100644 index 0000000000..6aaae8e153 Binary files /dev/null and b/icons/mob/species/fox/suit.dmi differ diff --git a/icons/mob/species/protean/protean.dmi b/icons/mob/species/protean/protean.dmi index f644aa051a..bbabb24a84 100644 Binary files a/icons/mob/species/protean/protean.dmi and b/icons/mob/species/protean/protean.dmi differ diff --git a/icons/mob/species/protean/protean128x64.dmi b/icons/mob/species/protean/protean128x64.dmi new file mode 100644 index 0000000000..3a40f0c209 Binary files /dev/null and b/icons/mob/species/protean/protean128x64.dmi differ diff --git a/icons/mob/species/protean/protean64x32.dmi b/icons/mob/species/protean/protean64x32.dmi new file mode 100644 index 0000000000..e5244c77bf Binary files /dev/null and b/icons/mob/species/protean/protean64x32.dmi differ diff --git a/icons/mob/species/protean/protean64x64.dmi b/icons/mob/species/protean/protean64x64.dmi new file mode 100644 index 0000000000..1a6fe757e8 Binary files /dev/null and b/icons/mob/species/protean/protean64x64.dmi differ diff --git a/icons/mob/species/protean/protean_powers.dmi b/icons/mob/species/protean/protean_powers.dmi index febd3522a0..efcd821a81 100644 Binary files a/icons/mob/species/protean/protean_powers.dmi and b/icons/mob/species/protean/protean_powers.dmi differ diff --git a/icons/mob/species/sergal/helmet.dmi b/icons/mob/species/sergal/helmet.dmi new file mode 100644 index 0000000000..3db73dd843 Binary files /dev/null and b/icons/mob/species/sergal/helmet.dmi differ diff --git a/icons/mob/species/sergal/suit.dmi b/icons/mob/species/sergal/suit.dmi new file mode 100644 index 0000000000..cb43d46423 Binary files /dev/null and b/icons/mob/species/sergal/suit.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi new file mode 100644 index 0000000000..0d78858afd Binary files /dev/null and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi new file mode 100644 index 0000000000..74d3cb4f02 Binary files /dev/null and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi new file mode 100644 index 0000000000..4ea01ddf64 Binary files /dev/null and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi new file mode 100644 index 0000000000..fc9e06c4ca Binary files /dev/null and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/teshari/feet.dmi b/icons/mob/species/teshari/feet.dmi new file mode 100644 index 0000000000..3eeebe76df Binary files /dev/null and b/icons/mob/species/teshari/feet.dmi differ diff --git a/icons/mob/species/teshari/hands.dmi b/icons/mob/species/teshari/hands.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/mob/species/teshari/hands.dmi differ diff --git a/icons/mob/species/teshari/helmet.dmi b/icons/mob/species/teshari/helmet.dmi new file mode 100644 index 0000000000..124701a526 Binary files /dev/null and b/icons/mob/species/teshari/helmet.dmi differ diff --git a/icons/mob/species/teshari/suit.dmi b/icons/mob/species/teshari/suit.dmi index 09d72fa461..55b76f109c 100644 Binary files a/icons/mob/species/teshari/suit.dmi and b/icons/mob/species/teshari/suit.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi new file mode 100644 index 0000000000..10980c26b8 Binary files /dev/null and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi new file mode 100644 index 0000000000..7bd66e6277 Binary files /dev/null and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/species/vox/gloves.dmi b/icons/mob/species/vox/gloves.dmi new file mode 100644 index 0000000000..043d409ab4 Binary files /dev/null and b/icons/mob/species/vox/gloves.dmi differ diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi new file mode 100644 index 0000000000..5bfd81ffea Binary files /dev/null and b/icons/mob/species/vox/head.dmi differ diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi new file mode 100644 index 0000000000..14a1c8ff2e Binary files /dev/null and b/icons/mob/species/vox/shoes.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi new file mode 100644 index 0000000000..58ecc85ca4 Binary files /dev/null and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi new file mode 100644 index 0000000000..39cf0a26a5 Binary files /dev/null and b/icons/mob/species/vulpkanin/helmet.dmi differ diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi new file mode 100644 index 0000000000..1242aaf5b0 Binary files /dev/null and b/icons/mob/species/vulpkanin/suit.dmi differ diff --git a/icons/mob/species/xenomorph_hybrid/gloves.dmi b/icons/mob/species/xenomorph_hybrid/gloves.dmi new file mode 100644 index 0000000000..d723ac8a71 Binary files /dev/null and b/icons/mob/species/xenomorph_hybrid/gloves.dmi differ diff --git a/icons/mob/species/xenomorph_hybrid/helmet.dmi b/icons/mob/species/xenomorph_hybrid/helmet.dmi new file mode 100644 index 0000000000..9d1d68c6a7 Binary files /dev/null and b/icons/mob/species/xenomorph_hybrid/helmet.dmi differ diff --git a/icons/mob/species/xenomorph_hybrid/shoes.dmi b/icons/mob/species/xenomorph_hybrid/shoes.dmi new file mode 100644 index 0000000000..f52f13a184 Binary files /dev/null and b/icons/mob/species/xenomorph_hybrid/shoes.dmi differ diff --git a/icons/mob/species/xenomorph_hybrid/suit.dmi b/icons/mob/species/xenomorph_hybrid/suit.dmi new file mode 100644 index 0000000000..adf5428182 Binary files /dev/null and b/icons/mob/species/xenomorph_hybrid/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi new file mode 100644 index 0000000000..3540034849 Binary files /dev/null and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 9c210eb641..0b5fd53fb2 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/airlock_machines.dmi b/icons/obj/airlock_machines.dmi index 1f22e8e198..9a24724c81 100644 Binary files a/icons/obj/airlock_machines.dmi and b/icons/obj/airlock_machines.dmi differ diff --git a/icons/obj/card_alt_vr.dmi b/icons/obj/card_alt_vr.dmi index d18adbb882..b9e2db290c 100644 Binary files a/icons/obj/card_alt_vr.dmi and b/icons/obj/card_alt_vr.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 2dbb310fde..1ea1785559 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index d15f3417d0..2cfbcc9b50 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/rig_modules_vr.dmi b/icons/obj/rig_modules_vr.dmi index 334a8e881f..b09eb0d54c 100644 Binary files a/icons/obj/rig_modules_vr.dmi and b/icons/obj/rig_modules_vr.dmi differ diff --git a/icons/obj/slimeborg/slimecore.dmi b/icons/obj/slimeborg/slimecore.dmi new file mode 100644 index 0000000000..761a44804c Binary files /dev/null and b/icons/obj/slimeborg/slimecore.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index 30baa36e3c..dcb032ca65 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/stock_parts_vr.dmi b/icons/obj/stock_parts_vr.dmi index 8e48a4c0a3..6a90bf4485 100644 Binary files a/icons/obj/stock_parts_vr.dmi and b/icons/obj/stock_parts_vr.dmi differ diff --git a/maps/expedition_vr/space/_debrisfield.dm b/maps/expedition_vr/space/_debrisfield.dm index f74be21018..46d988e0ea 100644 --- a/maps/expedition_vr/space/_debrisfield.dm +++ b/maps/expedition_vr/space/_debrisfield.dm @@ -131,7 +131,7 @@ /area/submap/debrisfield/luxury_boat - secret_name = 0 + flags = RAD_SHIELDED | AREA_FORBID_EVENTS /area/submap/debrisfield/luxury_boat/bridge name = "Captain's Quarters" @@ -222,7 +222,7 @@ name = "POI - Destroyed Mining Outpost" /area/submap/debrisfield/tinyshuttle - secret_name = 0 + flags = RAD_SHIELDED | AREA_FORBID_EVENTS /area/submap/debrisfield/tinyshuttle/crew name = "Crew Bay" diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm index 331732a24a..9cd2c0d330 100644 --- a/maps/groundbase/gb-z1.dmm +++ b/maps/groundbase/gb-z1.dmm @@ -1820,6 +1820,15 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/structure/closet/walllocker_double/hydrant/south, +/obj/item/hand_labeler, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup_tall, +/obj/item/storage/box/glasses/coffeecup_grande, +/obj/item/storage/box/glasses/coffeecup_venti, /turf/simulated/floor/lino, /area/groundbase/civilian/cafe) "dW" = ( @@ -5875,8 +5884,12 @@ /obj/random/mug, /obj/random/mug, /obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = 5; - pixel_y = 6 + pixel_x = -7; + pixel_y = 18 + }, +/obj/machinery/chemical_dispenser/bar_syrup/full{ + dir = 8; + pixel_x = 7 }, /turf/simulated/floor/lino, /area/groundbase/civilian/cafe) diff --git a/maps/groundbase/groundbase_areas.dm b/maps/groundbase/groundbase_areas.dm index 4831ef8750..a32e5727c1 100644 --- a/maps/groundbase/groundbase_areas.dm +++ b/maps/groundbase/groundbase_areas.dm @@ -359,18 +359,21 @@ icon_state = "grewhisqu" ambience = AMBIENCE_FOREBODING lightswitch = 0 + /area/groundbase/civilian/arrivals name = "Arrivals" lightswitch = 1 - forbid_events = TRUE - forbid_singulo = TRUE + flags = AREA_FORBID_EVENTS | AREA_FORBID_SINGULO + /area/groundbase/civilian/toolstorage name = "Tool Storage" lightswitch = 1 + /area/groundbase/civilian/bar name = "Bar" sound_env = LARGE_ENCLOSED lightswitch = 1 + /area/groundbase/civilian/bar/upper name = "Bar Balcony" base_turf = /turf/simulated/open/virgo3c @@ -379,14 +382,17 @@ name = "Cafe" sound_env = SMALL_SOFTFLOOR lightswitch = 1 + /area/groundbase/civilian/hydroponics name = "Hydroponics" lightswitch = 1 + /area/groundbase/civilian/hydroponics/out name = "Hydroponics Animal Pen" /area/groundbase/civilian/kitchen name = "Kitchen" lightswitch = 1 + /area/groundbase/civilian/kitchen/freezer name = "Kitchen Freezer" /area/groundbase/civilian/kitchen/backroom @@ -420,14 +426,15 @@ sound_env = SMALL_SOFTFLOOR /area/groundbase/civilian/mensrestroom name = "Men's Restroom" + flags = AREA_FORBID_EVENTS sound_env = SOUND_ENVIRONMENT_BATHROOM lightswitch = 1 - forbid_events = TRUE + /area/groundbase/civilian/womensrestroom name = "Women's Restroom" + flags = AREA_FORBID_EVENTS sound_env = SOUND_ENVIRONMENT_BATHROOM lightswitch = 1 - forbid_events = TRUE /area/groundbase/civilian/entrepreneur name = "\improper Shared Office" @@ -456,13 +463,7 @@ holomap_color = HOLOMAP_AREACOLOR_DORMS icon_state = "grawhisqu" ambience = AMBIENCE_GENERIC - flags = RAD_SHIELDED| BLUE_SHIELDED |AREA_FLAG_IS_NOT_PERSISTENT - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE - forbid_events = TRUE - forbid_singulo = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_FLAG_IS_NOT_PERSISTENT | AREA_FORBID_EVENTS | AREA_FORBID_SINGULO | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/groundbase/dorms/bathroom name = "Dormitory Bathroom" diff --git a/maps/groundbase/groundbase_events.dm b/maps/groundbase/groundbase_events.dm index 905ce89875..e12d41100d 100644 --- a/maps/groundbase/groundbase_events.dm +++ b/maps/groundbase/groundbase_events.dm @@ -70,6 +70,7 @@ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 40, list(ASSIGNMENT_SCIENTIST = 40), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 100, list(ASSIGNMENT_ANY = 5), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Lurker", /datum/event/maintenance_lurker, 100, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Roaming Wildlife", /datum/event/roaming_wildlife, 20, list(ASSIGNMENT_SECURITY = 20, ASSIGNMENT_MEDICAL = 5), min_jobs = list(ASSIGNMENT_SECURITY = 2)), ) add_disabled_events(list( diff --git a/maps/southern_cross/items/headset_sc.dm b/maps/southern_cross/items/headset_sc.dm index b409dd2ddd..9a39694ec7 100644 --- a/maps/southern_cross/items/headset_sc.dm +++ b/maps/southern_cross/items/headset_sc.dm @@ -9,6 +9,8 @@ name = "pilot's bowman headset" desc = "A bowman headset used by pilots, has access to supply and explorer channels." icon_state = "pilot_headset_alt" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/pilot /obj/item/radio/headset/explorer name = "explorer's headset" @@ -21,6 +23,8 @@ name = "explorer's bowman headset" desc = "Bowman headset used by explorers for exploring. Access to the explorer channel." icon_state = "exp_headset_alt" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/explorer /obj/item/radio/headset/sar name = "sar radio headset" @@ -33,3 +37,5 @@ name = "sar radio bowman headset" desc = "A bowman headset for search and rescue." icon_state = "sar_headset_alt" + adhoc_fallback = TRUE + ks2type = /obj/item/encryptionkey/sar diff --git a/maps/southern_cross/job/outfits.dm b/maps/southern_cross/job/outfits.dm index f2ef7db2ee..e9903f57d9 100644 --- a/maps/southern_cross/job/outfits.dm +++ b/maps/southern_cross/job/outfits.dm @@ -19,7 +19,7 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go backpack_contents = list(/obj/item/clothing/accessory/permit/gun/planetside = 1) headset = /obj/item/radio/headset/explorer - headset_alt = /obj/item/radio/headset/explorer + headset_alt = /obj/item/radio/headset/alt/explorer headset_earbud = /obj/item/radio/headset/explorer /decl/hierarchy/outfit/job/explorer2/post_equip(mob/living/carbon/human/H) @@ -54,9 +54,9 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go id_pda_assignment = JOB_PILOT flags = OUTFIT_HAS_BACKPACK|OUTFIT_COMPREHENSIVE_SURVIVAL - headset = /obj/item/radio/headset/pilot/alt - headset_alt = /obj/item/radio/headset/pilot/alt - headset_earbud = /obj/item/radio/headset/pilot/alt + headset = /obj/item/radio/headset/pilot + headset_alt = /obj/item/radio/headset/alt/pilot + headset_earbud = /obj/item/radio/headset/pilot /decl/hierarchy/outfit/job/medical/sar name = OUTFIT_JOB_NAME("Field Medic") //VOREStation Edit @@ -72,5 +72,5 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL|OUTFIT_COMPREHENSIVE_SURVIVAL headset = /obj/item/radio/headset/sar - headset_alt = /obj/item/radio/headset/sar + headset_alt = /obj/item/radio/headset/alt/sar headset_earbud = /obj/item/radio/headset/sar diff --git a/maps/stellar_delight/stellar_delight3.dmm b/maps/stellar_delight/stellar_delight3.dmm index 4a75c43124..2e51d9e544 100644 --- a/maps/stellar_delight/stellar_delight3.dmm +++ b/maps/stellar_delight/stellar_delight3.dmm @@ -1563,7 +1563,6 @@ pixel_y = 12 }, /obj/structure/table/woodentable, -/obj/item/hand_labeler, /obj/machinery/alarm/angled, /obj/machinery/status_display{ pixel_x = -32 @@ -9920,19 +9919,11 @@ icon_state = "0-2" }, /obj/structure/table/woodentable, -/obj/item/reagent_containers/food/drinks/glass2/square{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/glass2/square{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/glass2/square{ - pixel_x = 8; - pixel_y = 8 - }, /obj/item/reagent_containers/glass/rag, +/obj/machinery/chemical_dispenser/bar_syrup/full{ + pixel_y = 11; + pixel_x = -1 + }, /turf/simulated/floor/lino, /area/stellardelight/deck3/cafe) "JJ" = ( @@ -11410,6 +11401,13 @@ /obj/machinery/door/window{ req_one_access = list(25) }, +/obj/machinery/button/remote/blast_door{ + desc = "A remote control-switch for shutters."; + id = "cafe"; + name = "Cafe Shutters"; + pixel_y = 28; + req_one_access = list(25) + }, /turf/simulated/floor/lino, /area/stellardelight/deck3/cafe) "Oz" = ( @@ -14112,13 +14110,18 @@ /turf/simulated/floor, /area/maintenance/stellardelight/deck3/aftstarroom) "Yp" = ( -/obj/machinery/button/remote/blast_door{ - desc = "A remote control-switch for shutters."; - id = "cafe"; - name = "Cafe Shutters"; - pixel_y = 28; - req_one_access = list(25) - }, +/obj/structure/closet/walllocker_double/kitchen/north, +/obj/item/reagent_containers/food/drinks/glass2/square, +/obj/item/reagent_containers/food/drinks/glass2/square, +/obj/item/reagent_containers/food/drinks/glass2/square, +/obj/item/reagent_containers/food/drinks/glass2/square, +/obj/item/hand_labeler, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup_tall, +/obj/item/storage/box/glasses/coffeecup_grande, +/obj/item/storage/box/glasses/coffeecup_venti, /turf/simulated/floor/lino, /area/stellardelight/deck3/cafe) "Ys" = ( diff --git a/maps/stellar_delight/stellar_delight_areas.dm b/maps/stellar_delight/stellar_delight_areas.dm index 8af4a0b4b6..762cb74700 100644 --- a/maps/stellar_delight/stellar_delight_areas.dm +++ b/maps/stellar_delight/stellar_delight_areas.dm @@ -125,13 +125,7 @@ /area/stellardelight/deck1/dorms name = "Dormitory" sound_env = SMALL_SOFTFLOOR - flags = RAD_SHIELDED| BLUE_SHIELDED |AREA_FLAG_IS_NOT_PERSISTENT - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE - forbid_events = TRUE - forbid_singulo = TRUE + flags = RAD_SHIELDED| BLUE_SHIELDED | AREA_FLAG_IS_NOT_PERSISTENT | AREA_FORBID_EVENTS | AREA_FORBID_SINGULO | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/stellardelight/deck1/dorms/dorm1 name = "Dormitory One" @@ -274,21 +268,16 @@ /area/stellardelight/deck3/transitgateway name = "Transit Gateway" - forbid_events = TRUE - forbid_singulo = TRUE + flags = AREA_FORBID_EVENTS | AREA_FORBID_SINGULO + /area/stellardelight/deck3/cryo name = "Cryogenic Storage" - forbid_events = TRUE - forbid_singulo = TRUE + flags = AREA_FORBID_EVENTS | AREA_FORBID_SINGULO /area/stellardelight/deck3/readingroom name = "Reading Rooms" sound_env = SMALL_SOFTFLOOR - flags = RAD_SHIELDED| BLUE_SHIELDED |AREA_FLAG_IS_NOT_PERSISTENT - soundproofed = TRUE - block_suit_sensors = TRUE - block_tracking = TRUE - forbid_events = TRUE + flags = RAD_SHIELDED| BLUE_SHIELDED | AREA_FLAG_IS_NOT_PERSISTENT | AREA_FORBID_EVENTS | AREA_SOUNDPROOF | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/stellardelight/deck3/portdock name = "Port Dock" diff --git a/maps/stellar_delight/stellar_delight_events.dm b/maps/stellar_delight/stellar_delight_events.dm index 9511d67a04..d524b2bfcd 100644 --- a/maps/stellar_delight/stellar_delight_events.dm +++ b/maps/stellar_delight/stellar_delight_events.dm @@ -86,6 +86,7 @@ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 40, list(ASSIGNMENT_SCIENTIST = 40), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 100, list(ASSIGNMENT_ANY = 5), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Lurker", /datum/event/maintenance_lurker, 100, list(ASSIGNMENT_ANY = 5), 0), ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1), diff --git a/maps/submaps/admin_use_vr/event_autonomous_drone.dm b/maps/submaps/admin_use_vr/event_autonomous_drone.dm index 2bdb6e59af..aad643108b 100644 --- a/maps/submaps/admin_use_vr/event_autonomous_drone.dm +++ b/maps/submaps/admin_use_vr/event_autonomous_drone.dm @@ -73,7 +73,7 @@ req_one_access = list() /area/submap/event_autonomous_drone - secret_name = FALSE + flags = RAD_SHIELDED | AREA_FORBID_EVENTS /area/submap/event_autonomous_drone/engineering name = "Engine Bay" diff --git a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm index a710a77fa0..fa5e1482d5 100644 --- a/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm +++ b/maps/submaps/surface_submaps/wilderness/wilderness_areas.dm @@ -1,10 +1,8 @@ /area/submap name = "Submap Area" icon_state = "submap" - flags = RAD_SHIELDED + flags = RAD_SHIELDED | AREA_FORBID_EVENTS | AREA_SECRET_NAME ambience = AMBIENCE_RUINS - secret_name = TRUE - forbid_events = TRUE flags = AREA_FLAG_IS_NOT_PERSISTENT /area/submap/event //To be used for Events not for regular PoIs @@ -210,4 +208,4 @@ /area/submap/drgnplateu name = "POI - Dragon Plateu" - ambience = AMBIENCE_SIF \ No newline at end of file + ambience = AMBIENCE_SIF diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 2768b3e8c6..52a2a55bdc 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -17639,6 +17639,16 @@ /obj/machinery/alarm{ pixel_y = 22 }, +/obj/structure/closet/walllocker_double/kitchen/east, +/obj/item/reagent_containers/food/drinks/glass2/square, +/obj/item/reagent_containers/food/drinks/glass2/square, +/obj/item/reagent_containers/food/drinks/glass2/square, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup, +/obj/item/storage/box/glasses/coffeecup_tall, +/obj/item/storage/box/glasses/coffeecup_grande, +/obj/item/storage/box/glasses/coffeecup_venti, /turf/simulated/floor/tiled, /area/crew_quarters/visitor_dining) "aEb" = ( @@ -18425,24 +18435,16 @@ /area/crew_quarters/visitor_dining) "aFC" = ( /obj/structure/table/marble, -/obj/item/reagent_containers/food/drinks/glass2/square{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/glass2/square{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/glass2/square{ - pixel_x = 8; - pixel_y = 8 - }, /obj/machinery/floor_light/prebuilt{ on = 1 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, +/obj/machinery/chemical_dispenser/bar_syrup/full{ + dir = 8; + pixel_x = 8 + }, /turf/simulated/floor/tiled, /area/crew_quarters/visitor_dining) "aFD" = ( @@ -19024,7 +19026,8 @@ "aGy" = ( /obj/structure/table/marble, /obj/machinery/chemical_dispenser/bar_coffee/full{ - dir = 8 + dir = 8; + pixel_x = 1 }, /obj/machinery/floor_light/prebuilt{ on = 1 diff --git a/maps/tether/tether_areas.dm b/maps/tether/tether_areas.dm index aedc4ef9f7..3087f997c5 100644 --- a/maps/tether/tether_areas.dm +++ b/maps/tether/tether_areas.dm @@ -1000,192 +1000,88 @@ /area/crew_quarters/sleep/maintDorm1 name = "\improper Construction Dorm 1" icon_state = "Sleep" - flags = RAD_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/maintDorm2 name = "\improper Construction Dorm 2" icon_state = "Sleep" - flags = RAD_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/maintDorm3 name = "\improper Construction Dorm 3" icon_state = "Sleep" - flags = RAD_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/maintDorm4 name = "\improper Construction Dorm 4" icon_state = "Sleep" - flags = RAD_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_1 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_2 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_3 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_4 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_5 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_6 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_7 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_8 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_9 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_10 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_11 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/vistor_room_12 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_1 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_2 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_3 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_4 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_5 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_6 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_7 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_8 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_9 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_10 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/Dorm_1/holo name = "\improper Dorm 1 Holodeck" @@ -1207,113 +1103,61 @@ name = "\improper Visitor Lodging 1" icon_state = "dk_yellow" lightswitch = 0 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/spacedorm2 name = "\improper Visitor Lodging 2" icon_state = "dk_yellow" lightswitch = 0 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/spacedorm3 name = "\improper Visitor Lodging 3" icon_state = "dk_yellow" lightswitch = 0 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/crew_quarters/sleep/spacedorm4 name = "\improper Visitor Lodging 4" icon_state = "dk_yellow" lightswitch = 0 - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_basic name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_desert name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_seating name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_beach name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_garden name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_boxing name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_snow name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_space name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/holodeck/holodorm/source_off name = "\improper Holodeck Source" - flags = RAD_SHIELDED | BLUE_SHIELDED - soundproofed = TRUE - limit_mob_size = FALSE - block_suit_sensors = TRUE - block_tracking = TRUE + flags = RAD_SHIELDED | BLUE_SHIELDED | AREA_SOUNDPROOF | AREA_ALLOW_LARGE_SIZE | AREA_BLOCK_SUIT_SENSORS | AREA_BLOCK_TRACKING /area/ai_core_foyer name = "\improper AI Core Access" diff --git a/maps/tether/tether_events.dm b/maps/tether/tether_events.dm index 5ed863881a..543e6002f0 100644 --- a/maps/tether/tether_events.dm +++ b/maps/tether/tether_events.dm @@ -86,6 +86,7 @@ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Drone Pod Drop", /datum/event/drone_pod_drop, 40, list(ASSIGNMENT_SCIENTIST = 40), 1), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/morph_spawn, 75, list(ASSIGNMENT_ANY = 5), 0), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Predator", /datum/event/maintenance_predator, 100, list(ASSIGNMENT_ANY = 5), 0), + new /datum/event_meta(EVENT_LEVEL_MODERATE, "Maintenance Lurker", /datum/event/maintenance_lurker, 100, list(ASSIGNMENT_ANY = 5), 0), ) add_disabled_events(list( new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1), diff --git a/sound/voice/borg_deathsound.ogg b/sound/voice/borg_deathsound.ogg new file mode 100644 index 0000000000..bb11022abe Binary files /dev/null and b/sound/voice/borg_deathsound.ogg differ diff --git a/tgui/packages/common/string.ts b/tgui/packages/common/string.ts index d6f328750c..29dee190f0 100644 --- a/tgui/packages/common/string.ts +++ b/tgui/packages/common/string.ts @@ -130,7 +130,7 @@ export function toTitleCase(str: string): string { return currentStr; } -const TRANSLATE_REGEX = /&(nbsp|amp|quot|lt|gt|apos);/g; +const TRANSLATE_REGEX = /&(nbsp|amp|quot|lt|gt|apos|trade);/g; const TRANSLATIONS = { amp: '&', apos: "'", @@ -138,6 +138,7 @@ const TRANSLATIONS = { lt: '<', nbsp: ' ', quot: '"', + trade: '™', } as const; /** diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerDetails.tsx b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerDetails.tsx index e9e3472a18..8785a46960 100644 --- a/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerDetails.tsx +++ b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerDetails.tsx @@ -19,8 +19,11 @@ export const AppearanceChangerColors = (props) => { ears2_color, tail_color, tail2_color, + tail3_color, wing_color, wing2_color, + wing3_color, + ear_secondary_colors, } = data; return ( @@ -67,13 +70,17 @@ export const AppearanceChangerColors = (props) => { {data.ear_secondary_colors.map((color, index) => ( - + + + + ))} @@ -85,6 +92,12 @@ export const AppearanceChangerColors = (props) => { Change Secondary Tail Color + + + + @@ -95,6 +108,12 @@ export const AppearanceChangerColors = (props) => { Change Secondary Wing Color + + + + ) : null} {change_facial_hair_color ? ( diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/types.ts b/tgui/packages/tgui/interfaces/AppearanceChanger/types.ts index aae93386f1..2140148772 100644 --- a/tgui/packages/tgui/interfaces/AppearanceChanger/types.ts +++ b/tgui/packages/tgui/interfaces/AppearanceChanger/types.ts @@ -42,8 +42,10 @@ export type Data = { ears2_color: string; tail_color: string; tail2_color: string; + tail3_color: string; wing_color: string; wing2_color: string; + wing3_color: string; facial_hair_styles: { facialhairstyle: string }[]; hair_styles: { hairstyle: string }[]; ear_secondary_style: string; diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleAdvanced.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleAdvanced.tsx index 0977fc9d54..15e7f9b2c8 100644 --- a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleAdvanced.tsx +++ b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleAdvanced.tsx @@ -1,6 +1,7 @@ import { useBackend } from '../../backend'; import { Box, Button, Section } from '../../components'; import { StandardControls, StatusDisplay } from './EmbeddedControllerHelpers'; +import { PanelOpen } from './PanelOpen'; import { AirlockConsoleAdvancedData } from './types'; /** @@ -12,8 +13,13 @@ import { AirlockConsoleAdvancedData } from './types'; export const AirlockConsoleAdvanced = (props) => { const { act, data } = useBackend(); - const { external_pressure, chamber_pressure, internal_pressure, processing } = - data; + const { + external_pressure, + chamber_pressure, + internal_pressure, + processing, + panel_open, + } = data; const pressure_range = { external_pressure, @@ -59,27 +65,31 @@ export const AirlockConsoleAdvanced = (props) => { return ( <> -
- - - - - - - - -
+ {panel_open ? ( + + ) : ( +
+ + + + + + + + +
+ )} ); }; diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleSimple.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleSimple.tsx index bed9c73472..c97e0854cc 100644 --- a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleSimple.tsx +++ b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleSimple.tsx @@ -1,6 +1,7 @@ import { useBackend } from '../../backend'; import { Box, Button, Section } from '../../components'; import { StandardControls, StatusDisplay } from './EmbeddedControllerHelpers'; +import { PanelOpen } from './PanelOpen'; import { AirlockConsoleSimpleData } from './types'; /** @@ -12,8 +13,13 @@ import { AirlockConsoleSimpleData } from './types'; export const AirlockConsoleSimple = (props) => { const { act, data } = useBackend(); - const { exterior_status, chamber_pressure, processing, interior_status } = - data; + const { + exterior_status, + chamber_pressure, + processing, + interior_status, + panel_open, + } = data; const status_range = { interior_status, exterior_status }; @@ -37,19 +43,23 @@ export const AirlockConsoleSimple = (props) => { return ( <> -
- - - - -
+ {panel_open ? ( + + ) : ( +
+ + + + +
+ )} ); }; diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/DoorAccessConsole.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/DoorAccessConsole.tsx index 9de6aa36c5..bd4963fde3 100644 --- a/tgui/packages/tgui/interfaces/EmbeddedController/DoorAccessConsole.tsx +++ b/tgui/packages/tgui/interfaces/EmbeddedController/DoorAccessConsole.tsx @@ -1,5 +1,6 @@ import { useBackend } from '../../backend'; import { Button, LabeledList, Section } from '../../components'; +import { PanelOpen } from './PanelOpen'; import { DoorAccessConsoleData } from './types'; /** @@ -9,7 +10,7 @@ import { DoorAccessConsoleData } from './types'; export const DoorAccessConsole = (props) => { const { act, data } = useBackend(); - const { interior_status, exterior_status } = data; + const { interior_status, exterior_status, panel_open } = data; const interiorOpen = interior_status.state === 'open' || exterior_status.state === 'closed'; @@ -17,39 +18,42 @@ export const DoorAccessConsole = (props) => { exterior_status.state === 'open' || interior_status.state === 'closed'; return ( -
- {/* Interior Button */} - - {/* Exterior Button */} - - - } - > - - - {exterior_status.state === 'closed' ? 'Locked' : 'Open'} - - - {interior_status.state === 'closed' ? 'Locked' : 'Open'} - - -
+ <> +
+ {/* Interior Button */} + + {/* Exterior Button */} + + + } + > + + + {exterior_status.state === 'closed' ? 'Locked' : 'Open'} + + + {interior_status.state === 'closed' ? 'Locked' : 'Open'} + + +
+ {!!panel_open && } + ); }; diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/PanelOpen.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/PanelOpen.tsx new file mode 100644 index 0000000000..c02bbb7807 --- /dev/null +++ b/tgui/packages/tgui/interfaces/EmbeddedController/PanelOpen.tsx @@ -0,0 +1,57 @@ +import { round, toFixed } from 'common/math'; +import { useBackend } from 'tgui/backend'; +import { + Box, + Button, + LabeledList, + NumberInput, + Section, +} from 'tgui-core/components'; + +import { PanelOpenData } from './types'; + +export const PanelOpen = (props) => { + const { act, data } = useBackend(); + + const { panel_open, tags, frequency, min_freq, max_freq } = data; + + if (!panel_open || !tags) { + return null; + } + + return ( +
+ + + toFixed(val, 1)} + onDrag={(freq) => + act('set_frequency', { freq: round(freq * 10, 0) }) + } + /> + + {Object.entries(tags).map(([tag, value]) => ( + act('edit_tag', { tag })}> + Edit + + } + > + {value || Unset} + + ))} + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/index.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/index.tsx index eb4504e351..e7f289bd1c 100644 --- a/tgui/packages/tgui/interfaces/EmbeddedController/index.tsx +++ b/tgui/packages/tgui/interfaces/EmbeddedController/index.tsx @@ -98,7 +98,7 @@ export const EmbeddedController = (props) => { } return ( - + {Component} ); diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/types.ts b/tgui/packages/tgui/interfaces/EmbeddedController/types.ts index d6b9c37487..fc343d0a63 100644 --- a/tgui/packages/tgui/interfaces/EmbeddedController/types.ts +++ b/tgui/packages/tgui/interfaces/EmbeddedController/types.ts @@ -44,7 +44,7 @@ export type AirlockConsoleAdvancedData = { purge: BooleanLike; secure: BooleanLike; internalTemplateName: string; -}; +} & PanelOpenData; export type AirlockConsoleSimpleData = { chamber_pressure: number; @@ -52,7 +52,7 @@ export type AirlockConsoleSimpleData = { interior_status: status; processing: BooleanLike; internalTemplateName: string; -}; +} & PanelOpenData; export type AirlockConsolePhoronData = { chamber_pressure: number; @@ -68,7 +68,7 @@ export type DoorAccessConsoleData = { interior_status: status; processing: BooleanLike; internalTemplateName: string; -}; +} & PanelOpenData; export type EscapePodConsoleData = { docking_status: string; @@ -80,3 +80,11 @@ export type EscapePodConsoleData = { }; export type status = { state: string; lock: string }; + +export type PanelOpenData = { + panel_open: BooleanLike; + tags: Record | null; + frequency: number; + min_freq: number; + max_freq: number; +}; diff --git a/tgui/packages/tgui/interfaces/PanDEMIC.tsx b/tgui/packages/tgui/interfaces/PanDEMIC.tsx index ff8c718529..967486a8c9 100644 --- a/tgui/packages/tgui/interfaces/PanDEMIC.tsx +++ b/tgui/packages/tgui/interfaces/PanDEMIC.tsx @@ -185,7 +185,10 @@ const StrainInformationSection = ({ {selectedStrain && selectedStrain.symptoms.length > 0 && ( - + <> + + + )} ); @@ -220,6 +223,39 @@ const StrainSymptomsSection = ({ strain }: { strain: Strain }) => { ); }; +const TotalStats = ({ strain }: { strain: Strain }) => { + const symptoms = strain.symptoms; + + const TotalStats = symptoms.reduce( + (totals, symptom) => ({ + stealth: totals.stealth + symptom.stealth, + resistance: totals.resistance + symptom.resistance, + stageSpeed: totals.stageSpeed + symptom.stageSpeed, + transmissibility: totals.transmissibility + symptom.transmissibility, + }), + { stealth: 0, resistance: 0, stageSpeed: 0, transmissibility: 0 }, + ); + + return ( +
+ + + Stealth + Resistance + Stage Speed + Transmissibility + + + {TotalStats.stealth} + {TotalStats.resistance} + {TotalStats.stageSpeed} + {TotalStats.transmissibility} + +
+
+ ); +}; + const StrainInformation = ({ strain, strainIndex, diff --git a/tgui/packages/tgui/interfaces/Wires.tsx b/tgui/packages/tgui/interfaces/Wires.tsx index e197b96618..7b771bf394 100644 --- a/tgui/packages/tgui/interfaces/Wires.tsx +++ b/tgui/packages/tgui/interfaces/Wires.tsx @@ -1,10 +1,9 @@ import { BooleanLike } from 'common/react'; +import { useBackend } from 'tgui/backend'; +import { Window } from 'tgui/layouts'; +import { Box, Button, LabeledList, Section } from 'tgui-core/components'; -import { useBackend } from '../backend'; -import { Box, Button, LabeledList, Section } from '../components'; -import { Window } from '../layouts'; - -type Data = { +export type WireData = { wires: { seen_color: string; color_name: string; @@ -17,71 +16,88 @@ type Data = { }; export const Wires = (props) => { - const { act, data } = useBackend(); + const { data } = useBackend(); + const { wires = [] } = data; + + return ( + + + + + + + ); +}; + +export const WiresWires = (props) => { + const { act, data } = useBackend(); const { wires = [] } = data; const statuses = data.status || []; return ( - - -
- - {wires.map((wire) => ( - - - - - - } - > - {!!wire.wire && ({wire.wire})} - - ))} - -
- - {!!statuses.length && ( -
- {statuses.map((status) => ( - - {status} - - ))} -
- )} -
-
+
+ + {wires.map((wire) => ( + + + + + + } + > + {!!wire.wire && ({wire.wire})} + + ))} + +
); }; + +export const WiresStatus = (props) => { + const { act, data } = useBackend(); + + const { wires = [] } = data; + const statuses = data.status || []; + + return statuses.length ? ( +
+ {statuses.map((status) => ( + + {status} + + ))} +
+ ) : null; +}; diff --git a/tgui/packages/tgui/interfaces/WiresAirlock.tsx b/tgui/packages/tgui/interfaces/WiresAirlock.tsx new file mode 100644 index 0000000000..eda4886a3b --- /dev/null +++ b/tgui/packages/tgui/interfaces/WiresAirlock.tsx @@ -0,0 +1,81 @@ +import { round } from 'common/math'; +import { useBackend } from 'tgui/backend'; +import { Window } from 'tgui/layouts'; +import { + Box, + Button, + LabeledList, + NumberInput, + Section, +} from 'tgui-core/components'; + +import { WireData, WiresStatus, WiresWires } from './Wires'; + +type WiresAirlockData = WireData & { + id_tag: string; + frequency: number | null; + min_freq: number; + max_freq: number; +}; + +export const WiresAirlock = (props) => { + const { act, data } = useBackend(); + const { wires = [], id_tag, frequency, min_freq, max_freq } = data; + + return ( + + +
+ + act('set_id_tag')}> + Edit + + } + > + {id_tag || None Set} + + act('clear_frequency')}> + Clear + + ) : null + } + > + {frequency ? ( + val.toFixed(1)} + onChange={(freq) => + act('set_frequency', { freq: round(freq * 10, 0) }) + } + /> + ) : ( + + )} + + +
+ + +
+
+ ); +}; diff --git a/vorestation.dme b/vorestation.dme index 335561163b..5d5ff71455 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -141,6 +141,7 @@ #include "code\__defines\statpanel.dm" #include "code\__defines\subsystems.dm" #include "code\__defines\supply.dm" +#include "code\__defines\talksounds.dm" #include "code\__defines\targeting.dm" #include "code\__defines\text.dm" #include "code\__defines\tgs.config.dm" @@ -474,13 +475,16 @@ #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\appendicitis.dm" #include "code\datums\diseases\beesease.dm" #include "code\datums\diseases\brainrot.dm" #include "code\datums\diseases\choreomania.dm" #include "code\datums\diseases\cold.dm" #include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\fake_gbs.dm" #include "code\datums\diseases\flu.dm" #include "code\datums\diseases\food_poisoning.dm" +#include "code\datums\diseases\gbs.dm" #include "code\datums\diseases\lycancoughy.dm" #include "code\datums\diseases\magnitis.dm" #include "code\datums\diseases\advance\advance.dm" @@ -489,23 +493,30 @@ #include "code\datums\diseases\advance\symptoms\confusion.dm" #include "code\datums\diseases\advance\symptoms\cough.dm" #include "code\datums\diseases\advance\symptoms\damage_converter.dm" +#include "code\datums\diseases\advance\symptoms\deafness.dm" #include "code\datums\diseases\advance\symptoms\dizzy.dm" #include "code\datums\diseases\advance\symptoms\fever.dm" #include "code\datums\diseases\advance\symptoms\fire.dm" #include "code\datums\diseases\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\advance\symptoms\flip.dm" +#include "code\datums\diseases\advance\symptoms\hair.dm" #include "code\datums\diseases\advance\symptoms\hallucigen.dm" #include "code\datums\diseases\advance\symptoms\headache.dm" #include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\hematophagy.dm" #include "code\datums\diseases\advance\symptoms\itching.dm" #include "code\datums\diseases\advance\symptoms\language.dm" #include "code\datums\diseases\advance\symptoms\macrophage.dm" #include "code\datums\diseases\advance\symptoms\mlem.dm" #include "code\datums\diseases\advance\symptoms\necrotic_agent.dm" -#include "code\datums\diseases\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\advance\symptoms\photosensitivity.dm" +#include "code\datums\diseases\advance\symptoms\pica.dm" #include "code\datums\diseases\advance\symptoms\sensory.dm" #include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\size.dm" #include "code\datums\diseases\advance\symptoms\sneeze.dm" #include "code\datums\diseases\advance\symptoms\spin.dm" +#include "code\datums\diseases\advance\symptoms\stimulant.dm" #include "code\datums\diseases\advance\symptoms\symptoms.dm" #include "code\datums\diseases\advance\symptoms\synthetic_infection.dm" #include "code\datums\diseases\advance\symptoms\telepathy.dm" @@ -1102,6 +1113,7 @@ #include "code\game\machinery\embedded_controller\airlock_docking_controller.dm" #include "code\game\machinery\embedded_controller\airlock_docking_controller_multi.dm" #include "code\game\machinery\embedded_controller\airlock_program.dm" +#include "code\game\machinery\embedded_controller\construction.dm" #include "code\game\machinery\embedded_controller\docking_program.dm" #include "code\game\machinery\embedded_controller\docking_program_multi.dm" #include "code\game\machinery\embedded_controller\embedded_controller_base.dm" @@ -1507,6 +1519,7 @@ #include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\pacman.dm" +#include "code\game\objects\items\weapons\circuitboards\machinery\pandemic.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\power.dm" #include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm" @@ -2284,6 +2297,7 @@ #include "code\modules\clothing\spacesuits\rig\rig_verbs.dm" #include "code\modules\clothing\spacesuits\rig\rig_wiring.dm" #include "code\modules\clothing\spacesuits\rig\modules\modules.dm" +#include "code\modules\clothing\spacesuits\rig\modules\protean.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\ai_container.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\chem_dispenser.dm" #include "code\modules\clothing\spacesuits\rig\modules\specific\cleaner_launcher.dm" @@ -2490,6 +2504,7 @@ #include "code\modules\events\infestation.dm" #include "code\modules\events\ion_storm.dm" #include "code\modules\events\jellyfish_migration.dm" +#include "code\modules\events\maint_lurker.dm" #include "code\modules\events\maintenance_predator_vr.dm" #include "code\modules\events\meteor_strike_vr.dm" #include "code\modules\events\meteors.dm" @@ -3174,6 +3189,8 @@ #include "code\modules\mob\living\carbon\human\species\station\protean_vr\_protean_defines.dm" #include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_blob.dm" #include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_powers.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_rig.dm" +#include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_rig_tgui.dm" #include "code\modules\mob\living\carbon\human\species\station\protean_vr\protean_species.dm" #include "code\modules\mob\living\carbon\human\species\station\traits_vr\_traits.dm" #include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" @@ -3641,7 +3658,6 @@ #include "code\modules\nifsoft\nif_softshop.dm" #include "code\modules\nifsoft\nif_tgui.dm" #include "code\modules\nifsoft\nifsoft.dm" -#include "code\modules\nifsoft\nifsoft_vr.dm" #include "code\modules\nifsoft\software\01_vision.dm" #include "code\modules\nifsoft\software\05_health.dm" #include "code\modules\nifsoft\software\06_screens.dm" @@ -3942,7 +3958,6 @@ #include "code\modules\projectiles\guns\magnetic\magnetic.dm" #include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" #include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" -#include "code\modules\projectiles\guns\magnetic\magnetic_railgun_vr.dm" #include "code\modules\projectiles\guns\projectile\altevian_vr.dm" #include "code\modules\projectiles\guns\projectile\automatic.dm" #include "code\modules\projectiles\guns\projectile\automatic_vr.dm"