diff --git a/code/ZAS/ConnectionGroup.dm b/code/ZAS/ConnectionGroup.dm index f377efe74fa..94df46ac015 100644 --- a/code/ZAS/ConnectionGroup.dm +++ b/code/ZAS/ConnectionGroup.dm @@ -180,7 +180,8 @@ Class Procs: air_master.mark_zone_update(B) /connection_edge/zone/recheck() - if(!A.air.compare(B.air)) + // Edges with only one side being vacuum need processing no matter how close. + if(!A.air.compare(B.air, vacuum_exception = 1)) air_master.mark_edge_active(src) //Helper proc to get connections for a zone. @@ -235,7 +236,10 @@ Class Procs: air_master.mark_zone_update(A) /connection_edge/unsimulated/recheck() - if(!A.air.compare(air)) + // Edges with only one side being vacuum need processing no matter how close. + // Note: This handles the glaring flaw of a room holding pressure while exposed to space, but + // does not specially handle the less common case of a simulated room exposed to an unsimulated pressurized turf. + if(!A.air.compare(air, vacuum_exception = 1)) air_master.mark_edge_active(src) proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 1ab4e4f7204..5b1b6a60d15 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -84,6 +84,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle if(istype(A, /area/hallway)) A.readyalert() + atc.reroute_traffic(yes = 1) + //calls the shuttle for a routine crew transfer /datum/emergency_shuttle_controller/proc/call_transfer() if(!can_call()) return @@ -98,7 +100,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle shuttle.move_time = SHUTTLE_TRANSIT_DURATION priority_announcement.Announce(replacetext(replacetext(using_map.shuttle_called_message, "%dock_name%", "[using_map.dock_name]"), "%ETA%", "[estimated_time] minute\s")) - atc.shift_ending() //VOREStation Add + atc.shift_ending() //recalls the shuttle /datum/emergency_shuttle_controller/proc/recall() diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 2bfd0bf7d6e..53861563fd8 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -95,11 +95,15 @@ changeling.chem_charges -= 20 - var/range_heavy = 2 - var/range_light = 5 + var/range_heavy = 1 + var/range_med = 2 + var/range_light = 4 + var/range_long = 6 if(src.mind.changeling.recursive_enhancement) range_heavy = range_heavy * 2 + range_med = range_med * 2 range_light = range_light * 2 + range_long = range_long * 2 src << "We are extra loud." src.mind.changeling.recursive_enhancement = 0 diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index ccf449a4dc6..61f177eae55 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -231,7 +231,7 @@ var/list/sacrificed = list() if(T) T.hotspot_expose(700,125) var/rune = src // detaching the proc - in theory - empulse(U, (range_red - 2), range_red) + empulse(U, (range_red - 3), (range_red - 2), (range_red - 1), range_red) qdel(rune) return diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 0bed5bcf428..bd056f7c69e 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -254,7 +254,7 @@ ..() // Best case scenario: Comparable to a low-yield EMP grenade. // Worst case scenario: Comparable to a standard yield EMP grenade. - empulse(src, rand(2, 4), rand(4, 10)) + empulse(src, rand(1, 3), rand(2, 4), rand(3, 7), rand(5, 10)) //Station buster Tunguska /obj/effect/meteor/tunguska diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 4b04330b5b3..fa9985b1b6b 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -126,7 +126,7 @@ safe_blink(src, range = 6) src << "You're teleported against your will!" if(4) - emp_act(2) + emp_act(3) if(51 to 100) //Severe rng = rand(0,3) diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm index 7c11bc000a9..259aca4b572 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -23,7 +23,7 @@ ..() /obj/item/weapon/spell/spawner/pulsar/on_throw_cast(atom/hit_atom, mob/user) - empulse(hit_atom, 1, 1, log=1) + empulse(hit_atom, 1, 1, 1, 1, log=1) /obj/effect/temporary_effect/pulsar name = "pulsar" @@ -44,7 +44,7 @@ /obj/effect/temporary_effect/pulsar/proc/pulse_loop() while(pulses_remaining) sleep(2 SECONDS) - empulse(src, heavy_range = 1, light_range = 2, log = 1) + empulse(src, 1, 1, 2, 2, log = 1) pulses_remaining-- qdel(src) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 0a568b4adec..408e3184d49 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -66,7 +66,11 @@ if(1) num_of_prizes = rand(1,4) if(2) + num_of_prizes = rand(1,3) + if(3) num_of_prizes = rand(0,2) + if(4) + num_of_prizes = rand(0,1) for(num_of_prizes; num_of_prizes > 0; num_of_prizes--) empprize = pickweight(prizes) new empprize(src.loc) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index dd4c6df3a23..a738ea66c1e 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -34,13 +34,15 @@ var/status_display_freq = "1435" var/stat_msg1 var/stat_msg2 - var/datum/lore/atc_controller/ATC //VOREStation Add + + var/datum/lore/atc_controller/ATC var/datum/announcement/priority/crew_announcement = new /obj/machinery/computer/communications/New() ..() + ATC = atc crew_announcement.newscast = 1 - ATC = atc //VOREStation Add + /obj/machinery/computer/communications/process() if(..()) if(state != STATE_STATUSDISPLAY) @@ -130,10 +132,8 @@ if("messagelist") src.currmsg = 0 src.state = STATE_MESSAGELIST - //VOREStation Add for ATC stuff if("toggleatc") src.ATC.squelched = !src.ATC.squelched - //VOREStation Add End if("viewmessage") src.state = STATE_VIEWMESSAGE if (!src.currmsg) @@ -315,7 +315,7 @@ else dat += "
\[ Log In \]" dat += "
\[ Message List \]" - dat += "
\[ [ATC.squelched ? "Enable" : "Disable"] ATC Relay \]" //VOREStation Add + dat += "
\[ [ATC.squelched ? "Enable" : "Disable"] ATC Relay \]" if(STATE_CALLSHUTTLE) dat += "Are you sure you want to call the shuttle? \[ OK | Cancel \]" if(STATE_CANCELSHUTTLE) @@ -379,7 +379,7 @@ dat += "
\[ Call Emergency Shuttle \]" dat += "
\[ Message List \]" dat += "
\[ Set Status Display \]" - dat += "
\[ [ATC.squelched ? "Enable" : "Disable"] ATC Relay \]" //VOREStation Add + dat += "
\[ [ATC.squelched ? "Enable" : "Disable"] ATC Relay \]" if(STATE_CALLSHUTTLE) dat += "Are you sure you want to call the shuttle? \[ OK | Cancel \]" if(STATE_MESSAGELIST) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index a378f0ff359..595712afd3a 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -441,7 +441,7 @@ var/list/turret_icons else take_damage(initial(health) * 8) //should instakill most turrets if(3) - take_damage(initial(health) * 8 / 3) + take_damage(initial(health) * 8 / 3) //Level 4 is too weak to bother turrets /obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0 health = 0 diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index e9dbd93edf7..a6da9bfa000 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -105,7 +105,7 @@ proc/shock() var/obj/mecha/M = in_mecha() if(M) - M.emp_act(2) + M.emp_act(4) qdel(src) proc/get_mecha_log() diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm index c1df6b5454b..3b1a3b54f52 100644 --- a/code/game/objects/empulse.dm +++ b/code/game/objects/empulse.dm @@ -4,17 +4,17 @@ // #define EMPDEBUG 10 -proc/empulse(turf/epicenter, heavy_range, light_range, log=0) +proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_range, log=0) if(!epicenter) return if(!istype(epicenter, /turf)) epicenter = get_turf(epicenter.loc) if(log) - message_admins("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") - log_game("EMP with size ([heavy_range], [light_range]) in area [epicenter.loc.name] ") + message_admins("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ") + log_game("EMP with size ([first_range], [second_range], [third_range], [fourth_range]) in area [epicenter.loc.name] ") - if(heavy_range > 1) + if(first_range > 1) var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter) pulse.icon = 'icons/effects/effects.dmi' pulse.icon_state = "emppulse" @@ -23,28 +23,50 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0) spawn(20) qdel(pulse) - if(heavy_range > light_range) - light_range = heavy_range + if(first_range > second_range) + second_range = first_range + if(second_range > third_range) + third_range = second_range + if(third_range > fourth_range) + fourth_range = third_range - for(var/mob/M in range(heavy_range, epicenter)) + for(var/mob/M in range(first_range, epicenter)) M << 'sound/effects/EMPulse.ogg' - for(var/atom/T in range(light_range, epicenter)) + for(var/atom/T in range(fourth_range, epicenter)) #ifdef EMPDEBUG var/time = world.timeofday #endif var/distance = get_dist(epicenter, T) if(distance < 0) distance = 0 - if(distance < heavy_range) + //Worst effects, really hurts + if(distance < first_range) T.emp_act(1) - else if(distance == heavy_range) + else if(distance == first_range) if(prob(50)) T.emp_act(1) else T.emp_act(2) - else if(distance <= light_range) + //Slightly less painful + else if(distance <= second_range) T.emp_act(2) + else if(distance == second_range) + if(prob(50)) + T.emp_act(2) + else + T.emp_act(3) + //Even less slightly less painful + else if(distance <= third_range) + T.emp_act(3) + else if(distance == third_range) + if(prob(50)) + T.emp_act(2) + else + T.emp_act(3) + //This should be more or less harmless + else if(distance <= fourth_range) + T.emp_act(4) #ifdef EMPDEBUG if((world.timeofday - time) >= EMPDEBUG) log_and_message_admins("EMPDEBUG: [T.name] - [T.type] - took [world.timeofday - time]ds to process emp_act()!") diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ee3d2b9ac3a..e641d1bcc49 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -998,7 +998,7 @@ var/global/list/obj/item/device/pda/PDAs = list() M.apply_damage( rand(30,60) , BURN) message += "You feel a searing heat! Your [P] is burning!" if(i>=20 && i<=25) //EMP - empulse(P.loc, 3, 6, 1) + empulse(P.loc, 1, 2, 4, 6, 1) message += "Your [P] emits a wave of electromagnetic energy!" if(i>=25 && i<=40) //Smoke var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm new file mode 100644 index 00000000000..0bb26b32bc7 --- /dev/null +++ b/code/game/objects/items/devices/translator.dm @@ -0,0 +1,79 @@ +//Universal translator +/obj/item/device/universal_translator + name = "handheld translator" + desc = "This handy device appears to translate the languages it hears into onscreen text for a user." + icon = 'icons/obj/device.dmi' + icon_state = "translator" + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + var/mult_icons = 1 //Changes sprite when it translates + var/visual = 1 //If you need to see to get the message + var/audio = 0 //If you need to hear to get the message + var/listening = 0 + var/datum/language/langset + +/obj/item/device/universal_translator/attack_self(mob/user) + if(!listening) //Turning ON + langset = input(user,"Translate to which of your languages?","Language Selection") as null|anything in user.languages + if(langset) + if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND))) + to_chat(user, "\The [src] cannot output that language.") + return + else + listening = 1 + listening_objects |= src + if(mult_icons) + icon_state = "[initial(icon_state)]1" + to_chat(user, "You enable \the [src], translating into [langset.name].") + else //Turning OFF + listening = 0 + listening_objects -= src + langset = null + icon_state = "[initial(icon_state)]" + to_chat(user, "You disable \the [src].") + +/obj/item/device/universal_translator/hear_talk(var/mob/speaker, var/message, var/vrb, var/datum/language/language) + if(!listening || !istype(speaker)) + return + + //Show the "I heard something" animation. + if(mult_icons) + flick("[initial(icon_state)]2",src) + + //Handheld or pocket only. + if(!isliving(loc)) + return + + var/mob/living/L = loc + + if (language && (language.flags & NONVERBAL)) + return //Not gonna translate sign language + + if (visual && ((L.sdisabilities & BLIND) || L.eye_blind)) + return //Can't see the screen, don't get the message + + if (audio && ((L.sdisabilities & DEAF) || L.ear_deaf)) + return //Can't hear the translation, don't get the message + + //Only translate if they can't understand, otherwise pointlessly spammy + //I'll just assume they don't look at the screen in that case + + //They don't understand the spoken language we're translating FROM + if(!L.say_understands(speaker,language)) + //They understand the output language + if(L.say_understands(null,langset)) + to_chat(L, "[src] translates, \"[message]\"") + + //They don't understand the output language + else + to_chat(L, "[src] translates, \"[langset.scramble(message)]\"") + +//Let's try an ear-worn version +/obj/item/device/universal_translator/ear + name = "translator earpiece" + desc = "This handy device appears to translate the languages it hears into another language for a user." + icon_state = "earpiece" + w_class = ITEMSIZE_TINY + slot_flags = SLOT_EARS + visual = 0 + audio = 1 \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index dd1d6a55b02..8f4cd48e2cc 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -3,12 +3,14 @@ icon_state = "emp" item_state = "empgrenade" origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3) - var/emp_heavy = 4 - var/emp_light = 10 + var/emp_heavy = 2 + var/emp_med = 4 + var/emp_light = 7 + var/emp_long = 10 prime() ..() - if(empulse(src, emp_heavy, emp_light)) + if(empulse(src, emp_heavy, emp_med, emp_light, emp_long)) qdel(src) return @@ -18,4 +20,6 @@ icon_state = "lyemp" origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3) emp_heavy = 1 - emp_light = 4 \ No newline at end of file + emp_med = 2 + emp_light = 3 + emp_long = 4 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 4407e29c72f..c3ddb4fb39b 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -101,6 +101,10 @@ Implant Specifics:
"} meltdown() if(2) delay = rand(5*60*10,15*60*10) //from 5 to 15 minutes of free time + if(3) + delay = rand(2*60*10,5*60*10) //from 2 to 5 minutes of free time + if(4) + delay = rand(0.5*60*10,1*60*10) //from .5 to 1 minutes of free time spawn(delay) malfunction-- @@ -227,10 +231,22 @@ Implant Specifics:
"} return malfunction = MALFUNCTION_TEMPORARY switch (severity) - if (2.0) //Weak EMP will make implant tear limbs off. + if (4) //Weak EMP will make implant tear limbs off. + if (prob(25)) + small_boom() + if (3) //Weak EMP will make implant tear limbs off. if (prob(50)) small_boom() - if (1.0) //strong EMP will melt implant either making it go off, or disarming it + if (2) //strong EMP will melt implant either making it go off, or disarming it + if (prob(70)) + if (prob(75)) + small_boom() + else + if (prob(13)) + activate() //chance of bye bye + else + meltdown() //chance of implant disarming + if (1) //strong EMP will melt implant either making it go off, or disarming it if (prob(70)) if (prob(50)) small_boom() @@ -320,7 +336,13 @@ the implant may become unstable and either pre-maturely inject the subject or si if(prob(60)) activate(20) if(2) - if(prob(30)) + if(prob(40)) + activate(20) + if(3) + if(prob(40)) + activate(5) + if(4) + if(prob(20)) activate(5) spawn(20) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index 9f6109b8ef2..5063d247b4f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -142,6 +142,7 @@ new /obj/item/clothing/suit/storage/toggle/labcoat/emt(src) new /obj/item/device/radio/headset/headset_med/alt(src) new /obj/item/weapon/cartridge/medical(src) + new /obj/item/weapon/storage/briefcase/inflatable(src) new /obj/item/device/flashlight(src) new /obj/item/weapon/tank/emergency/oxygen/engi(src) new /obj/item/clothing/glasses/hud/health(src) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d94535918fa..6566f5da3e8 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -637,14 +637,18 @@ Traitors and the like can also be revived with the previous role mostly intact. var/heavy = input("Range of heavy pulse.", text("Input")) as num|null if(heavy == null) return + var/med = input("Range of medium pulse.", text("Input")) as num|null + if(med == null) return var/light = input("Range of light pulse.", text("Input")) as num|null if(light == null) return + var/long = input("Range of long pulse.", text("Input")) as num|null + if(long == null) return - if (heavy || light) + if (heavy || med || light || long) - empulse(O, heavy, light) - log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") - message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[light]) at ([O.x],[O.y],[O.z])", 1) + empulse(O, heavy, med, light, long) + log_admin("[key_name(usr)] created an EM Pulse ([heavy],[med],[light],[long]) at ([O.x],[O.y],[O.z])") + message_admins("[key_name_admin(usr)] created an EM PUlse ([heavy],[med],[light],[long]) at ([O.x],[O.y],[O.z])", 1) feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/busy_space/air_traffic.dm b/code/modules/busy_space/air_traffic.dm index a18c3be0541..7da2c6f73bf 100644 --- a/code/modules/busy_space/air_traffic.dm +++ b/code/modules/busy_space/air_traffic.dm @@ -3,16 +3,16 @@ 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 - var/delay_min = 40 MINUTES //How long between ATC traffic, min - var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to + 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/force_chatter_type //Force a specific type of messages var/squelched = 0 //If ATC is squelched currently /datum/lore/atc_controller/New() - spawn(100) //Lots of lag at the start of a shift. + 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() @@ -30,43 +30,45 @@ 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 : "Virgo Air/Space Control") + global_announcer.autosay("[message]", sender ? sender : "[using_map.station_short] Space Control") /datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1) if(yes) - msg("Rerouting traffic away from NSS Adaphagia.") + if(!squelched) + msg("Rerouting traffic away from [using_map.station_name].") squelched = 1 else - msg("Resuming normal traffic routing around NSS Adaphagia.") + 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("Automated Shuttle departing NSS Virgo Central Command for NSS Adaphagia on routine transfer route.","NT Automated Shuttle") + msg("Automated Shuttle departing [using_map.station_name] for [using_map.dock_name] on routine transfer route.","NT Automated Shuttle") sleep(5 SECONDS) - msg("Automated Shuttle, cleared to complete routine transfer from NSS Adaphagia to NSS Virgo Central Command.") + msg("Automated Shuttle, cleared to complete routine transfer from [using_map.station_name] to [using_map.dock_name].") /datum/lore/atc_controller/proc/random_convo() - var/one = pick(loremaster.orgs) //These will pick an index, not an instance - var/two = pick(loremaster.orgs) + var/one = pick(loremaster.organizations) //These will pick an index, not an instance + var/two = pick(loremaster.organizations) - var/datum/lore/org/source = loremaster.orgs[one] //Resolve to the instances - var/datum/lore/org/dest = loremaster.orgs[two] + var/datum/lore/organization/source = loremaster.organizations[one] //Resolve to the instances + var/datum/lore/organization/dest = loremaster.organizations[two] //Let's get some mission parameters - var/owner = source.sname //Use the short 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 to go with it - var/destname = pick(dest.holding_names) //Pick a random holding from the destination + var/destname = pick(dest.destination_names) //Pick a random holding from the destination var/combined_name = "[owner] [prefix] [shipname]" - var/alt_atc_names = list("Virgo TraCon","Virgo Control","Virgo ATC","Virgo Airspace") - var/wrong_atc_names = list("Sol Command","Polaris TraCon","Orion Control") + 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","Orion Control", "[using_map.dock_name]") var/mission_noun = list("flight","mission","route") var/request_verb = list("requesting","calling for","asking for") //First response is 'yes', second is 'no' - var/requests = list("Virgo transit clearance" = list("permission for transit granted", "permission for transit denied, contact regional on 953.5"), + 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"), @@ -102,19 +104,19 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller 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 Virgo TraCon, wrong frequency. Switch to [rand(700,999)].[rand(1,9)]." - full_closure = "Virgo TraCon, understood, apologies." + 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 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 Virgo TraCon, copy. Switch to emergency responder channel [rand(700,999)].[rand(1,9)]." - full_closure = "Virgo TraCon, okay, switching now." + 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 Virgo TraCon, [response]." //Virgo TraCon always calls themselves TraCon - full_closure = "Virgo TraCon, [yes ? "thank you" : "understood"], good day." //They always copy what TraCon called themselves in the end when they realize they said it wrong + 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 //Ship sends request to ATC msg(full_request,"[prefix] [shipname]") @@ -124,5 +126,4 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller sleep(5 SECONDS) //Ship sends response to ATC msg(full_closure,"[prefix] [shipname]") - return \ No newline at end of file diff --git a/code/modules/busy_space/loremaster.dm b/code/modules/busy_space/loremaster.dm index 322fe0574ad..30bd04402da 100644 --- a/code/modules/busy_space/loremaster.dm +++ b/code/modules/busy_space/loremaster.dm @@ -3,12 +3,11 @@ var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster /datum/lore/loremaster - var/list/orgs = list() + var/list/organizations = list() /datum/lore/loremaster/New() - var/paths //Just reuse this a bunch of times. - paths = typesof(/datum/lore/org) - /datum/lore/org + var/list/paths = typesof(/datum/lore/organization) - /datum/lore/organization for(var/path in paths) - var/datum/lore/org/instance = new path() - orgs[path] = instance + var/datum/lore/organization/instance = new path() + organizations[path] = instance \ No newline at end of file diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm new file mode 100644 index 00000000000..86f88e7ec03 --- /dev/null +++ b/code/modules/busy_space/organizations.dm @@ -0,0 +1,326 @@ +//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/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", + "Icarus", + "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", + "Delta Doradus", "Menkar", "Geminga", "Elnath", "Gienah", "Mu Leporis", "Nyx", "Tau Ceti", + "Wazn", "Alphard", "Phact", "Altair") + 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/nanotrasen + name = "NanoTrasen Incorporated" + short_name = "NanoTrasen" + desc = "" // Todo: Write this. + history = "" // This too. + work = "research giant" + headquarters = "Luna" + motto = "" + + ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response") + // 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", + "NCS Southern Cross in Vir", + "NDV Icarus in Nyx", + "NAS Vir Central Command", + "a dockyard orbiting Sif", + "an asteroid orbiting Kara", + "an asteroid orbiting Rota", + "Vir Interstellar Spaceport" + ) + +/datum/lore/organization/nanotrasen/New() + ..() + // 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/hephaestus + name = "Hephaestus Industries" + short_name = "Hephaestus" + 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. SolGov itself is one of Hephastus’ largest \ + bulk contractors owing to the above factors." + history = "" + work = "arms manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply") + destination_names = list( + "a SolGov dockyard on Luna" + ) + +/datum/lore/organization/vey_med + name = "Vey Medical" + short_name = "Vey Med" + desc = "Vey-Med is one of the newer TSCs on the block and is notable for being largely owned and opperated 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 \ + 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 to modern cloning." + history = "" + work = "medical equipment supplier" + headquarters = "" + motto = "" + + ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply") + destination_names = list() + +/datum/lore/organization/zeng_hu + name = "Zeng-Hu pharmaceuticals" + short_name = "Zeng-Hu" + 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 \ + 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/ward_takahashi + name = "Ward-Takahashi General Manufacturing Conglomerate" + short_name = "Ward-Takahashi" + 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") + destination_names = list() + +/datum/lore/organization/bishop + name = "Bishop Cybernetics" + short_name = "Bishop" + desc = "Bishop’s focus is on high-class, stylish cybernetics. A favorite among transhumanists (and a bête 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/morpheus + name = "Morpheus Cyberkinetics" + short_name = "Morpheus" + 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", + "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" + + + ) + destination_names = list() + +/datum/lore/organization/xion + name = "Xion Manufacturing Group" + short_name = "Xion" + desc = "Xion, quietly, controls most of the market for industrial equipment. 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." + history = "" + work = "industrial equipment manufacturer" + headquarters = "" + motto = "" + + ship_prefixes = list("XTV" = "hauling") + destination_names = list() + +// Governments + +/datum/lore/organization/sifgov + name = "Sif Governmental Authority" + short_name = "SifGov" + desc = "SifGov is the sole governing administration for the Vir system, based in New Reykjavik, Sif. It is a representative \ + democratic government, and a fully recognized member of the Solar Confederate Government. Anyone operating inside of Vir must \ + comply with SifGov's legislation and regulations." + history = "" // Todo like the rest of them + work = "governing body of Sif" + headquarters = "New Reykjavik, Sif" + motto = "" + autogenerate_destination_names = FALSE + + ship_prefixes = list("SGA" = "hauling", "SGA" = "energy relay") + destination_names = list( + "New Reykjavik on Sif", + "Radiance Energy Chain", + "a dockyard orbiting Sif", + "a telecommunications satellite", + "Vir Interstellar Spaceport" + ) + +/datum/lore/organization/solgov + name = "Solar Confederate Government" + short_name = "SolGov" + desc = "SolGov is a decentralized confederation of human governmental entities based on Luna, Sol, which defines top-level law for their member states. \ + Member states receive various benefits such as defensive pacts, trade agreements, social support and funding, and being able to participate \ + in the Colonial Assembly. The majority, but not all human territories are members of SolGov. As such, SolGov is a major power and \ + defacto represents humanity on the galatic stage." + history = "" // Todo + work = "governing polity of humanity's Confederation" + headquarters = "Luna" + motto = "Nil Mortalibus Ardui Est" // Latin, because latin. Says 'Nothing is too steep for mortals'. + autogenerate_destination_names = TRUE + + 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. + +/* +// To be expanded upon later, once the military lore gets sorted out. + +// Military + +/datum/lore/organization/sif_guard + name = "Sif Homeguard Forces" // Todo: Get better name from lorepeople. + short_name = "SifGuard" + desc = "" + history = "" + work = "Sif Governmental Authority's military" + headquarters = "Sif" // Make this more specific later. + motto = "" + autogenerate_destination_names = FALSE // Kinda weird if SifGuard goes to Nyx. + + ship_prefixes = list("SGSC" = "military", "SGSC" = "patrol", "SGSC" = "rescue", "SGSC" = "emergency response") // Todo: Replace prefix with better one. + 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 SifGov territory", + "a military outpost", + ) +*/ diff --git a/code/modules/busy_space/orgs.dm b/code/modules/busy_space/organizations_vr.dm similarity index 64% rename from code/modules/busy_space/orgs.dm rename to code/modules/busy_space/organizations_vr.dm index a1066c107ee..8617d7c1ee1 100644 --- a/code/modules/busy_space/orgs.dm +++ b/code/modules/busy_space/organizations_vr.dm @@ -1,72 +1,9 @@ -//Datums for different companies that can be used by busy_space -/datum/lore/org - var/name = "" //Organization's name - var/sname = "" //Org's shortname (NanoTrasen for "NanoTrasen Incorporated") - var/desc = "" //Long description of org, but only current stuff, see 'history' - var/history = "" //Historical discription of org's origins - var/work = "" //Short description of their work, eg "an arms manufacturer" - var/headquarters = "" //Location of Org's HQ - var/motto = "" //A motto, if they have one - - var/org_flags = 0 //Flags for the org - - var/list/ship_prefixes = list()//Some might have more than one! Like NanoTrasen. Value is the mission they perform. - var/list/ship_names = list()//Names of spaceships - var/list/holding_names = list()//Names of static holdings (planets, bases) - +//Datums for different companies that can be used by busy_space, VR edition ////////////////////////////////////////////////////////////////////////////////// -/datum/lore/org/nanotrasen - name = "NanoTrasen Incorporated" - sname = "NanoTrasen" - desc = "A megacorporation specializing in genetic and phoron research. The founder, Xavier Trasen, set the company \ - up to be a powerhouse of buying up smaller companies, and turning a profit on the backs of it's workers. \ - It's not known to be the most controversy-free company, nor the best to work for, though millions are employed \ - nonetheless by NanoTrasen." - history = "Originally founded on Mars in 23rd Century by a man named Xavier Trasen, NanoTrasen started \ - out as a small company, whose research was mostly based around gene-therapy. After a controversy over \ - cloning, and buying many smaller companies, Xavier Trasen aggressively pursued phoron research \ - as soon as it was discovered, bringing NanoTrasen to the forefront of the field." - work = "mega-conglomerate" - headquarters = "Mars" - motto = "" - - org_flags = ORG_HAS_NAVY|ORG_HAS_TECH|ORG_HAS_HUGENESS - - //Generic ship names! - ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response") - ship_names = list("Profit", - "Discovery", - "Endeavour", - "Desire", - "Gains", - "Torch II", - "Columbia", - "Leyte Gulf", - "Exeter", - "Zhukov", - "Xavier", - "Liteon", - "Fanatic", - "Slow Boat", - "Listing", - "Even Faster", - "Likely Story", - "Looking Glass", - "Witchcraft") - holding_names = list("NSS Phi Gamma", - "NSB Adelphia", - "NSS Vertigo", - "NSB Checkmate", - "NSS Lampour", - "NSB Adelade", - "NSS Indiana", - "NSB Memory Alpha", - "NSS Memory Beta") - -/datum/lore/org/federation +/datum/lore/organization/federation name = "United Federation of Planets" - sname = "Federation" + 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 \ @@ -84,8 +21,6 @@ headquarters = "" motto = "" - org_flags = ORG_HAS_NAVY|ORG_HAS_TRADERS|ORG_HAS_TECH|ORG_HAS_DIPLO - //Star Trek ship names! ship_prefixes = list("SCV" = "military", "STV" = "trading", "SDV" = "diplomatic") ship_names = list("Kestrel", @@ -134,56 +69,9 @@ "Mari Industrial Complex on Furlou Prime", "Runni Crystal Mines of Keid V") -/datum/lore/org/solgov - name = "Solar Confederate Government" - sname = "SolGov" - desc = "SolGov is the entity in which many human states are members. Though SolGov has a dedicated miltiary force in the UNSC, \ - it also claims the use of the forces of the member states when it needs to affect a \ - military goal. Many if not most human states are members of SolGov, including all entities in Sol." - history = "Originally a military/economic pact between Earth and Mars in the early days of human colonization, \ - the SolGov body of member states has grown over the years to be quite large, and hold a sizable \ - amount of power compared to similar bodies." - work = "government of Sol" - headquarters = "Luna" - motto = "" - - org_flags = ORG_HAS_TRADERS|ORG_HAS_DIPLO - - //Random ship names! - ship_prefixes = list("SOL" = "SolGov") //Don't ask questions! - ship_names = list("Torch", - "Phoenix", - "Majesty", - "Duke", - "King", - "Mandrake", - "Foxglove", - "Prompt", - "Regal", - "Lordship", - "Highness", - "Rapido", - "Paperwork", - "Arthur", - "Durandal", - "Roland") - holding_names = list("San Francisco on Earth", - "SolGov Fleet Academy on Earth", - "Gateway One above Luna", - "SolGov Command on Luna", - "Olympus City on Mars", - "Hermes Naval Shipyard above Mars", - "a settlement on Titan", - "a settlement on Europa", - "Aleph Grande on Ganymede", - "a new colony in Proxima II", - "a new settlement on Ceti IV-B", - "a colony ship around Ceti IV-B", - "a classified location in SolGov territory") - -/datum/lore/org/unsc +/datum/lore/organization/unsc name = "United Nations Space Command" - sname = "Navy" //Otherwise they call the ships UNSC UNSC Name + short_name = "Navy" //Otherwise they call the ships UNSC UNSC Name desc = "The dedicated military force of SolGov, formed from the remnants of the United Nations, is the might of SolGov. \ While it is greater in military strength than most alien polities, it is not by much." history = "" @@ -191,8 +79,6 @@ headquarters = "Earth" motto = "" - org_flags = ORG_HAS_NAVY|ORG_HAS_TECH - //Halo ship names! ship_prefixes = list("UNSC" = "military") ship_names = list("Colorado", @@ -227,9 +113,9 @@ "a colony ship around Ceti IV-B", "a classified location in SolGov territory") -/datum/lore/org/kitsuhana +/datum/lore/organization/kitsuhana name = "Kitsuhana Heavy Industries" - sname = "Kitsuhana" + 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 \ @@ -245,8 +131,6 @@ headquarters = "Kitsuhana Prime" motto = "Do what you want. We know we will." - org_flags = ORG_HAS_TRADERS|ORG_HAS_TECH|ORG_HAS_MERCS|ORG_HAS_ENTERTAIN - //Culture ship names! ship_prefixes = list("KHI" = "personal") //Everybody's out for themselves, yanno. ship_names = list("Nervous Energy", @@ -283,9 +167,9 @@ "a Kitsuhana ringworld in Dais IX", "a Kitsuhana ringworld in Leibert II-b") -/datum/lore/org/ares +/datum/lore/organization/ares name = "Ares Confederation" - sname = "ArCon" + short_name = "ArCon" desc = "A rebel faction on the fringes of human space that renounced the government of both SolGov and their corporate overlords. \ The Confederation has two fleets, a regular United Fleet Host, comprised of professional crewmen and officers and the Free Host of the Confederation, \ which are privateers, volunteers and former pirates. The Ares Confederation only holds a \ @@ -297,8 +181,6 @@ headquarters = "Paraiso a Àstrea" motto = "Liberty to the Stars!" - org_flags = ORG_HAS_NAVY|ORG_HAS_SHADY - ship_prefixes = list("UFHV" = "military", "FFHV" = "shady") ship_names = list("Liberty", "Charged Negotiation", @@ -342,19 +224,3 @@ "a settlement needing our help", "Forward Base Sigma-Alpha in ArCon space") -/* -/datum/lore/org - name = "" - sname = "" - desc = "" - history = "" - work = "" - headquarters = "" - motto = "" - - org_flags = 0 - - ship_prefixes = list() - ship_names = list() - holding_names = list() -*/ diff --git a/code/modules/client/preference_setup/loadout/loadout_ears.dm b/code/modules/client/preference_setup/loadout/loadout_ears.dm index 02bfdaa8b71..d3c7c633cef 100644 --- a/code/modules/client/preference_setup/loadout/loadout_ears.dm +++ b/code/modules/client/preference_setup/loadout/loadout_ears.dm @@ -8,3 +8,8 @@ /datum/gear/ears/headphones display_name = "headphones" path = /obj/item/clothing/ears/earmuffs/headphones + +/datum/gear/ears/translator + display_name = "universal translator, ear" + path = /obj/item/device/universal_translator/ear + cost = 5 \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 4c2a378e7d8..f9ffc0eb0b6 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -61,3 +61,8 @@ cost = 2 slot = "implant" var/implant_type = "EAL" + +/datum/gear/utility/translator + display_name = "universal translator" + path = /obj/item/device/universal_translator + cost = 5 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 39f437f93aa..3783a5c2084 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -199,10 +199,7 @@ /obj/item/clothing/gloves/emp_act(severity) if(cell) - //why is this not part of the powercell code? - cell.charge -= 1000 / severity - if (cell.charge < 0) - cell.charge = 0 + cell.emp_act(severity) ..() // Called just before an attack_hand(), in mob/UnarmedAttack() diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index fe8c86619ac..09fa0687cd5 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -94,7 +94,7 @@ var/list/valid_names = splittext(real_name, " ") // Should output list("John", "Doe") as an example. valid_names += special_mentions() for(var/name in valid_names) - if(findtext(message, name)) + if(findtext(message, regex("\\b[name]\\b", "i"))) // This is to stop 'ai' from triggering if someone says 'wait'. return TRUE return FALSE @@ -108,7 +108,7 @@ // Converts specific characters, like *, /, and _ to formatted output. /mob/proc/say_emphasis(var/message) message = encode_html_emphasis(message, "/", "i") - message = encode_html_emphasis(message, "*", "b") + message = encode_html_emphasis(message, "+", "b") message = encode_html_emphasis(message, "_", "u") return message diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 8060e328ee3..e74d6dab905 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -164,7 +164,9 @@ if(2) brainmob.emp_damage += rand(10,20) if(3) - brainmob.emp_damage += rand(0,10) + brainmob.emp_damage += rand(5,10) + if(4) + brainmob.emp_damage += rand(0,5) ..() /obj/item/device/mmi/digital @@ -216,7 +218,9 @@ if(2) src.brainmob.emp_damage += rand(10,20) if(3) - src.brainmob.emp_damage += rand(0,10) + src.brainmob.emp_damage += rand(5,10) + if(4) + src.brainmob.emp_damage += rand(0,5) ..() /obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 057c24bdcc9..9452337eeb9 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -112,7 +112,9 @@ if(2) src.brainmob.emp_damage += rand(10,20) if(3) - src.brainmob.emp_damage += rand(0,10) + src.brainmob.emp_damage += rand(5,10) + if(4) + src.brainmob.emp_damage += rand(0,5) ..() /obj/item/device/mmi/digital/posibrain/New() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index f84021b26ac..738e9969676 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -65,7 +65,13 @@ src.take_organ_damage(0,20,emp=1) confused = (min(confused + 5, 30)) if(2) + src.take_organ_damage(0,15,emp=1) + confused = (min(confused + 4, 30)) + if(3) src.take_organ_damage(0,10,emp=1) + confused = (min(confused + 3, 30)) + if(4) + src.take_organ_damage(0,5,emp=1) confused = (min(confused + 2, 30)) flash_eyes(affect_silicon = 1) src << "*BZZZT*" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index fd6957aad4e..30a80b6599b 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -281,9 +281,13 @@ var/list/organ_cache = list() return switch (severity) if (1) - take_damage(5) + take_damage(rand(6,12)) if (2) - take_damage(2) + take_damage(rand(4,8)) + if (3) + take_damage(rand(3,6)) + if (4) + take_damage(rand(1,4)) /obj/item/organ/proc/removed(var/mob/living/user) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 363f7e0e6e2..017d6b4bcd2 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -102,11 +102,19 @@ /obj/item/organ/external/emp_act(severity) if(!(robotic >= ORGAN_ROBOT)) return + var/burn_damage = 0 switch (severity) if (1) - take_damage(8) + burn_damage += rand(8, 13) if (2) - take_damage(4) + burn_damage += rand(6, 9) + if(3) + burn_damage += rand(4, 7) + if(4) + burn_damage += rand(1, 5) + + if(burn_damage) + take_damage(0, burn_damage) /obj/item/organ/external/attack_self(var/mob/living/user) if(!contents.len) @@ -243,12 +251,12 @@ return (vital || (robotic >= ORGAN_ROBOT) || brute_dam + burn_dam + additional_damage < max_damage) /obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) + brute = round(brute * brute_mod, 0.1) + burn = round(burn * burn_mod, 0.1) + if((brute <= 0) && (burn <= 0)) return 0 - brute *= brute_mod - burn *= burn_mod - // High brute damage or sharp objects may damage internal organs if(internal_organs && (brute_dam >= max_damage || (((sharp && brute >= 5) || brute >= 10) && prob(5)))) // Damage an internal organ diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 8c7af58346e..c1defc1c757 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -97,6 +97,12 @@ if(2) if(active) toggle_power() stability -= rand(10,20) + if(3) + if(active) toggle_power() + stability -= rand(8,15) + if(4) + if(active) toggle_power() + stability -= rand(5,10) ..() return 0 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 184a1731f51..72fbccaa57c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1193,22 +1193,27 @@ obj/machinery/power/apc/proc/autoset(var/cur_state, var/on) /obj/machinery/power/apc/ex_act(severity) switch(severity) - if(1.0) + if(1) //set_broken() //now qdel() do what we need if (cell) - cell.ex_act(1.0) // more lags woohoo + cell.ex_act(1) // more lags woohoo qdel(src) return - if(2.0) + if(2) + if (prob(75)) + set_broken() + if (cell && prob(50)) + cell.ex_act(2) + if(3) if (prob(50)) set_broken() if (cell && prob(50)) - cell.ex_act(2.0) - if(3.0) + cell.ex_act(3) + if(4) if (prob(25)) set_broken() - if (cell && prob(25)) - cell.ex_act(3.0) + if (cell && prob(50)) + cell.ex_act(3) return /obj/machinery/power/apc/disconnect_terminal() diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm index 203227e613b..56e2a485caf 100644 --- a/code/modules/power/batteryrack.dm +++ b/code/modules/power/batteryrack.dm @@ -165,7 +165,7 @@ return if (overcharge_percent >= 140) if (prob(1)) - empulse(src.loc, 3, 8, 1) + empulse(src.loc, 2, 3, 6, 8, 1) if ((2.4e6+1) to 3.6e6) if (overcharge_percent >= 115) if (prob(7)) @@ -174,7 +174,7 @@ return if (overcharge_percent >= 130) if (prob(1)) - empulse(src.loc, 3, 8, 1) + empulse(src.loc, 2, 3, 6, 8, 1) if (overcharge_percent >= 150) if (prob(1)) explosion(src.loc, 0, 1, 3, 5) @@ -186,7 +186,7 @@ return if (overcharge_percent >= 125) if (prob(2)) - empulse(src.loc, 4, 10, 1) + empulse(src.loc, 2, 4, 7, 10, 1) if (overcharge_percent >= 140) if (prob(1)) explosion(src.loc, 1, 3, 5, 8) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 01e394cf914..f900f6fcf45 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -62,9 +62,12 @@ stat &= BROKEN if(prob(75)) explode() if(2) - if(prob(25)) stat &= BROKEN + if(prob(50)) stat &= BROKEN if(prob(10)) explode() if(3) + if(prob(25)) stat &= BROKEN + duration = 300 + if(4) if(prob(10)) stat &= BROKEN duration = 300 diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index ecdfc0841ea..7e0941ce758 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -441,9 +441,9 @@ /obj/singularity/proc/emp_area() if(current_size != 11) - empulse(src, 8, 10) + empulse(src, 4, 6, 8, 10) else - empulse(src, 12, 16) + empulse(src, 12, 14, 16, 18) /obj/singularity/proc/smwave() for(var/mob/living/M in view(10, src.loc)) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index f943d57dd14..61d5374cad8 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -393,10 +393,14 @@ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(3, 1, src) s.start() - if(prob(50)) + if(prob(25)) emp_act(1) - else + else if(prob(25)) emp_act(2) + else if(prob(25)) + emp_act(3) + else + emp_act(4) if(prob(5)) //smoke only var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() smoke.set_up(3, 0, src.loc) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 2f0fe9419d9..c71f0e35e7f 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -212,7 +212,7 @@ h_user.adjustFireLoss(rand(10,25)) h_user.Paralyse(5) spawn(0) - empulse(src.loc, 2, 4) + empulse(src.loc, 1, 2, 3, 4) charge = 0 if (36 to 60) @@ -229,7 +229,7 @@ h_user.adjustFireLoss(rand(35,75)) h_user.Paralyse(12) spawn(0) - empulse(src.loc, 8, 16) + empulse(src.loc, 6, 8, 12, 16) charge = 0 apcs_overload(1, 10) src.ping("Caution. Output regulators malfunction. Uncontrolled discharge detected.") diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 2ca770dff5a..ae55edeb00f 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -26,6 +26,10 @@ name = "speedloader (.38 rubber)" ammo_type = /obj/item/ammo_casing/c38r +/obj/item/ammo_magazine/c38/emp + name = "ammunition box (.38 haywire)" + ammo_type = /obj/item/ammo_casing/c38/emp + ///////// .45 ///////// /obj/item/ammo_magazine/c45m @@ -57,6 +61,10 @@ name = "magazine (.45 AP)" ammo_type = /obj/item/ammo_casing/c45ap +/obj/item/ammo_magazine/box/emp/c45 + name = "ammunition box (.45 haywire)" + ammo_type = /obj/item/ammo_casing/c45/emp + /obj/item/ammo_magazine/c45uzi name = "stick magazine (.45)" icon_state = "uzi45" @@ -272,6 +280,10 @@ max_ammo = 9 multiple_sprites = 1 +/obj/item/ammo_magazine/box/emp/a10mm + name = "ammunition box (10mm haywire)" + ammo_type = /obj/item/ammo_casing/a10mm/emp + ///////// 5.56mm ///////// /obj/item/ammo_magazine/a556 diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 2fca9a3ffd2..ace4cb1fb8c 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -24,6 +24,13 @@ icon_state = "r-casing" projectile_type = /obj/item/projectile/bullet/pistol/rubber +/obj/item/ammo_casing/c38/emp + name = ".38 haywire round" + desc = "A .38 bullet casing fitted with a single-use ion pulse generator." + icon_state = "empcasing" + projectile_type = /obj/item/projectile/ion/small + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + /obj/item/ammo_casing/c9mm desc = "A 9mm bullet casing." caliber = "9mm" @@ -87,11 +94,24 @@ icon_state = "r-casing" projectile_type = /obj/item/projectile/energy/flash +/obj/item/ammo_casing/c45/emp + name = ".45 haywire round" + desc = "A .45 bullet casing fitted with a single-use ion pulse generator." + projectile_type = /obj/item/projectile/ion/small + icon_state = "empcasing" + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + /obj/item/ammo_casing/a10mm desc = "A 10mm bullet casing." caliber = "10mm" projectile_type = /obj/item/projectile/bullet/pistol/medium +/obj/item/ammo_casing/a10mm/emp + name = "10mm haywire round" + desc = "A 10mm bullet casing fitted with a single-use ion pulse generator." + projectile_type = /obj/item/projectile/ion/small + icon_state = "empcasing" + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) /obj/item/ammo_casing/shotgun name = "shotgun slug" @@ -150,13 +170,13 @@ projectile_type = /obj/item/projectile/energy/flash/flare matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) - /obj/item/ammo_casing/shotgun/emp name = "ion shell" desc = "An advanced shotgun round that creates a small EMP when it strikes a target." icon_state = "empshell" - projectile_type = /obj/item/projectile/bullet/shotgun/ion - matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) + projectile_type = /obj/item/projectile/ion +// projectile_type = /obj/item/projectile/bullet/shotgun/ion + matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240) /obj/item/ammo_casing/a762 desc = "A 7.62mm bullet casing." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 4443775df5b..faafd2e8c95 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -12,14 +12,18 @@ projectile_type = /obj/item/projectile/ion /obj/item/weapon/gun/energy/ionrifle/emp_act(severity) - ..(max(severity, 2)) //so it doesn't EMP itself, I guess + ..(max(severity, 4)) //so it doesn't EMP itself, I guess -/obj/item/weapon/gun/energy/ionrifle/update_icon() - ..() - if(power_supply.charge < charge_cost) - item_state = "ionrifle0" - else - item_state = initial(item_state) +/obj/item/weapon/gun/energy/ionrifle/pistol + name = "ion pistol" + desc = "The NT Mk63 EW Pan is a man portable anti-armor weapon designed to disable mechanical threats, produced by NT. This model sacrifices capacity for portability.." + icon_state = "ionpistol" + item_state = null + w_class = ITEMSIZE_NORMAL + force = 5 + slot_flags = SLOT_BELT + charge_cost = 480 + projectile_type = /obj/item/projectile/ion /obj/item/weapon/gun/energy/decloner name = "biological demolecularisor" diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 7de8e7b8777..1e95f4a213f 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -76,6 +76,10 @@ fire_sound = 'sound/weapons/Gunshot_light.ogg' ammo_type = /obj/item/ammo_casing/c38 +/obj/item/weapon/gun/projectile/revolver/deckard/emp + ammo_type = /obj/item/ammo_casing/c38/emp + + /obj/item/weapon/gun/projectile/revolver/deckard/update_icon() ..() if(loaded.len) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 29d130612f0..f87f726bf3e 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -172,7 +172,8 @@ range_step = 1 spread_step = 10 -//EMP shotgun 'slug', it's basically a beanbag that pops a tiny emp when it hits. + +//EMP shotgun 'slug', it's basically a beanbag that pops a tiny emp when it hits. //Not currently used /obj/item/projectile/bullet/shotgun/ion name = "ion slug" damage = 15 @@ -182,9 +183,10 @@ /obj/item/projectile/bullet/shotgun/ion/on_hit(var/atom/target, var/blocked = 0) ..() - empulse(target, 0, 0) //Only affects what it hits + empulse(target, 0, 0, 0, 0) //Only affects what it hits return 1 + /* "Rifle" rounds */ /obj/item/projectile/bullet/rifle diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 8aba3c0928d..b507afc3167 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -8,12 +8,16 @@ light_range = 2 light_power = 0.5 light_color = "#55AAFF" + var/pulse_range = 1 on_hit(var/atom/target, var/blocked = 0) - empulse(target, 1, 1) + empulse(target, pulse_range, pulse_range, pulse_range, pulse_range) return 1 +/obj/item/projectile/ion/small + pulse_range = 0 + /obj/item/projectile/bullet/gyro name ="explosive bolt" icon_state= "bolter" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index d8df01b624b..9a3b324b30c 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -665,7 +665,7 @@ var/location = get_turf(holder.my_atom) // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(created_volume / 24), round(created_volume / 14), 1) + empulse(location, round(created_volume / 24), round(created_volume / 20), round(created_volume / 18), round(created_volume / 14), 1) holder.clear_reagents() return diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm index ab82dc53f4b..4e23410ac26 100644 --- a/code/modules/reagents/dispenser/cartridge_presets.dm +++ b/code/modules/reagents/dispenser/cartridge_presets.dm @@ -68,6 +68,8 @@ hot_coco spawn_reagent = "hot_coco" milk spawn_reagent = "milk" cream spawn_reagent = "cream" + mint spawn_reagent = "mint" + berry spawn_reagent = "berryjuice" // ERT inaprov spawn_reagent = "inaprovaline" diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm index 63f65335f41..05477d9cdde 100644 --- a/code/modules/reagents/dispenser/dispenser_presets.dm +++ b/code/modules/reagents/dispenser/dispenser_presets.dm @@ -131,5 +131,12 @@ /obj/item/weapon/reagent_containers/chem_disp_cartridge/milk, /obj/item/weapon/reagent_containers/chem_disp_cartridge/cream, /obj/item/weapon/reagent_containers/chem_disp_cartridge/tea, - /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice + /obj/item/weapon/reagent_containers/chem_disp_cartridge/ice, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/mint, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/orange, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lemon, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/lime, + /obj/item/weapon/reagent_containers/chem_disp_cartridge/berry, + + ) \ No newline at end of file diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index ee1bbcaf2fa..49678c966ca 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1586,6 +1586,14 @@ CIRCUITS BELOW build_path = /obj/item/weapon/implant/integrated_circuit sort_string = "VCAAE" +/datum/design/item/translator + name = "handheld translator" + id = "translator" + req_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 2000) + build_path = /obj/item/device/universal_translator + sort_string = "HABBA" + /* Uncomment if someone makes these buildable /datum/design/circuit/general_alert name = "general alert console" diff --git a/code/modules/security levels/security levels.dm b/code/modules/security levels/security levels.dm index 23c0585340f..32d752c7730 100644 --- a/code/modules/security levels/security levels.dm +++ b/code/modules/security levels/security levels.dm @@ -50,6 +50,11 @@ if(FA.z in using_map.contact_levels) FA.set_security_level(newlevel) + if(level >= SEC_LEVEL_RED) + atc.reroute_traffic(yes = 1) // Tell them fuck off we're busy. + else + atc.reroute_traffic(yes = 0) + /proc/get_security_level() switch(security_level) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 9e8a752122b..3690a1f2ba9 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -84,8 +84,14 @@ if(1) qdel(src) if(2) + if(prob(75)) + qdel(src) + if(3) if(prob(50)) qdel(src) + if(4) + if(prob(25)) + qdel(src) /obj/machinery/shield/hitby(AM as mob|obj) @@ -264,7 +270,7 @@ else user << "The device must first be secured to the floor." return - + /obj/machinery/shieldgen/emag_act(var/remaining_charges, var/mob/user) if(!malfunction) malfunction = 1 diff --git a/code/modules/spells/aoe_turf/disable_tech.dm b/code/modules/spells/aoe_turf/disable_tech.dm index 5192ecb664a..9acbf95369d 100644 --- a/code/modules/spells/aoe_turf/disable_tech.dm +++ b/code/modules/spells/aoe_turf/disable_tech.dm @@ -11,13 +11,15 @@ cooldown_min = 200 //50 deciseconds reduction per rank - var/emp_heavy = 6 - var/emp_light = 10 + var/emp_heavy = 3 + var/emp_med = 5 + var/emp_light = 8 + var/emp_long = 10 hud_state = "wiz_tech" /spell/aoe_turf/disable_tech/cast(list/targets) for(var/turf/target in targets) - empulse(get_turf(target), emp_heavy, emp_light) + empulse(get_turf(target), emp_heavy, emp_med, emp_light, emp_long) return \ No newline at end of file diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 34923745a46..a28f03e8feb 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -432,4 +432,4 @@ /obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob) ..() user <<"[src] suddenly feels very warm!" - empulse(src, 1, 1) + empulse(src, 1, 1, 1, 1) diff --git a/code/modules/xenoarcheaology/effects/emp.dm b/code/modules/xenoarcheaology/effects/emp.dm index d6d402efe4e..fd30420b577 100644 --- a/code/modules/xenoarcheaology/effects/emp.dm +++ b/code/modules/xenoarcheaology/effects/emp.dm @@ -9,5 +9,5 @@ /datum/artifact_effect/emp/DoEffectPulse() if(holder) var/turf/T = get_turf(holder) - empulse(T, effectrange/2, effectrange) + empulse(T, effectrange/4, effectrange/3, effectrange/2, effectrange) return 1 diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index 18c210a6dc4..cb600f254f7 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -96,10 +96,16 @@ update_values() +// Used to equalize the mixture between two zones before sleeping an edge. /datum/gas_mixture/proc/equalize(datum/gas_mixture/sharer) var/our_heatcap = heat_capacity() var/share_heatcap = sharer.heat_capacity() + // Special exception: there isn't enough air around to be worth processing this edge next tick, zap both to zero. + if(total_moles + sharer.total_moles <= MINIMUM_AIR_TO_SUSPEND) + gas.Cut() + sharer.gas.Cut() + for(var/g in gas|sharer.gas) var/comb = gas[g] + sharer.gas[g] comb /= volume + sharer.volume @@ -110,6 +116,9 @@ temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap) sharer.temperature = temperature + update_values() + sharer.update_values() + return 1 @@ -279,9 +288,16 @@ //Checks if we are within acceptable range of another gas_mixture to suspend processing or merge. -/datum/gas_mixture/proc/compare(const/datum/gas_mixture/sample) +/datum/gas_mixture/proc/compare(const/datum/gas_mixture/sample, var/vacuum_exception = 0) if(!sample) return 0 + if(vacuum_exception) + // Special case - If one of the two is zero pressure, the other must also be zero. + // This prevents suspending processing when an air-filled room is next to a vacuum, + // an edge case which is particually obviously wrong to players + if(total_moles == 0 && sample.total_moles != 0 || sample.total_moles == 0 && total_moles != 0) + return 0 + var/list/marked = list() for(var/g in gas) if((abs(gas[g] - sample.gas[g]) > MINIMUM_AIR_TO_SUSPEND) && \ diff --git a/html/changelogs/Anewbe - EMP.yml b/html/changelogs/Anewbe - EMP.yml new file mode 100644 index 00000000000..10e64aaee2f --- /dev/null +++ b/html/changelogs/Anewbe - EMP.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added an ion pistol, has five shots." + - rscadd: "Added Bay's Haywire rounds." + - tweak: "EMP now works on four levels, instead of two." \ No newline at end of file diff --git a/html/changelogs/Anewbe - Translator.yml b/html/changelogs/Anewbe - Translator.yml new file mode 100644 index 00000000000..2219cc592d9 --- /dev/null +++ b/html/changelogs/Anewbe - Translator.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Adds a universal translator device, courtesy of a downstream." diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index 140f573f698..ff49dc5577c 100644 Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi index 192798733fb..44521ed36e3 100644 Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index a1290564041..a1f1fb20ebc 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 3c5b0ce6671..d9b7bd22aaf 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 09fb9b6b7aa..c1410bfcd41 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/vorestation.dme b/vorestation.dme index fdd5f8a5b13..fde5c4111e2 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -818,6 +818,7 @@ #include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\translator.dm" #include "code\game\objects\items\devices\tvcamera.dm" #include "code\game\objects\items\devices\uplink.dm" #include "code\game\objects\items\devices\uplink_random_lists.dm" @@ -1209,10 +1210,10 @@ #include "code\modules\awaymissions\trigger.dm" #include "code\modules\awaymissions\zlevel.dm" #include "code\modules\blob\blob.dm" -#include "code\modules\busy_space\_defines.dm" #include "code\modules\busy_space\air_traffic.dm" #include "code\modules\busy_space\loremaster.dm" -#include "code\modules\busy_space\orgs.dm" +#include "code\modules\busy_space\organizations.dm" +#include "code\modules\busy_space\organizations_vr.dm" #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\movement.dm"