Polaris Sync Merge

Fixed Polaris merge conflicts
* Space controller merge conflict
This commit is contained in:
Arokha Sieyes
2017-03-18 00:58:12 -04:00
62 changed files with 825 additions and 271 deletions

View File

@@ -180,7 +180,8 @@ Class Procs:
air_master.mark_zone_update(B) air_master.mark_zone_update(B)
/connection_edge/zone/recheck() /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) air_master.mark_edge_active(src)
//Helper proc to get connections for a zone. //Helper proc to get connections for a zone.
@@ -235,7 +236,10 @@ Class Procs:
air_master.mark_zone_update(A) air_master.mark_zone_update(A)
/connection_edge/unsimulated/recheck() /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) air_master.mark_edge_active(src)
proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles) proc/ShareHeat(datum/gas_mixture/A, datum/gas_mixture/B, connecting_tiles)

View File

@@ -84,6 +84,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
if(istype(A, /area/hallway)) if(istype(A, /area/hallway))
A.readyalert() A.readyalert()
atc.reroute_traffic(yes = 1)
//calls the shuttle for a routine crew transfer //calls the shuttle for a routine crew transfer
/datum/emergency_shuttle_controller/proc/call_transfer() /datum/emergency_shuttle_controller/proc/call_transfer()
if(!can_call()) return if(!can_call()) return
@@ -98,7 +100,7 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
shuttle.move_time = SHUTTLE_TRANSIT_DURATION 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")) 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 //recalls the shuttle
/datum/emergency_shuttle_controller/proc/recall() /datum/emergency_shuttle_controller/proc/recall()

View File

@@ -95,11 +95,15 @@
changeling.chem_charges -= 20 changeling.chem_charges -= 20
var/range_heavy = 2 var/range_heavy = 1
var/range_light = 5 var/range_med = 2
var/range_light = 4
var/range_long = 6
if(src.mind.changeling.recursive_enhancement) if(src.mind.changeling.recursive_enhancement)
range_heavy = range_heavy * 2 range_heavy = range_heavy * 2
range_med = range_med * 2
range_light = range_light * 2 range_light = range_light * 2
range_long = range_long * 2
src << "<span class='notice'>We are extra loud.</span>" src << "<span class='notice'>We are extra loud.</span>"
src.mind.changeling.recursive_enhancement = 0 src.mind.changeling.recursive_enhancement = 0

View File

@@ -231,7 +231,7 @@ var/list/sacrificed = list()
if(T) if(T)
T.hotspot_expose(700,125) T.hotspot_expose(700,125)
var/rune = src // detaching the proc - in theory 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) qdel(rune)
return return

View File

@@ -254,7 +254,7 @@
..() ..()
// Best case scenario: Comparable to a low-yield EMP grenade. // Best case scenario: Comparable to a low-yield EMP grenade.
// Worst case scenario: Comparable to a standard 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 //Station buster Tunguska
/obj/effect/meteor/tunguska /obj/effect/meteor/tunguska

View File

@@ -126,7 +126,7 @@
safe_blink(src, range = 6) safe_blink(src, range = 6)
src << "<span class='warning'>You're teleported against your will!</span>" src << "<span class='warning'>You're teleported against your will!</span>"
if(4) if(4)
emp_act(2) emp_act(3)
if(51 to 100) //Severe if(51 to 100) //Severe
rng = rand(0,3) rng = rand(0,3)

View File

@@ -23,7 +23,7 @@
..() ..()
/obj/item/weapon/spell/spawner/pulsar/on_throw_cast(atom/hit_atom, mob/user) /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 /obj/effect/temporary_effect/pulsar
name = "pulsar" name = "pulsar"
@@ -44,7 +44,7 @@
/obj/effect/temporary_effect/pulsar/proc/pulse_loop() /obj/effect/temporary_effect/pulsar/proc/pulse_loop()
while(pulses_remaining) while(pulses_remaining)
sleep(2 SECONDS) sleep(2 SECONDS)
empulse(src, heavy_range = 1, light_range = 2, log = 1) empulse(src, 1, 1, 2, 2, log = 1)
pulses_remaining-- pulses_remaining--
qdel(src) qdel(src)

View File

@@ -66,7 +66,11 @@
if(1) if(1)
num_of_prizes = rand(1,4) num_of_prizes = rand(1,4)
if(2) if(2)
num_of_prizes = rand(1,3)
if(3)
num_of_prizes = rand(0,2) 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--) for(num_of_prizes; num_of_prizes > 0; num_of_prizes--)
empprize = pickweight(prizes) empprize = pickweight(prizes)
new empprize(src.loc) new empprize(src.loc)

View File

