Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
", "window=[name]") // Update the window
update_icon()
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index b6f8ee8f74..276b4d8109 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -197,12 +197,3 @@
else
icon_state = initial(icon_state) //looks like a normal pen when off.
item_state = initial(item_state)
-
-//Crayons path disambiguity sigh.
-/obj/item/proc/on_write(obj/item/weapon/paper/P, mob/user)
- return
-
-/obj/item/weapon/pen/poison/on_write(obj/item/weapon/paper/P, mob/user)
- P.contact_poison = "delayed_toxin"
- P.contact_poison_volume = 10
- add_logs(user,P,"used poison pen on")
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index e526d6ba6d..d980591ceb 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -96,8 +96,6 @@
/obj/machinery/power/apc/connect_to_network()
//Override because the APC does not directly connect to the network; it goes through a terminal.
//The terminal is what the power computer looks for anyway.
- if(!terminal)
- make_terminal()
if(terminal)
terminal.connect_to_network()
@@ -238,6 +236,8 @@
icon_state = "apcemag"
else if(update_state & UPSTATE_WIREEXP)
icon_state = "apcewires"
+ else if(update_state & UPSTATE_MAINT)
+ icon_state = "apc0"
if(!(update_state & UPSTATE_ALLGOOD))
cut_overlays()
@@ -445,6 +445,8 @@
update_icon()
else if(emagged)
to_chat(user, "The interface is broken!")
+ else if((stat & MAINT) && !opened)
+ ..() //its an empty closed frame... theres no wires to expose!
else
panel_open = !panel_open
to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]")
@@ -631,6 +633,8 @@
charging = 0
src.update_icon()
return
+ if((stat & MAINT) && !opened) //no board; no interface
+ return
..()
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 408529e297..34bf7b7f2f 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -509,6 +509,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai
slot_flags = SLOT_BELT
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
singular_name = "cable piece"
+ full_w_class = WEIGHT_CLASS_SMALL
/obj/item/stack/cable_coil/cyborg
is_cyborg = 1
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index dea263231a..3e35e3a42d 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -23,7 +23,8 @@
#define SEVERE_POWER_PENALTY_THRESHOLD 7000 //Same as above, but causes more dangerous effects
#define CRITICAL_POWER_PENALTY_THRESHOLD 9000 //Even more dangerous effects, threshold for tesla delamination
#define HEAT_PENALTY_THRESHOLD 40 //Higher == Crystal safe operational temperature is higher.
-#define DAMAGE_HARDCAP 0.01
+#define DAMAGE_HARDCAP 0.0025
+#define DAMAGE_INCREASE_MULTIPLIER 0.25
#define THERMAL_RELEASE_MODIFIER 5 //Higher == less heat released during reaction, not to be confused with the above values
@@ -214,9 +215,9 @@
damage_archived = damage
if(takes_damage)
//causing damage
- damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ), 0)
- damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500), 0)
- damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80), 0)
+ damage = max(damage + (max(removed.temperature - ((T0C + HEAT_PENALTY_THRESHOLD)*dynamic_heat_resistance), 0) * mole_heat_penalty / 150 ) * DAMAGE_INCREASE_MULTIPLIER, 0)
+ damage = max(damage + (max(power - POWER_PENALTY_THRESHOLD, 0)/500) * DAMAGE_INCREASE_MULTIPLIER, 0)
+ damage = max(damage + (max(combined_gas - MOLE_PENALTY_THRESHOLD, 0)/80) * DAMAGE_INCREASE_MULTIPLIER, 0)
//healing damage
if(combined_gas < MOLE_PENALTY_THRESHOLD)
diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm
new file mode 100644
index 0000000000..9c160ee848
--- /dev/null
+++ b/code/modules/procedural_mapping/mapGenerators/lavaland.dm
@@ -0,0 +1,30 @@
+
+/datum/mapGeneratorModule/bottomLayer/lavaland_default
+ spawnableTurfs = list(/turf/open/floor/plating/asteroid/basalt/lava_land_surface = 100)
+
+/datum/mapGeneratorModule/bottomLayer/lavaland_mineral
+ spawnableTurfs = list(/turf/closed/mineral/random/volcanic = 100)
+
+/datum/mapGeneratorModule/bottomLayer/lavaland_mineral/dense
+ spawnableTurfs = list(/turf/closed/mineral/random/high_chance/volcanic = 100)
+
+/datum/mapGeneratorModule/splatterLayer/lavalandMonsters
+ spawnableTurfs = list()
+ spawnableAtoms = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast = 10,
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 10,
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 10)
+
+/datum/mapGeneratorModule/splatterLayer/lavalandTendrils
+ spawnableTurfs = list()
+ spawnableAtoms = list(/mob/living/simple_animal/hostile/spawner/lavaland = 5,
+ /mob/living/simple_animal/hostile/spawner/lavaland/legion = 5,
+ /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 5)
+
+/datum/mapGenerator/lavaland/ground_only
+ modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_default)
+
+/datum/mapGenerator/lavaland/dense_ores
+ modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral/dense)
+
+/datum/mapGenerator/lavaland/normal_ores
+ modules = list(/datum/mapGeneratorModule/bottomLayer/lavaland_mineral)
diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm
new file mode 100644
index 0000000000..e2f658648c
--- /dev/null
+++ b/code/modules/procedural_mapping/mapGenerators/repair.dm
@@ -0,0 +1,29 @@
+/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel
+ spawnableTurfs = list(/turf/open/floor/plasteel = 100)
+ var/ignore_wall = FALSE
+
+/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/place(turf/T)
+ if(isclosedturf(T))
+ return FALSE
+ return TRUE
+
+/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten
+ ignore_wall = TRUE
+
+/datum/mapGeneratorModule/border/normalWalls
+ spawnableAtoms = list()
+ spawnableTurfs = list(/turf/closed/wall = 100)
+
+/datum/mapGenerator/repair
+ modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel,
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/repair/delete_walls
+ modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
+/datum/mapGenerator/repair/enclose_room
+ modules = list(/datum/mapGeneratorModule/bottomLayer/repairFloorPlasteel/flatten,
+ /datum/mapGeneratorModule/border/normalWalls,
+ /datum/mapGeneratorModule/bottomLayer/repressurize)
+
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 65b9ef926f..d91859f198 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -117,7 +117,7 @@
desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell."
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/sniper/soporific
- icon_state = ".50"
+ icon_state = "sleeper"
/obj/item/ammo_casing/haemorrhage
desc = "A .50 bullet casing, specialised in causing massive bloodloss"
@@ -131,7 +131,14 @@
projectile_type = /obj/item/projectile/bullet/sniper/penetrator
icon_state = ".50"
+/obj/item/ammo_casing/point50/gang
+ desc = "A black market .50 bullet casing."
+ projectile_type = /obj/item/projectile/bullet/sniper/gang
+/obj/item/ammo_casing/point50/gang/sleeper
+ desc = "Am illegally modified tranquilizer round."
+ projectile_type = /obj/item/projectile/bullet/sniper/gang/sleeper
+ icon_state = "sleeper"
/// SAW ROUNDS
diff --git a/code/modules/projectiles/boxes_magazines/external_mag.dm b/code/modules/projectiles/boxes_magazines/external_mag.dm
index c2a7129b4e..6c798efe3e 100644
--- a/code/modules/projectiles/boxes_magazines/external_mag.dm
+++ b/code/modules/projectiles/boxes_magazines/external_mag.dm
@@ -264,6 +264,17 @@
origin_tech = "combat=6;syndicate=3"
max_ammo = 5
+/obj/item/ammo_box/magazine/sniper_rounds/gang
+ name = "black market sniper rounds (.50)"
+ icon_state = ".50mag"
+ origin_tech = "combat=6"
+ ammo_type = /obj/item/ammo_casing/point50/gang
+
+/obj/item/ammo_box/magazine/sniper_rounds/gang/sleeper
+ name = "illegally modified tranquilizer round"
+ icon_state = "soporific"
+ origin_tech = "combat=6"
+ ammo_type = /obj/item/ammo_casing/point50/gang/sleeper
//// SAW MAGAZINES
@@ -371,4 +382,4 @@
icon_state = "oldrifle-[round(ammo_count(),4)]"
/obj/item/ammo_box/magazine/recharge/attack_self() //No popping out the "bullets"
- return
\ No newline at end of file
+ return
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index 70d399b107..90d30e6b88 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -244,6 +244,7 @@
icon_state = "bulldog"
item_state = "bulldog"
w_class = WEIGHT_CLASS_NORMAL
+ weapon_weight = WEAPON_MEDIUM
origin_tech = "combat=6;materials=4;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/m12g
fire_sound = 'sound/weapons/Gunshot.ogg'
@@ -261,8 +262,8 @@
update_icon()
/obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog/update_icon()
+ cut_overlays()
if(magazine)
- cut_overlays()
add_overlay("[magazine.icon_state]")
icon_state = "bulldog[chambered ? "" : "-e"]"
@@ -379,6 +380,11 @@
pin = /obj/item/device/firing_pin/implant/pindicate
origin_tech = "combat=7;syndicate=6"
+/obj/item/weapon/gun/ballistic/automatic/sniper_rifle/gang
+ name = "black market sniper rifle"
+ desc = "A long ranged weapon that does significant damage. It is well worn from years of service."
+ mag_type = /obj/item/ammo_box/magazine/sniper_rounds/gang
+
// Old Semi-Auto Rifle //
/obj/item/weapon/gun/ballistic/automatic/surplus
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index 2ce432bf31..d24e28b9e8 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -263,6 +263,7 @@
icon_state = "dshotgun"
item_state = "shotgun"
w_class = WEIGHT_CLASS_BULKY
+ weapon_weight = WEAPON_MEDIUM
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 1799a33cbb..77328bb422 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -24,6 +24,7 @@
var/list/modkits = list()
var/empty_state = "kineticgun_empty"
+ var/recharge_timerid
/obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user)
..()
@@ -61,10 +62,10 @@
. += A
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
+ K.kinetic_gun = src //do something special on-hit, easy!
for(var/A in get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
M.modify_projectile(K)
- K.kinetic_modules += M //do something special on-hit, easy!
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
holds_charge = TRUE
@@ -100,15 +101,16 @@
power_supply.use(500)
update_icon()
-/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload()
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
if(overheat)
return
+ if(!recharge_time)
+ recharge_time = overheat_time
overheat = TRUE
var/carried = 0
if(!unique_frequency)
- for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \
- loc.GetAllContents())
+ for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in loc.GetAllContents())
carried++
@@ -116,7 +118,8 @@
else
carried = 1
- addtimer(CALLBACK(src, .proc/reload), overheat_time * carried)
+ deltimer(recharge_timerid)
+ recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE)
/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
return
@@ -161,10 +164,10 @@
log_override = TRUE
var/pressure_decrease = 0.25
- var/list/kinetic_modules = list()
+ var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun
/obj/item/projectile/kinetic/Destroy()
- QDEL_NULL(kinetic_modules)
+ kinetic_gun = null
return ..()
/obj/item/projectile/kinetic/prehit(atom/target)
@@ -190,15 +193,14 @@
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
+ if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
+ for(var/obj/item/borg/upgrade/modkit/M in kinetic_gun.get_modkits())
+ M.projectile_strike(src, target_turf, target, kinetic_gun)
if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf
M.gets_drilled(firer)
var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
K.color = color
- for(var/obj/item/borg/upgrade/modkit/M in kinetic_modules)
- if(QDELETED(M)) //whoever shot this was very, very unfortunate.
- continue
- M.projectile_strike(src, target_turf, target)
//Modkits
@@ -262,7 +264,7 @@
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
-/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
+/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
//Range
/obj/item/borg/upgrade/modkit/range
@@ -311,7 +313,7 @@
. = ..()
if(.)
for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple
- if(AOE.stats_stolen)
+ if(AOE.stats_stolen || AOE == src)
continue
modifier += AOE.modifier //take its modifiers
AOE.modifier = 0
@@ -350,7 +352,7 @@
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
K.name = "kinetic explosion"
-/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
+/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
if(stats_stolen)
return
new /obj/effect/temp_visual/explosion/fast(target_turf)
@@ -382,6 +384,58 @@
desc = "Causes the kinetic accelerator to damage mobs in an AoE."
modifier = 0.2
+//Tendril-unique modules
+/obj/item/borg/upgrade/modkit/cooldown/repeater
+ name = "rapid repeater"
+ desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown."
+ denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater
+ modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss.
+ cost = 50
+
+/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ var/valid_repeat = FALSE
+ if(isliving(target))
+ var/mob/living/L = target
+ if(L.stat != DEAD)
+ valid_repeat = TRUE
+ if(ismineralturf(target_turf))
+ valid_repeat = TRUE
+ if(valid_repeat)
+ KA.overheat = FALSE
+ KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds.
+
+/obj/item/borg/upgrade/modkit/lifesteal
+ name = "lifesteal crystal"
+ desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target."
+ icon_state = "modkit_crystal"
+ denied_type = /obj/item/borg/upgrade/modkit/lifesteal
+ modifier = 2.5 //Not a very effective method of healing.
+ cost = 20
+ var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
+
+/obj/item/borg/upgrade/modkit/lifesteal/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target) && isliving(K.firer))
+ var/mob/living/L = target
+ if(L.stat == DEAD)
+ return
+ L = K.firer
+ L.heal_ordered_damage(modifier, damage_heal_order)
+
+/obj/item/borg/upgrade/modkit/resonator_blasts
+ name = "resonator blast"
+ desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts."
+ denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts
+ cost = 30
+ modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it.
+
+/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs.
+ var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in target_turf
+ if(R)
+ R.damage_multiplier = modifier
+ R.burst()
+ return
+ new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, 30)
//Indoors
/obj/item/borg/upgrade/modkit/indoors
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 5ffebf33b3..ae2377b8e3 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -279,7 +279,30 @@
target.ex_act(rand(1,2))
return ..()
+/obj/item/projectile/bullet/sniper/gang
+ damage = 55
+ stun = 1
+ weaken = 1
+ dismemberment = 15
+ armour_penetration = 25
+/obj/item/projectile/bullet/sniper/gang/sleeper
+ nodamage = 1
+ stun = 0
+ weaken = 0
+ dismemberment = 0
+ breakthings = FALSE
+
+/obj/item/projectile/bullet/sniper/gang/sleeper/on_hit(atom/target, blocked = 0)
+ if((blocked != 100) && isliving(target))
+ var/mob/living/L = target
+ L.blur_eyes(8)
+ if(L.staminaloss >= 40)
+ L.Sleeping(20)
+ else
+ L.adjustStaminaLoss(55)
+ return 1
+
/obj/item/projectile/bullet/sniper/soporific
armour_penetration = 0
nodamage = 1
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 99056eb1dc..428d1fc114 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -184,7 +184,7 @@
beaker.loc = src
to_chat(user, "You add \the [B] to the machine.")
- beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker")
+ beaker_overlay = beaker_overlay || mutable_appearance(icon, "disp_beaker")
beaker_overlay.pixel_x = rand(-10, 5)//randomize beaker overlay position.
add_overlay(beaker_overlay)
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag))
@@ -370,6 +370,19 @@
/obj/machinery/chem_dispenser/mutagensaltpeter
- name = "mutagen and saltpeter dispenser"
- desc = "Creates and dispenses mutagen and even saltpeter."
- dispensable_reagents = list("mutagen", "saltpetre")
+ name = "botanical chemical dispenser"
+ desc = "Creates and dispenses chemicals useful for botany."
+ dispensable_reagents = list(
+ "mutagen",
+ "saltpetre",
+ "eznutriment",
+ "left4zednutriment",
+ "robustharvestnutriment",
+ "water",
+ "plantbgone",
+ "weedkiller",
+ "pestkiller",
+ "cryoxadone",
+ "ammonia",
+ "ash",
+ "diethylamine")
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index cedec9941b..11db7e8d68 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -613,9 +613,8 @@
/datum/reagent/toxin/amanitin/on_mob_delete(mob/living/M)
var/toxdamage = current_cycle*3*REM
+ M.log_message("has taken [toxdamage] toxin damage from amanitin toxin", INDIVIDUAL_ATTACK_LOG)
M.adjustToxLoss(toxdamage)
- if(M)
- add_logs(M, get_turf(M), "has taken [toxdamage] toxin damage from amanitin toxin")
..()
/datum/reagent/toxin/lipolicide
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 0bc843a605..3ba5519a9c 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -121,8 +121,8 @@
/datum/chemical_reaction/nitrous_oxide
name = "Nitrous Oxide"
id = "nitrous_oxide"
- results = list("nitrous_oxide" = 2, "water" = 4)
- required_reagents = list("ammonia" = 3, "nitrogen" = 1, "oxygen" = 2)
+ results = list("nitrous_oxide" = 5)
+ required_reagents = list("ammonia" = 2, "nitrogen" = 1, "oxygen" = 2)
required_temp = 525
////////////////////////////////// Mutation Toxins ///////////////////////////////////
diff --git a/code/modules/server_tools/nudge.py b/code/modules/server_tools/nudge.py
new file mode 100644
index 0000000000..3d94ccdad7
--- /dev/null
+++ b/code/modules/server_tools/nudge.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+import sys
+import pickle
+import socket
+
+
+def pack():
+ data = sys.argv[1]
+
+ nudge(str.encode(data))
+
+
+def nudge(data):
+ s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ with open('config/server_to_tool_bridge_port.txt', 'r') as myfile:
+ portstr=myfile.read().replace('\n', '').strip()
+ s.connect(("localhost", int(portstr)))
+ s.send(data)
+ s.close()
+
+if __name__ == "__main__" and len(sys.argv) > 1:
+ pack()
diff --git a/code/modules/server_tools/server_tools.dm b/code/modules/server_tools/server_tools.dm
new file mode 100644
index 0000000000..0594ee810f
--- /dev/null
+++ b/code/modules/server_tools/server_tools.dm
@@ -0,0 +1,79 @@
+GLOBAL_VAR_INIT(reboot_mode, REBOOT_MODE_NORMAL) //if the world should request the service to kill it at reboot
+GLOBAL_PROTECT(reboot_mode)
+
+/world/proc/RunningService()
+ return params[SERVICE_WORLD_PARAM]
+
+/world/proc/ExportService(command)
+ return shell("python code/modules/server_tools/nudge.py \"[command]\"") == 0
+
+/world/proc/IRCBroadcast(msg)
+ ExportService("[SERVICE_REQUEST_IRC_BROADCAST] [msg]")
+
+//called at the exact moment the world is supposed to reboot
+/world/proc/ServiceReboot()
+ switch(GLOB.reboot_mode)
+ if(REBOOT_MODE_HARD)
+ to_chat(src, "Hard reboot triggered, you will automatically reconnect...")
+ log_world("Sending shutdown request!");
+ sleep(1) //flush the buffers
+ ExportService(SERVICE_REQUEST_KILL_PROCESS)
+ if(REBOOT_MODE_SHUTDOWN)
+ to_chat(src, "The server is shutting down...")
+ log_world("Deleting world")
+ qdel(src)
+
+/world/proc/ServiceCommand(list/params)
+ var/sCK = RunningService()
+ var/their_sCK = params[SERVICE_CMD_PARAM_KEY]
+
+ if(!their_sCK || their_sCK != sCK)
+ return "Invalid comms key!";
+
+ var/command = params[SERVICE_CMD_PARAM_COMMAND]
+ if(!command)
+ return "No command!"
+
+ var/static/last_irc_status = 0
+ switch(command)
+ if(SERVICE_CMD_HARD_REBOOT)
+ if(GLOB.reboot_mode != REBOOT_MODE_HARD)
+ GLOB.reboot_mode = REBOOT_MODE_HARD
+ log_world("Hard reboot requested by service")
+ message_admins("The world will hard reboot at the end of the game. Requested by service.")
+ SSblackbox.set_val("service_hard_restart", TRUE)
+ if(SERVICE_CMD_GRACEFUL_SHUTDOWN)
+ if(GLOB.reboot_mode != REBOOT_MODE_SHUTDOWN)
+ GLOB.reboot_mode = REBOOT_MODE_SHUTDOWN
+ log_world("Shutdown requested by service")
+ message_admins("The world will shutdown at the end of the game. Requested by service.")
+ SSblackbox.set_val("service_shutdown", TRUE)
+ if(SERVICE_CMD_WORLD_ANNOUNCE)
+ var/msg = params["message"]
+ if(!istext(msg) || !msg)
+ return "No message set!"
+ to_chat(src, "[html_encode(msg)]")
+ return "SUCCESS"
+ if(SERVICE_CMD_IRC_STATUS)
+ var/rtod = REALTIMEOFDAY
+ if(rtod - last_irc_status < IRC_STATUS_THROTTLE)
+ return
+ last_irc_status = rtod
+ var/list/adm = get_admin_counts()
+ var/list/allmins = adm["total"]
+ var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). "
+ status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode ? SSticker.mode.name : "Not started"]."
+ return status
+
+ if(SERVICE_CMD_ADMIN_MSG)
+ return IrcPm(params[SERVICE_CMD_PARAM_TARGET], params[SERVICE_CMD_PARAM_MESSAGE], params[SERVICE_CMD_PARAM_SENDER])
+
+ if(SERVICE_CMD_NAME_CHECK)
+ log_admin("IRC Name Check: [params[SERVICE_CMD_PARAM_SENDER]] on [params[SERVICE_CMD_PARAM_TARGET]]")
+ message_admins("IRC name checking on [params[SERVICE_CMD_PARAM_TARGET]] from [params[SERVICE_CMD_PARAM_SENDER]]")
+ return keywords_lookup(params[SERVICE_CMD_PARAM_TARGET], 1)
+ if(SERVICE_CMD_ADMIN_WHO)
+ return ircadminwho()
+ else
+ return "Unknown command: [command]"
+
diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm
index 7cb347d429..d6aed6d5b0 100644
--- a/code/modules/shuttle/arrivals.dm
+++ b/code/modules/shuttle/arrivals.dm
@@ -48,16 +48,16 @@
console = locate(/obj/machinery/requests_console) in A
areas += A
- if(GLOB.latejoin.len)
+ if(SSjob.latejoin_trackers.len)
WARNING("Map contains predefined latejoin spawn points and an arrivals shuttle. Using the arrivals shuttle.")
if(!new_latejoin.len)
WARNING("Arrivals shuttle contains no chairs for spawn points. Reverting to latejoin landmarks.")
- if(!GLOB.latejoin.len)
+ if(!SSjob.latejoin_trackers.len)
WARNING("No latejoin landmarks exist. Players will spawn unbuckled on the shuttle.")
return
- GLOB.latejoin = new_latejoin
+ SSjob.latejoin_trackers = new_latejoin
/obj/docking_port/mobile/arrivals/dockRoundstart()
SSshuttle.generate_transit_dock(src)
@@ -114,7 +114,7 @@
Launch(FALSE)
/obj/docking_port/mobile/arrivals/proc/CheckTurfsPressure()
- for(var/I in GLOB.latejoin)
+ for(var/I in SSjob.latejoin_trackers)
var/turf/open/T = get_turf(I)
var/pressure = T.air.return_pressure()
if(pressure < HAZARD_LOW_PRESSURE || pressure > HAZARD_HIGH_PRESSURE) //simple safety check
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 5f808035fd..52919c996d 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -326,7 +326,7 @@
var/datum/effect_system/smoke_spread/s = new
s.set_up(4,get_turf(centerpiece))
s.start()
- var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),cannon_direction=centerpiece.get_cannon_direction())
+ var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction())
qdel(centerpiece.front)
qdel(centerpiece.back)
qdel(centerpiece)
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index b4154c8e9c..a166be04a4 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -292,7 +292,7 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/L = V
- new /obj/effect/hallucination/delusion(get_turf(L),L,duration=150 * power_multiplier,skip_nearby=0)
+ new /obj/effect/hallucination/delusion(get_turf(L),L,null,150 * power_multiplier,0)
//WAKE UP
else if((findtext(message, wakeup_words)))
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 4be7b84a6c..af1d6e4743 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -82,7 +82,7 @@
target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
return 1
else if(istype(tool, /obj/item/weapon/melee/synthetic_arm_blade))
- var/obj/item/weapon/melee/arm_blade/new_arm = new(target, silent = TRUE, synthetic = TRUE)
+ var/obj/item/weapon/melee/arm_blade/new_arm = new(target,TRUE,TRUE)
target_zone == "r_arm" ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
return 1
diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm
index f603612bbf..21c07750de 100644
--- a/code/modules/uplink/uplink_item.dm
+++ b/code/modules/uplink/uplink_item.dm
@@ -203,7 +203,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/dangerous/shotgun
name = "Bulldog Shotgun"
desc = "A fully-loaded semi-automatic drum-fed shotgun. Compatiable with all 12g rounds. Designed for close \
- quarter anti-personel engagements."
+ quarter anti-personnel engagements."
item = /obj/item/weapon/gun/ballistic/automatic/shotgun/bulldog
cost = 8
surplus = 40
@@ -297,7 +297,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/dangerous/powerfist
name = "Power Fist"
desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\
- Upon hitting a target, the piston-ram will extend foward to make contact for some serious damage. \
+ Upon hitting a target, the piston-ram will extend forward to make contact for some serious damage. \
Using a wrench on the piston valve will allow you to tweak the amount of gas used per punch to \
deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks."
item = /obj/item/weapon/melee/powerfist
@@ -649,13 +649,6 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
cost = 4
exclude_modes = list(/datum/game_mode/nuclear,/datum/game_mode/gang)
-/datum/uplink_item/stealthy_weapons/poison_pen
- name = "Poison Pen"
- desc = "Cutting edge of deadly writing implements technology, this gadget will infuse any piece of paper with delayed contact poison."
- item = /obj/item/weapon/pen/poison
- cost = 2
- exclude_modes = list(/datum/game_mode/nuclear)
-
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. \
@@ -905,7 +898,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/device_tools/military_belt
name = "Chest Rig"
- desc = "A robust seven-slot set of webbing that is capable of holding all manner of tatical equipment."
+ desc = "A robust seven-slot set of webbing that is capable of holding all manner of tactical equipment."
item = /obj/item/weapon/storage/belt/military
cost = 1
exclude_modes = list(/datum/game_mode/nuclear)
@@ -1021,7 +1014,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/device_tools/powersink
name = "Power Sink"
desc = "When screwed to wiring attached to a power grid and activated, this large device places excessive \
- load on the grid, causing a stationwide blackout. The sink is large and cannot be stored in most \
+ load on the grid, causing a station-wide blackout. The sink is large and cannot be stored in most \
traditional bags and boxes."
item = /obj/item/device/powersink
cost = 6
@@ -1059,7 +1052,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/device_tools/rad_laser
name = "Radioactive Microlaser"
desc = "A radioactive microlaser disguised as a standard Nanotrasen health analyzer. When used, it emits a \
- powerful burst of radiation, which, after a short delay, can incapitate all but the most protected \
+ powerful burst of radiation, which, after a short delay, can incapacitate all but the most protected \
of humanoids. It has two settings: intensity, which controls the power of the radiation, \
and wavelength, which controls how long the radiation delay is."
item = /obj/item/device/healthanalyzer/rad_laser
@@ -1241,7 +1234,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/role_restricted/mimery
name = "Guide to Advanced Mimery Series"
- desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisble walls, and shoot bullets out of their fingers. Obviously only works for Mimes."
+ desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. Obviously only works for Mimes."
cost = 12
item = /obj/item/weapon/storage/box/syndie_kit/mimery
restricted_roles = list("Mime")
@@ -1353,7 +1346,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once.
/datum/uplink_item/badass/surplus
name = "Syndicate Surplus Crate"
- desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortion of items, \
+ desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \
but you never know. Contents are sorted to always be worth 50 TC."
item = /obj/structure/closet/crate
cost = 20
diff --git a/code/world.dm b/code/world.dm
index 43401b0c42..b7beb52d4d 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -28,7 +28,8 @@
SetupLogs()
- GLOB.revdata.DownloadPRDetails()
+ if(!RunningService()) //tgs2 support
+ GLOB.revdata.DownloadPRDetails()
load_motd()
load_admins()
@@ -42,6 +43,9 @@
Master.Initialize(10, FALSE)
+ if(config.irc_announce_new_game)
+ IRCBroadcast("New round starting on [SSmapping.config.map_name]!")
+
/world/proc/SetupExternalRSC()
#if (PRELOAD_RSC == 0)
external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n")
@@ -56,9 +60,8 @@
/world/proc/SetRoundID()
if(config.sql_enabled)
if(SSdbcore.Connect())
-
log_world("Database connection established.")
- var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), COALESCE(INET_ATON('[world.internet_address]'), 0), '[world.port]')")
+ var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')")
query_round_start.Execute()
var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()")
query_round_last_id.Execute()
@@ -88,14 +91,15 @@
if(GLOB.round_id)
log_game("Round ID: [GLOB.round_id]")
-#define IRC_STATUS_THROTTLE 50
+
/world/Topic(T, addr, master, key)
if(config && config.log_world_topic)
GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]"
var/list/input = params2list(T)
+ if(input[SERVICE_CMD_PARAM_KEY])
+ return ServiceCommand(input)
var/key_valid = (global.comms_allowed && input["key"] == global.comms_key)
- var/static/last_irc_status = 0
if("ping" in input)
var/x = 1
@@ -110,8 +114,9 @@
n++
return n
- else if("ircstatus" in input)
- if(world.time - last_irc_status < IRC_STATUS_THROTTLE)
+ else if("ircstatus" in input) //tgs2 support
+ var/static/last_irc_status = 0
+ if(world.time - last_irc_status < 50)
return
var/list/adm = get_admin_counts()
var/list/allmins = adm["total"]
@@ -179,20 +184,20 @@
if(input["crossmessage"] == "News_Report")
minor_announce(input["message"], "Breaking Update From [input["message_sender"]]")
- else if("adminmsg" in input)
+ else if("adminmsg" in input) //tgs2 support
if(!key_valid)
return "Bad Key"
else
return IrcPm(input["adminmsg"],input["msg"],input["sender"])
- else if("namecheck" in input)
+ else if("namecheck" in input) //tgs2 support
if(!key_valid)
return "Bad Key"
else
log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]")
message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]")
return keywords_lookup(input["namecheck"],1)
- else if("adminwho" in input)
+ else if("adminwho" in input) //tgs2 support
if(!key_valid)
return "Bad Key"
else
@@ -218,6 +223,7 @@
C.AnnouncePR(final_composed)
/world/Reboot(reason = 0, fast_track = FALSE)
+ ServiceReboot() //handles alternative actions if necessary
if (reason || fast_track) //special reboot, do none of the normal stuff
if (usr)
log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools")
diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt
index 7bcb2df999..96737c5484 100644
--- a/config/admin_ranks.txt
+++ b/config/admin_ranks.txt
@@ -11,7 +11,9 @@
##############################################################################################################
# PLEASE NOTE: depending on config options, some abilities will be unavailable regardless if you have permission to use them!
-# KEYWORDS:
+# Follow the format below when documenting new keywords so the server tools may parse it
+
+# BEGIN_KEYWORDS
# +ADMIN = general admin tools, verbs etc
# +FUN = events, other event-orientated actions. Access to the fun secrets in the secrets panel.
# +BAN = the ability to ban, jobban and fullban
@@ -26,6 +28,7 @@
# +SOUND (or +SOUNDS) = allows you to upload and play sounds
# +SPAWN (or +CREATE) = mob transformations, spawning of most atoms including mobs (high-risk atoms, e.g. blackholes, will require the +FUN flag too)
# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
+# END_KEYWORDS
Admin Observer
Moderator = +ADMIN
diff --git a/config/config.txt b/config/config.txt
index 68df4c81cf..f37be01b10 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -1,4 +1,4 @@
-## Server name: This appears at the top of the screen in-game and in the BYOND hub. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice.
+## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'tgstation' with the name of your choice.
# SERVERNAME tgstation
## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters.
@@ -7,35 +7,29 @@
## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead.
STATIONNAME Space Station 13
-## Put on byond hub: uncomment this to put your server on the byond hub.
+## Put on byond hub: Uncomment this to put your server on the byond hub.
#HUB
-# Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready.
+## Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready.
LOBBY_COUNTDOWN 120
-# Round End Time: This is the amount of time after the round ends that players have to murder death kill each other.
+## Round End Time: This is the amount of time after the round ends that players have to murder death kill each other.
ROUND_END_COUNTDOWN 90
-## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system.
+## Comment this out if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system.
ADMIN_LEGACY_SYSTEM
-## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system.
+## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system.
BAN_LEGACY_SYSTEM
-## Add a # infront of this if you want to use the SQL based mentor system, the legacy system uses mentors.txt You need to set up your database to use the SQL based system.
-MENTOR_LEGACY_SYSTEM
-
-#Mentors only see ckeys by default. Uncomment to have them only see mob name
-#MENTORS_MOBNAME_ONLY
-
-## Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing
+## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing
## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job.
## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up.
## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means
## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days.
#USE_AGE_RESTRICTION_FOR_JOBS
-# Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers.
+## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers.
#USE_ACCOUNT_AGE_FOR_JOBS
## log OOC channel
@@ -47,9 +41,6 @@ LOG_SAY
## log admin actions
LOG_ADMIN
-## log mentor actions
-LOG_MENTOR
-
## log admin chat
LOG_ADMINCHAT
@@ -136,11 +127,11 @@ HOSTEDBY Yournamehere
## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting)
GUEST_BAN
-## Comment to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected)
+## Comment this out to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected)
CHECK_RANDOMIZER
-### IPINTEL:
-### This allows you to detect likely proxies by checking ips against getipintel.net
+## IPINTEL:
+## This allows you to detect likely proxies by checking ips against getipintel.net
## Rating to warn at: (0.90 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning
#IPINTEL_RATING_BAD 0.90
## Contact email, (required to use the service, leaving blank or default disables IPINTEL)
@@ -164,7 +155,7 @@ CHECK_RANDOMIZER
#USEWHITELIST
## set a server location for world reboot. Don't include the byond://, just give the address and port.
-# Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted.
+## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted.
# SERVER ss13.example.com:2506
## forum address
@@ -173,13 +164,13 @@ CHECK_RANDOMIZER
## Wiki address
# WIKIURL http://www.tgstation13.org/wiki
-##Rules address
+## Rules address
# RULESURL http://www.tgstation13.org/wiki/Rules
-##Github address
+## Github address
# GITHUBURL https://www.github.com/tgstation/-tg-station
-##Github repo id
+## Github repo id
##This can be found by going to https://api.github.com/users//repos
##Or https://api.github.com/orgs//repos if the repo owner is an organization
# GITHUBREPOID 3234987
@@ -191,23 +182,20 @@ CHECK_RANDOMIZER
##Toggle for having jobs load up from the .txt
# LOAD_JOBS_FROM_TXT
-##Remove the # mark infront of this to forbid admins from possessing the singularity.
+## Uncomment this to forbid admins from possessing the singularity.
#FORBID_SINGULO_POSSESSION
-## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM.
+## Uncomment to show a popup 'reply to' window to every non-admin that recieves an adminPM.
## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off)
#POPUP_ADMIN_PM
-## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR
+## Uncomment to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR
ALLOW_HOLIDAYS
-##Remove the # mark if you are going to use the SVN irc bot to relay adminhelps
-#USEIRCBOT
-
-##Uncomment to show the names of the admin sending a pm from IRC instead of showing as a stealthmin.
+## Uncomment to show the names of the admin sending a pm from IRC instead of showing as a stealthmin.
#SHOW_IRC_NAME
-##Defines the ticklimit for subsystem initialization (In percents of a byond tick). Lower makes world start smoother. Higher makes it faster.
+## Defines the ticklimit for subsystem initialization (In percents of a byond tick). Lower makes world start smoother. Higher makes it faster.
##This is currently a testing optimized setting. A good value for production would be 98.
TICK_LIMIT_MC_INIT 500
@@ -340,4 +328,7 @@ MINUTE_TOPIC_LIMIT 100
## How long an unique error will be silenced for
#ERROR_SILENCE_TIME 6000
##How long to wait between messaging admins about occurences of an unique error
-#ERROR_MSG_DELAY 50
\ No newline at end of file
+#ERROR_MSG_DELAY 50
+
+## Send a message to IRC when starting a new game
+#IRC_ANNOUNCE_NEW_GAME
\ No newline at end of file
diff --git a/config/dbconfig.txt b/config/dbconfig.txt
index cc28dc483d..1a7981c8c8 100644
--- a/config/dbconfig.txt
+++ b/config/dbconfig.txt
@@ -2,11 +2,11 @@
## This is used for stats, feedback gathering,
## administration, and the in game library.
-## Should SQL be enabled? Uncomment to enable.
+## Should SQL be enabled? Uncomment to enable
#SQL_ENABLED
## Server the MySQL database can be found at.
-# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
+## Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
ADDRESS localhost
## MySQL server port (default is 3306).
@@ -22,9 +22,8 @@ FEEDBACK_DATABASE feedback
## FEEDBACK_TABLEPREFIX erro_
## FEEDBACK_TABLEPREFIX
## FEEDBACK_TABLEPREFIX SS13_
-##
-## Leave as is if you are using the standard schema file.
-FEEDBACK_TABLEPREFIX
+## Remove "SS13_" if you are using the standard schema file.
+FEEDBACK_TABLEPREFIX SS13_
## Username/Login used to access the database.
FEEDBACK_LOGIN username
diff --git a/config/game_options.txt b/config/game_options.txt
index a534dc633e..fca46c529d 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -1,33 +1,33 @@
-### HEALTH ###
+## HEALTH ###
-#Damage multiplier, effects both weapons and healing on all mobs. For example, 1.25 would result in 25% higher damage.
+##Damage multiplier, effects both weapons and healing on all mobs. For example, 1.25 would result in 25% higher damage.
DAMAGE_MULTIPLIER 1
-### REVIVAL ###
+## REVIVAL ###
-# whether pod plants work or not
+## whether pod plants work or not
REVIVAL_POD_PLANTS
-# whether cloning tubes work or not
+## whether cloning tubes work or not
REVIVAL_CLONING
-# amount of time (in hundredths of seconds) for which a brain retains the "spark of life" after the person's death (set to -1 for infinite)
+## amount of time (in hundredths of seconds) for which a brain retains the "spark of life" after the person's death (set to -1 for infinite)
REVIVAL_BRAIN_LIFE -1
-### RENAMING ###
+## RENAMING ###
-#Uncomment to allow cyborgs to rename themselves at roundstart. Has no effect on roboticists renaming cyborgs the normal way.
+## Uncomment to allow cyborgs to rename themselves at roundstart. Has no effect on roboticists renaming cyborgs the normal way.
#RENAME_CYBORG
-### OOC DURING ROUND ###
-#Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results.
+## OOC DURING ROUND ###
+## Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results.
OOC_DURING_ROUND
-### EMOJI ###
-#Comment this out if you want to disable emojis
+## EMOJI ###
+## Comment this out if you want to disable emojis
EMOJIS
-### MOB MOVEMENT ###
+## MOB MOVEMENT ###
## We suggest editing these variables ingame to find a good speed for your server.
## To do this you must be a high level admin. Open the 'debug' tab ingame.
@@ -49,7 +49,7 @@ SLIME_DELAY 0
ANIMAL_DELAY 0
-### NAMES ###
+## NAMES ###
## If uncommented this adds a random surname to a player's name if they only specify one name.
#HUMANS_NEED_SURNAMES
@@ -57,7 +57,7 @@ ANIMAL_DELAY 0
#FORCE_RANDOM_NAMES
-### ALERT LEVELS ###
+## ALERT LEVELS ###
ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced.
ALERT_BLUE_UPTO The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted.
ALERT_BLUE_DOWNTO The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed.
@@ -67,7 +67,7 @@ ALERT_DELTA Destruction of the station is imminent. All crew are instructed to o
-### GAME MODES ###
+## GAME MODES ###
## Uncomment to not send a roundstart intercept report. Gamemodes may override this.
#NO_INTERCEPT_REPORT
@@ -142,7 +142,7 @@ MIDROUND_ANTAG ABDUCTION
#MIDROUND_ANTAG RAGINMAGES
#MIDROUND_ANTAG MONKEY
-## Uncomment for overrides of the minimum / maximum number of players in a round type.
+## Uncomment these for overrides of the minimum / maximum number of players in a round type.
## If you set any of these occasionally check to see if you still need them as the modes
## will still be actively rebalanced around the SUGGESTED populations, not your overrides.
## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to
@@ -166,7 +166,7 @@ MIDROUND_ANTAG ABDUCTION
#MIN_POP GANG 20
#MAX_POP GANG -1
-#MIN_POP CULT 0
+#MIN_POP CULT 24
#MAX_POP CULT -1
#MIN_POP CLOCKWORK_CULT 24
@@ -213,8 +213,8 @@ CHANGELING_SCALING_COEFF 6
## Set to 0 to disable scaling and use default numbers instead.
SECURITY_SCALING_COEFF 8
-# The number of objectives traitors get.
-# Not including escaping/hijacking.
+## The number of objectives traitors get.
+## Not including escaping/hijacking.
TRAITOR_OBJECTIVES_AMOUNT 2
## Uncomment to prohibit jobs that start with loyalty
@@ -233,8 +233,8 @@ ALLOW_LATEJOIN_ANTAGONISTS
## Uncomment to allow players to see the set odds of different rounds in secret/random in the get server revision screen. This will NOT tell the current roundtype.
#SHOW_GAME_TYPE_ODDS
-### RANDOM EVENTS ###
-## Comment this to disable random events during the round.
+## RANDOM EVENTS ###
+## Comment this out to disable random events during the round.
ALLOW_RANDOM_EVENTS
## Multiplier for earliest start time of dangerous events.
@@ -246,34 +246,34 @@ EVENTS_MIN_TIME_MUL 1
EVENTS_MIN_PLAYERS_MUL 1
-### AI ###
+## AI ###
## Allow the AI job to be picked.
ALLOW_AI
-### Secborg ###
+## Secborg ###
## Uncomment to prevent the security cyborg module from being chosen
#DISABLE_SECBORG
-### Peacekeeper Borg ###
+## Peacekeeper Borg ###
## Uncomment to prevent the peacekeeper cyborg module from being chosen
#DISABLE_PEACEBORG
-### AWAY MISSIONS ###
+## AWAY MISSIONS ###
## How long the delay is before the Away Mission gate opens. Default is half an hour.
## 600 is one minute.
GATEWAY_DELAY 18000
-### ACCESS ###
+## ACCESS ###
## If the number of players ready at round starts exceeds this threshold, JOBS_HAVE_MINIMAL_ACCESS will automatically be enabled. Otherwise, it will be disabled.
## This is useful for accomodating both low and high population rounds on the same server.
-## Comment out or set to 0 to disable this automatic toggle.
+## Comment this out or set to 0 to disable this automatic toggle.
MINIMAL_ACCESS_THRESHOLD 20
-## Comment this out if you wish to use the setup where jobs have more access.
+## Comment this out this if you wish to use the setup where jobs have more access.
## This is intended for servers with low populations - where there are not enough
## players to fill all roles, so players need to do more than just one job.
## This option is ignored if MINIMAL_ACCESS_THRESHOLD is used.
@@ -282,35 +282,35 @@ MINIMAL_ACCESS_THRESHOLD 20
## Uncomment to give assistants maint access.
#ASSISTANTS_HAVE_MAINT_ACCESS
-## Uncoment to give security maint access. Note that if you comment JOBS_HAVE_MINIMAL_ACCESS security already gets maint from that.
+## Uncoment to give security maint access. Note that if you dectivate JOBS_HAVE_MINIMAL_ACCESS security already gets maint from that.
#SECURITY_HAS_MAINT_ACCESS
## Uncomment to give everyone maint access.
#EVERYONE_HAS_MAINT_ACCESS
-## Comment this to make security officers spawn in departmental security posts
+## Comment this out this to make security officers spawn in departmental security posts
SEC_START_BRIG
-### GHOST INTERACTION ###
+## GHOST INTERACTION ###
## Uncomment to let ghosts spin chairs. You may be wondering why this is a config option. Don't ask.
#GHOST_INTERACTION
-### NON-VOCAL SILICONS ###
-## Uncomment to stop the AI, or cyborgs, from having vocal communication.
+## NON-VOCAL SILICONS ###
+## Uncomment these to stop the AI, or cyborgs, from having vocal communication.
#SILENT_AI
#SILENT_BORG
-### SANDBOX PANEL AUTOCLOSE ###
+## SANDBOX PANEL AUTOCLOSE ###
## The sandbox panel's item spawning dialog now stays open even after you click an option.
## If you find that your players are abusing the sandbox panel, this option may slow them down
## without preventing people from using it properly.
## Only functions in sandbox game mode.
#SANDBOX_AUTOCLOSE
-### ROUNDSTART SILICON LAWS ###
+## ROUNDSTART SILICON LAWS ###
## This controls what the AI's laws are at the start of the round.
-## Set to 0/commented for "off", silicons will just start with Asimov.
+## Set to 0/commented out for "off", silicons will just start with Asimov.
## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.)
## Set to 2 for "random", silicons will start with a random lawset picked from random laws specified below.
## Set to 3 for "weighted random", using values in "silicon_weights.txt", a law will be selected, with weights specifed in that file.
@@ -378,7 +378,7 @@ LAW_WEIGHT buildawall,0
##------------------------------------------------
-### SILICON LAW MAX AMOUNT ###
+## SILICON LAW MAX AMOUNT ###
## The maximum number of laws a silicon can have
## Attempting to upload laws past this point will fail unless the AI is reset
SILICON_MAX_LAW_AMOUNT 12
@@ -401,7 +401,7 @@ ROUNDSTART_RACES plasmaman
#ROUNDSTART_RACES shadow
## Races that are better than humans in some ways, but worse in others
-ROUNDSTART_RACES jelly
+#ROUNDSTART_RACES jelly
#ROUNDSTART_RACES golem
#ROUNDSTART_RACES adamantine
#ROUNDSTART_RACES plasma
@@ -415,7 +415,7 @@ ROUNDSTART_RACES jelly
## Races that are straight upgrades. If these are on expect powergamers to always pick them
#ROUNDSTART_RACES skeleton
#ROUNDSTART_RACES zombie
-ROUNDSTART_RACES slime
+#ROUNDSTART_RACES slime
#ROUNDSTART_RACES pod
#ROUNDSTART_RACES military_synth
#ROUNDSTART_RACES agent
@@ -430,12 +430,12 @@ ASSISTANT_CAP -1
## Starlight for exterior walls and breaches. Uncomment for starlight!
## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting
-STARLIGHT
+#STARLIGHT
## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants.
#GREY_ASSISTANTS
-### Midround Antag (aka Mulligan antag) config options ###
+## Midround Antag (aka Mulligan antag) config options ###
## A time, in minutes, after which the midround antag system stops attempting to run and continuous rounds end immediately upon completion.
MIDROUND_ANTAG_TIME_CHECK 60
@@ -443,18 +443,18 @@ MIDROUND_ANTAG_TIME_CHECK 60
## A ratio of living to total crew members, the lower this is, the more people will have to die in order for midround antag to be skipped
MIDROUND_ANTAG_LIFE_CHECK 0.7
-###Limit Spell Choices##
+##Limit Spell Choices##
## Uncomment to disallow wizards from using certain spells that may be too chaotic/fun for your playerbase
#NO_SUMMON_GUNS
#NO_SUMMON_MAGIC
#NO_SUMMON_EVENTS
-##Comment for "normal" explosions, which ignore obstacles
-##Uncomment for explosions that react to doors and walls
+## Comment this out for "normal" explosions, which ignore obstacles
+## Uncomment for explosions that react to doors and walls
REACTIONARY_EXPLOSIONS
-### Configure the bomb cap
+## Configure the bomb cap
## This caps all explosions to the specified range. Used for both balance reasons and to prevent overloading the server and lagging the game out.
## This is given as the 3rd number(light damage) in the standard (1,2,3) explosion notation. The other numbers are derived by dividing by 2 and 4.
## eg: If you give the number 20. The bomb cap will be 5,10,20.
@@ -469,18 +469,23 @@ BOMBCAP 20
## Lavaland "Budget"
-# Lavaland ruin spawning has an imaginary budget to spend on ruins, where
-# a less lootfilled or smaller or less round effecting ruin costs less to
-# spawn, while the converse is true. Alter this number to affect the amount
-# of ruins.
-LAVALAND_BUDGET 16
+## Lavaland ruin spawning has an imaginary budget to spend on ruins, where
+## a less lootfilled or smaller or less round effecting ruin costs less to
+## spawn, while the converse is true. Alter this number to affect the amount
+## of ruins.
+LAVALAND_BUDGET 60
## Space Ruin Budged
-Space_Budget 8
+Space_Budget 16
-#Time in ds from when a player latejoins till the arrival shuttle docks at the station
-#Must be at least 30 to not break parallax I recommended at least 55 to be visually/aurally appropriate
+## Time in ds from when a player latejoins till the arrival shuttle docks at the station
+## Must be at least 30 to not break parallax I recommended at least 55 to be visually/aurally appropriate
ARRIVALS_SHUTTLE_DOCK_WINDOW 55
-#Set this to 1 to prevent late join players from spawning if the arrivals shuttle is depressurized
-ARRIVALS_SHUTTLE_REQUIRE_SAFE_LATEJOIN 0
\ No newline at end of file
+## Uncomment to prevent late join players from spawning if the arrivals shuttle is depressurized
+#ARRIVALS_SHUTTLE_REQUIRE_SAFE_LATEJOIN
+
+## How many wirechewing rodents you want to spawn on exposed maintenane wires at the start of the round. You may wish to set this to 0 if you're testing powernets.
+
+MICE_ROUNDSTART 10
+
diff --git a/config/server_to_tool_bridge_port.txt b/config/server_to_tool_bridge_port.txt
new file mode 100644
index 0000000000..402253760b
--- /dev/null
+++ b/config/server_to_tool_bridge_port.txt
@@ -0,0 +1 @@
+45678
diff --git a/html/changelogs/AutoChangeLog-pr-1219.yml b/html/changelogs/AutoChangeLog-pr-1219.yml
new file mode 100644
index 0000000000..928478889c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1219.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "Allows explorer webbings to hold marker beacons."
diff --git a/html/changelogs/AutoChangeLog-pr-1244.yml b/html/changelogs/AutoChangeLog-pr-1244.yml
new file mode 100644
index 0000000000..cb3ce07ed9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1244.yml
@@ -0,0 +1,5 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscadd: "The kinetic crusher can now gain bonus effects via trophy items gained by killing bosses with it."
+ - rscadd: "Yes, you do have to kill the boss primarily doing damage via the kinetic crusher, or you won't get the trophy item and the bonus effect it grants."
diff --git a/html/changelogs/AutoChangeLog-pr-1274.yml b/html/changelogs/AutoChangeLog-pr-1274.yml
new file mode 100644
index 0000000000..498a1c03ea
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1274.yml
@@ -0,0 +1,5 @@
+author: "Steelpoint"
+delete-after: True
+changes:
+ - rscadd: "Central Command has listened to complaints and, as such, has now stationed \"real\" Private Security Officers at centcom docks."
+ - rscadd: "A new Nanotrasen Security Officer NPC variant is available to admins, this 'peaceful' version will only attack people who attack it first. Great for keeping order."
diff --git a/html/changelogs/AutoChangeLog-pr-1277.yml b/html/changelogs/AutoChangeLog-pr-1277.yml
new file mode 100644
index 0000000000..b20bcf2f45
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1277.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - spellcheck: "Renames hivelord and legion cores to 'regenerative core'. Their descs have also been updated to be more clear."
diff --git a/html/changelogs/AutoChangeLog-pr-1308.yml b/html/changelogs/AutoChangeLog-pr-1308.yml
new file mode 100644
index 0000000000..af53d19554
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1308.yml
@@ -0,0 +1,8 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Luxury versions of the bluespace shelter capsule are now available! Purchase them at the mining equipment vendor."
+ - rscadd: "Cardboard cutouts have a new option: Xenomorph Maid"
+ - rscadd: "Black Carpet can now be crafted using a stack of carpet and a black crayon."
+ - rscadd: "Black fancy tables can now be crafted using Black Carpet."
+ - rscadd: "Shower curtains can now be recoloured with crayons, unscrewed from the floor, disassembled with wire cutters, and reassembled using cloth, plastic, and a metal rod."
diff --git a/html/changelogs/AutoChangeLog-pr-1326.yml b/html/changelogs/AutoChangeLog-pr-1326.yml
new file mode 100644
index 0000000000..bd9b271593
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1326.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "Portable pump max pressure has been lowered."
diff --git a/html/changelogs/AutoChangeLog-pr-1327.yml b/html/changelogs/AutoChangeLog-pr-1327.yml
new file mode 100644
index 0000000000..85eddc62fc
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1327.yml
@@ -0,0 +1,5 @@
+author: "Goodstuff"
+delete-after: True
+changes:
+ - bugfix: "Fixes the crafting recipe for black carpet"
+ - bugfix: "Removed a random white dot on the black carpet sprite"
diff --git a/html/changelogs/AutoChangeLog-pr-1332.yml b/html/changelogs/AutoChangeLog-pr-1332.yml
new file mode 100644
index 0000000000..5971468fd2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1332.yml
@@ -0,0 +1,4 @@
+author: "Joan"
+delete-after: True
+changes:
+ - rscadd: "Three unique Kinetic Accelerator modules will now appear in necropolis chests."
diff --git a/html/changelogs/AutoChangeLog-pr-1336.yml b/html/changelogs/AutoChangeLog-pr-1336.yml
new file mode 100644
index 0000000000..01fb143eb9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1336.yml
@@ -0,0 +1,4 @@
+author: "QualityVan"
+delete-after: True
+changes:
+ - tweak: "The tactical rigging in op closets is more tacticool"
diff --git a/html/changelogs/AutoChangeLog-pr-1342.yml b/html/changelogs/AutoChangeLog-pr-1342.yml
new file mode 100644
index 0000000000..2dd36c983f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1342.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Attempts to add items to a storage container beyond its slots limit will now obtain a failure message again."
diff --git a/html/changelogs/AutoChangeLog-pr-1345.yml b/html/changelogs/AutoChangeLog-pr-1345.yml
new file mode 100644
index 0000000000..64afe8dd66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1345.yml
@@ -0,0 +1,5 @@
+author: "p440"
+delete-after: True
+changes:
+ - bugfix: "Fixed duping cable coils with magic APC terminals"
+ - bugfix: "Fixed invalid icon state for empty APCs"
diff --git a/html/changelogs/AutoChangeLog-pr-1354.yml b/html/changelogs/AutoChangeLog-pr-1354.yml
new file mode 100644
index 0000000000..ce5a9bc89d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1354.yml
@@ -0,0 +1,4 @@
+author: "Improvedname"
+delete-after: True
+changes:
+ - rscadd: "Janitors now start with a flyswatter"
diff --git a/html/changelogs/AutoChangeLog-pr-1357.yml b/html/changelogs/AutoChangeLog-pr-1357.yml
new file mode 100644
index 0000000000..3714e15677
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1357.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - tweak: "The Seed Vault's chemical dispenser now has all the chemicals a pod person could want."
diff --git a/html/changelogs/AutoChangeLog-pr-1364.yml b/html/changelogs/AutoChangeLog-pr-1364.yml
new file mode 100644
index 0000000000..42b08fd338
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1364.yml
@@ -0,0 +1,6 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "The crafting menu now has subcategories!"
+ - rscadd: "Food recipe categories have been combined as subcategories of the Foods category."
+ - rscadd: "Weaponry and Ammunition have been combined as subcategories of the Weaponry category."
diff --git a/html/changelogs/AutoChangeLog-pr-1366.yml b/html/changelogs/AutoChangeLog-pr-1366.yml
new file mode 100644
index 0000000000..23f1e1c9ac
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1366.yml
@@ -0,0 +1,4 @@
+author: "Planned Spaceparenthood"
+delete-after: True
+changes:
+ - bugfix: "We would like to apologize for mislabeled cloning pod buttons."
diff --git a/html/changelogs/AutoChangeLog-pr-1370.yml b/html/changelogs/AutoChangeLog-pr-1370.yml
new file mode 100644
index 0000000000..3b3468b7a3
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1370.yml
@@ -0,0 +1,7 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "Many stacks now update their sprite based on their amount."
+ - rscadd: "Stacks will now weigh less if they're less than full."
+ - imageadd: "Added new icon states for glass, reinforced glass, metal, plasteel, plastic, plasma, plastitanium, titanium, gold, silver, adamantine, brass, bruise packs, ointment, gauze, cloth, leather, wet leather, hairless hide, human hide, ash drake hide, goliath hide, bones, sandstone blocks, and snow blocks."
+ - tweak: "Some lavaland stacks' max amounts have been reduced."
diff --git a/html/changelogs/AutoChangeLog-pr-1377.yml b/html/changelogs/AutoChangeLog-pr-1377.yml
new file mode 100644
index 0000000000..ad71916544
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1377.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Bulldog Shotguns should update their sprite properly when you remove the magazine."
diff --git a/html/changelogs/AutoChangeLog-pr-1379.yml b/html/changelogs/AutoChangeLog-pr-1379.yml
new file mode 100644
index 0000000000..e912f355ee
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1379.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Riot suits no longer hide jumpsuits."
diff --git a/html/changelogs/AutoChangeLog-pr-1412.yml b/html/changelogs/AutoChangeLog-pr-1412.yml
new file mode 100644
index 0000000000..5b3f54782c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1412.yml
@@ -0,0 +1,5 @@
+author: "LetterJay"
+delete-after: True
+changes:
+ - experiment: "New server backend!"
+ - tweak: "Test merged PRs now show the commit of the PR at which they were merged"
diff --git a/html/changelogs/AutoChangeLog-pr-1487.yml b/html/changelogs/AutoChangeLog-pr-1487.yml
new file mode 100644
index 0000000000..eeed3b359b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1487.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - tweak: "Defibrillator paddles will no longer stick to your hands, and will snap back onto the unit if you drop them somehow."
diff --git a/html/changelogs/AutoChangeLog-pr-1498.yml b/html/changelogs/AutoChangeLog-pr-1498.yml
new file mode 100644
index 0000000000..08f8aaf02b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1498.yml
@@ -0,0 +1,4 @@
+author: "oranges"
+delete-after: True
+changes:
+ - tweak: "Security minor and major crime descriptors are now a single line input, making it easier to add them"
diff --git a/html/changelogs/AutoChangeLog-pr-1513.yml b/html/changelogs/AutoChangeLog-pr-1513.yml
new file mode 100644
index 0000000000..3066b9af93
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1513.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Cloning dismembered heads and brains now respects husking and other clone preventing disabilities."
diff --git a/html/changelogs/AutoChangeLog-pr-1516.yml b/html/changelogs/AutoChangeLog-pr-1516.yml
new file mode 100644
index 0000000000..6bc4bf5372
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1516.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - imageadd: "Glass tables are shinier"
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 8fbd06a23b..f73a54ab1d 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/obj/cardboard_cutout.dmi b/icons/obj/cardboard_cutout.dmi
index a329c00555..fb41575a8d 100644
Binary files a/icons/obj/cardboard_cutout.dmi and b/icons/obj/cardboard_cutout.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 441f334ca7..2043111e60 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index a02dcae2f3..254ac3a777 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index d19bc53856..41c1ba56cd 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/lavaland/survival_pod.dmi
index 51358dfe4c..84ea0e1e83 100644
Binary files a/icons/obj/lavaland/survival_pod.dmi and b/icons/obj/lavaland/survival_pod.dmi differ
diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi
index f039038dfa..471e9bfa30 100644
Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ
diff --git a/icons/obj/machines/dominator.dmi b/icons/obj/machines/dominator.dmi
index 9f743174e7..42337dc1c8 100644
Binary files a/icons/obj/machines/dominator.dmi and b/icons/obj/machines/dominator.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index a5fe40431e..3de64f610a 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 2bbe115510..ca0e225d7e 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/smooth_structures/fancy_table_black.dmi b/icons/obj/smooth_structures/fancy_table_black.dmi
new file mode 100644
index 0000000000..d4570e8a7c
Binary files /dev/null and b/icons/obj/smooth_structures/fancy_table_black.dmi differ
diff --git a/icons/obj/smooth_structures/glass_table.dmi b/icons/obj/smooth_structures/glass_table.dmi
index 3fa90ea064..112499f380 100644
Binary files a/icons/obj/smooth_structures/glass_table.dmi and b/icons/obj/smooth_structures/glass_table.dmi differ
diff --git a/icons/obj/tiles.dmi b/icons/obj/tiles.dmi
index 5a8afeee51..1c0ac03abe 100644
Binary files a/icons/obj/tiles.dmi and b/icons/obj/tiles.dmi differ
diff --git a/icons/turf/floors/carpet_black.dmi b/icons/turf/floors/carpet_black.dmi
new file mode 100644
index 0000000000..d1174203aa
Binary files /dev/null and b/icons/turf/floors/carpet_black.dmi differ
diff --git a/sound/voice/oof.ogg b/sound/voice/oof.ogg
new file mode 100644
index 0000000000..dd0e7edee6
Binary files /dev/null and b/sound/voice/oof.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index cfc637f503..0d035a36f3 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -60,6 +60,7 @@
#include "code\__DEFINES\robots.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\say.dm"
+#include "code\__DEFINES\server_tools.dm"
#include "code\__DEFINES\shuttles.dm"
#include "code\__DEFINES\sight.dm"
#include "code\__DEFINES\sound.dm"
@@ -335,6 +336,7 @@
#include "code\datums\status_effects\buffs.dm"
#include "code\datums\status_effects\debuffs.dm"
#include "code\datums\status_effects\gas.dm"
+#include "code\datums\status_effects\neutral.dm"
#include "code\datums\status_effects\status_effect.dm"
#include "code\datums\weather\weather.dm"
#include "code\datums\weather\weather_types.dm"
@@ -1487,10 +1489,12 @@
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
#include "code\modules\mining\equipment\explorer_gear.dm"
+#include "code\modules\mining\equipment\goliath_hide.dm"
#include "code\modules\mining\equipment\kinetic_crusher.dm"
#include "code\modules\mining\equipment\lazarus_injector.dm"
#include "code\modules\mining\equipment\marker_beacons.dm"
#include "code\modules\mining\equipment\mineral_scanner.dm"
+#include "code\modules\mining\equipment\regenerative_core.dm"
#include "code\modules\mining\equipment\mining_tools.dm"
#include "code\modules\mining\equipment\resonator.dm"
#include "code\modules\mining\equipment\survival_pod.dm"
@@ -1741,7 +1745,6 @@
#include "code\modules\mob\living\simple_animal\hostile\creature.dm"
#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm"
#include "code\modules\mob\living\simple_animal\hostile\faithless.dm"
-#include "code\modules\mob\living\simple_animal\hostile\flan.dm"
#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm"
#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
@@ -1751,7 +1754,6 @@
#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm"
#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
-#include "code\modules\mob\living\simple_animal\hostile\mining_mobs.dm"
#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm"
#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm"
#include "code\modules\mob\living\simple_animal\hostile\pirate.dm"
@@ -1763,6 +1765,7 @@
#include "code\modules\mob\living\simple_animal\hostile\tree.dm"
#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm"
#include "code\modules\mob\living\simple_animal\hostile\wizard.dm"
+#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm"
#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm"
#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
@@ -1772,6 +1775,13 @@
#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm"
+#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\necropolis_tendril.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm"
#include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm"
@@ -1913,7 +1923,9 @@
#include "code\modules\procedural_mapping\mapGenerators\cellular.dm"
#include "code\modules\procedural_mapping\mapGenerators\cult.dm"
#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm"
+#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm"
#include "code\modules\procedural_mapping\mapGenerators\nature.dm"
+#include "code\modules\procedural_mapping\mapGenerators\repair.dm"
#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm"
#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
#include "code\modules\projectiles\ammunition.dm"
@@ -2042,6 +2054,7 @@
#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm"
#include "code\modules\security_levels\keycard_authentication.dm"
#include "code\modules\security_levels\security_levels.dm"
+#include "code\modules\server_tools\server_tools.dm"
#include "code\modules\shuttle\arrivals.dm"
#include "code\modules\shuttle\assault_pod.dm"
#include "code\modules\shuttle\computer.dm"
diff --git a/tgui/src/interfaces/personal_crafting.ract b/tgui/src/interfaces/personal_crafting.ract
index f02b3b681c..962d320c08 100644
--- a/tgui/src/interfaces/personal_crafting.ract
+++ b/tgui/src/interfaces/personal_crafting.ract
@@ -45,31 +45,57 @@
-
+
{{#if data.busy}}
Crafting...
{{else}}
-
- {{data.prev_cat}}
-
-
- {{data.next_cat}}
-
- {{#if data.display_craftable_only}}
-
- Showing Craftable Recipes
-
- {{else}}
-
- Showing All Recipes
-
- {{/if}}
-
- Compact
-
+
{{#if config.fancy}}
{{^data.display_compact}} {{! This doesn't work in compact mode, so let's hide it}}
diff --git a/tools/dmm2tgm/Source/dmm2tgm.py b/tools/dmm2tgm/Source/dmm2tgm.py
deleted file mode 100644
index 637986f9a6..0000000000
--- a/tools/dmm2tgm/Source/dmm2tgm.py
+++ /dev/null
@@ -1,77 +0,0 @@
-
-import sys
-
-# .dmm format converter, by RemieRichards
-# Version 2.0
-# Converts the internal structure of a .dmm file to a syntax
-# that git can better handle conflicts-wise, it's also fairly human readable!
-# Processes Boxstation (tgstation.2.1.3) almost instantly
-
-
-def convert_map(map_file):
- #CHECK FOR PREVIOUS CONVERSION
- with open(map_file, "r") as conversion_candidate:
- header = conversion_candidate.readline()
- if header.find("//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE") != -1:
- sys.exit()
- return
-
-
- #ACTUAL CONVERSION
- with open(map_file, "r+") as unconverted_map:
- characters = unconverted_map.read()
- converted_map = ""
- in_object_block = False #()
- in_variable_block = False #{}
- in_quote_block = False #''
- in_double_quote_block = False #""
- for char in characters:
- if not in_quote_block: #Checking for things like "Flashbangs (Warning!)" Because we only care about ({'";, that are used as byond syntax, not strings
- if not in_double_quote_block:
- if not in_variable_block:
- if char == "(":
- in_object_block = True
- char = char + "\n"
- if char == ")":
- in_object_block = False
- if char == ",":
- char = char + "\n"
-
- if char == "{":
- in_variable_block = True
- if in_object_block:
- char = char + "\n\t"
- if char == "}":
- in_variable_block = False
- if in_object_block:
- char = "\n\t" + char
-
- if char == ";":
- char = char + "\n\t"
-
- if char == "\"":
- if in_double_quote_block:
- in_double_quote_block = False
- else:
- in_double_quote_block = True
-
- if char == "'":
- if not in_double_quote_block:
- if in_quote_block:
- in_quote_block = False
- else:
- in_quote_block = True
-
- converted_map = converted_map + char
-
- #OVERWRITE MAP FILE WITH CONVERTED MAP STRING
- with open(map_file, "r+") as final_converted_map:
- final_converted_map.write("//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE \n")
- final_converted_map.write(converted_map)
-
- sys.exit()
-
-
-if sys.argv[1]: #Run like dmm2tgm.py "folder/folder/a_map.dmm"
- convert_map(sys.argv[1])
-
diff --git a/tools/dmm2tgm/dmm2tgm.exe b/tools/dmm2tgm/dmm2tgm.exe
deleted file mode 100644
index fba25d71d0..0000000000
Binary files a/tools/dmm2tgm/dmm2tgm.exe and /dev/null differ
diff --git a/tools/dmm2tgm/library.zip b/tools/dmm2tgm/library.zip
deleted file mode 100644
index 068102032b..0000000000
Binary files a/tools/dmm2tgm/library.zip and /dev/null differ
diff --git a/tools/dmm2tgm/python27.dll b/tools/dmm2tgm/python27.dll
deleted file mode 100644
index e45374fb33..0000000000
Binary files a/tools/dmm2tgm/python27.dll and /dev/null differ
diff --git a/tools/dmm2tgm/w9xpopen.exe b/tools/dmm2tgm/w9xpopen.exe
deleted file mode 100644
index 9303628363..0000000000
Binary files a/tools/dmm2tgm/w9xpopen.exe and /dev/null differ
diff --git a/tools/mapmerge/Convert Maps to TGM.bat b/tools/mapmerge/Convert Maps to TGM.bat
new file mode 100644
index 0000000000..0b88dfaf1d
--- /dev/null
+++ b/tools/mapmerge/Convert Maps to TGM.bat
@@ -0,0 +1,3 @@
+@echo off
+set MAPROOT="../../_maps/"
+python dmm2tgm.py %1 %MAPROOT%
\ No newline at end of file
diff --git a/tools/mapmerge/dmm2tgm.py b/tools/mapmerge/dmm2tgm.py
new file mode 100644
index 0000000000..4ed4d8ffe6
--- /dev/null
+++ b/tools/mapmerge/dmm2tgm.py
@@ -0,0 +1,39 @@
+import map_helpers
+import sys
+import shutil
+
+#main("../../_maps/")
+def main(map_folder):
+ tgm = "1"
+ maps = map_helpers.prompt_maps(map_folder, "convert", tgm)
+
+ print("\nConverting these maps:")
+ for i in maps.indices:
+ print(str(maps.files[i])[len(map_folder):])
+
+ convert = input("\nPress Enter to convert...\n")
+ if convert == "abort":
+ print("\nAborted map convert.")
+ sys.exit()
+ else:
+ for i in maps.indices:
+ path_str = str(maps.files[i])
+ path_str_pretty = path_str[len(map_folder):]
+ error = map_helpers.merge_map(path_str, path_str, tgm)
+ if error > 1:
+ print(map_helpers.error[error])
+ continue
+ if error == 1:
+ print(map_helpers.error[1])
+ print("CONVERTED: {}".format(path_str_pretty))
+ print(" - ")
+
+ print("\nFinished converting.")
+
+def string_to_num(s):
+ try:
+ return int(s)
+ except ValueError:
+ return -1
+
+main(sys.argv[1])
diff --git a/tools/mapmerge/map_helpers.py b/tools/mapmerge/map_helpers.py
index ea06641f50..e1eb7e875c 100644
--- a/tools/mapmerge/map_helpers.py
+++ b/tools/mapmerge/map_helpers.py
@@ -1,5 +1,8 @@
import sys
import subprocess
+import os
+import pathlib
+import collections
from datetime import datetime
tgm_header = "//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE"
@@ -727,3 +730,45 @@ def combine_tiles(tile_A, tile_B, priority, marker):
def run_shell_command(command):
return subprocess.run(command, shell=True, stdout=subprocess.PIPE, universal_newlines=True).stdout
+
+def prompt_maps(map_folder, verb, tgm):
+ list_of_files = list()
+ for root, directories, filenames in os.walk(map_folder):
+ for filename in [f for f in filenames if f.endswith(".dmm")]:
+ list_of_files.append(pathlib.Path(root, filename))
+
+ last_dir = ""
+ for i in range(0, len(list_of_files)):
+ this_dir = list_of_files[i].parent
+ if last_dir != this_dir:
+ print("--------------------------------")
+ last_dir = this_dir
+ print("[{}]: {}".format(i, str(list_of_files[i])[len(map_folder):]))
+
+ print("--------------------------------")
+ in_list = input("List the maps you want to " + verb + " (example: 1,3-5,12):\n")
+ in_list = in_list.replace(" ", "")
+ in_list = in_list.split(",")
+
+ valid_indices = list()
+ for m in in_list:
+ index_range = m.split("-")
+ if len(index_range) == 1:
+ index = string_to_num(index_range[0])
+ if index >= 0 and index < len(list_of_files):
+ valid_indices.append(index)
+ elif len(index_range) == 2:
+ index0 = string_to_num(index_range[0])
+ index1 = string_to_num(index_range[1])
+ if index0 >= 0 and index0 <= index1 and index1 < len(list_of_files):
+ valid_indices.extend(range(index0, index1 + 1))
+
+ if tgm == "1":
+ print("\nMaps will be converted to tgm.")
+ tgm = True
+ else:
+ print("\nMaps will not be converted to tgm.")
+ tgm = False
+
+ maps_to_run = collections.namedtuple('maps_to_run', ['files', 'indices'])
+ return maps_to_run(list_of_files, valid_indices)
\ No newline at end of file
diff --git a/tools/mapmerge/mapmerger.py b/tools/mapmerge/mapmerger.py
index b93684bbc9..2b679cb131 100644
--- a/tools/mapmerge/mapmerger.py
+++ b/tools/mapmerge/mapmerger.py
@@ -1,52 +1,15 @@
import map_helpers
import sys
-import os
-import pathlib
import shutil
#main("../../_maps/")
def main(map_folder, tgm=0):
- list_of_files = list()
- for root, directories, filenames in os.walk(map_folder):
- for filename in [f for f in filenames if f.endswith(".dmm")]:
- list_of_files.append(pathlib.Path(root, filename))
-
- last_dir = ""
- for i in range(0, len(list_of_files)):
- this_dir = list_of_files[i].parent
- if last_dir != this_dir:
- print("--------------------------------")
- last_dir = this_dir
- print("[{}]: {}".format(i, str(list_of_files[i])[len(map_folder):]))
-
- print("--------------------------------")
- in_list = input("List the maps you want to merge (example: 1,3-5,12):\n")
- in_list = in_list.replace(" ", "")
- in_list = in_list.split(",")
-
- valid_indices = list()
- for m in in_list:
- index_range = m.split("-")
- if len(index_range) == 1:
- index = string_to_num(index_range[0])
- if index >= 0 and index < len(list_of_files):
- valid_indices.append(index)
- elif len(index_range) == 2:
- index0 = string_to_num(index_range[0])
- index1 = string_to_num(index_range[1])
- if index0 >= 0 and index0 <= index1 and index1 < len(list_of_files):
- valid_indices.extend(range(index0, index1 + 1))
-
- if tgm == "1":
- print("\nMaps will be converted to tgm.")
- tgm = True
- else:
- print("\nMaps will not be converted to tgm.")
- tgm = False
+ valid_indices = map_helpers.prompt_maps(map_folder, "merge", tgm)
print("\nMerging these maps:")
- for i in valid_indices:
- print(str(list_of_files[i])[len(map_folder):])
+ for i in maps.indices:
+ print(str(maps.files[i])[len(map_folder):])
+
merge = input("\nPress Enter to merge...\n")
if merge == "abort":
print("\nAborted map merge.")
diff --git a/tools/tgstation-server/Fix Errors.bat b/tools/tgstation-server/Fix Errors.bat
deleted file mode 100644
index bbe540c82c..0000000000
--- a/tools/tgstation-server/Fix Errors.bat
+++ /dev/null
@@ -1,24 +0,0 @@
-@echo off
-title Automated Error Fixer.
-echo This will reset some things, the byond server (DreamDaemon) and the start server script must not be running. Some error messages are normal.
-echo You will be prompted to press any key 3 times
-pause
-pause
-pause
-cls
-echo Resetting folders
-mkdir gamecode\a
-mkdir gamecode\b
-del /S /F /Q gamefolder >nul 2>nul
-rmdir /S /q gamefolder
-mklink /d gamefolder gamecode\a
-call bin\findab.bat
-cls
-echo Re-Initializing code
-call bin\copyfromgit.bat
-cls
-echo Recompiling the game. If you plan to update or testmerge you can just close this program now and continue.
-call bin\build.bat
-cls
-echo Done! (hopefully)
-pause
\ No newline at end of file
diff --git a/tools/tgstation-server/OnServerBoot.bat b/tools/tgstation-server/OnServerBoot.bat
deleted file mode 100644
index db1f5cc230..0000000000
--- a/tools/tgstation-server/OnServerBoot.bat
+++ /dev/null
@@ -1,47 +0,0 @@
-@echo off
-title Server Boot Detected.
-echo This script is only meant to start byond when the server first boots, do not manually run this.
-echo If you manually ran this, close this window NOW.
-timeout 15
-start cmd /c "Start Bot.bat"
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Prepping code
-mkdir gamecode\a
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Prepping code
-mkdir gamecode\b
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Prepping code
-del /S /F /Q gamefolder >nul 2>nul
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Prepping code
-rmdir /S /q gamefolder
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Prepping code
-mklink /d gamefolder gamecode\a
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Prepping code
-call bin\findab.bat
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Re-Initializing code
-call bin\copyfromgit.bat
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Re-Initializing code
-cls
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Compiling the game. If you plan to update or testmerge you can just close this program now and continue.
-call bin\build.bat
-cls
-echo Server boot detected. Starting byond and Space Station 13.
-echo Starting server and bot.
-start cmd /c "Start Server.bat"
-timeout 10
\ No newline at end of file
diff --git a/tools/tgstation-server/README.md b/tools/tgstation-server/README.md
deleted file mode 100644
index 10831fd461..0000000000
--- a/tools/tgstation-server/README.md
+++ /dev/null
@@ -1,111 +0,0 @@
-# Tgstation Toolkit:
-This is a toolset to manage a production server of /tg/Station13 (and its forks). It includes an update script that is able to update the server without having to stop or shutdown the server (the update will take effect next round) and a script to start the server and restart it if it crashes (optional, requires registry tweaks to disable the Windows crash dialog system wide) as well as systems for fixing errors and merging GitHub Pull Requests locally.
-
-Generally, updates force a live tracking of the configured git repo, resetting local modifications. If you plan to make modifications, set up a new git repo to store your version of the code in, and point this script to that in the config (explained below). This can be on github or a local repo using file:/// urls.
-
-These tools require UAC to be disabled. (There has been limited luck getting it to work under UAC on windows 10 using run as admin, but in other versions of windows, running as admin resets the current directory and this breaks things)
-(Note: There is no security risk to disabling UAC because UAC is not a security boundary, there exists active unpatched exploits against it that have been around since vista and work up to windows 10)
-
-## Install:
-1. Move this folder to where you want your server to run from (you may also rename this folder if you wish)
-1. Right click on `config.bat` and select `Edit`.
-1. Configure the port, git repo, and other setting, You may configure the location of git, but if you installed using git for windows, we will auto detect it if its not in path.
-1. You may also need to change the location of the git repo url, and if you renamed your `dme`/"dream maker environment" file, you will need to change the project name configuration setting to be the name of your dme minus the extension (eg: if you renamed `tgstation.dme` to `ntstation.dme`, project name should be set to `ntstation`
-1. Finally, run install.bat and hope for no error.
- * It will clone the git repo, setup some folders, and add cross reference links everywhere.
-
-### Optional:
-If you plan to use the `Start Server.bat` script to start the server and restart it if it crashes, you need to run the `disable crash dialog.reg` registry script to disable the "program.exe has stopped working" dialog. This will get disabled system wide so if you rely on this dialog, you should skip this step.
-
-## Usage:
-### Folders:
-* `gamecode/`
- * This will house two copies of the game code, one for updating and one for live. When updating, it will automatically swap them.
-
-* `gamedata/`
- * This contains the `data/` and `config/` folders from the code. They are stored here and a symbolic link is created in the `gamecode/` folders pointing to here.
- * This also makes backing them up easy.
-(you may copy and paste your existing `data/` and `config/` folders here after the install script has ran.)
-
-* `bot/`
- * This is a copy of the bot folder. you should run the bot from here.a link to nudge.py is created in the code folders so that the game can use the announcement feature.
- * The start server script and update script will send messages out thru the bot, but if its not running or python is not installed, they will gracefully continue what they are doing.
-
-* `gamefolder/`
- * This is a symbolic link pointing to current "live" folder.
- * When the server is updated, we just point this to the updating folder so that the update takes place next round.
-
-* `gitrepo/`
- * This contains the actual git repository, all changes in here will be overwritten during update operations, the configured branch will always be forced to track from live.
- * On the first update of the day, the current code state is saved to a branch called `backup-YYYY-MM-DD` before updating, to make local reverts easy.
- * Following update operations on the same day do not make branches because I was too lazy to detect such edge cases.
-
-* `bin/`
- * This contains random helper batch files.
- * Running these on their own is a bad idea.
-
-### Starting the game server:
-To run the game server, Run `Start Server.bat`
-
-It will restart the game server if it shutdowns for any reason, with delays if the game server had recently been (re)started.
-
-
-### Updating the server:
-To update the server, just run `Update Server.bat`. (it will git pull, compile, all that jazz)
-
-(Note: Updating automatically does a code reset, clearing ALL changes to the local git repo, including test merges (explained below) and manual changes (This will not change any configs/settings or clear any data in the `gamedata/` folder))
-
-Updates do not require the server to be shutdown, changes will apply next round if the server is currently running.
-
-Updates create a branch with the current state of the repo called `backup-YYYY-MM-DD` (only one is created in any given day)
-
-There is also a `Update without resetting.bat` file that does the same without resetting the code, used to update without clearing test merges or local changes. Prone to merge conflicts.
-
-
-### Locally merge GitHub Pull Requests (PR test merge):
-This feature currently only works if github is the remote(git server), it could be adapted for gitlab as well.
-
-Running these will merge the pull request then recompile the server, changes take effect the next round if the server is currently running.
-
-There are multiple flavors:
-* `Update To PR.bat`
- * Updates the server, resetting state, and merges a PR(Pull Request) by number.
-* `Merge PR Without Updating.bat`
- * Merges a PR without updating the server before hand or resetting the state (can be used to test merge multiple PRs).
-
-You can clear all active test merges using `Reset and Recompile.bat` (explained below)
-
-### Resetting, Recompiling, and troubleshooting.
-* `Recompile.bat`
- * Just recompiles the game code and stages it to apply next round
-* `Reset and Recompile.bat`
- * Like the above but resets the git repo to the state of the last update operation (clearing any changes or test merges) (Does not reset `gamedata/` data/settings)
- * Generally used to clear out test merges
-* `Fix Errors.bat`
- * Requires the server not be running, rebuilds the staging A/B folders and then does all of the above. (Used to fix errors that can prevent the server from starting or cause it to crash on reboot)
-
-### Using the bot
-1. Install python 3
-1. Edit the config in `bot/` as needed
-1. Start the bot using the `Start Bot.bat` file
-
-
-### Starting everything when the computer/server boots
-1. Use autologin to set it up so the user account logs in at boot
- * (There are some security implications with doing this, this is only a tiny bit more secure then putting a file on the hard drive with the server's remote login password titled `totally not a password.txt`)
- * https://technet.microsoft.com/en-us/sysinternals/bb963905
-1. Setup something to run OnServerBoot.bat on login (setting up a link/shortcut to this file in the startup folder of the start menu works, creating a scheduled task in windows administrative tools also works)
-1. OnServerBoot.bat does not update, but it does re-compile and reinitialize the A/B folders.
-
-### Updating byond after this is all setup
-1. Download installer from byond website
-1. Close watch dog/start server script
-1. Wait for current round to end
-1. Exit DreamDeamon
-1. Run installer
-1. After installing, run recompile.bat (or update if you want)
-1. Run start server.bat
-
-
-
-
diff --git a/tools/tgstation-server/Recompile.bat b/tools/tgstation-server/Recompile.bat
deleted file mode 100644
index 40b746365e..0000000000
--- a/tools/tgstation-server/Recompile.bat
+++ /dev/null
@@ -1,51 +0,0 @@
-@echo off
-@title Server Updater
-set HOME = %USERPROFILE%
-
-call config.bat
-call bin\getcurdate.bat
-
-echo This will handle recompiling the server, and applying the new version.
-echo ready?
-
-timeout 120
-
-if exist updating.lk (
- echo ERROR: A current update script has been detected running. if you know this is a mistake:
- pause
- echo Please be double sure that an update script is not currently running, if you think one might be, close this window. otherwise:
- pause
-)
-
-echo lock>updating.lk
-
-rem if the first arg to nudge.py is not a channel, it is treated as the "source"
-if not defined UPDATE_LOG_CHANNEL set UPDATE_LOG_CHANNEL="UPDATER"
-
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Recompile job started" >nul 2>nul
-
-call bin\findab.bat
-
-call bin\copyfromgit.bat
-
-echo compiling change log
-cd gamecode\%AB%
-call python tools\ss13_genchangelog.py html/changelog.html html/changelogs
-cd ..\..
-
-echo Compiling game.
-call bin\build.bat
-if %DM_EXIT% neq 0 (
- echo DM compile failed. Aborting.
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "DM compile failed Aborting recompile." >nul 2>nul
- del /F /Q updating.lk >nul 2>nul
- pause
- exit /b 1
-)
-
-del updating.lk >nul 2>nul
-rmdir /q gamefolder
-mklink /d gamefolder gamecode\%AB% >nul
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Recompile finished. Recompiled code will take place next round." >nul 2>nul
-echo Done. The recompile will automatically take place at round restart.
-timeout 300
\ No newline at end of file
diff --git a/tools/tgstation-server/Reset and Recompile.bat b/tools/tgstation-server/Reset and Recompile.bat
deleted file mode 100644
index f0127fd3ac..0000000000
--- a/tools/tgstation-server/Reset and Recompile.bat
+++ /dev/null
@@ -1,66 +0,0 @@
-@echo off
-@title Server Updater
-set HOME = %USERPROFILE%
-
-call config.bat
-call bin\getcurdate.bat
-call bin\findgit.bat
-
-echo This will handle resetting the git repo, recompiling the server, and applying the new version.
-echo Ready?
-
-timeout 120
-
-if exist updating.lk (
- echo ERROR: A current update script has been detected running. if you know this is a mistake:
- pause
- echo Please be double sure that an update script is not currently running, if you think one might be, close this window. otherwise:
- pause
-)
-
-echo lock>updating.lk
-
-rem if the first arg to nudge.py is not a channel, it is treated as the "source"
-if not defined UPDATE_LOG_CHANNEL set UPDATE_LOG_CHANNEL="UPDATER"
-
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Reset local changes job started" >nul 2>nul
-
-cd gitrepo
-git reset --hard
-git clean -df
-cd ..
-echo ##################################
-echo ##################################
-echo:
-echo Resetting done, compiling in 10 seconds. If you want to preform other actions (like test merges) You can close this now and do them.
-echo:
-del updating.lk >nul 2>nul
-
-timeout 10
-
-echo lock>updating.lk
-call bin\findab.bat
-
-call bin\copyfromgit.bat
-
-echo compiling change log
-cd gamecode\%AB%
-call python tools\ss13_genchangelog.py html/changelog.html html/changelogs
-cd ..\..
-
-echo Compiling game.
-call bin\build.bat
-if %DM_EXIT% neq 0 (
- echo DM compile failed. Aborting.
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "DM compile failed Aborting Reset." >nul 2>nul
- del /F /Q updating.lk >nul 2>nul
- pause
- exit /b 1
-)
-
-del updating.lk >nul 2>nul
-rmdir /q gamefolder
-mklink /d gamefolder gamecode\%AB% >nul
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Reset finished. Reset will take place next round." >nul 2>nul
-echo Done. The Reset will automatically take place at round restart.
-timeout 300
diff --git a/tools/tgstation-server/Start Bot.bat b/tools/tgstation-server/Start Bot.bat
deleted file mode 100644
index a3b1cba0d8..0000000000
--- a/tools/tgstation-server/Start Bot.bat
+++ /dev/null
@@ -1,19 +0,0 @@
-@echo off
-@title NT IRC BOT
-echo Welcome to the start bot script, This will start the bot and make sure it stays running. This assumes python in the path. To continue, press any key or wait 15 seconds.
-timeout 15
-cd bot
-:START
-call ..\bin\getcurdate.bat
-if not exist ..\gamedata\data\logs\bot mkdir ..\gamedata\data\logs\bot\
-cls
-echo NT IRC Bot
-echo Bot Running. Watching for Bot exits.
-start /WAIT python minibot.py ^>^>..\gamedata\data\logs\bot\bot-%CUR_DATE%.txt
-cls
-echo NT IRC Bot
-echo Bot exit detected. Restarting in 15 minutes.
-REM this is so long because we want to avoid the bot spamming the server and getting klined/glined/or akilled
-timeout 900
-
-goto :START
diff --git a/tools/tgstation-server/Start Server.bat b/tools/tgstation-server/Start Server.bat
deleted file mode 100644
index 0312a22a5c..0000000000
--- a/tools/tgstation-server/Start Server.bat
+++ /dev/null
@@ -1,39 +0,0 @@
-@echo off
-@title SERVER WATCHDOG
-call config.bat
-call bin\findbyond.bat
-
-echo Welcome to the start server watch dog script, This will start the server and make sure it stays running. To continue, press any key or wait 30 seconds.
-timeout 30
-
-if not exist gamedata\data\logs\runtimes mkdir gamedata\data\logs\runtimes\
-
-@call python bot\nudge.py "WATCHDOG" "Watch Dog online. Starting server" >nul 2>nul
-:START
-
-call bin\getcurdate.bat
-
-call bin\getunixtime.bat UNIXTIME
-
-echo %UNIXTIME%
-
-set STARTTIME=%UNIXTIME%
-
-cls
-echo Watch Dog.
-echo Server Running. Watching for server exits.
-start /WAIT /ABOVENORMAL "" dreamdaemon.exe gamefolder\%PROJECTNAME%.dmb -port %PORT% -trusted -close -public -verbose
-cls
-
-call bin\getunixtime.bat UNIXTIME
-
-SET /A Result=%UNIXTIME% - %STARTTIME%
-SET /A Result=180 - (%Result%/3)
-if %Result% LSS 0 set /A Result=0
-
-echo Watch Dog.
-echo Server exit detected. Restarting in %Result% seconds.
-@python bot\nudge.py "WATCHDOG" "Server exit detected. Restarting server in %Result% seconds." >nul 2>nul
-timeout %Result%
-
-goto :START
diff --git a/tools/tgstation-server/Update Server.bat b/tools/tgstation-server/Update Server.bat
deleted file mode 100644
index 1d7d8644af..0000000000
--- a/tools/tgstation-server/Update Server.bat
+++ /dev/null
@@ -1,99 +0,0 @@
-@echo off
-title Server Updater
-SETLOCAL ENABLEDELAYEDEXPANSION
-set HOME = %USERPROFILE%
-
-call config.bat
-call bin\getcurdate.bat
-
-echo This will handle downloading git, compiling the server, and applying the update.
-echo Ready?
-
-timeout 120
-
-if exist updating.lk (
- echo ERROR: A current update script has been detected running. if you know this is a mistake:
- pause
- echo Please be double sure that an update script is not currently running, if you think one might be, close this window. otherwise:
- pause
-)
-
-if exist prtestjob.lk (
- call bin/activepr.bat
- echo WARNING: The server is currently testing the following PRs !PR!. This update would override that. Do you still want to update? Close this window if not, otherwise:
- pause
-)
-
-del /F /Q prtestjob.lk >nul 2>nul
-
-echo lock>updating.lk
- bin/activepr.bat
-
-rem if the first arg to nudge.py is not a channel, it is treated as the "source"
-if not defined UPDATE_LOG_CHANNEL set UPDATE_LOG_CHANNEL="UPDATER"
-
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Update job started" >nul 2>nul
-
-call bin\updategit.bat
-if %GIT_EXIT% neq 0 (
- echo git pull failed. Aborting update
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Git fetch failed. Aborting update"
- del updating.lk >nul 2>nul
- pause
- exit /b 1
-)
-
-if defined PUSHCHANGELOGTOGIT (
- cd gitrepo
- echo compiling change log
- python tools\ss13_genchangelog.py html/changelog.html html/changelogs
- if !ERRORLEVEL! == 0 (
- echo pushing compiled changelog to server
- git add -u html/changelog.html
- git add -u html/changelogs
- git commit -m "Automatic changelog compile, [ci skip]"
- if !ERRORLEVEL! == 0 (
- git push
- )
- REM an error here generally means there was nothing to commit.
- )
- cd ..
-)
-
-echo ##################################
-echo ##################################
-echo:
-echo Updating done, compiling in 10 seconds. If you want to preform other actions (like test merge) You can close this now and do them.
-echo:
-del updating.lk >nul 2>nul
-
-timeout 10
-
-echo lock>updating.lk
-call bin\findab.bat
-
-call bin\copyfromgit.bat
-
-if not defined PUSHCHANGELOGTOGIT (
- echo compiling change log
- cd gamecode\%AB%
- call python tools\ss13_genchangelog.py html/changelog.html html/changelogs
- cd ..\..
-)
-
-echo Compiling game.
-call bin\build.bat
-if %DM_EXIT% neq 0 (
- echo DM compile failed. Aborting.
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "DM compile failed Aborting update." >nul 2>nul
- del /F /Q updating.lk >nul 2>nul
- pause
- exit /b 1
-)
-
-del updating.lk >nul 2>nul
-rmdir /q gamefolder
-mklink /d gamefolder gamecode\%AB% >nul
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Update job finished. Update will take place next round." >nul 2>nul
-echo Done. The update will automatically take place at round restart.
-timeout 300
\ No newline at end of file
diff --git a/tools/tgstation-server/Update without resetting.bat b/tools/tgstation-server/Update without resetting.bat
deleted file mode 100644
index 9a08573fb1..0000000000
--- a/tools/tgstation-server/Update without resetting.bat
+++ /dev/null
@@ -1,100 +0,0 @@
-@echo off
-@title Server Updater
-SETLOCAL ENABLEDELAYEDEXPANSION
-set HOME = %USERPROFILE%
-
-call config.bat
-call bin\getcurdate.bat
-call bin\findgit.bat
-
-echo This will update the server without resetting local changes like test merges.
-echo Note: This doesn't update the changelog like a normal update does.
-echo Ready?
-
-timeout 120
-
-if exist updating.lk (
- echo ERROR: A current update script has been detected running. if you know this is a mistake:
- pause
- echo Please be double sure that an update script is not currently running, if you think one might be, close this window. otherwise:
- pause
-)
-
-echo lock>updating.lk
-
-rem if the first arg to nudge.py is not a channel, it is treated as the "source"
-if not defined UPDATE_LOG_CHANNEL set UPDATE_LOG_CHANNEL="UPDATER"
-
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Update job started (No reset mode)" >nul 2>nul
-
-cd gitrepo
-git fetch origin
-if %ERRORLEVEL% neq 0 (
- cd ..
- echo git fetch failed. Aborting update.
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Git fetch failed. Aborting update"
- del updating.lk >nul 2>nul
- pause
- exit /b 1
-)
-git merge origin/%REPO_BRANCH%
-if %ERRORLEVEL% neq 0 (
- cd ..
- echo git merge of upstream master failed, aborting update.
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "git merge of upstream master failed, aborting update." >nul 2>nul
- cd gitrepo
- git merge --abort
- if %ERRORLEVEL% neq 0 (
- echo ERROR: Error aborting update, resetting repo.
- cd ..
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Error aborting merge, Resetting git repo" >nul 2>nul
- cd gitrepo
- git reset --hard
- git clean -fd
- bin/activepr.bat
- del /F /Q prtestjob.lk >nul 2>nul
- echo NOTICE: We had to reset the repo's state, all active test merges were undone.
- )
- cd ..
- del updating.lk >nul 2>nul
- pause
- exit /b 1
-)
-cd ..
-
-
-echo ##################################
-echo ##################################
-echo:
-echo In place update done, compiling in 10 seconds. If you want to preform other actions (like more test merges) You can close this now and do them.
-echo:
-del updating.lk >nul 2>nul
-
-timeout 10
-
-echo lock>updating.lk
-call bin\findab.bat
-
-call bin\copyfromgit.bat
-
-echo compiling change log
-cd gamecode\%AB%
-call python tools\ss13_genchangelog.py html/changelog.html html/changelogs
-cd ..\..
-
-echo Compiling game.
-call bin\build.bat
-if %DM_EXIT% neq 0 (
- echo DM compile failed. Aborting.
- call python bot\nudge.py %UPDATE_LOG_CHANNEL% "DM compile failed Aborting update." >nul 2>nul
- del /F /Q updating.lk >nul 2>nul
- pause
- exit /b 1
-)
-
-del updating.lk >nul 2>nul
-rmdir /q gamefolder
-mklink /d gamefolder gamecode\%AB% >nul
-call python bot\nudge.py %UPDATE_LOG_CHANNEL% "Update job finished. Update will take place next round." >nul 2>nul
-echo Done. The update will automatically take place at round restart.
-timeout 300
diff --git a/tools/tgstation-server/bin/activepr.bat b/tools/tgstation-server/bin/activepr.bat
deleted file mode 100644
index 554142925d..0000000000
--- a/tools/tgstation-server/bin/activepr.bat
+++ /dev/null
@@ -1 +0,0 @@
-set PR=
\ No newline at end of file
diff --git a/tools/tgstation-server/bin/build.bat b/tools/tgstation-server/bin/build.bat
deleted file mode 100644
index 049154ce92..0000000000
--- a/tools/tgstation-server/bin/build.bat
+++ /dev/null
@@ -1,26 +0,0 @@
-call config.bat
-call bin/findbyond.bat
-set DME_FOLDER=gamefolder\
-if defined AB set DME_FOLDER=gamecode\%AB%\
-
-set DME_LOCATION=%DME_FOLDER%%PROJECTNAME%.dme
-set MDME_LOCATION=%DME_FOLDER%%PROJECTNAME%.mdme
-
-@del %MDME_LOCATION% >nul 2>nul
-if defined MAPROTATE set MAPFILE=%MAPROTATE%
-if not defined MAPFILE goto BUILD
-
-echo #define MAP_OVERRIDE >>%MDME_LOCATION%
-echo #include "_maps\%MAPFILE%.dm" >>%MDME_LOCATION%
-
-:BUILD
-echo #define SERVERTOOLS 1 >>%MDME_LOCATION%
-echo #define PUTONHUB 1 >>%MDME_LOCATION%
-type %DME_LOCATION% >>%MDME_LOCATION%
-
-dm -clean %MDME_LOCATION%
-set DM_EXIT=%ERRORLEVEL%
-@del %DME_FOLDER%%PROJECTNAME%.dmb >nul 2>nul
-@del %DME_FOLDER%%PROJECTNAME%.rsc >nul 2>nul
-@move %DME_FOLDER%%PROJECTNAME%.mdme.dmb %DME_FOLDER%%PROJECTNAME%.dmb >nul 2>nul
-@move %DME_FOLDER%%PROJECTNAME%.mdme.rsc %DME_FOLDER%%PROJECTNAME%.rsc >nul 2>nul
diff --git a/tools/tgstation-server/bin/copyfromgit.bat b/tools/tgstation-server/bin/copyfromgit.bat
deleted file mode 100644
index 4de01db772..0000000000
--- a/tools/tgstation-server/bin/copyfromgit.bat
+++ /dev/null
@@ -1,20 +0,0 @@
-echo Removing old files
-rem delete the symlinks manually to ensure their targets don't get recursively deleted
-rmdir /q gamecode\%AB%\data >nul 2>nul
-rmdir /q gamecode\%AB%\config >nul 2>nul
-del /q gamecode\%AB%\nudge.py >nul 2>nul
-del /q gamecode\%AB%\libmysql.dll >nul 2>nul
-
-del /S /F /Q gamecode\%AB%\ >nul 2>nul
-
-echo Copying files
-xcopy gitrepo gamecode\%AB% /Y /X /K /R /H /I /C /V /E /Q /EXCLUDE:copyexclude.txt >nul
-mkdir gamecode\%AB%\.git\logs
-copy gitrepo\.git\logs\HEAD gamecode\%AB%\.git\logs\HEAD /D /V /Y >nul
-
-mklink gamecode\%AB%\nudge.py ..\..\bot\nudge.py >nul
-rmdir /q gamecode\%AB%\data >nul 2>nul
-rmdir /s /q gamecode\%AB%\data >nul 2>nul
-mklink /d gamecode\%AB%\data ..\..\gamedata\data >nul
-mklink /d gamecode\%AB%\config ..\..\gamedata\config >nul
-mklink gamecode\%AB%\libmysql.dll ..\..\gamedata\libmysql.dll >nul
diff --git a/tools/tgstation-server/bin/findab.bat b/tools/tgstation-server/bin/findab.bat
deleted file mode 100644
index 0c24a7571b..0000000000
--- a/tools/tgstation-server/bin/findab.bat
+++ /dev/null
@@ -1,45 +0,0 @@
-del gamecode\a\updater.temp >nul 2>nul
-del gamecode\b\updater.temp >nul 2>nul
-
-echo test >gamefolder\updater.temp
-
-if exist gamefolder\%PROJECTNAME%.rsc.lk (
- rem we attempt to delete the lock file to see if the server is currently running.
- del /q gamefolder\%PROJECTNAME%.rsc.lk >nul 2>nul
- if exist gamefolder\%PROJECTNAME%.rsc.lk set RUNNING=1
-)
-
-if exist gamecode\a\updater.temp (
- if defined RUNNING (
- echo Current folder detected to be the "A" folder. Game is currently running. Updating to the "B" folder.
- set AB=b
- ) else (
- echo Current folder detected to be the "A" folder. Game is not currently running, Updating to the "A" folder.
- if exist gamecode\b\%PROJECTNAME%.rsc.lk (
- rem we attempt to delete the lock file to see if the server is currently running.
- del /q gamecode\b\%PROJECTNAME%.rsc.lk >nul 2>nul
- if exist gamecode\b\%PROJECTNAME%.rsc.lk set RUNNING=1
- rmdir /q gamefolder
- mklink /d gamefolder gamecode\b >nul
- echo Game is in actually currently running on the "B" folder, Resetting current folder to the "B" folder first
- )
- set AB=a
- )
-) else if exist gamecode\b\updater.temp (
- if defined RUNNING (
- echo Current folder detected to be the "B" folder. Game is currently running, Updating to the "A" folder.
- set AB=a
- ) else (
- echo Current folder detected to be the "B" folder. Game is not currently running, Updating to the "B" folder.
- if exist gamecode\a\%PROJECTNAME%.rsc.lk (
- rem we attempt to delete the lock file to see if the server is currently running.
- del /q gamecode\a\%PROJECTNAME%.rsc.lk >nul 2>nul
- if exist gamecode\a\%PROJECTNAME%.rsc.lk set RUNNING=1
- rmdir /q gamefolder
- mklink /d gamefolder gamecode\a >nul
- echo Game is in actually currently running on the "A" folder, Resetting current folder to the "A" folder first
- )
- set AB=b
- )
-)
-del gamefolder\updater.temp >nul 2>nul
\ No newline at end of file
diff --git a/tools/tgstation-server/bin/findbyond.bat b/tools/tgstation-server/bin/findbyond.bat
deleted file mode 100644
index ff07af2dd6..0000000000
--- a/tools/tgstation-server/bin/findbyond.bat
+++ /dev/null
@@ -1,26 +0,0 @@
-
-@dm.exe -h >nul 2>nul
-IF %ERRORLEVEL% NEQ 9009 (
- goto :eof
-)
-
-set PATH=%PATH%;%BYOND_LOCATION_PATH%
-@dm.exe -h >nul 2>nul
-IF %ERRORLEVEL% NEQ 9009 (
- goto :eof
-)
-
-@"c:\Program Files (x86)\BYOND\bin\dm.exe" -h >nul 2>nul
-IF %ERRORLEVEL% NEQ 9009 (
- set "PATH=%PATH%;c:\Program Files (x86)\BYOND\bin\"
- goto :eof
-)
-@"c:\Program Files\BYOND\bin\dm.exe" -h >nul 2>nul
-IF %ERRORLEVEL% NEQ 9009 (
- set "PATH=%PATH%;c:\Program Files\BYOND\bin\"
- goto :eof
-)
-
-echo byond not found. Aborting. If byond is installed, set the GIT_LOCATION variable inside config.bat
-timeout 60
-exit 11
\ No newline at end of file
diff --git a/tools/tgstation-server/bin/findgit.bat b/tools/tgstation-server/bin/findgit.bat
deleted file mode 100644
index 9c802b54c6..0000000000
--- a/tools/tgstation-server/bin/findgit.bat
+++ /dev/null
@@ -1,31 +0,0 @@
-REM check if git is already in path
-git --version >nul 2>nul && goto :eof
-
-REM now lets try our override.
-set PATH=%PATH%;%GIT_LOCATION_PATH%
-@git --version >nul 2>nul && goto :eof
-
-REM credit to sschuberth@http://stackoverflow.com/questions/8507368/finding-the-path-where-git-is-installed-on-a-windows-system
-REM Read the Git for Windows installation path from the Registry.
-
-:REG_QUERY
-for /f "skip=2 delims=: tokens=1*" %%a in ('reg query "HKLM\SOFTWARE%WOW%\Microsoft\Windows\CurrentVersion\Uninstall\Git_is1" /v InstallLocation 2^> nul') do (
- for /f "tokens=3" %%z in ("%%a") do (
- set GIT=%%z:%%b
- )
-)
-if "%GIT%"=="" (
- if "%WOW%"=="" (
- rem Attempt to find it on the 32bit register section
- set WOW=\Wow6432Node
- goto REG_QUERY
- )
-)
-
-set PATH=%GIT%bin;%PATH%
-
-@git --version >nul 2>nul && goto :eof
-
-echo Git not found. Aborting. If git is installed, set the GIT_LOCATION variable inside config.bat
-timeout 60
-exit 10
\ No newline at end of file
diff --git a/tools/tgstation-server/bin/getcurdate.bat b/tools/tgstation-server/bin/getcurdate.bat
deleted file mode 100644
index f5360756ce..0000000000
--- a/tools/tgstation-server/bin/getcurdate.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-FOR /f %%a in ('WMIC OS GET LocalDateTime ^| find "."') DO set DTS=%%a
-set CUR_DATE=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%
\ No newline at end of file
diff --git a/tools/tgstation-server/bin/getunixtime.bat b/tools/tgstation-server/bin/getunixtime.bat
deleted file mode 100644
index 2b4115faab..0000000000
--- a/tools/tgstation-server/bin/getunixtime.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-REM setlocal
-call :GetUnixTime UNIXTIME
-goto :EOF
-
-:GetUnixTime
-REM setlocal enableextensions
-for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do (
- set %%x)
-set /a z=(14-100%Month%%%100)/12, y=10000%Year%%%10000-z
-set /a ut=y*365+y/4-y/100+y/400+(153*(100%Month%%%100+12*z-3)+2)/5+Day-719469
-set /a ut=ut*86400+100%Hour%%%100*3600+100%Minute%%%100*60+100%Second%%%100
-endlocal & set "%1=%ut%" & goto :EOF
\ No newline at end of file
diff --git a/tools/tgstation-server/bin/unixtime.vbs b/tools/tgstation-server/bin/unixtime.vbs
deleted file mode 100644
index f5e1ae78f0..0000000000
--- a/tools/tgstation-server/bin/unixtime.vbs
+++ /dev/null
@@ -1 +0,0 @@
-WScript.Echo DateDiff("s", "01/01/1970 00:00:00", Now())
\ No newline at end of file
diff --git a/tools/tgstation-server/bin/updategit.bat b/tools/tgstation-server/bin/updategit.bat
deleted file mode 100644
index e16cfc3922..0000000000
--- a/tools/tgstation-server/bin/updategit.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-call bin\findgit.bat
-echo Updating repo
-
-cd gitrepo
-
-git branch backup-%CUR_DATE% >nul 2>nul
-git fetch
-set GIT_EXIT=%ERRORLEVEL%
-
-git reset origin/%REPO_BRANCH% --hard
-
-cd ..
\ No newline at end of file
diff --git a/tools/tgstation-server/config.bat b/tools/tgstation-server/config.bat
deleted file mode 100644
index eb3ecd13e7..0000000000
--- a/tools/tgstation-server/config.bat
+++ /dev/null
@@ -1,42 +0,0 @@
-@echo off
-REM Server Tools configuration file. Lines starting with rem are comments and ignored.
-
-REM This must be set to the name of your dme without the .dme part. (should be fine leaving this alone unless you renamed the code)
-set PROJECTNAME=tgstation
-
-
-REM location of the repo. (use an ssh url if you plan to push compiled changlogs)
-REM Only set during install, do not re-run install.bat if you change this, instead manually change the remote of the gitrepo folder using git tools
-set REPO_URL=https://github.com/tgstation/-tg-station.git
-
-
-REM What branch of the repo to use.
-set REPO_BRANCH=master
-
-
-REM Override Map (This disables map roation and forces the selected map to always be loaded)
-REM set MAPFILE=tgstation2
-REM set MAPFILE=metastation
-
-
-REM port to use when starting the server
-set PORT=2337
-
-
-REM This is the channel to log updates to. Leave blank to log to the bot's default logging channel (this is done via the tgstation minibot bot, optional)
-set UPDATE_LOG_CHANNEL=#devbus,#coderbus,#tgstation13
-
-
-REM Attempt to push the compiled changelog to the configured git server? (set to anything)
-REM This requires you configure git with authentication for the upstream server. (git for windows users should just put an ssh key in c:\users\USERNAME_HERE\.ssh\ as the filename id_rsa) And you should have installed this with a git, ssh, or file url)
-set PUSHCHANGELOGTOGIT=
-
-
-REM location of git. The script will attempt to auto detect this, but if it fails, you can set it manually.
-REM github for windows users see http://www.chambaud.com/2013/07/08/adding-git-to-path-when-using-github-for-windows/ (an example is provided below)
-
-set GIT_LOCATION_PATH=
-REM set GIT_LOCATION_PATH=C:\Users\Administrator\AppData\Local\GitHub\PortableGit_c2ba306e536fdf878271f7fe636a147ff37326ad\bin;C:\Users\Administrator\AppData\Local\GitHub\PortableGit_c2ba306e536fdf878271f7fe636a147ff37326ad\cmd
-
-REM path to the byond bin folder. (same rules as git path above, almost always auto detected, but you could point this to the output of the zip version for install-less setups, and even abuse that to make updating byond versions less of a pain by just changing this config and then crashing the server.)
-set BYOND_LOCATION_PATH=
diff --git a/tools/tgstation-server/copyexclude.txt b/tools/tgstation-server/copyexclude.txt
deleted file mode 100644
index 3cf4643303..0000000000
--- a/tools/tgstation-server/copyexclude.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-//This is a list of files to exclude from copying. See xcopy's documentation for /exclude for more info.
-//
-
-gitrepo\config\
-gitrepo\data\
-gitrepo\bot\
-gitrepo\.git\
-gitrepo\libmysql.dll
-
diff --git a/tools/tgstation-server/disable crash dialog.reg b/tools/tgstation-server/disable crash dialog.reg
deleted file mode 100644
index d1c477a445..0000000000
--- a/tools/tgstation-server/disable crash dialog.reg
+++ /dev/null
@@ -1,4 +0,0 @@
-Windows Registry Editor Version 5.00
-
-[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
-"DontShowUI"=dword:00000001
diff --git a/tools/tgstation-server/install.bat b/tools/tgstation-server/install.bat
deleted file mode 100644
index f37908966a..0000000000
--- a/tools/tgstation-server/install.bat
+++ /dev/null
@@ -1,81 +0,0 @@
-@echo off
-@title Server Tools Installer.
-set HOME = %USERPROFILE%
-call config.bat
-
-echo This will download the game code from git and install the all the files and folders and symbolic links needed to use the server tools in to the current directory.
-
-echo This requires git be installed.
-
-echo Once this is done, you can safely delete this file if you wish.
-
-echo Ready?
-pause
-
-call bin/findgit.bat
-
-echo Downloading repo....
-git clone %REPO_URL% gitrepo
-IF %ERRORLEVEL% NEQ 0 (
- echo git clone failed. aborting.
- pause
- goto ABORT
-)
-cd gitrepo
-git checkout %REPO_BRANCH%
-cd ..
-
-echo Repo downloaded.
-echo Setting up folders...
-mkdir gamecode\a
-mkdir gamecode\b
-mkdir gamedata
-mkdir bot
-
-echo Copying things around....
-echo (1/3)
-xcopy gitrepo\data gamedata\data /Y /X /K /R /H /I /C /V /E /Q >nul
-xcopy gitrepo\config gamedata\config /Y /X /K /R /H /I /C /V /E /Q >nul
-xcopy gitrepo\bot bot /Y /X /K /R /H /I /C /V /E /Q >nul
-copy gitrepo\libmysql.dll gamedata\libmysql.dll /D /V /Y >nul
-echo (2/3)
-xcopy gitrepo gamecode\a /Y /X /K /R /H /I /C /V /E /Q /EXCLUDE:copyexclude.txt >nul
-mkdir gamecode\a\.git\logs\
-copy gitrepo\.git\logs\HEAD gamecode\a\.git\logs\HEAD /D /V /Y >nul
-echo (3/3)
-xcopy gitrepo gamecode\b /Y /X /K /R /H /I /C /V /E /Q /EXCLUDE:copyexclude.txt >nul
-mkdir gamecode\b\.git\logs >nul
-copy gitrepo\.git\logs\HEAD gamecode\b\.git\logs\HEAD /D /V /Y >nul
-echo done.
-
-echo Setting up symbolic links.
-mklink gamecode\a\nudge.py ..\..\bot\nudge.py
-mklink gamecode\a\libmysql.dll ..\..\gamedata\libmysql.dll
-mklink /d gamecode\a\data ..\..\gamedata\data
-mklink /d gamecode\a\config ..\..\gamedata\config
-
-mklink gamecode\b\nudge.py ..\..\bot\nudge.py
-mklink gamecode\b\libmysql.dll ..\..\gamedata\libmysql.dll
-mklink /d gamecode\b\data ..\..\gamedata\data
-mklink /d gamecode\b\config ..\..\gamedata\config
-
-mklink /d gamefolder gamecode\a
-
-echo prepping python (if installed)
-pip install PyYaml
-pip install beautifulsoup4
-
-echo Compiling for the first time.
-
-echo Compiling change log.
-cd gamefolder
-call python tools\ss13_genchangelog.py html/changelog.html html/changelogs
-cd ..
-echo Compiling game.
-call bin\build.bat
-if %DM_EXIT% neq 0 echo DM compile failed.
-
-echo Done. You may start the server using the start server program or change the game config in gamedata\config
-pause
-
-:ABORT