diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index badefaf8999..dd54aea2e92 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -82,6 +82,7 @@ CREATE TABLE `characters` (
`speciesprefs` int(1) NOT NULL,
`socks` mediumtext NOT NULL,
`body_accessory` mediumtext NOT NULL,
+ `gear` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index 4f184355e5e..453554f5c69 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -82,6 +82,7 @@ CREATE TABLE `SS13_characters` (
`speciesprefs` int(1) NOT NULL,
`socks` mediumtext NOT NULL,
`body_accessory` mediumtext NOT NULL,
+ `gear` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index b4d703bf123..95bf53ca531 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -5238,7 +5238,7 @@
"bWL" = (/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/janitor)
"bWM" = (/obj/structure/closet/l3closet/janitor,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/janitor)
"bWN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/janitor)
-"bWO" = (/obj/vehicle/janicart,/turf/simulated/floor/plasteel,/area/janitor)
+"bWO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/vehicle/janicart,/turf/simulated/floor/plasteel,/area/janitor)
"bWP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
"bWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor/plasteel,/area/janitor)
"bWR" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/janitor)
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 7f5a03e58af..41715794c29 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -160,7 +160,7 @@
"dd" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
"de" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"df" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/shard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/storage/firstaid/tactical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
-"dg" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/red,/obj/item/clothing/head/helmet/knight/red,/obj/item/weapon/holo/claymore/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_knightarena)
+"dg" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/red,/obj/item/clothing/head/helmet/riot/knight/red,/obj/item/weapon/holo/claymore/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_knightarena)
"dh" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_knightarena)
"di" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_knightarena)
"dj" = (/turf/simulated/floor/holofloor,/area/holodeck/source_knightarena)
@@ -181,7 +181,7 @@
"dy" = (/obj/structure/holowindow{dir = 1},/turf/simulated/floor/holofloor{dir = 4; icon_state = "blue"},/area/holodeck/source_knightarena)
"dz" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "blue"},/area/holodeck/source_knightarena)
"dA" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "blue"},/area/holodeck/source_knightarena)
-"dB" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/blue,/obj/item/clothing/head/helmet/knight/blue,/obj/item/weapon/holo/claymore/blue,/turf/simulated/floor/holofloor{dir = 2; icon_state = "blue"},/area/holodeck/source_knightarena)
+"dB" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/blue,/obj/item/clothing/head/helmet/riot/knight/blue,/obj/item/weapon/holo/claymore/blue,/turf/simulated/floor/holofloor{dir = 2; icon_state = "blue"},/area/holodeck/source_knightarena)
"dC" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 10; icon_state = "blue"},/area/holodeck/source_knightarena)
"dD" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 6; icon_state = "blue"},/area/holodeck/source_knightarena)
"dE" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm
index d84a5dfbf24..131fe41aea3 100644
--- a/_maps/map_files/cyberiad/z5.dmm
+++ b/_maps/map_files/cyberiad/z5.dmm
@@ -349,8 +349,8 @@
"gK" = (/obj/machinery/light{dir = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"gL" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/anomaly)
"gM" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/color/latex,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly)
-"gN" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"gO" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access_txt = "47"},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"gN" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"gO" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"gP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"gQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/power/apc{dir = 4; name = "Outpost Hallways APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"gR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power)
@@ -379,14 +379,15 @@
"ho" = (/obj/machinery/door/window/westleft{dir = 8; name = "Locker room"; opacity = 0; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"hp" = (/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"hq" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/color/latex,/obj/machinery/camera{c_tag = "Research Outpost Anomaly Lab Storage"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly)
-"hr" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"hs" = (/obj/structure/window/reinforced{dir = 4},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"hr" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"hs" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"ht" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"hw" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/light/small,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/plating,/area/research_outpost/power)
"hx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/research_outpost/power)
"hy" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plating,/area/research_outpost/power)
+"hz" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"hA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"hB" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
"hC" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
@@ -770,7 +771,6 @@
"oQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/research_outpost/iso3)
"oR" = (/obj/machinery/conveyor{dir = 1; id = "iso3"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/research_outpost/iso3)
"oS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/research_outpost/iso3)
-"oT" = (/obj/structure/rack,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"oU" = (/obj/structure/rack,/obj/item/weapon/storage/box/lights/bulbs{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/lights/tubes{pixel_x = -5; pixel_y = 5},/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"oV" = (/turf/simulated/mineral/random/low_chance,/area/mine/explored)
"oW" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/turf/simulated/mineral/random/low_chance,/area/mine/explored)
@@ -1505,8 +1505,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagageOePeQekacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjacacacacacacaaaaaQaaaaaaaaaaaaaaaoeReSeSeUeVeWeXeYeZfafbfcfdfefffgfhfhfjfkflfmeHeCfieTfqeHfrafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfsftfufvekacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfyfzfAfBfCfDaLfEfFfGfHfIfJfKfLfMcZfNfOfPfQfQfRfSfTfUfVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfWfXfYekfZgaekekekekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfygbgcfBgdgeaLgfggcZghcZcZcZcZgicZgjgkeHglgmgngogpgqgraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbPdLgyekgzgAekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaelaaaaaaaLfwengBfygCfAfBgEgFaLgGgHgIgJgKgLgMcZgNgOgPgQgRgSgTfQgVgpefafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbhcgyhdgAgAgzekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahehfhfhfadhfhfhffnhihjbahkhlaLaLaLaLaLhmhnhogJhpgLhqcZhrhshthuhvhwhxgUhyhAhBhCaLhDbzaAaAaAaAaAaAaBhEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbPdLgyekgzgAekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaelaaaaaaaLfwengBfygCfAfBgEgFaLgGgHgIgJgKgLgMcZgOgNgPgQgRgSgTfQgVgpefafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbhcgyhdgAgAgzekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahehfhfhfadhfhfhffnhihjbahkhlaLaLaLaLaLhmhnhogJhpgLhqcZhshrhthuhvhwhxgUhyhAhBhCaLhDbzaAaAaAaAaAaAaBhEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFgWgXgWgugufZhGgZekfvhHekgAhIekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahJhKhLhNhNhNhOhPhQhRhShThUhVhWhXfohZiaibicidieifigihcZiiijikileHeHimeHeHeHinioipiqirisisitisisisiubhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagiviwguixiygueQizhaiAiBiCekekekekekekbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacaaaaaaaaaaiDiEhNhNhNhNiFiGiHiIiJiKiLiMhWfpiOiPiQiRiSiTiUiViWiXiYiZiWjajbjcjdjejfjcjgjciWjhjijjjkjljmjnjojpisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagjqjrjsguiygAgYjtgZcrekjujvekjwgyjxjyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacaaaaaaaaaajzjAhNhNjBhNjCjDjEjFjGjHjIjJhWjKjLjMjNjOjPjQjRjSjTjUjVjWjXjUjYjVjZjUjVkakbkckdkekfkgkhkikjkkkkklisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1516,7 +1516,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceklGeQdLgYiAlLkmdLkmfudLdLmzgydLeQeQekcrmAeQdLekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacafafaeaeaeaeaeaeaeaeaeaeafafmBmCmDacaaaaaaaaaaaaagldlXmFmbmHmImJmcljmdmMhWkFkFkFkFkFmgmPkHmQmRmSkKmTmUmVkNmWmXmYkNmZnanbncndndnelCnfaiaAaAngnhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaceklGnieQeQiAeQlafZeQnjfulakpcreQnkfvekkmcrlLdLekbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnlaeaeaeaeaeaeaeaeaeaeaenmafnnnoafafaaaaaaaaaaaaagldmenqnrmEnrntmGljljnvhWyuyumKyukFnAnBkHnCnDnEkKnFnGnHkNnInJnKkNnLnMlCnNnOnPnOlCnnnQafagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaceklGnRgYgweknSeknTfYekhaeknTfYekgZlLekmziCcrjuekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnUaeaeaeaenVaeaeaeaeaeaenWnlnXnlafaaaaaaaaaaaaaaagldmNmLmOnZnuobnunphWodhWoeoeoeoekFnsmgkHogohoikKojokolkNomonookNopoqorlClClClCosotafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacekekekekekeknSekougyhajufvgZkogZiCgYeknTovowoxekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnmaeaeaeaeaeaeaeaeaeaeaeaeoyozoAaaaaaaaaaaaaaaagagldnwnunxnZnynununzhWoHhWaeaeaeaekFoIoJkHoKoLoMkKoNoOoPkNoQoRoSkNoToUorafoVafoWmCoXafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacekekekekekeknSekougyhajufvgZkogZiCgYeknTovowoxekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnmaeaeaeaeaeaeaeaeaeaeaeaeoyozoAaaaaaaaaaaaaaaagagldnwnunxnZnynununzhWoHhWaeaeaeaekFoIoJkHoKoLoMkKoNoOoPkNoQoRoSkNhzoUorafoVafoWmCoXafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacbjbjbjbjbjeknSekgyjuoYizdlgYgyekgZfvekoZpapapbekpcbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafafaeaeaeaeaeaeaeaeaeaeaeaepdpepfaaaaaaaaaaaaagagagldldpgpgldldnZnZldldnYhWaeaeaeaekFkFkFkHkHkHkHkKkKkKkKkNkNkNkNkNororpjlOakakpknQafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacbjbjbjbjbjbjeknSekjudLiCgygZfviCeknSekekjwcrpaplpmpcpcbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafafaeaeaeaeaeaeaeaeaeaeaeaepnpoppaaaaaaaaaaagpqprpsptpupvpwpxaeaeaeaeaeqCaeaeaeaeaepBpCpDafafafafafafafafafafafafafafpEpFnQpGafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacbjbjbjbjbjbjbjbjeknSekekekekekekekekeknSekjwcrjxcrpbpHpcpcbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafaeaeaeaeaeaeaeaeaeaeaeaeaepIpJpKpLpLpLpLpLpLpMpNpOpPpPpQpRpRaeaeaeaeaeqCaeaeaeaeaepdpopWafafoVoVoVoVoVoVafafafafafpEpFnQpXaepXafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 40e3edfcfb0..04c7f051790 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -66,6 +66,7 @@
#define COLOR_YELLOW "#FFFF00"
#define COLOR_ORANGE "#FF9900"
#define COLOR_WHITE "#FFFFFF"
+#define COLOR_GRAY "#808080"
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 89020f0d5c7..67267c78042 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -178,6 +178,8 @@
var/disable_lobby_music = 0 // Disables the lobby music
var/disable_cid_warn_popup = 0 //disables the annoying "You have already logged in this round, disconnect or be banned" popup, because it annoys the shit out of me when testing.
+ var/max_loadout_points = 5 // How many points can be spent on extra items in character setup
+
/datum/configuration/New()
var/list/L = subtypesof(/datum/game_mode)
for (var/T in L)
@@ -556,6 +558,9 @@
if("disable_cid_warn_popup")
config.disable_cid_warn_popup = 1
+ if("max_loadout_points")
+ config.max_loadout_points = text2num(value)
+
else
diary << "Unknown setting in configuration: '[name]'"
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index d11099627a6..9007acec900 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -256,7 +256,7 @@
desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel."
flags = STOPSPRESSUREDMAGE | NODROP
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen)
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all.
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all.
/obj/item/clothing/suit/space/changeling/New()
..()
@@ -277,7 +277,7 @@
icon_state = "lingspacehelmet"
desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front."
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | NODROP
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/head/helmet/space/changeling/dropped()
qdel(src)
@@ -308,8 +308,7 @@
icon_state = "lingarmor"
flags = NODROP
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- slowdown = 2
- armor = list(melee = 65, bullet = 20, laser = 10, energy = 15, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = 0
heat_protection = 0
@@ -327,7 +326,7 @@
desc = "A tough, hard covering of black chitin with transparent chitin in front."
icon_state = "lingarmorhelmet"
flags = HEADCOVERSEYES | BLOCKHAIR | NODROP
- armor = list(melee = 65, bullet = 20, laser = 10,energy = 15, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 40, energy = 20, bomb = 10, bio = 4, rad = 0)
flags_inv = HIDEEARS
/obj/item/clothing/head/helmet/changeling/dropped()
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 60803346b26..f6d87a1b60c 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -34,7 +34,7 @@
desc = "A hood worn by the followers of Nar-Sie."
flags_inv = HIDEFACE
flags = HEADCOVERSEYES
- armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -54,7 +54,7 @@
item_state = "cultrobes"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
- armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
flags_inv = HIDEJUMPSUIT
/obj/item/clothing/head/magus
@@ -64,7 +64,7 @@
desc = "A helm worn by the followers of Nar-Sie."
flags_inv = HIDEFACE
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
- armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 20, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/magusred
name = "magus robes"
@@ -73,7 +73,7 @@
item_state = "magusred"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
- armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
/obj/item/clothing/head/helmet/space/cult
@@ -81,7 +81,7 @@
desc = "A space worthy helmet used by the followers of Nar-Sie"
icon_state = "cult_helmet"
item_state = "cult_helmet"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/cult
name = "cult armour"
@@ -90,5 +90,4 @@
desc = "A bulky suit of armour, bristling with spikes. It looks space proof."
w_class = 3
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank)
- slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
\ No newline at end of file
+ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index 4998aaeca48..843ef5d98b3 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -97,10 +97,15 @@
set category = "Borer"
set name = "Converse with Host"
set desc = "Send a silent message to your host."
+
if(!host)
to_chat(src, "You do not have a host to communicate with!")
return
+ if(stat)
+ to_chat(src, "You cannot do that in your current state.")
+ return
+
var/input = stripped_input(src, "Please enter a message to tell your host.", "Borer", "")
if(!input) return
@@ -207,6 +212,12 @@
if(prob(host.getBrainLoss()/20))
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
+/mob/living/simple_animal/borer/handle_environment()
+ if(host)
+ return // Snuggled up, nice and warm, in someone's head
+ else
+ return ..()
+
/mob/living/simple_animal/borer/New(var/by_gamemode=0)
..()
add_language("Cortical Link")
@@ -231,14 +242,6 @@
// VERBS!
-/mob/living/simple_animal/borer/proc/borer_speak(var/message)
- if(!message)
- return
-
- for(var/mob/M in mob_list)
- if(M.mind && (istype(M, /mob/living/simple_animal/borer) || istype(M, /mob/dead/observer)))
- to_chat(M, "Cortical link, [truename]: [copytext(message, 2)]")
-
/mob/living/simple_animal/borer/verb/dominate_victim()
set category = "Borer"
set name = "Dominate Victim"
@@ -288,6 +291,10 @@
to_chat(src, "You are not inside a host body.")
return
+ if(host.stat == DEAD)
+ to_chat(src, "This host is in no condition to be controlled.")
+ return
+
if(src.stat)
to_chat(src, "You cannot do that in your current state.")
return
@@ -405,6 +412,7 @@
if(stat)
to_chat(src, "You cannot leave your host in your current state.")
+ return
if(docile)
to_chat(src, "\blue You are feeling far too docile to do that.")
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 31c82b2a203..b3d1ab1e67f 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -123,7 +123,7 @@
H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/noir(H),slot_glasses)
H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
- H.equip_or_collect(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
+ H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit/forensics/blue(H), slot_wear_suit)
else
H.equip_or_collect(new /obj/item/clothing/suit/storage/det_suit(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/clothing/head/det_hat(H), slot_head)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 851cb4d0921..ca41aee35a7 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -382,9 +382,60 @@ var/global/datum/controller/occupations/job_master
proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
if(!H) return null
var/datum/job/job = GetJob(rank)
+ var/list/spawn_in_storage = list()
+
if(job)
+
+ //Equip custom gear loadout.
+ var/list/custom_equip_slots = list() //If more than one item takes the same slot, all after the first one spawn in storage.
+ var/list/custom_equip_leftovers = list()
+ if(H.client.prefs.gear && H.client.prefs.gear.len && job.title != "Cyborg" && job.title != "AI")
+ for(var/thing in H.client.prefs.gear)
+ var/datum/gear/G = gear_datums[thing]
+ if(G)
+ var/permitted
+ if(G.allowed_roles)
+ for(var/job_name in G.allowed_roles)
+ if(job.title == job_name)
+ permitted = 1
+ else
+ permitted = 1
+
+ if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
+ permitted = 0
+
+ if(!permitted)
+ to_chat(H, "Your current job or whitelist status does not permit you to spawn with [thing]!")
+ continue
+
+ if(G.slot && !(G.slot in custom_equip_slots))
+ // This is a miserable way to fix the loadout overwrite bug, but the alternative requires
+ // adding an arg to a bunch of different procs. Will look into it after this merge. ~ Z
+ if(G.slot == slot_wear_mask || G.slot == slot_wear_suit || G.slot == slot_head)
+ custom_equip_leftovers += thing
+ else if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot))
+ to_chat(H, "Equipping you with \the [thing]!")
+ custom_equip_slots.Add(G.slot)
+ else
+ custom_equip_leftovers.Add(thing)
+ else
+ spawn_in_storage += thing
+
job.equip(H)
job.apply_fingerprints(H)
+
+ //If some custom items could not be equipped before, try again now.
+ for(var/thing in custom_equip_leftovers)
+ var/datum/gear/G = gear_datums[thing]
+ if(G.slot in custom_equip_slots)
+ spawn_in_storage += thing
+ else
+ var/metadata = H.client.prefs.gear[G.display_name]
+ if(H.equip_to_slot_or_del(G.spawn_item(H, metadata), G.slot))
+ to_chat(H, "Equipping you with \the [thing]!")
+ custom_equip_slots.Add(G.slot)
+ else
+ spawn_in_storage += thing
else
to_chat(H, "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator.")
@@ -467,6 +518,26 @@ var/global/datum/controller/occupations/job_master
H.equip_to_slot_or_del(BPK, slot_back,1)
H.species.equip(H)
+ //Deferred item spawning.
+ for(var/thing in spawn_in_storage)
+ var/datum/gear/G = gear_datums[thing]
+ var/metadata = H.client.prefs.gear[G.display_name]
+ var/item = G.spawn_item(null, metadata)
+
+ var/atom/placed_in = H.equip_or_collect(item)
+ if(placed_in)
+ to_chat(H, "Placing \the [item] in your [placed_in.name]!")
+ continue
+ if(H.equip_to_appropriate_slot(item))
+ to_chat(H, "Placing \the [item] in your inventory!")
+ continue
+ if(H.put_in_hands(item))
+ to_chat(H, "Placing \the [item] in your hands!")
+ continue
+ to_chat(H, "Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug.")
+ qdel(item)
+
+
to_chat(H, "You are the [alt_title ? alt_title : rank].")
to_chat(H, "As the [alt_title ? alt_title : rank] you answer directly to [job.supervisors]. Special circumstances may change this.")
if(job.req_admin_notify)
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 809ac579454..b29d178efec 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -444,6 +444,7 @@
throwforce = 0
w_class = 2.0
flags = NOSHIELD
+ armour_penetration = 50
var/active = 0
/obj/item/weapon/holo/esword/green/New()
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 7af28cc4f73..dfc4e43f4a8 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -37,6 +37,8 @@ var/time_last_changed_position = 0
/datum/job/mechanic,
/datum/job/barber,
/datum/job/chaplain,
+ /datum/job/ntnavyofficer,
+ /datum/job/ntspecops,
/datum/job/civilian
)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 2a3fe4a2a03..8a0c44b78ca 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -44,7 +44,7 @@
var/permeability_coefficient = 1 // for chemicals/diseases
var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit)
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
- var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ var/armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
var/armour_penetration = 0 //percentage of armour effectiveness to remove
var/list/allowed = null //suit storage stuff.
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index e3c65c2f35b..45b2f1f7452 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -63,6 +63,7 @@
w_class_on = 5
hitsound = "swing_hit"
flags = CONDUCT | NOSHIELD
+ armour_penetration = 100
origin_tech = "combat=3"
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
attack_verb_on = list()
@@ -83,6 +84,7 @@
throw_range = 5
hitsound = "swing_hit"
flags = NOSHIELD
+ armour_penetration = 35
origin_tech = "magnets=3;syndicate=4"
sharp = 1
edge = 1
@@ -205,6 +207,7 @@
throw_range = 1
w_class = 4//So you can't hide it in your pocket or some such.
flags = NOSHIELD
+ armour_penetration = 50
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/datum/effect/system/spark_spread/spark_system
diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm
index e36bed7a473..049339a1b01 100644
--- a/code/game/objects/items/weapons/staff.dm
+++ b/code/game/objects/items/weapons/staff.dm
@@ -9,6 +9,7 @@
throw_range = 5
w_class = 2.0
flags = NOSHIELD
+ armour_penetration = 100
attack_verb = list("bludgeoned", "whacked", "disciplined")
/obj/item/weapon/twohanded/staff/broom
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 29bcb4f8fe2..1f808939f17 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -206,6 +206,7 @@
wieldsound = 'sound/weapons/saberon.ogg'
unwieldsound = 'sound/weapons/saberoff.ogg'
flags = NOSHIELD
+ armour_penetration = 35
origin_tech = "magnets=3;syndicate=4"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharp = 1
@@ -293,6 +294,7 @@
force_wielded = 18 // Was 13, Buffed - RR
throwforce = 20
throw_speed = 3
+ armour_penetration = 10
no_spin_thrown = 1 // Thrown spears that spin look dumb. -Fox
flags = NOSHIELD
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
@@ -370,6 +372,7 @@
wieldsound = 'sound/weapons/chainsawstart.ogg'
hitsound = null
flags = NOSHIELD
+ armour_penetration = 35
origin_tech = "materials=6;syndicate=4"
attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered")
sharp = 1
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 51f01d874a8..c4fa509b947 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -11,6 +11,7 @@
New()
..()
new /obj/item/clothing/under/rank/cargotech(src)
+ new /obj/item/clothing/under/rank/cargotech/skirt(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/fingerless(src)
@@ -30,6 +31,7 @@
New()
..()
new /obj/item/clothing/under/rank/cargo(src)
+ new /obj/item/clothing/under/rank/cargo/skirt(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/fingerless(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
index 50ad1500192..ba971914f24 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
@@ -20,7 +20,7 @@
new /obj/item/clothing/suit/holidaypriest(src)
new /obj/item/clothing/under/wedding/bride_white(src)
new /obj/item/weapon/storage/backpack/cultpack (src)
- new /obj/item/clothing/head/helmet/knight/templar(src)
+ new /obj/item/clothing/head/helmet/riot/knight/templar(src)
new /obj/item/clothing/suit/armor/riot/knight/templar(src)
new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 1746211e248..c26ace63f08 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -18,6 +18,7 @@
new /obj/item/areaeditor/blueprints(src)
new /obj/item/weapon/storage/box/permits(src)
new /obj/item/clothing/under/rank/chief_engineer(src)
+ new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
new /obj/item/clothing/head/hardhat/white(src)
new /obj/item/clothing/glasses/welding/superior(src)
new /obj/item/clothing/gloves/color/yellow(src)
@@ -104,6 +105,7 @@
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/device/radio/headset/headset_eng(src)
new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
new /obj/item/clothing/suit/storage/hazardvest(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 2b823041950..3fdf47dc0c5 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -103,6 +103,7 @@
new /obj/item/clothing/under/rank/head_of_security(src)
new /obj/item/clothing/under/rank/head_of_security/formal(src)
new /obj/item/clothing/under/rank/head_of_security/corp(src)
+ new /obj/item/clothing/under/rank/head_of_security/skirt(src)
new /obj/item/clothing/suit/armor/hos(src)
new /obj/item/clothing/suit/armor/hos/alt(src)
new /obj/item/clothing/head/HoS(src)
@@ -145,6 +146,7 @@
new /obj/item/clothing/under/rank/warden(src)
new /obj/item/clothing/under/rank/warden/formal(src)
new /obj/item/clothing/under/rank/warden/corp(src)
+ new /obj/item/clothing/under/rank/warden/skirt(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/clothing/mask/gas/sechailer/warden(src)
new /obj/item/taperoll/police(src)
@@ -315,8 +317,8 @@
..()
new /obj/item/clothing/under/det(src)
new /obj/item/clothing/suit/storage/det_suit(src)
- new /obj/item/clothing/suit/storage/forensics/blue(src)
- new /obj/item/clothing/suit/storage/forensics/red(src)
+ new /obj/item/clothing/suit/storage/det_suit/forensics/blue(src)
+ new /obj/item/clothing/suit/storage/det_suit/forensics/red(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/head/det_hat(src)
new /obj/item/clothing/shoes/brown(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 0cccd860b04..c23701575df 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -38,6 +38,9 @@
new /obj/item/clothing/under/rank/security/formal(src)
new /obj/item/clothing/under/rank/security/formal(src)
new /obj/item/clothing/under/rank/security/formal(src)
+ new /obj/item/clothing/under/rank/security/skirt(src)
+ new /obj/item/clothing/under/rank/security/skirt(src)
+ new /obj/item/clothing/under/rank/security/skirt(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/jackboots(src)
@@ -173,6 +176,9 @@
new /obj/item/clothing/under/rank/atmospheric_technician(src)
new /obj/item/clothing/under/rank/atmospheric_technician(src)
new /obj/item/clothing/under/rank/atmospheric_technician(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
@@ -195,6 +201,9 @@
new /obj/item/clothing/under/rank/engineer(src)
new /obj/item/clothing/under/rank/engineer(src)
new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/shoes/workboots(src)
@@ -239,6 +248,8 @@
new /obj/item/clothing/under/rank/medical/green(src)
new /obj/item/clothing/head/surgery/green(src)
new /obj/item/clothing/under/rank/medical/purple(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
new /obj/item/clothing/head/surgery/purple(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
@@ -271,6 +282,9 @@
new /obj/item/clothing/under/rank/scientist(src)
new /obj/item/clothing/under/rank/scientist(src)
new /obj/item/clothing/under/rank/scientist(src)
+ new /obj/item/clothing/under/rank/scientist/skirt(src)
+ new /obj/item/clothing/under/rank/scientist/skirt(src)
+ new /obj/item/clothing/under/rank/scientist/skirt(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/suit/storage/labcoat(src)
@@ -293,6 +307,8 @@
new /obj/item/clothing/glasses/hud/diagnostic(src)
new /obj/item/clothing/under/rank/roboticist(src)
new /obj/item/clothing/under/rank/roboticist(src)
+ new /obj/item/clothing/under/rank/roboticist/skirt(src)
+ new /obj/item/clothing/under/rank/roboticist/skirt(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/shoes/black(src)
@@ -312,6 +328,8 @@
..()
new /obj/item/clothing/under/rank/chemist(src)
new /obj/item/clothing/under/rank/chemist(src)
+ new /obj/item/clothing/under/rank/chemist/skirt(src)
+ new /obj/item/clothing/under/rank/chemist/skirt(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/suit/storage/labcoat/chemist(src)
@@ -354,6 +372,8 @@
..()
new /obj/item/clothing/under/rank/virologist(src)
new /obj/item/clothing/under/rank/virologist(src)
+ new /obj/item/clothing/under/rank/virologist/skirt(src)
+ new /obj/item/clothing/under/rank/virologist/skirt(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/suit/storage/labcoat/virologist(src)
@@ -375,6 +395,8 @@
..()
new /obj/item/clothing/under/rank/medical(src)
new /obj/item/clothing/under/rank/medical(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
new /obj/item/clothing/under/rank/medical/blue(src)
new /obj/item/clothing/under/rank/medical/green(src)
new /obj/item/clothing/under/rank/medical/purple(src)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 464d8b3a13d..59278124aa0 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1124,7 +1124,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make monkey?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make monkey?",, "Yes", "No") != "Yes")
return
log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]")
@@ -1140,7 +1140,7 @@
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make corgi?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make corgi?",, "Yes", "No") != "Yes")
return
log_admin("[key_name(usr)] attempting to corgize [key_name(H)]")
@@ -1154,7 +1154,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make pai?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make pai?",, "Yes", "No") != "Yes")
return
var/painame = "Default"
@@ -1414,7 +1414,7 @@
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make ai?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make ai?",, "Yes", "No") != "Yes")
return
message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1)
@@ -1425,7 +1425,7 @@
else if(href_list["makemask"])
if(!check_rights(R_SPAWN)) return
- if(alert(usr, "Confirm make mask?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make mask?",, "Yes", "No") != "Yes")
return
var/mob/currentMob = locate(href_list["makemask"])
@@ -1441,7 +1441,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make alien?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make alien?",, "Yes", "No") != "Yes")
return
usr.client.cmd_admin_alienize(H)
@@ -1453,7 +1453,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make slime?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make slime?",, "Yes", "No") != "Yes")
return
usr.client.cmd_admin_slimeize(H)
@@ -1466,7 +1466,7 @@
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make superhero?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make superhero?",, "Yes", "No") != "Yes")
return
usr.client.cmd_admin_super(H)
@@ -1478,7 +1478,7 @@
if(!istype(H))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- if(alert(usr, "Confirm make robot?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make robot?",, "Yes", "No") != "Yes")
return
usr.client.cmd_admin_robotize(H)
@@ -1490,7 +1490,7 @@
if(istype(M, /mob/new_player))
to_chat(usr, "This cannot be used on instances of type /mob/new_player")
return
- if(alert(usr, "Confirm make animal?", "Yes", "No") != "Yes")
+ if(alert(usr, "Confirm make animal?",, "Yes", "No") != "Yes")
return
usr.client.cmd_admin_animalize(M)
diff --git a/code/modules/client/preference/loadout/gear_tweaks.dm b/code/modules/client/preference/loadout/gear_tweaks.dm
new file mode 100644
index 00000000000..6458a51b9a3
--- /dev/null
+++ b/code/modules/client/preference/loadout/gear_tweaks.dm
@@ -0,0 +1,113 @@
+/datum/gear_tweak/proc/get_contents(var/metadata)
+ return
+
+/datum/gear_tweak/proc/get_metadata(var/user, var/metadata)
+ return
+
+/datum/gear_tweak/proc/get_default()
+ return
+
+/datum/gear_tweak/proc/tweak_gear_data(var/metadata, var/datum/gear_data)
+ return
+
+/datum/gear_tweak/proc/tweak_item(var/obj/item/I, var/metadata)
+ return
+
+/*
+* Color adjustment
+*/
+
+var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
+
+/datum/gear_tweak/color
+ var/list/valid_colors
+
+/datum/gear_tweak/color/New(var/list/colors)
+ valid_colors = colors
+ ..()
+
+/datum/gear_tweak/color/get_contents(var/metadata)
+ return "Color: ⚫"
+
+/datum/gear_tweak/color/get_default()
+ return valid_colors ? valid_colors[1] : COLOR_GRAY
+
+/datum/gear_tweak/color/get_metadata(var/user, var/metadata)
+ if(valid_colors)
+ return input(user, "Choose an item color.", "Character Preference", metadata) as null|anything in valid_colors
+ return input(user, "Choose an item color.", "Global Preference", metadata) as color|null
+
+/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata)
+ if(valid_colors && !(metadata in valid_colors))
+ return
+ I.color = metadata
+
+/*
+* Path adjustment
+*/
+
+/datum/gear_tweak/path
+ var/list/valid_paths
+
+/datum/gear_tweak/path/New(var/list/paths)
+ valid_paths = paths
+ ..()
+
+/datum/gear_tweak/path/get_contents(var/metadata)
+ return "Type: [metadata]"
+
+/datum/gear_tweak/path/get_default()
+ return valid_paths[1]
+
+/datum/gear_tweak/path/get_metadata(var/user, var/metadata)
+ return input(user, "Choose a type.", "Character Preference", metadata) as null|anything in valid_paths
+
+/datum/gear_tweak/path/tweak_gear_data(var/metadata, var/datum/gear_data/gear_data)
+ if(!(metadata in valid_paths))
+ return
+ gear_data.path = valid_paths[metadata]
+
+/*
+* Content adjustment
+*/
+
+/datum/gear_tweak/contents
+ var/list/valid_contents
+
+/datum/gear_tweak/contents/New()
+ valid_contents = args.Copy()
+ ..()
+
+/datum/gear_tweak/contents/get_contents(var/metadata)
+ return "Contents: [english_list(metadata, and_text = ", ")]"
+
+/datum/gear_tweak/contents/get_default()
+ . = list()
+ for(var/i = 1 to valid_contents.len)
+ . += "Random"
+
+/datum/gear_tweak/contents/get_metadata(var/user, var/list/metadata)
+ . = list()
+ for(var/i = metadata.len to valid_contents.len)
+ metadata += "Random"
+ for(var/i = 1 to valid_contents.len)
+ var/entry = input(user, "Choose an entry.", "Character Preference", metadata[i]) as null|anything in (valid_contents[i] + list("Random", "None"))
+ if(entry)
+ . += entry
+ else
+ return metadata
+
+/datum/gear_tweak/contents/tweak_item(var/obj/item/I, var/list/metadata)
+ if(metadata.len != valid_contents.len)
+ return
+ for(var/i = 1 to valid_contents.len)
+ var/path
+ var/list/contents = valid_contents[i]
+ if(metadata[i] == "Random")
+ path = pick(contents)
+ path = contents[path]
+ else if(metadata[i] == "None")
+ continue
+ else
+ path = contents[metadata[i]]
+ new path(I)
diff --git a/code/modules/client/preference/loadout/loadout.dm b/code/modules/client/preference/loadout/loadout.dm
new file mode 100644
index 00000000000..010fc54564c
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout.dm
@@ -0,0 +1,79 @@
+var/list/loadout_categories = list()
+var/list/gear_datums = list()
+
+/datum/loadout_category
+ var/category = ""
+ var/list/gear = list()
+
+/datum/loadout_category/New(cat)
+ category = cat
+ ..()
+
+/hook/startup/proc/populate_gear_list()
+ //create a list of gear datums to sort
+ for(var/geartype in subtypesof(/datum/gear))
+ var/datum/gear/G = geartype
+
+ var/use_name = initial(G.display_name)
+ var/use_category = initial(G.sort_category)
+
+ if(G == initial(G.subtype_path))
+ continue
+
+ if(!use_name)
+ error("Loadout - Missing display name: [G]")
+ continue
+ if(!initial(G.cost))
+ error("Loadout - Missing cost: [G]")
+ continue
+ if(!initial(G.path))
+ error("Loadout - Missing path definition: [G]")
+ continue
+
+ if(!loadout_categories[use_category])
+ loadout_categories[use_category] = new /datum/loadout_category(use_category)
+ var/datum/loadout_category/LC = loadout_categories[use_category]
+ gear_datums[use_name] = new geartype
+ LC.gear[use_name] = gear_datums[use_name]
+
+ loadout_categories = sortAssoc(loadout_categories)
+ for(var/loadout_category in loadout_categories)
+ var/datum/loadout_category/LC = loadout_categories[loadout_category]
+ LC.gear = sortAssoc(LC.gear)
+ return 1
+
+/datum/gear
+ var/display_name //Name/index. Must be unique.
+ var/description //Description of this gear. If left blank will default to the description of the pathed item.
+ var/path //Path to item.
+ var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
+ var/slot //Slot to equip to.
+ var/list/allowed_roles //Roles that can spawn with this item.
+ var/whitelisted //Term to check the whitelist for..
+ var/sort_category = "General"
+ var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
+ var/subtype_path = /datum/gear //for skipping organizational subtypes (optional)
+ var/subtype_cost_overlap = TRUE //if subtypes can take points at the same time
+
+/datum/gear/New()
+ ..()
+ if(!description)
+ var/obj/O = path
+ description = initial(O.desc)
+
+/datum/gear_data
+ var/path
+ var/location
+
+/datum/gear_data/New(npath, nlocation)
+ path = npath
+ location = nlocation
+
+/datum/gear/proc/spawn_item(location, metadata)
+ var/datum/gear_data/gd = new(path, location)
+ for(var/datum/gear_tweak/gt in gear_tweaks)
+ gt.tweak_gear_data(metadata["[gt]"], gd)
+ var/item = new gd.path(gd.location)
+ for(var/datum/gear_tweak/gt in gear_tweaks)
+ gt.tweak_item(item, metadata["[gt]"])
+ return item
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm
new file mode 100644
index 00000000000..e392f8a4087
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_accessories.dm
@@ -0,0 +1,64 @@
+/datum/gear/accessory
+ subtype_path = /datum/gear/accessory
+ slot = slot_tie
+ sort_category = "Accessories"
+
+/datum/gear/accessory/scarf
+ display_name = "scarf"
+ path = /obj/item/clothing/accessory/scarf
+
+/datum/gear/accessory/scarf/red
+ display_name = "scarf, red"
+ path = /obj/item/clothing/accessory/scarf/red
+
+/datum/gear/accessory/scarf/green
+ display_name = "scarf, green"
+ path = /obj/item/clothing/accessory/scarf/green
+
+/datum/gear/accessory/scarf/darkblue
+ display_name = "scarf, dark blue"
+ path = /obj/item/clothing/accessory/scarf/darkblue
+
+/datum/gear/accessory/scarf/purple
+ display_name = "scarf, purple"
+ path = /obj/item/clothing/accessory/scarf/purple
+
+/datum/gear/accessory/scarf/yellow
+ display_name = "scarf, yellow"
+ path = /obj/item/clothing/accessory/scarf/yellow
+
+/datum/gear/accessory/scarf/orange
+ display_name = "scarf, orange"
+ path = /obj/item/clothing/accessory/scarf/orange
+
+/datum/gear/accessory/scarf/lightblue
+ display_name = "scarf, light blue"
+ path = /obj/item/clothing/accessory/scarf/lightblue
+
+/datum/gear/accessory/scarf/white
+ display_name = "scarf, white"
+ path = /obj/item/clothing/accessory/scarf/white
+
+/datum/gear/accessory/scarf/black
+ display_name = "scarf, black"
+ path = /obj/item/clothing/accessory/scarf/black
+
+/datum/gear/accessory/scarf/zebra
+ display_name = "scarf, zebra"
+ path = /obj/item/clothing/accessory/scarf/zebra
+
+/datum/gear/accessory/scarf/christmas
+ display_name = "scarf, christmas"
+ path = /obj/item/clothing/accessory/scarf/christmas
+
+/datum/gear/accessory/scarf/stripedred
+ display_name = "scarf, striped red"
+ path = /obj/item/clothing/accessory/stripedredscarf
+
+/datum/gear/accessory/scarf/stripedgreen
+ display_name = "scarf, striped green"
+ path = /obj/item/clothing/accessory/stripedgreenscarf
+
+/datum/gear/accessory/scarf/stripedblue
+ display_name = "scarf, striped blue"
+ path = /obj/item/clothing/accessory/stripedbluescarf
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_cosmetics.dm b/code/modules/client/preference/loadout/loadout_cosmetics.dm
new file mode 100644
index 00000000000..6fc2c7f321b
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_cosmetics.dm
@@ -0,0 +1,16 @@
+/datum/gear/lipstick
+ display_name = "lipstick, black"
+ path = /obj/item/weapon/lipstick/black
+ sort_category = "Cosmetics"
+
+/datum/gear/lipstick/jade
+ display_name = "lipstick, jade"
+ path = /obj/item/weapon/lipstick/jade
+
+/datum/gear/lipstick/purple
+ display_name = "lipstick, purple"
+ path = /obj/item/weapon/lipstick/purple
+
+/datum/gear/lipstick/red
+ display_name = "lipstick, red"
+ path = /obj/item/weapon/lipstick
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm
new file mode 100644
index 00000000000..9266dc6ebf0
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_general.dm
@@ -0,0 +1,3 @@
+/datum/gear/dice
+ display_name = "d20"
+ path = /obj/item/weapon/dice/d20
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm
new file mode 100644
index 00000000000..826cc7d5838
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_uniform.dm
@@ -0,0 +1,99 @@
+// Uniform slot
+/datum/gear/uniform
+ subtype_path = /datum/gear/uniform
+ slot = slot_w_uniform
+ sort_category = "Uniforms and Casual Dress"
+
+/datum/gear/uniform/skirt
+ subtype_path = /datum/gear/uniform/skirt
+
+/datum/gear/uniform/skirt/blue
+ display_name = "plaid skirt, blue"
+ path = /obj/item/clothing/under/dress/plaid_blue
+
+/datum/gear/uniform/skirt/purple
+ display_name = "plaid skirt, purple"
+ path = /obj/item/clothing/under/dress/plaid_purple
+
+/datum/gear/uniform/skirt/red
+ display_name = "plaid skirt, red"
+ path = /obj/item/clothing/under/dress/plaid_red
+
+/datum/gear/uniform/skirt/black
+ display_name = "skirt, black"
+ path = /obj/item/clothing/under/blackskirt
+
+/datum/gear/uniform/skirt/job
+ cost = 3
+ subtype_path = /datum/gear/uniform/skirt/job
+ subtype_cost_overlap = FALSE
+
+/datum/gear/uniform/skirt/job/ce
+ display_name = "skirt, ce"
+ path = /obj/item/clothing/under/rank/chief_engineer/skirt
+ allowed_roles = list("Chief Engineer")
+
+/datum/gear/uniform/skirt/job/atmos
+ display_name = "skirt, atmos"
+ path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
+ allowed_roles = list("Chief Engineer","Atmospheric Technician")
+
+/datum/gear/uniform/skirt/job/eng
+ display_name = "skirt, engineer"
+ path = /obj/item/clothing/under/rank/engineer/skirt
+ allowed_roles = list("Chief Engineer","Station Engineer")
+
+/datum/gear/uniform/skirt/job/roboticist
+ display_name = "skirt, roboticist"
+ path = /obj/item/clothing/under/rank/roboticist/skirt
+ allowed_roles = list("Research Director","Roboticist")
+
+/datum/gear/uniform/skirt/job/cmo
+ display_name = "skirt, cmo"
+ path = /obj/item/clothing/under/rank/chief_medical_officer
+ allowed_roles = list("Chief Medical Officer")
+
+/datum/gear/uniform/skirt/job/chem
+ display_name = "skirt, chemist"
+ path = /obj/item/clothing/under/rank/chemist/skirt
+ allowed_roles = list("Chief Medical Officer","Chemist")
+
+/datum/gear/uniform/skirt/job/viro
+ display_name = "skirt, virologist"
+ path = /obj/item/clothing/under/rank/virologist/skirt
+ allowed_roles = list("Chief Medical Officer","Medical Doctor")
+
+/datum/gear/uniform/skirt/job/med
+ display_name = "skirt, medical"
+ path = /obj/item/clothing/under/rank/medical/skirt
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
+
+/datum/gear/uniform/skirt/job/sci
+ display_name = "skirt, scientist"
+ path = /obj/item/clothing/under/rank/scientist/skirt
+ allowed_roles = list("Research Director","Scientist")
+
+/datum/gear/uniform/skirt/job/cargo
+ display_name = "skirt, cargo"
+ path = /obj/item/clothing/under/rank/cargotech/skirt
+ allowed_roles = list("Quartermaster","Cargo Technician")
+
+/datum/gear/uniform/skirt/job/qm
+ display_name = "skirt, QM"
+ path = /obj/item/clothing/under/rank/cargo/skirt
+ allowed_roles = list("Quartermaster")
+
+/datum/gear/uniform/skirt/job/warden
+ display_name = "skirt, warden"
+ path = /obj/item/clothing/under/rank/warden/skirt
+ allowed_roles = list("Head of Security", "Warden")
+
+/datum/gear/uniform/skirt/job/security
+ display_name = "skirt, security"
+ path = /obj/item/clothing/under/rank/security/skirt
+ allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
+
+/datum/gear/uniform/skirt/job/head_of_security
+ display_name = "skirt, hos"
+ path = /obj/item/clothing/under/rank/head_of_security/skirt
+ allowed_roles = list("Head of Security")
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preference/preferences.dm
similarity index 94%
rename from code/modules/client/preferences.dm
rename to code/modules/client/preference/preferences.dm
index 6d1240ac86d..899f29ed2b5 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -1,1902 +1,2021 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
-var/list/preferences_datums = list()
-
-var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
- ROLE_PAI = 0,
- ROLE_POSIBRAIN = 0,
- ROLE_GUARDIAN = 0,
- ROLE_TRAITOR = 7,
- ROLE_CHANGELING = 14,
- ROLE_SHADOWLING = 14,
- ROLE_WIZARD = 14,
- ROLE_REV = 14,
- ROLE_VAMPIRE = 14,
- ROLE_BLOB = 14,
- ROLE_REVENANT = 14,
- ROLE_OPERATIVE = 21,
- ROLE_CULTIST = 21,
- ROLE_RAIDER = 21,
- ROLE_ALIEN = 21,
- ROLE_DEMON = 21,
- ROLE_SENTIENT = 21,
-// ROLE_GANG = 21,
- ROLE_BORER = 21,
- ROLE_NINJA = 21,
- ROLE_MUTINEER = 21,
- ROLE_MALF = 30,
- ROLE_ABDUCTOR = 30,
-)
-
-/proc/player_old_enough_antag(client/C, role)
- if(available_in_days_antag(C, role) == 0)
- return 1 //Available in 0 days = available right now = player is old enough to play.
- return 0
-
-/proc/available_in_days_antag(client/C, role)
- if(!C)
- return 0
- if(!role)
- return 0
- if(!config.use_age_restriction_for_antags)
- return 0
- if(!isnum(C.player_age))
- return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
- var/minimal_player_age_antag = special_role_times[num2text(role)]
- if(!isnum(minimal_player_age_antag))
- return 0
-
- return max(0, minimal_player_age_antag - C.player_age)
-
-/proc/check_client_age(client/C, var/days) // If days isn't provided, returns the age of the client. If it is provided, it returns the days until the player_age is equal to or greater than the days variable
- if(!days)
- return C.player_age
- else
- return max(0, days - C.player_age)
- return 0
-
-//used for alternate_option
-#define GET_RANDOM_JOB 0
-#define BE_CIVILIAN 1
-#define RETURN_TO_LOBBY 2
-
-#define MAX_SAVE_SLOTS 20 // Save slots for regular players
-#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members
-
-#define TAB_CHAR 0
-#define TAB_GAME 1
-
-/datum/preferences
- //doohickeys for savefiles
-// var/path
- var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
-// var/savefile_version = 0
- var/max_save_slots = MAX_SAVE_SLOTS
-
- //non-preference stuff
- var/warns = 0
- var/muted = 0
- var/last_ip
- var/last_id
-
- //game-preferences
- var/lastchangelog = "" //Saved changelog filesize to detect if there was a change
- var/ooccolor = "#b82e00"
- var/be_special = list() //Special role selection
- var/UI_style = "Midnight"
- var/nanoui_fancy = TRUE
- var/toggles = TOGGLES_DEFAULT
- var/sound = SOUND_DEFAULT
- var/show_ghostitem_attack = TRUE
- var/UI_style_color = "#ffffff"
- var/UI_style_alpha = 255
-
-
- //character preferences
- var/real_name //our character's name
- var/be_random_name = 0 //whether we are a random name every round
- var/gender = MALE //gender of character (well duh)
- var/age = 30 //age of character
- var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
- var/b_type = "A+" //blood type (not-chooseable)
- var/underwear = "Nude" //underwear type
- var/undershirt = "Nude" //undershirt type
- var/socks = "Nude" //socks type
- var/backbag = 2 //backpack type
- var/ha_style = "None" //Head accessory style
- var/r_headacc = 0 //Head accessory colour
- var/g_headacc = 0 //Head accessory colour
- var/b_headacc = 0 //Head accessory colour
- var/m_style = "None" //Marking style
- var/r_markings = 0 //Marking colour
- var/g_markings = 0 //Marking colour
- var/b_markings = 0 //Marking colour
- var/h_style = "Bald" //Hair type
- var/r_hair = 0 //Hair color
- var/g_hair = 0 //Hair color
- var/b_hair = 0 //Hair color
- var/f_style = "Shaved" //Face hair type
- var/r_facial = 0 //Face hair color
- var/g_facial = 0 //Face hair color
- var/b_facial = 0 //Face hair color
- var/s_tone = 0 //Skin tone
- var/r_skin = 0 //Skin color
- var/g_skin = 0 //Skin color
- var/b_skin = 0 //Skin color
- var/r_eyes = 0 //Eye color
- var/g_eyes = 0 //Eye color
- var/b_eyes = 0 //Eye color
- var/species = "Human"
- var/language = "None" //Secondary language
-
- var/body_accessory = null
-
- var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess
-
- //Mob preview
- var/icon/preview_icon = null
- var/icon/preview_icon_front = null
- var/icon/preview_icon_side = null
-
- //Jobs, uses bitflags
- var/job_support_high = 0
- var/job_support_med = 0
- var/job_support_low = 0
-
- var/job_medsci_high = 0
- var/job_medsci_med = 0
- var/job_medsci_low = 0
-
- var/job_engsec_high = 0
- var/job_engsec_med = 0
- var/job_engsec_low = 0
-
- var/job_karma_high = 0
- var/job_karma_med = 0
- var/job_karma_low = 0
-
- //Keeps track of preferrence for not getting any wanted jobs
- var/alternate_option = 0
-
- // maps each organ to either null(intact), "cyborg" or "amputated"
- // will probably not be able to do this for head and torso ;)
- var/list/organ_data = list()
- var/list/rlimb_data = list()
-
- var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
-// var/accent = "en-us"
-// var/voice = "m1"
-// var/pitch = 50
-// var/talkspeed = 175
- var/flavor_text = ""
- var/med_record = ""
- var/sec_record = ""
- var/gen_record = ""
- var/disabilities = 0
-
- var/nanotrasen_relation = "Neutral"
-
- // 0 = character settings, 1 = game preferences
- var/current_tab = TAB_CHAR
-
- // OOC Metadata:
- var/metadata = ""
- var/slot_name = ""
-
- // Whether or not to use randomized character slots
- var/randomslot = 0
-
- // jukebox volume
- var/volume = 100
-
- // BYOND membership
- var/unlock_content = 0
-
-/datum/preferences/New(client/C)
- b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
- if(istype(C))
- if(!IsGuestKey(C.key))
- unlock_content = C.IsByondMember()
- if(unlock_content)
- max_save_slots = MAX_SAVE_SLOTS_MEMBER
- var/loaded_preferences_successfully = load_preferences(C)
- if(loaded_preferences_successfully)
- if(load_character(C))
- return
- //we couldn't load character data so just randomize the character appearance + name
- random_character() //let's create a random character then - rather than a fat, bald and naked man.
- real_name = random_name(gender)
- if(!loaded_preferences_successfully)
- save_preferences(C)
- save_character(C) //let's save this new random character so it doesn't keep generating new ones.
-
-/datum/preferences/proc/color_square(r, g, b)
- return "___"
-
-// Hello I am a proc full of snowflake species checks how are you
-/datum/preferences/proc/ShowChoices(mob/user)
- if(!user || !user.client)
- return
- update_preview_icon()
- user << browse_rsc(preview_icon_front, "previewicon.png")
- user << browse_rsc(preview_icon_side, "previewicon2.png")
-
- var/dat = ""
- dat += "
"
- dat += "Character Settings"
- dat += "Game Preferences"
- dat += ""
- dat += "
"
-
- switch(current_tab)
- if(TAB_CHAR) // Character Settings
- dat += "

"
- dat += ""
- dat += ""
- dat += "Identity"
- if(appearance_isbanned(user))
- 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 += "Gender: [gender == MALE ? "Male" : "Female"] "
- dat += "Age: [age] "
- dat += "Body: (®) "
- dat += "Species: [species] "
- if(species == "Vox")
- dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"] "
- dat += "Secondary Language: [language] "
- dat += "Blood Type: [b_type] "
- if(species in list("Human", "Drask", "Vox"))
- dat += "Skin Tone: [species == "Vox" ? "[s_tone]" : "[-s_tone + 35]/220"] "
- dat += "Disabilities: \[Set\] "
- dat += "Nanotrasen Relation: [nanotrasen_relation] "
- dat += "Set Flavor Text "
- if(lentext(flavor_text) <= 40)
- if(!lentext(flavor_text)) dat += "\[...\] "
- else dat += "[flavor_text] "
- else dat += "[TextPreview(flavor_text)]... "
-
- dat += "Hair & Accessories"
-
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
- var/headaccessoryname = "Head Accessory: "
- if(species == "Unathi")
- headaccessoryname = "Horns: "
- dat += "[headaccessoryname]"
- dat += "[ha_style] "
- dat += "Color [color_square(r_headacc, g_headacc, b_headacc)] "
-
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
- dat += "Body Markings: "
- dat += "[m_style]"
- dat += "Color [color_square(r_markings, g_markings, b_markings)] "
-
- dat += "Hair: "
- dat += "[h_style]"
- dat += "Color [color_square(r_hair, g_hair, b_hair)] "
-
- dat += "Facial Hair: "
- dat += "[f_style ? "[f_style]" : "Shaved"]"
- dat += "Color [color_square(r_facial, g_facial, b_facial)] "
-
- if(species != "Machine")
- dat += "Eyes: "
- dat += "Color [color_square(r_eyes, g_eyes, b_eyes)] "
-
- if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
- dat += "Body Color: "
- dat += "Color [color_square(r_skin, g_skin, b_skin)] "
-
- if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
- dat += "Body Accessory: "
- dat += "[body_accessory ? "[body_accessory]" : "None"] "
-
- dat += " | "
- dat += "Occupation Choices"
- dat += "Set Occupation Preferences "
- if(jobban_isbanned(user, "Records"))
- dat += "You are banned from using character records. "
- else
- dat += "Character Records "
-
- dat += "Limbs"
- dat += "Limbs and Parts: Adjust "
- if(species != "Slime People" && species != "Machine")
- dat += "Internal Organs: Adjust "
-
- //display limbs below
- var/ind = 0
- for(var/name in organ_data)
- var/status = organ_data[name]
- var/organ_name = null
- switch(name)
- if("chest") organ_name = "torso"
- if("groin") organ_name = "lower body"
- if("head") organ_name = "head"
- if("l_arm") organ_name = "left arm"
- if("r_arm") organ_name = "right arm"
- if("l_leg") organ_name = "left leg"
- if("r_leg") organ_name = "right leg"
- if("l_foot") organ_name = "left foot"
- if("r_foot") organ_name = "right foot"
- if("l_hand") organ_name = "left hand"
- if("r_hand") organ_name = "right hand"
- if("heart") organ_name = "heart"
- if("eyes") organ_name = "eyes"
-
- if(status in list("cyborg", "amputated", "mechanical", "assisted"))
- ++ind
- if(ind > 1) dat += ", "
-
- switch(status)
- if("cyborg")
- var/datum/robolimb/R
- if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
- R = all_robolimbs[rlimb_data[name]]
- else
- R = basic_robolimb
- dat += "\t[R.company] [organ_name] prosthesis"
- if("amputated") dat += "\tAmputated [organ_name]"
- if("mechanical") dat += "\tMechanical [organ_name]"
- if("assisted")
- switch(organ_name)
- if("heart") dat += "\tPacemaker-assisted [organ_name]"
- if("voicebox") dat += "\tSurgically altered [organ_name]"
- if("eyes") dat += "\tRetinal overlayed [organ_name]"
- else dat += "\tMechanically assisted [organ_name]"
- if(!ind) dat += "\[...\] "
- else dat += " "
-
- dat += "Clothing"
- dat += "Underwear: [underwear] "
- dat += "Undershirt: [undershirt] "
- dat += "Socks: [socks] "
- dat += "Backpack Type: [backbaglist[backbag]] "
-
- dat += " |
"
-
- if(TAB_GAME) // General Preferences
- dat += ""
-
- dat += "
"
- if(!IsGuestKey(user.key))
- dat += "Undo - "
- dat += "Save Setup - "
-
- dat += "Reset Setup"
- dat += ""
-
- var/datum/browser/popup = new(user, "preferences", "Character Setup
", 820, 640)
- popup.set_content(dat)
- popup.open(0)
-
-/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790)
- if(!job_master)
- return
-
- //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice.
- //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice.
- //width - Screen' width. Defaults to 550 to make it look nice.
- //height - Screen's height. Defaults to 500 to make it look nice.
-
-
- var/HTML = ""
- HTML += ""
- HTML += "Choose occupation chances
Unavailable occupations are crossed out.
"
- HTML += "\[Done\]
" // Easier to press up here.
- HTML += "Left-click to raise an occupation preference, right-click to lower it.
"
- HTML += ""
- HTML += "" // Table within a table for alignment, also allows you to easily add more colomns.
- HTML += ""
- var/index = -1
-
- //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
- var/datum/job/lastJob
- if (!job_master) return
- for(var/datum/job/job in job_master.occupations)
-
- if (job.admin_only)
- continue
-
- index += 1
- if((index >= limit) || (job.title in splitJobs))
- if((index < limit) && (lastJob != null))
- //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with
- //the last job's selection color. Creating a rather nice effect.
- for(var/i = 0, i < (limit - index), i += 1)
- HTML += "|   |   | "
- HTML += " | "
- index = 0
-
- HTML += "| "
- var/rank = job.title
- lastJob = job
- if(!is_job_whitelisted(user, rank))
- HTML += "[rank] | \[KARMA] | "
- continue
- if(jobban_isbanned(user, rank))
- HTML += "[rank] \[BANNED] | "
- continue
- if(!job.player_old_enough(user.client))
- var/available_in_days = job.available_in_days(user.client)
- HTML += "[rank] \[IN [(available_in_days)] DAYS] | "
- continue
- if((job_support_low & CIVILIAN) && (rank != "Civilian"))
- HTML += "[rank] | "
- continue
- if((rank in command_positions) || (rank == "AI"))//Bold head jobs
- HTML += "[rank]"
- else
- HTML += "[rank]"
-
- HTML += ""
-
- var/prefLevelLabel = "ERROR"
- var/prefLevelColor = "pink"
- var/prefUpperLevel = -1 // level to assign on left click
- var/prefLowerLevel = -1 // level to assign on right click
-
- if(GetJobDepartment(job, 1) & job.flag)
- prefLevelLabel = "High"
- prefLevelColor = "slateblue"
- prefUpperLevel = 4
- prefLowerLevel = 2
- else if(GetJobDepartment(job, 2) & job.flag)
- prefLevelLabel = "Medium"
- prefLevelColor = "green"
- prefUpperLevel = 1
- prefLowerLevel = 3
- else if(GetJobDepartment(job, 3) & job.flag)
- prefLevelLabel = "Low"
- prefLevelColor = "orange"
- prefUpperLevel = 2
- prefLowerLevel = 4
- else
- prefLevelLabel = "NEVER"
- prefLevelColor = "red"
- prefUpperLevel = 3
- prefLowerLevel = 1
-
-
- HTML += ""
-
-// HTML += ""
-
- if(rank == "Civilian")//Civilian is special
- if(job_support_low & CIVILIAN)
- HTML += " \[Yes]"
- else
- HTML += " \[No]"
- if(job.alt_titles)
- HTML += " \[[GetPlayerAltTitle(job)]\] | "
- HTML += ""
- continue
-/*
- if(GetJobDepartment(job, 1) & job.flag)
- HTML += " \[High]"
- else if(GetJobDepartment(job, 2) & job.flag)
- HTML += " \[Medium]"
- else if(GetJobDepartment(job, 3) & job.flag)
- HTML += " \[Low]"
- else
- HTML += " \[NEVER]"
- */
- HTML += "[prefLevelLabel]"
-
- if(job.alt_titles)
- HTML += " \[[GetPlayerAltTitle(job)]\]"
-
-
- HTML += ""
-
- for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even
- HTML += "|   |   | "
-
- HTML += " "
-
- HTML += " |
"
-
- switch(alternate_option)
- if(GET_RANDOM_JOB)
- HTML += "
Get random job if preferences unavailable
"
- if(BE_CIVILIAN)
- HTML += "
Be a civilian if preferences unavailable
"
- if(RETURN_TO_LOBBY)
- HTML += "
Return to lobby if preferences unavailable
"
-
- HTML += "\[Reset\]"
- HTML += ""
-
- user << browse(null, "window=preferences")
-// user << browse(HTML, "window=mob_occupation;size=[width]x[height]")
- var/datum/browser/popup = new(user, "mob_occupation", "Occupation Preferences
", width, height)
- popup.set_window_options("can_close=0")
- popup.set_content(HTML)
- popup.open(0)
- return
-
-/datum/preferences/proc/SetJobPreferenceLevel(var/datum/job/job, var/level)
- if (!job)
- return 0
-
- if (level == 1) // to high
- // remove any other job(s) set to high
- job_support_med |= job_support_high
- job_engsec_med |= job_engsec_high
- job_medsci_med |= job_medsci_high
- job_karma_med |= job_karma_high
- job_support_high = 0
- job_engsec_high = 0
- job_medsci_high = 0
- job_karma_high = 0
-
- if (job.department_flag == SUPPORT)
- job_support_low &= ~job.flag
- job_support_med &= ~job.flag
- job_support_high &= ~job.flag
-
- switch(level)
- if (1)
- job_support_high |= job.flag
- if (2)
- job_support_med |= job.flag
- if (3)
- job_support_low |= job.flag
-
- return 1
- else if (job.department_flag == ENGSEC)
- job_engsec_low &= ~job.flag
- job_engsec_med &= ~job.flag
- job_engsec_high &= ~job.flag
-
- switch(level)
- if (1)
- job_engsec_high |= job.flag
- if (2)
- job_engsec_med |= job.flag
- if (3)
- job_engsec_low |= job.flag
-
- return 1
- else if (job.department_flag == MEDSCI)
- job_medsci_low &= ~job.flag
- job_medsci_med &= ~job.flag
- job_medsci_high &= ~job.flag
-
- switch(level)
- if (1)
- job_medsci_high |= job.flag
- if (2)
- job_medsci_med |= job.flag
- if (3)
- job_medsci_low |= job.flag
-
- return 1
- else if (job.department_flag == KARMA)
- job_karma_low &= ~job.flag
- job_karma_med &= ~job.flag
- job_karma_high &= ~job.flag
-
- switch(level)
- if (1)
- job_karma_high |= job.flag
- if (2)
- job_karma_med |= job.flag
- if (3)
- job_karma_low |= job.flag
-
- return 1
-
- return 0
-
-/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl)
- var/datum/job/job = job_master.GetJob(role)
-
- if(!job)
- user << browse(null, "window=mob_occupation")
- ShowChoices(user)
- return
-
- if (!isnum(desiredLvl))
- to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!")
- ShowChoices(user)
- return
-
- if(role == "Civilian")
- if(job_support_low & job.flag)
- job_support_low &= ~job.flag
- else
- job_support_low |= job.flag
- SetChoices(user)
- return 1
-
- SetJobPreferenceLevel(job, desiredLvl)
- SetChoices(user)
-
- return 1
-
-/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
- if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))
- return "[species] cannot be fat."
- return "[label]: [disabilities & flag ? "Yes" : "No"]"
-
-/datum/preferences/proc/SetDisabilities(mob/user)
- var/HTML = ""
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += ""
- HTML += {"
- Choose disabilities"}
- // END AUTOFIX
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
-
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += "
"
- HTML += {"
- \[Done\]
- \[Reset\]
- "}
- // END AUTOFIX
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=disabil;size=350x300")
- return
-
-/datum/preferences/proc/SetRecords(mob/user)
- var/HTML = ""
- HTML += ""
- HTML += "Set Character Records
"
-
- HTML += "Medical Records
"
-
- if(lentext(med_record) <= 40)
- HTML += "[med_record]"
- else
- HTML += "[copytext(med_record, 1, 37)]..."
-
- HTML += "
Employment Records
"
-
- if(lentext(gen_record) <= 40)
- HTML += "[gen_record]"
- else
- HTML += "[copytext(gen_record, 1, 37)]..."
-
- HTML += "
Security Records
"
-
- if(lentext(sec_record) <= 40)
- HTML += "[sec_record]
"
- else
- HTML += "[copytext(sec_record, 1, 37)]...
"
-
- HTML += "
"
- HTML += "\[Done\]"
- HTML += ""
-
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=records;size=350x300")
- return
-
-/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
- return player_alt_titles.Find(job.title) > 0 \
- ? player_alt_titles[job.title] \
- : job.title
-
-/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title)
- // remove existing entry
- if(player_alt_titles.Find(job.title))
- player_alt_titles -= job.title
- // add one if it's not default
- if(job.title != new_title)
- player_alt_titles[job.title] = new_title
-
-/datum/preferences/proc/SetJob(mob/user, role)
- var/datum/job/job = job_master.GetJob(role)
- if(!job)
- user << browse(null, "window=mob_occupation")
- ShowChoices(user)
- return
-
- if(role == "Civilian")
- if(job_support_low & job.flag)
- job_support_low &= ~job.flag
- else
- job_support_low |= job.flag
- SetChoices(user)
- return 1
-
- if(GetJobDepartment(job, 1) & job.flag)
- SetJobDepartment(job, 1)
- else if(GetJobDepartment(job, 2) & job.flag)
- SetJobDepartment(job, 2)
- else if(GetJobDepartment(job, 3) & job.flag)
- SetJobDepartment(job, 3)
- else//job = Never
- SetJobDepartment(job, 4)
-
- SetChoices(user)
- return 1
-
-/datum/preferences/proc/ResetJobs()
- job_support_high = 0
- job_support_med = 0
- job_support_low = 0
-
- job_medsci_high = 0
- job_medsci_med = 0
- job_medsci_low = 0
-
- job_engsec_high = 0
- job_engsec_med = 0
- job_engsec_low = 0
-
- job_karma_high = 0
- job_karma_med = 0
- job_karma_low = 0
-
-
-/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
- if(!job || !level) return 0
- switch(job.department_flag)
- if(SUPPORT)
- switch(level)
- if(1)
- return job_support_high
- if(2)
- return job_support_med
- if(3)
- return job_support_low
- if(MEDSCI)
- switch(level)
- if(1)
- return job_medsci_high
- if(2)
- return job_medsci_med
- if(3)
- return job_medsci_low
- if(ENGSEC)
- switch(level)
- if(1)
- return job_engsec_high
- if(2)
- return job_engsec_med
- if(3)
- return job_engsec_low
- if(KARMA)
- switch(level)
- if(1)
- return job_karma_high
- if(2)
- return job_karma_med
- if(3)
- return job_karma_low
- return 0
-
-/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level)
- if(!job || !level) return 0
- switch(level)
- if(1)//Only one of these should ever be active at once so clear them all here
- job_support_high = 0
- job_medsci_high = 0
- job_engsec_high = 0
- job_karma_high = 0
- return 1
- if(2)//Set current highs to med, then reset them
- job_support_med |= job_support_high
- job_medsci_med |= job_medsci_high
- job_engsec_med |= job_engsec_high
- job_karma_med |= job_karma_high
- job_support_high = 0
- job_medsci_high = 0
- job_engsec_high = 0
- job_karma_high = 0
-
- switch(job.department_flag)
- if(SUPPORT)
- switch(level)
- if(2)
- job_support_high = job.flag
- job_support_med &= ~job.flag
- if(3)
- job_support_med |= job.flag
- job_support_low &= ~job.flag
- else
- job_support_low |= job.flag
- if(MEDSCI)
- switch(level)
- if(2)
- job_medsci_high = job.flag
- job_medsci_med &= ~job.flag
- if(3)
- job_medsci_med |= job.flag
- job_medsci_low &= ~job.flag
- else
- job_medsci_low |= job.flag
- if(ENGSEC)
- switch(level)
- if(2)
- job_engsec_high = job.flag
- job_engsec_med &= ~job.flag
- if(3)
- job_engsec_med |= job.flag
- job_engsec_low &= ~job.flag
- else
- job_engsec_low |= job.flag
- if(KARMA)
- switch(level)
- if(2)
- job_karma_high = job.flag
- job_karma_med &= ~job.flag
- if(3)
- job_karma_med |= job.flag
- job_karma_low &= ~job.flag
- else
- job_karma_low |= job.flag
- return 1
-
-/datum/preferences/proc/process_link(mob/user, list/href_list)
- if(!user) return
-
- if(href_list["preference"] == "job")
- switch(href_list["task"])
- if("close")
- user << browse(null, "window=mob_occupation")
- ShowChoices(user)
- if("reset")
- ResetJobs()
- SetChoices(user)
- if("random")
- if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN)
- alternate_option += 1
- else if(alternate_option == RETURN_TO_LOBBY)
- alternate_option = 0
- else
- return 0
- SetChoices(user)
- if ("alt_title")
- var/datum/job/job = locate(href_list["job"])
- if (job)
- var/choices = list(job.title) + job.alt_titles
- var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null
- if(choice)
- SetPlayerAltTitle(job, choice)
- SetChoices(user)
- if("input")
- SetJob(user, href_list["text"])
- if("setJobLevel")
- UpdateJobPreference(user, href_list["text"], text2num(href_list["level"]))
- else
- SetChoices(user)
- return 1
- else if(href_list["preference"] == "disabilities")
-
- switch(href_list["task"])
- if("close")
- user << browse(null, "window=disabil")
- ShowChoices(user)
- if("reset")
- disabilities=0
- SetDisabilities(user)
- if("input")
- var/dflag=text2num(href_list["disability"])
- if(dflag >= 0)
- if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")))
- disabilities ^= text2num(href_list["disability"]) //MAGIC
- SetDisabilities(user)
- else
- SetDisabilities(user)
- return 1
-
- else if(href_list["preference"] == "records")
- if(text2num(href_list["record"]) >= 1)
- SetRecords(user)
- return
- else
- user << browse(null, "window=records")
- if(href_list["task"] == "med_record")
- var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message
-
- if(medmsg != null)
- medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN)
- medmsg = html_encode(medmsg)
-
- med_record = medmsg
- SetRecords(user)
-
- if(href_list["task"] == "sec_record")
- var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message
-
- if(secmsg != null)
- secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN)
- secmsg = html_encode(secmsg)
-
- sec_record = secmsg
- SetRecords(user)
- if(href_list["task"] == "gen_record")
- var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message
-
- if(genmsg != null)
- genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN)
- genmsg = html_encode(genmsg)
-
- gen_record = genmsg
- SetRecords(user)
-
- switch(href_list["task"])
- if("random")
- switch(href_list["preference"])
- if("name")
- real_name = random_name(gender,species)
- if("age")
- age = rand(AGE_MIN, AGE_MAX)
- if("hair")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
- r_hair = rand(0,255)
- g_hair = rand(0,255)
- b_hair = rand(0,255)
- if("h_style")
- h_style = random_hair_style(gender, species)
- if("facial")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
- r_facial = rand(0,255)
- g_facial = rand(0,255)
- b_facial = rand(0,255)
- if("f_style")
- f_style = random_facial_hair_style(gender, species)
- if("underwear")
- underwear = random_underwear(gender)
- ShowChoices(user)
- if("undershirt")
- undershirt = random_undershirt(gender)
- ShowChoices(user)
- if("socks")
- socks = random_socks(gender)
- ShowChoices(user)
- if("eyes")
- r_eyes = rand(0,255)
- g_eyes = rand(0,255)
- b_eyes = rand(0,255)
- if("s_tone")
- if(species in list("Human", "Drask", "Vox"))
- s_tone = random_skin_tone(species)
- if("s_color")
- if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine"))
- r_skin = rand(0,255)
- g_skin = rand(0,255)
- b_skin = rand(0,255)
- if("bag")
- backbag = rand(1,4)
- /*if("skin_style")
- h_style = random_skin_style(gender)*/
- if("all")
- random_character()
- if("input")
- switch(href_list["preference"])
- if("name")
- var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null
- if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.)
- var/new_name = reject_bad_name(raw_name)
- if(new_name)
- real_name = new_name
- else
- to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .")
-
- if("age")
- var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null
- if(new_age)
- age = max(min(round(text2num(new_age)), AGE_MAX),AGE_MIN)
- if("species")
-
- var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
- var/prev_species = species
-// var/whitelisted = 0
-
- if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
- for(var/S in whitelisted_species)
- if(is_alien_whitelisted(user,S))
- new_species += S
-// whitelisted = 1
-// if(!whitelisted)
-// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
- else //Not using the whitelist? Aliens for everyone!
- new_species += whitelisted_species
-
- species = input("Please select a species", "Character Generation", null) in new_species
-
- if(prev_species != species)
- //grab one of the valid hair styles for the newly chosen species
- var/list/valid_hairstyles = list()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
-
- valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
-
- if(valid_hairstyles.len)
- h_style = pick(valid_hairstyles)
- else
- //this shouldn't happen
- h_style = hair_styles_list["Bald"]
-
- //grab one of the valid facial hair styles for the newly chosen species
- var/list/valid_facialhairstyles = list()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
-
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
- else
- //this shouldn't happen
- f_style = facial_hair_styles_list["Shaved"]
-
- // Don't wear another species' underwear!
- var/datum/sprite_accessory/S = underwear_list[underwear]
- if(!(species in S.species_allowed))
- underwear = random_underwear(gender, species)
-
- S = undershirt_list[undershirt]
- if(!(species in S.species_allowed))
- undershirt = random_undershirt(gender, species)
-
- S = socks_list[socks]
- if(!(species in S.species_allowed))
- socks = random_socks(gender, species)
-
- //reset hair colour and skin colour
- r_hair = 0//hex2num(copytext(new_hair, 2, 4))
- g_hair = 0//hex2num(copytext(new_hair, 4, 6))
- b_hair = 0//hex2num(copytext(new_hair, 6, 8))
-
- s_tone = 0
-
- if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")))
- r_skin = 0
- g_skin = 0
- b_skin = 0
-
- ha_style = "None" // No Vulp ears on Unathi
- m_style = "None" // No Unathi markings on Tajara
-
- body_accessory = null //no vulptail on humans damnit
-
- //Reset prosthetics.
- organ_data = list()
- rlimb_data = list()
- if("speciesprefs")//oldvox code
- speciesprefs = !speciesprefs
-
- if("language")
-// var/languages_available
- var/list/new_languages = list("None")
-/*
- if(config.usealienwhitelist)
- for(var/L in all_languages)
- var/datum/language/lang = all_languages[L]
- if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))))
- new_languages += lang
- languages_available = 1
-
- if(!(languages_available))
- alert(user, "There are not currently any available secondary languages.")
- else
-*/
- for(var/L in all_languages)
- var/datum/language/lang = all_languages[L]
- if(!(lang.flags & RESTRICTED))
- new_languages += lang.name
-
- language = input("Please select a secondary language", "Character Generation", null) in new_languages
-
- if("metadata")
- var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null
- if(new_metadata)
- metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN))
-
- if("b_type")
- var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" )
- if(new_b_type)
- b_type = new_b_type
-
- if("hair")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
- var/input = "Choose your character's hair colour:"
- var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
- if(new_hair)
- r_hair = hex2num(copytext(new_hair, 2, 4))
- g_hair = hex2num(copytext(new_hair, 4, 6))
- b_hair = hex2num(copytext(new_hair, 6, 8))
-
- if("h_style")
- var/list/valid_hairstyles = list()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(S.name == "Bald")
- valid_hairstyles[hairstyle] = S
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head
- //and said head is in the hair style's allowed models list...
- valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle.
- continue
- else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_hairstyles[hairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
-
- valid_hairstyles[hairstyle] = S
-
- var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
- if(new_h_style)
- h_style = new_h_style
-
- if("headaccessory")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
- var/input = "Choose the colour of your your character's head accessory:"
- var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
- if(new_head_accessory)
- r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
-
- if("ha_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
- var/list/valid_head_accessory_styles = list()
- for(var/head_accessory_style in head_accessory_styles_list)
- var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style]
- if(!(species in H.species_allowed))
- continue
-
- valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
-
- var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles
- if(new_head_accessory_style)
- ha_style = new_head_accessory_style
-
- if("markings")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/input = "Choose the colour of your your character's markings:"
- var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
- if(new_markings)
- r_markings = hex2num(copytext(new_markings, 2, 4))
- g_markings = hex2num(copytext(new_markings, 4, 6))
- b_markings = hex2num(copytext(new_markings, 6, 8))
-
- if("m_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/list/valid_markings = list()
- for(var/markingstyle in marking_styles_list)
- var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
- if(!(species in M.species_allowed))
- continue
-
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings.
- continue
- else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip.
- if(!(robohead.company in M.models_allowed))
- continue
-
- valid_markings[markingstyle] = marking_styles_list[markingstyle]
-
- var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings
- if(new_marking_style)
- m_style = new_marking_style
-
- if("body_accessory")
- var/list/possible_body_accessories = list()
- if(check_rights(R_ADMIN, 1, user))
- possible_body_accessories = body_accessory_by_name.Copy()
- else
- for(var/B in body_accessory_by_name)
- var/datum/body_accessory/accessory = body_accessory_by_name[B]
- if(!istype(accessory))
- possible_body_accessories += "None" //the only null entry should be the "None" option
- continue
- if(species in accessory.allowed_species)
- possible_body_accessories += B
-
- var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
- if(new_body_accessory)
- body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
-
- if("facial")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
- var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
- if(new_facial)
- r_facial = hex2num(copytext(new_facial, 2, 4))
- g_facial = hex2num(copytext(new_facial, 4, 6))
- b_facial = hex2num(copytext(new_facial, 6, 8))
-
- if("f_style")
- var/list/valid_facialhairstyles = list()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(S.name == "Shaved")
- valid_facialhairstyles[facialhairstyle] = S
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it.
- valid_facialhairstyles[facialhairstyle] = S
- continue
- else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_facialhairstyles[facialhairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
-
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles
- if(new_f_style)
- f_style = new_f_style
-
- if("underwear")
- var/list/underwear_options
- if(gender == MALE)
- underwear_options = underwear_m
- else
- underwear_options = underwear_f
-
- var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options
- if(new_underwear)
- underwear = new_underwear
- ShowChoices(user)
-
- if("undershirt")
- var/new_undershirt
- if(gender == MALE)
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m
- else
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f
- if(new_undershirt)
- undershirt = new_undershirt
- ShowChoices(user)
-
- if("socks")
- var/list/valid_sockstyles = list()
- for(var/sockstyle in socks_list)
- var/datum/sprite_accessory/S = socks_list[sockstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
- valid_sockstyles[sockstyle] = socks_list[sockstyle]
- var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
- ShowChoices(user)
- if(new_socks)
- socks = new_socks
-
- if("eyes")
- var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null
- if(new_eyes)
- r_eyes = hex2num(copytext(new_eyes, 2, 4))
- g_eyes = hex2num(copytext(new_eyes, 4, 6))
- b_eyes = hex2num(copytext(new_eyes, 6, 8))
-
- if("s_tone")
- if(species == "Human" || species == "Drask")
- var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null
- if(new_s_tone)
- s_tone = 35 - max(min(round(new_s_tone), 220), 1)
- else if(species == "Vox")
- var/skin_c = input(user, "Choose your Vox's skin color:\n(1 = Default Green, 2 = Dark Green, 3 = Brown, 4 = Grey, \n5 = Emerald, 6 = Azure)", "Character Preference") as num|null
- if(skin_c)
- s_tone = max(min(round(skin_c), 6), 1)
-
- if("skin")
- if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
- var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
- if(new_skin)
- r_skin = hex2num(copytext(new_skin, 2, 4))
- g_skin = hex2num(copytext(new_skin, 4, 6))
- b_skin = hex2num(copytext(new_skin, 6, 8))
-
- if("ooccolor")
- var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null
- if(new_ooccolor)
- ooccolor = new_ooccolor
-
- if("bag")
- var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
- if(new_backbag)
- backbag = backbaglist.Find(new_backbag)
-
- if("nt_relation")
- var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
- if(new_relation)
- nanotrasen_relation = new_relation
-
- if("flavor_text")
- var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message
-
- if(msg != null)
- msg = copytext(msg, 1, MAX_MESSAGE_LEN)
- msg = html_encode(msg)
-
- flavor_text = msg
-
- if("limbs")
- var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
- if(species == "Machine")
- valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
- var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs
- if(!limb_name) return
-
- var/limb = null
- var/second_limb = null // if you try to change the arm, the hand should also change
- var/third_limb = null // if you try to unchange the hand, the arm should also change
- var/valid_limb_states = list("Normal", "Amputated", "Prosthesis")
- var/no_amputate = 0
-
- switch(limb_name)
- if("Torso")
- limb = "chest"
- second_limb = "groin"
- no_amputate = 1
- if("Lower Body")
- limb = "groin"
- no_amputate = 1
- if("Head")
- limb = "head"
- no_amputate = 1
- if("Left Leg")
- limb = "l_leg"
- second_limb = "l_foot"
- if("Right Leg")
- limb = "r_leg"
- second_limb = "r_foot"
- if("Left Arm")
- limb = "l_arm"
- second_limb = "l_hand"
- if("Right Arm")
- limb = "r_arm"
- second_limb = "r_hand"
- if("Left Foot")
- limb = "l_foot"
- if(species != "Machine")
- third_limb = "l_leg"
- if("Right Foot")
- limb = "r_foot"
- if(species != "Machine")
- third_limb = "r_leg"
- if("Left Hand")
- limb = "l_hand"
- if(species != "Machine")
- third_limb = "l_arm"
- if("Right Hand")
- limb = "r_hand"
- if(species != "Machine")
- third_limb = "r_arm"
-
- var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states
- if(!new_state) return
-
- switch(new_state)
- if("Normal")
- if(limb == "head")
- m_style = "None"
- h_style = random_hair_style(gender, species)
- f_style = facial_hair_styles_list["Shaved"]
- organ_data[limb] = null
- rlimb_data[limb] = null
- if(third_limb)
- organ_data[third_limb] = null
- rlimb_data[third_limb] = null
- if("Amputated")
- if(!no_amputate)
- organ_data[limb] = "amputated"
- rlimb_data[limb] = null
- if(second_limb)
- organ_data[second_limb] = "amputated"
- rlimb_data[second_limb] = null
- if("Prosthesis")
- var/choice
- var/subchoice
- var/datum/robolimb/R = new()
- var/in_model
- var/robolimb_companies = list()
- for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products.
- R = new limb_type()
- if(!R.unavailable_at_chargen && (limb in R.parts) && R.has_subtypes) //Ensures users can only choose companies that offer the parts they want, that singular models get added to the list as well companies that offer more than one model, and...
- robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for.
- R = new() //Re-initialize R.
-
- choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants.
- if(!choice)
- return
- R.company = choice
- R = all_robolimbs[R.company]
- if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it.
- var/list/robolimb_models = list()
- for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide.
- var/datum/robolimb/L = new limb_type()
- if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list.
- robolimb_models[L.company] = L
- if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option.
- subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem.
- if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later.
- in_model = 1
- if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose.
- subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
- if(subchoice)
- choice = subchoice
- if(limb == "head")
- ha_style = "None"
- h_style = hair_styles_list["Bald"]
- f_style = facial_hair_styles_list["Shaved"]
- m_style = "None"
- rlimb_data[limb] = choice
- organ_data[limb] = "cyborg"
- if(second_limb)
- if(subchoice)
- if(in_model)
- rlimb_data[second_limb] = choice
- organ_data[second_limb] = "cyborg"
- else
- rlimb_data[second_limb] = choice
- organ_data[second_limb] = "cyborg"
-
- if("organs")
- var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
- if(!organ_name) return
-
- var/organ = null
- switch(organ_name)
- if("Heart")
- organ = "heart"
- if("Eyes")
- organ = "eyes"
-
- var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical")
- if(!new_state) return
-
- switch(new_state)
- if("Normal")
- organ_data[organ] = null
- if("Assisted")
- organ_data[organ] = "assisted"
- if("Mechanical")
- organ_data[organ] = "mechanical"
-
-/*
- if("skin_style")
- var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
- if(!skin_style_name) return
-*/
-
-/* if("spawnpoint")
- var/list/spawnkeys = list()
- for(var/S in spawntypes)
- spawnkeys += S
- var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys
- if(!choice || !spawntypes[choice])
- spawnpoint = "Arrivals Shuttle"
- return
- spawnpoint = choice */
-
- else
- switch(href_list["preference"])
- if("publicity")
- if(unlock_content)
- toggles ^= MEMBER_PUBLIC
-
- if("gender")
- if(gender == MALE)
- gender = FEMALE
- else
- gender = MALE
- underwear = random_underwear(gender)
-
- if("hear_adminhelps")
- sound ^= SOUND_ADMINHELP
-
- if("ui")
- switch(UI_style)
- if("Midnight")
- UI_style = "Plasmafire"
- if("Plasmafire")
- UI_style = "Retro"
- if("Retro")
- UI_style = "Slimecore"
- if("Slimecore")
- UI_style = "Operative"
- if("Operative")
- UI_style = "White"
- else
- UI_style = "Midnight"
-
- if(ishuman(usr)) //mid-round preference changes, for aesthetics
- var/mob/living/carbon/human/H = usr
- H.remake_hud()
-
- if("nanoui")
- nanoui_fancy = !nanoui_fancy
-
- if("ghost_att_anim")
- show_ghostitem_attack = !show_ghostitem_attack
-
- if("UIcolor")
- var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null
- if(!UI_style_color_new) return
- UI_style_color = UI_style_color_new
-
- if(ishuman(usr)) //mid-round preference changes, for aesthetics
- var/mob/living/carbon/human/H = usr
- H.remake_hud()
-
- if("UIalpha")
- var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num
- if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return
- UI_style_alpha = UI_style_alpha_new
-
- if(ishuman(usr)) //mid-round preference changes, for aesthetics
- var/mob/living/carbon/human/H = usr
- H.remake_hud()
-
- if("be_special")
- var/r = href_list["role"]
- if(!(r in special_roles))
- var/cleaned_r = sql_sanitize_text(r)
- if(r != cleaned_r) // up to no good
- message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]")
- to_chat(user, "Stop right there, criminal scum")
- else
- be_special ^= r
-
- if("name")
- be_random_name = !be_random_name
-
- if("randomslot")
- randomslot = !randomslot
-
- if("hear_midis")
- sound ^= SOUND_MIDI
-
- if("lobby_music")
- sound ^= SOUND_LOBBY
- if(sound & SOUND_LOBBY)
- user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
- else
- user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
-
- if("ghost_ears")
- toggles ^= CHAT_GHOSTEARS
-
- if("ghost_sight")
- toggles ^= CHAT_GHOSTSIGHT
-
- if("ghost_radio")
- toggles ^= CHAT_GHOSTRADIO
-
- if("ghost_radio")
- toggles ^= CHAT_GHOSTRADIO
-
- if("save")
- save_preferences(user)
- save_character(user)
-
- if("reload")
- load_preferences(user)
- load_character(user)
-
- if("open_load_dialog")
- if(!IsGuestKey(user.key))
- open_load_dialog(user)
- return 1
-
- if("close_load_dialog")
- close_load_dialog(user)
-
- if("changeslot")
- if(!load_character(user,text2num(href_list["num"])))
- random_character()
- real_name = random_name(gender)
- save_character(user)
- close_load_dialog(user)
-
- if("tab")
- if (href_list["tab"])
- current_tab = text2num(href_list["tab"])
-
- ShowChoices(user)
- return 1
-
-/datum/preferences/proc/copy_to(mob/living/carbon/human/character)
- var/datum/species/S = all_species[species]
- character.change_species(species) // Yell at me if this causes everything to melt
- if(be_random_name)
- real_name = random_name(gender,species)
-
- if(config.humans_need_surnames)
- var/firstspace = findtext(real_name, " ")
- var/name_length = length(real_name)
- if(!firstspace) //we need a surname
- real_name += " [pick(last_names)]"
- else if(firstspace == name_length)
- real_name += "[pick(last_names)]"
-
- character.add_language(language)
-
- character.real_name = real_name
- character.dna.real_name = real_name
- character.name = character.real_name
-
- character.flavor_text = flavor_text
- if(character.ckey && !jobban_isbanned(character, "Records"))
- character.med_record = med_record
- character.sec_record = sec_record
- character.gen_record = gen_record
-
- character.change_gender(gender)
- character.age = age
- character.b_type = b_type
-
- character.r_eyes = r_eyes
- character.g_eyes = g_eyes
- character.b_eyes = b_eyes
-
- //Head-specific
- var/obj/item/organ/external/head/H = character.get_organ("head")
- H.r_hair = r_hair
- H.g_hair = g_hair
- H.b_hair = b_hair
-
- H.r_facial = r_facial
- H.g_facial = g_facial
- H.b_facial = b_facial
-
- H.h_style = h_style
- H.f_style = f_style
- //End of head-specific.
-
- character.r_skin = r_skin
- character.g_skin = g_skin
- character.b_skin = b_skin
-
- character.s_tone = s_tone
-
- // Destroy/cyborgize organs
- for(var/name in organ_data)
-
- var/status = organ_data[name]
- var/obj/item/organ/external/O = character.organs_by_name[name]
- if(O)
- if(status == "amputated")
- character.organs_by_name[O.limb_name] = null
- character.organs -= O
- if(O.children) // This might need to become recursive.
- for(var/obj/item/organ/external/child in O.children)
- character.organs_by_name[child.limb_name] = null
- character.organs -= child
-
- else if(status == "cyborg")
- if(rlimb_data[name])
- O.robotize(rlimb_data[name])
- else
- O.robotize()
- else
- var/obj/item/organ/internal/I = character.get_int_organ_tag(name)
- if(I)
- if(status == "assisted")
- I.mechassist()
- else if(status == "mechanical")
- I.robotize()
-
- character.dna.b_type = b_type
- if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)
- character.dna.SetSEState(FATBLOCK,1,1)
- character.mutations += FAT
- character.mutations += OBESITY
- character.overeatduration = 600
-
- if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
- character.dna.SetSEState(GLASSESBLOCK,1,1)
- character.disabilities|=NEARSIGHTED
-
- if(disabilities & DISABILITY_FLAG_EPILEPTIC)
- character.dna.SetSEState(EPILEPSYBLOCK,1,1)
- character.disabilities|=EPILEPSY
-
- if(disabilities & DISABILITY_FLAG_DEAF)
- character.dna.SetSEState(DEAFBLOCK,1,1)
- character.sdisabilities|=DEAF
-
- if(disabilities & DISABILITY_FLAG_BLIND)
- character.dna.SetSEState(BLINDBLOCK,1,1)
- character.sdisabilities|=BLIND
-
- if(disabilities & DISABILITY_FLAG_MUTE)
- character.dna.SetSEState(MUTEBLOCK,1,1)
- character.sdisabilities |= MUTE
-
- S.handle_dna(character)
-
- if(character.dna.dirtySE)
- character.dna.UpdateSE()
- domutcheck(character)
-
- // Wheelchair necessary?
- var/obj/item/organ/external/l_foot = character.get_organ("l_foot")
- var/obj/item/organ/external/r_foot = character.get_organ("r_foot")
- if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
- var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
- character.buckled = W
- character.update_canmove()
- W.dir = character.dir
- W.buckled_mob = character
- W.add_fingerprint(character)
-
- character.underwear = underwear
- character.undershirt = undershirt
- character.socks = socks
-
- if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
- H.r_headacc = r_headacc
- H.g_headacc = g_headacc
- H.b_headacc = b_headacc
- H.ha_style = ha_style
- if(character.species.bodyflags & HAS_MARKINGS)
- character.r_markings = r_markings
- character.g_markings = g_markings
- character.b_markings = b_markings
- character.m_style = m_style
-
- if(body_accessory)
- character.body_accessory = body_accessory_by_name["[body_accessory]"]
-
- if(backbag > 4 || backbag < 1)
- backbag = 1 //Same as above
- character.backbag = backbag
-
- //Debugging report to track down a bug, which randomly assigned the plural gender to people.
- if(character.gender in list(PLURAL, NEUTER))
- if(isliving(src)) //Ghosts get neuter by default
- message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
- character.change_gender(MALE)
-
- character.dna.ready_dna(character, flatten_SE = 0)
- character.sync_organ_dna(assimilate=1)
- character.UpdateAppearance()
-
- // Do the initial caching of the player's body icons.
- character.force_update_limbs()
- character.update_eyes()
- character.regenerate_icons()
-
-/datum/preferences/proc/open_load_dialog(mob/user)
-
- var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot")
-
- var/dat = ""
- dat += ""
- dat += "Select a character slot to load
"
- var/name
-
- for(var/i=1, i<=max_save_slots, i++)
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
- message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
- return
- while(query.NextRow())
- if(i==text2num(query.item[1]))
- name = query.item[2]
- if(!name) name = "Character[i]"
- if(i==default_slot)
- name = "[name]"
- dat += "[name]
"
- name = null
-
- dat += "
"
- dat += "Close
"
- dat += ""
-// user << browse(dat, "window=saves;size=300x390")
- var/datum/browser/popup = new(user, "saves", "Character Saves
", 300, 390)
- popup.set_content(dat)
- popup.open(0)
-
-/datum/preferences/proc/close_load_dialog(mob/user)
- user << browse(null, "window=saves")
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
+
+var/list/preferences_datums = list()
+
+var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
+ ROLE_PAI = 0,
+ ROLE_POSIBRAIN = 0,
+ ROLE_GUARDIAN = 0,
+ ROLE_TRAITOR = 7,
+ ROLE_CHANGELING = 14,
+ ROLE_SHADOWLING = 14,
+ ROLE_WIZARD = 14,
+ ROLE_REV = 14,
+ ROLE_VAMPIRE = 14,
+ ROLE_BLOB = 14,
+ ROLE_REVENANT = 14,
+ ROLE_OPERATIVE = 21,
+ ROLE_CULTIST = 21,
+ ROLE_RAIDER = 21,
+ ROLE_ALIEN = 21,
+ ROLE_DEMON = 21,
+ ROLE_SENTIENT = 21,
+// ROLE_GANG = 21,
+ ROLE_BORER = 21,
+ ROLE_NINJA = 21,
+ ROLE_MUTINEER = 21,
+ ROLE_MALF = 30,
+ ROLE_ABDUCTOR = 30,
+)
+
+/proc/player_old_enough_antag(client/C, role)
+ if(available_in_days_antag(C, role) == 0)
+ return 1 //Available in 0 days = available right now = player is old enough to play.
+ return 0
+
+/proc/available_in_days_antag(client/C, role)
+ if(!C)
+ return 0
+ if(!role)
+ return 0
+ if(!config.use_age_restriction_for_antags)
+ return 0
+ if(!isnum(C.player_age))
+ return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
+ var/minimal_player_age_antag = special_role_times[num2text(role)]
+ if(!isnum(minimal_player_age_antag))
+ return 0
+
+ return max(0, minimal_player_age_antag - C.player_age)
+
+/proc/check_client_age(client/C, var/days) // If days isn't provided, returns the age of the client. If it is provided, it returns the days until the player_age is equal to or greater than the days variable
+ if(!days)
+ return C.player_age
+ else
+ return max(0, days - C.player_age)
+ return 0
+
+//used for alternate_option
+#define GET_RANDOM_JOB 0
+#define BE_CIVILIAN 1
+#define RETURN_TO_LOBBY 2
+
+#define MAX_SAVE_SLOTS 20 // Save slots for regular players
+#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members
+
+#define MAX_GEAR_COST config.max_loadout_points
+
+#define TAB_CHAR 0
+#define TAB_GAME 1
+#define TAB_GEAR 2
+
+/datum/preferences
+ //doohickeys for savefiles
+// var/path
+ var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
+// var/savefile_version = 0
+ var/max_save_slots = MAX_SAVE_SLOTS
+
+ //non-preference stuff
+ var/warns = 0
+ var/muted = 0
+ var/last_ip
+ var/last_id
+
+ //game-preferences
+ var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
+ var/ooccolor = "#b82e00"
+ var/be_special = list() //Special role selection
+ var/UI_style = "Midnight"
+ var/nanoui_fancy = TRUE
+ var/toggles = TOGGLES_DEFAULT
+ var/sound = SOUND_DEFAULT
+ var/show_ghostitem_attack = TRUE
+ var/UI_style_color = "#ffffff"
+ var/UI_style_alpha = 255
+
+
+ //character preferences
+ var/real_name //our character's name
+ var/be_random_name = 0 //whether we are a random name every round
+ var/gender = MALE //gender of character (well duh)
+ var/age = 30 //age of character
+ var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
+ var/b_type = "A+" //blood type (not-chooseable)
+ var/underwear = "Nude" //underwear type
+ var/undershirt = "Nude" //undershirt type
+ var/socks = "Nude" //socks type
+ var/backbag = 2 //backpack type
+ var/ha_style = "None" //Head accessory style
+ var/r_headacc = 0 //Head accessory colour
+ var/g_headacc = 0 //Head accessory colour
+ var/b_headacc = 0 //Head accessory colour
+ var/m_style = "None" //Marking style
+ var/r_markings = 0 //Marking colour
+ var/g_markings = 0 //Marking colour
+ var/b_markings = 0 //Marking colour
+ var/h_style = "Bald" //Hair type
+ var/r_hair = 0 //Hair color
+ var/g_hair = 0 //Hair color
+ var/b_hair = 0 //Hair color
+ var/f_style = "Shaved" //Face hair type
+ var/r_facial = 0 //Face hair color
+ var/g_facial = 0 //Face hair color
+ var/b_facial = 0 //Face hair color
+ var/s_tone = 0 //Skin tone
+ var/r_skin = 0 //Skin color
+ var/g_skin = 0 //Skin color
+ var/b_skin = 0 //Skin color
+ var/r_eyes = 0 //Eye color
+ var/g_eyes = 0 //Eye color
+ var/b_eyes = 0 //Eye color
+ var/species = "Human"
+ var/language = "None" //Secondary language
+
+ var/body_accessory = null
+
+ var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess
+
+ //Mob preview
+ var/icon/preview_icon = null
+ var/icon/preview_icon_front = null
+ var/icon/preview_icon_side = null
+
+ //Jobs, uses bitflags
+ var/job_support_high = 0
+ var/job_support_med = 0
+ var/job_support_low = 0
+
+ var/job_medsci_high = 0
+ var/job_medsci_med = 0
+ var/job_medsci_low = 0
+
+ var/job_engsec_high = 0
+ var/job_engsec_med = 0
+ var/job_engsec_low = 0
+
+ var/job_karma_high = 0
+ var/job_karma_med = 0
+ var/job_karma_low = 0
+
+ //Keeps track of preferrence for not getting any wanted jobs
+ var/alternate_option = 0
+
+ // maps each organ to either null(intact), "cyborg" or "amputated"
+ // will probably not be able to do this for head and torso ;)
+ var/list/organ_data = list()
+ var/list/rlimb_data = list()
+
+ var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
+// var/accent = "en-us"
+// var/voice = "m1"
+// var/pitch = 50
+// var/talkspeed = 175
+ var/flavor_text = ""
+ var/med_record = ""
+ var/sec_record = ""
+ var/gen_record = ""
+ var/disabilities = 0
+
+ var/nanotrasen_relation = "Neutral"
+
+ // 0 = character settings, 1 = game preferences
+ var/current_tab = TAB_CHAR
+
+ // OOC Metadata:
+ var/metadata = ""
+ var/slot_name = ""
+
+ // Whether or not to use randomized character slots
+ var/randomslot = 0
+
+ // jukebox volume
+ var/volume = 100
+
+ // BYOND membership
+ var/unlock_content = 0
+
+ //Gear stuff
+ var/list/gear = list()
+ var/gear_tab = "General"
+
+/datum/preferences/New(client/C)
+ b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
+ if(istype(C))
+ if(!IsGuestKey(C.key))
+ unlock_content = C.IsByondMember()
+ if(unlock_content)
+ max_save_slots = MAX_SAVE_SLOTS_MEMBER
+ var/loaded_preferences_successfully = load_preferences(C)
+ if(loaded_preferences_successfully)
+ if(load_character(C))
+ return
+ //we couldn't load character data so just randomize the character appearance + name
+ random_character() //let's create a random character then - rather than a fat, bald and naked man.
+ real_name = random_name(gender)
+ if(!loaded_preferences_successfully)
+ save_preferences(C)
+ save_character(C) //let's save this new random character so it doesn't keep generating new ones.
+
+/datum/preferences/proc/color_square(r, g, b)
+ return "___"
+
+// Hello I am a proc full of snowflake species checks how are you
+/datum/preferences/proc/ShowChoices(mob/user)
+ if(!user || !user.client)
+ return
+ update_preview_icon()
+ user << browse_rsc(preview_icon_front, "previewicon.png")
+ user << browse_rsc(preview_icon_side, "previewicon2.png")
+
+ var/dat = ""
+ dat += ""
+ dat += "Character Settings"
+ dat += "Game Preferences"
+ dat += "Loadout"
+ dat += ""
+ dat += "
"
+
+ switch(current_tab)
+ if(TAB_CHAR) // Character Settings
+ dat += "

"
+ dat += ""
+ dat += ""
+ dat += "Identity"
+ if(appearance_isbanned(user))
+ 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 += "Gender: [gender == MALE ? "Male" : "Female"] "
+ dat += "Age: [age] "
+ dat += "Body: (®) "
+ dat += "Species: [species] "
+ if(species == "Vox")
+ dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"] "
+ dat += "Secondary Language: [language] "
+ dat += "Blood Type: [b_type] "
+ if(species in list("Human", "Drask", "Vox"))
+ dat += "Skin Tone: [species == "Vox" ? "[s_tone]" : "[-s_tone + 35]/220"] "
+ dat += "Disabilities: \[Set\] "
+ dat += "Nanotrasen Relation: [nanotrasen_relation] "
+ dat += "Set Flavor Text "
+ if(lentext(flavor_text) <= 40)
+ if(!lentext(flavor_text)) dat += "\[...\] "
+ else dat += "[flavor_text] "
+ else dat += "[TextPreview(flavor_text)]... "
+
+ dat += "Hair & Accessories"
+
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ var/headaccessoryname = "Head Accessory: "
+ if(species == "Unathi")
+ headaccessoryname = "Horns: "
+ dat += "[headaccessoryname]"
+ dat += "[ha_style] "
+ dat += "Color [color_square(r_headacc, g_headacc, b_headacc)] "
+
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
+ dat += "Body Markings: "
+ dat += "[m_style]"
+ dat += "Color [color_square(r_markings, g_markings, b_markings)] "
+
+ dat += "Hair: "
+ dat += "[h_style]"
+ dat += "Color [color_square(r_hair, g_hair, b_hair)] "
+
+ dat += "Facial Hair: "
+ dat += "[f_style ? "[f_style]" : "Shaved"]"
+ dat += "Color [color_square(r_facial, g_facial, b_facial)] "
+
+ if(species != "Machine")
+ dat += "Eyes: "
+ dat += "Color [color_square(r_eyes, g_eyes, b_eyes)] "
+
+ if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
+ dat += "Body Color: "
+ dat += "Color [color_square(r_skin, g_skin, b_skin)] "
+
+ if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
+ dat += "Body Accessory: "
+ dat += "[body_accessory ? "[body_accessory]" : "None"] "
+
+ dat += " | "
+ dat += "Occupation Choices"
+ dat += "Set Occupation Preferences "
+ if(jobban_isbanned(user, "Records"))
+ dat += "You are banned from using character records. "
+ else
+ dat += "Character Records "
+
+ dat += "Limbs"
+ dat += "Limbs and Parts: Adjust "
+ if(species != "Slime People" && species != "Machine")
+ dat += "Internal Organs: Adjust "
+
+ //display limbs below
+ var/ind = 0
+ for(var/name in organ_data)
+ var/status = organ_data[name]
+ var/organ_name = null
+ switch(name)
+ if("chest") organ_name = "torso"
+ if("groin") organ_name = "lower body"
+ if("head") organ_name = "head"
+ if("l_arm") organ_name = "left arm"
+ if("r_arm") organ_name = "right arm"
+ if("l_leg") organ_name = "left leg"
+ if("r_leg") organ_name = "right leg"
+ if("l_foot") organ_name = "left foot"
+ if("r_foot") organ_name = "right foot"
+ if("l_hand") organ_name = "left hand"
+ if("r_hand") organ_name = "right hand"
+ if("heart") organ_name = "heart"
+ if("eyes") organ_name = "eyes"
+
+ if(status in list("cyborg", "amputated", "mechanical", "assisted"))
+ ++ind
+ if(ind > 1) dat += ", "
+
+ switch(status)
+ if("cyborg")
+ var/datum/robolimb/R
+ if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
+ R = all_robolimbs[rlimb_data[name]]
+ else
+ R = basic_robolimb
+ dat += "\t[R.company] [organ_name] prosthesis"
+ if("amputated") dat += "\tAmputated [organ_name]"
+ if("mechanical") dat += "\tMechanical [organ_name]"
+ if("assisted")
+ switch(organ_name)
+ if("heart") dat += "\tPacemaker-assisted [organ_name]"
+ if("voicebox") dat += "\tSurgically altered [organ_name]"
+ if("eyes") dat += "\tRetinal overlayed [organ_name]"
+ else dat += "\tMechanically assisted [organ_name]"
+ if(!ind) dat += "\[...\] "
+ else dat += " "
+
+ dat += "Clothing"
+ dat += "Underwear: [underwear] "
+ dat += "Undershirt: [undershirt] "
+ dat += "Socks: [socks] "
+ dat += "Backpack Type: [backbaglist[backbag]] "
+
+ dat += " |
"
+
+ if(TAB_GAME) // General Preferences
+ dat += ""
+
+ if(TAB_GEAR)
+ var/total_cost = 0
+ var/list/type_blacklist = list()
+ if(gear && gear.len)
+ for(var/i = 1, i <= gear.len, i++)
+ var/datum/gear/G = gear_datums[gear[i]]
+ if(G)
+ if(!G.subtype_cost_overlap)
+ if(G.subtype_path in type_blacklist)
+ continue
+ type_blacklist += G.subtype_path
+ total_cost += G.cost
+
+ var/fcolor = "#3366CC"
+ if(total_cost < MAX_GEAR_COST)
+ fcolor = "#E67300"
+ dat += ""
+ dat += "| [total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\] |
"
+ dat += "| "
+
+ var/firstcat = 1
+ for(var/category in loadout_categories)
+ if(firstcat)
+ firstcat = 0
+ else
+ dat += " |"
+ if(category == gear_tab)
+ dat += " [category] "
+ else
+ dat += " [category] "
+ dat += " |
"
+
+ var/datum/loadout_category/LC = loadout_categories[gear_tab]
+ dat += "
|
"
+ dat += "| [LC.category] |
"
+ dat += "
|
"
+ for(var/gear_name in LC.gear)
+ var/datum/gear/G = LC.gear[gear_name]
+ var/ticked = (G.display_name in gear)
+ dat += "| [G.display_name] | "
+ dat += "[G.cost] | "
+ if(G.allowed_roles)
+ dat += "Restrictions: "
+ for(var/role in G.allowed_roles)
+ dat += role + " "
+ dat += ""
+ dat += " | [G.description] |
"
+ if(ticked)
+ . += "| "
+ for(var/datum/gear_tweak/tweak in G.gear_tweaks)
+ . += " [tweak.get_contents(get_tweak_metadata(G, tweak))]"
+ . += " |
"
+ dat += "
"
+
+ dat += "
"
+ if(!IsGuestKey(user.key))
+ dat += "Undo - "
+ dat += "Save Setup - "
+
+ dat += "Reset Setup"
+ dat += ""
+
+ var/datum/browser/popup = new(user, "preferences", "Character Setup
", 820, 640)
+ popup.set_content(dat)
+ popup.open(0)
+
+
+/datum/preferences/proc/get_gear_metadata(var/datum/gear/G)
+ . = gear[G.display_name]
+ if(!.)
+ . = list()
+ gear[G.display_name] = .
+
+/datum/preferences/proc/get_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak)
+ var/list/metadata = get_gear_metadata(G)
+ . = metadata["[tweak]"]
+ if(!.)
+ . = tweak.get_default()
+ metadata["[tweak]"] = .
+
+/datum/preferences/proc/set_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak, var/new_metadata)
+ var/list/metadata = get_gear_metadata(G)
+ metadata["[tweak]"] = new_metadata
+
+
+/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790)
+ if(!job_master)
+ return
+
+ //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice.
+ //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice.
+ //width - Screen' width. Defaults to 550 to make it look nice.
+ //height - Screen's height. Defaults to 500 to make it look nice.
+
+
+ var/HTML = ""
+ HTML += ""
+ HTML += "Choose occupation chances
Unavailable occupations are crossed out.
"
+ HTML += "\[Done\]
" // Easier to press up here.
+ HTML += "Left-click to raise an occupation preference, right-click to lower it.
"
+ HTML += ""
+ HTML += "" // Table within a table for alignment, also allows you to easily add more colomns.
+ HTML += ""
+ var/index = -1
+
+ //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
+ var/datum/job/lastJob
+ if (!job_master) return
+ for(var/datum/job/job in job_master.occupations)
+
+ if(job.admin_only)
+ continue
+
+ index += 1
+ if((index >= limit) || (job.title in splitJobs))
+ if((index < limit) && (lastJob != null))
+ //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with
+ //the last job's selection color. Creating a rather nice effect.
+ for(var/i = 0, i < (limit - index), i += 1)
+ HTML += "|   |   | "
+ HTML += " | "
+ index = 0
+
+ HTML += "| "
+ var/rank = job.title
+ lastJob = job
+ if(!is_job_whitelisted(user, rank))
+ HTML += "[rank] | \[KARMA] | "
+ continue
+ if(jobban_isbanned(user, rank))
+ HTML += "[rank] \[BANNED] | "
+ continue
+ if(!job.player_old_enough(user.client))
+ var/available_in_days = job.available_in_days(user.client)
+ HTML += "[rank] \[IN [(available_in_days)] DAYS] | "
+ continue
+ if((job_support_low & CIVILIAN) && (rank != "Civilian"))
+ HTML += "[rank] | "
+ continue
+ if((rank in command_positions) || (rank == "AI"))//Bold head jobs
+ HTML += "[rank]"
+ else
+ HTML += "[rank]"
+
+ HTML += ""
+
+ var/prefLevelLabel = "ERROR"
+ var/prefLevelColor = "pink"
+ var/prefUpperLevel = -1 // level to assign on left click
+ var/prefLowerLevel = -1 // level to assign on right click
+
+ if(GetJobDepartment(job, 1) & job.flag)
+ prefLevelLabel = "High"
+ prefLevelColor = "slateblue"
+ prefUpperLevel = 4
+ prefLowerLevel = 2
+ else if(GetJobDepartment(job, 2) & job.flag)
+ prefLevelLabel = "Medium"
+ prefLevelColor = "green"
+ prefUpperLevel = 1
+ prefLowerLevel = 3
+ else if(GetJobDepartment(job, 3) & job.flag)
+ prefLevelLabel = "Low"
+ prefLevelColor = "orange"
+ prefUpperLevel = 2
+ prefLowerLevel = 4
+ else
+ prefLevelLabel = "NEVER"
+ prefLevelColor = "red"
+ prefUpperLevel = 3
+ prefLowerLevel = 1
+
+
+ HTML += ""
+
+// HTML += ""
+
+ if(rank == "Civilian")//Civilian is special
+ if(job_support_low & CIVILIAN)
+ HTML += " \[Yes]"
+ else
+ HTML += " \[No]"
+ if(job.alt_titles)
+ HTML += " \[[GetPlayerAltTitle(job)]\] | "
+ HTML += ""
+ continue
+/*
+ if(GetJobDepartment(job, 1) & job.flag)
+ HTML += " \[High]"
+ else if(GetJobDepartment(job, 2) & job.flag)
+ HTML += " \[Medium]"
+ else if(GetJobDepartment(job, 3) & job.flag)
+ HTML += " \[Low]"
+ else
+ HTML += " \[NEVER]"
+ */
+ HTML += "[prefLevelLabel]"
+
+ if(job.alt_titles)
+ HTML += " \[[GetPlayerAltTitle(job)]\]"
+
+
+ HTML += ""
+
+ for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even
+ HTML += "|   |   | "
+
+ HTML += " "
+
+ HTML += " |
"
+
+ switch(alternate_option)
+ if(GET_RANDOM_JOB)
+ HTML += "
Get random job if preferences unavailable
"
+ if(BE_CIVILIAN)
+ HTML += "
Be a civilian if preferences unavailable
"
+ if(RETURN_TO_LOBBY)
+ HTML += "
Return to lobby if preferences unavailable
"
+
+ HTML += "\[Reset\]"
+ HTML += ""
+
+ user << browse(null, "window=preferences")
+// user << browse(HTML, "window=mob_occupation;size=[width]x[height]")
+ var/datum/browser/popup = new(user, "mob_occupation", "Occupation Preferences
", width, height)
+ popup.set_window_options("can_close=0")
+ popup.set_content(HTML)
+ popup.open(0)
+ return
+
+/datum/preferences/proc/SetJobPreferenceLevel(var/datum/job/job, var/level)
+ if (!job)
+ return 0
+
+ if (level == 1) // to high
+ // remove any other job(s) set to high
+ job_support_med |= job_support_high
+ job_engsec_med |= job_engsec_high
+ job_medsci_med |= job_medsci_high
+ job_karma_med |= job_karma_high
+ job_support_high = 0
+ job_engsec_high = 0
+ job_medsci_high = 0
+ job_karma_high = 0
+
+ if (job.department_flag == SUPPORT)
+ job_support_low &= ~job.flag
+ job_support_med &= ~job.flag
+ job_support_high &= ~job.flag
+
+ switch(level)
+ if (1)
+ job_support_high |= job.flag
+ if (2)
+ job_support_med |= job.flag
+ if (3)
+ job_support_low |= job.flag
+
+ return 1
+ else if (job.department_flag == ENGSEC)
+ job_engsec_low &= ~job.flag
+ job_engsec_med &= ~job.flag
+ job_engsec_high &= ~job.flag
+
+ switch(level)
+ if (1)
+ job_engsec_high |= job.flag
+ if (2)
+ job_engsec_med |= job.flag
+ if (3)
+ job_engsec_low |= job.flag
+
+ return 1
+ else if (job.department_flag == MEDSCI)
+ job_medsci_low &= ~job.flag
+ job_medsci_med &= ~job.flag
+ job_medsci_high &= ~job.flag
+
+ switch(level)
+ if (1)
+ job_medsci_high |= job.flag
+ if (2)
+ job_medsci_med |= job.flag
+ if (3)
+ job_medsci_low |= job.flag
+
+ return 1
+ else if (job.department_flag == KARMA)
+ job_karma_low &= ~job.flag
+ job_karma_med &= ~job.flag
+ job_karma_high &= ~job.flag
+
+ switch(level)
+ if (1)
+ job_karma_high |= job.flag
+ if (2)
+ job_karma_med |= job.flag
+ if (3)
+ job_karma_low |= job.flag
+
+ return 1
+
+ return 0
+
+/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl)
+ var/datum/job/job = job_master.GetJob(role)
+
+ if(!job)
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ return
+
+ if (!isnum(desiredLvl))
+ to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!")
+ ShowChoices(user)
+ return
+
+ if(role == "Civilian")
+ if(job_support_low & job.flag)
+ job_support_low &= ~job.flag
+ else
+ job_support_low |= job.flag
+ SetChoices(user)
+ return 1
+
+ SetJobPreferenceLevel(job, desiredLvl)
+ SetChoices(user)
+
+ return 1
+
+/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
+ if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))
+ return "[species] cannot be fat."
+ return "[label]: [disabilities & flag ? "Yes" : "No"]"
+
+/datum/preferences/proc/SetDisabilities(mob/user)
+ var/HTML = ""
+
+ // AUTOFIXED BY fix_string_idiocy.py
+ // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += ""
+ HTML += {"
+ Choose disabilities"}
+ // END AUTOFIX
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
+
+
+ // AUTOFIXED BY fix_string_idiocy.py
+ // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += "
"
+ HTML += {"
+ \[Done\]
+ \[Reset\]
+ "}
+ // END AUTOFIX
+ user << browse(null, "window=preferences")
+ user << browse(HTML, "window=disabil;size=350x300")
+ return
+
+/datum/preferences/proc/SetRecords(mob/user)
+ var/HTML = ""
+ HTML += ""
+ HTML += "Set Character Records
"
+
+ HTML += "Medical Records
"
+
+ if(lentext(med_record) <= 40)
+ HTML += "[med_record]"
+ else
+ HTML += "[copytext(med_record, 1, 37)]..."
+
+ HTML += "
Employment Records
"
+
+ if(lentext(gen_record) <= 40)
+ HTML += "[gen_record]"
+ else
+ HTML += "[copytext(gen_record, 1, 37)]..."
+
+ HTML += "
Security Records
"
+
+ if(lentext(sec_record) <= 40)
+ HTML += "[sec_record]
"
+ else
+ HTML += "[copytext(sec_record, 1, 37)]...
"
+
+ HTML += "
"
+ HTML += "\[Done\]"
+ HTML += ""
+
+ user << browse(null, "window=preferences")
+ user << browse(HTML, "window=records;size=350x300")
+ return
+
+/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
+ return player_alt_titles.Find(job.title) > 0 \
+ ? player_alt_titles[job.title] \
+ : job.title
+
+/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title)
+ // remove existing entry
+ if(player_alt_titles.Find(job.title))
+ player_alt_titles -= job.title
+ // add one if it's not default
+ if(job.title != new_title)
+ player_alt_titles[job.title] = new_title
+
+/datum/preferences/proc/SetJob(mob/user, role)
+ var/datum/job/job = job_master.GetJob(role)
+ if(!job)
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ return
+
+ if(role == "Civilian")
+ if(job_support_low & job.flag)
+ job_support_low &= ~job.flag
+ else
+ job_support_low |= job.flag
+ SetChoices(user)
+ return 1
+
+ if(GetJobDepartment(job, 1) & job.flag)
+ SetJobDepartment(job, 1)
+ else if(GetJobDepartment(job, 2) & job.flag)
+ SetJobDepartment(job, 2)
+ else if(GetJobDepartment(job, 3) & job.flag)
+ SetJobDepartment(job, 3)
+ else//job = Never
+ SetJobDepartment(job, 4)
+
+ SetChoices(user)
+ return 1
+
+/datum/preferences/proc/ResetJobs()
+ job_support_high = 0
+ job_support_med = 0
+ job_support_low = 0
+
+ job_medsci_high = 0
+ job_medsci_med = 0
+ job_medsci_low = 0
+
+ job_engsec_high = 0
+ job_engsec_med = 0
+ job_engsec_low = 0
+
+ job_karma_high = 0
+ job_karma_med = 0
+ job_karma_low = 0
+
+
+/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
+ if(!job || !level) return 0
+ switch(job.department_flag)
+ if(SUPPORT)
+ switch(level)
+ if(1)
+ return job_support_high
+ if(2)
+ return job_support_med
+ if(3)
+ return job_support_low
+ if(MEDSCI)
+ switch(level)
+ if(1)
+ return job_medsci_high
+ if(2)
+ return job_medsci_med
+ if(3)
+ return job_medsci_low
+ if(ENGSEC)
+ switch(level)
+ if(1)
+ return job_engsec_high
+ if(2)
+ return job_engsec_med
+ if(3)
+ return job_engsec_low
+ if(KARMA)
+ switch(level)
+ if(1)
+ return job_karma_high
+ if(2)
+ return job_karma_med
+ if(3)
+ return job_karma_low
+ return 0
+
+/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level)
+ if(!job || !level) return 0
+ switch(level)
+ if(1)//Only one of these should ever be active at once so clear them all here
+ job_support_high = 0
+ job_medsci_high = 0
+ job_engsec_high = 0
+ job_karma_high = 0
+ return 1
+ if(2)//Set current highs to med, then reset them
+ job_support_med |= job_support_high
+ job_medsci_med |= job_medsci_high
+ job_engsec_med |= job_engsec_high
+ job_karma_med |= job_karma_high
+ job_support_high = 0
+ job_medsci_high = 0
+ job_engsec_high = 0
+ job_karma_high = 0
+
+ switch(job.department_flag)
+ if(SUPPORT)
+ switch(level)
+ if(2)
+ job_support_high = job.flag
+ job_support_med &= ~job.flag
+ if(3)
+ job_support_med |= job.flag
+ job_support_low &= ~job.flag
+ else
+ job_support_low |= job.flag
+ if(MEDSCI)
+ switch(level)
+ if(2)
+ job_medsci_high = job.flag
+ job_medsci_med &= ~job.flag
+ if(3)
+ job_medsci_med |= job.flag
+ job_medsci_low &= ~job.flag
+ else
+ job_medsci_low |= job.flag
+ if(ENGSEC)
+ switch(level)
+ if(2)
+ job_engsec_high = job.flag
+ job_engsec_med &= ~job.flag
+ if(3)
+ job_engsec_med |= job.flag
+ job_engsec_low &= ~job.flag
+ else
+ job_engsec_low |= job.flag
+ if(KARMA)
+ switch(level)
+ if(2)
+ job_karma_high = job.flag
+ job_karma_med &= ~job.flag
+ if(3)
+ job_karma_med |= job.flag
+ job_karma_low &= ~job.flag
+ else
+ job_karma_low |= job.flag
+ return 1
+
+/datum/preferences/proc/process_link(mob/user, list/href_list)
+ if(!user) return
+
+ if(href_list["preference"] == "job")
+ switch(href_list["task"])
+ if("close")
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ if("reset")
+ ResetJobs()
+ SetChoices(user)
+ if("random")
+ if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN)
+ alternate_option += 1
+ else if(alternate_option == RETURN_TO_LOBBY)
+ alternate_option = 0
+ else
+ return 0
+ SetChoices(user)
+ if ("alt_title")
+ var/datum/job/job = locate(href_list["job"])
+ if (job)
+ var/choices = list(job.title) + job.alt_titles
+ var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null
+ if(choice)
+ SetPlayerAltTitle(job, choice)
+ SetChoices(user)
+ if("input")
+ SetJob(user, href_list["text"])
+ if("setJobLevel")
+ UpdateJobPreference(user, href_list["text"], text2num(href_list["level"]))
+ else
+ SetChoices(user)
+ return 1
+ else if(href_list["preference"] == "disabilities")
+
+ switch(href_list["task"])
+ if("close")
+ user << browse(null, "window=disabil")
+ ShowChoices(user)
+ if("reset")
+ disabilities=0
+ SetDisabilities(user)
+ if("input")
+ var/dflag=text2num(href_list["disability"])
+ if(dflag >= 0)
+ if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")))
+ disabilities ^= text2num(href_list["disability"]) //MAGIC
+ SetDisabilities(user)
+ else
+ SetDisabilities(user)
+ return 1
+
+ else if(href_list["preference"] == "records")
+ if(text2num(href_list["record"]) >= 1)
+ SetRecords(user)
+ return
+ else
+ user << browse(null, "window=records")
+ if(href_list["task"] == "med_record")
+ var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message
+
+ if(medmsg != null)
+ medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN)
+ medmsg = html_encode(medmsg)
+
+ med_record = medmsg
+ SetRecords(user)
+
+ if(href_list["task"] == "sec_record")
+ var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message
+
+ if(secmsg != null)
+ secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN)
+ secmsg = html_encode(secmsg)
+
+ sec_record = secmsg
+ SetRecords(user)
+ if(href_list["task"] == "gen_record")
+ var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message
+
+ if(genmsg != null)
+ genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN)
+ genmsg = html_encode(genmsg)
+
+ gen_record = genmsg
+ SetRecords(user)
+
+ if(href_list["preference"] == "gear")
+ if(href_list["toggle_gear"])
+ var/datum/gear/TG = gear_datums[href_list["toggle_gear"]]
+ if(TG.display_name in gear)
+ gear -= TG.display_name
+ else
+ var/total_cost = 0
+ var/list/type_blacklist = list()
+ for(var/gear_name in gear)
+ var/datum/gear/G = gear_datums[gear_name]
+ if(istype(G))
+ if(!G.subtype_cost_overlap)
+ if(G.subtype_path in type_blacklist)
+ continue
+ type_blacklist += G.subtype_path
+ total_cost += G.cost
+
+ if((total_cost + TG.cost) <= MAX_GEAR_COST)
+ gear += TG.display_name
+
+ else if(href_list["gear"] && href_list["tweak"])
+ var/datum/gear/gear = gear_datums[href_list["gear"]]
+ var/datum/gear_tweak/tweak = locate(href_list["tweak"])
+ if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks))
+ return
+ var/metadata = tweak.get_metadata(user, get_tweak_metadata(gear, tweak))
+ if(!metadata || !CanUseTopic(user))
+ return
+ set_tweak_metadata(gear, tweak, metadata)
+ else if(href_list["select_category"])
+ gear_tab = href_list["select_category"]
+ else if(href_list["clear_loadout"])
+ gear.Cut()
+
+ ShowChoices(user)
+ return
+
+ switch(href_list["task"])
+ if("random")
+ switch(href_list["preference"])
+ if("name")
+ real_name = random_name(gender,species)
+ if("age")
+ age = rand(AGE_MIN, AGE_MAX)
+ if("hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_hair = rand(0,255)
+ g_hair = rand(0,255)
+ b_hair = rand(0,255)
+ if("h_style")
+ h_style = random_hair_style(gender, species)
+ if("facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_facial = rand(0,255)
+ g_facial = rand(0,255)
+ b_facial = rand(0,255)
+ if("f_style")
+ f_style = random_facial_hair_style(gender, species)
+ if("underwear")
+ underwear = random_underwear(gender)
+ ShowChoices(user)
+ if("undershirt")
+ undershirt = random_undershirt(gender)
+ ShowChoices(user)
+ if("socks")
+ socks = random_socks(gender)
+ ShowChoices(user)
+ if("eyes")
+ r_eyes = rand(0,255)
+ g_eyes = rand(0,255)
+ b_eyes = rand(0,255)
+ if("s_tone")
+ if(species in list("Human", "Drask", "Vox"))
+ s_tone = random_skin_tone()
+ if("s_color")
+ if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine"))
+ r_skin = rand(0,255)
+ g_skin = rand(0,255)
+ b_skin = rand(0,255)
+ if("bag")
+ backbag = rand(1,4)
+ /*if("skin_style")
+ h_style = random_skin_style(gender)*/
+ if("all")
+ random_character()
+ if("input")
+ switch(href_list["preference"])
+ if("name")
+ var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null
+ if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.)
+ var/new_name = reject_bad_name(raw_name)
+ if(new_name)
+ real_name = new_name
+ else
+ to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .")
+
+ if("age")
+ var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null
+ if(new_age)
+ age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
+ if("species")
+
+ var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
+ var/prev_species = species
+// var/whitelisted = 0
+
+ if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
+ for(var/S in whitelisted_species)
+ if(is_alien_whitelisted(user,S))
+ new_species += S
+// whitelisted = 1
+// if(!whitelisted)
+// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
+ else //Not using the whitelist? Aliens for everyone!
+ new_species += whitelisted_species
+
+ species = input("Please select a species", "Character Generation", null) in new_species
+
+ if(prev_species != species)
+ //grab one of the valid hair styles for the newly chosen species
+ var/list/valid_hairstyles = list()
+ for(var/hairstyle in hair_styles_list)
+ var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
+
+ if(valid_hairstyles.len)
+ h_style = pick(valid_hairstyles)
+ else
+ //this shouldn't happen
+ h_style = hair_styles_list["Bald"]
+
+ //grab one of the valid facial hair styles for the newly chosen species
+ var/list/valid_facialhairstyles = list()
+ for(var/facialhairstyle in facial_hair_styles_list)
+ var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
+
+ if(valid_facialhairstyles.len)
+ f_style = pick(valid_facialhairstyles)
+ else
+ //this shouldn't happen
+ f_style = facial_hair_styles_list["Shaved"]
+
+ // Don't wear another species' underwear!
+ var/datum/sprite_accessory/S = underwear_list[underwear]
+ if(!(species in S.species_allowed))
+ underwear = random_underwear(gender, species)
+
+ S = undershirt_list[undershirt]
+ if(!(species in S.species_allowed))
+ undershirt = random_undershirt(gender, species)
+
+ S = socks_list[socks]
+ if(!(species in S.species_allowed))
+ socks = random_socks(gender, species)
+
+ //reset hair colour and skin colour
+ r_hair = 0//hex2num(copytext(new_hair, 2, 4))
+ g_hair = 0//hex2num(copytext(new_hair, 4, 6))
+ b_hair = 0//hex2num(copytext(new_hair, 6, 8))
+
+ s_tone = 0
+
+ if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")))
+ r_skin = 0
+ g_skin = 0
+ b_skin = 0
+
+ ha_style = "None" // No Vulp ears on Unathi
+ m_style = "None" // No Unathi markings on Tajara
+
+ body_accessory = null //no vulptail on humans damnit
+
+ //Reset prosthetics.
+ organ_data = list()
+ rlimb_data = list()
+ if("speciesprefs")//oldvox code
+ speciesprefs = !speciesprefs
+
+ if("language")
+// var/languages_available
+ var/list/new_languages = list("None")
+/*
+ if(config.usealienwhitelist)
+ for(var/L in all_languages)
+ var/datum/language/lang = all_languages[L]
+ if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))))
+ new_languages += lang
+ languages_available = 1
+
+ if(!(languages_available))
+ alert(user, "There are not currently any available secondary languages.")
+ else
+*/
+ for(var/L in all_languages)
+ var/datum/language/lang = all_languages[L]
+ if(!(lang.flags & RESTRICTED))
+ new_languages += lang.name
+
+ language = input("Please select a secondary language", "Character Generation", null) in new_languages
+
+ if("metadata")
+ var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null
+ if(new_metadata)
+ metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN))
+
+ if("b_type")
+ var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" )
+ if(new_b_type)
+ b_type = new_b_type
+
+ if("hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/input = "Choose your character's hair colour:"
+ var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
+ if(new_hair)
+ r_hair = hex2num(copytext(new_hair, 2, 4))
+ g_hair = hex2num(copytext(new_hair, 4, 6))
+ b_hair = hex2num(copytext(new_hair, 6, 8))
+
+ if("h_style")
+ var/list/valid_hairstyles = list()
+ for(var/hairstyle in hair_styles_list)
+ var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/obj/item/organ/external/head/H = new()
+ if(S.name == "Bald")
+ valid_hairstyles[hairstyle] = S
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
+ else
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(species in S.species_allowed)
+ if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head
+ //and said head is in the hair style's allowed models list...
+ valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle.
+ continue
+ else
+ if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles).
+ continue
+ else if(!robohead.is_monitor && ("Human" in S.species_allowed))
+ valid_hairstyles[hairstyle] = S
+ continue
+ else
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_hairstyles[hairstyle] = S
+
+ var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
+ if(new_h_style)
+ h_style = new_h_style
+
+ if("headaccessory")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
+ var/input = "Choose the colour of your your character's head accessory:"
+ var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
+ if(new_head_accessory)
+ r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
+ g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
+ b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+
+ if("ha_style")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
+ var/list/valid_head_accessory_styles = list()
+ for(var/head_accessory_style in head_accessory_styles_list)
+ var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style]
+ if(!(species in H.species_allowed))
+ continue
+
+ valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
+
+ var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles
+ if(new_head_accessory_style)
+ ha_style = new_head_accessory_style
+
+ if("markings")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
+ var/input = "Choose the colour of your your character's markings:"
+ var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
+ if(new_markings)
+ r_markings = hex2num(copytext(new_markings, 2, 4))
+ g_markings = hex2num(copytext(new_markings, 4, 6))
+ b_markings = hex2num(copytext(new_markings, 6, 8))
+
+ if("m_style")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
+ var/list/valid_markings = list()
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/obj/item/organ/external/head/H = new()
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
+ else
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings.
+ continue
+ else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip.
+ if(!(robohead.company in M.models_allowed))
+ continue
+
+ valid_markings[markingstyle] = marking_styles_list[markingstyle]
+
+ var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings
+ if(new_marking_style)
+ m_style = new_marking_style
+
+ if("body_accessory")
+ var/list/possible_body_accessories = list()
+ if(check_rights(R_ADMIN, 1, user))
+ possible_body_accessories = body_accessory_by_name.Copy()
+ else
+ for(var/B in body_accessory_by_name)
+ var/datum/body_accessory/accessory = body_accessory_by_name[B]
+ if(!istype(accessory))
+ possible_body_accessories += "None" //the only null entry should be the "None" option
+ continue
+ if(species in accessory.allowed_species)
+ possible_body_accessories += B
+
+ var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
+ if(new_body_accessory)
+ body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
+
+ if("facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
+ if(new_facial)
+ r_facial = hex2num(copytext(new_facial, 2, 4))
+ g_facial = hex2num(copytext(new_facial, 4, 6))
+ b_facial = hex2num(copytext(new_facial, 6, 8))
+
+ if("f_style")
+ var/list/valid_facialhairstyles = list()
+ for(var/facialhairstyle in facial_hair_styles_list)
+ var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ if(S.name == "Shaved")
+ valid_facialhairstyles[facialhairstyle] = S
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/obj/item/organ/external/head/H = new()
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
+ else
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(species in S.species_allowed)
+ if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it.
+ valid_facialhairstyles[facialhairstyle] = S
+ continue
+ else
+ if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles).
+ continue
+ else if(!robohead.is_monitor && ("Human" in S.species_allowed))
+ valid_facialhairstyles[facialhairstyle] = S
+ continue
+ else
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
+
+ var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles
+ if(new_f_style)
+ f_style = new_f_style
+
+ if("underwear")
+ var/list/underwear_options
+ if(gender == MALE)
+ underwear_options = underwear_m
+ else
+ underwear_options = underwear_f
+
+ var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options
+ if(new_underwear)
+ underwear = new_underwear
+ ShowChoices(user)
+
+ if("undershirt")
+ var/new_undershirt
+ if(gender == MALE)
+ new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m
+ else
+ new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f
+ if(new_undershirt)
+ undershirt = new_undershirt
+ ShowChoices(user)
+
+ if("socks")
+ var/list/valid_sockstyles = list()
+ for(var/sockstyle in socks_list)
+ var/datum/sprite_accessory/S = socks_list[sockstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_sockstyles[sockstyle] = socks_list[sockstyle]
+ var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
+ ShowChoices(user)
+ if(new_socks)
+ socks = new_socks
+
+ if("eyes")
+ var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null
+ if(new_eyes)
+ r_eyes = hex2num(copytext(new_eyes, 2, 4))
+ g_eyes = hex2num(copytext(new_eyes, 4, 6))
+ b_eyes = hex2num(copytext(new_eyes, 6, 8))
+
+ if("s_tone")
+ if(species == "Human" || species == "Drask")
+ var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null
+ if(new_s_tone)
+ s_tone = 35 - max(min(round(new_s_tone), 220), 1)
+ else if(species == "Vox")
+ var/skin_c = input(user, "Choose your Vox's skin color:\n(1 = Default Green, 2 = Dark Green, 3 = Brown, 4 = Grey, \n5 = Emerald, 6 = Azure)", "Character Preference") as num|null
+ if(skin_c)
+ s_tone = max(min(round(skin_c), 6), 1)
+
+ if("skin")
+ if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
+ var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
+ if(new_skin)
+ r_skin = hex2num(copytext(new_skin, 2, 4))
+ g_skin = hex2num(copytext(new_skin, 4, 6))
+ b_skin = hex2num(copytext(new_skin, 6, 8))
+
+
+ if("ooccolor")
+ var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null
+ if(new_ooccolor)
+ ooccolor = new_ooccolor
+
+ if("bag")
+ var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
+ if(new_backbag)
+ backbag = backbaglist.Find(new_backbag)
+
+ if("nt_relation")
+ var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
+ if(new_relation)
+ nanotrasen_relation = new_relation
+
+ if("flavor_text")
+ var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message
+
+ if(msg != null)
+ msg = copytext(msg, 1, MAX_MESSAGE_LEN)
+ msg = html_encode(msg)
+
+ flavor_text = msg
+
+ if("limbs")
+ var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
+ if(species == "Machine")
+ valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
+ var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs
+ if(!limb_name) return
+
+ var/limb = null
+ var/second_limb = null // if you try to change the arm, the hand should also change
+ var/third_limb = null // if you try to unchange the hand, the arm should also change
+ var/valid_limb_states = list("Normal", "Amputated", "Prosthesis")
+ var/no_amputate = 0
+
+ switch(limb_name)
+ if("Torso")
+ limb = "chest"
+ second_limb = "groin"
+ no_amputate = 1
+ if("Lower Body")
+ limb = "groin"
+ no_amputate = 1
+ if("Head")
+ limb = "head"
+ no_amputate = 1
+ if("Left Leg")
+ limb = "l_leg"
+ second_limb = "l_foot"
+ if("Right Leg")
+ limb = "r_leg"
+ second_limb = "r_foot"
+ if("Left Arm")
+ limb = "l_arm"
+ second_limb = "l_hand"
+ if("Right Arm")
+ limb = "r_arm"
+ second_limb = "r_hand"
+ if("Left Foot")
+ limb = "l_foot"
+ if(species != "Machine")
+ third_limb = "l_leg"
+ if("Right Foot")
+ limb = "r_foot"
+ if(species != "Machine")
+ third_limb = "r_leg"
+ if("Left Hand")
+ limb = "l_hand"
+ if(species != "Machine")
+ third_limb = "l_arm"
+ if("Right Hand")
+ limb = "r_hand"
+ if(species != "Machine")
+ third_limb = "r_arm"
+
+ var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states
+ if(!new_state) return
+
+ switch(new_state)
+ if("Normal")
+ if(limb == "head")
+ m_style = "None"
+ h_style = random_hair_style(gender, species)
+ f_style = facial_hair_styles_list["Shaved"]
+ organ_data[limb] = null
+ rlimb_data[limb] = null
+ if(third_limb)
+ organ_data[third_limb] = null
+ rlimb_data[third_limb] = null
+ if("Amputated")
+ if(!no_amputate)
+ organ_data[limb] = "amputated"
+ rlimb_data[limb] = null
+ if(second_limb)
+ organ_data[second_limb] = "amputated"
+ rlimb_data[second_limb] = null
+ if("Prosthesis")
+ var/choice
+ var/subchoice
+ var/datum/robolimb/R = new()
+ var/in_model
+ var/robolimb_companies = list()
+ for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products.
+ R = new limb_type()
+ if(!R.unavailable_at_chargen && (limb in R.parts) && R.has_subtypes) //Ensures users can only choose companies that offer the parts they want, that singular models get added to the list as well companies that offer more than one model, and...
+ robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for.
+ R = new() //Re-initialize R.
+
+ choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants.
+ if(!choice)
+ return
+ R.company = choice
+ R = all_robolimbs[R.company]
+ if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it.
+ var/list/robolimb_models = list()
+ for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide.
+ var/datum/robolimb/L = new limb_type()
+ if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list.
+ robolimb_models[L.company] = L
+ if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option.
+ subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem.
+ if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later.
+ in_model = 1
+ if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose.
+ subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
+ if(subchoice)
+ choice = subchoice
+ if(limb == "head")
+ ha_style = "None"
+ h_style = hair_styles_list["Bald"]
+ f_style = facial_hair_styles_list["Shaved"]
+ m_style = "None"
+ rlimb_data[limb] = choice
+ organ_data[limb] = "cyborg"
+ if(second_limb)
+ if(subchoice)
+ if(in_model)
+ rlimb_data[second_limb] = choice
+ organ_data[second_limb] = "cyborg"
+ else
+ rlimb_data[second_limb] = choice
+ organ_data[second_limb] = "cyborg"
+
+ if("organs")
+ var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
+ if(!organ_name) return
+
+ var/organ = null
+ switch(organ_name)
+ if("Heart")
+ organ = "heart"
+ if("Eyes")
+ organ = "eyes"
+
+ var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical")
+ if(!new_state) return
+
+ switch(new_state)
+ if("Normal")
+ organ_data[organ] = null
+ if("Assisted")
+ organ_data[organ] = "assisted"
+ if("Mechanical")
+ organ_data[organ] = "mechanical"
+
+/*
+ if("skin_style")
+ var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
+ if(!skin_style_name) return
+*/
+
+/* if("spawnpoint")
+ var/list/spawnkeys = list()
+ for(var/S in spawntypes)
+ spawnkeys += S
+ var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys
+ if(!choice || !spawntypes[choice])
+ spawnpoint = "Arrivals Shuttle"
+ return
+ spawnpoint = choice */
+
+ else
+ switch(href_list["preference"])
+ if("publicity")
+ if(unlock_content)
+ toggles ^= MEMBER_PUBLIC
+
+ if("gender")
+ if(gender == MALE)
+ gender = FEMALE
+ else
+ gender = MALE
+ underwear = random_underwear(gender)
+
+ if("hear_adminhelps")
+ sound ^= SOUND_ADMINHELP
+
+ if("ui")
+ switch(UI_style)
+ if("Midnight")
+ UI_style = "Plasmafire"
+ if("Plasmafire")
+ UI_style = "Retro"
+ if("Retro")
+ UI_style = "Slimecore"
+ if("Slimecore")
+ UI_style = "Operative"
+ if("Operative")
+ UI_style = "White"
+ else
+ UI_style = "Midnight"
+
+ if(ishuman(usr)) //mid-round preference changes, for aesthetics
+ var/mob/living/carbon/human/H = usr
+ H.remake_hud()
+
+ if("nanoui")
+ nanoui_fancy = !nanoui_fancy
+
+ if("ghost_att_anim")
+ show_ghostitem_attack = !show_ghostitem_attack
+
+ if("UIcolor")
+ var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null
+ if(!UI_style_color_new) return
+ UI_style_color = UI_style_color_new
+
+ if(ishuman(usr)) //mid-round preference changes, for aesthetics
+ var/mob/living/carbon/human/H = usr
+ H.remake_hud()
+
+ if("UIalpha")
+ var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num
+ if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return
+ UI_style_alpha = UI_style_alpha_new
+
+ if(ishuman(usr)) //mid-round preference changes, for aesthetics
+ var/mob/living/carbon/human/H = usr
+ H.remake_hud()
+
+ if("be_special")
+ var/r = href_list["role"]
+ if(!(r in special_roles))
+ var/cleaned_r = sql_sanitize_text(r)
+ if(r != cleaned_r) // up to no good
+ message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]")
+ to_chat(user, "Stop right there, criminal scum")
+ else
+ be_special ^= r
+
+ if("name")
+ be_random_name = !be_random_name
+
+ if("randomslot")
+ randomslot = !randomslot
+
+ if("hear_midis")
+ sound ^= SOUND_MIDI
+
+ if("lobby_music")
+ sound ^= SOUND_LOBBY
+ if(sound & SOUND_LOBBY)
+ user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
+ else
+ user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
+
+ if("ghost_ears")
+ toggles ^= CHAT_GHOSTEARS
+
+ if("ghost_sight")
+ toggles ^= CHAT_GHOSTSIGHT
+
+ if("ghost_radio")
+ toggles ^= CHAT_GHOSTRADIO
+
+ if("ghost_radio")
+ toggles ^= CHAT_GHOSTRADIO
+
+ if("save")
+ save_preferences(user)
+ save_character(user)
+
+ if("reload")
+ load_preferences(user)
+ load_character(user)
+
+ if("open_load_dialog")
+ if(!IsGuestKey(user.key))
+ open_load_dialog(user)
+ return 1
+
+ if("close_load_dialog")
+ close_load_dialog(user)
+
+ if("changeslot")
+ if(!load_character(user,text2num(href_list["num"])))
+ random_character()
+ real_name = random_name(gender)
+ save_character(user)
+ close_load_dialog(user)
+
+ if("tab")
+ if (href_list["tab"])
+ current_tab = text2num(href_list["tab"])
+
+ ShowChoices(user)
+ return 1
+
+/datum/preferences/proc/copy_to(mob/living/carbon/human/character)
+ var/datum/species/S = all_species[species]
+ character.change_species(species) // Yell at me if this causes everything to melt
+ if(be_random_name)
+ real_name = random_name(gender,species)
+
+ if(config.humans_need_surnames)
+ var/firstspace = findtext(real_name, " ")
+ var/name_length = length(real_name)
+ if(!firstspace) //we need a surname
+ real_name += " [pick(last_names)]"
+ else if(firstspace == name_length)
+ real_name += "[pick(last_names)]"
+
+ character.add_language(language)
+
+ character.real_name = real_name
+ character.dna.real_name = real_name
+ character.name = character.real_name
+
+ character.flavor_text = flavor_text
+ if(character.ckey && !jobban_isbanned(character, "Records"))
+ character.med_record = med_record
+ character.sec_record = sec_record
+ character.gen_record = gen_record
+
+ character.change_gender(gender)
+ character.age = age
+ character.b_type = b_type
+
+ character.r_eyes = r_eyes
+ character.g_eyes = g_eyes
+ character.b_eyes = b_eyes
+
+ //Head-specific
+ var/obj/item/organ/external/head/H = character.get_organ("head")
+ H.r_hair = r_hair
+ H.g_hair = g_hair
+ H.b_hair = b_hair
+
+ H.r_facial = r_facial
+ H.g_facial = g_facial
+ H.b_facial = b_facial
+
+ H.h_style = h_style
+ H.f_style = f_style
+ //End of head-specific.
+
+ character.r_skin = r_skin
+ character.g_skin = g_skin
+ character.b_skin = b_skin
+
+ character.s_tone = s_tone
+
+ // Destroy/cyborgize organs
+ for(var/name in organ_data)
+
+ var/status = organ_data[name]
+ var/obj/item/organ/external/O = character.organs_by_name[name]
+ if(O)
+ if(status == "amputated")
+ character.organs_by_name[O.limb_name] = null
+ character.organs -= O
+ if(O.children) // This might need to become recursive.
+ for(var/obj/item/organ/external/child in O.children)
+ character.organs_by_name[child.limb_name] = null
+ character.organs -= child
+
+ else if(status == "cyborg")
+ if(rlimb_data[name])
+ O.robotize(rlimb_data[name])
+ else
+ O.robotize()
+ else
+ var/obj/item/organ/internal/I = character.get_int_organ_tag(name)
+ if(I)
+ if(status == "assisted")
+ I.mechassist()
+ else if(status == "mechanical")
+ I.robotize()
+
+ character.dna.b_type = b_type
+ if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)
+ character.dna.SetSEState(FATBLOCK,1,1)
+ character.mutations += FAT
+ character.mutations += OBESITY
+ character.overeatduration = 600
+
+ if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
+ character.dna.SetSEState(GLASSESBLOCK,1,1)
+ character.disabilities|=NEARSIGHTED
+
+ if(disabilities & DISABILITY_FLAG_EPILEPTIC)
+ character.dna.SetSEState(EPILEPSYBLOCK,1,1)
+ character.disabilities|=EPILEPSY
+
+ if(disabilities & DISABILITY_FLAG_DEAF)
+ character.dna.SetSEState(DEAFBLOCK,1,1)
+ character.sdisabilities|=DEAF
+
+ if(disabilities & DISABILITY_FLAG_BLIND)
+ character.dna.SetSEState(BLINDBLOCK,1,1)
+ character.sdisabilities|=BLIND
+
+ if(disabilities & DISABILITY_FLAG_MUTE)
+ character.dna.SetSEState(MUTEBLOCK,1,1)
+ character.sdisabilities |= MUTE
+
+ S.handle_dna(character)
+
+ if(character.dna.dirtySE)
+ character.dna.UpdateSE()
+ domutcheck(character)
+
+ // Wheelchair necessary?
+ var/obj/item/organ/external/l_foot = character.get_organ("l_foot")
+ var/obj/item/organ/external/r_foot = character.get_organ("r_foot")
+ if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
+ var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
+ character.buckled = W
+ character.update_canmove()
+ W.dir = character.dir
+ W.buckled_mob = character
+ W.add_fingerprint(character)
+
+ character.underwear = underwear
+ character.undershirt = undershirt
+ character.socks = socks
+
+ if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
+ H.r_headacc = r_headacc
+ H.g_headacc = g_headacc
+ H.b_headacc = b_headacc
+ H.ha_style = ha_style
+ if(character.species.bodyflags & HAS_MARKINGS)
+ character.r_markings = r_markings
+ character.g_markings = g_markings
+ character.b_markings = b_markings
+ character.m_style = m_style
+
+ if(body_accessory)
+ character.body_accessory = body_accessory_by_name["[body_accessory]"]
+
+ if(backbag > 4 || backbag < 1)
+ backbag = 1 //Same as above
+ character.backbag = backbag
+
+ //Debugging report to track down a bug, which randomly assigned the plural gender to people.
+ if(character.gender in list(PLURAL, NEUTER))
+ if(isliving(src)) //Ghosts get neuter by default
+ message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
+ character.change_gender(MALE)
+
+ character.dna.ready_dna(character, flatten_SE = 0)
+ character.sync_organ_dna(assimilate=1)
+ character.UpdateAppearance()
+
+ // Do the initial caching of the player's body icons.
+ character.force_update_limbs()
+ character.update_eyes()
+ character.regenerate_icons()
+
+/datum/preferences/proc/open_load_dialog(mob/user)
+
+ var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot")
+
+ var/dat = ""
+ dat += ""
+ dat += "Select a character slot to load
"
+ var/name
+
+ for(var/i=1, i<=max_save_slots, i++)
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ return
+ while(query.NextRow())
+ if(i==text2num(query.item[1]))
+ name = query.item[2]
+ if(!name) name = "Character[i]"
+ if(i==default_slot)
+ name = "[name]"
+ dat += "[name]
"
+ name = null
+
+ dat += "
"
+ dat += "Close
"
+ dat += ""
+// user << browse(dat, "window=saves;size=300x390")
+ var/datum/browser/popup = new(user, "saves", "Character Saves
", 300, 390)
+ popup.set_content(dat)
+ popup.open(0)
+
+/datum/preferences/proc/close_load_dialog(mob/user)
+ user << browse(null, "window=saves")
\ No newline at end of file
diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
similarity index 98%
rename from code/modules/client/preferences_mysql.dm
rename to code/modules/client/preference/preferences_mysql.dm
index 15abdab0360..6de5dcc3b51 100644
--- a/code/modules/client/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -158,7 +158,8 @@
nanotrasen_relation,
speciesprefs,
socks,
- body_accessory
+ body_accessory,
+ gear
FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"})
if(!query.Execute())
var/err = query.ErrorMsg()
@@ -236,6 +237,7 @@
//socks
socks = query.item[58]
body_accessory = query.item[59]
+ gear = params2list(query.item[60])
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -298,6 +300,7 @@
if(!player_alt_titles) player_alt_titles = new()
if(!organ_data) src.organ_data = list()
if(!rlimb_data) src.rlimb_data = list()
+ if(!gear) gear = list()
return 1
@@ -305,12 +308,15 @@
var/organlist
var/rlimblist
var/playertitlelist
+ var/gearlist
if(!isemptylist(organ_data))
organlist = list2params(organ_data)
if(!isemptylist(rlimb_data))
rlimblist = list2params(rlimb_data)
if(!isemptylist(player_alt_titles))
playertitlelist = list2params(player_alt_titles)
+ if(!isemptylist(gear))
+ gearlist = list2params(gear)
var/DBQuery/firstquery = dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot")
firstquery.Execute()
@@ -374,7 +380,8 @@
nanotrasen_relation='[nanotrasen_relation]',
speciesprefs='[speciesprefs]',
socks='[socks]',
- body_accessory='[body_accessory]'
+ body_accessory='[body_accessory]',
+ gear='[gearlist]'
WHERE ckey='[C.ckey]'
AND slot='[default_slot]'"}
)
@@ -405,7 +412,7 @@
flavor_text, med_record, sec_record, gen_record,
player_alt_titles,
disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs,
- socks, body_accessory)
+ socks, body_accessory, gear)
VALUES
('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]',
@@ -426,7 +433,7 @@
'[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]',
'[playertitlelist]',
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]',
- '[socks]', '[body_accessory]')
+ '[socks]', '[body_accessory]', '[gearlist]')
"}
)
diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preference/preferences_spawnpoints.dm
similarity index 100%
rename from code/modules/client/preferences_spawnpoints.dm
rename to code/modules/client/preference/preferences_spawnpoints.dm
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm
similarity index 97%
rename from code/modules/client/preferences_toggles.dm
rename to code/modules/client/preference/preferences_toggles.dm
index 0b52b15bd42..541dee07242 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preference/preferences_toggles.dm
@@ -1,216 +1,216 @@
-//toggles
-/client/verb/toggle_ghost_ears()
- set name = "Show/Hide GhostEars"
- set category = "Preferences"
- set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs"
- prefs.toggles ^= CHAT_GHOSTEARS
- to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].")
- prefs.save_preferences(src)
- feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggle_ghost_sight()
- set name = "Show/Hide GhostSight"
- set category = "Preferences"
- set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs"
- prefs.toggles ^= CHAT_GHOSTSIGHT
- to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].")
- prefs.save_preferences(src)
- feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggle_ghost_radio()
- set name = "Enable/Disable GhostRadio"
- set category = "Preferences"
- set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers"
- prefs.toggles ^= CHAT_GHOSTRADIO
- to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].")
- prefs.save_preferences(src)
- feedback_add_details("admin_verb","TGR")
-
-/client/proc/toggle_hear_radio()
- set name = "Show/Hide RadioChatter"
- set category = "Preferences"
- set desc = "Toggle seeing radiochatter from radios and speakers"
- if(!holder) return
- prefs.toggles ^= CHAT_RADIO
- prefs.save_preferences(src)
- to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers")
- feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggleadminhelpsound()
- set name = "Hear/Silence Adminhelps"
- set category = "Preferences"
- set desc = "Toggle hearing a notification when admin PMs are recieved"
- if(!holder) return
- prefs.sound ^= SOUND_ADMINHELP
- prefs.save_preferences(src)
- to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
- feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/deadchat() // Deadchat toggle is usable by anyone.
- set name = "Show/Hide Deadchat"
- set category = "Preferences"
- set desc ="Toggles seeing deadchat"
- prefs.toggles ^= CHAT_DEAD
- prefs.save_preferences(src)
-
- if(src.holder)
- to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
- else
- to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
-
- feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/proc/toggleprayers()
- set name = "Show/Hide Prayers"
- set category = "Preferences"
- set desc = "Toggles seeing prayers"
- prefs.toggles ^= CHAT_PRAYER
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
- feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/togglescoreboard()
- set name = "Hide/Display End Round Scoreboard"
- set category = "Preferences"
- set desc = "Toggles displaying end of round scoreboard"
- prefs.toggles ^= DISABLE_SCOREBOARD
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.")
- feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/togglekarmareminder()
- set name = "Hide/Display End Round Karma Reminder"
- set category = "Preferences"
- set desc = "Toggles displaying end of round karma reminder"
- prefs.toggles ^= DISABLE_KARMA_REMINDER
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.")
- feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggletitlemusic()
- set name = "Hear/Silence LobbyMusic"
- set category = "Preferences"
- set desc = "Toggles hearing the GameLobby music"
- prefs.sound ^= SOUND_LOBBY
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_LOBBY)
- to_chat(src, "You will now hear music in the game lobby.")
- if(istype(mob, /mob/new_player))
- playtitlemusic()
- else
- to_chat(src, "You will no longer hear music in the game lobby.")
- if(istype(mob, /mob/new_player))
- src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jamsz
-
- feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/togglemidis()
- set name = "Hear/Silence Midis"
- set category = "Preferences"
- set desc = "Toggles hearing sounds uploaded by admins"
- prefs.sound ^= SOUND_MIDI
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_MIDI)
- to_chat(src, "You will now hear any sounds uploaded by admins.")
- else
- var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
- break_sound.priority = 250
- src << break_sound//breaks the client's sound output on channel 777
-
- to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.")
- feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/listen_ooc()
- set name = "Show/Hide OOC"
- set category = "Preferences"
- set desc = "Toggles seeing OutOfCharacter chat"
- prefs.toggles ^= CHAT_OOC
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.")
- feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-/client/verb/listen_looc()
- set name = "Show/Hide LOOC"
- set category = "Preferences"
- set desc = "Toggles seeing Local OutOfCharacter chat"
- prefs.toggles ^= CHAT_LOOC
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
- feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
- set name = "Hear/Silence Ambience"
- set category = "Preferences"
- set desc = "Toggles hearing ambient sound effects"
- prefs.sound ^= SOUND_AMBIENCE
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_AMBIENCE)
- to_chat(src, "You will now hear ambient sounds.")
- else
- to_chat(src, "You will no longer hear ambient sounds.")
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
- feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels.
- set name = "Hear/Silence White Noise"
- set category = "Preferences"
- set desc = "Toggles hearing ambient white noise"
- prefs.sound ^= SOUND_BUZZ
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_BUZZ)
- to_chat(src, "You will now hear ambient white noise.")
- else
- to_chat(src, "You will no longer hear ambient white noise.")
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
- feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-/client/verb/Toggle_Heartbeat() //to toggle off heartbeat sounds, in case they get too annoying
- set name = "Hear/Silence Heartbeat"
- set category = "Preferences"
- set desc = "Toggles hearing heart beating sound effects"
- prefs.sound ^= SOUND_HEARTBEAT
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_HEARTBEAT)
- to_chat(src, "You will now hear heartbeat sounds.")
- else
- to_chat(src, "You will no longer hear heartbeat sounds.")
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
- feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-// This needs a toggle because you people are awful and spammed terrible music
-/client/verb/toggle_instruments()
- set name = "Hear/Silence Instruments"
- set category = "Preferences"
- set desc = "Toggles hearing musical instruments like the violin and piano"
- prefs.sound ^= SOUND_INSTRUMENTS
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_INSTRUMENTS)
- to_chat(src, "You will now hear people playing musical instruments.")
- else
- to_chat(src, "You will no longer hear musical instruments.")
- feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggle_media()
- set name = "Hear/Silence Streaming"
- set category = "Preferences"
- set desc = "Toggle hearing streaming media (radios, jukeboxes, etc)"
-
- prefs.sound ^= SOUND_STREAMING
- prefs.save_preferences(src)
- to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.")
- if(!media) return
- if(prefs.sound & SOUND_STREAMING)
- media.update_music()
- else
- media.stop_music()
-
-/client/verb/setup_character()
- set name = "Game Preferences"
- set category = "Preferences"
- set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will."
- prefs.current_tab = 1
+//toggles
+/client/verb/toggle_ghost_ears()
+ set name = "Show/Hide GhostEars"
+ set category = "Preferences"
+ set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs"
+ prefs.toggles ^= CHAT_GHOSTEARS
+ to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].")
+ prefs.save_preferences(src)
+ feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggle_ghost_sight()
+ set name = "Show/Hide GhostSight"
+ set category = "Preferences"
+ set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs"
+ prefs.toggles ^= CHAT_GHOSTSIGHT
+ to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].")
+ prefs.save_preferences(src)
+ feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggle_ghost_radio()
+ set name = "Enable/Disable GhostRadio"
+ set category = "Preferences"
+ set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers"
+ prefs.toggles ^= CHAT_GHOSTRADIO
+ to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].")
+ prefs.save_preferences(src)
+ feedback_add_details("admin_verb","TGR")
+
+/client/proc/toggle_hear_radio()
+ set name = "Show/Hide RadioChatter"
+ set category = "Preferences"
+ set desc = "Toggle seeing radiochatter from radios and speakers"
+ if(!holder) return
+ prefs.toggles ^= CHAT_RADIO
+ prefs.save_preferences(src)
+ to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers")
+ feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggleadminhelpsound()
+ set name = "Hear/Silence Adminhelps"
+ set category = "Preferences"
+ set desc = "Toggle hearing a notification when admin PMs are recieved"
+ if(!holder) return
+ prefs.sound ^= SOUND_ADMINHELP
+ prefs.save_preferences(src)
+ to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
+ feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/deadchat() // Deadchat toggle is usable by anyone.
+ set name = "Show/Hide Deadchat"
+ set category = "Preferences"
+ set desc ="Toggles seeing deadchat"
+ prefs.toggles ^= CHAT_DEAD
+ prefs.save_preferences(src)
+
+ if(src.holder)
+ to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
+ else
+ to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
+
+ feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/toggleprayers()
+ set name = "Show/Hide Prayers"
+ set category = "Preferences"
+ set desc = "Toggles seeing prayers"
+ prefs.toggles ^= CHAT_PRAYER
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
+ feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/togglescoreboard()
+ set name = "Hide/Display End Round Scoreboard"
+ set category = "Preferences"
+ set desc = "Toggles displaying end of round scoreboard"
+ prefs.toggles ^= DISABLE_SCOREBOARD
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.")
+ feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/togglekarmareminder()
+ set name = "Hide/Display End Round Karma Reminder"
+ set category = "Preferences"
+ set desc = "Toggles displaying end of round karma reminder"
+ prefs.toggles ^= DISABLE_KARMA_REMINDER
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.")
+ feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggletitlemusic()
+ set name = "Hear/Silence LobbyMusic"
+ set category = "Preferences"
+ set desc = "Toggles hearing the GameLobby music"
+ prefs.sound ^= SOUND_LOBBY
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_LOBBY)
+ to_chat(src, "You will now hear music in the game lobby.")
+ if(istype(mob, /mob/new_player))
+ playtitlemusic()
+ else
+ to_chat(src, "You will no longer hear music in the game lobby.")
+ if(istype(mob, /mob/new_player))
+ src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jamsz
+
+ feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/togglemidis()
+ set name = "Hear/Silence Midis"
+ set category = "Preferences"
+ set desc = "Toggles hearing sounds uploaded by admins"
+ prefs.sound ^= SOUND_MIDI
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_MIDI)
+ to_chat(src, "You will now hear any sounds uploaded by admins.")
+ else
+ var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
+ break_sound.priority = 250
+ src << break_sound //breaks the client's sound output on channel 777
+
+ to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.")
+ feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/listen_ooc()
+ set name = "Show/Hide OOC"
+ set category = "Preferences"
+ set desc = "Toggles seeing OutOfCharacter chat"
+ prefs.toggles ^= CHAT_OOC
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.")
+ feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+/client/verb/listen_looc()
+ set name = "Show/Hide LOOC"
+ set category = "Preferences"
+ set desc = "Toggles seeing Local OutOfCharacter chat"
+ prefs.toggles ^= CHAT_LOOC
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
+ feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
+ set name = "Hear/Silence Ambience"
+ set category = "Preferences"
+ set desc = "Toggles hearing ambient sound effects"
+ prefs.sound ^= SOUND_AMBIENCE
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_AMBIENCE)
+ to_chat(src, "You will now hear ambient sounds.")
+ else
+ to_chat(src, "You will no longer hear ambient sounds.")
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
+ feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels.
+ set name = "Hear/Silence White Noise"
+ set category = "Preferences"
+ set desc = "Toggles hearing ambient white noise"
+ prefs.sound ^= SOUND_BUZZ
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_BUZZ)
+ to_chat(src, "You will now hear ambient white noise.")
+ else
+ to_chat(src, "You will no longer hear ambient white noise.")
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+/client/verb/Toggle_Heartbeat() //to toggle off heartbeat sounds, in case they get too annoying
+ set name = "Hear/Silence Heartbeat"
+ set category = "Preferences"
+ set desc = "Toggles hearing heart beating sound effects"
+ prefs.sound ^= SOUND_HEARTBEAT
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_HEARTBEAT)
+ to_chat(src, "You will now hear heartbeat sounds.")
+ else
+ to_chat(src, "You will no longer hear heartbeat sounds.")
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+// This needs a toggle because you people are awful and spammed terrible music
+/client/verb/toggle_instruments()
+ set name = "Hear/Silence Instruments"
+ set category = "Preferences"
+ set desc = "Toggles hearing musical instruments like the violin and piano"
+ prefs.sound ^= SOUND_INSTRUMENTS
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_INSTRUMENTS)
+ to_chat(src, "You will now hear people playing musical instruments.")
+ else
+ to_chat(src, "You will no longer hear musical instruments.")
+ feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggle_media()
+ set name = "Hear/Silence Streaming"
+ set category = "Preferences"
+ set desc = "Toggle hearing streaming media (radios, jukeboxes, etc)"
+
+ prefs.sound ^= SOUND_STREAMING
+ prefs.save_preferences(src)
+ to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.")
+ if(!media) return
+ if(prefs.sound & SOUND_STREAMING)
+ media.update_music()
+ else
+ media.stop_music()
+
+/client/verb/setup_character()
+ set name = "Game Preferences"
+ set category = "Preferences"
+ set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will."
+ prefs.current_tab = 1
prefs.ShowChoices(usr)
\ No newline at end of file
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 8d6595b73ff..76b233f3cc6 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -521,7 +521,7 @@ BLIND // can't see anything
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
item_state = "s_helmet"
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -543,8 +543,8 @@ BLIND // can't see anything
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
- slowdown = 2
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
+ slowdown = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
@@ -561,7 +561,7 @@ BLIND // can't see anything
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
permeability_coefficient = 0.90
slot_flags = SLOT_ICLOTHING
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi',
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 5dc555a10d7..48e2ccb7f95 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -7,7 +7,7 @@
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite)
- armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
+ armor = list(melee = 15, bullet = 5, laser = 20, energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
action_button_name = "Toggle Helmet Light"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index a9e8bbdb7e2..17058cc23b5 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -4,7 +4,7 @@
icon_state = "helmetmaterials"
flags = HEADCOVERSEYES | HEADBANGPROTECT
item_state = "helmetmaterials"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -69,7 +69,7 @@
desc = "A bulletproof helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "swat"
item_state = "swat-alt"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
@@ -82,7 +82,7 @@
icon_state = "riot"
item_state = "helmet"
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | HEADBANGPROTECT
- armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 41, bullet = 15, laser = 5, energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
strip_delay = 80
@@ -91,9 +91,8 @@
desc = "A classic metal helmet."
icon_state = "knight_green"
item_state = "knight_green"
- flags = BLOCKHAIR | HEADCOVERSEYES | HEADCOVERSMOUTH
- armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
- flags_inv = HIDEMASK | HIDEEARS | HIDEEYES | HIDEFACE
+ flags = BLOCKHAIR|HEADCOVERSEYES|HEADCOVERSMOUTH
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
/obj/item/clothing/head/helmet/justice
name = "helmet of justice"
@@ -120,7 +119,7 @@
icon_state = "swat"
flags = HEADCOVERSEYES
item_state = "swat"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -145,7 +144,7 @@
icon_state = "thunderdome"
flags = HEADCOVERSEYES
item_state = "thunderdome"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -181,7 +180,7 @@ obj/item/clothing/head/helmet/redtaghelm
icon_state = "redtaghelm"
flags = HEADCOVERSEYES
item_state = "redtaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
@@ -191,7 +190,7 @@ obj/item/clothing/head/helmet/bluetaghelm
icon_state = "bluetaghelm"
flags = HEADCOVERSEYES
item_state = "bluetaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
@@ -203,19 +202,19 @@ obj/item/clothing/head/blob
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
-/obj/item/clothing/head/helmet/knight/blue
+/obj/item/clothing/head/helmet/riot/knight/blue
icon_state = "knight_blue"
item_state = "knight_blue"
-/obj/item/clothing/head/helmet/knight/yellow
+/obj/item/clothing/head/helmet/riot/knight/yellow
icon_state = "knight_yellow"
item_state = "knight_yellow"
-/obj/item/clothing/head/helmet/knight/red
+/obj/item/clothing/head/helmet/riot/knight/red
icon_state = "knight_red"
item_state = "knight_red"
-/obj/item/clothing/head/helmet/knight/templar
+/obj/item/clothing/head/helmet/riot/knight/templar
name = "crusader helmet"
desc = "Deus Vult."
icon_state = "knight_templar"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 9da40760327..9492b7839ac 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -15,7 +15,7 @@
icon_state = "captain"
desc = "It's good being the king."
item_state = "caphat"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
//Captain: no longer space-worthy
@@ -29,7 +29,7 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
//Nanotrasen Representative
/obj/item/clothing/head/ntrep
@@ -57,7 +57,7 @@
desc = "Someone who wears this will look very smart."
icon_state = "detective"
allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn, /obj/item/weapon/pen)
- armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
//Mime
/obj/item/clothing/head/beret
@@ -70,7 +70,7 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
strip_delay = 80
/obj/item/clothing/head/HoS/beret
@@ -82,7 +82,7 @@
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/officer
@@ -90,20 +90,21 @@
desc = "A red cap with an old-fashioned badge on the front for establishing that you are, in fact, the law."
icon_state = "customshelm"
item_state = "customshelm"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ strip_delay = 60
/obj/item/clothing/head/beret/sec
name = "security beret"
desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety."
icon_state = "beret_officer"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/beret/sec/warden
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "beret_warden"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/head/beret/eng
name = "engineering beret"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 88af8bf4dd3..d0473fedb98 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -5,7 +5,7 @@
icon_state = "centcom"
desc = "It's good to be emperor."
item_state = "centhat"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 80
/obj/item/clothing/head/hairflower
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 0fbb39e6f1b..f2df0420fbe 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -20,7 +20,7 @@
materials = list(MAT_METAL=1750, MAT_GLASS=400)
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
action_button_name = "flip welding helmet"
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
@@ -149,7 +149,7 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
action_button_name = "Toggle Pumpkin Light"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 2 //luminosity when on
@@ -161,7 +161,7 @@
item_color = "reindeer"
flags_inv = 0
action_button_name = "Toggle Nose Light"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 1 //luminosity when on
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index e14057b32b1..e7dae7d04da 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -90,7 +90,7 @@
desc = "It's baseball hat in tasteful red colour."
icon_state = "secsoft"
item_color = "sec"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/soft/sec/corp
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 6f6d0f03446..ef3a0f2b83e 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -27,7 +27,7 @@
materials = list(MAT_METAL=4000, MAT_GLASS=2000)
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
origin_tech = "materials=2;engineering=2"
action_button_name = "Toggle Welding Helmet"
@@ -78,7 +78,7 @@
desc = "A modernised version of the classic design, this mask will not only filter out toxins but it can also be connected to an air supply."
icon_state = "plaguedoctor"
item_state = "gas_mask"
- armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 2, energy = 2, bomb = 0, bio = 75, rad = 0)
/obj/item/clothing/mask/gas/swat
name = "\improper SWAT mask"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index d9817add99f..3e99b277db3 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -63,7 +63,7 @@
flags = MASKCOVERSMOUTH
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0)
action_button_name = "Adjust Sterile Mask"
ignore_maskadjust = 0
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 72d00a4abf1..af361951f3d 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -21,7 +21,7 @@
can_cut_open = 1
icon_state = "jackboots"
item_state = "jackboots"
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0)
species_restricted = null //Syndicate tech means even Tajarans can kick ass with these
strip_delay = 70
@@ -29,7 +29,7 @@
name = "\improper SWAT shoes"
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 50, bomb = 50, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30)
flags = NOSLIP
/obj/item/clothing/shoes/sandal
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index d5fcbdf3251..988e9d09725 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -2,8 +2,6 @@
/obj/item/clothing/head/helmet/space/skrell
name = "Skrellian helmet"
desc = "Smoothly contoured and polished to a shine. Still looks like a fishbowl."
- armor = list(melee = 20, bullet = 20, laser = 50,energy = 50, bomb = 50, bio = 100, rad = 100)
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Skrell","Human")
/obj/item/clothing/head/helmet/space/skrell/white
@@ -19,10 +17,6 @@
/obj/item/clothing/suit/space/skrell
name = "Skrellian hardsuit"
desc = "Seems like a wetsuit with reinforced plating seamlessly attached to it. Very chic."
- armor = list(melee = 20, bullet = 20, laser = 50,energy = 50, bomb = 50, bio = 100, rad = 100)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
- heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Skrell","Human")
/obj/item/clothing/suit/space/skrell/white
@@ -37,9 +31,6 @@
//Unathi space gear. Huge and restrictive.
/obj/item/clothing/head/helmet/space/unathi
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50)
- heat_protection = HEAD
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Unathi")
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
@@ -50,10 +41,6 @@
item_color = "unathi_helm_cheap"
/obj/item/clothing/suit/space/unathi
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
- heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Unathi")
/obj/item/clothing/suit/space/unathi/rig_cheap
@@ -61,7 +48,6 @@
desc = "A cheap NT knock-off of a Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow."
icon_state = "rig-unathi-cheap"
item_state = "rig-unathi-cheap"
- slowdown = 3
/obj/item/clothing/head/helmet/space/unathi/breacher
name = "breacher helm"
@@ -76,15 +62,13 @@
icon_state = "unathi_breacher"
item_state = "unathi_breacher"
item_color = "unathi_breacher"
- slowdown = 1
// Vox space gear (vaccuum suit, low pressure armour)
// Can't be equipped by any other species due to bone structure and vox cybernetics.
/obj/item/clothing/suit/space/vox
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- slowdown = 2
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Vox", "Vox Armalis")
@@ -94,7 +78,7 @@
)
/obj/item/clothing/head/helmet/space/vox
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 334e659302b..96ae6519d5d 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -23,7 +23,6 @@
icon_state = "chronosuit"
item_state = "chronosuit"
action_button_name = "Toggle Chronosuit"
- slowdown = 2
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
var/obj/effect/chronos_cam/camera = null
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 91824a9856e..d5c4d5626bb 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -4,7 +4,7 @@
desc = "A helmet worn by members of the Nanotrasen Emergency Response Team. Armoured and space ready."
icon_state = "rig0-ert_commander"
item_state = "helm-command"
- armor = list(melee = 50, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
+ armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
rig_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
var/obj/machinery/camera/camera
strip_delay = 130
@@ -30,8 +30,7 @@
item_state = "suit-command"
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
+ armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse, \
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index aab36bb04cb..d3b5c77f389 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -6,7 +6,7 @@
desc = "A special helmet designed for only the most fashionable of military figureheads."
flags_inv = HIDEFACE
permeability_coefficient = 0.01
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
@@ -26,8 +26,7 @@
item_state = "capspacesuit"
w_class = 4
allowed = list(/obj/item/weapon/tank, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
- slowdown = 1
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
@@ -56,8 +55,7 @@
icon_state = "deathsquad"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat)
- armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
- slowdown = 1
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
@@ -69,14 +67,14 @@
icon_state = "heavy"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat)
- armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
strip_delay = 120
/obj/item/clothing/head/helmet/space/deathsquad/beret
name = "officer's beret"
desc = "An armored beret commonly used by special operations officers."
icon_state = "beret_officer"
- armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 65, bullet = 55, laser = 35, energy = 20, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/deathsquad/officer
name = "officer jacket"
@@ -111,7 +109,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
strip_delay = 40
put_on_delay = 20
@@ -124,7 +122,7 @@
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 40
put_on_delay = 20
@@ -146,8 +144,7 @@
icon_state = "spacenew"
item_state = "s_suit"
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
- slowdown = 1
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
/obj/item/clothing/head/helmet/space/eva
name = "EVA helmet"
@@ -155,7 +152,7 @@
item_state = "s_helmet"
desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flash_protect = 0
//Mime's Hardsuit
@@ -192,7 +189,7 @@
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat"
item_state = "griffinhat"
- armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
@@ -203,8 +200,7 @@
icon_state = "freedom"
item_state = "freedom"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
- slowdown = 1
+ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index fd4122c56ec..2fe6ea491e8 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -5,7 +5,7 @@
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
- armor = list(melee = 0, bullet = 0, laser = 0 ,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
@@ -185,14 +185,14 @@
/obj/item/clothing/suit/space/eva/plasmaman/miner
name = "plasmaman miner suit"
icon_state = "plasmamanMiner_suit"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
- slowdown = 2
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ slowdown = 1
/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
name = "plasmaman miner helmet"
icon_state = "plasmamanMiner_helmet0"
base_state = "plasmamanMiner_helmet"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
// MEDSCI
@@ -266,13 +266,13 @@
/obj/item/clothing/suit/space/eva/plasmaman/security
name = "plasmaman security suit"
icon_state = "plasmamanSecurity_suit"
- armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+ armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/security
name = "plasmaman security helmet"
icon_state = "plasmamanSecurity_helmet0"
base_state = "plasmamanSecurity_helmet"
- armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+ armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/suit/space/eva/plasmaman/security/hos
name = "plasmaman head of security suit"
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index ce73bb13a24..d4a0fec12bc 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -55,7 +55,6 @@
desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit."
icon_state = "rig-engineering"
item_state = "eng_hardsuit"
- slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
siemens_coefficient = 0
@@ -247,7 +246,6 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "rig-engineering"
item_state = "eng_hardsuit"
- slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
@@ -279,14 +277,14 @@
item_state = "mining_helm"
item_color = "mining"
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/suit/space/rig/mining
icon_state = "rig-mining"
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
item_state = "mining_hardsuit"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
@@ -297,7 +295,7 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
on = 1
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
action_button_name = "Toggle Helmet Mode"
@@ -339,11 +337,10 @@
icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
- slowdown = 1
w_class = 3
var/on = 1
action_button_name = "Toggle Hardsuit Mode"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
/obj/item/clothing/suit/space/rig/syndi/update_icon()
@@ -379,7 +376,7 @@
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
- armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
@@ -398,7 +395,7 @@
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode."
icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
- armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
@@ -420,7 +417,7 @@
item_state = "wiz_helm"
item_color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
- armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
+ armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -431,10 +428,9 @@
name = "gem-encrusted hardsuit"
desc = "A bizarre gem-encrusted suit that radiates magical energies."
item_state = "wiz_hardsuit"
- slowdown = 1
w_class = 3
unacidable = 1
- armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
@@ -458,7 +454,6 @@
name = "medical hardsuit"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
- slowdown = 1
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/device/rad_laser)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
@@ -469,7 +464,7 @@
icon_state = "rig0-sec"
item_state = "sec_helm"
item_color = "sec"
- armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/suit/space/rig/security
icon_state = "rig-sec"
@@ -507,7 +502,7 @@
icon_state = "rig0-singuloth"
item_state = "singuloth_helm"
item_color = "singuloth"
- armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 100)
+ armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
/obj/item/clothing/suit/space/rig/singuloth
icon_state = "rig-singuloth"
@@ -515,4 +510,4 @@
desc = "This is a ceremonial armor from the chapter of the Singuloth Knights. It's made of pure forged adamantium."
item_state = "singuloth_hardsuit"
flags = STOPSPRESSUREDMAGE
- armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 100)
+ armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 66a0e62a39b..9e0fb8c55b0 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -17,7 +17,7 @@
w_class = 4
// These values are passed on to all component pieces.
- armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
siemens_coefficient = 0.2
diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm
index 5f43c172a39..8632b6cc472 100644
--- a/code/modules/clothing/spacesuits/rig/suits/alien.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm
@@ -3,13 +3,13 @@
desc = "A cheap NT knock-off of an Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow."
suit_type = "NT breacher"
icon_state = "breacher_rig_cheap"
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 70, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 45, bio = 100, rad = 50)
emp_protection = -20
slowdown = 6
offline_slowdown = 10
vision_restriction = 1
offline_vision_restriction = 2
-
+
chest_type = /obj/item/clothing/suit/space/new_rig
helm_type = /obj/item/clothing/head/helmet/space/new_rig/unathi
boot_type = /obj/item/clothing/shoes/magboots/rig/unathi
@@ -19,7 +19,7 @@
desc = "An authentic Unathi breacher chassis. Huge, bulky and absurdly heavy. It must be like wearing a tank."
suit_type = "breacher chassis"
icon_state = "breacher_rig"
- armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow.
+ armor = list(melee = 45, bullet = 45, laser = 45, energy = 45, bomb = 45, bio = 100, rad = 75) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow. //Whoever made this was on meth
vision_restriction = 0
/obj/item/clothing/head/helmet/space/new_rig/unathi
@@ -27,6 +27,6 @@
/obj/item/clothing/suit/space/new_rig/unathi
species_restricted = list("Unathi")
-
+
/obj/item/clothing/shoes/magboots/rig/unathi
species_restricted = list("Unathi")
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm
index cd37189a080..98adb708ada 100644
--- a/code/modules/clothing/spacesuits/rig/suits/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm
@@ -5,7 +5,7 @@
desc = "A sleek and dangerous hardsuit for active combat."
icon_state = "security_rig"
suit_type = "combat hardsuit"
- armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm
index f10a859af9a..4aed2a53f30 100644
--- a/code/modules/clothing/spacesuits/rig/suits/ert.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm
@@ -10,7 +10,7 @@
req_access = list(access_cent_specops)
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
+ armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \
@@ -27,7 +27,6 @@
desc = "A suit worn by the engineering division of an Emergency Response Team. Has orange highlights. Armoured and space ready."
suit_type = "ERT engineer"
icon_state = "ert_engineer_rig"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
siemens_coefficient = 0
initial_modules = list(
@@ -68,7 +67,6 @@
desc = "A heavy suit worn by the highest level of Asset Protection, don't mess with the person wearing this. Armoured and space ready."
suit_type = "heavy asset protection"
icon_state = "asset_protection_rig"
- armor = list(melee = 60, bullet = 50, laser = 50,energy = 40, bomb = 40, bio = 100, rad = 100)
initial_modules = list(
/obj/item/rig_module/ai_container,
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index fb6b0459a91..0bda9f9288a 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -5,7 +5,6 @@
icon_state = "ninja_rig"
suit_type = "light suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/stock_parts/cell)
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
emp_protection = 10
slowdown = 0
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm
index 58a66aaa4b1..a7512231641 100644
--- a/code/modules/clothing/spacesuits/rig/suits/merc.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm
@@ -5,7 +5,7 @@
desc = "A blood-red hardsuit featuring some fairly illegal technology."
icon_state = "merc_rig"
suit_type = "crimson hardsuit"
- armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index 4ddf6e419f3..a0e236daee7 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -15,7 +15,7 @@
suit_type = "augmented suit"
desc = "Prepare for paperwork."
icon_state = "internalaffairs_rig"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
slowdown = 0
offline_slowdown = 0
@@ -51,7 +51,7 @@
suit_type = "industrial hardsuit"
desc = "A heavy, powerful rig used by construction crews and mining corporations."
icon_state = "engineering_rig"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50)
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
slowdown = 3
offline_slowdown = 10
offline_vision_restriction = 2
@@ -80,7 +80,6 @@
suit_type = "EVA hardsuit"
desc = "A light rig for repairs and maintenance to the outside of habitats and vessels."
icon_state = "eva_rig"
- armor = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100)
slowdown = 0
offline_slowdown = 1
offline_vision_restriction = 1
@@ -108,7 +107,7 @@
suit_type = "advanced voidsuit"
desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish."
icon_state = "ce_rig"
- armor = list(melee = 40, bullet = 10, laser = 30,energy = 25, bomb = 40, bio = 100, rad = 100)
+ armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
slowdown = 0
offline_slowdown = 0
offline_vision_restriction = 0
@@ -150,7 +149,6 @@
suit_type = "hazmat hardsuit"
desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it."
icon_state = "science_rig"
- armor = list(melee = 45, bullet = 5, laser = 45, energy = 80, bomb = 60, bio = 100, rad = 100)
slowdown = 1
offline_vision_restriction = 1
@@ -179,7 +177,7 @@
suit_type = "rescue hardsuit"
desc = "A durable suit designed for medical rescue in high risk areas."
icon_state = "medical_rig"
- armor = list(melee = 30, bullet = 15, laser = 20, energy = 60, bomb = 30, bio = 100, rad = 100)
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
slowdown = 1
offline_vision_restriction = 1
@@ -204,7 +202,7 @@
suit_type = "hazard hardsuit"
desc = "A Security hardsuit designed for prolonged EVA in dangerous environments."
icon_state = "hazard_rig"
- armor = list(melee = 60, bullet = 40, laser = 30, energy = 15, bomb = 60, bio = 100, rad = 30)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index 4017cb3f1f8..4b8f32f5a74 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -5,7 +5,7 @@
icon_state = "syndicate"
item_state = "syndicate"
desc = "Has a tag: Totally not property of an enemy corporation, honest."
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/syndicate
name = "red space suit"
@@ -14,8 +14,7 @@
desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!"
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
//Green syndicate space suit
diff --git a/code/modules/clothing/spacesuits/void.dm b/code/modules/clothing/spacesuits/void.dm
index 91142123450..cce0f4c49b3 100644
--- a/code/modules/clothing/spacesuits/void.dm
+++ b/code/modules/clothing/spacesuits/void.dm
@@ -11,5 +11,4 @@
icon_state = "void"
item_state = "void"
desc = "A high tech, NASA Centcom branch designed, dark red Space suit. Used for AI satellite maintenance."
- slowdown = 1
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/multitool)
\ No newline at end of file
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 609e24ca6bf..b46b10a2e35 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -16,7 +16,7 @@
item_state = "armor"
blood_overlay_type = "armor"
flags = ONESIZEFITSALL
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/vest/jacket
name = "military jacket"
@@ -32,7 +32,6 @@
item_state = "bulletproof"
blood_overlay_type = "armor"
flags = ONESIZEFITSALL
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/vest/security
name = "security armor"
@@ -92,7 +91,7 @@
icon_state = "hos"
item_state = "hos"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -137,7 +136,7 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
- armor = list(melee = 50, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/riot
name = "Riot Suit"
@@ -147,8 +146,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- slowdown = 1
- armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
strip_delay = 80
put_on_delay = 60
@@ -158,7 +156,7 @@
desc = "A classic suit of plate armour, highly effective at stopping melee attacks."
icon_state = "knight_green"
item_state = "knight_green"
- armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ slowdown = 1
/obj/item/clothing/suit/armor/riot/knight/yellow
icon_state = "knight_yellow"
@@ -185,7 +183,7 @@
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
strip_delay = 70
put_on_delay = 50
@@ -195,7 +193,7 @@
icon_state = "armor_reflec"
item_state = "armor_reflec"
blood_overlay_type = "armor"
- armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0)
var/hit_reflect_chance = 40
/obj/item/clothing/suit/armor/laserproof/IsReflect(var/def_zone)
@@ -266,13 +264,14 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
/obj/item/clothing/suit/armor/heavy
name = "heavy armor"
desc = "A heavily armored suit that protects against moderate damage."
icon_state = "heavy"
item_state = "swat_suit"
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
flags = THICKMATERIAL
@@ -281,7 +280,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
/obj/item/clothing/suit/armor/tdome
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
flags = THICKMATERIAL
@@ -306,7 +305,7 @@
desc = "A set of armor worn by members of the Nanotrasen Emergency Response Team."
icon_state = "ertarmor_cmd"
item_state = "armor"
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 20, bio = 0, rad = 0)
//Commander
/obj/item/clothing/suit/armor/vest/ert/command
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 3879cc5692c..be070b7ffb3 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -5,7 +5,7 @@
desc = "A hood that protects the head and face from biological comtaminants."
permeability_coefficient = 0.01
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
/obj/item/clothing/suit/bio_suit
@@ -18,9 +18,9 @@
permeability_coefficient = 0.01
flags = ONESIZEFITSALL | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- slowdown = 1.0
+ slowdown = 1
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
strip_delay = 70
put_on_delay = 70
@@ -43,9 +43,11 @@
//Security biosuit, grey with red stripe across the chest
/obj/item/clothing/head/bio_hood/security
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 20)
icon_state = "bio_security"
/obj/item/clothing/suit/bio_suit/security
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 20)
icon_state = "bio_security"
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index f9ce0cd4593..8b17e7d93d1 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -133,7 +133,7 @@
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
- armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags = ONESIZEFITSALL
@@ -143,20 +143,20 @@
)
//Forensics
-/obj/item/clothing/suit/storage/forensics
+/obj/item/clothing/suit/storage/det_suit/forensics
name = "jacket"
desc = "A forensics technician jacket."
item_state = "det_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
- allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
- armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS
-/obj/item/clothing/suit/storage/forensics/red
+/obj/item/clothing/suit/storage/det_suit/forensics/red
name = "red jacket"
desc = "A red forensics technician jacket."
icon_state = "forensics_red"
-/obj/item/clothing/suit/storage/forensics/blue
+/obj/item/clothing/suit/storage/det_suit/forensics/blue
name = "blue jacket"
desc = "A blue forensics technician jacket."
icon_state = "forensics_blue"
@@ -170,7 +170,7 @@
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
- armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags = ONESIZEFITSALL
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 7985eb06b57..43fe9fb6516 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -449,7 +449,7 @@
flags = ONESIZEFITSALL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
/obj/item/clothing/head/mercy_hood
@@ -459,7 +459,7 @@
item_state = "mercy_hood"
permeability_coefficient = 0.01
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
/obj/item/clothing/suit/jacket
@@ -488,7 +488,7 @@
strip_delay = 60
put_on_delay = 40
flags = ONESIZEFITSALL
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
//End of inheritance from Security armour.
/obj/item/clothing/suit/jacket/leather
@@ -517,7 +517,7 @@
icon_state = "owl_wings"
item_state = "owl_wings"
body_parts_covered = ARMS
- armor = list(melee = 5, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite)
action_button_name = "Toggle Owl Wings"
flags = NODROP
@@ -564,7 +564,7 @@
permeability_coefficient = 0.01
flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
- armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100)
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 030d8f3773c..1ddca764fd2 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -19,7 +19,7 @@
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher)
- slowdown = 1.0
+ slowdown = 1
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
@@ -57,7 +57,7 @@
desc = "Use in case of bomb."
icon_state = "bombsuit"
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20, energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -77,7 +77,7 @@
flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 2
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20, energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT|HIDETAIL
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
@@ -104,7 +104,7 @@
icon_state = "rad"
desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation"
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100)
strip_delay = 60
put_on_delay = 60
@@ -120,7 +120,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 1.5
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100)
flags_inv = HIDEJUMPSUIT|HIDETAIL
strip_delay = 60
put_on_delay = 60
\ No newline at end of file
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index a2496168b5f..cf74d17de05 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -7,6 +7,7 @@
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
New()
..()
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 78d9428d4b2..0be5fe8eef5 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -24,6 +24,13 @@
item_color = "qm"
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/cargo/skirt
+ name = "quartermaster's jumpskirt"
+ desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
+ icon_state = "qmf"
+ item_color = "qmf"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags = null
/obj/item/clothing/under/rank/cargotech
name = "cargo technician's jumpsuit"
@@ -33,6 +40,12 @@
item_color = "cargo"
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/cargotech/skirt
+ name = "cargo technician's jumpskirt"
+ desc = "Skirrrrrts! They're comfy and easy to wear!"
+ icon_state = "cargof"
+ item_color = "cargof"
+ flags = null
/obj/item/clothing/under/rank/chaplain
desc = "It's a black jumpsuit, often worn by religious folk."
@@ -104,7 +117,7 @@
name = "janitor's jumpsuit"
icon_state = "janitor"
item_color = "janitor"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 4b91e82b2fc..15c314affa1 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -5,9 +5,17 @@
icon_state = "chiefengineer"
item_state = "g_suit"
item_color = "chief"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/chief_engineer/skirt
+ desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
+ name = "chief engineer's jumpskirt"
+ icon_state = "chieff"
+ item_color = "chieff"
+ flags = null
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
name = "atmospheric technician's jumpsuit"
@@ -16,15 +24,32 @@
item_color = "atmos"
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/atmospheric_technician/skirt
+ desc = "It's a jumpskirt worn by atmospheric technicians."
+ name = "atmospheric technician's jumpskirt"
+ icon_state = "atmosf"
+ item_color = "atmosf"
+ flags = null
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
name = "engineer's jumpsuit"
icon_state = "engine"
item_state = "engi_suit"
item_color = "engine"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
flags = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/engineer/skirt
+ desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
+ name = "engineer's jumpskirt"
+ icon_state = "enginef"
+ item_color = "enginef"
+ flags = null
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
name = "roboticist's jumpsuit"
@@ -33,6 +58,13 @@
item_color = "robotics"
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/roboticist/skirt
+ desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
+ name = "roboticist's jumpskirt"
+ icon_state = "roboticsf"
+ item_color = "roboticsf"
+ flags = null
+
/obj/item/clothing/under/rank/mechanic
desc = "It's a pair of overalls worn by mechanics."
name = "mechanic's overalls"
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index b6f83e78beb..608d5de363e 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -7,7 +7,7 @@
icon_state = "director"
item_state = "g_suit"
item_color = "director"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/scientist
@@ -17,9 +17,16 @@
item_state = "w_suit"
item_color = "toxinswhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/scientist/skirt
+ name = "scientist's jumpskirt"
+ icon_state = "sciencewhitef"
+ item_color = "sciencewhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags = null
+
/obj/item/clothing/under/rank/chemist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
name = "chemist's jumpsuit"
@@ -27,9 +34,16 @@
item_state = "w_suit"
item_color = "chemistrywhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/chemist/skirt
+ name = "chemist's jumpskirt"
+ icon_state = "chemistrywhitef"
+ item_color = "chemistrywhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags = null
+
/*
* Medical
*/
@@ -40,9 +54,17 @@
item_state = "w_suit"
item_color = "cmo"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/chief_medical_officer/skirt
+ desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
+ name = "chief medical officer's jumpskirt"
+ icon_state = "cmof"
+ item_color = "cmof"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags = null
+
/obj/item/clothing/under/rank/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
name = "geneticist's jumpsuit"
@@ -50,9 +72,16 @@
item_state = "w_suit"
item_color = "geneticswhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/geneticist/skirt
+ name = "geneticist's jumpskirt"
+ icon_state = "geneticswhitef"
+ item_color = "geneticswhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags = null
+
/obj/item/clothing/under/rank/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
name = "virologist's jumpsuit"
@@ -60,9 +89,16 @@
item_state = "w_suit"
item_color = "virologywhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/virologist/skirt
+ name = "virologist's jumpskirt"
+ icon_state = "virologywhitef"
+ item_color = "virologywhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags = null
+
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
name = "nurse's suit"
@@ -70,7 +106,7 @@
item_state = "nursesuit"
item_color = "nursesuit"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/nurse
@@ -80,7 +116,7 @@
item_state = "nurse"
item_color = "nurse"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/orderly
@@ -90,7 +126,7 @@
item_state = "orderly"
item_color = "orderly"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical
@@ -100,9 +136,16 @@
item_state = "w_suit"
item_color = "medical"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/medical/skirt
+ name = "medical doctor's jumpskirt"
+ icon_state = "medicalf"
+ item_color = "medicalf"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags = null
+
/obj/item/clothing/under/rank/medical/blue
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
@@ -139,7 +182,7 @@
item_state = "paramedic"
item_color = "paramedic"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/psych
@@ -169,7 +212,7 @@
item_state = "w_suit"
item_color = "genetics_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/chemist_new
@@ -179,7 +222,7 @@
item_state = "w_suit"
item_color = "chemist_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/scientist_new
@@ -189,7 +232,7 @@
item_state = "w_suit"
item_color = "scientist_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/virologist_new
@@ -199,5 +242,5 @@
item_state = "w_suit"
item_color = "virologist_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index d40952e2030..e07419a3871 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -15,27 +15,43 @@
icon_state = "warden"
item_state = "r_suit"
item_color = "warden"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
strip_delay = 50
+/obj/item/clothing/under/rank/warden/skirt
+ desc = "Standard feminine fashion for a Warden. It is made of sturdier material than standard jumpskirts. It has the word \"Warden\" written on the shoulders."
+ name = "warden's jumpskirt"
+ icon_state = "wardenf"
+ item_state = "r_suit"
+ item_color = "wardenf"
+ flags = null
+
/obj/item/clothing/under/rank/security
name = "security officer's jumpsuit"
desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection."
icon_state = "security"
item_state = "r_suit"
item_color = "secred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
strip_delay = 50
+/obj/item/clothing/under/rank/security/skirt
+ name = "security officer's jumpskirt"
+ desc = "Standard feminine fashion for Security Officers. It's made of sturdier material than the standard jumpskirts."
+ icon_state = "secredf"
+ item_state = "r_suit"
+ item_color = "secredf"
+ flags = null
+
/obj/item/clothing/under/rank/dispatch
name = "dispatcher's uniform"
desc = "A dress shirt and khakis with a security patch sewn on."
icon_state = "dispatch"
item_state = "dispatch"
item_color = "dispatch"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/security2
@@ -44,7 +60,7 @@
icon_state = "redshirt2"
item_state = "r_suit"
item_color = "redshirt2"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
/obj/item/clothing/under/rank/security/corp
icon_state = "sec_corporate"
@@ -65,7 +81,7 @@
icon_state = "detective"
item_state = "det"
item_color = "detective"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
strip_delay = 50
species_fit = list("Vox")
@@ -82,10 +98,18 @@
icon_state = "hos"
item_state = "r_suit"
item_color = "hosred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags = ONESIZEFITSALL
strip_delay = 60
+/obj/item/clothing/under/rank/head_of_security/skirt
+ desc = "It's a fashionable jumpskirt worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer."
+ name = "head of security's jumpskirt"
+ icon_state = "hosredf"
+ item_state = "r_suit"
+ item_color = "hosredf"
+ flags = null
+
/obj/item/clothing/under/rank/head_of_security/corp
icon_state = "hos_corporate"
item_state = "hos_corporate"
@@ -154,5 +178,5 @@
item_state = "brig_phys"
item_color = "brig_phys"
permeability_coefficient = 0.50
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
flags = ONESIZEFITSALL
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 9533d7c4aae..54b6384fe31 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -130,7 +130,7 @@
icon_state = "ert_uniform"
item_state = "bl_suit"
item_color = "ert_uniform"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
@@ -156,7 +156,7 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
- armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100)
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
@@ -568,7 +568,7 @@
icon_state = "vengine"
item_state = "vengine"
item_color = "vengine"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
/obj/item/clothing/under/vox_sec
name = "Vox Security Jumpsuit"
@@ -576,7 +576,7 @@
icon_state = "vred"
item_state = "vred"
item_color = "vred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/vox_chem
name = "Vox Chemist Jumpsuit"
@@ -584,7 +584,7 @@
icon_state = "vchem"
item_state = "vchem"
item_color = "vchem"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
/obj/item/clothing/under/psyjump
name = "Psychic Amp Jumpsuit"
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index cfe317aaa3b..011f6784362 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -5,7 +5,7 @@
item_state = "bl_suit"
item_color = "syndicate"
has_sensor = 0
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/syndicate/combat
name = "combat turtleneck"
diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm
index 765792e5da1..7dccff585d8 100644
--- a/code/modules/holiday/christmas.dm
+++ b/code/modules/holiday/christmas.dm
@@ -61,5 +61,5 @@
icon_state = "xmashat"
desc = "A crappy paper hat that you are REQUIRED to wear."
flags_inv = 0
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 1dea731ff54..9cb59b4f296 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -314,6 +314,7 @@
w_class = 4
var/extend = 1
flags = NOSHIELD | CONDUCT
+ armour_penetration = 20
slot_flags = SLOT_BACK
origin_tech = "materials=2;combat=2"
attack_verb = list("chopped", "sliced", "cut", "reaped")
@@ -339,6 +340,7 @@
w_class = 2.0
extend = 0
flags = NOSHIELD
+ armour_penetration = 20
slot_flags = SLOT_BELT
origin_tech = "materials=3;combat=3"
attack_verb = list("chopped", "sliced", "cut", "reaped")
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index f37faf32750..fa2863e23b7 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -144,11 +144,12 @@
/obj/item/device/mmi/posibrain/examine(mob/user)
+ to_chat(user, "*---------*")
if(!..(user))
+ to_chat(user, "*---------*")
return
- var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n[desc]\n"
- msg += ""
+ var/msg = ""
if(src.brainmob && src.brainmob.key)
switch(src.brainmob.stat)
@@ -158,7 +159,7 @@
if(DEAD) msg += "It appears to be completely inactive.\n"
else
msg += "It appears to be completely inactive.\n"
- msg += "*---------*"
+ msg += "*---------*"
to_chat(user, msg)
/obj/item/device/mmi/posibrain/emp_act(severity)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 5ac5d796897..8bcccb69eb5 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -111,7 +111,7 @@
if(istype(I,/mob/living/simple_animal/borer))
B = I
if(B)
- if(!B.ckey && ckey && B.controlling)
+ if(B.controlling && B.host == src)
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 922810e758d..df608980e47 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -66,7 +66,7 @@
item_color = "golem"
has_sensor = 0
flags = ABSTRACT | NODROP
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/golem
name = "adamantine shell"
diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm
index 7d2e2d5e62c..7deaa397cc4 100644
--- a/code/modules/mob/living/carbon/slime/examine.dm
+++ b/code/modules/mob/living/carbon/slime/examine.dm
@@ -1,6 +1,7 @@
/mob/living/carbon/slime/examine(mob/user)
+ to_chat(user, "*---------*")
..(user)
- var/msg = ""
+ var/msg = ""
if (src.stat == DEAD)
msg += "It is limp and unresponsive.\n"
else
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index d65e6e0d7d8..09457786e0d 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -1,8 +1,10 @@
/mob/living/silicon/ai/examine(mob/user)
+ to_chat(user, "*---------*")
if(!..(user))
+ to_chat(user, "*---------*")
return
- var/msg = ""
+ var/msg = ""
if (src.stat == DEAD)
msg += "It appears to be powered-down.\n"
else
diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm
deleted file mode 100644
index 814efb1899b..00000000000
--- a/code/modules/mob/living/silicon/pai/examine.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/mob/living/silicon/pai/examine(mob/user) //removed as it was pointless...moved to the pai-card instead.
- /*..(user) //This is totally pointless because this mob is contained inside a card!
-
- var/msg = ""
- if (src.stat == DEAD)
- msg += "It appears to be offline.\n"
- else
- msg += ""
- if (src.getBruteLoss())
- if (src.getBruteLoss() < 30)
- msg += "It looks slightly dented.\n"
- else
- msg += "Its casing appears cracked and broken!\n"
- if (src.getFireLoss())
- if (src.getFireLoss() < 30)
- msg += "It looks slightly charred!\n"
- else
- msg += "Its casing is melted and heat-warped!\n"
- if (src.stat == UNCONSCIOUS)
- msg += "It doesn't seem to be responding and its text-output is lagging.\n"
- msg += ""
- msg += "*---------*"
-
- to_chat(user, msg)
- */
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 635efadcaba..23fb68e3854 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -521,23 +521,24 @@
density = 0 //this is reset every canmove update otherwise
/mob/living/silicon/pai/examine(mob/user)
+ to_chat(user, "*---------*")
..(user)
- var/msg = ""
+ var/msg = ""
switch(src.stat)
if(CONSCIOUS)
if(!src.client) msg += "\nIt appears to be in stand-by mode." //afk
if(UNCONSCIOUS) msg += "\nIt doesn't seem to be responding."
if(DEAD) msg += "\nIt looks completely unsalvageable."
- msg += "\n*---------*"
- if(print_flavor_text()) msg += "\n[print_flavor_text()]\n"
+ if(print_flavor_text()) msg += "\n[print_flavor_text()]"
if (pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\nIt is [pose]"
+ msg += "\n*---------*"
to_chat(user, msg)
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index 546bdd2eb6c..47eabe40ffb 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -1,7 +1,8 @@
/mob/living/silicon/robot/examine(mob/user)
+ to_chat(user, "*---------*")
..(user)
- var/msg = ""
+ var/msg = ""
var/obj/act_module = get_active_hand()
if(act_module)
msg += "It is holding [bicon(act_module)] \a [act_module].\n"
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index c894b014a87..2a82a6728b0 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -40,9 +40,10 @@
return
/mob/living/simple_animal/construct/examine(mob/user)
+ to_chat(user, "*---------*")
..(user)
- var/msg = ""
+ var/msg = ""
if (src.health < src.maxHealth)
msg += ""
if (src.health >= src.maxHealth/2)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 35d0050b612..83e8b78164f 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -457,8 +457,8 @@
if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
var/obj/item/clothing/C = target
var/current_armor = C.armor
- if(current_armor.["melee"] < 80)
- current_armor.["melee"] = min(current_armor.["melee"] + 10, 80)
+ if(current_armor.["melee"] < 60)
+ current_armor.["melee"] = min(current_armor.["melee"] + 10, 60)
to_chat(user, "You strengthen [target], improving its resistance against melee attacks.")
qdel(src)
else
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f7bbd2558a1..2f85c4d02bd 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -247,6 +247,7 @@
return // Bag could not be placed in players hands. I don't know what to do here...
//Now, B represents a container we can insert W into.
B.handle_item_insertion(W,1)
+ return B
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index c92d11925cd..528527c15ba 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -472,6 +472,7 @@
// Added the new browser window method
var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 900, 600)
popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css')
+ popup.add_script("delay_interactivity", 'html/browser/delay_interactivity.js')
popup.set_content(dat)
popup.open(0) // 0 is passed to open so that it doesn't use the onclose() proc
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 5e6a1cbcb32..701c4e7080b 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -5,7 +5,7 @@
item_state = "energy_katana"
force = 40
throwforce = 20
- armour_penetration = 15
+ armour_penetration = 50
var/cooldown = 0 // Because spam aint cool, yo.
var/datum/effect/system/spark_spread/spark_system
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index c2fb287b9a8..5cb67e73db6 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -5,7 +5,7 @@
icon_state = "s-ninja"
permeability_coefficient = 0.01
flags = NOSLIP
- armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 30)
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 936f947758d..73ac456ebf9 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -15,7 +15,7 @@ Contents:
allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/weapon/melee/baton, /obj/item/weapon/tank, /obj/item/weapon/stock_parts/cell)
slowdown = 0
unacidable = 1
- armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 30)
var/suitActive = 0
var/suitBusy = 0
diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
index 0d4e64d67ee..9658f2b9326 100644
--- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
+++ b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
@@ -5,21 +5,21 @@
desc = "A sealed bio suit capable of insulating against exotic alien energies"
icon_state = "engspace_suit"
item_state = "engspace_suit"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
/obj/item/clothing/head/bio_hood/anomaly
name = "Anomaly hood"
desc = "A sealed bio hood capable of insulating against exotic alien energies."
icon_state = "engspace_helmet"
item_state = "engspace_helmet"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
/obj/item/clothing/suit/space/eva/anomaly
name = "Excavation suit"
desc = "A pressure resistant excavation suit partially capable of insulating against exotic alien energies."
icon_state = "cespace_suit"
item_state = "cespace_suit"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
/obj/item/clothing/head/helmet/space/eva/anomaly
@@ -27,4 +27,4 @@
desc = "A pressure resistant excavation hood partially capable of insulating against exotic alien energies."
icon_state = "cespace_helmet"
item_state = "cespace_helmet"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
diff --git a/config/example/config.txt b/config/example/config.txt
index ea1540ec8bc..2f723c704f4 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -321,3 +321,6 @@ DISABLE_SPACE_RUINS
## Uncomment this if you want to disable the popup alert for people on the same CID
#DISABLE_CID_WARN_POPUP
+
+## How many loadout points players may spend in character setup
+#MAX_LOADOUT_POINTS 5
diff --git a/html/browser/delay_interactivity.js b/html/browser/delay_interactivity.js
new file mode 100644
index 00000000000..f621906337b
--- /dev/null
+++ b/html/browser/delay_interactivity.js
@@ -0,0 +1,26 @@
+// Disables all links for one second after the browser window opens.
+
+(function(){
+ // If there's already an onload, let's not clobber it
+ var oldonload = window.onload;
+ window.onload = function(){
+ if(typeof oldonload == 'function'){
+ oldonload();
+ }
+ var onclicks = Array();
+ var links = document.getElementsByTagName("a");
+ var returnfalse = function(){return false;};
+ for(var i = 0; i < links.length; i++){
+ onclicks.push(links[i].onclick);
+ links[i].onclick = returnfalse;
+ }
+ setTimeout(function(){
+ for(var i = 0; i < links.length; i++){
+ // Reset onclick, but only if something else hasn't already changed it
+ if(links[i].onclick == returnfalse){
+ links[i].onclick = onclicks[i];
+ }
+ }
+ }, 1000);
+ };
+})();
diff --git a/html/changelog.html b/html/changelog.html
index 78b8faec193..d7c76ff989f 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,72 @@
-->
+
02 July 2016
+
Fethas updated:
+
+ - adds comfirmation dialogs to transforms from player panel
+
+
Fox McCloud updated:
+
+ - Adds in laughter demons
+ - Can summon laughter demons as a wizard
+ - Chem master can produce instantaneous medical patches if all chems are safe
+ - Can now purchase sniper rifle and associated ammo on uplink during nuke ops
+ - Most melee and laser armor values halved or reduced; some bullet armor reduced slightly
+ - Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still slow though)
+ - Mining armor caps out at 60 melee resist as opposed to 80
+ - Ling melee armor reduced; bullet and laser values buffed a bit and slowdown removed
+ - Chameleon jumpsuit has a little bit of armor
+ - Detective's forensic jacket now has identical armor to the native detective jacket
+ - Armor penetration added to energy swords, chainsaws, scythes, and spears
+ - Fixes stun batons, telebatons, and abductor batons piercing/bypassing shields
+
+
FreeStylaLT updated:
+
+ - Adds appropriate battle yells to sleeping carp
+
+
KasparoVy updated:
+
+ - Engineer boots that've had their toes cut open now have a sprite.
+ - Vox now have engineer workboot sprites.
+ - Removes unused SWAT boot sprites that were really just copypasted jackboot sprites.
+
+
Krausus updated:
+
+ - The late-join job listing is now big enough to show all the jobs at once, and organizes them into labeled categories.
+ - Fixed Hotkey Help and hotkey mode toggle messages not appearing.
+ - The late-join job listing will now ignore (mis)clicks for the first second after popping up.
+
+
Kyep updated:
+
+ - "Loyalty" implants are now known as "Mindshield" implants
+ - Admins playing CC jobs can no longer get antag status from autotraitor.
+
+
Tastyfish updated:
+
+ - There's essentially a completely new space hotel map! Explorers rejoice!
+
+
TheDZD updated:
+
+ - Chance for vampires to burn in the chapel has been greatly reduced (from a 35% chance down to 8% per tick).
+ - Vampires do not scream from chapel/space burning until they actually start catching fire.
+ - Threshold for vampires to catch fire from space/chapel burning changed from 60 health to 50 health.
+ - Fire stacks from vampire burning no longer apply twice 35% of the time while below the health threshold.
+
+
VampyrBytes updated:
+
+ - No more *me emoting from your corpse!
+
+
monster860 updated:
+
+ - Fixes ghosts having a generic icon when darkness is toggled off
+
+
tigercat2000 updated:
+
+ - There's a new tab in the character setup screen, "loadouts". This allows you to spawn with a limited number of preset items.
+ - Character setup now uses #defines for the different tabs.
+
+
28 June 2016
CrAzYPiLoT updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 29c68feb153..cecfb4eff2a 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1941,3 +1941,61 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- tweak: All uses of \icon have been replaced with bicon()
tkdrg:
- rscadd: Admins now have a verb to wipe all scripts from telecomms.
+2016-07-02:
+ Fethas:
+ - bugfix: adds comfirmation dialogs to transforms from player panel
+ Fox McCloud:
+ - rscadd: Adds in laughter demons
+ - rscadd: Can summon laughter demons as a wizard
+ - rscadd: Chem master can produce instantaneous medical patches if all chems are
+ safe
+ - rscadd: Can now purchase sniper rifle and associated ammo on uplink during nuke
+ ops
+ - tweak: Most melee and laser armor values halved or reduced; some bullet armor
+ reduced slightly
+ - tweak: Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still
+ slow though)
+ - tweak: Mining armor caps out at 60 melee resist as opposed to 80
+ - tweak: Ling melee armor reduced; bullet and laser values buffed a bit and slowdown
+ removed
+ - tweak: Chameleon jumpsuit has a little bit of armor
+ - tweak: Detective's forensic jacket now has identical armor to the native detective
+ jacket
+ - tweak: Armor penetration added to energy swords, chainsaws, scythes, and spears
+ - bugfix: Fixes stun batons, telebatons, and abductor batons piercing/bypassing
+ shields
+ FreeStylaLT:
+ - rscadd: Adds appropriate battle yells to sleeping carp
+ KasparoVy:
+ - imageadd: Engineer boots that've had their toes cut open now have a sprite.
+ - imageadd: Vox now have engineer workboot sprites.
+ - imagedel: Removes unused SWAT boot sprites that were really just copypasted jackboot
+ sprites.
+ Krausus:
+ - tweak: The late-join job listing is now big enough to show all the jobs at once,
+ and organizes them into labeled categories.
+ - bugfix: Fixed Hotkey Help and hotkey mode toggle messages not appearing.
+ - tweak: The late-join job listing will now ignore (mis)clicks for the first second
+ after popping up.
+ Kyep:
+ - tweak: '"Loyalty" implants are now known as "Mindshield" implants'
+ - tweak: Admins playing CC jobs can no longer get antag status from autotraitor.
+ Tastyfish:
+ - rscadd: There's essentially a completely new space hotel map! Explorers rejoice!
+ TheDZD:
+ - tweak: Chance for vampires to burn in the chapel has been greatly reduced (from
+ a 35% chance down to 8% per tick).
+ - tweak: Vampires do not scream from chapel/space burning until they actually start
+ catching fire.
+ - tweak: Threshold for vampires to catch fire from space/chapel burning changed
+ from 60 health to 50 health.
+ - tweak: Fire stacks from vampire burning no longer apply twice 35% of the time
+ while below the health threshold.
+ VampyrBytes:
+ - bugfix: No more *me emoting from your corpse!
+ monster860:
+ - bugfix: Fixes ghosts having a generic icon when darkness is toggled off
+ tigercat2000:
+ - rscadd: There's a new tab in the character setup screen, "loadouts". This allows
+ you to spawn with a limited number of preset items.
+ - tweak: 'Character setup now uses #defines for the different tabs.'
diff --git a/html/changelogs/AutoChangeLog-pr-4700.yml b/html/changelogs/AutoChangeLog-pr-4700.yml
deleted file mode 100644
index 4b9428a7ba4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4700.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Tastyfish
-delete-after: True
-changes:
- - rscadd: "There's essentially a completely new space hotel map! Explorers rejoice!"
diff --git a/html/changelogs/AutoChangeLog-pr-4777.yml b/html/changelogs/AutoChangeLog-pr-4777.yml
deleted file mode 100644
index a139206bd29..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4777.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Kyep
-delete-after: True
-changes:
- - tweak: "\"Loyalty\" implants are now known as \"Mindshield\" implants"
diff --git a/html/changelogs/AutoChangeLog-pr-4794.yml b/html/changelogs/AutoChangeLog-pr-4794.yml
deleted file mode 100644
index a3f98159cde..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4794.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: monster860
-delete-after: True
-changes:
- - bugfix: "Fixes ghosts having a generic icon when darkness is toggled off"
diff --git a/html/changelogs/AutoChangeLog-pr-4798.yml b/html/changelogs/AutoChangeLog-pr-4798.yml
deleted file mode 100644
index 1205c1a2848..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4798.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FreeStylaLT
-delete-after: True
-changes:
- - rscadd: "Adds appropriate battle yells to sleeping carp"
diff --git a/html/changelogs/AutoChangeLog-pr-4799.yml b/html/changelogs/AutoChangeLog-pr-4799.yml
deleted file mode 100644
index 2cb3b97b96c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4799.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fethas
-delete-after: True
-changes:
- - bugfix: "adds comfirmation dialogs to transforms from player panel"
diff --git a/html/changelogs/AutoChangeLog-pr-4812.yml b/html/changelogs/AutoChangeLog-pr-4812.yml
deleted file mode 100644
index 2277d38eb9f..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4812.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: KasparoVy
-delete-after: True
-changes:
- - imageadd: "Engineer boots that've had their toes cut open now have a sprite."
- - imageadd: "Vox now have engineer workboot sprites."
- - imagedel: "Removes unused SWAT boot sprites that were really just copypasted jackboot sprites."
diff --git a/html/changelogs/AutoChangeLog-pr-4815.yml b/html/changelogs/AutoChangeLog-pr-4815.yml
deleted file mode 100644
index 462b92c49ed..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4815.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Kyep
-delete-after: True
-changes:
- - tweak: "Admins playing CC jobs can no longer get antag status from autotraitor."
diff --git a/html/changelogs/AutoChangeLog-pr-4822.yml b/html/changelogs/AutoChangeLog-pr-4822.yml
deleted file mode 100644
index c4ff22970af..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4822.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Adds in laughter demons"
- - rscadd: "Can summon laughter demons as a wizard"
diff --git a/html/changelogs/AutoChangeLog-pr-4823.yml b/html/changelogs/AutoChangeLog-pr-4823.yml
deleted file mode 100644
index 16bbcd105af..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4823.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: VampyrBytes
-delete-after: True
-changes:
- - bugfix: "No more *me emoting from your corpse!"
diff --git a/html/changelogs/AutoChangeLog-pr-4826.yml b/html/changelogs/AutoChangeLog-pr-4826.yml
deleted file mode 100644
index 3998629cb9d..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4826.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - tweak: "The late-join job listing is now big enough to show all the jobs at once, and organizes them into labeled categories."
diff --git a/html/changelogs/AutoChangeLog-pr-4829.yml b/html/changelogs/AutoChangeLog-pr-4829.yml
deleted file mode 100644
index aacb7b55bd6..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4829.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Chem master can produce instantaneous medical patches if all chems are safe"
diff --git a/html/changelogs/AutoChangeLog-pr-4832.yml b/html/changelogs/AutoChangeLog-pr-4832.yml
deleted file mode 100644
index 66243f0b8e9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4832.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - tweak: "Chance for vampires to burn in the chapel has been greatly reduced (from a 35% chance down to 8% per tick)."
- - tweak: "Vampires do not scream from chapel/space burning until they actually start catching fire."
- - tweak: "Threshold for vampires to catch fire from space/chapel burning changed from 60 health to 50 health."
- - tweak: "Fire stacks from vampire burning no longer apply twice 35% of the time while below the health threshold."
diff --git a/html/changelogs/AutoChangeLog-pr-4835.yml b/html/changelogs/AutoChangeLog-pr-4835.yml
deleted file mode 100644
index d31715156ac..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4835.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Can now purchase sniper rifle and associated ammo on uplink during nuke ops"
diff --git a/html/changelogs/AutoChangeLog-pr-4837.yml b/html/changelogs/AutoChangeLog-pr-4837.yml
deleted file mode 100644
index e9a6bb62c25..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4837.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - bugfix: "Fixed Hotkey Help and hotkey mode toggle messages not appearing."
diff --git a/html/changelogs/AutoChangeLog-pr-4846.yml b/html/changelogs/AutoChangeLog-pr-4846.yml
deleted file mode 100644
index 6b11a55b871..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4846.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Fixes stun batons, telebatons, and abductor batons piercing/bypassing shields"
diff --git a/html/changelogs/AutoChangeLog-pr-4869.yml b/html/changelogs/AutoChangeLog-pr-4869.yml
new file mode 100644
index 00000000000..9ba17868790
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4869.yml
@@ -0,0 +1,7 @@
+author: Krausus
+delete-after: True
+changes:
+ - bugfix: "Fixed borers dying in hosts who happened to be somewhere cold, such as space. Even if their host was in a space suit."
+ - bugfix: "Fixed borers forgetting to detach from a host when it died."
+ - bugfix: "Fixed borers being able to assume control of a dead host."
+ - bugfix: "Fixed dead borers in a host being able to speak with the host and ghosts."
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 6fed8c42c66..28096d4e1a4 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 05ccd754f9d..8aacc4a4178 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/paradise.dme b/paradise.dme
index beeb2bb3f0f..a38cde2e160 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1119,10 +1119,15 @@
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\message.dm"
-#include "code\modules\client\preferences.dm"
-#include "code\modules\client\preferences_mysql.dm"
-#include "code\modules\client\preferences_spawnpoints.dm"
-#include "code\modules\client\preferences_toggles.dm"
+#include "code\modules\client\preference\preferences.dm"
+#include "code\modules\client\preference\preferences_mysql.dm"
+#include "code\modules\client\preference\preferences_spawnpoints.dm"
+#include "code\modules\client\preference\preferences_toggles.dm"
+#include "code\modules\client\preference\loadout\gear_tweaks.dm"
+#include "code\modules\client\preference\loadout\loadout.dm"
+#include "code\modules\client\preference\loadout\loadout_accessories.dm"
+#include "code\modules\client\preference\loadout\loadout_general.dm"
+#include "code\modules\client\preference\loadout\loadout_uniform.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\glasses\glasses.dm"
#include "code\modules\clothing\glasses\hud.dm"
@@ -1551,7 +1556,6 @@
#include "code\modules\mob\living\silicon\decoy\life.dm"
#include "code\modules\mob\living\silicon\pai\death.dm"
#include "code\modules\mob\living\silicon\pai\emote.dm"
-#include "code\modules\mob\living\silicon\pai\examine.dm"
#include "code\modules\mob\living\silicon\pai\life.dm"
#include "code\modules\mob\living\silicon\pai\pai.dm"
#include "code\modules\mob\living\silicon\pai\personality.dm"