@@ -34,13 +34,15 @@
var/status_display_freq = "1435" var/status_display_freq = "1435"
var/stat_msg1 var/stat_msg1
var/stat_msg2 var/stat_msg2
var/datum/lore/atc_controller/ATC //VOREStation Add
var/datum/lore/atc_controller/ATC
var/datum/announcement/priority/crew_announcement = new var/datum/announcement/priority/crew_announcement = new
/obj/machinery/computer/communications/New() /obj/machinery/computer/communications/New()
..() ..()
ATC = atc
crew_announcement.newscast = 1 crew_announcement.newscast = 1
ATC = atc //VOREStation Add
/obj/machinery/computer/communications/process() /obj/machinery/computer/communications/process()
if(..()) if(..())
if(state != STATE_STATUSDISPLAY) if(state != STATE_STATUSDISPLAY)
@@ -130,10 +132,8 @@
if("messagelist") if("messagelist")
src.currmsg = 0 src.currmsg = 0
src.state = STATE_MESSAGELIST src.state = STATE_MESSAGELIST
//VOREStation Add for ATC stuff
if("toggleatc") if("toggleatc")
src.ATC.squelched = !src.ATC.squelched src.ATC.squelched = !src.ATC.squelched
//VOREStation Add End
if("viewmessage") if("viewmessage")
src.state = STATE_VIEWMESSAGE src.state = STATE_VIEWMESSAGE
if (!src.currmsg) if (!src.currmsg)
@@ -315,7 +315,7 @@
else else
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=login'>Log In</A> \]" dat += "<BR>\[ <A HREF='?src=\ref[src];operation=login'>Log In</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=messagelist'>Message List</A> \]" dat += "<BR>\[ <A HREF='?src=\ref[src];operation=messagelist'>Message List</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=toggleatc'>[ATC.squelched ? "Enable" : "Disable"] ATC Relay</A> \]" //VOREStation Add dat += "<BR>\[ <A HREF='?src=\ref[src];operation=toggleatc'>[ATC.squelched ? "Enable" : "Disable"] ATC Relay</A> \]"
if(STATE_CALLSHUTTLE) if(STATE_CALLSHUTTLE)
dat += "Are you sure you want to call the shuttle? \[ <A HREF='?src=\ref[src];operation=callshuttle2'>OK</A> | <A HREF='?src=\ref[src];operation=main'>Cancel</A> \]" dat += "Are you sure you want to call the shuttle? \[ <A HREF='?src=\ref[src];operation=callshuttle2'>OK</A> | <A HREF='?src=\ref[src];operation=main'>Cancel</A> \]"
if(STATE_CANCELSHUTTLE) if(STATE_CANCELSHUTTLE)
@@ -379,7 +379,7 @@
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-callshuttle'>Call Emergency Shuttle</A> \]" dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-callshuttle'>Call Emergency Shuttle</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-messagelist'>Message List</A> \]" dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-messagelist'>Message List</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-status'>Set Status Display</A> \]" dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-status'>Set Status Display</A> \]"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=toggleatc'>[ATC.squelched ? "Enable" : "Disable"] ATC Relay</A> \]" //VOREStation Add dat += "<BR>\[ <A HREF='?src=\ref[src];operation=toggleatc'>[ATC.squelched ? "Enable" : "Disable"] ATC Relay</A> \]"
if(STATE_CALLSHUTTLE) if(STATE_CALLSHUTTLE)
dat += "Are you sure you want to call the shuttle? \[ <A HREF='?src=\ref[src];operation=ai-callshuttle2'>OK</A> | <A HREF='?src=\ref[src];operation=ai-main'>Cancel</A> \]" dat += "Are you sure you want to call the shuttle? \[ <A HREF='?src=\ref[src];operation=ai-callshuttle2'>OK</A> | <A HREF='?src=\ref[src];operation=ai-main'>Cancel</A> \]"
if(STATE_MESSAGELIST) if(STATE_MESSAGELIST)

View File

@@ -441,7 +441,7 @@ var/list/turret_icons
else else
take_damage(initial(health) * 8) //should instakill most turrets take_damage(initial(health) * 8) //should instakill most turrets
if(3) 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 /obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
health = 0 health = 0

View File

@@ -105,7 +105,7 @@
proc/shock() proc/shock()
var/obj/mecha/M = in_mecha() var/obj/mecha/M = in_mecha()
if(M) if(M)
M.emp_act(2) M.emp_act(4)
qdel(src) qdel(src)
proc/get_mecha_log() proc/get_mecha_log()

View File

@@ -4,17 +4,17 @@
// #define EMPDEBUG 10 // #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(!epicenter) return
if(!istype(epicenter, /turf)) if(!istype(epicenter, /turf))
epicenter = get_turf(epicenter.loc) epicenter = get_turf(epicenter.loc)
if(log) if(log)
message_admins("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 ([heavy_range], [light_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) var/obj/effect/overlay/pulse = PoolOrNew(/obj/effect/overlay, epicenter)
pulse.icon = 'icons/effects/effects.dmi' pulse.icon = 'icons/effects/effects.dmi'
pulse.icon_state = "emppulse" pulse.icon_state = "emppulse"
@@ -23,28 +23,50 @@ proc/empulse(turf/epicenter, heavy_range, light_range, log=0)
spawn(20) spawn(20)
qdel(pulse) qdel(pulse)
if(heavy_range > light_range) if(first_range > second_range)
light_range = heavy_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' 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 #ifdef EMPDEBUG
var/time = world.timeofday var/time = world.timeofday
#endif #endif
var/distance = get_dist(epicenter, T) var/distance = get_dist(epicenter, T)
if(distance < 0) if(distance < 0)
distance = 0 distance = 0
if(distance < heavy_range) //Worst effects, really hurts
if(distance < first_range)
T.emp_act(1) T.emp_act(1)
else if(distance == heavy_range) else if(distance == first_range)
if(prob(50)) if(prob(50))
T.emp_act(1) T.emp_act(1)
else else
T.emp_act(2) T.emp_act(2)
else if(distance <= light_range) //Slightly less painful
else if(distance <= second_range)
T.emp_act(2) 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 #ifdef EMPDEBUG
if((world.timeofday - time) >= EMPDEBUG) if((world.timeofday - time) >= EMPDEBUG)
log_and_message_admins("EMPDEBUG: [T.name] - [T.type] - took [world.timeofday - time]ds to process emp_act()!") log_and_message_admins("EMPDEBUG: [T.name] - [T.type] - took [world.timeofday - time]ds to process emp_act()!")

View File

@@ -998,7 +998,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
M.apply_damage( rand(30,60) , BURN) M.apply_damage( rand(30,60) , BURN)
message += "You feel a searing heat! Your [P] is burning!" message += "You feel a searing heat! Your [P] is burning!"
if(i>=20 && i<=25) //EMP 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!" message += "Your [P] emits a wave of electromagnetic energy!"
if(i>=25 && i<=40) //Smoke if(i>=25 && i<=40) //Smoke
var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem var/datum/effect/effect/system/smoke_spread/chem/S = new /datum/effect/effect/system/smoke_spread/chem

View File

@@ -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, "<span class='warning'>\The [src] cannot output that language.</span>")
return
else
listening = 1
listening_objects |= src
if(mult_icons)
icon_state = "[initial(icon_state)]1"
to_chat(user, "<span class='notice'>You enable \the [src], translating into [langset.name].</span>")
else //Turning OFF
listening = 0
listening_objects -= src
langset = null
icon_state = "[initial(icon_state)]"
to_chat(user, "<span class='notice'>You disable \the [src].</span>")
/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, "<i><b>[src]</b> translates, </i>\"<span class='[langset.colour]'>[message]</span>\"")
//They don't understand the output language
else
to_chat(L, "<i><b>[src]</b> translates, </i>\"<span class='[langset.colour]'>[langset.scramble(message)]</span>\"")
//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

