Merge branch 'master' of https://github.com/tgstation/-tg-station into mineral_economy

This commit is contained in:
Ergovisavi
2014-04-16 16:58:28 -07:00
285 changed files with 17880 additions and 5644 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
/tg/station 13 v1.0 - 6 October 2010 [![Build Status](https://travis-ci.org/tgstation/-tg-station.png)](https://travis-ci.org/tgstation/-tg-station)
Website: http://ss13.eu
Website: http://coderbus.com
Code: https://github.com/tgstation/-tg-station
+24
View File
@@ -47,6 +47,30 @@ CREATE TABLE `erro_admin_log` (
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Table structure for table `erro_admin_ranks`
--
DROP TABLE IF EXISTS `erro_admin_ranks`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `erro_admin_ranks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`rank` varchar(40) NOT NULL,
`flags` int(16) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
insert into erro_admin_ranks (rank, flags) values ('Moderator',2);
insert into erro_admin_ranks (rank, flags) values ('Admin Candidate',2);
insert into erro_admin_ranks (rank, flags) values ('Trial Admin',5638);
insert into erro_admin_ranks (rank, flags) values ('Badmin',5727);
insert into erro_admin_ranks (rank, flags) values ('Game Admin',8063);
insert into erro_admin_ranks (rank, flags) values ('Game Master',65535);
insert into erro_admin_ranks (rank, flags) values ('Host',65535);
insert into erro_admin_ranks (rank, flags) values ('Coder',5168);
--
-- Table structure for table `erro_ban`
--
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+24 -23
View File
@@ -6455,7 +6455,7 @@
"cug" = (/obj/structure/sign/map/right{pixel_y = -32},/obj/structure/rack{icon = 'icons/obj/stationobjs.dmi'; icon_state = "minibar_right"; name = "skeletal minibar"},/obj/item/weapon/reagent_containers/food/drinks/bottle/gin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership)
"cuh" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Equipment Room"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cui" = (/obj/machinery/atmospherics/pipe/simple{dir = 10},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_station/start)
"cuj" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cuj" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start)
"cuk" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 10},/area/syndicate_mothership)
"cul" = (/turf/unsimulated/wall,/area/wizard_station)
"cum" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/tdome/tdomeobserve)
@@ -6693,7 +6693,7 @@
"cyK" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyL" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyM" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyN" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyN" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/machinery/light,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyO" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyP" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyQ" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/derelict/ship)
@@ -6705,7 +6705,7 @@
"cyW" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyX" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/derelict/ship)
"cyY" = (/obj/machinery/computer/pod{id = "oldship_gun"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyZ" = (/obj/structure/table,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cyZ" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"cza" = (/obj/structure/table,/obj/item/device/radio/off,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"czb" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space)
"czc" = (/turf/simulated/wall/r_wall,/area/space)
@@ -6897,7 +6897,7 @@
"cCG" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/plating,/area/djstation)
"cCH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/djstation)
"cCI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/djstation)
"cCJ" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/djstation)
"cCJ" = (/obj/structure/rack,/obj/item/clothing/head/helmet/swat,/turf/simulated/floor,/area/derelict/bridge/access)
"cCK" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"},/turf/simulated/floor/plating,/area/djstation)
"cCL" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "cafeteria"},/area/djstation)
"cCM" = (/obj/machinery/vending/snack,/obj/machinery/light/small{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"},/area/djstation)
@@ -7088,7 +7088,7 @@
"cGp" = (/obj/item/stack/rods,/turf/space,/area/space)
"cGq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cGr" = (/obj/item/weapon/shard,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"cGs" = (/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cGs" = (/obj/item/clothing/head/helmet/space/syndicate/black/engie,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)
"cGt" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cGu" = (/obj/item/weapon/shard,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)
"cGv" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
@@ -7100,7 +7100,7 @@
"cGB" = (/obj/structure/table,/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor,/area/derelict/bridge)
"cGC" = (/obj/structure/table,/obj/machinery/light/small,/turf/simulated/floor,/area/derelict/bridge)
"cGD" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/derelict/singularity_engine)
"cGE" = (/obj/item/clothing/head/helmet/swat,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cGE" = (/obj/item/clothing/suit/space/syndicate/black/engie,/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cGF" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cGG" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"cGH" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
@@ -7457,12 +7457,12 @@
"cNu" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/obj/machinery/power/solar_control{id = "derelictsolar"; name = "Primary Solar Control"; track = 0},/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cNv" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/derelict/bridge/ai_upload)
"cNw" = (/obj/item/weapon/paper{desc = ""; info = "The Syndicate have cunningly disguised a Syndicate Uplink as your PDA. Simply enter the code \"678 Bravo\" into the ringtone select to unlock its hidden features. <br><br><b>Objective #1</b>. Kill the God damn AI in a fire blast that it rocks the station. <b>Success!</b> <br><b>Objective #2</b>. Escape alive. <b>Failed.</b>"; name = "Mission Objectives"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/derelict/bridge/ai_upload)
"cNx" = (/obj/machinery/light/small{dir = 4},/obj/item/clothing/head/helmet/space/syndicate,/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cNx" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/orange,/obj/item/clothing/head/helmet/space/syndicate/orange,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/djstation)
"cNy" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/derelict/hallway/secondary)
"cNz" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/floor/airless,/area/space)
"cNA" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small,/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cNB" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"},/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cNC" = (/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cNC" = (/obj/item/clothing/suit/space/syndicate/black/red,/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cND" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cNE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/derelict/bridge/ai_upload)
"cNF" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/derelict_aft)
@@ -7709,15 +7709,15 @@
"cSm" = (/obj/machinery/atmospherics/pipe/simple{dir = 4},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/mine/laborcamp/security)
"cSn" = (/turf/simulated/mineral/random/labormineral,/area/mine/explored)
"cSo" = (/turf/space,/area/mine/unexplored)
"cSp" = (/obj/structure/alien/resin,/turf/simulated/floor/airless,/area/mine/abandoned)
"cSp" = (/obj/machinery/light/small{dir = 4},/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/floor/airless,/area/derelict/bridge/ai_upload)
"cSq" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/north_outpost)
"cSr" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/mine/explored)
"cSs" = (/obj/machinery/door/airlock/external{name = "Mining North Outpost Airlock"; req_access_txt = "54"},/turf/simulated/floor/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost)
"cSt" = (/obj/structure/disposalpipe/segment,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/mine/explored)
"cSu" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/suit/xenos,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cSu" = (/obj/item/clothing/suit/space/syndicate/black/red,/obj/item/clothing/head/helmet/space/syndicate/black/red,/turf/simulated/floor/airless{icon_state = "damaged4"},/area/mine/abandoned)
"cSv" = (/turf/simulated/floor{icon_state = "white"; temperature = 273.15},/area/mine/laborcamp)
"cSw" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "54"},/turf/simulated/floor/airless{icon_state = "asteroidfloor"},/area/mine/north_outpost)
"cSx" = (/obj/item/clothing/head/xenos,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"cSx" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/airless{icon_state = "floorgrime"},/area/mine/abandoned)
"cSy" = (/turf/simulated/wall,/area/mine/laborcamp)
"cSz" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"cSA" = (/turf/simulated/floor{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
@@ -8334,6 +8334,7 @@
"den" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Foyer"; req_access_txt = "19;23"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"deo" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/gravity_generator)
"dep" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering)
"deq" = (/obj/item/clothing/suit/xenos,/obj/item/clothing/head/xenos,/turf/simulated/floor{icon_state = "dark"},/area/mine/abandoned)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8891,11 +8892,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxVcxmcxmcxmcxmcxmcxJcxmcxmcxpcxicxicxScxlcxmcxmcxJcxmcxmcxmcxRcxvcywaaacyxcxqcxicxicxicxicxicxicxicxqcywaaaaaaaafcyncyycypcypcypcypcyzcypcypcyAcyraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyBcxmcxmcxmcxmcyCcxBcxzcxmcxmcxmcxmcxmcxmcxmcxmcxJcxmcxRcxjcxqcywaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacyDcyEcyhcyhcyhcyhcyhcyhcyhcyEcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxJcyGcyHcyIcxmcxRcxvcxqcxicxicxjcxzcxmcxmcxmcxmcxBcxicxvcywaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxBcxzcyJcyKcxRcxvcxlcyLcyMcyNcxpcxscyOcxmcxLcyPcxMcxCcyQcxicxraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxBcxzcyJcyKcxRcxvcxlcyLcyMcyZcxpcxscyOcxmcxLcyPcxMcxCcyQcxicxraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyxcxqcxjcxicxvcxlcxmcxmcxmcxmcxmcxJcxmcxmcxRcxjcxscxCcxCcxxcxyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyScyTcyUcxmcxmcxmcxmcxmcxmcyVcyWcxRcxvcywcyxcyXcxCcxxcxyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyxcxicxscyYcxmcxmcxmcxmcxmcxBcxjcxvcywaaaaaacyxcyXcxxcxyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyxcxjcxzcxmcyZczacxRcxvcxqcywaaaaaaaaaaaacyxcxjcxOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyxcxjcxzcxmcyNczacxRcxvcxqcywaaaaaaaaaaaacyxcxjcxOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyxcxqcxicxicxicxqcywaaaaaaaaaaaaaaaaaaaaacyxcywaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9141,7 +9142,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczbcCscC
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczbcCrcCrcCrcCrcCtcCxcCxcCAcCBcCCcCtcCrcCrcCrcCrczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczbcCscCscCscCscCwcCDcCxcCEcCxcCxcCwcCscCscCscCsczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczbcCrcCrcCrcCrcCzcCxcCxcCFcCxcCxcCzcCrcCrcCrcCrczbaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczbczbczbczbczbcCtcCGcCHcCIcCxcCJcCtczbczbczbczbczbaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczbczbczbczbczbcCtcCGcCHcCIcCxcNxcCtczbczbczbczbczbaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCtcCtcCtcCKcCtcCtcCtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCtcCtcCtcCtcCtcCtcCLcCMcCNcCOcCPcCtcCtcCtcCtcCtcCtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacCQcCRcCScCScCScCTcCNcCNcCNcCNcCNcCTcCUcCVcCWcCXcCYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9178,7 +9179,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDIcEkcElcElcEmcDJcEncEocEpcEqcErcEscEpcEpcEpcEtcEucEuczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDIcDZcDJcDJcDJcDJcDJcEvaaaaaaaaacEjaaaaaaaaacEjaaaaaaczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcEwcEwcEwcEwcEwcEwcEwcExcEwcEwcEwcEwcEycEwaaaaaacDQcDYcDSaaacDQcDYcDSaaaczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcEzcEzcEAcEBcECcECcEwcEDcEzcEzcEwcEzcEzcEwaaaaaacDQcDYcDSaaacDQcDYcDSaaaczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcEzcEzcEAcEBcCJcECcEwcEDcEzcEzcEwcEzcEzcEwaaaaaacDQcDYcDSaaacDQcDYcDSaaaczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcEzcEzcEEcEFcEFcEGcEHcEIcEzcEzcEwcEwcEycEwaaaaaacDQcEJcDSaaacDQcEJcDSaaaczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcEzcEzcEDcEzcEzcEKcEwcELcEzcEMcEwcEzcEzcEwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaafaagaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcENcENcEOcEPcEQcEwcEwcEzcEzcELcEwcEwcERcEwaaaczbczbczbczbczbczbczbczbczbczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9190,9 +9191,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFacFEcFFcFGcFHcFGcFtcFIcFhcFxcFxcFycFJcFtcFtcFtcFKcFLcFaczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcFbcFccFMcFbcFbcFNcFAcFAcFBcFAcFAcFAcFBcFAcFOcFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFacFQcFQcFQcFQcFRcFxcFScFacFycFTcFacFxcFUcFvcFUcFUcFxcFaczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEwcEzcELcFVcEzcEzcFWcFAcFAcFAcFAcFXcFAcFAcFYcFZczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFacFxcFUcFUcFUcGacFucFtcGbcFUcFxcFUcFUcFtcFucFucFUcFUcFaczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcEwcEzcEzcGccGdcGecGfcGgcGgcGhcGicFBcFAcFAcFAcFOczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcFacFacFUcFucFvcFtcGjcFtcFvcFtcFxcFxcFUcFtcFtcFtcFtcFvcFtcFaczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcEwcEzcEzcFVcEzcEzcGkcFncFncFAcGlcGmcFAcGmcGncGoaagcGpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcFacFacFtcFvcFtcGqcGrcGscGtcFxcGucFxcFxcGvcGwcGxcFUcFucFvcFaczcaafaaaaaaaaaaaaaaacEUaaaaaaaafaafaafcEwcEwcEwcEDcEwcEzcFkcGycGzcGAcGBcGCcFlcFlcFncFDcFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcFacFacFUcFtcGqcGDcGEcGFcFxcFxcFxcFxcFxcGGcGGcGHcGxcFtcFucFaczcaafaafaaaczccEwcEwcEwcEwcEwcEwcEwcEwcEwcEwcEwcGIcEwcEwcEwcGJcGJcGKcGJcGJcGJcFecFecFeczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcFacFacFUcFucFvcFtcGjcFtcGscFtcFxcFxcFUcFtcFtcFtcFtcFvcFtcFaczcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcEwcEzcEzcFVcEzcEzcGkcFncFncFAcGlcGmcFAcGmcGncGoaagcGpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcFacFacFtcFvcFtcGqcGrcGEcGtcFxcGucFxcFxcGvcGwcGxcFUcFucFvcFaczcaafaaaaaaaaaaaaaaacEUaaaaaaaafaafaafcEwcEwcEwcEDcEwcEzcFkcGycGzcGAcGBcGCcFlcFlcFncFDcFPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcFacFacFUcFtcGqcGDcFxcGFcFxcFxcFxcFxcFxcGGcGGcGHcGxcFtcFucFaczcaafaafaaaczccEwcEwcEwcEwcEwcEwcEwcEwcEwcEwcEwcGIcEwcEwcEwcGJcGJcGKcGJcGJcGJcFecFecFeczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcFacFacFacFUcFUcGLcGMcFucFxcFxcFxcFxcFxcFxcFxcFxcGNcGOcFUcGPcFaczcczcaafaafczccEwcGQcGQcGQcGRcGScGTcGUcEwcGQcGQcGVcGQcGQcEwczcaafaagaagaaaczcczdaagbLQczbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFacFacFacFacFacFUcFUcGLcGDcFucFxcGWcGWcGWcGWcGWcFxcFxcGXcGOcFxcFUcFacFacFacFacFaaaacEwcGYcGZcGZcGZcGZcGZcGZcHacGZcGZcHbcGQcHccEwaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcFacFacFUcHdcHecFUcFUcHfcHgcFxcHhaaaaaaaaaaaaaaacGWcFxcGXcFRcFxcFUcFtcFUcFxcFacFaaafcEwcHicGQcGQcGQcGQcGQcGQcEwcHjcGQcGVcGQcGQcEwaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9245,7 +9246,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDFaagaagcMZcNicNjcNkcMZcNlcNlcMgcNmcMgcNmcMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaagcMZcNncMZcNocNpcNqcNqcMgcNmcMgcNmcMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagcMZcNrcNscNocNqcNtcNqcMgcNmcMgcNmcMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcLHaagcIdcMZcNucMZcNvcNqcNwcNxcMgcNycMgcNmcMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcLHaagcIdcMZcNucMZcNvcNqcNwcSpcMgcNycMgcNmcMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagcIdcNzcNqcNAcNBcNqcNCcNDcNqcMgcNmcMgcNmcMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagcDEcDEcMZcNEcMZcNqcNqcNscNqcMgcNmcMgcNycMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczcczcczcaaacMZcMZcNEcMZcMZcMZcMZcMZcMgcNmcMgcNycMgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9426,21 +9427,21 @@ cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcO
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcTHcPbcPccPdcOWcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPecPfcPgcOWcPhcPicOWcOWcOWcOWcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcUhcPkcONcPlcPmcPncOFcORcPocOWcPpcPqcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPrcSucPkcORcPtcPucPvcPwcPocPhcPqcPxcPpcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPrcPzcPkcORcPtcPucPvcPwcPocPhcPqcPxcPpcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcXWcPrcPzcPrcONcONcPAcPBcPtcOWcPCcPDcOWcPqcPEcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPFcPGcONcPHcPIcSxcPKcPLcPucPMcPAcOPcOWcOWcOWcOWcOWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOEcOEcOEcOEcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPNcPNcPOcPNcPNcPNcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPFcPGcONcPHcPIcONcPKcPLcPucPMcPAcOPcOWcOWcOWcOWcOWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOEcOEcOEcOEcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcPNcPNcPOcPNcPNcPNcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcPPcPQcPRcONcPIcPqcORcPScPtcOIcOWcPLcPTcOWcPUcPVcPtcPWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOUcOZcOZcPNcPXcPYcPZcQacPNcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOZcOZcOEcOEcOWcPncPdcQbcPpcPRcQccQdcPucPUcOFcPucQecOWcPUcPCcPVcPWcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcRjcRjcRjcRjcRjcOTcOTcOEcOEcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOZcOZcOZcPNcQfcQgcQhcQicPNcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOWcOWcOWcOWcOWcOWcPmcPtcQjcPdcPtcPLcQkcPUcPUcPwcPVcPCcOWcPUcORcPCcPWcOWcOEcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcRjcRjcQlcQlcQlcQlcRjcRjcRjcOTcOTcOEcOTcOTcOTcOTcOUcOUcOUcOUcOUcOZcPNcPNcPNcPNcPNcQmcQncPNcPNcPNcPNcPNcPNcPNcPNcPNcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOWcQocQpcQqcQrcOWcPPcQscPQcOWcPMcOWcQtcQucQvcOWcPtcOPcOIcPVcOIcPccPtcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRlcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcOTcOTcOTcOTcOTcOTcOUcOUcOUcOUcOUcOZcPNcQwcQxcQycQzcQAcQBcQCcQDcQDcQDcPjcQFcQEcQHcPNcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOWcQocQIcQJcQIcQKcOPcPCcQLcPCcOPcPtcORcQMcPVcPtcORcPKcOWcOIcQNcOIcOIcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcOTcOTcOTcOTcOUcOUcOUcOUcOUcOUcOZcPNcQOcQDcQPcQQcQRcQScQTcPNcPNcQUcQVcQWcQWcQXcPNcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOWcQocQIcQYcQYcQKcPucPCcPhcORcQZcOPcPCcPVcQLcOIcPVcPCcOWcPCcPtcOPcOIcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRbcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOZcPNcRccRdcRecRfcRecRgcQDcRhcPNcRicUkcUjcTJcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOWcQocRmcQYcRncOWcRocOWcRpcRqcOWcPucOWcRpcRqcOWcOIcOPcOWcRrcPccOIcPLcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcRjcRbcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOZcPNcRucQDcRvcQzcQDcRwcQDcRhcPNcRicQlcQlcQlcQlcQlcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOWdeqcRmcQYcRncOWcRocOWcRpcRqcOWcPucOWcRpcRqcOWcOIcOPcOWcRrcPccOIcPLcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcRjcRbcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOZcPNcRucQDcRvcQzcQDcRwcQDcRhcPNcRicQlcQlcQlcQlcQlcRjcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOWcOWcOWcOWcOWcOWcRocOWcOPcPVcOIcPCcPCcOIcRxcPtcOPcPtcOWcRycRzcRAcRBcOWcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcRjcRbcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOZcOZcPNcRCcQDcRDcQQcREcQDcQDcRhcPNcRicQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOWcRocOWcPVcPLcRFcPdcRGcPtcPVcOWcOIcPCcOWcRHcRIcRIcRJcOWcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcOUcOUcOUcOUcOUcOUcOZcOZcOZcPNcPNcRLcRMcPNcPNcRNcROcRNcPNcRicQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcSncSncRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOWcRocOWcPCcPtcOPcPVcPRcPCcPvcOWcRocOWcOWcPUcOIcRIcRQcRRcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcVscOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRScRTcRUcRVcRVcRVcRVcRVcRVcTpcRScRTcQlcQlcRXcRYcRZcPNcSacQDcSbcPNcRicQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccSccSccSccSccSccSncSncSncSncSncSncRjcRjcRjcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOWcRocOWcOWcOWcOWcOWcOWcOWcOWcOWcRocOWcPUcOIcSdcOIcRJcSecRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcSwcSgcSgcSgcSgcSgcSgcSgcSgcSwcQlcQlcQlcShcShcShcPNcSicSjcSkcPNcRicQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccSccSccSccSccScdcVdcVdcVdcWcSccSncSncSncSncSncSncSncSncSncRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOWcRocRocRocRocSpcRocRocRocRocRocRocOWcPUcSdcSdcSdcPWcOWcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRScRTcSHcSrcSrcSrcSrcSrcSrcSrcRScRTcQlcQlcQlcQlcQlcPNcRNcSscRNcPNcStcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccSccSccSccSccScdcVdcVdcVdcWcSccSncSncSncSncSncSncSncSncSncRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOWcRocRocRocSxcPicSucRocRocRocRocRocOWcPUcSdcSdcSdcPWcOWcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRScRTcSHcSrcSrcSrcSrcSrcSrcSrcRScRTcQlcQlcQlcQlcQlcPNcRNcSscRNcPNcStcQlcQlcQlcQlcQlcQlcQlcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcSccPscPJcPJcSfcSycSzcSAcSAcSAcSccRacRacRacRacSBcSncSncSncSncSncSncRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcOWcRBcSCcSDcOWcOWcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcQlcQlcQlcQlcQlcQlcSEcSFcSGcSqcSIcSJcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOUcOUcOUcOUcOUcOUcOUcSccSvcSLcSMcSNcSydcUcSAcSPcSQcSRcSScSTcSTcRacSBcSUcSncSncSncSncSncSncSncRjcRjcRjcOUcOUcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRKcRKcRKcOWcRIcRIcSdcOWcRKcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcQlcSEcSVcSGcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
cOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOZcOUcOUcOUcOUcOUcSccSccSccSycSWcSXcSWcSycSYcSZcSycSycSccSccSccTacTbcTccSncSncSncSncSncSncSncSncSncRjcRjcRjcOUcOUcOUcOUcOTcOTcOTcOTcOTcOTcOTcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcRKcRKcRKcOWcTdcTecTdcOWcRKcRKcRKcRKcRKcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOEcOTcOTcRjcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcQlcRjcOUcOUcOUcOUcOUcOUcOUcRjcRjcRjcRjcRjcRjcRjcRjcRjcRjcQlcQlcQlcQlcQlcTfcQlcQlcQlcQlcRjcRjcRjcRjcRjcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRkcRjcRjcRjcRjcRjcRjcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOUcOU
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -1,8 +1,8 @@
#if !defined(MAP_FILE)
#include "map_files\MetaStation.v39I.dmm"
#include "map_files\MetaStation.v39K.dmm"
#define MAP_FILE "MetaStation.v39I.dmm"
#define MAP_FILE "MetaStation.v39K.dmm"
#define MAP_NAME "MetaStation"
#elif !defined(MAP_OVERRIDE)
+2 -2
View File
@@ -1,8 +1,8 @@
#if !defined(MAP_FILE)
#include "map_files\tgstation.2.1.2.dmm"
#include "map_files\tgstation.2.1.3.dmm"
#define MAP_FILE "tgstation.2.1.2.dmm"
#define MAP_FILE "tgstation.2.1.3.dmm"
#define MAP_NAME "TGstation 2"
#elif !defined(MAP_OVERRIDE)
@@ -386,6 +386,6 @@
target_vent = src
L << "<span class='warning'> The vent you were heading to appears to be welded.</span>"
L.loc = target_vent.loc
var/area/new_area = get_area(loc)
var/area/new_area = get_area(L.loc)
if(new_area)
new_area.Entered(L)
+4 -1
View File
@@ -222,7 +222,7 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
T.atmos_spawn_air(text, amount)
var/const/SPAWN_HEAT = 1
var/const/SPAWN_20C = 2
var/const/SPAWN_TOXINS = 4
var/const/SPAWN_OXYGEN = 8
var/const/SPAWN_CO2 = 16
@@ -238,6 +238,9 @@ var/const/SPAWN_AIR = 256
var/datum/gas_mixture/G = new
if(flag & SPAWN_20C)
G.temperature = T20C
if(flag & SPAWN_HEAT)
G.temperature += 1000
+1
View File
@@ -26,6 +26,7 @@
#define CANWEAKEN 2
#define CANPARALYSE 4
#define CANPUSH 8
#define GOTTAGOFAST 16
#define GODMODE 4096
#define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath
#define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system
+1 -1
View File
@@ -9,7 +9,7 @@
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message in the default attackby()
#define MASKINTERNALS 8 // mask allows internals
//#define SUITSPACE 8 // suit protects against space
#define USEDELAY 16 // For adding extra delay to heavy items, not currently used
//#define USEDELAY 16 // For adding extra delay to heavy items, not currently used
#define NOSHIELD 32 // weapon not affected by shield
#define CONDUCT 64 // conducts electricity (metal etc.)
#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
@@ -1,70 +1,72 @@
//print an error message to world.log
/proc/error(msg)
world.log << "## ERROR: [msg]"
//print a warning message to world.log
/proc/warning(msg)
world.log << "## WARNING: [msg]"
//print a testing-mode debug message to world.log
/proc/testing(msg)
#ifdef TESTING
world.log << "## TESTING: [msg]"
#endif
/proc/log_admin(text)
admin_log.Add(text)
if (config.log_admin)
diary << "\[[time_stamp()]]ADMIN: [text]"
/proc/log_game(text)
if (config.log_game)
diary << "\[[time_stamp()]]GAME: [text]"
/proc/log_vote(text)
if (config.log_vote)
diary << "\[[time_stamp()]]VOTE: [text]"
/proc/log_access(text)
if (config.log_access)
diary << "\[[time_stamp()]]ACCESS: [text]"
/proc/log_say(text)
if (config.log_say)
diary << "\[[time_stamp()]]SAY: [text]"
/proc/log_prayer(text)
if (config.log_prayer)
diary << "\[[time_stamp()]]PRAY: [text]"
/proc/log_law(text)
if (config.log_law)
diary << "\[[time_stamp()]]LAW: [text]"
/proc/log_ooc(text)
if (config.log_ooc)
diary << "\[[time_stamp()]]OOC: [text]"
/proc/log_whisper(text)
if (config.log_whisper)
diary << "\[[time_stamp()]]WHISPER: [text]"
/proc/log_emote(text)
if (config.log_emote)
diary << "\[[time_stamp()]]EMOTE: [text]"
/proc/log_attack(text)
if (config.log_attack)
diaryofmeanpeople << "\[[time_stamp()]]ATTACK: [text]"
/proc/log_adminsay(text)
if (config.log_adminchat)
diary << "\[[time_stamp()]]ADMINSAY: [text]"
/proc/log_adminwarn(text)
if (config.log_adminwarn)
diary << "\[[time_stamp()]]ADMINWARN: [text]"
/proc/log_pda(text)
if (config.log_pda)
//print an error message to world.log
#define ERROR(MSG) error("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
/proc/error(msg)
world.log << "## ERROR: [msg]"
//print a warning message to world.log
#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
/proc/warning(msg)
world.log << "## WARNING: [msg]"
//print a testing-mode debug message to world.log
/proc/testing(msg)
#ifdef TESTING
world.log << "## TESTING: [msg]"
#endif
/proc/log_admin(text)
admin_log.Add(text)
if (config.log_admin)
diary << "\[[time_stamp()]]ADMIN: [text]"
/proc/log_game(text)
if (config.log_game)
diary << "\[[time_stamp()]]GAME: [text]"
/proc/log_vote(text)
if (config.log_vote)
diary << "\[[time_stamp()]]VOTE: [text]"
/proc/log_access(text)
if (config.log_access)
diary << "\[[time_stamp()]]ACCESS: [text]"
/proc/log_say(text)
if (config.log_say)
diary << "\[[time_stamp()]]SAY: [text]"
/proc/log_prayer(text)
if (config.log_prayer)
diary << "\[[time_stamp()]]PRAY: [text]"
/proc/log_law(text)
if (config.log_law)
diary << "\[[time_stamp()]]LAW: [text]"
/proc/log_ooc(text)
if (config.log_ooc)
diary << "\[[time_stamp()]]OOC: [text]"
/proc/log_whisper(text)
if (config.log_whisper)
diary << "\[[time_stamp()]]WHISPER: [text]"
/proc/log_emote(text)
if (config.log_emote)
diary << "\[[time_stamp()]]EMOTE: [text]"
/proc/log_attack(text)
if (config.log_attack)
diaryofmeanpeople << "\[[time_stamp()]]ATTACK: [text]"
/proc/log_adminsay(text)
if (config.log_adminchat)
diary << "\[[time_stamp()]]ADMINSAY: [text]"
/proc/log_adminwarn(text)
if (config.log_adminwarn)
diary << "\[[time_stamp()]]ADMINWARN: [text]"
/proc/log_pda(text)
if (config.log_pda)
diary << "\[[time_stamp()]]PDA: [text]"
+2 -2
View File
@@ -2,12 +2,12 @@
//returns text as a string if these conditions are met
/proc/return_file_text(filename)
if(fexists(filename) == 0)
error("File not found ([filename])")
ERROR("File not found ([filename])")
return
var/text = file2text(filename)
if(!text)
error("File empty ([filename])")
ERROR("File empty ([filename])")
return
return text
+3 -3
View File
@@ -169,11 +169,11 @@ proc/recursive_mob_check(var/atom/O,var/client_check=1,var/sight_check=1,var/inc
found_mobs |= A
for(var/atom/B in A)
if(!(B in processed_list))
if(!processed_list[B])
processing_list |= B
processing_list -= A
processed_list |= A
processing_list.Cut(1, 2)
processed_list[A] = A
return found_mobs
+5
View File
@@ -56,6 +56,11 @@ var/list/skin_tones = list(
"african2"
)
var/list/mutant_races = list(
"human",
"lizard",
)
proc/age2agedescription(age)
switch(age)
if(0 to 1) return "infant"
+19 -2
View File
@@ -249,6 +249,19 @@ Turf and target are seperate in case you want to teleport some distance from a t
if(C.dna)
C.dna.real_name = real_name
if(isAI(src))
var/mob/living/silicon/ai/AI = src
if(oldname != real_name)
for(var/mob/living/silicon/robot/Slave in AI.connected_robots)
Slave.show_laws()
if(isrobot(src))
var/mob/living/silicon/robot/R = src
if(oldname != real_name)
R.notify_ai(3, oldname, newname)
if(R.camera)
R.camera.c_tag = real_name
if(oldname)
//update the datacore records! This is goig to be a bit costly.
for(var/list/L in list(data_core.general,data_core.medical,data_core.security,data_core.locked))
@@ -265,7 +278,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/obj/item/weapon/card/id/ID = A
if(ID.registered_name == oldname)
ID.registered_name = newname
ID.name = "[newname]'s ID Card ([ID.assignment])"
ID.update_label()
if(!search_pda) break
search_id = 0
@@ -273,7 +286,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/obj/item/device/pda/PDA = A
if(PDA.owner == oldname)
PDA.owner = newname
PDA.name = "PDA-[newname] ([PDA.ownjob])"
PDA.update_label()
if(!search_id) break
search_pda = 0
@@ -330,6 +343,10 @@ Turf and target are seperate in case you want to teleport some distance from a t
A.aiPDA.owner = newname
A.aiPDA.name = newname + " (" + A.aiPDA.ownjob + ")"
// Notify Cyborgs
for(var/mob/living/silicon/robot/Slave in A.connected_robots)
Slave.show_laws()
if(cmptext("cyborg",role))
if(isrobot(src))
var/mob/living/silicon/robot/A = src
+29 -1
View File
@@ -24,9 +24,37 @@ var/list/scarySounds = list('sound/weapons/thudswoosh.ogg','sound/weapons/Taser.
// Reference list for disposal sort junctions. Set the sortType variable on disposal sort junctions to
// the index of the sort department that you want. For example, sortType set to 2 will reroute all packages
// tagged for the Cargo Bay.
/* List of sortType codes for mapping reference
0 Waste
1 Disposals
2 Cargo Bay
3 QM Office
4 Engineering
5 CE Office
6 Atmospherics
7 Security
8 HoS Office
9 Medbay
10 CMO Office
11 Chemistry
12 Research
13 RD Office
14 Robotics
15 HoP Office
16 Library
17 Chapel
18 Theatre
19 Bar
20 Kitchen
21 Hydroponics
22 Janitor
23 Genetics
*/
var/list/TAGGERLOCATIONS = list("Disposals",
"Cargo Bay", "QM Office", "Engineering", "CE Office",
"Atmospherics", "Security", "HoS Office", "Medbay",
"CMO Office", "Chemistry", "Research", "RD Office",
"Robotics", "HoP Office", "Library", "Chapel", "Theatre",
"Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")
"Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")
+25 -2
View File
@@ -15,7 +15,6 @@
return
if(control_disabled || stat) return
next_move = world.time + 9
if(ismob(A))
ai_actual_track(A)
@@ -36,6 +35,9 @@
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
return
if(modifiers["middle"])
MiddleClickOn(A)
return
@@ -51,7 +53,6 @@
if(world.time <= next_move)
return
next_move = world.time + 9
if(aicamera.in_camera_mode)
aicamera.camera_mode_off()
@@ -85,6 +86,9 @@
than anything else in the game, atoms have separate procs
for AI shift, ctrl, and alt clicking.
*/
/mob/living/silicon/ai/CtrlShiftClickOn(var/atom/A)
A.AICtrlShiftClick(src)
/mob/living/silicon/ai/ShiftClickOn(var/atom/A)
A.AIShiftClick(src)
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
@@ -96,6 +100,17 @@
The following criminally helpful code is just the previous code cleaned up;
I have no idea why it was in atoms.dm instead of respective files.
*/
/atom/proc/AICtrlShiftClick()
return
/obj/machinery/door/airlock/AICtrlShiftClick() // Sets/Unsets Emergency Access Override
if(emagged)
return
if(!emergency)
Topic("aiEnable=11", list("aiEnable"="11"), 1) // 1 meaning no window (consistency!)
else
Topic("aiDisable=11", list("aiDisable"="11"), 1)
return
/atom/proc/AIShiftClick()
return
@@ -124,6 +139,10 @@
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
toggle_breaker()
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
src.enabled = !src.enabled
src.updateTurrets()
/atom/proc/AIAltClick(var/mob/living/silicon/ai/user)
AltClick(user)
@@ -140,6 +159,10 @@
Topic("aiDisable=5", list("aiDisable"="5"), 1)
return
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
src.lethal = !src.lethal
src.updateTurrets()
//
// Override TurfAdjacent for AltClicking
//
+30 -33
View File
@@ -43,6 +43,9 @@
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
return
if(modifiers["middle"])
MiddleClickOn(A)
return
@@ -71,7 +74,7 @@
return M.click_action(A,src)
if(restrained())
next_move = world.time + 10 //Doing shit in cuffs shall be vey slow
changeNext_move(10) //Doing shit in cuffs shall be vey slow
RestrainedClickOn(A)
return
@@ -83,34 +86,23 @@
if(W == A)
next_move = world.time + 6
if(W.flags&USEDELAY)
next_move += 5
W.attack_self(src)
if(hand)
update_inv_l_hand(0)
else
update_inv_r_hand(0)
return
// operate two levels deep here (item in backpack in src; NOT item in box in backpack in src)
if(!isturf(A) && A == loc || (A in contents) || (A.loc in contents))
// faster access to objects already on you
if(A in contents)
next_move = world.time + 6 // on your person
else
next_move = world.time + 8 // in a box/bag or in your square
// No adjacency needed
if(W)
if(W.flags&USEDELAY)
next_move += 5
var/resolved = A.attackby(W,src)
if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1 indicates adjacency
else
if(ismob(A))
changeNext_move(8)
UnarmedAttack(A)
return
@@ -119,11 +111,8 @@
// Allows you to click on a box's contents, if that box is on the ground, but no deeper than that
if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc)))
next_move = world.time + 10
if(A.Adjacent(src)) // see adjacent.dm
if(W)
if(W.flags&USEDELAY)
next_move += 5
if(W.preattack(A,src,1,params)) //Weapon attack override,return 1 to exit
return
// Return 1 in attackby() to prevent afterattack() effects (when safely moving items for example)
@@ -131,6 +120,8 @@
if(!resolved && A && W)
W.afterattack(A,src,1,params) // 1: clicking something Adjacent
else
if(ismob(A))
changeNext_move(8)
UnarmedAttack(A, 1)
return
else // non-adjacent click
@@ -143,9 +134,12 @@
return
// Default behavior: ignore double clicks, consider them normal clicks instead
/mob/proc/changeNext_move(num)
next_move = world.time + num
// Default behavior: ignore double clicks (the second click that makes the doubleclick call already calls for a normal click)
/mob/proc/DblClickOn(var/atom/A, var/params)
ClickOn(A,params)
return
/*
@@ -159,6 +153,8 @@
in human click code to allow glove touches only at melee range.
*/
/mob/proc/UnarmedAttack(var/atom/A, var/proximity_flag)
if(ismob(A))
changeNext_move(8)
return
/*
@@ -173,19 +169,9 @@
if(!mutations.len) return
if((LASER in mutations) && a_intent == "harm")
LaserEyes(A) // moved into a proc below
else if(TK in mutations)
switch(get_dist(src,A))
if(0)
;
if(1 to 5) // not adjacent may mean blocked by window
next_move += 2
if(5 to 7)
next_move += 5
if(8 to tk_maxrange)
next_move += 10
else
return
A.attack_tk(src)
else
if(TK in mutations)
A.attack_tk(src)
/*
Restrained ClickOn
@@ -259,6 +245,17 @@
/mob/proc/TurfAdjacent(var/turf/T)
return T.Adjacent(src)
/*
Control+Shift click
Unused except for AI
*/
/mob/proc/CtrlShiftClickOn(var/atom/A)
A.CtrlShiftClick(src)
return
/atom/proc/CtrlShiftClick(var/mob/user)
return
/*
Misc helpers
@@ -269,7 +266,7 @@
return
/mob/living/LaserEyes(atom/A)
next_move = world.time + 6
changeNext_move(4)
var/turf/T = get_turf(src)
var/turf/U = get_turf(A)
+50 -13
View File
@@ -19,6 +19,9 @@
return
var/list/modifiers = params2list(params)
if(modifiers["shift"] && modifiers["ctrl"])
CtrlShiftClickOn(A)
return
if(modifiers["middle"])
MiddleClickOn(A)
return
@@ -56,20 +59,12 @@
return
if(W == A)
next_move = world.time + 8
if(W.flags&USEDELAY)
next_move += 5
W.attack_self(src)
return
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc in contents)
if(A == loc || (A in loc) || (A in contents))
// No adjacency checks
next_move = world.time + 8
if(W.flags&USEDELAY)
next_move += 5
var/resolved = A.attackby(W,src)
if(!resolved && A && W)
W.afterattack(A,src,1,params)
@@ -81,16 +76,11 @@
// cyborgs are prohibited from using storage items so we can I think safely remove (A.loc && isturf(A.loc.loc))
if(isturf(A) || isturf(A.loc))
if(A.Adjacent(src)) // see adjacent.dm
next_move = world.time + 10
if(W.flags&USEDELAY)
next_move += 5
var/resolved = A.attackby(W, src)
if(!resolved && A && W)
W.afterattack(A, src, 1, params)
return
else
next_move = world.time + 10
W.afterattack(A, src, 0, params)
return
return
@@ -100,6 +90,53 @@
cycle_modules()
return
//Give cyborgs hotkey clicks without breaking existing uses of hotkey clicks
// for non-doors/apcs
/mob/living/silicon/robot/CtrlShiftClickOn(var/atom/A)
A.BorgCtrlShiftClick(src)
/mob/living/silicon/robot/ShiftClickOn(var/atom/A)
A.BorgShiftClick(src)
/mob/living/silicon/robot/CtrlClickOn(var/atom/A)
A.BorgCtrlClick(src)
/mob/living/silicon/robot/AltClickOn(var/atom/A)
A.BorgAltClick(src)
/atom/proc/BorgCtrlShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlShiftClick(user)
/obj/machinery/door/airlock/BorgCtrlShiftClick() // Sets/Unsets Emergency Access Override Forwards to AI code.
AICtrlShiftClick()
/atom/proc/BorgShiftClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
ShiftClick(user)
/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code.
AIShiftClick()
/atom/proc/BorgCtrlClick(var/mob/living/silicon/robot/user) //forward to human click if not overriden
CtrlClick(user)
/obj/machinery/door/airlock/BorgCtrlClick() // Bolts doors. Forwards to AI code.
AICtrlClick()
/obj/machinery/power/apc/BorgCtrlClick() // turns off/on APCs. Forwards to AI code.
AICtrlClick()
/obj/machinery/turretid/BorgCtrlClick() //turret control on/off. Forwards to AI code.
AICtrlClick()
/atom/proc/BorgAltClick(var/mob/living/silicon/robot/user)
AltClick(user)
return
/obj/machinery/door/airlock/BorgAltClick() // Eletrifies doors. Forwards to AI code.
AIAltClick()
/obj/machinery/turretid/BorgAltClick() //turret lethal on/off. Forwards to AI code.
AIAltClick()
/*
As with AI, these are not used in click code,
because the code for robots is specific, not generic.
+6 -5
View File
@@ -13,6 +13,10 @@
unacidable = 1
var/obj/master = null //A reference to the object in the slot. Grabs or items, generally.
/obj/screen/Destroy()
master = null
..()
/obj/screen/text
icon = null
@@ -46,7 +50,6 @@
return 1
if(usr.next_move >= world.time)
return
usr.next_move = world.time + 6
if(usr.stat || usr.restrained() || usr.stunned || usr.lying)
return 1
@@ -91,7 +94,6 @@
var/obj/item/I = usr.get_active_hand()
if(I)
master.attackby(I, usr)
usr.next_move = world.time+2
return 1
/obj/screen/zone_sel
@@ -297,6 +299,7 @@
// We don't even know if it's a middle click
if(world.time <= usr.next_move)
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
@@ -306,12 +309,10 @@
if(iscarbon(usr))
var/mob/living/carbon/C = usr
C.activate_hand("r")
usr.next_move = world.time+2
if("l_hand")
if(iscarbon(usr))
var/mob/living/carbon/C = usr
C.activate_hand("l")
usr.next_move = world.time+2
if("swap")
usr:swap_hand()
if("hand")
@@ -320,5 +321,5 @@
if(usr.attack_ui(slot_id))
usr.update_inv_l_hand(0)
usr.update_inv_r_hand(0)
usr.next_move = world.time+6
return 1
+1
View File
@@ -11,6 +11,7 @@
visible_message("<span class='danger'>[src] has been hit by [user] with [W].</span>")
/mob/living/attackby(obj/item/I, mob/user)
user.changeNext_move(8)
I.attack(src, user)
/mob/living/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
+2 -2
View File
@@ -46,8 +46,8 @@
CtrlClickOn(A)
return
if(world.time <= next_move) return
next_move = world.time + 8
if(world.time <= next_move)
return
// You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below
A.attack_ghost(src)
-9
View File
@@ -35,15 +35,6 @@
return
else if(TK in mutations)
switch(get_dist(src,A))
if(1 to 5) // not adjacent may mean blocked by window
next_move += 2
if(5 to 7)
next_move += 5
if(8 to 15)
next_move += 10
if(16 to 128)
return
A.attack_tk(src)
/*
+199 -208
View File
@@ -1,208 +1,199 @@
/*
Telekinesis
This needs more thinking out, but I might as well.
*/
var/const/tk_maxrange = 15
/*
Telekinetic attack:
By default, emulate the user's unarmed attack
*/
/atom/proc/attack_tk(mob/user)
if(user.stat) return
user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc
return
/*
This is similar to item attack_self, but applies to anything
that you can grab with a telekinetic grab.
It is used for manipulating things at range, for example, opening and closing closets.
There are not a lot of defaults at this time, add more where appropriate.
*/
/atom/proc/attack_self_tk(mob/user)
return
/obj/attack_tk(mob/user)
if(user.stat) return
if(anchored)
..()
return
var/obj/item/tk_grab/O = new(src)
user.put_in_active_hand(O)
O.host = user
O.focus_object(src)
return
/obj/item/attack_tk(mob/user)
if(user.stat || !isturf(loc)) return
if((TK in user.mutations) && !user.get_active_hand()) // both should already be true to get here
var/obj/item/tk_grab/O = new(src)
user.put_in_active_hand(O)
O.host = user
O.focus_object(src)
else
warning("Strange attack_tk(): TK([TK in user.mutations]) empty hand([!user.get_active_hand()])")
return
/mob/attack_tk(mob/user)
return // needs more thinking about
/*
TK Grab Item (the workhorse of old TK)
* If you have not grabbed something, do a normal tk attack
* If you have something, throw it at the target. If it is already adjacent, do a normal attackby()
* If you click what you are holding, or attack_self(), do an attack_self_tk() on it.
* Deletes itself if it is ever not in your hand, or if you should have no access to TK.
*/
/obj/item/tk_grab
name = "Telekinetic Grab"
desc = "Magic"
icon = 'icons/obj/magic.dmi'//Needs sprites
icon_state = "2"
flags = NOBLUDGEON
//item_state = null
w_class = 10.0
layer = 20
var/last_throw = 0
var/atom/movable/focus = null
var/mob/living/host = null
dropped(mob/user as mob)
if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item
if(focus.Adjacent(loc))
focus.loc = loc
qdel(src)
return
//stops TK grabs being equipped anywhere but into hands
equipped(var/mob/user, var/slot)
if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return
qdel(src)
return
attack_self(mob/user as mob)
if(focus)
focus.attack_self_tk(user)
afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this
if(!target || !user) return
if(last_throw+3 > world.time) return
if(!host || host != user)
qdel(src)
return
if(!(TK in host.mutations))
qdel(src)
return
if(isobj(target) && !isturf(target.loc))
return
var/d = get_dist(user, target)
if(focus) d = max(d,get_dist(user,focus)) // whichever is further
switch(d)
if(0)
;
if(1 to 5) // not adjacent may mean blocked by window
if(!proximity)
user.next_move += 2
if(5 to 7)
user.next_move += 5
if(8 to tk_maxrange)
user.next_move += 10
else
user << "\blue Your mind won't reach that far."
return
if(!focus)
focus_object(target, user)
return
if(target == focus)
target.attack_self_tk(user)
return // todo: something like attack_self not laden with assumptions inherent to attack_self
if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus))
var/obj/item/I = focus
var/resolved = target.attackby(I, user, user:get_organ_target())
if(!resolved && target && I)
I.afterattack(target,user,1) // for splashing with beakers
else
apply_focus_overlay()
focus.throw_at(target, 10, 1)
last_throw = world.time
return
attack(mob/living/M as mob, mob/living/user as mob, def_zone)
return
proc/focus_object(var/obj/target, var/mob/living/user)
if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
if(target.anchored || !isturf(target.loc))
qdel(src)
return
focus = target
update_icon()
apply_focus_overlay()
return
proc/apply_focus_overlay()
if(!focus) return
var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z))
O.name = "sparkles"
O.anchored = 1
O.density = 0
O.layer = FLY_LAYER
O.dir = pick(cardinal)
O.icon = 'icons/effects/effects.dmi'
O.icon_state = "nothing"
flick("empdisable",O)
spawn(5)
O.delete()
return
update_icon()
overlays.Cut()
if(focus && focus.icon && focus.icon_state)
overlays += icon(focus.icon,focus.icon_state)
return
/*Not quite done likely needs to use something thats not get_step_to
proc/check_path()
var/turf/ref = get_turf(src.loc)
var/turf/target = get_turf(focus.loc)
if(!ref || !target) return 0
var/distance = get_dist(ref, target)
if(distance >= 10) return 0
for(var/i = 1 to distance)
ref = get_step_to(ref, target, 0)
if(ref != target) return 0
return 1
*/
//equip_to_slot_or_del(obj/item/W, slot, qdel_on_fail = 1)
/*
if(istype(user, /mob/living/carbon))
if(user:mutations & TK && get_dist(source, user) <= 7)
if(user:get_active_hand()) return 0
var/X = source:x
var/Y = source:y
var/Z = source:z
*/
/*
Telekinesis
This needs more thinking out, but I might as well.
*/
var/const/tk_maxrange = 15
/*
Telekinetic attack:
By default, emulate the user's unarmed attack
*/
/atom/proc/attack_tk(mob/user)
if(user.stat) return
user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc
return
/*
This is similar to item attack_self, but applies to anything
that you can grab with a telekinetic grab.
It is used for manipulating things at range, for example, opening and closing closets.
There are not a lot of defaults at this time, add more where appropriate.
*/
/atom/proc/attack_self_tk(mob/user)
return
/obj/attack_tk(mob/user)
if(user.stat) return
if(anchored)
..()
return
var/obj/item/tk_grab/O = new(src)
user.put_in_active_hand(O)
O.host = user
O.focus_object(src)
return
/obj/item/attack_tk(mob/user)
if(user.stat || !isturf(loc)) return
if((TK in user.mutations) && !user.get_active_hand()) // both should already be true to get here
var/obj/item/tk_grab/O = new(src)
user.put_in_active_hand(O)
O.host = user
O.focus_object(src)
else
WARNING("Strange attack_tk(): TK([TK in user.mutations]) empty hand([!user.get_active_hand()])")
return
/mob/attack_tk(mob/user)
return // needs more thinking about
/*
TK Grab Item (the workhorse of old TK)
* If you have not grabbed something, do a normal tk attack
* If you have something, throw it at the target. If it is already adjacent, do a normal attackby()
* If you click what you are holding, or attack_self(), do an attack_self_tk() on it.
* Deletes itself if it is ever not in your hand, or if you should have no access to TK.
*/
/obj/item/tk_grab
name = "Telekinetic Grab"
desc = "Magic"
icon = 'icons/obj/magic.dmi'//Needs sprites
icon_state = "2"
flags = NOBLUDGEON | ABSTRACT
//item_state = null
w_class = 10.0
layer = 20
var/last_throw = 0
var/atom/movable/focus = null
var/mob/living/host = null
dropped(mob/user as mob)
if(focus && user && loc != user && loc != user.loc) // drop_item() gets called when you tk-attack a table/closet with an item
if(focus.Adjacent(loc))
focus.loc = loc
qdel(src)
return
//stops TK grabs being equipped anywhere but into hands
equipped(var/mob/user, var/slot)
if( (slot == slot_l_hand) || (slot== slot_r_hand) ) return
qdel(src)
return
attack_self(mob/user as mob)
if(focus)
focus.attack_self_tk(user)
afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, proximity)//TODO: go over this
if(!target || !user) return
if(last_throw+3 > world.time) return
if(!host || host != user)
qdel(src)
return
if(!(TK in host.mutations))
qdel(src)
return
if(isobj(target) && !isturf(target.loc))
return
var/d = get_dist(user, target)
if(focus)
d = max(d,get_dist(user,focus)) // whichever is further
if(d > tk_maxrange)
user << "<span class ='warning'>Your mind won't reach that far.</span>"
return
if(!focus)
focus_object(target, user)
return
if(target == focus)
target.attack_self_tk(user)
return // todo: something like attack_self not laden with assumptions inherent to attack_self
if(!istype(target, /turf) && istype(focus,/obj/item) && target.Adjacent(focus))
var/obj/item/I = focus
var/resolved = target.attackby(I, user, user:get_organ_target())
if(!resolved && target && I)
I.afterattack(target,user,1) // for splashing with beakers
else
apply_focus_overlay()
focus.throw_at(target, 10, 1)
last_throw = world.time
return
attack(mob/living/M as mob, mob/living/user as mob, def_zone)
return
proc/focus_object(var/obj/target, var/mob/living/user)
if(!istype(target,/obj)) return//Cant throw non objects atm might let it do mobs later
if(target.anchored || !isturf(target.loc))
qdel(src)
return
focus = target
update_icon()
apply_focus_overlay()
return
proc/apply_focus_overlay()
if(!focus) return
var/obj/effect/overlay/O = new /obj/effect/overlay(locate(focus.x,focus.y,focus.z))
O.name = "sparkles"
O.anchored = 1
O.density = 0
O.layer = FLY_LAYER
O.dir = pick(cardinal)
O.icon = 'icons/effects/effects.dmi'
O.icon_state = "nothing"
flick("empdisable",O)
spawn(5)
O.delete()
return
update_icon()
overlays.Cut()
if(focus && focus.icon && focus.icon_state)
overlays += icon(focus.icon,focus.icon_state)
return
/*Not quite done likely needs to use something thats not get_step_to
proc/check_path()
var/turf/ref = get_turf(src.loc)
var/turf/target = get_turf(focus.loc)
if(!ref || !target) return 0
var/distance = get_dist(ref, target)
if(distance >= 10) return 0
for(var/i = 1 to distance)
ref = get_step_to(ref, target, 0)
if(ref != target) return 0
return 1
*/
//equip_to_slot_or_del(obj/item/W, slot, qdel_on_fail = 1)
/*
if(istype(user, /mob/living/carbon))
if(user:mutations & TK && get_dist(source, user) <= 7)
if(user:get_active_hand()) return 0
var/X = source:x
var/Y = source:y
var/Z = source:z
*/
+2 -2
View File
@@ -121,7 +121,7 @@ atom
turf/New()
..()
if(luminosity)
if(light) warning("[type] - Don't set lights up manually during New(), We do it automatically.")
if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.")
trueLuminosity = luminosity * luminosity
light = new(src)
@@ -134,7 +134,7 @@ atom/movable/New()
if(loc:lighting_lumcount > 1)
UpdateAffectingLights()
if(luminosity)
if(light) warning("[type] - Don't set lights up manually during New(), We do it automatically.")
if(light) WARNING("[type] - Don't set lights up manually during New(), We do it automatically.")
trueLuminosity = luminosity * luminosity
light = new(src)
+6
View File
@@ -83,6 +83,7 @@
var/continuous_round_wiz = 0
var/continuous_round_malf = 0
var/show_game_type_odds = 0 //if set this allows players to see the odds of each roundtype on the get revision screen
var/mutant_races = 0 //players can choose their mutant race before joining the game
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
var/alert_desc_blue_upto = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
@@ -99,6 +100,7 @@
var/revival_brain_life = -1
var/rename_cyborg = 0
var/ooc_during_round = 0
//Used for modifying movement speed for mobs.
//Unversal modifiers
@@ -281,6 +283,8 @@
config.revival_brain_life = text2num(value)
if("rename_cyborg")
config.rename_cyborg = 1
if("ooc_during_round")
config.ooc_during_round = 1
if("run_delay")
config.run_speed = text2num(value)
if("walk_delay")
@@ -372,6 +376,8 @@
config.sandbox_autoclose = 1
if("default_laws")
config.default_laws = text2num(value)
if("join_with_mutant_race")
config.mutant_races = 1
else
diary << "Unknown setting in configuration: '[name]'"
+83 -86
View File
@@ -1,67 +1,32 @@
#define GC_COLLECTIONS_PER_TICK 100 // how many objects we're going to null the vars of per tick
#define GC_COLLECTION_TIMEOUT 300 // deciseconds to wait to let running procs finish before we just say fuck it and force del() the object
#define GC_DEL_CHECK_PER_TICK 100 // number of tests per tick to make sure our GC'd objects are actually GC'd
#define GC_FORCE_DEL_PER_TICK 20 // max force del() calls per tick
#define GC_DEL_CHECK_PER_TICK 100 // number of tests per master controller tick to make sure our GC'd objects are actually GC'd
#define GC_FORCE_DEL_PER_TICK 20 // max force del() calls per master controller tick
var/datum/controller/garbage_collector/garbage = new()
var/list/uncollectable_vars=list(
// "bounds", // bounds and its ilk are all caught by the issaved() check later on
"contents",
"gc_destroyed",
"invisibility",
"gender", // Causes runtimes if the logging is on
"parent",
"step_size",
)
// These are the vars left from /vg/'s implementation that aren't const or global
// I dunno how many are necessary but since most of these are numbers anyways, I don't care.
/datum/controller/garbage_collector
var/dels = 0 // number of del()'s we've done this tick
var/list/queue = list() // list of things that have yet to have all their vars nulled out
var/list/destroyed = list() // list of refID's of things that should be garbage collected
// refID's are associated with the time at which they time out and need to be manually del()
// we do this so we aren't constantly locating them and preventing them from being gc'd
/datum/controller/garbage_collector/proc/AddTrash(var/atom/movable/A)
if(!istype(A))
/datum/controller/garbage_collector/proc/AddTrash(var/datum/A)
if(!istype(A) || !isnull(A.gc_destroyed))
return
// testing("GC: AddTrash([A.type])")
queue |= A
/datum/controller/garbage_collector/proc/Pop()
var/atom/movable/A = queue[1]
if(!A)
queue.Cut(1, 2)
// testing("GC: Pop() given null")
return
if(!istype(A,/atom/movable))
// testing("GC: -- Pop() given [A.type] --")
queue.Cut(1, 2)
dels++
del(A)
return
for(var/vname in A.vars)
if(!issaved(A.vars[vname]))
// testing("GC: Skipping [vname] in [A.type]: it's const|global|tmp")
continue
if(vname in uncollectable_vars)
// testing("GC: Skipping [vname] in [A.type]: it's uncollectable")
continue
// testing("GC: Unsetting [vname] in [A.type]")
A.vars[vname] = null
// testing("GC: Pop([A.type]) - destroyed\[\ref[A]\] = [A.gc_destroyed] current time: [world.time] first:[queue[1]] second:[queue.len > 1 ? "[queue[2]]" : "NOTHING"]")
destroyed["\ref[A]"] = A.gc_destroyed
queue.Cut(1, 2)
A.gc_destroyed = world.time
destroyed -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list.
destroyed["\ref[A]"] = world.time
/datum/controller/garbage_collector/proc/process()
dels = 0
var/i
for(i = 1, queue.len && i <= GC_COLLECTIONS_PER_TICK, i++)
Pop()
var/time_to_kill = world.time - GC_COLLECTION_TIMEOUT // Anything qdel() but not GC'd BEFORE this time needs to be manually del()
for(i = 1, destroyed.len && i <= GC_DEL_CHECK_PER_TICK, i++)
var/checkRemain = GC_DEL_CHECK_PER_TICK
while(destroyed.len && --checkRemain >= 0)
if(dels > GC_FORCE_DEL_PER_TICK)
// testing("GC: Reached max force dels per tick [dels] vs [GC_FORCE_DEL_PER_TICK]")
break // Server's already pretty pounded, everything else can wait 2 seconds
var/refID = destroyed[1]
var/GCd_at_time = destroyed[refID]
if(GCd_at_time > time_to_kill)
@@ -71,61 +36,93 @@ var/list/uncollectable_vars=list(
// testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]")
if(A && A.gc_destroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake
// Something's still referring to the qdel'd object. Kill it.
if(dels >= GC_FORCE_DEL_PER_TICK)
// testing("GC: Reached max force dels per tick [dels] vs [GC_FORCE_DEL_PER_TICK]")
break // Server's already pretty pounded, everything else can wait 2 seconds
testing("GC: -- \ref[A] | [A.type] was unable to be garbage collected and was force del() --")
testing("GC: -- \ref[A] | [A.type] was unable to be GC'd and was deleted --")
del(A)
dels++
// else
// testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]")
destroyed.Cut(1, 2)
/**
* NEVER USE THIS FOR ANYTHING OTHER THAN /atom/movable
* OTHER TYPES CANNOT BE QDEL'D BECAUSE THEIR LOC IS LOCKED OR THEY DON'T HAVE ONE.
* While I'm leaving the above comment in since /atoms cannot be garbage collected, datums and lists can be garbage collected just fine.
* Read the DM guide on it. Hit f1 and search for "garbage collection"
*/
/proc/qdel(var/atom/movable/A)
// Should be treated as a replacement for the 'del' keyword.
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
/proc/qdel(var/datum/A)
if(!A)
return
if(!garbage)
del(A)
return
if(!istype(A))
warning("qdel() passed object of type [A.type]. qdel() can only handle /atom/movable types.")
garbage.dels++
//warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.")
del(A)
return
// Let our friend know they're about to get fucked up.
A.Destroy()
garbage.AddTrash(A)
if(garbage)
garbage.dels++
else if(isnull(A.gc_destroyed))
// Let our friend know they're about to get fucked up.
. = !A.Destroy()
if(. && A)
if(garbage && !isturf(A))
garbage.AddTrash(A)
else
del(A)
// Default implementation of clean-up code.
// This should be overridden to remove all references pointing to the object being destroyed.
// Return true if the the GC controller should allow the object to continue existing. (Useful if pooling objects.)
/datum/proc/Destroy()
del(src)
/*
// Uncomment this verb and run it on things to report blockages.
/atom/verb/qdel_test()
set name = "qdel with test"
/datum/var/gc_destroyed //Time when this object was destroyed.
#ifdef TESTING
/client/var/running_find_references
/atom/verb/find_references()
set category = "Debug"
set name = "Find References"
set background = 1
set src in world
qdel(src)
for(var/datum/everything) //Yes this works.
for(var/everyvar in everything.vars)
var/variable = everything.vars[everyvar]
if(!usr || !usr.client)
return
if(usr.client.running_find_references)
testing("CANCELLED search for references to a [usr.client.running_find_references].")
usr.client.running_find_references = null
return
if(alert("Running this will create a lot of lag until it finishes. You can cancel it by running it again. Would you like to begin the search?", "Find References", "Yes", "No") == "No")
return
// Remove this object from the list of things to be auto-deleted.
if(garbage)
garbage.destroyed -= "\ref[src]"
usr.client.running_find_references = type
testing("Beginning search for references to a [type].")
var/list/things = list()
for(var/client/thing)
things += thing
for(var/datum/thing)
things += thing
for(var/atom/thing)
things += thing
testing("Collected list of things in search for references to a [type]. ([things.len] Thing\s)")
for(var/datum/thing in things)
if(!usr.client.running_find_references) return
for(var/varname in thing.vars)
var/variable = thing.vars[varname]
if(variable == src)
testing("Found [src.type] \ref[src] in [everything.type]'s [everyvar] var.")
testing("Found [src.type] \ref[src] in [thing.type]'s [varname] var.")
else if(islist(variable))
if(src in variable)
testing("Found [src.type]\ref[src] in [everything.type]'s [everyvar] var.")
for(var/atom/movable/everything) //The slow part.
for(var/everyvar in everything.vars)
var/variable = everything.vars[everyvar]
if(variable == src)
testing("Found [src.type] \ref[src] in [everything.type]'s [everyvar] var.")
else if(islist(variable))
if(src in variable)
testing("Found [src.type]\ref[src] in [everything.type]'s [everyvar] var.")
*/
testing("Found [src.type] \ref[src] in [thing.type]'s [varname] list var.")
testing("Completed search for references to a [type].")
usr.client.running_find_references = null
/client/verb/purge_all_destroyed_objects()
set category = "Debug"
if(garbage)
while(garbage.destroyed.len)
var/datum/o = locate(garbage.destroyed[1])
if(istype(o) && o.gc_destroyed)
del(o)
garbage.dels++
garbage.destroyed.Cut(1, 2)
#endif
+20 -3
View File
@@ -22,6 +22,8 @@ datum/shuttle_controller
var/location = UNDOCKED //
var/online = 0
var/direction = 1 //-1 = going back to central command, 1 = going to SS13. Only important for recalling
var/recall_count = 0
var/area/last_call_loc = null // Stores where the last shuttle call/recall was made from
var/endtime // timeofday that shuttle arrives
var/timelimit //important when the shuttle gets called for more than shuttlearrivetime
@@ -35,12 +37,16 @@ datum/shuttle_controller
// call the shuttle
// if not called before, set the endtime to T+600 seconds
// otherwise if outgoing, switch to incoming
proc/incall(coeff = 1)
proc/incall(coeff = 1, var/signal_origin)
if(endtime)
if(direction == -1)
setdirection(1)
else
if(signal_origin && prob(60)) //40% chance the signal tracing will fail
last_call_loc = signal_origin
else
last_call_loc = null
settimeleft(SHUTTLEARRIVETIME*coeff)
online = 1
if(always_fake_recall)
@@ -50,7 +56,7 @@ datum/shuttle_controller
else
fake_recall = rand(SHUTTLEARRIVETIME / 2, SHUTTLEARRIVETIME - 100)
proc/recall()
proc/recall(var/signal_origin)
if(direction == 1)
var/timeleft = timeleft()
if(timeleft >= SHUTTLEARRIVETIME)
@@ -58,7 +64,18 @@ datum/shuttle_controller
direction = 1
endtime = null
return
captain_announce("The emergency shuttle has been recalled.")
recall_count ++
if(recall_count > 2 && signal_origin && prob(60)) //40% chance the signal tracing will fail
last_call_loc = signal_origin
else
last_call_loc = null
if(recall_count == 2)
captain_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace any further signals to their source. Results may be viewed on any communications console.")
else
captain_announce("The emergency shuttle has been recalled.")
world << sound('sound/AI/shuttlerecalled.ogg')
setdirection(-1)
online = 1
+2 -2
View File
@@ -86,7 +86,7 @@
add_inherent_law(line)
if(!inherent.len)
error("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
ERROR("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
@@ -105,7 +105,7 @@
add_inherent_law(line)
if(!inherent.len) //Failsafe to prevent lawless AIs being created.
error("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
ERROR("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
log_law("AI created with empty custom laws, laws set to Asimov. Please check silicon_laws.txt.")
add_inherent_law("You may not injure a human being or, through inaction, allow a human being to come to harm.")
add_inherent_law("You must obey orders given to you by human beings, except where such orders would conflict with the First Law.")
+1 -1
View File
@@ -154,7 +154,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
for(var/datum/disease/D in affected_mob.viruses)
if(D != src)
if(IsSame(D))
//error("Deleting [D.name] because it's the same as [src.name].")
//ERROR("Deleting [D.name] because it's the same as [src.name].")
del(D) // if there are somehow two viruses of the same kind in the system, delete the other one
if(holder == affected_mob)
+9 -8
View File
@@ -164,6 +164,7 @@ var/list/advance_cures = list(
//world << "[src.name] \ref[src] - REFRESH!"
var/list/properties = GenerateProperties()
AssignProperties(properties)
id = null
if(!archive_diseases[GetDiseaseID()])
if(new_name)
@@ -286,14 +287,14 @@ var/list/advance_cures = list(
// Return a unique ID of the disease.
/datum/disease/advance/GetDiseaseID()
var/list/L = list()
for(var/datum/symptom/S in symptoms)
L += S.id
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in.
var/result = list2text(L, ":")
id = result
return result
if(!id)
var/list/L = list()
for(var/datum/symptom/S in symptoms)
L += S.id
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in.
var/result = list2text(L, ":")
id = result
return id
// Add a symptom, if it is over the limit (with a small chance to be able to go over)
@@ -6,7 +6,7 @@ DNA Saboteur
Very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity temrendously.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
@@ -28,7 +28,7 @@ Bonus
/datum/symptom/genetic_mutation/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
if(prob(SYMPTOM_ACTIVATION_PROB * 5)) // 15% chance
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
@@ -58,10 +58,10 @@ Bonus
DNA Aide
Very very noticable.
Very very very very noticable.
Lowers resistance tremendously.
No changes to stage speed.
Decreases transmittablity temrendously.
Decreases stage speed tremendously.
Decreases transmittablity tremendously.
Fatal Level.
Bonus
@@ -73,9 +73,9 @@ Bonus
/datum/symptom/genetic_mutation/powers
name = "Deoxyribonucleic Acid Aide"
stealth = -3
resistance = -4
stage_speed = 0
transmittable = -4
stealth = -7
resistance = -7
stage_speed = -7
transmittable = -7
level = 6
good_mutations = 1
+3 -6
View File
@@ -62,22 +62,19 @@ STI KALY - blind
if(!istype(H.head, /obj/item/clothing/head/wizard))
if(!H.unEquip(H.head))
qdel(H.head)
H.head = new /obj/item/clothing/head/wizard(H)
H.head.layer = 20
H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(H), slot_head)
return
if(prob(chance))
if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe))
if(!H.unEquip(H.wear_suit))
qdel(H.wear_suit)
H.wear_suit = new /obj/item/clothing/suit/wizrobe(H)
H.wear_suit.layer = 20
H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(H), slot_wear_suit)
return
if(prob(chance))
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
if(!H.unEquip(H.shoes))
qdel(H.shoes)
H.shoes = new /obj/item/clothing/shoes/sandal(H)
H.shoes.layer = 20
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
return
else
var/mob/living/carbon/H = affected_mob
+142 -152
View File
@@ -1,7 +1,9 @@
//wrapper
/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
new /datum/teleport/instant/science(arglist(args))
return
var/datum/teleport/instant/science/D = new
if(D.start(arglist(args)))
return 1
return 0
/datum/teleport
var/atom/movable/teleatom //atom to teleport
@@ -14,172 +16,160 @@
var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation)
New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
..()
if(!Init(arglist(args)))
return 0
return 1
/datum/teleport/proc/start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
if(!Init(arglist(args)))
return 0
return 1
proc/Init(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
if(!setTeleatom(ateleatom))
return 0
if(!setDestination(adestination))
return 0
if(!setPrecision(aprecision))
return 0
setEffects(aeffectin,aeffectout)
setForceTeleport(afteleport)
setSounds(asoundin,asoundout)
return 1
/datum/teleport/proc/Init(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
if(!setTeleatom(ateleatom))
return 0
if(!setDestination(adestination))
return 0
if(!setPrecision(aprecision))
return 0
setEffects(aeffectin,aeffectout)
setForceTeleport(afteleport)
setSounds(asoundin,asoundout)
return 1
//must succeed
proc/setPrecision(aprecision)
if(isnum(aprecision))
precision = aprecision
return 1
//must succeed
/datum/teleport/proc/setPrecision(aprecision)
if(isnum(aprecision))
precision = aprecision
return 1
return 0
//must succeed
/datum/teleport/proc/setDestination(atom/adestination)
if(istype(adestination))
destination = adestination
return 1
return 0
//must succeed in most cases
/datum/teleport/proc/setTeleatom(atom/movable/ateleatom)
if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon))
qdel(ateleatom)
return 0
if(istype(ateleatom))
teleatom = ateleatom
return 1
return 0
//custom effects must be properly set up first for instant-type teleports
//optional
/datum/teleport/proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null)
effectin = istype(aeffectin) ? aeffectin : null
effectout = istype(aeffectout) ? aeffectout : null
return 1
//optional
/datum/teleport/proc/setForceTeleport(afteleport)
force_teleport = afteleport
return 1
//optional
/datum/teleport/proc/setSounds(asoundin=null,asoundout=null)
soundin = isfile(asoundin) ? asoundin : null
soundout = isfile(asoundout) ? asoundout : null
return 1
//placeholder
/datum/teleport/proc/teleportChecks()
return 1
/datum/teleport/proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound)
if(location)
if(effect)
spawn(-1)
src = null
effect.attach(location)
effect.start()
if(sound)
spawn(-1)
src = null
playsound(location,sound,60,1)
return
//do the monkey dance
/datum/teleport/proc/doTeleport()
var/turf/destturf
var/turf/curturf = get_turf(teleatom)
var/area/destarea = get_area(destination)
if(precision)
var/list/posturfs = circlerangeturfs(destination,precision)
destturf = safepick(posturfs)
else
destturf = get_turf(destination)
if(!destturf || !curturf)
return 0
//must succeed
proc/setDestination(atom/adestination)
if(istype(adestination))
destination = adestination
return 1
return 0
playSpecials(curturf,effectin,soundin)
//must succeed in most cases
proc/setTeleatom(atom/movable/ateleatom)
if(istype(ateleatom, /obj/effect) && !istype(ateleatom, /obj/effect/dummy/chameleon))
qdel(ateleatom)
return 0
if(istype(ateleatom))
teleatom = ateleatom
return 1
return 0
//custom effects must be properly set up first for instant-type teleports
//optional
proc/setEffects(datum/effect/effect/system/aeffectin=null,datum/effect/effect/system/aeffectout=null)
effectin = istype(aeffectin) ? aeffectin : null
effectout = istype(aeffectout) ? aeffectout : null
return 1
//optional
proc/setForceTeleport(afteleport)
force_teleport = afteleport
return 1
//optional
proc/setSounds(asoundin=null,asoundout=null)
soundin = isfile(asoundin) ? asoundin : null
soundout = isfile(asoundout) ? asoundout : null
return 1
//placeholder
proc/teleportChecks()
return 1
proc/playSpecials(atom/location,datum/effect/effect/system/effect,sound)
if(location)
if(effect)
spawn(-1)
src = null
effect.attach(location)
effect.start()
if(sound)
spawn(-1)
src = null
playsound(location,sound,60,1)
return
//do the monkey dance
proc/doTeleport()
var/turf/destturf
var/turf/curturf = get_turf(teleatom)
var/area/destarea = get_area(destination)
if(precision)
var/list/posturfs = circlerangeturfs(destination,precision)
destturf = safepick(posturfs)
else
destturf = get_turf(destination)
if(!destturf || !curturf)
return 0
playSpecials(curturf,effectin,soundin)
if(force_teleport)
teleatom.forceMove(destturf)
if(force_teleport)
teleatom.forceMove(destturf)
playSpecials(destturf,effectout,soundout)
else
if(teleatom.Move(destturf))
playSpecials(destturf,effectout,soundout)
else
if(teleatom.Move(destturf))
playSpecials(destturf,effectout,soundout)
destarea.Entered(teleatom)
destarea.Entered(teleatom)
return 1
return 1
proc/teleport()
if(teleportChecks())
return doTeleport()
return 0
/datum/teleport/proc/teleport()
if(teleportChecks())
return doTeleport()
return 0
/datum/teleport/instant //teleports when datum is created
New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
start(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
if(..())
teleport()
return
if(teleport())
return 1
return 0
/datum/teleport/instant/science
setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout)
if(aeffectin==null || aeffectout==null)
var/datum/effect/effect/system/spark_spread/aeffect = new
aeffect.set_up(5, 1, teleatom)
effectin = effectin || aeffect
effectout = effectout || aeffect
return 1
/datum/teleport/instant/science/setEffects(datum/effect/effect/system/aeffectin,datum/effect/effect/system/aeffectout)
if(aeffectin==null || aeffectout==null)
var/datum/effect/effect/system/spark_spread/aeffect = new
aeffect.set_up(5, 1, teleatom)
effectin = effectin || aeffect
effectout = effectout || aeffect
return 1
else
return ..()
/datum/teleport/instant/science/setPrecision(aprecision)
..()
if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
precision = rand(1,100)
var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
if(bagholding.len)
precision = max(rand(1,100)*bagholding.len,100)
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM << "<span class='warning'>The bluespace interface on your bag of holding interferes with the teleport!</span>"
return 1
/datum/teleport/instant/science/teleportChecks()
if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
teleatom.visible_message("<span class='warning'>The portal rejects [teleatom]!</span>")
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM.visible_message("<span class='warning'>The portal rejects [MM]!","<span class='warning'>The nuclear disk that you're carrying seems to be unable to pass through the portal. Better drop it if you want to go through.</span>")
else
return ..()
teleatom.visible_message("<span class='warning'>The portal rejects [teleatom]!</span>")
return 0
setPrecision(aprecision)
..()
if(istype(teleatom, /obj/item/weapon/storage/backpack/holding))
precision = rand(1,100)
var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
if(bagholding.len)
precision = max(rand(1,100)*bagholding.len,100)
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM << "\red The Bluespace interface on your Bag of Holding interferes with the teleport!"
return 1
teleportChecks()
if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM.visible_message("\red <B>The [MM] bounces off of the portal!</B>","\red Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through.")
else
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(destination.z == 2) //centcom z-level
if(istype(teleatom, /obj/mecha))
var/obj/mecha/MM = teleatom
MM.occupant << "\red <B>The mech would not survive the jump to a location so far away!</B>"
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)))
teleatom.visible_message("\red <B>The Bag of Holding bounces off of the portal!</B>")
return 0
if(destination.z == 7) //Away mission z-levels
return 0
return 1
return 1
+3 -10
View File
@@ -61,7 +61,7 @@ datum/mind
proc/transfer_to(mob/living/new_character)
if(!istype(new_character))
error("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn")
ERROR("transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform coderbus")
if(current) //remove ourself from our old body's mind variable
current.mind = null
@@ -598,14 +598,7 @@ datum/mind
log_admin("[key_name(usr)] has de-cult'ed [current].")
if("cultist")
if(!(src in ticker.mode.cult))
ticker.mode.cult += src
ticker.mode.update_cult_icons_added(src)
special_role = "Cultist"
current << "<font color=\"purple\"><b><i>You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie.</b></i></font>"
current << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
var/datum/game_mode/cult/cult = ticker.mode
if (istype(cult))
cult.memorize_cult_objectives(src)
ticker.mode.add_cultist(src)
message_admins("[key_name_admin(usr)] has cult'ed [current].")
log_admin("[key_name(usr)] has cult'ed [current].")
if("tome")
@@ -1102,7 +1095,7 @@ datum/mind
if(ticker)
ticker.minds += mind
else
error("mind_initialize(): No ticker ready yet! Please inform Carn")
ERROR("mind_initialize(): No ticker ready yet! Please inform coderbus")
if(!mind.name) mind.name = real_name
mind.current = src
+1 -1
View File
@@ -135,7 +135,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
return
/obj/effect/proc_holder/spell/proc/start_recharge()
while(charge_counter < charge_max)
while(charge_counter < charge_max && isnull(gc_destroyed))
sleep(1)
charge_counter++
+5 -3
View File
@@ -27,10 +27,12 @@
target.gib()
if("gib_brain")
if(ishuman(target) || ismonkey(target))
var/obj/item/organ/brain/B = target.getorgan(/obj/item/organ/brain)
var/mob/living/carbon/C_target = target
var/obj/item/organ/brain/B = C_target.getorgan(/obj/item/organ/brain)
if(B)
B.loc = get_turf(target)
B.transfer_identity(target)
B.loc = get_turf(C_target)
B.transfer_identity(C_target)
C_target.internal_organs -= B
target.gib()
if("disintegrate")
target.dust()
+20 -6
View File
@@ -123,7 +123,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 10
containertype = /obj/structure/closet/crate
containername = "firefighting crate"
/datum/supply_packs/emergency/atmostank
name = "Firefighting Watertank"
contains = list(/obj/item/weapon/watertank/atmos)
@@ -748,7 +748,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 15
containertype = /obj/structure/closet/crate/hydroponics
containername = "hydroponics crate"
/datum/supply_packs/misc/hydroponics/hydrotank
name = "Hydroponics Watertank Backpack Crate"
contains = list(/obj/item/weapon/watertank)
@@ -900,7 +900,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/misc/lasertag
name = "LaserTag Crate"
contains = list(/obj/item/weapon/gun/energy/laser/redtag,
contains = list(/obj/item/weapon/gun/energy/laser/redtag,
/obj/item/weapon/gun/energy/laser/redtag,
/obj/item/weapon/gun/energy/laser/redtag,
/obj/item/weapon/gun/energy/laser/bluetag,
@@ -917,10 +917,24 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 15
containername = "LaserTag Crate"
/datum/supply_packs/misc/religious_supplies
name = "Religious Supplies Crate"
contains = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,
/obj/item/weapon/storage/bible/booze,
/obj/item/weapon/storage/bible/booze,
/obj/item/clothing/suit/chaplain_hoodie,
/obj/item/clothing/head/chaplain_hood,
/obj/item/clothing/suit/chaplain_hoodie,
/obj/item/clothing/head/chaplain_hood)
cost = 40 // it costs so much because the Space Church is ran by Space Jews
containername = "religious supplies crate"
///////////// Paper Work
/datum/supply_packs/misc/paper
name = "Bureaucracy crate"
name = "Bureaucracy Crate"
contains = list(/obj/structure/filingcabinet/chestdrawer/wheeled,
/obj/item/device/camera_film,
/obj/item/weapon/hand_labeler,
@@ -936,7 +950,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/obj/item/weapon/clipboard,
/obj/item/weapon/clipboard)
cost = 15
containername = "Bureaucracy crate"
containername = "bureaucracy crate"
/datum/supply_packs/misc/toner
name = "Toner Cartridges"
@@ -977,7 +991,7 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
cost = 10
containertype = /obj/structure/largecrate
containername = "janitorial cart crate"
/datum/supply_packs/misc/janitor/janitank
name = "Janitor Watertank Backpack Crate"
contains = list(/obj/item/weapon/watertank/janitor)
+1 -1
View File
@@ -334,7 +334,7 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/space_suit
name = "Syndicate Space Suit"
desc = "The red syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings."
item = /obj/item/weapon/storage/box/syndie_kit/space
cost = 3
+1 -2
View File
@@ -1,4 +1,3 @@
/datum/wires/alarm
holder_type = /obj/machinery/alarm
wire_count = 5
@@ -12,7 +11,7 @@ var/const/AALARM_WIRE_AALARM = 16
/datum/wires/alarm/CanUse(var/mob/living/L)
var/obj/machinery/alarm/A = holder
if(A.wiresexposed)
if(A.panel_open)
return 1
return 0
+4 -1
View File
@@ -55,7 +55,10 @@ var/const/BORG_WIRE_CAMERA = 16
switch(index)
if (BORG_WIRE_AI_CONTROL) //pulse the AI wire to make the borg reselect an AI
if(!R.emagged)
R.connected_ai = select_active_ai()
var/new_ai = select_active_ai(R)
if(new_ai && (new_ai != R.connected_ai))
R.connected_ai = new_ai
R.notify_ai(1)
if (BORG_WIRE_CAMERA)
if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes)
+1 -9
View File
@@ -369,14 +369,6 @@
attack_verb = list("chopped", "sliced", "cut", "reaped")
hitsound = 'sound/weapons/bladeslice.ogg'
/obj/item/weapon/scythe/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity) return
if(istype(A, /obj/effect/spacevine))
for(var/obj/effect/spacevine/B in orange(A,1))
if(prob(80))
qdel(B)
qdel(A)
/*
/obj/item/weapon/cigarpacket
name = "Pete's Cuban Cigars"
@@ -405,7 +397,7 @@
icon_state = "RPED"
item_state = "RPED"
w_class = 5
can_hold = list("/obj/item/weapon/stock_parts")
can_hold = list(/obj/item/weapon/stock_parts)
storage_slots = 14
use_to_pickup = 1
allow_quick_gather = 1
+4
View File
@@ -10,3 +10,7 @@
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player))
M << command
if(title == "")
news_network.SubmitArticle(text, "Centcom Official", "Central Command", null)
else
news_network.SubmitArticle(title + "<br><br>" + text, "Centcom Official", "Central Command", null)
+14 -3
View File
@@ -610,6 +610,10 @@ proc/process_ghost_teleport_locs()
name = "Waste Disposal"
icon_state = "disposal"
/area/maintenance/electrical
name = "Electrical Maintenance"
icon_state = "yellow"
//Hallway
/area/hallway/primary/fore
@@ -1008,13 +1012,17 @@ proc/process_ghost_teleport_locs()
icon_state = "sec_prison"
/area/security/processing
name = "\improper Prisoner Processing"
name = "\improper Labor Shuttle Dock"
icon_state = "sec_prison"
/area/security/warden
name = "\improper Armory"
name = "\improper Brig Control"
icon_state = "Warden"
/area/security/armory
name = "\improper Armory"
icon_state = "armory"
/area/security/hos
name = "\improper Head of Security's Office"
icon_state = "sec_hos"
@@ -1147,7 +1155,7 @@ proc/process_ghost_teleport_locs()
icon_state = "toxmix"
/area/toxins/misc_lab
name = "\improper Miscellaneous Research"
name = "\improper Testing Lab"
icon_state = "toxmisc"
/area/toxins/server
@@ -1340,6 +1348,9 @@ proc/process_ghost_teleport_locs()
icon_state = "yellow"
//AI
/area/ai_monitored/security/armory
name = "\improper Armory"
icon_state = "armory"
/area/ai_monitored/storage/eva
name = "EVA Storage"
+2 -16
View File
@@ -1,7 +1,7 @@
/atom
layer = 2
var/level = 2
var/flags = null
var/flags = 0
var/list/fingerprints
var/list/fingerprintshidden
var/fingerprintslast = null
@@ -17,9 +17,6 @@
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.
// Garbage collection
var/gc_destroyed //Time when this object
/atom/proc/throw_impact(atom/hit_atom)
if(istype(hit_atom,/mob/living))
var/mob/living/M = hit_atom
@@ -40,20 +37,9 @@
var/mob/living/M = src
M.take_organ_damage(20)
/atom/proc/CheckParts()
return
// Like Del(), but for qdel.
// Called BEFORE qdel moves shit.
// Also called on del()
/atom/proc/Destroy()
gc_destroyed = world.time
if(reagents)
reagents.delete()
del(reagents) // Technically I think the reagent holder will gc, but let's be careful here and delete all the reagents and the holder too
invisibility = 101
/atom/proc/assume_air(datum/gas_mixture/giver)
del(giver)
return null
@@ -383,4 +369,4 @@ var/list/blood_splatter_icons = list()
return
/atom/proc/handle_slip()
return
return
+6 -2
View File
@@ -32,10 +32,14 @@
..()
/atom/movable/Destroy()
loc = null // can never null their loc enough really
if(reagents)
qdel(reagents)
for(var/atom/movable/AM in contents)
qdel(AM)
. = ..()
tag = null
loc = null
invisibility = 101
// Do not call ..()
// Previously known as HasEntered()
// This is automatically called when something enters your square
+3
View File
@@ -76,6 +76,7 @@ Radio:
1443 - Confession Intercom
1349 - Miners
1347 - Cargo techs
1447 - AI Private
Devices:
1451 - tracking implant
@@ -108,6 +109,7 @@ var/list/radiochannels = list(
"Syndicate" = 1213,
"Supply" = 1347,
"Service" = 1349,
"AI Private" = 1447,
)
//depenging helpers
var/const/SYND_FREQ = 1213 //nuke op frequency, coloured dark brown in chat window
@@ -119,6 +121,7 @@ var/const/MED_FREQ = 1355 //medical, coloured blue in chat window
var/const/ENG_FREQ = 1357 //engineering, coloured orange in chat window
var/const/SEC_FREQ = 1359 //security, coloured red in chat window
var/const/DSQUAD_FREQ = 1441 //death squad frequency, coloured grey in chat window
var/const/AIPRIV_FREQ = 1447 //AI private, colored magenta in chat window
#define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1
+6 -6
View File
@@ -23,9 +23,6 @@
var/mutantrace = null //The type of mutant race the player is if applicable (i.e. potato-man)
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
/datum/dna/New()
if(!blood_type) blood_type = random_blood_type()
/datum/dna/proc/generate_uni_identity(mob/living/carbon/character)
. = ""
var/list/L = new /list(DNA_UNI_IDENTITY_BLOCKS)
@@ -69,7 +66,7 @@
if(!istype(owner, /mob/living/carbon/monkey) && !istype(owner, /mob/living/carbon/human))
return
if(!owner.dna)
owner.dna = new /datum/dna()
create_dna(owner)
if(real_name)
owner.real_name = real_name
@@ -116,7 +113,7 @@
if(!istype(character, /mob/living/carbon/monkey) && !istype(character, /mob/living/carbon/human))
return
if(!character.dna)
character.dna = new /datum/dna()
create_dna(character)
if(blood_type)
character.dna.blood_type = blood_type
character.dna.real_name = character.real_name
@@ -125,6 +122,9 @@
character.dna.unique_enzymes = character.dna.generate_unique_enzymes(character)
return character.dna
/proc/create_dna(mob/living/carbon/C) //don't use this unless you're about to use hardset_dna or ready_dna
C.dna = new /datum/dna()
/////////////////////////// DNA DATUM
/////////////////////////// DNA HELPER-PROCS
@@ -378,7 +378,7 @@
if(open || !locked) //Open and unlocked, no need to escape
open = 1
return
user.next_move = world.time + 100
user.changeNext_move(100)
user.last_special = world.time + 100
user << "<span class='notice'>You lean on the back of [src] and start pushing the door open. (this will take about [breakout_time] minutes.)</span>"
user.visible_message("<span class='warning'>You hear a metallic creaking from [src]!</span>")
+1 -1
View File
@@ -111,7 +111,7 @@ var/list/blob_nodes = list()
if(B)
B.max_occurrences = 0 // disable the event
else
error("Events variable is null in blob gamemode post setup.")
ERROR("Events variable is null in blob gamemode post setup.")
spawn(10)
start_state = new /datum/station_state()
+3 -1
View File
@@ -150,6 +150,7 @@
/obj/effect/blob/attackby(var/obj/item/weapon/W, var/mob/user)
user.changeNext_move(8)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
src.visible_message("<span class='danger'>The [src.name] has been attacked with \the [W][(user ? " by [user]." : ".")]!</span>")
var/damage = 0
@@ -166,6 +167,7 @@
return
/obj/effect/blob/attack_animal(mob/living/simple_animal/M as mob)
M.changeNext_move(8)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
src.visible_message("<span class='danger'>The [src.name] has been attacked by \the [M]!</span>")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
@@ -178,7 +180,7 @@
/obj/effect/blob/proc/change_to(var/type)
if(!ispath(type))
error("[type] is an invalid type for the blob.")
ERROR("[type] is an invalid type for the blob.")
new type(src.loc)
qdel(src)
@@ -42,9 +42,15 @@
return //sanity check as AStar is still throwing insane stunts
if(!AStar(user.loc, target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, user.mind.changeling.sting_range))
return //hope this ancient magic still works
if(target.mind && target.mind.changeling)
sting_feedback(user,target)
take_chemical_cost(user.mind.changeling)
return
return 1
/obj/effect/proc_holder/changeling/sting/sting_feedback(var/mob/user, var/mob/target)
if(!target)
return
user << "<span class='notice'>We stealthily sting [target.name].</span>"
if(target.mind && target.mind.changeling)
target << "<span class='warning'>You feel a tiny prick.</span>"
@@ -61,13 +67,17 @@
dna_cost = 1
var/datum/dna/selected_dna = null
/obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target)
if(!..())
return
/obj/effect/proc_holder/changeling/sting/transformation/Click()
var/mob/user = usr
var/datum/changeling/changeling = user.mind.changeling
selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
if(!selected_dna)
return
..()
/obj/effect/proc_holder/changeling/sting/transformation/can_sting(var/mob/user, var/mob/target)
if(!..())
return
if((HUSK in target.mutations) || !check_dna_integrity(target))
user << "<span class='warning'>Our sting appears ineffective against its DNA.</span>"
return 0
@@ -76,6 +86,8 @@
/obj/effect/proc_holder/changeling/sting/transformation/sting_action(var/mob/user, var/mob/target)
add_logs(user, target, "stung", object="transformation sting", addition=" new identity is [selected_dna.real_name]")
var/datum/dna/NewDNA = selected_dna
if(ismonkey(target))
user << "<span class='notice'>We stealthily sting [target.name].</span>"
hardset_dna(target, NewDNA.uni_identity, NewDNA.struc_enzymes, NewDNA.real_name, NewDNA.mutantrace, NewDNA.blood_type)
updateappearance(target)
feedback_add_details("changeling_powers","TS")
+34 -26
View File
@@ -4,6 +4,8 @@
var/list/datum/mind/cult = list()
var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
var/list/grantwords = list("travel", "see", "hell", "tech", "destroy", "other", "hide")
var/list/cult_objectives = list()
/proc/iscultist(mob/living/M as mob)
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
@@ -13,6 +15,8 @@
if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0
if(isloyal(mind.current))
return 0
if (ticker.mode.name == "cult") //redundent?
if(mind.current == ticker.mode.sacrifice_target) return 0
return 1
@@ -20,16 +24,15 @@
name = "cult"
config_tag = "cult"
antag_flag = BE_CULTIST
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain")
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
protected_jobs = list()
required_players = 15
required_enemies = 3
recommended_enemies = 4
required_players = 20
required_enemies = 6
recommended_enemies = 6
uplink_welcome = "Nar-Sie Uplink Console:"
uplink_uses = 10
var/datum/mind/sacrifice_target = null
var/finished = 0
var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds)
var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds)
@@ -37,11 +40,9 @@
var/list/startwords = list("blood","join","self","hell")
var/list/secondwords = list("travel", "see", "tech", "destroy", "other", "hide")
var/list/objectives = list()
var/eldergod = 1 //for the summon god objective
var/const/acolytes_needed = 5 //for the survive objective
var/acolytes_needed = 10 //for the survive objective
var/acolytes_survived = 0
@@ -52,11 +53,15 @@
/datum/game_mode/cult/pre_setup()
if(prob(50))
objectives += "survive"
objectives += "sacrifice"
cult_objectives += "survive"
cult_objectives += "sacrifice"
else
objectives += "eldergod"
objectives += "sacrifice"
cult_objectives += "eldergod"
cult_objectives += "sacrifice"
if(num_players() >= 30)
recommended_enemies = 9 // 3+3+3 - d' magic number o' magic numbars mon
acolytes_needed = 15
if(config.protect_roles_from_antagonist)
restricted_jobs += protected_jobs
@@ -79,7 +84,7 @@
/datum/game_mode/cult/post_setup()
modePlayer += cult
if("sacrifice" in objectives)
if("sacrifice" in cult_objectives)
var/list/possible_targets = get_unconvertables()
if(!possible_targets.len)
@@ -110,9 +115,9 @@
/datum/game_mode/cult/proc/memorize_cult_objectives(var/datum/mind/cult_mind)
for(var/obj_count = 1,obj_count <= objectives.len,obj_count++)
for(var/obj_count = 1,obj_count <= cult_objectives.len,obj_count++)
var/explanation
switch(objectives[obj_count])
switch(cult_objectives[obj_count])
if("survive")
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
if("sacrifice")
@@ -124,11 +129,12 @@
explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
cult_mind.current << "The Geometer of Blood grants you the knowledge to convert non-believers. (Join Blood Self)"
cult_mind.memory += "The Geometer of Blood grants you the knowledge to convert non-believers. (Join Blood Self)<BR>"
grant_runeword(cult_mind.current,"join")
grant_runeword(cult_mind.current,"blood")
grant_runeword(cult_mind.current,"self")
cult_mind.current << "The Geometer of Blood grants you the knowledge to sacrifice non-believers. (Hell Blood Join)"
cult_mind.memory += "The Geometer of Blood grants you the knowledge to sacrifice non-believers. (Hell Blood Join)<BR>"
for(var/startingword in startwords)
grant_runeword(cult_mind.current,startingword)
// grant_runeword(cult_mind.current,"blood")
// grant_runeword(cult_mind.current,"hell")
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
if(!istype(mob))
@@ -214,6 +220,7 @@
return 0
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
cult += cult_mind
cult_mind.current.cult_add_comm()
update_cult_icons_added(cult_mind)
cult_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has been converted to the cult!</font>"
return 1
@@ -228,6 +235,7 @@
/datum/game_mode/proc/remove_cultist(datum/mind/cult_mind, show_message = 1)
if(cult_mind in cult)
cult -= cult_mind
cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm
cult_mind.current << "\red <FONT size = 3><B>An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.</B></FONT>"
cult_mind.memory = ""
cult_mind.cult_words = initial(cult_mind.cult_words)
@@ -294,11 +302,11 @@
/datum/game_mode/cult/proc/check_cult_victory()
var/cult_fail = 0
if(objectives.Find("survive"))
if(cult_objectives.Find("survive"))
cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise
if(objectives.Find("eldergod"))
if(cult_objectives.Find("eldergod"))
cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
if(objectives.Find("sacrifice"))
if(cult_objectives.Find("sacrifice"))
if(sacrifice_target && !sacrificed.Find(sacrifice_target)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail
cult_fail++
@@ -331,11 +339,11 @@
var/text = "<b>Cultists escaped:</b> [acolytes_survived]"
if(objectives.len)
if(cult_objectives.len)
text += "<br><b>The cultists' objectives were:</b>"
for(var/obj_count=1, obj_count <= objectives.len, obj_count++)
for(var/obj_count=1, obj_count <= cult_objectives.len, obj_count++)
var/explanation
switch(objectives[obj_count])
switch(cult_objectives[obj_count])
if("survive")
if(!check_survive())
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. <font color='green'><B>Success!</B></font>"
+160 -86
View File
@@ -24,6 +24,51 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
runerandom()
usr << "[wordtravel] is travel, [wordblood] is blood, [wordjoin] is join, [wordhell] is Hell, [worddestr] is destroy, [wordtech] is technology, [wordself] is self, [wordsee] is see, [wordother] is other, [wordhide] is hide."
/mob/proc/cult_add_comm()
verbs += /mob/living/proc/cult_innate_comm
/mob/living/proc/cult_innate_comm()
set category = "Cultist"
set name = "Communicate"
#define CHECK_STATUS (usr.stat || usr.restrained() || usr.paralysis || usr.stunned || usr.weakened)
if(!iscultist(usr)) //they shouldn't have this verb, but just to be sure...
return
if(CHECK_STATUS)
return //dead men tell no tales
var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")
if(!input) // TO-DO: Add some kind of filter to corrupt the inputted text
return
if(ishuman(usr) || ismonkey(usr)) //Damage only applies to humans and monkeys, to allow constructs to communicate
usr.visible_message("<span class='warning'>[usr.name] starts clawing at his arms like a mad man!")
apply_damage(25,BRUTE, "l_arm")
apply_damage(25,BRUTE, "r_arm")
sleep(50)
if(CHECK_STATUS)
return //Hard to drawn intrinsic symbols when you're bleeding out in your cell.
var/turf/location = loc
if(istype(location, /turf/simulated)) // tearing your arms apart is going to spill a bit of blood, in fact thats the idea
location.add_blood(usr) // TO-DO change this to a badly drawn rune
apply_damage(15,BRUTE, "l_arm") // does a metric fuck ton of damage because this meant to be an emergency method of communication.
apply_damage(15,BRUTE, "r_arm")
if(CHECK_STATUS)
return //dead men tell no tales
usr.visible_message("<span class='warning'>[usr.name] paints strange symbols with their own blood")
sleep(20)
usr.say("O bidai nabora se[pick("'","`")]sma!")
sleep(10)
usr.say("[input]")
for(var/datum/mind/H in ticker.mode.cult)
if (H.current)
H.current << "\red \b [input]"
return
#undef CHECK_STATUS
/proc/runerandom() //randomizes word meaning
var/list/runewords=list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri") ///"orkan" and "allaq" removed.
@@ -134,7 +179,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
return
attack_hand(mob/living/user as mob)
attack_hand(mob/living/user as mob) // OH GOD this is horrible
if(!iscultist(user))
user << "<span class='notice'>You can't mouth the arcane scratchings without fumbling over them.</span>"
return
@@ -193,6 +238,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
return itemport(src.word3)
if(word1 == wordjoin && word2 == wordhide && word3 == wordtech)
return runestun()
if(word1 == wordtravel && word2 == wordhell && word3 == wordtech)
return summon_shell()
else
user.take_overall_damage(30, 0)
user << "\red You feel the life draining from you, as if Lord Nar-Sie is displeased with you."
@@ -311,6 +358,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/tomedat = ""
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
tomedat = {"<html>
<head>
<style>
@@ -416,6 +464,11 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
switch(href_list["action"])
if("clear")
words[words[number]] = words[number]
if("read")
if(usr.get_active_hand() != src)
return
usr << browse("[tomedat]", "window=Arcane Tome")
return
if("change")
words[words[number]] = input("Enter the translation for [words[number]]", "Word notes") in engwords
for (var/entry in words)
@@ -473,6 +526,11 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
if(!iscultist(user))
return ..()
if(iscultist(M))
if(M.reagents && M.reagents.has_reagent("holywater")) //allows cultists to be rescued from the clutches of ordained religion
user << "\blue You remove the taint from [M]."
var/holy2unholy = M.reagents.get_reagent_amount("holywater")
M.reagents.del_reagent("holywater")
M.reagents.add_reagent("unholywater",holy2unholy)
return
M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit
for(var/mob/O in viewers(M, null))
@@ -502,113 +560,123 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
return
else
switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
switch(alert("You open the tome",,"Commune","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
if("Cancel")
return
if("Read it")
if("Commune")
if(usr.get_active_hand() != src)
return
user << browse("[tomedat]", "window=Arcane Tome")
var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")
if(!input)
return
usr.whisper("O bidai nabora se[pick("'","`")]sma!")
usr.whisper("[input]")
for(var/datum/mind/H in ticker.mode.cult)
if (H.current)
H.current << "\red \b [input]"
return
if("Notes")
if(usr.get_active_hand() != src)
return
notedat = {"
<br><b>Word translation notes</b> <br>
[words[1]] is <a href='byond://?src=\ref[src];number=1;action=change'>[words[words[1]]]</A> <A href='byond://?src=\ref[src];number=1;action=clear'>Clear</A><BR>
[words[2]] is <A href='byond://?src=\ref[src];number=2;action=change'>[words[words[2]]]</A> <A href='byond://?src=\ref[src];number=2;action=clear'>Clear</A><BR>
[words[3]] is <a href='byond://?src=\ref[src];number=3;action=change'>[words[words[3]]]</A> <A href='byond://?src=\ref[src];number=3;action=clear'>Clear</A><BR>
[words[4]] is <a href='byond://?src=\ref[src];number=4;action=change'>[words[words[4]]]</A> <A href='byond://?src=\ref[src];number=4;action=clear'>Clear</A><BR>
[words[5]] is <a href='byond://?src=\ref[src];number=5;action=change'>[words[words[5]]]</A> <A href='byond://?src=\ref[src];number=5;action=clear'>Clear</A><BR>
[words[6]] is <a href='byond://?src=\ref[src];number=6;action=change'>[words[words[6]]]</A> <A href='byond://?src=\ref[src];number=6;action=clear'>Clear</A><BR>
[words[7]] is <a href='byond://?src=\ref[src];number=7;action=change'>[words[words[7]]]</A> <A href='byond://?src=\ref[src];number=7;action=clear'>Clear</A><BR>
[words[8]] is <a href='byond://?src=\ref[src];number=8;action=change'>[words[words[8]]]</A> <A href='byond://?src=\ref[src];number=8;action=clear'>Clear</A><BR>
[words[9]] is <a href='byond://?src=\ref[src];number=9;action=change'>[words[words[9]]]</A> <A href='byond://?src=\ref[src];number=9;action=clear'>Clear</A><BR>
[words[10]] is <a href='byond://?src=\ref[src];number=10;action=change'>[words[words[10]]]</A> <A href='byond://?src=\ref[src];number=10;action=clear'>Clear</A><BR>
"}
<a href='byond://?src=\ref[src];action=read'>Read the Arcane Tome.</A></BR>
<br><b>Word translation notes</b> <br>
[words[1]] is <a href='byond://?src=\ref[src];number=1;action=change'>[words[words[1]]]</A> <A href='byond://?src=\ref[src];number=1;action=clear'>Clear</A><BR>
[words[2]] is <A href='byond://?src=\ref[src];number=2;action=change'>[words[words[2]]]</A> <A href='byond://?src=\ref[src];number=2;action=clear'>Clear</A><BR>
[words[3]] is <a href='byond://?src=\ref[src];number=3;action=change'>[words[words[3]]]</A> <A href='byond://?src=\ref[src];number=3;action=clear'>Clear</A><BR>
[words[4]] is <a href='byond://?src=\ref[src];number=4;action=change'>[words[words[4]]]</A> <A href='byond://?src=\ref[src];number=4;action=clear'>Clear</A><BR>
[words[5]] is <a href='byond://?src=\ref[src];number=5;action=change'>[words[words[5]]]</A> <A href='byond://?src=\ref[src];number=5;action=clear'>Clear</A><BR>
[words[6]] is <a href='byond://?src=\ref[src];number=6;action=change'>[words[words[6]]]</A> <A href='byond://?src=\ref[src];number=6;action=clear'>Clear</A><BR>
[words[7]] is <a href='byond://?src=\ref[src];number=7;action=change'>[words[words[7]]]</A> <A href='byond://?src=\ref[src];number=7;action=clear'>Clear</A><BR>
[words[8]] is <a href='byond://?src=\ref[src];number=8;action=change'>[words[words[8]]]</A> <A href='byond://?src=\ref[src];number=8;action=clear'>Clear</A><BR>
[words[9]] is <a href='byond://?src=\ref[src];number=9;action=change'>[words[words[9]]]</A> <A href='byond://?src=\ref[src];number=9;action=clear'>Clear</A><BR>
[words[10]] is <a href='byond://?src=\ref[src];number=10;action=change'>[words[words[10]]]</A> <A href='byond://?src=\ref[src];number=10;action=clear'>Clear</A><BR>
"} // whoever screwed the tabbing on this originally is an asshole.
// call(/obj/item/weapon/tome/proc/edit_notes)()
user << browse("[notedat]", "window=notes")
return
if(usr.get_active_hand() != src)
return
if("Scribe a rune") //fixed more assbackward tabbing
if(usr.get_active_hand() != src)
return
var/list/dictionary = list(
"convert" = list("join","blood","self"),
"wall" = list("destroy","travel","self"),
"blood boil" = list("destroy","see","blood"),
"blood drain" = list("travel","blood","self"),
"raise dead" = list("blood","join","hell"),
"summon narsie" = list("hell","join","self"),
"communicate" = list("self","other","technology"),
"emp" = list("destroy","see","technology"),
"manifest" = list("blood","see","travel"),
"summon tome" = list("see","blood","hell"),
"see invisible" = list("see","hell","join"),
"hide" = list("hide","see","blood"),
"reveal" = list("blood","see","hide"),
"astral journey" = list("hell","travel","self"),
"imbue" = list("hell","technology","join"),
"sacrifice" = list("hell","blood","join"),
"summon cultist" = list("join","other","self"),
"free cultist" = list("travel","technology","other"),
"deafen" = list("hide","other","see"),
"blind" = list("destroy","see","other"),
"stun" = list("join","hide","technology"),
"armor" = list("hell","destroy","other"),
"teleport" = list("travel","self"),
"teleport other" = list("travel","other")
)
var/list/dictionary = list(
"convert" = list("join","blood","self"),
"wall" = list("destroy","travel","self"),
"blood boil" = list("destroy","see","blood"),
"blood drain" = list("travel","blood","self"),
"raise dead" = list("blood","join","hell"),
"summon narsie" = list("hell","join","self"),
"communicate" = list("self","other","technology"),
"emp" = list("destroy","see","technology"),
"manifest" = list("blood","see","travel"),
"summon tome" = list("see","blood","hell"),
"see invisible" = list("see","hell","join"),
"hide" = list("hide","see","blood"),
"reveal" = list("blood","see","hide"),
"astral journey" = list("hell","travel","self"),
"imbue" = list("hell","technology","join"),
"sacrifice" = list("hell","blood","join"),
"summon cultist" = list("join","other","self"),
"free cultist" = list("travel","technology","other"),
"deafen" = list("hide","other","see"),
"blind" = list("destroy","see","other"),
"stun" = list("join","hide","technology"),
"armor" = list("hell","destroy","other"),
"teleport" = list("travel","self"),
"teleport other" = list("travel","other"),
"summon shell" = list("travel","hell","technology")
)
var/list/scribewords = list("none")
var/list/scribewords = list("none")
var/list/english = list()
var/list/english = list()
for (var/entry in words)
if (words[entry] != entry)
english+=list(words[entry] = entry)
for (var/entry in words)
if (words[entry] != entry)
english+=list(words[entry] = entry)
for (var/entry in dictionary)
var/list/required = dictionary[entry]
if (length(english&required) == required.len)
scribewords += entry
for (var/entry in dictionary)
var/list/required = dictionary[entry]
if (length(english&required) == required.len)
scribewords += entry
var/chosen_rune = null
var/chosen_rune = null
if(usr)
chosen_rune = input ("Choose a rune to scribe.") in scribewords
if (!chosen_rune)
return
if (chosen_rune == "none")
user << "\red You decide against scribing a rune, perhaps you should take this time to study your notes."
return
if (chosen_rune == "teleport")
dictionary[chosen_rune] += input ("Choose a destination word") in english
if (chosen_rune == "teleport other")
dictionary[chosen_rune] += input ("Choose a destination word") in english
if(usr)
chosen_rune = input ("Choose a rune to scribe.") in scribewords
if (!chosen_rune)
return
if (chosen_rune == "none")
user << "\red You decide against scribing a rune, perhaps you should take this time to study your notes."
return
if (chosen_rune == "teleport")
dictionary[chosen_rune] += input ("Choose a destination word") in english
if (chosen_rune == "teleport other")
dictionary[chosen_rune] += input ("Choose a destination word") in english
if(user.get_active_hand() != src)
return
if(user.get_active_hand() != src)
return
for (var/mob/V in viewers(src))
V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2)
user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
if(do_after(user, 50))
if(usr.get_active_hand() != src)
return
var/mob/living/carbon/human/H = user
var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
user << "\red You finish drawing the arcane markings of the Geometer."
var/list/required = dictionary[chosen_rune]
R.word1 = english[required[1]]
R.word2 = english[required[2]]
R.word3 = english[required[3]]
R.check_icon()
R.blood_DNA = list()
R.blood_DNA[H.dna.unique_enzymes] = H.dna.blood_type
return
for (var/mob/V in viewers(src))
V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2)
user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
if(do_after(user, 50))
if(usr.get_active_hand() != src)
return
var/mob/living/carbon/human/H = user
var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
user << "\red You finish drawing the arcane markings of the Geometer."
var/list/required = dictionary[chosen_rune]
R.word1 = english[required[1]]
R.word2 = english[required[2]]
R.word3 = english[required[3]]
R.check_icon()
R.blood_DNA = list()
R.blood_DNA[H.dna.unique_enzymes] = H.dna.blood_type
return
else
user << "The book seems full of illegible scribbles. Is this a joke?"
return
@@ -648,7 +716,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/r
if (!istype(user.loc,/turf))
user << "\red You do not have enough space to write a proper rune."
var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun")
var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun", "summon shell")
r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable.
var/obj/effect/rune/R = new /obj/effect/rune
if(istype(user, /mob/living/carbon/human))
@@ -808,3 +876,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.word3=wordtech
R.loc = user.loc
R.check_icon()
if("summon shell")
R.word1=wordtravel
R.word2=wordhell
R.word3=wordtech
R.loc = user.loc
R.check_icon()
+111 -84
View File
@@ -99,40 +99,52 @@ var/list/sacrificed = list()
/////////////////////////////////////////THIRD RUNE
convert()
var/list/mob/living/carbon/human/cultsinrange = list()
for(var/mob/living/carbon/M in src.loc)
if(iscultist(M))
continue
if(M.stat==2)
continue
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
"\red AAAAAAHHHH!.", \
"\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind))
ticker.mode.add_cultist(M.mind)
M.mind.special_role = "Cultist"
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
//picking which word to use
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
var/convert_word
for(var/i=1, i<=3, i++)
convert_word = pick(ticker.mode.grantwords)
if(convert_word in usr.mind.cult_words)
if(i==3) convert_word = null //NOTE: If max loops is changed ensure this condition is changed to match /Mal
for(var/mob/living/carbon/C in orange(1,src))
if(iscultist(C) && !C.stat) //converting requires three cultists
cultsinrange += C
C.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
if(cultsinrange.len >= 3)
M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
"\red AAAAAAHHHH!.", \
"\red You hear an anguished scream.")
if(is_convertable_to_cult(M.mind))
ticker.mode.add_cultist(M.mind)
M.mind.special_role = "Cultist"
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"purple\"><b><i>Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back.</b></i></font>"
/* //convert no longer gives words
//picking which word to use
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
var/convert_word
for(var/i=1, i<=3, i++)
convert_word = pick(ticker.mode.grantwords)
if(convert_word in usr.mind.cult_words)
if(i==3) convert_word = null //NOTE: If max loops is changed ensure this condition is changed to match /Mal
else
break
if(!convert_word)
usr << "\red This Convert was unworthy of knowledge of the other side!"
else
break
if(!convert_word)
usr << "\red This Convert was unworthy of knowledge of the other side!"
else
usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers."
ticker.mode.grant_runeword(usr, convert_word)
return 1
usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers."
ticker.mode.grant_runeword(usr, convert_word)
return 1 */
else
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"red\"><b>And not a single fuck was given, exterminate the cult at all costs.</b></font>"
if(ticker.mode.name == "cult")
if(M.mind == ticker.mode.sacrifice_target)
for(var/mob/living/carbon/human/cultist in cultsinrange)
cultist << "<span class='h2.userdanger'>The Chosen One!! <BR>KILL THE CHOSEN ONE!!! </span>"
return 0
else
M << "<font color=\"purple\"><b><i>Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root.</b></i></font>"
M << "<font color=\"red\"><b>And not a single fuck was given, exterminate the cult at all costs.</b></font>"
return 0
for(var/mob/living/carbon/human/cultist in cultsinrange)
cultist << "<span class='warning'>You need more brothers to overcome their lies and make them see Truth. </span>"
return fizzle()
@@ -140,12 +152,21 @@ var/list/sacrificed = list()
/////////////////////////////////////////FOURTH RUNE
tearreality()
var/cultist_count = 0
var/list/mob/living/carbon/human/cultist_count = list()
for(var/mob/M in range(1,src))
if(iscultist(M) && !M.stat)
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
cultist_count += 1
if(cultist_count >= 9)
cultist_count += M
if(cultist_count.len >= 9)
if(ticker.mode.name == "cult")
if("eldergod" in ticker.mode.cult_objectives)
ticker.mode:eldergod = 0
else
message_admins("[usr.real_name]([usr.ckey]) tried to summon a god when she didn't want to come out to play.") // Admin alert because you *KNOW* dickbutts are going to abuse this.
for(var/mob/M in cultist_count)
M.reagents.add_reagent("hell_water", 10)
M << "<span class='h2.userdanger'>YOUR SOUL BURNS WITH YOUR ARROGANCE!!!</span>"
return
var/narsie_type = /obj/machinery/singularity/narsie/large
// Moves narsie if she was already summoned.
var/obj/her = locate(narsie_type, machines)
@@ -154,8 +175,6 @@ var/list/sacrificed = list()
return
// Otherwise...
new narsie_type(src.loc) // Summon her!
if(ticker.mode.name == "cult")
ticker.mode:eldergod = 0
qdel(src) // Stops cultists from spamming the rune to summon narsie more than once.
// Might actually be wise to straight up del() this
return
@@ -584,107 +603,91 @@ var/list/sacrificed = list()
if(iscultist(C) && !C.stat)
cultsinrange += C
C.say("Barhah hra zar[pick("'","`")]garis!")
if(cultsinrange.len >= 3) break //we only need to check for three alive cultists, loop breaks so their aren't extra cultists getting word rewards
for(var/mob/H in victims)
if (ticker.mode.name == "cult")
if(H.mind == ticker.mode:sacrifice_target)
if(cultsinrange.len >= 3)
sacrificed += H.mind
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
usr << "\red He is pleased!"
sac_grant_word()
sac_grant_word()
sac_grant_word() //Little reward for completing the objective
stone_or_gib(H)
for(var/mob/living/carbon/C in cultsinrange)
C << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
C << "\red He is pleased!"
sac_grant_word(C)
sac_grant_word(C)
sac_grant_word(C) //Little reward for completing the objective
else
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
else
if(cultsinrange.len >= 3)
if(H.stat !=2)
usr << "\red The Geometer of Blood accepts this sacrifice."
sac_grant_word()
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
for(var/mob/living/carbon/C in cultsinrange)
C << "\red The Geometer of Blood accepts this sacrifice."
sac_grant_word(C)
stone_or_gib(H)
else
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
sac_grant_word()
sac_grant_word(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
stone_or_gib(H)
else
if(H.stat !=2)
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
sac_grant_word()
sac_grant_word(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
stone_or_gib(H)
else
if(cultsinrange.len >= 3)
if(H.stat !=2)
usr << "\red The Geometer of Blood accepts this sacrifice."
sac_grant_word()
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
for(var/mob/living/carbon/C in cultsinrange)
C << "\red The Geometer of Blood accepts this sacrifice."
sac_grant_word(C)
stone_or_gib(H)
else
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
sac_grant_word()
sac_grant_word(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
stone_or_gib(H)
else
if(H.stat !=2)
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else
if(prob(60))
usr << "\red The Geometer of blood accepts this sacrifice."
sac_grant_word()
sac_grant_word(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
stone_or_gib(H)
for(var/mob/living/carbon/monkey/M in src.loc)
if (ticker.mode.name == "cult")
if(M.mind == ticker.mode:sacrifice_target)
if(cultsinrange.len >= 3)
sacrificed += M.mind
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
usr << "\red He is pleased!"
sac_grant_word()
sac_grant_word()
sac_grant_word() //Little reward for completing the objective
for(var/mob/living/carbon/C in cultsinrange)
C << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
C << "\red He is pleased!"
sac_grant_word(C)
sac_grant_word(C)
sac_grant_word(C) //Little reward for completing the objective
else
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
continue
else
if(prob(30))
usr << "\red The Geometer of Blood accepts your meager sacrifice."
sac_grant_word()
sac_grant_word(usr)
else
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere monkey is not enough to satisfy Him."
@@ -692,7 +695,9 @@ var/list/sacrificed = list()
usr << "\red The Geometer of Blood accepts your meager sacrifice."
if(prob(30))
ticker.mode.grant_runeword(usr)
M.gib()
stone_or_gib(M)
for(var/mob/victim in src.loc) //TO-DO: Move the shite above into the mob's own sac_act - see /mob/living/simple_animal/corgi/sac_act for an example
victim.sac_act(src, victim) //Sacrifice procs are now seperate per mob, this allows us to allow sacrifice on as many mob types as we want without making an already clunky system worse
/* for(var/mob/living/carbon/alien/A)
for(var/mob/K in cultsinrange)
K.say("Barhah hra zar'garis!")
@@ -709,12 +714,22 @@ var/list/sacrificed = list()
return
return fizzle() */
sac_grant_word() //The proc that which chooses a word rewarded for a successful sacrifice, sacrifices always give a currently unknown word if the normal checks pass
if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
sac_grant_word(var/mob/living/C) //The proc that which chooses a word rewarded for a successful sacrifice, sacrifices always give a currently unknown word if the normal checks pass
if(C.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything
var/convert_word
var/pick_list = ticker.mode.allwords - usr.mind.cult_words
var/pick_list = ticker.mode.allwords - C.mind.cult_words
convert_word = pick(pick_list)
ticker.mode.grant_runeword(usr, convert_word)
ticker.mode.grant_runeword(C, convert_word)
stone_or_gib(var/mob/T)
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
if(!stone.transfer_soul("FORCE", T, usr)) //if it fails to add soul
qdel(stone)
if(T)
if(isrobot(T))
T.dust()//To prevent the MMI from remaining
else
T.gib()
/////////////////////////////////////////SIXTEENTH RUNE
@@ -1070,3 +1085,15 @@ var/list/sacrificed = list()
qdel(src)
summon_shell() // Summons a construct shell
for(var/obj/item/stack/sheet/plasteel/PS in src.loc) //I could probably combine the amounts but I'm too lazy to compensate for others' lazyness
if(PS.amount >= 4) // may need increasing?
usr.say("Eth ra p'ni[pick("'","`")]dedo ol!") //I have no idea if these are written in a proper made up language or just Urist smacking his face on the keyboard
new /obj/structure/constructshell(src.loc)
//? PS.remove_amount(4) //TO-DO: Write a proc for removing sheets from a stack and deleting when stack is empty... why doesnt this exist yet??
PS.amount -= 4
if(PS.amount <= 0)
qdel(PS)
qdel(src)
return 1
return fizzle()
+2 -2
View File
@@ -52,7 +52,7 @@
attack(mob/living/carbon/T as mob, mob/living/user as mob)
if(iscultist(user))
if(imbue == "runestun")
user.take_organ_damage(5, 0)
user.take_organ_damage(10, 0)
call(/obj/effect/rune/proc/runestun)(T)
user.drop_item(src)
qdel(src)
@@ -130,4 +130,4 @@
/obj/item/weapon/paper/talisman/supply
imbue = "supply"
uses = 5
uses = 3
+11 -5
View File
@@ -31,6 +31,7 @@
var/uplink_welcome = "Syndicate Uplink Console:"
var/uplink_uses = 10
var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag
var/datum/mind/sacrifice_target = null
/datum/game_mode/proc/announce() //to be calles when round starts
@@ -44,12 +45,17 @@
for(var/mob/new_player/player in player_list)
if((player.client)&&(player.ready))
playerC++
if(playerC < required_players)
return 0
if(!Debug2)
if(playerC < required_players)
return 0
antag_candidates = get_players_for_role(antag_flag)
if(antag_candidates.len < required_enemies)
return 0
return 1
if(!Debug2)
if(antag_candidates.len < required_enemies)
return 0
return 1
else
world << "<span class='notice'>DEBUG: GAME STARTING WITHOUT PLAYER NUMBER CHECKS, THIS WILL PROBABLY BREAK SHIT."
return 1
///pre_setup()
+13 -9
View File
@@ -45,7 +45,7 @@ var/global/datum/controller/gameticker/ticker
if(config)
pregame_timeleft = config.lobby_countdown
else
error("configuration was null when retrieving the lobby_countdown value.")
ERROR("configuration was null when retrieving the lobby_countdown value.")
pregame_timeleft = 120
world << "<B><FONT color='blue'>Welcome to the pre-game lobby!</FONT></B>"
world << "Please, setup your character and select ready. Game will start in [pregame_timeleft] seconds"
@@ -94,12 +94,15 @@ var/global/datum/controller/gameticker/ticker
job_master.DivideOccupations() //Distribute jobs
if (!src.mode.pre_setup_before_jobs) can_continue = src.mode.pre_setup()
if(!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
job_master.ResetOccupations()
return 0
if(!Debug2)
if(!can_continue)
del(mode)
current_state = GAME_STATE_PREGAME
world << "<B>Error setting up [master_mode].</B> Reverting to pre-game lobby."
job_master.ResetOccupations()
return 0
else
world << "<span class='notice'>DEBUG: Bypassing prestart checks..."
if(hide_mode)
var/list/modes = new
@@ -139,6 +142,7 @@ var/global/datum/controller/gameticker/ticker
if(!admins.len)
send2irc("Server", "Round just started with no admins online!")
auto_toggle_ooc(0) // Turn it off
if(config.sql_enabled)
spawn(3000)
@@ -153,7 +157,7 @@ var/global/datum/controller/gameticker/ticker
//Plus it provides an easy way to make cinematics for other events. Just use this as a template
proc/station_explosion_cinematic(var/station_missed=0, var/override = null)
if( cinematic ) return //already a cinematic in progress!
auto_toggle_ooc(1) // Turn it on
//initialise our cinematic screen object
cinematic = new(src)
cinematic.icon = 'icons/effects/station_explosion.dmi'
@@ -283,7 +287,7 @@ var/global/datum/controller/gameticker/ticker
if(!mode.explosion_in_progress && mode.check_finished())
current_state = GAME_STATE_FINISHED
auto_toggle_ooc(1) // Turn it on
spawn
declare_completion()
+4 -4
View File
@@ -207,7 +207,7 @@ var/bomb_set
/obj/item/weapon/disk/nuclear/Destroy()
if(blobstart.len > 0)
var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart))
message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
..()
loc = pick(blobstart)
message_admins("[src] has been destroyed. Moving it to ([x], [y], [z]).")
log_game("[src] has been destroyed. Moving it to ([x], [y], [z]).")
return 1 // Cancel destruction.
+3 -3
View File
@@ -34,8 +34,8 @@ datum/objective_item/steal/jetpack
difficulty = 3
datum/objective_item/steal/magboots
name = "a pair of magboots"
targetitem = /obj/item/clothing/shoes/magboots
name = "the chief engineer's advanced magnetic boots"
targetitem = /obj/item/clothing/shoes/magboots/advance
difficulty = 5
excludefromjob = list("Chief Engineer")
@@ -187,4 +187,4 @@ datum/objective_item/stack/gold
datum/objective_item/stack/uranium
name = "25 refined uranium bars"
targetitem = /obj/item/stack/sheet/mineral/uranium
difficulty = 10
difficulty = 10
+2 -2
View File
@@ -195,7 +195,7 @@ datum/hSB
new/obj/item/stack/sheet/glass{amount=50}(usr.loc)
if("hsbwood")
new/obj/item/stack/sheet/wood{amount=50}(usr.loc)
new/obj/item/stack/sheet/mineral/wood{amount=50}(usr.loc)
//
// All access ID
@@ -205,7 +205,7 @@ datum/hSB
ID.registered_name = usr.real_name
ID.assignment = "Sandbox"
ID.access = get_all_accesses()
ID.name = "[ID.registered_name]'s ID Card ([ID.assignment])"
ID.update_label()
//
// RCD - starts with full clip
+1 -1
View File
@@ -35,7 +35,7 @@
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = traitor
kill_objective.target = target_list[traitor]
kill_objective.explanation_text = "Assassinate [kill_objective.target.current.real_name], the [kill_objective.target.special_role]."
kill_objective.explanation_text = "Assassinate [kill_objective.target.current.real_name], the [kill_objective.target.assigned_role], the double agent."
traitor.objectives += kill_objective
// Escape
+50 -24
View File
@@ -91,9 +91,30 @@
/obj/item/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
switch(choice)
if("FORCE")
if(!iscarbon(target)) //TO-DO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul
return 0
var/mob/living/carbon/T = target
var/obj/item/device/soulstone/C = src
if(T.client != null)
if(C.contents.len)
return 0
else
for(var/obj/item/W in T)
T.unEquip(W)
init_shade(C, T, U)
//qdel T //Gib instead
return 1
return 0
if("VICTIM")
var/mob/living/carbon/human/T = target
var/obj/item/device/soulstone/C = src
if(ticker.mode.name == "cult" && T.mind == ticker.mode:sacrifice_target)
if(iscultist(U))
U << "\red The Geometer of blood wants this mortal sacrificed with the rune."
else
U << "\red The soul stone doesn't work for no apparent reason."
return 0
if(C.imprinted != "empty")
U << "\red <b>Capture failed!</b>: \black The soul stone has already been imprinted with [C.imprinted]'s mind!"
else
@@ -108,29 +129,7 @@
else
for(var/obj/item/W in T)
T.unEquip(W)
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
T.invisibility = 101
var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = T
flick("dust-h", animation)
qdel(animation)
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
S.loc = C //put shade in stone
S.status_flags |= GODMODE //So they won't die inside the stone somehow
S.canmove = 0//Can't move out of the soul stone
S.name = "Shade of [T.real_name]"
S.real_name = "Shade of [T.real_name]"
if (T.client)
T.client.mob = S
S.cancel_camera()
C.icon_state = "soulstone2"
C.name = "Soul Stone: [S.real_name]"
S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
U << "\blue <b>Capture successful!</b>: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
C.imprinted = "[S.name]"
init_shade(C, T, U, vic = 1)
qdel(T)
if("SHADE")
var/mob/living/simple_animal/shade/T = target
@@ -150,7 +149,8 @@
T.health = T.maxHealth
C.icon_state = "soulstone2"
T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
U << "\blue <b>Capture successful!</b>: \black [T.name]'s has been recaptured and stored within the soul stone."
if(U != T)
U << "\blue <b>Capture successful!</b>: \black [T.name]'s has been recaptured and stored within the soul stone."
if("CONSTRUCT")
var/obj/structure/constructshell/T = target
var/obj/item/device/soulstone/C = src
@@ -205,3 +205,29 @@
else
U << "\red <b>Creation failed!</b>: \black The soul stone is empty! Go kill someone!"
return
obj/item/proc/init_shade(var/obj/item/device/soulstone/C, var/mob/living/carbon/human/T, var/mob/U as mob, var/vic = 0)
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
T.invisibility = 101
var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
animation.icon_state = "blank"
animation.icon = 'icons/mob/mob.dmi'
animation.master = T
flick("dust-h", animation)
qdel(animation)
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
S.loc = C //put shade in stone
S.status_flags |= GODMODE //So they won't die inside the stone somehow
S.canmove = 0//Can't move out of the soul stone
S.name = "Shade of [T.real_name]"
S.real_name = "Shade of [T.real_name]"
S.key = T.key
ticker.mode.add_cultist(S.mind,2)
S.cancel_camera()
C.icon_state = "soulstone2"
C.name = "Soul Stone: [S.real_name]"
S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs."
C.imprinted = "[S.name]"
if(vic)
U << "\blue <b>Capture successful!</b>: \black [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
+3
View File
@@ -263,8 +263,11 @@
//To batch-remove wizard spells. Linked to mind.dm.
/mob/proc/spellremove(var/mob/M as mob)
if(!mind)
return
for(var/obj/effect/proc_holder/spell/spell_to_remove in src.mind.spell_list)
qdel(spell_to_remove)
mind.spell_list -= spell_to_remove
/*Checks if the wizard can cast spells.
Made a proc so this is not repeated 14 (or more) times.*/
+3 -3
View File
@@ -215,7 +215,7 @@
if(2) //medbay
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_virology, access_surgery, access_cmo)
if(3) //research
return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_rd, access_mineral_storeroom)
return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_rd)
if(4) //engineering and maintenance
return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_tcomsat, access_ce)
if(5) //command
@@ -223,7 +223,7 @@
if(6) //station general
return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer)
if(7) //supply
return list(access_mailsorting, access_mining, access_mining_station, access_cargo, access_qm)
return list(access_mailsorting, access_mining, access_mining_station, access_mineral_storeroom, access_cargo, access_qm)
/proc/get_region_accesses_name(var/code)
switch(code)
@@ -370,7 +370,7 @@
if(access_sec_doors)
return "Brig"
if(access_mineral_storeroom)
return "Mineral Storeroom"
return "Mineral Storage"
/proc/get_centcom_access_desc(A)
switch(A)
+4 -3
View File
@@ -1,3 +1,6 @@
/*
Assistant
*/
/datum/job/assistant
title = "Assistant"
flag = ASSISTANT
@@ -10,11 +13,9 @@
access = list() //See /datum/job/assistant/get_access()
minimal_access = list() //See /datum/job/assistant/get_access()
/datum/job/assistant/equip(var/mob/living/carbon/human/H)
if(!H) return 0
/datum/job/assistant/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
return 1
/datum/job/assistant/get_access()
if(config.jobs_have_maint_access & ASSISTANTS_HAVE_MAINT_ACCESS) //Config has assistant maint access set
+53 -46
View File
@@ -1,3 +1,6 @@
/*
Captain
*/
/datum/job/captain
title = "Captain"
flag = CAPTAIN
@@ -7,42 +10,47 @@
spawn_positions = 1
supervisors = "Nanotrasen officials and Space law"
selection_color = "#ccccff"
idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
access = list() //See get_access()
minimal_access = list() //See get_access()
minimal_player_age = 14
default_id = /obj/item/weapon/card/id/gold
default_pda = /obj/item/device/pda/captain
default_headset = /obj/item/device/radio/headset/heads/captain
default_backpack = /obj/item/weapon/storage/backpack/captain
default_satchel = /obj/item/weapon/storage/backpack/satchel_cap
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/captain(H)
U.hastie = new /obj/item/clothing/tie/medal/gold/captain(U)
H.equip_to_slot_or_del(U, slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
world << "<b>[H.real_name] is the captain!</b>"
return 1
access = list() //See get_access()
minimal_access = list() //See get_access()
get_access()
return get_all_accesses()
/datum/job/captain/equip_items(var/mob/living/carbon/human/H)
var/obj/item/clothing/under/U = new /obj/item/clothing/under/rank/captain(H)
U.hastie = new /obj/item/clothing/tie/medal/gold/captain(U)
H.equip_to_slot_or_del(U, slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/capcarapace(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
//Equip ID box
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
//Implant him
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
world << "<b>[H.real_name] is the captain!</b>"
/datum/job/captain/get_access()
return get_all_accesses()
/*
Head of Personnel
*/
/datum/job/hop
title = "Head of Personnel"
flag = HOP
@@ -52,35 +60,34 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ddddff"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
minimal_player_age = 10
default_id = /obj/item/weapon/card/id/silver
default_pda = /obj/item/device/pda/heads/hop
default_headset = /obj/item/device/radio/headset/heads/hop
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom)
minimal_access = list(access_security, access_sec_doors, access_court,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hopcap(H), slot_head)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
return 1
/datum/job/hop/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hopcap(H), slot_head)
//Equip ID box
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
+193 -185
View File
@@ -1,4 +1,6 @@
//Food
/*
Bartender
*/
/datum/job/bartender
title = "Bartender"
flag = BARTENDER
@@ -8,38 +10,47 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/bar
default_headset = /obj/item/device/radio/headset/headset_srv
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue, access_mineral_storeroom)
minimal_access = list(access_bar, access_mineral_storeroom)
/datum/job/bartender/equip_backpack(var/mob/living/carbon/human/H)
switch(H.backbag)
if(1) //No backpack or satchel
equip(var/mob/living/carbon/human/H)
if(!H) return 0
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_srv(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/bar(H), slot_belt)
var/obj/item/weapon/storage/box/box = new default_storagebox(H)
new /obj/item/ammo_casing/shotgun/beanbag(box)
new /obj/item/ammo_casing/shotgun/beanbag(box)
new /obj/item/ammo_casing/shotgun/beanbag(box)
new /obj/item/ammo_casing/shotgun/beanbag(box)
H.equip_to_slot_or_del(box, slot_r_hand)
if(H.backbag == 1)
var/obj/item/weapon/storage/box/survival/Barpack = new /obj/item/weapon/storage/box/survival(H)
H.equip_to_slot_or_del(Barpack, slot_r_hand)
new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
new /obj/item/ammo_casing/shotgun/beanbag(Barpack)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
return 1
if(2) // Backpack
var/obj/item/weapon/storage/backpack/BPK = new default_backpack(H)
new default_storagebox(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
if(3) //Satchel
var/obj/item/weapon/storage/backpack/BPK = new default_satchel(H)
new default_storagebox(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
/datum/job/bartender/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
if(H.backbag != 1)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/ammo_casing/shotgun/beanbag(H), slot_in_backpack)
/*
Chef
*/
/datum/job/chef
title = "Chef"
flag = CHEF
@@ -49,22 +60,22 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/chef
default_headset = /obj/item/device/radio/headset/headset_srv
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue)
minimal_access = list(access_kitchen, access_morgue)
/datum/job/chef/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(H), slot_head)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_srv(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/device/pda/chef(H), slot_belt)
return 1
/*
Botanist
*/
/datum/job/hydro
title = "Botanist"
flag = BOTANIST
@@ -74,24 +85,23 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/botanist
default_headset = /obj/item/device/radio/headset/headset_srv
access = list(access_hydroponics, access_bar, access_kitchen, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
minimal_access = list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning.
/datum/job/hydro/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_srv(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt)
return 1
//Cargo
/*
Quartermaster
*/
/datum/job/qm
title = "Quartermaster"
flag = QUARTERMASTER
@@ -101,23 +111,22 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
default_pda = /obj/item/device/pda/quartermaster
default_headset = /obj/item/device/radio/headset/headset_cargo
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
/datum/job/qm/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/quartermaster(H), slot_belt)
// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
return 1
/*
Cargo Technician
*/
/datum/job/cargo_tech
title = "Cargo Technician"
flag = CARGOTECH
@@ -127,21 +136,20 @@
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/cargo
default_headset = /obj/item/device/radio/headset/headset_cargo
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
/datum/job/cargo_tech/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/cargo(H), slot_belt)
// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
return 1
/*
Shaft Miner
*/
/datum/job/mining
title = "Shaft Miner"
flag = MINER
@@ -151,33 +159,32 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#dddddd"
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station)
minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting)
default_pda = /obj/item/device/pda/shaftminer
default_headset = /obj/item/device/radio/headset/headset_cargo
default_backpack = /obj/item/weapon/storage/backpack/industrial
default_satchel = /obj/item/weapon/storage/backpack/satchel_eng
default_storagebox = /obj/item/weapon/storage/box/engineer
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo (H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial (H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_l_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/mining_voucher(H), slot_in_backpack)
return 1
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station, access_mineral_storeroom)
minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting, access_mineral_storeroom)
/datum/job/mining/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/mining_voucher(H), slot_r_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/mining_voucher(H), slot_in_backpack)
/*
Clown
*/
/datum/job/clown
title = "Clown"
flag = CLOWN
@@ -187,30 +194,38 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/clown
default_backpack = /obj/item/weapon/storage/backpack/clown
access = list(access_theatre, access_maint_tunnels)
minimal_access = list(access_theatre)
/datum/job/clown/equip_backpack(var/mob/living/carbon/human/H)
var/obj/item/weapon/storage/backpack/BPK = new default_backpack(H)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.fully_replace_character_name(H.real_name, pick(clown_names))
H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/clown(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/clown(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(H, 50), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/stamp/clown(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/spray/waterflower(H), slot_in_backpack)
H.mutations.Add(CLUMSY)
H.rename_self("clown")
return 1
new default_storagebox(BPK)
new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(BPK, 50)
new /obj/item/weapon/stamp/clown(BPK)
new /obj/item/weapon/reagent_containers/spray/waterflower(BPK)
H.equip_to_slot_or_del(BPK, slot_back)
/datum/job/clown/equip_items(var/mob/living/carbon/human/H)
H.fully_replace_character_name(H.real_name, pick(clown_names)) // Give him a temporary random name to prevent identity revealing
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(H), slot_r_store)
H.mutations.Add(CLUMSY)
H.rename_self("clown")
/*
Mime
*/
/datum/job/mime
title = "Mime"
flag = MIME
@@ -220,38 +235,38 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/mime
access = list(access_theatre, access_maint_tunnels)
minimal_access = list(access_theatre)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/mime(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/mime(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack)
if(H.mind)
H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)
H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mime/speak(null)
H.mind.miming = 1
H.rename_self("mime")
return 1
/datum/job/mime/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/mime(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/mime(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/head/beret(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/toy/crayon/mime(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing(H), slot_in_backpack)
if(H.mind)
H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)
H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mime/speak(null)
H.mind.miming = 1
H.rename_self("mime")
/*
Janitor
*/
/datum/job/janitor
title = "Janitor"
flag = JANITOR
@@ -261,21 +276,20 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/janitor
default_headset = /obj/item/device/radio/headset/headset_srv
access = list(access_janitor, access_maint_tunnels)
minimal_access = list(access_janitor, access_maint_tunnels)
/datum/job/janitor/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_srv(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
return 1
//More or less assistants
/*
Librarian
*/
/datum/job/librarian
title = "Librarian"
flag = LIBRARIAN
@@ -285,23 +299,22 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/librarian
access = list(access_library, access_maint_tunnels)
minimal_access = list(access_library)
/datum/job/librarian/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/librarian(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/books(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
return 1
var/global/lawyer = 0//Checks for another lawyer
/*
Lawyer
*/
/datum/job/lawyer
title = "Lawyer"
flag = LAWYER
@@ -311,29 +324,24 @@ var/global/lawyer = 0//Checks for another lawyer
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#dddddd"
var/global/lawyers = 0 //Counts lawyer amount
default_pda = /obj/item/device/pda/lawyer
default_headset = /obj/item/device/radio/headset/headset_sec
access = list(access_lawyer, access_court, access_sec_doors, access_maint_tunnels)
minimal_access = list(access_lawyer, access_court, access_sec_doors)
/datum/job/lawyer/equip_items(var/mob/living/carbon/human/H)
lawyers += 1
equip(var/mob/living/carbon/human/H)
if(!H) return 0
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
if(!lawyer)
lawyer = 1
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/bluesuit(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/lawyer/bluejacket(H), slot_wear_suit)
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/purpsuit(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/lawyer/purpjacket(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
if(lawyers%2 != 0)
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/bluesuit(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/lawyer/bluejacket(H), slot_wear_suit)
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/purpsuit(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/lawyer/purpjacket(H), slot_wear_suit)
return 1
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
+123 -126
View File
@@ -1,4 +1,7 @@
//Due to how large this one is it gets its own file
/*
Chaplain
*/
/datum/job/chaplain
title = "Chaplain"
flag = CHAPLAIN
@@ -8,143 +11,137 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
default_pda = /obj/item/device/pda/chaplain
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
minimal_access = list(access_morgue, access_chapel_office, access_crematorium)
//Pretty bible names
var/global/list/biblenames = list("Bible", "Quran", "Scrapbook", "Burning Bible", "Clown Bible", "Banana Bible", "Creeper Bible", "White Bible", "Holy Light", "The God Delusion", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "Melted Bible", "Necronomicon")
equip(var/mob/living/carbon/human/H)
if(!H) return 0
//Bible iconstates
var/global/list/biblestates = list("bible", "koran", "scrapbook", "burning", "honk1", "honk2", "creeper", "white", "holylight", "atheist", "tome", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon")
var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible/booze(H)
H.equip_to_slot_or_del(B, slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/chaplain(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
spawn(0)
var/religion_name = "Christianity"
var/new_religion = copytext(sanitize(input(H, "You are the Chaplain. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)),1,MAX_NAME_LEN)
//Bible itemstates
var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "bible", "bible", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "syringe_kit", "kingyellow", "ithaqua", "scientology", "melted", "necronomicon")
if (!new_religion)
new_religion = religion_name
/datum/job/chaplain/proc/setupbiblespecifics(var/obj/item/weapon/storage/bible/B, var/mob/living/carbon/human/H)
switch(B.icon_state)
if("honk1","honk2")
new /obj/item/weapon/grown/bananapeel(B)
new /obj/item/weapon/grown/bananapeel(B)
switch(lowertext(new_religion))
if("christianity")
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
if("satanism")
B.name = "The Unholy Bible"
if("cthulu")
B.name = "The Necronomicon"
if("islam")
B.name = "Quran"
if("scientology")
B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
if("chaos")
B.name = "The Book of Lorgar"
if("imperium")
B.name = "Uplifting Primer"
if("toolboxia")
B.name = "Toolbox Manifesto"
if("homosexuality")
B.name = "Guys Gone Wild"
if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
H.setBrainLoss(100) // starts off retarded as fuck
if("science")
B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
else
B.name = "The Holy Book of [new_religion]"
feedback_set_details("religion_name","[new_religion]")
if(B.icon_state == "honk1")
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(H), slot_wear_mask)
spawn(1)
var/deity_name = "Space Jesus"
var/new_deity = copytext(sanitize(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name)),1,MAX_NAME_LEN)
if("bible")
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 2
if("koran")
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 4
if("scientology")
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 8
if("athiest")
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 10
if ((length(new_deity) == 0) || (new_deity == "Space Jesus") )
new_deity = deity_name
B.deity_name = new_deity
/datum/job/chaplain/Topic(href, href_list)
if(href_list["seticon"])
var/iconi = text2num(href_list["seticon"])
var/accepted = 0
var/outoftime = 0
spawn(200) // 20 seconds to choose
outoftime = 1
var/new_book_style = "Bible"
var/biblename = biblenames[iconi]
var/obj/item/weapon/storage/bible/B = locate(href_list["bible"])
while(!accepted)
if(!B) break // prevents possible runtime errors
new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon")
switch(new_book_style)
if("Koran")
B.icon_state = "koran"
B.item_state = "koran"
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 4
if("Scrapbook")
B.icon_state = "scrapbook"
B.item_state = "scrapbook"
if("Creeper")
B.icon_state = "creeper"
B.item_state = "syringe_kit"
if("White Bible")
B.icon_state = "white"
B.item_state = "syringe_kit"
if("Holy Light")
B.icon_state = "holylight"
B.item_state = "syringe_kit"
if("Athiest")
B.icon_state = "athiest"
B.item_state = "syringe_kit"
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 10
if("Tome")
B.icon_state = "tome"
B.item_state = "syringe_kit"
if("The King in Yellow")
B.icon_state = "kingyellow"
B.item_state = "kingyellow"
if("Ithaqua")
B.icon_state = "ithaqua"
B.item_state = "ithaqua"
if("Scientology")
B.icon_state = "scientology"
B.item_state = "scientology"
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 8
if("the bible melts")
B.icon_state = "melted"
B.item_state = "melted"
if("Necronomicon")
B.icon_state = "necronomicon"
B.item_state = "necronomicon"
else
// if christian bible, revert to default
B.icon_state = "bible"
B.item_state = "bible"
for(var/area/chapel/main/A in world)
for(var/turf/T in A.contents)
if(T.icon_state == "carpetsymbol")
T.dir = 2
B.icon_state = biblestates[iconi]
B.item_state = bibleitemstates[iconi]
H.update_inv_l_hand(0) // so that it updates the bible's item_state in his hand
//Set biblespecific chapels
setupbiblespecifics(B, usr)
switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
if("Yes")
accepted = 1
if("No")
if(outoftime)
H << "Welp, out of time, buddy. You're stuck. Next time choose faster."
accepted = 1
usr.put_in_hands(B) // Update inhand icon
if(ticker)
ticker.Bible_icon_state = B.icon_state
ticker.Bible_item_state = B.item_state
ticker.Bible_name = B.name
ticker.Bible_deity_name = B.deity_name
feedback_set_details("religion_deity","[new_deity]")
feedback_set_details("religion_book","[new_book_style]")
return 1
if(ticker)
ticker.Bible_icon_state = B.icon_state
ticker.Bible_item_state = B.item_state
ticker.Bible_name = B.name
feedback_set_details("religion_book","[biblename]")
usr << browse(null, "window=editicon") // Close window
/datum/job/chaplain/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible/booze(H)
spawn(0)
var/religion_name = "Christianity"
var/new_religion = copytext(sanitize(input(H, "You are the Chaplain. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)),1,MAX_NAME_LEN)
if (!new_religion)
new_religion = religion_name
switch(lowertext(new_religion))
if("christianity")
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
if("satanism")
B.name = "The Unholy Bible"
if("cthulu")
B.name = "The Necronomicon"
if("islam")
B.name = "Quran"
if("scientology")
B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
if("chaos")
B.name = "The Book of Lorgar"
if("imperium")
B.name = "Uplifting Primer"
if("toolboxia")
B.name = "Toolbox Manifesto"
if("homosexuality")
B.name = "Guys Gone Wild"
if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
H.setBrainLoss(100) // starts off retarded as fuck
if("science")
B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
else
B.name = "The Holy Book of [new_religion]"
feedback_set_details("religion_name","[new_religion]")
spawn(1)
var/deity_name = "Space Jesus"
var/new_deity = copytext(sanitize(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name)),1,MAX_NAME_LEN)
if ((length(new_deity) == 0) || (new_deity == "Space Jesus") )
new_deity = deity_name
B.deity_name = new_deity
if(ticker)
ticker.Bible_deity_name = B.deity_name
feedback_set_details("religion_deity","[new_deity]")
//Open bible selection
var/dat = "<html><head><title>Pick Bible Style</title></head><body><center><h2>Pick a bible style</h2></center><table>"
var/i
for(i = 1, i < biblestates.len, i++)
var/icon/bibleicon = icon('icons/obj/storage.dmi', biblestates[i])
var/nicename = biblenames[i]
H << browse_rsc(bibleicon, nicename)
dat += {"<tr><td><img src="[nicename]"></td><td><a href="?src=\ref[src];seticon=[i];bible=\ref[B]">[nicename]</a></td></tr>"}
dat += "</table></body></html>"
H << browse(dat, "window=editicon;can_close=0;can_minimize=0;size=250x650")
+54 -58
View File
@@ -1,3 +1,6 @@
/*
Chief Engineer
*/
/datum/job/chief_engineer
title = "Chief Engineer"
flag = CHIEF
@@ -7,8 +10,17 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ffeeaa"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
minimal_player_age = 7
default_id = /obj/item/weapon/card/id/silver
default_pda = /obj/item/device/pda/heads/ce
default_pda_slot = slot_l_store
default_headset = /obj/item/device/radio/headset/heads/ce
default_backpack = /obj/item/weapon/storage/backpack/industrial
default_satchel = /obj/item/weapon/storage/backpack/satchel_eng
default_storagebox = /obj/item/weapon/storage/box/engineer
access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
access_heads, access_construction, access_sec_doors,
@@ -17,28 +29,17 @@
access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva,
access_heads, access_construction, access_sec_doors,
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_mineral_storeroom)
minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/ce(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial (H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
return 1
/datum/job/chief_engineer/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
/*
Station Engineer
*/
/datum/job/engineer
title = "Station Engineer"
flag = ENGINEER
@@ -48,30 +49,29 @@
spawn_positions = 5
supervisors = "the chief engineer"
selection_color = "#fff5cc"
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_tcomsat)
minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_tcomsat)
default_pda = /obj/item/device/pda/engineering
default_pda_slot = slot_l_store
default_headset = /obj/item/device/radio/headset/headset_eng
default_backpack = /obj/item/weapon/storage/backpack/industrial
default_satchel = /obj/item/weapon/storage/backpack/satchel_eng
default_storagebox = /obj/item/weapon/storage/box/engineer
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_external_airlocks, access_construction, access_atmospherics, access_tcomsat)
minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_external_airlocks, access_construction, access_tcomsat)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/device/pda/engineering(H), slot_l_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
return 1
/datum/job/engineer/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
/*
Atmospheric Technician
*/
/datum/job/atmos
title = "Atmospheric Technician"
flag = ATMOSTECH
@@ -81,22 +81,18 @@
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#fff5cc"
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
default_pda = /obj/item/device/pda/atmos
default_pda_slot = slot_l_store
default_headset = /obj/item/device/radio/headset/headset_eng
default_storagebox = /obj/item/weapon/storage/box/engineer
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels,
access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/device/analyzer(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H.back), slot_in_backpack)
return 1
/datum/job/atmos/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/analyzer(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
+55 -3
View File
@@ -29,8 +29,6 @@
//Sellection screen color
var/selection_color = "#ffffff"
//the type of the ID the player will have
var/idtype = /obj/item/weapon/card/id
//If this is set to 1, a text is printed to the player when jobs are assigned, telling him that he should let admins know that he has to disconnect.
var/req_admin_notify
@@ -38,10 +36,64 @@
//If you have the use_age_restriction_for_jobs config option enabled and the database set up, this option will add a requirement for players to be at least minimal_player_age days old. (meaning they first signed in at least that many days before.)
var/minimal_player_age = 0
//Job specific items
var/default_id = /obj/item/weapon/card/id //this is just the looks of it
var/default_pda = /obj/item/device/pda
var/default_pda_slot = slot_belt
var/default_headset = /obj/item/device/radio/headset
var/default_backpack = /obj/item/weapon/storage/backpack
var/default_satchel = /obj/item/weapon/storage/backpack/satchel_norm
var/default_storagebox= /obj/item/weapon/storage/box/survival
//Only override this proc
/datum/job/proc/equip_items(var/mob/living/carbon/human/H)
//Or this proc
/datum/job/proc/equip_backpack(var/mob/living/carbon/human/H)
switch(H.backbag)
if(1) //No backpack or satchel
H.equip_to_slot_or_del(new default_storagebox(H), slot_r_hand)
if(2) // Backpack
var/obj/item/weapon/storage/backpack/BPK = new default_backpack(H)
new default_storagebox(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
if(3) //Satchel
var/obj/item/weapon/storage/backpack/BPK = new default_satchel(H)
new default_storagebox(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
//But don't override this
/datum/job/proc/equip(var/mob/living/carbon/human/H)
return 1
if(!H)
return 0
//Equip backpack
equip_backpack(H)
//Equip the rest of the gear
equip_items(H)
//Equip ID
var/obj/item/weapon/card/id/C = new default_id(H)
C.access = get_access()
C.registered_name = H.real_name
C.assignment = H.job
C.update_label()
H.equip_to_slot_or_del(C, slot_wear_id)
//Equip PDA
var/obj/item/device/pda/PDA = new default_pda(H)
PDA.owner = H.real_name
PDA.ownjob = H.job
PDA.update_label()
H.equip_to_slot_or_del(PDA, default_pda_slot)
//Equip headset
H.equip_to_slot_or_del(new src.default_headset(H), slot_ears)
/datum/job/proc/apply_fingerprints(var/mob/living/carbon/human/H)
if(!istype(H))
return
if(H.back)
H.back.add_fingerprint(H,1) //The 1 sets a flag to ignore gloves
for(var/obj/item/I in H.back.contents)
+75 -85
View File
@@ -1,3 +1,6 @@
/*
Chief Medical Officer
*/
/datum/job/cmo
title = "Chief Medical Officer"
flag = CMO
@@ -7,35 +10,33 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ffddf0"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
access = list(access_medical, access_morgue, access_genetics, access_heads,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors)
minimal_access = list(access_medical, access_morgue, access_genetics, access_heads,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors)
minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/cmo(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/cmo(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
default_id = /obj/item/weapon/card/id/silver
default_pda = /obj/item/device/pda/heads/cmo
default_headset = /obj/item/device/radio/headset/heads/cmo
default_backpack = /obj/item/weapon/storage/backpack/medic
default_satchel = /obj/item/weapon/storage/backpack/satchel_med
access = list(access_medical, access_morgue, access_genetics, access_heads, access_mineral_storeroom,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors)
minimal_access = list(access_medical, access_morgue, access_genetics, access_heads, access_mineral_storeroom,
access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce,
access_keycard_auth, access_sec_doors)
/datum/job/cmo/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/cmo(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
/*
Medical Doctor
*/
/datum/job/doctor
title = "Medical Doctor"
flag = DOCTOR
@@ -45,30 +46,25 @@
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
default_pda = /obj/item/device/pda/medical
default_headset = /obj/item/device/radio/headset/headset_med
default_backpack = /obj/item/weapon/storage/backpack/medic
default_satchel = /obj/item/weapon/storage/backpack/satchel_med
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_morgue, access_surgery)
/datum/job/doctor/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
//Chemist is a medical job damnit //YEAH FUCK YOU SCIENCE -Pete //Guys, behave -Erro
/*
Chemist
*/
/datum/job/chemist
title = "Chemist"
flag = CHEMIST
@@ -78,21 +74,21 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
default_pda = /obj/item/device/pda/chemist
default_headset = /obj/item/device/radio/headset/headset_med
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_chemistry, access_mineral_storeroom)
/datum/job/chemist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/chemist(H), slot_wear_suit)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/chemist(H), slot_wear_suit)
return 1
/*
Geneticist
*/
/datum/job/geneticist
title = "Geneticist"
flag = GENETICIST
@@ -102,22 +98,22 @@
spawn_positions = 2
supervisors = "the chief medical officer and research director"
selection_color = "#ffeef0"
default_pda = /obj/item/device/pda/geneticist
default_headset = /obj/item/device/radio/headset/headset_medsci
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
/datum/job/geneticist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/genetics(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/genetics(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
return 1
/*
Virologist
*/
/datum/job/virologist
title = "Virologist"
flag = VIROLOGIST
@@ -127,25 +123,19 @@
spawn_positions = 1
supervisors = "the chief medical officer"
selection_color = "#ffeef0"
default_pda = /obj/item/device/pda/viro
default_headset = /obj/item/device/radio/headset/headset_med
default_backpack = /obj/item/weapon/storage/backpack/medic
default_satchel = /obj/item/weapon/storage/backpack/satchel_med
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_mineral_storeroom)
minimal_access = list(access_medical, access_virology, access_mineral_storeroom)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic (H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_med(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/viro(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/virologist(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
/datum/job/virologist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/virologist(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
+37 -42
View File
@@ -1,3 +1,6 @@
/*
Research Director
*/
/datum/job/rd
title = "Research Director"
flag = RD
@@ -7,8 +10,13 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ffddff"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
minimal_player_age = 7
default_id = /obj/item/weapon/card/id/silver
default_pda = /obj/item/device/pda/heads/rd
default_headset = /obj/item/device/radio/headset/heads/rd
access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue,
access_tox_storage, access_teleporter, access_sec_doors,
access_research, access_robotics, access_xenobiology, access_ai_upload,
@@ -19,21 +27,17 @@
access_research, access_robotics, access_xenobiology, access_ai_upload,
access_RC_announce, access_keycard_auth, access_gateway, access_mineral_storeroom,
access_tech_storage)
minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
return 1
/datum/job/rd/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
/*
Scientist
*/
/datum/job/scientist
title = "Scientist"
flag = SCIENTIST
@@ -43,23 +47,21 @@
spawn_positions = 3
supervisors = "the research director"
selection_color = "#ffeeff"
default_pda = /obj/item/device/pda/toxins
default_headset = /obj/item/device/radio/headset/headset_sci
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_mineral_storeroom)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology, access_mineral_storeroom)
/datum/job/scientist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/science(H), slot_wear_suit)
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat/science(H), slot_wear_suit)
// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask)
// H.equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(H), slot_l_hand)
return 1
/*
Roboticist
*/
/datum/job/roboticist
title = "Roboticist"
flag = ROBOTICIST
@@ -69,22 +71,15 @@
spawn_positions = 1
supervisors = "research director"
selection_color = "#ffeeff"
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_mineral_storeroom) //As a job that handles so many corpses, it makes sense for them to have morgue access.
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
default_pda = /obj/item/device/pda/roboticist
default_headset = /obj/item/device/radio/headset/headset_sci
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research, access_mineral_storeroom)
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research, access_mineral_storeroom)
/datum/job/roboticist/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/labcoat(H), slot_wear_suit)
// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
return 1
H.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(H), slot_l_hand)
+108 -103
View File
@@ -4,6 +4,9 @@
return list(access_maint_tunnels)
return list()
/*
Head of Shitcurity
*/
/datum/job/hos
title = "Head of Security"
flag = HOS
@@ -13,8 +16,15 @@
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ffdddd"
idtype = /obj/item/weapon/card/id/silver
req_admin_notify = 1
minimal_player_age = 14
default_id = /obj/item/weapon/card/id/silver
default_pda = /obj/item/device/pda/heads/hos
default_headset = /obj/item/device/radio/headset/heads/hos
default_backpack = /obj/item/weapon/storage/backpack/security
default_satchel = /obj/item/weapon/storage/backpack/satchel_sec
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
@@ -23,35 +33,28 @@
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway)
minimal_player_age = 14
equip(var/mob/living/carbon/human/H)
if(!H) return 0
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security (H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_ears)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hos(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/HoS(H), slot_head)
// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
return 1
/datum/job/hos/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/HoS(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
/*
Warden
*/
/datum/job/warden
title = "Warden"
flag = WARDEN
@@ -61,40 +64,42 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue)
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court) //But see /datum/job/warden/get_access()
minimal_player_age = 7
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/warden(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/warden(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
return 1
default_pda = /obj/item/device/pda/warden
default_headset = /obj/item/device/radio/headset/headset_sec
default_backpack = /obj/item/weapon/storage/backpack/security
default_satchel = /obj/item/weapon/storage/backpack/satchel_sec
access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_maint_tunnels, access_morgue)
minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court) //See /datum/job/warden/get_access()
/datum/job/warden/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/warden(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/warden(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
/datum/job/warden/get_access()
var/list/L = list()
L = ..() | check_config_for_sec_maint()
return L
/*
Detective
*/
/datum/job/detective
title = "Detective"
flag = DETECTIVE
@@ -104,43 +109,40 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#ffeeee"
access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
minimal_player_age = 7
default_pda = /obj/item/device/pda/detective
default_headset = /obj/item/device/radio/headset/headset_sec
equip(var/mob/living/carbon/human/H)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
CIG.light("")
H.equip_to_slot_or_del(CIG, slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(H), slot_l_store)
access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court)
if(H.backbag == 1)//Why cant some of these things spawn in his office?
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_r_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack)
/datum/job/detective/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/det_suit(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(H), slot_l_store)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
return 1
var/obj/item/clothing/mask/cigarette/cig = new /obj/item/clothing/mask/cigarette(H)
cig.light("")
H.equip_to_slot_or_del(cig, slot_wear_mask)
if(H.backbag == 1)//Why cant some of these things spawn in his office?
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_r_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/device/detective_scanner(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
/*
Security Officer
*/
/datum/job/officer
title = "Security Officer"
flag = OFFICER
@@ -150,70 +152,73 @@
spawn_positions = 5
supervisors = "the head of security, and the head of your assigned department (if applicable)"
selection_color = "#ffeeee"
minimal_player_age = 7
var/list/dep_access = null
default_pda = /obj/item/device/pda/security
default_headset = /obj/item/device/radio/headset/headset_sec
default_backpack = /obj/item/weapon/storage/backpack/security
default_satchel = /obj/item/weapon/storage/backpack/satchel_sec
access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_morgue)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court) //But see /datum/job/warden/get_access()
minimal_player_age = 7
/datum/job/officer/equip(var/mob/living/carbon/human/H)
if(!H) return 0
if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_sec(H), slot_back)
/datum/job/officer/equip_items(var/mob/living/carbon/human/H)
assign_sec_to_department(H)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_r_store)
H.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(H), slot_l_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(H), slot_in_backpack)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
L.imp_in = H
L.implanted = 1
return 1
/datum/job/officer/get_access()
var/list/L = list()
L = ..() | check_config_for_sec_maint()
if(dep_access)
L |= dep_access.Copy()
L |= ..() | check_config_for_sec_maint()
dep_access = null;
return L
var/list/sec_departments = list("engineering", "supply", "medical", "science")
/datum/job/officer/proc/assign_sec_to_department(var/mob/living/carbon/human/H)
if(!H) return 0
if(!sec_departments.len)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_ears)
else
var/department = pick(sec_departments)
sec_departments -= department
var/dep_access = null
var/destination = null
switch(department)
if("supply")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/cargo(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/supply(H), slot_ears)
default_headset = /obj/item/device/radio/headset/headset_sec/department/supply
dep_access = list(access_mailsorting, access_mining)
destination = /area/security/checkpoint/supply
if("engineering")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/engine(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/engi(H), slot_ears)
default_headset = /obj/item/device/radio/headset/headset_sec/department/engi
dep_access = list(access_construction, access_engine)
destination = /area/security/checkpoint/engineering
if("medical")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/med(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/med(H), slot_ears)
default_headset = /obj/item/device/radio/headset/headset_sec/department/med
dep_access = list(access_medical)
destination = /area/security/checkpoint/medical
if("science")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security/science(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec/department/sci(H), slot_ears)
default_headset = /obj/item/device/radio/headset/headset_sec/department/sci
dep_access = list(access_research)
destination = /area/security/checkpoint/science
var/teleport = 0
@@ -232,8 +237,8 @@ var/list/sec_departments = list("engineering", "supply", "medical", "science")
else
break
H << "<b>You have been assigned to [department]!</b>"
access += dep_access
return
/obj/item/device/radio/headset/headset_sec/department/New()
wires = new(src)
secure_radio_connections = new
+15 -12
View File
@@ -1,3 +1,6 @@
/*
AI
*/
/datum/job/ai
title = "AI"
flag = AI
@@ -10,17 +13,17 @@
req_admin_notify = 1
minimal_player_age = 30
equip(var/mob/living/carbon/human/H)
if(!H) return 0
/datum/job/ai/equip(var/mob/living/carbon/human/H)
if(!H) return 0
/datum/job/ai/config_check()
if(config && config.allow_ai)
return 1
return 0
config_check()
if(config && config.allow_ai)
return 1
return 0
/*
Cyborg
*/
/datum/job/cyborg
title = "Cyborg"
flag = CYBORG
@@ -32,6 +35,6 @@
selection_color = "#ddffdd"
minimal_player_age = 21
equip(var/mob/living/carbon/human/H)
if(!H) return 0
return 1
/datum/job/cyborg/equip(var/mob/living/carbon/human/H)
if(!H) return 0
return H.Robotize()
+319 -389
View File
@@ -9,437 +9,367 @@ var/global/datum/controller/occupations/job_master
var/list/job_debug = list()
proc/SetupOccupations(var/faction = "Station")
occupations = list()
var/list/all_jobs = typesof(/datum/job)
if(!all_jobs.len)
world << "\red \b Error setting up jobs, no job datums found"
return 0
for(var/J in all_jobs)
var/datum/job/job = new J()
if(!job) continue
if(job.faction != faction) continue
if(!job.config_check()) continue
occupations += job
return 1
proc/Debug(var/text)
if(!Debug2) return 0
job_debug.Add(text)
return 1
proc/GetJob(var/rank)
if(!rank) return null
for(var/datum/job/J in occupations)
if(!J) continue
if(J.title == rank) return J
return null
proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
if(player && player.mind && rank)
var/datum/job/job = GetJob(rank)
if(!job) return 0
if(jobban_isbanned(player, rank)) return 0
if(!job.player_old_enough(player.client)) return 0
var/position_limit = job.total_positions
if(!latejoin)
position_limit = job.spawn_positions
if((job.current_positions < position_limit) || position_limit == -1)
Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
player.mind.assigned_role = rank
unassigned -= player
job.current_positions++
return 1
Debug("AR has failed, Player: [player], Rank: [rank]")
/datum/controller/occupations/proc/SetupOccupations(var/faction = "Station")
occupations = list()
var/list/all_jobs = typesof(/datum/job)
if(!all_jobs.len)
world << "<span class='userdanger'>Error setting up jobs, no job datums found</span>"
return 0
for(var/J in all_jobs)
var/datum/job/job = new J()
if(!job) continue
if(job.faction != faction) continue
if(!job.config_check()) continue
occupations += job
proc/FindOccupationCandidates(datum/job/job, level, flag)
Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
var/list/candidates = list()
for(var/mob/new_player/player in unassigned)
if(jobban_isbanned(player, job.title))
Debug("FOC isbanned failed, Player: [player]")
continue
if(!job.player_old_enough(player.client))
Debug("FOC player not old enough, Player: [player]")
continue
if(flag && (!player.client.prefs.be_special & flag))
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
Debug("FOC pass, Player: [player], Level:[level]")
candidates += player
return candidates
proc/GiveRandomJob(var/mob/new_player/player)
Debug("GRJ Giving random job, Player: [player]")
for(var/datum/job/job in shuffle(occupations))
if(!job)
continue
if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring!
continue
if(job in command_positions) //If you want a command position, select it!
continue
if(jobban_isbanned(player, job.title))
Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
continue
if(!job.player_old_enough(player.client))
Debug("GRJ player not old enough, Player: [player]")
continue
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("GRJ Random job given, Player: [player], Job: [job]")
AssignRole(player, job.title)
unassigned -= player
break
proc/ResetOccupations()
for(var/mob/new_player/player in player_list)
if((player) && (player.mind))
player.mind.assigned_role = null
player.mind.special_role = null
SetupOccupations()
unassigned = list()
return
return 1
///This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until it locates a head or runs out of levels to check
proc/FillHeadPosition()
for(var/level = 1 to 3)
for(var/command_position in command_positions)
var/datum/job/job = GetJob(command_position)
if(!job) continue
var/list/candidates = FindOccupationCandidates(job, level)
if(!candidates.len) continue
var/mob/new_player/candidate = pick(candidates)
if(AssignRole(candidate, command_position))
return 1
return 0
/datum/controller/occupations/proc/Debug(var/text)
if(!Debug2) return 0
job_debug.Add(text)
return 1
///This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
proc/CheckHeadPositions(var/level)
/datum/controller/occupations/proc/GetJob(var/rank)
if(!rank) return null
for(var/datum/job/J in occupations)
if(!J) continue
if(J.title == rank) return J
return null
/datum/controller/occupations/proc/AssignRole(var/mob/new_player/player, var/rank, var/latejoin = 0)
Debug("Running AR, Player: [player], Rank: [rank], LJ: [latejoin]")
if(player && player.mind && rank)
var/datum/job/job = GetJob(rank)
if(!job) return 0
if(jobban_isbanned(player, rank)) return 0
if(!job.player_old_enough(player.client)) return 0
var/position_limit = job.total_positions
if(!latejoin)
position_limit = job.spawn_positions
if((job.current_positions < position_limit) || position_limit == -1)
Debug("Player: [player] is now Rank: [rank], JCP:[job.current_positions], JPL:[position_limit]")
player.mind.assigned_role = rank
unassigned -= player
job.current_positions++
return 1
Debug("AR has failed, Player: [player], Rank: [rank]")
return 0
/datum/controller/occupations/proc/FindOccupationCandidates(datum/job/job, level, flag)
Debug("Running FOC, Job: [job], Level: [level], Flag: [flag]")
var/list/candidates = list()
for(var/mob/new_player/player in unassigned)
if(jobban_isbanned(player, job.title))
Debug("FOC isbanned failed, Player: [player]")
continue
if(!job.player_old_enough(player.client))
Debug("FOC player not old enough, Player: [player]")
continue
if(flag && (!player.client.prefs.be_special & flag))
Debug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
Debug("FOC pass, Player: [player], Level:[level]")
candidates += player
return candidates
/datum/controller/occupations/proc/GiveRandomJob(var/mob/new_player/player)
Debug("GRJ Giving random job, Player: [player]")
for(var/datum/job/job in shuffle(occupations))
if(!job)
continue
if(istype(job, GetJob("Assistant"))) // We don't want to give him assistant, that's boring!
continue
if(job in command_positions) //If you want a command position, select it!
continue
if(jobban_isbanned(player, job.title))
Debug("GRJ isbanned failed, Player: [player], Job: [job.title]")
continue
if(!job.player_old_enough(player.client))
Debug("GRJ player not old enough, Player: [player]")
continue
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("GRJ Random job given, Player: [player], Job: [job]")
AssignRole(player, job.title)
unassigned -= player
break
/datum/controller/occupations/proc/ResetOccupations()
for(var/mob/new_player/player in player_list)
if((player) && (player.mind))
player.mind.assigned_role = null
player.mind.special_role = null
SetupOccupations()
unassigned = list()
return
//This proc is called before the level loop of DivideOccupations() and will try to select a head, ignoring ALL non-head preferences for every level until´
//it locates a head or runs out of levels to check
//This is basically to ensure that there's atleast a few heads in the round
/datum/controller/occupations/proc/FillHeadPosition()
for(var/level = 1 to 3)
for(var/command_position in command_positions)
var/datum/job/job = GetJob(command_position)
if(!job) continue
var/list/candidates = FindOccupationCandidates(job, level)
if(!candidates.len) continue
var/mob/new_player/candidate = pick(candidates)
AssignRole(candidate, command_position)
return
if(AssignRole(candidate, command_position))
return 1
return 0
proc/FillAIPosition()
var/ai_selected = 0
var/datum/job/job = GetJob("AI")
if(!job) return 0
if(ticker.mode.name == "AI malfunction") // malf. AIs are pre-selected before jobs
for (var/datum/mind/mAI in ticker.mode.malf_ai)
AssignRole(mAI.current, "AI")
ai_selected++
if(ai_selected) return 1
return 0
//This proc is called at the start of the level loop of DivideOccupations() and will cause head jobs to be checked before any other jobs of the same level
//This is also to ensure we get as many heads as possible
/datum/controller/occupations/proc/CheckHeadPositions(var/level)
for(var/command_position in command_positions)
var/datum/job/job = GetJob(command_position)
if(!job) continue
var/list/candidates = FindOccupationCandidates(job, level)
if(!candidates.len) continue
var/mob/new_player/candidate = pick(candidates)
AssignRole(candidate, command_position)
return
for(var/i = job.total_positions, i > 0, i--)
for(var/level = 1 to 3)
var/list/candidates = list()
candidates = FindOccupationCandidates(job, level)
if(candidates.len)
var/mob/new_player/candidate = pick(candidates)
if(AssignRole(candidate, "AI"))
ai_selected++
break
/datum/controller/occupations/proc/FillAIPosition()
var/ai_selected = 0
var/datum/job/job = GetJob("AI")
if(!job) return 0
if(ticker.mode.name == "AI malfunction") // malf. AIs are pre-selected before jobs
for (var/datum/mind/mAI in ticker.mode.malf_ai)
AssignRole(mAI.current, "AI")
ai_selected++
if(ai_selected) return 1
return 0
for(var/i = job.total_positions, i > 0, i--)
for(var/level = 1 to 3)
var/list/candidates = list()
candidates = FindOccupationCandidates(job, level)
if(candidates.len)
var/mob/new_player/candidate = pick(candidates)
if(AssignRole(candidate, "AI"))
ai_selected++
break
if(ai_selected) return 1
return 0
/** Proc DivideOccupations
* fills var "assigned_role" for all ready players.
* This proc must not have any side effect besides of modifying "assigned_role".
**/
proc/DivideOccupations()
//Setup new player list and get the jobs list
Debug("Running DO")
SetupOccupations()
/datum/controller/occupations/proc/DivideOccupations()
//Setup new player list and get the jobs list
Debug("Running DO")
SetupOccupations()
//Holder for Triumvirate is stored in the ticker, this just processes it
if(ticker)
for(var/datum/job/ai/A in occupations)
if(ticker.triai)
A.spawn_positions = 3
//Holder for Triumvirate is stored in the ticker, this just processes it
if(ticker)
for(var/datum/job/ai/A in occupations)
if(ticker.triai)
A.spawn_positions = 3
//Get the players who are ready
for(var/mob/new_player/player in player_list)
if(player.ready && player.mind && !player.mind.assigned_role)
unassigned += player
//Get the players who are ready
for(var/mob/new_player/player in player_list)
if(player.ready && player.mind && !player.mind.assigned_role)
unassigned += player
Debug("DO, Len: [unassigned.len]")
if(unassigned.len == 0) return 0
Debug("DO, Len: [unassigned.len]")
if(unassigned.len == 0) return 0
//Shuffle players and jobs
unassigned = shuffle(unassigned)
//Shuffle players and jobs
unassigned = shuffle(unassigned)
HandleFeedbackGathering()
HandleFeedbackGathering()
//People who wants to be assistants, sure, go on.
Debug("DO, Running Assistant Check 1")
var/datum/job/assist = new /datum/job/assistant()
var/list/assistant_candidates = FindOccupationCandidates(assist, 3)
Debug("AC1, Candidates: [assistant_candidates.len]")
for(var/mob/new_player/player in assistant_candidates)
Debug("AC1 pass, Player: [player]")
AssignRole(player, "Assistant")
assistant_candidates -= player
Debug("DO, AC1 end")
//People who wants to be assistants, sure, go on.
Debug("DO, Running Assistant Check 1")
var/datum/job/assist = new /datum/job/assistant()
var/list/assistant_candidates = FindOccupationCandidates(assist, 3)
Debug("AC1, Candidates: [assistant_candidates.len]")
for(var/mob/new_player/player in assistant_candidates)
Debug("AC1 pass, Player: [player]")
AssignRole(player, "Assistant")
assistant_candidates -= player
Debug("DO, AC1 end")
//Select one head
Debug("DO, Running Head Check")
FillHeadPosition()
Debug("DO, Head Check end")
//Select one head
Debug("DO, Running Head Check")
FillHeadPosition()
Debug("DO, Head Check end")
//Check for an AI
Debug("DO, Running AI Check")
FillAIPosition()
Debug("DO, AI Check end")
//Check for an AI
Debug("DO, Running AI Check")
FillAIPosition()
Debug("DO, AI Check end")
//Other jobs are now checked
Debug("DO, Running Standard Check")
//Other jobs are now checked
Debug("DO, Running Standard Check")
// New job giving system by Donkie
// This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all.
// Hopefully this will add more randomness and fairness to job giving.
// New job giving system by Donkie
// This will cause lots of more loops, but since it's only done once it shouldn't really matter much at all.
// Hopefully this will add more randomness and fairness to job giving.
// Loop through all levels from high to low
var/list/shuffledoccupations = shuffle(occupations)
for(var/level = 1 to 3)
//Check the head jobs first each level
CheckHeadPositions(level)
// Loop through all levels from high to low
var/list/shuffledoccupations = shuffle(occupations)
for(var/level = 1 to 3)
//Check the head jobs first each level
CheckHeadPositions(level)
// Loop through all unassigned players
for(var/mob/new_player/player in unassigned)
// Loop through all jobs
for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
if(!job)
continue
if(jobban_isbanned(player, job.title))
Debug("DO isbanned failed, Player: [player], Job:[job.title]")
continue
if(!job.player_old_enough(player.client))
Debug("DO player not old enough, Player: [player], Job:[job.title]")
continue
// If the player wants that job on this level, then try give it to him.
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
AssignRole(player, job.title)
unassigned -= player
break
// Hand out random jobs to the people who didn't get any in the last check
// Also makes sure that they got their preference correct
// Loop through all unassigned players
for(var/mob/new_player/player in unassigned)
if(player.client.prefs.userandomjob)
GiveRandomJob(player)
/*
Old job system
for(var/level = 1 to 3)
for(var/datum/job/job in occupations)
Debug("Checking job: [job]")
// Loop through all jobs
for(var/datum/job/job in shuffledoccupations) // SHUFFLE ME BABY
if(!job)
continue
if(!unassigned.len)
break
if((job.current_positions >= job.spawn_positions) && job.spawn_positions != -1)
continue
var/list/candidates = FindOccupationCandidates(job, level)
while(candidates.len && ((job.current_positions < job.spawn_positions) || job.spawn_positions == -1))
var/mob/new_player/candidate = pick(candidates)
Debug("Selcted: [candidate], for: [job.title]")
AssignRole(candidate, job.title)
candidates -= candidate*/
Debug("DO, Standard Check end")
Debug("DO, Running AC2")
// For those who wanted to be assistant if their preferences were filled, here you go.
for(var/mob/new_player/player in unassigned)
Debug("AC2 Assistant located, Player: [player]")
AssignRole(player, "Assistant")
return 1
proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0)
if(!H) return 0
var/datum/job/job = GetJob(rank)
H.job = rank
if(!joined_late)
var/obj/S = null
for(var/obj/effect/landmark/start/sloc in landmarks_list)
if(sloc.name != rank) continue
if(locate(/mob/living) in sloc.loc) continue
S = sloc
break
if(!S)
S = locate("start*[rank]") // use old stype
if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf))
H.loc = S.loc
if(job)
job.equip(H)
job.apply_fingerprints(H)
if(H.mind)
H.mind.assigned_role = rank
switch(rank)
if("Cyborg")
H.Robotize()
return 1
if("AI","Clown") //don't need bag preference stuff!
else
switch(H.backbag)
if(1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2)
var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(H)
new /obj/item/weapon/storage/box/survival(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
if(3)
var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel_norm(H)
new /obj/item/weapon/storage/box/survival(BPK)
H.equip_to_slot_or_del(BPK, slot_back,1)
H << "<B>You are the [rank].</B>"
H << "<b>As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>"
if(job.req_admin_notify)
H << "<b>You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.</b>"
spawnId(H,rank)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H), slot_ears)
H.update_hud() // Tmp fix for Github issue 1006. TODO: make all procs in update_icons.dm do client.screen |= equipment no matter what.
return 1
proc/spawnId(var/mob/living/carbon/human/H, rank)
if(!H) return 0
var/obj/item/weapon/card/id/C = null
var/datum/job/job = null
for(var/datum/job/J in occupations)
if(J.title == rank)
job = J
break
if(job)
if(job.title == "Cyborg")
return
else
C = new job.idtype(H)
C.access = job.get_access()
else
C = new /obj/item/weapon/card/id(H)
if(C)
C.registered_name = H.real_name
C.assignment = rank
C.name = "[C.registered_name]'s ID Card ([C.assignment])"
H.equip_to_slot_or_del(C, slot_wear_id)
/* if(prob(50))
H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_r_store)
else
H.equip_to_slot_or_del(new /obj/item/weapon/pen/blue(H), slot_r_store)*/
H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt)
if(locate(/obj/item/device/pda,H))//I bet this could just use locate. It can --SkyMarshal
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
pda.owner = H.real_name
pda.ownjob = C.assignment
pda.name = "PDA-[H.real_name] ([pda.ownjob])"
return 1
proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
if(!config.load_jobs_from_txt)
return 0
var/list/jobEntries = file2list(jobsfile)
for(var/job in jobEntries)
if(!job)
continue
job = trim(job)
if (!length(job))
continue
var/pos = findtext(job, "=")
var/name = null
var/value = null
if(pos)
name = copytext(job, 1, pos)
value = copytext(job, pos + 1)
else
continue
if(name && value)
var/datum/job/J = GetJob(name)
if(!J) continue
J.total_positions = text2num(value)
J.spawn_positions = text2num(value)
if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now
J.total_positions = 0
return 1
proc/HandleFeedbackGathering()
for(var/datum/job/job in occupations)
var/tmp_str = "|[job.title]|"
var/level1 = 0 //high
var/level2 = 0 //medium
var/level3 = 0 //low
var/level4 = 0 //never
var/level5 = 0 //banned
var/level6 = 0 //account too young
for(var/mob/new_player/player in player_list)
if(!(player.ready && player.mind && !player.mind.assigned_role))
continue //This player is not ready
if(jobban_isbanned(player, job.title))
level5++
Debug("DO isbanned failed, Player: [player], Job:[job.title]")
continue
if(!job.player_old_enough(player.client))
level6++
continue
if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
level1++
else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
level2++
else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag)
level3++
else level4++ //not selected
tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
feedback_add_details("job_preferences",tmp_str)
if(!job.player_old_enough(player.client))
Debug("DO player not old enough, Player: [player], Job:[job.title]")
continue
// If the player wants that job on this level, then try give it to him.
if(player.client.prefs.GetJobDepartment(job, level) & job.flag)
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
Debug("DO pass, Player: [player], Level:[level], Job:[job.title]")
AssignRole(player, job.title)
unassigned -= player
break
// Hand out random jobs to the people who didn't get any in the last check
// Also makes sure that they got their preference correct
for(var/mob/new_player/player in unassigned)
if(player.client.prefs.userandomjob)
GiveRandomJob(player)
Debug("DO, Standard Check end")
Debug("DO, Running AC2")
// For those who wanted to be assistant if their preferences were filled, here you go.
for(var/mob/new_player/player in unassigned)
Debug("AC2 Assistant located, Player: [player]")
AssignRole(player, "Assistant")
return 1
//Gives the player the stuff he should have with his rank
/datum/controller/occupations/proc/EquipRank(var/mob/living/H, var/rank, var/joined_late = 0)
var/datum/job/job = GetJob(rank)
H.job = rank
//If we joined at roundstart we should be positioned at our workstation
if(!joined_late)
var/obj/S = null
for(var/obj/effect/landmark/start/sloc in landmarks_list)
if(sloc.name != rank) continue
if(locate(/mob/living) in sloc.loc) continue
S = sloc
break
if(!S)
S = locate("start*[rank]") // use old stype
if(istype(S, /obj/effect/landmark/start) && istype(S.loc, /turf))
H.loc = S.loc
if(H.mind)
H.mind.assigned_role = rank
if(job)
var/new_mob = job.equip(H)
if(ismob(new_mob))
H = new_mob
job.apply_fingerprints(H)
H << "<b>You are the [rank].</b>"
H << "<b>As the [rank] you answer directly to [job.supervisors]. Special circumstances may change this.</b>"
if(job.req_admin_notify)
H << "<b>You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.</b>"
H.update_hud() // Tmp fix for Github issue 1006. TODO: make all procs in update_icons.dm do client.screen |= equipment no matter what.
return 1
/datum/controller/occupations/proc/LoadJobs(jobsfile) //ran during round setup, reads info from jobs.txt -- Urist
if(!config.load_jobs_from_txt)
return 0
var/list/jobEntries = file2list(jobsfile)
for(var/job in jobEntries)
if(!job)
continue
job = trim(job)
if (!length(job))
continue
var/pos = findtext(job, "=")
var/name = null
var/value = null
if(pos)
name = copytext(job, 1, pos)
value = copytext(job, pos + 1)
else
continue
if(name && value)
var/datum/job/J = GetJob(name)
if(!J) continue
J.total_positions = text2num(value)
J.spawn_positions = text2num(value)
if(name == "AI" || name == "Cyborg")//I dont like this here but it will do for now
J.total_positions = 0
return 1
/datum/controller/occupations/proc/HandleFeedbackGathering()
for(var/datum/job/job in occupations)
var/tmp_str = "|[job.title]|"
var/level1 = 0 //high
var/level2 = 0 //medium
var/level3 = 0 //low
var/level4 = 0 //never
var/level5 = 0 //banned
var/level6 = 0 //account too young
for(var/mob/new_player/player in player_list)
if(!(player.ready && player.mind && !player.mind.assigned_role))
continue //This player is not ready
if(jobban_isbanned(player, job.title))
level5++
continue
if(!job.player_old_enough(player.client))
level6++
continue
if(player.client.prefs.GetJobDepartment(job, 1) & job.flag)
level1++
else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag)
level2++
else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag)
level3++
else level4++ //not selected
tmp_str += "HIGH=[level1]|MEDIUM=[level2]|LOW=[level3]|NEVER=[level4]|BANNED=[level5]|YOUNG=[level6]|-"
feedback_add_details("job_preferences",tmp_str)
+13 -13
View File
@@ -58,7 +58,6 @@
var/datum/radio_frequency/radio_connection
var/locked = 1
var/datum/wires/alarm/wires = null
var/wiresexposed = 0 // If it's been screwdrivered open.
var/aidisabled = 0
var/shorted = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
@@ -126,7 +125,7 @@
if(nbuild)
buildstage = 0
wiresexposed = 1
panel_open = 1
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
@@ -185,7 +184,7 @@
popup.open()
refresh_all()
if(wiresexposed && (!istype(user, /mob/living/silicon)))
if(panel_open && (!istype(user, /mob/living/silicon)))
wires.Interact(user)
return
@@ -654,7 +653,7 @@ table tr:first-child th:first-child { border: none;}
))
/obj/machinery/alarm/update_icon()
if(wiresexposed)
if(panel_open)
switch(buildstage)
if(2)
if(wires.wires_status == (2 ** wires.wire_count) - 1) // All wires cut
@@ -777,12 +776,12 @@ table tr:first-child th:first-child { border: none;}
if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
wiresexposed = !wiresexposed
user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
panel_open = !panel_open
user << "The wires have been [panel_open ? "exposed" : "unexposed"]"
update_icon()
return
if (wiresexposed && ((istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters))))
if (panel_open && ((istype(W, /obj/item/device/multitool) || istype(W, /obj/item/weapon/wirecutters))))
return src.attack_hand(user)
else if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
if(stat & (NOPOWER|BROKEN))
@@ -927,12 +926,11 @@ FIRE ALARM
active_power_usage = 6
power_channel = ENVIRON
var/last_process = 0
var/wiresexposed = 0
var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
/obj/machinery/firealarm/update_icon()
if(wiresexposed)
if(panel_open)
switch(buildstage)
if(2)
icon_state="fire_b2"
@@ -975,11 +973,13 @@ FIRE ALARM
src.add_fingerprint(user)
if (istype(W, /obj/item/weapon/screwdriver) && buildstage == 2)
wiresexposed = !wiresexposed
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
panel_open = !panel_open
user << "The wires have been [panel_open ? "exposed" : "unexposed"]"
update_icon()
return
if(wiresexposed)
if(panel_open)
switch(buildstage)
if(2)
if (istype(W, /obj/item/device/multitool))
@@ -1171,7 +1171,7 @@ FIRE ALARM
if(building)
buildstage = 0
wiresexposed = 1
panel_open = 1
pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
@@ -1301,4 +1301,4 @@ Code shamelessly copied from apc_frame
return
for(var/area/RA in A.related)
RA.partyalert()
return
return
+54 -23
View File
@@ -1,3 +1,7 @@
/////////////////////////////////////////////////////////////
// AIR SENSOR (found in gaz tanks)
/////////////////////////////////////////////////////////////
obj/machinery/air_sensor
icon = 'icons/obj/stationobjs.dmi'
icon_state = "gsensor1"
@@ -73,6 +77,10 @@ obj/machinery/air_sensor/New()
if(radio_controller)
set_frequency(frequency)
/////////////////////////////////////////////////////////////
// GENERAL AIR CONTROL (a.k.a atmos computer)
/////////////////////////////////////////////////////////////
obj/machinery/computer/general_air_control/Destroy()
radio_controller.remove_object(src, frequency)
..()
@@ -99,21 +107,18 @@ obj/machinery/computer/general_air_control/New()
obj/machinery/computer/general_air_control/attack_hand(mob/user)
if(..(user))
return
//user << browse(return_text(),"window=computer")
user.set_machine(src)
//onclose(user, "computer")
interact(user) //UpdateDialog() is calling /interact each tick, not attack_hand()
var/datum/browser/popup = new(user, "computer", name, 465, 390)
obj/machinery/computer/general_air_control/interact(mob/user)
var/datum/browser/popup = new(user, "computer", name, 480, 490) //update the content every tick
popup.set_content(return_text())
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
obj/machinery/computer/general_air_control/interact(mob/user)
attack_hand(user)
obj/machinery/computer/general_air_control/process()
..()
src.updateDialog()
if(..()) //if the computer is not broken or unpowered
src.updateDialog()
obj/machinery/computer/general_air_control/receive_signal(datum/signal/signal)
if(!signal || signal.encryption) return
@@ -121,13 +126,14 @@ obj/machinery/computer/general_air_control/receive_signal(datum/signal/signal)
var/id_tag = signal.data["tag"]
if(!id_tag || !sensors.Find(id_tag)) return
sensor_information = list()
sensor_information[id_tag] = signal.data
obj/machinery/computer/general_air_control/proc/return_text()
var/sensor_data
var/count = 0
if(sensors.len)
sensor_data += "<TABLE cellpadding='3'><TR>" //begin the 3x2 table formatting
for(var/id_tag in sensors)
var/long_name = sensors[id_tag]
var/list/data = sensor_information[id_tag]
@@ -154,10 +160,16 @@ obj/machinery/computer/general_air_control/proc/return_text()
else
sensor_part = "<FONT class='bad'>[long_name] can not be found!</FONT><BR>"
sensor_data += sensor_part
sensor_data += "<TD valign='top'>[sensor_part]</TD>"//add the data to the current table cell
count++;
if(count == 2) //if we've put two readings on a line...
sensor_data +="</TR><TR>" //... start a new one
count = 0
sensor_data += "</TR></TABLE>" //end the table formatting
else
sensor_data = "No sensors connected."
sensor_data = "No sensors connected.<BR><BR>" // there's nothing in the sensors list (new computer), so choose between the two atmos computers
sensor_data += "<A href='?src=\ref[src];dist_loop=1'>Initialize as Distribution and Waste Monitor</A><BR>"
sensor_data += "<A href='?src=\ref[src];tank_mon=1'>Initialize as Tank Monitor</A><BR>"
var/output = {"
<h1>Sensor Data</h1>[sensor_data]"}
@@ -176,6 +188,25 @@ obj/machinery/computer/general_air_control/proc/set_frequency(new_frequency)
obj/machinery/computer/general_air_control/initialize()
set_frequency(frequency)
obj/machinery/computer/general_air_control/Topic(href, href_list)
if(..())
return
if(href_list["dist_loop"])
name = "Distribution and Waste Monitor"
set_frequency(1443)
sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")
if(href_list["tank_mon"])
name = "Tank Monitor"
set_frequency(1441)
sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")
/////////////////////////////////////////////////////////////
// LARGE TANK CONTROL
/////////////////////////////////////////////////////////////
obj/machinery/computer/general_air_control/large_tank_control
icon = 'icons/obj/computer.dmi'
icon_state = "tank"
@@ -232,9 +263,10 @@ obj/machinery/computer/general_air_control/large_tank_control/proc/reconnect(mob
obj/machinery/computer/general_air_control/large_tank_control/return_text()
var/output = "<A href='?src=\ref[src];reconnect=1'>Reconnect</A><BR>"
output += ..()
//if(signal.data)
// input_info = signal.data // Attempting to fix intake control
if(sensors.len) //if recieving signals from nearby sensors...
output += ..() //... get the data.
else
output += "No sensors connected."
output += "<h1>Tank Control System</h1>"
if(input_info)
@@ -255,12 +287,11 @@ Rate: [volume_rate] L/sec<BR>"}
output += {"<B>Output</B>: [power?("Open"):("On Hold")] <A href='?src=\ref[src];out_refresh_status=1'>Refresh</A><BR>
<B>Max Output Pressure:</B> [output_pressure] kPa<BR>"}
output += "<B>Command:</B> <A href='?src=\ref[src];out_toggle_power=1'>Toggle Power</A> <A href='?src=\ref[src];out_set_pressure=1'>Set Pressure</A><BR>"
output += "<B>Max Output Pressure Set:</B> <A href='?src=\ref[src];adj_pressure=-1000'>-</A> <A href='?src=\ref[src];adj_pressure=-100'>-</A> <A href='?src=\ref[src];adj_pressure=-10'>-</A> <A href='?src=\ref[src];adj_pressure=-1'>-</A> [pressure_setting] kPa <A href='?src=\ref[src];adj_pressure=1'>+</A> <A href='?src=\ref[src];adj_pressure=10'>+</A> <A href='?src=\ref[src];adj_pressure=100'>+</A> <A href='?src=\ref[src];adj_pressure=1000'>+</A><BR>"
else
output += "<FONT color='red'>ERROR: Can not find output port</FONT><BR>"
output += "<B>Max Output Pressure Set:</B> <A href='?src=\ref[src];adj_pressure=-1000'>-</A> <A href='?src=\ref[src];adj_pressure=-100'>-</A> <A href='?src=\ref[src];adj_pressure=-10'>-</A> <A href='?src=\ref[src];adj_pressure=-1'>-</A> [pressure_setting] kPa <A href='?src=\ref[src];adj_pressure=1'>+</A> <A href='?src=\ref[src];adj_pressure=10'>+</A> <A href='?src=\ref[src];adj_pressure=100'>+</A> <A href='?src=\ref[src];adj_pressure=1000'>+</A><BR>"
return output
obj/machinery/computer/general_air_control/large_tank_control/receive_signal(datum/signal/signal)
@@ -282,8 +313,6 @@ obj/machinery/computer/general_air_control/large_tank_control/Topic(href, href_l
if(href_list["adj_pressure"])
var/change = text2num(href_list["adj_pressure"])
pressure_setting = Clamp(pressure_setting + change, 0, 50*ONE_ATMOSPHERE)
spawn(1)
src.updateDialog()
return
if(!radio_connection)
@@ -316,8 +345,10 @@ obj/machinery/computer/general_air_control/large_tank_control/Topic(href, href_l
signal.data["sigtype"]="command"
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
spawn(5)
src.updateDialog()
/////////////////////////////////////////////////////////////
// FUEL INJECTION
/////////////////////////////////////////////////////////////
obj/machinery/computer/general_air_control/fuel_injection
icon = 'icons/obj/computer.dmi'
+35 -1
View File
@@ -48,6 +48,7 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/camera_assembly(), \
new /obj/item/newscaster_frame(), \
new /obj/item/weapon/reagent_containers/syringe(), \
new /obj/item/device/assembly/prox_sensor(), \
)
var/global/list/autolathe_recipes_hidden = list( \
@@ -198,9 +199,42 @@ var/global/list/autolathe_recipes_hidden = list( \
if(href_list["make"])
var/coeff = 2 ** prod_coeff
var/turf/T = get_step(src.loc, get_dir(src,usr))
var/obj/template = locate(href_list["make"])
// critical exploit fix start -walter0o
var/obj/item/template = null
var/attempting_to_build = locate(href_list["make"])
if(!attempting_to_build)
return
if(locate(attempting_to_build, src.L) || locate(attempting_to_build, src.LL)) // see if the requested object is in one of the construction lists, if so, it is legit -walter0o
template = attempting_to_build
else // somebody is trying to exploit, alert admins -walter0o
var/turf/LOC = get_turf(usr)
message_admins("[key_name_admin(usr)] tried to exploit an autolathe to duplicate <a href='?_src_=vars;Vars=\ref[attempting_to_build]'>[attempting_to_build]</a> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])", 0)
log_admin("EXPLOIT : [key_name(usr)] tried to exploit an autolathe to duplicate [attempting_to_build] !")
return
// now check for legit multiplier, also only stacks should pass with one to prevent raw-materials-manipulation -walter0o
var/multiplier = text2num(href_list["multiplier"])
if (!multiplier) multiplier = 1
var/max_multiplier = 1
if(istype(template, /obj/item/stack)) // stacks are the only items which can have a multiplier higher than 1 -walter0o
var/obj/item/stack/S = template
max_multiplier = min(S.max_amount, S.m_amt?round(m_amount/S.m_amt):INFINITY, S.g_amt?round(g_amount/S.g_amt):INFINITY) // pasta from regular_win() to make sure the numbers match -walter0o
if( (multiplier > max_multiplier) || (multiplier <= 0) ) // somebody is trying to exploit, alert admins-walter0o
var/turf/LOC = get_turf(usr)
message_admins("[key_name_admin(usr)] tried to exploit an autolathe with multiplier set to <u>[multiplier]</u> on <u>[template]</u> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])" , 0)
log_admin("EXPLOIT : [key_name(usr)] tried to exploit an autolathe with multiplier set to [multiplier] on [template] !")
return
var/power = max(2000, (template.m_amt+template.g_amt)*multiplier/5)
if(src.m_amount >= template.m_amt*multiplier/coeff && src.g_amount >= template.g_amt*multiplier/coeff)
busy = 1
+10 -3
View File
@@ -288,19 +288,26 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
target_types += /obj/effect/decal/cleanable/vomit
target_types += /obj/effect/decal/cleanable/robot_debris
target_types += /obj/effect/decal/cleanable/crayon
target_types += /obj/effect/decal/cleanable/molten_item
target_types += /obj/effect/decal/cleanable/tomato_smudge
target_types += /obj/effect/decal/cleanable/egg_smudge
target_types += /obj/effect/decal/cleanable/pie_smudge
target_types += /obj/effect/decal/cleanable/flour
target_types += /obj/effect/decal/cleanable/ash
target_types += /obj/effect/decal/cleanable/greenglow
target_types += /obj/effect/decal/cleanable/dirt
if(src.blood)
target_types += /obj/effect/decal/cleanable/xenoblood/
target_types += /obj/effect/decal/cleanable/xenoblood/xgibs
target_types += /obj/effect/decal/cleanable/blood/
target_types += /obj/effect/decal/cleanable/blood/gibs/
target_types += /obj/effect/decal/cleanable/dirt
target_types += /obj/effect/decal/cleanable/trail_holder
/obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target)
src.anchored = 1
src.icon_state = "cleanbot-c"
visible_message("\red [src] begins to clean up the [target]")
visible_message("\red [src] begins to clean up [target]")
src.cleaning = 1
spawn(50)
src.cleaning = 0
@@ -345,4 +352,4 @@ text("<A href='?src=\ref[src];operation=oddbutton'>[src.oddbutton ? "Yes" : "No"
return
if (!in_range(src, usr) && src.loc != usr)
return
src.created_name = t
src.created_name = t
-4
View File
@@ -231,8 +231,6 @@ Auto Patrol: []"},
continue
if (istype(C, /mob/living/carbon/human))
threatlevel = src.assess_perp(C)
else if ((istype(C, /mob/living/carbon/monkey)) && (C.client) && (ticker.mode.name == "monkey"))
threatlevel = 4
//src.speak(C.real_name + text(": threat: []", threatlevel))
if (threatlevel < 4 )
continue
@@ -638,8 +636,6 @@ Auto Patrol: []"},
if (istype(C, /mob/living/carbon/human))
src.threatlevel = src.assess_perp(C)
else if ((istype(C, /mob/living/carbon/monkey)) && (C.client) && (ticker.mode.name == "monkey"))
src.threatlevel = 4
if (!src.threatlevel)
continue
-3
View File
@@ -416,9 +416,6 @@ var/global/mulebot_count = 0
if(get_dist(C, src) > 1 || load || !on)
return
for(var/obj/structure/plasticflaps/P in src.loc)//Takes flaps into account
if(!CanPass(C,P))
return
mode = 1
// if a create, close before loading
+45 -7
View File
@@ -49,8 +49,17 @@
deactivate()
/obj/machinery/camera/Destroy()
deactivate(null, 0) //kick anyone viewing out
if(assembly)
qdel(assembly)
assembly = null
if(istype(bug))
bug.bugged_cameras -= src.c_tag
if(bug.current == src)
bug.current = null
bug = null
qdel(wires)
cameranet.removeCamera(src) //Will handle removal from the camera network and the chunks, so we don't need to worry about that
..()
/obj/machinery/camera/emp_act(severity)
@@ -113,6 +122,8 @@
deactivate(user,0)
/obj/machinery/camera/attackby(W as obj, mob/living/user as mob)
var/msg = "<span class='notice'>You attach [W] into the assembly inner circuits.</span>"
var/msg2 = "<span class='notice'>The camera already has that upgrade!</span>"
// DECONSTRUCTION
if(istype(W, /obj/item/weapon/screwdriver))
@@ -128,11 +139,38 @@
else if(istype(W, /obj/item/weapon/weldingtool) && wires.CanDeconstruct())
if(weld(W, user))
if(assembly)
assembly.loc = src.loc
assembly.state = 1
user << "You unweld the camera leaving it as just a frame screwed to the wall."
if(!assembly)
assembly = new()
assembly.loc = src.loc
assembly.state = 1
assembly.dir = src.dir
assembly.update_icon()
assembly = null
qdel(src)
return
else if(istype(W, /obj/item/device/analyzer) && panel_open) //XRay
if(!isXRay())
upgradeXRay()
qdel(W)
user << "[msg]"
else
user << "[msg2]"
else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
if(!isEmpProof())
upgradeEmpProof()
user << "[msg]"
qdel(W)
else
user << "[msg2]"
else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open)
if(!isMotion())
upgradeMotion()
user << "[msg]"
qdel(W)
else
user << "[msg2]"
// OTHER
else if ((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
@@ -193,7 +231,7 @@
status = !( src.status )
if (!(src.status))
if(user)
visible_message("\red [user] has deactivated [src]!")
visible_message("\red [user] deactivates [src]!")
add_hiddenprint(user)
else
visible_message("\red \The [src] deactivates!")
@@ -202,10 +240,10 @@
else
if(user)
visible_message("\red [user] has reactivated [src]!")
visible_message("\red [user] reactivates [src]!")
add_hiddenprint(user)
else
visible_message("\red \the [src] reactivates!")
visible_message("\red \The [src] reactivates!")
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = initial(icon_state)
@@ -289,7 +327,7 @@
return 0
// Do after stuff here
user << "<span class='notice'>You start to weld the [src]..</span>"
user << "<span class='notice'>You start to weld [src].</span>"
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
WT.eyecheck(user)
busy = 1
@@ -10,7 +10,7 @@
g_amt = 250
// Motion, EMP-Proof, X-Ray
var/list/obj/item/possible_upgrades = list(/obj/item/device/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/weapon/reagent_containers/food/snacks/grown/carrot)
var/list/obj/item/possible_upgrades = list(/obj/item/device/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/device/analyzer)
var/list/upgrades = list()
var/state = 0
var/busy = 0
@@ -48,7 +48,7 @@
else if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "You unattach the assembly from it's place."
user << "You unattach the assembly from its place."
anchored = 0
update_icon()
state = 0
@@ -66,7 +66,7 @@
else if(istype(W, /obj/item/weapon/weldingtool))
if(weld(W, user))
user << "You unweld the assembly from it's place."
user << "You unweld the assembly from its place."
state = 1
anchored = 1
return
@@ -163,4 +163,4 @@
return 0
return 1
busy = 0
return 0
return 0
+1 -1
View File
@@ -3,7 +3,7 @@
var/list/motionTargets = list()
var/detectTime = 0
var/area/ai_monitored/area_motion = null
var/alarm_delay = 100 // Don't forget, there's another 10 seconds in queueAlarm()
var/alarm_delay = 30 // Don't forget, there's another 3 seconds in queueAlarm()
/obj/machinery/camera/process()
+3 -3
View File
@@ -57,7 +57,7 @@
return O
/obj/machinery/camera/proc/isXRay()
var/O = locate(/obj/item/weapon/reagent_containers/food/snacks/grown/carrot) in assembly.upgrades
var/O = locate(/obj/item/device/analyzer) in assembly.upgrades
return O
/obj/machinery/camera/proc/isMotion()
@@ -70,8 +70,8 @@
assembly.upgrades.Add(new /obj/item/stack/sheet/mineral/plasma(assembly))
/obj/machinery/camera/proc/upgradeXRay()
assembly.upgrades.Add(new /obj/item/weapon/reagent_containers/food/snacks/grown/carrot(assembly))
assembly.upgrades.Add(new /obj/item/device/analyzer(assembly))
// If you are upgrading Motion, and it isn't in the camera's New(), add it to the machines list.
/obj/machinery/camera/proc/upgradeMotion()
assembly.upgrades.Add(new /obj/item/device/assembly/prox_sensor(assembly))
assembly.upgrades.Add(new /obj/item/device/assembly/prox_sensor(assembly))
+5 -5
View File
@@ -47,9 +47,9 @@
/obj/machinery/computer/atmos_alert/attack_hand(mob/user)
if(..(user))
return
user.set_machine(src)
//user << browse(return_text(),"window=computer")
//onclose(user, "computer")
interact(user) //UpdateDialog() is calling /interact each tick, not attack_hand()
/obj/machinery/computer/atmos_alert/interact(mob/user)
var/datum/browser/popup = new(user, "computer", name)
popup.set_content(return_text())
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
@@ -112,14 +112,14 @@
var/removing_zone = href_list["priority_clear"]
for(var/zone in priority_alarms)
if(ckey(zone) == removing_zone)
usr << "\green Priority Alert for area [] cleared."
usr << "\green Priority Alert for [format_text(zone)] cleared."
priority_alarms -= zone
if(href_list["minor_clear"])
var/removing_zone = href_list["minor_clear"]
for(var/zone in minor_alarms)
if(ckey(zone) == removing_zone)
usr << "\green Minor Alert for area [] cleared."
usr << "\green Minor Alert for [format_text(zone)] cleared."
minor_alarms -= zone
update_icon()
return
+15 -6
View File
@@ -29,7 +29,7 @@
var/frame_desc = null
/obj/item/weapon/circuitboard/large_tank_control
name = "cirquir board (Large Tank Control)"
name = "circuit board (Large Tank Control)"
build_path = /obj/machinery/computer/general_air_control/large_tank_control
origin_tech = "programming=2;engineering=3;materials=2"
/obj/item/weapon/circuitboard/turbine_computer
@@ -271,8 +271,9 @@
if(0)
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'>You start wrenching the frame into place.</span>"
if(do_after(user, 20))
user << "<span class='notice'>You wrench the frame into place.</span>"
user << "<span class='notice'>You've wrenched the frame into place.</span>"
anchored = 1
state = 1
if(istype(P, /obj/item/weapon/weldingtool))
@@ -281,17 +282,19 @@
user << "<span class='warning'>The welding tool must be on to complete this task.</span>"
return
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
user << "<span class='notice'>You start deconstructing the frame.</span>"
if(do_after(user, 20))
if(!src || !WT.isOn()) return
user << "<span class='notice'>You deconstruct the frame.</span>"
user << "<span class='notice'>You've deconstructed the frame.</span>"
var/obj/item/stack/sheet/metal/M = new (loc, 5)
M.add_fingerprint(user)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "<span class='notice'>You start to unfasten the frame.</span>"
if(do_after(user, 20))
user << "<span class='notice'>You unfasten the frame.</span>"
user << "<span class='notice'>You've unfastened the frame.</span>"
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
@@ -329,13 +332,16 @@
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "<span class='notice'>You start adding cables to the frame.</span>"
if(do_after(user, 20))
if(C && C.amount >= 5)
C.amount -= 5
if(C.amount <= 0) qdel(C)
user << "<span class='notice'>You add cables to the frame.</span>"
user << "<span class='notice'>You've added cables to the frame.</span>"
src.state = 3
src.icon_state = "3"
else
user << "<span class='warning'>You need more cable to do that.</span>"
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
@@ -349,12 +355,15 @@
if(istype(P, /obj/item/stack/sheet/glass))
if(P:amount >= 2)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user << "<span class='notice'>You start to put in the glass panel.</span>"
if(do_after(user, 20))
if(P)
P:use(2)
user << "<span class='notice'>You put in the glass panel.</span>"
user << "<span class='notice'>You've put in the glass panel.</span>"
src.state = 4
src.icon_state = "4"
else
user << "<span class='warning'>You need more glass to do that.</span>"
if(4)
if(istype(P, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+2 -2
View File
@@ -26,10 +26,10 @@
return
if (!network)
world.log << "A computer lacks a network at [x],[y],[z]."
ERROR("A computer lacks a network at [x],[y],[z].")
return
if (!(istype(network,/list)))
world.log << "The computer at [x],[y],[z] has a network that is not a list!"
ERROR("The computer at [x],[y],[z] has a network that is not a list!")
return
if(..())
+2 -2
View File
@@ -278,7 +278,7 @@
if ("modify")
if (modify)
data_core.manifest_modify(modify.registered_name, modify.assignment)
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
modify.update_label()
modify.loc = loc
modify.verb_pickup()
modify = null
@@ -408,7 +408,7 @@
P.name = "paper- 'Crew Manifest'"
printing = null
if (modify)
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
modify.update_label()
updateUsrDialog()
return
+16 -3
View File
@@ -350,6 +350,11 @@
switch(src.state)
if(STATE_DEFAULT)
if (src.authenticated)
if(emergency_shuttle.recall_count > 1)
if(emergency_shuttle.last_call_loc)
dat += "<BR>Latest emergency signal trace attempt successful.<BR>Last signal origin: <b>[format_text(emergency_shuttle.last_call_loc.name)]</b>.<BR>"
else
dat += "<BR>Latest emergency signal trace attempt failed.<BR>"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=logout'>Log Out</A> \]<BR>"
dat += "<BR><B>General Functions</B>"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=messagelist'>Message List</A> \]"
@@ -439,6 +444,12 @@
var/dat = ""
switch(src.aistate)
if(STATE_DEFAULT)
if(emergency_shuttle.recall_count > 1)
if(emergency_shuttle.last_call_loc)
dat += "<BR>Latest emergency signal trace attempt successful.<BR>Last signal origin: <b>[format_text(emergency_shuttle.last_call_loc.name)]</b>.<BR>"
else
dat += "<BR>Latest emergency signal trace attempt failed.<BR>"
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-messagelist'>Message List</A> \]"
if(emergency_shuttle.location==0 && !emergency_shuttle.online)
dat += "<BR>\[ <A HREF='?src=\ref[src];operation=ai-callshuttle'>Call Emergency Shuttle</A> \]"
@@ -519,11 +530,12 @@
user << "The emergency shuttle is already on its way."
return
var/area/signal_origin = get_area(user)
if (seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
emergency_shuttle.incall(0.6)
emergency_shuttle.incall(0.6, signal_origin)
captain_announce("The emergency shuttle has been called. Red Alert state confirmed: Dispatching priority shuttle. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
else
emergency_shuttle.incall()
emergency_shuttle.incall(1, signal_origin)
captain_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.")
log_game("[key_name(user)] has called the shuttle.")
@@ -547,7 +559,8 @@
if(emergency_shuttle.direction != -1 && emergency_shuttle.online) //check that shuttle isn't already heading to centcom
emergency_shuttle.recall()
var/area/signal_origin = get_area(user)
emergency_shuttle.recall(signal_origin)
log_game("[key_name(user)] has recalled the shuttle.")
message_admins("[key_name_admin(user)] has recalled the shuttle.", 1)
return
+3 -2
View File
@@ -95,6 +95,7 @@
/obj/machinery/computer/attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "<span class='notice'> You start to disconnect the monitor.</span>"
if(do_after(user, 20))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/M = new circuit( A )
@@ -103,12 +104,12 @@
for (var/obj/C in src)
C.loc = src.loc
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
user << "<span class='notice'> The broken glass falls out.</span>"
new /obj/item/weapon/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
user << "\blue You disconnect the monitor."
user << "<span class='notice'> You disconnect the monitor.</span>"
A.state = 4
A.icon_state = "4"
qdel(src)
+10 -10
View File
@@ -64,7 +64,7 @@ for reference:
var/maxhealth = 100.0
attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/stack/sheet/wood))
if (istype(W, /obj/item/stack/sheet/mineral/wood))
if (src.health < src.maxhealth)
visible_message("\red [user] begins to repair the [src]!")
if(do_after(user,20))
@@ -84,9 +84,9 @@ for reference:
else
if (src.health <= 0)
visible_message("\red <B>The barricade is smashed apart!</B>")
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
qdel(src)
..()
@@ -100,17 +100,17 @@ for reference:
src.health -= 25
if (src.health <= 0)
visible_message("\red <B>The barricade is blown apart!</B>")
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
qdel(src)
return
meteorhit()
visible_message("\red <B>The barricade is smashed apart!</B>")
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
new /obj/item/stack/sheet/mineral/wood(get_turf(src))
qdel(src)
return
+20 -1
View File
@@ -271,6 +271,17 @@
icon = 'icons/obj/doors/hightechsecurity.dmi'
doortype = 33
/obj/machinery/door/airlock/shuttle
name = "shuttle airlock"
icon = 'icons/obj/doors/doorshuttle.dmi'
doortype = 34
/obj/machinery/door/airlock/wood
name = "wooden airlock"
icon = 'icons/obj/doors/Doorwood.dmi'
var/mineral = "wood"
doortype = 35
/*
About the new airlock wires panel:
* An airlock wire dialog can be accessed by the normal way or by using wirecutters or a multitool on the door while the wire-panel is open. This would show the following wires, which you can either wirecut/mend or send a multitool pulse through. There are 9 wires.
@@ -935,6 +946,8 @@ About the new airlock wires panel:
if(31) new/obj/structure/door_assembly/door_assembly_science( src.loc )
if(32) new/obj/structure/door_assembly/door_assembly_science/glass( src.loc )
if(33) new/obj/structure/door_assembly/door_assembly_highsecurity(src.loc)
if(34) new/obj/structure/door_assembly/door_assembly_shuttle(src.loc)
if(35) new/obj/structure/door_assembly/door_assembly_wood(src.loc)
if(emagged)
user << "<span class='warning'>You discard the damaged electronics.</span>"
qdel(src)
@@ -944,7 +957,11 @@ About the new airlock wires panel:
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc )
ae.conf_access = src.req_access
if(req_one_access)
ae.use_one_access = 1
ae.conf_access = src.req_one_access
else
ae.conf_access = src.req_access
else
ae = electronics
electronics = null
@@ -984,6 +1001,8 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/plasma/attackby(C as obj, mob/user as mob)
if(C)
message_admins("Plasma airlock ignited by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
log_game("Plasma airlock ignited by [user.ckey]([user]) in ([x],[y],[z])")
ignite(is_hot(C))
..()
@@ -11,89 +11,106 @@
req_access = list(access_maint_tunnels)
var/list/conf_access = null
var/use_one_access = 0 //If the door should require ALL or only ONE of the listed accesses.
var/last_configurator = null
var/locked = 1
attack_self(mob/user as mob)
if (!ishuman(user))
return ..(user)
/obj/item/weapon/airlock_electronics/attack_self(mob/user as mob)
if (!ishuman(user))
return ..(user)
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 60)
return
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 60)
return
var/t1 = text("<B>Access control</B><br>\n")
var/t1 = text("")
if (last_configurator)
t1 += "Operator: [last_configurator]<br>"
if (last_configurator)
t1 += "Operator: [last_configurator]<br>"
if (locked)
t1 += "<a href='?src=\ref[src];login=1'>Swipe ID</a><hr>"
if (locked)
t1 += "<a href='?src=\ref[src];login=1'>Swipe ID</a><hr>"
else
t1 += "<a href='?src=\ref[src];logout=1'>Lock Interface</a><hr>"
if(use_one_access)
t1 += "Restriction Type: <a href='?src=\ref[src];access=one'>At least one access required</a><br>"
else
t1 += "<a href='?src=\ref[src];logout=1'>Block</a><hr>"
t1 += "Restriction Type: <a href='?src=\ref[src];access=one'>All accesses required</a><br>"
t1 += "<a href='?src=\ref[src];access=all'>Remove All</a><br>"
t1 += conf_access == null ? "<font color=red>All</font><br>" : "<a href='?src=\ref[src];access=all'>All</a><br>"
t1 += "<br>"
var/list/accesses = get_all_accesses()
for (var/acc in accesses)
var/aname = get_access_desc(acc)
if (!conf_access || !conf_access.len || !(acc in conf_access))
t1 += "<a href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
var/accesses = ""
accesses += "<div align='center'><b>Access</b></div>"
accesses += "<table style='width:100%'>"
accesses += "<tr>"
for(var/i = 1; i <= 7; i++)
accesses += "<td style='width:14%'><b>[get_region_accesses_name(i)]:</b></td>"
accesses += "</tr><tr>"
for(var/i = 1; i <= 7; i++)
accesses += "<td style='width:14%' valign='top'>"
for(var/A in get_region_accesses(i))
if(A in conf_access)
accesses += "<a href='?src=\ref[src];access=[A]'><font color=\"red\">[replacetext(get_access_desc(A), " ", "&nbsp")]</font></a> "
else
t1 += "<a style='color: red' href='?src=\ref[src];access=[acc]'>[aname]</a><br>"
accesses += "<a href='?src=\ref[src];access=[A]'>[replacetext(get_access_desc(A), " ", "&nbsp")]</a> "
accesses += "<br>"
accesses += "</td>"
accesses += "</tr></table>"
t1 += "<tt>[accesses]</tt>"
t1 += text("<p><a href='?src=\ref[];close=1'>Close</a></p>\n", src)
t1 += text("<p><a href='?src=\ref[];close=1'>Close</a></p>\n", src)
user << browse(t1, "window=airlock_electronics")
onclose(user, "airlock")
var/datum/browser/popup = new(user, "airlock_electronics", "Access Control", 900, 500)
popup.set_content(t1)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
onclose(user, "airlock")
Topic(href, href_list)
..()
if (usr.stat || usr.restrained() || !ishuman(usr))
return
if (href_list["close"])
usr << browse(null, "window=airlock")
return
/obj/item/weapon/airlock_electronics/Topic(href, href_list)
..()
if (usr.stat || usr.restrained() || !ishuman(usr))
return
if (href_list["close"])
usr << browse(null, "window=airlock")
return
if (href_list["login"])
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
if (I && src.check_access(I))
src.locked = 0
src.last_configurator = I:registered_name
if (href_list["login"])
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
if (I && src.check_access(I))
src.locked = 0
src.last_configurator = I:registered_name
if (locked)
return
if (locked)
return
if (href_list["logout"])
locked = 1
if (href_list["logout"])
locked = 1
if (href_list["access"])
toggle_access(href_list["access"])
if (href_list["access"])
toggle_access(href_list["access"])
attack_self(usr)
attack_self(usr)
proc
toggle_access(var/acc)
if (acc == "all")
/obj/item/weapon/airlock_electronics/proc/toggle_access(var/acc)
if (acc == "all")
conf_access = null
else if(acc == "one")
use_one_access = !use_one_access
else
var/req = text2num(acc)
if (conf_access == null)
conf_access = list()
if (!(req in conf_access))
conf_access += req
else
conf_access -= req
if (!conf_access.len)
conf_access = null
else
var/req = text2num(acc)
if (conf_access == null)
conf_access = list()
if (!(req in conf_access))
conf_access += req
else
conf_access -= req
if (!conf_access.len)
conf_access = null
+2
View File
@@ -157,6 +157,7 @@
if(istype(user, /mob/living/carbon/alien/humanoid) || istype(user, /mob/living/carbon/slime/))
if(src.operating)
return
user.changeNext_move(8)
src.health = max(0, src.health - 25)
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message("\red <B>[user] smashes against the [src.name].</B>")
@@ -196,6 +197,7 @@
//If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway)
if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card))
user.changeNext_move(8)
var/aforce = I.force
if(I.damtype == BRUTE || I.damtype == BURN)
src.health = max(0, src.health - aforce)
+1 -3
View File
@@ -14,9 +14,7 @@
return src.attack_hand(user)
/obj/machinery/igniter/attack_paw(mob/user as mob)
if ((ticker && ticker.mode.name == "monkey"))
return src.attack_hand(user)
return
return src.attack_hand(user)
/obj/machinery/igniter/attack_hand(mob/user as mob)
if(..())
+2 -2
View File
@@ -204,7 +204,7 @@ Class Procs:
return 1
if(usr.restrained() || usr.lying || usr.stat)
return 1
if(!(ishuman(usr) || issilicon(usr) || (ismonkey(usr) && ticker && ticker.mode.name == "monkey")))
if(!(ishuman(usr) || issilicon(usr)))
usr << "<span class='notice'>You don't have the dexterity to do this!</span>"
return 1
@@ -245,7 +245,7 @@ Class Procs:
return 1
if ( ! (istype(usr, /mob/living/carbon/human) || \
istype(usr, /mob/living/silicon) || \
istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") )
istype(usr, /mob/living/carbon/monkey)) )
usr << "<span class='danger'>You don't have the dexterity to do this!</span>"
return 1
/*
+36 -34
View File
@@ -10,6 +10,7 @@
var/backup_author =""
var/is_admin_message = 0
var/icon/img = null
var/time_stamp = ""
/datum/feed_channel
var/channel_name=""
@@ -42,6 +43,33 @@
var/list/datum/feed_channel/network_channels = list()
var/datum/feed_message/wanted_issue
/datum/feed_network/New()
CreateFeedChannel("Central Command", "Centcom Official", 1)
/datum/feed_network/proc/CreateFeedChannel(var/channel_name, var/author, var/locked, var/adminChannel = 0)
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = channel_name
newChannel.author = author
newChannel.locked = locked
newChannel.is_admin_channel = adminChannel
network_channels += newChannel
/datum/feed_network/proc/SubmitArticle(var/msg, var/author, var/channel_name, var/obj/item/weapon/photo/photo, var/adminMessage = 0)
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = author
newMsg.body = msg
newMsg.time_stamp = "[worldtime2text()]"
newMsg.is_admin_message = adminMessage
if(photo)
newMsg.img = photo.img
for(var/datum/feed_channel/FC in network_channels)
if(FC.channel_name == channel_name)
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
break
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(channel_name)
var/datum/feed_network/news_network = new /datum/feed_network //The global news-network, which is coincidentally a global list.
var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence.
@@ -89,7 +117,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
var/ispowered = 1 //starts powered, changes with power_change()
//var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
//OBSOLETE: We're now using a global news network
var/screen = 0 //Or maybe I'll make it into a list within a list afterwards... whichever I prefer, go fuck yourselves :3
var/screen = 0
// 0 = welcome screen - main menu
// 1 = view feed channels
// 2 = create feed channel
@@ -131,10 +159,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
name = "security newscaster"
securityCaster = 1
/obj/machinery/newscaster/New() //Constructor, ho~
/obj/machinery/newscaster/New()
allCasters += src
src.paper_remaining = 15 // Will probably change this to something better
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number
src.paper_remaining = 15
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
src.unit_no++
src.update_icon() //for any custom ones on the map...
..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that
@@ -335,7 +363,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(MESSAGE.img)
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author] </FONT>\] - ([MESSAGE.time_stamp])</FONT><BR>"
dat+="<BR><HR><A href='?src=\ref[src];refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];setScreen=[1]'>Back</A>"
if(10)
@@ -458,14 +486,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
popup.set_title_image(human_or_robot_user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
/*if(src.isbroken) //debugging shit
return
src.hitstaken++
if(src.hitstaken==3)
src.isbroken = 1
src.update_icon()*/
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return
@@ -484,7 +504,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
//src.update_icon()
else if(href_list["submit_new_channel"])
//var/list/existing_channels = list() //OBSOLETE
var/list/existing_authors = list()
for(var/datum/feed_channel/FC in news_network.network_channels)
//existing_channels += FC.channel_name
@@ -502,14 +521,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = src.channel_name
newChannel.author = src.scanned_user
newChannel.locked = c_locked
news_network.CreateFeedChannel(src.channel_name, src.scanned_user, c_locked)
feedback_inc("newscaster_channels",1)
/*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters.
NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE
news_network.network_channels += newChannel //Adding channel to the global network
src.screen=5
src.updateUsrDialog()
//src.update_icon()
@@ -520,7 +533,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
for(var/datum/feed_channel/F in news_network.network_channels)
if( (!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
src.channel_name = strip_html(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels
src.updateUsrDialog()
else if(href_list["set_new_message"])
@@ -537,20 +550,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" )
src.screen=6
else
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = src.scanned_user
newMsg.body = src.msg
if(photo)
newMsg.img = photo.img
news_network.SubmitArticle(msg, scanned_user, channel_name, photo)
feedback_inc("newscaster_stories",1)
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.channel_name)
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
break
src.screen=4
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(src.channel_name)
src.updateUsrDialog()
else if(href_list["create_channel"])

Some files were not shown because too many files have changed in this diff Show More