diff --git a/_maps/RandomZLevels/blackmarketpackers.dmm b/_maps/RandomZLevels/blackmarketpackers.dmm
index 73c99cd92b1..377417f3715 100644
--- a/_maps/RandomZLevels/blackmarketpackers.dmm
+++ b/_maps/RandomZLevels/blackmarketpackers.dmm
@@ -61,7 +61,7 @@
"bi" = (/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bj" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
"bk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore)
-"bl" = (/obj/structure/table/wood,/obj/item/weapon/spacecash/c500,/obj/item/weapon/spacecash/c100,/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
+"bl" = (/obj/structure/table/wood,/obj/item/stack/spacecash/c500,/obj/item/stack/spacecash/c100,/obj/item/weapon/reagent_containers/food/drinks/beer,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
"bm" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
"bn" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship/Fore)
"bo" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship/Fore)
@@ -91,7 +91,7 @@
"bM" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bN" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bO" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"bP" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c50,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
+"bP" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c50,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
"bQ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore)
"bR" = (/turf/simulated/floor/plasteel{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/awaymission/BMPship/Fore)
"bS" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Fore)
@@ -122,8 +122,8 @@
"cr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cs" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"ct" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cu" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cv" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cu" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cv" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cw" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice,/obj/item/organ/appendix,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
@@ -444,8 +444,8 @@
"iB" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iC" = (/obj/item/weapon/caution,/turf/simulated/floor/plating/airless,/area/awaymission)
"iD" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating/airless,/area/awaymission)
-"iE" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
-"iF" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
+"iE" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c200,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
+"iF" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"iG" = (/obj/structure/sink{dir = 2},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iH" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft)
"iI" = (/obj/item/clothing/gloves/fyellow,/turf/simulated/floor/plating/asteroid/airless,/area/awaymission)
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index a1c4d3b4548..1eff96fbe75 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -172,7 +172,7 @@
"dp" = (/obj/structure/table/wood,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station, looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.
Log 2:
Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.
Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dq" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective_locked"; locked = 1; name = "personal closet"; req_access_txt = "150"},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/suppressor,/turf/simulated/floor/wood{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dr" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/weapon/spacecash/c50,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/stack/spacecash/c50,/turf/simulated/floor/wood{heat_capacity = 1e+006},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dt" = (/obj/machinery/door/airlock/external{density = 0; emagged = 1; icon_state = "door_open"; locked = 1; opacity = 0; req_access_txt = "150"},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"du" = (/obj/item/weapon/ore/iron,/obj/item/weapon/ore/iron{pixel_x = -7; pixel_y = -4},/turf/simulated/floor/plating/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"dv" = (/obj/structure/dispenser/oxygen{oxygentanks = 9},/obj/machinery/light/small{active_power_usage = 0; dir = 1; icon_state = "bulb-broken"; status = 2},/turf/simulated/floor/plating{carbon_dioxide = 48.7; dir = 9; heat_capacity = 1e+006; icon_state = "warnplate"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm
index bfaba82beb4..d1bab276812 100644
--- a/_maps/RandomZLevels/spacebattle.dmm
+++ b/_maps/RandomZLevels/spacebattle.dmm
@@ -339,7 +339,7 @@
"gA" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate4)
"gB" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate4)
"gC" = (/obj/structure/closet/crate/secure/weapon,/obj/item/weapon/gun/energy/laser,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
-"gD" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
+"gD" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"gE" = (/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/spacebattle/cruiser)
"gF" = (/obj/effect/landmark/corpse/doctor{mobname = "Adam Smith"; name = "Adam Smith"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"gG" = (/obj/structure/optable,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/spacebattle/cruiser)
diff --git a/_maps/map_files/MetaStation/MetaStation.v40D.dmm b/_maps/map_files/MetaStation/MetaStation.v40D.dmm
index 3e93cfc1116..e039b565ca2 100644
--- a/_maps/map_files/MetaStation/MetaStation.v40D.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v40D.dmm
@@ -681,9 +681,9 @@
"ane" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"anf" = (/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"ang" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/space)
-"anh" = (/obj/structure/table/reinforced,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c20{pixel_y = 6},/obj/structure/window/reinforced,/obj/item/weapon/stock_parts/cell/crap,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"anh" = (/obj/structure/table/reinforced,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c20{pixel_y = 6},/obj/structure/window/reinforced,/obj/item/weapon/stock_parts/cell/crap,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"ani" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/machinery/door/window/westleft{base_state = "right"; dir = 2; icon_state = "right"; name = "windoor"; req_access_txt = "0"},/obj/item/weapon/book/manual/wiki/engineering_hacking,/obj/item/device/tape/random,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"anj" = (/obj/structure/table/reinforced,/obj/item/weapon/spacecash/c100,/obj/structure/window/reinforced,/obj/item/weapon/firealarm_electronics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
+"anj" = (/obj/structure/table/reinforced,/obj/item/stack/spacecash/c100,/obj/structure/window/reinforced,/obj/item/weapon/firealarm_electronics,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"ank" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"anl" = (/obj/structure/rack{dir = 1},/obj/item/clothing/under/rank/mailman,/obj/item/clothing/under/rank/vice{pixel_x = 4; pixel_y = -3},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"anm" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_f10"; layer = 2},/area/space)
@@ -4336,7 +4336,7 @@
"bFt" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/lattice/catwalk,/turf/space,/area/solar/port)
"bFu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; frequency = 1441; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage)
"bFv" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/storage)
-"bFw" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood/poker,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c10,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bFw" = (/obj/structure/disposalpipe/segment,/obj/structure/table/wood/poker,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c10,/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bFx" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bFy" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bFz" = (/obj/structure/filingcabinet{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
diff --git a/_maps/map_files/MetaStation/z3.dmm b/_maps/map_files/MetaStation/z3.dmm
index 2b8b9ee6b41..1b7e6503e7f 100644
--- a/_maps/map_files/MetaStation/z3.dmm
+++ b/_maps/map_files/MetaStation/z3.dmm
@@ -124,7 +124,7 @@
"ct" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/chamber)
"cu" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
"cv" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
-"cw" = (/obj/item/weapon/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash,/turf/simulated/floor/engine,/area/tcommsat/chamber)
+"cw" = (/obj/item/weapon/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/stack/spacecash,/turf/simulated/floor/engine,/area/tcommsat/chamber)
"cx" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
"cy" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
"cz" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
diff --git a/_maps/map_files/MiniStation/z2.dmm b/_maps/map_files/MiniStation/z2.dmm
index 7660fecb54e..c72401c0fb1 100644
--- a/_maps/map_files/MiniStation/z2.dmm
+++ b/_maps/map_files/MiniStation/z2.dmm
@@ -377,7 +377,7 @@
"lp" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"lq" = (/obj/machinery/camera{pixel_x = 10; network = list("thunder"); c_tag = "Arena"},/turf/simulated/floor/bluegrid,/area/tdome)
"lw" = (/obj/structure/table/wood,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"lx" = (/obj/structure/table/wood,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"lx" = (/obj/structure/table/wood,/obj/item/stack/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"ly" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"lz" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"lD" = (/obj/machinery/door/poddoor{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 454dbfb2ca3..d3883396221 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -1987,7 +1987,7 @@
"aMk" = (/obj/machinery/door/window{dir = 4; name = "Theatre Stage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"aMl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aMm" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aMn" = (/obj/machinery/computer/slot_machine,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aMn" = (/obj/machinery/computer/slot_machine,/obj/machinery/light/small{dir = 4},/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aMo" = (/obj/structure/closet/secure_closet/bar{req_access_txt = "25"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aMp" = (/obj/structure/closet/gmcloset{icon_closed = "black"; icon_state = "black"; name = "formal wardrobe"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aMq" = (/obj/structure/kitchenspike,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
@@ -2037,7 +2037,7 @@
"aNi" = (/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"aNj" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"aNk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/theatre)
-"aNl" = (/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 32; pixel_y = 0},/obj/machinery/computer/slot_machine,/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aNl" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aNm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall,/area/crew_quarters/bar)
"aNn" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/bar)
"aNo" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/bar)
@@ -2108,9 +2108,9 @@
"aOB" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aOC" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aOD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aOE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aOE" = (/obj/structure/table/wood/poker,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aOF" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aOG" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/chem_dispenser/drinks/beer,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aOG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aOH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/crew_quarters/kitchen)
"aOI" = (/obj/machinery/door/airlock{name = "Kitchen cold room"; req_access_txt = "28"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"aOJ" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics)
@@ -2175,9 +2175,9 @@
"aPQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/wrench,/obj/item/device/assembly/timer,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/turf/simulated/floor/plasteel,/area/bridge)
"aPR" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"aPS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aPT" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aPT" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 29},/obj/item/stack/spacecash/c10{amount = 20},/obj/item/stack/spacecash/c50{amount = 20},/obj/item/stack/spacecash/c100{amount = 20},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aPU" = (/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aPV" = (/obj/structure/table/reinforced,/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = 4; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aPV" = (/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = 4; pixel_y = 28},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aPW" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aPX" = (/obj/machinery/vending/boozeomat,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aPY" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen)
@@ -2238,15 +2238,15 @@
"aRb" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "greencorner"},/area/bridge)
"aRc" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel,/area/bridge)
"aRd" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/simulated/floor/plating,/area/crew_quarters/bar)
-"aRe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aRe" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/chem_dispenser/drinks/beer,/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aRf" = (/obj/machinery/atmospherics/pipe/simple/general/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/prison)
"aRg" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aRh" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair"},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
-"aRi" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aRj" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aRk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aRl" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aRm" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aRi" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aRj" = (/obj/structure/table/wood/poker,/obj/item/toy/cards/deck,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aRk" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aRl" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table/wood/poker,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aRm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/stool{pixel_y = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aRn" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aRo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/mob/living/carbon/monkey{name = "Pun Pun"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aRp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
@@ -2267,7 +2267,7 @@
"aRE" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/library)
"aRF" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/ai_monitored/security/armory)
"aRG" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"aRH" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aRH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aRI" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
"aRJ" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
"aRK" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/chapel/main)
@@ -2318,11 +2318,11 @@
"aSD" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/bridge)
"aSE" = (/obj/machinery/computer/ordercomp,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/bridge)
"aSF" = (/obj/machinery/computer/security/mining,/turf/simulated/floor/plasteel{dir = 6; icon_state = "brown"},/area/bridge)
-"aSG" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/camera{c_tag = "Bar West"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aSG" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/table/reinforced,/obj/item/clothing/head/that{throwforce = 1; throwing = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aSH" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "chapel"},/area/chapel/main)
"aSI" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aSJ" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aSK" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aSJ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aSK" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aSL" = (/obj/effect/landmark/start{name = "Bartender"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aSM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aSN" = (/obj/machinery/requests_console{department = "Bar"; departmentType = 2; pixel_x = 30; pixel_y = 0},/obj/machinery/camera{c_tag = "Bar"; dir = 8; network = list("SS13")},/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/obj/machinery/chem_dispenser/drinks,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
@@ -2392,7 +2392,7 @@
"aTZ" = (/obj/machinery/camera{c_tag = "Bridge East Entrance"; dir = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central)
"aUa" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aUb" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aUc" = (/obj/structure/table/reinforced,/obj/item/clothing/head/that{throwforce = 1; throwing = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aUc" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -31},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aUd" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen)
"aUe" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen)
"aUf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen)
@@ -2481,12 +2481,12 @@
"aVK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"aVL" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"aVM" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"aVN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -31},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aVO" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aVN" = (/obj/structure/table/reinforced,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aVO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aVP" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aVQ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aVR" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
-"aVS" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aVQ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aVR" = (/obj/structure/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aVS" = (/obj/machinery/camera{c_tag = "Research Division Access"; dir = 2; network = list("SS13")},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
"aVT" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aVU" = (/obj/machinery/door/window/southright{name = "Bar Door"; req_access_txt = "0"; req_one_access_txt = "25;28"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aVV" = (/obj/structure/table/reinforced,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
@@ -2563,7 +2563,7 @@
"aXo" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/hallway/primary/central)
"aXp" = (/obj/machinery/power/apc{dir = 2; name = "Central Hall APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/hallway/primary/central)
"aXq" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central)
-"aXr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
+"aXr" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"aXs" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/bar)
"aXt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "28"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/crew_quarters/kitchen)
"aXu" = (/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "cafeteria"},/area/crew_quarters/kitchen)
@@ -3102,7 +3102,7 @@
"bhH" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
"bhI" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"bhJ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bhK" = (/obj/machinery/camera{c_tag = "Research Division Access"; dir = 2; network = list("SS13")},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
+"bhK" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/stack/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bhL" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab)
"bhM" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/toxins/lab)
"bhN" = (/obj/machinery/camera{c_tag = "Research and Development"; dir = 2; network = list("SS13","RD"); pixel_x = 22},/obj/machinery/door_control{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -6; pixel_y = 24; req_access_txt = "47"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/toxins/lab)
@@ -3177,7 +3177,6 @@
"bje" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bjf" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/clothing/glasses/welding,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bjg" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
-"bjh" = (/obj/machinery/shower{dir = 8},/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"bji" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bjj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bjk" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
@@ -5221,7 +5220,6 @@
"bWu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/toxins/misc_lab)
"bWv" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/toxins/misc_lab)
"bWw" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bWx" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bWy" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/aft)
"bWz" = (/obj/machinery/atmospherics/pipe/simple/general/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"bWA" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Mix to Port"; on = 0},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -6460,7 +6458,7 @@
"cuA" = (/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = 32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{dir = 4; icon_state = "direction_sci"; pixel_x = 32; pixel_y = -32; tag = "icon-direction_sci (EAST)"},/obj/structure/sign/directions/engineering{pixel_x = 32; pixel_y = -40},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"cuB" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/sign/directions/engineering{pixel_x = -32; pixel_y = -40},/obj/structure/sign/directions/medical{dir = 4; icon_state = "direction_med"; pixel_x = -32; pixel_y = -24; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/evac{dir = 4; icon_state = "direction_evac"; pixel_x = -32; pixel_y = -32; tag = "icon-direction_evac (EAST)"},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"cuD" = (/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera{c_tag = "Custodial Closet"},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor/plasteel,/area/janitor)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6577,14 +6575,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaekaCXaCYalQalQalQalQalQalQaIMalQaDgaINavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanTaekaJXaekaeZaeZaeZaeZaekaBEaJYafOaqpaJZaxaaKaaHbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaKBaKCaKDaKEaKFaKGaKHaKIaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaIpaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfaLyaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMavMavMavMavMavMaylavMaaaaqpaAuaLEaKaaLFaLGaLHaLHaLIarpaLJaKfaLKaLLaKhaLMaLNaLOaLPaLQaLRaKiaKiaKiaKiaKiaKiaKiaKmaKiaKhaKiaKiaKiaLSaLTaLUaLUaLUaLUaLVaLUaLWaLUaLUaLXaKhaGyaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaKAaHYaLYaLZaMaaMbaMcaMdaMeaMfaHYaHYaKAaHYaHYaHYaHYaHYaHYaHYaHYaHYaMgaHYaBdaKUaKUaKUaMhaMiaMjaMkaMlaMmaMnaIkaMoaImaMpaIkaIkaIpaMqaJzaMraLiaMsaIpaGWaGWaGWaGWaGWaGWaMtaMuaMvaGWaGXaEfaMwaGZaMxaMyaGZaMzaEfaEiaEiaEiaEiaEiaEiaMAaEiaEjaEjaEkaCTaMCaMDaBDaMEaMFaMGaMHaMIaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaKZaNlaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafarpavMaylavMaBGaxaaxaaMBavMaylavMaNXaNYaNZaxaaKaaOaaRhaKcaOaaKdarpaObaKfaxaaOcaOcaOcaOdaOcaOeaOeaOeaOeaOeaOfaOgaOeaOhaOeaOeaOeaOiaOjaOkaOjaOlaOmaOnaKiaKiaOoaOpaOqaOraKlaKiaNdaOsaOsaHYaHYaHZaHUaHUaHUaHUaHUaHUaHUaHUaOtbUPbUObUQbUObUObUObVMbUObWHbUObXtaOtaHUaHUaHUaHUaHUaHUaHUaHUaHXaHYaHYaIkaOAaOBaOCaOCaOCaOCaOCaJsaODaOCaIkaOEaOFaOGaIpaIpaIpaOHaOIaIpaIpaIpaIpaIpaNwaOJaOKaOKaOKaOLaOMaNwaGWaGXaEfaONaGZaNCaNDaGZaGZaOOaEfaOPaOQaORaBDaEjaOSaOTaOUaOUaOVaOWaOXaOYaBDaOZaPaaNRaPbaNRaPcaPdaPdaPcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaPeaxaavNaNZaxaaxaaPfavNaxaaPeaNZaxaaxaaxaaPgaPhaPhaPhaPhaPhaPhaPhaPiaxaaOcaPjaOcaPkaOeaPlaPmaPnaPoaPpaPmaPqaPraPsaPtaPuaPvaOiaPwaPxaPyaOlaPzaOnaOnaPAaOnaOnaOsaPBaPCaPDaPEaOsaOsaPFaHYaHZaHUaaaaaaaaaaaaaaaaaaaaaaOtaPGaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaOtaaaaaaaaaaaaaaaaaaaaaaHUaHXaHYaPRaIkaPSaOCaOCaOCaOCaOCaUaaJsaODaPUaPVaJsaPWaPXaIpaPYaPZaQaaQbaQcaQdaQeaQfaIpaNwaQgaQhaQhaQhaQiaQjaNwaGWaQkaEfaQlaQlaNCaNDaQmaQmaQnaEfaEfaQoaEfaBDaQpaNKaNLaQqaQqaNMaNNaBDaBDaBDaLDaQraQsaQtaLDaLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaavMaQvaQwaQwaQwaQwaQwaQwaQwaQwaQvaQwaQxaxaaxaaLLaxaaQyaQzaxaaQAaQBaxaaQCaQDaOcaQEaOcaPkaOeaQFaPmaQGaPmaPmaPmaPqaQHaPmaPmaPmaPvaOiaQIaPxaPxaOlaPzaOnaQJaQKaQKaQLaOsaQMaQNaQOaQPaQQaQRaHYaHYaHZaHUaaaaaaaaaaaaaOtaOtaOtaOtaQSaQTaQUaQVaQWaQXaQYaQZaRaaRbaRcaOtaOtaOtaOtaaaaaaaaaaaaaHUaHXaHYaHYaRdaOCaReaRgaRgaRgaRjaRiaRHaRkaRlaRmaRnaRoaRpaRqaRraRraRsaRtaRuaRuaRvaRraRwaRxaRyaRzaRAaRBaRCaQjaNwaGWaGXaEfaGZaGZaNCaNDaGZaGZaGZaRDaREaGZbqpaBDaRGaUyaRIaQqaQqaSHaRKaRLaBDaRMaRNaPaaNRaROaNRaRPaPdaPdaRQaRRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaLLaRSaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTaOcaQEaRWaRXaOeaRYaPmaRZaTfaSbaScaSdaSaaPmaPmaPmaSeaOiaSfaSgaShaOlaPzaOnaSiaSjaSkaSlaOsaSmaSnaSoaSpaSqaQRaHYaHYaHZaHUaHUaIcaSraOtaOtaSsaStaSuaSvaSwaSxaSyaSzaSxaSAaSxaSxaSBaSCaSDaSEaSFaOtaOtaSraIcaHUaHUaHXaHYaHYaIkaSGaJsaOCaOCaOCaOCaXsaOCaSIaSJaSKaSLaSMaSNaSOaSPaSQaSRaSSaSTaSUaSVaSPaSWaSXaSYaSZaTaaTbaSZaTcaTdaGWaGXaEfaTeaTeaNCaNDaTlaGZaGZaTgaGZaThaTiaBDaTjaTkaTpaQqaQqaTmaTnaEjaBDaToaNRaPaaNRaROaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaymaxbaTqaRTaTraTsaTtaTuaTtaTvaTraTtaRTaQEaQEaTwaTxaOeaTyaPmaTzaTAaTBaTCaTDaTfaPmaPmaPmaPvaOiaOiaOiaOiaOlaPzaOnaOnaOnaOnaOnaOsaTEaQOaQOaQOaQOaQRaHYaHYaHZaIaaIaaTFaTGaTHaOtaTIaTJaTKaTLaTMaTLaTNaTOaTPaTQaTRaTSaTTaTRaTUaTVaTWaOtaTXaTGaTYaTZaIaaHXaHYaHYaRdaOCaJsaPTaOCaUbaOCaPTaOCaODaPUaUcaOCaOCaOCaUdaUeaUfaUgaUhaUiaUjaUkaUlaIpaUmaUnaUoaQhaUpaQhaUqaUraGWaUsaEfaEfaEfaNCaNDaUtaUuaGZaUvaUwaJKaUxaBDaEjaUyaRIaQqaQqaRJaRKaUAaBDaUBaNRaPaaUCaUDaUEaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFavMavMaBGaUGaUHaUIaUJaUKaULaUMaUNaTraTtaRTaUOaUPaUQaOcaOeaURaUSaUTaUUaUTaUVaUWaUVaUVaUVaUXaUYaOeaUZaVaaVbaVcaVdaVeaVfaVgaOcaVhaOsaViaVjaVkaVlaVlaQRaHYaHYaHYaHYaHYaVmaVnaVoaVpaVqaVraVsaVtaVuaVvaVwaVxaVyaVzaVAaVBaVCaVDaVsaVEaVFaVGaVHaVIaVJaVKaVLaVMaHYaHYaIkaVNaVOaVPaVQaOCaVRaVSaVQaODaPUaVTaVTaVUaVVaIpaUeaUeaUeaVWaUeaUeaUkaVXaIpaNwaUnaQhaQhaUpaQhaVYaNwaGWaVZaWaaWbaWcaWdaWeaWfaWfaWfaWfaWfaWfaWgaWhaWiaWiaWiaWiaWiaWjaWkaWlaWhaWmaWnaWoaWpaNRaWqaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWraWsatBaWsaxaaxaaRTaWtaWuaWvaWvaWvaWwaWxaWyaRTaWzaQEaUQaWAaWAaWAaWBaWCaWAaWDaWEaWFaWGaWHaWHaWIaWJaOeaWKaWLaWMaWNaWOaWPaWPaWQaWRaWRaWSaWSaWSaWSaWSaWTaOsaHYaHYaWUaWVaWWaWXaWYaWZaOtaXaaXbaXcaXdaXeaXfaXfaXgaXhaXiaXjaXkaXlaXmaXcaXnaXaaOtaWZaWYaXoaXpaWVaXqaHYaHYaRdaOCaXraXsaOCaOCaOCaXsaOCaODaOCaPUaPUaOCaOCaXtaXuaXvaUeaUeaUeaUeaXwaXxaIpaXyaXzaQhaXAaXBaXCaXzaXDaGWaXEaXFaXFaXGaXHaXIaXJaXKaXLaXJaXJaXJaXMaXNaXOaXPaXPaXPaXPaXPaXQaXRaXNaXSaXTaXUaXVaNRaXWaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaODaRdaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafarpavMaylavMaBGaxaaxaaMBavMaylavMaNXaNYaNZaxaaKaaOaaRhaKcaOaaKdarpaObaKfaxaaOcaOcaOcaOdaOcaOeaOeaOeaOeaOeaOfaOgaOeaOhaOeaOeaOeaOiaOjaOkaOjaOlaOmaOnaKiaKiaOoaOpaOqaOraKlaKiaNdaOsaOsaHYaHYaHZaHUaHUaHUaHUaHUaHUaHUaHUaOtbUPbUObUQbUObUObUObVMbUObWHbUObXtaOtaHUaHUaHUaHUaHUaHUaHUaHUaHXaHYaHYaIkaOAaOBaNlaNlaNlaNlaOCaJsaOGaOEaPVaPTaOFaReaIpaIpaIpaOHaOIaIpaIpaIpaIpaIpaNwaOJaOKaOKaOKaOLaOMaNwaGWaGXaEfaONaGZaNCaNDaGZaGZaOOaEfaOPaOQaORaBDaEjaOSaOTaOUaOUaOVaOWaOXaOYaBDaOZaPaaNRaPbaNRaPcaPdaPdaPcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaPeaxaavNaNZaxaaxaaPfavNaxaaPeaNZaxaaxaaxaaPgaPhaPhaPhaPhaPhaPhaPhaPiaxaaOcaPjaOcaPkaOeaPlaPmaPnaPoaPpaPmaPqaPraPsaPtaPuaPvaOiaPwaPxaPyaOlaPzaOnaOnaPAaOnaOnaOsaPBaPCaPDaPEaOsaOsaPFaHYaHZaHUaaaaaaaaaaaaaaaaaaaaaaOtaPGaPHaPIaPJaPKaPLaPMaPNaPOaPPaPQaOtaaaaaaaaaaaaaaaaaaaaaaHUaHXaHYaPRaIkaPSaOCaRiaXsaXsaXsaOCaJsaOGaRjaPUaJsaPWaPXaIpaPYaPZaQaaQbaQcaQdaQeaQfaIpaNwaQgaQhaQhaQhaQiaQjaNwaGWaQkaEfaQlaQlaNCaNDaQmaQmaQnaEfaEfaQoaEfaBDaQpaNKaNLaQqaQqaNMaNNaBDaBDaBDaLDaQraQsaQtaLDaLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaavMaQvaQwaQwaQwaQwaQwaQwaQwaQwaQvaQwaQxaxaaxaaLLaxaaQyaQzaxaaQAaQBaxaaQCaQDaOcaQEaOcaPkaOeaQFaPmaQGaPmaPmaPmaPqaQHaPmaPmaPmaPvaOiaQIaPxaPxaOlaPzaOnaQJaQKaQKaQLaOsaQMaQNaQOaQPaQQaQRaHYaHYaHZaHUaaaaaaaaaaaaaOtaOtaOtaOtaQSaQTaQUaQVaQWaQXaQYaQZaRaaRbaRcaOtaOtaOtaOtaaaaaaaaaaaaaHUaHXaHYaHYaRdaOCaOCaOCaOCaOCaOCaOCaRkaRmaRlaRlaRnaRoaRpaRqaRraRraRsaRtaRuaRuaRvaRraRwaRxaRyaRzaRAaRBaRCaQjaNwaGWaGXaEfaGZaGZaNCaNDaGZaGZaGZaRDaREaGZbqpaBDaRGaUyaRIaQqaQqaSHaRKaRLaBDaRMaRNaPaaNRaROaNRaRPaPdaPdaRQaRRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaLLaRSaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTaOcaQEaRWaRXaOeaRYaPmaRZaTfaSbaScaSdaSaaPmaPmaPmaSeaOiaSfaSgaShaOlaPzaOnaSiaSjaSkaSlaOsaSmaSnaSoaSpaSqaQRaHYaHYaHZaHUaHUaIcaSraOtaOtaSsaStaSuaSvaSwaSxaSyaSzaSxaSAaSxaSxaSBaSCaSDaSEaSFaOtaOtaSraIcaHUaHUaHXaHYaHYaIkaRHaOCaUaaUaaUaaUaaOCaJsaSIaSGaSMaSLaSMaSNaSOaSPaSQaSRaSSaSTaSUaSVaSPaSWaSXaSYaSZaTaaTbaSZaTcaTdaGWaGXaEfaTeaTeaNCaNDaTlaGZaGZaTgaGZaThaTiaBDaTjaTkaTpaQqaQqaTmaTnaEjaBDaToaNRaPaaNRaROaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaymaxbaTqaRTaTraTsaTtaTuaTtaTvaTraTtaRTaQEaQEaTwaTxaOeaTyaPmaTzaTAaTBaTCaTDaTfaPmaPmaPmaPvaOiaOiaOiaOiaOlaPzaOnaOnaOnaOnaOnaOsaTEaQOaQOaQOaQOaQRaHYaHYaHZaIaaIaaTFaTGaTHaOtaTIaTJaTKaTLaTMaTLaTNaTOaTPaTQaTRaTSaTTaTRaTUaTVaTWaOtaTXaTGaTYaTZaIaaHXaHYaHYaRdaNlaUbaVPaSJaSKaNlaOCaJsaOGaVTaOCaOCaOCaOCaUdaUeaUfaUgaUhaUiaUjaUkaUlaIpaUmaUnaUoaQhaUpaQhaUqaUraGWaUsaEfaEfaEfaNCaNDaUtaUuaGZaUvaUwaJKaUxaBDaEjaUyaRIaQqaQqaRJaRKaUAaBDaUBaNRaPaaUCaUDaUEaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUFavMavMaBGaUGaUHaUIaUJaUKaULaUMaUNaTraTtaRTaUOaUPaUQaOcaOeaURaUSaUTaUUaUTaUVaUWaUVaUVaUVaUXaUYaOeaUZaVaaVbaVcaVdaVeaVfaVgaOcaVhaOsaViaVjaVkaVlaVlaQRaHYaHYaHYaHYaHYaVmaVnaVoaVpaVqaVraVsaVtaVuaVvaVwaVxaVyaVzaVAaVBaVCaVDaVsaVEaVFaVGaVHaVIaVJaVKaVLaVMaHYaHYaIkaUcaOCaXsaXsaRiaXsaOCaJsaOGaVTaVNaVTaVUaVVaIpaUeaUeaUeaVWaUeaUeaUkaVXaIpaNwaUnaQhaQhaUpaQhaVYaNwaGWaVZaWaaWbaWcaWdaWeaWfaWfaWfaWfaWfaWfaWgaWhaWiaWiaWiaWiaWiaWjaWkaWlaWhaWmaWnaWoaWpaNRaWqaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWraWsatBaWsaxaaxaaRTaWtaWuaWvaWvaWvaWwaWxaWyaRTaWzaQEaUQaWAaWAaWAaWBaWCaWAaWDaWEaWFaWGaWHaWHaWIaWJaOeaWKaWLaWMaWNaWOaWPaWPaWQaWRaWRaWSaWSaWSaWSaWSaWTaOsaHYaHYaWUaWVaWWaWXaWYaWZaOtaXaaXbaXcaXdaXeaXfaXfaXgaXhaXiaXjaXkaXlaXmaXcaXnaXaaOtaWZaWYaXoaXpaWVaXqaHYaHYaRdaOCaVOaRgaRgaRgaRgaRgaVQaODaPUaVRaPUaOCaOCaXtaXuaXvaUeaUeaUeaUeaXwaXxaIpaXyaXzaQhaXAaXBaXCaXzaXDaGWaXEaXFaXFaXGaXHaXIaXJaXKaXLaXJaXJaXJaXMaXNaXOaXPaXPaXPaXPaXPaXQaXRaXNaXSaXTaXUaXVaNRaXWaLDaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMavMavMaBGaxaaXXaTraXYaWvaWvaWvaXZaYaaTraRTaYbaYcaUQaWAaYdaYeaYfaYgaWAaYhaYiaYjaOeaYkaYlaYmaRZaOeaYnaYoaYpaYpaYpaYpaYqaYpaYpaYraYsaYsaYsaYtaYsaYuaYvaKAaKAaYwaYxaYxaYxaYxaYxaYxaYyaYzaYAaYBaXgaYCaYDaYDaYEaYFaYDaYCaXiaYGaYHaYIaYJaYHaYHaYHaYHaYHaYHaYKaKAaKAaIkaYLaYMaYNaYOaOCaOCaOCaYPaYQaYRaOCaYSaYTaYUaIpaIpaIpaYVaYWaYWaYWaIpaIpaIpaYXaQhaQhaYYaYZaZaaZbaYYaGWaZcaXFaZdaEfaZeaUzaZgaZfaZiaZjaTgaUuaZkaBDaZlaEjaZmaQqaQqaZmaEjaZnaBDaZoaZpaZqaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaZraNZaZsaRTaTtaZtaTtaTraZuaZvaZwaTtaRTaZxaZyaZzaWAaWAaWAaZAaZBaWAaZCaYiaZEaOeaYkaYlaYmaRZaOeaYnaYoaYpaZFaZGaZGaZGaZHaYpaZIaZJaZKaZLaYvaYvaYvaYvaHYaHYaZMaZNaZOaZPaZQaZRaZSaZTaZUaZVaZWaZXaYDaYDaZYaZZaZYaYDaYDbaababbacbadbaebafbagbahbaibajaYHaXqaHYaHYaIkaIkaIkaIkaIkbakaRdbakbalaIkaIkaIkaIkaIkaIkaIkbaobaobaobaobaobaobapbaoaGWaYYbaqbaqaYYbaraXFaXFaXFbanaZcaXFaZdaEfaEfaEfbasbatbasaEfbasaEfaEfaBDaBDbaubaubaubaubaubauaBDaBDbavaNRbawaROaNRaNRaRQaPdaPdaRQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaqpaqpavMavMavMavMavMavMavMavMaqpaqparpaQyaxaaRTaRTaRUaRTaRTaRTaRVaRTaRTaRTbaxbaybazaWAaYdbaBaZAbaCaWAbaDbaEbaDaOeaYkaYlaYmaRZaOeaYnaYoaYpaZGbaFbaFaZGbaFaYpaZIbaGbaHbaHbaIbaJbaKaYvbaLaHYaWUbXubaNbaObaPbaQbaQbaRbaSbaTaZWbaUaYDaYDaZYbaVaZYaYDaYDbaWbabbaXbaYbaZbbabbbbbcbajbbdaYHaXqbbecrtaGybbfaXFaXFaXFaXFaXFaXFaXFaXFbbgaXFaXFaXFaXFbbhaXFaXFaXFaXFaXFaXFaXFaXFbbfaXFaXFaXFaXFbaraXFaXFaXFbbibbjaXFaXFbbkaXFaXFaXFbblaXFaXFaXFaXFaXFbbhbbmaXFaXFaXFaXFaXFaXFbbfbbnaRNaNRbbobbpbbqbbraLDaLDaLDaQuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6592,8 +6590,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafavMawZaxaawZaxbaxaaxaaxcawZaxaawZaxbaxabcqaHqbcrbcsbctbcrbcrbcrbcubcvaOcaOcaOcbcwaUQaWAaYdbcxbcybczaWAbcAbcBbcAaOeaOeaOebcCbcDaOcaYnaYoaYpbcEaZGbaFbcFbcGaYpaZIaYvbcHbaHbaHbcIbcJbcKbcLaHYaWUbXvbcMbaObbNbcNbcObcPbaSbaOaZWbcQbcRaYDbcSbcTbcUaYDbcVbaAbabbcXbcYbcZbdabdabdbbajbdcaYHbddbdecuAaGybbfaXFaXFbdfaXFbdgbdhbdhbdhbdibdhbdhbdhbdjaXFaXFaXFaXFaXFaXFbdkbdlbdmbbfaXFaXFaXFaXFbarbdnbdobdpbdqbdraXFaXFaXFaXFaXFbdsbdtaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFaXFbbfbdubdvbdwbdxaROaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMbdyavMaBGaxaaxaaMBavMbdAavMayqbdBbdCbdCbdDbdEbdFbdGbdHbdIbdJbdKbdLbdMbdMbdNbdOaWAaWAaWAbdPbdQaWAaOcaOcaOcaOcbdRaVbbdSbdTaVbbdUaYoaYpbdVaZGaZGbdWbdXaYpbdYaYvbdZbaHbaHbeabebbecbedaHYaWUaYxbaObeebaPbaPbefbaRbaSbegbcWaXfbeibejbekbekbekbelbemaXkbdzbeobepbeqberbajbesbajbetaYHaXqaHYaHYbeubeubeubeubeubeubeubevbewbewbexbeybeybevbezbezbezbezbezbeAbeAbeBbeCbeAbeAbeAbeAbeDaXFbeEbeFbeGbeHbeIaXFaXFaXFbeJbeJbeKbeKbeKbeKbeKbeLbeMbeMbeMbeNbeMbeObePbeMbeMbeQbeRbeRbeRbeRbeSbeTbeUbeVaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaztaqpazuatBavMaymaynbeWbeXavMatBazuavMaqpaztarpbdDbeYbeZbeZbeZbfabdJbfbbfcbfdbfdbfebffaWAaYdbfgbdPbfhaWAbfibfiaQEaQEbfjbfkbflbfmbflbflbfnaYpbfobfpaZGaZGbdXbfqbfraYvbfsbaHbaHbeabftbfubedaHYbfvaYxbfwaYAbfxbfybfzbfAbaSbfBaYxaafbfCbfDbfDbfDbfEbfFbfGaafaYHbfHbfIbfJbfKbajbfLbajbfMaYHaXqaHYbfNbeubfObotbfQbfRbfSbeubehbfVbfVbfWbfXbfXbfXbfYbfZbgabgbbezbgcbgdbgebgdbgdbgfbggbeAbeGbghbeGbeGbeGbgibeIbeIbgjbeIbgkbgkbeKbglbgmbgnbeKbgobgpbgobeKbgqbgrbgqbeRbgsbgtbgsbeRbgubgvbeRbgwbgxaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafavMbdyavMavMavMavMavMavMbdAavMaafaafaafaaabdDbgybdDbgzbeZbgAbgBbcraVbbgCbgDbgEbgFbgGbgGbgGbgGbgGbgGbgHbgIbgJbfdbgKbgLaYpaYpaYpaYpaYpaYpbgMaYpaYpaYpbgNbgObgPbgQbgRbaHbaHbeabgSbecbedaHYbgTaYxbgUaYAaYAaYAaYAbfAbaSbgVaYxaafbfCbfDbgWbgXbgYbfDbgZaafaYHbhabbYbhbbhcbajbesbajbajaYHaXqaHYaHYbeubqqbhebhfbhgbhhbhibfXbhjbfXbhkbfXbfXbhlbfYbhmbhnbhobezbhpbgdbhqbgdbhpbhrbgdbeAbhsbhsbhubhvbeGbhwbeIbhxbhybhzbhAbhAbeKbhBbhCbhDbhEbhFbhGbhHbeKbhIbhJbhKbeRbhLbhMbhLbhNbhObhObeRbhPbgxaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacuzaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbhQbhRbhSbhTbhTbhUbhVaWPbhWaOcbhXbhYbhZbhZbhZbiabiabiabiabiabiabiabibbgNbicbidbiebifbigbihbiibijaYpbikbilbimbinbinbiobaHbaHbeabaHaYvbedaHYaWUbipbiqbirbisbitaYAbiubaSaYxaYxaafbfCbfDbgXbfDbgXbfDbgZaafaYHaYHbivbcZbiwbajbixbiybizaYHaXqaHYbiAbiBbiCbiDbqrbiFbrWbiHbfXbiIbiJbiKbiLbiLbiMbfYbiNbhnbiObezbhpbgdbhqbiPbhpbiQbiRbeAbiSbiTbiUbiVbeGbgibeIbiWbiXbiXbiYbiZbjabjbbjcbjcbjcbjdbjebjfbeKbjgbhJbjhbeRbjibjjbjkbjlbjmbjnbeRbhPbgxbjobjobjobjoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafavMbdyavMavMavMavMavMavMbdAavMaafaafaafaaabdDbgybdDbgzbeZbgAbgBbcraVbbgCbgDbgEbgFbgGbgGbgGbgGbgGbgGbgHbgIbgJbfdbgKbgLaYpaYpaYpaYpaYpaYpbgMaYpaYpaYpbgNbgObgPbgQbgRbaHbaHbeabgSbecbedaHYbgTaYxbgUaYAaYAaYAaYAbfAbaSbgVaYxaafbfCbfDbgWbgXbgYbfDbgZaafaYHbhabbYbhbbhcbajbesbajbajaYHaXqaHYaHYbeubqqbhebhfbhgbhhbhibfXbhjbfXbhkbfXbfXbhlbfYbhmbhnbhobezbhpbgdbhqbgdbhpbhrbgdbeAbhsbhsbhubhvbeGbhwbeIbhxbhybhzbhAbhAbeKbhBbhCbhDbhEbhFbhGbhHbeKbhIbhJaVSbeRbhLbhMbhLbhNbhObhObeRbhPbgxaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacuzaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbhQbhRbhSbhTbhTbhUbhVaWPbhWaOcbhXbhYbhZbhZbhZbiabiabiabiabiabiabiabibbgNbicbidbiebifbigbihbiibijaYpbikbilbimbinbinbiobaHbaHbeabaHaYvbedaHYaWUbipbiqbirbisbitaYAbiubaSaYxaYxaafbfCbfDbgXbfDbgXbfDbgZaafaYHaYHbivbcZbiwbajbixbiybizaYHaXqaHYbiAbiBbiCbiDbqrbiFbrWbiHbfXbiIbiJbiKbiLbiLbiMbfYbiNbhnbiObezbhpbgdbhqbiPbhpbiQbiRbeAbiSbiTbiUbiVbeGbgibeIbiWbiXbiXbiYbiZbjabjbbjcbjcbjcbjdbjebjfbeKbjgbhJaXrbeRbjibjjbjkbjlbjmbjnbeRbhPbgxbjobjobjobjoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbjpbdDbjqbjrbjrbjsbdDbjtbjtaOcbjubjvbjubjubjubjvbjuaOcaOcaYpaYpaYpbjwbgNbjxbjxbjybjxbjxbjxbiibjxbjzbjAbjBbjCbjDbjEbjEbjEbjEbjFbjGbjHbjIbjJbjKbjLbjMbjNbjObjPaYAbfAbaSaYxaafaafbfCbfDbgYbjQbgWbjRbgZaafaafaYHbjSbjTaYHaYHaYHaYHbjUaYHbjVaHYaHYbeubjWbhebjXbhgbhhbjYbfXbjZbkabkbbkcbtmbkebezbkfbkgbkhbezbhpbgdbkibkjbhpbkkbgdbeAbeGbeGbeGbeGbeGbgibeIbklbkmbknbkobkpbkqbkrbksbktbktbkubkvbkwbeKbkxbhJbkybeRbkzbkAbkBbkCbkDbkEbeRbhPbkFbkGbkHbkIbkHaaaaaaaafaaaaafaaaaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbkJbhRbkKbjrbkLbkMbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbkObkPbkQbkRbkSbkSbkTbkSbkSbkSbkUbkSbkVbkWbkXbkYbkZbecbecbecblaaYvblbaYvblcbldaKAbipbleblfblfblfblfblgblhbliaafaaabljblkbllbfDbfDblmbgZaaaaafblnbloblpblqblrblsblnbltblnbluaHYaHYbeublvbhectCblwblxbeublybjZbkablzblAbfXblBbezblCblDblEbezblFblGblHblIblJblKblLblMblNblOblNblNblNblPbeIblQbhyblRblSblTbkqblUblVblWblWblXblYblZbeKbmabgrbmbbeRbmcbmdbmebkCbhObmfbeRbhPbmgbmhbmibmibmibmibmibmibmjaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbmkbhRbhRbhRbdDbdDbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbmlbjxbmmbmnbmobmnbmnbmnbmnbmnbmpbmnbmqbmrbmsbmtbmubmvbecbmwbaHbmxbmybmzbedbmAbmBbipbipblibmCbmDbmEbmFbmGbliaaaaaabfCbmHbmIbmJbmIbmKbgZaaaaaablnbmLbmMbmNblnbmOblnbltblnbluaHYaHYbeubmPbhebjXbmQbmRbeubmSbmTbmUbmVbmWbfXbmXbezbfYbmYbmZbezbeAbnabeAbeBbnbbncbncbncbncbncbncbncbncbgibeIbndbkmbknbnebnfbngbnhbnibnibniblXbkvbnjbnkbnlbnmbnnbnobnpbnqbnpbnrbhObnsbeRbntbnubnubnubnubnubnubnubnvbgxbjobjobjoaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6625,7 +6623,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabStbSubSubSubSubSvbSwbSwbSxbSybSzbSAbSBbSCbSDbSEbBcbGnbGnbGnbGnbGnbGnbGnbSFbSGbSHbSIbSJbSKbSKbSKbSKbSLbSMbSMbSMbSNcqubSObDybDybSPbBccqnbMqbOAbSQbSRbSSbSTbRQbRQbSUbSVbRQbRQbSWbSXbSYbMFbSZbTabTbbTcbMFbTdbTebTfbOUaafbOVbTgbThbTibMKbMLbNPbTjbTkbTkbTkbTlbLFbTmbQZbTnbTobTpbTqbTrbTsbTsbTtbLFbKvbBMbItbItbItbItbTubTvbRjbTwbTubItbItbItbItbItbTxbTybTzbTAbTBbTCbTCbTCbTCbTDbOmbSqbSqbTEbPvbTFbSsbGVbjobjobjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaaaaafaaaaaabJYbJYbJYbGnbTHbTIbTJbTKbTLbBcbTMbJYbJYbJYbJYbJYbJYbJYbJYbDCbTNbTObTObTObTObTObTObTObTObTPbTPcqxbTPbTPbTQbTRbBccqnbMqbOAbSQbTSbTTbTUbTVbPSbTWbTXbPSbPSbTYbTZbUabUbbUcbUdbUebUfbMFbTdbUgbUhbQabQbbNLbUibRYbRYbMKbMLbNPbUjbyebyebyebNYbLFbUkbMUbMUbUlbUmbUnbUobUpbUobUnbLFbKvbBMbQjbQkbQkbUqbQmbKKbQnbQobUrbUsbCWbCWbCWbItbUtbUubUvbUwbRnbRpbUxbUybUzbUAbOpbSqbSqbSqbPvbTFbSsbGVbsebsebjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaagaagaagaagbUDbGnbUDbGnbUEbTIbTIbUFbGnbBcbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbUHbUIbUJbUKbULbUGbUMbUNcqCcqybTPbTPbTRbBccqDbMqbOAbURbUSbUTbUTbUUbKmbKmbKmbKmbKmbUVbUWbLnbLnbLnbUXbMFbTbbMFbTdbTebUYbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebUZbzibNYbMMbVabVbbVcbVdbVebVfbVgbUpbVgbVhbLFbKvbBMbCWbVibCWbVjbRibKKbRjbKKbRkbVkbCWbVibCWbItbVlbVmbVnbVobVpbVqbVrbVsbVtbVubOmbVvbVwbVxbPvbSqbSsbHzbjobsebjobjobjoaagaagaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJYbJYbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbzibNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbGVbjobWwbjobWxbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJYbJYbJYbVzbVAbVBbVCbVDbGnbVEbGnbJYaaaaaaaafaaaaaaaafaaabDCbTNbTObUGbVFbVGbVHbVIbVJbUGbVKbVLcqEbVNbVObTPbTRbBccqnbMqbOAbVPbVQbKmbVRbVSbKmbVTbVUbVVbKmbVWbQRbVXbLnbVYbUfbMFbUdbVZbWabRVbWbbNKbLDbNLbWcbWdbWebMKbMLbyebUjbyebABbzibNYbLFbWfbWgbWhbWibUmbWgbWjbUpbWjbNVbNXbKvbBMbCWbCWbCWbWkbWlbQobSgbKKbShbWmbQkbQkbSjbBMbPvbWnbWobWobPvbPvbWpbWqbWrbWsbWtbWubTCbWvbSqbSqbSsbGVbjobWwbjobhKbjoaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbJYbWybWzbWzbWAbTLbWBbBcbJYbJYaaaaaaaaaaaaaaaaaaaaabDCbTNbTObWCbWDbWEbVHbWFbWCbWCbVKbWGcqGcqFbWIbTPbTRbBccqnbMqbWJbWKbWKbWLbWMbWNbWObWPbWQbWRbKmbMFbQRbWSbWTbVYbWUbMFbUdbVZbTdbTebWVbOUaafbOVbWWbWXbWYbMKbMLbyebUjbyebGHbGHbNYbLFbLGbWZbXabLGbXbbLGbLGbLGbLGbLGbLFbKvbBMbItbItbItbItbTubXcbRjbXdbTubItbItbItbItbBMbRrbXebRrbRrbRrbPvbWpbWqbXfbXgbXhbXibUwbXjbPvbSqbSsbGVbjobsebsebsebXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaafaafaafaafaafaafaafaafbBcbBcbBcbBcbBcbBcbVEbBcbBcbBcbBcaafaaaaaabXlaaaaaaaaaaaaaaabEZbTNbTObWCbWCbXmbXnbXobWCbXpbXqbXrcqIcqHbXsbTPbTRbBccqJbXwbCrbWKbXxbXybXybXzbXAbXBbXCbXDbKmbXEbXFbVXbLnbVYbXGbMFbXHbVZbTdbXIbXJbQabQbbNLbXKbWdbWdbMKbMLbNPbUjbyebXLbzibNYbXMbSabSabXNbLGbIHbIkbQBbyebXRbXSbKwbKvbBMbQjbQkbQkbXTbQmbKKbQnbQobXUbXVbCWbCWbCWbBMbXWbRrbRrbRrbRrbPvbXXbXXbXYbXZbOpbOpbUwbOpbPvbOpbSsbGVbjobYabYbbYcbXkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabqabfabfabfabfabfaaaaaabBcbGnbGnbGnbGnbGnbGnbGnbGnbWBbJYaafaaaaaaaafaaIbYdaaaaaaaaabEZbTNbTObYebYfbYgbYhbYibYjbYkbYlbYmcqMcqKbYobTPbYpbYqbYrbYsbGybWKbYtbXybYubYvbYwbYxbYybYzbYAbNFbYBbLnbLnbLnbYCbMFbYDbYEbTdbTebMFbOUaafbMKbMKbMKbMKbMKbMLbNPbUjbyebYFbzibYGbYHbTkbYIbYJbyebRybQCbTGbyebYNbKFbYObYPbBMbCWbCWbCWbYQbRibKKbRjbKKbRkbYRbCWbCWbCWbBMbYSbRrbYTbRrbRrbYUbYVbYWbYXbYYbOpbUwbUwbYZbPvbBRbZabUBbjobZcbZdbsebXkaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/generic/z3.dmm b/_maps/map_files/generic/z3.dmm
index 745e704fc30..0c66d36acf5 100644
--- a/_maps/map_files/generic/z3.dmm
+++ b/_maps/map_files/generic/z3.dmm
@@ -124,7 +124,7 @@
"cE" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/chamber)
"cF" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
"cG" = (/obj/item/weapon/paper/crumpled,/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
-"cH" = (/obj/item/weapon/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash,/turf/simulated/floor/engine,/area/tcommsat/chamber)
+"cH" = (/obj/item/weapon/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/stack/spacecash,/turf/simulated/floor/engine,/area/tcommsat/chamber)
"cI" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
"cJ" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
"cK" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel/airless,/area/tcommsat/chamber)
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 51f5c6b4442..37f6bbdd1ac 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -107,7 +107,7 @@ AngleToHue(hue)
Converts an angle to a hue in the valid range.
RotateHue(hsv, angle)
Takes an HSV or HSVA value and rotates the hue forward through red, green, and blue by an angle from 0 to 360.
- (Rotating red by 60° produces yellow.) The result is another HSV or HSVA color with the same saturation and value
+ (Rotating red by 60° produces yellow.) The result is another HSV or HSVA color with the same saturation and value
as the original, but a different hue.
GrayScale(rgb)
Takes an RGB or RGBA color and converts it to grayscale. Returns an RGB or RGBA string.
@@ -689,7 +689,9 @@ The _flatIcons list is a cache for generated icon files.
while(TRUE)
if(curIndex<=process.len)
current = process[curIndex]
- if(!current) continue
+ if(!current)
+ curIndex++ //Try the next layer
+ continue
currentLayer = current:layer
if(currentLayer<0) // Special case for FLY_LAYER
if(currentLayer <= -1000) return flat
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 515dfef3825..dba2b9a506b 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -560,3 +560,17 @@
runnable_modes[M] = probabilities[M.config_tag]
//world << "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]"
return runnable_modes
+
+datum/configuration/proc/get_runnable_midround_modes(crew)
+ var/list/datum/game_mode/runnable_modes = new
+ for(var/T in (typesof(/datum/game_mode) - /datum/game_mode))
+ var/datum/game_mode/M = new T()
+ if(!(M.config_tag in modes))
+ qdel(M)
+ continue
+ if(probabilities[M.config_tag]<=0)
+ qdel(M)
+ continue
+ if(M.required_players <= crew)
+ runnable_modes[M] = probabilities[M.config_tag]
+ return runnable_modes
diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm
index 436f1ba8e76..743435ec989 100644
--- a/code/controllers/subsystem/npcpool.dm
+++ b/code/controllers/subsystem/npcpool.dm
@@ -2,7 +2,7 @@ var/datum/subsystem/npcpool/SSbp
/datum/subsystem/npcpool
name = "NPCPool"
- priority = 27
+ priority = 100
var/list/canBeUsed = list()
var/list/canBeUsed_non = list()
@@ -76,9 +76,10 @@ var/datum/subsystem/npcpool/SSbp
var/facCount = 0
var/helpProb = 0
for(var/C in check.faction)
- if(candidate.faction[facCount] == C)
- helpProb = min(100,helpProb + 25)
- facCount++
+ for(var/D in candidate.faction)
+ if(D == C)
+ helpProb = min(100,helpProb + 25)
+ facCount++
if(facCount == 1 && helpProb > 0)
helpProb = 100
if(prob(helpProb))
@@ -94,9 +95,10 @@ var/datum/subsystem/npcpool/SSbp
var/facCount = 0
var/helpProb = 0
for(var/C in check.faction)
- if(candidate.faction[facCount] == C)
- helpProb = min(100,helpProb + 10)
- facCount++
+ for(var/D in candidate.faction)
+ if(D == C)
+ helpProb = min(100,helpProb + 25)
+ facCount++
if(facCount == 1 && helpProb > 0)
helpProb = 100
if(prob(helpProb))
diff --git a/code/controllers/subsystem/shuttles/supply.dm b/code/controllers/subsystem/shuttles/supply.dm
index 3fcc981725c..4322a504b2e 100644
--- a/code/controllers/subsystem/shuttles/supply.dm
+++ b/code/controllers/subsystem/shuttles/supply.dm
@@ -370,7 +370,7 @@
investigate_log("[usr.key] has sent the supply shuttle away. Remaining points: [SSshuttle.points]. Shuttle contents:[SSshuttle.sold_atoms]", "cargo")
else
if(href_list["loan"] && SSshuttle.shuttle_loan)
- if(!SSshuttle.shuttle_loan.dispatched)
+ if(!SSshuttle.shuttle_loan.dispatched && SSshuttle.supply.mode == SHUTTLE_IDLE) // Must either be at centcom, or at the station. No redirecting off course!
SSshuttle.shuttle_loan.loan_shuttle()
temp = "The supply shuttle has been loaned to Centcom.
Main Menu"
post_signal("supply")
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index be8c7879494..633d40e84cd 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -468,6 +468,15 @@ var/list/uplink_items = list()
item = /obj/item/weapon/storage/box/syndie_kit/space
cost = 5
+/datum/uplink_item/device_tools/hardsuit
+ name = "Blood-red Hardsuit"
+ desc = "The feared suit of a syndicate nuclear agent. Features slightly better armoring and a built in jetpack that runs off standard atmospheric tanks. \
+ When the built in helmet is deployed your identity will be protected, even in death, as the suit cannot be removed by outside forces. Toggling the suit into combat mode \
+ will allow you all the mobility of a loose fitting uniform without sacrificing armoring. Additionally the suit is collapsible, small enough to fit within a backpack. \
+ Nanotrasen crewmembers are trained to report red space suit sightings, these suits in particular are known to drive employees into a panic."
+ item = /obj/item/clothing/suit/space/hardsuit/syndi
+ cost = 8
+
/datum/uplink_item/device_tools/thermal
name = "Thermal Imaging Glasses"
desc = "These glasses are thermals disguised as engineers' optical meson scanners. \
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 625e81f7b17..b5d6712d4bd 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -30,50 +30,6 @@
var/mode = 1
w_class = 3.0
-/obj/item/weapon/spacecash
- name = "space cash"
- desc = "It's worth 1 credit."
- gender = PLURAL
- icon = 'icons/obj/economy.dmi'
- icon_state = "spacecash"
- opacity = 0
- density = 0
- anchored = 0.0
- force = 0
- throwforce = 0
- throw_speed = 2
- throw_range = 2
- w_class = 1.0
-
-/obj/item/weapon/spacecash/c10
- icon_state = "spacecash10"
- desc = "It's worth 10 credits."
-
-/obj/item/weapon/spacecash/c20
- icon_state = "spacecash20"
- desc = "It's worth 20 credits."
-
-/obj/item/weapon/spacecash/c50
- icon_state = "spacecash50"
- desc = "It's worth 50 credits."
-
-/obj/item/weapon/spacecash/c100
- icon_state = "spacecash100"
- desc = "It's worth 100 credits."
-
-/obj/item/weapon/spacecash/c200
- icon_state = "spacecash200"
- desc = "It's worth 200 credits."
-
-/obj/item/weapon/spacecash/c500
- icon_state = "spacecash500"
- desc = "It's worth 500 credits."
-
-/obj/item/weapon/spacecash/c1000
- icon_state = "spacecash1000"
- desc = "It's worth 1000 credits."
-
-
/obj/item/weapon/c_tube
name = "cardboard tube"
desc = "A tube... of cardboard."
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index 994f08d87cb..1ad2722026c 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -115,7 +115,7 @@ proc/make_mining_asteroid_secret()
floortypes = list(/turf/simulated/floor/plasteel,/turf/simulated/floor/wood)
treasureitems = list(/obj/item/weapon/melee/energy/sword/pirate=1,/obj/item/weapon/gun/projectile/revolver/doublebarrel=1,/obj/item/weapon/storage/backpack/satchel_flat=1,
/obj/machinery/reagentgrinder=2, /obj/machinery/computer/security/wooden_tv=4, /obj/machinery/vending/coffee=3)
- fluffitems = list(/obj/structure/table/wood=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/weapon/spacecash/c500=4,
+ fluffitems = list(/obj/structure/table/wood=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/stack/spacecash/c500=4,
/obj/item/weapon/reagent_containers/food/drinks/shaker=1,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine=3,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey=3,/obj/item/clothing/shoes/laceup=2)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 3cf497ed472..18b10d45ffa 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -278,7 +278,7 @@ var/list/blood_splatter_icons = list()
return "\ref[initial(icon)]-[initial(icon_state)]"
/atom/proc/add_blood_list(mob/living/carbon/M)
- // Returns 1 if we had blood already
+ // Returns 0 if we have that blood already
if(!istype(blood_DNA, /list)) //if our list of DNA doesn't exist yet (or isn't a list) initialise it.
blood_DNA = list()
//if this blood isn't already in the list, add it
@@ -299,15 +299,17 @@ var/list/blood_splatter_icons = list()
return 0
if(!check_dna_integrity(M)) //check dna is valid and create/setup if necessary
return 0 //no dna!
- return
+ return 1
/obj/add_blood(mob/living/carbon/M)
- if(..() == 0) return 0
+ if(..() == 0)
+ return 0
return add_blood_list(M)
/obj/item/add_blood(mob/living/carbon/M)
var/blood_count = blood_DNA == null ? 0 : blood_DNA.len
- if(..() == 0) return 0
+ if(..() == 0)
+ return 0
//apply the blood-splatter overlay if it isn't already in there
if(!blood_count && initial(icon) && initial(icon_state))
//try to find a pre-processed blood-splatter. otherwise, make a new one
@@ -323,13 +325,15 @@ var/list/blood_splatter_icons = list()
return 1 //we applied blood to the item
/obj/item/clothing/gloves/add_blood(mob/living/carbon/M)
- if(..() == 0) return 0
+ if(..() == 0)
+ return 0
transfer_blood = rand(2, 4)
bloody_hands_mob = M
return 1
/turf/simulated/add_blood(mob/living/carbon/human/M)
- if(..() == 0) return 0
+ if(..() == 0)
+ return 0
var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter
if(!B)
@@ -339,7 +343,8 @@ var/list/blood_splatter_icons = list()
return 1 //we bloodied the floor
/mob/living/carbon/human/add_blood(mob/living/carbon/M)
- if(..() == 0) return 0
+ if(..() == 0)
+ return 0
add_blood_list(M)
bloody_hands = rand(2, 4)
bloody_hands_mob = M
diff --git a/code/game/dna.dm b/code/game/dna.dm
index c86fa683896..21f94b0ce29 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -563,6 +563,8 @@
else
viable_occupant = null
occupant_status += "Invalid DNA structure"
+ if (viable_occupant && viable_occupant.stat == DEAD)
+ viable_occupant = null // No editing the dead.
else
occupant_status += "No subject detected"
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 26fe695a62f..b57568953fa 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -8,8 +8,9 @@
var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds
var/resource_delay = 0
var/point_rate = 2
+ var/is_offspring = null
-/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2)
+/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring)
blob_cores += src
SSobj.processing |= src
adjustcolors(color) //so it atleast appears
@@ -17,6 +18,8 @@
create_overmind(new_overmind)
if(overmind)
adjustcolors(overmind.blob_reagent_datum.color)
+ if(offspring)
+ is_offspring = 1
point_rate = new_rate
..(loc, h)
@@ -34,7 +37,7 @@
/obj/effect/blob/core/Destroy()
blob_cores -= src
if(overmind)
- qdel(overmind)
+ overmind.blob_core = null
SSobj.processing.Remove(src)
..()
@@ -102,6 +105,9 @@
B.blob_core = src
src.overmind = B
color = overmind.blob_reagent_datum.color
+ spawn(0)
+ if(is_offspring)
+ B.verbs -= /mob/camera/blob/verb/split_consciousness
return 1
return 0
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 2b354f6c801..2ca962f00df 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -36,12 +36,18 @@
updateallghostimages()
..()
+/mob/camera/blob/Life()
+ if(!blob_core)
+ qdel(src)
+ ..()
+
/mob/camera/blob/Destroy()
if (ghostimage)
ghost_darkness_images -= ghostimage
qdel(ghostimage)
ghostimage = null;
updateallghostimages()
+ ..()
/mob/camera/blob/Login()
..()
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index 94c650a7ee9..43c17da6211 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -312,39 +312,25 @@
set name = "Split consciousness (100) (One use)"
set desc = "Expend resources to attempt to produce another sentient overmind"
+ if(!blob_nodes || !blob_nodes.len)
+ src << "A node is required to birth your offspring..."
+ return
+ var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes
+ if(!N)
+ src << "A node is required to birth your offspring..."
+ return
- var/client/C = null
- var/list/candidates = get_candidates(BE_BLOB)
- if(candidates.len)
- C = pick(candidates)
+ if(!can_buy(100))
+ return
- if(C)
- if(!blob_nodes || !blob_nodes.len)
- src << "A node is required to birth your offspring..."
- return
- var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes
- if(!N)
- src << "A node is required to birth your offspring..."
- return
+ verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness
+ new /obj/effect/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring")
+ qdel(N)
- if(!can_buy(100))
- return
+ if(ticker && ticker.mode.name == "blob")
+ var/datum/game_mode/blob/BL = ticker.mode
+ BL.blobwincount = initial(BL.blobwincount) * 2
- verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness
- var/obj/effect/blob/core/new_core = new(get_turf(N), 200, C, blob_core.point_rate)
- qdel(N)
- var/mob/camera/blob/B = new(get_turf(new_core))
- B.verbs -= /mob/camera/blob/verb/split_consciousness // this was a bad idea to allow you were right remie
- B.key = C.key
- B.blob_core = new_core
- new_core.overmind = B
-
- if(ticker && ticker.mode.name == "blob")
- var/datum/game_mode/blob/BL = ticker.mode
- BL.blobwincount = initial(BL.blobwincount) * 2
-
- else
- src << "You weren't able to split your consciousness at this time..."
/mob/camera/blob/verb/blob_broadcast()
set category = "Blob"
diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm
index 409b655f5ba..4364718fa72 100644
--- a/code/game/gamemodes/extended/extended.dm
+++ b/code/game/gamemodes/extended/extended.dm
@@ -2,7 +2,7 @@
name = "extended"
config_tag = "extended"
required_players = 0
- reroll_friendly = 1
+ //reroll_friendly = 1
/datum/game_mode/announce()
world << "The current game mode is - Extended Role-Playing!"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 64f1d779b34..65296e76354 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -97,7 +97,16 @@
///convert_roundtype()
///Allows rounds to basically be "rerolled" should the initial premise fall through
/datum/game_mode/proc/convert_roundtype()
- var/list/datum/game_mode/runnable_modes = config.get_runnable_modes()
+ var/living_crew = 0
+
+ for(var/mob/Player in mob_list)
+ if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
+ living_crew++
+ if(living_crew / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
+ message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew")
+ return 0
+
+ var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew)
var/list/datum/game_mode/usable_modes = list()
for(var/datum/game_mode/G in runnable_modes)
if(G.reroll_friendly)
@@ -124,15 +133,6 @@
message_admins("Convert_roundtype failed due to round length. Limit is [config.midround_antag_time_check] minutes.")
return 0
- var/living_crew = 0
-
- for(var/mob/Player in mob_list)
- if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
- living_crew++
- if(living_crew / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
- message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew")
- return 0
-
var/list/antag_canadates = list()
for(var/mob/living/carbon/human/H in living_crew)
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index a19846888be..81ed244f086 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -243,7 +243,7 @@
src.text += "
"
/datum/intercept_text/proc/build_nuke(datum/mind/correct_person)
- src.text += "
Centcom recently recieved a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc "
+ src.text += "
Centcom recently received a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc "
src.text += "that is standard issue aboard your vessel may be a target. We recommend removal of this object, and it's storage in a safe "
src.text += "environment. As this may cause panic among the crew, all efforts should be made to keep this information a secret from all but "
src.text += "the most trusted crew-members."
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index bc4e20ba0fc..f9a33fb2308 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -5,7 +5,7 @@
name = "AI malfunction"
config_tag = "malfunction"
antag_flag = BE_MALF
- required_players = 20
+ required_players = 1
required_enemies = 1
recommended_enemies = 1
pre_setup_before_jobs = 1
@@ -99,6 +99,24 @@
return
/datum/game_mode/malfunction/process(seconds)
+ /*var/timer_paused
+
+ for(var/datum/mind/AI_mind in malf_ai)
+ if(timer_paused)
+ return
+ if(AI_mind.current.loc.z == ZLEVEL_STATION || AI_mind.current.onCentcom())
+ return
+ timer_paused = 1
+ priority_announce("Hostile runtimes within station systems now inactive. Possible relocation of AI core(s) off-station.", "Anomaly Alert", 'sound/AI/attention.ogg')
+
+ for(var/datum/mind/AI_mind in malf_ai) //Prototype of progress stopping when AI leaves the station; for now it's just a lose
+ if(!timer_paused)
+ return
+ if(AI_mind.current.loc != ZLEVEL_STATION)
+ return
+ timer_paused = 0
+ priority_announce("Hostile runtime activity resumed. AI core(s) presumably on-station once more.", "Anomaly Alert", 'sound/AI/attention.ogg')*/
+
if ((apcs > 0) && malf_mode_declared)
AI_win_timeleft -= apcs * seconds //Victory timer de-increments based on how many APCs are hacked
..()
@@ -143,12 +161,20 @@
return all_dead
+/datum/game_mode/proc/check_ai_loc()
+ for(var/datum/mind/AI_mind in malf_ai)
+ var/turf/ai_location = get_turf(AI_mind.current)
+ if(ai_location && (ai_location.z == ZLEVEL_STATION))
+ return 1
+ return 0
+
+
/datum/game_mode/malfunction/check_finished()
if(round_converted)
return ..()
if (station_captured && !to_nuke_or_not_to_nuke)
return 1
- if (is_malf_ai_dead())
+ if (is_malf_ai_dead() || !check_ai_loc())
if(config.continuous_round_malf)
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
@@ -227,18 +253,18 @@
if ( station_captured && station_was_nuked)
feedback_set_details("round_end_result","win - AI win - nuke")
- world << "AI Victory"
- world << "Everyone was killed by the self-destruct!"
+ world << "Major AI Victory"
+ world << "The self-destruction of [station_name()] killed everyone on board!"
else if ( station_captured && malf_dead && !station_was_nuked)
feedback_set_details("round_end_result","halfwin - AI killed, staff lost control")
world << "Neutral Victory"
- world << "The AI has been killed! The staff has lose control over the station."
+ world << "The AI has been killed! However, the staff have lost control of [station_name()]."
else if ( station_captured && !malf_dead && !station_was_nuked)
feedback_set_details("round_end_result","win - AI win - no explosion")
- world << "AI Victory"
- world << "The AI has chosen not to explode you all!"
+ world << "Major AI Victory"
+ world << "The AI has chosen not to detonate the station!"
else if (!station_captured && station_was_nuked)
feedback_set_details("round_end_result","halfwin - everyone killed by nuke")
@@ -247,13 +273,18 @@
else if (!station_captured && malf_dead && !station_was_nuked)
feedback_set_details("round_end_result","loss - staff win")
- world << "Human Victory"
+ world << "Major Human Victory"
world << "The AI has been destroyed! The staff is victorious."
+ else if(!station_captured && !malf_dead && !check_ai_loc())
+ feedback_set_details("round_end_result", "loss - malf ai left zlevel")
+ world << "Minor Human Victory"
+ world << "The malfunctioning AI has left the station's z-level and was disconnected from its systems! The crew are victorious."
+
else if (!station_captured && !malf_dead && !station_was_nuked && crew_evacuated)
feedback_set_details("round_end_result","halfwin - evacuated")
world << "Neutral Victory"
- world << "The Corporation has lost [station_name()]! All survived personnel will be fired!"
+ world << "Nanotrasen has lost control of [station_name()]! All surviving personnel will be fired."
else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated)
feedback_set_details("round_end_result","halfwin - interrupted")
@@ -265,7 +296,7 @@
/datum/game_mode/proc/auto_declare_completion_malfunction()
if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) )
- var/text = "
The malfunctioning AI were:"
+ var/text = "
The malfunctioning AIs were:"
for(var/datum/mind/malf in malf_ai)
diff --git a/code/game/machinery/computer/telecrystalconsoles.dm b/code/game/machinery/computer/telecrystalconsoles.dm
index 2d78380fc63..79032b6f001 100644
--- a/code/game/machinery/computer/telecrystalconsoles.dm
+++ b/code/game/machinery/computer/telecrystalconsoles.dm
@@ -10,7 +10,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
/////////////////////////////////////////////
/obj/machinery/computer/telecrystals/uplinker
- name = "\improper Telecrystal upload/recieve station"
+ name = "\improper Telecrystal upload/receive station"
desc = "A device used to manage telecrystals during group operations. To use, simply insert your uplink. With your uplink installed \
you can upload your telecrystals to the group's pool using the console, or be assigned additional telecrystals by your lieutenant."
icon_state = "tcstation"
@@ -75,7 +75,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
uplinkholder.hidden_uplink.uses += amt
linkedboss.storedcrystals -= amt
if(addLog)
- linkedboss.logTransfer("[src] recieved [amt] telecrystals from [linkedboss].")
+ linkedboss.logTransfer("[src] received [amt] telecrystals from [linkedboss].")
///////
@@ -98,7 +98,7 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
dat += "
Eject Uplink"
- var/datum/browser/popup = new(user, "computer", "Telecrystal Upload/Recieve Station", 700, 500)
+ var/datum/browser/popup = new(user, "computer", "Telecrystal Upload/Receive Station", 700, 500)
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index be55d92a750..b56321f9588 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -145,6 +145,8 @@
update_icon()
/obj/machinery/iv_drip/attack_hand(mob/user)
+ if (!ishuman(user))
+ return
if(attached)
visible_message("[attached] is detached from \the [src]")
attached = null
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 61fb96edcb0..900edaf63ea 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -298,9 +298,7 @@
else
//if the turret was attacked with the intention of harming it:
user.changeNext_move(CLICK_CD_MELEE)
- health -= I.force * 0.5
- if(health <= 0)
- die()
+ take_damage(I.force * 0.5)
if(I.force * 0.5 > 1) //if the force of impact dealt at least 1 damage, the turret gets pissed off
if(!attacked && !emagged)
attacked = 1
@@ -309,6 +307,32 @@
attacked = 0
..()
+/obj/machinery/porta_turret/attack_animal(mob/living/simple_animal/M as mob)
+ M.changeNext_move(CLICK_CD_MELEE)
+ M.do_attack_animation(src)
+ if(M.melee_damage_upper == 0)
+ return
+ if(!(stat & BROKEN))
+ visible_message("[M] [M.attacktext] [src]!")
+ add_logs(M, src, "attacked", admin=0)
+ take_damage(M.melee_damage_upper)
+ else
+ M << "That object is useless to you."
+ return
+
+/obj/machinery/porta_turret/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
+ M.changeNext_move(CLICK_CD_MELEE)
+ M.do_attack_animation(src)
+ if(!(stat & BROKEN))
+ playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
+ visible_message("[M] has slashed at [src]!")
+ add_logs(M, src, "attacked", admin=0)
+ take_damage(15)
+ else
+ M << "\green That object is useless to you."
+ return
+
+
/obj/machinery/porta_turret/emag_act(user as mob)
if(!emagged)
user << "You short out [src]'s threat assessment circuits."
@@ -328,15 +352,16 @@
sleep(60)
attacked = 0
+ var/damage_dealt = 0
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
- health -= Proj.damage
+ damage_dealt = Proj.damage
..()
- if(prob(45) && Proj.damage > 0)
- spark_system.start()
- if(health <= 0)
- die() //the death process :(
+ if(damage_dealt)
+ if(prob(45))
+ spark_system.start()
+ take_damage(damage_dealt)
if(lasercolor == "b" && disabled == 0)
if(istype(Proj, /obj/item/projectile/lasertag/redtag))
@@ -372,8 +397,14 @@
/obj/machinery/porta_turret/ex_act(severity, target)
if(severity >= 3) //turret dies if an explosion touches it!
- qdel(src)
+ die()
else
+ qdel(src)
+
+
+/obj/machinery/porta_turret/proc/take_damage(damage)
+ health -= damage
+ if(health <= 0)
die()
/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 79eb6283a86..1d1e828514d 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -157,7 +157,14 @@
F.broken = 0
F.times_used = 0
F.icon_state = "flash"
- // Engineering
+ // Mining
+ if(istype(O, /obj/item/weapon/pickaxe/drill/cyborg))
+ var/obj/item/weapon/pickaxe/drill/cyborg/D = O
+ if(D.bcell.charge < D.bcell.maxcharge)
+ D.bcell.charge = min(D.bcell.charge + recharge_speed, D.bcell.maxcharge)
+ D.update_icon()
+ if(D.warned)
+ D.warned = 0
// Security
if(istype(O,/obj/item/weapon/gun/energy/gun/advtaser/cyborg))
var/obj/item/weapon/gun/energy/gun/advtaser/cyborg/T = O
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 7ee61a9d6ec..e7b20468d4d 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -1168,94 +1168,99 @@
result = "/obj/mecha/combat/phazon"
steps = list(
//1
+ list("key"=/obj/item/device/assembly/signaler/anomaly,
+ "backkey"=null, //Cannot remove the anomaly core once it's in
+ "desc"="Anomaly core socket is open and awaiting connection."),
+
+ //2
list("key"=/obj/item/weapon/weldingtool,
"backkey"=/obj/item/weapon/wrench,
"desc"="External armor is wrenched."),
- //2
+ //3
list("key"=/obj/item/weapon/wrench,
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is installed."),
- //3
+ //4
list("key"=/obj/item/mecha_parts/part/phazon_armor,
"backkey"=/obj/item/weapon/weldingtool,
"desc"="Phase armor is welded."),
- //4
+ //5
list("key"=/obj/item/weapon/weldingtool,
"backkey"=/obj/item/weapon/wrench,
"desc"="Phase armor is wrenched."),
- //5
+ //6
list("key"=/obj/item/weapon/wrench,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Phase armor is installed."),
- //6
+ //7
list("key"=/obj/item/stack/sheet/plasteel,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The bluespace crystal is engaged."),
- //7
+ //8
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/wirecutters,
"desc"="The bluespace crystal is connected."),
- //8
+ //9
list("key"=/obj/item/stack/cable_coil,
"backkey"=/obj/item/weapon/crowbar,
"desc"="The bluespace crystal is installed."),
- //9
+ //10
list("key"=/obj/item/bluespace_crystal,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Super capacitor is secured."),
- //10
- list("key"=/obj/item/weapon/screwdriver,
- "backkey"=/obj/item/weapon/crowbar,
- "desc"="Super capacitor is installed."),
- //11
- list("key"=/obj/item/weapon/stock_parts/capacitor/super,
- "backkey"=/obj/item/weapon/screwdriver,
- "desc"="Phasic scanner module is secured."),
//12
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
- "desc"="Phasic scanner module is installed."),
+ "desc"="Super capacitor is installed."),
+ //12
+ list("key"=/obj/item/weapon/stock_parts/capacitor/super,
+ "backkey"=/obj/item/weapon/screwdriver,
+ "desc"="Phasic scanner module is secured."),
//13
+ list("key"=/obj/item/weapon/screwdriver,
+ "backkey"=/obj/item/weapon/crowbar,
+ "desc"="Phasic scanner module is installed."),
+ //14
list("key"=/obj/item/weapon/stock_parts/scanning_module/phasic,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Weapon control module is secured."),
- //14
+ //15
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Weapon control is installed."),
- //15
+ //16
list("key"=/obj/item/weapon/circuitboard/mecha/phazon/targeting,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Peripherals control module is secured."),
- //16
+ //17
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Peripherals control module is installed"),
- //17
+ //18
list("key"=/obj/item/weapon/circuitboard/mecha/phazon/peripherals,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Central control module is secured."),
- //18
+ //19
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/crowbar,
"desc"="Central control module is installed."),
- //19
+ //20
list("key"=/obj/item/weapon/circuitboard/mecha/phazon/main,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is adjusted."),
- //20
+ //21
list("key"=/obj/item/weapon/wirecutters,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The wiring is added."),
- //21
+ //22
list("key"=/obj/item/stack/cable_coil,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="The hydraulic systems are active."),
- //22
+ //23
list("key"=/obj/item/weapon/screwdriver,
"backkey"=/obj/item/weapon/wrench,
"desc"="The hydraulic systems are connected."),
- //23
+ //24
list("key"=/obj/item/weapon/wrench,
"desc"="The hydraulic systems are disconnected.")
)
@@ -1270,24 +1275,24 @@
//TODO: better messages.
switch(index)
- if(23)
+ if(24)
user.visible_message("[user] connects the [holder] hydraulic systems", "You connect the [holder] hydraulic systems.")
holder.icon_state = "phazon1"
- if(22)
+ if(23)
if(diff==FORWARD)
user.visible_message("[user] activates the [holder] hydraulic systems.", "You activate the [holder] hydraulic systems.")
holder.icon_state = "phazon2"
else
user.visible_message("[user] disconnects the [holder] hydraulic systems", "You disconnect the [holder] hydraulic systems.")
holder.icon_state = "phazon0"
- if(21)
+ if(22)
if(diff==FORWARD)
user.visible_message("[user] adds the wiring to the [holder].", "You add the wiring to the [holder].")
holder.icon_state = "phazon3"
else
user.visible_message("[user] deactivates the [holder] hydraulic systems.", "You deactivate the [holder] hydraulic systems.")
holder.icon_state = "phazon1"
- if(20)
+ if(21)
if(diff==FORWARD)
user.visible_message("[user] adjusts the wiring of the [holder].", "You adjust the wiring of the [holder].")
holder.icon_state = "phazon4"
@@ -1296,7 +1301,7 @@
var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(get_turf(holder))
coil.amount = 4
holder.icon_state = "phazon2"
- if(19)
+ if(20)
if(diff==FORWARD)
user.visible_message("[user] installs the central control module into the [holder].", "You install the central computer mainboard into the [holder].")
qdel(used_atom)
@@ -1304,7 +1309,7 @@
else
user.visible_message("[user] disconnects the wiring of the [holder].", "You disconnect the wiring of the [holder].")
holder.icon_state = "phazon3"
- if(18)
+ if(19)
if(diff==FORWARD)
user.visible_message("[user] secures the mainboard.", "You secure the mainboard.")
holder.icon_state = "phazon6"
@@ -1312,7 +1317,7 @@
user.visible_message("[user] removes the central control module from the [holder].", "You remove the central computer mainboard from the [holder].")
new /obj/item/weapon/circuitboard/mecha/phazon/main(get_turf(holder))
holder.icon_state = "phazon4"
- if(17)
+ if(18)
if(diff==FORWARD)
user.visible_message("[user] installs the peripherals control module into the [holder].", "You install the peripherals control module into the [holder].")
qdel(used_atom)
@@ -1320,7 +1325,7 @@
else
user.visible_message("[user] unfastens the mainboard.", "You unfasten the mainboard.")
holder.icon_state = "phazon5"
- if(16)
+ if(17)
if(diff==FORWARD)
user.visible_message("[user] secures the peripherals control module.", "You secure the peripherals control module.")
holder.icon_state = "phazon8"
@@ -1328,7 +1333,7 @@
user.visible_message("[user] removes the peripherals control module from the [holder].", "You remove the peripherals control module from the [holder].")
new /obj/item/weapon/circuitboard/mecha/phazon/peripherals(get_turf(holder))
holder.icon_state = "phazon6"
- if(15)
+ if(16)
if(diff==FORWARD)
user.visible_message("[user] installs the weapon control module into the [holder].", "You install the weapon control module into the [holder].")
qdel(used_atom)
@@ -1336,7 +1341,7 @@
else
user.visible_message("[user] unfastens the peripherals control module.", "You unfasten the peripherals control module.")
holder.icon_state = "phazon7"
- if(14)
+ if(15)
if(diff==FORWARD)
user.visible_message("[user] secures the weapon control module.", "You secure the weapon control module.")
holder.icon_state = "phazon10"
@@ -1344,7 +1349,7 @@
user.visible_message("[user] removes the weapon control module from the [holder].", "You remove the weapon control module from the [holder].")
new /obj/item/weapon/circuitboard/mecha/phazon/targeting(get_turf(holder))
holder.icon_state = "phazon8"
- if(13)
+ if(14)
if(diff==FORWARD)
user.visible_message("[user] installs phasic scanner module to the [holder].", "You install phasic scanner module to the [holder].")
qdel(used_atom)
@@ -1352,7 +1357,7 @@
else
user.visible_message("[user] unfastens the weapon control module.", "You unfasten the weapon control module.")
holder.icon_state = "phazon9"
- if(12)
+ if(13)
if(diff==FORWARD)
user.visible_message("[user] secures the phasic scanner module.", "You secure the phasic scanner module.")
holder.icon_state = "phazon12"
@@ -1360,7 +1365,7 @@
user.visible_message("[user] removes the phasic scanner module from the [holder].", "You remove the phasic scanner module from the [holder].")
new /obj/item/weapon/stock_parts/scanning_module/phasic(get_turf(holder))
holder.icon_state = "phazon10"
- if(11)
+ if(12)
if(diff==FORWARD)
user.visible_message("[user] installs super capacitor to the [holder].", "You install super capacitor to the [holder].")
qdel(used_atom)
@@ -1368,7 +1373,7 @@
else
user.visible_message("[user] unfastens the phasic scanner module.", "You unfasten the phasic scanner module.")
holder.icon_state = "phazon11"
- if(10)
+ if(11)
if(diff==FORWARD)
user.visible_message("[user] secures the super capacitor.", "You secure the super capacitor.")
holder.icon_state = "phazon14"
@@ -1376,7 +1381,7 @@
user.visible_message("[user] removes the super capacitor from the [holder].", "You remove the super capacitor from the [holder].")
new /obj/item/weapon/stock_parts/capacitor/super(get_turf(holder))
holder.icon_state = "phazon12"
- if(9)
+ if(10)
if(diff==FORWARD)
user.visible_message("[user] installs the bluespace crystal.", "You install the bluespace crystal.")
qdel(used_atom)
@@ -1384,7 +1389,7 @@
else
user.visible_message("[user] unsecures the super capacitor from the [holder].", "You unsecure the super capacitor from the [holder].")
holder.icon_state = "phazon13"
- if(8)
+ if(9)
if(diff==FORWARD)
user.visible_message("[user] connects the bluespace crystal.", "You connect the bluespace crystal.")
holder.icon_state = "phazon16"
@@ -1392,21 +1397,21 @@
user.visible_message("[user] removes the bluespace crystal from the [holder].", "You remove the bluespace crystal from the [holder].")
new /obj/item/bluespace_crystal(get_turf(holder))
holder.icon_state = "phazon14"
- if(7)
+ if(8)
if(diff==FORWARD)
user.visible_message("[user] engages the bluespace crystal.", "You engage the bluespace crystal.")
holder.icon_state = "phazon17"
else
user.visible_message("[user] disconnects the bluespace crystal from the [holder].", "You disconnect the bluespace crystal from the [holder].")
holder.icon_state = "phazon15"
- if(6)
+ if(7)
if(diff==FORWARD)
user.visible_message("[user] installs the phase armor layer to the [holder].", "You install the phase armor layer to the [holder].")
holder.icon_state = "phazon18"
else
user.visible_message("[user] disengages the bluespace crystal.", "You disengage the bluespace crystal.")
holder.icon_state = "phazon16"
- if(5)
+ if(6)
if(diff==FORWARD)
user.visible_message("[user] secures the phase armor layer.", "You secure the phase armor layer.")
holder.icon_state = "phazon19"
@@ -1415,14 +1420,14 @@
var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
MS.amount = 5
holder.icon_state = "phazon17"
- if(4)
+ if(5)
if(diff==FORWARD)
user.visible_message("[user] welds the phase armor layer to the [holder].", "You weld the phase armor layer to the [holder].")
holder.icon_state = "phazon20"
else
user.visible_message("[user] unfastens the phase armor layer.", "You unfasten the phase armor layer.")
holder.icon_state = "phazon18"
- if(3)
+ if(4)
if(diff==FORWARD)
user.visible_message("[user] installs Phazon Armor Plates to the [holder].", "You install Phazon Armor Plates to the [holder].")
qdel(used_atom)
@@ -1430,7 +1435,7 @@
else
user.visible_message("[user] cuts phase armor layer from the [holder].", "You cut the phase armor layer from the [holder].")
holder.icon_state = "phazon19"
- if(2)
+ if(3)
if(diff==FORWARD)
user.visible_message("[user] secures Phazon Armor Plates.", "You secure Phazon Armor Plates.")
holder.icon_state = "phazon22"
@@ -1438,12 +1443,16 @@
user.visible_message("[user] pries Phazon Armor Plates from the [holder].", "You pry Phazon Armor Plates from the [holder].")
new /obj/item/mecha_parts/part/phazon_armor(get_turf(holder))
holder.icon_state = "phazon20"
- if(1)
+ if(2)
if(diff==FORWARD)
user.visible_message("[user] welds Phazon Armor Plates to the [holder].", "You weld Phazon Armor Plates to the [holder].")
else
user.visible_message("[user] unfastens Phazon Armor Plates.", "You unfasten Phazon Armor Plates.")
holder.icon_state = "phazon21"
+ if(1)
+ if(diff==FORWARD)
+ user.visible_message("[user] carefully inserts the anomaly core into \the [holder] and secures it.", "You slowly place the anomaly core into its socket and close its chamber.")
+ qdel(used_atom)
return 1
/datum/construction/reversible/mecha/phazon/spawn_result()
diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm
index 3d0b9d31048..4b51be4a825 100644
--- a/code/game/objects/effects/decals/Cleanable/aliens.dm
+++ b/code/game/objects/effects/decals/Cleanable/aliens.dm
@@ -11,7 +11,7 @@
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
var/list/viruses = list()
- blood_DNA = list()
+ blood_DNA = list("UNKNOWN DNA" = "X*")
/obj/effect/decal/cleanable/xenoblood/Destroy()
for(var/datum/disease/D in viruses)
@@ -63,4 +63,5 @@
/obj/effect/decal/cleanable/blood/xtracks
icon_state = "xtracks"
- random_icon_states = null
\ No newline at end of file
+ random_icon_states = null
+ blood_DNA = list("UNKNOWN DNA" = "X*")
\ No newline at end of file
diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm
index 6ee8c478ebf..8eb29846fa8 100644
--- a/code/game/objects/effects/gibs.dm
+++ b/code/game/objects/effects/gibs.dm
@@ -50,11 +50,8 @@
gib.viruses += viruus
viruus.holder = gib
- gib.blood_DNA = list()
if(MobDNA)
gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.blood_type
- else if(istype(src, /obj/effect/gibspawner/xeno))
- gib.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey
gib.blood_DNA["Non-human DNA"] = "A+"
var/list/directions = gibdirections[i]
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 5bd70bf4391..46d41aff01f 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -27,7 +27,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/toff = 0 //If 1, messenger disabled
var/tnote = null //Current Texts
var/last_text //No text spamming
- var/last_honk //Also no honk spamming that's bad too
+ var/last_noise //Also no honk spamming that's bad too
var/ttone = "beep" //The ringtone!
var/lock_code = "" // Lockcode to unlock uplink
var/honkamt = 0 //How many honks left when infected with honk.exe
@@ -301,6 +301,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if (cartridge)
if (cartridge.access_clown)
dat += "
Honk Synthesizer"
+ dat += "
Sad Trombone"
if (cartridge.access_manifest)
dat += "
View Crew Manifest"
if(cartridge.access_status_display)
@@ -557,9 +558,13 @@ var/global/list/obj/item/device/pda/PDAs = list()
else if((!isnull(cartridge)) && (cartridge.access_engine))
scanmode = 4
if("Honk")
- if ( !(last_honk && world.time < last_honk + 20) )
+ if ( !(last_noise && world.time < last_noise + 20) )
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
- last_honk = world.time
+ last_noise = world.time
+ if("Trombone")
+ if ( !(last_noise && world.time < last_noise + 20) )
+ playsound(loc, 'sound/misc/sadtrombone.ogg', 50, 1)
+ last_noise = world.time
if("Gas Scan")
if(scanmode == 5)
scanmode = 0
@@ -1202,4 +1207,4 @@ var/global/list/obj/item/device/pda/PDAs = list()
for(var/obj/item/device/pda/P in PDAs)
if(!P.owner || P.toff || P.hidden) continue
. += P
- return .
\ No newline at end of file
+ return .
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 677d1f112d8..4f2f912edc8 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -17,12 +17,11 @@
if(user.client.prefs.muted & MUTE_IC)
src << "You cannot speak in IC (muted)."
return
+
if(!ishuman(user))
user << "You don't know how to use this!"
return
- if(user.can_speak())
- user << "You find yourself unable to speak at all."
- return
+
if(spamcheck > world.time)
user << "\The [src] needs to recharge!"
return
@@ -30,7 +29,12 @@
var/message = copytext(sanitize(input(user, "Shout a message?", "Megaphone", null) as text),1,MAX_MESSAGE_LEN)
if(!message)
return
+
message = capitalize(message)
+ if(!user.can_speak(message))
+ user << "You find yourself unable to speak at all."
+ return
+
if ((src.loc == user && user.stat == 0))
if(emagged)
if(insults)
@@ -60,4 +64,4 @@
/obj/item/device/megaphone/cargo
name = "supply megaphone"
- icon_state = "megaphone-cargo"
\ No newline at end of file
+ icon_state = "megaphone-cargo"
diff --git a/code/game/objects/items/devices/recaller.dm b/code/game/objects/items/devices/recaller.dm
index 641c7755af6..c6e43c89717 100644
--- a/code/game/objects/items/devices/recaller.dm
+++ b/code/game/objects/items/devices/recaller.dm
@@ -34,7 +34,7 @@
log_game("[key_name(user)] has recalled the shuttle with a recaller.")
message_admins("[key_name_admin(user)] has recalled the shuttle with a recaller.", 1)
if(!SSshuttle.cancelEvac(user))
- loc << "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time."
+ loc << "\icon[src]No response received. Emergency shuttle cannot be recalled at this time."
return
user << "\icon[src]Emergency shuttle cannot be recalled at this time."
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
new file mode 100644
index 00000000000..6c391dcc3e6
--- /dev/null
+++ b/code/game/objects/items/stacks/cash.dm
@@ -0,0 +1,40 @@
+/obj/item/stack/spacecash
+ name = "space cash"
+ desc = "It's worth 1 credit."
+ singular_name = "bill"
+ icon = 'icons/obj/economy.dmi'
+ icon_state = "spacecash"
+ amount = 1
+ max_amount = 20
+ throwforce = 0
+ throw_speed = 2
+ throw_range = 2
+ w_class = 1.0
+
+/obj/item/stack/spacecash/c10
+ icon_state = "spacecash10"
+ desc = "It's worth 10 credits."
+
+/obj/item/stack/spacecash/c20
+ icon_state = "spacecash20"
+ desc = "It's worth 20 credits."
+
+/obj/item/stack/spacecash/c50
+ icon_state = "spacecash50"
+ desc = "It's worth 50 credits."
+
+/obj/item/stack/spacecash/c100
+ icon_state = "spacecash100"
+ desc = "It's worth 100 credits."
+
+/obj/item/stack/spacecash/c200
+ icon_state = "spacecash200"
+ desc = "It's worth 200 credits."
+
+/obj/item/stack/spacecash/c500
+ icon_state = "spacecash500"
+ desc = "It's worth 500 credits."
+
+/obj/item/stack/spacecash/c1000
+ icon_state = "spacecash1000"
+ desc = "It's worth 1000 credits."
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index 1d43d93fae9..15f3079898e 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -69,7 +69,7 @@ RSF
if (istype(A, /obj/structure/table) && matter >= 1)
user << "Dispensing Dosh..."
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
- new /obj/item/weapon/spacecash/c10( A.loc )
+ new /obj/item/stack/spacecash/c10( A.loc )
if (isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
@@ -83,7 +83,7 @@ RSF
if (istype(A, /turf/simulated/floor) && matter >= 1)
user << "Dispensing Dosh..."
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
- new /obj/item/weapon/spacecash/c10( A )
+ new /obj/item/stack/spacecash/c10( A )
if (isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 33308afbfc7..0d5d6fb2695 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -48,6 +48,10 @@
if(!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
+ if(ishuman(target))
+ var/mob/living/carbon/human/humantarget = target
+ if (!humantarget.can_inject(user, 1))
+ return
add_logs(user, target, "attempted to inject", object="[name]")
if(target != user)
diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm
new file mode 100644
index 00000000000..21c85b31297
--- /dev/null
+++ b/code/game/objects/items/weapons/signs.dm
@@ -0,0 +1,32 @@
+/obj/item/weapon/picket_sign
+ icon_state = "picket"
+ name = "blank picket sign"
+ desc = "It's blank"
+ force = 5
+ w_class = 4.0
+ attack_verb = list("bashed","smacked")
+
+ var/label = ""
+
+/obj/item/weapon/picket_sign/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/toy/crayon))
+ var/txt = stripped_input(user, "What would you like to write on the sign?", "Sign Label", null , 30)
+ if(txt)
+ label = txt
+ src.name = "[label] sign"
+ desc = "It reads: [label]"
+ ..()
+
+/obj/item/weapon/picket_sign/attack_self(mob/living/carbon/human/user)
+ if(label)
+ user.visible_message("[user] waves around \the \"[label]\" sign.")
+ else
+ user.visible_message("[user] waves around blank sign.")
+ user.changeNext_move(CLICK_CD_MELEE)
+
+/datum/table_recipe/picket_sign
+ name = "Picket Sign"
+ result = /obj/item/weapon/picket_sign
+ reqs = list(/obj/item/stack/rods = 1,
+ /obj/item/stack/sheet/cardboard = 2)
+ time = 80
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 7389d749eab..db8f612a8b7 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -31,9 +31,9 @@
..()
new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
new /obj/item/weapon/reagent_containers/food/drinks/beer(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
+ new /obj/item/stack/spacecash(src)
+ new /obj/item/stack/spacecash(src)
+ new /obj/item/stack/spacecash(src)
/obj/item/weapon/storage/book/bible/attack_self(mob/user)
return
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index a92d674a6e9..f218df6b7f7 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -180,7 +180,7 @@
/obj/item/weapon/storage/secure/briefcase/syndie/New()
for(var/i = 0, i < storage_slots - 2, i++)
- new /obj/item/weapon/spacecash/c1000(src)
+ new /obj/item/stack/spacecash/c1000(src)
return ..()
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 19b664e2c4f..41b143a4e93 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -5,11 +5,11 @@
icon_state = "red"
item_state = "toolbox_red"
flags = CONDUCT
- force = 10.0
- throwforce = 10.0
+ force = 10
+ throwforce = 10
throw_speed = 2
throw_range = 7
- w_class = 4.0
+ w_class = 4
origin_tech = "combat=1"
attack_verb = list("robusted")
hitsound = 'sound/weapons/smash.ogg'
@@ -25,6 +25,7 @@
/obj/item/weapon/storage/toolbox/emergency/New()
..()
new /obj/item/weapon/crowbar/red(src)
+ new /obj/item/weapon/weldingtool/mini(src)
new /obj/item/weapon/extinguisher/mini(src)
if(prob(50))
new /obj/item/device/flashlight(src)
@@ -70,18 +71,17 @@
icon_state = "syndicate"
item_state = "toolbox_syndi"
origin_tech = "combat=1;syndicate=1"
- force = 15.0
- throwforce = 18.0
+ force = 15
+ throwforce = 18
/obj/item/weapon/storage/toolbox/syndicate/New()
..()
- var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
- new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/screwdriver(src, "red")
new /obj/item/weapon/wrench(src)
- new /obj/item/weapon/weldingtool(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/stack/cable_coil(src,30,color)
- new /obj/item/weapon/wirecutters(src)
+ new /obj/item/weapon/weldingtool/largetank(src)
+ new /obj/item/weapon/crowbar/red(src)
+ new /obj/item/stack/cable_coil(src, 30, "red")
+ new /obj/item/weapon/wirecutters(src, "red")
new /obj/item/device/multitool(src)
/obj/item/weapon/storage/toolbox/drone
@@ -91,6 +91,7 @@
/obj/item/weapon/storage/toolbox/drone/New()
..()
+ var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 932567f0435..5f2e841eff0 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -5,7 +5,7 @@
icon_state = "wallet"
w_class = 2
can_hold = list(
- /obj/item/weapon/spacecash,
+ /obj/item/stack/spacecash,
/obj/item/weapon/card,
/obj/item/clothing/mask/cigarette,
/obj/item/device/flashlight/pen,
@@ -74,10 +74,10 @@
/obj/item/weapon/storage/wallet/random/New()
..()
- var/item1_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500)
+ var/item1_type = pick( /obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c100,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c20,/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500)
var/item2_type
if(prob(50))
- item2_type = pick( /obj/item/weapon/spacecash/c10,/obj/item/weapon/spacecash/c100,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c20,/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50, /obj/item/weapon/spacecash/c500)
+ item2_type = pick( /obj/item/stack/spacecash/c10,/obj/item/stack/spacecash/c100,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c20,/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50, /obj/item/stack/spacecash/c500)
var/item3_type = pick( /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron )
spawn(2)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 0f8a5a15230..86f9a77bd46 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -21,9 +21,9 @@
icon_state = "wrench"
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 5.0
- throwforce = 7.0
- w_class = 2.0
+ force = 5
+ throwforce = 7
+ w_class = 2
m_amt = 150
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
@@ -43,9 +43,9 @@
icon_state = "screwdriver"
flags = CONDUCT
slot_flags = SLOT_BELT
- force = 5.0
- w_class = 1.0
- throwforce = 5.0
+ force = 5
+ w_class = 1
+ throwforce = 5
throw_speed = 3
throw_range = 5
g_amt = 0
@@ -58,8 +58,11 @@
"[user] is stabbing the [src.name] into \his heart! It looks like \he's trying to commit suicide."))
return(BRUTELOSS)
-/obj/item/weapon/screwdriver/New()
- switch(pick("red","blue","purple","brown","green","cyan","yellow"))
+/obj/item/weapon/screwdriver/New(loc, var/param_color = null)
+ if(!param_color)
+ param_color = pick("red","blue","purple","brown","green","cyan","yellow")
+
+ switch(param_color)
if ("red")
icon_state = "screwdriver2"
item_state = "screwdriver"
@@ -113,8 +116,9 @@
attack_verb = list("pinched", "nipped")
hitsound = 'sound/items/Wirecutter.ogg'
-/obj/item/weapon/wirecutters/New()
- if(prob(50))
+/obj/item/weapon/wirecutters/New(loc, var/param_color = null)
+ ..()
+ if((!param_color && prob(50)) || param_color == "yellow")
icon_state = "cutters-y"
item_state = "cutters_yellow"
@@ -157,6 +161,7 @@
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
+ var/change_icons = 1
/obj/item/weapon/weldingtool/New()
..()
@@ -166,18 +171,21 @@
return
/obj/item/weapon/weldingtool/proc/update_torch()
+ overlays.Cut()
if(welding)
- src.overlays = 0
- overlays += "["-won"]"
+ overlays += "[initial(icon_state)]-on"
item_state = "welder1"
else
item_state = "welder"
/obj/item/weapon/weldingtool/update_icon()
- src.overlays = 0
- var/ratio = get_fuel() / max_fuel
- ratio = Ceiling(ratio*4) * 25
- icon_state = "[initial(icon_state)][ratio]"
+ if(change_icons)
+ var/ratio = get_fuel() / max_fuel
+ ratio = Ceiling(ratio*4) * 25
+ if(ratio == 100)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "[initial(icon_state)][ratio]"
update_torch()
return
@@ -317,7 +325,7 @@
force = 15
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
- icon_state = "welder1"
+ update_icon()
SSobj.processing |= src
else
user << "You need more fuel."
@@ -330,7 +338,7 @@
force = 3
damtype = "brute"
hitsound = "swing_hit"
- icon_state = "welder"
+ update_icon()
/obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
if(welding)
@@ -360,19 +368,29 @@
/obj/item/weapon/weldingtool/largetank
name = "industrial welding tool"
+ icon_state = "indwelder"
max_fuel = 40
- m_amt = 70
g_amt = 60
origin_tech = "engineering=2"
/obj/item/weapon/weldingtool/largetank/cyborg
-/obj/item/weapon/weldingtool/largetank/cyborg/flamethrower_screwdriver()
+/obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver()
return
-/obj/item/weapon/weldingtool/largetank/cyborg/flamethrower_rods()
+
+/obj/item/weapon/weldingtool/mini
+ name = "emergency welding tool"
+ icon_state = "miniwelder"
+ max_fuel = 10
+ m_amt = 30
+ g_amt = 10
+ change_icons = 0
+
+/obj/item/weapon/weldingtool/mini/flamethrower_screwdriver()
return
+
/obj/item/weapon/weldingtool/hugetank
name = "upgraded welding tool"
max_fuel = 80
@@ -425,9 +443,9 @@
return (BRUTELOSS)
/obj/item/weapon/crowbar/red
- icon = 'icons/obj/items.dmi'
icon_state = "red_crowbar"
item_state = "crowbar_red"
+ force = 8
/obj/item/weapon/crowbar/large
name = "crowbar"
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 3d9068d8b53..57d102eb03f 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -138,7 +138,7 @@ obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob, params)
icon_state = "throwingstar"
item_state = "eshield0"
force = 2
- throwforce = 0 //This is never used since this has a 100% embed chance.
+ throwforce = 20 //This is never used on mobs since this has a 100% embed chance.
throw_speed = 4
embedded_pain_multiplier = 4
w_class = 2
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index 74ab9699392..1471e62185f 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -84,9 +84,9 @@
/obj/structure/closet/secure_closet/freezer/money/New()
..()
for(var/i = 0, i < 3, i++)
- new /obj/item/weapon/spacecash/c1000(src)
+ new /obj/item/stack/spacecash/c1000(src)
for(var/i = 0, i < 5, i++)
- new /obj/item/weapon/spacecash/c500(src)
+ new /obj/item/stack/spacecash/c500(src)
for(var/i = 0, i < 6, i++)
- new /obj/item/weapon/spacecash/c200(src)
+ new /obj/item/stack/spacecash/c200(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index e2db0360125..ca7ccf94c1a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -115,6 +115,7 @@
new /obj/item/weapon/storage/belt/medical(src)
new /obj/item/device/flash/handheld(src)
new /obj/item/weapon/reagent_containers/hypospray/CMO(src)
+ new /obj/item/cybernetic_implant/eyes/hud/medical(src)
return
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
new file mode 100644
index 00000000000..6bf884653a7
--- /dev/null
+++ b/code/game/objects/structures/guncase.dm
@@ -0,0 +1,86 @@
+//GUNCASES//
+/obj/structure/guncase
+ name = "gun locker"
+ desc = "A locker that holds guns."
+ icon = 'icons/obj/closet.dmi'
+ icon_state = "gcase-0-open"
+ anchored = 0
+ density = 1
+ opacity = 0
+ var/case_type = "gcase"
+ var/gun_category = /obj/item/weapon/gun
+ var/open = 1
+ var/capacity = 4
+
+/obj/structure/guncase/initialize()
+ ..()
+ for(var/obj/item/I in loc.contents)
+ if(istype(I, gun_category))
+ I.loc = src
+ if(contents.len >= capacity)
+ break
+ update_icon()
+
+/obj/structure/guncase/update_icon()
+ icon_state = "[case_type]-[contents.len]-[open ? "open" : "closed"]"
+
+/obj/structure/guncase/attackby(obj/item/I, mob/user, params)
+ if(isrobot(user) || isalien(user))
+ return
+ if(istype(I, gun_category))
+ if(contents.len < capacity && open)
+ user.drop_item()
+ contents += I
+ user << "You place [I] in [src]."
+ update_icon()
+ return
+
+ open = !open
+ update_icon()
+
+/obj/structure/guncase/attack_hand(mob/user)
+ if(isrobot(usr) || isalien(usr))
+ return
+ if(contents.len && open)
+ ShowWindow(user)
+ else
+ open = !open
+ update_icon()
+
+/obj/structure/guncase/proc/ShowWindow(mob/user)
+ var/dat = {"
+
Stored Guns
+
"}
+ for(var/i = contents.len, i >= 1, i--)
+ var/obj/item/I = contents[i]
+ dat += "[I.name]
"
+ dat += "
"
+
+ var/datum/browser/popup = new(user, "gunlocker", "[name]
", 350, 300)
+ popup.set_content(dat)
+ popup.open(0)
+
+/obj/structure/guncase/Topic(href, href_list)
+ if(href_list["retrieve"])
+ var/obj/item/O = locate(href_list["retrieve"])
+ if(!usr.canUseTopic(src))
+ return
+ if(ishuman(usr))
+ if(!usr.get_active_hand())
+ usr.put_in_hands(O)
+ else
+ O.loc = get_turf(src)
+ update_icon()
+
+/obj/structure/guncase/shotgun
+ name = "shotgun locker"
+ desc = "A locker that holds shotguns."
+ case_type = "gcase"
+ gun_category = /obj/item/weapon/gun/projectile/shotgun
+
+/obj/structure/guncase/ecase
+ name = "energy gun locker"
+ desc = "A locker that holds energy guns."
+ icon_state = "ecase-0-open"
+ case_type = "ecase"
+ gun_category = /obj/item/weapon/gun/energy/gun
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index 5a7cb5c8f2d..15c26a7a058 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -60,8 +60,7 @@
M.pixel_x = initial(M.pixel_x)
M.pixel_y = initial(M.pixel_y)
if(M.lying)
- var/lying_pixel_y_offset = -6
- M.pixel_y += lying_pixel_y_offset
+ M.pixel_y = M.lying_pixel_offset
overlays.Cut()
/obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index e99a06209bf..3a4588dcb3b 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -60,8 +60,7 @@
icon_state = "down"
anchored = 0
-
-/obj/structure/stool/bed/roller/post_buckle_mob(mob/M)
+/obj/structure/stool/bed/roller/post_buckle_mob(mob/living/M)
if(M == buckled_mob)
density = 1
icon_state = "up"
@@ -71,8 +70,7 @@
icon_state = "down"
M.pixel_y = initial(M.pixel_y)
if(M.lying)
- var/lying_pixel_y_offset = -6
- M.pixel_y += lying_pixel_y_offset
+ M.pixel_y = M.lying_pixel_offset
/obj/item/roller
diff --git a/code/game/turfs/simulated/dirtystation.dm b/code/game/turfs/simulated/dirtystation.dm
index 3a5e9e001a2..aaf89409336 100644
--- a/code/game/turfs/simulated/dirtystation.dm
+++ b/code/game/turfs/simulated/dirtystation.dm
@@ -10,6 +10,7 @@
/obj/effect/decal/cleanable/blood/old/New()
..()
icon_state += "-old"
+ blood_DNA["Non-human DNA"] = "A+"
/obj/effect/decal/cleanable/blood/gibs/old
name = "old rotting gibs"
@@ -19,6 +20,7 @@
..()
icon_state += "-old"
dir = pick(1,2,4,8)
+ blood_DNA["Non-human DNA"] = "A+"
/obj/effect/decal/cleanable/vomit/old
name = "crusty dried vomit"
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 0e7532d5ffa..22f84bea4d8 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -831,7 +831,7 @@ var/global/list/g_fancy_list_of_types = null
for(var/obj/item/briefcase_item in sec_briefcase)
qdel(briefcase_item)
for(var/i=3, i>0, i--)
- sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
+ sec_briefcase.contents += new /obj/item/stack/spacecash/c1000
sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
sec_briefcase.contents += new /obj/item/ammo_box/a357
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index c85e9eb5222..e28da00a535 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -159,7 +159,7 @@ Code:
return 1
/obj/item/device/assembly/signaler/reciever/describe()
- return "The radio reciever is [on?"on":"off"]."
+ return "The radio receiver is [on?"on":"off"]."
/obj/item/device/assembly/signaler/reciever/receive_signal(datum/signal/signal)
if(!on) return
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index b8cfb519a50..f6d98d784dc 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -132,7 +132,7 @@ var/sc_safecode5 = "[rand(0,9)]"
Our on-board spy has learned the code and has hidden away a few copies of the code around the station. Unfortunatly he has been captured by security
Your objective is to split up, locate any of the papers containing the captain's safe code, open the safe and
- secure anything found inside. If possible, recover the imprisioned syndicate operative and recieve the code from him.
+ secure anything found inside. If possible, recover the imprisioned syndicate operative and receive the code from him.
As always, eliminate anyone who gets in the way.
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index f24d7e2a301..712d14979b1 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -57,7 +57,7 @@
/client/proc/toggleadminhelpsound()
set name = "Hear/Silence Adminhelps"
set category = "Preferences"
- set desc = "Toggle hearing a notification when admin PMs are recieved"
+ set desc = "Toggle hearing a notification when admin PMs are received"
if(!holder) return
prefs.toggles ^= SOUND_ADMINHELP
prefs.save_preferences()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 230efee1fc6..65205405358 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -8,7 +8,11 @@
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
var/alt_desc = null
-
+ var/toggle_message = null
+ var/alt_toggle_message = null
+ var/activation_sound = null
+ var/toggle_cooldown = null
+ var/cooldown = 0
var/obj/item/device/flashlight/F = null
var/can_flashlight = 0
@@ -80,6 +84,7 @@ BLIND // can't see anything
body_parts_covered = HEAD
slot_flags = SLOT_HEAD
var/blockTracking = 0 //For AI tracking
+ var/can_toggle = null
//Mask
/obj/item/clothing/mask
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index f10de9605ce..4fbd2b6b832 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -46,6 +46,9 @@
desc = "It's a helmet specifically designed to protect against close range attacks."
icon_state = "riot"
item_state = "helmet"
+ toggle_message = "You pull the visor down on"
+ alt_toggle_message = "You push the visor up on"
+ can_toggle = 1
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|HEADBANGPROTECT
armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
@@ -53,23 +56,48 @@
action_button_name = "Toggle Helmet Visor"
visor_flags = HEADCOVERSEYES|HEADCOVERSMOUTH
visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE
+ toggle_cooldown = 0
-/obj/item/clothing/head/helmet/riot/attack_self()
- if(usr.canmove && !usr.stat && !usr.restrained())
- if(up)
- up = !up
- flags |= (visor_flags)
- flags_inv |= (visor_flags_inv)
- icon_state = initial(icon_state)
- usr << "You pull \the [src] down."
- usr.update_inv_head(0)
- else
- up = !up
- flags &= ~(visor_flags)
- flags_inv &= ~(visor_flags_inv)
- icon_state = "[initial(icon_state)]up"
- usr << "You push \the [src] up."
- usr.update_inv_head(0)
+/obj/item/clothing/head/helmet/attack_self()
+ if(usr.canmove && !usr.stat && !usr.restrained() && can_toggle)
+ if(world.time > cooldown + toggle_cooldown)
+ cooldown = world.time
+ if(up)
+ up = !up
+ flags |= (visor_flags)
+ flags_inv |= (visor_flags_inv)
+ icon_state = initial(icon_state)
+ usr << "[toggle_message] \the [src]."
+ usr.update_inv_head(0)
+ else
+ up = !up
+ flags &= ~(visor_flags)
+ flags_inv &= ~(visor_flags_inv)
+ icon_state = "[initial(icon_state)]up"
+ usr << "[alt_toggle_message] \the [src]"
+ usr.update_inv_head(0)
+ while(up)
+ playsound(src.loc, "[activation_sound]", 100, 0, 4)
+ sleep(15)
+
+/obj/item/clothing/head/helmet/justice
+ name = "helmet of justice"
+ desc = "WEEEEOOO. WEEEEEOOO. WEEEEOOOO."
+ icon_state = "justice"
+ toggle_message = "You turn off the lights on"
+ alt_toggle_message = "You turn on the lights on"
+ action_button_name = "Toggle Justice Lights"
+ can_toggle = 1
+ toggle_cooldown = 14
+ activation_sound = 'sound/items/WEEOO1.ogg'
+
+/obj/item/clothing/head/helmet/justice/escape
+ name = "alarm helmet"
+ desc = "WEEEEOOO. WEEEEEOOO. STOP THAT MONKEY. WEEEOOOO."
+ icon_state = "justice2"
+ toggle_message = "You turn off the light on"
+ alt_toggle_message = "You turn on the light on"
+ action_button_name = "Toggle Alarm Lights"
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index c38e52f1736..6828d17dad4 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -45,7 +45,6 @@
desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device. Plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device."
action_button_name = "HALT!"
icon_state = "sechailer"
- var/cooldown = 0
var/aggressiveness = 2
ignore_maskadjust = 0
flags = MASKCOVERSMOUTH | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index a97a9964824..c59e0ef4c62 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -30,7 +30,6 @@
var/activating = 0
var/activated = 0
var/cooldowntime = 50 //deciseconds
- var/cooldown = 0
var/teleporting = 0
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index ab22fb8e773..5e019d89409 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -92,8 +92,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
/obj/item/clothing/suit/space/hardsuit/engine/atmos
-
-/obj/item/clothing/suit/space/hardsuit/atmos
name = "atmospherics hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding."
icon_state = "hardsuit-atmospherics"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index d5ee7e59bcc..d65ea343015 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -116,7 +116,6 @@
icon_state = "reactiveoff"
item_state = "reactiveoff"
blood_overlay_type = "armor"
- slowdown = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
action_button_name = "Toggle Armor"
unacidable = 1
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index bd3c9d8368e..6a2aaec47fd 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -68,7 +68,7 @@
icon_state = "judge"
item_state = "judge"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/spacecash)
+ allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/stack/spacecash)
flags_inv = HIDEJUMPSUIT
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 17c224df9a3..92fe8b9272c 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -145,7 +145,7 @@
/obj/item/clothing/tie/medal/gold/heroism
name = "medal of exceptional heroism"
- desc = "An extremely rare golden medal awarded only by Centcom. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
+ desc = "An extremely rare golden medal awarded only by Centcom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
////////////
//Armbands//
diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm
index ca3da0b965d..45d4d340ecd 100644
--- a/code/modules/crafting/guncrafting.dm
+++ b/code/modules/crafting/guncrafting.dm
@@ -4,8 +4,8 @@
// PARTS //
/obj/item/weaponcrafting/reciever
- name = "modular reciever"
- desc = "A prototype modular reciever and trigger assembly for a firearm."
+ name = "modular receiver"
+ desc = "A prototype modular receiver and trigger assembly for a firearm."
icon = 'icons/obj/improvised.dmi'
icon_state = "reciever"
@@ -20,7 +20,7 @@
/obj/item/weaponcrafting/reciever/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/pipe))
- user << "You attach the shotgun barrel to the reciever. The pins seem loose."
+ user << "You attach the shotgun barrel to the receiver. The pins seem loose."
var/obj/item/weaponcrafting/ishotgunconstruction/I = new /obj/item/weaponcrafting/ishotgunconstruction
user.unEquip(src)
user.put_in_hands(I)
@@ -32,7 +32,7 @@
/obj/item/weaponcrafting/ishotgunconstruction
name = "slightly conspicuous metal construction"
- desc = "A long pipe attached to a firearm reciever. The pins seem loose."
+ desc = "A long pipe attached to a firearm receiver. The pins seem loose."
icon = 'icons/obj/improvised.dmi'
icon_state = "ishotgunstep1"
@@ -42,7 +42,7 @@
var/obj/item/weaponcrafting/ishotgunconstruction2/C = new /obj/item/weaponcrafting/ishotgunconstruction2
user.unEquip(src)
user.put_in_hands(C)
- user << "You screw the pins into place, securing the pipe to the reciever."
+ user << "You screw the pins into place, securing the pipe to the receiver."
qdel(src)
/obj/item/weaponcrafting/ishotgunconstruction2
@@ -53,7 +53,7 @@
/obj/item/weaponcrafting/ishotgunconstruction2/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/weaponcrafting/stock))
- user << "You attach the stock to the reciever-barrel assembly."
+ user << "You attach the stock to the receiver-barrel assembly."
var/obj/item/weaponcrafting/ishotgunconstruction3/I = new /obj/item/weaponcrafting/ishotgunconstruction3
user.unEquip(src)
user.put_in_hands(I)
@@ -63,7 +63,7 @@
/obj/item/weaponcrafting/ishotgunconstruction3
name = "extremely conspicuous metal construction"
- desc = "A reciever-barrel shotgun assembly with a loose wooden stock. There's no way you can fire it without the stock coming loose."
+ desc = "A receiver-barrel shotgun assembly with a loose wooden stock. There's no way you can fire it without the stock coming loose."
icon = 'icons/obj/improvised.dmi'
icon_state = "ishotgunstep2"
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index 91f71dc1fe9..10ca2b4b64e 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -54,8 +54,8 @@
if(A.anchored) continue
var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
- if(!A.Move(newloc)) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
- A.loc = locate(A.x + x_distance, A.y + y_distance, TO.z)
+ if(!A.Move(newloc) && newloc) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
+ A.loc = newloc
spawn()
if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm
index 51ece9f90d7..6888a4a9a04 100644
--- a/code/modules/food&drinks/drinks/drinks.dm
+++ b/code/modules/food&drinks/drinks/drinks.dm
@@ -219,6 +219,9 @@
//////////////////////////soda_cans//
//These are in their own group to be used as IED's in /obj/item/weapon/grenade/ghettobomb.dm
+/obj/item/weapon/reagent_containers/food/drinks/soda_cans
+ name = "soda can"
+
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/attack(mob/M, mob/user)
if(M == user && !src.reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head")
user.visible_message("[user] crushes the can of [src] on \his forehead!", "You crush the can of [src] on your forehead!")
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 7b33f64ab76..51a9e433c6f 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -1229,21 +1229,21 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
bitesize = 1 + round(reagents.total_volume / 2, 1)
switch(potency)
if(0 to 10)
- inside_type = /obj/item/weapon/spacecash/
+ inside_type = /obj/item/stack/spacecash/
if(11 to 20)
- inside_type = /obj/item/weapon/spacecash/c10
+ inside_type = /obj/item/stack/spacecash/c10
if(21 to 30)
- inside_type = /obj/item/weapon/spacecash/c20
+ inside_type = /obj/item/stack/spacecash/c20
if(31 to 40)
- inside_type = /obj/item/weapon/spacecash/c50
+ inside_type = /obj/item/stack/spacecash/c50
if(41 to 50)
- inside_type = /obj/item/weapon/spacecash/c100
+ inside_type = /obj/item/stack/spacecash/c100
if(51 to 60)
- inside_type = /obj/item/weapon/spacecash/c200
+ inside_type = /obj/item/stack/spacecash/c200
if(61 to 80)
- inside_type = /obj/item/weapon/spacecash/c500
+ inside_type = /obj/item/stack/spacecash/c500
else
- inside_type = /obj/item/weapon/spacecash/c1000
+ inside_type = /obj/item/stack/spacecash/c1000
/obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 94378c89ecb..283110de387 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -248,7 +248,7 @@
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 1200),
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 1500),
- new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000),
+ new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index 8bfe24ce149..e9dc6f7d14f 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -105,7 +105,7 @@
else
Radio.set_frequency(SEC_FREQ)
Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", SEC_FREQ)
- usr << "Shuttle recieved message and will be sent shortly."
+ usr << "Shuttle received message and will be sent shortly."
if(href_list["choice"] == "release")
if(alone_in_area(get_area(loc), usr))
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index ea456b180fb..e8cd9098353 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -130,6 +130,19 @@
/obj/item/weapon/pickaxe/drill/cyborg
name = "cyborg mining drill"
+ desc = "An integrated electric mining drill."
+ var/warned = 0
+
+/obj/item/weapon/pickaxe/drill/cyborg/proc/use_robot_power(var/mob/living/silicon/robot/R)
+ if(!bcell.use(drillcost))
+ if(!warned)
+ usr << "Drill internal battery depleted, power will be drawn from user's power supply."
+ playsound(src, 'sound/weapons/smg_empty_alarm.ogg',50,1)
+ warned = 1
+ if(!R.cell.use(drillcost))
+ R << "You don't have enough charge to drill."
+ return 0
+ return 1
/obj/item/weapon/pickaxe/drill/diamonddrill
name = "diamond-tipped mining drill"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 4cb58dc6994..cdde315c9c5 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -417,11 +417,10 @@
if(istype(P, /obj/item/weapon/pickaxe/drill))
var/obj/item/weapon/pickaxe/drill/D = P
if(isrobot(user))
- var/mob/living/silicon/robot/R = user
- if(!R.cell.use(D.drillcost))
- R << "Your [D.name] doesn't have enough charge."
+ var/obj/item/weapon/pickaxe/drill/cyborg/RD = D
+ if(!RD.use_robot_power(user))
return
- if(!D.bcell.use(D.drillcost))
+ else if(!D.bcell.use(D.drillcost))
user << "Your [D.name] doesn't have enough charge."
return
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index cd7dd65d019..00194761fb7 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -196,6 +196,8 @@
if(TRAITS & TRAIT_THIEVING)
slyness = 75
+ SSbp.insertBot(src)
+
/mob/living/carbon/human/interactive/attack_hand(mob/living/carbon/human/M as mob)
..()
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index da83251d5ce..ccc42c33a0a 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -12,6 +12,7 @@
ventcrawler = 2
languages = ALIEN
verb_say = "hisses"
+ lying_pixel_offset = 0
var/nightvision = 1
var/storedPlasma = 250
var/max_plasma = 500
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 98067011363..4ace45627ab 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -54,6 +54,7 @@
/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(var/message = 1)
leap_on_click = !leap_on_click
leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]"
+ update_icons()
if(message)
src << "You will now [leap_on_click ? "leap at":"slash at"] enemies!"
else
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 337f05ebbff..f47fd38b6bf 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -4,6 +4,7 @@
var/obj/item/r_store = null
var/obj/item/l_store = null
var/caste = ""
+ var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files.
var/leap_on_click = 0
var/pounce_cooldown = 0
var/pounce_cooldown_time = 30
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 7f0418c5faa..2ccc95f56cf 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -19,18 +19,15 @@
//If we mostly took damage from fire
if(fireloss > 125)
icon_state = "alien[caste]_husked"
- pixel_y = 0
else
icon_state = "alien[caste]_dead"
- pixel_y = 0
- else if(stat == UNCONSCIOUS || weakened)
+ else if((stat == UNCONSCIOUS && !sleeping) || weakened)
icon_state = "alien[caste]_unconscious"
- pixel_y = 0
else if(leap_on_click)
icon_state = "alien[caste]_pounce"
- else if(lying || resting)
+ else if(lying || resting || sleeping)
icon_state = "alien[caste]_sleep"
else if(m_intent == "run")
icon_state = "alien[caste]_running"
@@ -38,17 +35,21 @@
icon_state = "alien[caste]_s"
if(leaping)
- icon = 'icons/mob/alienleap.dmi'
+ var/old_icon = icon
+ icon = alt_icon
+ alt_icon = old_icon
icon_state = "alien[caste]_leap"
pixel_x = -32
pixel_y = -32
else
- icon = initial(icon)
+ if(alt_icon != initial(alt_icon))
+ var/old_icon = icon
+ icon = alt_icon
+ alt_icon = old_icon
pixel_x = initial(pixel_x)
pixel_y = initial(pixel_y)
-
/mob/living/carbon/alien/humanoid/regenerate_icons()
..()
if (notransform) return
@@ -63,8 +64,9 @@
/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that.
if(lying > 0)
lying = 90 //Anything else looks retarded
- update_icons()
..()
+ update_icons()
+
/mob/living/carbon/alien/humanoid/update_hud()
diff --git a/code/modules/mob/living/carbon/alien/larva/login.dm b/code/modules/mob/living/carbon/alien/larva/login.dm
deleted file mode 100644
index 33808a4d966..00000000000
--- a/code/modules/mob/living/carbon/alien/larva/login.dm
+++ /dev/null
@@ -1,3 +0,0 @@
-/mob/living/carbon/alien/larva/Login()
- return ..()
-
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index f253305d072..b694d7c2ca5 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -22,5 +22,5 @@
var/co2overloadtime = null
var/temperature_resistance = T0C+75
-
+ lying_pixel_offset = -6 //offset for pixel_y when lying down.
has_limbs = 1
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index f20afceaaa3..b51e729b8d0 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -266,7 +266,7 @@
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- var/obj/item/cybernetic_implant/eyes/hud/CIH = locate(/obj/item/cybernetic_implant/eyes/hud) in internal_organs
+ var/obj/item/cybernetic_implant/eyes/hud/CIH = locate(/obj/item/cybernetic_implant/eyes/hud) in H.internal_organs
if(istype(H.glasses, /obj/item/clothing/glasses/hud) || CIH)
var/perpname = get_face_name(get_id_name(""))
if(perpname)
@@ -276,6 +276,12 @@
msg += "\[Front photo\] "
msg += "\[Side photo\]
"
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/medical))
+ var/implant_detect
+ for(var/obj/item/cybernetic_implant/CI in internal_organs)
+ implant_detect += "[name] is modified with a [CI.name].
"
+ if(implant_detect)
+ msg += "Detected cybernetic modifications:
"
+ msg += implant_detect
if(R)
var/health = R.fields["p_stat"]
msg += "\[[health]\]"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 087e499a732..00f54308178 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -74,11 +74,35 @@
stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]")
stat("Absorbed DNA", mind.changeling.absorbedcount)
- //NINJACODE
- if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja))
- var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit
+
+ //NINJACODE
+ if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja.
+ var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit
+ if(statpanel("SpiderOS"))
+ stat("SpiderOS Status:","[SN.s_initialized ? "Initialized" : "Disabled"]")
+ stat("Current Time:", "[worldtime2text()]")
if(SN.s_initialized)
- stat("Energy Charge", round(SN.cell.charge/100))
+ //Suit gear
+ stat("Energy Charge:", "[round(SN.cell.charge/100)]%")
+ stat("Smoke Bombs:", "\Roman [SN.s_bombs]")
+ //Ninja status
+ if(dna)
+ stat("Fingerprints:", "[md5(dna.uni_identity)]")
+ stat("Unique Identity:", "[dna.unique_enzymes]")
+ stat("Overall Status:", "[stat > 1 ? "dead" : "[health]% healthy"]")
+ stat("Nutrition Status:", "[nutrition]")
+ stat("Oxygen Loss:", "[getOxyLoss()]")
+ stat("Toxin Levels:", "[getToxLoss()]")
+ stat("Burn Severity:", "[getFireLoss()]")
+ stat("Brute Trauma:", "[getBruteLoss()]")
+ stat("Radiation Levels:","[radiation] rad")
+ stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)")
+
+ //Virsuses
+ if(viruses.len)
+ stat("Viruses:", null)
+ for(var/datum/disease/D in viruses)
+ stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]")
/mob/living/carbon/human/ex_act(severity, ex_target)
@@ -239,6 +263,8 @@
if(istype(MB))
MB.RunOver(src)
+ spreadFire(AM)
+
//Added a safety check in case you want to shock a human mob directly through electrocute_act.
/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/safety = 0)
if(!safety)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 555feee5791..fd919216a09 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -100,17 +100,17 @@ emp_act
return 1
if(wear_suit && istype(wear_suit, /obj/item/))
var/obj/item/I = wear_suit
- if(I.IsShield() && (prob(35)))
+ if(I.IsShield() && (prob(50)))
visible_message("The reactive teleport system flings [src] clear of [attack_text]!", \
"The reactive teleport system flings [src] clear of [attack_text]!")
var/list/turfs = new/list()
- for(var/turf/T in orange(6))
+ for(var/turf/T in orange(6, src))
if(istype(T,/turf/space)) continue
if(T.density) continue
if(T.x>world.maxx-6 || T.x<6) continue
if(T.y>world.maxy-6 || T.y<6) continue
turfs += T
- if(!turfs.len) turfs += pick(/turf in orange(6))
+ if(!turfs.len) turfs += pick(/turf in orange(6, src))
var/turf/picked = pick(turfs)
if(!isturf(picked)) return
if(buckled)
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 77947b7b4ff..1136f3533bb 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -7,7 +7,6 @@
var/final_pixel_y = pixel_y
var/final_dir = dir
var/changed = 0
-
if(lying != lying_prev)
changed++
ntransform.TurnTo(lying_prev,lying)
@@ -16,7 +15,7 @@
else //if(lying != 0)
if(lying_prev == 0) //Standing to lying
pixel_y = initial(pixel_y)
- final_pixel_y -= 6
+ final_pixel_y = lying_pixel_offset
if(dir & (EAST|WEST)) //Facing east or west
final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index 8c712e7c83c..d79896f82dd 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -86,9 +86,8 @@
m_type = 2
if ("flip")
- if (!src.restrained())
- message = "[src] does a flip!"
- src.SpinAnimation(5,1)
+ if (!src.restrained() || !src.resting || !src.sleeping)
+ src.SpinAnimation(7,1)
m_type = 2
if ("frown")
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 89a2a13a753..598054d0c1d 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -96,14 +96,14 @@
//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
/mob/living/proc/handle_status_effects()
if(paralysis)
- AdjustParalysis(-1)
+ paralysis = max(paralysis-1,0)
if(stunned)
- AdjustStunned(-1)
+ stunned = max(stunned-1,0)
if(!stunned)
update_icons()
if(weakened)
- AdjustWeakened(-1)
+ weakened = max(weakened-1,0)
if(!weakened)
update_icons()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b84ed4f88cb..220aa058a79 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -70,6 +70,9 @@ Sorry Giacom. Please don't be mad :(
//Called when we bump onto a mob
/mob/living/proc/MobBump(mob/M)
+ //Even if we don't push/swap places, we "touched" them, so spread fire
+ spreadFire(M)
+
if(now_pushing)
return 1
@@ -323,6 +326,7 @@ Sorry Giacom. Please don't be mad :(
else
if(alert(src, "You sure you want to sleep for a while?", "Sleep", "Yes", "No") == "Yes")
usr.sleeping = 20 //Short nap
+ update_canmove()
/mob/proc/get_contents()
@@ -332,6 +336,7 @@ Sorry Giacom. Please don't be mad :(
resting = !resting
src << "You are now [resting ? "resting" : "getting up"]."
+ update_canmove()
//Recursive function to find everything a mob is holding.
/mob/living/get_contents(var/obj/item/weapon/storage/Storage = null)
@@ -775,7 +780,10 @@ Sorry Giacom. Please don't be mad :(
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
floating = 1
else if(!on && floating)
- animate(src, pixel_y = initial(pixel_y), time = 10)
+ var/final_pixel_y = initial(pixel_y)
+ if(lying && !buckled)
+ final_pixel_y = lying_pixel_offset
+ animate(src, pixel_y = final_pixel_y, time = 10)
floating = 0
//called when the mob receives a bright flash
@@ -838,9 +846,12 @@ Sorry Giacom. Please don't be mad :(
return
-/atom/movable/proc/do_attack_animation(atom/A)
+/atom/movable/proc/do_attack_animation(atom/A, end_pixel_y)
var/pixel_x_diff = 0
var/pixel_y_diff = 0
+ var/final_pixel_y = initial(pixel_y)
+ if(end_pixel_y)
+ final_pixel_y = end_pixel_y
var/direction = get_dir(src, A)
switch(direction)
if(NORTH)
@@ -863,20 +874,27 @@ Sorry Giacom. Please don't be mad :(
if(SOUTHWEST)
pixel_x_diff = -8
pixel_y_diff = -8
+
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
+ animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
/mob/living/do_attack_animation(atom/A)
- ..()
+ var/final_pixel_y = initial(pixel_y)
+ if(lying && !buckled)
+ final_pixel_y = lying_pixel_offset
+ ..(A, final_pixel_y)
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
/mob/living/proc/do_jitter_animation(jitteriness)
var/amplitude = min(4, (jitteriness/100) + 1)
var/pixel_x_diff = rand(-amplitude, amplitude)
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
+ var/final_pixel_y = initial(pixel_y)
+ if(lying && !buckled)
+ final_pixel_y = lying_pixel_offset
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
- animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
+ animate(pixel_x = initial(pixel_x) , pixel_y = final_pixel_y , time = 2)
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
/mob/living/proc/get_temperature(var/datum/gas_mixture/environment)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 28acd2aa693..cbacdc681cd 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -134,6 +134,24 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
adjust_fire_stacks(0.5)
IgniteMob()
+
+//Share fire evenly between the two mobs
+//Called in MobBump() and Crossed()
+/mob/living/proc/spreadFire(var/mob/living/L)
+ if(!istype(L))
+ return
+ var/L_old_on_fire = L.on_fire
+
+ if(on_fire) //Only spread fire stacks if we're on fire
+ fire_stacks /= 2
+ L.fire_stacks += fire_stacks
+ L.IgniteMob()
+
+ if(L_old_on_fire) //Only ignite us and gain their stacks if they were onfire before we bumped them
+ L.fire_stacks /= 2
+ fire_stacks += L.fire_stacks
+ IgniteMob()
+
//Mobs on Fire end
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 8a5c084b0b0..9d9d701b60a 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -41,6 +41,5 @@
var/mob_size = MOB_SIZE_HUMAN
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
- var/list/image/staticOverlays = list()
-
+ var/lying_pixel_offset = 0 //offset for pixel_y when the mob is lying down.
var/has_limbs = 0 //does the mob have distinct limbs?(arms,legs, chest,head)
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 7292eda4cfa..4ba42b5686d 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -4,10 +4,9 @@
var/obj/item/clothing/tie/petcollar/pcollar = null
var/image/collar = null
var/image/pettag = null
- var/accept_collar = 1
/mob/living/simple_animal/pet/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(istype(O, /obj/item/clothing/tie/petcollar) && accept_collar && !pcollar)
+ if(istype(O, /obj/item/clothing/tie/petcollar) && !pcollar)
var/obj/item/clothing/tie/petcollar/P = O
pcollar = P
update_collar()
@@ -24,6 +23,10 @@
pcollar = new(src)
update_collar()
+/mob/living/simple_animal/pet/revive()
+ ..()
+ update_collar()
+
/mob/living/simple_animal/pet/death(gibbed)
..(gibbed)
update_collar()
@@ -62,7 +65,6 @@
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
- accept_collar = 0 //corgis have their own item handling
/mob/living/simple_animal/pet/corgi/New()
..()
@@ -210,7 +212,6 @@
/obj/item/weapon/tank/internals/oxygen,
/obj/item/weapon/tank/internals/air,
/obj/item/weapon/extinguisher,
- /obj/item/clothing/tie/petcollar
)
if( ! ( item_to_add.type in allowed_types ) )
@@ -526,7 +527,6 @@
density = 0
pass_flags = PASSMOB
mob_size = MOB_SIZE_SMALL
- accept_collar = 1
//puppies cannot wear anything.
/mob/living/simple_animal/pet/corgi/puppy/Topic(href, href_list)
@@ -550,7 +550,6 @@
response_harm = "kicks"
var/turns_since_scan = 0
var/puppies = 0
- accept_collar = 1
//Lisa already has a cute bow!
/mob/living/simple_animal/pet/corgi/Lisa/Topic(href, href_list)
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 651ed536c0d..618df114515 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -35,7 +35,7 @@
/mob/living/simple_animal/hostile/carp/FindTarget()
. = ..()
if(.)
- emote("me", 1, "nashes at [.]!")
+ emote("me", 1, "gnashes at [.]!")
/mob/living/simple_animal/hostile/carp/AttackingTarget()
..()
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index f81bdac5d59..ee296d88317 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -71,7 +71,8 @@
..()
/mob/living/simple_animal/updatehealth()
- health = max(maxHealth - getBruteLoss(), 0)
+ ..()
+ health = Clamp(health, 0, maxHealth)
/mob/living/simple_animal/Life()
if(..())
@@ -248,11 +249,16 @@
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
- if((Proj.damage_type != STAMINA))
- adjustBruteLoss(Proj.damage)
- Proj.on_hit(src, 0)
+ apply_damage(Proj.damage, Proj.damage_type)
+ Proj.on_hit(src, 0)
return 0
+/mob/living/simple_animal/adjustFireLoss(var/amount)
+ adjustBruteLoss(amount)
+
+/mob/living/simple_animal/adjustStaminaLoss(var/amount)
+ return
+
/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob)
switch(M.a_intent)
@@ -381,7 +387,6 @@
icon_state = icon_dead
stat = DEAD
density = 0
- lying = 1
if(!gibbed)
visible_message("\the [src] stops moving...")
..()
@@ -426,8 +431,7 @@
/mob/living/simple_animal/revive()
health = maxHealth
icon_state = icon_living
- lying = 0
- density = 1
+ density = initial(density)
update_canmove()
..()
@@ -478,3 +482,12 @@
return
else
..()
+
+/mob/living/simple_animal/update_canmove()
+ if(paralysis || stunned || weakened || stat || resting || buckled)
+ drop_r_hand()
+ drop_l_hand()
+ canmove = 0
+ else
+ canmove = 1
+ return canmove
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
index e39b9400dfd..e8b647e5e8d 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -7,7 +7,7 @@
var/list/choices = list()
for(var/mob/living/C in view(1,src))
- if(C!=src && !isslime(C) && Adjacent(C))
+ if(C!=src && Adjacent(C))
choices += C
var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices
@@ -24,6 +24,10 @@
Feedstop()
return 0
+ if(isslime(M))
+ src << "I can't latch onto another slime..."
+ return 0
+
if(docile)
src << "I'm not hungry anymore..."
return 0
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 9022aa081a0..cde4d29cadc 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -164,6 +164,10 @@
stat(null,"Power Level: [powerlevel]")
+/mob/living/simple_animal/slime/adjustFireLoss(amount)
+ ..(-abs(amount)) // Heals them
+ return
+
/mob/living/simple_animal/slime/bullet_act(var/obj/item/projectile/Proj)
if(!Proj)
return
diff --git a/code/modules/mob/living/simple_animal/slime/update_icons.dm b/code/modules/mob/living/simple_animal/slime/update_icons.dm
deleted file mode 100644
index 14525b1e8a0..00000000000
--- a/code/modules/mob/living/simple_animal/slime/update_icons.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-//no special icon processing
-
-/mob/living/simple_animal/slime/update_transform() //They're slimes, they don't lie down.
- return
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 8762927332f..3a4af5d847c 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -771,7 +771,7 @@ var/list/slot_equipment_priority = list( \
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
-//Robots and brains have their own version so don't worry about them
+//Robots, animals and brains have their own version so don't worry about them
/mob/proc/update_canmove()
var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH)
var/buckle_lying = !(buckled && !buckled.buckle_lying)
diff --git a/code/modules/ninja/__ninjaDefines.dm b/code/modules/ninja/__ninjaDefines.dm
index a8dc65f9f13..352087f4e83 100644
--- a/code/modules/ninja/__ninjaDefines.dm
+++ b/code/modules/ninja/__ninjaDefines.dm
@@ -10,4 +10,15 @@ Contents:
//ninjacost() specificCheck defines
#define N_STEALTH_CANCEL 1
#define N_SMOKE_BOMB 2
-#define N_ADRENALINE 3
\ No newline at end of file
+#define N_ADRENALINE 3
+
+//ninjaDrainAct() defines for non numerical returns
+//While not strictly needed, it's nicer than them just returning "twat"
+//Which was my original intention.
+
+#define INVALID_DRAIN "INVALID" //This one is if the drain proc needs to cancel, eg missing variables, etc, it's important.
+
+#define DRAIN_RD_HACKED "RDHACK"
+#define DRAIN_RD_HACK_FAILED "RDHACKFAIL"
+#define DRAIN_MOB_SHOCK "MOBSHOCK"
+#define DRAIN_MOB_SHOCK_FAILED "MOBSHOCKFAIL"
\ No newline at end of file
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 0a398a7ba27..5950d5c0f0c 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -1,20 +1,80 @@
-
/obj/item/weapon/katana/energy
name = "energy katana"
- desc = "a katana infused with a strong energy"
+ desc = "A katana infused with strong energy."
icon_state = "energy_katana"
item_state = "energy_katana"
force = 40
throwforce = 20
+ var/datum/effect/effect/system/spark_spread/spark_system
/obj/item/weapon/katana/energy/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(!user || !target)
return
if(proximity_flag)
- target.emag_act()
- user.visible_message("[user] masterfully slices [target]!", "You masterfully slice [target]!")
- playsound(user, "sparks", 50, 1)
- playsound(user, 'sound/weapons/blade1.ogg', 50, 1)
+ if(isobj(target) || issilicon(target))
+ spark_system.start()
+ playsound(user, "sparks", 50, 1)
+ playsound(user, 'sound/weapons/blade1.ogg', 50, 1)
+ target.emag_act(user)
+
+//If we hit the Ninja who owns this Katana, they catch it.
+//Works for if the Ninja throws it or it throws itself or someone tries
+//To throw it at the ninja
+/obj/item/weapon/katana/energy/throw_impact(atom/hit_atom)
+ if(ishuman(hit_atom))
+ var/mob/living/carbon/human/H = hit_atom
+ if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja))
+ var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit
+ if(SN.energyKatana == src)
+ returnToOwner(H, 0, 1)
+ return
+
+ ..()
+
+/obj/item/weapon/katana/energy/proc/returnToOwner(var/mob/living/carbon/human/user, var/doSpark = 1, var/caught = 0)
+ if(!istype(user))
+ return
+ loc = get_turf(src)
+
+ if(doSpark)
+ spark_system.start()
+ playsound(get_turf(src), "sparks", 50, 1)
+
+ var/msg = ""
+
+ if(user.put_in_hands(src))
+ msg = "Your Energy Katana teleports into your hand!"
+ else if(user.equip_to_slot_if_possible(src, slot_belt, 0, 1, 1))
+ msg = "Your Energy Katana teleports back to you, sheathing itself as it does so!"
+ else
+ loc = get_turf(user)
+ msg = "Your Energy Katana teleports to your location!"
+
+ if(caught)
+ if(loc == user)
+ msg = "You catch your Energy Katana!"
+ else
+ msg = "Your Energy Katana lands at your feet!"
+
+ if(msg)
+ user << "[msg]"
+
+/obj/item/weapon/katana/energy/New()
+ ..()
+ spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+
+
+/obj/item/weapon/katana/energy/Del()
+ qdel(spark_system)
+ spark_system = null
+ ..()
+
+/obj/item/weapon/katana/energy/Destroy()
+ qdel(spark_system)
+ spark_system = null
+ return ..()
\ No newline at end of file
diff --git a/code/modules/ninja/ninja_event.dm b/code/modules/ninja/ninja_event.dm
index 47251f6f556..c2f42a9bd39 100644
--- a/code/modules/ninja/ninja_event.dm
+++ b/code/modules/ninja/ninja_event.dm
@@ -193,15 +193,19 @@ proc/create_ninja_mind(key)
qdel(gloves)
var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
+ var/obj/item/clothing/suit/space/space_ninja/theSuit = new(src)
+ var/obj/item/weapon/katana/energy/EK = new(src)
+ theSuit.energyKatana = EK
+
equip_to_slot_or_del(R, slot_ears)
equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(src), slot_shoes)
- equip_to_slot_or_del(new /obj/item/clothing/suit/space/space_ninja(src), slot_wear_suit)
+ equip_to_slot_or_del(theSuit, slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses)
- equip_to_slot_or_del(new /obj/item/weapon/katana/energy(src), slot_belt)
+ equip_to_slot_or_del(EK, slot_belt)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store)
diff --git a/code/modules/ninja/suit/SpiderOS.dm b/code/modules/ninja/suit/SpiderOS.dm
deleted file mode 100644
index f73a6cbc3d0..00000000000
--- a/code/modules/ninja/suit/SpiderOS.dm
+++ /dev/null
@@ -1,277 +0,0 @@
-
-
-//HERE BE A VERY LARGE DRAGON
-
-/obj/item/clothing/suit/space/space_ninja/proc/spideros()
- set name = "Display SpiderOS"
- set desc = "Utilize built-in computer system."
- set category = "Ninja Equip"
-
- if(!s_busy)
- display_spideros()
- else
- affecting << "The interface is locked!"
-
-
-/obj/item/clothing/suit/space/space_ninja/proc/display_spideros()
- if(!affecting) return//If no mob is wearing the suit. I almost forgot about this variable.
- var/mob/living/carbon/human/U = affecting
- var/display_to = U//Who do we want to display certain messages to?
-
- var/dat = "SpiderOS"
- dat += "
Refresh"
- if(spideros)
- dat += " |
Return"
- dat += " |
Close"
- dat += "
"
- dat += "SpiderOS v.1.337
"
- dat += "Welcome, [U.real_name].
"
- dat += "
"
- dat += "
Current Time: [worldtime2text()]
"
- dat += "
Battery Life: [round(cell.charge/100)]%
"
- dat += "
Smoke Bombs: \Roman [s_bombs]
"
- dat += "
"
-
- switch(spideros)
- if(0)
- dat += "
Available Functions:
"
- dat += ""
- if(3)
- dat += "
Medical Report:
"
- if(U.dna)
- dat += "Fingerprints: [md5(U.dna.uni_identity)]
"
- dat += "Unique identity: [U.dna.unique_enzymes]
"
- dat += "Overall Status: [U.stat > 1 ? "dead" : "[U.health]% healthy"]
"
- dat += "Nutrition Status: [U.nutrition]
"
- dat += "Oxygen loss: [U.getOxyLoss()]"
- dat += " | Toxin levels: [U.getToxLoss()]
"
- dat += "Burn severity: [U.getFireLoss()]"
- dat += " | Brute trauma: [U.getBruteLoss()]
"
- dat += "Radiation Level: [U.radiation] rad
"
- dat += "Body Temperature: [U.bodytemperature-T0C]°C ([U.bodytemperature*1.8-459.67]°F)
"
-
- for(var/datum/disease/D in U.viruses)
- dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread_text]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure_text].
"
- dat += ""
- if(1)
- dat += "
Atmospheric Scan:
"//Headers don't need breaks. They are automatically placed.
- var/turf/T = get_turf(U.loc)
- if (isnull(T))
- dat += "Unable to obtain a reading."
- else
- var/datum/gas_mixture/environment = T.return_air()
-
- var/pressure = environment.return_pressure()
- var/total_moles = environment.total_moles()
-
- dat += "Air Pressure: [round(pressure,0.1)] kPa"
-
- if (total_moles)
- var/o2_level = environment.oxygen/total_moles
- var/n2_level = environment.nitrogen/total_moles
- var/co2_level = environment.carbon_dioxide/total_moles
- var/plasma_level = environment.toxins/total_moles
- var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level)
- dat += ""
- dat += "- Nitrogen: [round(n2_level*100)]%
"
- dat += "- Oxygen: [round(o2_level*100)]%
"
- dat += "- Carbon Dioxide: [round(co2_level*100)]%
"
- dat += "- Plasma: [round(plasma_level*100)]%
"
- dat += "
"
- if(unknown_level > 0.01)
- dat += "OTHER: [round(unknown_level)]%
"
-
- dat += "Temperature: [round(environment.temperature-T0C)]°C"
- if(2)
- dat += "
Anonymous Messenger:
"//Anonymous because the receiver will not know the sender's identity.
- dat += "
Detected PDAs:
"
- dat += ""
- var/count = 0
- for (var/obj/item/device/pda/P in get_viewable_pdas())
- dat += "- [P]"
- dat += "
"
- count++
- dat += "
"
- if (count == 0)
- dat += "None detected.
"
- if(4)
- dat += {"
-
Ninja Manual:
- Who they are:
- Space ninjas are a special type of ninja, specifically one of the space-faring type. The vast majority of space ninjas belong to the Spider Clan, a cult-like sect, which has existed for several hundred years. The Spider Clan practice a sort of augmentation of human flesh in order to achieve a more perfect state of being and follow Postmodern Space Bushido. They also kill people for money. Their leaders are chosen from the oldest of the grand-masters, people that have lived a lot longer than any mortal man should.
Being a sect of technology-loving fanatics, the Spider Clan have the very best to choose from in terms of hardware--cybernetic implants, exoskeleton rigs, hyper-capacity batteries, and you get the idea. Some believe that much of the Spider Clan equipment is based on reverse-engineered alien technology while others doubt such claims.
Whatever the case, their technology is absolutely superb.
- How they relate to other SS13 organizations:
-
- - *Nanotrasen and the Syndicate are two sides of the same coin and that coin is valuable.
- - *The Space Wizard Federation is a problem, mainly because they are an extremely dangerous group of unpredictable individuals--not to mention the wizards hate technology and are in direct opposition of the Spider Clan. Best avoided or left well-enough alone. How to battle: wizards possess several powerful abilities to steer clear off. Blind in particular is a nasty spell--jaunt away if you are blinded and never approach a wizard in melee. Stealth may also work if the wizard is not wearing thermal scanners--don't count on this. Run away if you feel threatened and await a better opportunity.
- - *Changeling Hivemind: extremely dangerous and to be killed on sight. How to battle: they will likely try to absorb you. Adrenaline boost, then phase shift into them. If you get stung, use SpiderOS to inject counter-agents. Stealth may also work but detecting a changeling is the real battle.
- - *Xeno Hivemind: their skulls make interesting kitchen decorations and are challenging to best, especially in larger nests. How to battle: they can see through your stealth guise and energy stars will not work on them. Best killed with a Phase Shift or at range. If you happen on a projectile stun weapon, use it and then close in to melee.
-
- The reason they (you) are here:
- Space ninjas are renowned throughout the known controlled space as fearless spies, infiltrators, and assassins. They are sent on missions of varying nature by Nanotrasen, the Syndicate, and other shady organizations and people. To hire a space ninja means serious business.
- Their playstyle:
- A mix of traitor, changeling, and wizard. Ninjas rely on energy, or electricity to be precise, to keep their suits running (when out of energy, a suit hibernates). Suits gain energy from objects or creatures that contain electrical charge. APCs, cell batteries, rechargers, SMES batteries, cyborgs, mechs, and exposed wires are currently supported. Through energy ninjas gain access to special powers--while all powers are tied to the ninja suit, the most useful of them are verb activated--to help them in their mission.
It is a constant struggle for a ninja to remain hidden long enough to recharge the suit and accomplish their objective; despite their arsenal of abilities, ninjas can die like any other. Unlike wizards, ninjas do not possess good crowd control and are typically forced to play more subdued in order to achieve their goals. Some of their abilities are specifically designed to confuse and disorient others.
With that said, it should be perfectly possible to completely flip the fuck out and rampage as a ninja.
- Their powers:
- There are two primary types: Equipment and Abilties. Passive effect are always on. Active effect must be turned on and remain active only when there is energy to do so. Ability costs are listed next to them.
- Equipment: cannot be tracked by AI (passive), faster speed (passive), stealth (active), vision switch (passive if toggled), voice masking (passive), SpiderOS (passive if toggled), energy drain (passive if toggled).
-
- - Voice masking generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.
- - Toggling vision cycles to one of the following: thermal, meson, or darkness vision. The starting mode allows one to scout the identity of those in view, revealing their role. Traitors, revolutionaries, wizards, and other such people will be made known to you.
- - Stealth, when activated, drains more battery charge and works similarly to a syndicate cloak. The cloak will deactivate when most Abilities are utilized.
- - On-board AI: The suit is able to download an AI much like an intellicard. Check with SpiderOS for details once downloaded.
- - SpiderOS is a specialized, PDA-like screen that allows for a small variety of functions, such as injecting healing chemicals directly from the suit. You are using it now, if that was not already obvious. You may also download AI modules directly to the OS.
-
- Abilities:
-
- - *Phase Shift (2000E) and Phase Jaunt (1000E) are unique powers in that they can both be used for defense and offense. Jaunt launches the ninja forward facing up to 9 squares, somewhat randomly selecting the final destination. Shift can only be used on turf in view but is precise (cannot be used on walls). Any living mob in the area teleported to is instantly gibbed (mechs are damaged, huggers and other similar critters are killed). It is possible to teleport with a target, provided you grab them before teleporting.
- - *Energy Blade (500E) is a highly effective weapon. It is summoned directly to the ninja's hand and can also function as an EMAG for certain objects (doors/lockers/etc). You may also use it to cut through walls and disabled doors. Experiment! The blade will crit humans in two hits. This item cannot be placed in containers and when dropped or thrown disappears. Having an energy blade drains more power from the battery each tick.
- - *EM Pulse (2500E) is a highly useful ability that will create an electromagnetic shockwave around the ninja, disabling technology whenever possible. If used properly it can render a security force effectively useless. Of course, getting beat up with a toolbox is not accounted for.
- - *Energy Star (500E) is a ninja star made of green energy AND coated in poison. It works by picking a random living target within range and can be spammed to great effect in incapacitating foes. Just remember that the poison used is also used by the Xeno Hivemind (and will have no effect on them).
- - *Energy Net (2000E) is a non-lethal solution to incapacitating humanoids. The net is made of non-harmful phase energy and will halt movement as long as it remains in effect--it can be destroyed. If the net is not destroyed, after a certain time it will teleport the target to a holding facility for the Spider Clan and then vanish. You will be notified if the net fails or succeeds in capturing a target in this manner. Combine with energy stars or stripping to ensure success. Abduction never looked this leet.
- - *Adrenaline Boost (1 E. Boost/3) recovers the user from stun, weakness, and paralysis. Also injects 20 units of radium into the bloodstream.
- - *Smoke Bomb (1 Sm.Bomb/10) is a weak but potentially useful ability. It creates harmful smoke and can be used in tandem with other powers to confuse enemies.
- - *???: unleash the True Ultimate Power!
- IMPORTANT:
-
- - *Make sure to toggle Special Interaction from the Ninja Equipment menu to interact differently with certain objects.
- - *Your starting power cell can be replaced if you find one with higher maximum energy capacity by clicking on your suit with the higher capacity cell.
- - *Conserve your energy. Without it, you are very vulnerable.
-
- That is all you will need to know. The rest will come with practice and talent. Good luck!
- Master /N
- "}
- if(6)
- dat += {"
-
Activate Abilities:
-
- "}
- if(7)
- dat += "
Research Stored:
"
- if(t_disk)
- dat += "Eject Disk
"
- dat += ""
- if(istype(stored_research,/list))//If there is stored research. Should be but just in case.
- for(var/datum/tech/current_data in stored_research)
- dat += "- "
- dat += "[current_data.name]: [current_data.level]"
- if(t_disk)//If there is a disk inserted. We can either write or overwrite.
- dat += " *Copy to Disk
"
- dat += " "
- dat += "
"
- dat += ""
-
- //Setting the can>resize etc to 0 remove them from the drag bar but still allows the window to be draggable.
- display_to << browse(dat,"window=spideros;size=400x444;border=1;can_resize=1;can_close=0;can_minimize=0")
-
-//=======//SPIDEROS TOPIC PROC//=======//
-
-/obj/item/clothing/suit/space/space_ninja/Topic(href, href_list)
- ..()
- var/mob/living/carbon/human/U = affecting
- var/display_to = U
-
-
- if(!affecting||U.stat||!s_initialized)//Check to make sure the guy is wearing the suit after clicking and it's on.
- U << "Your suit must be worn and active to use this function."
- U << browse(null, "window=spideros")//Closes the window.
- return
-
- switch(href_list["choice"])
- if("Close")
- display_to << browse(null, "window=spideros")
- return
- if("Refresh")//Refresh, goes to the end of the proc.
- if("Return")//Return
- if(spideros<=9)
- spideros=0
- else
- spideros = round(spideros/10)//Best way to do this, flooring to nearest integer.
-
- if("Message")
- var/obj/item/device/pda/P = locate(href_list["target"])
- var/t = input(U, "Please enter untraceable message.") as text
- t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
- if(!t||U.stat||U.wear_suit!=src||!s_initialized)//Wow, another one of these. Man...
- display_to << browse(null, "window=spideros")
- return
- if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists.
- display_to << "Error: unable to deliver message."
- display_spideros()
- return
- P.tnote += "← From an unknown source:
[t]
"
- if (!P.silent)
- playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
- P.audible_message("\icon[P] *[P.ttone]*", null, 3)
- P.overlays.Cut()
- P.overlays += image('icons/obj/pda.dmi', "pda-r")
-
- if("Inject")
- if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left.
- display_to << "Error: the suit cannot perform this function. Out of [href_list["name"]]."
- else
- reagents.reaction(U, 2)
- reagents.trans_id_to(U, href_list["tag"], href_list["tag"]=="nutriment"?5:a_transfer)//Nutriment is a special case since it's very potent. Shouldn't influence actual refill amounts or anything.
- display_to << "Injecting..."
- U << "You feel a tiny prick and a sudden rush of substance in to your veins."
-
- if("Trigger Ability")
- var/ability_name = href_list["name"]+href_list["cost"]//Adds the name and cost to create the full proc name.
- var/proc_arguments//What arguments to later pass to the proc, if any.
- var/list/targets = list()//To later check for.
- var/safety = 0//To later make sure we're triggering the proc when needed.
- switch(href_list["name"])//Special case.
- if("Phase Shift")
- safety = 1
- for(var/turf/T in oview(5,loc))
- targets.Add(T)
- if("Energy Net")
- safety = 1
- for(var/mob/living/carbon/M in oview(5,loc))
- targets.Add(M)
- if(targets.len)//Let's create an argument for the proc if needed.
- proc_arguments = pick(targets)
- safety = 0
- if(!safety)
- U << "[href_list["name"]] suddenly triggered!"
- call(src,ability_name)(proc_arguments)
-
- if("Eject Disk")
- var/turf/T = get_turf(loc)
- if(!U.get_active_hand())
- U.put_in_hands(t_disk)
- t_disk.add_fingerprint(U)
- t_disk = null
- else
- if(T)
- t_disk.loc = T
- t_disk = null
- else
- U << "ERROR: Could not eject disk."
-
- if("Copy to Disk")
- var/datum/tech/current_data = locate(href_list["target"])
- U << "[current_data.name] successfully [(!t_disk.stored) ? "copied" : "overwritten"] to disk."
- t_disk.stored = current_data
-
-
- display_spideros()//Refreshes the screen by calling it again (which replaces current screen with new screen).
- return
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 3f23ac333e2..13d52efec9a 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -10,8 +10,16 @@
...
I guess you're a little cool.
-Sayu
+
+
+ see ninjaDrainAct.dm for ninjadrain_act()
+ Touch() simply calls this on it's target now
+ Ninja's electricuting people when?
+ -Remie
+
*/
+
/obj/item/clothing/gloves/space_ninja
desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance."
name = "ninja gloves"
@@ -28,303 +36,39 @@
var/mindrain = 200
var/maxdrain = 400
-/*
- This runs the gamut of what ninja gloves can do
- The other option would be a dedicated ninja touch bullshit proc on everything
- which would probably more efficient, but ninjas are pretty rare.
- This was mostly introduced to keep ninja code from contaminating other code;
- with this in place it would be easier to untangle the rest of it.
- For the drain proc, see events/ninja.dm
-*/
/obj/item/clothing/gloves/space_ninja/Touch(var/atom/A,var/proximity)
if(!candrain || draining)
return 0
+ if(!istype(loc, /mob/living/carbon/human))
+ return 0 //Only works while worn
+
var/mob/living/carbon/human/H = loc
- if(!istype(H))
- return 0 // what
+
var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit
if(!istype(suit))
return 0
if(isturf(A))
return 0
- if(!proximity) // todo: you could add ninja stars or computer hacking here
+ if(!proximity)
return 0
A.add_fingerprint(H)
- // steal energy from powered things
- if(istype(A,/mob/living/silicon/robot))
- drain("CYBORG",A,suit)
- return 1
+ draining = 1
+ var/drained = A.ninjadrain_act(suit,H,src)
+ draining = 0
- if(istype(A, /obj/item/weapon/stock_parts/cell))
- drain("CELL", A,suit)
- return 1
+ if(isnum(drained)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
+ if(drained)
+ H << "Gained [drained] energy from \the [A]."
+ else
+ H << "\The [A] has run dry of power, you must find another source!"
+ else
+ drained = 0 //as to not cancel attack_hand()
- if(istype(A,/obj/machinery/power/apc))
- drain("APC",A,suit)
- return 1
-
- if(istype(A,/obj/structure/cable))
- drain("WIRE",A,suit)
- return 1
-
- if(istype(A,/obj/structure/grille))
- var/obj/structure/cable/C = locate() in A.loc
- if(C)
- drain("WIRE",C,suit)
- return 1
-
- if(istype(A,/obj/machinery/power/smes))
- drain("SMES",A,suit)
- return 1
-
- if(istype(A,/obj/mecha))
- drain("MECHA",A,suit)
- return 1
-
- if(istype(A,/obj/machinery/computer/rdconsole)) // download research
- drain("RESEARCH",A,suit)
- return 1
-
- if(istype(A,/obj/machinery/r_n_d/server))
- A.add_fingerprint(H)
- var/obj/machinery/r_n_d/server/S = A
- if(S.disabled)
- return 1
- if(S.shocked)
- S.shock(H,50)
- return 1
- drain("RESEARCH",A,suit)
- return 1
-
-
-/obj/item/clothing/gloves/space_ninja/proc/drain(target_type as text, target, obj/suit)
- //Var Initialize
- var/obj/item/clothing/suit/space/space_ninja/S = suit
- var/mob/living/carbon/human/U = S.affecting
- var/obj/item/clothing/gloves/space_ninja/G = S.n_gloves
-
- var/drain = 0//To drain from battery.
- var/maxcapacity = 0//Safety check for full battery.
- var/totaldrain = 0//Total energy drained.
-
- G.draining = 1
-
- if(target_type!="RESEARCH")//I lumped research downloading here for ease of use.
- U << "Now charging battery..."
-
- switch(target_type)
-
- if("APC")
- var/obj/machinery/power/apc/A = target
- if(A.cell&&A.cell.charge)
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, A.loc)
- while(G.candrain&&A.cell.charge>0&&!maxcapacity)
- drain = rand(G.mindrain,G.maxdrain)
- if(A.cell.chargeS.cell.maxcharge)
- drain = S.cell.maxcharge-S.cell.charge
- maxcapacity = 1//Reached maximum battery capacity.
- if (do_after(U,10))
- spark_system.start()
- playsound(A.loc, "sparks", 50, 1)
- A.cell.charge-=drain
- S.cell.charge+=drain
- totaldrain+=drain
- else break
- U << "Gained [totaldrain] energy from the APC."
- if(!A.emagged)
- flick("apc-spark", src)
- A.emagged = 1
- A.locked = 0
- A.update_icon()
- else
- U << "This APC has run dry of power. You must find another source."
-
- if("SMES")
- var/obj/machinery/power/smes/A = target
- if(A.charge)
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, A.loc)
- while(G.candrain&&A.charge>0&&!maxcapacity)
- drain = rand(G.mindrain,G.maxdrain)
- if(A.chargeS.cell.maxcharge)
- drain = S.cell.maxcharge-S.cell.charge
- maxcapacity = 1
- if (do_after(U,10))
- spark_system.start()
- playsound(A.loc, "sparks", 50, 1)
- A.charge-=drain
- S.cell.charge+=drain
- totaldrain+=drain
- else break
- U << "Gained [totaldrain] energy from the SMES cell."
- else
- U << "This SMES cell has run dry of power. You must find another source."
-
- if("CELL")
- var/obj/item/weapon/stock_parts/cell/A = target
- if(A.charge)
- if (G.candrain&&do_after(U,30))
- U << "Gained [A.charge] energy from the cell."
- if(S.cell.charge+A.charge>S.cell.maxcharge)
- S.cell.charge=S.cell.maxcharge
- else
- S.cell.charge+=A.charge
- A.charge = 0
- G.draining = 0
- A.corrupt()
- A.updateicon()
- else
- U << "Procedure interrupted. Protocol terminated."
- else
- U << "This cell is empty and of no use."
-
- if("MACHINERY")//Can be applied to generically to all powered machinery. I'm leaving this alone for now.
- var/obj/machinery/A = target
- if(A.powered())//If powered.
-
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, A.loc)
-
- var/area/A_Area = get_area(A)
- var/obj/machinery/power/apc/B = A_Area.get_apc() //find APC
- if(B)//If APC exists. Might not if the area is unpowered like Centcom.
- var/datum/powernet/PN = B.terminal.powernet
- while(G.candrain&&!maxcapacity&&!isnull(A))//And start a proc similar to drain from wire.
- drain = rand(G.mindrain,G.maxdrain)
- var/drained = 0
- if(PN&&do_after(U,10))
- drained = min(drain, PN.avail)
- PN.load += drained
- if(drained < drain)//if no power on net, drain apcs
- for(var/obj/machinery/power/terminal/T in PN.nodes)
- if(istype(T.master, /obj/machinery/power/apc))
- var/obj/machinery/power/apc/AP = T.master
- if(AP.operating && AP.cell && AP.cell.charge>0)
- AP.cell.charge = max(0, AP.cell.charge - 5)
- drained += 5
- else break
- S.cell.charge += drained
- if(S.cell.charge>S.cell.maxcharge)
- totaldrain += (drained-(S.cell.charge-S.cell.maxcharge))
- S.cell.charge = S.cell.maxcharge
- maxcapacity = 1
- else
- totaldrain += drained
- spark_system.start()
- if(drained==0) break
- U << "Gained [totaldrain] energy from the power network."
- else
- U << "Power network could not be found. Aborting."
- else
- U << "This recharger is not providing energy. You must find another source."
-
- if("RESEARCH")
- var/obj/machinery/A = target
- U << "Hacking \the [A]..."
- spawn(0)
- var/turf/location = get_turf(U)
- for(var/mob/living/silicon/ai/AI in player_list)
- AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]."
- if(A:files&&A:files.known_tech.len)
- for(var/datum/tech/current_data in S.stored_research)
- U << "Checking \the [current_data.name] database."
- if(do_after(U, S.s_delay)&&G.candrain&&!isnull(A))
- for(var/datum/tech/analyzing_data in A:files.known_tech)
- if(current_data.id==analyzing_data.id)
- if(analyzing_data.level>current_data.level)
- U << "Database: UPDATED."
- current_data.level = analyzing_data.level
- break//Move on to next.
- else break//Otherwise, quit processing.
- U << "Data analyzed. Process finished."
-
- if("WIRE")
- var/obj/structure/cable/A = target
- var/datum/powernet/PN = A.powernet
- while(G.candrain&&!maxcapacity&&!isnull(A))
- drain = (round((rand(G.mindrain,G.maxdrain))/2))
- var/drained = 0
- if(PN&&do_after(U,10))
- drained = min(drain, PN.avail)
- PN.load += drained
- if(drained < drain)//if no power on net, drain apcs
- for(var/obj/machinery/power/terminal/T in PN.nodes)
- if(istype(T.master, /obj/machinery/power/apc))
- var/obj/machinery/power/apc/AP = T.master
- if(AP.operating && AP.cell && AP.cell.charge>0)
- AP.cell.charge = max(0, AP.cell.charge - 5)
- drained += 5
- else break
- S.cell.charge += drained
- if(S.cell.charge>S.cell.maxcharge)
- totaldrain += (drained-(S.cell.charge-S.cell.maxcharge))
- S.cell.charge = S.cell.maxcharge
- maxcapacity = 1
- else
- totaldrain += drained
- S.spark_system.start()
- if(drained==0) break
- U << "Gained [totaldrain] energy from the power network."
-
- if("MECHA")
- var/obj/mecha/A = target
- A.occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.")
- if(A.get_charge())
- while(G.candrain&&A.cell.charge>0&&!maxcapacity)
- drain = rand(G.mindrain,G.maxdrain)
- if(A.cell.chargeS.cell.maxcharge)
- drain = S.cell.maxcharge-S.cell.charge
- maxcapacity = 1
- if (do_after(U,10))
- A.spark_system.start()
- playsound(A.loc, "sparks", 50, 1)
- A.cell.use(drain)
- S.cell.charge+=drain
- totaldrain+=drain
- else break
- U << "Gained [totaldrain] energy from [src]."
- else
- U << "The exosuit's battery has run dry. You must find another source of power."
-
- if("CYBORG")
- var/mob/living/silicon/robot/A = target
- A << "Warning: Unauthorized access through sub-route 12, block C, detected."
- G.draining = 1
- if(A.cell&&A.cell.charge)
- while(G.candrain&&A.cell.charge>0&&!maxcapacity)
- drain = rand(G.mindrain,G.maxdrain)
- if(A.cell.chargeS.cell.maxcharge)
- drain = S.cell.maxcharge-S.cell.charge
- maxcapacity = 1
- if (do_after(U,10))
- A.spark_system.start()
- playsound(A.loc, "sparks", 50, 1)
- A.cell.charge-=drain
- S.cell.charge+=drain
- totaldrain+=drain
- else break
- U << "Gained [totaldrain] energy from [A]."
- else
- U << "Their battery has run dry of power. You must find another source."
-
- else//Else nothing :<
-
- G.draining = 0
-
- return
+ return drained
/obj/item/clothing/gloves/space_ninja/proc/toggled()
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index 86d1cc128f8..ed6c7236267 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -39,6 +39,9 @@ It is possible to destroy the net by the occupant or someone else.
var/check = 30//30 seconds before teleportation. Could be extended I guess.
var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
//The person can still try and attack the net when inside.
+
+ M.notransform = 1 //No moving for you!
+
while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed.
check--
sleep(10)
@@ -47,6 +50,7 @@ It is possible to destroy the net by the occupant or someone else.
if(!isnull(master))//As long as they still exist.
master << "ERROR: unable to locate \the [mob_name]. Procedure terminated."
qdel(src)//Get rid of the net.
+ M.notransform = 0
return
if(!isnull(src))//As long as both net and person exist.
@@ -82,11 +86,11 @@ It is possible to destroy the net by the occupant or someone else.
if(!isnull(master))//As long as they still exist.
master << "SUCCESS: transport procedure of \the [affecting] complete."
-
- M.anchored = 0//Important.
+ M.notransform = 0
else//And they are free.
M << "You are free of the net!"
+ M.notransform = 0
return
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 0a28094ca91..428f417ca44 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -16,7 +16,6 @@
return
spawn(0)
H.Beam(C,"n_beam",,15)
- C.anchored = 1//Anchors them so they can't move.
H.say("Get over here!")
var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc)
E.layer = C.layer+1//To have it appear one layer above the mob.
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
index 9196ed92be7..1fa003fa76a 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
@@ -1,33 +1,23 @@
-//Shoots ninja stars at a random target
+//Creates a throwing star
/obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
- set name = "Energy Star (5E)"
- set desc = "Launches an energy star at a random living target."
+ set name = "Create Throwing Stars (1E)"
+ set desc = "Creates some throwing stars"
set category = "Ninja Ability"
set popup_menu = 0
- if(!ninjacost(50))
+ if(!ninjacost(10))
var/mob/living/carbon/human/H = affecting
- var/list/targets = list()
- for(var/mob/living/M in oview(loc))
- if(M.stat) continue//Doesn't target corpses or paralyzed persons.
- targets.Add(M)
- if(targets.len)
- var/mob/living/target=pick(targets)//The point here is to pick a random, living mob in oview to shoot stuff at.
+ var/slot = H.hand ? slot_l_hand : slot_r_hand
- var/turf/curloc = get_turf(H)
- var/turf/targloc = get_turf(target)
- if (!targloc || !curloc)
- return
- if (targloc == curloc)
- return
- var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(curloc)
- A.current = curloc
- A.yo = targloc.y - curloc.y
- A.xo = targloc.x - curloc.x
+ if(H.equip_to_slot_or_del(new /obj/item/weapon/throwing_star/ninja(H), slot))
+ H << "A throwing star has been created in your hand!"
- A.fire()
- else
- H << "There are no targets in view."
- return
+ H.throw_mode_on() //So they can quickly throw it.
+
+
+/obj/item/weapon/throwing_star/ninja
+ name = "ninja throwing star"
+ throwforce = 30
+ embedded_pain_multiplier = 6
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
new file mode 100644
index 00000000000..c117cd40d8e
--- /dev/null
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
@@ -0,0 +1,48 @@
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall()
+ set name = "Recall Energy Katana (Variable Cost)"
+ set desc = "Teleports the Energy Katana linked to this suit to it's wearer, cost based on distance."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ var/mob/living/carbon/human/H = affecting
+
+ var/cost = 0
+ var/inview = 1
+
+ if(!energyKatana)
+ H << "Could not locate Energy Katana!"
+ return
+
+ if(energyKatana in H)
+ return
+
+ var/distance = get_dist(H,energyKatana)
+
+ if(!(energyKatana in view(H)))
+ cost = distance //Actual cost is cost x 10, so 5 turfs is 50 cost.
+ inview = 0
+
+ if(!ninjacost(cost))
+ if(istype(energyKatana.loc, /mob/living/carbon))
+ var/mob/living/carbon/C = energyKatana.loc
+ C.unEquip(energyKatana)
+
+ //Somebody swollowed my sword, probably the clown doing a circus act.
+ if(energyKatana in C.stomach_contents)
+ C.stomach_contents -= energyKatana
+
+ if(energyKatana in C.internal_organs)
+ C.internal_organs -= energyKatana
+
+ energyKatana.loc = get_turf(energyKatana)
+
+ if(inview) //If we can see the katana, throw it towards ourselves, damaging people as we go.
+ energyKatana.spark_system.start()
+ playsound(H, "sparks", 50, 1)
+ H.visible_message("\the [energyKatana] flies towards [H]!","You hold out your hand and \the [energyKatana] flies towards you!")
+ energyKatana.throw_at(H, distance+1, energyKatana.throw_speed)
+
+ else //Else just TP it to us.
+ energyKatana.returnToOwner(H,1)
+
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
new file mode 100644
index 00000000000..71f729da249
--- /dev/null
+++ b/code/modules/ninja/suit/ninjaDrainAct.dm
@@ -0,0 +1,285 @@
+
+/*
+
+Contents:
+- Assorted ninjadrain_act() procs
+- What is Object Oriented Programming
+
+They *could* go in their appropriate files, but this is supposed to be modular
+
+*/
+
+
+//Needs to return the amount drained from the atom, if no drain on a power object, return 0, otherwise, return a define.
+/atom/proc/ninjadrain_act()
+ return INVALID_DRAIN
+
+
+
+
+//APC//
+/obj/machinery/power/apc/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ var/maxcapacity = 0 //Safety check for batteries
+ var/drain = 0 //Drain amount from batteries
+
+ . = 0
+
+ if(cell && cell.charge)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, loc)
+
+ while(G.candrain && cell.charge> 0 && !maxcapacity)
+ drain = rand(G.mindrain, G.maxdrain)
+
+ if(cell.charge < drain)
+ drain = cell.charge
+
+ if(S.cell.charge + drain > S.cell.maxcharge)
+ drain = S.cell.maxcharge - S.cell.charge
+ maxcapacity = 1//Reached maximum battery capacity.
+
+ if (do_after(H,10))
+ spark_system.start()
+ playsound(loc, "sparks", 50, 1)
+ cell.charge -= drain
+ S.cell.charge += drain
+ . += drain
+ else
+ break
+
+ if(!emagged)
+ flick("apc-spark", G)
+ emagged = 1
+ locked = 0
+ update_icon()
+
+
+
+
+
+//SMES//
+/obj/machinery/power/smes/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ var/maxcapacity = 0 //Safety check for batteries
+ var/drain = 0 //Drain amount from batteries
+
+ . = 0
+
+ if(charge)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, loc)
+
+ while(G.candrain && charge > 0 && !maxcapacity)
+ drain = rand(G.mindrain, G.maxdrain)
+
+ if(charge < drain)
+ drain = charge
+
+ if(S.cell.charge + drain > S.cell.maxcharge)
+ drain = S.cell.maxcharge - S.cell.charge
+ maxcapacity = 1
+
+ if (do_after(H,10))
+ spark_system.start()
+ playsound(loc, "sparks", 50, 1)
+ charge -= drain
+ S.cell.charge += drain
+ . += drain
+
+ else
+ break
+
+
+//CELL//
+/obj/item/weapon/stock_parts/cell/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ . = 0
+
+ if(charge)
+ if(G.candrain && do_after(H,30))
+ . = charge
+ if(S.cell.charge + charge > S.cell.maxcharge)
+ S.cell.charge = S.cell.maxcharge
+ else
+ S.cell.charge += charge
+ charge = 0
+ corrupt()
+ updateicon()
+
+
+//RDCONSOLE//
+/obj/machinery/computer/rdconsole/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ . = DRAIN_RD_HACK_FAILED
+
+ H << "Hacking \the [src]..."
+ spawn(0)
+ var/turf/location = get_turf(H)
+ for(var/mob/living/silicon/ai/AI in player_list)
+ AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]."
+
+ if(files && files.known_tech.len)
+ for(var/datum/tech/current_data in S.stored_research)
+ H << "Checking \the [current_data.name] database."
+ if(do_after(H, S.s_delay) && G.candrain && src)
+ for(var/datum/tech/analyzing_data in files.known_tech)
+ if(current_data.id == analyzing_data.id)
+ if(analyzing_data.level > current_data.level)
+ H << "Database: UPDATED."
+ current_data.level = analyzing_data.level
+ . = DRAIN_RD_HACKED
+ break//Move on to next.
+ else
+ break//Otherwise, quit processing.
+
+ H << "Data analyzed. Process finished."
+
+
+//RD SERVER//
+//Shamelessly copypasted from above, since these two used to be the same proc, but with MANY colon operators
+/obj/machinery/r_n_d/server/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ . = DRAIN_RD_HACK_FAILED
+
+ H << "Hacking \the [src]..."
+ spawn(0)
+ var/turf/location = get_turf(H)
+ for(var/mob/living/silicon/ai/AI in player_list)
+ AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]."
+
+ if(files && files.known_tech.len)
+ for(var/datum/tech/current_data in S.stored_research)
+ H << "Checking \the [current_data.name] database."
+ if(do_after(H, S.s_delay) && G.candrain && src)
+ for(var/datum/tech/analyzing_data in files.known_tech)
+ if(current_data.id == analyzing_data.id)
+ if(analyzing_data.level > current_data.level)
+ H << "Database: UPDATED."
+ current_data.level = analyzing_data.level
+ . = DRAIN_RD_HACKED
+ break//Move on to next.
+ else
+ break//Otherwise, quit processing.
+
+ H << "Data analyzed. Process finished."
+
+
+//WIRE//
+/obj/structure/cable/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ var/maxcapacity = 0 //Safety check
+ var/drain = 0 //Drain amount
+
+ . = 0
+
+ var/datum/powernet/PN = powernet
+ while(G.candrain && !maxcapacity && src)
+ drain = (round((rand(G.mindrain, G.maxdrain))/2))
+ var/drained = 0
+ if(PN && do_after(H,10))
+ drained = min(drain, PN.avail)
+ PN.load += drained
+ if(drained < drain)//if no power on net, drain apcs
+ for(var/obj/machinery/power/terminal/T in PN.nodes)
+ if(istype(T.master, /obj/machinery/power/apc))
+ var/obj/machinery/power/apc/AP = T.master
+ if(AP.operating && AP.cell && AP.cell.charge > 0)
+ AP.cell.charge = max(0, AP.cell.charge - 5)
+ drained += 5
+ else
+ break
+
+ S.cell.charge += drained
+ if(S.cell.charge > S.cell.maxcharge)
+ . += (drained-(S.cell.charge - S.cell.maxcharge))
+ S.cell.charge = S.cell.maxcharge
+ maxcapacity = 1
+ else
+ . += drained
+ S.spark_system.start()
+
+//MECH//
+/obj/mecha/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ var/maxcapacity = 0 //Safety check
+ var/drain = 0 //Drain amount
+ . = 0
+
+ occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.")
+ if(get_charge())
+ while(G.candrain && cell.charge > 0 && !maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(cell.charge < drain)
+ drain = cell.charge
+ if(S.cell.charge + drain > S.cell.maxcharge)
+ drain = S.cell.maxcharge - S.cell.charge
+ maxcapacity = 1
+ if (do_after(H,10))
+ spark_system.start()
+ playsound(loc, "sparks", 50, 1)
+ cell.use(drain)
+ S.cell.charge += drain
+ . += drain
+ else
+ break
+
+//BORG//
+/mob/living/silicon/robot/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ var/maxcapacity = 0 //Safety check
+ var/drain = 0 //Drain amount
+ . = 0
+
+ src << "Warning: Unauthorized access through sub-route 12, block C, detected."
+
+ if(cell && cell.charge)
+ while(G.candrain && cell.charge > 0 && !maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(cell.charge < drain)
+ drain = cell.charge
+ if(S.cell.charge+drain > S.cell.maxcharge)
+ drain = S.cell.maxcharge - S.cell.charge
+ maxcapacity = 1
+ if (do_after(H,10))
+ spark_system.start()
+ playsound(loc, "sparks", 50, 1)
+ cell.charge -= drain
+ S.cell.charge += drain
+ . += drain
+ else
+ break
+
+
+//CARBON MOBS//
+/mob/living/carbon/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
+ if(!S || !H || !G)
+ return INVALID_DRAIN
+
+ . = DRAIN_MOB_SHOCK_FAILED
+
+ //Default cell = 10,000 charge, 10,000/1000 = 10 uses without charging/upgrading
+ if(S.cell && S.cell.charge && S.cell.use(1000))
+ . = DRAIN_MOB_SHOCK
+ //Got that electric touch
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, loc)
+ playsound(src, "sparks", 50, 1)
+ visible_message("[H] electrocutes [src] with their touch!", "[H] electrocutes you with their touch!")
+ electrocute_act(25, H)
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index cfe6dc3c807..a1273f10498 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -29,6 +29,7 @@ Contents:
var/list/reagent_list = list("omnizine","salbutamol","spaceacillin","charcoal","nutriment","radium","potass_iodide")//The reagents ids which are added to the suit at New().
var/list/stored_research = list()//For stealing station research.
var/obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk.
+ var/obj/item/weapon/katana/energy/energyKatana //For teleporting the katana back to the ninja (It's an ability)
//Other articles of ninja gear worn together, used to easily reference them after initializing.
var/obj/item/clothing/head/helmet/space/space_ninja/n_hood
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index e7098179d6a..a2683d39d8c 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -20,7 +20,7 @@
return
else if(istype(I, /obj/item/weapon/stock_parts/cell))
- var/obj/item/weapon/stock_parts/cell/CELL
+ var/obj/item/weapon/stock_parts/cell/CELL = I
if(CELL.maxcharge > cell.maxcharge && n_gloves && n_gloves.candrain)
U << "Higher maximum capacity detected.\nUpgrading..."
if (n_gloves && n_gloves.candrain && do_after(U,s_delay))
diff --git a/code/modules/ninja/suit/suit_verbs_handlers.dm b/code/modules/ninja/suit/suit_verbs_handlers.dm
index 17ba1ca3910..24797a272b0 100644
--- a/code/modules/ninja/suit/suit_verbs_handlers.dm
+++ b/code/modules/ninja/suit/suit_verbs_handlers.dm
@@ -11,7 +11,6 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs()
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled
@@ -21,7 +20,6 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
if(n_gloves)
n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
@@ -37,6 +35,7 @@ Contents:
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall
s_initialized=1
slowdown=0
@@ -50,3 +49,4 @@ Contents:
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 4139a3e348c..57606d89072 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -156,7 +156,7 @@
if(pin.pin_auth(user) || pin.emagged)
return 1
else
- user << "INVALID USER."
+ pin.auth_fail(user)
return 0
else
user << "\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!"
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index aa1b315ef26..5fe4cac6f8f 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -107,7 +107,7 @@
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "syndicate LMG"
- desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation."
+ desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
icon_state = "l6closed100"
item_state = "l6closedmag"
w_class = 5
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index a176ec5b55b..92e5326599b 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -1,22 +1,38 @@
/obj/item/device/firing_pin
name = "electronic firing pin"
- desc = "A small authentication device, to be inserted into a firearm reciever to allow operation. NT safety regulations require all new designs to incorporate one."
+ desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one."
icon = 'icons/obj/device.dmi'
icon_state = "firing_pin"
item_state = "pen"
- flags = CONDUCT
+ flags = CONDUCT
w_class = 1
attack_verb = list("poked")
var/emagged = 0
+ var/fail_message = "INVALID USER."
+ var/selfdestruct = 0 // Explode when user check is failed.
+ var/force_replace = 0 // Can forcefully replace other pins.
+ var/pin_removeable = 0 // Can be replaced by any pin.
+ var/obj/item/weapon/gun/gun
+
+
+/obj/item/device/firing_pin/New(newloc)
+ ..()
+ if(istype(newloc, /obj/item/weapon/gun))
+ gun = newloc
/obj/item/device/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(istype(target, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = target
+ if(G.pin && (force_replace || G.pin.pin_removeable))
+ G.pin.loc = get_turf(G)
+ G.pin.gun_remove(user)
+ user << "You remove [G]'s old pin."
+
if(!G.pin)
user.drop_item()
- G.pin = src
- loc = G
+ gun_insert(user, G)
+ user << "You insert [src] into [G]."
else
user << "This firearm already has a firing pin installed."
@@ -25,25 +41,54 @@
emagged = 1
user << "You override the authentication mechanism."
+/obj/item/device/firing_pin/proc/gun_insert(mob/living/user, var/obj/item/weapon/gun/G)
+ gun = G
+ loc = gun
+ gun.pin = src
+ return
+
+/obj/item/device/firing_pin/proc/gun_remove(mob/living/user)
+ gun.pin = null
+ gun = null
+ return
+
/obj/item/device/firing_pin/proc/pin_auth(mob/living/user)
return 1
+/obj/item/device/firing_pin/proc/auth_fail(mob/living/user)
+ user.show_message(fail_message, 1)
+ if(selfdestruct)
+ user.show_message("SELF-DESTRUCTING...
", 1)
+ user << "Your [gun] explodes!"
+ explosion(get_turf(gun), -1, 0, 2, 3)
+ if(gun)
+ qdel(gun)
+
+
+
+/obj/item/device/firing_pin/magic
+ name = "magic crystal shard"
+ desc = "A small enchanted shard which allows magical weapons to fire."
+
+
+// Test pin, works only near firing range.
/obj/item/device/firing_pin/test_range
name = "test-range firing pin"
desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
+ fail_message = "TEST RANGE CHECK FAILED."
+ pin_removeable = 1
/obj/item/device/firing_pin/test_range/pin_auth(mob/living/user)
for(var/obj/machinery/magnetic_controller/M in range(user, 3))
return 1
return 0
-/obj/item/device/firing_pin/magic
- name = "magic crystal shard"
- desc = "A small enchanted shard which allows magical weapons to fire."
+// Implant pin, checks for implant
/obj/item/device/firing_pin/implant
name = "implant-keyed firing pin"
desc = "This is a security firing pin which only authorizes users who are implanted with a certain device."
+ fail_message = "IMPLANT CHECK FAILED."
var/obj/item/weapon/implant/req_implant = null
/obj/item/device/firing_pin/implant/pin_auth(mob/living/user)
@@ -64,19 +109,84 @@
req_implant = /obj/item/weapon/implant/weapons_auth
+
+// Honk pin, clown's joke item.
+// Can replace other pins. Replace a pin in cap's laser for extra fun!
/obj/item/device/firing_pin/clown
name = "hilarious firing pin"
desc = "Advanced clowntech that can convert any firearm into a far more useful object."
color = "yellow"
+ fail_message = "HONK!"
+ force_replace = 1
/obj/item/device/firing_pin/clown/pin_auth(mob/living/user)
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
return 0
-//muh laser tag
+// Ultra-honk pin, clown's deadly joke item.
+// A gun with ultra-honk pin is useful for clown and useless for everyone else.
+/obj/item/device/firing_pin/clown/ultra/pin_auth(mob/living/user)
+ playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
+ if(!(user.disabilities & CLUMSY) && !(user.mind && user.mind.assigned_role == "Clown"))
+ return 0
+ return 1
+
+/obj/item/device/firing_pin/clown/ultra/gun_insert(mob/living/user, var/obj/item/weapon/gun/G)
+ ..()
+ G.clumsy_check = 0
+
+/obj/item/device/firing_pin/clown/ultra/gun_remove(mob/living/user)
+ gun.clumsy_check = initial(gun.clumsy_check)
+ ..()
+
+// Now two times deadlier!
+/obj/item/device/firing_pin/clown/ultra/selfdestruct
+ desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it."
+ selfdestruct = 1
+
+
+// DNA-keyed pin.
+// When you want to keep your toys for youself.
+/obj/item/device/firing_pin/dna
+ name = "DNA-keyed firing pin"
+ desc = "This is a DNA-locked firing pin which only authorizes one user."
+ icon_state = "firing_pin_dna"
+ fail_message = "DNA CHECK FAILED."
+ var/unique_enzymes = null
+
+/obj/item/device/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag)
+ ..()
+ if(proximity_flag && iscarbon(target))
+ var/mob/living/carbon/M = target
+ if(M.dna && M.dna.unique_enzymes)
+ unique_enzymes = M.dna.unique_enzymes
+ user << "DNA-LOCK SET."
+
+/obj/item/device/firing_pin/dna/pin_auth(mob/living/carbon/user)
+ if(istype(user) && user.dna && user.dna.unique_enzymes)
+ if(user.dna.unique_enzymes == unique_enzymes)
+ return 1
+
+ return 0
+
+/obj/item/device/firing_pin/dna/auth_fail(mob/living/carbon/user)
+ if(!unique_enzymes)
+ if(istype(user) && user.dna && user.dna.unique_enzymes)
+ unique_enzymes = user.dna.unique_enzymes
+ user << "DNA-LOCK SET."
+ else
+ ..()
+
+/obj/item/device/firing_pin/dna/dredd
+ desc = "This is a DNA-locked firing pin which only authorizes one user. It has a small explosive charge on it."
+ selfdestruct = 1
+
+
+// Laser tag pins
/obj/item/device/firing_pin/tag
name = "laser tag firing pin"
desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
+ fail_message = "SUIT CHECK FAILED."
var/obj/item/clothing/suit/suit_requirement = null
/obj/item/device/firing_pin/tag/pin_auth(mob/living/user)
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 2c7ae702d64..ff9be3891c2 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -102,7 +102,7 @@ datum/design/bluespacebodybag
name = "Medical HUD implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
id = "ci-medhud"
- req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4)
+ req_tech = list("materials" = 6, "programming" = 4, "biotech" = 4)
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 100)
build_path = /obj/item/cybernetic_implant/eyes/hud/medical
@@ -112,7 +112,7 @@ datum/design/bluespacebodybag
name = "Security HUD implant"
desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control."
id = "ci-sechud"
- req_tech = list("materials" = 5, "programming" = 5, "biotech" = 5, "combat" = 2)
+ req_tech = list("materials" = 6, "programming" = 5, "biotech" = 4, "combat" = 2)
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 200, "$glass" = 200, "$silver" = 300, "$gold" = 300)
build_path = /obj/item/cybernetic_implant/eyes/hud/security
@@ -122,38 +122,65 @@ datum/design/bluespacebodybag
name = "X-Ray implant"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
id = "ci-xray"
- req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3)
+ req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6, "magnets" = 5, "plasmatech" = 3)
build_type = PROTOLATHE | MECHFAB
- materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500)
+ materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$uranium" = 500, "$diamond" = 1000)
build_path = /obj/item/cybernetic_implant/eyes/xray
category = list("Medical Designs")
-/datum/design/cyberimb_thermals
+/datum/design/cyberimp_thermals
name = "Thermals implant"
desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included."
id = "ci-thermals"
- req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3)
+ req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3, "syndicate" = 4)
build_type = PROTOLATHE | MECHFAB
- materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500)
+ materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 1000)
build_path = /obj/item/cybernetic_implant/eyes/thermals
category = list("Medical Designs")
-/datum/design/cyberimb_antidrop
+/datum/design/cyberimp_antidrop
name = "Anti-Drop implant"
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
id = "ci-antidrop"
- req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5)
+ req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5)
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 400)
build_path = /obj/item/cybernetic_implant/brain/anti_drop
category = list("Medical Designs")
-/datum/design/cyberimb_antistun
+/datum/design/cyberimp_antistun
name = "CNS Rebooter implant"
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
id = "ci-antistun"
- req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5)
+ req_tech = list("materials" = 7, "programming" = 5, "biotech" = 6)
build_type = PROTOLATHE | MECHFAB
- materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 600)
+ materials = list("$metal" = 200, "$glass" = 200, "$silver" = 500, "$gold" = 1000)
build_path = /obj/item/cybernetic_implant/brain/anti_stun
+ category = list("Medical Designs")
+
+/datum/design/cyberimp_nutriment
+ name = "Nutriment pump implant"
+ desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
+ id = "ci-nutriment"
+ req_tech = list("materials" = 6, "programming" = 4, "biotech" = 5)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list("$metal" = 200, "$glass" = 200, "$gold" = 500, "$uranium" = 500)
+ category = list("Medical Designs")
+
+/datum/design/cyberimp_nutriment_plus
+ name = "Nutriment pump implant PLUS"
+ desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
+ id = "ci-nutrimentplus"
+ req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list("$metal" = 200, "$glass" = 200, "$gold" = 500, "$uranium" = 750)
+ category = list("Medical Designs")
+
+/datum/design/cyberimp_reviver
+ name = "Reviver implant"
+ desc = "This implant will automatically deliver a therapeutic dose of electrical energy to your heart if it ever stops beating, and inject you with nanites. A second chance!"
+ id = "ci-reviver"
+ req_tech = list("materials" = 6, "programming" = 4, "biotech" = 6)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list("$metal" = 500, "$gold" = 1000, "$uranium" = 1000, "$diamond" = 2000)
category = list("Medical Designs")
\ No newline at end of file
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 42fcc6c1b1f..94c96d445a6 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -166,8 +166,8 @@
category = list("Weapons")
/datum/design/reciever
- name = "Modular Reciever"
- desc = "A prototype modular reciever and trigger assembly for a variety of firearms."
+ name = "Modular Receiver"
+ desc = "A prototype modular receiver and trigger assembly for a variety of firearms."
id = "reciever"
req_tech = list("combat" = 5, "materials" = 4)
build_type = PROTOLATHE
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index b41d28366d8..846f7e28c14 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -516,7 +516,7 @@
if(href_list["move"])
switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
- if(0) usr << "Shuttle recieved message and will be sent shortly."
+ if(0) usr << "Shuttle received message and will be sent shortly."
if(1) usr << "Invalid shuttle requested."
else usr << "Unable to comply."
diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm
index 6d289144127..66792e9c61b 100644
--- a/code/modules/surgery/cybernetic_implants.dm
+++ b/code/modules/surgery/cybernetic_implants.dm
@@ -1,48 +1,74 @@
#define MAX_BRAIN_IMPLANT 2
+#define MAX_CHEST_IMPLANT 3
+/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery)
+ user.visible_message("[user] begins to implant [target] with [implant].")
+
+//[[[[EYES]]]]
/datum/surgery/eye_cybernetic_implant/eyes
name = "eye cybernetic implant"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant/eyes, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
location = "eyes"
-/datum/surgery/eye_cybernetic_implant/brain
- name = "brain cybernetic implant"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close)
- location = "head"
-
/datum/surgery_step/cybernetic_implant/eyes
implements = list(/obj/item/cybernetic_implant/eyes = 100)
time = 32
-/datum/surgery_step/cybernetic_implant/brain
- implements = list(/obj/item/cybernetic_implant/brain = 100)
- time = 32
-
-/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery)
- user.visible_message("[user] begins to implant [target] with [implant].")
-
/datum/surgery_step/cybernetic_implant/eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/eyes/implant, datum/surgery/surgery)
if(implant)
var/full = 0
if(locate(/obj/item/cybernetic_implant/eyes,target.internal_organs))
full = 1
-
insert(user,target,implant,target_zone,full)
return 1
+//[[[[BRAIN]]]]
+/datum/surgery/eye_cybernetic_implant/brain
+ name = "brain cybernetic implant"
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close)
+ location = "head"
+
+/datum/surgery_step/cybernetic_implant/brain
+ implements = list(/obj/item/cybernetic_implant/brain = 100)
+ time = 32
+
/datum/surgery_step/cybernetic_implant/brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/brain/implant, datum/surgery/surgery)
if(implant)
var/full = 0
- for(var/obj/item/I in target.contents)
+ for(var/obj/item/I in target.internal_organs)
if(istype(I,/obj/item/cybernetic_implant/brain))
full++
if(full < MAX_BRAIN_IMPLANT)
full = 0
-
insert(user,target,implant,target_zone,full)
return 1
+//[[[[CHEST]]]]
+/datum/surgery/eye_cybernetic_implant/chest
+ name = "torso cybernetic implant"
+ steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/chest, /datum/surgery_step/close)
+ location = "chest"
+
+/datum/surgery_step/cybernetic_implant/chest
+ implements = list(/obj/item/cybernetic_implant/chest = 100)
+ time = 32
+
+/datum/surgery_step/cybernetic_implant/chest/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/chest/implant, datum/surgery/surgery)
+ if(implant)
+ var/full = 0
+ for(var/obj/item/I in target.internal_organs)
+ if(istype(I,/obj/item/cybernetic_implant/chest))
+ full++
+ if(full < MAX_CHEST_IMPLANT)
+ full = 0
+
+ if(istype(implant,/obj/item/cybernetic_implant/chest/heart))
+ if(locate(/obj/item/cybernetic_implant/chest/heart) in target.internal_organs)
+ full = 1
+
+ insert(user,target,implant,target_zone,full)
+ return 1
/datum/surgery_step/cybernetic_implant/proc/insert(mob/user, mob/living/carbon/target, obj/item/cybernetic_implant/implant,target_zone,full)
if(full)
@@ -52,5 +78,5 @@
implant.owner = target
implant.function()
user.drop_item()
- implant.loc = target
- target.internal_organs |= implant
\ No newline at end of file
+ target.internal_organs |= implant
+ implant.loc = target
\ No newline at end of file
diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm
index 5b5a928148b..7a37f071333 100644
--- a/code/modules/surgery/organs/cybernetic_implants.dm
+++ b/code/modules/surgery/organs/cybernetic_implants.dm
@@ -8,8 +8,7 @@
var/implant_color = "#FFFFFF"
/obj/item/cybernetic_implant/New(var/mob/M = null)
- if(M)
- owner = M
+ owner = M
return ..()
/obj/item/cybernetic_implant/proc/function()
@@ -40,10 +39,11 @@
owner << "[fluff_message]"
/obj/item/cybernetic_implant/eyes/hud/medical
- name = "medical hud implant"
+ name = "Medical HUD implant"
desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control."
eye_color = "0ff"
implant_color = "#00FFFF"
+ origin_tech = "materials=4;programming=3;biotech=4"
/obj/item/cybernetic_implant/eyes/hud/medical/function()
if(!owner)
@@ -55,10 +55,11 @@
update_eye_color("You suddenly see health bars floating above people's heads...")
/obj/item/cybernetic_implant/eyes/hud/security
- name = "security hud implant"
+ name = "Security HUD implant"
desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control."
eye_color = "d00"
implant_color = "#CC0000"
+ origin_tech = "materials=4;programming=4;biotech=3;combat=1"
/obj/item/cybernetic_implant/eyes/hud/security/function()
if(!owner)
@@ -70,10 +71,11 @@
update_eye_color("Job indicator icons pop up in your vision. That is not a certified surgeon...")
/obj/item/cybernetic_implant/eyes/xray
- name = "xray implant"
+ name = "X-ray implant"
desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile."
eye_color = "000"
implant_color = "#000000"
+ origin_tech = "materials=6;programming=4;biotech=5;magnets=5;plasmatech=2"
/obj/item/cybernetic_implant/eyes/xray/function()
if(!owner)
@@ -88,11 +90,12 @@
update_eye_color("Your vision is augmented!")
/obj/item/cybernetic_implant/eyes/thermals
- name = "thermals implant"
+ name = "Thermals implant"
desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included."
eye_color = "FC0"
implant_color = "#FFCC00"
flash_protect = -1
+ origin_tech = "materials=6;programming=4;biotech=5;magnets=5;plasmatech=2;syndicate=4"
/obj/item/cybernetic_implant/eyes/thermals/function()
if(!owner)
@@ -103,6 +106,8 @@
update_eye_color("You see prey everywhere you look...")
/obj/item/cybernetic_implant/eyes/emp_act(severity)
+ if(!owner)
+ return
if(severity > 1)
if(prob(5))
return
@@ -129,13 +134,15 @@
..()
/obj/item/cybernetic_implant/brain/emp_act(severity)
+ if(!owner)
+ return
var/stun_amount = 5 + (severity-1 ? 0 : 5)
owner.Stun(stun_amount)
owner << "Your body seizes up!"
return stun_amount
/obj/item/cybernetic_implant/brain/anti_drop
- name = "anti-drop implant"
+ name = "Anti-drop implant"
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle."
var/active = 0
var/l_hand_ignore = 0
@@ -143,6 +150,7 @@
var/obj/item/l_hand_obj = null
var/obj/item/r_hand_obj = null
implant_color = "#DE7E00"
+ origin_tech = "materials=5;programming=4;biotech=4"
/obj/item/cybernetic_implant/brain/anti_drop/function()
action_button_name = "Toggle Anti-Drop"
@@ -187,6 +195,8 @@
r_hand_obj = null
/obj/item/cybernetic_implant/brain/anti_drop/emp_act(severity)
+ if(!owner)
+ return
var/range = severity ? 10 : 5
var/atom/A
var/obj/item/L_item = owner.l_hand
@@ -213,6 +223,7 @@
name = "CNS Rebooter implant"
desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned."
implant_color = "#FFFF00"
+ origin_tech = "materials=6;programming=4;biotech=5"
/obj/item/cybernetic_implant/brain/anti_stun/function()
SSobj.processing |= src
@@ -231,6 +242,132 @@
owner.weakened = STUN_SET_AMOUNT
/obj/item/cybernetic_implant/brain/anti_stun/emp_act(severity)
+ if(!owner)
+ return
SSobj.processing.Remove(src)
spawn(..() * 10)
- SSobj.processing |= src
\ No newline at end of file
+ SSobj.processing |= src
+
+
+//[[[[CHEST]]]]
+
+/obj/item/cybernetic_implant/chest
+ name = "cybernetic torso implant"
+ desc = "implants for the organs in your torso"
+ icon_state = "chest_implant"
+
+/obj/item/cybernetic_implant/chest/New()
+ var/icon/overlay = new /icon('icons/obj/surgery.dmi',"chest_implant_overlay")
+ overlay.ColorTone(implant_color)
+ overlays |= overlay
+ ..()
+
+/obj/item/cybernetic_implant/chest/nutriment
+ name = "Nutriment pump implant"
+ desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
+ icon_state = "chest_implant"
+ implant_color = "#00AA00"
+ var/hunger_threshold = NUTRITION_LEVEL_STARVING
+ var/synthesizing = 0
+ var/nutriment_amount = 30
+ var/poison_amount = 5
+ origin_tech = "materials=5;programming=3;biotech=4"
+
+/obj/item/cybernetic_implant/chest/nutriment/function()
+ SSobj.processing |= src
+
+/obj/item/cybernetic_implant/chest/nutriment/process()
+ if(synthesizing)
+ return
+ if(!owner)
+ SSobj.processing.Remove(src)
+ qdel(src)
+ return
+ if(owner.stat == DEAD)
+ return
+
+ if(owner.nutrition <= hunger_threshold)
+ synthesizing = 1
+ spawn(50)
+ owner << "You feel less hungry..."
+ owner.nutrition += nutriment_amount
+ synthesizing = 0
+
+/obj/item/cybernetic_implant/chest/nutriment/plus
+ name = "Nutriment pump implant PLUS"
+ desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
+ icon_state = "chest_implant"
+ implant_color = "#006607"
+ hunger_threshold = NUTRITION_LEVEL_HUNGRY
+ nutriment_amount = 50
+ poison_amount = 10
+ origin_tech = "materials=5;programming=3;biotech=5"
+
+/obj/item/cybernetic_implant/chest/nutriment/emp_act(severity)
+ if(!owner)
+ return
+ owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning
+ owner << "You feel like your insides are burning."
+
+/obj/item/cybernetic_implant/chest/heart/reviver
+ name = "Reviver implant"
+ desc = "This implant will automatically deliver a therapeutic dose of electrical energy to your heart if it ever stops beating, and inject nanites into your bloodstream. A second chance!"
+ icon_state = "chest_implant"
+ implant_color = "#AD0000"
+ var/defibrillating = 0
+ var/recharge_time = 0
+ origin_tech = "materials=7;programming=3;biotech=4"
+
+/obj/item/cybernetic_implant/chest/heart/reviver/function()
+ if(istype(owner,/mob/living/carbon/human))
+ recharge_time = world.time + 2000
+ SSobj.processing |= src
+
+/obj/item/cybernetic_implant/chest/heart/reviver/process()
+ if(defibrillating)
+ return
+ if(!owner)
+ SSobj.processing.Remove(src)
+ qdel(src)
+ return
+ if(world.time < recharge_time)
+ return
+ if(owner.stat != DEAD)
+ return
+
+ defibrillating = 1
+ spawn(600)
+ if(owner.stat == DEAD)
+ owner.visible_message("[owner]'s body convulses by itself.")
+ playsound(owner, "bodyfall", 50, 1)
+ playsound(owner, 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ dead_mob_list -= owner
+ living_mob_list |= list(owner)
+ owner.stat = UNCONSCIOUS
+ owner.reagents.add_reagent("nanites",10)
+ var/mob/living/carbon/human/H = owner
+ var/amount = BLOOD_VOLUME_OKAY - H.vessel.total_volume
+ H.vessel.add_reagent("blood", amount)
+ H.vessel.update_total()
+ owner.heart_attack = 0
+ owner.emote("gasp")
+ add_logs(owner, owner, "revived", object="defibrillator implant")
+ recharge_time = world.time + 20000
+ defibrillating = 0
+
+/obj/item/cybernetic_implant/chest/heart/reviver/emp_act(severity)
+ if(!owner)
+ return
+ if(recharge_time < world.time)
+ recharge_time = world.time + (2000 / severity)
+ else
+ recharge_time += 2000 / severity
+
+ if(prob(60/severity))
+ playsound(owner, 'sound/machines/defib_saftyOff.ogg', 50, 1, -1)
+ spawn(30)
+ playsound(owner, 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ owner.heart_attack = 1
+ if(owner.stat == CONSCIOUS)
+ owner.Weaken(5)
+ owner.visible_message("[owner] clutches at their chest as if their heart stopped!")
\ No newline at end of file
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index f4509701ac0..19d5eca182c 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -86,6 +86,28 @@
user.visible_message("[user] screws up!")
return 0
+/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(locate(/datum/surgery_step/saw) in surgery.steps)
+ var/limb_type
+ switch(target_zone)
+ if("head")
+ limb_type = /obj/item/organ/limb/head
+ if("chest")
+ limb_type = /obj/item/organ/limb/chest
+ if("l_arm")
+ limb_type = /obj/item/organ/limb/l_arm
+ if("r_arm")
+ limb_type = /obj/item/organ/limb/r_arm
+ if("l_leg")
+ limb_type = /obj/item/organ/limb/l_leg
+ if("r_leg")
+ limb_type = /obj/item/organ/limb/r_leg
+ else
+ return
+ var/obj/item/organ/limb/limb = target.getlimb(limb_type)
+ if(limb)
+ limb.heal_damage(45,0,0)
+ return ..()
/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool)
return 1
diff --git a/config/admins.txt b/config/admins.txt
index ceced3eb60e..e420f765d0e 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -80,4 +80,4 @@ allura = Game Master
lo6a4evskiy = Game Master
vekter = Game Master
Ahammer18 = Game Master
-ACCount12 = Game Master
\ No newline at end of file
+ACCount12 = Game Master
diff --git a/html/changelog.html b/html/changelog.html
index 9a06efc9c18..ae4ca94a7e4 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,106 @@
-->
+
04 April 2015
+
ACCount updated:
+
+ - Emergency welding tool added to emergency toolbox.
+ - Changed industrial welding tool sprite.
+ - Replaced welder in syndicate toolbox with industrial one.
+ - All tools in syndicate toolbox are red. Corporate style!
+ - Red crowbar is a bit more robust.
+ - Fixed two bugs: welder icon disappearing and drone toolbox spawning with invisible cable coil.
+
+
AnturK updated:
+
+ - Picket signs: table crafted with a rod and two cardboard sheets, write on them with pen or crayon.
+
+
Cheridan updated:
+
+ - The bar's layout has been changed with a poker table and re-arranged seating.
+
+
Dannno updated:
+
+ - Added gun lockers for shotguns and energy guns. Click on the lockers with an item to close them if they're full.
+
+
Gun Hog updated:
+
+ - Nanotrasen research has finalized improvements for the experimental Reactive Teleport Armor. The armor is now made of a thinner, lightweight material which will not hinder movement. In addition, the armor shows an increase in responsiveness, activating in at least 50% of tests.
+
+
Incoming updated:
+
+ - The iconic blood-red hardsuits of nuke ops can now be purchased for a moderate sum of 8 TC by traitors.
+
+
Jordie0608 updated:
+
+ - Cyborg mining drills now use up their internal battery before drawing power from a borg's cell.
+ - Fixes cyborg mining drills not recharging.
+
+
RemieRichards updated:
+
+ - Burning mobs will ignite others they bump into or when they are stepped on.
+
+
Xhuis updated:
+
+ - Malfunctioning AIs can no longer leave the station z-level. Upon doing this, they will fail the round.
+ - Phazon exosuits now require an anomaly core as the final step in their construction.
+
+
xxalpha updated:
+
+ - Added Nutriment Pump, Nutriment Pump Plus and Reviver implants.
+ - Added origin technologies to all implants.
+ - The following implants are now much harder to obtain: X-ray, Thermals, Anti-Stun, Nutriment Pump Plus, Reviver.
+ - Cauterizing a surgery wound will now heal some of the damage done by the bonesaw if it was used as part of the same surgery.
+ - Added ability for Medical HUDs to detect cybernetic implants in humans.
+
+
+
01 April 2015
+
ACCount updated:
+
+ - You can now replace test range firing pins with any other pin.
+ - The plasma cutter is now a gun that comes in the mining vending machine. Use it to mine fast but expensively.
+ - It's also cheaper in RnD, and there's an advanced version of it there too. Yay!
+ - Ripleys and Firefighters have been buffed significantly. Go wild.
+ - Precious mesons are cheaper in RnD.
+ - Now you can mine bluespace crystals. They are extremely rare.
+ - You can make remote bombs out of gibtonite. Figure out how.
+ - Gibtonite is a bit less stable. Do not hit it with anything heavy.
+
+
Fayrik updated:
+
+ - Added a bowman headset for death squads and ERTs.
+ - Deathsquad radio channel is now called the Centcom radio channel.
+ - Fixed the admin buttons not spawning ERT Medic gear properly.
+ - Expanded Emergency Shuttle dock to allow for more round end griff.
+ - All 7 ERT members now spawn geared, not just the first 4.
+ - Spawning an ERT or Deathsquad no longer stops a second ERT or Deathsquad from being spawned.
+ - Pulse rifles now have 80 shots, not 40.
+ - Deathsquads now use loyalty pinned Pulse rifles.
+
+
Gun Hog updated:
+
+ - NTSL has been updated! It can now read and modify verbs (says, yells, asks)! You can set your own using $say, $yell, $ask, and $exclaim variables in your scripts.
+ - NTSL can now also modify the font, italics, and bolding of radio messages in four ways! In a script, place $loud, $wacky, $emphasis, and/or $robot in a vector to $filters.
+
+
Jordie0608 updated:
+
+ - The admin's old player panel has been removed and the new one has taken it's name.
+
+
NikNakFlak updated:
+
+ - Adds the ability to shave corgis.
+
+
Sawu updated:
+
+ - Spraycans for Revheads: instant use crayons that can be used on walls.
+ - Spraycans can be used as ghetto pepper spray and leave their target with colored faces that can be removed with space cleaner.
+
+
Xhuis updated:
+
+ - Area ambience and ship ambience are now separate toggles. If you want one type of ambience but not the other, you only need to switch off the type you don't want.
+ - Added cigar cases. They come in three flavors and can be bought from cigarette machines.
+
+
30 March 2015
AnturK updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index adb0d03ffb0..032ce58f6b0 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1989,3 +1989,92 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
gravity.
- rscadd: Engineering hardsuits come with an inbuilt jetpack. Requires an internals
tank in suit storage and is slower than a normal jetpack.
+2015-04-01:
+ ACCount:
+ - tweak: You can now replace test range firing pins with any other pin.
+ - rscadd: The plasma cutter is now a gun that comes in the mining vending machine.
+ Use it to mine fast but expensively.
+ - tweak: It's also cheaper in RnD, and there's an advanced version of it there too.
+ Yay!
+ - tweak: Ripleys and Firefighters have been buffed significantly. Go wild.
+ - tweak: Precious mesons are cheaper in RnD.
+ - rscadd: Now you can mine bluespace crystals. They are extremely rare.
+ - rscadd: You can make remote bombs out of gibtonite. Figure out how.
+ - tweak: Gibtonite is a bit less stable. Do not hit it with anything heavy.
+ Fayrik:
+ - rscadd: Added a bowman headset for death squads and ERTs.
+ - tweak: Deathsquad radio channel is now called the Centcom radio channel.
+ - bugfix: Fixed the admin buttons not spawning ERT Medic gear properly.
+ - tweak: Expanded Emergency Shuttle dock to allow for more round end griff.
+ - bugfix: All 7 ERT members now spawn geared, not just the first 4.
+ - bugfix: Spawning an ERT or Deathsquad no longer stops a second ERT or Deathsquad
+ from being spawned.
+ - tweak: Pulse rifles now have 80 shots, not 40.
+ - tweak: Deathsquads now use loyalty pinned Pulse rifles.
+ Gun Hog:
+ - rscadd: NTSL has been updated! It can now read and modify verbs (says, yells,
+ asks)! You can set your own using $say, $yell, $ask, and $exclaim variables
+ in your scripts.
+ - rscadd: NTSL can now also modify the font, italics, and bolding of radio messages
+ in four ways! In a script, place $loud, $wacky, $emphasis, and/or $robot in
+ a vector to $filters.
+ Jordie0608:
+ - rscdel: The admin's old player panel has been removed and the new one has taken
+ it's name.
+ NikNakFlak:
+ - rscadd: Adds the ability to shave corgis.
+ Sawu:
+ - rscadd: 'Spraycans for Revheads: instant use crayons that can be used on walls.'
+ - rscadd: Spraycans can be used as ghetto pepper spray and leave their target with
+ colored faces that can be removed with space cleaner.
+ Xhuis:
+ - tweak: Area ambience and ship ambience are now separate toggles. If you want one
+ type of ambience but not the other, you only need to switch off the type you
+ don't want.
+ - rscadd: Added cigar cases. They come in three flavors and can be bought from cigarette
+ machines.
+2015-04-04:
+ ACCount:
+ - rscadd: Emergency welding tool added to emergency toolbox.
+ - rscadd: Changed industrial welding tool sprite.
+ - tweak: Replaced welder in syndicate toolbox with industrial one.
+ - tweak: All tools in syndicate toolbox are red. Corporate style!
+ - tweak: Red crowbar is a bit more robust.
+ - bugfix: 'Fixed two bugs: welder icon disappearing and drone toolbox spawning with
+ invisible cable coil.'
+ AnturK:
+ - rscadd: 'Picket signs: table crafted with a rod and two cardboard sheets, write
+ on them with pen or crayon.'
+ Cheridan:
+ - wip: The bar's layout has been changed with a poker table and re-arranged seating.
+ Dannno:
+ - rscadd: Added gun lockers for shotguns and energy guns. Click on the lockers with
+ an item to close them if they're full.
+ Gun Hog:
+ - rscadd: Nanotrasen research has finalized improvements for the experimental Reactive
+ Teleport Armor. The armor is now made of a thinner, lightweight material which
+ will not hinder movement. In addition, the armor shows an increase in responsiveness,
+ activating in at least 50% of tests.
+ Incoming:
+ - rscadd: The iconic blood-red hardsuits of nuke ops can now be purchased for a
+ moderate sum of 8 TC by traitors.
+ Jordie0608:
+ - tweak: Cyborg mining drills now use up their internal battery before drawing power
+ from a borg's cell.
+ - bugfix: Fixes cyborg mining drills not recharging.
+ RemieRichards:
+ - rscadd: Burning mobs will ignite others they bump into or when they are stepped
+ on.
+ Xhuis:
+ - tweak: Malfunctioning AIs can no longer leave the station z-level. Upon doing
+ this, they will fail the round.
+ - tweak: Phazon exosuits now require an anomaly core as the final step in their
+ construction.
+ xxalpha:
+ - rscadd: Added Nutriment Pump, Nutriment Pump Plus and Reviver implants.
+ - tweak: Added origin technologies to all implants.
+ - tweak: 'The following implants are now much harder to obtain: X-ray, Thermals,
+ Anti-Stun, Nutriment Pump Plus, Reviver.'
+ - tweak: Cauterizing a surgery wound will now heal some of the damage done by the
+ bonesaw if it was used as part of the same surgery.
+ - tweak: Added ability for Medical HUDs to detect cybernetic implants in humans.
diff --git a/html/changelogs/ACCount12-mining.yml b/html/changelogs/ACCount12-mining.yml
deleted file mode 100644
index d2188ec7e52..00000000000
--- a/html/changelogs/ACCount12-mining.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-author: ACCount
-
-delete-after: True
-
-changes:
- - rscadd: "The plasma cutter is now a gun that comes in the mining vending machine. Use it to mine fast but expensively."
- - tweak: "It's also cheaper in RnD, and there's an advanced version of it there too. Yay!"
- - tweak: "Ripleys and Firefighters have been buffed significantly. Go wild."
- - tweak: "Precious mesons are cheaper in RnD."
- - rscadd: "Now you can mine bluespace crystals. They are extremely rare."
- - rscadd: "You can make remote bombs out of gibtonite. Figure out how."
- - tweak: "Gibtonite is a bit less stable. Do not hit it with anything heavy."
\ No newline at end of file
diff --git a/html/changelogs/Cheridan.yml b/html/changelogs/Cheridan.yml
deleted file mode 100644
index d26cc7b9ac2..00000000000
--- a/html/changelogs/Cheridan.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-author: Cheridan
-changes: []
diff --git a/html/changelogs/Fayrik-CentcomExpansionTwo.yml b/html/changelogs/Fayrik-CentcomExpansionTwo.yml
deleted file mode 100644
index 2fa8bfa76a5..00000000000
--- a/html/changelogs/Fayrik-CentcomExpansionTwo.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-author: Fayrik
-
-delete-after: True
-
-changes:
- - rscadd: "Added a bowman headset for death squads and ERTs."
- - tweak: "Deathsquad radio channel is now called the Centcom radio channel."
- - bugfix: "Fixed the admin buttons not spawning ERT Medic gear properly."
- - tweak: "Expanded Emergency Shuttle dock to allow for more round end griff."
- - bugfix: "All 7 ERT members now spawn geared, not just the first 4."
- - bugfix: "Spawning an ERT or Deathsquad no longer stops a second ERT or Deathsquad from being spawned."
- - tweak: "Pulse rifles now have 80 shots, not 40."
- - tweak: "Deathsquads now use loyalty pinned Pulse rifles."
\ No newline at end of file
diff --git a/html/changelogs/Gun_Hog_NTSL_Expansion.yml b/html/changelogs/Gun_Hog_NTSL_Expansion.yml
deleted file mode 100644
index 967b8d001fc..00000000000
--- a/html/changelogs/Gun_Hog_NTSL_Expansion.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: Gun Hog
-
-delete-after: True
-
-changes:
-
- - rscadd: "NTSL has been updated! It can now read and modify verbs (says, yells, asks)! You can set your own using $say, $yell, $ask, and $exclaim variables in your scripts."
- - rscadd: "NTSL can now also modify the font, italics, and bolding of radio messages in four ways! In a script, place $loud, $wacky, $emphasis, and/or $robot in a vector to $filters.
\ No newline at end of file
diff --git a/html/changelogs/Jordie0608 pp.yml b/html/changelogs/Jordie0608 pp.yml
deleted file mode 100644
index 23a673a3668..00000000000
--- a/html/changelogs/Jordie0608 pp.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: Jordie0608
-
-delete-after: True
-
-changes:
- - rscdel: "The admin's old player panel has been removed and the new one has taken it's name."
\ No newline at end of file
diff --git a/html/changelogs/NikNakFlak-PR-8604.yml b/html/changelogs/NikNakFlak-PR-8604.yml
deleted file mode 100644
index 83c7f69ef3e..00000000000
--- a/html/changelogs/NikNakFlak-PR-8604.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: NikNakFlak
-
-delete-after: True
-
-changes:
- - rscadd: "Adds the ability to shave corgis."
diff --git a/html/changelogs/Xhuis-Ambience.yml b/html/changelogs/Xhuis-Ambience.yml
deleted file mode 100644
index 45f4263d6b5..00000000000
--- a/html/changelogs/Xhuis-Ambience.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Xhuis
-delete-after: true
-
-changes:
- - tweak: "Area ambience and ship ambience are now separate toggles. If you want one type of ambience but not the other, you only need to switch off the type you don't want."
\ No newline at end of file
diff --git a/html/changelogs/Xhuis-CigarCases.yml b/html/changelogs/Xhuis-CigarCases.yml
deleted file mode 100644
index 29197d8555d..00000000000
--- a/html/changelogs/Xhuis-CigarCases.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Xhuis
-delete-after: true
-
-changes:
- - rscadd: "Added cigar cases. They come in three flavors and can be bought from cigarette machines."
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index b62a5d7b4dc..de23909c72f 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 56503f0210d..c23c2b987dc 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 86ee365b5c8..51534f8225e 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi
index 466ca058d4a..133f040771d 100644
Binary files a/icons/mob/pets.dmi and b/icons/mob/pets.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index a47cfcdb2e9..18c6b4b60a1 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 9e67d990c48..79e23dafd65 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index e501b24f404..473e51f6964 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index 69b070367be..76f629b26f2 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index f0a2daed423..4234dc72af5 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 93ebade829d..e3a0165745f 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 3ffe470d625..e2d406a6c91 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 98f5eebf44e..68fafe4a6b0 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -197,7 +197,7 @@ macro "borghotkeymode"
is-disabled = false
elem
name = "F6"
- command = "Player-Panel-New"
+ command = "Player-Panel"
is-disabled = false
elem
name = "F7"
@@ -363,7 +363,7 @@ macro "macro"
is-disabled = false
elem
name = "F6"
- command = "Player-Panel-New"
+ command = "Player-Panel"
is-disabled = false
elem
name = "F7"
@@ -515,7 +515,7 @@ macro "hotkeymode"
name = "CTRL+G"
command = "a-intent right"
is-disabled = false
- elem
+ elem
name = "M"
command = "me"
is-disabled = false
@@ -605,7 +605,7 @@ macro "hotkeymode"
is-disabled = false
elem
name = "F6"
- command = "Player-Panel-New"
+ command = "Player-Panel"
is-disabled = false
elem
name = "F7"
@@ -759,7 +759,7 @@ macro "borgmacro"
is-disabled = false
elem
name = "F6"
- command = "Player-Panel-New"
+ command = "Player-Panel"
is-disabled = false
elem
name = "F7"
diff --git a/sound/items/WEEOO1.ogg b/sound/items/WEEOO1.ogg
new file mode 100644
index 00000000000..71707a1d2dc
Binary files /dev/null and b/sound/items/WEEOO1.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index a9aced7f420..831a5e3d646 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -583,6 +583,7 @@
#include "code\game\objects\items\robot\robot_items.dm"
#include "code\game\objects\items\robot\robot_parts.dm"
#include "code\game\objects\items\robot\robot_upgrades.dm"
+#include "code\game\objects\items\stacks\cash.dm"
#include "code\game\objects\items\stacks\medical.dm"
#include "code\game\objects\items\stacks\rods.dm"
#include "code\game\objects\items\stacks\stack.dm"
@@ -624,6 +625,7 @@
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
#include "code\game\objects\items\weapons\shields.dm"
+#include "code\game\objects\items\weapons\signs.dm"
#include "code\game\objects\items\weapons\singularityhammer.dm"
#include "code\game\objects\items\weapons\stunbaton.dm"
#include "code\game\objects\items\weapons\table_rack_parts.dm"
@@ -679,6 +681,7 @@
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
+#include "code\game\objects\structures\guncase.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\ladders.dm"
@@ -1218,7 +1221,6 @@
#include "code\modules\mob\living\simple_animal\slime\say.dm"
#include "code\modules\mob\living\simple_animal\slime\slime.dm"
#include "code\modules\mob\living\simple_animal\slime\subtypes.dm"
-#include "code\modules\mob\living\simple_animal\slime\update_icons.dm"
#include "code\modules\mob\new_player\login.dm"
#include "code\modules\mob\new_player\logout.dm"
#include "code\modules\mob\new_player\new_player.dm"
@@ -1239,8 +1241,8 @@
#include "code\modules\ninja\suit\gloves.dm"
#include "code\modules\ninja\suit\head.dm"
#include "code\modules\ninja\suit\mask.dm"
+#include "code\modules\ninja\suit\ninjaDrainAct.dm"
#include "code\modules\ninja\suit\shoes.dm"
-#include "code\modules\ninja\suit\SpiderOS.dm"
#include "code\modules\ninja\suit\suit.dm"
#include "code\modules\ninja\suit\suit_attackby.dm"
#include "code\modules\ninja\suit\suit_initialisation.dm"
@@ -1254,6 +1256,7 @@
#include "code\modules\ninja\suit\n_suit_verbs\ninja_smoke.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm"
+#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm"
#include "code\modules\ninja\suit\n_suit_verbs\ninja_teleporting.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\filingcabinet.dm"