View File

@@ -3,12 +3,14 @@
icon_state = "emp" icon_state = "emp"
item_state = "empgrenade" item_state = "empgrenade"
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3) origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
var/emp_heavy = 4 var/emp_heavy = 2
var/emp_light = 10 var/emp_med = 4
var/emp_light = 7
var/emp_long = 10
prime() prime()
..() ..()
if(empulse(src, emp_heavy, emp_light)) if(empulse(src, emp_heavy, emp_med, emp_light, emp_long))
qdel(src) qdel(src)
return return
@@ -18,4 +20,6 @@
icon_state = "lyemp" icon_state = "lyemp"
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3) origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
emp_heavy = 1 emp_heavy = 1
emp_light = 4 emp_med = 2
emp_light = 3
emp_long = 4

View File

@@ -101,6 +101,10 @@ Implant Specifics:<BR>"}
meltdown() meltdown()
if(2) if(2)
delay = rand(5*60*10,15*60*10) //from 5 to 15 minutes of free time 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) spawn(delay)
malfunction-- malfunction--
@@ -227,10 +231,22 @@ Implant Specifics:<BR>"}
return return
malfunction = MALFUNCTION_TEMPORARY malfunction = MALFUNCTION_TEMPORARY
switch (severity) 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)) if (prob(50))
small_boom() 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(70))
if (prob(50)) if (prob(50))
small_boom() small_boom()
@@ -320,7 +336,13 @@ the implant may become unstable and either pre-maturely inject the subject or si
if(prob(60)) if(prob(60))
activate(20) activate(20)
if(2) if(2)
if(prob(30)) if(prob(40))
activate(20)
if(3)
if(prob(40))
activate(5)
if(4)
if(prob(20))
activate(5) activate(5)
spawn(20) spawn(20)

View File

@@ -142,6 +142,7 @@
new /obj/item/clothing/suit/storage/toggle/labcoat/emt(src) new /obj/item/clothing/suit/storage/toggle/labcoat/emt(src)
new /obj/item/device/radio/headset/headset_med/alt(src) new /obj/item/device/radio/headset/headset_med/alt(src)
new /obj/item/weapon/cartridge/medical(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/device/flashlight(src)
new /obj/item/weapon/tank/emergency/oxygen/engi(src) new /obj/item/weapon/tank/emergency/oxygen/engi(src)
new /obj/item/clothing/glasses/hud/health(src) new /obj/item/clothing/glasses/hud/health(src)

View File

@@ -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 var/heavy = input("Range of heavy pulse.", text("Input")) as num|null
if(heavy == null) return 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 var/light = input("Range of light pulse.", text("Input")) as num|null
if(light == null) return 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) empulse(O, heavy, med, light, long)
log_admin("[key_name(usr)] created an EM Pulse ([heavy],[light]) at ([O.x],[O.y],[O.z])") 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],[light]) at ([O.x],[O.y],[O.z])", 1) 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! feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return return

View File

