"
- if (!src.scanner.occupant)
+ if(!scanner_occupant)
dat += "Scanner Unoccupied"
else if(loading)
- dat += "[src.scanner.occupant] => Scanning..."
+ dat += "[scanner_occupant] => Scanning..."
else
- if (src.scanner.occupant.ckey != scantemp_ckey)
+ if(scanner_occupant.ckey != scantemp_ckey)
scantemp = "Ready to Scan"
- scantemp_ckey = src.scanner.occupant.ckey
- dat += "[src.scanner.occupant] => [scantemp]"
+ scantemp_ckey = scanner_occupant.ckey
+ dat += "[scanner_occupant] => [scantemp]"
dat += "
"
- if (src.scanner.occupant)
+ if(scanner_occupant)
dat += ""
-
- t += "Output: [round(lastgen)] W"
-
+
+ var/displaygen = lastgenlev
+ if(displaygen < 1000000) //less than a MW
+ displaygen /= 1000
+ t += "Output: [round(displaygen,0.01)] kW"
+ else
+ displaygen /= 1000000
+ t += "Output: [round(displaygen,0.01)] MW"
+
t += "
"
t += "
Cold loop"
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 17682376c56..2ba8705e481 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -303,17 +303,17 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
use_power = on ? 2 : 1
// Sound the alert if gravity was just enabled or disabled.
var/alert = 0
- var/area/area = get_area(src)
+ var/area/A = get_area(src)
if(on && SSticker.IsRoundInProgress()) // If we turned on and the game is live.
if(gravity_in_level() == 0)
alert = 1
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
- message_admins("The gravity generator was brought online. (
[area.name])")
+ message_admins("The gravity generator was brought online [A][ADMIN_COORDJMP(src)]")
else
if(gravity_in_level() == 1)
alert = 1
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
- message_admins("The gravity generator was brought offline with no backup generator. (
[area.name])")
+ message_admins("The gravity generator was brought offline with no backup generator. [A][ADMIN_COORDJMP(src)]")
update_icon()
update_list()
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index a084788daf7..c1ff1ee9ce0 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -98,9 +98,10 @@
/obj/machinery/power/emitter/Destroy()
if(SSticker && SSticker.IsRoundInProgress())
- message_admins("Emitter deleted at ([x],[y],[z] -
JMP)",0,1)
- log_game("Emitter deleted at ([x],[y],[z])")
- investigate_log("
deleted at ([x],[y],[z]) at [get_area(src)]","singulo")
+ var/turf/T = get_turf(src)
+ message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1)
+ log_game("Emitter deleted at [COORD(T)]")
+ investigate_log("
deleted at [get_area(src)] [COORD(T)]","singulo")
QDEL_NULL(sparks)
return ..()
@@ -121,8 +122,8 @@
if(src.active==1)
src.active = 0
to_chat(user, "
You turn off \the [src].")
- message_admins("Emitter turned off by [key_name_admin(user)](
?) (
FLW) in ([x],[y],[z] -
JMP)",0,1)
- log_game("Emitter turned off by [key_name(user)] in ([x],[y],[z])")
+ message_admins("Emitter turned off by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("Emitter turned off by [key_name(user)] in [COORD(src)]")
investigate_log("turned
off by [key_name(user)] at [get_area(src)]","singulo")
else
src.active = 1
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 9cf19aff2dc..2045cb380cb 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -117,8 +117,8 @@
strength++
strength_change()
- message_admins("PA Control Computer increased to [strength] by [key_name_admin(usr)](
?) (
FLW) in ([x],[y],[z] -
JMP)",0,1)
- log_game("PA Control Computer increased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ message_admins("PA Control Computer increased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("PA Control Computer increased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("increased to
[strength] by [key_name(usr)]","singulo")
@@ -127,8 +127,8 @@
strength--
strength_change()
- message_admins("PA Control Computer decreased to [strength] by [key_name_admin(usr)](
?) (
FLW) in ([x],[y],[z] -
JMP)",0,1)
- log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in ([x],[y],[z])")
+ message_admins("PA Control Computer decreased to [strength] by [ADMIN_LOOKUPFLW(usr)] in [ADMIN_COORDJMP(src)]",0,1)
+ log_game("PA Control Computer decreased to [strength] by [key_name(usr)] in [COORD(src)]")
investigate_log("decreased to
[strength] by [key_name(usr)]","singulo")
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 1e1737661e4..8044132a0f6 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -170,7 +170,7 @@
//crowbarring it !
var/turf/T = get_turf(src)
if(default_deconstruction_crowbar(I))
- message_admins("[src] has been deconstructed by [key_name_admin(user)](
?) (
FLW) in ([T.x],[T.y],[T.z] -
JMP)",0,1)
+ message_admins("[src] has been deconstructed by [ADMIN_LOOKUPFLW(user)] in [ADMIN_COORDJMP(T)]",0,1)
log_game("[src] has been deconstructed by [key_name(user)]")
investigate_log("SMES deconstructed by [key_name(user)]","singulo")
return
@@ -192,10 +192,11 @@
/obj/machinery/power/smes/Destroy()
if(SSticker && SSticker.IsRoundInProgress())
- var/area/area = get_area(src)
- message_admins("SMES deleted at (
[area.name])")
- log_game("SMES deleted at ([area.name])")
- investigate_log("
deleted at ([area.name])","singulo")
+ var/area/A = get_area(src)
+ var/turf/T = get_turf(src)
+ message_admins("SMES deleted at [A][ADMIN_JMP(T)]")
+ log_game("SMES deleted at [A][COORD(T)]")
+ investigate_log("
deleted at [A][COORD(T)]","singulo")
if(terminal)
disconnect_terminal()
return ..()
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index fee8859de49..712cd5cd415 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -127,8 +127,9 @@
/obj/machinery/power/supermatter_shard/make_frozen_visual()
return
-/obj/machinery/power/supermatter_shard/New()
+/obj/machinery/power/supermatter_shard/Initialize()
. = ..()
+ SSair.atmos_machinery += src
countdown = new(src)
countdown.start()
GLOB.poi_list |= src
@@ -139,6 +140,7 @@
/obj/machinery/power/supermatter_shard/Destroy()
investigate_log("has been destroyed.", "supermatter")
+ SSair.atmos_machinery -= src
QDEL_NULL(radio)
GLOB.poi_list -= src
QDEL_NULL(countdown)
@@ -181,7 +183,7 @@
E.energy = power
qdel(src)
-/obj/machinery/power/supermatter_shard/process()
+/obj/machinery/power/supermatter_shard/process_atmos()
var/turf/T = loc
if(isnull(T)) // We have a null turf...something is wrong, stop processing this entity.
@@ -296,6 +298,7 @@
if(produces_gas)
env.merge(removed)
+ air_update_turf()
for(var/mob/living/carbon/human/l in view(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them.
if(!istype(l.glasses, /obj/item/clothing/glasses/meson))
@@ -341,7 +344,7 @@
lastwarning = REALTIMEOFDAY
if(!has_reached_emergency)
investigate_log("has reached the emergency point for the first time.", "supermatter")
- message_admins("[src] has reached the emergency point
(JMP).")
+ message_admins("[src] has reached the emergency point [ADMIN_JMP(src)].")
has_reached_emergency = 1
else if(damage >= damage_archived) // The damage is still going up
SPEAK("[warning_alert] Instability: [stability]%")
@@ -388,7 +391,7 @@
power += Proj.damage * config_bullet_energy
if(!has_been_powered)
investigate_log("has been powered for the first time.", "supermatter")
- message_admins("[src] has been powered for the first time
(JMP).")
+ message_admins("[src] has been powered for the first time [ADMIN_JMP(src)].")
has_been_powered = 1
else if(takes_damage)
damage += Proj.damage * config_bullet_energy
@@ -487,7 +490,7 @@
/obj/machinery/power/supermatter_shard/proc/Consume(atom/movable/AM)
if(isliving(AM))
var/mob/living/user = AM
- message_admins("[src] has consumed [key_name_admin(user)]
? (
FLW)
(JMP).")
+ message_admins("[src] has consumed [key_name_admin(user)] [ADMIN_JMP(src)].")
investigate_log("has consumed [key_name(user)].", "supermatter")
user.dust()
matter_power += 200
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index e99ff04add9..73d3a34a1b9 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -19,15 +19,12 @@
/obj/item/weapon/gun/energy/pulse/prize/New()
. = ..()
GLOB.poi_list |= src
- var/msg = "A pulse rifle prize has been created at ([x],[y],[z] - (\
-
\
- JMP)"
+ var/msg = "A pulse rifle prize has been created at [ADMIN_COORDJMP(src)]"
message_admins(msg)
log_game(msg)
- notify_ghosts("Someone won a pulse rifle as a prize!", source = src,
- action = NOTIFY_ORBIT)
+ notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT)
/obj/item/weapon/gun/energy/pulse/prize/Destroy()
GLOB.poi_list -= src
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index 2dbc0ff1c23..a8ab8fd4269 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -38,7 +38,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5),
/obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5),
/obj/item/weapon/reagent_containers/food/snacks/grown/rice = list("rice" = -5),
- /obj/item/weapon/reagent_containers/food/snacks/donut/New = list("sprinkles" = -2, "sugar" = 1),
+ /obj/item/weapon/reagent_containers/food/snacks/donut = list("sprinkles" = -2, "sugar" = 1),
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0),
/obj/item/weapon/reagent_containers/food/snacks/egg = list("eggyolk" = -5),
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index aa913ba8f0a..500147d2334 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -288,30 +288,43 @@
/datum/reagent/medicine/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
- description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a blood substitute on an IV drip."
+ description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute."
reagent_state = LIQUID
color = "#DCDCDC"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 60
taste_description = "sweetness and salt"
+ var/last_added = 0
+ var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/M)
+ if(last_added)
+ M.blood_volume -= last_added
+ last_added = 0
+ if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level.
+ var/amount_to_add = min(M.blood_volume, volume*5)
+ var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable)
+ last_added = new_blood_level - M.blood_volume
+ M.blood_volume = new_blood_level
if(prob(33))
M.adjustBruteLoss(-0.5*REM, 0)
M.adjustFireLoss(-0.5*REM, 0)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- C.blood_volume += 0.2
. = 1
..()
-/datum/reagent/medicine/salglu_solution/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(ishuman(M) && method == INJECT)
- var/mob/living/carbon/human/H = M
- if(H.dna && !(NOBLOOD in H.dna.species.species_traits))
- var/efficiency = (BLOOD_VOLUME_NORMAL-H.blood_volume)/700 + 0.2//The lower the blood of the patient, the better it is as a blood substitute.
- efficiency = Clamp(efficiency, 0.1, 0.75)
- //As it's designed for an IV drip, make large injections not as effective as repeated small injections.
- H.blood_volume += round(efficiency * min(5,reac_volume), 0.1)
+/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M)
+ if(prob(3))
+ to_chat(M, "
You feel salty.")
+ holder.add_reagent("sodiumchloride", 1)
+ holder.remove_reagent("salglu_solution", 0.5)
+ else if(prob(3))
+ to_chat(M, "
You feel sweet.")
+ holder.add_reagent("sugar", 1)
+ holder.remove_reagent("salglu_solution", 0.5)
+ if(prob(33))
+ M.adjustBruteLoss(0.5*REM, 0)
+ M.adjustFireLoss(0.5*REM, 0)
+ . = 1
..()
/datum/reagent/medicine/mine_salve
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 0b388ee7b42..b38d39e1392 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -658,7 +658,7 @@
taste_mult = 0 // apparently tasteless.
/datum/reagent/mercury/on_mob_life(mob/living/M)
- if(M.canmove && isspaceturf(M.loc))
+ if(M.canmove && !isspaceturf(M.loc))
step(M, pick(GLOB.cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -738,7 +738,7 @@
taste_description = "metal"
/datum/reagent/lithium/on_mob_life(mob/living/M)
- if(M.canmove && isspaceturf(M.loc))
+ if(M.canmove && !isspaceturf(M.loc))
step(M, pick(GLOB.cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm
index 9e0bb2d0e4f..c13ff096e4c 100644
--- a/code/modules/reagents/chemistry/recipes.dm
+++ b/code/modules/reagents/chemistry/recipes.dm
@@ -36,12 +36,12 @@
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
- var/message = "A [reaction_name] reaction has occurred in [my_area.name]. (
JMP)"
+ var/message = "A [reaction_name] reaction has occurred in [my_area.name] [ADMIN_COORDJMP(T)]"
message += " (
VV)"
var/mob/M = get(A, /mob)
if(M)
- message += " - Carried By: [key_name_admin(M)](
?) (
FLW)"
+ message += " - Carried By: [ADMIN_LOOKUPFLW(M)]"
else
message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 805aa936d43..6cfdd80cf53 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -6,6 +6,7 @@
/datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
+ var/area/A = get_area(T)
var/inside_msg
if(ismob(holder.my_atom))
var/mob/M = holder.my_atom
@@ -14,9 +15,9 @@
var/touch_msg = "N/A"
if(lastkey)
var/mob/toucher = get_mob_by_key(lastkey)
- touch_msg = "[key_name_admin(lastkey)]
? (
FLW)"
- message_admins("Reagent explosion reaction occurred at
[T.loc.name] (JMP)[inside_msg]. Last Fingerprint: [touch_msg].")
- log_game("Reagent explosion reaction occurred at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
+ touch_msg = "[ADMIN_LOOKUPFLW(toucher)]"
+ message_admins("Reagent explosion reaction occurred at [A] [ADMIN_COORDJMP(T)][inside_msg]. Last Fingerprint: [touch_msg].")
+ log_game("Reagent explosion reaction occurred at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0)
e.start()
diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
index a1c4a74795f..e67557919e4 100644
--- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm
+++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm
@@ -437,13 +437,14 @@
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
+ var/area/A = get_area(T)
var/lastkey = holder.my_atom.fingerprintslast
var/touch_msg = "N/A"
if(lastkey)
var/mob/toucher = get_mob_by_key(lastkey)
- touch_msg = "[key_name_admin(lastkey)]
?(
FLW)."
- message_admins("Slime Explosion reaction started at
[T.loc.name] (JMP). Last Fingerprint: [touch_msg]")
- log_game("Slime Explosion reaction started at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"].")
+ touch_msg = "[ADMIN_LOOKUPFLW(toucher)]."
+ message_admins("Slime Explosion reaction started at [A] [ADMIN_COORDJMP(T)]. Last Fingerprint: [touch_msg]")
+ log_game("Slime Explosion reaction started at [A] [COORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].")
T.visible_message("
The slime extract begins to vibrate violently !")
addtimer(CALLBACK(src, .proc/boom, holder), 50)
var/obj/item/slime_extract/M = holder.my_atom
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 79db908d507..df8f7927c0c 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -48,15 +48,16 @@
user.changeNext_move(CLICK_CD_RANGE*2)
user.newtonian_move(get_dir(A, user))
var/turf/T = get_turf(src)
+ var/area/area = get_area(src)
if(reagents.has_reagent("sacid"))
- message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src] at (
[get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired sulphuric acid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
if(reagents.has_reagent("facid"))
- message_admins("[key_name_admin(user)] fired Fluacid from \a [src] at (
[get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired Fluacid from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
if(reagents.has_reagent("lube"))
- message_admins("[key_name_admin(user)] fired Space lube from \a [src] at (
[get_area(src)] ([T.x], [T.y], [T.z])).")
- log_game("[key_name(user)] fired Space lube from \a [src] at [get_area(src)] ([T.x], [T.y], [T.z]).")
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
return
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index aa106541e6f..827cce162f7 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -185,7 +185,7 @@ research holder datum.
if((D.build_type & SMELTER) && ("initial" in D.category))
AddDesign2Known(D)
-/datum/research/biogenerator/AddDesign2Known(datum/design/D)
+/datum/research/smelter/AddDesign2Known(datum/design/D)
if(!(D.build_type & SMELTER))
return
..()
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index b9d284b280a..6344689f0bd 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -104,12 +104,8 @@
authorized += ID
- message_admins("[key_name_admin(user.client)] \
- (
?) \
- (
FLW) \
- has authorized early shuttle launch", 0, 1)
- log_game("[key_name(user)] has authorized early shuttle launch in \
- ([x],[y],[z])")
+ message_admins("[ADMIN_LOOKUPFLW(user)] has authorized early shuttle launch", 0, 1)
+ log_game("[key_name(user)] has authorized early shuttle launch in [COORD(src)]")
// Now check if we're on our way
. = TRUE
process()
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index f90fe2f7e08..a5226abd58f 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -30,4 +30,4 @@
return
last_request = world.time
to_chat(usr, "
Your request has been recieved by Centcom.")
- to_chat(GLOB.admins, "
FERRY: [key_name_admin(usr)] (?) (FLW) (Move Ferry) is requesting to move the transport ferry to Centcom.")
+ to_chat(GLOB.admins, "
FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to Centcom.")
diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm
index b41c099d7fc..491496f0447 100644
--- a/code/modules/spells/spell_types/mind_transfer.dm
+++ b/code/modules/spells/spell_types/mind_transfer.dm
@@ -62,29 +62,14 @@ Also, you never added distance checking after target is selected. I've went ahea
var/mob/caster = user//The wizard/whomever doing the body transferring.
//MIND TRANSFER BEGIN
- if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list.
- for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot.
- caster.verbs -= V//But a safety nontheless.
-
- if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs.
- for(var/V in victim.mind.special_verbs)
- victim.verbs -= V
-
var/mob/dead/observer/ghost = victim.ghostize(0)
caster.mind.transfer_to(victim)
- if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
- for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
- caster.verbs += V
-
ghost.mind.transfer_to(caster)
if(ghost.key)
caster.key = ghost.key //have to transfer the key since the mind was not active
qdel(ghost)
- if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
- for(var/V in caster.mind.special_verbs)
- caster.verbs += V
//MIND TRANSFER END
//Here we paralyze both mobs and knock them out for a time.
diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm
index c91cb219afd..e66346a2c89 100644
--- a/code/modules/surgery/organs/ears.dm
+++ b/code/modules/surgery/organs/ears.dm
@@ -4,6 +4,7 @@
desc = "There are three parts to the ear. Inner, middle and outer. Only one of these parts should be normally visible."
zone = "head"
slot = "ears"
+ gender = PLURAL
// `deaf` measures "ticks" of deafness. While > 0, the person is unable
// to hear anything.
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index 4ad8b9c518e..46d448a7ed2 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -4,6 +4,7 @@
desc = "I see you!"
zone = "eyes"
slot = "eye_sight"
+ gender = PLURAL
var/sight_flags = 0
var/see_in_dark = 2
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index a2048c2b718..50f66fef27e 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -8,6 +8,7 @@
icon_state = "appendix"
zone = "mouth"
slot = "vocal_cords"
+ gender = PLURAL
var/list/spans = null
/obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords
@@ -247,7 +248,7 @@
else if((findtext(message, silence_words)))
cooldown = COOLDOWN_STUN
for(var/mob/living/carbon/C in listeners)
- if(user.mind && (user.mind.assigned_role == "Librarian" || user.mind.assigned_role == "Mime"))
+ if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime"))
power_multiplier *= 3
C.silent += (10 * power_multiplier)
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index 2c5508041fd..44836f7b172 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -1100,6 +1100,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
// Implants
/datum/uplink_item/implants
category = "Implants"
+ surplus = 50
/datum/uplink_item/implants/freedom
name = "Freedom Implant"
@@ -1249,7 +1250,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
desc = "Most magic eightballs are toys with dice inside. Although identical in appearance to the harmless toys, this occult device reaches into the spirit world to find its answers. Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking."
item = /obj/item/toy/eightball/haunted
cost = 2
- restricted_roles = list("Librarian")
+ restricted_roles = list("Curator")
limited_stock = 1 // please don't spam deadchat
// Pointless
diff --git a/code/world.dm b/code/world.dm
index 34e3265fcad..c46e3a9fb82 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -25,17 +25,36 @@
else
external_rsc_urls.Cut(i,i+1)
#endif
- //logs
- var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day")
- GLOB.href_logfile = file("data/logs/[date_string] hrefs.htm")
- GLOB.diary = file("data/logs/[date_string].log")
- GLOB.diaryofmeanpeople = file("data/logs/[date_string] Attack.log")
- GLOB.diary << "\n\nStarting up. [time_stamp()]\n---------------------"
- GLOB.diaryofmeanpeople << "\n\nStarting up. [time_stamp()]\n---------------------"
- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
-
+ GLOB.config_error_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl
make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once)
config = new
+ GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-"
+ if(config.sql_enabled)
+ if(SSdbcore.Connect())
+ log_world("Database connection established.")
+ var/datum/DBQuery/query_feedback_create_round = SSdbcore.NewQuery("INSERT INTO [format_table_name("feedback")] SELECT null, Now(), MAX(round_id)+1, \"server_ip\", 0, \"[world.internet_address]:[world.port]\" FROM [format_table_name("feedback")]")
+ query_feedback_create_round.Execute()
+ var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) FROM [format_table_name("feedback")]")
+ query_feedback_max_id.Execute()
+ if(query_feedback_max_id.NextRow())
+ GLOB.round_id = query_feedback_max_id.item[1]
+ GLOB.log_directory += "[GLOB.round_id]"
+ else
+ log_world("Your server failed to establish a connection with the database.")
+ if(!GLOB.round_id)
+ GLOB.log_directory += "[time_stamp()]"
+ GLOB.world_game_log = file("[GLOB.log_directory]/game.log")
+ GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log")
+ GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log")
+ GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html")
+ GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+ GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+ GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------"
+ GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently
+ if(fexists(GLOB.config_error_log))
+ fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log")
+ fdel(GLOB.config_error_log)
+
GLOB.revdata.DownloadPRDetails()
load_mode()
load_motd()
@@ -43,17 +62,9 @@
if(config.usewhitelist)
load_whitelist()
LoadBans()
- investigate_reset()
GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
- if(config.sql_enabled)
- if(!SSdbcore.Connect())
- log_world("Your server failed to establish a connection with the database.")
- else
- log_world("Database connection established.")
-
-
GLOB.data_core = new /datum/datacore()
Master.Initialize(10, FALSE)
@@ -61,7 +72,7 @@
#define IRC_STATUS_THROTTLE 50
/world/Topic(T, addr, master, key)
if(config && config.log_world_topic)
- GLOB.diary << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
+ GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
var/list/input = params2list(T)
var/key_valid = (global.comms_allowed && input["key"] == global.comms_key)
@@ -134,11 +145,7 @@
if(!key_valid)
return "Bad Key"
else
-#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time
- for(var/client/C in GLOB.clients)
- if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR))
- to_chat(C, "
PR: [input["announce"]]")
-#undef CHAT_PULLR
+ AnnouncePR(input["announce"], json_decode(input["payload"]))
else if("crossmessage" in input)
if(!key_valid)
@@ -174,7 +181,27 @@
else if("server_hop" in input)
show_server_hop_transfer_screen(input["server_hop"])
+#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round
+ //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored
+
+/world/proc/AnnouncePR(announcement, list/payload)
+ var/static/list/PRcounts = list() //PR id -> number of times announced this round
+ var/id = "[payload["pull_request"]["id"]]"
+ if(!PRcounts[id])
+ PRcounts[id] = 1
+ else
+ ++PRcounts[id]
+ if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND)
+ return
+
+#define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time
+ for(var/client/C in GLOB.clients)
+ if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR))
+ C << "
PR: [announcement]"
+#undef CHAT_PULLR
+
#define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return;
+
/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
if (reason == 1) //special reboot, do none of the normal stuff
if (usr)
@@ -253,7 +280,7 @@
if(Lines.len)
if(Lines[1])
GLOB.master_mode = Lines[1]
- GLOB.diary << "Saved mode is '[GLOB.master_mode]'"
+ GLOB.world_game_log << "Saved mode is '[GLOB.master_mode]'"
/world/proc/save_mode(the_mode)
var/F = file("data/mode.txt")
@@ -315,4 +342,4 @@
status = s
/world/proc/has_round_started()
- return SSticker.HasRoundStarted()
\ No newline at end of file
+ return SSticker.HasRoundStarted()
diff --git a/config/config.txt b/config/config.txt
index 8d27987e998..07cd2c1f874 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -71,9 +71,6 @@ LOG_PRAYER
## log lawchanges
LOG_LAW
-## log all Topic() calls (for use by coders in tracking down Topic issues)
-# LOG_HREFS
-
## log all world.Topic() calls
# LOG_WORLD_TOPIC
@@ -272,9 +269,6 @@ PANIC_SERVER_NAME [Put the name here]
## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog
#AGGRESSIVE_CHANGELOG
-## Uncomment to have the game log runtimes to the log folder. (Note: this disables normal output in dd/ds, so it should be left off for testing.
-#LOG_RUNTIMES
-
## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes
AUTOCONVERT_NOTES
diff --git a/html/changelog.html b/html/changelog.html
index c7b35fb731e..575ee862cc1 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,12 +55,90 @@
-->
+
03 May 2017
+
Jordie0608 updated:
+
+ - Investigate logs are now persistent.
+ - Game logs are now stored per-round; use .getserverlog to access previous rounds.
+ - .giveruntimelog and .getruntimelog removed.
+
+
deathride58 updated:
+
+ - Fixed the slimecore HUD's neck slot sprite.
+
+
+
02 May 2017
+
4dplanner updated:
+
+ - Squishy plants will now affect walls and other turfs they get squished on
+
+
Kor, Goof and Plizzard updated:
+
+ - Adds persistent trophy cases. They are not on any map yet.
+
+
Shadowlight213 updated:
+
+ - The biogenerator will now show its recipes again.
+
+
XDTM updated:
+
+ - Blood Cult's talisman of Horrors now works at range. It will still give no warning to the victim.
+ - Golems can now click on empty golem shells to transfer into them.
+ - Plasma Golems now no longer explode on death. They instead explode if they're on fire and are hot enough. The explosion size has been increased.
+ - Plasma Golems are now always flammable.
+
+
coiax updated:
+
+ - When talking on the alien hivemind, a person will be identified by their real name, rather than who they are disguised as.
+
+
01 May 2017
+
4dplanner updated:
+
+ - Syndicate surplus crates now contain fewer implants
+
Bawhoppen updated:
- Deep storage space ruin has been readded.
- Space Cola machines now stock bottles of water.
+
Cobby updated:
+
+ - The Gang pen is now stealthy. Stab away!
+
+
Cyberboss updated:
+
+ - You can now make holocalls! Simply stand on a pad, bring up the menu, and select the holopad you wish to call. Remain still until someone answers. When they do, you'll be able to act just like an AI hologram until the call ends
+
+
Joan updated:
+
+ - Belligerent now prevents you from running for 7 seconds after every chant.
+ - However, you no longer remain walking after Belligerent's effect fades.
+ - Clockcult component generation will automatically focus on components needed to activate the Ark if it exists.
+ - Gaining Vanguard, such as from the Linked Vanguard scripture, will remove existing stuns.
+ - Proselytizers can now charge from Sigils of Transmission at a rate of 1000W per second.
+ - Sigils of Transmission can be charged with brass at a rate of 250W per sheet.
+
+
Moonlighting Mac says updated:
+
+ - Due to a clerical error in the chef's cookbooks now being resolved, you can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients from Lavaland.
+ - After being found again you will now be able to enjoy its special blend of flavors with your tastebuds. Mmm.
+
+
QualityVan updated:
+
+ - Saline glucose now acts as temporary blood instead of increasing blood regeneration
+
+
Swindly updated:
+
+ - Mercury and Lithium make people move when not in space instead of when in space.
+
+
ninjanomnom updated:
+
+ - TEG displays power in kw or MW now
+ - TEG power bar only maxes over 1MW now
+ - Moves TEG to SSair
+ - Moves SM to SSair
+
30 April 2017
QualityVan updated:
@@ -1235,37 +1313,6 @@
Pressure plates are hidden under the floor like smuggler satchels are, but you can attach a signaller to them to have it signal when a mob passes over them!
Bomb armor is now effective in lessening the chance of being knocked out by bombs.
-
-
01 March 2017
-
Cyberboss updated:
-
- - Lobby music is no longer delayed
-
-
-
28 February 2017
-
Cyberboss updated:
-
- - You will no longer be shown empty memories when the game starts
- - Built APCs now work again
- - Borg AI cameras now work again
-
-
Joan updated:
-
- - Anima Fragments now slam into non-Servants when bumping. This will ONLY happen if the fragment is not slowed, and slamming into someone will slightly damage the fragment and slow it severely.
-
-
Lzimann updated:
-
- - Communications console can also check the ID the user is wearing.
-
-
Supermichael777 updated:
-
- - The button now has a five second delay when detonating bombs
-
-
XDTM updated:
-
- - You can now change the input/output directons for Ore Redemption Machines by using a multitool on them with the panel open.
- - Diagnostic HUDs can now see if airlocks are shocked.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 32e3b4b3e3c..86571b113cd 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -10774,6 +10774,69 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: The Bank Machine in the vault now uses the radio to announce unauthorized
withdrawals, rather than an endless stream of loud announcements.
2017-05-01:
+ 4dplanner:
+ - tweak: Syndicate surplus crates now contain fewer implants
Bawhoppen:
- rscadd: Deep storage space ruin has been readded.
- rscadd: Space Cola machines now stock bottles of water.
+ Cobby:
+ - balance: The Gang pen is now stealthy. Stab away!
+ Cyberboss:
+ - rscadd: You can now make holocalls! Simply stand on a pad, bring up the menu,
+ and select the holopad you wish to call. Remain still until someone answers.
+ When they do, you'll be able to act just like an AI hologram until the call
+ ends
+ Joan:
+ - rscadd: Belligerent now prevents you from running for 7 seconds after every chant.
+ - rscdel: However, you no longer remain walking after Belligerent's effect fades.
+ - rscadd: Clockcult component generation will automatically focus on components
+ needed to activate the Ark if it exists.
+ - rscadd: Gaining Vanguard, such as from the Linked Vanguard scripture, will remove
+ existing stuns.
+ - rscadd: Proselytizers can now charge from Sigils of Transmission at a rate of
+ 1000W per second.
+ - rscadd: Sigils of Transmission can be charged with brass at a rate of 250W per
+ sheet.
+ Moonlighting Mac says:
+ - bugfix: Due to a clerical error in the chef's cookbooks now being resolved, you
+ can now make the pristine cookery dish "Stuffed Legion" out of exotic ingredients
+ from Lavaland.
+ - experiment: After being found again you will now be able to enjoy its special
+ blend of flavors with your tastebuds. Mmm.
+ QualityVan:
+ - tweak: Saline glucose now acts as temporary blood instead of increasing blood
+ regeneration
+ Swindly:
+ - tweak: Mercury and Lithium make people move when not in space instead of when
+ in space.
+ ninjanomnom:
+ - tweak: TEG displays power in kw or MW now
+ - tweak: TEG power bar only maxes over 1MW now
+ - experiment: Moves TEG to SSair
+ - experiment: Moves SM to SSair
+2017-05-02:
+ 4dplanner:
+ - bugfix: Squishy plants will now affect walls and other turfs they get squished
+ on
+ Kor, Goof and Plizzard:
+ - rscadd: Adds persistent trophy cases. They are not on any map yet.
+ Shadowlight213:
+ - bugfix: The biogenerator will now show its recipes again.
+ XDTM:
+ - tweak: Blood Cult's talisman of Horrors now works at range. It will still give
+ no warning to the victim.
+ - rscadd: Golems can now click on empty golem shells to transfer into them.
+ - tweak: Plasma Golems now no longer explode on death. They instead explode if they're
+ on fire and are hot enough. The explosion size has been increased.
+ - tweak: Plasma Golems are now always flammable.
+ coiax:
+ - rscadd: When talking on the alien hivemind, a person will be identified by their
+ real name, rather than who they are disguised as.
+2017-05-03:
+ Jordie0608:
+ - rscadd: Investigate logs are now persistent.
+ - tweak: Game logs are now stored per-round; use .getserverlog to access previous
+ rounds.
+ - rscdel: .giveruntimelog and .getruntimelog removed.
+ deathride58:
+ - tweak: Fixed the slimecore HUD's neck slot sprite.
diff --git a/html/changelogs/AutoChangeLog-pr-26725.yml b/html/changelogs/AutoChangeLog-pr-26725.yml
deleted file mode 100644
index 73c6fac7664..00000000000
--- a/html/changelogs/AutoChangeLog-pr-26725.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Joan"
-delete-after: True
-changes:
- - rscadd: "Proselytizers can now charge from Sigils of Transmission at a rate of 1000W per second."
- - rscadd: "Sigils of Transmission can be charged with brass at a rate of 250W per sheet."
diff --git a/html/changelogs/AutoChangeLog-pr-26813.yml b/html/changelogs/AutoChangeLog-pr-26813.yml
new file mode 100644
index 00000000000..10d910d62b6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-26813.yml
@@ -0,0 +1,7 @@
+author: "Kor, Profakos, Iamgoofball"
+delete-after: True
+changes:
+ - rscadd: "The Librarian has been replaced by the Curator."
+ - rscadd: "Persistent trophy cases have been added to the library on Meta, Delta, and Box. These are only usable by the Curator."
+ - rscadd: "The Curator now starts with his whip."
+ - rscadd: "The Curator now has access to his treasure hunter outfit, stashed in his private office."
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 5858925d86c..46666cdd5fc 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi
index bc33ad6e376..63d67e6fbac 100644
Binary files a/icons/mob/screen_slimecore.dmi and b/icons/mob/screen_slimecore.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index c0af32afea9..c4713bd0868 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/soupsalad.dmi b/icons/obj/food/soupsalad.dmi
index fe4c07362af..c6df0a26039 100644
Binary files a/icons/obj/food/soupsalad.dmi and b/icons/obj/food/soupsalad.dmi differ
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index f71e135dce0..f2176c395d7 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/config/sillytips.txt b/strings/sillytips.txt
similarity index 100%
rename from config/sillytips.txt
rename to strings/sillytips.txt
diff --git a/config/tips.txt b/strings/tips.txt
similarity index 100%
rename from config/tips.txt
rename to strings/tips.txt