diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt
index 85afa5fa07d..11cb5b4e3aa 100644
--- a/SQL/database_changelog.txt
+++ b/SQL/database_changelog.txt
@@ -1,3 +1,13 @@
+19 August 2016, by Shadowlight213
+
+Changed appearance bans to be jobbans.
+
+UPDATE 'feedback'.`ban` SET `job` = "appearance", `bantype` = "JOB_PERMABAN" WHERE `bantype` = "APPEARANCE_PERMABAN"
+
+Remember to add a prefix to the table name if you use them
+
+----------------------------------------------------
+
3 July 2016, by Jordie0608
Modified table 'poll_question', adding column 'dontshow' which was recently added to the server schema.
diff --git a/_maps/map_files/generic/chapel.dmm b/_maps/map_files/generic/chapel.dmm
deleted file mode 100644
index 6bf7cb9bd63..00000000000
--- a/_maps/map_files/generic/chapel.dmm
+++ /dev/null
@@ -1,348 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"aa" = (
-/turf/open/space,
-/area/space)
-"ab" = (
-/turf/closed/indestructible/riveted,
-/area/hades)
-"ac" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ad" = (
-/obj/structure/piano,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ae" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"af" = (
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ag" = (
-/obj/structure/window/fulltile,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ah" = (
-/obj/structure/window/reinforced,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ai" = (
-/obj/effect/gibspawner/human,
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"aj" = (
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ak" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/window/fulltile,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"al" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/candle/infinite,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"am" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/candle/infinite,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"an" = (
-/obj/structure/table/reinforced/brass,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ao" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/candle/infinite,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ap" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/fulltile,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"aq" = (
-/turf/open/floor/carpet,
-/area/hades)
-"ar" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 1
- },
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"as" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 1
- },
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"at" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/carpet,
-/area/hades)
-"au" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/carpet,
-/area/hades)
-"av" = (
-/obj/structure/dresser,
-/turf/open/floor/carpet,
-/area/hades)
-"aw" = (
-/obj/structure/table/wood,
-/obj/item/trash/candle,
-/turf/open/floor/carpet,
-/area/hades)
-"ax" = (
-/obj/structure/flora/grass/green,
-/turf/open/floor/grass,
-/area/hades)
-"ay" = (
-/obj/structure/flora/ausbushes/ppflowers,
-/turf/open/floor/grass,
-/area/hades)
-"az" = (
-/obj/structure/flora/ausbushes/palebush,
-/turf/open/floor/grass,
-/area/hades)
-"aA" = (
-/obj/structure/flora/ausbushes/ywflowers,
-/turf/open/floor/grass,
-/area/hades)
-"aB" = (
-/obj/structure/bookcase/random/nonfiction,
-/turf/open/floor/carpet,
-/area/hades)
-"aC" = (
-/obj/structure/bookcase/random/fiction,
-/turf/open/floor/carpet,
-/area/hades)
-"aD" = (
-/obj/structure/bookcase/random/adult,
-/turf/open/floor/carpet,
-/area/hades)
-"aE" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/carpet,
-/area/hades)
-"aF" = (
-/obj/structure/kitchenspike,
-/turf/open/floor/mineral/diamond,
-/area/hades)
-"aG" = (
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/mineral/gold,
-/area/hades)
-"aH" = (
-/turf/open/floor/mineral/gold,
-/area/hades)
-"aI" = (
-/obj/structure/table/wood,
-/turf/open/floor/carpet,
-/area/hades)
-"aJ" = (
-/obj/structure/flora/ausbushes/grassybush,
-/turf/open/floor/grass,
-/area/hades)
-"aK" = (
-/obj/structure/flora/ausbushes/stalkybush,
-/turf/open/floor/grass,
-/area/hades)
-"aL" = (
-/obj/structure/flora/ausbushes/genericbush,
-/turf/open/floor/grass,
-/area/hades)
-"aM" = (
-/obj/structure/bookcase/random/reference,
-/turf/open/floor/carpet,
-/area/hades)
-"aN" = (
-/obj/structure/closet/cabinet,
-/turf/open/floor/carpet,
-/area/hades)
-"aO" = (
-/obj/structure/table/wood,
-/obj/item/weapon/paper/hades_instructions,
-/turf/open/floor/carpet,
-/area/hades)
-"aP" = (
-/obj/structure/flora/ausbushes/fernybush,
-/turf/open/floor/grass,
-/area/hades)
-"aQ" = (
-/obj/structure/bed,
-/obj/item/weapon/bedsheet/black,
-/turf/open/floor/carpet,
-/area/hades)
-"aR" = (
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/carpet,
-/area/hades)
-"aS" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/box/matches,
-/turf/open/floor/carpet,
-/area/hades)
-"aT" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/fulltile,
-/turf/open/floor/plasteel,
-/area/hades)
-"aU" = (
-/obj/machinery/door/airlock/wood,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"aV" = (
-/obj/structure/table/wood,
-/obj/item/weapon/lipstick,
-/turf/open/floor/carpet,
-/area/hades)
-"aW" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/fancy/candle_box,
-/turf/open/floor/carpet,
-/area/hades)
-"aX" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/hades)
-"aY" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/hades)
-"aZ" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/crayons,
-/turf/open/floor/carpet,
-/area/hades)
-"ba" = (
-/obj/structure/table/wood,
-/obj/item/weapon/razor,
-/turf/open/floor/carpet,
-/area/hades)
-"bb" = (
-/obj/machinery/door/airlock/wood,
-/turf/open/floor/carpet,
-/area/hades)
-"bc" = (
-/obj/structure/chair/hades,
-/turf/open/floor/mineral/diamond,
-/area/hades)
-"bd" = (
-/obj/machinery/vending/cola,
-/turf/open/floor/carpet,
-/area/hades)
-"be" = (
-/obj/machinery/vending/snack,
-/turf/open/floor/carpet,
-/area/hades)
-"bf" = (
-/obj/structure/table/wood,
-/obj/machinery/chem_dispenser/drinks/beer,
-/turf/open/floor/carpet,
-/area/hades)
-"bg" = (
-/obj/structure/table/wood,
-/obj/machinery/microwave,
-/turf/open/floor/carpet,
-/area/hades)
-"bh" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/box/donkpockets,
-/turf/open/floor/carpet,
-/area/hades)
-"bi" = (
-/obj/machinery/chem_dispenser/drinks,
-/obj/structure/table/wood,
-/turf/open/floor/carpet,
-/area/hades)
-"bj" = (
-/obj/structure/chair/wood/normal,
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/carpet,
-/area/hades)
-"bk" = (
-/obj/structure/table/wood,
-/obj/item/weapon/kitchen/fork,
-/turf/open/floor/carpet,
-/area/hades)
-"bl" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 1
- },
-/turf/open/floor/carpet,
-/area/hades)
-"bm" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/box/drinkingglasses,
-/turf/open/floor/carpet,
-/area/hades)
-
-(
-1,
-1,
-1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaabacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaabadaeafafafafaeafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaababababagahahaiafafajahahagababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabacacacakalamananananaoalapacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabaeafafafafajaqaqaqaqajafafafafaeabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafafafaeafafaqaqaqaqafafaeafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafarasasasafaqataqaqafarasasarafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafafafafafafaqaqaqaqafafafafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafasasarasafaqaqaqaqafasarasasafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafafaeafafafaqataqaqafafaeafafafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafasasasarafaqaqaqaqafasasarasafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafafafaeafafaqauaqaqafafafafaeafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabafarasasasafaqaqataqafasarasasafabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabaeafafafafafaqaqaqaqafafafafafaeabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaabababababababaqaqaqaqababababababababababababababababababababababaa
-aaaaabavavavavavabawaqaqaqabaxayazaAaxabaBaBaCaCaDaEabaFaGaHaHaHaGaFabaa
-aaaaabaqaqaqaqaqabaIaqaqaqabaJaKaLaAayabaMaqaqaqaqaMabafafafaHafafafabaa
-aaaaabaNaqaqaqaNabaOaqaqaqabaPayaJaxazabaMaqaqaqaqaCabafafafaHafafafabaa
-aaaaabaQaRaqaqaQabaSaqaqaqabaTaTaTaTaTabaEaqaRaRaqaBaUafafafaHafafafabaa
-aaaaabaVaqaqaqaOabaWaqaqaqabaXaqaqaqaYabaEaqaRaRaqaBabafafafaHafafafabaa
-aaaaabaQaqaqaqaQabaZaqaqaqabaXaqaqaqaYabaEaqaqaqaqaCabafafafaHafafafabaa
-aaaaabaIaqaqaRbaabaIaqaqaqbbaqaqaqaqaqabababbbababababaFaGaHbcaHaGaFabaa
-aaaaabaQaRaqaqaQabaqaqaqaqabaqaqaqaqaqabaEaBaqaCaBaEabafafafaHafafafabaa
-aaaaabababbbababababababababaqaqaqaqaqabaEaqaqaqaRaBabafafafaHafafafabaa
-aaaaabaqaqaqaqbdbebfbgbhbiabaXaqaqaRaYabaBaqaqaqaqaEabafafafaHafafafabaa
-aaaaabaqbjbjaqaqaqaqaqaqaqabaXaqaqaqaYabaCaqaqaqaqaMabafafafaHafafafabaa
-aaaaabaXbkaIaYaqaqaqaqaqaqbbaqaqaqaqaqbbaqaqaRaqaqaEabafafafaHafafafabaa
-aaaaabaqblblaqaqaqbmaIaIaOabaqaqaqaqaqabaMaMaBaDaCaMabaFaGaHaHaHaGaFabaa
-aaaaabababababababababababababababababababababababababababababababababaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-"}
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 66251a4f0c6..51875e9322e 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -5823,291 +5823,6 @@
dir = 8
},
/area/holodeck/rec_center/medical)
-"sh" = (
-/turf/closed/indestructible/riveted,
-/area/hades)
-"si" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sj" = (
-/obj/structure/piano,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sk" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sl" = (
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sm" = (
-/obj/structure/window/fulltile,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sn" = (
-/obj/structure/window/reinforced,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"so" = (
-/obj/effect/gibspawner/human,
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sp" = (
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sq" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/structure/window/fulltile,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sr" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/candle/infinite,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"ss" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/candle/infinite,
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"st" = (
-/obj/structure/table/reinforced/brass,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"su" = (
-/obj/structure/table/reinforced/brass,
-/obj/item/candle/infinite,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sv" = (
-/obj/structure/window/reinforced,
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/structure/window/fulltile,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sw" = (
-/turf/open/floor/carpet,
-/area/hades)
-"sx" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 1
- },
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sy" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 1
- },
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"sz" = (
-/obj/effect/gibspawner/human,
-/turf/open/floor/carpet,
-/area/hades)
-"sA" = (
-/obj/effect/landmark/event_spawn,
-/turf/open/floor/carpet,
-/area/hades)
-"sB" = (
-/obj/structure/dresser,
-/turf/open/floor/carpet,
-/area/hades)
-"sC" = (
-/obj/structure/table/wood,
-/obj/item/trash/candle,
-/turf/open/floor/carpet,
-/area/hades)
-"sD" = (
-/obj/structure/flora/grass/green,
-/turf/open/floor/grass,
-/area/hades)
-"sE" = (
-/obj/structure/flora/ausbushes/ppflowers,
-/turf/open/floor/grass,
-/area/hades)
-"sF" = (
-/obj/structure/flora/ausbushes/palebush,
-/turf/open/floor/grass,
-/area/hades)
-"sG" = (
-/obj/structure/flora/ausbushes/ywflowers,
-/turf/open/floor/grass,
-/area/hades)
-"sH" = (
-/obj/structure/bookcase/random/nonfiction,
-/turf/open/floor/carpet,
-/area/hades)
-"sI" = (
-/obj/structure/bookcase/random/fiction,
-/turf/open/floor/carpet,
-/area/hades)
-"sJ" = (
-/obj/structure/bookcase/random/adult,
-/turf/open/floor/carpet,
-/area/hades)
-"sK" = (
-/obj/structure/bookcase/random/religion,
-/turf/open/floor/carpet,
-/area/hades)
-"sL" = (
-/obj/structure/kitchenspike,
-/turf/open/floor/mineral/diamond,
-/area/hades)
-"sM" = (
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/mineral/gold,
-/area/hades)
-"sN" = (
-/turf/open/floor/mineral/gold,
-/area/hades)
-"sO" = (
-/obj/structure/table/wood,
-/turf/open/floor/carpet,
-/area/hades)
-"sP" = (
-/obj/structure/flora/ausbushes/grassybush,
-/turf/open/floor/grass,
-/area/hades)
-"sQ" = (
-/obj/structure/flora/ausbushes/stalkybush,
-/turf/open/floor/grass,
-/area/hades)
-"sR" = (
-/obj/structure/flora/ausbushes/genericbush,
-/turf/open/floor/grass,
-/area/hades)
-"sS" = (
-/obj/structure/bookcase/random/reference,
-/turf/open/floor/carpet,
-/area/hades)
-"sT" = (
-/obj/structure/closet/cabinet,
-/turf/open/floor/carpet,
-/area/hades)
-"sU" = (
-/obj/structure/table/wood,
-/obj/item/weapon/paper/hades_instructions,
-/turf/open/floor/carpet,
-/area/hades)
-"sV" = (
-/obj/structure/flora/ausbushes/fernybush,
-/turf/open/floor/grass,
-/area/hades)
-"sW" = (
-/obj/structure/bed,
-/obj/item/weapon/bedsheet/black,
-/turf/open/floor/carpet,
-/area/hades)
-"sX" = (
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/carpet,
-/area/hades)
-"sY" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/box/matches,
-/turf/open/floor/carpet,
-/area/hades)
-"sZ" = (
-/obj/structure/grille,
-/obj/structure/window/reinforced/fulltile,
-/turf/open/floor/plasteel,
-/area/hades)
-"ta" = (
-/obj/machinery/door/airlock/wood,
-/turf/open/floor/plasteel/hades,
-/area/hades)
-"tb" = (
-/obj/structure/table/wood,
-/obj/item/weapon/lipstick,
-/turf/open/floor/carpet,
-/area/hades)
-"tc" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/fancy/candle_box,
-/turf/open/floor/carpet,
-/area/hades)
-"td" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 4
- },
-/turf/open/floor/carpet,
-/area/hades)
-"te" = (
-/obj/structure/chair/wood/normal{
- icon_state = "wooden_chair";
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/hades)
-"tf" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/crayons,
-/turf/open/floor/carpet,
-/area/hades)
-"tg" = (
-/obj/structure/table/wood,
-/obj/item/weapon/razor,
-/turf/open/floor/carpet,
-/area/hades)
-"th" = (
-/obj/machinery/door/airlock/wood,
-/turf/open/floor/carpet,
-/area/hades)
-"ti" = (
-/obj/structure/chair/hades,
-/turf/open/floor/mineral/diamond,
-/area/hades)
-"tj" = (
-/obj/machinery/vending/cola,
-/turf/open/floor/carpet,
-/area/hades)
-"tk" = (
-/obj/machinery/vending/snack,
-/turf/open/floor/carpet,
-/area/hades)
-"tl" = (
-/obj/structure/table/wood,
-/obj/machinery/chem_dispenser/drinks/beer,
-/turf/open/floor/carpet,
-/area/hades)
-"tm" = (
-/obj/structure/table/wood,
-/obj/machinery/microwave,
-/turf/open/floor/carpet,
-/area/hades)
-"tn" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/box/donkpockets,
-/turf/open/floor/carpet,
-/area/hades)
-"to" = (
-/obj/machinery/chem_dispenser/drinks,
-/obj/structure/table/wood,
-/turf/open/floor/carpet,
-/area/hades)
-"tp" = (
-/obj/structure/chair/wood/normal,
-/mob/living/simple_animal/hostile/hadesacolyte,
-/turf/open/floor/carpet,
-/area/hades)
"tq" = (
/obj/structure/closet/cardboard,
/turf/open/floor/plating/airless,
@@ -6117,10 +5832,9 @@
/turf/open/floor/plating/airless,
/area/syndicate_mothership)
"ts" = (
-/obj/structure/table/wood,
-/obj/item/weapon/storage/box/drinkingglasses,
-/turf/open/floor/carpet,
-/area/hades)
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/centcom/control)
(1,1,1) = {"
ab
@@ -6607,33 +6321,33 @@ ab
ab
ab
ab
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(3,1,1) = {"
@@ -6864,33 +6578,33 @@ ab
ab
ab
ab
-sh
-si
-sk
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sk
-sh
-sB
-sw
-sT
-sW
-tb
-sW
-sO
-sW
-sh
-sw
-sw
-td
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(4,1,1) = {"
@@ -7121,33 +6835,33 @@ ab
ab
ab
ab
-sh
-si
-sl
-sl
-sx
-sl
-sy
-sl
-sy
-sl
-sx
-sl
-sh
-sB
-sw
-sw
-sX
-sw
-sw
-sw
-sX
-sh
-sw
-tp
-tq
-tr
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(5,1,1) = {"
@@ -7375,36 +7089,36 @@ ab
ab
ab
ab
-sh
-sh
-sh
-sh
-si
-sl
-sl
-sy
-sl
-sy
-sk
-sy
-sl
-sy
-sl
-sh
-sB
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-th
-sw
-tp
-sO
-tr
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(6,1,1) = {"
@@ -7632,36 +7346,36 @@ ab
ab
ab
ab
-sh
-si
-sj
-sm
-sq
-sl
-sk
-sy
-sl
-sx
-sl
-sy
-sk
-sy
-sl
-sh
-sB
-sw
-sw
-sw
-sw
-sw
-sX
-sw
-sh
-sw
-sw
-te
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(7,1,1) = {"
@@ -7889,36 +7603,36 @@ ab
ab
ab
ab
-sh
-si
-sk
-sn
-sr
-sl
-sl
-sy
-sl
-sy
-sl
-sx
-sl
-sy
-sl
-sh
-sB
-sw
-sT
-sW
-sU
-sW
-tg
-sW
-sh
-tj
-sw
-sw
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(8,1,1) = {"
@@ -8146,36 +7860,36 @@ ab
ab
ab
ab
-sh
-si
-sl
-sn
-ss
-sp
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-tk
-sw
-sw
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(9,1,1) = {"
@@ -8403,36 +8117,36 @@ ab
ab
ab
ab
-sh
-si
-sl
-so
-st
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sC
-sO
-sU
-sY
-tc
-tf
-sO
-sw
-sh
-tl
-sw
-sw
-ts
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(10,1,1) = {"
@@ -8660,36 +8374,36 @@ ab
ab
ab
ab
-sh
-si
-sl
-sl
-st
-sw
-sw
-sz
-sw
-sw
-sz
-sw
-sA
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sh
-tm
-sw
-sw
-sO
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(11,1,1) = {"
@@ -8917,36 +8631,36 @@ ab
ab
ab
ab
-sh
-si
-sl
-sl
-st
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sz
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sh
-tn
-sw
-sw
-sO
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(12,1,1) = {"
@@ -9174,36 +8888,36 @@ ab
ab
ab
ab
-sh
-si
-sk
-sp
-st
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sh
-to
-sw
-sw
-sU
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(13,1,1) = {"
@@ -9431,36 +9145,36 @@ ab
ab
ab
ab
-sh
-si
-sl
-sn
-su
-sp
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-th
-sh
-sh
-sh
-sh
-th
-sh
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(14,1,1) = {"
@@ -9688,36 +9402,36 @@ ab
ab
ab
ab
-sh
-si
-sl
-sn
-sr
-sl
-sl
-sx
-sl
-sy
-sl
-sy
-sl
-sy
-sl
-sh
-sD
-sP
-sV
-sZ
-td
-td
-sw
-sw
-sw
-td
-td
-sw
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(15,1,1) = {"
@@ -9945,36 +9659,36 @@ ab
ab
ab
ab
-sh
-si
-sl
-sm
-sv
-sl
-sk
-sy
-sl
-sx
-sk
-sy
-sl
-sx
-sl
-sh
-sE
-sQ
-sE
-sZ
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(16,1,1) = {"
@@ -10202,36 +9916,36 @@ ab
ab
ab
ab
-sh
-sh
-sh
-sh
-si
-sl
-sl
-sy
-sl
-sy
-sl
-sx
-sl
-sy
-sl
-sh
-sF
-sR
-sP
-sZ
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(17,1,1) = {"
@@ -10462,33 +10176,33 @@ ab
ab
ab
ab
-sh
-si
-sl
-sl
-sx
-sl
-sy
-sl
-sy
-sk
-sy
-sl
-sh
-sG
-sG
-sD
-sZ
-sw
-sw
-sw
-sw
-sw
-sX
-sw
-sw
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(18,1,1) = {"
@@ -10719,33 +10433,33 @@ ab
ab
ab
ab
-sh
-si
-sk
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sl
-sk
-sh
-sD
-sE
-sF
-sZ
-te
-te
-sw
-sw
-sw
-te
-te
-sw
-sw
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(19,1,1) = {"
@@ -10976,33 +10690,33 @@ ab
ab
ab
ab
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-th
-sh
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(20,1,1) = {"
@@ -11245,21 +10959,21 @@ ab
ab
ab
ab
-sh
-sH
-sS
-sS
-sK
-sK
-sK
-sh
-sK
-sK
-sH
-sI
-sw
-sS
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(21,1,1) = {"
@@ -11502,21 +11216,21 @@ ab
ab
ab
ab
-sh
-sH
-sw
-sw
-sw
-sw
-sw
-sh
-sH
-sw
-sw
-sw
-sw
-sS
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(22,1,1) = {"
@@ -11759,21 +11473,21 @@ ab
ab
ab
ab
-sh
-sI
-sw
-sw
-sX
-sX
-sw
-th
-sw
-sw
-sw
-sw
-sX
-sH
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(23,1,1) = {"
@@ -12016,21 +11730,21 @@ ab
ab
ab
ab
-sh
-sI
-sw
-sw
-sX
-sX
-sw
-sh
-sI
-sw
-sw
-sw
-sw
-sJ
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(24,1,1) = {"
@@ -12273,21 +11987,21 @@ ab
ab
ab
ab
-sh
-sJ
-sw
-sw
-sw
-sw
-sw
-sh
-sH
-sX
-sw
-sw
-sw
-sI
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(25,1,1) = {"
@@ -12530,21 +12244,21 @@ ab
ab
ab
ab
-sh
-sK
-sS
-sI
-sH
-sH
-sI
-sh
-sK
-sH
-sK
-sS
-sK
-sS
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(26,1,1) = {"
@@ -12787,21 +12501,21 @@ ab
ab
ab
ab
-sh
-sh
-sh
-sh
-ta
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(27,1,1) = {"
@@ -13044,21 +12758,21 @@ ab
ab
ab
ab
-sh
-sL
-sl
-sl
-sl
-sl
-sl
-sL
-sl
-sl
-sl
-sl
-sl
-sL
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(28,1,1) = {"
@@ -13301,21 +13015,21 @@ ab
ab
ab
ab
-sh
-sM
-sl
-sl
-sl
-sl
-sl
-sM
-sl
-sl
-sl
-sl
-sl
-sM
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(29,1,1) = {"
@@ -13558,21 +13272,21 @@ ab
ab
ab
ab
-sh
-sN
-sl
-sl
-sl
-sl
-sl
-sN
-sl
-sl
-sl
-sl
-sl
-sN
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(30,1,1) = {"
@@ -13815,21 +13529,21 @@ ab
ab
ab
ab
-sh
-sN
-sN
-sN
-sN
-sN
-sN
-ti
-sN
-sN
-sN
-sN
-sN
-sN
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(31,1,1) = {"
@@ -14072,21 +13786,21 @@ ab
ab
ab
ab
-sh
-sN
-sl
-sl
-sl
-sl
-sl
-sN
-sl
-sl
-sl
-sl
-sl
-sN
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(32,1,1) = {"
@@ -14329,21 +14043,21 @@ ab
ab
ab
ab
-sh
-sM
-sl
-sl
-sl
-sl
-sl
-sM
-sl
-sl
-sl
-sl
-sl
-sM
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(33,1,1) = {"
@@ -14586,21 +14300,21 @@ ab
ab
ab
ab
-sh
-sL
-sl
-sl
-sl
-sl
-sl
-sL
-sl
-sl
-sl
-sl
-sl
-sL
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(34,1,1) = {"
@@ -14843,21 +14557,21 @@ ab
ab
ab
ab
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
-sh
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
ab
"}
(35,1,1) = {"
@@ -39948,7 +39662,7 @@ gN
gS
gN
gU
-gN
+ts
gS
gS
gS
@@ -44567,7 +44281,6 @@ fN
fN
fN
fN
-gM
gR
gR
gR
@@ -44577,9 +44290,10 @@ gR
gR
gR
gR
-ie
-ip
-iN
+gR
+gR
+gR
+gR
fN
fN
fN
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 4df75c4a60e..50f83c2d947 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -14,7 +14,7 @@
#define BANTYPE_JOB_PERMA 3
#define BANTYPE_JOB_TEMP 4
#define BANTYPE_ANY_FULLBAN 5 //used to locate stuff to unban.
-#define BANTYPE_APPEARANCE 6
+
#define BANTYPE_ADMIN_PERMA 7
#define BANTYPE_ADMIN_TEMP 8
#define BANTYPE_ANY_JOB 9 //used to remove jobbans
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index c9861cf2f31..b80c70d035c 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -78,4 +78,10 @@
#define WEAPON_LIGHT 0
#define WEAPON_MEDIUM 1
- #define WEAPON_HEAVY 2
\ No newline at end of file
+ #define WEAPON_HEAVY 2
+
+
+//Health Defines
+
+#define HEALTH_THRESHOLD_CRIT 0
+#define HEALTH_THRESHOLD_DEAD -100
\ No newline at end of file
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 611ca03ecc6..4deb0080014 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -67,6 +67,14 @@
return 0
return L[A.type]
+//returns a new list with only atoms that are in typecache L
+/proc/typecache_filter_list(list/atoms, list/typecache)
+ . = list()
+ for (var/thing in atoms)
+ var/atom/A = thing
+ if (typecache[A.type])
+ . += A
+
//Like typesof() or subtypesof(), but returns a typecache instead of a list
/proc/typecacheof(path, ignore_root_path)
if(ispath(path))
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index a5b1347ee76..773692ad84e 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -543,7 +543,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
return 0
if(current.opacity)
return 0
- for(var/atom/A in current)
+ for(var/thing in current)
+ var/atom/A = thing
if(A.opacity)
return 0
current = get_step_towards(current, target_turf)
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 0792cd95f10..361d6d5b748 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -137,9 +137,6 @@
var/alert_desc_red_downto = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
var/alert_desc_delta = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
- var/health_threshold_crit = 0
- var/health_threshold_dead = -100
-
var/revival_pod_plants = 1
var/revival_cloning = 1
var/revival_brain_life = -1
@@ -167,6 +164,8 @@
var/silent_ai = 0
var/silent_borg = 0
+ var/damage_multiplier = 1 //Modifier for damage to all mobs. Impacts healing as well.
+
var/allowwebclient = 0
var/webclientmembersonly = 0
@@ -213,6 +212,7 @@
var/client_error_message = "Your version of byond is too old, may have issues, and is blocked from accessing this server."
var/cross_name = "Other server"
+ var/showircname = 0
/datum/configuration/New()
var/list/L = subtypesof(/datum/game_mode)
@@ -380,6 +380,8 @@
global.medal_hub = value
if("medal_hub_password")
global.medal_pass = value
+ if("show_irc_name")
+ config.showircname = 1
if("see_own_notes")
config.see_own_notes = 1
if("soft_popcap")
@@ -452,10 +454,8 @@
else if(type == "game_options")
switch(name)
- if("health_threshold_crit")
- config.health_threshold_crit = text2num(value)
- if("health_threshold_dead")
- config.health_threshold_dead = text2num(value)
+ if("damage_multiplier")
+ config.damage_multiplier = text2num(value)
if("revival_pod_plants")
config.revival_pod_plants = text2num(value)
if("revival_cloning")
diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm
new file mode 100644
index 00000000000..e208781e2fd
--- /dev/null
+++ b/code/controllers/subsystem/persistence.dm
@@ -0,0 +1,66 @@
+var/datum/subsystem/persistence/SSpersistence
+
+/datum/subsystem/persistence
+ name = "Persistence"
+ init_order = -100
+ flags = SS_NO_FIRE
+ var/savefile/secret_satchels
+ var/list/satchel_blacklist = list() //this is a typecache
+ var/list/new_secret_satchels = list() //these are objects
+ var/list/old_secret_satchels = list() //these are just vars
+
+/datum/subsystem/persistence/New()
+ NEW_SS_GLOBAL(SSpersistence)
+
+/datum/subsystem/persistence/Initialize()
+ PlaceSecretSatchel()
+ ..()
+
+/datum/subsystem/persistence/proc/CollectData()
+ CollectSecretSatchels()
+
+/datum/subsystem/persistence/proc/PlaceSecretSatchel()
+ var/list/satchels = list()
+ secret_satchels = new /savefile("data/npc_saves/SecretSatchels_[MAP_NAME].sav")
+ satchel_blacklist = typecacheof(list(/obj/item/stack/tile/plasteel, /obj/item/weapon/crowbar))
+
+ secret_satchels >> satchels
+ if(!satchels.len || satchels.len < 20) //guards against low drop pools assuring that one player can reliably find his own gear.
+ return
+
+ var/list/chosen_satchel = pick_n_take(satchels)
+ old_secret_satchels = satchels
+ secret_satchels << old_secret_satchels
+ if(chosen_satchel.len != 3) //Malformed
+ return
+
+ var/path = text2path(chosen_satchel[3]) //If the item no longer exist, this returns null
+ if(!path)
+ return
+
+ var/obj/item/weapon/storage/backpack/satchel/flat/F = new()
+ F.x = chosen_satchel[1]
+ F.y = chosen_satchel[2]
+ F.z = ZLEVEL_STATION
+ if(istype(F.loc,/turf/open/floor) && !istype(F.loc,/turf/open/floor/plating/))
+ F.hide(1)
+ new path(F)
+
+/datum/subsystem/persistence/proc/CollectSecretSatchels()
+ for(var/A in new_secret_satchels)
+ var/obj/item/weapon/storage/backpack/satchel/flat/F = A
+ if(qdeleted(F) || F.z != ZLEVEL_STATION || F.invisibility != INVISIBILITY_MAXIMUM)
+ continue
+ var/list/savable_obj = list()
+ for(var/obj/O in F)
+ if(is_type_in_typecache(O, satchel_blacklist) || O.admin_spawned)
+ continue
+ if(O.persistence_replacement)
+ savable_obj += O.persistence_replacement
+ else
+ savable_obj += O.type
+ if(savable_obj.len < 1)
+ continue
+ old_secret_satchels.len += 1
+ old_secret_satchels[old_secret_satchels.len] = list(F.x, F.y, "[pick(savable_obj)]")
+ secret_satchels << old_secret_satchels
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 55daa97c710..450367ce2e7 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -451,6 +451,8 @@ var/datum/subsystem/ticker/ticker
dellog += "Failures : [SSgarbage.didntgc[path]] \n"
world.log << dellog
+ //Collects persistence features
+ SSpersistence.CollectData()
return 1
/datum/subsystem/ticker/proc/send_tip_of_the_round()
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index dea45393146..f8f46c007d7 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -262,6 +262,7 @@ var/global/list/internal_byond_list_vars = list("contents" = TRUE, "verbs" = TRU
if(ismob(D))
body += ""
+ body += ""
body += ""
body += ""
body += ""
@@ -562,6 +563,18 @@ body
src.give_spell(M)
href_list["datumrefresh"] = href_list["give_spell"]
+ else if(href_list["remove_spell"])
+ if(!check_rights(0))
+ return
+
+ var/mob/M = locate(href_list["remove_spell"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ remove_spell(M)
+ href_list["datumrefresh"] = href_list["remove_spell"]
+
else if(href_list["give_disease"])
if(!check_rights(0))
return
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index 4d55fc0f8a9..ea41a804136 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -515,7 +515,7 @@
H.Weaken(4)
if(H.staminaloss && !H.sleeping)
var/total_health = (H.health - H.staminaloss)
- if(total_health <= config.health_threshold_crit && !H.stat)
+ if(total_health <= HEALTH_THRESHOLD_CRIT && !H.stat)
H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \
"[user] knocks you unconscious!")
H.SetSleeping(30)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 4b82ec57231..310603af01a 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -5,7 +5,7 @@
// the same logical /area have the parent /area object... well, you would be mistaken. If you
// want to find machines, mobs, etc, in the same logical area, you will need to check all the
// related areas. This returns a master contents list to assist in that.
-/proc/area_contents(var/area/A)
+/proc/area_contents(area/A)
if(!istype(A)) return null
var/list/contents = list()
for(var/area/LSA in A.related)
diff --git a/code/game/gamemodes/antag_hud.dm b/code/game/gamemodes/antag_hud.dm
index 408b090cb0e..2f9a0acdf5f 100644
--- a/code/game/gamemodes/antag_hud.dm
+++ b/code/game/gamemodes/antag_hud.dm
@@ -41,7 +41,7 @@
//MIND PROCS
//these are called by mind.transfer_to()
-/datum/mind/proc/transfer_antag_huds(var/datum/atom_hud/antag/newhud)
+/datum/mind/proc/transfer_antag_huds(datum/atom_hud/antag/newhud)
leave_all_huds()
ticker.mode.set_antag_hud(current, antag_hud_icon_state)
if(newhud)
diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm
index b8cea36531a..3c9f29bd46a 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs.dm
@@ -239,7 +239,7 @@
if(host)
var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
if(iscarbon(host))
- resulthealth = round((abs(config.health_threshold_dead - host.health) / abs(config.health_threshold_dead - host.maxHealth)) * 100)
+ resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
stat(null, "Host Health: [resulthealth]%")
if(ratvar_awakens)
stat(null, "You are [recovering ? "un" : ""]able to deploy!")
@@ -444,7 +444,7 @@
return 0
var/resulthealth = round((host.health / host.maxHealth) * 100, 0.5)
if(iscarbon(host))
- resulthealth = round((abs(config.health_threshold_dead - host.health) / abs(config.health_threshold_dead - host.maxHealth)) * 100)
+ resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - host.health) / abs(HEALTH_THRESHOLD_DEAD - host.maxHealth)) * 100)
if(!ratvar_awakens && host.stat != DEAD && resulthealth > 60) //if above 20 health, fails
src << "Your host must be at 60% or less health to emerge like this!"
return
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
index 6d59ad2de81..0596d796731 100644
--- a/code/game/gamemodes/clock_cult/clock_scripture.dm
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -59,6 +59,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
for(var/i in used_cache_components)
if(used_cache_components[i])
clockwork_component_cache[i] += consumed_components[i]
+ else if(slab && !slab.no_cost) //if the slab exists and isn't debug, log the scripture as being used
+ feedback_add_details("clockcult_scripture_recited", name)
if(slab)
slab.busy = null
qdel(src)
diff --git a/code/game/gamemodes/miniantags/hades/hades.dm b/code/game/gamemodes/miniantags/hades/hades.dm
deleted file mode 100644
index 1d253ada6df..00000000000
--- a/code/game/gamemodes/miniantags/hades/hades.dm
+++ /dev/null
@@ -1,727 +0,0 @@
-#define STATE_JUDGE 0
-#define STATE_WRATH 1
-#define STATE_FLEE 2
-
-/mob/living/simple_animal/hostile/hades
- name = "hades"
- real_name = "hades"
- desc = "A strange being, clad in dark robes. Their very presence radiates an uneasy power."
- speak_emote = list("preaches","announces","spits","conveys")
- emote_hear = list("hums.","prays.")
- response_help = "kneels before"
- response_disarm = "flails at"
- response_harm = "punches"
- icon = 'icons/mob/EvilPope.dmi'
- icon_state = "EvilPope"
- icon_living = "EvilPope"
- icon_dead = "popedeath"
- speed = 1
- a_intent = "harm"
- status_flags = CANPUSH
- attack_sound = 'sound/magic/MAGIC_MISSILE.ogg'
- death_sound = 'sound/magic/Teleport_diss.ogg'
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- maxbodytemp = INFINITY
- faction = list("hades")
- attacktext = "strikes with an unholy rage at"
- maxHealth = 1000
- health = 1000
- healable = 0
- environment_smash = 3
- melee_damage_lower = 15
- melee_damage_upper = 20
- see_in_dark = 8
- see_invisible = SEE_INVISIBLE_MINIMUM
- loot = list(/obj/effect/decal/cleanable/blood)
- del_on_death = 0
- deathmessage = "begins to sizzle and pop, their flesh peeling away like paper."
-
- var/isDoingDeath = FALSE
- var/isFleeing = FALSE
- var/fleeTimes = 0
- var/currentState = STATE_JUDGE
- var/rageLevel = 0
-
- var/maxWrathTimer = 150
- var/lastWrathTimer = 0
-
- var/timeBetweenGrabs = 60
- var/lastGrabTime = 0
-
- var/list/validSins = list("Greed","Gluttony","Pride","Lust","Envy","Sloth","Wrath")
- var/lastsinPerson = 0
- var/sinPersonTime = 300
- var/lastFlee = 0
- var/fleeTimer = 30
- var/fakesinPersonChance = 60
- var/list/sinPersonsayings = list("You revel in only your own greed.",\
- "There is nothing but your absolution.",\
- "Your choices have led you to this.",\
- "There is only one way out.",\
- "The only way to be free is to be free of yourself.",\
- "Wallow in sin, and give yourself unto darkness.",\
- "Only the truly sinful may stand.",\
- "Find yourself and you will find Absolution.",\
- "Forego the pain of this process, and submit.",\
- "We can be one in suffering.",\
- "You stand on the precipice of ascension, give in.",\
- "You cannot fathom what lies beyond",\
- "Repent your sins.",\
- "This is the eve of your last days.",\
- "Darkness comes.")
-
- var/list/creepyasssounds = list('sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', \
- 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg',\
- 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
- 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg',\
- 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
- 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg')
-
- var/obj/effect/proc_holder/spell/targeted/lightning/sinLightning
-
- var/list/currentAcolytes = list()
-
-/mob/living/simple_animal/hostile/hades/New()
- ..()
-
- sinLightning = new/obj/effect/proc_holder/spell/targeted/lightning(src)
-
- sinLightning.charge_max = 1
- sinLightning.clothes_req = 0
- sinLightning.range = 32
- sinLightning.cooldown_min = 1
-
- lastsinPerson = world.time
- var/list/possible_titles = list("Pope","Bishop","Lord","Cardinal","Deacon","Pontiff")
- var/chosen = "Hades, [pick(possible_titles)] of Sin"
- name = chosen
- real_name = chosen
-
- world << "[name] has entered your reality. Kneel before them."
- world << 'sound/effects/pope_entry.ogg'
-
- Appear(get_turf(src))
-
-/mob/living/simple_animal/hostile/hades/handle_environment(datum/gas_mixture/environment)
- //space popes are from space, they need not your fickle "oxygen"
- return
-
-/mob/living/simple_animal/hostile/hades/handle_temperature_damage()
- //space popes are from space, they don't uh.. something fire burny death
- return
-
-/mob/living/simple_animal/hostile/hades/death(gibbed)
- if(!isDoingDeath)
- notransform = TRUE
- anchored = TRUE
- src.visible_message("[src] begins to twist and distort, before snapping backwards with a sickening crunch.")
- spawn(20)
- src.visible_message("[src] is being sucked back to their own realm, destabilizing the fabric of time and space itself!")
- playsound(get_turf(src), 'sound/effects/hyperspace_begin.ogg', 100, 1)
- isDoingDeath = TRUE
- AIStatus = AI_OFF
- SpinAnimation()
- for(var/i in 1 to 5)
- for(var/turf/T in spiral_range_turfs(i,src))
- addtimer(src, "sinShed", i*10, FALSE, T)
- spawn(60) // required to be spawn so we can call death's ..() to complete death.
- SpinAnimation(0,0)
- explosion(get_turf(src), 0, 2, 4, 6, flame_range = 6)
- ..()
- var/area/A = locate(/area/hades) in world
- if(A)
- var/turf/T = get_turf(locate(/obj/effect/landmark/event_spawn) in A)
- if(T)
- src.visible_message("[src]'s Staff is flung free as their body explodes.")
- var/obj/structure/ladder/unbreakable/hades/churchLadder = new/obj/structure/ladder/unbreakable/hades(T)
- var/obj/structure/ladder/unbreakable/hades/bodyLadder = new/obj/structure/ladder/unbreakable/hades(get_turf(src))
- var/obj/item/weapon/hades_staff/HS = new/obj/item/weapon/hades_staff(get_turf(src))
- HS.throw_at_fast(pick(orange(src,7)),10,1)
- churchLadder.up = bodyLadder
- bodyLadder.down = churchLadder
- qdel(src)
-
-/mob/living/simple_animal/hostile/hades/attackby(obj/item/I, mob/user, params)
- ..()
- Defend(user,I)
-
-/mob/living/simple_animal/hostile/hades/grabbedby(mob/living/carbon/user, supress_message = 0)
- ..()
- Defend(user,user)
-
-/mob/living/simple_animal/hostile/hades/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
- ..()
- lastsinPerson -= (sinPersonTime/4)
- if(istype(AM,/obj/item))
- var/obj/item/throwCast = AM
- Defend(throwCast.thrownby,AM)
-
-/mob/living/simple_animal/hostile/hades/bullet_act(obj/item/projectile/P, def_zone)
- //don't call ..() because we're going to deflect it
- lastsinPerson -= (sinPersonTime/4)
- Defend(P.firer,P)
- return -1
-
-/mob/living/simple_animal/hostile/hades/attack_hand(mob/living/carbon/human/M)
- ..()
- lastsinPerson -= (sinPersonTime/4)
- Defend(M,M)
-
-/mob/living/simple_animal/hostile/hades/proc/Defend(var/mob/attacker,var/source)
- if(!isDoingDeath)
- rageLevel += 5
- src.visible_message("[src] rounds on the [attacker], gazing at them with a [pick("cold","frosty","freezing","dark")] [pick("glare","gaze","glower","stare")].")
-
- if(istype(source,/obj/item/projectile))
- src.visible_message("[src] [pick("calmly","silently","nonchalantly")] waves their hand, deflecting the [source].")
- var/obj/item/projectile/P = source
- if(P.starting)
- var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
- var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
- var/turf/curloc = get_turf(src)
-
- P.original = locate(new_x, new_y, P.z)
- P.starting = curloc
- P.current = curloc
- P.firer = src
- P.yo = new_y - curloc.y
- P.xo = new_x - curloc.x
- P.Angle = null
- else
- if(prob(20))
- var/chosenDefend = rand(1,3)
- switch(chosenDefend)
- if(1)
- attacker.visible_message("[attacker] is lifted from the ground, shadowy powers tossing them aside.")
- attacker.throw_at_fast(pick(orange(src,7)),10,1)
- if(2)
- attacker.visible_message("[attacker] crackles with electricity, a bolt leaping from [src] to them.")
- sinLightning.Bolt(src,attacker,30,5,src)
- if(3)
- src.visible_message("[src] points his staff at [attacker], a swarm of eyeballs lurching fourth!")
- for(var/i in 1 to 4)
- var/mob/living/simple_animal/hostile/carp/eyeball/E = new/mob/living/simple_animal/hostile/carp/eyeball(pick(orange(attacker,1)))
- E.faction = faction
- addtimer(E, "gib", 150, FALSE)
-
-/mob/living/simple_animal/hostile/hades/proc/sinShed(var/turf/T)
- var/obj/effect/overlay/temp/cult/sparks/S = PoolOrNew(/obj/effect/overlay/temp/cult/sparks, T)
- S.anchored = FALSE
- S.throw_at_fast(src,10,1)
- PoolOrNew(/obj/effect/overlay/temp/hadesBlood, T)
-
-/mob/living/simple_animal/hostile/hades/proc/Transfer(var/mob/living/taken, var/turf/transferTarget)
- if(transferTarget)
- playsound(get_turf(taken), 'sound/magic/Ethereal_Enter.ogg', 50, 1, -1)
- PoolOrNew(/obj/effect/overlay/temp/hadesFlick, get_turf(taken))
- taken.forceMove(transferTarget)
- Appear(get_turf(taken))
-
-/mob/living/simple_animal/hostile/hades/proc/Appear(var/turf/where)
- var/obj/effect/timestop/hades/TS = new /obj/effect/timestop/hades(where)
- TS.immune = list(src)
-
-/mob/living/simple_animal/hostile/hades/Life()
- if(..() && !isDoingDeath) // appropriately check if we're alive now we leave a corpse
- if(health > maxHealth/4 && !isFleeing)
- if(rageLevel > 50)
- lastWrathTimer = world.time
- currentState = STATE_WRATH
- else
- currentState = STATE_JUDGE
- else
- if(world.time > lastFlee + fleeTimer)
- lastFlee = world.time
- isFleeing = TRUE
- currentState = STATE_FLEE
-
- var/area/healthCheck = get_area(src)
-
- if(istype(healthCheck,/area/chapel/main))
- if(currentState == STATE_FLEE)
- lastWrathTimer = world.time
- currentState = STATE_WRATH
- if(health < maxHealth/2)
- health += 10 // slowly regain hp in the chapel, up to a maximum of half our max
-
- var/spokenThisTurn = FALSE
- for(var/mob/living/A in currentAcolytes)
- if(!A)
- currentAcolytes -= A
- continue
- if(A.health <= 0)
- rageLevel += 5
- if(!spokenThisTurn)
- spokenThisTurn = TRUE
- var/list/lossSayings = list("They were weak.","For every death, two more rise.",\
- "What is but one servant lost?","Darkness engulf you!","To the Pit with them.",\
- "Fools! All of you!","You can't stop me. You. Will. Be. JUDGED.")
- src.say(pick(lossSayings))
- currentAcolytes -= A
- A.gib()
-
- if(currentState == STATE_WRATH) // we have been enraged.
- if(world.time > lastWrathTimer + maxWrathTimer)
- rageLevel = 0 // wind down if we're wrathful too long.
- rageLevel -= 1 // rage phase starts at 50, meaning roughly 20s of rage.
- if(currentAcolytes.len == 0)
- src.say("Rise, Servants. AID YOUR MASTER.")
- playsound(get_turf(src), 'sound/magic/CastSummon.ogg', 100, 1)
- for(var/i in 1 to 5)
- var/mob/living/simple_animal/hostile/hadesacolyte/HA = new/mob/living/simple_animal/hostile/hadesacolyte(get_turf(pick(orange(2,src))))
- HA.master = src
- currentAcolytes += HA
- if(target)
- if(world.time > lastGrabTime + timeBetweenGrabs)
- if(get_dist(src,target) > 4) // you can't run from us. upped to 4 to give more leeway.
- lastGrabTime = world.time
- var/list/fleeSayings = list("There is no escape from your sins, [target]","Fleeing will only make your punishment worse [target]!",\
- "There is nowhere you can hide, [target]!","You can't run, [target]!","Get back here, [target]!","You coward, [target]!",\
- "I will find you, [target]!","Return to me, [target]!")
- src.say(pick(fleeSayings))
- var/mob/living/toGrab = target
- toGrab.Beam(src,"blood",'icons/effects/beam.dmi',10)
- toGrab.Weaken(6)
- playsound(get_turf(src), 'sound/magic/CastSummon.ogg', 100, 1)
- toGrab.throw_at_fast(src,10,1)
- if(rageLevel >= 100)
- rageLevel = 50
- var/list/overboardSayings = list("Ashes! It will all be ashes!","I will bring about the apocolypse!",\
- "There will be nothing but your withered husks!","Face your doom, cretins!","There. Will. Be. ORDER!",\
- "I am your Lord, lay down your arms and submit.","Your souls will be cremated!",\
- "Only in death will you obey!","This is no person's fault but your own!")
- src.say(pick(overboardSayings))
- var/turf/StartLoc = get_turf(src)
- var/list/nearby = orange(6,src)
- var/slashCount = 0
- var/aoeType = rand(1,2) // just for future proofing
- for(var/mob/living/A in nearby)
- slashCount++
- A.Beam(src,"blood",'icons/effects/beam.dmi',10)
- spawn(slashCount + 3)
- if(aoeType == 1)
- // no more cheaping it out with non-player mobs like turrets or carps
- loc = get_turf(A)
- sinShed(StartLoc)
- A.attack_animal(src)
- PoolOrNew(/obj/effect/overlay/temp/hadesBlood,get_turf(A))
- playsound(get_turf(A), 'sound/magic/SummonItems_generic.ogg', 100, 1)
- if(aoeType == 2)
- sinShed(StartLoc)
- PoolOrNew(/obj/effect/overlay/temp/hadesBite,get_turf(A))
- A.Weaken(6)
- var/obj/effect/timestop/hades/large/TS = new /obj/effect/timestop/hades/large(StartLoc)
- TS.immune = list(src)
- spawn((slashCount+1)+3)
- loc = StartLoc
-
- if(currentState == STATE_FLEE) // we've been wounded, let us flee and lick our wounds
- var/area/A = locate(/area/chapel/main) in world
- if(A)
- var/turf/T = get_turf(locate(/obj/effect/landmark/event_spawn) in A)
- if(!T)
- T = get_turf(src) // no event spawn in chapel, fall back to doing it on the spot.
- if(T)
- fleeTimes++
- Transfer(src,T)
- AIStatus = AI_OFF
- notransform = TRUE
- anchored = TRUE
- for(var/i in 1 to 5)
- spawn(i*10)
- for(var/turf/S in oview(i,src) - oview((i)-1,src))
- sinShed(S)
- health += maxHealth/(10*fleeTimes) // every flee we gain less HP
- spawn(50)
- isFleeing = FALSE
- notransform = FALSE
- anchored = FALSE
- AIStatus = AI_ON
- currentState = STATE_JUDGE
- lastsinPerson = 0 // immediately teleport away to judge
-
- if(currentState == STATE_JUDGE) // our default state, judge a few people and tell them they're rude or something
- if(world.time > lastsinPerson + sinPersonTime)
- if(prob(fakesinPersonChance))
- lastsinPerson = world.time
- visible_message("[pick(sinPersonsayings)]")
- playsound(get_turf(src), pick(creepyasssounds), 100, 1)
- else
- lastsinPerson = world.time
- var/mob/living/carbon/human/sinPerson = pick(living_mob_list)
- var/depth = living_mob_list.len + 1 // just in case
- if(sinPerson) // no more finding nullcakes
- if(!sinPerson.ckey)
- while(!sinPerson.ckey && depth > 0)
- --depth
- var/checkPerson = pick(living_mob_list)
- if(checkPerson)
- sinPerson = checkPerson
- if(!sinPerson || !sinPerson.ckey)
- // double check ensure that if the above loop fails to get a ckey target
- // we don't go and use the last mob checked, causing odd situations
- return
-
- if(prob(65)) // moderately high chance for us to go to them, else they come here.
- Transfer(src,get_turf(pick(oview(1,sinPerson))))
- else
- Transfer(sinPerson,get_turf(pick(oview(1,src))))
-
- var/sinPersonchoice = pick(validSins)
-
- src.say("Your sin, [sinPerson], is [sinPersonchoice].")
- var/isIndulged = prob(50)
- if(isIndulged)
- src.say("I will indulge your sin, [sinPerson].")
- else
- src.say("Your sin will be punished, [sinPerson]!")
-
- switch(sinPersonchoice)
- if("Greed")
- sin_Greed(sinPerson, isIndulged)
- if("Gluttony")
- sin_Gluttony(sinPerson, isIndulged)
- if("Pride")
- sin_Pride(sinPerson, isIndulged)
- if("Lust")
- sin_Lust(sinPerson, isIndulged)
- if("Envy")
- sin_Envy(sinPerson, isIndulged)
- if("Sloth")
- sin_Sloth(sinPerson, isIndulged)
- if("Wrath")
- sin_Wrath(sinPerson, isIndulged)
-
-
-///Sin related things
-
-//global Sin procs, shared between staff and pope
-
-/proc/sin_Greed(var/mob/living/carbon/human/sinPerson, var/isIndulged)
- if(isIndulged)
- sinPerson << "You feel like you deserve more, in fact, you want everything."
- var/list/greed = list(/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/diamond)
- for(var/i in 1 to 10)
- var/greed_type = pick(greed)
- new greed_type(get_turf(sinPerson))
- else
- sinPerson << "Your body begins to shift and bend, changing to reflect your inner greed."
- var/mob/living/M = sinPerson.change_mob_type(/mob/living/simple_animal/cockroach,get_turf(sinPerson),"Greedroach",1)
- M.AddSpell(new/obj/effect/proc_holder/spell/targeted/mind_transfer)
-
-/proc/sin_Gluttony(var/mob/living/carbon/human/sinPerson, var/isIndulged)
- if(isIndulged)
- sinPerson << "Your stomach growls, you feel hungry."
- var/list/allTypes = list()
- for(var/A in typesof(/obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/O = A
- if(initial(O.cooked_type))
- allTypes += A
- for(var/i in 1 to 10)
- var/greed_type = pick(allTypes)
- new greed_type(get_turf(sinPerson))
- else
- sinPerson << "Your body begins to bloat and stretch, bile rising in your throat."
- sinPerson.reagents.add_reagent("nutriment",1000)
-
-/proc/sin_Pride(var/mob/living/carbon/human/sinPerson, var/isIndulged)
- var/obj/item/weapon/twohanded/sin_pride/pride_hammer = new(get_turf(sinPerson))
- pride_hammer.pride_direction = !isIndulged
-
- if(isIndulged)
- sinPerson << "You feel strong enough to take on the world."
- pride_hammer.name = "Indulged [pride_hammer.name]"
- else
- sinPerson << "You feel small and weak, like the entire world is against you."
- pride_hammer.name = "Punished [pride_hammer.name]"
-
-/proc/sin_Lust(var/mob/living/carbon/human/sinPerson, var/isIndulged)
- var/obj/item/lovestone/lovestone = new(get_turf(sinPerson))
- lovestone.lust_direction = !isIndulged
-
- if(isIndulged)
- sinPerson << "You feel confident, like everything and everyone is drawn to you."
- lovestone.name = "Indulged [lovestone.name]"
- else
- sinPerson << "You feel lonely... the wish for the warmth of another spark through your mind."
- lovestone.name = "Punished [lovestone.name]"
-
-/proc/sin_Envy(var/mob/living/carbon/human/sinPerson, var/isIndulged)
- if(isIndulged)
- for(var/mob/living/carbon/human/H in player_list) // name lottery
- if(H == sinPerson)
- continue
- if(prob(25))
- sinPerson.name = H.name
- sinPerson.real_name = H.real_name
- var/datum/dna/lottery = H.dna
- lottery.transfer_identity(sinPerson, transfer_SE=1)
- sinPerson.updateappearance(mutcolor_update=1)
- sinPerson.domutcheck()
- sinPerson << "You feel envious of [sinPerson.name], and your body shifts to reflect that!"
- else
- var/sinPersonspecies = pick(species_list)
- var/newtype = species_list[sinPersonspecies]
- sinPerson << "You wish for more from yourself.. your body shifts to suit your wish."
- sinPerson.set_species(newtype)
-
-/proc/sin_Sloth(var/mob/living/carbon/human/sinPerson, var/isIndulged)
- if(isIndulged)
- sinPerson << "You feel tired..."
- sinPerson.drowsyness += 100
- else
- sinPerson << "A chill comes over your body, the feeling of frostbite nipping at your fingers."
- sinPerson.reagents.add_reagent("frostoil", 50)
-
-/proc/sin_Wrath(var/mob/living/carbon/human/sinPerson, var/isIndulged)
- if(isIndulged)
- sinPerson << "You feel wrathful, like you want to destroy everyone and everything."
- sinPerson.change_mob_type(/mob/living/simple_animal/slaughter,get_turf(sinPerson),"Wrath Demon",1)
- else
- sinPerson << "Your chest feels tight, and the world begins to spin around you."
- sinPerson.reagents.add_reagent("lexorin", 29)
- sinPerson.reagents.add_reagent("mindbreaker", 29)
-
-/obj/effect/overlay/temp/hadesFlick
- name = "transdimensional waste"
- icon = 'icons/mob/mob.dmi'
- icon_state = "liquify"
- duration = 15
-
-/obj/effect/overlay/temp/hadesBite
- name = "biting tendril"
- icon = 'icons/effects/effects.dmi'
- icon_state = "tendril_bite"
- duration = 15
-
-/obj/effect/overlay/temp/hadesBlood
- name = "blood plume"
- icon = 'icons/effects/128x128.dmi'
- icon_state = "spray_plume"
- duration = 30
-
-/obj/effect/timestop/hades // custom timeslip to make him immune
- name = "Frozen Time"
- desc = "Time has slowed to a halt."
-
-/obj/effect/timestop/hades/New()
- spawn(5)
- ..()
-
-/obj/effect/timestop/hades/large
- freezerange = 6
- icon_state = "huge_rune"
- icon = 'icons/effects/224x224.dmi'
-
-
-/obj/item/weapon/twohanded/sin_pride
- icon_state = "mjollnir0"
- name = "Pride-struck Hammer"
- desc = "It resonates an aura of Pride."
- force = 5
- throwforce = 15
- w_class = 4
- slot_flags = SLOT_BACK
- force_unwielded = 5
- force_wielded = 20
- attack_verb = list("attacked", "smashed", "crushed", "splattered", "cracked")
- hitsound = 'sound/weapons/blade1.ogg'
- var/pride_direction = FALSE
-
-/obj/item/weapon/twohanded/sin_pride/update_icon()
- icon_state = "mjollnir[wielded]"
- return
-
-/obj/item/weapon/twohanded/sin_pride/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
- if(!proximity) return
- if(wielded)
- if(istype(A,/mob/living/carbon/human))
- var/mob/living/carbon/H = A
- var/mob/living/carbon/U = user
- if(H)
- if(pride_direction == FALSE)
- U.reagents.trans_to(H, user.reagents.total_volume, 1, 1, 0)
- U << "Your pride reflects on [H]."
- if(H.health > 0)
- U.health += force
- U.updatehealth()
- H.health -= force
- H.updatehealth()
- H << "You feel insecure, taking on [user]'s burden."
- else if(pride_direction == TRUE)
- H.reagents.trans_to(user, H.reagents.total_volume, 1, 1, 0)
- H << "Your pride reflects on [user]."
- if(U.health > 0)
- U.health -= force
- U.updatehealth()
- H.health += force
- H.updatehealth()
- U << "You feel insecure, taking on [H]'s burden."
-
-/obj/item/lovestone
- name = "Stone of Lust"
- desc = "It lays within your hand, radiating pulses of uncomfortable warmth."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "lovestone"
- item_state = "lovestone"
- w_class = 1
- var/lust_direction = FALSE
- var/lastUsage = 0
- var/usageTimer = 300
-
-/obj/item/lovestone/attack_self(mob/user)
- if(world.time > lastUsage + usageTimer)
- lastUsage = world.time
- user.visible_message("[user] grips the [src] tightly, causing it to vibrate and pulse brightly.")
- spawn(25)
- if(lust_direction == FALSE)
- var/list/throwAt = list()
- for(var/atom/movable/AM in oview(7,user))
- if(!AM.anchored && AM != user)
- throwAt.Add(AM)
- for(var/counter = 1, counter < throwAt.len, ++counter)
- var/atom/movable/cast = throwAt[counter]
- cast.throw_at_fast(user,10,1)
- else if(lust_direction == 1)
- var/mob/living/carbon/human/H = user
- var/mob/living/carbon/human/foundLover = locate(/mob/living/carbon/human) in orange(3,H)
- if(!foundLover)
- H << "As you hold the stone, loneliness grips you, your heart feeling heavy and you struggle to breath."
- for(var/i in 1 to 10)
- addtimer(H.reagents, "add_reagent", i*10, FALSE, "initropidril", i)
- else
- H << "You take comfort in the presence of [foundLover]"
- H.reagents.add_reagent("omnizine",25)
- H.Beam(foundLover,"r_beam",'icons/effects/beam.dmi',10)
- foundLover << "You take comfort in the presence of [H]"
- foundLover.reagents.add_reagent("omnizine",25)
- else
- user << "The stone lays inert. It is still recharging."
-
-/mob/living/simple_animal/hostile/hadesacolyte
- name = "Acolyte of Hades"
- desc = "Darkness seethes from their every pore."
- icon_state = "hades_acolyte"
- icon_living = "hades_acolyte"
- icon_dead = "hades_acolyte_dead"
- speak_chance = 0
- turns_per_move = 5
- response_help = "trembles in fear of"
- response_disarm = "slaps wildly at"
- response_harm = "hits"
- speed = 1
- maxHealth = 45
- health = 45
-
- harm_intent_damage = 5
- melee_damage_lower = 5
- melee_damage_upper = 15
- attacktext = "strikes at"
- attack_sound = 'sound/weapons/bladeslice.ogg'
-
- butcher_results = list(/obj/item/clothing/mask/gas/cyborg/hades = 1,/obj/item/clothing/suit/hooded/chaplain_hoodie/hades = 1,/obj/item/weapon/hades_staff/fake = 1)
-
- unsuitable_atmos_damage = 0
- del_on_death = 0
- faction = list("hades")
-
- var/mob/living/simple_animal/hostile/hades/master
-
-/mob/living/simple_animal/hostile/hadesacolyte/Life()
- if(..())
- if(master)
- if(get_dist(src,master) > 5)
- PoolOrNew(/obj/effect/overlay/temp/hadesFlick,get_turf(src))
- src.visible_message("[src] twists and distorts, before vanishing in a snap.")
- src.forceMove(get_turf(pick(orange(2,master))))
-
-//acolyte of hades outfit
-/obj/item/clothing/mask/gas/cyborg/hades
- name = "Skull Mask"
- desc = "It's a skull mask, made of a thin, cool metal."
-
-/obj/item/clothing/suit/hooded/chaplain_hoodie/hades
- name = "Dark robes"
- desc = "A dark, soft robe."
- hooded = 1
- hoodtype = /obj/item/clothing/head/chaplain_hood/hades
-
-/obj/item/clothing/head/chaplain_hood/hades
- name = "Dark hood"
- desc = "A dark, soft hood."
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEEARS
-//end hades outfit
-
-/obj/item/hades_summoner
- name = "Dark Seed"
- desc = "The stone lays inert, but even when holding it you hear maddened whispers."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "dark_seed_inert"
- item_state = "dark_seed_inert"
- w_class = 1
- var/isActivated = FALSE
- var/whoActivated
- var/countDownToSummon = 10
- var/absorbedHP = 0
-
-/obj/item/hades_summoner/attack_self(mob/user)
- if(!isActivated)
- var/choice = input(user,"Rub the stone?",name) in list("Yes","No")
- if(choice == "Yes")
- if(prob(15))
- user << "You rub the stone.. and a voice springs fourth!"
- user << "You hear a voice in your head.. 'Bring me the flesh of a living being.. and we shall bargain.'"
- whoActivated = user
- isActivated = TRUE
- desc = "The stone hums with a soft glow, whispering to you."
- icon_state = "dark_seed"
- else
- user << "The stone shivers, but nothing happens. Perhaps try again later?"
- else
- if(user != whoActivated)
- user << "The stone lays inert."
- else
- if(countDownToSummon > 0)
- user << "You hear a voice in your head.. 'I still require [countDownToSummon] vessels worth of flesh. Bring them to me'"
- else
- user << "I thank you, acolyte."
- var/mob/living/simple_animal/hostile/hadesacolyte/HA = user.change_mob_type(/mob/living/simple_animal/hostile/hadesacolyte,get_turf(user),"[user.name]",1)
- var/mob/living/simple_animal/hostile/hades/H = new/mob/living/simple_animal/hostile/hades(get_turf(user))
- H.maxHealth = absorbedHP
- H.health = H.maxHealth
- if(H.maxHealth < initial(H.maxHealth))
- HA << "You.. you fool! How dare you summon me with such dirty flesh!"
- HA.faction -= "hades"
- if(H.maxHealth > initial(H.maxHealth))
- HA << "Such.. power! You have exceeded yourself, acolyte. Drink of my might!"
- HA.maxHealth = 250
- HA.health = 250
- qdel(src)
-
-/obj/item/hades_summoner/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity)
- if(!proximity)
- return
- if(istype(A,/mob/living))
- var/mob/living/M = A
- if(countDownToSummon > 0)
- if(M.health > 0 && M.maxHealth > 200)
- // no absorbing super strong creatures unless they're dead
- user << "Such power.. Slay this [M] so that I may partake of its being."
- return
- user << "I accept your offering."
- absorbedHP += M.maxHealth
- if(!M.ckey)
- M.gib()
- else
- M << "You feel the flesh being stripped from your bones. You're overwhelmed with maddening pain, before reforming into another being!"
- M.change_mob_type(/mob/living/simple_animal/hostile/hadesacolyte,get_turf(user),"[user.name]",1)
- countDownToSummon--
- if(countDownToSummon <= 0)
- user << "I am ready to ascend, my acolyte."
-
-
-#undef STATE_JUDGE
-#undef STATE_WRATH
-#undef STATE_FLEE
diff --git a/code/game/gamemodes/miniantags/hades/hades_chapel.dm b/code/game/gamemodes/miniantags/hades/hades_chapel.dm
deleted file mode 100644
index b4ba1d53a59..00000000000
--- a/code/game/gamemodes/miniantags/hades/hades_chapel.dm
+++ /dev/null
@@ -1,143 +0,0 @@
-/area/hades
- name = "Chapel of Sin"
- icon_state = "yellow"
- requires_power = 0
- has_gravity = 1
-
-/turf/open/floor/plasteel/hades
- name = "Sin-touched Floor"
- icon_state = "cult"
-
-/obj/structure/chair/hades
- name = "Cross of Hades"
- desc = "An inverted cross, with straps on it to support the weight of a living being."
- icon_state = "chair_hades"
- var/list/watchedSpikes = list()
-
-/obj/structure/chair/hades/New()
- ..()
- flags |= NODECONSTRUCT
- for(var/obj/structure/kitchenspike/KS in range(12))
- watchedSpikes += KS
-
-/obj/structure/chair/hades/proc/considerReady()
- //buckled_mobs seems to work inconsistently, so we're doing some custom searching here.
- if(!buckled_mobs)
- return FALSE
- if(!buckled_mobs.len)
- return FALSE
- for(var/obj/structure/kitchenspike/KS in watchedSpikes)
- var/mob/living/M = locate(/mob/living) in get_turf(KS)
- if(!M)
- return FALSE
- return TRUE
-
-/obj/structure/chair/hades/proc/completeRitual()
- for(var/obj/structure/kitchenspike/KS in watchedSpikes)
- var/mob/living/M = locate(/mob/living) in get_turf(KS)
- M.gib()
- playsound(get_turf(src), 'sound/effects/pope_entry.ogg', 100, 1)
- sleep(100)
- playsound(get_turf(src), 'sound/effects/hyperspace_end.ogg', 100, 1)
- new/obj/item/weapon/hades_staff/imbued(get_turf(src))
- src.visible_message("[src] shatters into a thousand shards, a staff falling from it.")
- qdel(src)
-
-/obj/structure/chair/hades/attackby(obj/item/weapon/W, mob/user, params)
- ..()
- if(istype(W, /obj/item/weapon/hades_staff))
- var/obj/item/weapon/hades_staff/HS = W
- if(!HS.isKey)
- return
- src.visible_message("[user] inserts the [W] into the [src], giving it a quick turn.")
- if(considerReady())
- qdel(W)
- src.visible_message("[src] shudders, the sound of moving gears arising...")
- for(var/mob/living/M in buckled_mobs)
- M.gib()
- for(var/i in 1 to 4)
- addtimer(GLOBAL_PROC, "playsound", i*10, FALSE, get_turf(src), 'sound/effects/clang.ogg', 100, 1)
- spawn(50)
- src.visible_message("[src] begins to lower into the ground...")
- icon_state = "chair_hades_slide"
- addtimer(src, "completeRitual", 50, FALSE)
- else
- src.visible_message("[src] clunks, the sound of grinding gears arising. Nothing happens.")
-
-/obj/structure/ladder/unbreakable/hades
- name = "Dimensional Rift"
- desc = "Where does it lead?"
- icon = 'icons/mob/EvilPope.dmi'
- icon_state = "popedeath"
- anchored = TRUE
-
-/obj/structure/ladder/unbreakable/hades/update_icon()
- return
-
-/obj/item/weapon/paper/hades_instructions
- name = "paper- 'Hastily Scrawled Letter'"
- info = "The Master has instructed us to collect corpses for the ritual, and told us to deposity them in the Ritual Room, behind a bookcase in the library. The Master has locked the device to only work with his key, so no more accidents happen."
-
-/obj/item/weapon/hades_staff
- name = "Staff of Hades"
- desc = "A large, dark staff, with a set of key-like prongs on the end."
- icon_state = "staffofchange"
- icon = 'icons/obj/guns/magic.dmi'
- item_state = "staffofchange"
- slot_flags = SLOT_BELT | SLOT_BACK
- force = 25
- throwforce = 5
- w_class = 3
- hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("slapped", "shattered", "blasphemed", "smashed", "whacked", "crushed", "hammered")
- block_chance = 25
- var/isKey = 1
-
-/obj/item/weapon/hades_staff/fake
- name = "Inert Staff of Hades"
- desc = "A large, dark staff."
- isKey = 0
-
-/obj/item/weapon/hades_staff/imbued
- name = "Imbued Staff of Hades"
- desc = " Bestowed with the power of wayward souls, this Staff allows the wielder to judge a target."
- force = 75
- throwforce = 35
- block_chance = 75
- var/lastJudge = 0
- var/judgeCooldown = 150
-
-/obj/item/weapon/hades_staff/imbued/attack(mob/living/carbon/human/M, mob/living/carbon/human/user)
- if(!istype(M))
- return ..()
-
- if(world.time > lastJudge + judgeCooldown)
- var/mob/living/sinPerson = M
- lastJudge = world.time
- var/sinPersonchoice = pick("Greed","Gluttony","Pride","Lust","Envy","Sloth","Wrath")
-
- src.say("Your sin, [sinPerson], is [sinPersonchoice].")
- var/isIndulged = prob(50)
- if(isIndulged)
- src.say("I will indulge your sin, [sinPerson].")
- else
- src.say("Your sin will be punished, [sinPerson]!")
-
- switch(sinPersonchoice)
- if("Greed")
- sin_Greed(sinPerson, isIndulged)
- if("Gluttony")
- sin_Gluttony(sinPerson, isIndulged)
- if("Pride")
- sin_Pride(sinPerson, isIndulged)
- if("Lust")
- sin_Lust(sinPerson, isIndulged)
- if("Envy")
- sin_Envy(sinPerson, isIndulged)
- if("Sloth")
- sin_Sloth(sinPerson, isIndulged)
- if("Wrath")
- sin_Wrath(sinPerson, isIndulged)
- else
- ..()
- user << "The [src] is still recharging."
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index f1f35ccf1d6..969a310c9dc 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -486,6 +486,7 @@ This is here to make the tiles around the station mininuke change when it's arme
name = "nuclear authentication disk"
desc = "Better keep this safe."
icon_state = "nucleardisk"
+ persistence_replacement = /obj/item/weapon/disk/fakenucleardisk
/obj/item/weapon/disk/nuclear/New()
..()
@@ -556,3 +557,8 @@ This is here to make the tiles around the station mininuke change when it's arme
log_game("[src] has been destroyed in [COORD(diskturf)]. Moving it to \
[COORD(targetturf)].")
return QDEL_HINT_LETMELIVE //Cancel destruction unless forced
+
+/obj/item/weapon/disk/fakenucleardisk
+ name = "cheap plastic imitation of the nuclear authentication disk"
+ desc = "Broken dreams and a faint oder of cheese."
+ icon_state = "nucleardisk"
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 9cb69da31c9..6fdd489184f 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -385,20 +385,6 @@
limit = 3
category = "Assistance"
-/datum/spellbook_entry/item/hadesstone
- name = "Dark Seed"
- desc = "A small, dark stone that whispers to you menacingly.\
- The seed calls for the corpses of living beings,\
- in order to summon an ancient, powerful being.\
- The power and tenacity of the summoned being directly\
- correlates to the power of the absorbed beings,\
- so choose your targets wisely."
- item_path = /obj/item/hades_summoner
- cost = 2
- log_name = "DS"
- limit = 1
- category = "Assistance"
-
/datum/spellbook_entry/item/mjolnir
name = "Mjolnir"
desc = "A mighty hammer on loan from Thor, God of Thunder. It crackles with barely contained power."
@@ -514,6 +500,7 @@
throw_speed = 2
throw_range = 5
w_class = 1
+ persistence_replacement = /obj/item/weapon/spellbook/oneuse/random
var/uses = 10
var/temp = null
var/tab = null
@@ -704,6 +691,7 @@
name = "spellbook of "
uses = 1
desc = "This template spellbook was never meant for the eyes of man..."
+ persistence_replacement = null
/obj/item/weapon/spellbook/oneuse/New()
..()
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 577c4cd0b2f..2e26c95e67f 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -135,7 +135,7 @@
data["occupant"]["stat"] = occupant.stat
data["occupant"]["health"] = occupant.health
data["occupant"]["maxHealth"] = occupant.maxHealth
- data["occupant"]["minHealth"] = config.health_threshold_dead
+ data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD
data["occupant"]["bruteLoss"] = occupant.getBruteLoss()
data["occupant"]["oxyLoss"] = occupant.getOxyLoss()
data["occupant"]["toxLoss"] = occupant.getToxLoss()
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 126ac66f42f..2da658b0a0a 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -182,8 +182,8 @@
icon_state = "pod_1"
//Get the clone body ready
- H.adjustCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health
- H.adjustBrainLoss(CLONE_INITIAL_DAMAGE)
+ H.setCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health
+ H.setBrainLoss(CLONE_INITIAL_DAMAGE)
H.Paralyse(4)
if(grab_ghost_when == CLONER_FRESH_CLONE)
@@ -231,10 +231,10 @@
occupant.Paralyse(4)
//Slowly get that clone healed and finished.
- occupant.adjustCloneLoss(-((speed_coeff/2)))
+ occupant.adjustCloneLoss(-((speed_coeff/2) * config.damage_multiplier))
//Premature clones may have brain damage.
- occupant.adjustBrainLoss(-((speed_coeff/2)))
+ occupant.adjustBrainLoss(-((speed_coeff/2) * config.damage_multiplier))
//So clones don't die of oxyloss in a running pod.
if (occupant.reagents.get_reagent_amount("salbutamol") < 30)
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index 8a1ae3a9378..6a405fcd1fb 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -21,9 +21,18 @@ The console is located at computer/gulag_teleporter.dm
var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner
var/shoes_type = /obj/item/clothing/shoes/sneakers/orange
var/obj/machinery/gulag_item_reclaimer/linked_reclaimer = null
+ var/list/required_items
/obj/machinery/gulag_teleporter/New()
..()
+ required_items = typecacheof(list(
+ /obj/item/weapon/implant,
+ /obj/item/clothing/suit/space/eva/plasmaman,
+ /obj/item/clothing/under/plasmaman,
+ /obj/item/clothing/head/helmet/space/plasmaman,
+ /obj/item/weapon/tank/internals,
+ /obj/item/clothing/mask/breath,
+ /obj/item/clothing/mask/gas))
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/gulag_teleporter(null)
B.apply_default_parts(src)
addtimer(src, "locate_reclaimer", 5)
@@ -128,12 +137,10 @@ The console is located at computer/gulag_teleporter.dm
if(linked_reclaimer)
linked_reclaimer.stored_items[occupant] = list()
for(var/obj/item/W in occupant)
- if(occupant.unEquip(W))
+ if(!is_type_in_typecache(W, required_items) && occupant.unEquip(W))
if(istype(W, /obj/item/weapon/restraints/handcuffs))
W.forceMove(get_turf(src))
continue
- if(istype(W, /obj/item/weapon/implant/storage))
- continue
if(linked_reclaimer)
linked_reclaimer.stored_items[occupant] += W
linked_reclaimer.contents += W
@@ -146,7 +153,7 @@ The console is located at computer/gulag_teleporter.dm
return
strip_occupant()
var/mob/living/carbon/human/prisoner = occupant
- if(jumpsuit_type)
+ if(!isplasmaman(prisoner) && jumpsuit_type)
prisoner.equip_to_appropriate_slot(new jumpsuit_type)
if(shoes_type)
prisoner.equip_to_appropriate_slot(new shoes_type)
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index aeb4f25d6da..7ef5fffb1dd 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -354,7 +354,7 @@
return 1
/obj/item/weapon/twohanded/shockpaddles/attack(mob/M, mob/user)
- var/halfwaycritdeath = (config.health_threshold_crit + config.health_threshold_dead) / 2
+ var/halfwaycritdeath = (HEALTH_THRESHOLD_CRIT + HEALTH_THRESHOLD_DEAD) / 2
if(busy)
return
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 46afc8fb8f5..100589b763d 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -28,7 +28,18 @@
/obj/item/weapon/implanter/uplink
name = "implanter (uplink)"
+ persistence_replacement = /obj/item/weapon/implanter/weakuplink
/obj/item/weapon/implanter/uplink/New()
imp = new /obj/item/weapon/implant/uplink(src)
..()
+/obj/item/weapon/implanter/weakuplink
+ name = "implanter (uplink)"
+
+/obj/item/weapon/implanter/weakuplink/New()
+ imp = new /obj/item/weapon/implant/uplink/weak(src)
+ ..()
+
+/obj/item/weapon/implant/uplink/weak/New()
+ ..()
+ hidden_uplink.telecrystals = 5
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index e6be87025cb..f2ecf076bae 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -288,6 +288,7 @@
..()
PoolOrNew(/obj/item/stack/tile/plasteel, src)
new /obj/item/weapon/crowbar(src)
+ SSpersistence.new_secret_satchels += src
/obj/item/weapon/storage/backpack/satchel/flat/secret/
var/list/reward_one_of_these = list() //Intended for map editing
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 6cc9ed804c4..33d9c480f41 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -18,6 +18,8 @@
var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart?
var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created.
+ var/persistence_replacement = null //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset.
+
/obj/New()
..()
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index 399253f5a17..d9454083422 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -16,8 +16,6 @@
/obj/structure/lattice/New()
..()
- if(!(istype(src.loc, /turf/open/space)))
- qdel(src)
for(var/obj/structure/lattice/LAT in src.loc)
if(LAT != src)
qdel(LAT)
diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm
index 82f62503c32..02f585a502f 100644
--- a/code/modules/admin/DB_ban/functions.dm
+++ b/code/modules/admin/DB_ban/functions.dm
@@ -36,10 +36,6 @@
if(BANTYPE_JOB_TEMP)
bantype_str = "JOB_TEMPBAN"
bantype_pass = 1
- if(BANTYPE_APPEARANCE)
- bantype_str = "APPEARANCE_PERMABAN"
- duration = -1
- bantype_pass = 1
if(BANTYPE_ADMIN_PERMA)
bantype_str = "ADMIN_PERMABAN"
duration = -1
@@ -160,9 +156,6 @@
if(BANTYPE_JOB_TEMP)
bantype_str = "JOB_TEMPBAN"
bantype_pass = 1
- if(BANTYPE_APPEARANCE)
- bantype_str = "APPEARANCE_PERMABAN"
- bantype_pass = 1
if(BANTYPE_ADMIN_PERMA)
bantype_str = "ADMIN_PERMABAN"
bantype_pass = 1
@@ -361,7 +354,6 @@
output += ""
output += ""
output += ""
- output += ""
output += ""
output += ""
output += ""
@@ -453,8 +445,6 @@
typedesc = "JOBBAN
([job])"
if("JOB_TEMPBAN")
typedesc = "TEMP JOBBAN
([job])
([duration] minutes [(unbanned) ? "" : "(Edit))"]
Expires [expiration]"
- if("APPEARANCE_PERMABAN")
- typedesc = "IDENTITY PERMABAN"
if("ADMIN_PERMABAN")
typedesc = "ADMIN PERMABAN"
if("ADMIN_TEMPBAN")
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 4c844c89ac1..7a9918b9cdc 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -525,16 +525,30 @@ var/list/admin_verbs_hideable = list(
var/obj/effect/proc_holder/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spell_list
if(!S)
return
- S = spell_list[S]
+
feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].")
message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].")
+
+ S = spell_list[S]
if(T.mind)
T.mind.AddSpell(new S)
else
T.AddSpell(new S)
message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!")
+/client/proc/remove_spell(mob/T in mob_list)
+ set category = "Fun"
+ set name = "Remove Spell"
+ set desc = "Remove a spell from the selected mob."
+
+ if(T && T.mind)
+ var/obj/effect/proc_holder/spell/S = input("Choose the spell to remove", "NO ABRAKADABRA") as null|anything in T.mind.spell_list
+ if(S)
+ T.mind.RemoveSpell(S)
+ log_admin("[key_name(usr)] removed the spell [S] from [key_name(T)].")
+ message_admins("[key_name_admin(usr)] removed the spell [S] from [key_name(T)].")
+ feedback_add_details("admin_verb","RS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/give_disease(mob/T in mob_list)
set category = "Fun"
diff --git a/code/modules/admin/banappearance.dm b/code/modules/admin/banappearance.dm
deleted file mode 100644
index 1fabfcc5b03..00000000000
--- a/code/modules/admin/banappearance.dm
+++ /dev/null
@@ -1,110 +0,0 @@
-//ban people from using custom names and appearances. that'll show 'em.
-
-var/appearanceban_runonce //Updates legacy bans with new info
-var/appearance_keylist[0] //to store the keys
-
-/proc/appearance_fullban(mob/M, reason)
- if (!M || !M.key) return
- appearance_keylist.Add(text("[M.ckey] ## [reason]"))
- appearance_savebanfile()
-
-/proc/appearance_client_fullban(ckey)
- if (!ckey) return
- appearance_keylist.Add(text("[ckey]"))
- appearance_savebanfile()
-
-//returns a reason if M is banned, returns 0 otherwise
-/proc/appearance_isbanned(mob/M)
- if(M)
- for(var/s in appearance_keylist)
- if(findtext(s, "[M.ckey]") == 1)
- var/startpos = findtext(s, "## ") + 3
- if(startpos && startpos < length(s))
- var/text = copytext(s, startpos, 0)
- if(text)
- return text
- return "Reason Unspecified"
- return 0
-
-/*
-DEBUG
-/mob/verb/list_all_appearances()
- set name = "list all appearances"
-
- for(var/s in appearance_keylist)
- world << s
-
-/mob/verb/reload_appearances()
- set name = "reload appearances"
-
- appearance_loadbanfile()
-*/
-
-/proc/appearance_loadbanfile()
- if(config.ban_legacy_system)
- var/savefile/S=new("data/appearance_full.ban")
- S["keys[0]"] >> appearance_keylist
- log_admin("Loading appearance_rank")
- S["runonce"] >> appearanceban_runonce
-
- if (!length(appearance_keylist))
- appearance_keylist=list()
- log_admin("appearance_keylist was empty")
- else
- if(!establish_db_connection())
- world.log << "Database connection failed. Reverting to the legacy ban system."
- diary << "Database connection failed. Reverting to the legacy ban system."
- config.ban_legacy_system = 1
- appearance_loadbanfile()
- return
-
- //appearance bans
- var/DBQuery/query = dbcon.NewQuery("SELECT ckey FROM [format_table_name("ban")] WHERE bantype = 'APPEARANCE_PERMABAN' AND NOT unbanned = 1")
- query.Execute()
-
- while(query.NextRow())
- var/ckey = query.item[1]
-
- appearance_keylist.Add("[ckey]")
-
-/proc/appearance_savebanfile()
- var/savefile/S=new("data/appearance_full.ban")
- S["keys[0]"] << appearance_keylist
-
-/proc/appearance_unban(mob/M)
- appearance_remove("[M.ckey]")
- appearance_savebanfile()
-
-
-/proc/appearance_updatelegacybans()
- if(!appearanceban_runonce)
- log_admin("Updating appearancefile!")
- // Updates bans.. Or fixes them. Either way.
- for(var/T in appearance_keylist)
- if(!T)
- continue
- appearanceban_runonce++ //don't run this update again
-
-
-/proc/appearance_remove(X)
- for (var/i = 1; i <= length(appearance_keylist); i++)
- if( findtext(appearance_keylist[i], "[X]") )
- appearance_keylist.Remove(appearance_keylist[i])
- appearance_savebanfile()
- return 1
- return 0
-
-/*
-/proc/DB_ban_isappearancebanned(var/playerckey)
- establish_db_connection()
- if(!dbcon.IsConnected())
- return
-
- var/sqlplayerckey = sanitizeSQL(ckey(playerckey))
-
- var/DBQuery/query = dbcon.NewQuery("SELECT id FROM [format_table_name("ban")] WHERE CKEY = '[sqlplayerckey]' AND ((bantype = 'APPEARANCE_PERMABAN') OR (bantype = 'APPEARANCE_TEMPBAN' AND expiration_time > Now())) AND unbanned != 1")
- query.Execute()
- while(query.NextRow())
- return 1
- return 0
-*/
\ No newline at end of file
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 0ce650090d9..07da6355d06 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -346,7 +346,7 @@
for(var/datum/mind/N in ticker.mode.syndicates)
var/mob/M = N.current
if(M)
- dat += "[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
else
@@ -375,20 +375,20 @@
dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
else
- dat += "[N.name]([N.key])Head Revolutionary body destroyed! "
dat += "PM [M.real_name] (Leader)[M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
for(var/datum/mind/N in ticker.mode.revolutionaries)
var/mob/M = N.current
if(M)
- dat += "[M.real_name] (Leader)[M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW
"
@@ -421,7 +421,7 @@
for(var/datum/mind/changeling in ticker.mode.changelings)
var/mob/M = changeling.current
if(M)
- dat += " "
for(var/datum/mind/N in ticker.mode.get_living_heads())
var/mob/M = N.current
if(M)
- dat += "Target(s) Location [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
var/turf/mob_loc = get_turf(M)
@@ -406,13 +406,13 @@
dat += " "
else
- dat += "[N.name]([N.key])Gang Boss body destroyed! "
dat += "PM [M.real_name] (Boss)[M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
for(var/datum/mind/N in G.gangsters)
var/mob/M = N.current
if(M)
- dat += "[M.real_name] (Boss)[M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM [M.mind.changeling.changelingID] as [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
@@ -435,7 +435,7 @@
for(var/datum/mind/wizard in ticker.mode.wizards)
var/mob/M = wizard.current
if(M)
- dat += "[M.mind.changeling.changelingID] as [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
dat += "Show Objective [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
@@ -449,7 +449,7 @@
for(var/datum/mind/apprentice in ticker.mode.apprentices)
var/mob/M = apprentice.current
if(M)
- dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
dat += "Show Objective [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
@@ -463,7 +463,7 @@
for(var/datum/mind/N in ticker.mode.cult)
var/mob/M = N.current
if(M)
- dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
dat += "Show Objective [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += ""
@@ -483,7 +483,7 @@
for(var/datum/mind/N in ticker.mode.red_deities)
var/mob/M = N.current
if(M)
- dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW Red Deity: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += ""
@@ -493,7 +493,7 @@
for(var/datum/mind/N in ticker.mode.blue_deities)
var/mob/M = N.current
if(M)
- dat += "Red Deity: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW Blue Deity: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += ""
@@ -503,7 +503,7 @@
for(var/datum/mind/N in ticker.mode.red_deity_prophets)
var/mob/M = N.current
if(M)
- dat += "Blue Deity: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW Red Deity Prophet: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += ""
@@ -513,7 +513,7 @@
for(var/datum/mind/N in ticker.mode.blue_deity_prophets)
var/mob/M = N.current
if(M)
- dat += "Red Deity Prophet: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW Blue Deity Prophet: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += ""
@@ -523,7 +523,7 @@
for(var/datum/mind/N in ticker.mode.red_deity_followers)
var/mob/M = N.current
if(M)
- dat += "Blue Deity Prophet: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW Red Deity Followers: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += ""
@@ -533,7 +533,7 @@
for(var/datum/mind/N in ticker.mode.blue_deity_followers)
var/mob/M = N.current
if(M)
- dat += "Red Deity Followers: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW Blue Deity Followers: [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += ""
@@ -543,7 +543,7 @@
for(var/datum/mind/traitor in ticker.mode.traitors)
var/mob/M = traitor.current
if(M)
- dat += "Blue Deity Followers: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
@@ -557,7 +557,7 @@
for(var/datum/mind/abductor in ticker.mode.abductors)
var/mob/M = abductor.current
if(M)
- dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
dat += "Show Objective [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
@@ -570,7 +570,7 @@
for(var/datum/mind/abductee in E.abductee_minds)
var/mob/M = abductee.current
if(M)
- dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
dat += "Show Objective [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
@@ -585,7 +585,7 @@
var/datum/mind/devil = X
var/mob/M = devil.current
if(M)
- dat += "[M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "FLW "
dat += "Show Objective [M.real_name] : [devil.devilinfo.truename][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] "
+ dat += " "
dat += "[M.real_name] : [devil.devilinfo.truename][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] "
dat += "PM "
dat += "Show Objective
| "
- if(appearance_isbanned(user))
+ if(jobban_isbanned(user, "appearance"))
dat += "You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game. " dat += "Random Name " dat += "Always Random Name: [be_random_name ? "Yes" : "No"] " diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 5719a095b1c..071314025e0 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -558,6 +558,8 @@ setting = FALSE return + var/area/A = get_area(T) + var/obj/docking_port/stationary/landing_zone = new /obj/docking_port/stationary(T) landing_zone.id = "colony_drop(\ref[src])" landing_zone.name = "Landing Zone" @@ -566,6 +568,8 @@ landing_zone.width = width landing_zone.height = height landing_zone.setDir(lz_dir) + landing_zone.turf_type = T.baseturf + landing_zone.area_type = A.type for(var/obj/machinery/computer/shuttle/S in machines) if(S.shuttleId == shuttle_id) @@ -637,6 +641,9 @@ for(var/S in SSshuttle.stationary) var/obj/docking_port/stationary/SM = S //SM is declared outside so it can be checked for null if(SM.id == "mining_home" || SM.id == "mining_away") + + var/area/A = get_area(landing_spot) + Mport = new(landing_spot) Mport.id = "landing_zone_dock" Mport.name = "landing zone dock" @@ -645,6 +652,9 @@ Mport.width = SM.width Mport.height = SM.height Mport.setDir(dir) + Mport.turf_type = landing_spot.baseturf + Mport.area_type = A.type + break if(!Mport) user << "This station is not equipped with an approprite mining shuttle. Please contact Nanotrasen Support." diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 533e4bc3a5f..b6ea4447421 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -6,18 +6,6 @@ log_say("Ghost/[src.key] : [message]") - if(jobban_isbanned(src, "OOC")) - src << "You have been banned from deadchat." - return - - if (src.client) - if(src.client.prefs.muted & MUTE_DEADCHAT) - src << "You cannot talk in deadchat (muted)." - return - - if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT)) - return - . = src.say_dead(message) /mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index d63654ce9e7..0f4de4b6890 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -20,7 +20,7 @@ if(health<= -maxHealth || !getorgan(/obj/item/organ/brain)) death() return - if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= config.health_threshold_crit) + if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT) if(stat == CONSCIOUS) stat = UNCONSCIOUS blind_eyes(1) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index a8c82a97520..a089a58bd77 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -56,7 +56,7 @@ /mob/living/carbon/brain/can_be_revived() . = 1 - if(!container || health <= config.health_threshold_dead) + if(!container || health <= HEALTH_THRESHOLD_DEAD) return 0 /mob/living/carbon/brain/update_sight() diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 6b6ba71043a..e5e7d511fc0 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -68,7 +68,7 @@ if(brainmob) if(brainmob.client) - if(brainmob.health <= config.health_threshold_dead) + if(brainmob.health <= HEALTH_THRESHOLD_DEAD) user << "It's lifeless and severely damaged." else user << "You can feel the small spark of life still left in this one." diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index dc05ef62dbb..75f731b6e69 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -22,7 +22,7 @@ /mob/living/carbon/brain/update_stat() if(status_flags & GODMODE) return - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD) if(stat != DEAD) death() var/obj/item/organ/brain/BR diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 15193870032..9d30f85a661 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -634,7 +634,7 @@ if(!client) return - if(stat == UNCONSCIOUS && health <= config.health_threshold_crit) + if(stat == UNCONSCIOUS && health <= HEALTH_THRESHOLD_CRIT) var/severity = 0 switch(health) if(-20 to -10) severity = 1 @@ -712,10 +712,10 @@ if(status_flags & GODMODE) return if(stat != DEAD) - if(health<= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) + if(health<= HEALTH_THRESHOLD_DEAD || !getorgan(/obj/item/organ/brain)) death() return - if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= config.health_threshold_crit) + if(paralysis || sleeping || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT) if(stat == CONSCIOUS) stat = UNCONSCIOUS blind_eyes(1) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 029b628ca26..41f2caab2dc 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -837,7 +837,7 @@ var/they_breathe = (!(NOBREATH in C.dna.species.specflags)) var/they_lung = C.getorganslot("lungs") - if(C.health > config.health_threshold_crit) + if(C.health > HEALTH_THRESHOLD_CRIT) return src.visible_message("[src] performs CPR on [C.name]!", "You perform CPR on [C.name].") diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index da3204f6b0e..c218fbb8445 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -10,7 +10,7 @@ total_burn += BP.burn_dam health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute update_stat() - if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD ) + if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD ) ChangeToHusk() if(on_fire) shred_clothing() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index fea4409a2f0..4b25bca1238 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -113,7 +113,7 @@ return 1//Humans can use guns and such /mob/living/carbon/human/InCritical() - return (health <= config.health_threshold_crit && stat == UNCONSCIOUS) + return (health <= HEALTH_THRESHOLD_CRIT && stat == UNCONSCIOUS) /mob/living/carbon/human/reagent_check(datum/reagent/R) return dna.species.handle_chemicals(R,src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 9184a5aca1a..88455c18f79 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -479,7 +479,7 @@ H.losebreath = 0 var/takes_crit_damage = (!(NOCRITDAMAGE in specflags)) - if((H.health < config.health_threshold_crit) && takes_crit_damage) + if((H.health < HEALTH_THRESHOLD_CRIT) && takes_crit_damage) H.adjustBruteLoss(1) /datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H) @@ -1169,7 +1169,7 @@ if(!breath || (breath.total_moles() == 0) || !lungs) if(H.reagents.has_reagent("epinephrine") && lungs) return - if(H.health >= config.health_threshold_crit) + if(H.health >= HEALTH_THRESHOLD_CRIT) H.adjustOxyLoss(HUMAN_MAX_OXYLOSS) if(!lungs) H.adjustOxyLoss(1) @@ -1329,7 +1329,7 @@ if(!H || !safe_breath_min) //the other args are either: Ok being 0 or Specifically handled. return 0 - if(!(NOBREATH in specflags) || (H.health <= config.health_threshold_crit)) + if(!(NOBREATH in specflags) || (H.health <= HEALTH_THRESHOLD_CRIT)) if(prob(20)) H.emote("gasp") if(breath_pp > 0) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 4b4d0b45142..181d5dee7f3 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -37,7 +37,7 @@ // If whispering your last words, limit the whisper based on how close you are to death. if(critical) - var/health_diff = round(-config.health_threshold_dead + health) + var/health_diff = round(-HEALTH_THRESHOLD_DEAD + health) // If we cut our message short, abruptly end it with a-.. var/message_len = length(message) message = copytext(message, 1, health_diff) + "[message_len > health_diff ? "-.." : "..."]" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 4b075b81d06..bc6497ce7cd 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -48,7 +48,7 @@ var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) + if(health <= HEALTH_THRESHOLD_CRIT || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) losebreath++ //Suffocate @@ -311,7 +311,7 @@ if(sleeping) handle_dreams() AdjustSleeping(-1) - if(prob(10) && health>config.health_threshold_crit) + if(prob(10) && health>HEALTH_THRESHOLD_CRIT) emote("snore") var/restingpwr = 1 + 4 * resting diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 8208c2d3bea..5c93339314e 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,13 +1,3 @@ -/* I am informed this was added by Giacom to reduce mob-stacking in escape pods. -It's sorta problematic atm due to the shuttle changes I am trying to do -Sorry Giacom. Please don't be mad :( -/mob/living/Life() - ..() - var/area/A = get_area(loc) - if(A && A.push_dir) - push_mob_back(src, A.push_dir) -*/ - /mob/living/New() . = ..() generateStaticOverlay() @@ -216,7 +206,7 @@ Sorry Giacom. Please don't be mad :( set hidden = 1 if (InCritical()) src.attack_log += "[src] has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!" - src.adjustOxyLoss(src.health - config.health_threshold_dead) + src.adjustOxyLoss(src.health - HEALTH_THRESHOLD_DEAD) updatehealth() if(!whispered) src << "You have given up life and succumbed to death." @@ -272,7 +262,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustBruteLoss(amount, updating_health=1) if(status_flags & GODMODE) return 0 - bruteloss = Clamp(bruteloss + amount, 0, maxHealth*2) + bruteloss = Clamp((bruteloss + (amount * config.damage_multiplier)), 0, maxHealth*2) if(updating_health) updatehealth() @@ -282,7 +272,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustOxyLoss(amount, updating_health=1) if(status_flags & GODMODE) return 0 - oxyloss = Clamp(oxyloss + amount, 0, maxHealth*2) + oxyloss = Clamp((oxyloss + (amount * config.damage_multiplier)), 0, maxHealth*2) if(updating_health) updatehealth() @@ -299,7 +289,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustToxLoss(amount, updating_health=1) if(status_flags & GODMODE) return 0 - toxloss = Clamp(toxloss + amount, 0, maxHealth*2) + toxloss = Clamp((toxloss + (amount * config.damage_multiplier)), 0, maxHealth*2) if(updating_health) updatehealth() return amount @@ -317,7 +307,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustFireLoss(amount, updating_health=1) if(status_flags & GODMODE) return 0 - fireloss = Clamp(fireloss + amount, 0, maxHealth*2) + fireloss = Clamp((fireloss + (amount * config.damage_multiplier)), 0, maxHealth*2) if(updating_health) updatehealth() @@ -327,7 +317,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustCloneLoss(amount, updating_health=1) if(status_flags & GODMODE) return 0 - cloneloss = Clamp(cloneloss + amount, 0, maxHealth*2) + cloneloss = Clamp((cloneloss + (amount * config.damage_multiplier)), 0, maxHealth*2) if(updating_health) updatehealth() @@ -344,7 +334,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/adjustBrainLoss(amount) if(status_flags & GODMODE) return 0 - brainloss = Clamp(brainloss + amount, 0, maxHealth*2) + brainloss = Clamp((brainloss + (amount * config.damage_multiplier)), 0, maxHealth*2) /mob/living/proc/setBrainLoss(amount) if(status_flags & GODMODE) @@ -541,7 +531,7 @@ Sorry Giacom. Please don't be mad :( //proc called by revive(), to check if we can actually ressuscitate the mob (we don't want to revive him and have him instantly die again) /mob/living/proc/can_be_revived() . = 1 - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD) return 0 /mob/living/proc/update_damage_overlays() @@ -1026,7 +1016,7 @@ Sorry Giacom. Please don't be mad :( /mob/living/carbon/human/update_stamina() if(staminaloss) var/total_health = (health - staminaloss) - if(total_health <= config.health_threshold_crit && !stat) + if(total_health <= HEALTH_THRESHOLD_CRIT && !stat) src << "You're too exhausted to keep going..." Weaken(5) setStaminaLoss(health - 2) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index d24a997edaf..946f2e04900 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -60,7 +60,7 @@ if(status_flags & GODMODE) return if(stat != DEAD) - if(health <= config.health_threshold_dead) + if(health <= HEALTH_THRESHOLD_DEAD) death() return else if(stat == UNCONSCIOUS) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index c4253391ec3..a10829bc0ae 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -152,7 +152,7 @@ var/global/list/parasites = list() //all currently existing/living guardians if(summoner) var/resulthealth if(iscarbon(summoner)) - resulthealth = round((abs(config.health_threshold_dead - summoner.health) / abs(config.health_threshold_dead - summoner.maxHealth)) * 100) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100) else resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5) stat(null, "Summoner Health: [resulthealth]%") @@ -197,7 +197,7 @@ var/global/list/parasites = list() //all currently existing/living guardians if(summoner && hud_used && hud_used.healths) var/resulthealth if(iscarbon(summoner)) - resulthealth = round((abs(config.health_threshold_dead - summoner.health) / abs(config.health_threshold_dead - summoner.maxHealth)) * 100) + resulthealth = round((abs(HEALTH_THRESHOLD_DEAD - summoner.health) / abs(HEALTH_THRESHOLD_DEAD - summoner.maxHealth)) * 100) else resulthealth = round((summoner.health / summoner.maxHealth) * 100, 0.5) hud_used.healths.maptext = " [resulthealth]% "
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 1d4657681d8..3bd798886b1 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -83,26 +83,21 @@
//////////////HOSTILE MOB TARGETTING AND AGGRESSION////////////
-
/mob/living/simple_animal/hostile/proc/ListTargets()//Step 1, find out what we can see
. = list()
if(!search_objects)
var/list/Mobs = hearers(vision_range, targets_from) - src //Remove self, so we don't suicide
. += Mobs
- var/hostile_machines = list()
- for(var/mecha in mechas_list)
- hostile_machines += mecha
- for(var/obj/machinery/porta_turret/P in machines)
- hostile_machines += P
- for(var/M in hostile_machines)
- if(get_dist(M, targets_from) <= vision_range && can_see(targets_from, M, vision_range))
- . += M
+ var/static/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/mecha))
+
+ for(var/HM in typecache_filter_list(range(vision_range, targets_from), hostile_machines))
+ if(can_see(targets_from, HM, vision_range))
+ . += HM
else
var/list/Objects = oview(vision_range, targets_from)
. += Objects
-
/mob/living/simple_animal/hostile/proc/FindTarget(var/list/possible_targets, var/HasTargetsList = 0)//Step 2, filter down possible targets to things we actually care about
. = list()
if(!HasTargetsList)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index abc97e1c958..2966bb0e964 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -290,23 +290,23 @@
/mob/living/simple_animal/adjustBruteLoss(amount)
if(damage_coeff[BRUTE])
- . = adjustHealth(amount*damage_coeff[BRUTE])
+ . = adjustHealth(amount * damage_coeff[BRUTE] * config.damage_multiplier)
/mob/living/simple_animal/adjustFireLoss(amount)
if(damage_coeff[BURN])
- . = adjustHealth(amount*damage_coeff[BURN])
+ . = adjustHealth(amount * damage_coeff[BURN] * config.damage_multiplier)
/mob/living/simple_animal/adjustOxyLoss(amount)
if(damage_coeff[OXY])
- . = adjustHealth(amount*damage_coeff[OXY])
+ . = adjustHealth(amount * damage_coeff[OXY] * config.damage_multiplier)
/mob/living/simple_animal/adjustToxLoss(amount)
if(damage_coeff[TOX])
- . = adjustHealth(amount*damage_coeff[TOX])
+ . = adjustHealth(amount * damage_coeff[TOX] * config.damage_multiplier)
/mob/living/simple_animal/adjustCloneLoss(amount)
if(damage_coeff[CLONE])
- . = adjustHealth(amount*damage_coeff[CLONE])
+ . = adjustHealth(amount * damage_coeff[CLONE] * config.damage_multiplier)
/mob/living/simple_animal/adjustStaminaLoss(amount)
return
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index 367fcbb6a35..a4cf1c4a7bb 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -234,7 +234,7 @@
Feedstop(0, 0)
return
- add_nutrition(rand(7,15))
+ add_nutrition((rand(7,15) * config.damage_multiplier))
//Heal yourself.
adjustBruteLoss(-3)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 565e30cdc23..e55f2be543d 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -419,7 +419,7 @@
var/mob/living/carbon/human/new_character = new(loc)
- if(config.force_random_names || appearance_isbanned(src))
+ if(config.force_random_names || jobban_isbanned(src, "appearance"))
client.prefs.random_character()
client.prefs.real_name = client.prefs.pref_species.random_name(gender,1)
client.prefs.copy_to(new_character)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 997dc6a527e..e7ceb3e1eef 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -35,6 +35,18 @@
usr << "Speech is currently admin-disabled."
return
+ if(jobban_isbanned(src, "OOC"))
+ src << "You have been banned from deadchat."
+ return
+
+ if (src.client)
+ if(src.client.prefs.muted & MUTE_DEADCHAT)
+ src << "You cannot talk in deadchat (muted)."
+ return
+
+ if(src.client.handle_spam_prevention(message,MUTE_DEADCHAT))
+ return
+
var/mob/dead/observer/O = src
if(isobserver(src) && O.deadchat_name)
name = "[O.deadchat_name]"
diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm
index 79a7c913c2e..5742faa9311 100644
--- a/code/modules/modular_computers/computers/machinery/modular_console.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_console.dm
@@ -13,7 +13,7 @@
base_idle_power_usage = 100
base_active_power_usage = 500
max_hardware_size = 3
- steel_sheet_cost = 20
+ steel_sheet_cost = 10
light_strength = 2
_max_damage = 300
_break_damage = 150
diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm
index ffaeaa3e441..770074ad0a1 100644
--- a/code/modules/projectiles/guns/medbeam.dm
+++ b/code/modules/projectiles/guns/medbeam.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/gun/medbeam
name = "Medical Beamgun"
- desc = "Delivers medical nanites in a focused beam."
+ desc = "Don't cross the streams!"
icon = 'icons/obj/chronos.dmi'
icon_state = "chronogun"
item_state = "chronogun"
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 09a02d973cf..42b001e1ddd 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -96,8 +96,8 @@
/obj/item/bodypart/proc/take_damage(brute, burn)
if(owner && (owner.status_flags & GODMODE))
return 0 //godmode
- brute = max(brute,0)
- burn = max(burn,0)
+ brute = max(brute * config.damage_multiplier,0)
+ burn = max(burn * config.damage_multiplier,0)
if(status == ORGAN_ROBOTIC) //This makes robolimbs not damageable by chems and makes it stronger
diff --git a/code/world.dm b/code/world.dm
index 83454220e28..06d8097d740 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -39,7 +39,6 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
load_admins()
if(config.usewhitelist)
load_whitelist()
- appearance_loadbanfile()
LoadBans()
investigate_reset()
@@ -169,6 +168,13 @@ var/last_irc_status = 0
else
return IrcPm(input["adminmsg"],input["msg"],input["sender"])
+ else if("namecheck" in input)
+ 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)
/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
diff --git a/config/config.txt b/config/config.txt
index 32b7a5549f7..46204abb1aa 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -172,6 +172,9 @@ 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.
+#SHOW_IRC_NAME
+
##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother.
TICKLAG 0.5
diff --git a/config/game_options.txt b/config/game_options.txt
index 798460b4c1b..9f7e778833d 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -1,11 +1,7 @@
### HEALTH ###
-# level of health at which a mob becomes unconscious (crit)
-HEALTH_THRESHOLD_CRIT 0
-
-# level of health at which a mob becomes dead
-HEALTH_THRESHOLD_DEAD -100
-
+#Damage multiplier, effects both weapons and healing on all mobs. For example, 1.25 would result in 25% higher damage.
+DAMAGE_MULTIPLIER 1
### REVIVAL ###
diff --git a/html/changelog.html b/html/changelog.html
index 84fd2470d95..7cefd0ea105 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,59 @@
-->
+
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index fec90c2c882..dd6496703ff 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -6680,3 +6680,48 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
key presses. Movements should now be ~25-50ms more responsive.
Shadowlight213:
- rscadd: Adds modular computers
+2016-08-21:
+ Ergovisavi:
+ - tweak: Consolidates the fulton packs into a single item and makes them more user
+ friendly
+ Google Play Store:
+ - spellcheck: Minor Text Fixes.
+ Incoming5643:
+ - rscadd: Smuggler satchels left behind hidden on the station can now reappear in
+ a later round.
+ - experiment: There's absolutely no way of knowing when exactly it will reappear
+ however...
+ - rscadd: Only one item in the satchel will remain when the satchel reappears.
+ - rscadd: Items are saved in their initial forms, so saving things like chemical
+ grenades will only disappoint you.
+ - rscadd: The item pool is map specific and needs to be a certain size before satchels
+ can start reappearing, so get to hiding that loot!
+ - rscadd: The staff of change has been expanded to turn you into even more things
+ that don't have hands.
+ Jalleo:
+ - bugfix: Gulag Teleporter of two issues any more please report them.
+ Jordie0608:
+ - rscadd: Advanced Energy Guns once again have a chance to irradiate you if EMPed.
+ Kor:
+ - rscadd: Kinetic Accelerators are now modular. You can find mod kits in the mining
+ vendor and in RnD.
+ - bugfix: Chaplain's dormant spellblade is no longer invisible.
+ Papa Bones:
+ - rscadd: A new, scandalous outfit is now available as contraband from the clothesmate
+ vendor, check it out! Fulfill your deep, dark fantasies.
+ Shadowlight213:
+ - tweak: Service and cargo have lost roundstart tablets and engineering has gained
+ them
+ - tweak: you can now charge battery modules in cell chargers. Use a screwdriver
+ on a computer to remove them. As a note, tablets and laptops can be charged
+ directly by placing them in a security charger.
+ WJohnston:
+ - rscadd: Metastation and Boxstation now boast auxillary mining construction rooms
+ in arrivals. These allow you to build a base and then launch it to wherever
+ you want on lavaland.
+ Wjohnston, Gun Hog:
+ - rscadd: Aliens with Neurotoxic Spit readied will now have drooling animations.
+ - rscadd: Hunters may now safely leap over lava.
+ - tweak: Hulk punches no longer stun Xenos.
+ - tweak: Alien evolve and promotion buttons updated to current Xeno sprites
+ - bugfix: Handcuff sprites for Xenos now show properly.
diff --git a/html/changelogs/AutoChangeLog-pr-19892.yml b/html/changelogs/AutoChangeLog-pr-19892.yml
deleted file mode 100644
index f688c20db62..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19892.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "WJohnston"
-delete-after: True
-changes:
- - rscadd: "Metastation and Boxstation now boast auxillary mining construction rooms in arrivals. These allow you to build a base and then launch it to wherever you want on lavaland."
diff --git a/html/changelogs/AutoChangeLog-pr-19915.yml b/html/changelogs/AutoChangeLog-pr-19915.yml
deleted file mode 100644
index 66a03dafb41..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19915.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Jordie0608"
-delete-after: True
-changes:
- - rscadd: "Advanced Energy Guns once again have a chance to irradiate you if EMPed."
diff --git a/html/changelogs/AutoChangeLog-pr-19918.yml b/html/changelogs/AutoChangeLog-pr-19918.yml
deleted file mode 100644
index 8c87ca947a2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19918.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: "Wjohnston, Gun Hog"
-delete-after: True
-changes:
- - rscadd: "Aliens with Neurotoxic Spit readied will now have drooling animations."
- - rscadd: "Hunters may now safely leap over lava."
- - tweak: "Hulk punches no longer stun Xenos."
- - tweak: "Alien evolve and promotion buttons updated to current Xeno sprites"
- - bugfix: "Handcuff sprites for Xenos now show properly."
diff --git a/html/changelogs/AutoChangeLog-pr-19925.yml b/html/changelogs/AutoChangeLog-pr-19925.yml
deleted file mode 100644
index 66367295a45..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19925.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Incoming5643"
-delete-after: True
-changes:
- - rscadd: "The staff of change has been expanded to turn you into even more things that don't have hands."
diff --git a/html/changelogs/AutoChangeLog-pr-19926.yml b/html/changelogs/AutoChangeLog-pr-19926.yml
deleted file mode 100644
index efeadd255a8..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19926.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Google Play Store"
-delete-after: True
-changes:
- - spellcheck: "Minor Text Fixes."
diff --git a/html/changelogs/AutoChangeLog-pr-19928.yml b/html/changelogs/AutoChangeLog-pr-19928.yml
deleted file mode 100644
index 23a498956ae..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19928.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Shadowlight213"
-delete-after: True
-changes:
- - tweak: "Service and cargo have lost roundstart tablets and engineering has gained them"
- - tweak: "you can now charge battery modules in cell chargers. Use a screwdriver on a computer to remove them. As a note, tablets and laptops can be charged directly by placing them in a security charger."
diff --git a/html/changelogs/AutoChangeLog-pr-19930.yml b/html/changelogs/AutoChangeLog-pr-19930.yml
deleted file mode 100644
index adfa06a01d9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19930.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Papa Bones"
-delete-after: True
-changes:
- - rscadd: "A new, scandalous outfit is now available as contraband from the clothesmate vendor, check it out! Fulfill your deep, dark fantasies."
diff --git a/html/changelogs/AutoChangeLog-pr-19942.yml b/html/changelogs/AutoChangeLog-pr-19942.yml
deleted file mode 100644
index c69b673d62b..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19942.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kor"
-delete-after: True
-changes:
- - rscadd: "Kinetic Accelerators are now modular. You can find mod kits in the mining vendor and in RnD."
diff --git a/html/changelogs/AutoChangeLog-pr-19944.yml b/html/changelogs/AutoChangeLog-pr-19944.yml
deleted file mode 100644
index 23ce404728d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19944.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ergovisavi"
-delete-after: True
-changes:
- - tweak: "Consolidates the fulton packs into a single item and makes them more user friendly"
diff --git a/html/changelogs/AutoChangeLog-pr-19949.yml b/html/changelogs/AutoChangeLog-pr-19949.yml
deleted file mode 100644
index 6962b8ac4fb..00000000000
--- a/html/changelogs/AutoChangeLog-pr-19949.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Kor"
-delete-after: True
-changes:
- - bugfix: "Chaplain's dormant spellblade is no longer invisible."
diff --git a/tgstation.dme b/tgstation.dme
index 7b792308873..093ed54235b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -152,6 +152,7 @@
#include "code\controllers\subsystem\npcpool.dm"
#include "code\controllers\subsystem\objects.dm"
#include "code\controllers\subsystem\pai.dm"
+#include "code\controllers\subsystem\persistence.dm"
#include "code\controllers\subsystem\pool.dm"
#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\server_maintenance.dm"
@@ -378,8 +379,6 @@
#include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm"
#include "code\game\gamemodes\miniantags\bot_swarm\swarmer.dm"
#include "code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
-#include "code\game\gamemodes\miniantags\hades\hades.dm"
-#include "code\game\gamemodes\miniantags\hades\hades_chapel.dm"
#include "code\game\gamemodes\miniantags\monkey\monkey.dm"
#include "code\game\gamemodes\miniantags\morph\morph.dm"
#include "code\game\gamemodes\miniantags\revenant\revenant.dm"
@@ -840,7 +839,6 @@
#include "code\modules\admin\admin_memo.dm"
#include "code\modules\admin\admin_ranks.dm"
#include "code\modules\admin\admin_verbs.dm"
-#include "code\modules\admin\banappearance.dm"
#include "code\modules\admin\banjob.dm"
#include "code\modules\admin\create_mob.dm"
#include "code\modules\admin\create_object.dm"
21 August 2016+Ergovisavi updated:+
Google Play Store updated:+
Incoming5643 updated:+
Jalleo updated:+
Jordie0608 updated:+
Kor updated:+
Papa Bones updated:+
Shadowlight213 updated:+
WJohnston updated:+
Wjohnston, Gun Hog updated:+
17 August 2016Basilman updated:
19 June 2016-Joan updated:-
Kor and Iamgoofball updated:-
Quiltyquilty updated:-
Wizard's Federation updated:-
Xhuis updated:-
coiax updated:-
16 June 2016-GunHog updated:-
Joan updated:-
Quiltyquilty updated:-
coiax updated:-
|