@@ -3,16 +3,16 @@
var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
/datum/lore/atc_controller /datum/lore/atc_controller
var/delay_max = 25 MINUTES //How long between ATC traffic, max 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 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 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/next_message //When the next message should happen in world.time
var/force_chatter_type //Force a specific type of messages var/force_chatter_type //Force a specific type of messages
var/squelched = 0 //If ATC is squelched currently var/squelched = 0 //If ATC is squelched currently
/datum/lore/atc_controller/New() /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.") msg("New shift beginning, resuming traffic control.")
next_message = world.time + rand(delay_min,delay_max) next_message = world.time + rand(delay_min,delay_max)
process() 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) /datum/lore/atc_controller/proc/msg(var/message,var/sender)
ASSERT(message) 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) /datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1)
if(yes) if(yes)
msg("Rerouting traffic away from NSS Adaphagia.") if(!squelched)
msg("Rerouting traffic away from [using_map.station_name].")
squelched = 1 squelched = 1
else else
msg("Resuming normal traffic routing around NSS Adaphagia.") if(squelched)
msg("Resuming normal traffic routing around [using_map.station_name].")
squelched = 0 squelched = 0
/datum/lore/atc_controller/proc/shift_ending(var/evac = 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) 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() /datum/lore/atc_controller/proc/random_convo()
var/one = pick(loremaster.orgs) //These will pick an index, not an instance var/one = pick(loremaster.organizations) //These will pick an index, not an instance
var/two = pick(loremaster.orgs) var/two = pick(loremaster.organizations)
var/datum/lore/org/source = loremaster.orgs[one] //Resolve to the instances var/datum/lore/organization/source = loremaster.organizations[one] //Resolve to the instances
var/datum/lore/org/dest = loremaster.orgs[two] var/datum/lore/organization/dest = loremaster.organizations[two]
//Let's get some mission parameters //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/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/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/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/combined_name = "[owner] [prefix] [shipname]"
var/alt_atc_names = list("Virgo TraCon","Virgo Control","Virgo ATC","Virgo Airspace") 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","Polaris TraCon","Orion Control") var/wrong_atc_names = list("Sol Command","Orion Control", "[using_map.dock_name]")
var/mission_noun = list("flight","mission","route") var/mission_noun = list("flight","mission","route")
var/request_verb = list("requesting","calling for","asking for") var/request_verb = list("requesting","calling for","asking for")
//First response is 'yes', second is 'no' //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"), "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"), "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"), "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") if("wrong_freq")
callname = pick(wrong_atc_names) 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_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_response = "[combined_name], this is [using_map.station_short] TraCon, wrong frequency. Switch to [rand(700,999)].[rand(1,9)]."
full_closure = "Virgo TraCon, understood, apologies." full_closure = "[using_map.station_short] TraCon, understood, apologies."
if("wrong_lang") if("wrong_lang")
//Can't implement this until autosay has language support //Can't implement this until autosay has language support
if("emerg") 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") 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_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_response = "[combined_name], this is [using_map.station_short] TraCon, copy. Switch to emergency responder channel [rand(700,999)].[rand(1,9)]."
full_closure = "Virgo TraCon, okay, switching now." full_closure = "[using_map.station_short] TraCon, okay, switching now."
else else
full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]." 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_response = "[combined_name], this is [using_map.station_short] TraCon, [response]." //Station 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_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 //Ship sends request to ATC
msg(full_request,"[prefix] [shipname]") msg(full_request,"[prefix] [shipname]")
@@ -124,5 +126,4 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
sleep(5 SECONDS) sleep(5 SECONDS)
//Ship sends response to ATC //Ship sends response to ATC
msg(full_closure,"[prefix] [shipname]") msg(full_closure,"[prefix] [shipname]")
return return

View File

@@ -3,12 +3,11 @@
var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster
/datum/lore/loremaster /datum/lore/loremaster
var/list/orgs = list() var/list/organizations = list()
/datum/lore/loremaster/New() /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) for(var/path in paths)
var/datum/lore/org/instance = new path() var/datum/lore/organization/instance = new path()
orgs[path] = instance organizations[path] = instance

View File

@@ -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<75> 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<65>s rise to stardom came from their introduction of ressurective cloning, although in \
recent years they<65>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<48>s fortunes have been in decline as Nanotrasen<65>s near monopoly \
on phoron research cuts into their R&D and Vey-Med<65>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<68>s economies \
of scale frequently steal market share from Nanotrasen<65>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<6F>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<65>s for cost. Bishop<6F>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",
)
*/

View File

