diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
index dfb296ddf98..23617cf5541 100644
--- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm
@@ -1423,7 +1423,7 @@
"do" = (
/obj/structure/closet/crate,
/obj/item/weapon/card/id{
- access = list(12);
+ access = list(200,201);
name = "Staff ID"
},
/turf/open/floor/plasteel/whitebot,
@@ -2114,30 +2114,12 @@
/area/ruin/hotel/workroom)
"fo" = (
/obj/structure/table,
-/obj/item/weapon/card/id{
- access = list(12);
- name = "Staff ID"
- },
-/obj/item/weapon/card/id{
- access = list(12);
- name = "Staff ID"
- },
-/obj/item/weapon/card/id{
- access = list(12);
- name = "Staff ID"
- },
-/obj/item/weapon/card/id{
- access = list(12);
- name = "Staff ID"
- },
-/obj/item/weapon/card/id{
- access = list(12);
- name = "Staff ID"
- },
-/obj/item/weapon/card/id{
- access = list(12);
- name = "Staff ID"
- },
+/obj/item/weapon/card/id/away/hotel,
+/obj/item/weapon/card/id/away/hotel,
+/obj/item/weapon/card/id/away/hotel,
+/obj/item/weapon/card/id/away/hotel,
+/obj/item/weapon/card/id/away/hotel,
+/obj/item/weapon/card/id/away/hotel,
/turf/open/floor/plasteel/black,
/area/ruin/hotel/workroom)
"fp" = (
@@ -3252,10 +3234,7 @@
/area/ruin/hotel/pool)
"hN" = (
/obj/structure/table,
-/obj/item/weapon/card/id{
- access = list(200,201,203);
- name = "Security Staff ID"
- },
+/obj/item/weapon/card/id/away/hotel/securty,
/turf/open/floor/plasteel/darkred,
/area/ruin/hotel/security)
"hO" = (
diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm
index 500e16b5288..b2ef9169dee 100644
--- a/_maps/map_files/DreamStation/dreamstation04.dmm
+++ b/_maps/map_files/DreamStation/dreamstation04.dmm
@@ -30985,7 +30985,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/green/side,
+/turf/open/floor/plasteel/green/corner,
/area/hallway/primary/port{
name = "Fore Port Hallway"
})
@@ -31002,9 +31002,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/green/corner{
- dir = 8
- },
+/turf/open/floor/plasteel/green/side,
/area/hallway/primary/port{
name = "Fore Port Hallway"
})
@@ -40419,17 +40417,13 @@
/turf/open/floor/plasteel/black,
/area/bridge)
"bDi" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/turf/open/floor/plasteel/green/corner{
+ dir = 8
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/turf/open/floor/plasteel/darkblue/side{
- tag = "icon-darkblue (EAST)";
- dir = 4
- },
-/area/bridge)
+/area/hallway/primary/port{
+ name = "Fore Port Hallway"
+ })
"bDj" = (
/obj/machinery/firealarm{
dir = 2;
@@ -41757,15 +41751,17 @@
/turf/open/floor/plasteel/black,
/area/bridge)
"bFB" = (
-/obj/structure/cable/blue{
- tag = "icon-4-8";
- icon_state = "4-8"
- },
-/turf/open/floor/plasteel/darkblue/side{
- tag = "icon-darkblue (EAST)";
+/turf/open/floor/plasteel/brown/corner,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/area/bridge)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/plasteel/warningline/corner,
+/area/hallway/primary/starboard{
+ name = "Aft Starboard Hallway"
+ })
"bFC" = (
/obj/structure/cable/blue{
tag = "icon-4-8";
@@ -43262,17 +43258,24 @@
/turf/open/floor/plasteel/black,
/area/bridge)
"bHJ" = (
+/turf/open/floor/plasteel/brown/corner{
+ tag = "icon-browncorner (WEST)";
+ dir = 8
+ },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/plasteel/darkblue/side{
- tag = "icon-darkblue (EAST)";
- dir = 4
+/turf/open/floor/plasteel/warningline/corner{
+ tag = "icon-warninglinecorners (WEST)";
+ icon_state = "warninglinecorners";
+ dir = 8
},
-/area/bridge)
+/area/hallway/primary/starboard{
+ name = "Aft Starboard Hallway"
+ })
"bHK" = (
/obj/machinery/airalarm{
dir = 1;
@@ -52595,13 +52598,14 @@
name = "Aft Starboard Hallway"
})
"bZn" = (
+/turf/open/floor/plasteel/brown,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/plasteel/warning,
+/turf/open/floor/plasteel/warningline,
/area/hallway/primary/starboard{
name = "Aft Starboard Hallway"
})
@@ -98153,7 +98157,7 @@ aKx
bhq
biu
bjP
-bla
+bkT
bmE
boj
bqx
@@ -99181,7 +99185,7 @@ aSP
aRO
biv
bjS
-bkX
+bDi
bmE
boj
bqA
@@ -115908,7 +115912,7 @@ bJG
bVn
bWF
bXN
-bZm
+bFB
caE
ccn
cet
@@ -116422,7 +116426,7 @@ bMQ
bJG
bWH
bXN
-bZo
+bHJ
caH
ccp
cev
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 14fddd5b9c4..85d19033baf 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -27537,8 +27537,8 @@
d2 = 2;
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 5
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
@@ -28505,6 +28505,7 @@
d2 = 4;
icon_state = "1-4"
},
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"bmk" = (
@@ -32636,11 +32637,8 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"buC" = (
-/obj/machinery/atmospherics/components/unary/vent_pump{
- dir = 1;
- external_pressure_bound = 101.325;
- on = 1;
- pressure_checks = 1
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
@@ -60669,6 +60667,13 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/port)
+"cCo" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/quartermaster/storage)
(1,1,1) = {"
aaa
@@ -79567,11 +79572,11 @@ bjl
bkG
bkp
bmj
-bjr
-bmb
-bjr
-bjr
-bjr
+bjt
+cCo
+bjt
+bjt
+biq
bvV
blW
aaa
@@ -79828,7 +79833,7 @@ bjr
bmb
bjr
bjr
-bjr
+buC
bvV
blW
aaa
@@ -80085,7 +80090,7 @@ boK
bpz
boK
bjr
-buC
+bkt
bvV
blW
aaa
diff --git a/_maps/map_files/generic/lavaland.dmm b/_maps/map_files/generic/lavaland.dmm
index 80fbd46fec6..5d66bbc616b 100644
--- a/_maps/map_files/generic/lavaland.dmm
+++ b/_maps/map_files/generic/lavaland.dmm
@@ -1,20 +1,18 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"aa" = (
-/turf/closed/indestructible/riveted,
+/turf/closed/indestructible/necropolis,
/area/lavaland/surface/outdoors)
"ab" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"ac" = (
-/obj/machinery/lavaland_controller,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/area)
+/area/lavaland/surface/outdoors)
"ad" = (
-/obj/structure/lavaland_door,
-/turf/closed/indestructible/riveted,
+/turf/closed/indestructible/necropolis,
/area/lavaland/surface/outdoors)
"ae" = (
-/obj/effect/light_emitter,
+/obj/structure/necropolis_gate,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
"af" = (
@@ -32,38 +30,21 @@
},
/area/mine/living_quarters)
"ah" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plating/lava/smooth/lava_land_surface,
-/area/lavaland/surface/outdoors)
+/turf/closed/indestructible/necropolis,
+/area/ruin/unpowered{
+ name = "Necropolis Bridge"
+ })
"ai" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
+/turf/open/indestructible/necropolis,
/area/ruin/unpowered{
name = "Necropolis Bridge"
})
"aj" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
-/area/ruin/unpowered{
- name = "Necropolis Bridge"
- })
+/turf/open/indestructible/necropolis,
+/area/lavaland/surface/outdoors)
"ak" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/turf/open/floor/plating/lava/smooth/lava_land_surface,
+/obj/effect/light_emitter,
+/turf/open/indestructible/necropolis,
/area/lavaland/surface/outdoors)
"al" = (
/turf/closed/mineral/random/volcanic,
@@ -557,7 +538,7 @@
turf_type = /turf/open/floor/plating/lava/smooth;
width = 9
},
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/turf/open/floor/plating/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"bm" = (
/obj/machinery/door/airlock/glass_security{
@@ -719,10 +700,7 @@
},
/area/mine/eva)
"bA" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
- },
+/turf/open/floor/plating/lava/smooth/lava_land_surface,
/area/lavaland/surface/outdoors/explored)
"bB" = (
/obj/structure/table,
@@ -909,10 +887,15 @@
},
/area/mine/production)
"bT" = (
-/turf/open/floor/plasteel{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 30;
+ pixel_y = 0
},
-/area/lavaland/surface/outdoors/explored)
+/turf/open/floor/plasteel/brown{
+ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
+ dir = 4
+ },
+/area/mine/production)
"bU" = (
/turf/open/floor/plasteel/purple/corner{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
@@ -1232,11 +1215,14 @@
},
/area/mine/production)
"cx" = (
-/turf/open/floor/plasteel/purple/corner{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- dir = 4
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -5;
+ pixel_y = 30
},
-/area/lavaland/surface/outdoors/explored)
+/turf/open/floor/plasteel{
+ baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
+ },
+/area/mine/living_quarters)
"cy" = (
/obj/machinery/door/airlock/mining{
name = "Mining Station Storage";
@@ -1790,6 +1776,10 @@
},
/area/mine/eva)
"dG" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -5;
+ pixel_y = 30
+ },
/turf/open/floor/plasteel/purple/corner{
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
@@ -2085,12 +2075,9 @@
},
/area/mine/living_quarters)
"en" = (
-/obj/item/weapon/pickaxe,
-/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
-/turf/closed/indestructible/riveted,
-/area/ruin/unpowered{
- name = "Necropolis Bridge"
- })
+/obj/structure/fluff/drake_statue,
+/turf/open/indestructible/necropolis,
+/area/lavaland/surface/outdoors)
"eo" = (
/obj/machinery/power/apc{
dir = 8;
@@ -2703,13 +2690,9 @@
},
/area/mine/living_quarters)
"fx" = (
-/turf/open/floor/plasteel/neutral{
- baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface;
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- },
-/area/ruin/unpowered{
- name = "Necropolis Bridge"
- })
+/obj/structure/fluff/drake_statue/falling,
+/turf/open/indestructible/necropolis,
+/area/lavaland/surface/outdoors)
"fy" = (
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/turf/closed/mineral/random/volcanic,
@@ -2816,6 +2799,12 @@
baseturf = /turf/open/floor/plating/lava/smooth/lava_land_surface
},
/area/mine/laborcamp/security)
+"fP" = (
+/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
+/turf/closed/indestructible/riveted,
+/area/ruin/unpowered{
+ name = "Necropolis Bridge"
+ })
(1,1,1) = {"
aa
@@ -2826,6 +2815,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -3070,9 +3062,6 @@ af
af
af
af
-af
-af
-af
"}
(2,1,1) = {"
aa
@@ -3085,6 +3074,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -3327,9 +3319,6 @@ af
af
af
af
-af
-af
-af
"}
(3,1,1) = {"
aa
@@ -3342,6 +3331,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -3456,9 +3448,6 @@ af
af
af
af
-af
-af
-af
ed
ed
ed
@@ -3546,7 +3535,7 @@ af
af
af
af
-af
+ab
af
af
af
@@ -3599,6 +3588,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
af
af
@@ -3713,9 +3705,6 @@ af
af
af
af
-af
-af
-af
ab
ab
ab
@@ -3802,13 +3791,13 @@ af
af
af
af
+ab
+al
+al
af
af
af
-af
-af
-af
-af
+ab
af
af
af
@@ -3856,6 +3845,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
af
@@ -3972,9 +3964,6 @@ af
af
af
af
-af
-af
-af
ab
ab
ab
@@ -4058,10 +4047,10 @@ af
af
af
af
-af
-af
-af
-af
+ab
+al
+al
+al
af
af
af
@@ -4113,6 +4102,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -4230,9 +4222,6 @@ af
af
af
af
-af
-af
-af
ab
ab
ab
@@ -4306,6 +4295,8 @@ af
af
af
af
+ab
+ab
af
af
af
@@ -4314,20 +4305,18 @@ af
af
af
af
-af
-af
-af
-af
+ab
+al
dq
+ab
af
af
af
af
af
-af
-af
-af
-af
+ab
+ab
+ab
af
af
af
@@ -4370,6 +4359,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -4404,9 +4396,6 @@ al
al
al
al
-al
-al
-al
ed
af
af
@@ -4567,13 +4556,14 @@ af
af
af
af
+ab
af
af
-af
-dq
-dq
-af
+bA
+bA
+ab
dq
+ab
af
af
af
@@ -4581,9 +4571,8 @@ af
af
af
af
-af
-af
-af
+ab
+ab
af
af
af
@@ -4627,6 +4616,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -4677,9 +4669,6 @@ al
al
al
al
-al
-al
-al
ed
af
af
@@ -4818,17 +4807,16 @@ af
af
af
af
+ab
af
af
af
+ab
af
af
af
-af
-af
-dq
-dq
-af
+bA
+bA
af
af
af
@@ -4840,6 +4828,7 @@ af
af
af
af
+ab
af
af
af
@@ -4883,6 +4872,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -4935,9 +4927,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -5074,32 +5063,32 @@ af
af
af
af
+ab
+ab
+af
+ab
+ab
+af
+af
+af
+af
+bA
+bA
+af
+af
+bA
+bA
+af
+af
+bA
+af
+ab
af
af
af
af
af
-af
-af
-af
-af
-dq
-dq
-af
-af
-dq
-dq
-af
-af
-dq
-af
-af
-af
-af
-af
-af
-af
-af
+ab
af
af
af
@@ -5140,6 +5129,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -5194,9 +5186,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -5334,29 +5323,29 @@ af
af
af
af
+ab
+ab
+af
+af
+af
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
af
af
af
af
-af
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-af
-af
-af
-af
-af
+ab
af
af
af
@@ -5397,6 +5386,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -5483,9 +5475,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -5594,23 +5583,23 @@ af
af
af
af
+bA
+bA
dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-af
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+ab
af
af
af
@@ -5654,6 +5643,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -5740,9 +5732,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -5852,24 +5841,24 @@ af
af
af
af
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
+bA
+bA
+bA
+bA
+bA
+bA
af
-dq
+bA
af
af
af
@@ -5911,6 +5900,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -5997,9 +5989,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -6101,28 +6090,28 @@ af
af
af
af
+ab
af
af
af
af
af
af
+ab
af
-af
-af
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
af
af
af
@@ -6168,6 +6157,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -6255,9 +6247,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -6357,6 +6346,8 @@ af
af
af
af
+ab
+ab
af
af
af
@@ -6364,24 +6355,22 @@ af
af
af
af
-af
-af
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-af
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+ab
af
af
af
@@ -6425,6 +6414,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -6513,9 +6505,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -6618,27 +6607,27 @@ af
af
af
af
+ab
af
af
af
af
-af
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
af
af
af
@@ -6681,6 +6670,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -6770,9 +6762,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -6881,19 +6870,19 @@ af
af
af
af
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
af
af
af
@@ -6938,6 +6927,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ed
ed
@@ -7027,9 +7019,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -7138,19 +7127,19 @@ af
af
af
af
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
-dq
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
+bA
bl
-dq
-dq
-dq
+bA
+bA
+bA
af
af
af
@@ -7198,6 +7187,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
af
@@ -7285,9 +7277,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -7385,7 +7374,7 @@ af
af
af
af
-af
+ab
af
af
af
@@ -7406,8 +7395,8 @@ fI
an
bm
an
-dq
-dq
+bA
+bA
af
af
af
@@ -7455,6 +7444,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -7543,9 +7535,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -7712,6 +7701,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -7802,9 +7794,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -7969,6 +7958,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
af
@@ -8059,9 +8051,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -8223,6 +8212,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -8316,9 +8308,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -8480,6 +8469,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -8574,9 +8566,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -8739,6 +8728,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -8832,9 +8824,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -8996,6 +8985,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -9090,9 +9082,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -9253,6 +9242,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -9347,9 +9339,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -9510,6 +9499,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -9605,9 +9597,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -9767,6 +9756,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -9863,9 +9855,6 @@ al
al
al
al
-al
-al
-al
af
af
al
@@ -10022,6 +10011,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -10053,9 +10045,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -10279,6 +10268,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -10383,9 +10375,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -10536,6 +10525,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -10640,9 +10632,6 @@ al
al
al
al
-al
-al
-al
af
af
al
@@ -10793,6 +10782,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -10900,9 +10892,6 @@ al
al
al
al
-al
-al
-al
ab
ab
af
@@ -11050,6 +11039,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -11157,9 +11149,6 @@ al
al
al
al
-al
-al
-al
ab
al
af
@@ -11307,6 +11296,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -11414,9 +11406,6 @@ al
al
al
al
-al
-al
-al
ed
af
af
@@ -11564,6 +11553,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -11672,9 +11664,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -11825,6 +11814,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
af
@@ -11930,9 +11922,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -12082,6 +12071,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -12104,9 +12096,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -12283,7 +12272,7 @@ fK
fK
fK
dq
-en
+fP
fL
fK
dq
@@ -12339,6 +12328,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -12448,9 +12440,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -12596,6 +12585,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -12707,9 +12699,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -12853,6 +12842,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -12964,9 +12956,6 @@ al
al
al
al
-al
-al
-al
af
af
al
@@ -13068,7 +13057,7 @@ ej
bX
bY
ee
-fj
+cx
bg
fj
ee
@@ -13110,6 +13099,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
af
@@ -13227,9 +13219,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -13363,6 +13352,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -13483,9 +13475,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -13620,6 +13609,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -13741,9 +13733,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -13877,6 +13866,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -13998,9 +13990,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -14134,6 +14123,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -14255,9 +14247,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -14391,6 +14380,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -14511,9 +14503,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -14648,6 +14637,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -14768,9 +14760,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -14906,6 +14895,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -15037,9 +15029,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -15163,6 +15152,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -15304,9 +15296,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -15419,6 +15408,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -15586,9 +15578,6 @@ al
al
al
al
-al
-al
-al
ab
ab
al
@@ -15676,6 +15665,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -15873,9 +15865,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -15933,6 +15922,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -16130,9 +16122,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -16190,6 +16179,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -16387,9 +16379,6 @@ al
al
al
al
-al
-al
-al
ab
af
ab
@@ -16447,6 +16436,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -16644,9 +16636,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -16704,6 +16693,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -16902,9 +16894,6 @@ al
al
al
al
-al
-al
-al
af
ab
af
@@ -16961,32 +16950,32 @@ aa
aa
aa
aa
-ab
-ab
aa
aa
aa
-aa
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
ab
ab
al
al
al
al
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -17218,32 +17207,32 @@ aa
aa
aa
aa
-ab
-ed
-aa
aa
aa
aa
ab
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
+ed
al
al
al
al
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -17475,31 +17464,31 @@ aa
aa
aa
aa
-ab
-ed
-aa
aa
aa
aa
ab
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
+ed
al
al
al
al
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -17732,6 +17721,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ed
ed
@@ -17933,9 +17925,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -17989,6 +17978,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -18189,9 +18181,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -18246,6 +18235,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -18445,9 +18437,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -18460,7 +18449,7 @@ dK
bI
bS
dZ
-bS
+bT
bI
dI
dI
@@ -18503,6 +18492,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -18702,9 +18694,6 @@ al
al
al
al
-al
-al
-al
af
af
al
@@ -18760,6 +18749,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -18962,9 +18954,6 @@ al
al
al
al
-al
-al
-al
ab
ds
du
@@ -19017,6 +19006,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -19218,9 +19210,6 @@ al
al
al
al
-al
-al
-al
ab
ab
dt
@@ -19274,6 +19263,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -19474,9 +19466,6 @@ al
al
al
al
-al
-al
-al
af
af
ab
@@ -19531,6 +19520,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -19731,9 +19723,6 @@ al
al
al
al
-al
-al
-al
af
af
ab
@@ -19788,6 +19777,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -19988,9 +19980,6 @@ al
al
al
al
-al
-al
-al
af
af
ab
@@ -20045,6 +20034,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -20245,9 +20237,6 @@ al
al
al
al
-al
-al
-al
af
af
ab
@@ -20305,6 +20294,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -20338,9 +20330,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -20562,6 +20551,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -20758,9 +20750,6 @@ al
al
al
al
-al
-al
-al
ab
al
al
@@ -20819,6 +20808,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -21013,9 +21005,6 @@ al
al
al
al
-al
-al
-al
fy
ab
ab
@@ -21076,6 +21065,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -21270,9 +21262,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -21330,6 +21319,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ed
ed
@@ -21520,9 +21512,6 @@ al
al
al
al
-al
-al
-al
fy
ab
ab
@@ -21587,6 +21576,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -21777,9 +21769,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -21844,6 +21833,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -22034,9 +22026,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -22101,6 +22090,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -22290,9 +22282,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -22358,6 +22347,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -22547,9 +22539,6 @@ al
al
al
al
-al
-al
-al
ab
ab
al
@@ -22615,6 +22604,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -22807,9 +22799,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -22872,6 +22861,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ed
ed
@@ -23062,9 +23054,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -23129,31 +23118,31 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ed
-aa
-aa
-aa
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
-ab
-ab
-ab
-ab
al
al
al
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+ab
+ab
+ab
+ab
al
al
al
@@ -23386,11 +23375,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ed
-aa
-aa
-aa
+al
+al
+al
ed
ab
af
@@ -23577,9 +23569,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -23643,11 +23632,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
-aa
-aa
-aa
+al
+al
+al
ed
ab
af
@@ -23837,9 +23829,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -23900,6 +23889,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -24094,9 +24086,6 @@ al
al
al
al
-al
-al
-al
fy
ab
ab
@@ -24157,6 +24146,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -24262,9 +24254,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -24414,6 +24403,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -24608,9 +24600,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -24671,6 +24660,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -24865,9 +24857,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -24928,6 +24917,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -25122,9 +25114,6 @@ al
al
al
al
-al
-al
-al
fy
ab
ab
@@ -25185,6 +25174,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -25381,9 +25373,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -25444,6 +25433,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -25640,9 +25632,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -25701,6 +25690,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -25895,9 +25887,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -25958,6 +25947,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -26153,9 +26145,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -26215,6 +26204,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -26410,9 +26402,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -26472,6 +26461,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -26569,9 +26561,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -26727,6 +26716,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -26924,9 +26916,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -26984,6 +26973,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -27181,9 +27173,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -27241,6 +27230,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -27438,9 +27430,6 @@ al
al
al
al
-al
-al
-al
ab
ab
al
@@ -27498,6 +27487,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -27694,9 +27686,6 @@ al
al
al
al
-al
-al
-al
ab
ab
al
@@ -27755,31 +27744,31 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
+aa
aa
aa
ab
ab
ab
ab
-ab
-ab
-af
-af
-af
-af
-af
-ab
-af
-af
-af
-ab
-al
al
al
+ab
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+ab
+af
+af
+af
+ab
al
al
al
@@ -28012,12 +28001,15 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
aa
aa
+aa
+ab
+ab
+ab
+ab
+al
+al
ed
ab
ab
@@ -28208,9 +28200,6 @@ al
al
al
al
-al
-al
-al
ab
ab
al
@@ -28269,12 +28258,15 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ed
-aa
-aa
+al
+al
ed
ab
ab
@@ -28465,9 +28457,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -28526,6 +28515,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -28723,9 +28715,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -28783,6 +28772,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -28981,9 +28973,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -29040,6 +29029,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -29237,9 +29229,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -29297,6 +29286,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -29494,9 +29486,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -29554,6 +29543,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -29752,9 +29744,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -29816,6 +29805,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -30008,9 +30000,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -30073,6 +30062,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -30266,9 +30258,6 @@ al
al
al
al
-al
-al
-al
ab
al
ab
@@ -30330,6 +30319,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -30546,9 +30538,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -30587,6 +30576,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -30803,9 +30795,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -30844,6 +30833,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -31060,9 +31052,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -31096,6 +31085,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -31317,9 +31309,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -31353,6 +31342,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ed
ab
@@ -31575,9 +31567,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -31610,6 +31599,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -31832,9 +31824,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -31867,6 +31856,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -32090,9 +32082,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -32124,6 +32113,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -32347,9 +32339,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -32381,14 +32370,17 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ab
ab
ed
-aa
-aa
+al
+al
ab
af
af
@@ -32605,9 +32597,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -32638,15 +32627,18 @@ aa
aa
aa
aa
-ed
-ab
-ab
-ab
-ed
-ed
+aa
aa
aa
ed
+ab
+ab
+ab
+ed
+ed
+al
+al
+ed
af
af
af
@@ -32863,9 +32855,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -32897,12 +32886,15 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ed
-aa
-aa
+al
+al
ed
af
af
@@ -33122,9 +33114,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -33154,12 +33143,15 @@ aa
aa
aa
aa
-ed
-ab
-ab
-ed
aa
aa
+aa
+ed
+ab
+ab
+ed
+al
+al
ab
af
af
@@ -33329,9 +33321,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -33411,6 +33400,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -33640,9 +33632,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -33666,8 +33655,11 @@ aa
aa
aa
aa
-ed
-ab
+aa
+aa
+aa
+aj
+aj
ab
ab
ab
@@ -33694,9 +33686,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -33923,9 +33912,12 @@ aa
aa
aa
aa
-ab
-ab
-ab
+aa
+aa
+aa
+aj
+en
+aj
ab
ab
ab
@@ -33949,9 +33941,6 @@ al
al
al
al
-al
-al
-al
ed
ab
ab
@@ -34180,10 +34169,13 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aj
+aj
+aj
+aj
ab
ab
ab
@@ -34206,9 +34198,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -34437,10 +34426,13 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aj
+aj
+aj
+aj
ab
ab
ab
@@ -34462,9 +34454,6 @@ ab
ab
ed
al
-al
-al
-al
ed
ab
ab
@@ -34694,6 +34683,31 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aj
+aj
+aj
+aj
+aj
+ab
+ab
+ah
+ah
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ah
+ah
ab
ab
ab
@@ -34701,31 +34715,6 @@ ab
ab
ab
ab
-en
-en
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-en
-en
-ab
-ab
-ab
-ab
-ed
-ed
-ab
-ab
-ab
-ab
ab
ab
ab
@@ -34950,15 +34939,17 @@ aa
aa
aa
aa
-ad
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-en
+aa
+aa
+aa
+aa
+aj
+aj
+aj
+aj
+aj
+aj
+aj
ai
ai
ai
@@ -34972,10 +34963,8 @@ ai
ai
ai
ai
-en
-ab
-ab
-ab
+ai
+ah
ab
ab
ab
@@ -35204,35 +35193,35 @@ ab
ab
ab
ab
-ac
+ab
+ab
+ab
ab
ab
ab
ae
-ab
-ab
-ab
-ab
-ab
-ab
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-fx
-ab
-ab
-ab
+ak
+aj
+aj
+aj
+aj
+aj
+aj
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
ab
ab
ab
@@ -35465,14 +35454,9 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-en
+aa
+aa
+aa
aj
aj
aj
@@ -35480,16 +35464,21 @@ aj
aj
aj
aj
-aj
-aj
-aj
-aj
-aj
-aj
-en
-ab
-ab
-ab
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ai
+ah
ab
ab
ab
@@ -35722,31 +35711,31 @@ aa
aa
aa
aa
+aa
+aa
+aa
+aj
+aj
+aj
+aj
+aj
ab
ab
-ab
-ab
-ab
-ab
-ab
-en
-en
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-ak
-en
-en
-ab
-ab
-ab
+ah
+ah
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ah
+ah
ab
ab
ab
@@ -35979,10 +35968,13 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aj
+aj
+aj
+aj
ab
ab
ab
@@ -36011,9 +36003,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
al
ab
ab
@@ -36236,10 +36225,13 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
+aa
+aa
+aa
+aj
+fx
+aj
+aj
ab
ab
ab
@@ -36266,9 +36258,6 @@ ab
ab
ab
ab
-ab
-ab
-ab
ed
al
al
@@ -36493,9 +36482,12 @@ aa
aa
aa
aa
-ed
-ab
-ab
+aa
+aa
+aa
+aj
+aj
+aj
ab
ab
ab
@@ -36726,9 +36718,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -36750,9 +36739,12 @@ aa
aa
aa
aa
-ed
-ed
-ed
+aa
+aa
+aa
+aj
+aj
+ab
ab
ab
ab
@@ -36983,9 +36975,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -37012,6 +37001,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -37240,9 +37232,6 @@ al
al
al
al
-al
-al
-al
ab
af
ab
@@ -37269,6 +37258,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -37496,9 +37488,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -37521,6 +37510,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -37753,9 +37745,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -37778,6 +37767,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -38010,9 +38002,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -38035,6 +38024,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -38268,9 +38260,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -38292,6 +38281,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -38525,9 +38517,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -38549,6 +38538,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -38782,9 +38774,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -38807,6 +38796,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -39039,9 +39031,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -39064,6 +39053,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -39296,9 +39288,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -39321,6 +39310,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -39553,9 +39545,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -39577,6 +39566,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -39810,9 +39802,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -39834,6 +39823,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -40067,9 +40059,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -40091,6 +40080,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -40324,9 +40316,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -40348,6 +40337,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -40581,9 +40573,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -40605,6 +40594,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -40838,9 +40830,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -40869,6 +40858,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -41095,9 +41087,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -41126,6 +41115,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
af
@@ -41352,9 +41344,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -41376,6 +41365,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -41609,9 +41601,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -41633,6 +41622,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -41866,9 +41858,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -41890,6 +41879,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -42123,9 +42115,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -42147,6 +42136,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -42380,9 +42372,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -42404,6 +42393,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -42637,9 +42629,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -42663,6 +42652,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -42894,9 +42886,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -42920,6 +42909,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -42991,9 +42983,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -43177,6 +43166,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -43408,9 +43400,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -43434,6 +43423,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -43665,9 +43657,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -43689,6 +43678,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -43922,9 +43914,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -43946,6 +43935,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -44179,9 +44171,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -44203,6 +44192,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -44436,9 +44428,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -44460,6 +44449,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -44693,9 +44685,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -44717,6 +44706,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -44950,9 +44942,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -44974,6 +44963,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -45207,9 +45199,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -45231,6 +45220,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -45464,9 +45456,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -45488,32 +45477,32 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
aa
aa
aa
-aa
-ab
-af
-af
-af
ab
ab
ab
-af
-af
-af
-af
ab
ab
al
al
al
al
+ab
+af
+af
+af
+ab
+ab
+ab
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -45745,32 +45734,32 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-aa
aa
aa
aa
ab
-af
-af
-af
-af
-af
-af
-af
-af
-af
-af
+ab
+ab
ab
ab
al
al
al
al
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -46002,32 +45991,32 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ab
ed
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
al
al
al
al
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -46259,15 +46248,18 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ed
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -46431,9 +46423,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -46516,15 +46505,18 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ab
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ed
ab
@@ -46749,9 +46741,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -46773,15 +46762,18 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ab
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ed
ab
@@ -46979,9 +46971,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -47030,15 +47019,18 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
ab
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -47263,9 +47255,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -47287,15 +47276,18 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
ab
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -47520,9 +47512,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -47544,32 +47533,32 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
ab
ab
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
al
al
al
al
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -47804,29 +47793,29 @@ aa
aa
aa
aa
-ab
-ab
aa
aa
aa
-aa
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
ab
ab
al
al
al
al
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+al
al
al
al
@@ -48061,6 +48050,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -48291,9 +48283,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -48318,6 +48307,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -48548,9 +48540,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -48575,6 +48564,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -48805,9 +48797,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -48829,6 +48818,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ed
@@ -49062,9 +49054,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -49086,6 +49075,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -49319,9 +49311,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -49343,6 +49332,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -49576,9 +49568,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -49600,6 +49589,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -49833,9 +49825,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -49857,30 +49846,30 @@ aa
aa
aa
aa
-ab
-ed
+aa
+aa
aa
ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-al
-al
+ed
al
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+ab
al
al
al
@@ -50114,31 +50103,31 @@ aa
aa
aa
aa
-ed
-ed
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
-al
-al
+aa
+aa
+ed
+ed
al
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
al
al
al
@@ -50371,31 +50360,31 @@ aa
aa
aa
aa
-ed
-ed
+aa
+aa
aa
ed
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
-al
-al
+ed
al
+ed
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
al
al
al
@@ -50628,31 +50617,31 @@ aa
aa
aa
aa
-ed
-ed
+aa
+aa
aa
ed
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
-al
-al
+ed
al
+ed
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
al
al
al
@@ -50885,31 +50874,31 @@ aa
aa
aa
aa
-ed
-ed
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
-al
-al
+aa
+aa
+ed
+ed
al
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
al
al
al
@@ -51142,6 +51131,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -51377,9 +51369,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -51399,6 +51388,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -51634,9 +51626,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -51656,6 +51645,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -51890,9 +51882,6 @@ al
al
al
al
-al
-al
-al
ed
af
af
@@ -51913,6 +51902,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -52147,9 +52139,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -52170,6 +52159,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -52404,9 +52396,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -52429,6 +52418,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -52661,9 +52653,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -52686,6 +52675,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -52809,9 +52801,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -52943,6 +52932,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -53175,9 +53167,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -53200,6 +53189,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -53432,9 +53424,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -53455,6 +53444,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -53690,9 +53682,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -53718,6 +53707,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -53760,9 +53752,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -53975,6 +53964,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -53996,9 +53988,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -54232,6 +54221,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -54461,9 +54453,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -54489,6 +54478,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -54718,9 +54710,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -54740,6 +54729,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -54975,9 +54967,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -54997,6 +54986,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -55130,9 +55122,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -55254,6 +55243,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -55489,9 +55481,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -55511,30 +55500,30 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
+aa
aa
aa
ab
ab
ab
-af
-af
-af
-af
+ab
ab
ab
ab
ab
al
al
-al
+ab
+ab
+ab
+af
+af
+af
+af
+ab
+ab
+ab
+ab
al
al
al
@@ -55768,6 +55757,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -55776,8 +55768,8 @@ ab
ab
ab
ed
-aa
-aa
+al
+al
ab
ab
ab
@@ -56001,9 +55993,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -56025,16 +56014,19 @@ aa
aa
aa
aa
-ab
-ab
-ab
-ab
-ab
-ab
-ab
-ab
aa
aa
+aa
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+ab
+al
+al
ed
ab
af
@@ -56258,9 +56250,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -56282,6 +56271,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -56515,9 +56507,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -56539,6 +56528,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -56772,9 +56764,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -56798,6 +56787,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -57029,9 +57021,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -57055,6 +57044,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -57286,9 +57278,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -57312,6 +57301,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -57543,9 +57535,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -57568,6 +57557,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -57800,9 +57792,6 @@ al
al
al
al
-al
-al
-al
ed
ab
af
@@ -57825,6 +57814,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -58059,9 +58051,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -58082,6 +58071,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -58316,9 +58308,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -58339,6 +58328,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -58573,9 +58565,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -58595,6 +58584,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -58830,9 +58822,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -58852,6 +58841,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -59087,9 +59079,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -59109,32 +59098,32 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
-aa
-aa
-aa
-aa
-ab
-ab
-ab
-ab
-ab
-ab
-af
-af
-af
-af
-af
-af
-af
-af
-ab
-ab
-ab
al
al
al
al
+ab
+ab
+ab
+ab
+ab
+ab
+af
+af
+af
+af
+af
+af
+af
+af
+ab
+ab
+ab
+al
al
al
al
@@ -59366,11 +59355,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -59453,9 +59445,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -59623,11 +59612,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -59858,9 +59850,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -59880,11 +59869,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -60115,9 +60107,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -60137,11 +60126,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -60268,9 +60260,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -60394,11 +60383,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ed
ab
ab
@@ -60628,9 +60620,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -60651,11 +60640,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ab
ab
ab
@@ -60885,9 +60877,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -60908,11 +60897,14 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
-aa
-aa
-aa
-aa
+al
+al
+al
+al
ab
ab
ab
@@ -60943,9 +60935,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -61165,6 +61154,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -61398,9 +61390,6 @@ al
al
al
al
-al
-al
-al
ab
af
af
@@ -61422,6 +61411,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -61654,9 +61646,6 @@ al
al
al
al
-al
-al
-al
ab
ab
af
@@ -61679,6 +61668,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -61909,9 +61901,6 @@ al
al
al
al
-al
-al
-al
ab
ab
ab
@@ -61936,6 +61925,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -62168,9 +62160,6 @@ al
al
al
al
-al
-al
-al
ab
ab
af
@@ -62193,6 +62182,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -62427,9 +62419,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -62450,6 +62439,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -62685,9 +62677,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -62707,6 +62696,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -62942,9 +62934,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -62964,6 +62953,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -63199,9 +63191,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -63221,6 +63210,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -63407,9 +63399,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -63478,6 +63467,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -63712,9 +63704,6 @@ al
al
al
al
-al
-al
-al
ed
af
af
@@ -63740,6 +63729,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -63969,9 +63961,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -63997,6 +63986,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -64226,9 +64218,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -64254,6 +64243,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -64483,9 +64475,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -64511,6 +64500,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -64740,9 +64732,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -64768,6 +64757,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -64997,9 +64989,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -65025,6 +65014,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -65254,9 +65246,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -65282,6 +65271,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -65511,9 +65503,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -65539,6 +65528,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -65768,9 +65760,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -65796,6 +65785,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -66025,9 +66017,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -66053,6 +66042,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -66282,9 +66274,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -66310,6 +66299,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -66339,9 +66331,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -66562,6 +66551,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -66796,9 +66788,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -66819,6 +66808,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ab
@@ -67048,9 +67040,6 @@ al
al
al
al
-al
-al
-al
ed
al
al
@@ -67076,6 +67065,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -67308,9 +67300,6 @@ al
al
al
al
-al
-al
-al
ed
af
af
@@ -67333,6 +67322,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -67565,9 +67557,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -67590,6 +67579,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ed
ed
@@ -67822,9 +67814,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -67854,6 +67843,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ab
ab
ab
@@ -68078,9 +68070,6 @@ al
al
al
al
-al
-al
-al
af
af
af
@@ -68111,6 +68100,9 @@ aa
aa
aa
aa
+aa
+aa
+aa
ed
ab
ab
@@ -68334,9 +68326,6 @@ al
al
al
al
-al
-al
-al
af
af
af
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index c6430d4654f..4a51b132b3f 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -310,6 +310,9 @@ var/list/bloody_footprints_cache = list()
#define POLLTYPE_TEXT "TEXT"
#define POLLTYPE_RATING "NUMVAL"
#define POLLTYPE_MULTI "MULTICHOICE"
+#define POLLTYPE_IRV "IRV"
+
+
//lighting area defines
#define DYNAMIC_LIGHTING_DISABLED 0 //dynamic lighting disabled (area stays at full brightness)
@@ -471,3 +474,4 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define debug_world_log(msg) if (Debug2) world.log << "DEBUG: [msg]"
#define COORD(A) "([A.x],[A.y],[A.z])"
+#define INCREMENT_TALLY(L, stat) if(L[stat]){L[stat]++}else{L[stat] = 1}
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 2dea5689c51..34979d03325 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -297,6 +297,23 @@ so as to remain in compliance with the most up-to-date laws."
icon_state = "newlaw"
timeout = 300
+/obj/screen/alert/hackingapc
+ name = "Hacking APC"
+ desc = "An Area Power Controller is being hacked. When the process is \
+ complete, you will have exclusive control of it, and you will gain \
+ additional processing time to unlock more malfunction abilities."
+ icon_state = "hackingapc"
+ timeout = 600
+ var/atom/target = null
+
+/obj/screen/alert/hackingapc/Click()
+ if(!usr || !usr.client) return
+ if(!target) return
+ var/mob/living/silicon/ai/AI = usr
+ var/turf/T = get_turf(target)
+ if(T)
+ AI.eyeobj.setLoc(T)
+
//MECHS
/obj/screen/alert/low_mech_integrity
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 7c6037355d7..838f913536f 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -87,7 +87,7 @@
/mob/living/proc/send_item_attack_message(obj/item/I, mob/living/user, hit_area)
var/message_verb = "attacked"
- if(I.attack_verb.len)
+ if(I.attack_verb && I.attack_verb.len)
message_verb = "[pick(I.attack_verb)]"
else if(!I.force)
return 0
@@ -110,4 +110,4 @@
visible_message("[I] bounces harmlessly off of [src].",\
"[I] bounces harmlessly off of [src]!")
else
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 5ca614626ff..95c2ff9836a 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -60,10 +60,6 @@
/mob/living/UnarmedAttack(atom/A)
A.attack_animal(src)
-/mob/living/simple_animal/hostile/UnarmedAttack(atom/A)
- target = A
- AttackingTarget()
-
/atom/proc/attack_animal(mob/user)
return
/mob/living/RestrainedClickOn(atom/A)
diff --git a/code/controllers/subsystem/pool.dm b/code/controllers/subsystem/pool.dm
new file mode 100644
index 00000000000..245e733e984
--- /dev/null
+++ b/code/controllers/subsystem/pool.dm
@@ -0,0 +1,48 @@
+var/datum/subsystem/pool/SSpool
+
+/datum/subsystem/pool
+ name = "Pool"
+ init_order = 20
+ flags = SS_BACKGROUND | SS_FIRE_IN_LOBBY
+ var/list/global_pool
+ var/list/pool_levels = list()
+ var/sum = 0
+
+ var/list/maintained_types = list(
+ /obj/item/stack/tile/plasteel = 100
+ )
+
+ var/list/stats_placed_in_pool = list()
+ var/list/stats_pooled_or_newed = list()
+ var/list/stats_reused = list()
+ var/list/stats_created_new = list()
+
+/datum/subsystem/pool/New()
+ NEW_SS_GLOBAL(SSpool)
+
+/datum/subsystem/pool/Initialize(timeofday)
+ global_pool = GlobalPool
+
+/datum/subsystem/pool/stat_entry(msg)
+ if(global_pool)
+ msg += "Types: [global_pool.len]|Total Pooled Objects: [sum]"
+ else
+ msg += "NULL POOL"
+ ..(msg)
+
+/datum/subsystem/pool/fire()
+ sum = 0
+ for(var/type in global_pool + maintained_types)
+ var/list/L = global_pool[type]
+ var/required_number = maintained_types[type] || 0
+
+ // Update pool levels and tracker
+ var/amount = 0
+ if(L)
+ amount = L.len
+ sum += amount
+
+ // why yes, just inflate the pool at one item per tick
+ if(amount < required_number)
+ var/diver = new type
+ qdel(diver)
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index 586e69dc98f..8894a60bb5e 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -91,13 +91,16 @@ This file's folder contains:
M.visible_message("[M]'s eyes glow a blazing yellow!", \
"Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \
whim without hesitation.")
+ var/list/scripture_states = get_scripture_states()
ticker.mode.servants_of_ratvar += M.mind
+ scripture_unlock_alert(scripture_states)
ticker.mode.update_servant_icons_added(M.mind)
M.mind.special_role = "Servant of Ratvar"
M.languages_spoken |= RATVAR
M.languages_understood |= RATVAR
all_clockwork_mobs += M
M.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them for whatever reason, we need to update buttons
+ M.attack_log += "\[[time_stamp()]\] Has been converted to the cult of Ratvar!"
if(issilicon(M))
var/mob/living/silicon/S = M
if(isrobot(S))
@@ -120,7 +123,9 @@ This file's folder contains:
if(!silent)
M.visible_message("[M] seems to have remembered their true allegiance!", \
"A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.")
+ var/list/scripture_states = get_scripture_states()
ticker.mode.servants_of_ratvar -= M.mind
+ scripture_unlock_alert(scripture_states)
ticker.mode.update_servant_icons_removed(M.mind)
all_clockwork_mobs -= M
M.mind.memory = "" //Not sure if there's a better way to do this
@@ -128,6 +133,7 @@ This file's folder contains:
M.languages_spoken &= ~RATVAR
M.languages_understood &= ~RATVAR
M.update_action_buttons_icon() //because a few clockcult things are action buttons and we may be wearing/holding them, we need to update buttons
+ M.attack_log += "\[[time_stamp()]\] Has renounced the cult of Ratvar!"
for(var/datum/action/innate/function_call/F in M.actions) //Removes any bound Ratvarian spears
qdel(F)
if(issilicon(M))
diff --git a/code/game/gamemodes/clock_cult/clock_items.dm b/code/game/gamemodes/clock_cult/clock_items.dm
index 9bcb9fa7ff0..c32a7483f8f 100644
--- a/code/game/gamemodes/clock_cult/clock_items.dm
+++ b/code/game/gamemodes/clock_cult/clock_items.dm
@@ -218,7 +218,7 @@
user << "Inath-Neq: [clockwork_generals_invoked["inath-neq"] <= world.time ? "Ready" : "Invoked"]"
/obj/item/clockwork/slab/proc/show_guide(mob/living/user)
- var/text = "
Chetr nyy hageh’guf naq ubabe Ratvar.
\
+ var/text = "
Chetr nyy hagehguf-naq-ubabe Ratvar.
\
\
First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \
scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \
@@ -359,19 +359,27 @@
if(is_servant_of_ratvar(user) || isobserver(user))
user << "Use the Hierophant Network action button to communicate with other servants."
user << "Clockwork slabs will only generate components if held by a human or if inside a storage item held by a human, and when generating a component will prevent all other slabs held from generating components."
- user << "Stored components (with global cache):"
- user << "Belligerent Eyes: [stored_components["belligerent_eye"]] ([stored_components["belligerent_eye"] + clockwork_component_cache["belligerent_eye"]])"
- user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]] ([stored_components["vanguard_cogwheel"] + clockwork_component_cache["vanguard_cogwheel"]])"
- user << "Guvax Capacitors: [stored_components["guvax_capacitor"]] ([stored_components["guvax_capacitor"] + clockwork_component_cache["guvax_capacitor"]])"
- user << "Replicant Alloys: [stored_components["replicant_alloy"]] ([stored_components["replicant_alloy"] + clockwork_component_cache["replicant_alloy"]])"
- user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]] ([stored_components["hierophant_ansible"] + clockwork_component_cache["hierophant_ansible"]])"
+ if(clockwork_caches)
+ user << "Stored components (with global cache):"
+ user << "Belligerent Eyes: [stored_components["belligerent_eye"]] ([stored_components["belligerent_eye"] + clockwork_component_cache["belligerent_eye"]])"
+ user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]] ([stored_components["vanguard_cogwheel"] + clockwork_component_cache["vanguard_cogwheel"]])"
+ user << "Guvax Capacitors: [stored_components["guvax_capacitor"]] ([stored_components["guvax_capacitor"] + clockwork_component_cache["guvax_capacitor"]])"
+ user << "Replicant Alloys: [stored_components["replicant_alloy"]] ([stored_components["replicant_alloy"] + clockwork_component_cache["replicant_alloy"]])"
+ user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]] ([stored_components["hierophant_ansible"] + clockwork_component_cache["hierophant_ansible"]])"
+ else
+ user << "Stored components:"
+ user << "Belligerent Eyes: [stored_components["belligerent_eye"]]"
+ user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]]"
+ user << "Guvax Capacitors: [stored_components["guvax_capacitor"]]"
+ user << "Replicant Alloys: [stored_components["replicant_alloy"]]"
+ user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]]"
/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user)
var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant")
if(!message || !user || !user.canUseTopic(src))
return 0
- user.whisper("Freinagf, urne zl jbeqf. [message]")
- send_hierophant_message(user, message)
+ user.whisper("Freinagf, urne zl-jbeqf. [message]")
+ titled_hierophant_message(user, message)
return 1
/obj/item/clothing/glasses/wraith_spectacles //Wraith spectacles: Grants night and x-ray vision at the slow cost of the wearer's sight. Nar-Sian cultists are instantly blinded.
@@ -442,6 +450,7 @@
var/active = FALSE //If the visor is online
var/recharging = FALSE //If the visor is currently recharging
var/obj/item/weapon/ratvars_flame/flame //The linked flame object
+ var/recharge_cooldown = 300 //divided by 10 if ratvar is alive
actions_types = list(/datum/action/item_action/toggle_flame)
/obj/item/clothing/glasses/judicial_visor/item_action_slot_check(slot, mob/user)
@@ -459,7 +468,9 @@
return 0
if(is_servant_of_ratvar(user))
update_status(TRUE)
- else if(iscultist(user)) //Cultists spontaneously combust
+ else
+ update_status(FALSE)
+ if(iscultist(user)) //Cultists spontaneously combust
user << "\"Consider yourself judged, whelp.\""
user << "You suddenly catch fire!"
user.adjust_fire_stacks(5)
@@ -481,10 +492,12 @@
C << "You require a free hand to utilize [src]'s power!"
return 0
C.visible_message("[C]'s hand is enveloped in violet flames!", "You harness [src]'s power. Direct it at a tile at any range to unleash it, or use the action button again to dispel it.")
- var/obj/item/weapon/ratvars_flame/R = new(get_turf(C))
+ var/turf/T = get_turf(C)
+ var/obj/item/weapon/ratvars_flame/R = new(T)
flame = R
C.put_in_hands(R)
R.visor = src
+ add_logs(C, T, "prepared ratvar's flame", src)
user.update_action_buttons_icon()
/obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to)
@@ -555,13 +568,15 @@
continue
V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown
V.update_status()
- addtimer(V, "recharge_visor", ratvar_awakens ? 60 : 600, FALSE, user)
- clockwork_say(user, "Xarry, urn'guraf!")
+ addtimer(V, "recharge_visor", (ratvar_awakens ? visor.recharge_cooldown*0.1 : visor.recharge_cooldown) * 2, FALSE, user)
+ clockwork_say(user, "Xarry, urngur'af!")
user.visible_message("The flame in [user]'s hand rushes to [target]!", "You direct [visor]'s power to [target]. You must wait for some time before doing this again.")
- new/obj/effect/clockwork/judicial_marker(get_turf(target), user)
+ var/turf/T = get_turf(target)
+ new/obj/effect/clockwork/judicial_marker(T, user)
+ add_logs(user, T, "used ratvar's flame to create a judicial marker")
user.update_action_buttons_icon()
user.update_inv_glasses()
- addtimer(visor, "recharge_visor", ratvar_awakens ? 30 : 300, FALSE, user)//Cooldown is reduced by 10x if Ratvar is up
+ addtimer(visor, "recharge_visor", ratvar_awakens ? visor.recharge_cooldown*0.1 : visor.recharge_cooldown, FALSE, user)//Cooldown is reduced by 10x if Ratvar is up
qdel(src)
return 1
@@ -695,8 +710,9 @@
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "ratvarian_spear"
item_state = "ratvarian_spear"
- force = 17 //Extra damage is dealt to silicons in afterattack()
+ force = 17 //Extra damage is dealt to silicons in attack()
throwforce = 40
+ sharpness = IS_SHARP_ACCURATE
attack_verb = list("stabbed", "poked", "slashed")
hitsound = 'sound/weapons/bladeslice.ogg'
w_class = 4
@@ -962,7 +978,7 @@
clockwork_desc = "A broken gear lock for pinion airlocks. Might still be serviceable as a substitute for a vanguard cogwheel."
icon_state = "pinion_lock"
cultist_message = "The gear grows warm in your hands."
- servant_of_ratvar_messages = list("The lock isn't getting any lighter.", "\"Qnzntrq trnef ner orggre guna oebxra obqvrf.\"", "\"Vg pbhyq fgvyy or hfrq, vs gurer jnf n qbbe gb cynpr vg ba.\"")
+ servant_of_ratvar_messages = list("The lock isn't getting any lighter.", "\"Qnzntrq trnef ner orggr-e gun'a oebxra obqvrf.\"", "\"Vg pbhyq fgv'yy or hfrq, vs gur'er jnf n qbbe gb-cynpr vg ba.\"")
w_class = 3
/obj/item/clockwork/component/guvax_capacitor
@@ -971,7 +987,8 @@
icon_state = "guvax_capacitor"
component_id = "guvax_capacitor"
cultist_message = "\"Try not to lose your mind - I'll need it. Heh heh...\""
- servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", "\"The fact that Ratvar has to depend on simpletons like you is appalling.\"")
+ servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", \
+ "\"The fact that Ratvar has to depend on simpletons like you is appalling.\"")
message_span = "sevtug"
/obj/item/clockwork/component/guvax_capacitor/antennae
@@ -980,7 +997,8 @@
clockwork_desc = "The antennae from a mania motor. May be usable as a substitute for a guvax capacitor."
icon_state = "mania_motor_antennae"
cultist_message = "Your head is filled with a burst of static."
- servant_of_ratvar_messages = list("\"Jub oebxr guvf.\"", "\"Qvq lbh oernx gurfr bss LBHEFRYS?\"", "\"Jul qvq jr tvir guvf gb fhpu fvzcyrgbaf, naljnl?\"", "\"Ng yrnfg jr pna hfr gur'fr sbe fbzrguvat - hayvxr lbh.\"")
+ servant_of_ratvar_messages = list("\"Jub oebxr guv'f.\"", "\"Qvq lbh oernx gur'fr bss LBHEFRYS?\"", "\"Jul qvq jr tvir guv'f gb-fhpu fvzcy-rgbaf, naljnl?\"", \
+ "\"Ng yrnfg jr pna hfr gur'fr sbe fbzrguv'at - hayvxr lbh.\"")
/obj/item/clockwork/component/replicant_alloy
name = "replicant alloy"
@@ -988,7 +1006,8 @@
icon_state = "replicant_alloy"
component_id = "replicant_alloy"
cultist_message = "The alloy takes on the appearance of a screaming face for a moment."
- servant_of_ratvar_messages = list("\"There's always something to be done. Get to it.\"", "\"Idle hands are worse than broken ones. Get to work.\"", "A detailed image of Ratvar appears in the alloy for a moment.")
+ servant_of_ratvar_messages = list("\"There's always something to be done. Get to it.\"", "\"Idle hands are worse than broken ones. Get to work.\"", \
+ "A detailed image of Ratvar appears in the alloy for a moment.")
message_span = "nezbere"
/obj/item/clockwork/component/replicant_alloy/examine(mob/user)
@@ -1021,9 +1040,9 @@
desc = "Some sort of transmitter? It seems as though it's trying to say something."
icon_state = "hierophant_ansible"
component_id = "hierophant_ansible"
- cultist_message = "\"Gur obff nlf vg'f abg ntnvafg gur ehyrf gb xvyy lbh.\""
- servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n'ober. Gurer'f abguvat v'pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V'jnag gb tb xvyy fbzrguvat.\"", "\"HEHEHEHEHEHEH!\"", \
- "\"Vs V xvyyrq lbh snfg rabhtu, qb lbh guvax gur obff jbhyq abgvpr?\"")
+ cultist_message = "\"Gur obff fnlf vg'f abg ntnvafg gur ehyrf gb-xvyy lbh.\""
+ servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n ober. Gur'er'f abguvat V pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V jnag gb-tb xvyy fbzrguv'at.\"", "\"HEHEHEHEHEHEH!\"", \
+ "\"Vs V xvyyrq lbh snfg rabhtu, qb lbh guv'ax gur obff jbhyq abgv'pr?\"")
message_span = "nzcrentr"
/obj/item/clockwork/component/hierophant_ansible/obelisk
@@ -1031,8 +1050,8 @@
desc = "A prism that occasionally glows brightly. It seems not-quite there."
clockwork_desc = "The prism from a clockwork obelisk. Likely suitable as a substitute for a hierophant ansible."
cultist_message = "The prism flickers wildly in your hands before resuming its normal glow."
- servant_of_ratvar_messages = list("You hear the distinctive sound of the Hierophant Network for a moment.","\"Uvrebcu'nag Oe'b'nq pnf'g snvy'her.\"",\
- "The obelisk flickers wildly, as if trying to open a gateway.", "\"Fcng'vny Tn'g'r jn'l snv'yher.\"")
+ servant_of_ratvar_messages = list("You hear the distinctive sound of the Hierophant Network for a moment.","\"Uvrebcu'nag Oe'b'nqpnf'g snvy'her.\"",\
+ "The obelisk flickers wildly, as if trying to open a gateway.", "\"Fcng'v'ny Tn'gr-jn'l snv'yher.\"")
icon_state = "obelisk_prism"
w_class = 3
diff --git a/code/game/gamemodes/clock_cult/clock_machines.dm b/code/game/gamemodes/clock_cult/clock_machines.dm
index 8db2ed225b2..3c8d1c83291 100644
--- a/code/game/gamemodes/clock_cult/clock_machines.dm
+++ b/code/game/gamemodes/clock_cult/clock_machines.dm
@@ -220,7 +220,7 @@
if(stored_alloy + 2500 > max_alloy)
user << "[src] is too full to accept any more alloy!"
return 0
- user.whisper("Genafzhgr vagb jngre.")
+ user.whisper("Genafzhgr vagb jngr-e.")
user.visible_message("[user] liquifies [I] and pours it onto [src].", \
"You liquify [src] and pour it onto [src], transferring the alloy into its reserves.")
stored_alloy = stored_alloy + 2500
@@ -248,16 +248,16 @@
var/convert_attempt_cost = 150
var/convert_cost = 300
- var/mania_messages = list("\"Tb ahgf.\"", "\"Gnxr n penpx ng penml.\"", "\"Znxr n ovq sbe vafnavgl.\"", "\"Trg xbbxl.\"", "\"Zbir gbjneqf znavn.\"", "\"Orpbzr orjvyqrerq.\"", "\"Jnk jvyq.\"", \
- "\"Tb ebhaq gur oraq.\"", "\"Ynaq va yhanpl.\"", "\"Gel qrzragvn.\"", "\"Fgevir gb trg n fperj ybbfr.\"")
- var/compel_messages = list("\"Pbzr pybfre.\"", "\"Nccebnpu gur genafzvggre.\"", "\"Gbhpu gur nagraanr.\"", "\"V nyjnlf unir gb qrny jvgu vqvbgf. Zbir gbjneqf gur znavn zbgbe.\"", \
- "\"Nqinapr sbejneq naq cynpr lbhe urnq orgjrra gur nagraanr - gun'g'f nyy vg'f tbbq sbe.\"", "\"Vs lbh jrer fznegre, lbh'q or bire urer nyernql.\"", "\"Zbir SBEJNEQ, lbh sbby.\"")
- var/convert_messages = list("\"Lbh jba'g qb. Tb gb fyrrc juvyr V gryy gur'fr avgjvgf ubj gb pbaireg lbh.\"", "\"Lbh ner vafhssvpvrag. V zhfg vafgehpg gur'fr vqvbgf va gur neg-bs pbairefvba.\"", \
- "\"Bu-bs pbhefr, fbzrbar jr pna'g pbaireg. Gur'fr freinagf ner sbbyf.\"", "\"Ubj uneq vf vg gb hfr n Fvtvy, naljnl? Nyy vg gnxrf vf qenttvat fbzrbar bagb vg.\"", \
+ var/mania_messages = list("\"Tb ahgf.\"", "\"Gnxr n penpx ng penml.\"", "\"Znxr n ovq sbe vafnavgl.\"", "\"T-rg xbbxl.\"", "\"Zbir gbjneqf znavn.\"", "\"Orpbzr orjvyqrerq.\"", "\"Jnk jvyq.\"", \
+ "\"Tb ebhaq gur oraq.\"", "\"Ynaq va yhanpl.\"", "\"Gel qrzragv'n.\"", "\"Fgevir gb-t-rg n fperj ybbfr.\"")
+ var/compel_messages = list("\"Pbzr pybfre.\"", "\"Nccebnpu gur genafzvggr-e.\"", "\"Gbhpu gur nagr-aanr.\"", "\"V nyjnlf unir gb-qrny jvgu vqvbgf. Zbir gbjneqf gur znavn zbgbe.\"", \
+ "\"Nqinapr sbejneq-naq-cynpr lbhe urnq o-rgjrra gur nagr-aanr - gun'g'f nyy vg'f tbbq sbe.\"", "\"Vs lbh jrer fznegr-e, lbh'q or bire urer nyernql.\"", "\"Zbir SBEJNEQ, lbh sbby.\"")
+ var/convert_messages = list("\"Lbh jba'g qb. Tb gb-fyrrc juvyr V gr-yy gur'fr avgjvgf ubj gb-pbaireg lbh.\"", "\"Lbh ner vafhssvpvrag. V zhfg vafgehpg gur'fr vqvbgf va gur neg-bs pbairefvba.\"", \
+ "\"Bu-bs pbhefr, fbzrbar jr pna'g pbaireg. Gur'fr freinagf ner sbbyf.\"", "\"Ubj uneq vf vg gb-hfr n Fvtvy, naljnl? Nyy vg gnxrf vf qenttvat fbzrbar bagb vg.\"", \
"\"Ubj qb gur'l snvy gb hfr n Fvtvy-bs Npprffvba, naljnl?\"", "\"Jul vf vg gun'g nyy freinagf ner guv'f varcg?\"", "\"Vg'f dhvgr yvxryl lbh'yy or fghpx urer sbe n juvyr.\"")
- var/close_messages = list("\"Jryy, lbh pna'g ernpu gur zbgbe sebz GUR'ER, lbh zbeba.\"", "\"Vagrerfgvat ybpngvba. V'q cersre vs lbh jrag fbzrjurer lbh pbhyq NPGHNYYL GBHPU GUR NAGRAANR!\"", \
- "\"Nznmvat. Lbh fbzrubj znantrq gb jrqtr lbhefrys fbzrjurer lbh pna'g npghnyyl ernpu gur zbgbe sebz.\"", "\"Fhpu n fubj-bs vqvbpl vf hacnenyyryrq. Creuncf V fubhyq chg lbh ba qvfcynl?\"", \
- "\"Qvq lbh qb guv'f ba checbfr? V pna'g vzntvar lbh qbvat fb nppvqragnyyl. Bu, jnvg, V pna.\"", "\"Ubj vf vg gun'g fhpu fzneg perngherf pna fgvyy qb fbzrguv'at NF FGHCVQ NF GUV'F!\"")
+ var/close_messages = list("\"Jryy, lbh pna'g ernpu gur zbgbe sebz GUR'ER, lbh zbeba.\"", "\"Vagr-erfgvat ybpngv'ba. V'q cersre vs lbh jrag fbzrjurer lbh pbhyq NPGHNYYL GBHPU GUR NAGR-AANR!\"", \
+ "\"Nznmvat. Lbh fbzrubj znantrq gb-jrqtr lbhefrys fbzrjurer lbh pna'g npghnyyl ernpu gur zbgbe sebz.\"", "\"Fhpu n fubj-bs vqvbpl vf hacnenyyryrq. Creuncf V fubhyq chg lbh ba qvfcynl?\"", \
+ "\"Qvq lbh qb guv'f ba checbfr? V pna'g vzntvar lbh qbvat fb nppvqragnyyl. Bu, jnvg, V pna.\"", "\"Ubj vf vg gun'g fhpu fzneg perngherf pna fgv'yy qb fbz-rguv'at NF FGHCVQ NF GUV'F!\"")
/obj/structure/clockwork/powered/mania_motor/examine(mob/user)
@@ -578,8 +578,8 @@
if(!try_use_power(hierophant_cost))
user << "The obelisk lacks the power to broadcast!"
return
- clockwork_say(user, "Uvrebcunag Oebnqpnfg, npgvingr!")
- send_hierophant_message(user, input, "big_brass", "large_brass")
+ clockwork_say(user, "Uvrebcunag Oebnqpnfg, npgv'ingr!")
+ titled_hierophant_message(user, input, "big_brass", "large_brass")
if("Spatial Gateway")
if(gateway_active)
user << "The obelisk is already sustaining a gateway!"
@@ -587,8 +587,8 @@
if(!try_use_power(gateway_cost))
user << "The obelisk lacks the power to open a gateway!"
return
- if(procure_gateway(user, 100, 5, 1))
- clockwork_say(user, "Fcnpvny Tngrjnl, npgvingr!")
+ if(procure_gateway(user, 100, 5, 1) && !gateway_active)
+ clockwork_say(user, "Fcngv'ny Tngrjnl, npgv'ingr!")
else
return_power(gateway_cost)
if("Cancel")
diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm
index 411f464f970..8bfe55b04c1 100644
--- a/code/game/gamemodes/clock_cult/clock_ratvar.dm
+++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm
@@ -40,9 +40,7 @@
SSshuttle.emergencyNoEscape = TRUE
START_PROCESSING(SSobj, src)
var/area/gate_area = get_area(src)
- for(var/M in mob_list)
- if(is_servant_of_ratvar(M) || isobserver(M))
- M << "A gateway to the Celestial Derelict has been created in [gate_area.map_name]!"
+ hierophant_message("A gateway to the Celestial Derelict has been created in [gate_area.map_name]!")
/obj/structure/clockwork/massive/celestial_gateway/Destroy()
SSshuttle.emergencyNoEscape = FALSE
@@ -54,9 +52,7 @@
STOP_PROCESSING(SSobj, src)
if(!purpose_fulfilled)
var/area/gate_area = get_area(src)
- for(var/M in mob_list)
- if(is_servant_of_ratvar(M) || isobserver(M))
- M << "A gateway to the Celestial Derelict has fallen at [gate_area.map_name]!"
+ hierophant_message("A gateway to the Celestial Derelict has fallen at [gate_area.map_name]!")
world << sound(null, 0, channel = 8)
qdel(glow)
glow = null
@@ -85,7 +81,7 @@
return 0 //Nice try, Toxins!
/obj/structure/clockwork/massive/celestial_gateway/process()
- if(!progress_in_seconds || prob(5))
+ if(!progress_in_seconds || prob(7))
for(var/M in mob_list)
M << "You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]..."
if(!health)
@@ -116,9 +112,9 @@
takes_damage = FALSE
purpose_fulfilled = TRUE
make_glow()
- animate(glow, transform = matrix() * 1.5, alpha = 255, time = 126)
+ animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125)
world << sound('sound/effects/ratvar_rises.ogg', 0, channel = 8) //End the sounds
- sleep(126)
+ sleep(125)
make_glow()
animate(glow, transform = matrix() * 3, alpha = 0, time = 5)
sleep(5)
@@ -192,7 +188,7 @@
for(var/obj/item/clockwork/ratvarian_spear/R in all_clockwork_objects)
R.update_force()
START_PROCESSING(SSobj, src)
- world << "\"BAPR NTNVA ZL YVTUG FUNYY FUVAR NPEBFF GUVF CNGURGVP ERNYZ!!\""
+ world << "\"BAPR NTNVA ZL-YVTUG FUNYY FUVAR NPEBFF GUV'F CNGU-RGV'P ERNYZ!!\""
world << 'sound/effects/ratvar_reveal.ogg'
var/image/alert_overlay = image('icons/effects/clockwork_effects.dmi', "ratvar_alert")
var/area/A = get_area(src)
@@ -288,10 +284,11 @@
spawn(1)
M.client.color = initial(M.client.color)
shake_camera(M, 4, 3)
- var/r_success_modifier = (ticker.mode.servants_of_ratvar.len * 2) //2% for each cultist
- var/n_success_modifier = (ticker.mode.cult.len * 2)
+ var/r_success_modifier = min(ticker.mode.servants_of_ratvar.len * 2, 50) //2% for each cultist
+ var/n_success_modifier = ticker.mode.cult.len * 2
for(var/mob/living/simple_animal/hostile/construct/harvester/C in player_list)
n_success_modifier += 2
+ n_success_modifier = min(n_success_modifier, 50)
if(prob(base_victory_chance + r_success_modifier))
winner = "Ratvar"
break
diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm
index 8c55be526a6..ee5ecd0c1c3 100644
--- a/code/game/gamemodes/clock_cult/clock_scripture.dm
+++ b/code/game/gamemodes/clock_cult/clock_scripture.dm
@@ -76,7 +76,8 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/proc/has_requirements() //if we have the components and invokers to do it
if(!ratvar_awakens && !slab.no_cost)
for(var/i in required_components)
- if(slab.stored_components[i] + clockwork_component_cache[i] < required_components[i])
+ var/cache_components = clockwork_caches ? clockwork_component_cache[i] : 0
+ if(slab.stored_components[i] + cache_components < required_components[i])
invoker << "You lack the components to recite this piece of scripture! Check Recollection for component costs."
return 0
if(multiple_invokers_used && !multiple_invokers_optional && !ratvar_awakens && !slab.no_cost)
@@ -178,7 +179,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Channeled, Area Slowdown"
name = "Belligerent"
desc = "Forces all nearby non-servants to walk rather than run. Chanted every three seconds for up to thirty seconds."
- chant_invocations = list("Chav'fu gurve oyva-qarff!") //"Punish their blindness!"
+ chant_invocations = list("Chavfu gur've oyvaqarff!") //"Punish their blindness!"
chant_amount = 10
chant_interval = 30
required_components = list("belligerent_eye" = 1)
@@ -201,9 +202,9 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/create_object/judicial_visor //Judicial Visor: Creates a judicial visor.
descname = "Delayed Area Stun Glasses"
name = "Judicial Visor"
- desc = "Forms a visor that, when worn, will grant the ability to form a flame in your hand that can be activated at an area to smite it, stunning and damaging the nonfaithful. \
+ desc = "Forms a visor that, when worn, will grant the ability to form a flame in your hand that can be activated at an area to smite it, stunning, muting, and damaging the nonfaithful. \
Cultists of Nar-Sie will be set on fire, though they will be stunned for half the time."
- invocations = list("Tenag zr gur synzrf-bs Ratvar!")
+ invocations = list("Tenag-zr gur synzrf-bs Ratvar!")
channel_time = 10
required_components = list("belligerent_eye" = 2)
consumed_components = list("belligerent_eye" = 1)
@@ -296,7 +297,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Melee Area Convert"
name = "Guvax"
desc = "Enlists all nearby living unshielded creatures into servitude to Ratvar. Also purges holy water from nearby servants."
- invocations = list("Rayvtugra guvf urngura!", "Nyy ner vafrpgf orsber Ratvar!", "Chetr nyy hageh'guf naq ubabe Ratvar.")
+ invocations = list("Rayvtugr-a guv'f urngura!", "Nyy ner vafrpgf orsber Ratvar!", "Chetr nyy hagehguf-naq-ubabe Ratvar.")
channel_time = 50
required_components = list("guvax_capacitor" = 1)
usage_tip = "Only works on those in melee range and does not penetrate mindshield implants. Much more efficient than a Sigil of Submission."
@@ -332,7 +333,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Channeled, Mobile Area Confusion"
name = "Taunting Tirade"
desc = "Confuses and dizzies all nearby non-servants with a short invocation, then allows movement for three seconds. Chanted every second for up to thirty-five seconds."
- chant_invocations = list("Ubfgvyrf ba zl onpx!", "Rarzvrf ba zl genvy!", "Tbaan gel naq funxr zl gnvy.", "Obtrlf ba zl fvk!")
+ chant_invocations = list("Ubfgv'yrf ba zl-onpx!", "Rarzvrf ba zl-genvy!", "Tbaan gel-naq-funxr zl-gnvy.", "Obtrlf ba zl-fvk!")
chant_amount = 10
chant_interval = 5
required_components = list("guvax_capacitor" = 2)
@@ -372,7 +373,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "New Clockwork Slab"
name = "Replicant"
desc = "Creates a new clockwork slab."
- invocations = list("Z`rgny, orpbzr terngre!")
+ invocations = list("Z-rgny, orpbzr terngr-e!")
channel_time = 0
required_components = list("replicant_alloy" = 1)
whispered = TRUE
@@ -391,7 +392,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Necessary, Shares Components"
name = "Tinkerer's Cache"
desc = "Forms a cache that can store an infinite amount of components. All caches are linked and will provide components to slabs."
- invocations = list("Ohv’yqva...", "...n qvfcra’fre!")
+ invocations = list("Pbafgehpgv'at...", "...n pnpur!")
channel_time = 50
required_components = list("replicant_alloy" = 2)
consumed_components = list("replicant_alloy" = 1)
@@ -408,7 +409,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Xray Vision Glasses"
name = "Wraith Spectacles"
desc = "Fabricates a pair of glasses that provides true sight but quickly damage vision, eventually causing blindness if worn for too long."
- invocations = list("Y'vsg gur fpnyrf sebz zl rl-rf.")
+ invocations = list("Fubj gur gehgu-bs guv'f jbeyq gb-zr!")
channel_time = 10
required_components = list("hierophant_ansible" = 1)
whispered = TRUE
@@ -423,7 +424,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Stun Trap"
name = "Sigil of Transgression"
desc = "Wards a tile with a sigil. The next person to cross the sigil will be smitten and unable to move. Nar-Sian cultists are stunned altogether."
- invocations = list("Qvivavgl, qnmmyr...", "...gubfr jub gerffcnff'urer!") //"Divinity, dazzle those who trespass here!"
+ invocations = list("Qvivavgl, qnmmyr...", "...gub'fr jub gerffcnff urer!") //"Divinity, dazzle those who trespass here!"
channel_time = 50
required_components = list("hierophant_ansible" = 2)
consumed_components = list("hierophant_ansible" = 1)
@@ -442,7 +443,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Turret"
name = "Ocular Warden"
desc = "Forms an automatic short-range turret that deals low sustained damage to the unenlightened in its range."
- invocations = list("Thne’qvnaf...", "...bs gur Ratvar...", "...qrs’raq!")
+ invocations = list("Thneqvnaf...", "...bs gur Ratvar...", "...qrsraq hf!")
channel_time = 120
required_components = list("belligerent_eye" = 2, "replicant_alloy" = 1)
consumed_components = list("belligerent_eye" = 1, "replicant_alloy" = 1)
@@ -464,7 +465,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Channeled, Area Power Drain"
name = "Volt Void" //Alternative name: "On all levels but physical, I am a power sink"
desc = "Drains energy from nearby power sources, dealing burn damage if the total power consumed is above a threshhold. Channeled every second for a maximum of thirty seconds."
- chant_invocations = list("Qenj punetr gb guv’f furyy!")
+ chant_invocations = list("Qenj punetr gb-guv'f furyy!")
chant_amount = 30
chant_interval = 10
required_components = list("guvax_capacitor" = 1, "hierophant_ansible" = 2)
@@ -551,7 +552,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Necessary, Converts Objects"
name = "Clockwork Proselytizer"
desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires replicant alloys to function."
- invocations = list("Jvgu guv’f qrivpr...", "...uvf cerfrapr funyy or znqr xabja.")
+ invocations = list("Jvgu guv'f qrivpr...", "...uvf cerfrapr funyy or-znqr xabja.")
channel_time = 20
required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 2)
consumed_components = list("guvax_capacitor" = 1, "replicant_alloy" = 1)
@@ -568,7 +569,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Fellowship Armory"
desc = "Equips the invoker and any nearby servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers. \
It grows faster to invoke with more nearby servants."
- invocations = list("Fuvryq zr...", "...jvgu gur sentzragf...", "...bs Ratvar!")
+ invocations = list("Fuvryq zr...", "...jvgu gur...", "... sentzragf-bs Ratvar!")
channel_time = 110 //effectively 100 because it counts the invoker
required_components = list("vanguard_cogwheel" = 2, "replicant_alloy" = 1)
consumed_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1)
@@ -629,7 +630,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Spatial Gateway"
desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \
Each servant assisting in the invocation adds one additional use and four additional seconds to the gateway's uses and duration."
- invocations = list("Gryrcbegre...", "...pbzva evtug-hc!")
+ invocations = list("Fcngv'ny Tngr-jnl...", "...npgv'ingr!")
channel_time = 80
required_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 2)
consumed_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 1)
@@ -671,7 +672,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Clockwork Posibrain"
name = "Soul Vessel"
desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar."
- invocations = list("Ureq'gur fbhyf-bs...", "...gur oynf curz-bhf qnzarq!")
+ invocations = list("Ureq gur fbhyf-bs...", "...gur oynfcurzbhf qnzarq!")
channel_time = 20
required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 2)
consumed_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1)
@@ -703,7 +704,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Conversion Trap"
name = "Sigil of Submission"
desc = "Places a luminous sigil that will enslave any valid beings standing on it after a time."
- invocations = list("Qvivavgl, rayvtugra...", "...gubfr jub gerfcnff urer!")
+ invocations = list("Qvivavgl, rayvtugr-a...", "...gub'fr-jub gerfcnff urer!")
channel_time = 60
required_components = list("belligerent_eye" = 1, "guvax_capacitor" = 2)
consumed_components = list("belligerent_eye" = 1, "guvax_capacitor" = 1)
@@ -759,7 +760,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure Battery"
name = "Sigil of Transmission"
desc = "Scribes a sigil beneath the invoker which stores power to power clockwork structures."
- invocations = list("Qvivavgl...", "punetr gur-znpuvarf!")
+ invocations = list("Qvivavgl...", "...cbjre bhe perngv'baf!")
channel_time = 70
required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "hierophant_ansible" = 3)
consumed_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "hierophant_ansible" = 2)
@@ -777,7 +778,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Vitality Matrix"
desc = "Scribes a sigil beneath the invoker which drains life from any living non-servants that cross it. Servants that cross it, however, will be healed based on how much it drained from non-servants. \
Dead servants can be revived by this sigil if it has enough stored vitality."
- invocations = list("Qvivavgl...", "fgrny gur've yvsr...", "sbe guv'f furyy!")
+ invocations = list("Qvivavgl...", "...fgr-ny gur've yvsr...", "...sbe gur'fr furyyf!")
channel_time = 70
required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 3, "hierophant_ansible" = 1)
consumed_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 2, "hierophant_ansible" = 1)
@@ -796,7 +797,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
called forth by Speaking its True Name or if you become exceptionally low on health. \
Unlike holoparasites, however, it does not transfer the damage it takes to you, instead simply gaining Fatigue as it is attacked. Marauders cannot move too far from their hosts, \
and will gain Fatigue at an increasing rate as they grow farther away. At maximum Fatigue, the marauder is forced to return to you and will be unable to manifest until its Fatigue is at zero."
- invocations = list("Pnyy sbegu...", "Sevtug'f jvyy, gur zvaq znqr fjbeq-naq-fuvryq.")
+ invocations = list("Sevtug'f jvyy...", "...pnyy sbegu...")
channel_time = 100
required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 3)
consumed_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 2)
@@ -827,6 +828,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
invoker.apply_damage(10, BRUTE, "head")
slab.busy = null
return 0
+ clockwork_say(invoker, "...gur zvaq znqr...")
invoker.notransform = FALSE
slab.busy = null
if(!check_special_requirements())
@@ -839,6 +841,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \
"The tendril was unsuccessful! Perhaps you should try again another time.")
return 0
+ clockwork_say(invoker, "...fjbeq-naq-fuvryq!")
var/mob/dead/observer/theghost = pick(marauder_candidates)
var/mob/living/simple_animal/hostile/clockwork/marauder/M = new(invoker)
M.key = theghost.key
@@ -858,7 +861,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Disables Machinery"
name = "Interdiction Lens"
desc = "Creates a clockwork totem that sabotages nearby machinery and funnels drained power into nearby Sigils of Transmission."
- invocations = list("Znl guvf gbgrz...", "...fuebhq gur snyfr fhaf!")
+ invocations = list("Znl guv'f gbgr-z...", "...fuebhq gur snyfr fhaf!")
channel_time = 80
required_components = list("belligerent_eye" = 1, "replicant_alloy" = 4, "hierophant_ansible" = 1)
consumed_components = list("belligerent_eye" = 1, "replicant_alloy" = 3, "hierophant_ansible" = 1)
@@ -877,7 +880,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Repairs Other Structures"
name = "Mending Motor"
desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires replicant alloy or power to function."
- invocations = list("Znl guvf cevfz...", "...zraq bhe qragf naq fpengpurf!")
+ invocations = list("Znl guv'f cevfz...", "...zraq bhe qragf-naq-fpengpurf!")
channel_time = 80
required_components = list("vanguard_cogwheel" = 4, "guvax_capacitor" = 1, "replicant_alloy" = 1)
consumed_components = list("vanguard_cogwheel" = 3, "guvax_capacitor" = 1, "replicant_alloy" = 1)
@@ -896,7 +899,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Teleportation Hub"
name = "Clockwork Obelisk"
desc = "Creates a clockwork obelisk that can broadcast messages over the Hierophant Network or open a Spatial Gateway to any living servant or clockwork obelisk."
- invocations = list("Znl guvf boryvfx...", "...gnxr hf gb nyy cynprf!")
+ invocations = list("Znl guv'f boryvfx...", "...gnxr hf gb-nyy cynprf!")
channel_time = 80
required_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 4)
consumed_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 3)
@@ -915,7 +918,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Structure, Area Denial"
name = "Mania Motor"
desc = "Creates a mania motor which will cause brain damage and hallucinations in nearby non-servant humans. It will also try to convert humans directly adjecent to the motor."
- invocations = list("Znl guvf genafzvggre...", "...oernx gur jvyy bs nyy jub bccbfr hf!")
+ invocations = list("Znl guv'f genafzvggr-e...", "...oernx gur jvyy-bs nyy jub bccbfr hf!")
channel_time = 80
required_components = list("guvax_capacitor" = 4, "replicant_alloy" = 1, "hierophant_ansible" = 1)
consumed_components = list("guvax_capacitor" = 3, "replicant_alloy" = 1, "hierophant_ansible" = 1)
@@ -934,7 +937,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Component Generator"
name = "Tinkerer's Daemon"
desc = "Forms a daemon shell that can be attached to a tinkerer's cache to add new components at a healthy rate. It will only function if it is outnumbered by servants in a ratio of 5:1."
- invocations = list("Pbaf'gehpg Ratvar cnegf...", "...gun'g lrg ubyq terngarff!")
+ invocations = list("Pbyyrpg Ratvar cnegf...", "...gun'g l-rg ubyq terngarff!")
channel_time = 80
required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3)
consumed_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 1)
@@ -966,7 +969,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Invoke Nezbere, the Brass Eidolon"
desc = "Taps the limitless power of Nezbere, one of Ratvar's four generals. The restless toil of the Eidolon will empower a wide variety of clockwork apparatus for a full minute - notably, \
clockwork proselytizers will cost no replicant alloy to use."
- invocations = list("V pnyy hcba lbh, Nezbere!!", "Yrg lbhe znpuv'angvbaf ervta ba guvf zvfrenoyr fgng'vba!!", "Yrg lbhe cbjre sybj gueb-htu gur gbbyf bs lbhe znfgre!!")
+ invocations = list("V pnyy hcba lbh, Nezbere!!", "Y-rg lbhe znpuvangv'baf ervta ba guv'f zvfrenoyr fgngv'ba!!", "Y-rg lbhe cbjre sybj gue'bhtu gur gbbyf bs lbhe znfgr-e!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6)
consumed_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6)
@@ -976,18 +979,18 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_nezbere/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["nezbere"] > world.time)
- invoker << "\"Abg whfg lrg, sevraq. Cngvrapr vf n iveghr.\"\n\
+ invoker << "\"Abg whfg l-rg, sevraq. Cngv'rapr vf n iveghr.\"\n\
Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon."
return 0
if(!slab.no_cost && ratvar_awakens)
- invoker << "\"Bhe znfgre vf urer nyernql. Lbh qb abg erdhver zl uryc, sevraq.\"\n\
+ invoker << "\"Bhe znfgr-e vf urer nyernql. Lbh qb abg erdhver zl-uryc, sevraq.\"\n\
Nezbere will not grant his power while Ratvar's dwarfs his own!"
return 0
return 1
/datum/clockwork_scripture/invoke_nezbere/scripture_effects()
var/obj/effect/clockwork/general_marker/nezbere/N = new(get_turf(invoker))
- N.visible_message("\"V urrq lbhe pnyy, punz'cvbaf. Znl lbhe negvs-npgf oevat ehva hcba gur urnguraf gung bccbfr bhe znfgre!\"")
+ N.visible_message("\"V urrq lbhe pnyy, punzcvbaf. Znl lbhe negv'snpgf oevat ehva hcba gur urngur'af gun'g bccbfr bhe znfgr-e!\"")
clockwork_generals_invoked["nezbere"] = world.time + CLOCKWORK_GENERAL_COOLDOWN
for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects) //Ocular wardens have increased damage and radius
W.damage_per_tick *= 1.5
@@ -1017,23 +1020,23 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Invoke Sevtug, the Formless Pariah"
desc = "Taps the limitless power of Sevtug, one of Ratvar's four generals. The mental manipulation ability of the Pariah allows its wielder to cause mass hallucinations and confusion \
for all non-servant humans on the same z-level as them. The power of this scripture falls off somewhat with distance, and certain things may reduce its effects."
- invocations = list("V pnyy hcba lbh, Sevtug!!", "Yrg lbhe cbjre fung-gre gur fnavgl bs gur jrnx-zvaqrq!!", "Yrg lbhe graqevyf ubyq fjnl bire nyy!!")
+ invocations = list("V pnyy hcba lbh, Sevtug!!", "Y-rg lbhe cbjre funggr-e gur fnavgl-bs gur jrnx-zvaqrq!!", "Y-rg lbhe graqevyf ubyq fjnl bire nyy!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 6, "hierophant_ansible" = 3)
consumed_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 6, "hierophant_ansible" = 3)
usage_tip = "Causes brain damage, hallucinations, confusion, and dizziness in massive amounts."
tier = SCRIPTURE_REVENANT
- var/list/mindbreaksayings = list("\"Bu, terng. V trg gb funggre fbzr zvaqf.\"", "\"Zber zvaqf gb pehfu.\"", \
- "\"Ernyyl, guvf vf nyzbfg obevat.\"", "\"Abar-bs gur'fr zvaqf unir nalguvat vagrerfgvat va gur'z.\"", "\"Znlor V pna vafgvyy n yvggyr ovg bs greebe va guv'f bar.\"", \
- "\"Jung n jnfgr-bs zl cbjre.\"", "\"V'z fher V pbhyq whfg pbageby gur'fr zvaqf vafgrnq, ohg gur'l arire nfx.\"")
+ var/list/mindbreaksayings = list("\"Bu, terng. V t-rg gb funggr-e fbzr zvaqf.\"", "\"Zber zvaqf gb-pehfu.\"", \
+ "\"Ernyyl, guv'f vf nyzbfg obevat.\"", "\"Abar-bs gur'fr zvaqf unir nalguv'at vagr-erfgvat va gur'z.\"", "\"Znlor V pna vafgv'yy n yvggyr ovg-bs gr-eebe va guv'f bar.\"", \
+ "\"Jung n jnfgr-bs zl-cbjre.\"", "\"V'z fher V pbhyq whfg pbageby gur'fr zvaqf vafgr-nq, ohg gur'l arire nfx.\"")
/datum/clockwork_scripture/invoke_sevtug/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["sevtug"] > world.time)
- invoker << "\"Vf vg ernyyl fb uneq - rira sbe n fvzcyrgba yvxr lbh - gb tenfc gur pbaprcg bs jnvgvat?\"\n\
+ invoker << "\"Vf vg ernyyl fb uneq - rira sbe n fvzcy-rgba yvxr lbh - gb-tenfc gur pbaprcg-bs jnvgv'at?\"\n\
Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah."
return 0
if(!slab.no_cost && ratvar_awakens)
- invoker << "\"Qb lbh ernyyl guvax nalguvat V pna qb evtug abj jvyy pbzcner gb Ratvar's cbjre?.\"\n\
+ invoker << "\"Qb lbh ernyyl guv'ax nalguv'at V pna qb evtug abj jvyy pbzcner gb-Ratvar's cbjre?.\"\n\
Sevtug will not grant his power while Ratvar's dwarfs his own!"
return 0
return ..()
@@ -1055,7 +1058,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
visualsdistance = round(visualsdistance * 0.25)
minordistance = round(minordistance * 0.25)
majordistance = round(majordistance * 0.25)
- H << "Bu, n ibvq jrncba. Ubj naablvat, V znl nf jryy abg obgure.\n\
+ H << "Bu, n ibvq jrncba. Ubj naablvat, V znl nf jryy abg obgur'e.\n\
Your holy weapon glows a faint orange in an attempt to defend your mind!"
messaged = TRUE
if(isloyal(H))
@@ -1083,7 +1086,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
name = "Invoke Nzcrentr, the Forgotten Arbiter"
desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. The immense energy Nzcrentr wields will allow you to imbue a tiny fraction of it into your body. After several \
seconds, anyone nearby will be struck by a devastating lightning bolt."
- invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Yrg lbhe raretl sybj guebhtu zr!!", "Yrg lbhe obhaq-yrff cbjre fung-gre fgnef!!")
+ invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Y-rg lbhe raretl sybj gue'bhtu zr!!", "Y-rg lbhe obhaqyrff-cbjre funggr-e fgnef!!")
channel_time = 150
required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6)
consumed_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6)
@@ -1092,7 +1095,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["nzcrentr"] > world.time)
- invoker << "\"Gur obff fnlf lbh unir gb jnvg. Url, qb lbh guvax ur jbhyq zvaq vs v xvyyrq lbh? ...Ur jbhyq? Bx.\"\n\
+ invoker << "\"Gur obff fnlf lbh unir gb-jnvg. Url, qb lbh guv'ax ur jbhyq zvaq vs V xvyyrq lbh? ...Ur jbhyq? Bx.\"\n\
Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Forgotten Arbiter."
return 0
return 1
@@ -1101,14 +1104,14 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
new/obj/effect/clockwork/general_marker/nzcrentr(get_turf(invoker))
clockwork_generals_invoked["nzcrentr"] = world.time + CLOCKWORK_GENERAL_COOLDOWN
invoker.visible_message("[invoker] begins to radiate a blinding light!", \
- "\"Gur obff fnlf vg'f bxnl gb qb guv'f. Qba'g oynzr zr vs lbh qvr sebz vg.\"\n \
+ "\"Gur obff fnlf vg'f bxnl gb-qb guv'f. Qba'g oynzr zr vs lbh qvr sebz vg.\"\n \
You feel limitless power surging through you!")
playsound(invoker, 'sound/magic/lightning_chargeup.ogg', 100, 0)
animate(invoker, color = list(rgb(255, 255, 255), rgb(255, 255, 255), rgb(255, 255, 255), rgb(0,0,0)), time = 88) //Gradual advancement to extreme brightness
sleep(88)
if(invoker)
invoker.visible_message("Massive bolts of energy emerge from across [invoker]'s body!", \
- "\"V gbyq lbh lbh jbhyqa'g or noyr gb unaqyr vg.\"\n \
+ "\"V gbyq lbh lbh jbhyqa'g or noyr gb-unaqyr vg.\"\n \
TOO... MUCH! CAN'T... TAKE IT!")
playsound(invoker, 'sound/magic/lightningbolt.ogg', 100, 0)
animate(invoker, color = initial(invoker.color), time = 10)
@@ -1138,7 +1141,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
descname = "Area Invuln"
name = "Invoke Inath-Neq, the Resonant Cogwheel"
desc = "Taps the limitless power of Inath-Neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant complete invulnerability to all servants in range for fifteen seconds."
- invocations = list("V pnyy hcba lbh, Inath-Neq!!", "Yrg gur Erfbanag Pbtf ghea bapr zber!!", "Tenag zr naq zl nyyvrf gur fgeratgu gb inadhvfu bhe sbrf!!")
+ invocations = list("V pnyy hcba lbh, Inath-Neq!!", "Y-rg gur Erfbanag Pbtf ghea bapr zber!!", "Tenag zr-naq-zl-nyyvrf gur fgeratgu gb-inadhvfu bhe sbrf!!")
channel_time = 150
required_components = list("vanguard_cogwheel" = 6, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3)
consumed_components = list("vanguard_cogwheel" = 6, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3)
@@ -1147,7 +1150,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/invoke_inathneq/check_special_requirements()
if(!slab.no_cost && clockwork_generals_invoked["inath-neq"] > world.time)
- invoker << "\"V pnaabg yraq lbh zl nvq lrg, punzcvba. Cyrnfr or pnershy.\"\n\
+ invoker << "\"V pnaabg yraq lbh zl-nvq l-rg, punzcvba. Cyrnfr or pnershy.\"\n\
Inath-Neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel."
return 0
return 1
@@ -1161,7 +1164,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
for(var/mob/living/L in range(7, invoker))
if(!is_servant_of_ratvar(L) || L.stat == DEAD)
continue
- L << "\"V yraq lbh zl nvq, punzcvba! Yrg tybel thvqr lbhe oybjf!\"\n\
+ L << "\"V yraq lbh zl-nvq, punzcvba! Y-rg tybel thvqr lbhe oybjf!\"\n\
Inath-Neq's power flows through you!"
L.color = "#1E8CE1"
L.fully_heal()
@@ -1184,7 +1187,7 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
desc = "Pulls from the power of all of Ratvar's servants and generals to construct a massive machine used to tear apart a rift in spacetime to the Celestial Derelict. This gateway will \
call forth Ratvar from his exile after some time."
invocations = list("NEZBERE! SEVTUG! NZCRENTR! INATH-NEQ! V PNYY HCBA LBH!!", \
- "GUR GVZR UNF PBZR SBE BHE ZNFGRE GB OERNX GUR PUNVAF BS RKVYR!!", \
+ "GUR GV'ZR UNF PBZR SBE BHE ZNFGR-E GB-OERNX GUR PUNVAF-BS RKVYR!!", \
"YRAQ HF LBHE NVQ! RATVAR PBZRF!!")
channel_time = 150
required_components = list("belligerent_eye" = 10, "vanguard_cogwheel" = 10, "guvax_capacitor" = 10, "replicant_alloy" = 10, "hierophant_ansible" = 10)
@@ -1214,33 +1217,35 @@ Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed
/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects()
var/turf/T = get_turf(invoker)
- new/obj/effect/clockwork/general_marker/nezbere(T)
- T.visible_message("\"Ratvar, pbzr sbegu naq fuvar lbhe yvtug npebff guvf ernyz!\"")
- playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 20, 0)
+ new/obj/effect/clockwork/general_marker/inathneq(T)
+ T.visible_message("\"Ratvar, pbzr sbegu-naq-fubj lbhe freinagf lbhe zrepl!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/sevtug(T)
- T.visible_message("\"Ratvar, pbzr sbegu naq fubj guvf fgngvba lbhe qrpbengvat fxvyyf!\"")
- playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0)
+ T.visible_message("\"Ratvar, pbzr sbegu-naq-fubj guv'f fgngv'ba lbhe qrpbengv'at fxvyyf!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 45, 0)
+ sleep(10)
+ new/obj/effect/clockwork/general_marker/nezbere(T)
+ T.visible_message("\"Ratvar, pbzr sbegu-naq-fuvar lbhe yvtug npebff guv'f ernyz!\"")
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 60, 0)
sleep(10)
new/obj/effect/clockwork/general_marker/nzcrentr(T)
T.visible_message("\"Ratvar, pbzr sbegu.\"")
- playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 40, 0)
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 75, 0)
sleep(10)
- new/obj/effect/clockwork/general_marker/inathneq(T)
- T.visible_message("\"Ratvar, pbzr sbegu naq fubj lbhe freinagf lbhe zrepl!\"")
- playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 50, 0)
- sleep(10)
- new/obj/structure/clockwork/massive/celestial_gateway(T)
- playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0)
- var/list/open_turfs = list()
- for(var/turf/open/OT in orange(1, T))
- var/list/dense_objects = list()
- for(var/obj/O in OT)
- if(O.density && !O.CanPass(invoker, OT, 5))
- dense_objects |= O
- if(!dense_objects.len)
- open_turfs |= OT
- if(open_turfs.len)
- for(var/mob/living/L in T)
- L.forceMove(pick(open_turfs)) //shove living mobs off of the gate's new location
- return 1
+ if(check_special_requirements())
+ new/obj/structure/clockwork/massive/celestial_gateway(T)
+ playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0)
+ var/list/open_turfs = list()
+ for(var/turf/open/OT in orange(1, T))
+ var/list/dense_objects = list()
+ for(var/obj/O in OT)
+ if(O.density && !O.CanPass(invoker, OT, 5))
+ dense_objects |= O
+ if(!dense_objects.len)
+ open_turfs |= OT
+ if(open_turfs.len)
+ for(var/mob/living/L in T)
+ L.forceMove(pick(open_turfs)) //shove living mobs off of the gate's new location
+ return 1
+ return 0
diff --git a/code/game/gamemodes/clock_cult/clock_structures.dm b/code/game/gamemodes/clock_cult/clock_structures.dm
index 1847f772936..536ccde2065 100644
--- a/code/game/gamemodes/clock_cult/clock_structures.dm
+++ b/code/game/gamemodes/clock_cult/clock_structures.dm
@@ -24,11 +24,11 @@
/obj/structure/clockwork/New()
..()
- clockwork_construction_value += construction_value
+ change_construction_value(construction_value)
all_clockwork_objects += src
/obj/structure/clockwork/Destroy()
- clockwork_construction_value -= construction_value
+ change_construction_value(-construction_value)
all_clockwork_objects -= src
return ..()
@@ -155,11 +155,15 @@
/obj/structure/clockwork/cache/New()
..()
START_PROCESSING(SSobj, src)
+ var/list/scripture_states = get_scripture_states()
clockwork_caches++
+ scripture_unlock_alert(scripture_states)
SetLuminosity(2,1)
/obj/structure/clockwork/cache/Destroy()
+ var/list/scripture_states = get_scripture_states()
clockwork_caches--
+ scripture_unlock_alert(scripture_states)
STOP_PROCESSING(SSobj, src)
return ..()
@@ -526,8 +530,12 @@
L.Weaken(4) //half the stun, but sets cultists on fire
L.adjust_fire_stacks(2)
L.IgniteMob()
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.silent += 6
targetsjudged++
L.adjustBruteLoss(10)
+ add_logs(user, L, "struck with a judicial blast")
user << "[targetsjudged ? "Successfully judged [targetsjudged]":"Judged no"] heretic[!targetsjudged || targetsjudged > 1 ? "s":""]."
QDEL_IN(src, 3) //so the animation completes properly
diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm
index 9f8e0707f08..22f74fed564 100644
--- a/code/game/gamemodes/clock_cult/clock_unsorted.dm
+++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm
@@ -1,16 +1,25 @@
//sends messages via hierophant
-/proc/send_hierophant_message(mob/user, message, name_span = "heavy_brass", message_span = "brass", user_title = "Servant")
+/proc/titled_hierophant_message(mob/user, message, name_span = "heavy_brass", message_span = "brass", user_title = "Servant")
if(!user || !message || !ticker || !ticker.mode)
return 0
- var/parsed_message = "[user_title ? "[user_title] ":""][findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: \"[message]\""
- for(var/M in mob_list)
- if(isobserver(M))
- var/link = FOLLOW_LINK(M, user)
- M << "[link] [parsed_message]"
- else if(is_servant_of_ratvar(M))
- M << parsed_message
+ var/parsed_message = "[user_title ? "[user_title] ":""][findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: \
+ \"[message]\""
+ hierophant_message(parsed_message, FALSE, user)
return 1
+/proc/hierophant_message(message, servantsonly, atom/target) //sends a generic message to all servants and optionally observers
+ if(!message || !ticker || !ticker.mode)
+ return 0
+ for(var/M in mob_list)
+ if(!servantsonly && isobserver(M))
+ if(target)
+ var/link = FOLLOW_LINK(M, target)
+ M << "[link] [message]"
+ else
+ M << message
+ else if(is_servant_of_ratvar(M))
+ M << message
+
//Function Call action: Calls forth a Ratvarian spear.
/datum/action/innate/function_call
name = "Function Call"
@@ -111,6 +120,23 @@
return 1 //12 or more non-brain servants, 5+ clockwork caches, at least 250 CV, and there are no living, non-servant ais
return 0
+/proc/scripture_unlock_alert(list/previous_states) //reports to servants when scripture is locked or unlocked
+ var/list/states = get_scripture_states()
+ for(var/i in states)
+ if(states[i] != previous_states[i])
+ hierophant_message("Hierophant Network:[i] Scripture has been [states[i] ? "un":""]locked.")
+
+/proc/get_scripture_states() //returns the current unlock states of each unlockable scripture tier
+ . = list("Script" = scripture_unlock_check(SCRIPTURE_SCRIPT), \
+ "Application" = scripture_unlock_check(SCRIPTURE_APPLICATION), \
+ "Revenant" = scripture_unlock_check(SCRIPTURE_REVENANT), \
+ "Judgement" = scripture_unlock_check(SCRIPTURE_JUDGEMENT))
+
+/proc/change_construction_value(amount)
+ var/list/scripture_states = get_scripture_states()
+ clockwork_construction_value += amount
+ scripture_unlock_alert(scripture_states)
+
/proc/generate_cache_component(specific_component_id) //generates a component in the global component cache, either random based on lowest or a specific component
if(specific_component_id)
clockwork_component_cache[specific_component_id]++
@@ -164,13 +190,20 @@ This cipher is known as "rot13" for "rotate 13 places" and there are many sites
sentence thirteen places ahead changes it right back to plain English.
There are, however, a few parts of the Ratvarian tongue that aren't typical and are implemented for fluff reasons. Some words may have apostrophes, hyphens, and spaces, making the plain
-English translation apparent but disjoined (for instance, "Oru`byq zl-cbjre!" translates directly to "Beh'old my-power!") although this can be ignored without impacting overall quality. When
-translating from Ratvar's tongue to plain English, simply remove the disjointments and use the finished sentence. This would make "Oru`byq zl-cbjre!" into "Behold my power!" after removing the
+English translation apparent but disjoined (for instance, "Orubyq zl-cbjre!" translates directly to "Behold my-power!") although this can be ignored without impacting overall quality. When
+translating from Ratvar's tongue to plain English, simply remove the disjointments and use the finished sentence. This would make "Orubyq zl-cbjre!" into "Behold my power!" after removing the
abnormal spacing, hyphens, and grave accents.
List of nuances:
-- Any time the word "of" occurs, it is linked to the previous word by a hyphen. If it is the first word, nothing is done. (i.e. "V nz-bs Ratvar." directly translates to "I am-of Ratvar.")
+- Any time the word "of" occurs, it is linked to the previous word by a hyphen. (i.e. "V nz-bs Ratvar." directly translates to "I am-of Ratvar.")
+- Any time "th", followed by any two letters occurs, you add an apostrophe between those two letters, i.e; "Thi's"
+- In the same vein, any time "ti", followed by one letter occurs, you add an apostrophe between "i" and the letter, i.e; "Ti'me"
+- Whereever "te" or "et" appear and there is another letter next to the e(i.e; "m"etal, greate"r"), add a hyphen between "e" and the letter, i.e; "M-etal", "Greate-r"
+- Where the word "and" appears, it is linked to the previous and following words by hyphens, i.e; "Sword-and-shield"
+- Where the word "to" appears, it is linked to the following word by a hyphen, i.e; "to-use"
+- Where the word "my" appears, it is linked to the following word by a hyphen, i.e; "my-light"
+
- Although "Ratvar" translates to "Engine" in English, the word "Ratvar" is used regardless of language as it is a proper noun.
- The same rule applies to Ratvar's four generals: Nezbere (Armorer), Sevtug (Fright), Nzcrentr (Amperage), and Inath-Neq (Vangu-Ard), although these words can be used in proper context if one is
not referring to the four generals and simply using the words themselves.
diff --git a/code/game/gamemodes/clock_cult/clockwork_proselytizer.dm b/code/game/gamemodes/clock_cult/clockwork_proselytizer.dm
index 00b27d33c11..34d5c4c8f17 100644
--- a/code/game/gamemodes/clock_cult/clockwork_proselytizer.dm
+++ b/code/game/gamemodes/clock_cult/clockwork_proselytizer.dm
@@ -168,6 +168,15 @@
/turf/open/floor/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
return list("operation_time" = 30, "new_obj_type" = /turf/open/floor/clockwork, "alloy_cost" = REPLICANT_FLOOR, "spawn_dir" = SOUTH)
+/turf/open/floor/plating/asteroid/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return FALSE
+
+/turf/open/floor/plating/ash/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return FALSE
+
+/turf/open/floor/plating/lava/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
+ return FALSE
+
/turf/open/floor/clockwork/proselytize_vals(mob/living/user, obj/item/clockwork/clockwork_proselytizer/proselytizer)
for(var/obj/O in src)
if(O.density && !O.CanPass(user, src, 5))
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index fee57bedabf..3ada1efa834 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -176,7 +176,7 @@
var/datum/action/innate/cultcomm/C = new()
C.Grant(cult_mind.current)
update_cult_icons_added(cult_mind)
- cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!"
+ cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult of Nar'Sie!"
if(jobban_isbanned(cult_mind.current, ROLE_CULTIST))
replace_jobbaned_player(cult_mind.current, ROLE_CULTIST, ROLE_CULTIST)
return 1
@@ -200,7 +200,7 @@
cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the Dark One and all your memories as its servant."
cult_mind.memory = ""
update_cult_icons_removed(cult_mind)
- cult_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the cult!"
+ cult_mind.current.attack_log += "\[[time_stamp()]\] Has renounced the cult of Nar'Sie!"
if(show_message)
for(var/mob/M in viewers(cult_mind.current))
M << "[cult_mind.current] looks like they just reverted to their old faith!"
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 0653daa9a84..f328546feed 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -93,23 +93,6 @@
world << "The AI cleansed the station of life with the doomsday device!"
ticker.force_ending = 1
-/datum/AI_Module/large/fireproof_core
- module_name = "Core Upgrade"
- mod_pick_name = "coreup"
- description = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent."
- cost = 50
- one_time = 1
-
- power_type = /mob/living/silicon/ai/proc/fireproof_core
-
-/mob/living/silicon/ai/proc/fireproof_core()
- set category = "Malfunction"
- set name = "Fireproof Core"
- for(var/mob/living/silicon/ai/ai in player_list)
- ai.fire_res_on_core = 1
- src.verbs -= /mob/living/silicon/ai/proc/fireproof_core
- src << "Core fireproofed."
-
/datum/AI_Module/large/upgrade_turrets
module_name = "AI Turret Upgrade"
mod_pick_name = "turret"
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index 1e7ed6c4bce..b1420d8cb03 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -250,8 +250,8 @@
PoolOrNew(/obj/effect/overlay/temp/revenant, T)
if(!istype(T, /turf/open/floor/plating) && !istype(T, /turf/open/floor/engine/cult) && istype(T, /turf/open/floor) && prob(15))
var/turf/open/floor/floor = T
- if(floor.intact)
- floor.builtin_tile.loc = floor
+ if(floor.intact && floor.floor_tile)
+ PoolOrNew(floor.floor_tile, floor)
floor.broken = 0
floor.burnt = 0
floor.make_plating(1)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 3d379f407cb..e30be6c7de3 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -358,7 +358,8 @@
else if(!helmet && !mask && !suit && !storage && !occupant)
return
else
- occupant << "[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!"
+ if(occupant)
+ occupant << "[src]'s confines grow warm, then hot, then scorching. You're being burned [!occupant.stat ? "alive" : "away"]!"
cook()
. = TRUE
if("dispense")
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 9c15ae94baf..3a6c7c421ac 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -305,7 +305,9 @@
if(canister.charges[STANDARD_CHARGE] == 0)
user << "This [canister.name] is empty!"
else
- var/transfered = refill_inventory(canister,product_records,user)
+ var/transfered = refill_inventory(canister,product_records,STANDARD_CHARGE)
+ transfered += refill_inventory(canister,coin_records,COIN_CHARGE)
+ transfered += refill_inventory(canister,hidden_records,CONTRABAND_CHARGE)
if(transfered)
user << "You loaded [transfered] items in \the [name]."
else
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index fb2b874454d..2ce6abca4a9 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -567,11 +567,24 @@ obj/item/proc/item_action_slot_check(slot, mob/user)
else
. = pick('sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg')
-/obj/item/proc/open_flame()
+/obj/item/proc/open_flame(flame_heat=700)
var/turf/location = loc
if(ismob(location))
var/mob/M = location
- if(M.l_hand == src || M.r_hand == src)
+ var/success = FALSE
+ if(src == M.get_item_by_slot(slot_l_hand))
+ success = TRUE
+ else if(src == M.get_item_by_slot(slot_r_hand))
+ success = TRUE
+ else if(src == M.get_item_by_slot(slot_wear_mask))
+ success = TRUE
+ if(success)
location = get_turf(M)
if(isturf(location))
- location.hotspot_expose(700, 5)
+ location.hotspot_expose(flame_heat, 5)
+
+/obj/item/proc/ignition_effect(atom/A, mob/user)
+ if(is_hot())
+ . = "[user] lights [A] with [src]."
+ else
+ . = ""
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index f6605a6fef0..c5ae2345881 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -31,39 +31,20 @@
/obj/item/candle/attackby(obj/item/weapon/W, mob/user, params)
..()
- if(istype(W, /obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.isOn()) //Badasses dont get blinded by lighting their candle with a welding tool
- light("[user] casually lights the [name] with [W], what a badass.")
- else if(istype(W, /obj/item/weapon/lighter))
- var/obj/item/weapon/lighter/L = W
- if(L.lit)
- light()
- else if(istype(W, /obj/item/weapon/match))
- var/obj/item/weapon/match/M = W
- if(M.lit)
- light()
- else if(istype(W, /obj/item/candle))
- var/obj/item/candle/C = W
- if(C.lit)
- light()
- else if(istype(W, /obj/item/clothing/mask/cigarette))
- var/obj/item/clothing/mask/cigarette/M = W
- if(M.lit)
- light()
+ var/msg = W.ignition_effect(src, user)
+ if(msg)
+ light(msg)
/obj/item/candle/fire_act()
if(!src.lit)
light() //honk
- return
/obj/item/candle/proc/light(show_message)
if(!src.lit)
src.lit = TRUE
//src.damtype = "fire"
if(show_message)
- usr.visible_message(
- "[usr] lights the [name].")
+ usr.visible_message(show_message)
SetLuminosity(CANDLE_LUMINOSITY)
START_PROCESSING(SSobj, src)
update_icon()
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index 621d8df12fb..4aaebba55c0 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -5,6 +5,7 @@
icon = 'icons/obj/cardboard_cutout.dmi'
icon_state = "cutout_basic"
w_class = 4
+ burn_state = FLAMMABLE
var/list/possible_appearances = list("Assistant", "Clown", "Mime", "Traitor", "Nuke Op", "Cultist", "Clockwork Cultist", "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Swarmer", \
"Ash Walker", "Deathsquad Officer", "Ian") //Possible restyles for the cutout; add an entry in change_appearance() if you add to here
var/pushed_over = FALSE //If the cutout is pushed over and has to be righted
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index dd03f04863f..2cbe518d65d 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -199,9 +199,7 @@ obj/item/device/flashlight/lamp/bananalamp
..()
/obj/item/device/flashlight/flare/process()
- var/turf/pos = get_turf(src)
- if(pos)
- pos.hotspot_expose(produce_heat, 5)
+ open_flame(heat)
fuel = max(fuel - 1, 0)
if(!fuel || !on)
turn_off()
@@ -209,6 +207,13 @@ obj/item/device/flashlight/lamp/bananalamp
icon_state = "[initial(icon_state)]-empty"
STOP_PROCESSING(SSobj, src)
+/obj/item/device/flashlight/flare/ignition_effect(atom/A, mob/user)
+ if(fuel && on)
+ . = "[user] lights [A] with [src] like a real \
+ badass."
+ else
+ . = ""
+
/obj/item/device/flashlight/flare/proc/turn_off()
on = 0
force = initial(src.force)
diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm
index bddd8c2f251..fc6b74dabb9 100644
--- a/code/game/objects/items/stacks/sheets/light.dm
+++ b/code/game/objects/items/stacks/sheets/light.dm
@@ -29,7 +29,7 @@
var/obj/item/stack/sheet/metal/M = O
if (M.use(1))
use(1)
- var/obj/item/stack/tile/light/L = new (user.loc)
+ var/obj/item/L = PoolOrNew(/obj/item/stack/tile/light, user.loc)
user << "You make a light tile."
L.add_fingerprint(user)
else
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 9ec77c60253..c515549a37d 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -129,6 +129,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 50),\
new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 10),\
new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 50, one_per_turf = 1, on_floor = 1),\
+ new/datum/stack_recipe("baseball bat", /obj/item/weapon/melee/baseball_bat, 5, time = 15),\
)
/obj/item/stack/sheet/mineral/wood
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 10607785a4e..8d8b89760fe 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -18,6 +18,10 @@
pixel_x = rand(-3, 3)
pixel_y = rand(-3, 3) //randomize a little
+/obj/item/stack/tile/Destroy()
+ ..()
+ return QDEL_HINT_PUTINPOOL
+
/obj/item/stack/tile/attackby(obj/item/W, mob/user, params)
if (istype(W, /obj/item/weapon/weldingtool))
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index b6a003be072..a68fe241fd3 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -276,3 +276,17 @@ update_label("John Doe", "Clowny")
/obj/item/weapon/card/id/mining
name = "mining ID"
access = list(access_mining, access_mining_station, access_mineral_storeroom)
+
+/obj/item/weapon/card/id/away
+ name = "a perfectly generic identification card"
+ desc = "A perfectly generic identification card. Looks like it could use some flavor."
+ access = list(access_away_general)
+
+/obj/item/weapon/card/id/away/hotel
+ name = "Staff ID"
+ desc = "A staff ID used to access the hotel's doors."
+ access = list(access_away_general, access_away_maint)
+
+/obj/item/weapon/card/id/away/hotel/securty
+ name = "Officer ID"
+ access = list(access_away_general, access_away_maint, access_away_sec)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index cce7af5ab06..992ebfbcf4f 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -20,28 +20,26 @@ CIGARETTE PACKETS ARE IN FANCY.DM
desc = "A simple match stick, used for lighting fine smokables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "match_unlit"
- var/lit = 0
+ var/lit = FALSE
+ var/burnt = FALSE
var/smoketime = 5
w_class = 1
origin_tech = "materials=1"
heat = 1000
/obj/item/weapon/match/process()
- var/turf/location = get_turf(src)
smoketime--
if(smoketime < 1)
matchburnout()
- return
- if(location)
- location.hotspot_expose(700, 5)
- return
+ else
+ open_flame(heat)
/obj/item/weapon/match/fire_act()
matchignite()
/obj/item/weapon/match/proc/matchignite()
- if(lit == 0)
- lit = 1
+ if(!lit && !burnt)
+ lit = TRUE
icon_state = "match_lit"
damtype = "fire"
force = 3
@@ -52,31 +50,31 @@ CIGARETTE PACKETS ARE IN FANCY.DM
attack_verb = list("burnt","singed")
START_PROCESSING(SSobj, src)
update_icon()
- return
/obj/item/weapon/match/proc/matchburnout()
- if(lit == 1)
- lit = -1
+ if(lit)
+ lit = FALSE
+ burnt = TRUE
damtype = "brute"
force = initial(force)
icon_state = "match_burnt"
item_state = "cigoff"
name = "burnt match"
desc = "A match. This one has seen better days."
- attack_verb = null
+ attack_verb = list("flicked")
STOP_PROCESSING(SSobj, src)
/obj/item/weapon/match/dropped(mob/user)
matchburnout()
- return ..()
+ . = ..()
/obj/item/weapon/match/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!isliving(M))
return
- if(M.IgniteMob())
+ if(lit && M.IgniteMob())
message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
log_game("[key_name(user)] set [key_name(M)] on fire")
- var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M,user)
+ var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "The [cig.name] is already lit."
@@ -87,12 +85,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
..()
-/obj/item/proc/help_light_cig(mob/living/carbon/M, mob/living/carbon/user)
- if(!iscarbon(M))
- return
- if(istype(M.wear_mask, /obj/item/clothing/mask/cigarette))
- var/obj/item/clothing/mask/cigarette/cig = M.wear_mask
- return cig
+/obj/item/proc/help_light_cig(mob/living/M)
+ var/mask_item = M.get_item_by_slot(slot_wear_mask)
+ if(istype(mask_item, /obj/item/clothing/mask/cigarette))
+ return mask_item
/obj/item/weapon/match/is_hot()
return lit * heat
@@ -123,7 +119,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/New()
..()
- create_reagents(chem_volume) // making the cigarette a chemical holder with a maximum volume of 15
+ create_reagents(chem_volume)
reagents.set_reacting(FALSE) // so it doesn't react until you light it
reagents.add_reagent("nicotine", 15)
@@ -134,8 +130,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
. = ..()
/obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W, mob/user, params)
- if(!lit && smoketime > 0 && W.is_hot())
- var/lighting_text = is_lighter(W,user)
+ if(!lit && smoketime > 0)
+ var/lighting_text = W.ignition_effect(src, user)
if(lighting_text)
light(lighting_text)
else
@@ -154,29 +150,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
user << "[src] is full."
-/obj/item/clothing/mask/cigarette/proc/is_lighter(obj/item/O, mob/user)
- var/lighting_text = null
- if(istype(O, /obj/item/weapon/weldingtool))
- lighting_text = "[user] casually lights the [name] with [O], what a badass."
- else if(istype(O, /obj/item/weapon/lighter/greyscale)) // we have to check for this first -- zippo lighters are default
- lighting_text = "After some fiddling, [user] manages to light their [name] with [O]."
- else if(istype(O, /obj/item/weapon/lighter))
- lighting_text = "With a single flick of their wrist, [user] smoothly lights their [name] with [O]. Damn they're cool."
- else if(istype(O, /obj/item/weapon/melee/energy))
- var/in_mouth = ""
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- if(C.wear_mask == src)
- in_mouth = ", barely missing their nose"
- lighting_text = "[user] swings their \
- [O][in_mouth]. They light their [name] in the process."
- else if(istype(O, /obj/item/device/assembly/igniter))
- lighting_text = "[user] fiddles with [O], and manages to light their [name]."
- else if(istype(O, /obj/item/device/flashlight/flare))
- lighting_text = "[user] lights their [name] with [O] like a real badass."
- else if(O.is_hot())
- lighting_text = "[user] lights their [name] with [O]."
- return lighting_text
/obj/item/clothing/mask/cigarette/proc/light(flavor_text = null)
if(lit)
@@ -255,17 +228,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM
handle_reagents()
/obj/item/clothing/mask/cigarette/attack_self(mob/user)
- if(lit == 1)
+ if(lit)
user.visible_message("[user] calmly drops and treads on \the [src], putting it out instantly.")
new type_butt(user.loc)
new /obj/effect/decal/cleanable/ash(user.loc)
qdel(src)
- return ..()
+ . = ..()
/obj/item/clothing/mask/cigarette/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M))
return ..()
- var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M,user)
+ var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "The [cig.name] is already lit."
@@ -303,7 +276,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..()
reagents.add_reagent("mushroomhallucinogen", 50)
light()
- //for(var/mob/M in player_list) M << 'sound/misc/Smoke_Weed_Everyday.ogg'
/obj/item/weapon/cigbutt/roach
@@ -407,7 +379,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
open_flame()
if(reagents && reagents.total_volume) // check if it has any reagents at all
handle_reagents()
- return
/obj/item/clothing/mask/cigarette/pipe/attackby(obj/item/O, mob/user, params)
@@ -427,7 +398,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
else
user << "It is already packed!"
else
- var/lighting_text = is_lighter(O,user)
+ var/lighting_text = O.ignition_effect(src,user)
if(lighting_text)
if(smoketime > 0)
light(lighting_text)
@@ -489,6 +460,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM
I.color = color2hex(randomColor(1))
add_overlay(I)
+/obj/item/weapon/lighter/greyscale/ignition_effect(atom/A, mob/user)
+ . = "After some fiddling, [user] manages to \
+ light [A] with [src]."
+
+/obj/item/weapon/lighter/ignition_effect(atom/A, mob/user)
+ . = "With a single flick of their wrist, [user] \
+ smoothly lights [A] with [src]. Damn they're cool."
+
/obj/item/weapon/lighter/update_icon()
icon_state = lit ? "[icon_state]_on" : "[initial(icon_state)]"
@@ -526,14 +505,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.AddLuminosity(-1)
STOP_PROCESSING(SSobj, src)
else
- return ..()
- return
+ . = ..()
/obj/item/weapon/lighter/attack(mob/living/carbon/M, mob/living/carbon/user)
if(lit && M.IgniteMob())
message_admins("[key_name_admin(user)] set [key_name_admin(M)] on fire")
log_game("[key_name(user)] set [key_name(M)] on fire")
- var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M,user)
+ var/obj/item/clothing/mask/cigarette/cig = help_light_cig(M)
if(lit && cig && user.a_intent == "help")
if(cig.lit)
user << "The [cig.name] is already lit."
@@ -548,18 +526,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM
..()
/obj/item/weapon/lighter/process()
- var/turf/location = get_turf(src)
- if(location)
- location.hotspot_expose(700, 5)
- return
+ open_flame()
/obj/item/weapon/lighter/pickup(mob/user)
..()
if(lit)
SetLuminosity(0)
user.AddLuminosity(1)
- return
-
/obj/item/weapon/lighter/dropped(mob/user)
..()
@@ -567,7 +540,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(user)
user.AddLuminosity(-1)
SetLuminosity(1)
- return
/obj/item/weapon/lighter/is_hot()
return lit * heat
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index c3512dfc983..fc5ffa9c2b9 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -177,4 +177,3 @@
theturf.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5)
user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.")
- return
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 05a607c1a3b..05b11d8ab94 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -265,15 +265,13 @@
/obj/item/weapon/nullrod/fedora
name = "atheist's fedora"
- desc = "The brim of the hat is as sharp as your wit. Throwing it at someone would hurt almost as much as disproving the existence of God."
+ desc = "The brim of the hat is as sharp as your wit. The edge would hurt almost as much as disproving the existence of God."
icon_state = "fedora"
item_state = "fedora"
slot_flags = SLOT_HEAD
icon = 'icons/obj/clothing/hats.dmi'
- force = 0
- throw_speed = 4
- throw_range = 7
- throwforce = 20
+ sharpness = IS_SHARP
+ attack_verb = list("enlightened", "redpilled")
/obj/item/weapon/nullrod/armblade
name = "dark blessing"
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 15c710b40de..0cc98cd62a3 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -63,6 +63,16 @@
if(item_color == null)
item_color = pick("red", "blue", "green", "purple")
+/obj/item/weapon/melee/energy/sword/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/item/weapon/melee/energy/sword/process()
+ if(active)
+ open_flame()
+ else
+ STOP_PROCESSING(SSobj, src)
+
/obj/item/weapon/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
if(active)
return ..()
@@ -87,6 +97,7 @@
w_class = w_class_on
playsound(user, 'sound/weapons/saberon.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
user << "[src] is now active."
+ START_PROCESSING(SSobj, src)
else
force = initial(force)
throwforce = initial(throwforce)
@@ -98,11 +109,26 @@
w_class = initial(w_class)
playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) //changed it from 50% volume to 35% because deafness
user << "[src] can now be concealed."
+ STOP_PROCESSING(SSobj, src)
add_fingerprint(user)
/obj/item/weapon/melee/energy/is_hot()
return active * heat
+/obj/item/weapon/melee/energy/ignition_effect(atom/A, mob/user)
+ if(!active)
+ return ""
+
+ var/in_mouth = ""
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(C.wear_mask == src)
+ in_mouth = ", barely missing their nose"
+ . = "[user] swings their \
+ [src][in_mouth]. They light [A] in the process."
+ playsound(loc, hitsound, get_clamped_volume(), 1, -1)
+ add_fingerprint(user)
+
/obj/item/weapon/melee/energy/sword/cyborg
var/hitcost = 50
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index ec8b97b9099..4626db9cbbe 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -285,7 +285,7 @@
/obj/item/weapon/storage/backpack/satchel_flat/New()
..()
- new /obj/item/stack/tile/plasteel(src)
+ PoolOrNew(/obj/item/stack/tile/plasteel, src)
new /obj/item/weapon/crowbar(src)
/obj/item/weapon/storage/backpack/dufflebag
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index 843d8753379..b65525eb552 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -60,7 +60,7 @@
qdel(air_contents)
STOP_PROCESSING(SSobj, src)
- return ..()
+ . = ..()
/obj/item/weapon/tank/examine(mob/user)
var/obj/icon = src
@@ -127,7 +127,7 @@
else if(istype(W, /obj/item/device/assembly_holder))
bomb_assemble(W,user)
else
- return ..()
+ . = ..()
/obj/item/weapon/tank/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = hands_state)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index e831ed3fd98..3d5d9cf99e9 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -342,11 +342,11 @@
check_fuel()
if(M)
M.flash_eyes(light_intensity)
- return 1
+ return TRUE
else
if(M)
M << "You need more welding fuel to complete this task!"
- return 0
+ return FALSE
//Returns whether or not the welding tool is currently on.
@@ -424,7 +424,13 @@
user.put_in_hands(F)
else
user << "You need one rod to start building a flamethrower!"
- return
+
+/obj/item/weapon/weldingtool/ignition_effect(atom/A, mob/user)
+ if(welding && remove_fuel(1, user))
+ . = "[user] casually lights [A] with [src], \
+ what a badass."
+ else
+ . = ""
/obj/item/weapon/weldingtool/largetank
name = "industrial welding tool"
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 7d8fcc93fb5..d1be98828ea 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -211,15 +211,19 @@
var/hacked = 0
/obj/item/weapon/twohanded/dualsaber/New()
+ ..()
item_color = pick("red", "blue", "green", "purple")
+/obj/item/weapon/twohanded/dualsaber/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
/obj/item/weapon/twohanded/dualsaber/update_icon()
if(wielded)
icon_state = "dualsaber[item_color][wielded]"
else
icon_state = "dualsaber0"
clean_blood()//blood overlays get weird otherwise, because the sprite changes.
- return
/obj/item/weapon/twohanded/dualsaber/attack(mob/target, mob/living/carbon/human/user)
if(user.has_dna())
@@ -232,12 +236,14 @@
impale(user)
return
if((wielded) && prob(50))
- spawn(0)
- for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2))
- user.setDir(i)
- if(i == 8)
- user.emote("flip")
- sleep(1)
+ addtimer(src, "jedi_spin", 0, TRUE, user)
+
+/obj/item/weapon/twohanded/dualsaber/proc/jedi_spin(mob/living/user)
+ for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2))
+ user.setDir(i)
+ if(i == 8)
+ user.emote("flip")
+ sleep(1)
/obj/item/weapon/twohanded/dualsaber/proc/impale(mob/living/user)
user << "You twirl around a bit before losing your balance and impaling yourself on \the [src]."
@@ -265,17 +271,41 @@
w_class = w_class_on
..()
hitsound = 'sound/weapons/blade1.ogg'
+ START_PROCESSING(SSobj, src)
/obj/item/weapon/twohanded/dualsaber/unwield() //Specific unwield () to switch hitsounds.
sharpness = initial(sharpness)
w_class = initial(w_class)
..()
hitsound = "swing_hit"
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/weapon/twohanded/dualsaber/process()
+ if(wielded)
+ open_flame()
+ else
+ STOP_PROCESSING(SSobj, src)
/obj/item/weapon/twohanded/dualsaber/IsReflect()
if(wielded)
return 1
+/obj/item/weapon/twohanded/dualsaber/ignition_effect(atom/A, mob/user)
+ // same as /obj/item/weapon/melee/energy, mostly
+ if(!wielded)
+ return ""
+ var/in_mouth = ""
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(C.wear_mask == src)
+ in_mouth = ", barely missing their nose"
+ . = "[user] swings their \
+ [src][in_mouth]. They light [A] in the process."
+ playsound(loc, hitsound, get_clamped_volume(), 1, -1)
+ add_fingerprint(user)
+ // Light your candles while spinning around the room
+ addtimer(src, "jedi_spin", 0, TRUE, user)
+
/obj/item/weapon/twohanded/dualsaber/green/New()
item_color = "green"
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index 8ae1aa3c5c0..e3f2133e3d9 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -25,7 +25,7 @@
/obj/item/weapon/vending_refill/examine(mob/user)
..()
if(charges[1] > 0)
- user << "It can restock [charges[1]] item(s)."
+ user << "It can restock [charges[1]+charges[2]+charges[3]] item(s)."
else
user << "It's empty!"
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index b2d91b3fc2f..6ac246c864d 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -298,3 +298,19 @@
/obj/item/weapon/melee/skateboard/attack_self(mob/user)
new /obj/vehicle/scooter/skateboard(get_turf(user))
qdel(src)
+
+/obj/item/weapon/melee/baseball_bat
+ name = "baseball bat"
+ desc = "There ain't a skull in the league that can withstand a swatter."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "baseball_bat"
+ item_state = "baseball_bat"
+ force = 10
+ throwforce = 12
+ attack_verb = list("beat", "smacked")
+ w_class = 5
+
+/obj/item/weapon/melee/baseball_bat/attack(mob/living/target, mob/living/user)
+ . = ..()
+ var/atom/throw_target = get_edge_target_turf(target, user.dir)
+ target.throw_at(throw_target, rand(1,2), 7, user)
\ No newline at end of file
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 99d92289cbf..7e5a331af87 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -219,5 +219,3 @@
/obj/proc/CanAStarPass()
. = !density
-
-
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index ff71053efee..398474484ea 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -335,7 +335,7 @@
if(!usr.canmove || usr.stat || usr.restrained())
return
- if(iscarbon(usr) || issilicon(usr))
+ if(iscarbon(usr) || issilicon(usr) || isdrone(usr))
attack_hand(usr)
else
usr << "This mob type can't use this verb."
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 04ce2e188f9..dc6ff915a9e 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -41,11 +41,20 @@
return
..()
+/obj/structure/closet/crate/open(mob/living/user)
+ . = ..()
+ if(. && manifest)
+ user << "The manifest is torn off [src]."
+ playsound(src, 'sound/items/poster_ripped.ogg', 75, 1)
+ manifest.forceMove(get_turf(src))
+ manifest = null
+ update_icon()
+
/obj/structure/closet/crate/proc/tear_manifest(mob/user)
- user << "You tear the manifest off of the crate."
+ user << "You tear the manifest off of [src]."
playsound(src, 'sound/items/poster_ripped.ogg', 75, 1)
- manifest.loc = loc
+ manifest.forceMove(loc)
if(ishuman(user))
user.put_in_hands(manifest)
manifest = null
diff --git a/code/game/objects/structures/fireplace.dm b/code/game/objects/structures/fireplace.dm
new file mode 100644
index 00000000000..4da513ce352
--- /dev/null
+++ b/code/game/objects/structures/fireplace.dm
@@ -0,0 +1,153 @@
+#define LOG_BURN_TIMER 150
+#define PAPER_BURN_TIMER 5
+#define MAXIMUM_BURN_TIMER 3000
+
+/obj/structure/fireplace
+ name = "fireplace"
+ desc = "A large stone brick fireplace."
+ icon = 'icons/obj/fireplace.dmi'
+ icon_state = "fireplace"
+ density = FALSE
+ anchored = TRUE
+ pixel_x = -16
+ burn_state = FIRE_PROOF
+ var/lit = FALSE
+
+ var/fuel_added = 0
+ var/flame_expiry_timer
+
+/obj/structure/fireplace/New()
+ ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/structure/fireplace/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/structure/fireplace/proc/try_light(obj/item/O, mob/user)
+ if(lit)
+ user << "It's already lit!"
+ return FALSE
+ if(!fuel_added)
+ user << "[src] needs some fuel to burn!"
+ return FALSE
+ var/msg = O.ignition_effect(src, user)
+ if(msg)
+ visible_message(msg)
+ ignite()
+ return TRUE
+
+/obj/structure/fireplace/attackby(obj/item/T, mob/user)
+ if(istype(T,/obj/item/stack/sheet/mineral/wood))
+ var/obj/item/stack/sheet/mineral/wood/wood = T
+ var/space_remaining = MAXIMUM_BURN_TIMER - burn_time_remaining()
+ var/space_for_logs = round(space_remaining / LOG_BURN_TIMER)
+ if(space_for_logs < 1)
+ user << "You can't fit any more of [T] in \
+ [src]!"
+ return
+ var/logs_used = min(space_for_logs, wood.amount)
+ wood.use(logs_used)
+ adjust_fuel_timer(LOG_BURN_TIMER * logs_used)
+ user.visible_message("[user] tosses some \
+ wood into [src].", "You add \
+ some fuel to [src].")
+ else if(istype(T, /obj/item/weapon/paper_bin))
+ var/obj/item/weapon/paper_bin/paper_bin = T
+ user.visible_message("[user] throws [T] into \
+ [src].", "You add [T] to [src].\
+ ")
+ adjust_fuel_timer(PAPER_BURN_TIMER * paper_bin.amount)
+ qdel(paper_bin)
+ else if(istype(T, /obj/item/weapon/paper))
+ user.visible_message("[user] throws [T] into \
+ [src].", "You throw [T] into [src].\
+ ")
+ adjust_fuel_timer(PAPER_BURN_TIMER)
+ qdel(T)
+ else if(try_light(T,user))
+ return
+ else
+ . = ..()
+
+/obj/structure/fireplace/update_icon()
+ cut_overlays()
+ if(lit)
+ switch(burn_time_remaining())
+ if(0 to 500)
+ add_overlay("fireplace_fire0")
+ if(500 to 1000)
+ add_overlay("fireplace_fire1")
+ if(1000 to 1500)
+ add_overlay("fireplace_fire2")
+ if(1500 to 2000)
+ add_overlay("fireplace_fire3")
+ if(2000 to MAXIMUM_BURN_TIMER)
+ add_overlay("fireplace_fire4")
+ add_overlay("fireplace_glow")
+
+/obj/structure/fireplace/proc/adjust_light()
+ if(!lit)
+ SetLuminosity(0)
+ return
+
+ switch(burn_time_remaining())
+ if(0 to 500)
+ SetLuminosity(1)
+ if(500 to 1000)
+ SetLuminosity(2)
+ if(1000 to 1500)
+ SetLuminosity(3)
+ if(1500 to 2000)
+ SetLuminosity(4)
+ if(2000 to MAXIMUM_BURN_TIMER)
+ SetLuminosity(6)
+
+/obj/structure/fireplace/process()
+ if(!lit)
+ return
+ if(world.time > flame_expiry_timer)
+ put_out()
+ return
+
+ playsound(src, 'sound/effects/comfyfire.ogg',50,0, 0, 1)
+ var/turf/T = get_turf(src)
+ T.hotspot_expose(700, 5)
+ update_icon()
+ adjust_light()
+
+/obj/structure/fireplace/extinguish()
+ if(lit)
+ var/fuel = burn_time_remaining()
+ flame_expiry_timer = 0
+ put_out()
+ adjust_fuel_timer(fuel)
+ . = ..()
+
+/obj/structure/fireplace/proc/adjust_fuel_timer(amount)
+ if(lit)
+ flame_expiry_timer += amount
+ if(burn_time_remaining() < MAXIMUM_BURN_TIMER)
+ flame_expiry_timer = world.time + MAXIMUM_BURN_TIMER
+ else
+ fuel_added = Clamp(fuel_added + amount, 0, MAXIMUM_BURN_TIMER)
+
+/obj/structure/fireplace/proc/burn_time_remaining()
+ if(lit)
+ return max(0, flame_expiry_timer - world.time)
+ else
+ return max(0, fuel_added)
+
+/obj/structure/fireplace/proc/ignite()
+ lit = TRUE
+ desc = "A large stone brick fireplace, warm and cozy."
+ flame_expiry_timer = world.time + fuel_added
+ fuel_added = 0
+ update_icon()
+ adjust_light()
+
+/obj/structure/fireplace/proc/put_out()
+ lit = FALSE
+ update_icon()
+ adjust_light()
+ desc = initial(desc)
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index 6478cdc849a..eacf94f5260 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -40,7 +40,7 @@
/obj/structure/fluff/empty_sleeper/nanotrasen
name = "broken hypersleep chamber"
- desc = "A NanoTrasen hypersleep chamber - this one appears broken. \
+ desc = "A Nanotrasen hypersleep chamber - this one appears broken. \
There are exposed bolts for easy disassembly using a wrench."
icon_state = "sleeper-o"
@@ -55,6 +55,17 @@
/obj/structure/fluff/broken_flooring
name = "broken tiling"
- desc = "A segment of broken flooring"
+ desc = "A segment of broken flooring."
icon = 'icons/obj/brokentiling.dmi'
icon_state = "corner"
+
+/obj/structure/fluff/drake_statue //Ash drake status spawn on either side of the necropolis gate in lavaland.
+ name = "drake statue"
+ desc = "A towering basalt sculpture of a proud and regal drake. Its eyes are six glowing gemstones."
+ icon = 'icons/effects/64x64.dmi'
+ icon_state = "drake_statue"
+ density = TRUE
+
+/obj/structure/fluff/drake_statue/falling //A variety of statue in disrepair; parts are broken off and a gemstone is missing
+ desc = "A towering basalt sculpture of a drake. Cracks run down its surface and parts of it have fallen off."
+ icon_state = "drake_statue_falling"
diff --git a/code/game/pooling/pool.dm b/code/game/pooling/pool.dm
index ebbcebeb959..e99df9c5b0b 100644
--- a/code/game/pooling/pool.dm
+++ b/code/game/pooling/pool.dm
@@ -40,14 +40,22 @@ var/global/list/GlobalPool = list()
if(!get_type)
return
+ if(SSpool)
+ INCREMENT_TALLY(SSpool.stats_pooled_or_newed, get_type)
+
. = GetFromPool(get_type,second_arg)
if(!.)
+ if(SSpool)
+ INCREMENT_TALLY(SSpool.stats_created_new, get_type)
if(ispath(get_type))
if(islist(second_arg))
. = new get_type (arglist(second_arg))
else
. = new get_type (second_arg)
+ else
+ if(SSpool)
+ INCREMENT_TALLY(SSpool.stats_reused, get_type)
/proc/GetFromPool(get_type,second_arg)
@@ -88,6 +96,9 @@ var/global/list/GlobalPool = list()
if(diver in GlobalPool[diver.type])
return
+ if(SSpool)
+ INCREMENT_TALLY(SSpool.stats_placed_in_pool, diver.type)
+
if(!GlobalPool[diver.type])
GlobalPool[diver.type] = list()
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 535b943a060..b41861c5448 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -19,7 +19,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
//NOTE: Floor code has been refactored, many procs were removed and refactored
//- you should use istype() if you want to find out whether a floor has a certain type
//- floor_tile is now a path, and not a tile obj
- //- builtin_tile should be dropped if needed for performance reasons (eg singularity_act())
name = "floor"
icon = 'icons/turf/floors.dmi'
@@ -31,7 +30,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
var/broken = 0
var/burnt = 0
var/floor_tile = null //tile that this floor drops
- var/obj/item/stack/tile/builtin_tile = null //needed for performance reasons when the singularity rips off floor tiles
var/list/broken_states = list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5")
var/list/burnt_states = list()
@@ -41,14 +39,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
icon_regular_floor = "floor"
else
icon_regular_floor = icon_state
- if(floor_tile)
- builtin_tile = new floor_tile
-
-/turf/open/floor/Destroy()
- if(builtin_tile)
- qdel(builtin_tile)
- builtin_tile = null
- return ..()
/turf/open/floor/ex_act(severity, target)
var/shielded = is_shielded()
@@ -58,8 +48,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
if(target == src)
src.ChangeTurf(src.baseturf)
if(target != null)
- ex_act(3)
- return
+ severity = 3
switch(severity)
if(1)
@@ -151,7 +140,8 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
user << "You forcefully pry off the planks, destroying them in the process."
else
user << "You remove the floor tile."
- builtin_tile.loc = src
+ if(floor_tile)
+ PoolOrNew(floor_tile, src)
make_plating()
playsound(src, 'sound/items/Crowbar.ogg', 80, 1)
return 1
@@ -160,18 +150,18 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/open/floor/singularity_pull(S, current_size)
if(current_size == STAGE_THREE)
if(prob(30))
- if(builtin_tile)
- builtin_tile.loc = src
+ if(floor_tile)
+ PoolOrNew(floor_tile, src)
make_plating()
else if(current_size == STAGE_FOUR)
if(prob(50))
- if(builtin_tile)
- builtin_tile.loc = src
+ if(floor_tile)
+ PoolOrNew(floor_tile, src)
make_plating()
else if(current_size >= STAGE_FIVE)
- if(builtin_tile)
+ if(floor_tile)
if(prob(70))
- builtin_tile.loc = src
+ PoolOrNew(floor_tile, src)
make_plating()
else if(prob(50))
ReplaceWithLattice()
@@ -186,4 +176,4 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/open/floor/initialize()
..()
- MakeDirty()
\ No newline at end of file
+ MakeDirty()
diff --git a/code/game/turfs/simulated/floor/light_floor.dm b/code/game/turfs/simulated/floor/light_floor.dm
index 62b64373140..e4895097777 100644
--- a/code/game/turfs/simulated/floor/light_floor.dm
+++ b/code/game/turfs/simulated/floor/light_floor.dm
@@ -12,10 +12,6 @@
/turf/open/floor/light/New()
..()
- spawn(5) //needed because when placing a light floor tile it will take a short while before setting state
- if(istype(builtin_tile, /obj/item/stack/tile/light))
- var/obj/item/stack/tile/light/L = builtin_tile
- L.state = state
update_icon()
/turf/open/floor/light/update_icon()
diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm
index 98d64b763cb..79d45dd78f2 100644
--- a/code/game/turfs/simulated/floor/misc_floor.dm
+++ b/code/game/turfs/simulated/floor/misc_floor.dm
@@ -123,11 +123,17 @@
..()
PoolOrNew(/obj/effect/overlay/temp/ratvar/floor, src)
PoolOrNew(/obj/effect/overlay/temp/ratvar/beam, src)
- clockwork_construction_value++
+ change_construction_value(1)
/turf/open/floor/clockwork/Destroy()
STOP_PROCESSING(SSobj, src)
- clockwork_construction_value--
+ change_construction_value(-1)
+ return ..()
+
+/turf/open/floor/clockwork/ChangeTurf(path, defer_change = FALSE)
+ if(path != type)
+ STOP_PROCESSING(SSobj, src)
+ change_construction_value(-1)
return ..()
/turf/open/floor/clockwork/Entered(atom/movable/AM)
@@ -160,9 +166,11 @@
/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/crowbar))
user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...")
+ playsound(src, 'sound/items/Crowbar.ogg', 20, 1)
if(!do_after(user, 70 / I.toolspeed, target = src))
return 0
user.visible_message("[user] pries up [src]!", "You pry up [src], destroying it!")
+ playsound(src, 'sound/items/Crowbar.ogg', 80, 1)
make_plating()
return 1
return ..()
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index f177df2d679..3a540a57857 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -168,9 +168,9 @@
/turf/open/floor/engine/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
- if(builtin_tile)
+ if(floor_tile)
if(prob(30))
- builtin_tile.loc = src
+ PoolOrNew(floor_tile, src)
make_plating()
else if(prob(30))
ReplaceWithLattice()
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 2207e65ec3c..276964e52a5 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -183,6 +183,7 @@
icon_state = "abductor"
walltype = "abductor"
mineral = "abductor"
+ smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL
sheet_type = /obj/item/stack/sheet/mineral/abductor
slicing_duration = 200 //alien wall takes twice as much time to slice
explosion_block = 3
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index 60c457c86f8..ded0bf46834 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -53,17 +53,23 @@
..()
PoolOrNew(/obj/effect/overlay/temp/ratvar/wall, src)
PoolOrNew(/obj/effect/overlay/temp/ratvar/beam, src)
- clockwork_construction_value += 5
+ change_construction_value(5)
/turf/closed/wall/clockwork/Destroy()
- clockwork_construction_value -= 5
- ..()
+ change_construction_value(-5)
+ return ..()
+
+/turf/closed/wall/clockwork/ChangeTurf(path, defer_change = FALSE)
+ if(path != type)
+ change_construction_value(-5)
+ return ..()
/turf/closed/wall/clockwork/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
- if(!WT.isOn())
+ if(!WT.remove_fuel(0,user))
return 0
+ playsound(src, 'sound/items/Welder.ogg', 100, 1)
user.visible_message("[user] begins slowly breaking down [src]...", "You begin painstakingly destroying [src]...")
if(!do_after(user, 120 / WT.toolspeed, target = src))
return 0
diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm
index 584dc7f4f1a..3f0647b2877 100644
--- a/code/modules/admin/create_poll.dm
+++ b/code/modules/admin/create_poll.dm
@@ -34,7 +34,7 @@
return
/client/proc/create_poll_function()
- var/polltype = input("Choose poll type.","Poll Type") in list("Single Option","Text Reply","Rating","Multiple Choice")
+ var/polltype = input("Choose poll type.","Poll Type") in list("Single Option","Text Reply","Rating","Multiple Choice", "Instant Runoff Voting")|null
var/choice_amount = 0
switch(polltype)
if("Single Option")
@@ -48,6 +48,10 @@
choice_amount = input("How many choices should be allowed?","Select choice amount") as num|null
if(!choice_amount)
return
+ if ("Instant Runoff Voting")
+ polltype = POLLTYPE_IRV
+ else
+ return 0
var/starttime = SQLtime()
var/endtime = input("Set end time for poll as format YYYY-MM-DD HH:MM:SS. All times in server time. HH:MM:SS is optional and 24-hour. Must be later than starting time for obvious reasons.", "Set end time", SQLtime()) as text
if(!endtime)
@@ -117,14 +121,15 @@
if(!option)
return pollid
option = sanitizeSQL(option)
- var/percentagecalc
- switch(alert("Calculate option results as percentage?",,"Yes","No","Cancel"))
- if("Yes")
- percentagecalc = 1
- if("No")
- percentagecalc = 0
- else
- return pollid
+ var/percentagecalc = 1
+ if (polltype != POLLTYPE_IRV)
+ switch(alert("Calculate option results as percentage?",,"Yes","No","Cancel"))
+ if("Yes")
+ percentagecalc = 1
+ if("No")
+ percentagecalc = 0
+ else
+ return pollid
var/minval = 0
var/maxval = 0
var/descmin = ""
@@ -160,9 +165,11 @@
var/err = query_polladd_option.ErrorMsg()
log_game("SQL ERROR adding new poll option to table. Error : \[[err]\]\n")
return pollid
- switch(alert(" ",,"Add option","Finish"))
+ switch(alert(" ",,"Add option","Finish", "Cancel"))
if("Add option")
add_option = 1
if("Finish")
add_option = 0
+ else
+ return 0
return pollid
\ No newline at end of file
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 9c6780d0f21..afe5878b5af 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -17,11 +17,11 @@
C << 'sound/effects/adminhelp.ogg'
C << "- AdminHelp Rejected! -"
- C << "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again"
+ C << "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again."
C << "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting."
- message_admins("[key_name_admin(usr)] Rejected [C.key]'s admin help. [C.key]'s Adminhelp verb has been returned to them")
- log_admin("[key_name(usr)] Rejected [C.key]'s admin help")
+ message_admins("[key_name_admin(usr)] Rejected [C.key]'s admin help. [C.key]'s Adminhelp verb has been returned to them.")
+ log_admin("[key_name(usr)] Rejected [C.key]'s admin help.")
else if(href_list["stickyban"])
stickyban(href_list["stickyban"],href_list)
@@ -185,39 +185,39 @@
switch(bantype)
if(BANTYPE_PERMA)
if(!banckey || !banreason)
- usr << "Not enough parameters (Requires ckey and reason)"
+ usr << "Not enough parameters (Requires ckey and reason)."
return
banduration = null
banjob = null
if(BANTYPE_TEMP)
if(!banckey || !banreason || !banduration)
- usr << "Not enough parameters (Requires ckey, reason and duration)"
+ usr << "Not enough parameters (Requires ckey, reason and duration)."
return
banjob = null
if(BANTYPE_JOB_PERMA)
if(!banckey || !banreason || !banjob)
- usr << "Not enough parameters (Requires ckey, reason and job)"
+ usr << "Not enough parameters (Requires ckey, reason and job)."
return
banduration = null
if(BANTYPE_JOB_TEMP)
if(!banckey || !banreason || !banjob || !banduration)
- usr << "Not enough parameters (Requires ckey, reason and job)"
+ usr << "Not enough parameters (Requires ckey, reason and job)."
return
if(BANTYPE_APPEARANCE)
if(!banckey || !banreason)
- usr << "Not enough parameters (Requires ckey and reason)"
+ usr << "Not enough parameters (Requires ckey and reason)."
return
banduration = null
banjob = null
if(BANTYPE_ADMIN_PERMA)
if(!banckey || !banreason)
- usr << "Not enough parameters (Requires ckey and reason)"
+ usr << "Not enough parameters (Requires ckey and reason)."
return
banduration = null
banjob = null
if(BANTYPE_ADMIN_TEMP)
if(!banckey || !banreason || !banduration)
- usr << "Not enough parameters (Requires ckey, reason and duration)"
+ usr << "Not enough parameters (Requires ckey, reason and duration)."
return
banjob = null
@@ -237,7 +237,7 @@
if(bancid)
banreason = "[banreason] (CUSTOM CID)"
else
- message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob")
+ message_admins("Ban process: A mob matching [playermob.ckey] was found at location [playermob.x], [playermob.y], [playermob.z]. Custom ip and computer id fields replaced with the ip and computer id from the located mob.")
DB_ban_record(bantype, playermob, banduration, banreason, banjob, null, banckey, banip, bancid )
add_note(banckey, banreason, null, usr.ckey, 0)
@@ -255,8 +255,8 @@
if(EMERGENCY_AT_LEAST_DOCKED)
return
SSshuttle.emergency.request()
- log_admin("[key_name(usr)] called the Emergency Shuttle")
- message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station")
+ log_admin("[key_name(usr)] called the Emergency Shuttle.")
+ message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station.")
if("2")
if(EMERGENCY_AT_LEAST_DOCKED)
@@ -264,12 +264,12 @@
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
SSshuttle.emergency.cancel()
- log_admin("[key_name(usr)] sent the Emergency Shuttle back")
- message_admins("[key_name_admin(usr)] sent the Emergency Shuttle back")
+ log_admin("[key_name(usr)] sent the Emergency Shuttle back.")
+ message_admins("[key_name_admin(usr)] sent the Emergency Shuttle back.")
else
SSshuttle.emergency.cancel()
- log_admin("[key_name(usr)] called the Emergency Shuttle")
- message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station")
+ log_admin("[key_name(usr)] called the Emergency Shuttle.")
+ message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station.")
href_list["secrets"] = "check_antagonist"
@@ -280,9 +280,9 @@
var/timer = input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", SSshuttle.emergency.timeLeft() ) as num
SSshuttle.emergency.setTimer(timer*10)
- log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds")
+ log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds.")
minor_announce("The emergency shuttle will reach its destination in [round(SSshuttle.emergency.timeLeft(600))] minutes.")
- message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds")
+ message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds.")
href_list["secrets"] = "check_antagonist"
else if(href_list["toggle_continuous"])
@@ -373,7 +373,7 @@
var/mob/M = locate(href_list["mob"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
var/delmob = 0
@@ -383,8 +383,8 @@
if("Yes")
delmob = 1
- log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
- message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]")
+ log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]")
+ message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]].; deletemob=[delmob]")
switch(href_list["simplemake"])
if("observer")
@@ -482,13 +482,13 @@
return
minutes = CMinutes + mins
duration = GetExp(minutes)
- reason = input(usr,"Please State Reason","Reason",reason2) as message
+ reason = input(usr,"Please State Reason.","Reason",reason2) as message
if(!reason)
return
if("No")
temp = 0
duration = "Perma"
- reason = input(usr,"Please State Reason","Reason",reason2) as message
+ reason = input(usr,"Please State Reason.","Reason",reason2) as message
if(!reason)
return
@@ -521,17 +521,17 @@
if(banreason)
switch(alert("Reason: '[banreason]' Remove appearance ban?","Please Confirm","Yes","No"))
if("Yes")
- ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban")
- log_admin("[key_name(usr)] removed [key_name(M)]'s appearance ban")
+ ban_unban_log_save("[key_name(usr)] removed [key_name(M)]'s appearance ban.")
+ log_admin("[key_name(usr)] removed [key_name(M)]'s appearance ban.")
feedback_inc("ban_appearance_unban", 1)
DB_ban_unban(M.ckey, BANTYPE_APPEARANCE)
appearance_unban(M)
- message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban")
+ message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban.")
M << "[usr.client.ckey] has removed your appearance ban."
else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel"))
if("Yes")
- var/reason = input(usr,"Please State Reason","Reason") as message
+ var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
ban_unban_log_save("[key_name(usr)] appearance banned [key_name(M)]. reason: [reason]")
@@ -540,7 +540,7 @@
DB_ban_record(BANTYPE_APPEARANCE, M, -1, reason)
appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
add_note(M.ckey, "Appearance banned - [reason]", null, usr.ckey, 0)
- message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)]")
+ message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)].")
M << "You have been appearance banned by [usr.client.ckey]."
M << "The reason is: [reason]"
M << "Appearance ban can be lifted only upon request."
@@ -554,11 +554,11 @@
else if(href_list["jobban2"])
var/mob/M = locate(href_list["jobban2"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
if(!M.ckey) //sanity
- usr << "This mob has no ckey"
+ usr << "This mob has no ckey."
return
var/dat = ""
@@ -963,14 +963,14 @@
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
if(!mins)
return
- var/reason = input(usr,"Please State Reason","Reason") as message
+ var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
var/msg
for(var/job in notbannedlist)
ban_unban_log_save("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes. reason: [reason]")
- log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes")
+ log_admin("[key_name(usr)] temp-jobbanned [key_name(M)] from [job] for [mins] minutes.")
feedback_inc("ban_job_tmp",1)
DB_ban_record(BANTYPE_JOB_TEMP, M, mins, reason, job)
if(M.client)
@@ -981,7 +981,7 @@
else
msg += ", [job]"
add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0)
- message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes")
+ message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes.")
M << "You have been jobbanned by [usr.client.ckey] from: [msg]."
M << "The reason is: [reason]"
M << "This jobban will be lifted in [mins] minutes."
@@ -1004,7 +1004,7 @@
else
msg += ", [job]"
add_note(M.ckey, "Banned from [msg] - [reason]", null, usr.ckey, 0)
- message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]")
+ message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg].")
M << "You have been jobbanned by [usr.client.ckey] from: [msg]."
M << "The reason is: [reason]"
M << "Jobban can be lifted only upon request."
@@ -1037,7 +1037,7 @@
else
continue
if(msg)
- message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]")
+ message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg].")
M << "You have been un-jobbanned by [usr.client.ckey] from [msg]."
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
@@ -1115,7 +1115,7 @@
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
if(!mins)
return
- var/reason = input(usr,"Please State Reason","Reason") as message
+ var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
@@ -1135,7 +1135,7 @@
del(M.client)
//qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
if("No")
- var/reason = input(usr,"Please State Reason","Reason") as message
+ var/reason = input(usr,"Please State Reason.","Reason") as message
if(!reason)
return
switch(alert(usr,"IP ban?",,"Yes","No","Cancel"))
@@ -1272,11 +1272,11 @@
var/mob/living/carbon/human/H = locate(href_list["monkeyone"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
- log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]")
- message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]")
+ log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)].")
+ message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)].")
H.monkeyize()
else if(href_list["humanone"])
@@ -1285,11 +1285,11 @@
var/mob/living/carbon/monkey/Mo = locate(href_list["humanone"])
if(!istype(Mo))
- usr << "This can only be used on instances of type /mob/living/carbon/monkey"
+ usr << "This can only be used on instances of type /mob/living/carbon/monkey."
return
- log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)]")
- message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)]")
+ log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)].")
+ message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(Mo)].")
Mo.humanize()
else if(href_list["corgione"])
@@ -1298,11 +1298,11 @@
var/mob/living/carbon/human/H = locate(href_list["corgione"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
- log_admin("[key_name(usr)] attempting to corgize [key_name(H)]")
- message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]")
+ log_admin("[key_name(usr)] attempting to corgize [key_name(H)].")
+ message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)].")
H.corgize()
@@ -1312,7 +1312,7 @@
var/mob/M = locate(href_list["forcespeech"])
if(!ismob(M))
- usr << "this can only be used on instances of type /mob"
+ usr << "this can only be used on instances of type /mob."
var/speech = input("What will [key_name(M)] say?.", "Force speech", "")// Don't need to sanitize, since it does that in say(), we also trust our admins.
if(!speech)
@@ -1328,10 +1328,10 @@
var/mob/M = locate(href_list["sendtoprison"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
- usr << "This cannot be used on instances of type /mob/living/silicon/ai"
+ usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
if(alert(usr, "Send [key_name(M)] to Prison?", "Message", "Yes", "No") != "Yes")
@@ -1376,10 +1376,10 @@
var/mob/M = locate(href_list["tdome1"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
- usr << "This cannot be used on instances of type /mob/living/silicon/ai"
+ usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
for(var/obj/item/I in M)
@@ -1406,10 +1406,10 @@
var/mob/M = locate(href_list["tdome2"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
- usr << "This cannot be used on instances of type /mob/living/silicon/ai"
+ usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
for(var/obj/item/I in M)
@@ -1436,10 +1436,10 @@
var/mob/M = locate(href_list["tdomeadmin"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
- usr << "This cannot be used on instances of type /mob/living/silicon/ai"
+ usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
M.Paralyse(5)
@@ -1459,10 +1459,10 @@
var/mob/M = locate(href_list["tdomeobserve"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
if(istype(M, /mob/living/silicon/ai))
- usr << "This cannot be used on instances of type /mob/living/silicon/ai"
+ usr << "This cannot be used on instances of type /mob/living/silicon/ai."
return
for(var/obj/item/I in M)
@@ -1490,12 +1490,12 @@
var/mob/living/L = locate(href_list["revive"])
if(!istype(L))
- usr << "This can only be used on instances of type /mob/living"
+ usr << "This can only be used on instances of type /mob/living."
return
L.revive(full_heal = 1, admin_revive = 1)
message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!")
- log_admin("[key_name(usr)] healed / Revived [key_name(L)]")
+ log_admin("[key_name(usr)] healed / Revived [key_name(L)].")
else if(href_list["makeai"])
if(!check_rights(R_SPAWN))
@@ -1503,11 +1503,11 @@
var/mob/living/carbon/human/H = locate(href_list["makeai"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
message_admins("Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!")
- log_admin("[key_name(usr)] AIized [key_name(H)]")
+ log_admin("[key_name(usr)] AIized [key_name(H)].")
H.AIize()
else if(href_list["makealien"])
@@ -1516,7 +1516,7 @@
var/mob/living/carbon/human/H = locate(href_list["makealien"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_alienize(H)
@@ -1527,7 +1527,7 @@
var/mob/living/carbon/human/H = locate(href_list["makeslime"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_slimeize(H)
@@ -1538,7 +1538,7 @@
var/mob/living/carbon/human/H = locate(href_list["makeblob"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_blobize(H)
@@ -1550,7 +1550,7 @@
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
usr.client.cmd_admin_robotize(H)
@@ -1561,7 +1561,7 @@
var/mob/M = locate(href_list["makeanimal"])
if(istype(M, /mob/new_player))
- usr << "This cannot be used on instances of type /mob/new_player"
+ usr << "This cannot be used on instances of type /mob/new_player."
return
usr.client.cmd_admin_animalize(M)
@@ -1571,8 +1571,8 @@
if(G)
var/newpoints = input("Set [G.name ] Gang's influence.","Set Influence",G.points) as null|num
if(newpoints)
- message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints]")
- log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints]")
+ message_admins("[key_name_admin(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].")
+ log_admin("[key_name(usr)] changed the [G.name] Gang's influence from [G.points] to [newpoints].")
G.points = newpoints
G.message_gangtools("Your gang now has [G.points] influence.")
@@ -1615,7 +1615,7 @@
else if(href_list["adminmoreinfo"])
var/mob/M = locate(href_list["adminmoreinfo"])
if(!ismob(M))
- usr << "This can only be used on instances of type /mob"
+ usr << "This can only be used on instances of type /mob."
return
var/location_description = ""
@@ -1726,7 +1726,7 @@
var/mob/living/carbon/human/H = locate(href_list["adminspawncookie"])
if(!ishuman(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_l_hand )
@@ -1740,8 +1740,8 @@
H.update_inv_r_hand()//To ensure the icon appears in the HUD
else
H.update_inv_l_hand()
- log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]")
- message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]")
+ log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].")
+ message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].")
feedback_inc("admin_cookies_spawned",1)
H << "Your prayers have been answered!! You received the best cookie!"
H << 'sound/effects/pray_chaplain.ogg'
@@ -1756,11 +1756,13 @@
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
if(!istype(H.ears, /obj/item/device/radio/headset))
- usr << "The person you are trying to contact is not wearing a headset"
+ usr << "The person you are trying to contact is not wearing a headset."
return
+ message_admins("[src.owner] has started answering [key_name(H)]'s Centcomm request.")
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcom", "")
if(!input)
+ message_admins("[src.owner] decided not to answer [key_name(H)]'s Centcomm request.")
return
src.owner << "You sent [input] to [H] via a secure channel."
@@ -1771,14 +1773,16 @@
else if(href_list["SyndicateReply"])
var/mob/living/carbon/human/H = locate(href_list["SyndicateReply"])
if(!istype(H))
- usr << "This can only be used on instances of type /mob/living/carbon/human"
+ usr << "This can only be used on instances of type /mob/living/carbon/human."
return
if(!istype(H.ears, /obj/item/device/radio/headset))
- usr << "The person you are trying to contact is not wearing a headset"
+ usr << "The person you are trying to contact is not wearing a headset."
return
+ message_admins("[src.owner] has started answering [key_name(H)]'s syndicate request.")
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from The Syndicate", "")
if(!input)
+ message_admins("[src.owner] decided not to answer [key_name(H)]'s syndicate request.")
return
src.owner << "You sent [input] to [H] via a secure channel."
@@ -1891,10 +1895,10 @@
paths += path
if(!paths)
- alert("The path list you sent is empty")
+ alert("The path list you sent is empty.")
return
if(length(paths) > 5)
- alert("Select fewer object types, (max 5)")
+ alert("Select fewer object types, (max 5).")
return
var/list/offset = splittext(href_list["offset"],",")
@@ -1988,7 +1992,7 @@
src.access_news_network()
else if(href_list["ac_set_channel_name"])
- src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")
+ src.admincaster_feed_channel.channel_name = stripped_input(usr, "Provide a Feed Channel Name.", "Network Channel Handler", "")
while (findtext(src.admincaster_feed_channel.channel_name," ") == 1)
src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1)
src.access_news_network()
@@ -2006,7 +2010,7 @@
if(src.admincaster_feed_channel.channel_name == "" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]" || check )
src.admincaster_screen=7
else
- var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
+ var/choice = alert("Please confirm Feed channel creation.","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.CreateFeedChannel(src.admincaster_feed_channel.channel_name, src.admin_signature, src.admincaster_feed_channel.locked, 1)
feedback_inc("newscaster_channels",1)
@@ -2018,11 +2022,11 @@
var/list/available_channels = list()
for(var/datum/newscaster/feed_channel/F in news_network.network_channels)
available_channels += F.channel_name
- src.admincaster_feed_channel.channel_name = adminscrub(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
+ src.admincaster_feed_channel.channel_name = adminscrub(input(usr, "Choose receiving Feed Channel.", "Network Channel Handler") in available_channels )
src.access_news_network()
else if(href_list["ac_set_new_message"])
- src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story", "Network Channel Handler", ""))
+ src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story.", "Network Channel Handler", ""))
while (findtext(src.admincaster_feed_message.returnBody(-1)," ") == 1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.returnBody(-1),2,lentext(src.admincaster_feed_message.returnBody(-1))+1)
src.access_news_network()
@@ -2069,13 +2073,13 @@
src.access_news_network()
else if(href_list["ac_set_wanted_name"])
- src.admincaster_wanted_message.criminal = adminscrub(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
+ src.admincaster_wanted_message.criminal = adminscrub(input(usr, "Provide the name of the Wanted person.", "Network Security Handler", ""))
while(findtext(src.admincaster_wanted_message.criminal," ") == 1)
src.admincaster_wanted_message.criminal = copytext(admincaster_wanted_message.criminal,2,lentext(admincaster_wanted_message.criminal)+1)
src.access_news_network()
else if(href_list["ac_set_wanted_desc"])
- src.admincaster_wanted_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
+ src.admincaster_wanted_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important.", "Network Security Handler", ""))
while (findtext(src.admincaster_wanted_message.body," ") == 1)
src.admincaster_wanted_message.body = copytext(src.admincaster_wanted_message.body,2,lentext(src.admincaster_wanted_message.body)+1)
src.access_news_network()
@@ -2097,7 +2101,7 @@
src.access_news_network()
else if(href_list["ac_cancel_wanted"])
- var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
+ var/choice = alert("Please confirm Wanted Issue removal.","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.deleteWanted()
src.admincaster_screen=17
@@ -2160,7 +2164,7 @@
src.access_news_network()
else if(href_list["ac_set_signature"])
- src.admin_signature = adminscrub(input(usr, "Provide your desired signature", "Network Identity Handler", ""))
+ src.admin_signature = adminscrub(input(usr, "Provide your desired signature.", "Network Identity Handler", ""))
src.access_news_network()
else if(href_list["ac_del_comment"])
@@ -2207,7 +2211,7 @@
message_admins("[key_name_admin(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
log_admin("[key_name(usr)] has kicked [afkonly ? "all AFK" : "all"] clients from the lobby. [length(listkicked)] clients kicked: [strkicked ? strkicked : "--"]")
else
- usr << "You may only use this when the game is running"
+ usr << "You may only use this when the game is running."
else if(href_list["create_outfit"])
if(!check_rights(R_ADMIN))
diff --git a/code/modules/admin/verbs/bluespacearty.dm b/code/modules/admin/verbs/bluespacearty.dm
index 165ec9072ec..814ee68d4df 100644
--- a/code/modules/admin/verbs/bluespacearty.dm
+++ b/code/modules/admin/verbs/bluespacearty.dm
@@ -24,8 +24,8 @@
T.break_tile()
target << "You're hit by bluespace artillery!"
- log_admin("[target.name] has been hit by Bluespace Artillery fired by [usr]")
- message_admins("[target.name] has been hit by Bluespace Artillery fired by [usr]")
+ log_admin("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(usr)]")
+ message_admins("[ADMIN_LOOKUPFLW(target)] has been hit by Bluespace Artillery fired by [ADMIN_LOOKUPFLW(usr)]")
if(target.health <= 1)
target.gib(1, 1)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index fd6ada6a51d..1961a8ceb27 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -573,7 +573,6 @@ var/global/list/g_fancy_list_of_types = null
if(!ishuman(M))
alert("Invalid mob")
return
- //log_admin("[key_name(src)] has alienized [M.key].")
var/list/outfits = list("Naked","Custom","As Job...")
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index 0431f5b222c..bdb0f4a52b8 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -15,8 +15,7 @@
/obj/item/device/assembly/igniter/Destroy()
qdel(sparks)
sparks = null
- return ..()
-
+ . = ..()
/obj/item/device/assembly/igniter/activate()
if(!..())
@@ -27,8 +26,12 @@
sparks.start()
return 1
-
/obj/item/device/assembly/igniter/attack_self(mob/user)
activate()
add_fingerprint(user)
- return
+
+/obj/item/device/assembly/igniter/ignition_effect(atom/A, mob/user)
+ . = "[user] fiddles with [src], and manages to \
+ light [A]."
+ activate()
+ add_fingerprint(user)
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 75e0c079b37..e6cb0ad5723 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -4,6 +4,7 @@
#define FLAG_RETURN_TIME 200 // 20 seconds
#define INSTAGIB_RESPAWN 50 //5 seconds
#define DEFAULT_RESPAWN 150 //15 seconds
+#define AMMO_DROP_LIFETIME 300
@@ -131,6 +132,8 @@
var/control_points = 0
var/control_points_to_win = 180
var/list/team_members = list()
+ var/list/spawned_mobs = list()
+ var/list/recently_dead_ckeys = list()
var/ctf_enabled = FALSE
var/ctf_gear = /datum/outfit/ctf
var/instagib_gear = /datum/outfit/ctf/instagib
@@ -157,6 +160,21 @@
poi_list.Remove(src)
..()
+/obj/machinery/capture_the_flag/process()
+ for(var/i in spawned_mobs)
+ if(!i)
+ spawned_mobs -= i
+ continue
+ // Anyone in crit, automatically reap
+ var/mob/living/M = i
+ if(M.InCritical() || M.stat == DEAD)
+ ctf_dust_old(M)
+ else
+ // The changes that you've been hit with no shield but not
+ // instantly critted are low, but have some healing.
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+
/obj/machinery/capture_the_flag/red
name = "Red CTF Controller"
icon_state = "syndbeacon"
@@ -177,11 +195,12 @@
if(ticker.current_state != GAME_STATE_PLAYING)
return
if(user.ckey in team_members)
- if(user.mind.current && user.mind.current.timeofdeath + respawn_cooldown > world.time)
+ if(user.ckey in recently_dead_ckeys)
user << "It must be more than [respawn_cooldown/10] seconds from your last death to respawn!"
return
var/client/new_team_member = user.client
- dust_old(user)
+ if(user.mind && user.mind.current)
+ ctf_dust_old(user.mind.current)
spawn_team_member(new_team_member)
return
@@ -196,15 +215,20 @@
return
team_members |= user.ckey
var/client/new_team_member = user.client
- dust_old(user)
+ if(user.mind && user.mind.current)
+ ctf_dust_old(user.mind.current)
spawn_team_member(new_team_member)
-/obj/machinery/capture_the_flag/proc/dust_old(mob/user)
- if(user.mind && user.mind.current && user.mind.current.z == src.z)
- new /obj/item/ammo_box/magazine/recharge/ctf (get_turf(user.mind.current))
- new /obj/item/ammo_box/magazine/recharge/ctf (get_turf(user.mind.current))
- user.mind.current.dust()
+/obj/machinery/capture_the_flag/proc/ctf_dust_old(mob/living/body)
+ if(isliving(body) && body.z == src.z)
+ var/turf/T = get_turf(body)
+ new /obj/effect/ctf/ammo(T)
+ recently_dead_ckeys += body.ckey
+ addtimer(src, "clear_cooldown", respawn_cooldown, TRUE, body.ckey)
+ body.dust()
+/obj/machinery/capture_the_flag/proc/clear_cooldown(var/ckey)
+ recently_dead_ckeys -= ckey
/obj/machinery/capture_the_flag/proc/spawn_team_member(client/new_team_member)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(get_turf(src))
@@ -212,6 +236,7 @@
M.key = new_team_member.key
M.faction += team
M.equipOutfit(ctf_gear)
+ spawned_mobs += M
/obj/machinery/capture_the_flag/Topic(href, href_list)
if(href_list["join"])
@@ -281,12 +306,15 @@
/obj/machinery/capture_the_flag/proc/stop_ctf()
ctf_enabled = FALSE
+ arena_cleared = FALSE
var/area/A = get_area(src)
for(var/i in mob_list)
var/mob/M = i
if((get_area(A) == A) && (M.ckey in team_members))
M.dust()
team_members.Cut()
+ spawned_mobs.Cut()
+ recently_dead_ckeys.Cut()
/obj/machinery/capture_the_flag/proc/instagib_mode()
for(var/obj/machinery/capture_the_flag/CTF in machines)
@@ -300,23 +328,43 @@
CTF.ctf_gear = initial(ctf_gear)
CTF.respawn_cooldown = DEFAULT_RESPAWN
-/obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF
+/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf
desc = "This looks like it could really hurt in melee."
force = 75
+/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf/dropped()
+ . = ..()
+ addtimer(src, "floor_vanish", 1)
+
+/obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf/proc/floor_vanish()
+ if(isturf(loc))
+ qdel(src)
+
/obj/item/weapon/gun/projectile/automatic/laser/ctf
mag_type = /obj/item/ammo_box/magazine/recharge/ctf
desc = "This looks like it could really hurt in melee."
force = 50
+ flags = NODROP | DROPDEL
/obj/item/ammo_box/magazine/recharge/ctf
ammo_type = /obj/item/ammo_casing/caseless/laser/ctf
+/obj/item/ammo_box/magazine/recharge/ctf/dropped()
+ . = ..()
+ addtimer(src, "floor_vanish", 1)
+
+/obj/item/ammo_box/magazine/recharge/ctf/proc/floor_vanish()
+ if(isturf(loc))
+ qdel(src)
+
/obj/item/ammo_casing/caseless/laser/ctf
projectile_type = /obj/item/projectile/beam/ctf
/obj/item/projectile/beam/ctf
damage = 150
+ icon_state = "omnilaser"
+
+// RED TEAM GUNS
/obj/item/weapon/gun/projectile/automatic/laser/ctf/red
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/red
@@ -330,6 +378,8 @@
/obj/item/projectile/beam/ctf/red
icon_state = "laser"
+// BLUE TEAM GUNS
+
/obj/item/weapon/gun/projectile/automatic/laser/ctf/blue
mag_type = /obj/item/ammo_box/magazine/recharge/ctf/blue
@@ -344,17 +394,35 @@
/datum/outfit/ctf
name = "CTF"
- /obj/item/device/radio/headset
+ ears = /obj/item/device/radio/headset
uniform = /obj/item/clothing/under/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf
shoes = /obj/item/clothing/shoes/combat
gloves = /obj/item/clothing/gloves/combat
id = /obj/item/weapon/card/id/syndicate
- belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/CTF
+ belt = /obj/item/weapon/gun/projectile/automatic/pistol/deagle/ctf
l_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf
+/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly=FALSE)
+ if(visualsOnly)
+ return
+ var/list/no_drops = list()
+ var/obj/item/weapon/card/id/W = H.wear_id
+ no_drops += W
+ W.registered_name = H.real_name
+ W.update_label(W.registered_name, W.assignment)
+
+ // The shielded hardsuit is already NODROP
+ no_drops += H.get_item_by_slot(slot_gloves)
+ no_drops += H.get_item_by_slot(slot_shoes)
+ no_drops += H.get_item_by_slot(slot_w_uniform)
+ no_drops += H.get_item_by_slot(slot_ears)
+ for(var/i in no_drops)
+ var/obj/item/I = i
+ I.flags |= NODROP
+
/datum/outfit/ctf/instagib
r_hand = /obj/item/weapon/gun/energy/laser/instakill
shoes = /obj/item/clothing/shoes/jackboots/fast
@@ -363,6 +431,8 @@
ears = /obj/item/device/radio/headset/syndicate/alt
suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf/red
r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf/red
+ l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red
+ r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/red
/datum/outfit/ctf/red/instagib
r_hand = /obj/item/weapon/gun/energy/laser/instakill/red
@@ -372,17 +442,21 @@
ears = /obj/item/device/radio/headset/headset_cent/commander
suit = /obj/item/clothing/suit/space/hardsuit/shielded/ctf/blue
r_hand = /obj/item/weapon/gun/projectile/automatic/laser/ctf/blue
+ l_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue
+ r_pocket = /obj/item/ammo_box/magazine/recharge/ctf/blue
/datum/outfit/ctf/blue/instagib
r_hand = /obj/item/weapon/gun/energy/laser/instakill/blue
shoes = /obj/item/clothing/shoes/jackboots/fast
/datum/outfit/ctf/red/post_equip(mob/living/carbon/human/H)
+ ..()
var/obj/item/device/radio/R = H.ears
R.set_frequency(SYND_FREQ)
R.freqlock = 1
/datum/outfit/ctf/blue/post_equip(mob/living/carbon/human/H)
+ ..()
var/obj/item/device/radio/R = H.ears
R.set_frequency(CENTCOM_FREQ)
R.freqlock = 1
@@ -406,7 +480,7 @@
/obj/structure/divine/trap/ctf/trap_effect(mob/living/L)
if(!(src.team in L.faction))
L << "Stay out of the enemy spawn!"
- L.dust()
+ L.death()
/obj/structure/divine/trap/ctf/red
@@ -430,7 +504,48 @@
invisibility = INVISIBILITY_OBSERVER
alpha = 100
+/obj/effect/ctf/ammo
+ name = "ammo pickup"
+ desc = "You like revenge, right? Everybody likes revenge! Well, \
+ let's go get some!"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "at_shield1"
+ layer = ABOVE_MOB_LAYER
+ alpha = 255
+ invisibility = 0
+
+/obj/effect/ctf/ammo/New()
+ ..()
+ QDEL_IN(src, AMMO_DROP_LIFETIME)
+
+/obj/effect/ctf/ammo/Crossed(atom/movable/AM)
+ reload(AM)
+
+/obj/effect/ctf/ammo/Bump(atom/movable/AM)
+ reload(AM)
+
+/obj/effect/ctf/ammo/Bumped(atom/movable/AM)
+ reload(AM)
+
+/obj/effect/ctf/ammo/proc/reload(mob/living/M)
+ if(!ishuman(M))
+ return
+ for(var/obj/machinery/capture_the_flag/CTF in machines)
+ if(M in CTF.spawned_mobs)
+ var/outfit = CTF.ctf_gear
+ var/datum/outfit/O = new outfit
+ for(var/obj/item/weapon/gun/G in M)
+ M.unEquip(G)
+ qdel(G)
+ O.equip(M)
+ M << "Ammunition reloaded!"
+ playsound(get_turf(M), 'sound/weapons/shotgunpump.ogg', 50, 1, -1)
+ qdel(src)
+ break
+
/obj/effect/ctf/dead_barricade
+ name = "dead barrier"
+ desc = "It provided cover in fire fights. And now it's gone."
icon = 'icons/obj/objects.dmi'
icon_state = "barrier0"
diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm
index 6f5ba2a4d64..2f386c471e2 100644
--- a/code/modules/awaymissions/mission_code/Cabin.dm
+++ b/code/modules/awaymissions/mission_code/Cabin.dm
@@ -17,58 +17,59 @@
name = "Lumbermill"
icon_state = "away3"
-
-
-
-
-/*Cabin code*/
-/obj/structure/fireplace
- name = "fireplace"
+/obj/structure/firepit
+ name = "firepit"
desc = "warm and toasty"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "fireplace-active"
+ icon = 'icons/obj/fireplace.dmi'
+ icon_state = "firepit-active"
density = 0
var/active = 1
-/obj/structure/fireplace/initialize()
+/obj/structure/firepit/initialize()
..()
- toggleFireplace()
+ toggleFirepit()
-/obj/structure/fireplace/attack_hand(mob/living/user)
+/obj/structure/firepit/attack_hand(mob/living/user)
if(active)
active = 0
- toggleFireplace()
+ toggleFirepit()
else
..()
-/obj/structure/fireplace/attackby(obj/item/W,mob/living/user,params)
+/obj/structure/firepit/attackby(obj/item/W,mob/living/user,params)
if(!active)
- if(W.is_hot())
- active = 1
- toggleFireplace()
+ var/msg = W.ignition_effect(src, user)
+ if(msg)
+ active = TRUE
+ visible_message(msg)
+ toggleFirepit()
else
return ..()
else
W.fire_act()
-/obj/structure/fireplace/proc/toggleFireplace()
+/obj/structure/firepit/proc/toggleFirepit()
if(active)
SetLuminosity(8)
- icon_state = "fireplace-active"
+ icon_state = "firepit-active"
else
SetLuminosity(0)
- icon_state = "fireplace"
+ icon_state = "firepit"
-/obj/structure/fireplace/extinguish()
+/obj/structure/firepit/extinguish()
if(active)
- active = 0
- toggleFireplace()
+ active = FALSE
+ toggleFirepit()
-/obj/structure/fireplace/fire_act()
+/obj/structure/firepit/fire_act()
if(!active)
- active = 1
- toggleFireplace()
+ active = TRUE
+ toggleFirepit()
+
+
+
+//other Cabin Stuff//
/obj/machinery/recycler/lumbermill
name = "lumbermill saw"
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 3e8296a4b46..ca83278c923 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -224,6 +224,11 @@ You can set verify to TRUE if you want send() to sleep until the client has the
"large_stamp-law.png" = 'icons/stamp_icons/large_stamp-law.png'
)
+/datum/asset/simple/IRV
+ assets = list(
+ "jquery-ui.custom-core-widgit-mouse-sortable-min.js" = 'html/IRV/jquery-ui.custom-core-widgit-mouse-sortable-min.js',
+ "jquery-1.10.2.min.js" = 'html/IRV/jquery-1.10.2.min.js'
+ )
//Registers HTML Interface assets.
/datum/asset/HTML_interface/register()
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
index 0001f48931d..ee917878494 100644
--- a/code/modules/crafting/craft.dm
+++ b/code/modules/crafting/craft.dm
@@ -4,6 +4,7 @@
var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
var/datum/action/innate/crafting/button
var/display_craftable_only = FALSE
+ var/display_compact = FALSE
@@ -239,24 +240,26 @@
/datum/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = not_incapacitated_turf_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 600, 800, master_ui, state)
+ ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 700, 800, master_ui, state)
ui.open()
/datum/personal_crafting/ui_data(mob/user)
var/list/data = list()
+ var/cur_category = categories[viewing_category]
data["busy"] = busy
data["prev_cat"] = categories[prev_cat()]
- data["category"] = categories[viewing_category]
+ data["category"] = cur_category
data["next_cat"] = categories[next_cat()]
data["display_craftable_only"] = display_craftable_only
+ data["display_compact"] = display_compact
var/list/surroundings = get_surroundings(user)
var/list/can_craft = list()
var/list/cant_craft = list()
for(var/rec in crafting_recipes)
var/datum/crafting_recipe/R = rec
- if(R.category != categories[viewing_category])
+ if(R.category != cur_category)
continue
if(check_contents(R, surroundings))
can_craft += list(build_recipe_data(R))
@@ -294,6 +297,10 @@
display_craftable_only = !display_craftable_only
usr << "You will now [display_craftable_only ? "only see recipes you can craft":"see all recipes"]."
. = TRUE
+ if("toggle_compact")
+ display_compact = !display_compact
+ usr << "Crafting menu is now [display_compact? "compact" : "full size"]."
+ . = TRUE
//Next works nicely with modular arithmetic
@@ -318,27 +325,23 @@
var/tool_text = ""
var/catalyst_text = ""
- for(var/A in R.reqs)
- if(ispath(A, /obj))
- var/obj/O = A
- req_text += " [R.reqs[A]] [initial(O.name)],"
- else if(ispath(A, /datum/reagent))
- var/datum/reagent/RE = A
- req_text += " [R.reqs[A]] [initial(RE.name)],"
+ for(var/a in R.reqs)
+ //We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var)
+ //Also these are typepaths so sadly we can't just do "[a]"
+ var/atom/A = a
+ req_text += " [R.reqs[A]] [initial(A.name)],"
req_text = replacetext(req_text,",","",-1)
data["req_text"] = req_text
- for(var/C in R.chem_catalysts)
- if(ispath(C, /datum/reagent))
- var/datum/reagent/RE = C
- catalyst_text += " [R.chem_catalysts[C]] [initial(RE.name)],"
+ for(var/a in R.chem_catalysts)
+ var/atom/A = a //cheat-typecast
+ catalyst_text += " [R.chem_catalysts[A]] [initial(A.name)],"
catalyst_text = replacetext(catalyst_text,",","",-1)
data["catalyst_text"] = catalyst_text
- for(var/O in R.tools)
- if(ispath(O, /obj))
- var/obj/T = O
- tool_text += " [R.tools[O]] [initial(T.name)],"
+ for(var/a in R.tools)
+ var/atom/A = a //cheat-typecast
+ tool_text += " [R.tools[A]] [initial(A.name)],"
tool_text = replacetext(tool_text,",","",-1)
data["tool_text"] = tool_text
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 40f290aa304..624feef72f2 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -109,23 +109,36 @@
/turf/open/floor/vines/ChangeTurf(turf/open/floor/T)
for(var/obj/effect/spacevine/SV in src)
qdel(SV)
- ..()
+ . = ..()
UpdateAffectingLights()
+/datum/spacevine_mutation/space_covering
+ var/static/list/coverable_turfs
+
+/datum/spacevine_mutation/space_covering/New()
+ . = ..()
+ if(!coverable_turfs)
+ coverable_turfs = typecacheof(list(
+ /turf/open/space
+ ))
+ coverable_turfs -= typecacheof(list(
+ /turf/open/space/transit
+ ))
+
/datum/spacevine_mutation/space_covering/on_grow(obj/effect/spacevine/holder)
- if(istype(holder.loc, /turf/open/space))
- var/turf/open/spaceturf = holder.loc
- spaceturf.ChangeTurf(/turf/open/floor/vines)
+ process_mutation(holder)
/datum/spacevine_mutation/space_covering/process_mutation(obj/effect/spacevine/holder)
- if(istype(holder.loc, /turf/open/space))
- var/turf/open/spaceturf = holder.loc
- spaceturf.ChangeTurf(/turf/open/floor/vines)
+ var/turf/T = get_turf(holder)
+ if(is_type_in_typecache(T, coverable_turfs))
+ var/currtype = T.type
+ T.ChangeTurf(/turf/open/floor/vines)
+ T.baseturf = currtype
/datum/spacevine_mutation/space_covering/on_death(obj/effect/spacevine/holder)
- if(istype(holder.loc, /turf/open/floor/vines))
- var/turf/open/spaceturf = holder.loc
- spaceturf.ChangeTurf(/turf/open/space)
+ var/turf/T = get_turf(holder)
+ if(istype(T, /turf/open/floor/vines))
+ T.ChangeTurf(T.baseturf)
/datum/spacevine_mutation/bluespace
name = "bluespace"
@@ -155,12 +168,13 @@
/datum/spacevine_mutation/toxicity/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
if(issilicon(crosser))
return
- if(prob(severity) && istype(crosser))
+ if(prob(severity) && istype(crosser) && !isvineimmune(crosser))
crosser << "You accidently touch the vine and feel a strange sensation."
crosser.adjustToxLoss(5)
/datum/spacevine_mutation/toxicity/on_eat(obj/effect/spacevine/holder, mob/living/eater)
- eater.adjustToxLoss(5)
+ if(!isvineimmune(eater))
+ eater.adjustToxLoss(5)
/datum/spacevine_mutation/explosive //OH SHIT IT CAN CHAINREACT RUN!!!
name = "explosive"
@@ -173,8 +187,7 @@
qdel(src)
else
. = 1
- spawn(5)
- qdel(src)
+ QDEL_IN(src, 5)
/datum/spacevine_mutation/explosive/on_death(obj/effect/spacevine/holder, mob/hitter, obj/item/I)
explosion(holder.loc, 0, 0, severity, 0, 0)
@@ -190,6 +203,8 @@
/datum/spacevine_mutation/fire_proof/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
if(I && I.damtype == "fire")
. = 0
+ else
+ . = expected_damage
/datum/spacevine_mutation/vine_eating
name = "vine eating"
@@ -208,10 +223,10 @@
quality = NEGATIVE
/datum/spacevine_mutation/aggressive_spread/on_spread(obj/effect/spacevine/holder, turf/target)
- target.ex_act(severity, src)
+ target.ex_act(severity, src) // vine immunity handled at /mob/ex_act
/datum/spacevine_mutation/aggressive_spread/on_buckle(obj/effect/spacevine/holder, mob/living/buckled)
- buckled.ex_act(severity)
+ buckled.ex_act(severity, src)
/datum/spacevine_mutation/transparency
name = "transparent"
@@ -289,16 +304,17 @@
quality = NEGATIVE
/datum/spacevine_mutation/thorns/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
- if(prob(severity) && istype(crosser))
+ if(prob(severity) && istype(crosser) && !isvineimmune(holder))
var/mob/living/M = crosser
M.adjustBruteLoss(5)
M << "You cut yourself on the thorny vines."
-/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter)
- if(prob(severity) && istype(hitter))
+/datum/spacevine_mutation/thorns/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
+ if(prob(severity) && istype(hitter) && !isvineimmune(holder))
var/mob/living/M = hitter
M.adjustBruteLoss(5)
M << "You cut yourself on the thorny vines."
+ . = expected_damage
/datum/spacevine_mutation/woodening
name = "hardened"
@@ -308,15 +324,14 @@
/datum/spacevine_mutation/woodening/on_grow(obj/effect/spacevine/holder)
if(holder.energy)
holder.density = 1
+ holder.maxhealth = 100
+ holder.health = holder.maxhealth
-/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/hitter, obj/item/I, expected_damage)
- if(!expected_damage)
- return
- if(hitter)
- if(I)
- . = I.force * 2
- else
- . = 8
+/datum/spacevine_mutation/woodening/on_hit(obj/effect/spacevine/holder, mob/living/hitter, obj/item/I, expected_damage)
+ if(I.is_sharp())
+ . = expected_damage * 0.5
+ else
+ . = expected_damage
/datum/spacevine_mutation/flowering
name = "flowering"
@@ -343,6 +358,8 @@
layer = SPACEVINE_LAYER
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
pass_flags = PASSTABLE | PASSGRILLE
+ var/health = 50
+ var/maxhealth = 50
var/energy = 0
var/obj/effect/spacevine_controller/master = null
var/list/mutations = list()
@@ -385,22 +402,33 @@
if (!W || !user || !W.type)
return
user.changeNext_move(CLICK_CD_MELEE)
+ var/force = W.force
- var/override = W.force
- if(W.is_sharp())
- override = 100
if(istype(W, /obj/item/weapon/scythe))
- var/local_override = override
+ force = force * 4
for(var/obj/effect/spacevine/B in orange(1,src))
- for(var/datum/spacevine_mutation/SM in mutations)
- local_override = SM.on_hit(src, user, W, local_override)
- if(prob(local_override))
- qdel(B)
+ B.health = health - force
+ if(B.health < 1)
+ qdel(B)
+
+ health = health - force
+
+ if(health < 1)
+ qdel(src)
+
+ return
+
+ if(W.is_sharp())
+ force = force * 4
+
+ if(W && W.damtype == "fire")
+ force = force * 4
for(var/datum/spacevine_mutation/SM in mutations)
- override = SM.on_hit(src, user, W, override) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
+ force = SM.on_hit(src, user, W, force) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
- if(prob(override))
+ health = health - force
+ if(health < 1)
qdel(src)
..()
@@ -482,7 +510,7 @@
/obj/effect/spacevine_controller/process()
if(!vines)
- qdel(src) //space vines exterminated. Remove the controller
+ qdel(src) //space vines exterminated. Remove the controller
return
if(!growth_queue)
qdel(src) //Sanity check
@@ -494,7 +522,7 @@
var/i = 0
var/list/obj/effect/spacevine/queue_end = list()
- for( var/obj/effect/spacevine/SV in growth_queue )
+ for(var/obj/effect/spacevine/SV in growth_queue)
if(qdeleted(SV))
continue
i++
@@ -531,12 +559,12 @@
if(!has_buckled_mobs() && prob(25))
for(var/mob/living/V in src.loc)
entangle(V)
- if(buckled_mobs.len)
+ if(buckled_mobs && buckled_mobs.len)
break //only capture one mob at a time
/obj/effect/spacevine/proc/entangle(mob/living/V)
- if(!V)
+ if(!V || isvineimmune(V))
return
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_buckle(src, V)
@@ -570,3 +598,16 @@
override += SM.process_temperature(src, temp, volume)
if(!override)
qdel(src)
+
+/obj/effect/spacevine/CanPass(atom/movable/mover, turf/target, height=0)
+ if(isvineimmune(mover))
+ . = TRUE
+ else
+ . = ..()
+
+/proc/isvineimmune(atom/A)
+ . = FALSE
+ if(isliving(A))
+ var/mob/living/M = A
+ if(("vines" in M.faction) || ("plants" in M.faction))
+ . = TRUE
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index ce1f045bf28..13aff60e511 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -212,7 +212,6 @@
var/datum/browser/popup = new(user, "microwave", name, 300, 300)
popup.set_content(dat)
popup.open()
- return
/***********************************
* Microwave Menu Handling/Cooking
@@ -340,4 +339,3 @@
if ("dispose")
dispose()
updateUsrDialog()
- return
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index e85418941d0..496ec303822 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -34,7 +34,7 @@
// Stronger reagents must always come first to avoid being displaced by weaker ones.
// Total amount of any reagent in plant is calculated by formula: 1 + round(potency * multiplier)
- var/innate_yieldmod = 1 //modifier for yield, seperate to the one in Hydro trays, as that one is SPECIFICALLY for nutriment/chems (which means it's constantly reset)
+ var/innate_yieldmod = 0 //modifier for yield, seperate to the one in Hydro trays, as that one is SPECIFICALLY for nutriment/chems (which means it's constantly reset)
//This is added onto the yield mod of the hydro tray, yield *= (parent.yieldmod+innate_yieldmod)
var/weed_rate = 1 //If the chance below passes, then this many weeds sprout during growth
@@ -269,4 +269,4 @@
if(seed.icon_harvest) // mushrooms have no grown sprites, same for items with no product
if(!(seed.icon_harvest in states))
- world << "[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!"
\ No newline at end of file
+ world << "[seed.name] ([seed.type]) lacks the [seed.icon_harvest] icon!"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index a41933fcd67..6d41c309c92 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -790,6 +790,7 @@
name = "necropolis wall"
desc = "A seemingly impenetrable wall."
icon = 'icons/turf/walls.dmi'
+ icon_state = "necro"
explosion_block = 50
baseturf = /turf/closed/indestructible/necropolis
@@ -797,10 +798,10 @@
name = "necropolis floor"
desc = "It's regarding you suspiciously."
icon = 'icons/turf/floors.dmi'
- icon_state = "floor"
+ icon_state = "necro1"
baseturf = /turf/open/indestructible/necropolis
/turf/open/indestructible/necropolis/New()
..()
if(prob(12))
- icon_state = "necropolis[rand(1,2)]"
+ icon_state = "necro[rand(2,3)]"
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index 74b86a0b79b..a6910a62eac 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -72,6 +72,7 @@
var/forceProcess = 0
var/processTime = 8
var/lastProc = 0
+ var/showexaminetext = 1 //If we show our telltale examine text
var/list/knownStrings = list()
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index d7ae6b29528..d1b085ca3b9 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -33,8 +33,7 @@
ticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now
. = ..(gibbed)
if(mind && mind.devilinfo)
- spawn(0)
- mind.devilinfo.beginResurrectionCheck(src)
+ addtimer(mind.devilinfo, "beginResurrectionCheck", 0, FALSE, src)
/mob/living/carbon/human/proc/makeSkeleton()
status_flags |= DISFIGURED
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 8ba84d2891e..e62d302fd39 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -289,7 +289,9 @@
if(getorgan(/obj/item/organ/brain))
if(istype(src,/mob/living/carbon/human/interactive))
- msg += "[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.\n"
+ var/mob/living/carbon/human/interactive/auto = src
+ if(auto.showexaminetext)
+ msg += "[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.\n"
else if(!key)
msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n"
else if(!client)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a8068b92f49..f11a76d0fc9 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -120,6 +120,8 @@
var/b_loss = null
var/f_loss = null
var/bomb_armor = getarmor(null, "bomb")
+ if(istype(ex_target, /datum/spacevine_mutation) && isvineimmune(src))
+ return
switch (severity)
if (1)
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index ac36d4c28cc..d19b8589db8 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -104,6 +104,15 @@
heatmod = 1.5
meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant
+/datum/species/pod/on_species_gain(mob/living/carbon/C, datum/species/old_species)
+ . = ..()
+ C.faction |= "plants"
+ C.faction |= "vines"
+
+/datum/species/pod/on_species_loss(mob/living/carbon/C)
+ . = ..()
+ C.faction -= "plants"
+ C.faction -= "vines"
/datum/species/pod/spec_life(mob/living/carbon/human/H)
if(H.stat == DEAD)
@@ -146,8 +155,6 @@
H.show_message("The radiation beam singes you!")
if(/obj/item/projectile/energy/florayield)
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
- return
-
/*
SHADOWPEOPLE
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index fc1bf88240b..70530432c29 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -54,7 +54,9 @@
message_type=DEADCHAT_DEATHRATTLE)
if(mind)
mind.store_memory("Time of death: [tod]", 0)
+ var/list/scripture_states = get_scripture_states()
living_mob_list -= src
+ scripture_unlock_alert(scripture_states)
if(!gibbed)
dead_mob_list += src
else if(buckled)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f6a9200c49b..dc93198a8a1 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -225,7 +225,9 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/InCritical()
return (src.health < 0 && src.health > -95 && stat == UNCONSCIOUS)
-/mob/living/ex_act(severity, target)
+/mob/living/ex_act(severity, origin)
+ if(istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
+ return
..()
flash_eyes()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index c3533d9c49e..69546fc8e49 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -45,7 +45,6 @@ var/list/ai_list = list()
//MALFUNCTION
var/datum/module_picker/malf_picker
var/list/datum/AI_Module/current_modules = list()
- var/fire_res_on_core = 0
var/can_dominate_mechs = 0
var/shunted = 0 //1 if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead
@@ -157,7 +156,9 @@ var/list/ai_list = list()
shuttle_caller_list -= src
SSshuttle.autoEvac()
qdel(eyeobj) // No AI, no Eye
- return ..()
+ malfhack = null
+
+ . = ..()
/mob/living/silicon/ai/verb/pick_icon()
@@ -320,8 +321,6 @@ var/list/ai_list = list()
if(C)
C.post_status("shuttle")
- return
-
/mob/living/silicon/ai/cancel_camera()
src.view_core()
@@ -385,8 +384,6 @@ var/list/ai_list = list()
if (stat != DEAD)
adjustBruteLoss(30)
- return
-
/mob/living/silicon/ai/Topic(href, href_list)
if(usr != src)
return
@@ -470,7 +467,6 @@ var/list/ai_list = list()
return
..()
- return
/mob/living/silicon/ai/proc/switchCamera(obj/machinery/camera/C)
@@ -746,7 +742,6 @@ var/list/ai_list = list()
light_cameras()
src << "Camera lights activated."
- return
//AI_CAMERA_LUMINOSITY
@@ -898,3 +893,27 @@ var/list/ai_list = list()
if(..()) //successfully ressuscitated from death
icon_state = "ai"
. = 1
+
+/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
+ malfhack = null
+ malfhacking = FALSE
+
+ if(!istype(apc) || qdeleted(apc) || apc.stat & BROKEN)
+ src << "Hack aborted. The designated APC no longer exists on the \
+ power network."
+ playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 1)
+ else if(apc.aidisabled)
+ src << "Hack aborted. \The [apc] is no longer responding \
+ to our systems."
+ playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 1)
+ else
+ malf_picker.processing_time += 10
+
+ apc.malfai = parent || src
+ apc.malfhack = TRUE
+ apc.locked = TRUE
+
+ playsound(get_turf(src), 'sound/machines/ding.ogg', 50, 1)
+ src << "Hack complete. \The [apc] is now under your \
+ exclusive control."
+ apc.update_icon()
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 59a32d88bed..fab6fdef09a 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -49,9 +49,7 @@
/mob/living/silicon/ai/updatehealth()
if(status_flags & GODMODE)
return
- health = maxHealth - getOxyLoss() - getToxLoss() - getBruteLoss()
- if(!fire_res_on_core)
- health -= getFireLoss()
+ health = maxHealth - getOxyLoss() - getToxLoss() - getBruteLoss() - getFireLoss()
update_stat()
diag_hud_set_health()
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 8a5478dedcb..dee327d9de4 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -138,4 +138,4 @@
return //we don't get hacked or give a shit about it
/mob/living/simple_animal/drone/cogscarab/drone_chat(msg)
- send_hierophant_message(src, msg, "heavy_alloy") //HIEROPHANT DRONES
+ titled_hierophant_message(src, msg, "heavy_alloy") //HIEROPHANT DRONES
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 8ae70d45541..b0102f3d95f 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -232,6 +232,13 @@
else if(target != null && prob(40))//No more pulling a mob forever and having a second player attack it, it can switch targets now if it finds a more suitable one
FindTarget()
+/mob/living/simple_animal/hostile/UnarmedAttack(atom/A)
+ target = A
+ if(dextrous)
+ ..()
+ else
+ AttackingTarget()
+
/mob/living/simple_animal/hostile/proc/AttackingTarget()
target.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index f6fa1e66c9f..e230f021c84 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -1,3 +1,26 @@
+/*
+
+BUBBLEGUM
+
+Bubblegum spawns randomly wherever a lavaland creature is able to spawn. It is the most powerful slaughter demon in existence.
+Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size.
+
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+
+It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming.
+Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target.
+To make this possible, it sprays streams of blood at random.
+From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress.
+
+When Bubblegum dies, it leaves behind a chest that can contain three things:
+ 1. A slaughter demon spawner
+ 2. A bottle that, when activated, drives everyone nearby into a frenzy
+ 3. A contract that marks for death the chosen target
+
+Difficulty: Hard
+
+*/
+
/mob/living/simple_animal/hostile/megafauna/bubblegum
name = "bubblegum"
desc = "In what passes for a heirarchy among slaughter demons, this one is king."
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index bd305c5c305..87555452470 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -1,3 +1,26 @@
+/*
+
+COLOSSUS
+
+The colossus spawns randomly wherever a lavaland creature is able to spawn. It is powerful, ancient, and extremely deadly.
+The colossus has a degree of sentience, proving this in speech during its attacks.
+
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+
+The colossus' true danger lies in its ranged capabilities. It fires immensely damaging death bolts that penetrate all armor in a variety of ways:
+ 1. The colossus fires death bolts in alternating patterns: the cardinal directions and the diagonal directions.
+ 2. The colossus fires death bolts in a shotgun-like pattern, instantly downing anything unfortunate enough to be hit by all of them.
+ 3. The colossus fires a spiral of death bolts.
+At 33% health, the colossus gains an additional attack:
+ 4. The colossus fires two spirals of death bolts, spinning in opposite directions.
+
+When a colossus dies, it leaves behind a chunk of glowing crystal known as a black box. Anything placed inside will carry over into future rounds.
+For instance, you could place a bag of holding into the black box, and then kill another colossus next round and retrieve the bag of holding from inside.
+
+Difficulty: Very Hard
+
+*/
+
/mob/living/simple_animal/hostile/megafauna/colossus
name = "colossus"
desc = "A monstrous creature protected by heavy shielding."
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index c192e785183..7c68795ee96 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -1,3 +1,28 @@
+/*
+
+ASH DRAKE
+
+Ash drakes spawn randomly wherever a lavaland creature is able to spawn. They are the draconic guardians of the Necropolis.
+
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+
+Whenever possible, the drake will breathe fire in the four cardinal directions, igniting and heavily damaging anything caught in the blast.
+It also often causes fire to rain from the sky - many nearby turfs will flash red as a fireball crashes into them, dealing damage to anything on the turfs.
+The drake also utilizes its wings to fly into the sky and crash down onto a specified point. Anything on this point takes tremendous damage.
+ - Sometimes it will chain these swooping attacks over and over, making swiftness a necessity.
+
+When an ash drake dies, it leaves behind a chest that can contain four things:
+ 1. A spectral blade that allows its wielder to call ghosts to it, enhancing its power
+ 2. A lava staff that allows its wielder to create lava
+ 3. A spellbook and wand of fireballs
+ 4. A bottle of dragon's blood with several effects, including turning its imbiber into a drake themselves.
+
+When butchered, they leave behind diamonds, sinew, bone, and ash drake hide. Ash drake hide can be used to create a hooded cloak that protects its wearer from ash storms.
+
+Difficulty: Medium
+
+*/
+
/mob/living/simple_animal/hostile/megafauna/dragon
name = "ash drake"
desc = "Guardians of the necropolis."
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 2820dd3ff77..b638a9bd4da 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -1,3 +1,21 @@
+/*
+
+LEGION
+
+Legion spawns from the necropolis gate in the far north of lavaland. It is the guardian of the Necropolis and emerges from within whenever an intruder tries to enter through its gate.
+Whenever Legion emerges, everything in lavaland will receive a notice via color, audio, and text. This is because Legion is powerful enough to slaughter the entirety of lavaland with little effort.
+
+It has two attack modes that it constantly rotates between.
+
+In ranged mode, it will behave like a normal legion - retreating when possible and firing legion skulls at the target.
+In charge mode, it will spin and rush its target, attacking with melee whenever possible.
+
+When Legion dies, it drops a staff of storms, which allows its wielder to call and disperse ash storms at will and functions as a powerful melee weapon.
+
+Difficulty: Medium
+
+*/
+
/mob/living/simple_animal/hostile/megafauna/legion
name = "Legion"
health = 800
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index ac2f797396b..bbfb9c772b9 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -264,7 +264,7 @@
else
feedback_add_details("hivelord_core", "[type]|stabilizer")
-
+
/obj/item/organ/hivelord_core/proc/go_inert()
inert = TRUE
desc = "The remains of a hivelord that have become useless, having been left alone too long after being harvested."
@@ -454,7 +454,7 @@
mob_size = MOB_SIZE_LARGE
var/pre_attack = 0
var/pre_attack_icon = "Goliath_preattack"
- loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER})
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
..()
@@ -486,7 +486,6 @@
ranged_cooldown = world.time + ranged_cooldown_time
icon_state = icon_aggro
pre_attack = 0
- return
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage)
ranged_cooldown -= 10
@@ -498,7 +497,6 @@
handle_preattack()
if(icon_state != icon_aggro)
icon_state = icon_aggro
- return
/obj/effect/goliath_tentacle/
name = "Goliath tentacle"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index bce40f6b5a2..53187f4e7ec 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -423,16 +423,25 @@
/mob/living/simple_animal/ex_act(severity, target)
..()
+ var/bomb_armor = getarmor(null, "bomb")
switch (severity)
if (1)
- gib()
- return
-
+ if(prob(bomb_armor))
+ adjustBruteLoss(500)
+ else
+ gib()
+ return
if (2)
- adjustBruteLoss(60)
+ var/bloss = 60
+ if(prob(bomb_armor))
+ bloss = bloss / 1.5
+ adjustBruteLoss(bloss)
if(3)
- adjustBruteLoss(30)
+ var/bloss = 30
+ if(prob(bomb_armor))
+ bloss = bloss / 1.5
+ adjustBruteLoss(bloss)
/mob/living/simple_animal/proc/CanAttack(atom/the_target)
if(see_invisible < the_target.invisibility)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index b9fa1070e66..565e30cdc23 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -201,6 +201,8 @@
if(href_list["votepollid"] && href_list["votetype"])
var/pollid = text2num(href_list["votepollid"])
var/votetype = href_list["votetype"]
+ //lets take data from the user to decide what kind of poll this is, without validating it
+ //what could go wrong
switch(votetype)
if(POLLTYPE_OPTION)
var/optionid = text2num(href_list["voteoptionid"])
@@ -219,6 +221,7 @@
var/id_max = text2num(href_list["maxid"])
if( (id_max - id_min) > 100 ) //Basic exploit prevention
+ //(protip, this stops no exploits)
usr << "The option ID difference is too big. Please contact administration or the database admin."
return
@@ -257,6 +260,14 @@
usr << "Maximum replies reached."
break
usr << "Vote successful."
+ if(POLLTYPE_IRV)
+ if (!href_list["IRVdata"])
+ src << "No ordering data found. Please try again or contact an administrator."
+ var/list/votelist = splittext(href_list["IRVdata"], ",")
+ if (!vote_on_irv_poll(pollid, votelist))
+ src << "Vote failed, please try again or contact an administrator."
+ return
+ src << "Vote successful."
/mob/new_player/proc/IsJobAvailable(rank)
var/datum/job/job = SSjob.GetJob(rank)
diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm
index 64fc6aac532..8297fbeb562 100644
--- a/code/modules/mob/new_player/poll.dm
+++ b/code/modules/mob/new_player/poll.dm
@@ -24,7 +24,7 @@
/mob/new_player/proc/poll_player(pollid)
if(!pollid)
return
- if(!dbcon.IsConnected())
+ if(!establish_db_connection())
usr << "Failed to establish database connection."
return
var/DBQuery/select_query = dbcon.NewQuery("SELECT starttime, endtime, question, polltype, multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]")
@@ -87,6 +87,7 @@
output += "
"
output += ""
output += ""
+ src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x250")
if(POLLTYPE_TEXT)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
@@ -117,6 +118,7 @@
else
vote_text = replacetext(vote_text, "\n", " ")
output += "[vote_text]"
+ src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x500")
if(POLLTYPE_RATING)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, [format_table_name("poll_vote")] v WHERE o.pollid = [pollid] AND v.ckey = '[ckey]' AND o.id = v.optionid")
@@ -172,6 +174,7 @@
output += ""
output += ""
output += "
"
output += ""
+ src << browse(null ,"window=playerpolllist")
src << browse(output,"window=playerpoll;size=500x250")
+ if(POLLTYPE_IRV)
+ var/datum/asset/irv_assets = get_asset_datum(/datum/asset/simple/IRV)
+ irv_assets.send(src)
+
+ var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
+ if(!voted_query.Execute())
+ var/err = voted_query.ErrorMsg()
+ log_game("SQL ERROR obtaining optionid from poll_vote table. Error : \[[err]\]\n")
+ return
+
+ var/list/votedfor = list()
+ while(voted_query.NextRow())
+ votedfor.Add(text2num(voted_query.item[1]))
+
+ var/list/datum/polloption/options = list()
+
+ var/DBQuery/options_query = dbcon.NewQuery("SELECT id, text FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
+ if(!options_query.Execute())
+ var/err = options_query.ErrorMsg()
+ log_game("SQL ERROR obtaining id, text from poll_option table. Error : \[[err]\]\n")
+ return
+ while(options_query.NextRow())
+ var/datum/polloption/PO = new()
+ PO.optionid = text2num(options_query.item[1])
+ PO.optiontext = options_query.item[2]
+ options["[PO.optionid]"] += PO
+
+ //if they already voted, use their sort
+ if (votedfor.len)
+ var/list/datum/polloption/newoptions = list()
+ for (var/V in votedfor)
+ var/datum/polloption/PO = options["[V]"]
+ if(PO)
+ newoptions["[V]"] = PO
+ options -= "[V]"
+ //add any options that they didn't vote on (some how, some way)
+ options = shuffle(options)
+ for (var/V in options)
+ newoptions["[V]"] = options["[V]"]
+ options = newoptions
+ //otherwise, lets shuffle it.
+ else
+ var/list/datum/polloption/newoptions = list()
+ while (options.len)
+ var/list/local_options = options.Copy()
+ var/key
+ //the jist is we randomly remove all options from a copy of options until only one reminds,
+ // move that over to our new list
+ // and repeat until we've moved all of them
+ while (local_options.len)
+ key = local_options[rand(1, local_options.len)]
+ local_options -= key
+ var/value = options[key]
+ options -= key
+ newoptions[key] = value
+ options = newoptions
+
+ var/output = {"
+
+
+
+
+
+
+
+
+
+
Player poll
+ Question: [pollquestion] Please sort the options in the order of most preferred to least preferred
+ Revoting has been enabled on this poll, if you think you made a mistake, simply revote
+ Poll runs from [pollstarttime] until [pollendtime]
+
+
+ "}
+ src << browse(null ,"window=playerpolllist")
+ src << browse(output,"window=playerpoll;size=500x500")
return
-/mob/new_player/proc/poll_check_voted(pollid, table)
- if(!dbcon.IsConnected())
+/mob/new_player/proc/poll_check_voted(pollid, text = FALSE)
+ var/table = "poll_vote"
+ if (text)
+ table = "poll_textreply"
+ if (!establish_db_connection())
usr << "Failed to establish database connection."
return
- var/DBQuery/query_hasvoted = dbcon.NewQuery("SELECT id FROM [format_table_name(table)] WHERE pollid = [pollid] AND ckey = '[ckey]'")
+ var/DBQuery/query_hasvoted = dbcon.NewQuery("SELECT id FROM `[format_table_name(table)]` WHERE pollid = [pollid] AND ckey = '[ckey]'")
if(!query_hasvoted.Execute())
var/err = query_hasvoted.ErrorMsg()
log_game("SQL ERROR obtaining id from [table] table. Error : \[[err]\]\n")
@@ -243,10 +365,134 @@
. = client.holder.rank
return .
+
+/mob/new_player/proc/vote_rig_check()
+ if (usr != src)
+ if (!usr || !src)
+ return 0
+ //we gots ourselfs a dirty cheater on our hands!
+ log_game("[key_name(usr)] attempted to rig the vote by voting as [ckey]")
+ message_admins("[key_name_admin(usr)] attempted to rig the vote by voting as [ckey]")
+ usr << "You don't seem to be [ckey]."
+ src << "Something went horribly wrong processing your vote. Please contact an administrator, they should have gotten a message about this"
+ return 0
+ return 1
+
+/mob/new_player/proc/vote_valid_check(pollid, holder, type)
+ if (!establish_db_connection())
+ src << "Failed to establish database connection."
+ return 0
+ pollid = text2num(pollid)
+ if (!pollid || pollid < 0)
+ return 0
+ //validate the poll is actually the right type of poll and its still active
+ var/DBQuery/select_query = dbcon.NewQuery({"
+ SELECT id
+ FROM [format_table_name("poll_question")]
+ WHERE
+ [(holder ? "" : "adminonly = false AND")]
+ id = [pollid]
+ AND
+ Now() BETWEEN starttime AND endtime
+ AND
+ polltype = '[type]'
+ "})
+ if (!select_query.Execute())
+ var/err = select_query.ErrorMsg()
+ log_game("SQL ERROR validating poll via poll_question table. Error : \[[err]\]\n")
+ return 0
+ if (!select_query.NextRow())
+ return 0
+ return 1
+
+/mob/new_player/proc/vote_on_irv_poll(pollid, list/votelist)
+ if (!establish_db_connection())
+ src << "Failed to establish database connection."
+ return 0
+ if (!vote_rig_check())
+ return 0
+ pollid = text2num(pollid)
+ if (!pollid || pollid < 0)
+ return 0
+ if (!votelist || !istype(votelist) || !votelist.len)
+ return 0
+ if (!client)
+ return 0
+ //save these now so we can still process the vote if the client goes away while we process.
+ var/datum/admins/holder = client.holder
+ var/rank = "Player"
+ if (holder)
+ rank = holder.rank
+ var/ckey = client.ckey
+ var/address = client.address
+
+ //validate the poll
+ if (!vote_valid_check(pollid, holder, POLLTYPE_IRV))
+ return 0
+
+ //lets collect the options
+ var/DBQuery/options_query = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_option")] WHERE pollid = [pollid]")
+ if (!options_query.Execute())
+ var/err = options_query.ErrorMsg()
+ log_game("SQL ERROR obtaining id from poll_option table. Error : \[[err]\]\n")
+ return 0
+ var/list/optionlist = list()
+ while (options_query.NextRow())
+ optionlist += text2num(options_query.item[1])
+
+ //validate their votes are actually in the list of options and actually numbers
+ var/list/numberedvotelist = list()
+ for (var/vote in votelist)
+ vote = text2num(vote)
+ numberedvotelist += vote
+ if (!vote) //this is fine because voteid starts at 1, so it will never be 0
+ src << "Error: Invalid (non-numeric) votes in the vote data."
+ return 0
+ if (!(vote in optionlist))
+ src << "Votes for choices that do not appear to be in the poll detected"
+ return 0
+ if (!numberedvotelist.len)
+ src << "Invalid vote data"
+ return 0
+
+ //lets add the vote, first we generate a insert statement.
+
+ var/sqlrowlist = ""
+ for (var/vote in numberedvotelist)
+ if (sqlrowlist != "")
+ sqlrowlist += ", " //a comma (,) at the start of the first row to insert will trigger a SQL error
+ sqlrowlist += "(Now(), [pollid], [vote], '[sanitizeSQL(ckey)]', '[sanitizeSQL(address)]', '[sanitizeSQL(rank)]')"
+
+ //now lets delete their old votes (if any)
+ var/DBQuery/voted_query = dbcon.NewQuery("DELETE FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[ckey]'")
+ if (!voted_query.Execute())
+ var/err = voted_query.ErrorMsg()
+ log_game("SQL ERROR clearing out old votes. Error : \[[err]\]\n")
+ return 0
+
+ //now to add the new ones.
+ var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime, pollid, optionid, ckey, ip, adminrank) VALUES [sqlrowlist]")
+ if(!query_insert.Execute())
+ var/err = query_insert.ErrorMsg()
+ log_game("SQL ERROR adding vote to table. Error : \[[err]\]\n")
+ src << "Error adding vote."
+ return 0
+ src << browse(null,"window=playerpoll")
+ return 1
+
+
/mob/new_player/proc/vote_on_poll(pollid, optionid)
+ if(!establish_db_connection())
+ src << "Failed to establish database connection."
+ return 0
+ if (!vote_rig_check())
+ return 0
if(!pollid || !optionid)
return
- var/adminrank = poll_check_voted(pollid, "poll_vote")
+ //validate the poll
+ if (!vote_valid_check(pollid, client.holder, POLLTYPE_OPTION))
+ return 0
+ var/adminrank = poll_check_voted(pollid)
if(!adminrank)
return
var/DBQuery/query_insert = dbcon.NewQuery("INSERT INTO [format_table_name("poll_vote")] (datetime, pollid, optionid, ckey, ip, adminrank) VALUES (Now(), [pollid], [optionid], '[ckey]', '[client.address]', '[adminrank]')")
@@ -258,12 +504,20 @@
return 1
/mob/new_player/proc/log_text_poll_reply(pollid, replytext)
+ if(!establish_db_connection())
+ src << "Failed to establish database connection."
+ return 0
+ if (!vote_rig_check())
+ return 0
if(!pollid)
return
+ //validate the poll
+ if (!vote_valid_check(pollid, client.holder, POLLTYPE_TEXT))
+ return 0
if(!replytext)
usr << "The text you entered was blank. Please correct the text and submit again."
return
- var/adminrank = poll_check_voted(pollid, "poll_textreply")
+ var/adminrank = poll_check_voted(pollid, TRUE)
if(!adminrank)
return
replytext = sanitizeSQL(replytext)
@@ -279,11 +533,16 @@
return 1
/mob/new_player/proc/vote_on_numval_poll(pollid, optionid, rating)
+ if(!establish_db_connection())
+ src << "Failed to establish database connection."
+ return 0
+ if (!vote_rig_check())
+ return 0
if(!pollid || !optionid || !rating)
return
- if(!dbcon.IsConnected())
- usr << "Failed to establish database connection."
- return
+ //validate the poll
+ if (!vote_valid_check(pollid, client.holder, POLLTYPE_RATING))
+ return 0
var/DBQuery/query_hasvoted = dbcon.NewQuery("SELECT id FROM [format_table_name("poll_vote")] WHERE optionid = [optionid] AND ckey = '[ckey]'")
if(!query_hasvoted.Execute())
var/err = query_hasvoted.ErrorMsg()
@@ -304,11 +563,16 @@
return 1
/mob/new_player/proc/vote_on_multi_poll(pollid, optionid)
+ if(!establish_db_connection())
+ src << "Failed to establish database connection."
+ return 0
+ if (!vote_rig_check())
+ return 0
if(!pollid || !optionid)
return 1
- if(!dbcon.IsConnected())
- usr << "Failed to establish database connection."
- return 1
+ //validate the poll
+ if (!vote_valid_check(pollid, client.holder, POLLTYPE_MULTI))
+ return 0
var/DBQuery/query_get_choicelen = dbcon.NewQuery("SELECT multiplechoiceoptions FROM [format_table_name("poll_question")] WHERE id = [pollid]")
if(!query_get_choicelen.Execute())
var/err = query_get_choicelen.ErrorMsg()
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 24bc2f9fa1a..08f1f9bd76f 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -11,18 +11,24 @@
pressure_resistance = 8
burn_state = FLAMMABLE
var/amount = 30 //How much paper is in the bin.
- var/list/papers = new/list() //List of papers put in the bin for reference.
+ var/list/papers = list() //List of papers put in the bin for reference.
/obj/item/weapon/paper_bin/fire_act()
if(!amount)
return
..()
+/obj/item/weapon/paper_bin/Destroy()
+ if(papers)
+ for(var/i in papers)
+ qdel(i)
+ papers = null
+ . = ..()
+
/obj/item/weapon/paper_bin/burn()
amount = 0
extinguish()
update_icon()
- return
/obj/item/weapon/paper_bin/MouseDrop(atom/over_object)
var/mob/living/M = usr
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 2063a91ae68..9c17ba8db9b 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -114,7 +114,7 @@
setDir(SOUTH)
if(auto_name)
- name = "[get_area(src)] APC"
+ name = "\improper [get_area(src)] APC"
pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24)
pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0
@@ -147,7 +147,7 @@
qdel(cell)
if(terminal)
disconnect_terminal()
- return ..()
+ . = ..()
/obj/machinery/power/apc/proc/make_terminal()
// create a terminal object at the same position as original turf loc
@@ -797,24 +797,11 @@
malf << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process."
malf.malfhack = src
malf.malfhacking = TRUE
- addtimer(src, "malfhacked", 600, FALSE, malf)
+ addtimer(malf, "malfhacked", 600, FALSE, src)
-/obj/machinery/power/apc/proc/malfhacked(mob/living/silicon/ai/malf)
- if(!istype(malf))
- return
- malf.malfhack = null
- malf.malfhacking = FALSE
- if(src && !src.aidisabled)
- malf.malf_picker.processing_time += 10
-
- malfai = malf.parent || malf
- malfhack = TRUE
- locked = TRUE
-
- malf << "Hack complete. The APC is now under your exclusive control."
- update_icon()
- else
- malf << "Hack aborted. The designated APC has stopped responding and no longer exists on the power network."
+ var/obj/screen/alert/hackingapc/A
+ A = malf.throw_alert("hackingapc", /obj/screen/alert/hackingapc)
+ A.target = src
/obj/machinery/power/apc/proc/malfoccupy(mob/living/silicon/ai/malf)
if(!istype(malf))
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 670aa1276a9..1b7e68f0d0c 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -48,7 +48,7 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
var/obj/singularity/energy_ball/EB = ball
qdel(EB)
- return ..()
+ . = ..()
/obj/singularity/energy_ball/process()
if(!orbiting)
@@ -71,8 +71,6 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else
energy = 0 // ensure we dont have miniballs of miniballs
- return
-
/obj/singularity/energy_ball/examine(mob/user)
..()
if(orbiting_balls.len)
@@ -89,28 +87,17 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
var/turf/T = get_step(src, move_dir)
if(can_move(T))
loc = T
+ for(var/mob/living/carbon/C in loc)
+ dust_mobs(C)
/obj/singularity/energy_ball/proc/handle_energy()
-
if(energy >= energy_to_raise)
energy_to_lower = energy_to_raise - 20
energy_to_raise = energy_to_raise * 1.25
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 30)
- spawn(100)
- if (!loc)
- return
- var/obj/singularity/energy_ball/EB = new(loc)
-
- EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
- var/icon/I = icon(icon,icon_state,dir)
-
- var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8)
- orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
-
- EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
-
+ addtimer(src, "new_mini_ball", 100)
else if(energy < energy_to_lower && orbiting_balls.len)
energy_to_raise = energy_to_raise / 1.25
@@ -122,6 +109,20 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(orbiting_balls.len)
dissipate() //sing code has a much better system.
+/obj/singularity/energy_ball/proc/new_mini_ball()
+ if(!loc)
+ return
+ var/obj/singularity/energy_ball/EB = new(loc)
+
+ EB.transform *= pick(0.3, 0.4, 0.5, 0.6, 0.7)
+ var/icon/I = icon(icon,icon_state,dir)
+
+ var/orbitsize = (I.Width() + I.Height()) * pick(0.4, 0.5, 0.6, 0.7, 0.8)
+ orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25)
+
+ EB.orbit(src, orbitsize, pick(FALSE, TRUE), rand(10, 25), pick(3, 4, 5, 6, 36))
+
+
/obj/singularity/energy_ball/Bump(atom/A)
dust_mobs(A)
@@ -146,7 +147,6 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A
C.dust()
- return
/proc/tesla_zap(var/atom/source, zap_range = 3, power)
. = source.dir
@@ -262,5 +262,3 @@ var/list/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics,
else if(closest_structure)
closest_structure.tesla_act(power)
-
-
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 5beb6a7ed7a..ff698c1c2dc 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -32,9 +32,8 @@
desc = "[initial(desc)][BB ? "" : " This one is spent"]"
/obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!).
- if (!BB)
+ if(!BB)
BB = new projectile_type(src)
- return
/obj/item/ammo_casing/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/ammo_box))
@@ -79,6 +78,7 @@
var/multiload = 1
/obj/item/ammo_box/New()
+ ..()
for(var/i = 1, i <= max_ammo, i++)
stored_ammo += new ammo_type(src)
update_icon()
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index a9f383c0ca7..079b00aa0c5 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -107,7 +107,6 @@
/obj/item/weapon/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
user << "*click*"
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
- return
/obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, pointblank = 0, mob/pbtarget = null, message = 1)
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 994958670ba..988b0ebd657 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -36,7 +36,8 @@
if(istype(AM, mag_type))
if(magazine)
user << "You perform a tactical reload on \the [src], replacing the magazine."
- magazine.loc = get_turf(src.loc)
+ magazine.dropped()
+ magazine.forceMove(get_turf(src.loc))
magazine.update_icon()
magazine = null
else
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a36ee4c3e61..b95fc965951 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -35,7 +35,7 @@
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
var/nodamage = 0 //Determines if the projectile will skip any damage inflictions
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
- var/projectile_type = "/obj/item/projectile"
+ var/projectile_type = /obj/item/projectile
var/range = 50 //This will de-increment every step. When 0, it will delete the projectile.
//Effects
var/stun = 0
@@ -140,58 +140,66 @@
Angle = setAngle
if(!legacy) //new projectiles
set waitfor = 0
+ var/next_run = world.time
while(loc)
- if(!paused)
- if((!( current ) || loc == current))
- current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
+ if(paused)
+ next_run = world.time
+ sleep(1)
+ continue
+
+ if((!( current ) || loc == current))
+ current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
- if(!Angle)
- Angle=round(Get_Angle(src,current))
- if(spread)
- Angle += (rand() - 0.5) * spread
- var/matrix/M = new
- M.Turn(Angle)
- transform = M
+ if(!Angle)
+ Angle=round(Get_Angle(src,current))
+ if(spread)
+ Angle += (rand() - 0.5) * spread
+ var/matrix/M = new
+ M.Turn(Angle)
+ transform = M
- var/Pixel_x=round(sin(Angle)+16*sin(Angle)*2)
- var/Pixel_y=round(cos(Angle)+16*cos(Angle)*2)
- var/pixel_x_offset = pixel_x + Pixel_x
- var/pixel_y_offset = pixel_y + Pixel_y
- var/new_x = x
- var/new_y = y
+ var/Pixel_x=round(sin(Angle)+16*sin(Angle)*2)
+ var/Pixel_y=round(cos(Angle)+16*cos(Angle)*2)
+ var/pixel_x_offset = pixel_x + Pixel_x
+ var/pixel_y_offset = pixel_y + Pixel_y
+ var/new_x = x
+ var/new_y = y
- while(pixel_x_offset > 16)
- pixel_x_offset -= 32
- pixel_x -= 32
- new_x++// x++
- while(pixel_x_offset < -16)
- pixel_x_offset += 32
- pixel_x += 32
- new_x--
+ while(pixel_x_offset > 16)
+ pixel_x_offset -= 32
+ pixel_x -= 32
+ new_x++// x++
+ while(pixel_x_offset < -16)
+ pixel_x_offset += 32
+ pixel_x += 32
+ new_x--
- while(pixel_y_offset > 16)
- pixel_y_offset -= 32
- pixel_y -= 32
- new_y++
- while(pixel_y_offset < -16)
- pixel_y_offset += 32
- pixel_y += 32
- new_y--
+ while(pixel_y_offset > 16)
+ pixel_y_offset -= 32
+ pixel_y -= 32
+ new_y++
+ while(pixel_y_offset < -16)
+ pixel_y_offset += 32
+ pixel_y += 32
+ new_y--
- speed = round(speed)
- step_towards(src, locate(new_x, new_y, z))
- if(speed <= 1)
- pixel_x = pixel_x_offset
- pixel_y = pixel_y_offset
- else
- animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (speed <= 3 ? speed - 1 : speed)))
+ step_towards(src, locate(new_x, new_y, z))
+ next_run += max(world.tick_lag, speed)
+ var/delay = next_run - world.time
+ if(delay <= world.tick_lag*2)
+ pixel_x = pixel_x_offset
+ pixel_y = pixel_y_offset
+ else
+ animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)))
- if(original && (original.layer>=2.75) || ismob(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Bump(original, 1)
- Range()
- sleep(max(1, speed))
+ if(original && (original.layer>=2.75) || ismob(original))
+ if(loc == get_turf(original))
+ if(!(original in permutated))
+ Bump(original, 1)
+ Range()
+ if (delay > 0)
+ sleep(delay)
+
else //old projectile system
set waitfor = 0
while(loc)
@@ -204,7 +212,7 @@
if(!(original in permutated))
Bump(original, 1)
Range()
- sleep(1)
+ sleep(config.run_speed * 0.9)
/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
@@ -218,4 +226,4 @@
/obj/item/projectile/proc/dumbfire(var/dir)
current = get_ranged_target_turf(src, dir, world.maxx)
- fire()
\ No newline at end of file
+ fire()
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 2c3366a401c..b2e0b8fb995 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -125,7 +125,6 @@
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
qdel(hotspot)
- return
/*
* Water reaction to an object
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index 8da685439b5..afd5d590ce9 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -589,7 +589,10 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/toxin/amanitin/on_mob_delete(mob/living/M)
- M.adjustToxLoss(current_cycle*3*REM)
+ var/toxdamage = current_cycle*3*REM
+ M.adjustToxLoss(toxdamage)
+ if(M)
+ add_logs(M, get_turf(M), "has taken [toxdamage] toxin damage from amanitin toxin")
..()
/datum/reagent/toxin/lipolicide
diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm
index 5e116c89d7d..e31ecf4beff 100644
--- a/code/modules/recycling/disposal-structures.dm
+++ b/code/modules/recycling/disposal-structures.dm
@@ -258,9 +258,8 @@
if(istype(T, /turf/open/floor)) //intact floor, pop the tile
var/turf/open/floor/myturf = T
- if(myturf.builtin_tile)
- myturf.builtin_tile.loc = T
- myturf.builtin_tile = null
+ if(myturf.floor_tile)
+ PoolOrNew(myturf.floor_tile, T)
myturf.make_plating()
if(direction) // direction is specified
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 0fe0205b916..8e5bfa55e6d 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -711,3 +711,20 @@
materials = list(MAT_METAL = 12000)
build_path = /obj/item/wallframe/turret_control
category = list("initial", "Construction")
+
+/datum/design/conveyor_belt
+ name = "Conveyor belt"
+ id = "conveyor_belt"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 5000)
+ build_path = /obj/item/conveyor_construct
+ category = list("initial", "Construction")
+
+/datum/design/conveyor_switch
+ name = "Conveyor belt switch"
+ id = "conveyor_switch"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 450, MAT_GLASS = 190)
+ build_path = /obj/item/conveyor_switch_construct
+ category = list("initial", "Construction")
+
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 030bafcf6ce..703a916c342 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -1,11 +1,5 @@
//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm
-/obj/machinery/lavaland_controller
- name = "weather machine"
- desc = "Controls the weather... when it's on, at any rate. A sticky note on the side proclaims \"DISABLED IN FAVOR OF AN ACTUAL ATMOSPHERE\"."
- icon = 'icons/obj/machines/telecomms.dmi'
- icon_state = "processor_off"
-
/obj/structure/fans/tiny/invisible //For blocking air in ruin doorways
invisibility = INVISIBILITY_ABSTRACT
diff --git a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
index ffdf2ad6eb1..7795c1a81e0 100644
--- a/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
+++ b/code/modules/ruins/objects_and_mobs/necropolis_gate.dm
@@ -1,5 +1,5 @@
//The necropolis gate is used to call forth Legion from the Necropolis.
-/obj/structure/lavaland_door
+/obj/structure/necropolis_gate
name = "necropolis gate"
desc = "A tremendous and impossibly large gateway, bored into dense bedrock."
icon = 'icons/effects/96x96.dmi'
@@ -9,12 +9,13 @@
opacity = 1
bound_width = 96
bound_height = 96
+ pixel_x = -32
burn_state = LAVA_PROOF
luminosity = 1
var/boss = FALSE
var/is_anyone_home = FALSE
-/obj/structure/lavaland_door/attack_hand(mob/user)
+/obj/structure/necropolis_gate/attack_hand(mob/user)
for(var/mob/living/simple_animal/hostile/megafauna/legion/L in mob_list)
return
if(is_anyone_home)
@@ -51,10 +52,10 @@
is_anyone_home = FALSE
new/mob/living/simple_animal/hostile/megafauna/legion(get_step(src.loc, SOUTH))
-/obj/structure/lavaland_door/singularity_pull()
+/obj/structure/necropolis_gate/singularity_pull()
return 0
-/obj/structure/lavaland_door/Destroy(force)
+/obj/structure/necropolis_gate/Destroy(force)
if(force)
. = ..()
else
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 5da611bb578..9c9aef953e2 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -435,6 +435,8 @@
if(S0.area_type)
area_type = S0.area_type
+ var/destination_turf_type = S1.turf_type
+
var/list/L0 = return_ordered_turfs(x, y, z, dir, areaInstance)
var/list/L1 = return_ordered_turfs(S1.x, S1.y, S1.z, S1.dir)
@@ -466,6 +468,7 @@
continue
if(T0.type != T0.baseturf) //So if there is a hole in the shuttle we don't drag along the space/asteroid/etc to wherever we are going next
T0.copyTurf(T1)
+ T1.baseturf = destination_turf_type
areaInstance.contents += T1
//copy over air
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index 273841b7872..5c0dd819f89 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -53,7 +53,7 @@
*
* return datum/tgui The requested UI.
**/
-/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state, browser_id)
+/datum/tgui/New(mob/user, datum/src_object, ui_key, interface, title, width = 0, height = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state, browser_id = null)
src.user = user
src.src_object = src_object
src.ui_key = ui_key
@@ -99,7 +99,7 @@
var/debugable = check_rights_for(user.client, R_DEBUG)
user << browse(get_html(debugable), "window=[window_id];[window_size][list2params(window_options)]") // Open the window.
- if (custom_browser_id)
+ if (!custom_browser_id)
winset(user, window_id, "on-close=\"uiclose \ref[src]\"") // Instruct the client to signal UI when the window is closed.
SStgui.on_open(src)
diff --git a/code/world.dm b/code/world.dm
index 0d1c298e64c..2b70a86cea8 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -11,6 +11,7 @@ var/global/list/map_transition_config = MAP_TRANSITION_CONFIG
/world/New()
check_for_cleanbot_bug()
map_ready = 1
+ world.log << "Map is ready."
#if (PRELOAD_RSC == 0)
external_rsc_urls = file2list("config/external_rsc_urls.txt","\n")
diff --git a/config/tips.txt b/config/tips.txt
index afcbe8700b1..4985387309a 100644
--- a/config/tips.txt
+++ b/config/tips.txt
@@ -155,7 +155,32 @@ As a Cultist, do not cause too much chaos before your objective is completed. If
As a Cultist, your team starts off very weak, but if necessary can quickly convert everything they have into raw power. Make sure you have the numbers and equipment to support going loud, or the cult will fall flat on its face.
As a Cultist, the Blood Boil rune instantly crits all non-cultists who can see it, but has a chance to explode runes near it, incuding itself.
As a Cultist, you can create an army of manifested goons using a combination of the Manifest rune, which creates homunculi from ghosts, and the Blood Drain rune, which drains life from anyone standing on any blood drain rune.
-You can deconvert Cultists by feeding them large amounts of holy water.
+As a Servant, your clockwork Slab fits in pockets and does not need to be held to communicate with other Servants.
+As a Servant, try using the Judicial Visor on a target stunned by a Sigil of Transgression; if done properly, it will allow you to convert them with very little chance of being noticed.
+As a Servant, the Judicial Visor is an effective defensive combat tool in small spaces, as it stuns and mutes anyone still on it after 3 seconds. It is also useful for stunning already-stunned enemies for long enough to convert them or finish them off.
+As a Servant, making, and protecting, Tinkerer's Caches is extremely important, as caches are required to unlock scripture and share components.
+As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them.
+As a Servant, Mending Motors can be powered with replicant alloy by striking it with the alloy in addition to Sigils of Transmission and APC power, and will rapidly repair all nearby damaged clockwork constructs, structures, and servant silicons.
+As a Servant, Clockwork Structures that require power will draw power from the APC if they cannot find a different source of power, and most power-using Structures will rapidly drain the APC.
+As a Servant, you can repair Clockwork Structures with a Clockwork Proselytizer at a rate of 1 health to 2 liquified alloy.
+As a Servant, securing a reliable source of component generation is high-priority, as simply handing out slabs will slowly become inefficient. Try placing Tinkerer's Caches near clockwork walls, or placing Tinkerer's Daemons within those caches.
+As a Servant, only held Clockwork Slabs will generate components, and they must be held, in a pocket, or in a storage object to do so, so holding more than one slab is a waste of time.
+As a Servant, You can attempt to convert any number of adjacent people in melee range by using the "Guvax" scripture. Be aware that, like slab generation, Guvax's invoke time will become slower with each servant above 5 that is valid for scripture unlocks.
+As a Servant, be aware that Cogscarabs are not very efficient in large numbers, as they all require replicant alloy to convert objects and repair structures. Too many scarabs will likely result in a rapid loss of replicant alloy as they consume it to convert the station.
+As a Servant, placing components in a slab or cache places those components in a globally-accessable storage that slabs will draw from to invoke scripture.
+As a Servant, you can stack different types of Sigils on the same turf; try stacking a Sigil of Transgression and a Sigil of Submission for a subtle conversion trap.
+As a Servant, you can deconstruct a clockwork wall with a Clockwork Proselytizer to regain 40 alloy. You can also construct clockwork walls on clockwork floors for a cost of 40 alloy.
+As a Servant, using Volt Void while on a Sigil of Transmission will drain power from all visible APCs, power cells, SMES units, non-servant cyborgs, and lights and transfer that power into the Sigil.
+As a Servant, Fellowship Armory invokes much faster for each nearby servant and attempts to provide each affected servant with powerful armor against melee and bullet attacks. The gauntlets provided are also immune to elecricity.
+As a Servant, Spatial Gateway can teleport to any living Servant or Clockwork Obelisk, and gains additional uses and duration for each Servant assisting in the invocation.
+As a Servant, defending the Gateway to the Celestial Derelict is your ultimate goal, and it is heavily recommended that you defend it with all the tools you have avalible, including Ocular Wardens, Mania Motors, Mending Motors, and other, not mentioned things.
+As a Servant, once Ratvar has arrived, all of your tools gain a massive boost in power and will, in general, have no cost and work at double speed.
+As a Servant, you can impale human targets with a Ratvarian Spear by pulling them, then attacking them. This does massive damage and stuns them, and should effectively win the fight.
+As a Servant, Sentinel's Compromise can instantly return you or another Servant to a fighting state by converting half of all their brute and burn damage to toxin, effectively halving the damage they have. Clockwork floors will also rapidly heal toxin damage in Servants, allowing the Compromise more effectiveness.
+As a Servant, Clockwork Marauders can only be called forth by exactly saying their true name or if you are heavily damaged, so it is recommended to only have them recalled if they need to heal.
+As a Servant, Belligerent, while not particularly useful when alone, is excellent for distrupting and winning a large fight, as even one chant will force all nearby enemies to walk.
+As a Servant, Soul Vessels can be placed in cyborg shells, mecha, Cogscarab shells, and Anima Fragment shells.
+You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water.
As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least.
As a Wizard, the fireball spell performs very poorly at close range, as it can easily catch you in the blast. It is best used as a form of artillery down long hallways.
As a Wizard, summoning guns will turn a large portion of the crew against themselves, but will also give everyone anything from a pea shooter to a BFG 9000. Use at your own risk!
diff --git a/html/IRV/jquery-1.10.2.min.js b/html/IRV/jquery-1.10.2.min.js
new file mode 100644
index 00000000000..da4170647dd
--- /dev/null
+++ b/html/IRV/jquery-1.10.2.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.2.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="