From b885f33aeb23ac804baa8c6c2728d599acb6333a Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Thu, 9 Mar 2023 02:26:01 +0000 Subject: [PATCH 01/31] NIF repair minitweak --- code/modules/nifsoft/nif.dm | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm index 2f8573dbd0c..55cd68741ed 100644 --- a/code/modules/nifsoft/nif.dm +++ b/code/modules/nifsoft/nif.dm @@ -44,7 +44,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable var/tmp/stat = NIF_PREINSTALL // Status of the NIF var/tmp/install_done // Time when install will finish - var/tmp/open = FALSE // If it's open for maintenance (1-3) + var/tmp/open = FALSE // If it's open for maintenance (1-2) var/tmp/should_be_in = BP_HEAD // Organ we're supposed to be held in var/obj/item/device/communicator/commlink/comm // The commlink requires this @@ -230,22 +230,24 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable if(C.get_amount() < 3) to_chat(user,"You need at least three coils of wire to add them to \the [src].") return + if(durability >= initial(durability)) + to_chat(user,"There's no damaged wiring that needs replacing!") + return if(do_after(user, 6 SECONDS, src) && open == 1 && C.use(3)) - user.visible_message("[user] replaces some wiring in \the [src].","You replace any burned out wiring in \the [src].") + user.visible_message("[user] replaces some wiring in \the [src].","You replace some of the burned out wiring in \the [src].") playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) + repair(initial(durability)) + update_icon() + else if(open == 1 && istype(W,/obj/item/device/multitool)) + if(do_after(user, 8 SECONDS, src) && open == 1) + user.visible_message("[user] resets several circuits in \the [src].","You find and repair any faulty circuits in \the [src].") open = 2 update_icon() - else if(open == 2 && istype(W,/obj/item/device/multitool)) - if(do_after(user, 8 SECONDS, src) && open == 2) - user.visible_message("[user] resets several circuits in \the [src].","You find and repair any faulty circuits in \the [src].") - open = 3 - update_icon() - else if(open == 3 && W.is_screwdriver()) - if(do_after(user, 3 SECONDS, src) && open == 3) + else if(open == 2 && W.is_screwdriver()) + if(do_after(user, 3 SECONDS, src) && open == 2) user.visible_message("[user] closes up \the [src].","You re-seal \the [src] for use once more.") playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) open = FALSE - repair(initial(durability)) stat = NIF_PREINSTALL update_icon() From 64016db1b00f682b7d27452dcef1c3e7c5f54e43 Mon Sep 17 00:00:00 2001 From: Youtubeboy139 Date: Fri, 2 Jun 2023 01:19:53 -0400 Subject: [PATCH 02/31] New Suit Cooler Sprite --- .../objects/items/devices/suit_cooling.dm | 32 ++++++++++++++---- icons/obj/suit_cooler.dmi | Bin 0 -> 933 bytes 2 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 icons/obj/suit_cooler.dmi diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 0e87e867c52..d5baa6516b4 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -2,8 +2,9 @@ name = "portable suit cooling unit" desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling." w_class = ITEMSIZE_LARGE - icon = 'icons/obj/device.dmi' + icon = 'icons/obj/suit_cooler.dmi' icon_state = "suitcooler0" + item_state = "coolingpack" slot_flags = SLOT_BACK //copied from tank.dm @@ -171,13 +172,32 @@ return ..() /obj/item/device/suit_cooling_unit/proc/updateicon() - if (cover_open) - if (cell) + cut_overlays() + if(cover_open) + if(cell) icon_state = "suitcooler1" else icon_state = "suitcooler2" - else - icon_state = "suitcooler0" + return + + icon_state = "suitcooler0" + + if(!cell || !on) + return + + switch(round(cell.percent())) + if(86 to INFINITY) + add_overlay("battery-0") + if(69 to 85) + add_overlay("battery-1") + if(52 to 68) + add_overlay("battery-2") + if(35 to 51) + add_overlay("battery-3") + if(18 to 34) + add_overlay("battery-4") + if(-INFINITY to 17) + add_overlay("battery-5") /obj/item/device/suit_cooling_unit/examine(mob/user) . = ..() @@ -218,7 +238,7 @@ /obj/item/device/suit_cooling_unit/emergency/attackby(obj/item/weapon/W as obj, mob/user as mob) if (W.is_screwdriver()) - to_chat(user, "This model has the cell permanently installed!") + to_chat(user, "This cooler's cell is permanently installed!") return return ..() diff --git a/icons/obj/suit_cooler.dmi b/icons/obj/suit_cooler.dmi new file mode 100644 index 0000000000000000000000000000000000000000..92f97ef8a627c733f9a2a30388aa5fb03742a62f GIT binary patch literal 933 zcmV;W16urvP)pXHS=xm(0w}(z8K5MKrm& zxidLIA3YyJLPDc{C3rw4HWL`RTrcmn6h0dvz`(#)5D+a^h2}{~oH{y%uHIRJuM#_I z7Z@g2TxKyjMa0I;j+35p9mNX(0004WQchCV=- z0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zi zl2jm5skk(=Bso7nC$-2xiHkEOv#1y-YRJWzR+N~V3SnbWYe<4xBZ6v^5=%-_iz;;q zy8xz=u>CNV#M^F6v`Q1ARhnW~35<-C)SSdhkgyJtwp2u@;j%(m!PU zw9LZ*00JdRL_t(&f$fi_@3_U^ziZ{a))Yi1uDWae$$ zhrOd_Gl~R3_$xpJ07$0@>EiskkAPBuN}+x~f9@lI2xO1?{rtI)!05`}!Fb{>&@1;5 zxNrwBPWHrj_Pi5>IK8e&V>tQ*y0IIqxWUu&ZUH0#(B**y@VEftEl%%;RK1gEQBRELUy;XbLc!>}g6o@taURD|)e;uv?&Np<5tsaC)w3Ujh ziBAEb!<+(gAAznGCzxVNFK&rib033h3z%Q$j=WhQAnz79z**pXj|AjC3i}Q?<2b4R zRwQvq-kato4axfpGziHBK@bE%5Cp*kJ38|J-N*>{&`{?(&DcE85pz1R0(N+QWPf0> zSiEE{0w&E~GA^Ht^L$LluL@)fz5^sMp@Z*$T>^fv)Jwn)P9~=`v>NGkpDZSyJ7yVm-J)u|8yYfu9U5uqh82UVxT=yL-2X-VQ;Z zqKEgk`JMk#G1{z)a#tIaMc^K=(>p)Ew+WO5bzo~9=sHkfVvbOOU2PC7fM$Mw<(Gi} zV%2ou3-my5!m0z?UGOICBXH@*Fxnh4czr<-gkZh^xz0IQ`u-Zl00000NkvXX Hu0mjfY>< Date: Sat, 3 Jun 2023 14:32:16 -0400 Subject: [PATCH 03/31] Lighters and Cigs sprite revivals --- code/game/objects/items/contraband_vr.dm | 12 -- .../objects/items/weapons/cigs_lighters.dm | 161 ++++++++++++------ .../objects/items/weapons/storage/fancy.dm | 31 +++- code/game/objects/random/misc_vr.dm | 2 +- code/modules/economy/vending_machines.dm | 4 +- icons/obj/cigarettes.dmi | Bin 5114 -> 5640 bytes icons/obj/lighters.dmi | Bin 0 -> 12622 bytes icons/obj/zippo.dmi | Bin 10886 -> 0 bytes 8 files changed, 143 insertions(+), 67 deletions(-) create mode 100644 icons/obj/lighters.dmi delete mode 100644 icons/obj/zippo.dmi diff --git a/code/game/objects/items/contraband_vr.dm b/code/game/objects/items/contraband_vr.dm index 67377884864..804dd4b554d 100644 --- a/code/game/objects/items/contraband_vr.dm +++ b/code/game/objects/items/contraband_vr.dm @@ -92,18 +92,6 @@ to_chat(user, "You unwrap the package.") qdel(src) -/obj/item/weapon/storage/fancy/cigar/havana // Putting this here 'cuz fuck it. -Spades - name = "\improper Havana cigar case" - desc = "Save these for the fancy-pantses at the next CentCom black tie reception. You can't blow the smoke from such majestic stogies in just anyone's face." - icon_state = "cigarcase" - icon = 'icons/obj/cigarettes.dmi' - w_class = ITEMSIZE_TINY - throwforce = 2 - slot_flags = SLOT_BELT - storage_slots = 7 - can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar/havana) - icon_type = "cigar" - /obj/item/weapon/miscdisc name = "strange artefact" desc = "A large disc-shaped item, with a red, opaque crystal embedded in the center. It is some what heavy. There are indentations along the ring of the disc. Alien scripture lines the disc." diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index d85e21ae1c1..3d252a03a6a 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -335,7 +335,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar name = "premium cigar" desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!" - description_fluff = "While the label does say that this is a 'premium cigar', it really cannot match other types of cigars on the market. Is it a quality cigarette? Perhaps. Was it hand-made with care? No." + description_fluff = "While the label does say that this is a 'premium cigar', it \ + really cannot match other types of cigars on the market. Is it a quality \ + cigarette? Perhaps. Was it hand-made with care? No." icon_state = "cigar2" type_butt = /obj/item/trash/cigbutt/cigarbutt throw_speed = 0.5 @@ -353,14 +355,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba name = "\improper Cohiba Robusto cigar" desc = "There's little more you could want from a cigar." - description_fluff = "Cohiba has been a popular cigar company for centuries. They are still based out of Cuba and refuse to expand and therefore have a very limited quantity, making their cigars coveted all through known space. Robusto is one of their most popular shapes of cigars." + description_fluff = "Cohiba has been a popular cigar company for centuries. \ + They are still based out of Cuba and refuse to expand and therefore have a very \ + limited quantity, making their cigars coveted all through known space. Robusto \ + is one of their most popular shapes of cigars." icon_state = "cigar2" nicotine_amt = 7 /obj/item/clothing/mask/smokable/cigarette/cigar/havana name = "premium Havanian cigar" - desc = "A cigar fit for only the best of the best." - description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers and produced galaxy-wide. While this way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars." + desc = "Save these for the fancy-pantses at the next CentCom black tie reception. \ + You can't blow the smoke from such majestic stogies in just anyone's face." + description_fluff = "'Havanian' is an umbrella term for any cigar made in the \ + typical handmade style of Cuba. This particular cigar is from Gilthari's cigar \ + manufacturers and produced galaxy-wide. While this way of making quality cigars \ + has become slightly bastardized over the years, overall quality has remained \ + relatively the same, even if there is a large quantity of 'Havanian' cigars." icon_state = "cigar2" max_smoketime = 7200 smoketime = 7200 @@ -400,7 +410,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/pipe name = "smoking pipe" desc = "A pipe, for smoking. Made of fine, stained cherry wood." - description_fluff = "ClassiCo Accessories and Haberdashers, originating out of Mars, claim to produce products 'for the modern gentlefolk'. Most of their items are high-end and expensive, but they pledge to back their prices up with quality, and usually do." + description_fluff = "ClassiCo Accessories and Haberdashers, originating out of Mars, \ + claim to produce products 'for the modern gentlefolk'. Most of their items are high-end \ + and expensive, but they pledge to back their prices up with quality, and usually do." icon_state = "pipe" item_state = "pipe" smoketime = 0 @@ -507,7 +519,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/weapon/reagent_containers/rollingpaper name = "rolling paper" desc = "A small, thin piece of easily flammable paper, commonly used for rolling and smoking various dried plants." - description_fluff = "The legalization of certain substances propelled the sale of rolling papers through the roof. Now almost every Trans-stellar produces a variety, often of questionable quality." + description_fluff = "The legalization of certain substances propelled the sale of rolling \ + papers through the roof. Now almost every Trans-stellar produces a variety, often of questionable quality." icon = 'icons/obj/cigarettes.dmi' icon_state = "cig paper" volume = 25 @@ -555,77 +568,85 @@ CIGARETTE PACKETS ARE IN FANCY.DM qdel(src) ///////// -//ZIPPO// +//CHEAP// ///////// /obj/item/weapon/flame/lighter name = "cheap lighter" desc = "A cheap-as-free lighter." - description_fluff = "The 'hand-made in Altair' sticker underneath is a charming way of saying 'Made with prison labour'. It's no wonder the company can sell these things so cheap." - icon = 'icons/obj/items.dmi' - icon_state = "lighter-g" - item_state = "lighter-g" + description_fluff = "The 'hand-made in Altair' sticker underneath is a charming way of \ + saying 'Made with prison labour'. It's no wonder the company can sell these things so cheap." + icon = 'icons/obj/lighters.dmi' + icon_state = "lighter" + item_state = "lighter" w_class = ITEMSIZE_TINY throwforce = 4 slot_flags = SLOT_BELT attack_verb = list("burnt", "singed") var/base_state + /// Sounds var/activation_sound = 'sound/items/lighter_on.ogg' var/deactivation_sound = 'sound/items/lighter_off.ogg' + /// Color of the flame and how big the flame is (pulled from Welder code) + var/flame_color = "#FF9933" + var/flame_intensity = 2 + /// Color List + var/random_color = FALSE + var/available_colors = list(COLOR_ASSEMBLY_BLACK, + COLOR_ASSEMBLY_BGRAY, + COLOR_ASSEMBLY_WHITE, + COLOR_ASSEMBLY_RED, + COLOR_ASSEMBLY_ORANGE, + COLOR_ASSEMBLY_BEIGE, + COLOR_ASSEMBLY_BROWN, + COLOR_ASSEMBLY_GOLD, + COLOR_ASSEMBLY_YELLOW, + COLOR_ASSEMBLY_GURKHA, + COLOR_ASSEMBLY_LGREEN, + COLOR_ASSEMBLY_GREEN, + COLOR_ASSEMBLY_LBLUE, + COLOR_ASSEMBLY_BLUE, + COLOR_ASSEMBLY_PURPLE, + COLOR_ASSEMBLY_HOT_PINK) -/obj/item/weapon/flame/lighter/zippo - name = "\improper Zippo lighter" - desc = "The zippo." - description_fluff = "Still going after all these years." - icon = 'icons/obj/zippo.dmi' - icon_state = "zippo" - item_state = "zippo" - activation_sound = 'sound/items/zippo_on.ogg' - deactivation_sound = 'sound/items/zippo_off.ogg' - +// TODO: Remove this path from POIs and loose maps (it's no longer needed) /obj/item/weapon/flame/lighter/random -/obj/item/weapon/flame/lighter/random/New() - icon_state = "lighter-[pick("r","c","y","g")]" - item_state = icon_state - base_state = icon_state + +// Randomizes Cheap Lighters on Spawn +/obj/item/weapon/flame/lighter/Initialize() + . = ..() + var/image/I = image(icon, "lighter-[pick("trans","tall","matte")]") + I.color = pick(available_colors) + add_overlay(I) /obj/item/weapon/flame/lighter/attack_self(mob/living/user) - if(!base_state) - base_state = icon_state if(!lit) lit = 1 - icon_state = "[base_state]on" - item_state = "[base_state]on" + icon_state = "lighteron" playsound(src, activation_sound, 75, 1) - if(istype(src, /obj/item/weapon/flame/lighter/zippo) ) - user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.") + if(prob(95)) + user.visible_message("After a few attempts, [user] manages to light the [src].") else - if(prob(95)) - user.visible_message("After a few attempts, [user] manages to light the [src].") + to_chat(user, "You burn yourself while lighting the lighter.") + if (user.get_left_hand() == src) + user.apply_damage(2,BURN,"l_hand") else - to_chat(user, "You burn yourself while lighting the lighter.") - if (user.get_left_hand() == src) - user.apply_damage(2,BURN,"l_hand") - else - user.apply_damage(2,BURN,"r_hand") - user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") + user.apply_damage(2,BURN,"r_hand") + user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.") - set_light(2) + set_light(2, 0.5, "#FF9933") START_PROCESSING(SSobj, src) + update_icon() else lit = 0 - icon_state = "[base_state]" - item_state = "[base_state]" + icon_state = "lighter" playsound(src, deactivation_sound, 75, 1) - if(istype(src, /obj/item/weapon/flame/lighter/zippo) ) - user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.") - else - user.visible_message("[user] quietly shuts off the [src].") + user.visible_message("[user] quietly shuts off the [src].") set_light(0) STOP_PROCESSING(SSobj, src) + update_icon() return - /obj/item/weapon/flame/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M, /mob)) return @@ -652,6 +673,45 @@ CIGARETTE PACKETS ARE IN FANCY.DM location.hotspot_expose(700, 5) return +///////// +//ZIPPO// +///////// +/obj/item/weapon/flame/lighter/zippo + name = "\improper Zippo lighter" + desc = "The zippo." + description_fluff = "Still going after all these years." + icon_state = "zippo" + item_state = "zippo" + activation_sound = 'sound/items/zippo_on.ogg' + deactivation_sound = 'sound/items/zippo_off.ogg' + +/obj/item/weapon/flame/lighter/zippo/Initialize() + . = ..() + cut_overlays() //Prevents the Cheap Lighter overlay from appearing on this + +/obj/item/weapon/flame/lighter/zippo/attack_self(mob/living/user) + if(!base_state) + base_state = icon_state + if(!lit) + lit = 1 + icon_state = "[base_state]on" + item_state = "[base_state]on" + playsound(src, activation_sound, 75, 1) + user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.") + + set_light(2, 0.5, "#FF9933") + START_PROCESSING(SSobj, src) + else + lit = 0 + icon_state = "[base_state]" + item_state = "[base_state]" + playsound(src, deactivation_sound, 75, 1) + user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.") + + set_light(0) + STOP_PROCESSING(SSobj, src) + return + //Here we add Zippo skins. /obj/item/weapon/flame/lighter/zippo/black @@ -708,4 +768,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/weapon/flame/lighter/zippo/rainbow name = "\improper rainbow Zippo lighter" - icon_state = "rainbowzippo" \ No newline at end of file + icon_state = "rainbowzippo" + +/obj/item/weapon/flame/lighter/zippo/skull + name = "\improper badass Zippo lighter" + desc = "An absolutely badass zippo lighter. Just look at that skull!" + icon_state = "skullzippo" \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index b18180c3524..639bd175a47 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -385,16 +385,18 @@ /obj/item/weapon/storage/fancy/cigar name = "cigar case" desc = "A case for holding your cigars when you are not smoking them." - description_fluff = "The tastefully engraved palm tree tells you that these 'Palma Grande' premium cigars are only sold on the luxury cruises and resorts of Oasis, though ten separate companies produce them for that purpose galaxy-wide. The standard is however very high." + description_fluff = "The tasteful stained palm case tells you that these 'Palma Grande' premium \ + cigars are only sold on the luxury cruises and resorts of Oasis, though ten separate companies \ + produce them for that purpose galaxy-wide. The standard is however very high." icon_state = "cigarcase" icon = 'icons/obj/cigarettes.dmi' w_class = ITEMSIZE_TINY throwforce = 2 slot_flags = SLOT_BELT - storage_slots = 7 + storage_slots = 5 can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/trash/cigbutt/cigarbutt) icon_type = "cigar" - starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 8) + starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 5) /obj/item/weapon/storage/fancy/cigar/Initialize() . = ..() @@ -419,7 +421,7 @@ if(open) icon_state = open_state if(contents.len >= 1) - add_overlay("cigarcase[contents.len]") + add_overlay("[initial(icon_state)][contents.len]") else icon_state = closed_state @@ -435,6 +437,27 @@ update_icon() ..() +/obj/item/weapon/storage/fancy/cigar/choiba + name = "/improper Choiba cigar case" + desc = "A fancy case for holding your cigars when you are not smoking them." + description_fluff = "The exquisite wooden case bears the markings of the \ + Choiba cigar company based out of Cuba. The perfectly humidized case keeps \ + the companies signature Cigars in premium condidtion even when traveling \ + long distances within a vacuume. The custom case itself can sell for quite \ + a lot in some places." + icon_state = "cohibacase" + icon = 'icons/obj/cigarettes.dmi' + icon_type = "cigar" + starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba = 5) + +/obj/item/weapon/storage/fancy/cigar/havana + name = "\improper Havana cigar case" + desc = "A fancy case for holding your cigars when you are not smoking them." + icon_state = "havanacase" + icon = 'icons/obj/cigarettes.dmi' + icon_type = "cigar" + starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar/havana = 5) + /* * Tobacco Bits */ diff --git a/code/game/objects/random/misc_vr.dm b/code/game/objects/random/misc_vr.dm index c6c2ec106bf..ecd7468d132 100644 --- a/code/game/objects/random/misc_vr.dm +++ b/code/game/objects/random/misc_vr.dm @@ -189,7 +189,7 @@ prob(1);/obj/random/thermalponcho, prob(5);/obj/random/contraband, prob(5);/obj/random/cargopod, - prob(1);/obj/item/weapon/flame/lighter/random, + prob(1);/obj/item/weapon/flame/lighter, prob(1);/obj/item/weapon/storage/wallet/random, prob(1);/obj/random/cutout) diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 0011b4fbcc2..c237d682b5d 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -334,7 +334,7 @@ /obj/item/weapon/storage/chewables/tobacco = 5, /obj/item/weapon/storage/chewables/tobacco/fine = 5, /obj/item/weapon/storage/box/matches = 10, - /obj/item/weapon/flame/lighter/random = 4, + /obj/item/weapon/flame/lighter = 4, /obj/item/clothing/mask/smokable/ecig/util = 2, ///obj/item/clothing/mask/smokable/ecig/deluxe = 2, /obj/item/clothing/mask/smokable/ecig/simple = 2, @@ -363,7 +363,7 @@ /obj/item/weapon/storage/chewables/tobacco = 10, /obj/item/weapon/storage/chewables/tobacco/fine = 20, /obj/item/weapon/storage/box/matches = 1, - /obj/item/weapon/flame/lighter/random = 2, + /obj/item/weapon/flame/lighter/ = 2, /obj/item/clothing/mask/smokable/ecig/util = 100, ///obj/item/clothing/mask/smokable/ecig/deluxe = 300, /obj/item/clothing/mask/smokable/ecig/simple = 150, diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index da355f3e97a3afc174ab71be4bd583eddb40121a..3237f3ce071db446441ea67ee405ca79385d3273 100644 GIT binary patch literal 5640 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 Zpk-`+7vJmD9{eo?3@@ALmFZxk{|9mJ&2#_& literal 5114 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 m13GU@w*PMS^*KvHIgkdRbVK+qu+P`W{4XbI_* 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 W!<%pO_kin50bNZ)jRG~B;Qs^H*EdxF From 9b6d00c625630af24a3ae34b0fff294901778fa6 Mon Sep 17 00:00:00 2001 From: Killian <49700375+KillianKirilenko@users.noreply.github.com> Date: Sun, 4 Jun 2023 10:03:15 +0100 Subject: [PATCH 04/31] spacetraffic revisions --- code/modules/busy_space_vr/air_traffic.dm | 300 +++++++++++--------- code/modules/busy_space_vr/organizations.dm | 160 +++++++---- 2 files changed, 262 insertions(+), 198 deletions(-) diff --git a/code/modules/busy_space_vr/air_traffic.dm b/code/modules/busy_space_vr/air_traffic.dm index d353522d962..a261b56d864 100644 --- a/code/modules/busy_space_vr/air_traffic.dm +++ b/code/modules/busy_space_vr/air_traffic.dm @@ -60,7 +60,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller /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(5 SECONDS) + sleep(rand(3,6) 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() @@ -110,14 +110,14 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller 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_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. + 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",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed",300;"slogan") + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",50;"slogan",25;"civvieleaks") else if((org_type == "government" || org_type == "neutral" || org_type == "military")) - chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed") + chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",25;"civvieleaks") else if(org_type == "spacer") - chatter_type = pick(5;"emerg",15;"policescan",15;"traveladvisory",5;"pathwarning",10;"dockingrequestgeneric",30;"dockingrequestdenied",10;"dockingrequestdelayed",30;"dockingrequestsupplly",10;"dockingrequestrepair",20;"dockingrequestmedical",20;"dockingrequestsecurity",30;"undockingrequest","normal",10;"undockingdenied",30;"undockingdelayed") + chatter_type = pick(5;"emerg",15;"policescan",15;"traveladvisory",5;"pathwarning",150;"dockingrequestgeneric",30;"undockingrequest","normal",10;"undockingdenied",25;"civvieleaks") //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 @@ -129,14 +129,14 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller 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_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate")) //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",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal") + 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",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",80;"sdfbeginpatrol","normal") + 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",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestdenied",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"undockingdenied",30;"undockingdelayed","normal") + 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 @@ -175,11 +175,11 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller 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 in the cockpit","We have unidentified boarders","Our RCS are malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]") + 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 RCS are 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[combined_first_name], this is [using_map.dock_name] Control, copy. Switch to emergency responder channel [ertchannel].") - sleep(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("Understood [using_map.dock_name] Control, switching now.","[prefix] [shipname]") //Control scan event: soft outcome if("policescan") @@ -187,21 +187,21 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller 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?") 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[confirm] [using_map.dock_name] Control, holding position.","[prefix] [shipname]") - sleep(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("Your compliance is appreciated, [combined_first_name]. Scan commencing.") - sleep(10 SECONDS) + sleep(rand(3,6)*2 SECONDS) msg(complain,"[prefix] [shipname]") - sleep(15 SECONDS) + sleep(rand(3,6)*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!") 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[uhoh]","[shipname]") - sleep(5 SECONDS) + sleep(rand(3,6) 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") @@ -209,160 +209,195 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller 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?") 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[confirm] [combined_first_name], holding position.","[secondprefix] [secondshipname]") - sleep(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("Your compliance is appreciated, [combined_second_name]. Scan commencing.","[prefix] [shipname]") - sleep(10 SECONDS) + sleep(rand(3,6)*2 SECONDS) msg(complain,"[secondprefix] [secondshipname]") - sleep(15 SECONDS) + sleep(rand(3,6)*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!") 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[uhoh]","[shipname]") - sleep(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[using_map.starsys_name] Defense Control, this is [combined_second_name]. We have a situation here, please advise.","[secondprefix] [secondshipname]") - sleep(5 SECONDS) + sleep(rand(3,6) 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(5 SECONDS) + sleep(rand(3,6) 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(5 SECONDS) + sleep(rand(3,6) 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(5 SECONDS) + sleep(rand(3,6) 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(5 SECONDS) + sleep(rand(3,6) 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(3,6) 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(3,6) SECONDS) + msg("One moment... yeah, that code checks out [combined_first_name].") + sleep(rand(3,6) 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(3,6) SECONDS) + msg("Control reads you loud and clear [combined_first_name].","[using_map.starsys_name] Defense Control") + sleep(rand(3,6) 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") + 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]") + sleep(rand(3,6) SECONDS) + msg("[combined_first_name], your internal comms are leaking[pick("."," again.",", again.",". |Again|.")]") + sleep(rand(3,6) 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(5 SECONDS) - msg("Be on the lookout for [combined_first_name], last sighted near route [rand(1,100)]. [orders]. DefCon, out.","[using_map.starsys_name] Defense Control") + sleep(rand(3,6) 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") - 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(5 SECONDS) - msg("[combined_first_name], this is [using_map.starsys_name] Defense Control, copy. SDF is en route, contact on [sdfchannel].") - sleep(5 SECONDS) - msg("Understood [using_map.starsys_name] Defense Control, switching now.","[prefix] [shipname]") + 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(3,6) SECONDS) + msg("We read you. Go ahead, [combined_first_name].","[using_map.starsys_name] Defense Control") + sleep(rand(3,6) 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(3,6) 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(3,6) 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(3,6) SECONDS) + msg("[combined_first_name], this is [using_map.starsys_name] Defense Control, copy. SDF is en route, contact on [sdfchannel].") + sleep(rand(3,6) 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 along route [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")] has collided with a [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] 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")] 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 carp breeding season. [pick("Stars","Gods","God","Goddess")] have mercy on you all, because the carp won't") + 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 a [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] 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(5 SECONDS) + sleep(rand(3,6) 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") + 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[confirm] [using_map.dock_name] Control, adjusting course.","[prefix] [shipname]") - sleep(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("Your compliance is appreciated, [combined_first_name]. [safetravels].") //Ship event: docking request (generic) if("dockingrequestgeneric") - var/appreciation = pick("Much appreciated","Many thanks","Understood","Cheers") - 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], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]") - sleep(5 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(5 SECONDS) - msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") - //Ship event: docking request (denied) - if("dockingrequestdenied") - var/reason = pick("we don't have any landing pads large enough for your vessel","we don't have the necessary facilities for your vessel type or class") - var/disappointed = pick("That's unfortunate. [combined_first_name], out.","Damn shame. We'll just have to keep moving. [combined_first_name], out.","[combined_first_name], out.") - 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(5 SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason].") - sleep(5 SECONDS) - msg("Understood, [using_map.dock_name] Control. [disappointed]","[prefix] [shipname]") - //Ship event: docking request (delayed) - if("dockingrequestdelayed") - var/reason = pick("we don't have any free landing pads right now, please hold for three minutes","you're too far away, please close to ten thousand meters","we're seeing heavy traffic around the landing pads right now, please hold for three minutes","we're currently cleaning up a fuel spill on one of our free pads, please hold for three minutes","there are loose containers on our free pads, stand by for a couple of minutes whilst we secure them","another vessel has aerospace priority right now, please hold for three minutes") + var/request_type = pick(100;"generic",40;"delayed",40;"supply",20;"repair",20;"medical",20;"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.") - 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(5 SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason] and resubmit your request.") - sleep(5 SECONDS) - msg("Understood, [using_map.dock_name] Control.","[prefix] [shipname]") - sleep(180 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.") - sleep(5 SECONDS) - msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") - //Ship event: docking request (resupply) - if("dockingrequestsupply") - var/preintensifier = pick(75;"getting ",75;"running ","") //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 - var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - 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]. We're [preintensifier][intensifier] low on [low_thing]. Requesting permission to [landing_short] for resupply.","[prefix] [shipname]") - sleep(5 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(5 SECONDS) - msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") - //Ship event: docking request (repair/maint) - if("dockingrequestrepair") - var/damagestate = pick("We've experienced some hull damage","We're suffering minor system malfunctions","We're having some 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")]","Our artificial gravity generator has failed","Our life support is failing","Our environmental controls are busted","Our water recycling system has shorted out","Our navcomp is freaking out","Our systems are glitching out","We just got caught in a solar flare","We had a close call with an asteroid","We have a minor [pick("fuel","water","oxygen","gas")] leak","We have depressurized compartments","We have a hull breach","Our shield generator is on the fritz","Our RCS is acting up","One of our [pick("hydraulic","pneumatic")] systems has depressurized","Our repair bots are malfunctioning") - var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - 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]. [damagestate]. Requesting permission to [landing_short] for repairs and maintenance.","[prefix] [shipname]") - sleep(5 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].") - sleep(5 SECONDS) - msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") - //Ship event: docking request (medical) - if("dockingrequestmedical") - 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 passengers","sick passengers","injured engineers","wounded marines","a delicate situation","a pregnant passenger","injured castaways","recovered escape pods","unknown escape pods") - var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you") - 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]. We have [medicalstate] on board. Requesting permission to [landing_short] for medical assistance.","[prefix] [shipname]") - sleep(5 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].") - sleep(5 SECONDS) - msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]") - //Ship event: docking request (security) - if("dockingrequestsecurity") - var/species = pick("human","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien") - 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","a container full of confiscated contraband","containers full of confiscated contraband",5;"a very lost shadekin",5;"a raging case of [pick("spiders","crabs")]") //gotta have a little something to lighten the mood now and then - var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","Perfect, thank you") - var/dockingplan = pick("Starting final approach now.","Commencing docking procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.") - msg("[callname], this is [combined_first_name]. We have [securitystate] on board and require security assistance. Requesting permission to [landing_short].","[prefix] [shipname]") - sleep(5 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(5 SECONDS) + 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(3,6) 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 pads right now, please hold for a few minutes","you're too far away, please close to ten thousand meters","we're seeing heavy traffic around the landing pads right now, please hold for a few minutes","we're currently cleaning up a fuel spill on one of our free pads, please hold for a few minutes","there are loose containers on our free pads, stand by for a couple of minutes whilst we secure them","another vessel has aerospace priority right now, please 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(3,6) SECONDS) + msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason] and resubmit your request.") + sleep(rand(3,6) SECONDS) + msg("Understood, [using_map.dock_name] Control.","[prefix] [shipname]") + sleep(rand(3,6)*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(3,6) 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 minor [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","RCS","auto-repair system","artificial gravity generator","environmental 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(3,6) 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(3,6) 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",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(3,6) 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(3,6) 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") - var/takeoff = pick("depart","launch") msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]") - sleep(5 SECONDS) - msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].") - sleep(5 SECONDS) + sleep(rand(3,6) SECONDS) + switch(request_type) + if("generic") + msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].") + sleep(rand(3,6) SECONDS) + msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]") + 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(3,6)*60 SECONDS) + msg("[callname], this is [combined_first_name], re-requesting permission to depart from [landing_zone].","[prefix] [shipname]") + sleep(rand(3,6) 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(3,6) 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") @@ -370,51 +405,36 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].") - sleep(5 SECONDS) + sleep(rand(3,6) 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("Negative [combined_first_name], request denied. [denialreason].") - //Ship event: undocking request (delayed) - if("undockingdelayed") - 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") - 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(5 SECONDS) - msg("Negative [combined_first_name], request denied. [denialreason]. Try again in three minutes.") - sleep(180 SECONDS) //yes, three minutes - msg("[callname], this is [combined_first_name], re-requesting permission to depart from [landing_zone].","[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. Docking clamps released. [safetravels].") - sleep(5 SECONDS) - msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]") if("slogan") msg("The following is a sponsored message from [name].","Facility PA") - sleep (5 SECONDS) + 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(5 SECONDS) + sleep(rand(3,6) SECONDS) msg("[combined_first_name], this is [using_map.dock_name] Control, [response].") - sleep(5 SECONDS) + sleep(rand(3,6) 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(5 SECONDS) + sleep(rand(3,6) SECONDS) //ATC sends response to ship msg(full_response) - sleep(5 SECONDS) + sleep(rand(3,6) SECONDS) //Ship sends response to ATC msg(full_closure,"[prefix] [shipname]") return diff --git a/code/modules/busy_space_vr/organizations.dm b/code/modules/busy_space_vr/organizations.dm index a4b1bc88162..c625a2d34c1 100644 --- a/code/modules/busy_space_vr/organizations.dm +++ b/code/modules/busy_space_vr/organizations.dm @@ -11,12 +11,12 @@ 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", @@ -183,7 +183,8 @@ "Cwn Annwn", "Morning Swan", "Black Cat", - "Challenger" + "Challenger", + "Savage Chicken" ) var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly. @@ -192,7 +193,7 @@ 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() @@ -309,8 +310,8 @@ 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.\ + 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 \ @@ -403,9 +404,9 @@ 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!+ - 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 @@ -503,7 +504,7 @@ 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. \ + 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 = "" @@ -719,7 +720,8 @@ 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 - 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 @@ -957,6 +959,7 @@ 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") @@ -1333,6 +1336,7 @@ 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") @@ -1354,7 +1358,9 @@ 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 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( @@ -1620,7 +1626,7 @@ "Vampir", "Wendigo", "Werewolf", - "Wraith" + "Wraith" ) destination_names = list ( "Chimera HQ, Titan", @@ -2186,23 +2192,40 @@ 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( - "Keqxuer'xeu's Prize", - "Xaeker'qux' Bounty", - "Teq'ker'qerr's Mercy", - "Ke'teq's Thunder", - "Xumxerr's Compass", - "Xue'qux' Greed", - "Xaexuer's Slave", - "Xue'taq's Dagger", - "Teqxae's Madness", - "Taeqtaq'kea's Pride", - "Keqxae'xeu's Saber", - "Xueaeq's Disgrace", - "Xum'taq'qux' Star", - "Ke'xae'xe's Scream", - "Keq'keax' Blade" + 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)] [pick(words)]") + i-- /datum/lore/organization/other/marauders name = "Vox Marauders" @@ -2222,12 +2245,7 @@ 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( - ) - /* - destination_names = list( - ) - */ + ship_names = list() /datum/lore/organization/other/marauders/New() ..() @@ -2635,26 +2653,7 @@ //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( - "Leniri's Hope", - "Tatani's Venture", - "Ninai's Voyage", - "Miiescha's Claw", - "Ishena's Talons", - "Lili's Fang", - "Taalische's Wing", - "Cami's Pride", - "Schemisa's Glory", - "Shilirashi's Wit", - "Sanene's Insight", - "Aeimi's Wisdom", - "Ischica's Mind", - "Recite's Cry", - "Leseca's Howl", - "Iisi's Fury", - "Simascha's Revenge", - "Lisascheca's Vengeance" - ) + ship_names = list() destination_names = list( "an Expeditionary Fleet RV point", "an Expeditionary Fleet Resupply Ship", @@ -2665,14 +2664,59 @@ "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" + 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 not eat the resources from others. \ - Their primary focus is trade and slavage operations and can be expected to be seen around both densely populated and empty systems for their work." + 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" From de1942481da2372e2883ea1d3d20129fd5238f2b Mon Sep 17 00:00:00 2001 From: ItsSelis Date: Sun, 4 Jun 2023 14:12:05 +0200 Subject: [PATCH 05/31] Interface Hotfix --- .../packages/tgui/interfaces/ChemDispenser.js | 31 ++++++++----------- tgui/packages/tgui/interfaces/SuitCycler.js | 4 +-- .../tgui/styles/components/Button.scss | 26 ++++++++++++++++ .../tgui/styles/components/LabeledList.scss | 3 +- tgui/public/tgui.bundle.css | 24 +++++++------- tgui/public/tgui.bundle.js | 2 +- 6 files changed, 55 insertions(+), 35 deletions(-) diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.js b/tgui/packages/tgui/interfaces/ChemDispenser.js index ee362d6ddb3..edfa04b55c3 100644 --- a/tgui/packages/tgui/interfaces/ChemDispenser.js +++ b/tgui/packages/tgui/interfaces/ChemDispenser.js @@ -26,24 +26,19 @@ const ChemDispenserSettings = (properties, context) => {
- - {dispenseAmounts.map((a, i) => ( - -