@@ -1,72 +1,9 @@
//Datums for different companies that can be used by busy_space //Datums for different companies that can be used by busy_space, VR edition
/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)
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
/datum/lore/org/nanotrasen /datum/lore/organization/federation
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
name = "United Federation of Planets" 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 \ 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 \ 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 \ for all. It is one of the larger known interstellar powers in known space and is seen as being \
@@ -84,8 +21,6 @@
headquarters = "" headquarters = ""
motto = "" motto = ""
org_flags = ORG_HAS_NAVY|ORG_HAS_TRADERS|ORG_HAS_TECH|ORG_HAS_DIPLO
//Star Trek ship names! //Star Trek ship names!
ship_prefixes = list("SCV" = "military", "STV" = "trading", "SDV" = "diplomatic") ship_prefixes = list("SCV" = "military", "STV" = "trading", "SDV" = "diplomatic")
ship_names = list("Kestrel", ship_names = list("Kestrel",
@@ -134,56 +69,9 @@
"Mari Industrial Complex on Furlou Prime", "Mari Industrial Complex on Furlou Prime",
"Runni Crystal Mines of Keid V") "Runni Crystal Mines of Keid V")
/datum/lore/org/solgov /datum/lore/organization/unsc
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
name = "United Nations Space Command" 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. \ 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." While it is greater in military strength than most alien polities, it is not by much."
history = "" history = ""
@@ -191,8 +79,6 @@
headquarters = "Earth" headquarters = "Earth"
motto = "" motto = ""
org_flags = ORG_HAS_NAVY|ORG_HAS_TECH
//Halo ship names! //Halo ship names!
ship_prefixes = list("UNSC" = "military") ship_prefixes = list("UNSC" = "military")
ship_names = list("Colorado", ship_names = list("Colorado",
@@ -227,9 +113,9 @@
"a colony ship around Ceti IV-B", "a colony ship around Ceti IV-B",
"a classified location in SolGov territory") "a classified location in SolGov territory")
/datum/lore/org/kitsuhana /datum/lore/organization/kitsuhana
name = "Kitsuhana Heavy Industries" 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' \ 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 \ 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 \ 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" headquarters = "Kitsuhana Prime"
motto = "Do what you want. We know we will." 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! //Culture ship names!
ship_prefixes = list("KHI" = "personal") //Everybody's out for themselves, yanno. ship_prefixes = list("KHI" = "personal") //Everybody's out for themselves, yanno.
ship_names = list("Nervous Energy", ship_names = list("Nervous Energy",
@@ -283,9 +167,9 @@
"a Kitsuhana ringworld in Dais IX", "a Kitsuhana ringworld in Dais IX",
"a Kitsuhana ringworld in Leibert II-b") "a Kitsuhana ringworld in Leibert II-b")
/datum/lore/org/ares /datum/lore/organization/ares
name = "Ares Confederation" 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. \ 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, \ 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 \ which are privateers, volunteers and former pirates. The Ares Confederation only holds a \
@@ -297,8 +181,6 @@
headquarters = "Paraiso a Àstrea" headquarters = "Paraiso a Àstrea"
motto = "Liberty to the Stars!" motto = "Liberty to the Stars!"
org_flags = ORG_HAS_NAVY|ORG_HAS_SHADY
ship_prefixes = list("UFHV" = "military", "FFHV" = "shady") ship_prefixes = list("UFHV" = "military", "FFHV" = "shady")
ship_names = list("Liberty", ship_names = list("Liberty",
"Charged Negotiation", "Charged Negotiation",
@@ -342,19 +224,3 @@
"a settlement needing our help", "a settlement needing our help",
"Forward Base Sigma-Alpha in ArCon space") "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()
*/

View File

@@ -8,3 +8,8 @@
/datum/gear/ears/headphones /datum/gear/ears/headphones
display_name = "headphones" display_name = "headphones"
path = /obj/item/clothing/ears/earmuffs/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

View File

@@ -61,3 +61,8 @@
cost = 2 cost = 2
slot = "implant" slot = "implant"
var/implant_type = "EAL" var/implant_type = "EAL"
/datum/gear/utility/translator
display_name = "universal translator"
path = /obj/item/device/universal_translator
cost = 5

View File

@@ -199,10 +199,7 @@
/obj/item/clothing/gloves/emp_act(severity) /obj/item/clothing/gloves/emp_act(severity)
if(cell) if(cell)
//why is this not part of the powercell code? cell.emp_act(severity)
cell.charge -= 1000 / severity
if (cell.charge < 0)
cell.charge = 0
..() ..()
// Called just before an attack_hand(), in mob/UnarmedAttack() // Called just before an attack_hand(), in mob/UnarmedAttack()

View File

@@ -94,7 +94,7 @@
var/list/valid_names = splittext(real_name, " ") // Should output list("John", "Doe") as an example. var/list/valid_names = splittext(real_name, " ") // Should output list("John", "Doe") as an example.
valid_names += special_mentions() valid_names += special_mentions()
for(var/name in valid_names) 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 TRUE
return FALSE return FALSE
@@ -108,7 +108,7 @@
// Converts specific characters, like *, /, and _ to formatted output. // Converts specific characters, like *, /, and _ to formatted output.
/mob/proc/say_emphasis(var/message) /mob/proc/say_emphasis(var/message)
message = encode_html_emphasis(message, "/", "i") message = encode_html_emphasis(message, "/", "i")
message = encode_html_emphasis(message, "*", "b") message = encode_html_emphasis(message, "+", "b")
message = encode_html_emphasis(message, "_", "u") message = encode_html_emphasis(message, "_", "u")
return message return message

View File

@@ -164,7 +164,9 @@
if(2) if(2)
brainmob.emp_damage += rand(10,20) brainmob.emp_damage += rand(10,20)
if(3) 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 /obj/item/device/mmi/digital
@@ -216,7 +218,9 @@
if(2) if(2)
src.brainmob.emp_damage += rand(10,20) src.brainmob.emp_damage += rand(10,20)
if(3) 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) /obj/item/device/mmi/digital/transfer_identity(var/mob/living/carbon/H)

View File

@@ -112,7 +112,9 @@
if(2) if(2)
src.brainmob.emp_damage += rand(10,20) src.brainmob.emp_damage += rand(10,20)
if(3) 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() /obj/item/device/mmi/digital/posibrain/New()

View File

@@ -65,7 +65,13 @@
src.take_organ_damage(0,20,emp=1) src.take_organ_damage(0,20,emp=1)
confused = (min(confused + 5, 30)) confused = (min(confused + 5, 30))
if(2) 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) 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)) confused = (min(confused + 2, 30))
flash_eyes(affect_silicon = 1) flash_eyes(affect_silicon = 1)
src << "<span class='danger'><B>*BZZZT*</B></span>" src << "<span class='danger'><B>*BZZZT*</B></span>"

View File

@@ -281,9 +281,13 @@ var/list/organ_cache = list()
return return
switch (severity) switch (severity)
if (1) if (1)
take_damage(5) take_damage(rand(6,12))
if (2) 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) /obj/item/organ/proc/removed(var/mob/living/user)

View File

