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"