@@ -102,11 +102,19 @@
/obj/item/organ/external/emp_act(severity) /obj/item/organ/external/emp_act(severity)
if(!(robotic >= ORGAN_ROBOT)) if(!(robotic >= ORGAN_ROBOT))
return return
var/burn_damage = 0
switch (severity) switch (severity)
if (1) if (1)
take_damage(8) burn_damage += rand(8, 13)
if (2) 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) /obj/item/organ/external/attack_self(var/mob/living/user)
if(!contents.len) if(!contents.len)
@@ -243,12 +251,12 @@
return (vital || (robotic >= ORGAN_ROBOT) || brute_dam + burn_dam + additional_damage < max_damage) 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()) /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)) if((brute <= 0) && (burn <= 0))
return 0 return 0
brute *= brute_mod
burn *= burn_mod
// High brute damage or sharp objects may damage internal organs // High brute damage or sharp objects may damage internal organs
if(internal_organs && (brute_dam >= max_damage || (((sharp && brute >= 5) || brute >= 10) && prob(5)))) if(internal_organs && (brute_dam >= max_damage || (((sharp && brute >= 5) || brute >= 10) && prob(5))))
// Damage an internal organ // Damage an internal organ

View File

@@ -97,6 +97,12 @@
if(2) if(2)
if(active) toggle_power() if(active) toggle_power()
stability -= rand(10,20) 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 return 0

View File

@@ -1193,22 +1193,27 @@ obj/machinery/power/apc/proc/autoset(var/cur_state, var/on)
/obj/machinery/power/apc/ex_act(severity) /obj/machinery/power/apc/ex_act(severity)
switch(severity) switch(severity)
if(1.0) if(1)
//set_broken() //now qdel() do what we need //set_broken() //now qdel() do what we need
if (cell) if (cell)
cell.ex_act(1.0) // more lags woohoo cell.ex_act(1) // more lags woohoo
qdel(src) qdel(src)
return return
if(2.0) if(2)
if (prob(75))
set_broken()
if (cell && prob(50))
cell.ex_act(2)
if(3)
if (prob(50)) if (prob(50))
set_broken() set_broken()
if (cell && prob(50)) if (cell && prob(50))
cell.ex_act(2.0) cell.ex_act(3)
if(3.0) if(4)
if (prob(25)) if (prob(25))
set_broken() set_broken()
if (cell && prob(25)) if (cell && prob(50))
cell.ex_act(3.0) cell.ex_act(3)
return return
/obj/machinery/power/apc/disconnect_terminal() /obj/machinery/power/apc/disconnect_terminal()

View File

@@ -165,7 +165,7 @@
return return
if (overcharge_percent >= 140) if (overcharge_percent >= 140)
if (prob(1)) 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 ((2.4e6+1) to 3.6e6)
if (overcharge_percent >= 115) if (overcharge_percent >= 115)
if (prob(7)) if (prob(7))
@@ -174,7 +174,7 @@
return return
if (overcharge_percent >= 130) if (overcharge_percent >= 130)
if (prob(1)) if (prob(1))
empulse(src.loc, 3, 8, 1) empulse(src.loc, 2, 3, 6, 8, 1)
if (overcharge_percent >= 150) if (overcharge_percent >= 150)
if (prob(1)) if (prob(1))
explosion(src.loc, 0, 1, 3, 5) explosion(src.loc, 0, 1, 3, 5)
@@ -186,7 +186,7 @@
return return
if (overcharge_percent >= 125) if (overcharge_percent >= 125)
if (prob(2)) if (prob(2))
empulse(src.loc, 4, 10, 1) empulse(src.loc, 2, 4, 7, 10, 1)
if (overcharge_percent >= 140) if (overcharge_percent >= 140)
if (prob(1)) if (prob(1))
explosion(src.loc, 1, 3, 5, 8) explosion(src.loc, 1, 3, 5, 8)

View File

@@ -62,9 +62,12 @@
stat &= BROKEN stat &= BROKEN
if(prob(75)) explode() if(prob(75)) explode()
if(2) if(2)
if(prob(25)) stat &= BROKEN if(prob(50)) stat &= BROKEN
if(prob(10)) explode() if(prob(10)) explode()
if(3) if(3)
if(prob(25)) stat &= BROKEN
duration = 300
if(4)
if(prob(10)) stat &= BROKEN if(prob(10)) stat &= BROKEN
duration = 300 duration = 300

View File

@@ -441,9 +441,9 @@
/obj/singularity/proc/emp_area() /obj/singularity/proc/emp_area()
if(current_size != 11) if(current_size != 11)
empulse(src, 8, 10) empulse(src, 4, 6, 8, 10)
else else
empulse(src, 12, 16) empulse(src, 12, 14, 16, 18)
/obj/singularity/proc/smwave() /obj/singularity/proc/smwave()
for(var/mob/living/M in view(10, src.loc)) for(var/mob/living/M in view(10, src.loc))

View File

@@ -393,10 +393,14 @@
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(3, 1, src) s.set_up(3, 1, src)
s.start() s.start()
if(prob(50)) if(prob(25))
emp_act(1) emp_act(1)
else else if(prob(25))
emp_act(2) emp_act(2)
else if(prob(25))
emp_act(3)
else
emp_act(4)
if(prob(5)) //smoke only if(prob(5)) //smoke only
var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
smoke.set_up(3, 0, src.loc) smoke.set_up(3, 0, src.loc)

View File

@@ -212,7 +212,7 @@
h_user.adjustFireLoss(rand(10,25)) h_user.adjustFireLoss(rand(10,25))
h_user.Paralyse(5) h_user.Paralyse(5)
spawn(0) spawn(0)
empulse(src.loc, 2, 4) empulse(src.loc, 1, 2, 3, 4)
charge = 0 charge = 0
if (36 to 60) if (36 to 60)
@@ -229,7 +229,7 @@
h_user.adjustFireLoss(rand(35,75)) h_user.adjustFireLoss(rand(35,75))
h_user.Paralyse(12) h_user.Paralyse(12)
spawn(0) spawn(0)
empulse(src.loc, 8, 16) empulse(src.loc, 6, 8, 12, 16)
charge = 0 charge = 0
apcs_overload(1, 10) apcs_overload(1, 10)
src.ping("Caution. Output regulators malfunction. Uncontrolled discharge detected.") src.ping("Caution. Output regulators malfunction. Uncontrolled discharge detected.")

View File

@@ -26,6 +26,10 @@
name = "speedloader (.38 rubber)" name = "speedloader (.38 rubber)"
ammo_type = /obj/item/ammo_casing/c38r 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 ///////// ///////// .45 /////////
/obj/item/ammo_magazine/c45m /obj/item/ammo_magazine/c45m
@@ -57,6 +61,10 @@
name = "magazine (.45 AP)" name = "magazine (.45 AP)"
ammo_type = /obj/item/ammo_casing/c45ap 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 /obj/item/ammo_magazine/c45uzi
name = "stick magazine (.45)" name = "stick magazine (.45)"
icon_state = "uzi45" icon_state = "uzi45"
@@ -272,6 +280,10 @@
max_ammo = 9 max_ammo = 9
multiple_sprites = 1 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 ///////// ///////// 5.56mm /////////
/obj/item/ammo_magazine/a556 /obj/item/ammo_magazine/a556

View File

@@ -24,6 +24,13 @@
icon_state = "r-casing" icon_state = "r-casing"
projectile_type = /obj/item/projectile/bullet/pistol/rubber 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 /obj/item/ammo_casing/c9mm
desc = "A 9mm bullet casing." desc = "A 9mm bullet casing."
caliber = "9mm" caliber = "9mm"
@@ -87,11 +94,24 @@
icon_state = "r-casing" icon_state = "r-casing"
projectile_type = /obj/item/projectile/energy/flash 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 /obj/item/ammo_casing/a10mm
desc = "A 10mm bullet casing." desc = "A 10mm bullet casing."
caliber = "10mm" caliber = "10mm"
projectile_type = /obj/item/projectile/bullet/pistol/medium 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 /obj/item/ammo_casing/shotgun
name = "shotgun slug" name = "shotgun slug"
@@ -150,13 +170,13 @@
projectile_type = /obj/item/projectile/energy/flash/flare projectile_type = /obj/item/projectile/energy/flash/flare
matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90)
/obj/item/ammo_casing/shotgun/emp /obj/item/ammo_casing/shotgun/emp
name = "ion shell" name = "ion shell"
desc = "An advanced shotgun round that creates a small EMP when it strikes a target." desc = "An advanced shotgun round that creates a small EMP when it strikes a target."
icon_state = "empshell" icon_state = "empshell"
projectile_type = /obj/item/projectile/bullet/shotgun/ion projectile_type = /obj/item/projectile/ion
matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) // projectile_type = /obj/item/projectile/bullet/shotgun/ion
matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240)
/obj/item/ammo_casing/a762 /obj/item/ammo_casing/a762
desc = "A 7.62mm bullet casing." desc = "A 7.62mm bullet casing."

View File

@@ -12,14 +12,18 @@
projectile_type = /obj/item/projectile/ion projectile_type = /obj/item/projectile/ion
/obj/item/weapon/gun/energy/ionrifle/emp_act(severity) /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() /obj/item/weapon/gun/energy/ionrifle/pistol
..() name = "ion pistol"
if(power_supply.charge < charge_cost) 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.."
item_state = "ionrifle0" icon_state = "ionpistol"
else item_state = null
item_state = initial(item_state) 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 /obj/item/weapon/gun/energy/decloner
name = "biological demolecularisor" name = "biological demolecularisor"

View File

@@ -76,6 +76,10 @@
fire_sound = 'sound/weapons/Gunshot_light.ogg' fire_sound = 'sound/weapons/Gunshot_light.ogg'
ammo_type = /obj/item/ammo_casing/c38 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() /obj/item/weapon/gun/projectile/revolver/deckard/update_icon()
..() ..()
if(loaded.len) if(loaded.len)

View File

@@ -172,7 +172,8 @@
range_step = 1 range_step = 1
spread_step = 10 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 /obj/item/projectile/bullet/shotgun/ion
name = "ion slug" name = "ion slug"
damage = 15 damage = 15
@@ -182,9 +183,10 @@
/obj/item/projectile/bullet/shotgun/ion/on_hit(var/atom/target, var/blocked = 0) /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 return 1
/* "Rifle" rounds */ /* "Rifle" rounds */
/obj/item/projectile/bullet/rifle /obj/item/projectile/bullet/rifle

View File

@@ -8,12 +8,16 @@
light_range = 2 light_range = 2
light_power = 0.5 light_power = 0.5
light_color = "#55AAFF" light_color = "#55AAFF"
var/pulse_range = 1
on_hit(var/atom/target, var/blocked = 0) on_hit(var/atom/target, var/blocked = 0)
empulse(target, 1, 1) empulse(target, pulse_range, pulse_range, pulse_range, pulse_range)
return 1 return 1
/obj/item/projectile/ion/small
pulse_range = 0
/obj/item/projectile/bullet/gyro /obj/item/projectile/bullet/gyro
name ="explosive bolt" name ="explosive bolt"
icon_state= "bolter" icon_state= "bolter"

View File

@@ -665,7 +665,7 @@
var/location = get_turf(holder.my_atom) var/location = get_turf(holder.my_atom)
// 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. // 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. // 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() holder.clear_reagents()
return return

View File

@@ -68,6 +68,8 @@
hot_coco spawn_reagent = "hot_coco" hot_coco spawn_reagent = "hot_coco"
milk spawn_reagent = "milk" milk spawn_reagent = "milk"
cream spawn_reagent = "cream" cream spawn_reagent = "cream"
mint spawn_reagent = "mint"
berry spawn_reagent = "berryjuice"
// ERT // ERT
inaprov spawn_reagent = "inaprovaline" inaprov spawn_reagent = "inaprovaline"

View File

@@ -131,5 +131,12 @@
/obj/item/weapon/reagent_containers/chem_disp_cartridge/milk, /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/cream,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/tea, /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,
) )

View File

@@ -1586,6 +1586,14 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/implant/integrated_circuit build_path = /obj/item/weapon/implant/integrated_circuit
sort_string = "VCAAE" 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 /* Uncomment if someone makes these buildable
/datum/design/circuit/general_alert /datum/design/circuit/general_alert
name = "general alert console" name = "general alert console"

View File

@@ -50,6 +50,11 @@
if(FA.z in using_map.contact_levels) if(FA.z in using_map.contact_levels)
FA.set_security_level(newlevel) 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() /proc/get_security_level()
switch(security_level) switch(security_level)

View File

@@ -84,8 +84,14 @@
if(1) if(1)
qdel(src) qdel(src)
if(2) if(2)
if(prob(75))
qdel(src)
if(3)
if(prob(50)) if(prob(50))
qdel(src) qdel(src)
if(4)
if(prob(25))
qdel(src)
/obj/machinery/shield/hitby(AM as mob|obj) /obj/machinery/shield/hitby(AM as mob|obj)
@@ -264,7 +270,7 @@
else else
user << "The device must first be secured to the floor." user << "The device must first be secured to the floor."
return return
/obj/machinery/shieldgen/emag_act(var/remaining_charges, var/mob/user) /obj/machinery/shieldgen/emag_act(var/remaining_charges, var/mob/user)
if(!malfunction) if(!malfunction)
malfunction = 1 malfunction = 1

View File

@@ -11,13 +11,15 @@
cooldown_min = 200 //50 deciseconds reduction per rank cooldown_min = 200 //50 deciseconds reduction per rank
var/emp_heavy = 6 var/emp_heavy = 3
var/emp_light = 10 var/emp_med = 5
var/emp_light = 8
var/emp_long = 10
hud_state = "wiz_tech" hud_state = "wiz_tech"
/spell/aoe_turf/disable_tech/cast(list/targets) /spell/aoe_turf/disable_tech/cast(list/targets)
for(var/turf/target in 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 return

View File

@@ -432,4 +432,4 @@
/obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob) /obj/item/weapon/spellbook/oneuse/charge/recoil(mob/user as mob)
..() ..()
user <<"<span class='warning'>[src] suddenly feels very warm!</span>" user <<"<span class='warning'>[src] suddenly feels very warm!</span>"
empulse(src, 1, 1) empulse(src, 1, 1, 1, 1)

View File

@@ -9,5 +9,5 @@
/datum/artifact_effect/emp/DoEffectPulse() /datum/artifact_effect/emp/DoEffectPulse()
if(holder) if(holder)
var/turf/T = get_turf(holder) var/turf/T = get_turf(holder)
empulse(T, effectrange/2, effectrange) empulse(T, effectrange/4, effectrange/3, effectrange/2, effectrange)
return 1 return 1

View File

@@ -96,10 +96,16 @@
update_values() update_values()
// Used to equalize the mixture between two zones before sleeping an edge.
/datum/gas_mixture/proc/equalize(datum/gas_mixture/sharer) /datum/gas_mixture/proc/equalize(datum/gas_mixture/sharer)
var/our_heatcap = heat_capacity() var/our_heatcap = heat_capacity()
var/share_heatcap = sharer.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) for(var/g in gas|sharer.gas)
var/comb = gas[g] + sharer.gas[g] var/comb = gas[g] + sharer.gas[g]
comb /= volume + sharer.volume comb /= volume + sharer.volume
@@ -110,6 +116,9 @@
temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap) temperature = ((temperature * our_heatcap) + (sharer.temperature * share_heatcap)) / (our_heatcap + share_heatcap)
sharer.temperature = temperature sharer.temperature = temperature
update_values()
sharer.update_values()
return 1 return 1
@@ -279,9 +288,16 @@
//Checks if we are within acceptable range of another gas_mixture to suspend processing or merge. //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(!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() var/list/marked = list()
for(var/g in gas) for(var/g in gas)
if((abs(gas[g] - sample.gas[g]) > MINIMUM_AIR_TO_SUSPEND) && \ if((abs(gas[g] - sample.gas[g]) > MINIMUM_AIR_TO_SUSPEND) && \

View File

@@ -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."

View File

@@ -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."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

@@ -818,6 +818,7 @@
#include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\taperecorder.dm"
#include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\traitordevices.dm"
#include "code\game\objects\items\devices\transfer_valve.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\tvcamera.dm"
#include "code\game\objects\items\devices\uplink.dm" #include "code\game\objects\items\devices\uplink.dm"
#include "code\game\objects\items\devices\uplink_random_lists.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\trigger.dm"
#include "code\modules\awaymissions\zlevel.dm" #include "code\modules\awaymissions\zlevel.dm"
#include "code\modules\blob\blob.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\air_traffic.dm"
#include "code\modules\busy_space\loremaster.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 defines.dm"
#include "code\modules\client\client procs.dm" #include "code\modules\client\client procs.dm"
#include "code\modules\client\movement.dm" #include "code\modules\client\movement.dm"