diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 22369d5470d..ba319ac8491 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -79,6 +79,7 @@ CREATE TABLE `characters` ( `nanotrasen_relation` varchar(45) NOT NULL, `speciesprefs` int(1) NOT NULL, `socks` mediumtext NOT NULL, + `body_accessory` mediumtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index db4449d96a0..915a9cd2b3a 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -204,7 +204,7 @@ "adV" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Head of Security APC"; pixel_x = -24},/turf/simulated/floor{icon_state = "dark"},/area/security/hos) "adW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/security/hos) "adX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos) -"adY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/security/hos) +"adY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/mob/living/simple_animal/hostile/retaliate/araneus,/turf/simulated/floor/carpet,/area/security/hos) "adZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/security/hos) "aea" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio,/turf/simulated/floor{icon_state = "dark"},/area/security/hos) "aeb" = (/obj/machinery/space_heater,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor,/area/security/podbay) diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index 8ffe65bf82c..01765fad4b5 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -1147,7 +1147,7 @@ "wc" = (/turf/unsimulated/floor{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/area/centcom/specops) "wd" = (/turf/unsimulated/floor{dir = 5; icon_state = "warning"},/area/centcom/specops) "we" = (/turf/space,/area/centcom/specops) -"wf" = (/obj/item/weapon/gun/projectile/automatic/m2411,/obj/item/ammo_box/magazine/m45,/obj/item/ammo_box/magazine/m45,/obj/item/ammo_box/magazine/m45,/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/head/helmet/space/deathsquad/beret,/obj/item/clothing/shoes/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/suit/space/deathsquad/officer,/obj/item/clothing/under/rank/centcom/captain,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) +"wf" = (/obj/item/weapon/gun/projectile/automatic/pistol/m2411,/obj/item/ammo_box/magazine/m45,/obj/item/ammo_box/magazine/m45,/obj/item/ammo_box/magazine/m45,/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/head/helmet/space/deathsquad/beret,/obj/item/clothing/shoes/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/suit/space/deathsquad/officer,/obj/item/clothing/under/rank/centcom/captain,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) "wg" = (/obj/machinery/telecomms/relay/preset/centcom,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) "wh" = (/obj/machinery/recharge_station/upgraded,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops) "wi" = (/turf/unsimulated/wall{icon = 'icons/obj/library.dmi'; icon_state = "book-5"; name = "bookcase (Tactics)"},/area/centcom/specops) @@ -1598,221 +1598,222 @@ "EL" = (/obj/item/weapon/storage/box/syringes,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/gun/syringe/rapidsyringe,/obj/item/weapon/reagent_containers/spray/chemsprayer,/obj/structure/closet,/obj/item/weapon/gun/projectile/shotgun/sc_pump,/obj/item/ammo_casing/shotgun/dart,/obj/item/ammo_casing/shotgun/dart,/obj/item/ammo_casing/shotgun/dart,/obj/item/ammo_casing/shotgun/dart,/obj/item/ammo_casing/shotgun/dart,/obj/item/ammo_casing/shotgun/dart,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) "EM" = (/turf/space,/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) "EN" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/automatic/pistol{pixel_x = 3; pixel_y = -3},/obj/item/weapon/suppressor,/obj/item/weapon/suppressor{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"EO" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g/stun,/obj/item/ammo_box/magazine/m12g/stun,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/weapon/gun/projectile/automatic/bulldog,/obj/item/weapon/gun/projectile/automatic/bulldog{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"EO" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g,/obj/item/ammo_box/magazine/m12g/stun,/obj/item/ammo_box/magazine/m12g/stun,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog,/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) "EP" = (/obj/structure/rack,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/ammo_box/magazine/smgm45,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"EQ" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/weapon/gun/projectile/automatic/gyropistol,/obj/item/weapon/gun/projectile/automatic/gyropistol{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"ER" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/weapon/gun/projectile/automatic/deagle,/obj/item/weapon/gun/projectile/automatic/deagle{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"ES" = (/obj/structure/rack,/obj/item/ammo_box/a357,/obj/item/ammo_box/a357,/obj/item/weapon/gun/projectile/revolver/mateba,/obj/item/weapon/gun/projectile/revolver/mateba{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"ET" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/lemon,/obj/item/weapon/reagent_containers/food/snacks/grown/berries,/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/cherries,/obj/item/weapon/reagent_containers/food/snacks/grown/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/corn,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"EU" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/storage/box/autoinjectors,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"EV" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"EW" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"EX" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) -"EY" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5"},/area/admin) -"EZ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINCHEMLOCKDOWN"; name = "Security Doors"; opacity = 0},/obj/machinery/door/airlock/hatch{name = "Chem Lab"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"Fa" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m762,/obj/item/ammo_box/magazine/m762,/obj/item/ammo_box/magazine/m762,/obj/item/ammo_box/magazine/m762,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/weapon/gun/projectile/automatic/l6_saw{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Fb" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic,/obj/item/weapon/gun/projectile/automatic{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Fc" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m545,/obj/item/ammo_box/magazine/m545,/obj/item/ammo_box/magazine/m545,/obj/item/ammo_box/magazine/m545,/obj/item/ammo_box/magazine/m545,/obj/item/ammo_box/magazine/m545,/obj/item/ammo_box/a40mm,/obj/item/ammo_box/a40mm,/obj/item/ammo_box/a40mm,/obj/item/ammo_box/a40mm,/obj/item/weapon/gun/projectile/automatic/c90gl,/obj/item/weapon/gun/projectile/automatic/c90gl{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Fd" = (/obj/structure/mirror{dir = 4; pixel_x = 0; pixel_y = -32},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Fe" = (/obj/machinery/optable,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"Ff" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/shard,/obj/item/weapon/kitchenknife,/obj/item/weapon/storage/firstaid/tactical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"Fg" = (/obj/structure/table,/obj/item/weapon/gun/energy/pulse_rifle/pistol,/obj/machinery/door_control{desc = "A remote control switch to lock down the admin lab."; icon_state = "doorctrl0"; id = "ADMINCHEMLOCKDOWN"; name = "Lockdown"; pixel_y = 24; req_access_txt = "0"},/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/admin) -"Fh" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/admin) -"Fi" = (/obj/machinery/computer/secure_data,/obj/item/weapon/paper/sop,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/admin) -"Fj" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"Fk" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"Fl" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/rods,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"Fm" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/admin) -"Fn" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/admin) -"Fo" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/admin) -"Fp" = (/obj/structure/rack,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Fq" = (/obj/structure/rack,/obj/item/weapon/katana{pixel_x = 3; pixel_y = -3},/obj/item/weapon/katana,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Fr" = (/obj/structure/rack,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/melee/energy/sword{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Fs" = (/obj/structure/rack,/obj/machinery/recharger/wallcharger{pixel_x = 30},/obj/item/weapon/gun/energy/xray,/obj/item/weapon/gun/energy/xray{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Ft" = (/obj/structure/table,/obj/random/toolbox,/obj/random/bomb_supply,/obj/machinery/syndicatebomb/badmin/clown,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Fu" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Fv" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Fw" = (/obj/structure/table,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/storage/pill_bottle/random_drug_bottle,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Fx" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"Fy" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/obj/item/weapon/lighter,/obj/item/weapon/restraints/handcuffs/cable/red,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"Fz" = (/obj/structure/table,/obj/structure/window/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/admin) -"FA" = (/obj/structure/table,/obj/machinery/door/window/southleft{name = "security checkpoint"; req_access_txt = "0"},/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/admin) -"FB" = (/obj/structure/table,/obj/structure/window/reinforced,/obj/machinery/recharger,/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/admin) -"FC" = (/obj/machinery/recharger/wallcharger{pixel_x = 30},/obj/structure/rack,/obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911,/obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"FD" = (/obj/structure/table,/obj/item/weapon/tank/oxygen/yellow,/obj/random/bomb_supply,/obj/item/clothing/under/rebeloutfit,/obj/item/clothing/suit/poncho/ponchoshame,/obj/item/clothing/head/sombrero/shamebrero,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"FE" = (/obj/machinery/door/airlock/hatch{name = "Tool Storage"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"FF" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"FG" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"FH" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end"},/area/admin) -"FI" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; name = "window"; opacity = 0; tag = "icon-window5_mid"},/area/admin) -"FJ" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (NORTH)"},/area/admin) -"FK" = (/turf/simulated/wall/r_wall,/area/adminconstruction) -"FL" = (/obj/structure/rack,/obj/item/weapon/gun/energy/meteorgun,/obj/item/weapon/gun/energy/meteorgun{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"FM" = (/obj/structure/rack,/obj/item/weapon/twohanded/knighthammer{pixel_x = -3; pixel_y = 3},/obj/item/weapon/twohanded/mjollnir,/obj/item/weapon/twohanded/singularityhammer{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"FN" = (/obj/structure/rack,/obj/item/weapon/gun/energy/crossbow,/obj/item/weapon/gun/energy/crossbow{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"FO" = (/obj/machinery/recharger/wallcharger{pixel_x = 30},/obj/structure/rack,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/gun/energy/pulse_rifle{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"FP" = (/obj/structure/table,/obj/random/tool,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/pinpointer/advpinpointer,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"FQ" = (/obj/structure/table,/obj/item/weapon/grenade/syndieminibomb{pixel_x = 4; pixel_y = 2; pixel_z = 0},/obj/item/weapon/grenade/syndieminibomb{pixel_x = -1},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"FR" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/obj/item/toy/cards/deck/syndicate/black,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"FS" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"FT" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/circular_saw,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"FU" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINCHEMLOCKDOWN"; name = "Security Doors"; opacity = 0},/obj/machinery/door/airlock/hatch{desc = "Uh oh."; name = "Operating Theater"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) -"FV" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"FW" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"FX" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"FY" = (/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/adminconstruction) -"FZ" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"Ga" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"Gb" = (/obj/machinery/door/airlock/hatch{desc = "You've heard rumors of the horrors that go on within this lab."; name = "Laboratory (DANGER!)"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gc" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gd" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Ge" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentCom","Thunderdome")},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gf" = (/obj/machinery/computer/rdservercontrol{badmin = 1; name = "Master R&D Server Controller"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gg" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gh" = (/obj/structure/table,/obj/item/weapon/card/id/silver{pixel_x = -3; pixel_y = -3},/obj/item/weapon/card/id/captains_spare,/obj/item/weapon/card/id/fluff/lifetime{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gi" = (/obj/structure/table,/obj/item/weapon/card/id/centcom{pixel_x = -3; pixel_y = -3},/obj/item/weapon/card/id{pixel_x = 0; pixel_y = 0},/obj/item/weapon/card/id/admin{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gj" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5"},/area/admin) -"Gk" = (/obj/structure/stool/bed/chair/comfy/black,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"Gl" = (/obj/machinery/computer/card,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gm" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gn" = (/obj/machinery/door/airlock/glass{name = "Computer Hub"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINLOCKDOWN"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Go" = (/obj/effect/landmark{name = "aroomwarp"; tag = ""},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gp" = (/obj/machinery/door/airlock/hatch{desc = "For all your shady business needs"; name = "Gambling Den"; req_access_txt = "0"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"Gq" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"Gr" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/syndicate,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"Gs" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"Gt" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/admin) -"Gu" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gv" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Gw" = (/obj/item/weapon/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"Gx" = (/obj/structure/table/woodentable,/obj/item/weapon/lighter/zippo/fluff/naples_1,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) -"Gy" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) -"Gz" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GA" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GB" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"GC" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"GD" = (/obj/machinery/computer/message_monitor,/obj/item/weapon/paper/monitorkey,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GE" = (/obj/machinery/computer/atmos_alert,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GF" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GG" = (/obj/machinery/computer/account_database{name = "Admin Accounts Database"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GH" = (/obj/structure/table,/obj/item/weapon/gun/projectile/automatic/pistol,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GI" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch to lock down external access to the admin room."; icon_state = "doorctrl0"; id = "ADMINLOCKDOWN"; name = "Lockdown"; pixel_y = 0; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GJ" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/syndicate,/obj/item/weapon/reagent_containers/food/drinks/cans/adminbooze,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/obj/item/weapon/reagent_containers/food/drinks/cans/madminmalt,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GK" = (/obj/machinery/door/airlock/hatch{desc = "Danger: May contain robustness"; name = "Dojo"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GL" = (/obj/machinery/door/airlock/glass{name = "Shuttle Bay"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"GM" = (/obj/structure/showcase,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GN" = (/obj/item/weapon/storage/toolbox/syndicate{desc = "A powerful relic many men worked long and hard to keep safe and away from the forces of evil."; force = 1e+008; name = "toolbox of robustness"},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/woodentable,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GO" = (/turf/unsimulated/floor{icon_state = "gcircuit"},/area/admin) -"GP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/grenade/clusterbuster/smoke,/obj/structure/table/woodentable,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GQ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/table/woodentable,/obj/item/weapon/sleeping_carp_scroll,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GR" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/table/woodentable,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GS" = (/obj/structure/ninjatele{pixel_x = -28},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GT" = (/obj/structure/ninjatele{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GU" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"GV" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"GW" = (/obj/structure/stool/bed,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GX" = (/obj/effect/decal/cleanable/blood,/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"GY" = (/obj/effect/decal/cleanable/fungus,/turf/unsimulated/wall{tag = "icon-wall3 (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "wall3"; dir = 4},/area/admin) -"GZ" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"Ha" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hb" = (/obj/machinery/door/window{dir = 1; name = "Suit Storage"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hc" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"Hd" = (/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"He" = (/obj/machinery/door/window/southleft{name = "Cell B"; req_access_txt = "101"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Hf" = (/obj/structure/rack,/obj/item/clothing/suit/space/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hg" = (/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hh" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hi" = (/turf/unsimulated/wall,/area/tdome) -"Hj" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/tdome) -"Hk" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Hl" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Hm" = (/obj/machinery/vending/medical,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Hn" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"Ho" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) -"Hp" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Hq" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/straight_jacket,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Hr" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/muzzle,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Hs" = (/turf/unsimulated/floor{icon_state = "engine"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) -"Ht" = (/obj/structure/rack,/obj/item/clothing/gloves/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hu" = (/obj/structure/rack,/obj/item/weapon/katana/energy,/obj/item/clothing/mask/gas/voice/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hv" = (/obj/structure/rack,/obj/item/clothing/shoes/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) -"Hw" = (/obj/structure/closet/secure_closet/bar{req_access = null; req_access_txt = "112"},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"Hx" = (/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"Hy" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"Hz" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) -"HA" = (/obj/machinery/door/airlock/hatch{desc = "Uh oh. You'd better hope you aren't going in here!"; name = "Prisoner Treatment"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HB" = (/obj/machinery/door/airlock/hatch{desc = "Uh oh. You'd better hope you aren't going in here!"; name = "Detainment"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HC" = (/turf/unsimulated/floor{icon_state = "engine"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5"},/area/admin) -"HD" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HE" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HF" = (/obj/structure/table{icon_state = "tabledir"; dir = 2},/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HG" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HH" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Thunderdome."; name = "Thunderdome Telescreen"; network = list("Thunderdome"); pixel_y = 30},/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HI" = (/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HJ" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HK" = (/obj/structure/table/reinforced,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/paper/Court,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HL" = (/obj/structure/table/reinforced,/obj/item/weapon/scalpel,/obj/item/weapon/storage/box/syndie_kit/mindslave,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/syndie_kit/imp_explosive,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashes,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/grenades,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/teargas,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HQ" = (/obj/structure/closet/secure_closet/freezer/meat{req_access_txt = "112"},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"HR" = (/obj/structure/closet/secure_closet/freezer/fridge{req_access_txt = "112"},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"HS" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HT" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"HU" = (/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HV" = (/obj/machinery/door/window{dir = 1; name = "Cell A"; req_access_txt = "101"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"HW" = (/obj/structure/table{icon_state = "tabledir"; dir = 9},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"HX" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave/upgraded,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"HY" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) -"HZ" = (/obj/item/device/camera,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) -"Ia" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) -"Ib" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"Ic" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/tdome) -"Id" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/tdome) -"Ie" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/tdome) -"If" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"Ig" = (/obj/machinery/door/poddoor{id_tag = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"Ih" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"Ii" = (/obj/machinery/door/poddoor{id_tag = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"Ij" = (/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) -"Ik" = (/obj/machinery/door/poddoor{id_tag = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome/arena) -"Il" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome/arena) -"Im" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome/arena) -"In" = (/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"Io" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"Ip" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Access"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINLOCKDOWN"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Iq" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) -"Ir" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"Is" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"It" = (/obj/structure/rack,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"Iu" = (/obj/machinery/camera{pixel_x = 11; pixel_y = -9; network = list("Thunderdome"); c_tag = "Thunderdome Red Team"},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) -"Iv" = (/turf/simulated/floor/bluegrid,/area/tdome/arena) -"Iw" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena) -"Ix" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("Thunderdome"); c_tag = "Thunderdome Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) -"Iy" = (/obj/machinery/camera{pixel_x = 10; network = list("Thunderdome"); c_tag = "Thunderdome Arena"},/turf/simulated/floor/bluegrid,/area/tdome/arena) -"Iz" = (/obj/structure/table,/obj/random/powercell,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"IA" = (/obj/structure/table,/obj/random/tool,/obj/random/bomb_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"IB" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"IC" = (/obj/structure/table,/obj/random/technology_scanner,/obj/random/tech_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"ID" = (/obj/machinery/door/poddoor{id_tag = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"IE" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/random/bomb_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"IF" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"IG" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"IH" = (/obj/machinery/teleport/hub/upgraded,/turf/unsimulated/floor{tag = "icon-delivery"; icon_state = "delivery"},/area/admin) -"II" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) -"IJ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"IK" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) -"IL" = (/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"IM" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"IN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss,/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"IO" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"IP" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdome"; name = "Main Blast Doors"; pixel_x = -3; pixel_y = 0; req_access_txt = "104"},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"IQ" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Thunderdome."; name = "Thunderdome Telescreen"; network = list("Thunderdome"); pixel_y = -30},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) -"IR" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"IS" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomehea"; name = "Ranged Gear"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"IT" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomegen"; name = "General Equiptment"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) -"IU" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Specialist Supply"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"EQ" = (/obj/machinery/vending/liberationstation,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"ER" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/ammo_box/magazine/m75,/obj/item/weapon/gun/projectile/automatic/gyropistol,/obj/item/weapon/gun/projectile/automatic/gyropistol{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"ES" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/ammo_box/magazine/m50,/obj/item/weapon/gun/projectile/automatic/pistol/deagle,/obj/item/weapon/gun/projectile/automatic/pistol/deagle{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"ET" = (/obj/structure/rack,/obj/item/ammo_box/a357,/obj/item/ammo_box/a357,/obj/item/weapon/gun/projectile/revolver/mateba,/obj/item/weapon/gun/projectile/revolver/mateba{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"EU" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/grown/lemon,/obj/item/weapon/reagent_containers/food/snacks/grown/berries,/obj/item/weapon/reagent_containers/food/snacks/grown/banana,/obj/item/weapon/reagent_containers/food/snacks/grown/cherries,/obj/item/weapon/reagent_containers/food/snacks/grown/orange,/obj/item/weapon/reagent_containers/food/snacks/grown/corn,/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/amanita,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"EV" = (/obj/structure/table,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/reagent_containers/glass/beaker/bluespace,/obj/item/weapon/storage/box/autoinjectors,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"EW" = (/obj/structure/table,/obj/item/weapon/storage/box/syringes,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/obj/item/weapon/grenade/chem_grenade/large,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"EX" = (/obj/structure/table,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/signaler,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/infra,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/obj/item/device/assembly/prox_sensor,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"EY" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) +"EZ" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5"},/area/admin) +"Fa" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINCHEMLOCKDOWN"; name = "Security Doors"; opacity = 0},/obj/machinery/door/airlock/hatch{name = "Chem Lab"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"Fb" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m762,/obj/item/ammo_box/magazine/m762,/obj/item/ammo_box/magazine/m762,/obj/item/ammo_box/magazine/m762,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/weapon/gun/projectile/automatic/l6_saw{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Fc" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/proto,/obj/item/weapon/gun/projectile/automatic/proto{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Fd" = (/obj/structure/rack,/obj/item/ammo_box/magazine/m556,/obj/item/ammo_box/magazine/m556,/obj/item/ammo_box/magazine/m556,/obj/item/ammo_box/magazine/m556,/obj/item/ammo_box/magazine/m556,/obj/item/ammo_box/magazine/m556,/obj/item/ammo_box/a40mm,/obj/item/ammo_box/a40mm,/obj/item/ammo_box/a40mm,/obj/item/ammo_box/a40mm,/obj/item/weapon/gun/projectile/automatic/m90,/obj/item/weapon/gun/projectile/automatic/m90{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Fe" = (/obj/structure/mirror{dir = 4; pixel_x = 0; pixel_y = -32},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Ff" = (/obj/machinery/optable,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"Fg" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/shard,/obj/item/weapon/kitchenknife,/obj/item/weapon/storage/firstaid/tactical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"Fh" = (/obj/structure/table,/obj/item/weapon/gun/energy/pulse_rifle/pistol,/obj/machinery/door_control{desc = "A remote control switch to lock down the admin lab."; icon_state = "doorctrl0"; id = "ADMINCHEMLOCKDOWN"; name = "Lockdown"; pixel_y = 24; req_access_txt = "0"},/turf/unsimulated/floor{dir = 9; icon_state = "carpetside"},/area/admin) +"Fi" = (/turf/unsimulated/floor{dir = 1; icon_state = "carpetside"},/area/admin) +"Fj" = (/obj/machinery/computer/secure_data,/obj/item/weapon/paper/sop,/turf/unsimulated/floor{dir = 5; icon_state = "carpetside"},/area/admin) +"Fk" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"Fl" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"Fm" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/stack/rods,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"Fn" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/admin) +"Fo" = (/obj/structure/stool/bed/chair/office/dark,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/admin) +"Fp" = (/obj/machinery/computer/med_data,/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/admin) +"Fq" = (/obj/structure/rack,/obj/item/weapon/shield/energy,/obj/item/weapon/shield/energy{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Fr" = (/obj/structure/rack,/obj/item/weapon/katana{pixel_x = 3; pixel_y = -3},/obj/item/weapon/katana,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Fs" = (/obj/structure/rack,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/melee/energy/sword{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Ft" = (/obj/structure/rack,/obj/machinery/recharger/wallcharger{pixel_x = 30},/obj/item/weapon/gun/energy/xray,/obj/item/weapon/gun/energy/xray{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Fu" = (/obj/structure/table,/obj/random/toolbox,/obj/random/bomb_supply,/obj/machinery/syndicatebomb/badmin/clown,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Fv" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Fw" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Fx" = (/obj/structure/table,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/storage/pill_bottle/random_drug_bottle,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Fy" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"Fz" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/obj/item/weapon/lighter,/obj/item/weapon/restraints/handcuffs/cable/red,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/pen,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"FA" = (/obj/structure/table,/obj/structure/window/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/unsimulated/floor{dir = 10; icon_state = "carpetside"},/area/admin) +"FB" = (/obj/structure/table,/obj/machinery/door/window/southleft{name = "security checkpoint"; req_access_txt = "0"},/turf/unsimulated/floor{dir = 2; icon_state = "carpetside"},/area/admin) +"FC" = (/obj/structure/table,/obj/structure/window/reinforced,/obj/machinery/recharger,/turf/unsimulated/floor{dir = 6; icon_state = "carpetside"},/area/admin) +"FD" = (/obj/machinery/recharger/wallcharger{pixel_x = 30},/obj/structure/rack,/obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911,/obj/item/weapon/gun/energy/pulse_rifle/pistol/m1911{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"FE" = (/obj/structure/table,/obj/item/weapon/tank/oxygen/yellow,/obj/random/bomb_supply,/obj/item/clothing/under/rebeloutfit,/obj/item/clothing/suit/poncho/ponchoshame,/obj/item/clothing/head/sombrero/shamebrero,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"FF" = (/obj/machinery/door/airlock/hatch{name = "Tool Storage"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"FG" = (/obj/structure/table,/obj/item/weapon/FixOVein,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"FH" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"FI" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end"},/area/admin) +"FJ" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_mid"; name = "window"; opacity = 0; tag = "icon-window5_mid"},/area/admin) +"FK" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (NORTH)"},/area/admin) +"FL" = (/turf/simulated/wall/r_wall,/area/adminconstruction) +"FM" = (/obj/structure/rack,/obj/item/weapon/gun/energy/meteorgun,/obj/item/weapon/gun/energy/meteorgun{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"FN" = (/obj/structure/rack,/obj/item/weapon/twohanded/knighthammer{pixel_x = -3; pixel_y = 3},/obj/item/weapon/twohanded/mjollnir,/obj/item/weapon/twohanded/singularityhammer{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"FO" = (/obj/structure/rack,/obj/item/weapon/gun/energy/crossbow,/obj/item/weapon/gun/energy/crossbow{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"FP" = (/obj/machinery/recharger/wallcharger{pixel_x = 30},/obj/structure/rack,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/gun/energy/pulse_rifle{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"FQ" = (/obj/structure/table,/obj/random/tool,/obj/item/clothing/gloves/color/yellow,/obj/item/weapon/pinpointer/advpinpointer,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"FR" = (/obj/structure/table,/obj/item/weapon/grenade/syndieminibomb{pixel_x = 4; pixel_y = 2; pixel_z = 0},/obj/item/weapon/grenade/syndieminibomb{pixel_x = -1},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"FS" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 0},/obj/item/toy/cards/deck/syndicate/black,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"FT" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"FU" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/circular_saw,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"FV" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINCHEMLOCKDOWN"; name = "Security Doors"; opacity = 0},/obj/machinery/door/airlock/hatch{desc = "Uh oh."; name = "Operating Theater"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin) +"FW" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"FX" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"FY" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"FZ" = (/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/adminconstruction) +"Ga" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"Gb" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"Gc" = (/obj/machinery/door/airlock/hatch{desc = "You've heard rumors of the horrors that go on within this lab."; name = "Laboratory (DANGER!)"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gd" = (/obj/machinery/computer/ordercomp,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Ge" = (/obj/machinery/computer/crew,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gf" = (/obj/machinery/computer/security{network = list("SS13","Telecomms","Research Outpost","Mining Outpost","ERT","CentCom","Thunderdome")},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gg" = (/obj/machinery/computer/rdservercontrol{badmin = 1; name = "Master R&D Server Controller"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gh" = (/obj/machinery/r_n_d/server/centcom,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gi" = (/obj/structure/table,/obj/item/weapon/card/id/silver{pixel_x = -3; pixel_y = -3},/obj/item/weapon/card/id/captains_spare,/obj/item/weapon/card/id/fluff/lifetime{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gj" = (/obj/structure/table,/obj/item/weapon/card/id/centcom{pixel_x = -3; pixel_y = -3},/obj/item/weapon/card/id{pixel_x = 0; pixel_y = 0},/obj/item/weapon/card/id/admin{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gk" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5"},/area/admin) +"Gl" = (/obj/structure/stool/bed/chair/comfy/black,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"Gm" = (/obj/machinery/computer/card,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gn" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Go" = (/obj/machinery/door/airlock/glass{name = "Computer Hub"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINLOCKDOWN"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gp" = (/obj/effect/landmark{name = "aroomwarp"; tag = ""},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gq" = (/obj/machinery/door/airlock/hatch{desc = "For all your shady business needs"; name = "Gambling Den"; req_access_txt = "0"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"Gr" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"Gs" = (/obj/structure/table/woodentable,/obj/item/toy/cards/deck/syndicate,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"Gt" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"Gu" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5_end (WEST)"},/area/admin) +"Gv" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gw" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Gx" = (/obj/item/weapon/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"Gy" = (/obj/structure/table/woodentable,/obj/item/weapon/lighter/zippo/fluff/naples_1,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/admin) +"Gz" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) +"GA" = (/obj/machinery/computer/communications,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GB" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GC" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"GD" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"GE" = (/obj/machinery/computer/message_monitor,/obj/item/weapon/paper/monitorkey,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GF" = (/obj/machinery/computer/atmos_alert,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GG" = (/obj/machinery/computer/secure_data,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GH" = (/obj/machinery/computer/account_database{name = "Admin Accounts Database"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GI" = (/obj/structure/table,/obj/item/weapon/gun/projectile/automatic/pistol,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GJ" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch to lock down external access to the admin room."; icon_state = "doorctrl0"; id = "ADMINLOCKDOWN"; name = "Lockdown"; pixel_y = 0; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GK" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes/syndicate,/obj/item/weapon/reagent_containers/food/drinks/cans/adminbooze,/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew,/obj/item/weapon/reagent_containers/food/drinks/cans/madminmalt,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GL" = (/obj/machinery/door/airlock/hatch{desc = "Danger: May contain robustness"; name = "Dojo"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GM" = (/obj/machinery/door/airlock/glass{name = "Shuttle Bay"; req_access_txt = "0"},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"GN" = (/obj/structure/showcase,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GO" = (/obj/item/weapon/storage/toolbox/syndicate{desc = "A powerful relic many men worked long and hard to keep safe and away from the forces of evil."; force = 1e+008; name = "toolbox of robustness"},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/woodentable,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GP" = (/turf/unsimulated/floor{icon_state = "gcircuit"},/area/admin) +"GQ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/grenade/clusterbuster/smoke,/obj/structure/table/woodentable,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GR" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/table/woodentable,/obj/item/weapon/sleeping_carp_scroll,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/table/woodentable,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GT" = (/obj/structure/ninjatele{pixel_x = -28},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GU" = (/obj/structure/ninjatele{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GV" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"GW" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"GX" = (/obj/structure/stool/bed,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GY" = (/obj/effect/decal/cleanable/blood,/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"GZ" = (/obj/effect/decal/cleanable/fungus,/turf/unsimulated/wall{tag = "icon-wall3 (EAST)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "wall3"; dir = 4},/area/admin) +"Ha" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 1; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"Hb" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hc" = (/obj/machinery/door/window{dir = 1; name = "Suit Storage"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hd" = (/turf/unsimulated/floor{icon_state = "engine"},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/wall{dir = 8; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"He" = (/obj/structure/window/reinforced,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Hf" = (/obj/machinery/door/window/southleft{name = "Cell B"; req_access_txt = "101"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Hg" = (/obj/structure/rack,/obj/item/clothing/suit/space/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hh" = (/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hi" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hj" = (/turf/unsimulated/wall,/area/tdome) +"Hk" = (/turf/unsimulated/wall{desc = "The door appears to be locked tightly."; icon = 'icons/obj/doors/Doorhatchele.dmi'; icon_state = "door_closed"; name = "Locked Door"},/area/tdome) +"Hl" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Hm" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Hn" = (/obj/machinery/vending/medical,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Ho" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"Hp" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/admin) +"Hq" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Hr" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/straight_jacket,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Hs" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/muzzle,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Ht" = (/turf/unsimulated/floor{icon_state = "engine"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) +"Hu" = (/obj/structure/rack,/obj/item/clothing/gloves/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hv" = (/obj/structure/rack,/obj/item/weapon/katana/energy,/obj/item/clothing/mask/gas/voice/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hw" = (/obj/structure/rack,/obj/item/clothing/shoes/space_ninja,/turf/unsimulated/floor{icon_state = "engine"},/area/admin) +"Hx" = (/obj/structure/closet/secure_closet/bar{req_access = null; req_access_txt = "112"},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"Hy" = (/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"Hz" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"HA" = (/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin) +"HB" = (/obj/machinery/door/airlock/hatch{desc = "Uh oh. You'd better hope you aren't going in here!"; name = "Prisoner Treatment"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HC" = (/obj/machinery/door/airlock/hatch{desc = "Uh oh. You'd better hope you aren't going in here!"; name = "Detainment"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HD" = (/turf/unsimulated/floor{icon_state = "engine"},/turf/unsimulated/wall{dir = 2; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5"; name = "window"; opacity = 0; tag = "icon-window5"},/area/admin) +"HE" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HG" = (/obj/structure/table{icon_state = "tabledir"; dir = 2},/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HH" = (/obj/structure/reagent_dispensers/beerkeg,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HI" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Thunderdome."; name = "Thunderdome Telescreen"; network = list("Thunderdome"); pixel_y = 30},/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HJ" = (/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HK" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HL" = (/obj/structure/table/reinforced,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/paper/Court,/obj/item/weapon/pen,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HM" = (/obj/structure/table/reinforced,/obj/item/weapon/scalpel,/obj/item/weapon/storage/box/syndie_kit/mindslave,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/syndie_kit/imp_explosive,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashes,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/grenades,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/teargas,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HR" = (/obj/structure/closet/secure_closet/freezer/meat{req_access_txt = "112"},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"HS" = (/obj/structure/closet/secure_closet/freezer/fridge{req_access_txt = "112"},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"HT" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HU" = (/obj/machinery/vending/snack,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"HV" = (/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HW" = (/obj/machinery/door/window{dir = 1; name = "Cell A"; req_access_txt = "101"},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"HX" = (/obj/structure/table{icon_state = "tabledir"; dir = 9},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"HY" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave/upgraded,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"HZ" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) +"Ia" = (/obj/item/device/camera,/turf/unsimulated/floor{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/tdome/tdomeobserve) +"Ib" = (/obj/structure/toilet{dir = 8},/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/admin) +"Ic" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"Id" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/tdome) +"Ie" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (WEST)"; icon_state = "fakewindows2"; dir = 8},/area/tdome) +"If" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/tdome) +"Ig" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"Ih" = (/obj/machinery/door/poddoor{id_tag = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"Ii" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"Ij" = (/obj/machinery/door/poddoor{id_tag = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"Ik" = (/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"Il" = (/obj/machinery/door/poddoor{id_tag = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{name = "plating"},/area/tdome/arena) +"Im" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome/arena) +"In" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome/arena) +"Io" = (/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"Ip" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/green,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"Iq" = (/obj/machinery/door/airlock/hatch{name = "Teleporter Access"; req_access_txt = "0"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "ADMINLOCKDOWN"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Ir" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"Is" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"It" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Iu" = (/obj/structure/rack,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"Iv" = (/obj/machinery/camera{pixel_x = 11; pixel_y = -9; network = list("Thunderdome"); c_tag = "Thunderdome Red Team"},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2) +"Iw" = (/turf/simulated/floor/bluegrid,/area/tdome/arena) +"Ix" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena) +"Iy" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("Thunderdome"); c_tag = "Thunderdome Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) +"Iz" = (/obj/machinery/camera{pixel_x = 10; network = list("Thunderdome"); c_tag = "Thunderdome Arena"},/turf/simulated/floor/bluegrid,/area/tdome/arena) +"IA" = (/obj/structure/table,/obj/random/powercell,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"IB" = (/obj/structure/table,/obj/random/tool,/obj/random/bomb_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"IC" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"ID" = (/obj/structure/table,/obj/random/technology_scanner,/obj/random/tech_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"IE" = (/obj/machinery/door/poddoor{id_tag = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"IF" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/random/bomb_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"IG" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"IH" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"II" = (/obj/machinery/teleport/hub/upgraded,/turf/unsimulated/floor{tag = "icon-delivery"; icon_state = "delivery"},/area/admin) +"IJ" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin) +"IK" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"IL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena) +"IM" = (/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"IN" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark{name = "tdomeadmin"},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"IO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss,/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"IP" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"IQ" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdome"; name = "Main Blast Doors"; pixel_x = -3; pixel_y = 0; req_access_txt = "104"},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"IR" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the Thunderdome."; name = "Thunderdome Telescreen"; network = list("Thunderdome"); pixel_y = -30},/turf/unsimulated/floor{tag = "icon-redyellowfull (NORTHEAST)"; icon_state = "redyellowfull"; dir = 5},/area/tdome/tdomeadmin) +"IS" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"IT" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomehea"; name = "Ranged Gear"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"IU" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomegen"; name = "General Equiptment"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) +"IV" = (/obj/structure/table,/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "thunderdomeaxe"; name = "Specialist Supply"; pixel_x = 0; pixel_y = 5; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome/tdomeadmin) (1,1,1) = {" aaabacadaeafagahaaaiajakalamanaoagafajacadahakaeamaiaoapaqarasatauavawaxayazaAaBaCaDaEaFaGaHaIaJaKawaxayazaAaBaCaDaEaFaLaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaOaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaQaPaPaPaPaPaR @@ -2027,48 +2028,47 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDADwDwEtDKDKDKDKDKDKDKDKDKDKDKDKEuDAEnaNDtDwEvEwExEyEwEzDwEAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEBDKECDKDKDKDKDKDKDKDKDKDKDKDKDKDKDAaNaNaNEDEEEFEwEwEwEGEDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDADwDwDwDwDwDMEHDMDwDwDwDwDwEIDKDKDAaNaNaNEJEKEwEwEwEwELEJaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEnaNEMDAENEOEPDKDKDKEQERESEuDADKDKDAaNaNDtDAETEwEUEVEwEWDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEXDKDKDKDKDKDKDKDKDKDKEXDKDKDADwEYDwDwDwEZDwDwEZDwDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFaFbFcDKDKDKFdFdFdDKEHDKDKDAFeEwEwFfDADKDAFgFhFiDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEXDKDKDKDKDKFjDwDwDwDwDADKDKDAEwEwFkFlDADKDAFmFnFoDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFpFqFrDKFsDAFtFuFvFwDADKDKDAFxEwEwFyDADKDAFzFAFBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEXDKDKDKDKFCDAFDFuFuFuFEDKDKDAFFEwEwFGDADKDKDKDKDKEfaNaNaNaNDtDwFHFIFJDwDuaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFLFMFNDKFODAFPFuFQFRDADKDKDAFSFTEwEwFUDKDKDKDKDKDAaNaNaNDtDwFVFWFWFWFXDwDuaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDwDwDwDwDwDwDwFZDKDKGaDwDwDwDwDwDwDwDwGbDwDADuaNDtDwFVFWFWFWFWFWFXDADuaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAGcGdGeGfGgGhGiGaDAFZDKDKDKDKDKDKGaDwDwDwDwDwFZDKGaDwDwGjDwFVFWFWFWGkFWFWFWFXDAaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIGlDKDKGmDKDKDKDKDKGnDKDKGoGoGoGoDKDKDKDKDKDKDKDKDKDKGpFWFWFWFWFWFWGqGrGsFWFWFWGtaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNGuGvDKDKDKDKDKDKDKGnDKDKGoGoGoGoDKDKDKDKDKDKDKDKDKDKGpFWFWFWFWFWGwGxGqGqGwFWFWGyaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfGzDKDKGADKDKDKDKDKGnDKDKGoGoGoGoDKDKDKDKDKDKDKDKDKFjDwDwGjDwGBFWFWGwGwGwFWFWGCDAaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAGDGEGFGGGHGIGJFjDAEIDKDKDKDKDKDKFjDwDwEIDKFjDwDwDwDAEnaNEMDwGBFWFWFWFWFWGCDAEnaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwDwDwDwDwDwDwDwEIDKDKFjDwDwDwDwDwGKDwDwDwDADAaNaNaNEMDwGBFWFWFWGCDwEnaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNaNaNaNaNaNaNDvDAGLGLDAaNDAFuGMFuFuFuGMFuDADAaNaNaNaNEMDwFHFIFJDwEnaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwFZDKDKDAaNDAGNFuFuGOFuFuGPDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNDAGQGOFuFuFuGOGRDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKDKDAaNDAGSFuFuGOFuFuGTDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDuaNEMDxDyDyDzEIDKDKDAaNDAGUFuFuFuFuFuGVDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGWGXGYDuaNaNaNaNaNDIDKDKDAaNEMDwGZHaHbHaHcDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHdHeDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHfHgHhDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHiHiHiHiHjHiHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHkHlHmDAHnFuFuHoDAHpHqHrHoDwFZDKDKDAaNaNaNHsHtHuHvHsaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHiHwHxHxHxHxHyHiHiHiHiHiHiHiHiHjHiHiHiHiHiHiHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHzFuFuFuHAFuFuFuFuHBFuFuFuFuHBDKDKDKDAaNaNEMDwDwHCDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHiHwHxHxHxHxHyHiHDHEHFHEHGHHHIHIHIHHHGHIHGHIHJHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHKHLHMDAGUFuFuGVDAHNHOHPGVDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHiHQHxHxHxHxHRHiHIHSHSHSHSHSHIHIHIHSHSHSHSHSHTHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGYHUHVDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHiHQHWHXHXHxHxHYHIHIHIHZHIHIHIHIHIHIHIHZHIHIHIHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGWIaDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNHiHiHiHiHiHiHiHiHIHSHSHSHSHSHIHIHIHSHSHSHSHSHIHiHiHiHiHiHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzFZDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHiIbIbIbIbIbHiIcIdIdIdIdIdIdIdIdIdIdIdIdIdIeHiIfIfIfIfIfHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHiHiHiIgIgIgIgIgjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIgIgIgIgIgHiHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFjDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHiIhIiIjIjIjIjIjIkIljcjcjcjcjcjcjcjcjcjcjcjcjcImIkInInInInInIiIoHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIpDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHiIhIiIjIqIjIqIjIkIljcjcjcjcjcjcjcjcjcjcjcjcjcImIkInIrInIrInIiIoHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAIsDKDKDKItDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHiIhIiIjIjIuIjIjIkIljcjcjcjcjcIvIwIvjcjcjcjcjcImIkInInIxInInIiIoHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHiIhIiIjIqIjIqIjIkIljcjcjcjcjcIvIyIvjcjcjcjcjcImIkInIrInIrInIiIoHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIzDKDKDKIADNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHiIhIiIjIjIjIjIjIkIljcjcjcjcjcjcjcjcjcjcjcjcjcImIkInInInInInIiIoHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfIBDKDKDKICEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNHiHiHiIDIDIDIDIDjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIDIDIDIDIDHiHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFYFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIEIFIGIHIIDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHiIJIJIJIJIJHiIcIdIdIdIdIdIdIdIdIdIdIdIdIdIeHiIKIKIKIKIKHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKFKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNHiHiHiHiHiHiHiILIMIMIMIMIMINIOIPIMIMIMIMIMILHiHiHiHiHiHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNHiILILILIQILIRIRIRIRIRILIQILILILHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNHiHiHjHiHiHiHiISITIUHiHiHiHiHjHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHiHiHiHiHiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEnaNEMDAENEOEPDKDKEQERESETEuDADKDKDAaNaNDtDAEUEwEVEWEwEXDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEYDKDKDKDKDKDKDKDKDKDKEYDKDKDADwEZDwDwDwFaDwDwFaDwDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFbFcFdDKDKDKFeFeFeDKEHDKDKDAFfEwEwFgDADKDAFhFiFjDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEYDKDKDKDKDKFkDwDwDwDwDADKDKDAEwEwFlFmDADKDAFnFoFpDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFqFrFsDKFtDAFuFvFwFxDADKDKDAFyEwEwFzDADKDAFAFBFCDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEYDKDKDKDKFDDAFEFvFvFvFFDKDKDAFGEwEwFHDADKDKDKDKDKEfaNaNaNaNDtDwFIFJFKDwDuaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAFMFNFODKFPDAFQFvFRFSDADKDKDAFTFUEwEwFVDKDKDKDKDKDAaNaNaNDtDwFWFXFXFXFYDwDuaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDwDwDwDwDwDwDwGaDKDKGbDwDwDwDwDwDwDwDwGcDwDADuaNDtDwFWFXFXFXFXFXFYDADuaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAGdGeGfGgGhGiGjGbDAGaDKDKDKDKDKDKGbDwDwDwDwDwGaDKGbDwDwGkDwFWFXFXFXGlFXFXFXFYDAaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIGmDKDKGnDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKDKGqFXFXFXFXFXFXGrGsGtFXFXFXGuaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNGvGwDKDKDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKDKGqFXFXFXFXFXGxGyGrGrGxFXFXGzaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfGADKDKGBDKDKDKDKDKGoDKDKGpGpGpGpDKDKDKDKDKDKDKDKDKFkDwDwGkDwGCFXFXGxGxGxFXFXGDDAaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAGEGFGGGHGIGJGKFkDAEIDKDKDKDKDKDKFkDwDwEIDKFkDwDwDwDAEnaNEMDwGCFXFXFXFXFXGDDAEnaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwDwDwDwDwDwDwDwEIDKDKFkDwDwDwDwDwGLDwDwDwDADAaNaNaNEMDwGCFXFXFXGDDwEnaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNaNaNaNaNaNaNDvDAGMGMDAaNDAFvGNFvFvFvGNFvDADAaNaNaNaNEMDwFIFJFKDwEnaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwGaDKDKDAaNDAGOFvFvGPFvFvGQDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNDAGRGPFvFvFvGPGSDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKDKDAaNDAGTFvFvGPFvFvGUDADAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDuaNEMDxDyDyDzEIDKDKDAaNDAGVFvFvFvFvFvGWDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtaNaNDtDAGXGYGZDuaNaNaNaNaNDIDKDKDAaNEMDwHaHbHcHbHdDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDwDwDwDwDAHeHfDADwDwDwDwDuaNEfDKDKDAaNaNEMDwHgHhHiDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHjHjHjHkHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDtDAHlHmHnDAHoFvFvHpDAHqHrHsHpDwGaDKDKDAaNaNaNHtHuHvHwHtaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHxHyHyHyHyHzHjHjHjHjHjHjHjHjHkHjHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHAFvFvFvHBFvFvFvFvHCFvFvFvFvHCDKDKDKDAaNaNEMDwDwHDDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHxHyHyHyHyHzHjHEHFHGHFHHHIHJHJHJHIHHHJHHHJHKHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDAHLHMHNDAGVFvFvGWDAHOHPHQGWDwEIDKDKDAaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHRHyHyHyHyHSHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHUHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDwDwGZHVHWDADwDwDwDwEnaNDIDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHRHXHYHYHyHyHZHJHJHJIaHJHJHJHJHJHJHJIaHJHJHJHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNEMDAGXIbDAEnaNaNaNaNaNEfDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNHjHjHjHjHjHjHjHjHJHTHTHTHTHTHJHJHJHTHTHTHTHTHJHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwEnaNDtDxDyDyDzGaDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNHjIcIcIcIcIcHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjIgIgIgIgIgHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDKDKDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjHjHjIhIhIhIhIhjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIhIhIhIhIhHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfDKDKDKDKDKDKFkDAEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDwDMIqDMDwDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDAItDKDKDKIuDAaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKDKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHIIIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNHjIKIKIKIKIKHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjILILILILILHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNHjHjHjHjHjHjHjIMINININININIOIPIQINININININIMHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNHjIMIMIMIRIMISISISISISIMIRIMIMIMHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNHjHjHkHjHjHjHjITIUIVHjHjHjHjHkHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN "} - diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index 2a236529f0f..f62ef2a1b9f 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -648,7 +648,7 @@ "mx" = (/obj/structure/table,/turf/simulated/floor{icon_state = "dark"},/area/syndicate_depot) "my" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/syndicate_depot) "mz" = (/turf/simulated/floor/engine,/area/syndicate_depot) -"mA" = (/obj/structure/closet/crate{name = "munitions crate"},/obj/item/weapon/storage/box/donkpockets,/obj/item/ammo_box/magazine/m762,/obj/item/weapon/gun/projectile/automatic/c90gl,/turf/simulated/floor{icon_state = "dark"},/area/syndicate_depot) +"mA" = (/obj/structure/closet/crate{name = "munitions crate"},/obj/item/weapon/storage/box/donkpockets,/obj/item/ammo_box/magazine/m762,/obj/item/weapon/gun/projectile/automatic/m90,/turf/simulated/floor{icon_state = "dark"},/area/syndicate_depot) "mB" = (/obj/machinery/door/window{base_state = "right"; dir = 8; icon_state = "right"; name = "Telepad"; req_access_txt = "0"},/turf/simulated/floor/engine,/area/syndicate_depot) "mC" = (/obj/machinery/telepad,/turf/simulated/floor/engine,/area/syndicate_depot) "mD" = (/obj/structure/closet/crate{name = "munitions crate"},/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/ammo_box/magazine/m12g/dragon,/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate,/obj/item/weapon/storage/firstaid/tactical,/turf/simulated/floor{icon_state = "dark"},/area/syndicate_depot) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 4ce8554bb4c..b0312b6a475 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -42,13 +42,17 @@ #define NO_PAIN 32 #define REQUIRE_LIGHT 64 #define IS_WHITELISTED 128 -#define HAS_LIPS 512 -#define HAS_UNDERWEAR 1024 -#define IS_PLANT 2048 -#define CAN_BE_FAT 4096 -#define IS_RESTRICTED 8192 -#define NO_INTORGANS 16384 -#define NO_POISON 32768 +#define HAS_LIPS 256 +#define IS_PLANT 512 +#define CAN_BE_FAT 1024 +#define IS_RESTRICTED 2048 +#define NO_INTORGANS 4096 +#define NO_POISON 8192 + +//Species clothing flags +#define HAS_UNDERWEAR 1 +#define HAS_UNDERSHIRT 2 +#define HAS_SOCKS 4 //Species Blood Flags #define BLOOD_SLIME 1 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 968e80da2f2..9b8980b693f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1,3 +1,4 @@ + //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 /* @@ -1765,3 +1766,38 @@ var/mob/dview/dview_mob = new if(orbiting) loc = get_turf(orbiting) orbiting = null + +//Centers an image. +//Requires: +//The Image +//The x dimension of the icon file used in the image +//The y dimension of the icon file used in the image +// eg: center_image(I, 32,32) +// eg2: center_image(I, 96,96) +/proc/center_image(var/image/I, x_dimension = 0, y_dimension = 0) + if(!I) + return + + if(!x_dimension || !y_dimension) + return + + //Get out of here, punk ass kids calling procs needlessly + if((x_dimension == world.icon_size) && (y_dimension == world.icon_size)) + return I + + //Offset the image so that it's bottom left corner is shifted this many pixels + //This makes it infinitely easier to draw larger inhands/images larger than world.iconsize + //but still use them in game + var/x_offset = -((x_dimension/world.icon_size)-1)*(world.icon_size*0.5) + var/y_offset = -((y_dimension/world.icon_size)-1)*(world.icon_size*0.5) + + //Correct values under world.icon_size + if(x_dimension < world.icon_size) + x_offset *= -1 + if(y_dimension < world.icon_size) + y_offset *= -1 + + I.pixel_x = x_offset + I.pixel_y = y_offset + + return I diff --git a/code/controllers/Processes/alarm.dm b/code/controllers/Processes/alarm.dm index bf2d501ae7a..311d8912d7a 100644 --- a/code/controllers/Processes/alarm.dm +++ b/code/controllers/Processes/alarm.dm @@ -1,6 +1,7 @@ // We manually initialize the alarm handlers instead of looping over all existing types // to make it possible to write: camera.triggerAlarm() rather than alarm_manager.managers[datum/alarm_handler/camera].triggerAlarm() or a variant thereof. /var/global/datum/alarm_handler/atmosphere/atmosphere_alarm = new() +/var/global/datum/alarm_handler/burglar/burglar_alarm = new() /var/global/datum/alarm_handler/camera/camera_alarm = new() /var/global/datum/alarm_handler/fire/fire_alarm = new() /var/global/datum/alarm_handler/motion/motion_alarm = new() @@ -15,7 +16,7 @@ var/datum/controller/process/alarm/alarm_manager /datum/controller/process/alarm/setup() name = "alarm" schedule_interval = 20 // every 2 seconds - all_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + all_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) alarm_manager = src /datum/controller/process/alarm/doWork() diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm index 0d283a3e5ba..ae0e7e85b69 100644 --- a/code/controllers/hooks-defs.dm +++ b/code/controllers/hooks-defs.dm @@ -92,3 +92,10 @@ * Parameters: var/obj/structure/closet/crate/sold, var/area/shuttle */ /hook/sell_crate + +/** + * Captain spawned hook. + * Called in supervisor.dm when a captain spawns + * Parameters: var/mob/living/carbon/human/captain + */ +/hook/captain_spawned diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 3bd823e3502..bfd5a3b6757 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -520,7 +520,6 @@ throwforce = 20 attack_verb = list("smashed", "slammed", "whacked", "thwacked") icon = 'icons/obj/weapons.dmi' - icon_override = 'icons/mob/in-hand/staff.dmi' icon_state = "bostaff0" diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index f6101b6dcd2..98a131b9070 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -217,7 +217,6 @@ var/list/uplink_items = list() cost = 12 job = list("Research Director") - //Stimulants /datum/uplink_item/jobspecific/stims @@ -245,14 +244,14 @@ var/list/uplink_items = list() /datum/uplink_item/dangerous/pistol - name = "Syndicate Pistol" + name = "FK-69 Pistol" reference = "SPI" desc = "A small, easily concealable handgun that uses 10mm auto rounds in 8-round magazines and is compatible with suppressors." item = /obj/item/weapon/gun/projectile/automatic/pistol cost = 9 /datum/uplink_item/dangerous/revolver - name = "Syndicate Revolver" + name = "Syndicate .357 Revolver" reference = "SR" desc = "A brutally simple syndicate revolver that fires .357 Magnum cartridges and has 7 chambers." item = /obj/item/weapon/gun/projectile/revolver @@ -260,7 +259,7 @@ var/list/uplink_items = list() surplus = 50 /datum/uplink_item/dangerous/smg - name = "Syndicate SMG" + name = "C-20r Submachine Gun" reference = "SMG" desc = "A fully-loaded Scarborough Arms bullpup submachine gun that fires .45 rounds with a 20-round magazine and is compatible with suppressors." item = /obj/item/weapon/gun/projectile/automatic/c20r @@ -268,17 +267,17 @@ var/list/uplink_items = list() gamemodes = list("nuclear emergency") surplus = 40 -/datum/uplink_item/dangerous/car - name = "C-90gl Compact Assault Rifle" - desc = "A fully-loaded Zashchita Industriya toploading bullpup assault rifle that uses 30-round 5.45x39mm magazines with a toggleable underslung 40mm grenade launcher." +/datum/uplink_item/dangerous/carbine + name = "M-90gl Carbine" + desc = "A fully-loaded three-round burst carbine that uses 30-round 5.56mm magazines with a togglable underslung 40mm grenade launcher." reference = "AR" - item = /obj/item/weapon/gun/projectile/automatic/c90gl + item = /obj/item/weapon/gun/projectile/automatic/m90 cost = 18 gamemodes = list("nuclear emergency") surplus = 50 /datum/uplink_item/dangerous/machinegun - name = "Syndicate LMG" + name = "L6 Squad Automatic Weapon" desc = "A fully-loaded Aussec Armoury belt-fed machine gun. This deadly weapon has a massive 50-round magazine of devastating 7.62x51mm ammunition." reference = "LMG" item = /obj/item/weapon/gun/projectile/automatic/l6_saw @@ -399,7 +398,7 @@ var/list/uplink_items = list() surplus = 40 /datum/uplink_item/ammo/pistol - name = "Ammo-10mm" + name = "Magazine - 10mm" desc = "An additional 8-round 10mm magazine for use in the syndicate pistol. These subsonic rounds are dirt cheap but are half as effective as .357 rounds." reference = "10MM" item = /obj/item/ammo_box/magazine/m10mm @@ -460,11 +459,11 @@ var/list/uplink_items = list() cost = 2 gamemodes = list("nuclear emergency") -/datum/uplink_item/ammo/car - name = "Box Magazine - 5.45x39mm" - desc = "An additional 30-round 5.45x39mm magazine for use in the C-90gl assault rifle. These bullets don't have the punch to knock most targets down, but dish out higher overall damage." - reference = "545" - item = /obj/item/ammo_box/magazine/m545 +/datum/uplink_item/ammo/carbine + name = "Toploader Magazine - 5.56" + desc = "An additional 30-round 5.56 magazine for use in the M-90gl carbine. These bullets don't have the punch to knock most targets down, but dish out higher overall damage." + reference = "556" + item = /obj/item/ammo_box/magazine/m556 cost = 2 gamemodes = list("nuclear emergency") diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 7dafb778e7a..1f52c4f56fb 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -108,6 +108,31 @@ updateicon() mouse_opacity = 0 air_doors_open() + + return + +/area/proc/burglaralert(var/obj/trigger) + if(always_unpowered == 1) //no burglar alarms in space/asteroid + return + + //Trigger alarm effect + set_fire_alarm_effect() + + //Lockdown airlocks + for(var/obj/machinery/door/airlock/A in src) + spawn(0) + A.close() + if(A.density) + A.lock() + + burglar_alarm.triggerAlarm(src, trigger) + spawn(600) + burglar_alarm.clearAlarm(src, trigger) + +/area/proc/set_fire_alarm_effect() + fire = 1 + updateicon() + mouse_opacity = 0 /area/proc/readyalert() if(!eject) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 230af9f10c0..dc2698f017f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -12,6 +12,7 @@ var/throwpass = 0 var/germ_level = GERM_LEVEL_AMBIENT // The higher the germ level, the more germ on the atom. var/simulated = 1 //filter for actions - used by lighting overlays + var/atom_say_verb = "says" ///Chemistry. var/datum/reagents/reagents = null @@ -346,7 +347,7 @@ its easier to just keep the beam vertical. fingerprints = list() //Hash this shit. - var/full_print = md5(H.dna.uni_identity) + var/full_print = H.get_full_print() // Add the fingerprints fingerprints[full_print] = full_print @@ -455,3 +456,9 @@ its easier to just keep the beam vertical. /atom/proc/narsie_act() return + +/atom/proc/atom_say(var/message) + if((!message)) + return + for(var/mob/O in hearers(src, null)) + O.show_message("[src] [atom_say_verb], \"[message]\"",2) \ No newline at end of file diff --git a/code/game/dna/dna.dm b/code/game/dna/dna.dm deleted file mode 100644 index 716d563a6e7..00000000000 --- a/code/game/dna/dna.dm +++ /dev/null @@ -1,128 +0,0 @@ -/////////////////////////// DNA DATUM -/datum/dna - var/unique_enzymes = null - var/struc_enzymes = null - var/uni_identity = null - var/b_type = "A+" - var/mutantrace = null //The type of mutant race the player is if applicable (i.e. potato-man) - var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings, - -/datum/dna/proc/check_integrity(var/mob/living/carbon/human/character) - if(character) - if(length(uni_identity) != 39) - //Lazy. - var/temp - - //Hair - var/hair = 0 - if(!character.h_style) - character.h_style = "Skinhead" - - var/hrange = round(4095 / hair_styles_list.len) - var/index = hair_styles_list.Find(character.h_style) - if(index) - hair = index * hrange - rand(1,hrange-1) - - //Facial Hair - var/beard = 0 - if(!character.f_style) - character.f_style = "Shaved" - - var/f_hrange = round(4095 / facial_hair_styles_list.len) - index = facial_hair_styles_list.Find(character.f_style) - if(index) - beard = index * f_hrange - rand(1,f_hrange-1) - - temp = add_zero2(num2hex((character.r_hair),1), 3) - temp += add_zero2(num2hex((character.b_hair),1), 3) - temp += add_zero2(num2hex((character.g_hair),1), 3) - temp += add_zero2(num2hex((character.r_facial),1), 3) - temp += add_zero2(num2hex((character.b_facial),1), 3) - temp += add_zero2(num2hex((character.g_facial),1), 3) - temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3) - temp += add_zero2(num2hex((character.r_eyes),1), 3) - temp += add_zero2(num2hex((character.g_eyes),1), 3) - temp += add_zero2(num2hex((character.b_eyes),1), 3) - - var/gender - - if (character.gender == MALE) - gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3) - else - gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3) - - temp += gender - temp += add_zero2(num2hex((beard),1), 3) - temp += add_zero2(num2hex((hair),1), 3) - - uni_identity = temp - if(length(struc_enzymes)!= 3*STRUCDNASIZE) - var/mutstring = "" - for(var/i = 1, i <= STRUCDNASIZE, i++) - mutstring += add_zero2(num2hex(rand(1,1024)),3) - - struc_enzymes = mutstring - if(length(unique_enzymes) != 32) - unique_enzymes = md5(character.real_name) - else - if(length(uni_identity) != 39) uni_identity = "00600200A00E0110148FC01300B0095BD7FD3F4" - if(length(struc_enzymes)!= 3*STRUCDNASIZE) struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6" - -/datum/dna/proc/ready_dna(mob/living/carbon/human/character) - var/temp - - //Hair - var/hair = 0 - if(!character.h_style) - character.h_style = random_hair_style(character.gender) - - var/hrange = round(4095 / hair_styles_list.len) - var/index = hair_styles_list.Find(character.h_style) - if(index) - hair = index * hrange - rand(1,hrange-1) - - //Facial Hair - var/beard = 0 - if(!character.f_style) - character.f_style = random_facial_hair_style(character.gender) - - var/f_hrange = round(4095 / facial_hair_styles_list.len) - index = facial_hair_styles_list.Find(character.f_style) - if(index) - beard = index * f_hrange - rand(1,f_hrange-1) - - temp = add_zero2(num2hex((character.r_hair),1), 3) - temp += add_zero2(num2hex((character.b_hair),1), 3) - temp += add_zero2(num2hex((character.g_hair),1), 3) - temp += add_zero2(num2hex((character.r_facial),1), 3) - temp += add_zero2(num2hex((character.b_facial),1), 3) - temp += add_zero2(num2hex((character.g_facial),1), 3) - temp += add_zero2(num2hex(((character.s_tone + 220) * 16),1), 3) - temp += add_zero2(num2hex((character.r_eyes),1), 3) - temp += add_zero2(num2hex((character.g_eyes),1), 3) - temp += add_zero2(num2hex((character.b_eyes),1), 3) - - var/gender - - if (character.gender == MALE) - gender = add_zero2(num2hex((rand(1,(2050+BLOCKADD))),1), 3) - else - gender = add_zero2(num2hex((rand((2051+BLOCKADD),4094)),1), 3) - - temp += gender - temp += add_zero2(num2hex((beard),1), 3) - temp += add_zero2(num2hex((hair),1), 3) - - uni_identity = temp - - var/mutstring = "" - for(var/i = 1, i <= STRUCDNASIZE, i++) - mutstring += add_zero2(num2hex(rand(1,1024)),3) - - - struc_enzymes = mutstring - - unique_enzymes = md5(character.real_name) - reg_dna[unique_enzymes] = character.real_name - -/////////////////////////// DNA DATUM \ No newline at end of file diff --git a/code/game/dna/dna_misc.dm b/code/game/dna/dna_misc.dm deleted file mode 100644 index b4c8bda8b9f..00000000000 --- a/code/game/dna/dna_misc.dm +++ /dev/null @@ -1,575 +0,0 @@ -/////////////////////////// DNA HELPER-PROCS -/proc/getleftblocks(input,blocknumber,blocksize) - var/string - - if (blocknumber > 1) - string = copytext(input,1,((blocksize*blocknumber)-(blocksize-1))) - return string - else - return null - -/proc/getrightblocks(input,blocknumber,blocksize) - var/string - if (blocknumber < (length(input)/blocksize)) - string = copytext(input,blocksize*blocknumber+1,length(input)+1) - return string - else - return null - -/proc/getblockstring(input,block,subblock,blocksize,src,ui) // src is probably used here just for urls; ui is 1 when requesting for the unique identifier screen, 0 for structural enzymes screen - var/string - var/subpos = 1 // keeps track of the current sub block - var/blockpos = 1 // keeps track of the current block - - - for(var/i = 1, i <= length(input), i++) // loop through each letter - - var/pushstring - - if(subpos == subblock && blockpos == block) // if the current block/subblock is selected, mark it - pushstring = "[copytext(input, i, i+1)]" - else - if(ui) //This is for allowing block clicks to be differentiated - pushstring = "[copytext(input, i, i+1)]" - else - pushstring = "[copytext(input, i, i+1)]" - - string += pushstring // push the string to the return string - - if(subpos >= blocksize) // add a line break for every block - string += " | " - subpos = 0 - blockpos++ - - subpos++ - - return string - - -/proc/getblock(input,blocknumber,blocksize) - var/result - result = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - return result - -/proc/getblockbuffer(input,blocknumber,blocksize) - var/result[3] - var/block = copytext(input ,(blocksize*blocknumber)-(blocksize-1),(blocksize*blocknumber)+1) - for(var/i = 1, i <= 3, i++) - result[i] = copytext(block, i, i+1) - return result - -/proc/setblock(istring, blocknumber, replacement, blocksize) - if(!blocknumber) - return istring - if(!istring || !replacement || !blocksize) return 0 - var/result = getleftblocks(istring, blocknumber, blocksize) + replacement + getrightblocks(istring, blocknumber, blocksize) - return result - -/proc/add_zero2(t, u) - var/temp1 - while (length(t) < u) - t = "0[t]" - temp1 = t - if (length(t) > u) - temp1 = copytext(t,2,u+1) - return temp1 - -/proc/miniscramble(input,rs,rd) - var/output - output = null - if (input == "C" || input == "D" || input == "E" || input == "F") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"6",prob((rs*10));"7",prob((rs*5)+(rd));"0",prob((rs*5)+(rd));"1",prob((rs*10)-(rd));"2",prob((rs*10)-(rd));"3") - if (input == "8" || input == "9" || input == "A" || input == "B") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "4" || input == "5" || input == "6" || input == "7") - output = pick(prob((rs*10));"4",prob((rs*10));"5",prob((rs*10));"A",prob((rs*10));"B",prob((rs*5)+(rd));"C",prob((rs*5)+(rd));"D",prob((rs*5)+(rd));"2",prob((rs*5)+(rd));"3") - if (input == "0" || input == "1" || input == "2" || input == "3") - output = pick(prob((rs*10));"8",prob((rs*10));"9",prob((rs*10));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C",prob((rs*10)-(rd));"D",prob((rs*5)+(rd));"E",prob((rs*5)+(rd));"F") - if (!output) output = "5" - return output - -//Instead of picking a value far from the input, this will pick values closer to it. -//Sorry for the block of code, but it's more efficient then calling text2hex -> loop -> hex2text -/proc/miniscrambletarget(input,rs,rd) - var/output = null - switch(input) - if("0") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10));"2",prob((rs*10)-(rd));"3") - if("1") - output = pick(prob((rs*10)+(rd));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10));"3",prob((rs*10)-(rd));"4") - if("2") - output = pick(prob((rs*10));"0",prob((rs*10)+(rd));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10));"4",prob((rs*10)-(rd));"5") - if("3") - output = pick(prob((rs*10)-(rd));"0",prob((rs*10));"1",prob((rs*10)+(rd));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10));"5",prob((rs*10)-(rd));"6") - if("4") - output = pick(prob((rs*10)-(rd));"1",prob((rs*10));"2",prob((rs*10)+(rd));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10));"6",prob((rs*10)-(rd));"7") - if("5") - output = pick(prob((rs*10)-(rd));"2",prob((rs*10));"3",prob((rs*10)+(rd));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10));"7",prob((rs*10)-(rd));"8") - if("6") - output = pick(prob((rs*10)-(rd));"3",prob((rs*10));"4",prob((rs*10)+(rd));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10));"8",prob((rs*10)-(rd));"9") - if("7") - output = pick(prob((rs*10)-(rd));"4",prob((rs*10));"5",prob((rs*10)+(rd));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10));"9",prob((rs*10)-(rd));"A") - if("8") - output = pick(prob((rs*10)-(rd));"5",prob((rs*10));"6",prob((rs*10)+(rd));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10));"A",prob((rs*10)-(rd));"B") - if("9") - output = pick(prob((rs*10)-(rd));"6",prob((rs*10));"7",prob((rs*10)+(rd));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10));"B",prob((rs*10)-(rd));"C") - if("10")//A - output = pick(prob((rs*10)-(rd));"7",prob((rs*10));"8",prob((rs*10)+(rd));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10));"C",prob((rs*10)-(rd));"D") - if("11")//B - output = pick(prob((rs*10)-(rd));"8",prob((rs*10));"9",prob((rs*10)+(rd));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10));"D",prob((rs*10)-(rd));"E") - if("12")//C - output = pick(prob((rs*10)-(rd));"9",prob((rs*10));"A",prob((rs*10)+(rd));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10));"E",prob((rs*10)-(rd));"F") - if("13")//D - output = pick(prob((rs*10)-(rd));"A",prob((rs*10));"B",prob((rs*10)+(rd));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10));"F") - if("14")//E - output = pick(prob((rs*10)-(rd));"B",prob((rs*10));"C",prob((rs*10)+(rd));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - if("15")//F - output = pick(prob((rs*10)-(rd));"C",prob((rs*10));"D",prob((rs*10)+(rd));"E",prob((rs*10)+(rd));"F") - - if(!input || !output) //How did this happen? - output = "8" - - return output - -/proc/isblockon(hnumber, bnumber , var/UI = 0) - - var/temp2 - temp2 = hex2num(hnumber) - - if(UI) - if(temp2 >= 2050) - return 1 - else - return 0 - - if (bnumber == HULKBLOCK || bnumber == TELEBLOCK || bnumber == NOBREATHBLOCK || bnumber == NOPRINTSBLOCK || bnumber == SMALLSIZEBLOCK || bnumber == SHOCKIMMUNITYBLOCK) - if (temp2 >= 3500 + BLOCKADD) - return 1 - else - return 0 - if (bnumber == XRAYBLOCK || bnumber == FIREBLOCK || bnumber == REMOTEVIEWBLOCK || bnumber == REGENERATEBLOCK || bnumber == INCREASERUNBLOCK || bnumber == REMOTETALKBLOCK || bnumber == MORPHBLOCK) - if (temp2 >= 3050 + BLOCKADD) - return 1 - else - return 0 - - - if (temp2 >= 2050 + BLOCKADD) - return 1 - else - return 0 - -/proc/ismuton(var/block,var/mob/M) - return isblockon(getblock(M.dna.struc_enzymes, block,3),block) - -/proc/randmutb(mob/M as mob) - if(!M) return - var/num - var/newdna - num = pick(GLASSESBLOCK,COUGHBLOCK,FAKEBLOCK,NERVOUSBLOCK,CLUMSYBLOCK,TWITCHBLOCK,HEADACHEBLOCK,BLINDBLOCK,DEAFBLOCK,HALLUCINATIONBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) - M.dna.struc_enzymes = newdna - return - -/proc/randmutg(mob/M as mob) - if(!M) return - var/num - var/newdna - num = pick(HULKBLOCK,XRAYBLOCK,FIREBLOCK,TELEBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK) - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,num,toggledblock(getblock(M.dna.struc_enzymes,num,3)),3) - M.dna.struc_enzymes = newdna - return - -/proc/scramble(var/type, mob/M as mob, var/p) - if(!M) return - M.dna.check_integrity() - if(type) - for(var/i = 1, i <= STRUCDNASIZE-1, i++) - if(prob(p)) - M.dna.uni_identity = setblock(M.dna.uni_identity, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - updateappearance(M, M.dna.uni_identity) - - else - for(var/i = 1, i <= STRUCDNASIZE-1, i++) - if(prob(p)) - M.dna.struc_enzymes = setblock(M.dna.struc_enzymes, i, add_zero2(num2hex(rand(1,4095), 1), 3), 3) - domutcheck(M, null) - return - -/proc/randmuti(mob/M as mob) - if(!M) return - var/num - var/newdna - num = rand(1,UNIDNASIZE) - M.dna.check_integrity() - newdna = setblock(M.dna.uni_identity,num,add_zero2(num2hex(rand(1,4095),1),3),3) - M.dna.uni_identity = newdna - return - -/proc/toggledblock(hnumber) //unused - var/temp3 - var/chtemp - temp3 = hex2num(hnumber) - if (temp3 < 2050) - chtemp = rand(2050,4095) - return add_zero2(num2hex(chtemp,1),3) - else - chtemp = rand(1,2049) - return add_zero2(num2hex(chtemp,1),3) -/////////////////////////// DNA HELPER-PROCS - -/////////////////////////// DNA MISC-PROCS -/proc/updateappearance(mob/M as mob , structure) - if(istype(M, /mob/living/carbon/human)) - M.dna.check_integrity() - var/mob/living/carbon/human/H = M - H.r_hair = hex2num(getblock(structure,1,3)) - H.b_hair = hex2num(getblock(structure,2,3)) - H.g_hair = hex2num(getblock(structure,3,3)) - H.r_facial = hex2num(getblock(structure,4,3)) - H.b_facial = hex2num(getblock(structure,5,3)) - H.g_facial = hex2num(getblock(structure,6,3)) - H.s_tone = round(((hex2num(getblock(structure,7,3)) / 16) - 220)) - H.r_eyes = hex2num(getblock(structure,8,3)) - H.g_eyes = hex2num(getblock(structure,9,3)) - H.b_eyes = hex2num(getblock(structure,10,3)) - if(H.internal_organs_by_name["eyes"]) - H.update_eyes() - - if (isblockon(getblock(structure, 11,3),11 , 1)) - H.gender = FEMALE - else - H.gender = MALE - - //Hair - var/hairnum = hex2num(getblock(structure,13,3)) - var/index = round(1 +(hairnum / 4096)*hair_styles_list.len) - if((0 < index) && (index <= hair_styles_list.len)) - H.h_style = hair_styles_list[index] - - //Facial Hair - var/beardnum = hex2num(getblock(structure,12,3)) - index = round(1 +(beardnum / 4096)*facial_hair_styles_list.len) - if((0 < index) && (index <= facial_hair_styles_list.len)) - H.f_style = facial_hair_styles_list[index] - - H.update_body(0) - H.update_hair() - - return 1 - else - return 0 - -/proc/probinj(var/pr, var/inj) - return prob(pr+inj*pr) - -/proc/domutcheck(mob/living/M as mob, connected, inj) - if (!M) return - - M.dna.check_integrity() - - M.disabilities = 0 - M.sdisabilities = 0 - var/old_mutations = M.mutations - M.mutations = list() - M.pass_flags = 0 -// M.see_in_dark = 2 -// M.see_invisible = 0 - - if(PLANT in old_mutations) - M.mutations.Add(PLANT) - if(SKELETON in old_mutations) - M.mutations.Add(SKELETON) - if(FAT in old_mutations) - M.mutations.Add(FAT) - if(HUSK in old_mutations) - M.mutations.Add(HUSK) - - if(ismuton(NOBREATHBLOCK,M)) - if(probinj(45,inj) || (mNobreath in old_mutations)) - M << "\blue You feel no need to breathe." - M.mutations.Add(mNobreath) - if(ismuton(REMOTEVIEWBLOCK,M)) - if(probinj(45,inj) || (mRemote in old_mutations)) - M << "\blue Your mind expands" - M.mutations.Add(mRemote) - M.verbs += /mob/living/carbon/human/proc/remoteobserve - if(ismuton(REGENERATEBLOCK,M)) - if(probinj(45,inj) || (mRegen in old_mutations)) - M << "\blue Your body pulses with energy" - M.mutations.Add(mRegen) - if(ismuton(INCREASERUNBLOCK,M)) - if(probinj(45,inj) || (mRun in old_mutations)) - M << "\blue You feel quick" - M.mutations.Add(mRun) - if(ismuton(REMOTETALKBLOCK,M)) - if(probinj(45,inj) || (mRemotetalk in old_mutations)) - M << "\blue You expand your mind outwards" - M.mutations.Add(mRemotetalk) - M.verbs += /mob/living/carbon/human/proc/remotesay - if(ismuton(MORPHBLOCK,M)) - if(probinj(45,inj) || (mMorph in old_mutations)) - M.mutations.Add(mMorph) - M << "\blue Your skin feels strange" - M.verbs += /mob/living/carbon/human/proc/morph - if(ismuton(BLENDBLOCK,M)) - if(probinj(45,inj) || (mBlend in old_mutations)) - M.mutations.Add(mBlend) - M << "\blue You feel alone" - if(ismuton(HALLUCINATIONBLOCK,M)) - if(probinj(45,inj) || (mHallucination in old_mutations)) - M.mutations.Add(mHallucination) - M << "\red Your mind says 'Hello'" - if(ismuton(NOPRINTSBLOCK,M)) - if(probinj(45,inj) || (mFingerprints in old_mutations)) - M.mutations.Add(mFingerprints) - M << "\blue Your fingers feel numb" - if(ismuton(SHOCKIMMUNITYBLOCK,M)) - if(probinj(45,inj) || (mShock in old_mutations)) - M.mutations.Add(mShock) - M << "\blue Your skin feels dry" - if(ismuton(SMALLSIZEBLOCK,M)) - if(probinj(45,inj) || (mSmallsize in old_mutations)) - M << "\blue Your skin feels rubbery" - M.mutations.Add(mSmallsize) - M.pass_flags |= 1 - - - - if (isblockon(getblock(M.dna.struc_enzymes, HULKBLOCK,3),HULKBLOCK)) - if(probinj(5,inj) || (HULK in old_mutations)) - M << "\blue Your muscles hurt." - M.mutations.Add(HULK) - if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK)) - M.disabilities |= EPILEPSY - M << "\red You get a headache." - if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK)) - M << "\red You feel strange." - if (prob(95)) - if(prob(50)) - randmutb(M) - else - randmuti(M) - else - randmutg(M) - if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK)) - M.disabilities |= COUGHING - M << "\red You start coughing." - if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK)) - M << "\red You feel lightheaded." - M.mutations.Add(CLUMSY) - if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK)) - M.disabilities |= TOURETTES - M << "\red You twitch." - if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK)) - if(probinj(30,inj) || (XRAY in old_mutations)) - M << "\blue The walls suddenly disappear." -// M.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) -// M.see_in_dark = 8 -// M.see_invisible = 2 - M.mutations.Add(XRAY) - if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK)) - M.disabilities |= NERVOUS - M << "\red You feel nervous." - if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK)) - if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations)) - M << "\blue Your body feels warm." - M.mutations.Add(COLD_RESISTANCE) - if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK)) - M.sdisabilities |= BLIND - M << "\red You can't seem to see anything." - if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK)) - if(probinj(15,inj) || (TK in old_mutations)) - M << "\blue You feel smarter." - M.mutations.Add(TK) - if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK)) - M.sdisabilities |= DEAF - M.ear_deaf = 1 - M << "\red Its kinda quiet.." - if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK)) - M.disabilities |= NEARSIGHTED - M << "Your eyes feel weird..." - - /* If you want the new mutations to work, UNCOMMENT THIS. - if(istype(M, /mob/living/carbon)) - for (var/datum/mutations/mut in global_mutations) - mut.check_mutation(M) - */ - -//////////////////////////////////////////////////////////// Monkey Block - if (isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && istype(M, /mob/living/carbon/human)) - // human > monkey - var/mob/living/carbon/human/H = M - H.notransform = 1 - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - W.loc = null - - if(!connected) - for(var/obj/item/W in (H.contents-implants)) - if (W==H.w_uniform) // will be teared - continue - H.unEquip(W) - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - del(animation) - - - var/mob/living/carbon/monkey/O = null - if(H.species.primitive) - O = new H.species.primitive(src) - else - H.gib() //Trying to change the species of a creature with no primitive var set is messy. - return - - if(M) - if (M.dna) - O.dna = M.dna - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - - for(var/obj/T in (M.contents-implants)) - del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the cute little monkey - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - O.real_name = text("monkey ([])",copytext(md5(M.real_name), 2, 6)) - O.take_overall_damage(M.getBruteLoss() + 40, M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss() + 20) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - O.a_intent = I_HARM - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return - - if (!isblockon(getblock(M.dna.struc_enzymes, MONKEYBLOCK,3),MONKEYBLOCK) && !istype(M, /mob/living/carbon/human)) - // monkey > human, - var/mob/living/carbon/monkey/Mo = M - Mo.notransform = 1 - var/list/implants = list() //Still preserving implants - for(var/obj/item/weapon/implant/W in Mo) - implants += W - W.loc = null - if(!connected) - for(var/obj/item/W in (Mo.contents-implants)) - Mo.unEquip(W) - M.notransform = 1 - M.canmove = 0 - M.icon = null - M.invisibility = 101 - var/atom/movable/overlay/animation = new( M.loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("monkey2h", animation) - sleep(48) - del(animation) - - var/mob/living/carbon/human/human/O = new( src ) - if(Mo.greaterform) - O.set_species(Mo.greaterform) - - if (isblockon(getblock(M.dna.uni_identity, 11,3),11)) - O.gender = FEMALE - else - O.gender = MALE - - if (M) - if (M.dna) - O.dna = M.dna - M.dna = null - - if (M.suiciding) - O.suiciding = M.suiciding - M.suiciding = null - - for(var/datum/disease/D in M.viruses) - O.viruses += D - D.affected_mob = O - M.viruses -= D - - //for(var/obj/T in M) - // del(T) - - O.loc = M.loc - - if(M.mind) - M.mind.transfer_to(O) //transfer our mind to the human - - if (connected) //inside dna thing - var/obj/machinery/dna_scannernew/C = connected - O.loc = C - C.occupant = O - connected = null - - var/i - while (!i) - var/randomname - if (O.gender == MALE) - randomname = capitalize(pick(first_names_male) + " " + capitalize(pick(last_names))) - else - randomname = capitalize(pick(first_names_female) + " " + capitalize(pick(last_names))) - if (findname(randomname)) - continue - else - O.real_name = randomname - i++ - updateappearance(O,O.dna.uni_identity) - O.take_overall_damage(M.getBruteLoss(), M.getFireLoss()) - O.adjustToxLoss(M.getToxLoss()) - O.adjustOxyLoss(M.getOxyLoss()) - O.stat = M.stat - for (var/obj/item/weapon/implant/I in implants) - I.loc = O - I.implanted = O -// O.update_icon = 1 //queue a full icon update at next life() call - del(M) - return -//////////////////////////////////////////////////////////// Monkey Block - if(M) - M.update_icon = 1 //queue a full icon update at next life() call - return null - - -/proc/togglemut(mob/M as mob, var/block) - if(!M) return - var/newdna - M.dna.check_integrity() - newdna = setblock(M.dna.struc_enzymes,block,toggledblock(getblock(M.dna.struc_enzymes,block,3)),3) - M.dna.struc_enzymes = newdna - return - -/////////////////////////// DNA MISC-PROCS \ No newline at end of file diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index d260575a89b..474c034f21c 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -5,31 +5,34 @@ block=MONKEYBLOCK /datum/dna/gene/monkey/can_activate(var/mob/M,var/flags) - return istype(M, /mob/living/carbon/human) + return ishuman(M) /datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags) if(!istype(H,/mob/living/carbon/human)) -// testing("Cannot monkey-ify [M], type is [M.type].") return - if(issmall(H)) // Already a monkey + if(issmall(H)) return for(var/obj/item/W in H) if(istype(W,/obj/item/organ)) continue + if(istype(W,/obj/item/weapon/implant)) + continue H.unEquip(W) + H.regenerate_icons() H.canmove = 0 H.stunned = 1 H.icon = null H.invisibility = 101 - var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc ) + + var/atom/movable/overlay/animation = new /atom/movable/overlay(H.loc) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' animation.master = H flick("h2monkey", animation) - sleep(48) - //animation = null - + sleep(22) + qdel(animation) + H.stunned = 0 H.update_canmove() H.invisibility = initial(H.invisibility) @@ -43,33 +46,34 @@ if(H.hud_used) H.hud_used.instantiate() - H << "You are now a [H.species.name]. " - qdel(animation) + H << "You are now a [H.species.name]." return H /datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags) if(!istype(H,/mob/living/carbon/human)) -// testing("Cannot monkey-ify [M], type is [M.type].") return for(var/obj/item/W in H) - if (W==H.w_uniform) // will be torn + if (W == H.w_uniform) // will be torn continue if(istype(W,/obj/item/organ)) continue + if(istype(W,/obj/item/weapon/implant)) + continue H.unEquip(W) H.regenerate_icons() H.canmove = 0 H.stunned = 1 H.icon = null H.invisibility = 101 - var/atom/movable/overlay/animation = new /atom/movable/overlay( H.loc ) + + var/atom/movable/overlay/animation = new /atom/movable/overlay(H.loc) animation.icon_state = "blank" animation.icon = 'icons/mob/mob.dmi' animation.master = H flick("monkey2h", animation) - sleep(48) - //animation = null + sleep(22) + qdel(animation) H.stunned = 0 H.update_canmove() @@ -84,7 +88,6 @@ if(H.hud_used) H.hud_used.instantiate() - H << "You are now a [H.species.name]. " - qdel(animation) + H << "You are now a [H.species.name]." return H \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index ae9bce1e1bc..974879a0553 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -124,7 +124,6 @@ icon_state = "arm_blade" item_state = "arm_blade" flags = ABSTRACT | NODROP - icon_override = 'icons/mob/in-hand/changeling.dmi' w_class = 5.0 sharp = 1 edge = 1 @@ -206,7 +205,6 @@ flags = NODROP icon = 'icons/obj/weapons.dmi' icon_state = "ling_shield" - icon_override = 'icons/mob/in-hand/changeling.dmi' var/remaining_uses //Set by the changeling ability. diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 1566e3b254b..bb4fc80c7d6 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -77,6 +77,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N H.underwear = "None" H.undershirt = "None" + H.socks = "None" H.faction |= "faithless" H.equip_to_slot_or_del(new /obj/item/clothing/under/shadowling(usr), slot_w_uniform) diff --git a/code/game/gamemodes/wizard/godhand.dm b/code/game/gamemodes/wizard/godhand.dm index 2e374240149..aead5dfcf5d 100644 --- a/code/game/gamemodes/wizard/godhand.dm +++ b/code/game/gamemodes/wizard/godhand.dm @@ -39,7 +39,6 @@ on_use_sound = "sound/magic/Disintegrate.ogg" icon_state = "disintegrate" item_state = "disintegrate" - icon_override = 'icons/mob/in-hand/spells.dmi' /obj/item/weapon/melee/touch_attack/disintegrate/afterattack(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //exploding after touching yourself would be bad @@ -64,7 +63,6 @@ on_use_sound = "sound/magic/FleshToStone.ogg" icon_state = "fleshtostone" item_state = "fleshtostone" - icon_override = 'icons/mob/in-hand/spells.dmi' /obj/item/weapon/melee/touch_attack/fleshtostone/afterattack(atom/target, mob/living/carbon/user, proximity) if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //getting hard after touching yourself would also be bad diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index c8f683406e2..e98517688d8 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,7 +1,7 @@ /mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction") + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg") var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos") usr << "You summoned [summon_type ? "magic" : "guns"]!" @@ -30,7 +30,7 @@ if("nuclear") new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("deagle") - new /obj/item/weapon/gun/projectile/automatic/deagle/camo(get_turf(H)) + new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H)) if("gyrojet") new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H)) if("pulse") @@ -47,17 +47,19 @@ if("combatshotgun") new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H)) if("bulldog") - new /obj/item/weapon/gun/projectile/automatic/bulldog(get_turf(H)) + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) + if("arg") + new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H)) if("mateba") new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H)) if("sabr") - new /obj/item/weapon/gun/projectile/automatic(get_turf(H)) + new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H)) if("crossbow") new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H)) if("saw") new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H)) if("car") - new /obj/item/weapon/gun/projectile/automatic/c90gl(get_turf(H)) + new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H)) if("boltaction") new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) else diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm index f9f2fc8316e..9b193628eda 100644 --- a/code/game/jobs/job/supervisor.dm +++ b/code/game/jobs/job/supervisor.dm @@ -42,6 +42,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) var/obj/item/organ/external/affected = H.organs_by_name["head"] affected.implants += L L.part = affected + callHook("captain_spawned", list("captain" = H)) return 1 get_access() diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 8837f4f971c..eb36f5c7cfc 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -61,6 +61,7 @@ new choice(loc) qdel(src) + /obj/machinery/computer/arcade/proc/prizevend() if(!contents.len) var/prizeselect = pickweight(prizes) @@ -77,9 +78,11 @@ prize.loc = src.loc /obj/machinery/computer/arcade/emp_act(severity) + ..(severity) + if(stat & (NOPOWER|BROKEN)) - ..(severity) return + var/empprize = null var/num_of_prizes = 0 switch(severity) @@ -87,11 +90,10 @@ num_of_prizes = rand(1,4) if(2) num_of_prizes = rand(0,2) - for(num_of_prizes; num_of_prizes > 0; num_of_prizes--) + for(var/i = num_of_prizes; i > 0; i--) empprize = pickweight(prizes) new empprize(src.loc) - - ..(severity) + explosion(src.loc, -1, 0, 1+num_of_prizes, flame_range = 1+num_of_prizes) /obj/machinery/computer/arcade/battle @@ -115,10 +117,10 @@ var/name_part1 var/name_part2 - name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ") + name_action = pick("Defeat ", "Annihilate ", "Save ", "Strike ", "Stop ", "Destroy ", "Robust ", "Romance ", "Pwn ", "Own ", "Ban ") name_part1 = pick("the Automatic ", "Farmer ", "Lord ", "Professor ", "the Cuban ", "the Evil ", "the Dread King ", "the Space ", "Lord ", "the Great ", "Duke ", "General ") - name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn") + name_part2 = pick("Melonoid", "Murdertron", "Sorcerer", "Ruin", "Jeff", "Ectoplasm", "Crushulon", "Uhangoid", "Vhakoid", "Peteoid", "slime", "Griefer", "ERPer", "Lizard Man", "Unicorn", "Bloopers") src.enemy_name = replacetext((name_part1 + name_part2), "the ", "") src.name = (name_action + name_part1 + name_part2) @@ -152,16 +154,14 @@ /obj/machinery/computer/arcade/battle/Topic(href, href_list) if(..()) - return 1 - - if(usr.machine != src) - return 0 + return if (!src.blocked && !src.gameover) if (href_list["attack"]) src.blocked = 1 var/attackamt = rand(2,6) src.temp = "You attack for [attackamt] damage!" + playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) src.updateUsrDialog() if(turtle > 0) turtle-- @@ -175,6 +175,7 @@ var/pointamt = rand(1,3) var/healamt = rand(6,8) src.temp = "You use [pointamt] magic to heal for [healamt] damage!" + playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) src.updateUsrDialog() turtle++ @@ -189,6 +190,7 @@ src.blocked = 1 var/chargeamt = rand(4,7) src.temp = "You regain [chargeamt] points" + playsound(src.loc, 'sound/arcade/Mana.ogg', 50, 1, extrarange = -3, falloff = 10) src.player_mp += chargeamt if(turtle > 0) turtle-- @@ -223,13 +225,14 @@ if(!gameover) src.gameover = 1 src.temp = "[src.enemy_name] has fallen! Rejoice!" + playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) feedback_inc("arcade_win_emagged") new /obj/effect/spawner/newbomb/timer/syndicate(src.loc) new /obj/item/clothing/head/collectable/petehat(src.loc) message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") - log_game("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") + log_game("[key_name(usr)] has outbombed Cuban Pete and been awarded a bomb.") src.New() emagged = 0 else @@ -239,11 +242,13 @@ else if (emagged && (turtle >= 4)) var/boomamt = rand(5,10) src.temp = "[src.enemy_name] throws a bomb, exploding you for [boomamt] damage!" + playsound(src.loc, 'sound/arcade/Boom.ogg', 50, 1, extrarange = -3, falloff = 10) src.player_hp -= boomamt else if ((src.enemy_mp <= 5) && (prob(70))) var/stealamt = rand(2,3) src.temp = "[src.enemy_name] steals [stealamt] of your power!" + playsound(src.loc, 'sound/arcade/Steal.ogg', 50, 1, extrarange = -3, falloff = 10) src.player_mp -= stealamt src.updateUsrDialog() @@ -251,6 +256,7 @@ src.gameover = 1 sleep(10) src.temp = "You have been drained! GAME OVER" + playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) feedback_inc("arcade_loss_mana_emagged") usr.gib() @@ -259,17 +265,20 @@ else if ((src.enemy_hp <= 10) && (src.enemy_mp > 4)) src.temp = "[src.enemy_name] heals for 4 health!" + playsound(src.loc, 'sound/arcade/Heal.ogg', 50, 1, extrarange = -3, falloff = 10) src.enemy_hp += 4 src.enemy_mp -= 4 else var/attackamt = rand(3,6) src.temp = "[src.enemy_name] attacks for [attackamt] damage!" + playsound(src.loc, 'sound/arcade/Hit.ogg', 50, 1, extrarange = -3, falloff = 10) src.player_hp -= attackamt if ((src.player_mp <= 0) || (src.player_hp <= 0)) src.gameover = 1 src.temp = "You have been crushed! GAME OVER" + playsound(src.loc, 'sound/arcade/Lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) feedback_inc("arcade_loss_hp_emagged") usr.gib() @@ -297,12 +306,29 @@ src.updateUsrDialog() +// *** THE ORION TRAIL ** // + +#define ORION_TRAIL_WINTURN 9 + +//Orion Trail Events +#define ORION_TRAIL_RAIDERS "Raiders" +#define ORION_TRAIL_FLUX "Interstellar Flux" +#define ORION_TRAIL_ILLNESS "Illness" +#define ORION_TRAIL_BREAKDOWN "Breakdown" +#define ORION_TRAIL_LING "Changelings?" +#define ORION_TRAIL_LING_ATTACK "Changeling Ambush" +#define ORION_TRAIL_MALFUNCTION "Malfunction" +#define ORION_TRAIL_COLLISION "Collision" +#define ORION_TRAIL_SPACEPORT "Spaceport" +#define ORION_TRAIL_BLACKHOLE "BlackHole" + + /obj/machinery/computer/arcade/orion_trail name = "The Orion Trail" desc = "Learn how our ancestors got to Orion, and have fun in the process!" - icon = 'icons/obj/computer.dmi' icon_state = "arcade" circuit = /obj/item/weapon/circuitboard/arcade/orion_trail + var/busy = 0 //prevent clickspam that allowed people to ~speedrun~ the game. var/engine = 0 var/hull = 0 var/electronics = 0 @@ -315,42 +341,43 @@ var/eventdat = null var/event = null var/list/settlers = list("Harry","Larry","Bob") - var/list/events = list("Raiders" = 3, - "Interstellar Flux" = 1, - "Illness" = 3, - "Breakdown" = 2, - "Malfunction" = 2, - "Collision" = 1 + var/list/events = list(ORION_TRAIL_RAIDERS = 3, + ORION_TRAIL_FLUX = 1, + ORION_TRAIL_ILLNESS = 3, + ORION_TRAIL_BREAKDOWN = 2, + ORION_TRAIL_LING = 3, + ORION_TRAIL_MALFUNCTION = 2, + ORION_TRAIL_COLLISION = 1, + ORION_TRAIL_SPACEPORT = 2 ) var/list/stops = list() var/list/stopblurbs = list() + var/lings_aboard = 0 + var/spaceport_raided = 0 + var/spaceport_freebie = 0 + var/last_spaceport_action = "" /obj/machinery/computer/arcade/orion_trail/New() // Sets up the main trail stops = list("Pluto","Asteroid Belt","Proxima Centauri","Dead Space","Rigel Prime","Tau Ceti Beta","Black Hole","Space Outpost Beta-9","Orion Prime") stopblurbs = list( - "Pluto, long since occupied with long-range sensors and scanners stands ready to, and indeed continues to, probe the far reaches of the galaxy.", - "At the edge of the Sol system lies a treacherous asteroid belt, many have been crushed by stray asteroids and miss-guided judgement.", - "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now it is a low-population sanctuary for adventureres and traders.", + "Pluto, long since occupied with long-range sensors and scanners, stands ready to, and indeed continues to probe the far reaches of the galaxy.", + "At the edge of the Sol system lies a treacherous asteroid belt. Many have been crushed by stray asteroids and misguided judgement.", + "The nearest star system to Sol, in ages past it stood as a reminder of the boundaries of sub-light travel, now a low-population sanctuary for adventurers and traders.", "This region of space is particularly devoid of matter. Such low-density pockets are known to exist, but the vastness of it is astounding.", - "Rigel Prime, the center of the Rigel system, burns hot, basking it's planetary bodies in warmth and radiation.", - "Tau Ceti Beta has recently become a way-point for colonists headed towards Orion. There are many ships and makeshift stations in the viscinity.", - "Sensors indicate a black-hole's gravitational field is affecting the region of space we were headed through. We could stay the course, but risk being over-come by it's gravity; or we could change course to go around, which will take longer.", - "You have come into range of the first man-made structure in this region of space. It has been constructed, not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonist's success.", - "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for man-kind!" + "Rigel Prime, the center of the Rigel system, burns hot, basking its planetary bodies in warmth and radiation.", + "Tau Ceti Beta has recently become a waypoint for colonists headed towards Orion. There are many ships and makeshift stations in the vicinity.", + "Sensors indicate that a black hole's gravitational field is affecting the region of space we were headed through. We could stay of course, but risk of being overcome by its gravity, or we could change course to go around, which will take longer.", + "You have come into range of the first man-made structure in this region of space. It has been constructed not by travellers from Sol, but by colonists from Orion. It stands as a monument to the colonists' success.", + "You have made it to Orion! Congratulations! Your crew is one of the few to start a new foothold for mankind!" ) /obj/machinery/computer/arcade/orion_trail/proc/newgame() // Set names of settlers in crew settlers = list() - var/choice = null for(var/i = 1; i <= 3; i++) - if(prob(50)) - choice = pick(first_names_male) - else - choice = pick(first_names_female) - settlers += choice - settlers += "[usr]" + add_crewmember() + add_crewmember("[usr]") // Re-set items to defaults engine = 1 hull = 1 @@ -362,8 +389,16 @@ event = null playing = 1 gameover = 0 + lings_aboard = 0 -/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user as mob) + //spaceport junk + spaceport_raided = 0 + spaceport_freebie = 0 + last_spaceport_action = "" + +/obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user) + if(..()) + return if(fuel <= 0 || food <=0 || settlers.len == 0) gameover = 1 event = null @@ -377,9 +412,26 @@ else if(food <= 0) dat += "
You ran out of food and starved." + if(emagged) + user.nutrition = 0 //yeah you pretty hongry + user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor." if(fuel <= 0) dat += "
You ran out of fuel, and drift, slowly, into a star." + if(emagged) + var/mob/living/M = user + M.adjust_fire_stacks(5) + M.IgniteMob() //flew into a star, so you're on fire + user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames." dat += "

OK...

" + + if(emagged) + user << "You're never going to make it to Orion..." + user.death() + emagged = 0 //removes the emagged status after you lose + playing = 0 //also a new game + name = "The Orion Trail" + desc = "Learn how our ancestors got to Orion, and have fun in the process!" + else if(event) dat = eventdat else if(playing) @@ -390,55 +442,122 @@ dat += "

Crew:

" dat += english_list(settlers) dat += "
Food: [food] | Fuel: [fuel]" - dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]
" + dat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" if(turns == 7) dat += "

Go Around Continue

" else dat += "

Continue

" + dat += "

Kill a crewmember

" dat += "

Close

" else dat = "

The Orion Trail

" dat += "

Experience the journey of your ancestors!



" dat += "
New Game
" dat += "

Close

" - var/datum/browser/popup = new(user, "arcade", "The Orion Trail") + var/datum/browser/popup = new(user, "arcade", "The Orion Trail",400,700) popup.set_content(dat) popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() return /obj/machinery/computer/arcade/orion_trail/Topic(href, href_list) - if(..()) - return 1 - if(usr.machine != src) - return 0 + . = ..() + if(.) + return if(href_list["close"]) usr.unset_machine() usr << browse(null, "window=arcade") - else if (href_list["continue"]) //Continue your travels - if(turns >= 9) + + if(busy) + return + busy = 1 + + if (href_list["continue"]) //Continue your travels + if(turns >= ORION_TRAIL_WINTURN) win() - else if(turns == 2) - if(prob(30)) - event = "Collision" - event() - food -= alive*2 - fuel -= 5 - turns += 1 - else - food -= alive*2 - fuel -= 5 - turns += 1 - if(prob(75)) - event = pickweight(events) - event() else - food -= alive*2 + food -= (alive+lings_aboard)*2 fuel -= 5 - turns += 1 - if(prob(75)) - event = pickweight(events) + if(turns == 2 && prob(30)) + event = ORION_TRAIL_COLLISION event() + else if(prob(75)) + event = pickweight(events) + if(lings_aboard) + if(event == ORION_TRAIL_LING || prob(55)) + event = ORION_TRAIL_LING_ATTACK + event() + turns += 1 + if(emagged) + var/mob/living/carbon/M = usr //for some vars + switch(event) + if(ORION_TRAIL_RAIDERS) + if(prob(50)) + usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?" + M.hallucination += 30 + else + usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..." + M.take_organ_damage(30) + playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1) + if(ORION_TRAIL_ILLNESS) + var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS + if(severity == 1) + M << "You suddenly feel slightly nauseous." //got off lucky + if(severity == 2) + usr << "You suddenly feel extremely nauseous and hunch over until it passes." + M.Stun(3) + if(severity >= 3) //you didn't pray hard enough + M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit." + M.Stun(5) + sleep(30) + atom_say("[M] violently throws up!") + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + M.nutrition -= 50 //lose a lot of food + var/turf/location = usr.loc + if(istype(location, /turf/simulated)) + location.add_vomit_floor(src, 1) + if(ORION_TRAIL_FLUX) + if(prob(75)) + M.Weaken(3) + atom_say("A sudden gust of powerful wind slams [M] into the floor!") + M.take_organ_damage(25) + playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) + else + M << "A violent gale blows past you, and you barely manage to stay standing!" + if(ORION_TRAIL_COLLISION) //by far the most damaging event + if(prob(90)) + playsound(src.loc, 'sound/effects/bang.ogg', 100, 1) + var/turf/simulated/floor/F + for(F in orange(1, src)) + F.ChangeTurf(/turf/space) + atom_say("Something slams into the floor around [src], exposing it to space!") + if(hull) + sleep(10) + atom_say("A new floor suddenly appears around [src]. What the hell?") + playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1) + var/turf/space/T + for(T in orange(1, src)) + T.ChangeTurf(/turf/simulated/floor/plating/) + else + atom_say("Something slams into the floor around [src] - luckily, it didn't get through!") + playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) + if(ORION_TRAIL_MALFUNCTION) + playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1) + src.visible_message("[src] malfunctions, randomizing in-game stats!") + var/oldfood = food + var/oldfuel = fuel + food = rand(10,80) / rand(1,2) + fuel = rand(10,60) / rand(1,2) + if(electronics) + sleep(10) + if(oldfuel > fuel && oldfood > food) + src.audible_message("[src] lets out a somehow reassuring chime.") + else if(oldfuel < fuel || oldfood < food) + src.audible_message("[src] lets out a somehow ominous chime.") + food = oldfood + fuel = oldfuel + playsound(src.loc, 'sound/machines/chime.ogg', 50, 1) + else if(href_list["newgame"]) //Reset everything newgame() else if(href_list["menu"]) //back to the main menu @@ -449,25 +568,25 @@ fuel = 60 settlers = list("Harry","Larry","Bob") else if(href_list["slow"]) //slow down - food -= alive*2 + food -= (alive+lings_aboard)*2 fuel -= 5 event = null else if(href_list["pastblack"]) //slow down - food -= (alive*2)*3 + food -= ((alive+lings_aboard)*2)*3 fuel -= 15 turns += 1 event = null else if(href_list["useengine"]) //use parts - engine -= 1 + engine = max(0, --engine) event = null else if(href_list["useelec"]) //use parts - electronics -= 1 + electronics = max(0, --electronics) event = null else if(href_list["usehull"]) //use parts - hull -= 1 + hull = max(0, --hull) event = null else if(href_list["wait"]) //wait 3 days - food -= (alive*2)*3 + food -= ((alive+lings_aboard)*2)*3 event = null else if(href_list["keepspeed"]) //keep speed if(prob(75)) @@ -477,8 +596,17 @@ event = null else if(href_list["blackhole"]) //keep speed past a black hole if(prob(75)) - event = "BlackHole" + event = ORION_TRAIL_BLACKHOLE event() + if(emagged) //has to be here because otherwise it doesn't work + playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1) + atom_say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!") + usr.Stun(10) //you can't run :^) + var/S = new /obj/singularity/academy(usr.loc) + emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting + sleep(50) + atom_say("[S] winks out, just as suddenly as it appeared.") + qdel(S) else event = null turns += 1 @@ -488,89 +616,466 @@ else if(href_list["eventclose"]) //end an event event = null + else if(href_list["killcrew"]) //shoot a crewmember + var/sheriff = remove_crewmember() //I shot the sheriff + playsound(loc,'sound/weapons/Gunshot.ogg', 100, 1) + + if(settlers.len == 0 || alive == 0) + atom_say("The last crewmember [sheriff], shot themselves, GAME OVER!") + if(emagged) + usr.death(0) + emagged = 0 + gameover = 1 + event = null + else if(emagged) + if(usr.name == sheriff) + atom_say("The crew of the ship chose to kill [usr.name]!") + usr.death(0) + + if(event == ORION_TRAIL_LING) //only ends the ORION_TRAIL_LING event, since you can do this action in multiple places + event = null + + //Spaceport specific interactions + //they get a header because most of them don't reset event (because it's a shop, you leave when you want to) + //they also call event() again, to regen the eventdata, which is kind of odd but necessary + else if(href_list["buycrew"]) //buy a crewmember + var/bought = add_crewmember() + last_spaceport_action = "You hired [bought] as a new crewmember." + fuel -= 10 + food -= 10 + event() + + else if(href_list["sellcrew"]) //sell a crewmember + var/sold = remove_crewmember() + last_spaceport_action = "You sold your crewmember, [sold]!" + fuel += 7 + food += 7 + event() + + else if(href_list["leave_spaceport"]) + event = null + spaceport_raided = 0 + spaceport_freebie = 0 + last_spaceport_action = "" + + else if(href_list["raid_spaceport"]) + var/success = min(15 * alive,100) //default crew (4) have a 60% chance + spaceport_raided = 1 + + var/FU = 0 + var/FO = 0 + if(prob(success)) + FU = rand(5,15) + FO = rand(5,15) + last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" + else + FU = rand(-5,-15) + FO = rand(-5,-15) + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" + + //your chance of lose a crewmember is 1/2 your chance of success + //this makes higher % failures hurt more, don't get cocky space cowboy! + if(prob(success*5)) + var/lost_crew = remove_crewmember() + last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" + if(emagged) + atom_say("WEEWOO WEEWOO, Spaceport Security en route!") + for(var/i, i<=3, i++) + var/mob/living/simple_animal/hostile/syndicate/ranged/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/orion(get_turf(src)) + O.target = usr + + + fuel += FU + food += FO + event() + + else if(href_list["buyparts"]) + switch(text2num(href_list["buyparts"])) + if(1) //Engine Parts + engine++ + last_spaceport_action = "Bought Engine Parts" + if(2) //Hull Plates + hull++ + last_spaceport_action = "Bought Hull Plates" + if(3) //Spare Electronics + electronics++ + last_spaceport_action = "Bought Spare Electronics" + fuel -= 5 //they all cost 5 + event() + + else if(href_list["trade"]) + switch(text2num(href_list["trade"])) + if(1) //Fuel + fuel -= 5 + food += 5 + last_spaceport_action = "Traded Fuel for Food" + if(2) //Food + fuel += 5 + food -= 5 + last_spaceport_action = "Traded Food for Fuel" + event() + src.add_fingerprint(usr) src.updateUsrDialog() + busy = 0 return /obj/machinery/computer/arcade/orion_trail/proc/event() eventdat = "

[event]

" - if(event == "Raiders") - eventdat += "Raiders have come aboard your ship!" + + switch(event) + if(ORION_TRAIL_RAIDERS) + eventdat += "Raiders have come aboard your ship!" + if(prob(50)) + var/sfood = rand(1,10) + var/sfuel = rand(1,10) + food -= sfood + fuel -= sfuel + eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel." + else if(prob(10)) + var/deadname = remove_crewmember() + eventdat += "
[deadname] tried to fight back but was killed." + else + eventdat += "
Fortunately you fended them off without any trouble." + eventdat += "

Continue

" + eventdat += "

Close

" + + if(ORION_TRAIL_FLUX) + eventdat += "This region of space is highly turbulent.
If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies." + eventdat += "
What will you do?" + eventdat += "

Slow Down Continue

" + eventdat += "

Close

" + + if(ORION_TRAIL_ILLNESS) + eventdat += "A deadly illness has been contracted!" + var/deadname = remove_crewmember() + eventdat += "
[deadname] was killed by the disease." + eventdat += "

Continue

" + eventdat += "

Close

" + + if(ORION_TRAIL_BREAKDOWN) + eventdat += "Oh no! The engine has broken down!" + eventdat += "
You can repair it with an engine part, or you can make repairs for 3 days." + if(engine >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_MALFUNCTION) + eventdat += "The ship's systems are malfunctioning!" + eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI." + if(electronics >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_COLLISION) + eventdat += "Something hit us! Looks like there's some hull damage." + if(prob(25)) + var/sfood = rand(5,15) + var/sfuel = rand(5,15) + food -= sfood + fuel -= sfuel + eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space." + if(prob(10)) + var/deadname = remove_crewmember() + eventdat += "
[deadname] was killed by rapid depressurization." + eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together." + if(hull >= 1) + eventdat += "

Use PartWait

" + else + eventdat += "

Wait

" + eventdat += "

Close

" + + if(ORION_TRAIL_BLACKHOLE) + eventdat += "You were swept away into the black hole." + eventdat += "

Oh...

" + eventdat += "

Close

" + settlers = list() + + if(ORION_TRAIL_LING) + eventdat += "Strange reports warn of changelings infiltrating crews on trips to Orion..." + if(settlers.len <= 2) + eventdat += "
Your crew's chance of reaching Orion is so slim the changelings likely avoided your ship..." + eventdat += "

Continue

" + eventdat += "

Close

" + if(prob(10)) // "likely", I didn't say it was guaranteed! + lings_aboard = min(++lings_aboard,2) + else + if(lings_aboard) //less likely to stack lings + if(prob(20)) + lings_aboard = min(++lings_aboard,2) + else if(prob(70)) + lings_aboard = min(++lings_aboard,2) + + eventdat += "

Kill a crewmember

" + eventdat += "

Risk it

" + eventdat += "

Close

" + + if(ORION_TRAIL_LING_ATTACK) + if(lings_aboard <= 0) //shouldn't trigger, but hey. + eventdat += "Haha, fooled you, there are no changelings on board!" + eventdat += "
(You should report this to a coder :S)" + else + var/ling1 = remove_crewmember() + var/ling2 = "" + if(lings_aboard >= 2) + ling2 = remove_crewmember() + + eventdat += "Oh no, some of your crew are Changelings!" + if(ling2) + eventdat += "
[ling1] and [ling2]'s arms twist and contort into grotesque blades!" + else + eventdat += "
[ling1]'s arm twists and contorts into a grotesque blade!" + + var/chance2attack = alive*20 + if(prob(chance2attack)) + var/chancetokill = 30*lings_aboard-(5*alive) //eg: 30*2-(10) = 50%, 2 lings, 2 crew is 50% chance + if(prob(chancetokill)) + var/deadguy = remove_crewmember() + eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] up to [deadguy] and capitulates them!" + else + eventdat += "
You valiantly fight off the Changeling[ling2 ? "s":""]!" + eventdat += "
You cut the Changeling[ling2 ? "s":""] up into meat... Eww" + if(ling2) + food += 30 + lings_aboard = max(0,lings_aboard-2) + else + food += 15 + lings_aboard = max(0,--lings_aboard) + else + eventdat += "
The Changeling[ling2 ? "s":""] run[ling2 ? "":"s"] away, What wimps!" + if(ling2) + lings_aboard = max(0,lings_aboard-2) + else + lings_aboard = max(0,--lings_aboard) + + eventdat += "

Continue

" + eventdat += "

Close

" + + + if(ORION_TRAIL_SPACEPORT) + if(spaceport_raided) + eventdat += "The Spaceport is on high alert! they wont let you dock since you tried to attack them!" + if(last_spaceport_action) + eventdat += "
Last Spaceport Action: [last_spaceport_action]" + eventdat += "

Depart Spaceport

" + eventdat += "

Close

" + else + eventdat += "You pull the ship up to dock at a nearby Spaceport, lucky find!" + eventdat += "
This Spaceport is home to travellers who failed to reach Orion, but managed to find a different home..." + eventdat += "
Trading terms: FU = Fuel, FO = Food" + if(last_spaceport_action) + eventdat += "
Last Spaceport Action: [last_spaceport_action]" + eventdat += "

Crew:

" + eventdat += english_list(settlers) + eventdat += "
Food: [food] | Fuel: [fuel]" + eventdat += "
Engine Parts: [engine] | Hull Panels: [hull] | Electronics: [electronics]" + + + //If your crew is pathetic you can get freebies (provided you haven't already gotten one from this port) + if(!spaceport_freebie && (fuel < 20 || food < 20)) + spaceport_freebie++ + var/FU = 10 + var/FO = 10 + var/freecrew = 0 + if(prob(30)) + FU = 25 + FO = 25 + + if(prob(10)) + add_crewmember() + freecrew++ + + eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)" + if(freecrew) + eventdat += "
You also gain a new crewmember!" + + fuel += FU + food += FO + + //CREW INTERACTIONS + eventdat += "

Crew Management:

" + + //Buy crew + if(food >= 10 && fuel >= 10) + eventdat += "

Hire a new Crewmember (-10FU,-10FO)

" + else + eventdat += "

Cant afford a new Crewmember

" + + //Sell crew + if(settlers.len > 1) + eventdat += "

Sell crew for Fuel and Food (+15FU,+15FO)

" + else + eventdat += "

Cant afford to sell a Crewmember

" + + //BUY/SELL STUFF + eventdat += "

Spare Parts:

" + + //Engine parts + if(fuel > 5) + eventdat += "

Buy Engine Parts (-5FU)

" + else + eventdat += "

Cant afford to buy Engine Parts" + + //Hull plates + if(fuel > 5) + eventdat += "

Buy Hull Plates (-5FU)

" + else + eventdat += "

Cant afford to buy Hull Plates" + + //Electronics + if(fuel > 5) + eventdat += "

Buy Spare Electronics (-5FU)

" + else + eventdat += "

Cant afford to buy Spare Electronics" + + //Trade + if(fuel > 5) + eventdat += "

Trade Fuel for Food (-5FU,+5FO)

" + else + eventdat += "

Cant afford to Trade Fuel for Food 5) + eventdat += "

Trade Food for Fuel (+5FU,-5FO)

" + else + eventdat += "

Cant afford to Trade Food for Fuel= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - - else if(event == "Malfunction") - eventdat += "The ship's systems are malfunctioning!" - eventdat += "
You can replace the broken electronics with spares, or you can spend 3 days troubleshooting the AI." - if(electronics >= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - - else if(event == "Collision") - eventdat += "Something hit us! Looks like there's some hull damage." - if(prob(25)) - var/sfood = rand(5,15) - var/sfuel = rand(5,15) - food -= sfood - fuel -= sfuel - eventdat += "
[sfood] Food and [sfuel] Fuel was vented out into space." - if(prob(10)) - var/deadname = pick_n_take(settlers) - eventdat += "
[deadname] was killed by rapid depressurization." - alive -= 1 - eventdat += "
You can repair the damage with hull plates, or you can spend the next 3 days welding scrap together." - if(hull >= 1) - eventdat += "

Use PartWait

" - else - eventdat += "

Wait

" - eventdat += "

Close

" - - else if(event == "BlackHole") - eventdat += "You were swept away into the black hole." - eventdat += "

Oh...

" - eventdat += "

Close

" - settlers = list() + if(removed) + if(lings_aboard && prob(40*lings_aboard)) //if there are 2 lings you're twice as likely to get one, obviously + lings_aboard = max(0,--lings_aboard) + settlers -= removed + alive-- + return removed /obj/machinery/computer/arcade/orion_trail/proc/win() playing = 0 - turns = 0 - prizevend() + turns = 1 + atom_say("Congratulations, you made it to Orion!") + if(emagged) + new /obj/item/weapon/orion_ship(src.loc) + message_admins("[key_name_admin(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") + log_game("[key_name(usr)] made it to Orion on an emagged machine and got an explosive toy ship.") + else + prizevend() + emagged = 0 + name = "The Orion Trail" + desc = "Learn how our ancestors got to Orion, and have fun in the process!" + +/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user) + if(!emagged) + user << "You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode." + name = "The Orion Trail: Realism Edition" + desc = "Learn how our ancestors got to Orion, and try not to die in the process!" + newgame() + emagged = 1 + +/mob/living/simple_animal/hostile/syndicate/ranged/orion + name = "Spaceport Security" + desc = "The Premier security forces for all spaceports found along the Orion Trail." + faction = list("orion") + corpse = /obj/effect/landmark/mobcorpse/orionsecurity + +/obj/effect/landmark/mobcorpse/orionsecurity + name = "Spaceport Security" + corpseuniform = /obj/item/clothing/under/syndicate + corpsesuit = /obj/item/clothing/suit/armor/vest + corpseshoes = /obj/item/clothing/shoes/combat + corpsegloves = /obj/item/clothing/gloves/combat + corpseradio = /obj/item/device/radio/headset + corpsemask = /obj/item/clothing/mask/gas + corpsehelmet = /obj/item/clothing/head/helmet/swat + corpseback = /obj/item/weapon/storage/backpack + corpseid = 1 + corpseidjob = "Officer" + corpseidaccess = "Syndicate" + +/obj/item/weapon/orion_ship + name = "model settler ship" + desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." + icon = 'icons/obj/toy.dmi' + icon_state = "ship" + w_class = 2 + var/active = 0 //if the ship is on + +/obj/item/weapon/orion_ship/examine(mob/user) + ..() + if(!(in_range(user, src))) + return + if(!active) + user << "There's a little switch on the bottom. It's flipped down." + else + user << "There's a little switch on the bottom. It's flipped up." + +/obj/item/weapon/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse + if(active) + return + + message_admins("[key_name_admin(usr)] primed an explosive Orion ship for detonation.") + log_game("[key_name(usr)] primed an explosive Orion ship for detonation.") + + user << "You flip the switch on the underside of [src]." + active = 1 + src.visible_message("[src] softly beeps and whirs to life!") + playsound(src.loc, 'sound/machines/defib_SaftyOn.ogg', 25, 1) + atom_say("This is ship ID #[rand(1,1000)] to Orion Port Authority. We're coming in for landing, over.") + sleep(20) + src.visible_message("[src] begins to vibrate...") + atom_say("Uh, Port? Having some issues with our reactor, could you check it out? Over.") + sleep(30) + atom_say("Oh, God! Code Eight! CODE EIGHT! IT'S GONNA BL-") + playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 25, 1) + sleep(3.6) + src.visible_message("[src] explodes!") + explosion(src.loc, 1,2,4, flame_range = 3) + qdel(src) + + +#undef ORION_TRAIL_WINTURN +#undef ORION_TRAIL_RAIDERS +#undef ORION_TRAIL_FLUX +#undef ORION_TRAIL_ILLNESS +#undef ORION_TRAIL_BREAKDOWN +#undef ORION_TRAIL_LING +#undef ORION_TRAIL_LING_ATTACK +#undef ORION_TRAIL_MALFUNCTION +#undef ORION_TRAIL_COLLISION +#undef ORION_TRAIL_SPACEPORT +#undef ORION_TRAIL_BLACKHOLE \ No newline at end of file diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 0efc24b2ccb..f75b07f22be 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -11,9 +11,15 @@ var/processing = 0 var/icon_keyboard = "generic_key" var/icon_screen = "generic" - var/light_range_on = 2 - var/light_power_on = 1 + var/light_range_on = 3 + var/light_power_on = 2 + var/overlay_layer + atom_say_verb = "beeps" +/obj/machinery/computer/New() + overlay_layer = layer + ..() + /obj/machinery/computer/initialize() power_change() update_icon() @@ -64,18 +70,18 @@ /obj/machinery/computer/update_icon() overlays.Cut() - - var/overlay_layer = LIGHTING_LAYER+0.1 - if(stat & NOPOWER) if(icon_keyboard) overlays += image(icon,"[icon_keyboard]_off",overlay_layer) return - overlays += image(icon, icon_keyboard ,overlay_layer) + if(stat & BROKEN) overlays += image(icon,"[icon_state]_broken",overlay_layer) else overlays += image(icon,icon_screen,overlay_layer) + + if(icon_keyboard) + overlays += image(icon, icon_keyboard ,overlay_layer) /obj/machinery/computer/power_change() @@ -86,7 +92,6 @@ else set_light(light_range_on, light_power_on) - /obj/machinery/computer/proc/set_broken() stat |= BROKEN update_icon() diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index f560e3c81ce..2d2e7adcfa3 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -238,6 +238,7 @@ FIRE ALARM if (!( src.working )) return var/area/A = get_area(src) + A.fire_reset() for(var/obj/machinery/firealarm/FA in A) fire_alarm.clearAlarm(loc, FA) return diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index ca86c4ba839..bca87a8bad8 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -381,7 +381,7 @@ Class Procs: for(var/obj/item/I in component_parts) if(I.reliability != 100 && crit_fail) I.crit_fail = 1 - I.loc = src.loc + I.forceMove(loc) qdel(src) /obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 1b3f89af28a..78b78c26e27 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -842,6 +842,22 @@ /obj/item/weapon/cartridge/atmos = 75,/obj/item/weapon/cartridge/janitor = 100,/obj/item/weapon/cartridge/signal/toxins = 150, /obj/item/weapon/cartridge/signal = 75,/obj/item/weapon/cartridge = 50) + +/obj/machinery/vending/liberationstation + name = "\improper Liberation Station" + desc = "An overwhelming amount of ancient patriotism washes over you just by looking at the machine." + icon_state = "liberationstation" + req_access_txt = "1" + product_slogans = "Liberation Station: Your one-stop shop for all things second amendment!;Be a patriot today, pick up a gun!;Quality weapons for cheap prices!;Better dead than red!" + product_ads = "Float like an astronaut, sting like a bullet!;Express your second amendment today!;Guns don't kill people, but you can!;Who needs responsibilities when you have guns?" + vend_reply = "Remember the name: Liberation Station!" + products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2, + /obj/item/weapon/gun/projectile/automatic/pistol/m2411 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2, + /obj/item/weapon/gun/projectile/shotgun/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1, + /obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2) + premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2) + contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3) + /obj/machinery/vending/cigarette name = "Cigarette machine" //OCD had to be uppercase to look nice with the new formating desc = "If you want to get cancer, might as well do it in style" diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm index 9f68e36ba7b..d8ef8c8b9fe 100644 --- a/code/game/mecha/combat/honker.dm +++ b/code/game/mecha/combat/honker.dm @@ -3,7 +3,7 @@ name = "H.O.N.K" icon_state = "honker" initial_icon = "honker" - step_in = 2 + step_in = 3 health = 140 deflect_chance = 60 internal_damage_threshold = 60 diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index e6c169e843d..5bbcb367291 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -3,7 +3,7 @@ name = "Odysseus" icon_state = "odysseus" initial_icon = "odysseus" - step_in = 2 + step_in = 3 max_temperature = 15000 health = 120 wreckage = /obj/effect/decal/mecha_wreckage/odysseus diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index a50b3e5d225..576442ac902 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -8,7 +8,8 @@ health = 200 lights_power = 7 deflect_chance = 15 - damage_absorption = list("brute"=0.6,"bomb"=0.2) + damage_absorption = list("brute"=0.6,"fire"=1,"bullet"=0.8,"laser"=0.9,"energy"=1,"bomb"=0.6) + max_equip = 6 wreckage = /obj/effect/decal/mecha_wreckage/ripley var/list/cargo = new var/cargo_capacity = 15 @@ -64,7 +65,8 @@ max_temperature = 65000 health = 250 lights_power = 7 - damage_absorption = list("fire"=0.5,"bullet"=0.8,"bomb"=0.5) + damage_absorption = list("brute"=0.6,"fire"=0.5,"bullet"=0.7,"laser"=0.7,"energy"=1,"bomb"=0.4) + max_equip = 5 // More armor, less tools wreckage = /obj/effect/decal/mecha_wreckage/ripley/firefighter /obj/mecha/working/ripley/deathripley @@ -73,7 +75,10 @@ icon_state = "deathripley" step_in = 2 opacity=0 + max_temperature = 65000 + health = 300 lights_power = 7 + damage_absorption = list("brute"=0.6,"fire"=0.4,"bullet"=0.6,"laser"=0.6,"energy"=1,"bomb"=0.3) wreckage = /obj/effect/decal/mecha_wreckage/ripley/deathripley step_energy_drain = 0 @@ -97,12 +102,23 @@ var/obj/item/mecha_parts/mecha_equipment/tool/drill/D = new /obj/item/mecha_parts/mecha_equipment/tool/drill D.attach(src) + //Add possible plasma cutter + if(prob(25)) + var/obj/item/mecha_parts/mecha_equipment/M = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma + M.attach(src) + + //Add ore box to cargo + cargo.Add(new /obj/structure/ore_box(src)) + //Attach hydrolic clamp var/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp/HC = new /obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp HC.attach(src) for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily qdel(B) + var/obj/item/mecha_parts/mecha_equipment/tool/mining_scanner/scanner = new /obj/item/mecha_parts/mecha_equipment/tool/mining_scanner + scanner.attach(src) + /obj/mecha/working/ripley/Exit(atom/movable/O) if(O in cargo) return 0 diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index c41f55fb7c0..778d3b74dc6 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -26,7 +26,7 @@ /obj/item/weapon/gun/projectile/automatic/pistol = 8, /obj/item/weapon/gun/projectile/shotgun/combat = 5, /obj/item/weapon/gun/projectile/revolver/mateba, - /obj/item/weapon/gun/projectile/automatic/deagle + /obj/item/weapon/gun/projectile/automatic/pistol/deagle ) /obj/effect/spawner/lootdrop/maintenance diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e2d587ccf39..380416eb6c5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -6,6 +6,14 @@ var/image/blood_overlay = null //this saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/blood_overlay_color = null var/item_state = null + var/lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + var/righthand_file = 'icons/mob/inhands/items_righthand.dmi' + + //Dimensions of the lefthand_file and righthand_file vars + //eg: 32x32 sprite, 64x64 sprite, etc. + var/inhand_x_dimension = 32 + var/inhand_y_dimension = 32 + var/r_speed = 1.0 var/health = null var/hitsound = null diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 48a976cac1f..ad6f64c706e 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -11,7 +11,6 @@ icon_state = "camera_bug" w_class = 1.0 item_state = "camera_bug" - icon_override = 'icons/mob/in-hand/tools.dmi' throw_speed = 4 throw_range = 20 diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index f78f420d8d8..42653c3ff1b 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -3,7 +3,6 @@ desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production." icon_state = "flash" item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang) - icon_override = 'icons/mob/in-hand/tools.dmi' throwforce = 0 w_class = 1 throw_speed = 3 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index b3dbe66619e..0b461af0861 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -95,7 +95,6 @@ desc = "A robust flashlight used by security." icon_state = "seclite" item_state = "seclite" - icon_override = 'icons/mob/in-hand/tools.dmi' force = 9 // Not as good as a stun baton. brightness_on = 5 // A little better than the standard flashlight. hitsound = 'sound/weapons/genhit1.ogg' diff --git a/code/game/objects/items/devices/guitar.dm b/code/game/objects/items/devices/guitar.dm index fa6a7dbc3f3..546989c3c6e 100644 --- a/code/game/objects/items/devices/guitar.dm +++ b/code/game/objects/items/devices/guitar.dm @@ -6,7 +6,6 @@ icon = 'icons/obj/musician.dmi' icon_state = "guitar" item_state = "guitar" - icon_override = 'icons/mob/in-hand/tools.dmi' force = 10 var/datum/song/handheld/song hitsound = 'sound/effects/guitarsmash.ogg' diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c66d9c88cae..19812645eea 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -113,7 +113,6 @@ REAGENT SCANNER name = "Health Analyzer" icon_state = "health" item_state = "healthanalyzer" - icon_override = 'icons/mob/in-hand/tools.dmi' desc = "A hand-held body scanner able to distinguish vital signs of the subject." flags = CONDUCT slot_flags = SLOT_BELT diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index b90f987adf5..2b613ca2d5f 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -76,7 +76,6 @@ effective or pretty fucking useless. name = "Health Analyzer" icon_state = "health2" item_state = "healthanalyzer" - icon_override = 'icons/mob/in-hand/tools.dmi' desc = "A hand-held body scanner able to distinguish vital signs of the subject. A strange microlaser is hooked on to the scanning end." flags = CONDUCT slot_flags = SLOT_BELT diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index b629fb685c9..bfe90bf709d 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -3,7 +3,6 @@ desc = "Used by obese officers to save their breath for running." icon_state = "voice0" item_state = "flashtool" //looks exactly like a flash (and nothing like a flashbang) - icon_override = 'icons/mob/in-hand/tools.dmi' w_class = 1.0 flags = CONDUCT diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index cdde8b6f566..6c6ccefd541 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -131,6 +131,8 @@ icon = 'icons/obj/gun.dmi' icon_state = "revolver" item_state = "gun" + lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/guns_righthand.dmi' flags = CONDUCT slot_flags = SLOT_BELT w_class = 3.0 @@ -204,6 +206,8 @@ icon = 'icons/obj/gun.dmi' icon_state = "crossbow" item_state = "crossbow" + lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/guns_righthand.dmi' w_class = 2.0 attack_verb = list("attacked", "struck", "hit") var/bullets = 5 @@ -1096,7 +1100,6 @@ obj/item/toy/cards/deck/syndicate/black icon = 'icons/obj/toy.dmi' icon_state = "foamblade" item_state = "arm_blade" - icon_override = 'icons/mob/in-hand/changeling.dmi' attack_verb = list("pricked", "absorbed", "gored") w_class = 2 @@ -1109,7 +1112,6 @@ obj/item/toy/cards/deck/syndicate/black icon = 'icons/obj/device.dmi' icon_state = "flash" item_state = "flashtool" - icon_override = 'icons/mob/in-hand/tools.dmi' w_class = 1 /obj/item/toy/flash/attack(mob/living/M, mob/user) diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index 02f1e5d9cee..1fca60b065e 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -41,7 +41,6 @@ icon = 'icons/obj/chronos.dmi' icon_state = "chronogun" item_state = "chronogun" - icon_override = 'icons/mob/in-hand/guns.dmi' w_class = 3.0 projectile_type = "/obj/item/projectile/energy/chrono_beam" fire_sound = 'sound/weapons/Laser.ogg' diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 51fe775d82c..0e16bfe18ae 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -6,7 +6,6 @@ icon = 'icons/obj/weapons.dmi' icon_state = "defibunit" item_state = "defibunit" - icon_override = 'icons/mob/in-hand/tools.dmi' slot_flags = SLOT_BACK force = 5 throwforce = 6 @@ -249,7 +248,6 @@ icon = 'icons/obj/weapons.dmi' icon_state = "defibpaddles" item_state = "defibpaddles" - icon_override = 'icons/mob/in-hand/tools.dmi' force = 0 throwforce = 6 w_class = 4 diff --git a/code/game/objects/items/weapons/grenades/bananade.dm b/code/game/objects/items/weapons/grenades/bananade.dm index cdaa19066f2..998c19e9837 100644 --- a/code/game/objects/items/weapons/grenades/bananade.dm +++ b/code/game/objects/items/weapons/grenades/bananade.dm @@ -8,7 +8,6 @@ var/turf/T icon = 'icons/obj/grenade.dmi' icon_state = "banana" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' var/deliveryamt = 8 var/spawner_type = /obj/item/weapon/bananapeel diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 9732d685b1a..13717265c78 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -7,7 +7,6 @@ desc = "A do it yourself grenade casing!" icon_state = "chemg" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' var/bomb_state = "chembomb" var/payload_name = null // used for spawned grenades w_class = 2 diff --git a/code/game/objects/items/weapons/grenades/clowngrenade.dm b/code/game/objects/items/weapons/grenades/clowngrenade.dm index 2cb7e36c4d0..3066c762cd3 100644 --- a/code/game/objects/items/weapons/grenades/clowngrenade.dm +++ b/code/game/objects/items/weapons/grenades/clowngrenade.dm @@ -3,7 +3,6 @@ desc = "HONK! brand Bananas. In a special applicator for rapid slipping of wide areas." icon_state = "banana" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' w_class = 2.0 force = 2.0 var/stage = 0 diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index d4d90b3f094..65fab5cbbe0 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -2,7 +2,6 @@ name = "classic emp grenade" icon_state = "emp" item_state = "emp" - icon_override = 'icons/mob/in-hand/tools.dmi' origin_tech = "materials=2;magnets=3" prime() diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index c8dc3883819..9efb53e3207 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -2,7 +2,6 @@ name = "flashbang" icon_state = "flashbang" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' origin_tech = "materials=2;combat=1" var/banglet = 0 diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index 6a4fe395384..c0f619244e6 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -21,7 +21,6 @@ icon = 'icons/obj/grenade.dmi' icon_state = "improvised_grenade" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' throw_speed = 3 throw_range = 7 flags = CONDUCT @@ -72,7 +71,6 @@ icon = 'icons/obj/grenade.dmi' icon_state = "improvised_grenade" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' throw_speed = 3 throw_range = 7 flags = CONDUCT diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 7eb4ff27981..b2cd9a8981e 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -5,7 +5,6 @@ icon = 'icons/obj/grenade.dmi' icon_state = "grenade" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' throw_speed = 4 throw_range = 20 flags = CONDUCT diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index fc216a1e455..1a7df430726 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -5,7 +5,6 @@ icon_state = "flashbang" det_time = 20 item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' slot_flags = SLOT_BELT var/datum/effect/effect/system/bad_smoke_spread/smoke diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 224624549c7..dbcb27c5f16 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/grenade.dmi' icon_state = "delivery" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' origin_tech = "materials=3;magnets=4" var/banglet = 0 var/spawner_type = null // must be an object path diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index 52efab0a48b..160c6846d3c 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/grenade.dmi' icon_state = "syndicate" item_state = "flashbang" - icon_override = 'icons/mob/in-hand/tools.dmi' origin_tech = "materials=3;magnets=4;syndicate=4" /obj/item/weapon/grenade/syndieminibomb/prime() diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 1925455529c..d7c1e63c3ee 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -110,7 +110,6 @@ desc = "An entangling bolas. Throw at your foes to trip them and prevent them from running." gender = NEUTER icon = 'icons/obj/weapons.dmi' - icon_override = 'icons/mob/in-hand/swords.dmi' icon_state = "bolas" siemens_coefficient = 1 slot_flags = SLOT_BELT diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 27f233e75b3..8af5840b3db 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -36,7 +36,6 @@ name = "energy sword" desc = "May the force be within you." icon_state = "sword0" - icon_override = 'icons/mob/in-hand/swords.dmi' force = 3.0 throwforce = 5.0 throw_speed = 1 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index e60b78df8d0..a1e97eb3f92 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -155,3 +155,9 @@ /obj/item/weapon/stock_parts/cell/emproof/corrupt() return + +/obj/item/weapon/stock_parts/cell/temperaturegun + name = "temperature gun cell" + desc = "A specially designed power cell for heating and cooling projectiles" + icon_state = "icell" + maxcharge = 900 \ No newline at end of file diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 16ea25939d8..5c414831bf7 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -88,7 +88,6 @@ desc = "An advanced riot shield made of lightweight materials that collapses for easy storage." icon = 'icons/obj/weapons.dmi' icon_state = "teleriot0" - icon_override = 'icons/mob/in-hand/tools.dmi' slot_flags = null force = 3 throwforce = 3 diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm index 988273c5b1e..7ad4f40b668 100644 --- a/code/game/objects/items/weapons/signs.dm +++ b/code/game/objects/items/weapons/signs.dm @@ -1,7 +1,6 @@ /obj/item/weapon/picket_sign icon_state = "picket" item_state = "picket" - icon_override = 'icons/mob/in-hand/tools.dmi' name = "blank picket sign" desc = "It's blank" force = 5 diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm index 021c3a7618f..9cf7b4cce63 100644 --- a/code/game/objects/items/weapons/staff.dm +++ b/code/game/objects/items/weapons/staff.dm @@ -17,7 +17,6 @@ icon = 'icons/obj/wizard.dmi' icon_state = "broom" item_state = "broom0" - icon_override = 'icons/mob/in-hand/staff.dmi' /obj/item/weapon/twohanded/staff/broom/attack_self(mob/user as mob) ..() @@ -58,7 +57,6 @@ icon = 'icons/obj/wizard.dmi' icon_state = "horsebroom" item_state = "horsebroom0" - icon_override = 'icons/mob/in-hand/staff.dmi' /obj/item/weapon/twohanded/staff/broom/horsebroom/attack_self(mob/user as mob) ..() diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index 205f2c2e234..debbe18d023 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -5,7 +5,6 @@ desc = "Special mechanical module made to store, sort, and apply standard machine parts." icon_state = "RPED" item_state = "RPED" - icon_override = 'icons/mob/in-hand/tools.dmi' w_class = 5 can_hold = list("/obj/item/weapon/stock_parts") storage_slots = 50 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 2e59a30fb9c..a19c240849e 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -12,6 +12,7 @@ slot_flags = SLOT_BACK //ERROOOOO max_w_class = 3 max_combined_w_class = 21 + storage_slots = 21 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params) playsound(src.loc, "rustle", 50, 1, -5) @@ -73,7 +74,6 @@ icon_state = "giftbag0" item_state = "giftbag" w_class = 4.0 - storage_slots = 20 max_w_class = 3 max_combined_w_class = 400 // can store a ton of shit! @@ -197,7 +197,6 @@ desc = "A very slim satchel that can easily fit into tight spaces." icon_state = "satchel-flat" w_class = 3 //Can fit in backpacks itself. - storage_slots = 5 max_combined_w_class = 15 level = 1 cant_hold = list(/obj/item/weapon/storage/backpack/satchel_flat) //muh recursive backpacks @@ -224,11 +223,9 @@ /obj/item/weapon/storage/backpack/duffel name = "duffelbag" desc = "A large grey duffelbag designed to hold more items than a regular bag." - icon_override = 'icons/mob/in-hand/duffelbag.dmi' icon_state = "duffel" item_state = "duffel" - storage_slots = 9 // Duffelbags can hold more items. - max_combined_w_class = 27 + max_combined_w_class = 30 slowdown = 1 /obj/item/weapon/storage/backpack/duffel/syndie @@ -272,7 +269,6 @@ desc = "A suspicious looking dufflebag for holding surgery tools." icon_state = "duffel-syndimed" item_state = "duffle-syndimed" - storage_slots = 12 /obj/item/weapon/storage/backpack/duffel/syndie/surgery/New() ..() diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index c3d0040b07f..011d337cea0 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -12,7 +12,6 @@ name = "first-aid kit" desc = "It's an emergency medical kit for those serious boo-boos." icon_state = "firstaid" - icon_override = 'icons/mob/in-hand/medkits.dmi' throw_speed = 2 throw_range = 8 var/empty = 0 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 65bf38cd961..a300b44971b 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -235,7 +235,7 @@ return 0 //Means the item is already in the storage item if(contents.len >= storage_slots) if(!stop_messages) - usr << "[src] is full, make some space." + usr << "[W] won't fit in [src], make some space!" return 0 //Storage item is full if(can_hold.len) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index f0d273e58fc..dc5425616ac 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -200,7 +200,6 @@ desc = "A high-tech nitrogen tank designed specifically for Vox." icon_state = "emergency_vox" item_state = "emergency_vox" - icon_override = 'icons/mob/in-hand/tools.dmi' volume = 25 diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 7dd5365e20a..7ba38405929 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -108,7 +108,6 @@ icon = 'icons/obj/watertank.dmi' icon_state = "mister" item_state = "mister" - icon_override = 'icons/mob/in-hand/tools.dmi' w_class = 4.0 amount_per_transfer_from_this = 50 possible_transfer_amounts = list(25,50,100) @@ -210,7 +209,6 @@ icon = 'icons/obj/watertank.dmi' icon_state = "atmos_nozzle" item_state = "nozzleatmos" - icon_override = 'icons/mob/in-hand/tools.dmi' safety = 0 max_water = 200 power = 8 diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 2582a42c214..263677164b4 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -199,7 +199,6 @@ obj/item/weapon/twohanded/ /obj/item/weapon/twohanded/dualsaber var/hacked = 0 var/blade_color - icon_override = 'icons/mob/in-hand/swords.dmi' icon_state = "dualsaber0" name = "double-bladed energy sword" desc = "Handle with care." @@ -365,7 +364,6 @@ obj/item/weapon/twohanded/ ///CHAINSAW/// /obj/item/weapon/twohanded/chainsaw - icon_override = 'icons/mob/in-hand/swords.dmi' icon_state = "chainsaw0" name = "Chainsaw" desc = "Perfect for felling trees or fellow spacemen." @@ -423,8 +421,6 @@ obj/item/weapon/twohanded/ /obj/item/weapon/twohanded/singularityhammer name = "singularity hammer" desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows." - - icon_override = 'icons/mob/in-hand/swords.dmi' icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK @@ -498,7 +494,6 @@ obj/item/weapon/twohanded/ /obj/item/weapon/twohanded/mjollnir name = "Mjollnir" desc = "A weapon worthy of a god, able to strike with the force of a lightning bolt. It crackles with barely contained energy." - icon_override = 'icons/mob/in-hand/swords.dmi' icon_state = "mjollnir0" flags = CONDUCT slot_flags = SLOT_BACK @@ -546,9 +541,7 @@ obj/item/weapon/twohanded/ /obj/item/weapon/twohanded/knighthammer name = "singuloth knight's hammer" desc = "A hammer made of sturdy metal with a golden skull adorned with wings on either side of the head.
This weapon causes devastating damage to those it hits due to a power field sustained by a mini-singularity inside of the hammer." - - icon_override = 'icons/mob/in-hand/swords.dmi' - icon_state = "adrhammer0" + icon_state = "knighthammer0" flags = CONDUCT slot_flags = SLOT_BACK no_embed = 1 @@ -579,7 +572,7 @@ obj/item/weapon/twohanded/ return /obj/item/weapon/twohanded/knighthammer/update_icon() //Currently only here to fuck with the on-mob icons. - icon_state = "adrhammer[wielded]" + icon_state = "knighthammer[wielded]" return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 1f4f085aa87..f492bcc639c 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -45,6 +45,12 @@ LINEN BINS icon_state = "sheetpurple" _color = "purple" +/obj/item/weapon/bedsheet/patriot + name = "patriotic bedsheet" + desc = "You've never felt more free than when sleeping on this." + icon_state = "sheetUSA" + _color = "sheetUSA" + /obj/item/weapon/bedsheet/rainbow name = "rainbow bedsheet" desc = "A multi_colored blanket. It's actually several different sheets cut up and sewn together." diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 5f21f2d0c84..52c789f9c43 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -44,11 +44,11 @@ new /obj/item/weapon/storage/box/teargas(src) new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/storage/backpack/duffel/syndie/med(src) - new /obj/item/weapon/gun/projectile/automatic/bulldog(src) - new /obj/item/weapon/gun/projectile/automatic/bulldog(src) - new /obj/item/weapon/gun/projectile/automatic/bulldog(src) - new /obj/item/weapon/gun/projectile/automatic/bulldog(src) - new /obj/item/weapon/gun/projectile/automatic/bulldog(src) + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src) + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src) + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src) + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src) + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(src) new /obj/item/weapon/pinpointer/nukeop(src) new /obj/item/weapon/pinpointer/nukeop(src) new /obj/item/weapon/pinpointer/nukeop(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index d693a574c18..69bf6f6a8f6 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -1,55 +1,88 @@ +#define DISPLAYCASE_FRAME_CIRCUIT 0 +#define DISPLAYCASE_FRAME_SCREWDRIVER 1 + +// List and hook used to set up the captain's print on their display case +var/global/list/captain_display_cases = list() + +/hook/captain_spawned/proc/displaycase(mob/living/carbon/human/captain) + if(!captain_display_cases.len) + return 1 + var/fingerprint = captain.get_full_print() + for(var/obj/structure/displaycase/D in captain_display_cases) + if(istype(D)) + D.ue = fingerprint + + return 1 + /obj/structure/displaycase_frame name = "display case frame" icon = 'icons/obj/stock_parts.dmi' - icon_state="box_glass" + icon_state = "box_glass" var/obj/item/weapon/airlock_electronics/circuit = null - var/state=0 + var/obj/item/device/assembly/prox_sensor/sensor = null + var/state = DISPLAYCASE_FRAME_CIRCUIT /obj/structure/displaycase_frame/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - var/pstate=state - var/turf/T=get_turf(src) + var/pstate = state + var/turf/T = get_turf(src) switch(state) - if(0) - if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked") + if(DISPLAYCASE_FRAME_CIRCUIT) + if(istype(W, /obj/item/weapon/airlock_electronics) && W.icon_state != "door_electronics_smoked") user.drop_item() circuit = W - circuit.loc = src + circuit.forceMove(src) state++ - playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) + user << "You add the airlock electronics to the frame." + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) if(istype(W, /obj/item/weapon/crowbar)) new /obj/machinery/constructable_frame/machine_frame(T) - new /obj/item/stack/sheet/glass(T) + var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(T) + G.amount = 5 qdel(src) + user << "You pry the glass out of the frame." playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) return - if(1) + if(DISPLAYCASE_FRAME_SCREWDRIVER) if(isscrewdriver(W)) - var/obj/structure/displaycase/C=new(T) + var/obj/structure/displaycase/C = new(T) if(circuit.one_access) C.req_access = null C.req_one_access = circuit.conf_access else C.req_access = circuit.conf_access C.req_one_access = null + if(isprox(sensor)) + C.burglar_alarm = 1 playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1) qdel(src) return if(istype(W, /obj/item/weapon/crowbar)) - circuit.loc=T - circuit=null + circuit.forceMove(T) + circuit = null + if(isprox(sensor)) + sensor.forceMove(T) + sensor = null state-- + user << "You pry the electronics out of the frame." playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) - if(pstate!=state) - pstate=state + if(isprox(W) && !isprox(sensor)) + user.drop_item() + sensor = W + sensor.forceMove(src) + user << "You add the proximity sensor to the frame." + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + + if(pstate != state) + pstate = state update_icon() /obj/structure/displaycase_frame/update_icon() switch(state) if(1) - icon_state="box_glass_circuit" + icon_state = "box_glass_circuit" else - icon_state="box_glass" + icon_state = "box_glass" /obj/structure/displaycase name = "display case" @@ -58,42 +91,52 @@ desc = "A display case for prized possessions. It taunts you to kick it." density = 1 anchored = 1 - unacidable = 1//Dissolving the case would also delete the contents. + unacidable = 1 //Dissolving the case would also delete the contents. var/health = 30 var/obj/item/occupant = null var/destroyed = 0 var/locked = 0 + var/burglar_alarm = 0 var/ue = null var/image/occupant_overlay = null var/obj/item/weapon/airlock_electronics/circuit - + /obj/structure/displaycase/captains_laser name = "captain's display case" - desc = "A display case for the captain's antique laser gun. It taunts you to kick it." + desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system." + burglar_alarm = 1 /obj/structure/displaycase/captains_laser/New() + captain_display_cases += src req_access = list(access_captain) locked = 1 spawn(5) occupant = new /obj/item/weapon/gun/energy/laser/captain(src) update_icon() - -/obj/structure/proc/getPrint(mob/user as mob) - return md5(user:dna:uni_identity) - + +/obj/structure/displaycase/Destroy() + dump() + qdel(circuit) + circuit = null + return ..() + +/obj/structure/displaycase/captain_laser/Destroy() + captain_display_cases -= src + return ..() + /obj/structure/displaycase/examine(mob/user) ..(user) - user << "\blue Peering through the glass, you see that it contains:" + user << "Peering through the glass, you see that it contains:" if(occupant) - user << "\icon[occupant] \blue \A [occupant]" + user << "\icon[occupant] \A [occupant]." else user << "Nothing." /obj/structure/displaycase/proc/dump() if(occupant) - occupant.loc=get_turf(src) - occupant=null - occupant_overlay=null + occupant.forceMove(get_turf(src)) + occupant = null + occupant_overlay = null /obj/structure/displaycase/ex_act(severity) switch(severity) @@ -111,7 +154,6 @@ src.health -= 5 src.healthcheck() - /obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj) if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) health -= Proj.damage @@ -127,16 +169,27 @@ /obj/structure/displaycase/proc/healthcheck() if (src.health <= 0) + health = 0 if (!( src.destroyed )) src.density = 0 src.destroyed = 1 PoolOrNew(/obj/item/weapon/shard, loc) playsound(get_turf(src), "shatter", 70, 1) update_icon() + + burglar_alarm() else playsound(get_turf(src), 'sound/effects/Glasshit.ogg', 75, 1) return - + +/obj/structure/displaycase/proc/burglar_alarm() + if(burglar_alarm) + var/area/alarmed = get_area(src) + alarmed.burglaralert(src) + visible_message("The burglar alarm goes off!") + return 1 + return 0 + /obj/structure/displaycase/update_icon() if(src.destroyed) src.icon_state = "glassbox2b" @@ -147,102 +200,110 @@ var/icon/occupant_icon=getFlatIcon(occupant) occupant_icon.Scale(16,16) occupant_overlay = image(occupant_icon) - occupant_overlay.pixel_x=8 - occupant_overlay.pixel_y=8 + occupant_overlay.pixel_x = 8 + occupant_overlay.pixel_y = 8 if(locked) - occupant_overlay.alpha=128//ChangeOpacity(0.5) - //underlays += occupant_overlay + occupant_overlay.alpha = 128 overlays += occupant_overlay return - /obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/card)) - var/obj/item/weapon/card/id/I=W + var/obj/item/weapon/card/id/I = W if(!check_access(I)) - user << "\red Access denied." + user << "Access denied." return locked = !locked if(!locked) - user << "\icon[src] \blue \The [src] clicks as locks release, and it slowly opens for you." + user << "\icon[src] \The [src] clicks as locks release, and it slowly opens for you." else - user << "\icon[src] \blue You close \the [src] and swipe your card, locking it." + user << "\icon[src] You close \the [src] and swipe your card, locking it." update_icon() return if(istype(W,/obj/item/weapon/crowbar) && (!locked || destroyed)) user.visible_message("[user.name] pries \the [src] apart.", \ "You pry \the [src] apart.", \ "You hear something pop.") - var/turf/T=get_turf(src) + var/turf/T = get_turf(src) playsound(T, 'sound/items/Crowbar.ogg', 50, 1) dump() var/obj/item/weapon/airlock_electronics/C = circuit if(!C) - C=new (src) - C.one_access=!(req_access && req_access.len>0) + C = new (src) + C.one_access = !(req_access && req_access.len>0) if(!C.one_access) - C.conf_access=req_access + C.conf_access = req_access else - C.conf_access=req_one_access + C.conf_access = req_one_access + if(!destroyed) - var/obj/structure/displaycase_frame/F=new(T) - F.state=1 - F.circuit=C - F.circuit.loc=F + var/obj/structure/displaycase_frame/F = new(T) + F.state = DISPLAYCASE_FRAME_SCREWDRIVER + F.circuit = C + F.circuit.forceMove(F) + if(burglar_alarm) + new /obj/item/device/assembly/prox_sensor(T) F.update_icon() else - C.loc=T - circuit=null + C.forceMove(T) + circuit = null new /obj/machinery/constructable_frame/machine_frame(T) qdel(src) + return if(user.a_intent == I_HARM) - src.health -= W.force - src.healthcheck() - ..() + if(locked && !destroyed) + src.health -= W.force + src.healthcheck() + ..() + else if(!locked) + dump() + user << "You smash \the [W] into the delicate electronics at the bottom of the case, and deactivate the hover field." + update_icon() else if(locked) - user << "\red It's locked, you can't put anything into it." + user << "It's locked, you can't put anything into it." return if(!occupant) - user << "\blue You insert \the [W] into \the [src], and it floats as the hoverfield activates." + user << "You insert \the [W] into \the [src], and it floats as the hoverfield activates." user.drop_item() - W.loc=src + W.forceMove(src) occupant=W update_icon() - /obj/structure/displaycase/attack_hand(mob/user as mob) - if (destroyed) + if (destroyed || (!locked && user.a_intent == I_HARM)) if(occupant) dump() - user << "\red You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field permanently." + user << "You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field." src.add_fingerprint(user) update_icon() else if(user.a_intent == I_HARM) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src) - user.visible_message("\red [user.name] kicks \the [src]!", \ - "\red You kick \the [src]!", \ + user.visible_message("[user.name] kicks \the [src]!", \ + "You kick \the [src]!", \ "You hear glass crack.") src.health -= 2 healthcheck() else if(!locked) if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/print = H.get_full_print() if(!ue) - user << "\blue Your press your thumb against the fingerprint scanner, registering your identity with the case." - ue = getPrint(user) + user << "Your press your thumb against the fingerprint scanner, registering your identity with the case." + ue = print return - if(ue!=getPrint(user)) - user << "\red Access denied." + if(ue != print) + user << "Access denied." return if(occupant) - user << "\blue Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case." + user << "Your press your thumb against the fingerprint scanner, and deactivate the hover field built into the case." dump() update_icon() else - src << "\icon[src] \red \The [src] is empty!" + src << "\icon[src] \The [src] is empty!" else user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \ "You gently run your hands over \the [src] in appreciation of its contents.", \ diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm index 4af9b504ed3..0a9917fda9d 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm @@ -63,7 +63,7 @@ handle_rotation() if(pulling) // Driver if(pulling.loc == src.loc) // We moved onto the wheelchair? Revert! - pulling.loc = T + pulling.forceMove(T) else spawn(0) if(get_dist(src, pulling) > 1) // We are too far away? Losing control. @@ -95,7 +95,7 @@ pulling = null else if (occupant && (src.loc != occupant.loc)) - src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving + forceMove(occupant.loc) // Failsafe to make sure the wheelchair stays beneath the occupant after driving handle_rotation() /obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 7c973eed7ec..0f10a583e06 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -848,6 +848,7 @@ anchored = 1.0 throwpass = 1 //You can throw objects over this, despite it's density. var/parts = /obj/item/weapon/rack_parts + var/health = 5 /obj/structure/rack/proc/destroy() new parts(loc) @@ -914,6 +915,14 @@ visible_message("[user] smashes [src] apart!") user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) destroy() + else + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + playsound(loc, 'sound/items/dodgeball.ogg', 80, 1) + user.visible_message("[user] kicks [src].", \ + "You kick [src].") + health -= rand(1,2) + healthcheck() /obj/structure/rack/mech_melee_attack(obj/mecha/M) visible_message("[M] smashes [src] apart!") @@ -933,3 +942,7 @@ /obj/structure/rack/attack_tk() // no telehulk sorry return + +/obj/structure/rack/proc/healthcheck() + if(health <= 0) + destroy() \ No newline at end of file diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index dc67751f667..2c427d62e40 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -138,6 +138,7 @@ var/list/mechtoys = list( var/ordernum var/datum/supply_packs/object = null var/orderedby = null + var/orderedrank = null var/comment = null /datum/controller/supply @@ -300,14 +301,19 @@ var/list/mechtoys = list( var/datum/supply_packs/SP = SO.object var/atom/A = new SP.containertype(pickedloc) - A.name = "[SP.containername]"// [SO.comment ? "([SO.comment])":"" ]" + A.name = "[SP.containername]" //supply manifest generation begin - var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A) + slip.name = "Shipping Manifest - '[SP.name]' for [SO.orderedby]" slip.info = "

[command_name()] Shipping Manifest



" - slip.info +="Order #[SO.ordernum]
" + slip.info +="Order: #[SO.ordernum]
" slip.info +="Destination: [station_name]
" + slip.info +="Requested By: [SO.orderedby]
" + slip.info +="Rank: [SO.orderedrank]
" + slip.info +="Reason: [SO.comment]
" + slip.info +="Supply Crate Type: [SP.name]
" + slip.info +="Access Restriction: [replacetext(get_access_desc(SP.access))]
" slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
" slip.info +="CONTENTS:
    " @@ -482,6 +488,7 @@ var/list/mechtoys = list( O.ordernum = supply_controller.ordernum O.object = P O.orderedby = idname + O.orderedrank = idrank O.comment = reason supply_controller.requestlist += O @@ -691,6 +698,7 @@ var/list/mechtoys = list( O.ordernum = supply_controller.ordernum O.object = P O.orderedby = idname + O.orderedrank = idrank O.comment = reason supply_controller.requestlist += O diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index a4a836db6a6..ca079ba8139 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -606,7 +606,7 @@ var/global/nologevent = 0 return if(confirm == "Yes") var/delay = input("What delay should the restart have (in seconds)?", "Restart Delay", 5) as num - if(!delay) + if(isnull(delay)) delay = 50 else delay = delay * 10 diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index d3256579191..1d414c7ebf9 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -2,16 +2,14 @@ set name = "Broken Sprite List" set category = "Debug" - var/icon/IL = new('icons/mob/items_lefthand.dmi') - var/list/Lstates = IL.IconStates() - var/icon/IR = new('icons/mob/items_righthand.dmi') - var/list/Rstates = IR.IconStates() - - var/text for(var/A in typesof(/obj/item)) var/obj/item/O = new A( locate(1,1,1) ) if(!O) continue + var/icon/IL = new(O.lefthand_file) + var/list/Lstates = IL.IconStates() + var/icon/IR = new(O.righthand_file) + var/list/Rstates = IR.IconStates() var/icon/J = new(O.icon) var/list/istates = J.IconStates() if(!Lstates.Find(O.icon_state) && !Lstates.Find(O.item_state)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index c1f20ae4d53..cdc89d056ad 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -704,7 +704,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/weapon/cloaking_device(M), slot_r_store) - M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic(M), slot_r_hand) + M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand) M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store) if ("tournament chef") //Steven Seagal FTW diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 2985f05aab8..8d41f49a918 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -16,7 +16,7 @@ msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, "holder")]) (CA) (SC): [msg]" for(var/client/X in admins) - if(R_EVENT & X.holder.rights) + if(check_rights(R_EVENT,0,X.mob)) X << msg usr << "Your prayers have been received by the gods." @@ -37,7 +37,7 @@ msg = "\blue SYNDICATE: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" for(var/client/X in admins) - if(R_EVENT & X.holder.rights) + if(check_rights(R_EVENT,0,X.mob)) X << msg /proc/HONK_announce(var/text , var/mob/Sender) @@ -53,12 +53,16 @@ msg = "\blue ERT REQUEST: [key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (REPLY): [msg]" for(var/client/X in admins) - if(R_EVENT & X.holder.rights) + if(check_rights(R_EVENT,0,X.mob)) X << msg /proc/Nuke_request(text , mob/Sender) var/nuke_code = get_nuke_code() var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN)) msg = "NUKE CODE REQUEST: [key_name(Sender)] (PP) (VV) (SM) ([admin_jump_link(Sender, "holder")]) (CA) (BSA) (RPLY): [msg]" - admins << msg - admins << "The nuke code is [nuke_code]." \ No newline at end of file + + for(var/client/X in admins) + if(check_rights(R_EVENT,0,X.mob)) + X << msg + X << "The nuke code is [nuke_code]." + \ No newline at end of file diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 6729f81a27c..0fff922d086 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -160,7 +160,7 @@ var/global/sent_syndicate_strike_team = 0 equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(src), slot_l_store) equip_to_slot_or_del(new /obj/item/weapon/grenade/empgrenade(src), slot_r_store) equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store) - equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/m2411(src), slot_belt) + equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt) equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand) diff --git a/code/modules/alarm/burglar_alarm.dm b/code/modules/alarm/burglar_alarm.dm new file mode 100644 index 00000000000..c55cb12deef --- /dev/null +++ b/code/modules/alarm/burglar_alarm.dm @@ -0,0 +1,2 @@ +/datum/alarm_handler/burglar + category = "Burglar Alarms" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 37e2f588fc3..e777a1cc020 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -128,6 +128,7 @@ datum/preferences var/species = "Human" var/language = "None" //Secondary language + var/body_accessory = null var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess @@ -366,10 +367,14 @@ datum/preferences dat += "
    Eyes
    " dat += "Change Color
    __

    " - if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin") + if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People" || species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins dat += "
    Body Color
    " dat += "Change Color
    __
    " + if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) + dat += "
    Body Accessory
    " + dat += "Accessory: [body_accessory ? "[body_accessory]" : "None"]
    " + dat += "
    " if (1) // General Preferences @@ -1165,10 +1170,27 @@ datum/preferences valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] - var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles + var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles if(new_h_style) h_style = new_h_style + if("body_accessory") + var/list/possible_body_accessories = list() + if(check_rights(R_ADMIN, 1, user)) + possible_body_accessories = body_accessory_by_name.Copy() + else + for(var/B in body_accessory_by_name) + var/datum/body_accessory/accessory = body_accessory_by_name[B] + if(!istype(accessory)) + possible_body_accessories += "None" //the only null entry should be the "None" option + continue + if(species in accessory.allowed_species) + possible_body_accessories += B + + var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories + if(new_body_accessory) + body_accessory = new_body_accessory + if("facial") var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference") as color|null if(new_facial) @@ -1246,7 +1268,7 @@ datum/preferences s_tone = 35 - max(min( round(new_s_tone), 220),1) if("skin") - if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin") + if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Slime People"|| species == "Vulpkanin" || body_accessory_by_species[species] || check_rights(R_ADMIN, 1, user)) var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference") as color|null if(new_skin) r_skin = hex2num(copytext(new_skin, 2, 4)) @@ -1571,6 +1593,9 @@ datum/preferences character.undershirt = undershirt character.socks = socks + if(body_accessory) + character.body_accessory = body_accessory_by_name["[body_accessory]"] + if(backbag > 4 || backbag < 1) backbag = 1 //Same as above character.backbag = backbag diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preferences_mysql.dm index 8470ece80a9..f60b315d912 100644 --- a/code/modules/client/preferences_mysql.dm +++ b/code/modules/client/preferences_mysql.dm @@ -151,7 +151,8 @@ //socks socks = query.item[54] - + body_accessory = query.item[55] + //Sanitize metadata = sanitize_text(metadata, initial(metadata)) real_name = reject_bad_name(real_name) @@ -200,7 +201,7 @@ be_special = sanitize_integer(be_special, 0, 65535, initial(be_special)) socks = sanitize_text(socks, initial(socks)) - + body_accessory = sanitize_text(body_accessory, initial(body_accessory)) // if(isnull(disabilities)) disabilities = 0 if(!player_alt_titles) player_alt_titles = new() @@ -274,7 +275,8 @@ rlimb_data='[rlimblist]', nanotrasen_relation='[nanotrasen_relation]', speciesprefs='[speciesprefs]', - socks='[socks]' + socks='[socks]', + body_accessory='[body_accessory]' WHERE ckey='[C.ckey]' AND slot='[default_slot]'"} ) @@ -302,7 +304,9 @@ job_karma_high, job_karma_med, job_karma_low, flavor_text, med_record, sec_record, gen_record, player_alt_titles, be_special, - disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, socks) + disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs, + socks, body_accessory) + VALUES ('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]', '[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]', @@ -319,7 +323,9 @@ '[job_karma_high]', '[job_karma_med]', '[job_karma_low]', '[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]', '[playertitlelist]', '[be_special]', - '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]','[socks]') + '[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]', + '[socks]', '[body_accessory]') + "} ) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 0863f76f9a1..243842ff906 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -10,6 +10,8 @@ while sprite_sheets should be used for "flexible" clothing items that do not need to be refitted (e.g. vox wearing jumpsuits). */ var/list/sprite_sheets_refit = null + lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi' + righthand_file = 'icons/mob/inhands/clothing_righthand.dmi' //BS12: Species-restricted clothing check. /obj/item/clothing/mob_can_equip(M as mob, slot) diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 489886d697f..8c2527dffa0 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -174,3 +174,23 @@ desc = "An EVA suit specifically designed for the clown. SPESSHONK!" icon_state = "spaceclown_suit" item_state = "spaceclown_items" + +/obj/item/clothing/head/helmet/space/freedom + name = "eagle helmet" + desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." + icon_state = "griffinhat" + item_state = "griffinhat" + armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100) + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + unacidable = 1 + +/obj/item/clothing/suit/space/freedom + name = "eagle suit" + desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode." + icon_state = "freedom" + item_state = "freedom" + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) + armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100) + slowdown = 1 + max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT + unacidable = 1 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index ffd38f192a8..39aeeced2be 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -11,6 +11,13 @@ icon_state = "blue_pyjamas" _color = "blue_pyjamas" item_state = "w_suit" + +/obj/item/clothing/under/patriotsuit + name = "Patriotic Suit" + desc = "Motorcycle not included." + icon_state = "ek" + item_state = "ek" + _color = "ek" /obj/item/clothing/under/captain_fly name = "rogue captains uniform" diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index c8bbcc632bb..b7a6b31cb7c 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -148,3 +148,10 @@ var/global/datum/controller/plants/plant_controller // Set in New(). /datum/controller/plants/proc/remove_plant(var/obj/effect/plant/plant) plant_queue -= plant + +/client/proc/list_plant_sprites() + if(!plant_controller || !plant_controller.plant_sprites || !plant_controller.plant_sprites.len) + world << "Cannot list plant sprites, plant controller or plant sprites list may not be initialized." + + for(var/base in plant_controller.plant_sprites) + world << "[base] : [plant_controller.plant_sprites[base]] growth states" \ No newline at end of file diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index ff24279989b..dd744858635 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -43,10 +43,11 @@ kitchen_tag = "ghostchili" preset_icon = "ghostchilipepper" -/datum/seed/chili/ice/New() +/datum/seed/chili/ghost/New() ..() - set_trait(TRAIT_MATURATION,4) - set_trait(TRAIT_PRODUCTION,4) + set_trait(TRAIT_MATURATION,10) + set_trait(TRAIT_PRODUCTION,10) + set_trait(TRAIT_YIELD,3) set_trait(TRAIT_PRODUCT_COLOUR,"#00EDC6") // Berry plants/variants. diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 142b0772e2d..74994b64035 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -133,6 +133,8 @@ ) //--FalseIncarnate + var/last_plant_ikey //This is for debugging reference, and is otherwise useless. --FalseIncarnate + /obj/machinery/portable_atmospherics/hydroponics/AltClick() if(mechanical && !usr.stat && !usr.lying && Adjacent(usr)) close_lid(usr) diff --git a/code/modules/hydroponics/trays/tray_update_icons.dm b/code/modules/hydroponics/trays/tray_update_icons.dm index 45454c0d286..ceab49c8e2f 100644 --- a/code/modules/hydroponics/trays/tray_update_icons.dm +++ b/code/modules/hydroponics/trays/tray_update_icons.dm @@ -36,7 +36,9 @@ if(age >= seed.get_trait(TRAIT_MATURATION)) overlay_stage = seed.growth_stages else - var/maturation = round(seed.get_trait(TRAIT_MATURATION)/seed.growth_stages) + var/maturation = seed.get_trait(TRAIT_MATURATION)/seed.growth_stages + if(maturation < 1) + maturation = 1 overlay_stage = maturation ? max(1,round(age/maturation)) : 1 var/ikey = "[seed.get_trait(TRAIT_PLANT_ICON)]-[overlay_stage]" var/image/plant_overlay = plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"] @@ -45,6 +47,7 @@ plant_overlay.color = seed.get_trait(TRAIT_PLANT_COLOUR) plant_controller.plant_icon_cache["[ikey]-[seed.get_trait(TRAIT_PLANT_COLOUR)]"] = plant_overlay overlays |= plant_overlay + last_plant_ikey = ikey if(harvest && overlay_stage == seed.growth_stages) ikey = "[seed.get_trait(TRAIT_PRODUCT_ICON)]" diff --git a/code/modules/jungle/jungle_temple.dm b/code/modules/jungle/jungle_temple.dm index 320b0fbe9f7..1ecdab55973 100644 --- a/code/modules/jungle/jungle_temple.dm +++ b/code/modules/jungle/jungle_temple.dm @@ -159,7 +159,7 @@ var/new_type = pick( 200; /obj/item/weapon/hatchet, \ /obj/item/weapon/gun/projectile/automatic/pistol, \ - /obj/item/weapon/gun/projectile/automatic/deagle, \ + /obj/item/weapon/gun/projectile/automatic/pistol/deagle, \ /obj/item/weapon/gun/projectile/revolver/russian, \ ) new new_type(C) diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index d0ad62b8448..9cd39f5246b 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -101,22 +101,23 @@ inserted_id = I interact(user) return + if(exchange_parts(user, W)) return - if(default_deconstruction_crowbar(W)) - return - - if(default_unfasten_wrench(user, W)) - return - if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W)) - updateUsrDialog() - return if(panel_open) if(istype(W, /obj/item/weapon/crowbar)) empty_content() default_deconstruction_crowbar(W) - return 1 + return + + if(default_unfasten_wrench(user, W)) + return + + if(default_deconstruction_screwdriver(user, "ore_redemption-open", "ore_redemption", W)) + updateUsrDialog() + return + ..() /obj/machinery/mineral/ore_redemption/proc/SmeltMineral(var/obj/item/weapon/ore/O) @@ -253,7 +254,7 @@ while(s.amount > s.max_amount) new s.type(loc,s.max_amount) s.use(s.max_amount) - s.loc = loc + s.forceMove(loc) s.layer = initial(s.layer) /**********************Mining Equipment Locker**************************/ @@ -734,7 +735,6 @@ icon = 'icons/obj/syringe.dmi' icon_state = "lazarus_hypo" item_state = "hypo" - icon_override = 'icons/mob/in-hand/tools.dmi' throwforce = 0 w_class = 2.0 throw_speed = 3 diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 2815d1c5da7..c427205eabe 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -110,7 +110,6 @@ icon = 'icons/obj/mining.dmi' icon_state = "Gibtonite ore" item_state = "Gibtonite ore" - icon_override = 'icons/mob/in-hand/tools.dmi' w_class = 4 throw_range = 0 anchored = 1 //Forces people to carry it by hand, no pulling! diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 04b8745c4ac..e5b37c78657 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -27,7 +27,7 @@ if(!istype(W)) return 0 if(!l_hand) - W.loc = src //TODO: move to equipped? + W.forceMove(src) //TODO: move to equipped? l_hand = W W.layer = 20 //TODO: move to equipped? // l_hand.screen_loc = ui_lhand @@ -45,7 +45,7 @@ if(!istype(W)) return 0 if(!r_hand) - W.loc = src + W.forceMove(src) r_hand = W W.layer = 20 // r_hand.screen_loc = ui_rhand @@ -71,7 +71,7 @@ //This is probably the main one you need to know :) //Just puts stuff on the floor for most mobs, since all mobs have hands but putting stuff in the AI/corgi/ghost hand is VERY BAD. /mob/proc/put_in_hands(obj/item/W) - W.loc = get_turf(src) + W.forceMove(get_turf(src)) W.layer = initial(W.layer) W.dropped() @@ -114,7 +114,7 @@ if(I) if(client) client.screen -= I - I.loc = loc + I.forceMove(loc) I.dropped(src) if(I) I.layer = initial(I.layer) @@ -249,13 +249,13 @@ if (src.back && istype(src.back, /obj/item/weapon/storage/backpack)) var/obj/item/weapon/storage/backpack/B = src.back if(B.contents.len < B.storage_slots && W.w_class <= B.max_w_class) - W.loc = B + W.forceMove(B) equipped = 1 if(equipped) W.layer = 20 if(src.back && W.loc != src.back) - W.loc = src + W.forceMove(src) else if (del_on_fail) qdel(W) diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm new file mode 100644 index 00000000000..a115b9e1672 --- /dev/null +++ b/code/modules/mob/living/autohiss.dm @@ -0,0 +1,110 @@ + +#define AUTOHISS_OFF 0 +#define AUTOHISS_BASIC 1 +#define AUTOHISS_FULL 2 + +#define AUTOHISS_NUM 3 + + +/mob/living/proc/handle_autohiss(message, datum/language/L) + return message // no autohiss at this level + +/mob/living/carbon/human/handle_autohiss(message, datum/language/L) + if(!client || client.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off + return message + return species.handle_autohiss(message, L, client.autohiss_mode) + +/client + var/autohiss_mode = AUTOHISS_OFF + +/client/verb/toggle_autohiss() + set name = "Toggle Auto-Accent" + set desc = "Toggle automatic accents for your species" + set category = "OOC" + + autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM + switch(autohiss_mode) + if(AUTOHISS_OFF) + src << "Auto-hiss is now OFF." + if(AUTOHISS_BASIC) + src << "Auto-hiss is now BASIC." + if(AUTOHISS_FULL) + src << "Auto-hiss is now FULL." + else + autohiss_mode = AUTOHISS_OFF + src << "Auto-hiss is now OFF." + +/datum/species + var/list/autohiss_basic_map = null + var/list/autohiss_extra_map = null + var/list/autohiss_exempt = null + +/datum/species/unathi + autohiss_basic_map = list( + "s" = list("ss", "sss", "ssss") + ) + autohiss_extra_map = list( + "x" = list("ks", "kss", "ksss") + ) + autohiss_exempt = list("Sinta'unathi") + +/datum/species/tajaran + autohiss_basic_map = list( + "r" = list("rr", "rrr", "rrrr") + ) + autohiss_exempt = list("Siik'tajr") + +/datum/species/plasmaman + autohiss_basic_map = list( + "s" = list("ss", "sss", "ssss") + ) + +/datum/species/kidan + autohiss_basic_map = list( + "z" = list("zz", "zzz", "zzzz"), + "v" = list("vv", "vvv", "vvvv") + ) + autohiss_extra_map = list( + "s" = list("z", "zs", "zzz", "zzsz") + ) + autohiss_exempt = list("Chittin") + + +/datum/species/proc/handle_autohiss(message, datum/language/lang, mode) + if(!autohiss_basic_map) + return message + if(autohiss_exempt && (lang.name in autohiss_exempt)) + return message + + var/map = autohiss_basic_map.Copy() + if(mode == AUTOHISS_FULL && autohiss_extra_map) + map |= autohiss_extra_map + + . = list() + + while(length(message)) + var/min_index = 10000 // if the message is longer than this, the autohiss is the least of your problems + var/min_char = null + for(var/char in map) + var/i = findtext(message, char) + if(!i) // no more of this character anywhere in the string, don't even bother searching next time + map -= char + else if(i < min_index) + min_index = i + min_char = char + if(!min_char) // we didn't find any of the mapping characters + . += message + break + . += copytext(message, 1, min_index) + if(copytext(message, min_index, min_index+1) == uppertext(min_char)) + . += capitalize(pick(map[min_char])) + else + . += pick(map[min_char]) + message = copytext(message, min_index + 1) + + return list2text(.) + +#undef AUTOHISS_OFF +#undef AUTOHISS_BASIC +#undef AUTOHISS_FULL +#undef AUTOHISS_NUM 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 740c3e5ce25..f956dfb5b1a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -143,7 +143,7 @@ var/t_state = r_hand.item_state if(!t_state) t_state = r_hand.icon_state r_hand.screen_loc = ui_rhand - overlays_standing[X_R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = t_state) + overlays_standing[X_R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state" = t_state) else overlays_standing[X_R_HAND_LAYER] = null if(update_icons) update_icons() @@ -153,7 +153,7 @@ var/t_state = l_hand.item_state if(!t_state) t_state = l_hand.icon_state l_hand.screen_loc = ui_lhand - overlays_standing[X_L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = t_state) + overlays_standing[X_L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state" = t_state) else overlays_standing[X_L_HAND_LAYER] = null if(update_icons) update_icons() diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm new file mode 100644 index 00000000000..2a8dfa4e458 --- /dev/null +++ b/code/modules/mob/living/carbon/human/body_accessories.dm @@ -0,0 +1,128 @@ + +var/global/list/body_accessory_by_name = list("None" = null) + +/hook/startup/proc/initalize_body_accessories() + +// __init_body_accessory(/datum/body_accessory/body) + __init_body_accessory(/datum/body_accessory/tail) + + if(body_accessory_by_name.len) + if(initialize_body_accessory_by_species()) + return 1 + + return 0 //fail if no bodies are found + +var/global/list/body_accessory_by_species = list("None" = null) + +/proc/initialize_body_accessory_by_species() + for(var/B in body_accessory_by_name) + var/datum/body_accessory/accessory = body_accessory_by_name[B] + if(!istype(accessory)) continue + + for(var/species in accessory.allowed_species) + if(!body_accessory_by_species["[species]"]) body_accessory_by_species["[species]"] = list() + body_accessory_by_species["[species]"] += accessory + + if(body_accessory_by_species.len) + return 1 + return 0 + +/proc/__init_body_accessory(var/ba_path) + if(ispath(ba_path)) + var/_added_counter = 0 + + for(var/A in subtypesof(ba_path)) + var/datum/body_accessory/B = new A + if(istype(B)) + body_accessory_by_name[B.name] += B + ++_added_counter + + if(_added_counter) + return 1 + return 0 + + +/datum/body_accessory + var/name = "default" + + var/icon = null + var/icon_state = "" + + var/animated_icon = null + var/animated_icon_state = "" + + var/blend_mode = null + + var/pixel_x_offset = 0 + var/pixel_y_offset = 0 + + var/list/allowed_species = list() + +/datum/body_accessory/proc/try_restrictions(var/mob/living/carbon/human/H) + return 1 + +/datum/body_accessory/proc/get_animated_icon() //return animated if it has it, return static if it does not. + if(animated_icon) + return animated_icon + + else return icon + +/datum/body_accessory/proc/get_animated_icon_state() + if(animated_icon_state) + return animated_icon_state + + else return icon_state + +/* +//Bodies +/datum/body_accessory/body + blend_mode = ICON_MULTIPLY + +/datum/body_accessory/body/snake + name = "Snake" + + icon = 'icons/mob/body_accessory_64.dmi' + icon_state = "naga" + + pixel_x_offset = -16*/ + +//Tails +/datum/body_accessory/tail + icon = 'icons/mob/body_accessory.dmi' + animated_icon = 'icons/mob/body_accessory.dmi' + blend_mode = ICON_ADD + +/datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H) + if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space)) + return 1 + return 0 + + +//vulpakin +/datum/body_accessory/tail/vulpkanin_2 + name = "Vulpkanin Alt 1 (Bushy)" + + icon_state = "vulptail2" + animated_icon_state = "vulptail2_a" + allowed_species = list("Vulpkanin") + +/datum/body_accessory/tail/vulpkanin_3 + name = "Vulpkanin Alt 2 (Straight)" + + icon_state = "vulptail3" + animated_icon_state = "vulptail3_a" + allowed_species = list("Vulpkanin") + +/datum/body_accessory/tail/vulpkanin_4 + name = "Vulpkanin Alt 3 (Tiny)" + + icon_state = "vulptail4" + animated_icon_state = "vulptail4_a" + allowed_species = list("Vulpkanin") + +/datum/body_accessory/tail/vulpkanin_5 + name = "Vulpkanin Alt 4 (Short)" + + icon_state = "vulptail5" + animated_icon_state = "vulptail5_a" + allowed_species = list("Vulpkanin") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 1054a639819..abbe2d2cf3d 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -116,7 +116,12 @@ m_type = 1 if("wag") - if(species.bodyflags & TAIL_WAGGING) + if(body_accessory) + if(body_accessory.try_restrictions(src)) + message = "[src] starts wagging \his tail." + start_tail_wagging(1) + + else if(species.bodyflags & TAIL_WAGGING) if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) message = "[src] starts wagging \his tail." src.start_tail_wagging(1) @@ -126,7 +131,7 @@ return if("swag") - if(species.bodyflags & TAIL_WAGGING) + if(species.bodyflags & TAIL_WAGGING || body_accessory) message = "[src] stops wagging \his tail." src.stop_tail_wagging(1) else diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 907043e878e..db44d66133e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1779,4 +1779,9 @@ if(I.body_parts_covered & HEAD) prot["head"] = max(1 - I.permeability_coefficient, prot["head"]) var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7 - return protection \ No newline at end of file + return protection + +/mob/living/carbon/human/proc/get_full_print() + if(!dna || !dna.uni_identity) + return + return md5(dna.uni_identity) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 7d7d400c9c3..eead644cc58 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -82,4 +82,6 @@ var/lastFart = 0 // Toxic fart cooldown. var/fire_dmi = 'icons/mob/OnFire.dmi' - var/fire_sprite = "Standing" \ No newline at end of file + var/fire_sprite = "Standing" + + var/datum/body_accessory/body_accessory = null diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 729ce6c8cae..c972776078e 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -1,152 +1,10 @@ /mob/living/carbon/human/say(var/message) - - var/verb = "says" var/alt_name = "" - var/message_range = world.view - var/italics = 0 - - if(client) - if(client.prefs.muted & MUTE_IC) - src << "\red You cannot speak in IC (Muted)." - return - - message = trim_strip_html_properly(message) - - if(stat) - if(stat == 2) - return say_dead(message) - return - - if (is_muzzled()) - src << "You're muzzled and cannot speak!" - return - - var/message_mode = parse_message_mode(message, "headset") - - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) if(name != GetVoice()) alt_name = " (as [get_id_name("Unknown")])" - //parse the radio code and consume it - if (message_mode) - if (message_mode == "headset") - message = copytext(message,2) //it would be really nice if the parse procs could do this for us. - else - message = copytext(message,3) - - //parse the language code and consume it - var/datum/language/speaking = parse_language(message) - if(speaking) - message = copytext(message,2+length(speaking.key)) - else - speaking = get_default_language() - - var/ending = copytext(message, length(message)) - if (speaking) - // This is broadcast to all mobs with the language, - // irrespective of distance or anything else. - if(speaking.flags & HIVEMIND) - speaking.broadcast(src,trim(message)) - return - //If we've gotten this far, keep going! - verb = speaking.get_spoken_verb(ending) - else - if(ending=="!") - verb=pick("exclaims","shouts","yells") - if(ending=="?") - verb="asks" - - message = trim(message) - - if(speech_problem_flag) - var/list/handle_r = handle_speech_problems(message) - message = handle_r[1] - verb = handle_r[2] - speech_problem_flag = handle_r[3] - - if(!message || message == "") - return - - var/list/obj/item/used_radios = new - - switch (message_mode) - if("headset") - if(l_ear && istype(l_ear,/obj/item/device/radio)) - var/obj/item/device/radio/R = l_ear - R.talk_into(src,message,null,verb,speaking) - used_radios += l_ear - else if(r_ear && istype(r_ear,/obj/item/device/radio)) - var/obj/item/device/radio/R = r_ear - R.talk_into(src,message,null,verb,speaking) - used_radios += r_ear - - if("right ear") - var/obj/item/device/radio/R - var/has_radio = 0 - if(r_ear && istype(r_ear,/obj/item/device/radio)) - R = r_ear - has_radio = 1 - if(r_hand && istype(r_hand, /obj/item/device/radio)) - R = r_hand - has_radio = 1 - if(has_radio) - R.talk_into(src,message,null,verb,speaking) - used_radios += R - - - if("left ear") - var/obj/item/device/radio/R - var/has_radio = 0 - if(l_ear && istype(l_ear,/obj/item/device/radio)) - R = l_ear - has_radio = 1 - if(l_hand && istype(l_hand,/obj/item/device/radio)) - R = l_hand - has_radio = 1 - if(has_radio) - R.talk_into(src,message,null,verb,speaking) - used_radios += R - - if("intercom") - for(var/obj/item/device/radio/intercom/I in view(1, null)) - I.talk_into(src, message, verb, speaking) - used_radios += I - if("whisper") - whisper_say(message, speaking, alt_name) - return - else - if(message_mode) - if(l_ear && istype(l_ear,/obj/item/device/radio)) - l_ear.talk_into(src,message, message_mode, verb, speaking) - used_radios += l_ear - else if(r_ear && istype(r_ear,/obj/item/device/radio)) - r_ear.talk_into(src,message, message_mode, verb, speaking) - used_radios += r_ear - - var/sound/speech_sound - var/sound_vol - if(species.speech_sounds && prob(species.speech_chance)) - speech_sound = sound(pick(species.speech_sounds)) - sound_vol = 50 - - //speaking into radios - if(used_radios.len) - italics = 1 - message_range = 1 - if(speaking) - message_range = speaking.get_talkinto_msg_range(message) - var/msg - if(!speaking || !(speaking.flags & NO_TALK_MSG)) - msg = "\The [src] talks into \the [used_radios[1]]" - for(var/mob/living/M in hearers(5, src)) - if((M != src) && msg) - M.show_message(msg) - if (speech_sound) - sound_vol *= 0.5 - - ..(message, speaking, verb, alt_name, italics, message_range, speech_sound, sound_vol) //ohgod we should really be passing a datum here. + ..(message, alt_name = alt_name) //ohgod we should really be passing a datum here. /mob/living/carbon/human/proc/forcesay(list/append) if(stat == CONSCIOUS) @@ -207,7 +65,7 @@ // return 0 return ..() - + /mob/living/carbon/human/proc/HasVoiceChanger() for(var/obj/item/gear in list(wear_mask,wear_suit,head)) if(!gear) @@ -216,7 +74,7 @@ if(changer && changer.active && changer.voice) return changer.voice return 0 - + /mob/living/carbon/human/GetVoice() var/has_changer = HasVoiceChanger() if(has_changer) @@ -240,15 +98,6 @@ return special_voice -/* - ***Deprecated*** - let this be handled at the hear_say or hear_radio proc - This is left in for robot speaking when humans gain binary channel access until I get around to rewriting - robot_talk() proc. - There is no language handling build into it however there is at the /mob level so we accept the call - for it but just ignore it. -*/ - /mob/living/carbon/human/say_quote(var/message, var/datum/language/speaking = null) var/verb = "says" var/ending = copytext(message, length(message)) @@ -257,27 +106,27 @@ verb = speaking.get_spoken_verb(ending) else if(ending == "!") - verb = "exclaims" - else if(ending == "?") - verb = "asks" + return pick("exclaims", "shouts", "yells") + if(ending == "?") + return "asks" return verb -/mob/living/carbon/human/proc/handle_speech_problems(var/message) +/mob/living/carbon/human/handle_speech_problems(var/message, var/verb) var/list/returns[3] - var/verb = "says" - var/handled = 0 + var/speech_problem_flag = 0 + if(silent || (sdisabilities & MUTE)) message = "" - handled = 1 + speech_problem_flag = 1 + if(istype(wear_mask, /obj/item/clothing/mask/horsehead)) var/obj/item/clothing/mask/horsehead/hoers = wear_mask if(hoers.voicechange) - if(mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling") - message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") - verb = pick("whinnies","neighs", "says") - handled = 1 + message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + verb = pick("whinnies","neighs", "says") + speech_problem_flag = 1 if(dna) for(var/datum/dna/gene/gene in dna_genes) @@ -285,25 +134,18 @@ continue if(gene.is_active(src)) message = gene.OnSay(src,message) - handled = 1 + speech_problem_flag = 1 if(message != "") - if((HULK in mutations) && health >= 25 && length(message)) - message = "[uppertext(message)]!!!" - verb = pick("yells","roars","hollers") - handled = 1 - if(slurring) - message = slur(message) - verb = "slurs" - handled = 1 - if(stuttering) - message = stutter(message) - verb = "stammers" - handled = 1 + var/list/parent = ..() + message = parent[1] + verb = parent[2] + if(parent[3]) + speech_problem_flag = 1 var/braindam = getBrainLoss() if(braindam >= 60) - handled = 1 + speech_problem_flag = 1 if(prob(braindam/4)) message = stutter(message) verb = "gibbers" @@ -311,9 +153,70 @@ message = uppertext(message) verb = "yells loudly" - if(COMIC in mutations) - message = "[message]" returns[1] = message returns[2] = verb - returns[3] = handled + returns[3] = speech_problem_flag return returns + +/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name) + switch(message_mode) + if("intercom") + for(var/obj/item/device/radio/intercom/I in view(1, null)) + I.talk_into(src, message, verb, speaking) + used_radios += I + + if("headset") + if(l_ear && istype(l_ear,/obj/item/device/radio)) + var/obj/item/device/radio/R = l_ear + R.talk_into(src,message,null,verb,speaking) + used_radios += l_ear + else if(r_ear && istype(r_ear,/obj/item/device/radio)) + var/obj/item/device/radio/R = r_ear + R.talk_into(src,message,null,verb,speaking) + used_radios += r_ear + + if("right ear") + var/obj/item/device/radio/R + var/has_radio = 0 + if(r_ear && istype(r_ear,/obj/item/device/radio)) + R = r_ear + has_radio = 1 + if(r_hand && istype(r_hand, /obj/item/device/radio)) + R = r_hand + has_radio = 1 + if(has_radio) + R.talk_into(src,message,null,verb,speaking) + used_radios += R + + + if("left ear") + var/obj/item/device/radio/R + var/has_radio = 0 + if(l_ear && istype(l_ear,/obj/item/device/radio)) + R = l_ear + has_radio = 1 + if(l_hand && istype(l_hand,/obj/item/device/radio)) + R = l_hand + has_radio = 1 + if(has_radio) + R.talk_into(src,message,null,verb,speaking) + used_radios += R + + if("whisper") + whisper_say(message, speaking, alt_name) + return 1 + else + if(message_mode) + if(l_ear && istype(l_ear,/obj/item/device/radio)) + l_ear.talk_into(src,message, message_mode, verb, speaking) + used_radios += l_ear + else if(r_ear && istype(r_ear,/obj/item/device/radio)) + r_ear.talk_into(src,message, message_mode, verb, speaking) + used_radios += r_ear + +/mob/living/carbon/human/handle_speech_sound() + var/list/returns[2] + if(species.speech_sounds && prob(species.speech_chance)) + returns[1] = sound(pick(species.speech_sounds)) + returns[2] = 50 + return returns \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm index f5445b80543..8d0e64d44af 100644 --- a/code/modules/mob/living/carbon/human/species/apollo.dm +++ b/code/modules/mob/living/carbon/human/species/apollo.dm @@ -35,7 +35,8 @@ "antennae" = /obj/item/organ/wryn/hivenode ) - flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND + flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 58b5968ebf8..09bd76f00eb 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -61,6 +61,7 @@ var/has_fine_manipulation = 1 // Can use small items. var/flags = 0 // Various specific features. + var/clothing_flags = 0 // Underwear and socks. var/bloodflags = 0 var/bodyflags = 0 var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index b59efdda468..1604c5baea4 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -6,7 +6,8 @@ primitive_form = "Monkey" path = /mob/living/carbon/human/human language = "Sol Common" - flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT + flags = HAS_LIPS | CAN_BE_FAT + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_TONE dietflags = DIET_OMNI unarmed_type = /datum/unarmed_attack/punch @@ -37,7 +38,8 @@ else, frequently even their own lives. They prefer warmer temperatures than most species and \ their native tongue is a heavy hissing laungage called Sinta'Unathi." - flags = HAS_LIPS | HAS_UNDERWEAR + flags = HAS_LIPS + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_CARN @@ -88,7 +90,8 @@ primitive_form = "Farwa" - flags = HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT + flags = HAS_LIPS | CAN_BE_FAT + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI @@ -119,7 +122,8 @@ to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \ which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent." - flags = HAS_LIPS | HAS_UNDERWEAR + flags = HAS_LIPS + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI @@ -148,7 +152,8 @@ herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \ the secrets of their empire to their allies." - flags = HAS_LIPS | HAS_UNDERWEAR + flags = HAS_LIPS + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = DIET_HERB @@ -190,6 +195,7 @@ poison_type = "oxygen" flags = NO_SCAN | IS_WHITELISTED + clothing_flags = HAS_SOCKS dietflags = DIET_OMNI blood_color = "#2299FC" @@ -278,6 +284,7 @@ brute_mod = 0.8 flags = IS_WHITELISTED + clothing_flags = HAS_SOCKS bodyflags = FEET_CLAWS dietflags = DIET_HERB @@ -295,6 +302,7 @@ unarmed_type = /datum/unarmed_attack/punch flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN + clothing_flags = HAS_SOCKS bodyflags = HAS_SKIN_COLOR bloodflags = BLOOD_SLIME dietflags = DIET_CARN @@ -322,7 +330,8 @@ default_genes = list(REMOTE_TALK) - flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT + flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB reagent_tag = PROCESS_ORG @@ -373,6 +382,7 @@ water and other radiation." flags = NO_BREATHE | REQUIRE_LIGHT | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN + clothing_flags = HAS_SOCKS dietflags = 0 //Diona regenerate nutrition in light, no diet necessary body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not @@ -467,6 +477,7 @@ passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD + clothing_flags = HAS_SOCKS dietflags = 0 //IPCs can't eat, so no diet blood_color = "#1F181F" flesh_color = "#AAAAAA" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index f7493c272d8..e55ee2d1149 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -317,18 +317,18 @@ var/global/list/damage_icon_parts = list() stand_icon.Blend(base_icon,ICON_OVERLAY) //Underwear - if(underwear && species.flags & HAS_UNDERWEAR) + if(underwear && species.clothing_flags & HAS_UNDERWEAR) var/datum/sprite_accessory/underwear/U = underwear_list[underwear] if(U) stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) - if(undershirt && species.flags & HAS_UNDERWEAR) + if(undershirt && species.clothing_flags & HAS_UNDERSHIRT) var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] if(U2) stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) - if(socks) + if(socks && species.clothing_flags & HAS_SOCKS) var/datum/sprite_accessory/socks/U3 = socks_list[socks] if(U3) stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) @@ -344,7 +344,7 @@ var/global/list/damage_icon_parts = list() stand_icon.Blend(lips, ICON_OVERLAY) //tail - update_tail_showing(0) + update_tail_layer(0) //HAIR OVERLAY @@ -763,12 +763,12 @@ var/global/list/damage_icon_parts = list() overlays_standing[SUIT_LAYER] = standing - update_tail_showing(0) + update_tail_layer(0) else overlays_standing[SUIT_LAYER] = null - update_tail_showing(0) + update_tail_layer(0) update_collar(0) @@ -868,15 +868,10 @@ var/global/list/damage_icon_parts = list() var/t_state = r_hand.item_state if(!t_state) t_state = r_hand.icon_state - if(r_hand.icon_override) - t_state = "[t_state]_r" - overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.icon_override, "icon_state" = "[t_state]") - else if(r_hand.sprite_sheets && r_hand.sprite_sheets[species.name]) - t_state = "[t_state]_r" - overlays_standing[R_HAND_LAYER] = image("icon" = r_hand.sprite_sheets[species.name], "icon_state" = "[t_state]") - else - overlays_standing[R_HAND_LAYER] = image("icon" = 'icons/mob/items_righthand.dmi', "icon_state" = "[t_state]") - + var/image/I = image("icon" = r_hand.righthand_file, "icon_state"="[t_state]", "layer"=-R_HAND_LAYER) + I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension) + overlays_standing[R_HAND_LAYER] = I + if (handcuffed) drop_r_hand() else overlays_standing[R_HAND_LAYER] = null @@ -889,24 +884,29 @@ var/global/list/damage_icon_parts = list() var/t_state = l_hand.item_state if(!t_state) t_state = l_hand.icon_state - if(l_hand.icon_override) - t_state = "[t_state]_l" - overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.icon_override, "icon_state" = "[t_state]") - else if(l_hand.sprite_sheets && l_hand.sprite_sheets[species.name]) - t_state = "[t_state]_l" - overlays_standing[L_HAND_LAYER] = image("icon" = l_hand.sprite_sheets[species.name], "icon_state" = "[t_state]") - else - overlays_standing[L_HAND_LAYER] = image("icon" = 'icons/mob/items_lefthand.dmi', "icon_state" = "[t_state]") + var/image/I = image("icon" = l_hand.lefthand_file, "icon_state"="[t_state]", "layer"=-L_HAND_LAYER) + I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension) + overlays_standing[L_HAND_LAYER] = I if (handcuffed) drop_l_hand() else overlays_standing[L_HAND_LAYER] = null if(update_icons) update_icons() -/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1) + + +/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1) overlays_standing[TAIL_LAYER] = null - if(species.tail && species.bodyflags & HAS_TAIL) + if(body_accessory) + if(body_accessory.try_restrictions(src)) + var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state) + accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) + + overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + + + else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) @@ -920,7 +920,13 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1) overlays_standing[TAIL_LAYER] = null - if(species.tail && species.bodyflags & HAS_TAIL) + if(body_accessory) + var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state()) + accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) + + overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + + else if(species.tail && species.bodyflags & HAS_TAIL) var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s") tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) @@ -932,14 +938,11 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1) overlays_standing[TAIL_LAYER] = null - if(species.tail && species.bodyflags & HAS_TAIL) - var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") - tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + update_tail_layer(update_icons) //just trigger a full update for normal stationary sprites - overlays_standing[TAIL_LAYER] = image(tail_s) - - if(update_icons) - update_icons() +/mob/living/carbon/human/handle_transform_change() + ..() + update_tail_layer() //Adds a collar overlay above the helmet layer if the suit has one // Suit needs an identically named sprite in icons/mob/collar.dmi diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index d2cfeeb9037..05e078553a8 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -141,26 +141,26 @@ loc_temp = loc:air_contents.temperature else loc_temp = environment.temperature - - if(loc_temp < 310.15) // a cold place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - else // a hot place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - + //Account for massive pressure differences - if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc if(bodytemperature <= (T0C - 40)) // stun temperature Tempstun = 1 if(bodytemperature <= (T0C - 50)) // hurt temperature if(bodytemperature <= 50) // sqrting negative numbers is bad - adjustToxLoss(200) - else + adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults), + else //so the ToxLoss needs to be 300 or above to guarrantee an instant death adjustToxLoss(round(sqrt(bodytemperature)) * 2) - else Tempstun = 0 + + + /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ + if(loc_temp < 310.15) // a cold place + bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) + else // a hot place + bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) updatehealth() @@ -215,7 +215,7 @@ if(src.stat != DEAD) src.stat = UNCONSCIOUS - if(prob(30)) + if(prob(30)) //I think this is meant to allow slimes to starve to death adjustOxyLoss(-1) adjustToxLoss(-1) adjustFireLoss(-1) diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 02fe01c39a1..e22ad5e66dc 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -28,4 +28,8 @@ if(changed) animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) - floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). \ No newline at end of file + handle_transform_change() + floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). + +/mob/living/carbon/proc/handle_transform_change() + return \ No newline at end of file diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index f34b3caf692..3c79879dd07 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -67,7 +67,125 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/get_default_language() return default_language -/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/sound/speech_sound, var/sound_vol) +/mob/living/proc/handle_speech_problems(var/message, var/verb) + var/list/returns[3] + var/speech_problem_flag = 0 + + if((HULK in mutations) && health >= 25 && length(message)) + message = "[uppertext(message)]!!!" + verb = pick("yells","roars","hollers") + speech_problem_flag = 1 + + if(COMIC in mutations) + message = "[message]" + + if(slurring) + message = slur(message) + verb = "slurs" + speech_problem_flag = 1 + if(stuttering) + message = stutter(message) + verb = "stammers" + speech_problem_flag = 1 + + returns[1] = message + returns[2] = verb + returns[3] = speech_problem_flag + return returns + +/mob/living/proc/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + return 0 + +/mob/living/proc/handle_speech_sound() + var/list/returns[2] + returns[1] = null + returns[2] = null + return returns + + +/mob/living/say(var/message, var/datum/language/speaking = null, var/verb = "says", var/alt_name="") + if(client) + if(client.prefs.muted & MUTE_IC) + src << "\red You cannot speak in IC (Muted)." + return + + message = trim_strip_html_properly(message) + + if(stat) + if(stat == 2) + return say_dead(message) + return + + var/message_mode = parse_message_mode(message, "headset") + + if(copytext(message,1,2) == "*") + return emote(copytext(message,2)) + + //parse the radio code and consume it + if (message_mode) + if (message_mode == "headset") + message = copytext(message,2) //it would be really nice if the parse procs could do this for us. + else + message = copytext(message,3) + + message = trim_left(message) + + //parse the language code and consume it + if(!speaking) + speaking = parse_language(message) + if(speaking) + message = copytext(message, 2 + length(speaking.key)) + else + speaking = get_default_language() + + // This is broadcast to all mobs with the language, + // irrespective of distance or anything else. + if(speaking && (speaking.flags & HIVEMIND)) + speaking.broadcast(src,trim(message)) + return 1 + + verb = say_quote(message, speaking) + + if(is_muzzled()) + src << "You're muzzled and cannot speak!" + return + + message = trim_left(message) + + message = handle_autohiss(message, speaking) + + var/list/handle_s = handle_speech_problems(message, verb) + message = handle_s[1] + verb = handle_s[2] + + if(!message || message == "") + return 0 + + var/list/obj/item/used_radios = new + if(handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)) + return 1 + + var/list/handle_v = handle_speech_sound() + var/sound/speech_sound = handle_v[1] + var/sound_vol = handle_v[2] + + var/italics = 0 + var/message_range = world.view + + //speaking into radios + if(used_radios.len) + italics = 1 + message_range = 1 + if(speaking) + message_range = speaking.get_talkinto_msg_range(message) + var/msg + if(!speaking || !(speaking.flags & NO_TALK_MSG)) + msg = "\The [src] talks into \the [used_radios[1]]" + for(var/mob/living/M in hearers(5, src)) + if((M != src) && msg) + M.show_message(msg) + if (speech_sound) + sound_vol *= 0.5 var/turf/T = get_turf(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 2c13ae4ccf6..7594dae17b0 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -538,7 +538,6 @@ return H.icon_state = "pai-[icon_state]" H.item_state = "pai-[icon_state]" - H.icon_override = 'icons/mob/in-hand/paiheld.dmi'//I have these in diffrent DMI so i am overriding grabber.put_in_active_hand(H)//for some reason unless i call this it dosen't work grabber.update_inv_l_hand() grabber.update_inv_r_hand() @@ -546,13 +545,22 @@ return H /mob/living/silicon/pai/MouseDrop(atom/over_object) - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - if(H.a_intent == I_HELP) - get_scooped(H) - //return + var/mob/living/carbon/human/H = over_object //changed to human to avoid stupid issues like xenos holding pAIs. + if(!istype(H) || !Adjacent(H)) return ..() + if(usr == src) + switch(alert(H, "[src] wants you to pick them up. Do it?",,"Yes","No")) + if("Yes") + if(Adjacent(H)) + get_scooped(H) + else + src << "You need to stay in reaching distance to be picked up." + if("No") + src << "[H] decided not to pick you up." else - return ..() + if(Adjacent(H)) + get_scooped(H) + else + return ..() /mob/living/silicon/pai/on_forcemove(atom/newloc) if(card) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm new file mode 100644 index 00000000000..40f0119c996 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -0,0 +1,40 @@ +/mob/living/silicon/robot/drone/say(var/message) + if(local_transmit) + if (src.client) + if(client.prefs.muted & MUTE_IC) + src << "You cannot send IC messages (muted)." + return 0 + if (src.client.handle_spam_prevention(message,MUTE_IC)) + return 0 + + message = sanitize(message) + + if (stat == 2) + return say_dead(message) + + if(copytext(message,1,2) == "*") + return emote(copytext(message,2)) + + if(copytext(message,1,2) == ";") + var/datum/language/L = all_languages["Drone Talk"] + if(istype(L)) + return L.broadcast(src,trim(copytext(message,2))) + + //Must be concious to speak + if (stat) + return 0 + + var/list/listeners = hearers(5,src) + listeners |= src + + for(var/mob/living/silicon/D in listeners) + if(D.client && D.local_transmit) + D << "[src] transmits, \"[message]\"" + + for (var/mob/M in player_list) + if (istype(M, /mob/new_player)) + continue + else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) + if(M.client) M << "[src] transmits, \"[message]\"" + return 1 + return ..(message, 0) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 125dc9ea992..59c8f748631 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -1,3 +1,38 @@ +/mob/living/silicon/say(var/message, var/sanitize = 1) + return ..(sanitize ? sanitize(message) : message) + +/mob/living/silicon/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + log_say("[key_name(src)] : [message]") + +/mob/living/silicon/robot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + ..() + if(message_mode) + if(!is_component_functioning("radio")) + src << "Your radio isn't functional at this time." + return 0 + if(message_mode == "general") + message_mode = null + return radio.talk_into(src,message,message_mode,verb,speaking) + +/mob/living/silicon/ai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + ..() + if(message_mode == "department") + return holopad_talk(message, verb, speaking) + else if(message_mode) + if (aiRadio.disabledAi || aiRestorePowerRoutine || stat) + src << "System Error - Transceiver Disabled." + return 0 + if(message_mode == "general") + message_mode = null + return aiRadio.talk_into(src,message,message_mode,verb,speaking) + +/mob/living/silicon/pai/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name) + ..() + if(message_mode) + if(message_mode == "general") + message_mode = null + return radio.talk_into(src,message,message_mode,verb,speaking) + /mob/living/silicon/say_quote(var/text) var/ending = copytext(text, length(text)) @@ -23,137 +58,6 @@ return 1 return ..() -/mob/living/silicon/say(var/message) - if (!message) - return 0 - - if (src.client) - if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." - return 0 - if (src.client.handle_spam_prevention(message,MUTE_IC)) - return 0 - - message = trim_strip_html_properly(message) - - if (stat == 2) - return say_dead(message) - - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) - - var/bot_type = 0 //Let's not do a fuck ton of type checks, thanks. - if(istype(src, /mob/living/silicon/ai)) - bot_type = IS_AI - else if(istype(src, /mob/living/silicon/robot)) - bot_type = IS_ROBOT - else if(istype(src, /mob/living/silicon/pai)) - bot_type = IS_PAI - - var/mob/living/silicon/ai/AI = src //and let's not declare vars over and over and over for these guys. - var/mob/living/silicon/robot/R = src - var/mob/living/silicon/pai/P = src - - //Must be concious to speak - if (stat) - return 0 - - var/verb = say_quote(message) - - //parse radio key and consume it - var/message_mode = parse_message_mode(message, "general") - if (message_mode) - if (message_mode == "general") - message = trim(copytext(message,2)) - else - message = trim(copytext(message,3)) - - //parse language key and consume it - var/datum/language/speaking = parse_language(message) - if (speaking) - - message = trim(copytext(message,2+length(speaking.key))) - else - speaking = get_default_language() - - if (speaking) - verb = speaking.speech_verb - // This is broadcast to all mobs with the language, - // irrespective of distance or anything else. - if(speaking.flags & HIVEMIND) - speaking.broadcast(src,trim(message)) - return 1 - - // Currently used by drones. - if(local_transmit) - var/list/listeners = hearers(5,src) - listeners |= src - - for(var/mob/living/silicon/D in listeners) - if(D.client && istype(D,src.type)) - D << "[src] transmits, \"[message]\"" - - for (var/mob/M in player_list) - if (istype(M, /mob/new_player)) - continue - else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) - if(M.client) M << "[src] transmits, \"[message]\"" - return 1 - - if(message_mode && bot_type == IS_ROBOT && !R.is_component_functioning("radio")) - src << "\red Your radio isn't functional at this time." - return 0 - - switch(message_mode) - if("department") - switch(bot_type) - if(IS_AI) - return AI.holopad_talk(message, verb, speaking) - if(IS_ROBOT) - log_say("[key_name(src)] : [message]") - return R.radio.talk_into(src,message,message_mode,verb,speaking) - if(IS_PAI) - log_say("[key_name(src)] : [message]") - return P.radio.talk_into(src,message,message_mode,verb,speaking) - return 0 - - if("general") - switch(bot_type) - if(IS_AI) - if (AI.aiRadio.disabledAi || AI.aiRestorePowerRoutine || AI.stat) - src << "\red System Error - Transceiver Disabled" - return 0 - else - log_say("[key_name(src)] : [message]") - return AI.aiRadio.talk_into(src,message,null,verb,speaking) - if(IS_ROBOT) - log_say("[key_name(src)] : [message]") - return R.radio.talk_into(src,message,null,verb,speaking) - if(IS_PAI) - log_say("[key_name(src)] : [message]") - return P.radio.talk_into(src,message,null,verb,speaking) - return 0 - - else - if(message_mode) - switch(bot_type) - if(IS_AI) - if (AI.aiRadio.disabledAi || AI.aiRestorePowerRoutine || AI.stat) - src << "\red System Error - Transceiver Disabled" - return 0 - else - log_say("[key_name(src)] : [message]") - return AI.aiRadio.talk_into(src,message,message_mode,verb,speaking) - if(IS_ROBOT) - log_say("[key_name(src)] : [message]") - return R.radio.talk_into(src,message,message_mode,verb,speaking) - if(IS_PAI) - log_say("[key_name(src)] : [message]") - return P.radio.talk_into(src,message,message_mode,verb,speaking) - return 0 - - return ..(message,speaking,verb) - //For holopads only. Usable by AI. /mob/living/silicon/ai/proc/holopad_talk(var/message, verb, datum/language/speaking) diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index e2dd77d75a6..9a1c713ab72 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -41,7 +41,7 @@ if(!register_alarms) return - var/list/register_to = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + var/list/register_to = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) for(var/datum/alarm_handler/AH in register_to) AH.register(src, /mob/living/silicon/proc/receive_alarm) queued_alarms[AH] = list() // Makes sure alarms remain listed in consistent order diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm new file mode 100644 index 00000000000..17d764b9c1d --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/pet.dm @@ -0,0 +1,23 @@ +/mob/living/simple_animal/hostile/retaliate/araneus + name = "Sergeant Araneus" + real_name = "Sergeant Araneus" + voice_name = "unidentifiable voice" + desc = "A fierce companion for any person of power, this spider has been carefully trained by Nanotrasen specialists. Its beady, staring eyes send shivers down your spine." + faction = list("spiders") + icon_state = "guard" + icon_living = "guard" + icon_dead = "guard_dead" + icon_gib = "guard_dead" + turns_per_move = 8 + response_help = "pets" + emote_hear = list("chitters") + maxHealth = 250 + health = 200 + harm_intent_damage = 3 + melee_damage_lower = 15 + melee_damage_upper = 20 + + min_oxy = 5 + max_tox = 2 + max_co2 = 5 + diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 2d2327c190c..c3ab9221a20 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -77,7 +77,8 @@ /obj/machinery/suit_storage_unit, /obj/machinery/clonepod, \ /obj/machinery/dna_scannernew, /obj/machinery/telecomms, \ /obj/machinery/nuclearbomb, /obj/machinery/particle_accelerator, \ - /obj/machinery/recharge_station, /obj/machinery/smartfridge) + /obj/machinery/recharge_station, /obj/machinery/smartfridge, \ + /obj/machinery/computer) //Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. var/obj/item/held_item = null diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index b1d584777ad..cbffd443ae8 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -544,21 +544,10 @@ gib() return -/mob/living/simple_animal/say(var/message,var/datum/language/speaking,var/verb) - if(stat) - return - - if(copytext(message,1,2) == "*") - return emote(copytext(message,2)) - - if(stat) - return - - verb = "says" +/mob/living/simple_animal/say(var/message) + var/verb = "says" if(speak_emote.len) verb = pick(speak_emote) - message = capitalize(trim_left(message)) - - ..(message, speaking, verb) + ..(message, null, verb) \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4d3867f954b..098f2f10914 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1248,7 +1248,7 @@ mob/proc/yank_out_object() var/mob/living/carbon/human/human_user = U human_user.bloody_hands(H) - selection.loc = get_turf(src) + selection.forceMove(get_turf(src)) if(!(U.l_hand && U.r_hand)) U.put_in_hands(selection) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 1201c95b74c..a9d8f2b595f 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -170,7 +170,7 @@ if(!mob.control_object) return mob.control_object.dir = direct else - mob.control_object.loc = get_step(mob.control_object,direct) + mob.control_object.forceMove(get_step(mob.control_object,direct)) return @@ -391,7 +391,7 @@ var/mob/living/L = mob switch(L.incorporeal_move) if(1) - L.loc = get_step(L, direct) + L.forceMove(get_step(L, direct)) L.dir = direct if(2) if(prob(50)) @@ -420,7 +420,7 @@ return else return - L.loc = locate(locx,locy,mobloc.z) + L.forceMove(locate(locx,locy,mobloc.z)) spawn(0) var/limit = 2//For only two trailing shadows. for(var/turf/T in getline(mobloc, L.loc)) @@ -431,7 +431,7 @@ else spawn(0) anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir) - L.loc = get_step(L, direct) + L.forceMove(get_step(L, direct)) L.dir = direct if(3) //Incorporeal move, but blocked by holy-watered tiles var/turf/simulated/floor/stepTurf = get_step(L, direct) @@ -441,7 +441,7 @@ spawn(2) L.notransform = 0 else - L.loc = get_step(L, direct) + L.forceMove(get_step(L, direct)) L.dir = direct return 1 diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 77f48b976d5..8c837864706 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -254,19 +254,19 @@ datum/preferences var/icon/underwear_s = null - if(underwear && current_species.flags & HAS_UNDERWEAR) + if(underwear && current_species.clothing_flags & HAS_UNDERWEAR) var/datum/sprite_accessory/underwear/U = underwear_list[underwear] if(U) underwear_s = new/icon(U.icon, "[U.icon_state]_s", ICON_OVERLAY) var/icon/undershirt_s = null - if(undershirt && current_species.flags & HAS_UNDERWEAR) + if(undershirt && current_species.clothing_flags & HAS_UNDERSHIRT) var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] if(U2) undershirt_s = new/icon(U2.icon, "[U2.icon_state]_s", ICON_OVERLAY) var/icon/socks_s = null - if(socks) + if(socks && current_species.clothing_flags & HAS_SOCKS) var/datum/sprite_accessory/socks/U3 = socks_list[socks] if(U3) socks_s = new/icon(U3.icon, "[U3.icon_state]_s", ICON_OVERLAY) @@ -402,7 +402,7 @@ datum/preferences if(LAWYER) clothes_s = new /icon(uniform_dmi, "internalaffairs_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) - clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "briefcase"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/inhands/items_righthand.dmi', "briefcase"), ICON_UNDERLAY) if(prob(1)) clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY) switch(backbag) @@ -569,7 +569,7 @@ datum/preferences clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/inhands/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY) switch(backbag) if(2) clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) @@ -655,7 +655,7 @@ datum/preferences clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_white"), ICON_OVERLAY) if(prob(1)) - clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "blueprints"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/inhands/items_righthand.dmi', "blueprints"), ICON_OVERLAY) switch(backbag) if(2) clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 2f8a790c3c6..b49812d63fb 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -81,14 +81,6 @@ return 0 -/* - ***Deprecated*** - let this be handled at the hear_say or hear_radio proc - This is left in for robot speaking when humans gain binary channel access until I get around to rewriting - robot_talk() proc. - There is no language handling build into it however there is at the /mob level so we accept the call - for it but just ignore it. -*/ /mob/proc/say_quote(var/message, var/datum/language/speaking = null) var/verb = "says" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 73870334d37..4fabdc6510e 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -3,60 +3,6 @@ H.dna.SetSEState(MONKEYBLOCK,1) domutcheck(H, null) -/* -/mob/living/carbon/human/proc/monkeyize() - if (notransform) - return - for(var/obj/item/W in src) - if (W==w_uniform) // will be torn - continue - unEquip(W) - regenerate_icons() - notransform = 1 - canmove = 0 - stunned = 1 - icon = null - invisibility = 101 - for(var/t in organs) - del(t) - var/atom/movable/overlay/animation = new /atom/movable/overlay( loc ) - animation.icon_state = "blank" - animation.icon = 'icons/mob/mob.dmi' - animation.master = src - flick("h2monkey", animation) - sleep(48) - //animation = null - - if(!species.primitive) //If the creature in question has no primitive set, this is going to be messy. - gib() - return - - var/mob/living/carbon/monkey/O = null - - O = new species.primitive(loc) - - O.dna = dna.Clone() - O.dna.SetSEState(MONKEYBLOCK,1) - O.dna.SetSEValueRange(MONKEYBLOCK,0xDAC, 0xFFF) - O.loc = loc - O.viruses = viruses - O.a_intent = I_HARM - - - if (client) - client.mob = O - if(mind) - mind.transfer_to(O) - - O << "You are now [O]. " - - spawn(0)//To prevent the proc from returning null. - del(src) - del(animation) - - return O -*/ - /mob/new_player/AIize() spawning = 1 return ..() diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm index 8625e1cce3b..5c38f480a49 100644 --- a/code/modules/nano/modules/alarm_monitor.dm +++ b/code/modules/nano/modules/alarm_monitor.dm @@ -5,7 +5,7 @@ /datum/nano_module/alarm_monitor/all/New() ..() - alarm_handlers = list(atmosphere_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) + alarm_handlers = list(atmosphere_alarm, burglar_alarm, camera_alarm, fire_alarm, motion_alarm, power_alarm) /datum/nano_module/alarm_monitor/engineering/New() ..() @@ -13,7 +13,7 @@ /datum/nano_module/alarm_monitor/security/New() ..() - alarm_handlers = list(camera_alarm, motion_alarm) + alarm_handlers = list(burglar_alarm, camera_alarm, motion_alarm) /datum/nano_module/alarm_monitor/proc/register(var/object, var/procName) for(var/datum/alarm_handler/AH in alarm_handlers) diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 2acb3109769..ff56a80858b 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -3,7 +3,6 @@ desc = "A katana infused with a strong energy" icon_state = "energy_katana" item_state = "energy_katana" - icon_override = 'icons/mob/in-hand/swords.dmi' force = 40 throwforce = 20 var/cooldown = 0 // Because spam aint cool, yo. diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index fe721a77d6d..968a5a64683 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -15,7 +15,6 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" - icon_override = 'icons/mob/in-hand/tools.dmi' slot_flags = SLOT_BELT | SLOT_EARS throwforce = 0 w_class = 1.0 diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 0c65a49b251..1fe2737d31b 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -11,7 +11,7 @@ var/perapc = 0 // per-apc avilability var/perapc_excess = 0 var/netexcess = 0 // excess power on the powernet (typically avail-load) - + var/problem = 0 // If either of these is set to 1 there is some sort of issue at the powernet. @@ -20,6 +20,14 @@ ..() /datum/powernet/Destroy() + //Go away references, you suck! + for(var/obj/structure/cable/C in cables) + cables -= C + C.powernet = null + for(var/obj/machinery/power/M in nodes) + nodes -= M + M.powernet = null + powernets -= src return ..() @@ -76,7 +84,7 @@ M.disconnect_from_network()//..remove it M.powernet = src nodes[M] = M - + // Triggers warning for certain amount of ticks /datum/powernet/proc/trigger_warning(var/duration_ticks = 20) problem = max(duration_ticks, problem) @@ -85,7 +93,7 @@ //called every ticks by the powernet controller /datum/powernet/proc/reset() var/numapc = 0 - + if(problem > 0) problem = max(problem - 1, 0) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 18cd36a7fc9..647ac2b105b 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -183,9 +183,9 @@ caliber = "a762" projectile_type = "/obj/item/projectile/bullet" -/obj/item/ammo_casing/a545 - desc = "A 5.45mm bullet casing." - caliber = "a545" +/obj/item/ammo_casing/a556 + desc = "A 5.56mm bullet casing." + caliber = "a556" projectile_type = "/obj/item/projectile/bullet/heavybullet" /obj/item/ammo_casing/rocket diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index 7fa2224cbcd..e47acf7521e 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -116,6 +116,17 @@ ..() icon_state = "[initial(icon_state)]-[ammo_count() ? "8" : "0"]" +/obj/item/ammo_box/magazine/uzim9mm + name = "uzi magazine (9mm)" + icon_state = "uzi9mm-32" + ammo_type = /obj/item/ammo_casing/c9mm + caliber = "9mm" + max_ammo = 32 + +/obj/item/ammo_box/magazine/uzim9mm/update_icon() + ..() + icon_state = "uzi9mm-[round(ammo_count(),4)]" + /obj/item/ammo_box/magazine/smgm9mm name = "SMG magazine (9mm)" icon_state = "smg9mm" @@ -163,17 +174,14 @@ multiple_sprites = 2 max_ammo = 8 -/obj/item/ammo_box/magazine/m545 - name = "box magazine (5.45mm)" - icon_state = "5.45m" +/obj/item/ammo_box/magazine/m556 + name = "toploader magazine (5.56mm)" + icon_state = "5.56m" origin_tech = "combat=5;syndicate=1" - ammo_type = "/obj/item/ammo_casing/a545" - caliber = "a545" + ammo_type = /obj/item/ammo_casing/a556 + caliber = "a556" max_ammo = 30 - -/obj/item/ammo_box/magazine/m545/update_icon() - ..() - icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]" + multiple_sprites = 2 /obj/item/ammo_box/magazine/m762 name = "box magazine (7.62mm)" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 61fb6ba0020..65dbae52644 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -8,6 +8,8 @@ icon = 'icons/obj/gun.dmi' icon_state = "detective" item_state = "gun" + lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/guns_righthand.dmi' flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=2000) @@ -43,6 +45,8 @@ var/can_flashlight = 0 var/heavy_weapon = 0 var/randomspread = 0 + + var/burst_size = 1 proc/ready_to_fire() if(world.time >= last_fired + fire_delay) @@ -124,9 +128,6 @@ user << "[src] is not ready to fire again!" return - if(!process_chambered()) //CHECK - return click_empty(user) - if(heavy_weapon) if(user.get_inactive_hand()) recoil = 4 //one-handed kick @@ -142,48 +143,55 @@ var/spread = 0 var/turf/targloc = get_turf(target) - if(chambered) - for (var/i = max(1, chambered.pellets), i > 0, i--) //Previous way of doing it fucked up math for spreading. This way, even the first projectile is part of the spread code. - if(i != max(1, chambered.pellets)) //Have we fired the initial chambered bullet yet? - in_chamber = new chambered.projectile_type() + for(var/f = 1 to burst_size) + if(!process_chambered()) //CHECK + return click_empty(user) + + if(chambered) + for (var/i = max(1, chambered.pellets), i > 0, i--) //Previous way of doing it fucked up math for spreading. This way, even the first projectile is part of the spread code. + if(i != max(1, chambered.pellets)) //Have we fired the initial chambered bullet yet? + in_chamber = new chambered.projectile_type() + ready_projectile(target, user) + prepare_shot(in_chamber) + if(chambered.deviation) + if(randomspread) //Random spread + spread = (rand() - 0.5) * chambered.deviation + else //Smart spread + spread = (i / chambered.pellets - 0.5) * chambered.deviation + if(!process_projectile(targloc, user, params, spread)) + return 0 + else ready_projectile(target, user) prepare_shot(in_chamber) - if(chambered.deviation) - if(randomspread) //Random spread - spread = (rand() - 0.5) * chambered.deviation - else //Smart spread - spread = (i / chambered.pellets - 0.5) * chambered.deviation if(!process_projectile(targloc, user, params, spread)) return 0 - else - ready_projectile(target, user) - prepare_shot(in_chamber) - if(!process_projectile(targloc, user, params, spread)) - return 0 - if(recoil) - spawn() - shake_camera(user, recoil + 1, recoil) + if(recoil) + spawn() + shake_camera(user, recoil + 1, recoil) - if(silenced) - playsound(user, fire_sound, 10, 1) - else - playsound(user, fire_sound, 50, 1) - user.visible_message("[user] fires [src][reflex ? " by reflex":""]!", \ - "You fire [src][reflex ? "by reflex":""]!", \ - "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") + if(silenced) + playsound(user, fire_sound, 10, 1) + else + playsound(user, fire_sound, 50, 1) + if(f == 1) // Only print this once + user.visible_message("[user] fires [src][reflex ? " by reflex":""]!", \ + "You fire [src][reflex ? "by reflex":""]!", \ + "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!") - if(heavy_weapon) - if(user.get_inactive_hand()) - if(prob(15)) - user.visible_message("[src] flies out of [user]'s hands!", "[src] kicks out of your grip!") - user.drop_item() + if(heavy_weapon) + if(user.get_inactive_hand()) + if(prob(15)) + user.visible_message("[src] flies out of [user]'s hands!", "[src] kicks out of your grip!") + user.drop_item() + break - update_icon() - if(user.hand) - user.update_inv_l_hand() - else - user.update_inv_r_hand() + update_icon() + if(user.hand) + user.update_inv_l_hand() + else + user.update_inv_r_hand() + sleep(fire_delay) /obj/item/weapon/gun/proc/ready_projectile(atom/target as mob|obj|turf, mob/living/user) in_chamber.firer = user @@ -204,6 +212,7 @@ in_chamber.loc = get_turf(user) in_chamber.starting = get_turf(user) in_chamber.current = curloc + in_chamber.OnFired() in_chamber.yo = targloc.y - curloc.y in_chamber.xo = targloc.x - curloc.x if(params) diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index 110bf1b4cd6..ea4c15a0596 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -70,7 +70,6 @@ desc = "It's some kind of enormous alien weapon, as long as a man is tall." icon = 'icons/obj/gun.dmi' //Actual on-sprite is handled by icon_override. - icon_override = 'icons/mob/vox.dmi' icon_state = "noisecannon" item_state = "noisecannon" recoil = 1 diff --git a/code/modules/projectiles/guns/energy/advtaser.dm b/code/modules/projectiles/guns/energy/advtaser.dm index 8d7e37812a3..f617db1122b 100644 --- a/code/modules/projectiles/guns/energy/advtaser.dm +++ b/code/modules/projectiles/guns/energy/advtaser.dm @@ -3,7 +3,6 @@ desc = "A hybrid taser designed to fire both short-range high-power electrodes and long-range disabler beams." icon_state = "advtaser" item_state = null //so the human update icon uses the icon_state instead. - icon_override = 'icons/mob/in-hand/guns.dmi' cell_type = "/obj/item/weapon/stock_parts/cell" origin_tech = null fire_sound = 'sound/weapons/Taser.ogg' diff --git a/code/modules/projectiles/guns/energy/hos.dm b/code/modules/projectiles/guns/energy/hos.dm index 2fbb0dfd730..aaf1896caa4 100644 --- a/code/modules/projectiles/guns/energy/hos.dm +++ b/code/modules/projectiles/guns/energy/hos.dm @@ -1,9 +1,8 @@ /obj/item/weapon/gun/energy/hos - name = "head of security's energy gun" + name = "\improper X-01 MultiPhase Energy Gun" desc = "This is a modern recreation of the captain's antique laser gun. This gun has several unique fire modes, but lacks the ability to recharge over time." icon_state = "hoslaser" item_state = null //so the human update icon uses the icon_state instead. - icon_override = 'icons/mob/in-hand/guns.dmi' force = 10 fire_sound = 'sound/weapons/Taser.ogg' origin_tech = "combat=3;magnets=2" diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 16141ac7da4..5355e339ac8 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -17,15 +17,15 @@ clumsy_check = 0 obj/item/weapon/gun/energy/laser/retro - name ="retro laser" + name ="retro laser gun" icon_state = "retro" desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." /obj/item/weapon/gun/energy/laser/captain + name = "\improper QSJ-01 premium laser pistol" icon_state = "caplaser" item_state = "caplaser" - icon_override = 'icons/mob/in-hand/guns.dmi' desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." force = 10 origin_tech = null diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index e4e3533fd7c..5717c594127 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -3,7 +3,6 @@ desc = "A man portable anti-armor weapon designed to disable mechanical threats" icon_state = "ionrifle" item_state = null //so the human update icon uses the icon_state instead. - icon_override = 'icons/mob/in-hand/guns.dmi' fire_sound = 'sound/weapons/IonRifle.ogg' origin_tech = "combat=2;magnets=4" w_class = 5.0 @@ -36,7 +35,7 @@ name = "floral somatoray" desc = "A tool that discharges controlled radiation which induces mutation in plant cells." icon_state = "floramut100" - item_state = "obj/item/gun.dmi" + item_state = "gun" fire_sound = 'sound/effects/stealthoff.ogg' projectile_type = "/obj/item/projectile/energy/floramut" origin_tech = "materials=2;biotech=3;powerstorage=3" @@ -128,11 +127,13 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' w_class = 1 /obj/item/weapon/gun/energy/mindflayer - name = "mind flayer" + name = "\improper Mind Flayer" desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon." icon_state = "xray" projectile_type = "/obj/item/projectile/beam/mindflayer" @@ -231,7 +232,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. desc = "According to Nanotrasen accounting, this is mining equipment. It's been modified for extreme power output to crush rocks, but often serves as a miner's first defense against hostile alien life; it's not very powerful unless used in a low pressure environment." icon_state = "kineticgun" item_state = "kineticgun" - icon_override = 'icons/mob/in-hand/guns.dmi' projectile_type = "/obj/item/projectile/kinetic" fire_sound = 'sound/weapons/Kenetic_accel.ogg' charge_cost = 5000 @@ -309,7 +309,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. attack_verb = list("attacked", "slashed", "cut", "sliced") charge_cost = 250 fire_delay = 15 - icon_override = 'icons/mob/in-hand/guns.dmi' can_charge = 0 /obj/item/weapon/gun/energy/plasmacutter/examine(mob/user) @@ -389,7 +388,6 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. desc = "An extremely high-tech bluespace energy gun capable of teleporting targets to far off locations." icon_state = "telegun" item_state = "ionrifle" - icon_override = 'icons/mob/in-hand/guns.dmi' fire_sound = 'sound/weapons/wave.ogg' origin_tech = "combat=6;materials=7;powerstorage=5;bluespace=5;syndicate=4" cell_type = "/obj/item/weapon/stock_parts/cell/crap" diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm index 5db53cc5a84..1f6f374aef0 100644 --- a/code/modules/projectiles/guns/energy/temperature.dm +++ b/code/modules/projectiles/guns/energy/temperature.dm @@ -1,80 +1,182 @@ /obj/item/weapon/gun/energy/temperature name = "temperature gun" - icon_state = "freezegun" + icon = 'icons/obj/gun_temperature.dmi' + icon_state = "tempgun_4" + item_state = "tempgun_4" + slot_flags = SLOT_BACK + w_class = 4.0 fire_sound = 'sound/weapons/pulse3.ogg' - desc = "A gun that changes temperatures." - var/temperature = T20C - var/current_temperature = T20C - charge_cost = 100 + desc = "A gun that changes the body temperature of its targets." + var/temperature = 300 + var/target_temperature = 300 + charge_cost = 90 origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" - projectile_type = "/obj/item/projectile/temp" - cell_type = "/obj/item/weapon/stock_parts/cell/crap" + projectile_type = /obj/item/projectile/temp + cell_type = /obj/item/weapon/stock_parts/cell/temperaturegun + + var/powercost = "" + var/powercostcolor = "" + + var/emagged = 0 //ups the temperature cap from 500 to 1000, targets hit by beams over 500 Kelvin will burst into flames + var/dat = "" + +/obj/item/weapon/gun/energy/temperature/New() + ..() + update_icon() + processing_objects.Add(src) - New() - ..() - processing_objects.Add(src) +/obj/item/weapon/gun/energy/temperature/Destroy() + processing_objects.Remove(src) + ..() - Destroy() - processing_objects.Remove(src) - return ..() +/obj/item/weapon/gun/energy/temperature/attack_self(mob/living/user as mob) + user.set_machine(src) + update_dat() + user << browse("Temperature Gun Configuration
    [dat]", "window=tempgun;size=510x120") + onclose(user, "tempgun") - attack_self(mob/living/user as mob) - user.set_machine(src) - var/temp_text = "" - if(temperature > (T0C - 50)) - temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" +/obj/item/weapon/gun/energy/temperature/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/card/emag) && !emagged) + emagged = 1 + user << "You double the gun's temperature cap! Targets hit by searing beams will burst into flames!" + desc = "A gun that changes the body temperature of its targets. Its temperature cap has been hacked." + +/obj/item/weapon/gun/energy/temperature/Topic(href, href_list) + if (..()) + return + usr.set_machine(src) + add_fingerprint(usr) + + if(href_list["temp"]) + var/amount = text2num(href_list["temp"]) + if(amount > 0) + target_temperature = min((500 + 500*emagged), target_temperature+amount) else - temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" - - var/dat = {"Freeze Gun Configuration:
    - Current output temperature: [temp_text]
    - Target output temperature: - - - [current_temperature] + + +
    - "} + target_temperature = max(0, target_temperature+amount) + if (istype(loc, /mob)) + attack_self(loc) + add_fingerprint(usr) + return - user << browse(dat, "window=freezegun;size=450x300;can_resize=1;can_close=1;can_minimize=1") - onclose(user, "window=freezegun", src) - - - Topic(href, href_list) - if (..()) - return - usr.set_machine(src) - src.add_fingerprint(usr) - - - - if(href_list["temp"]) - var/amount = text2num(href_list["temp"]) - if(amount > 0) - src.current_temperature = min(500, src.current_temperature+amount) +/obj/item/weapon/gun/energy/temperature/process() + switch(temperature) + if(0 to 100) + charge_cost = 300 + powercost = "High" + if(100 to 250) + charge_cost = 180 + powercost = "Medium" + if(251 to 300) + charge_cost = 90 + powercost = "Low" + if(301 to 400) + charge_cost = 180 + powercost = "Medium" + if(401 to 1000) + charge_cost = 300 + powercost = "High" + switch(powercost) + if("High") powercostcolor = "orange" + if("Medium") powercostcolor = "green" + else powercostcolor = "blue" + if(target_temperature != temperature) + var/difference = abs(target_temperature - temperature) + if(difference >= (10 + 40*emagged)) //so emagged temp guns adjust their temperature much more quickly + if(target_temperature < temperature) + temperature -= (10 + 40*emagged) else - src.current_temperature = max(0, src.current_temperature+amount) - if (istype(src.loc, /mob)) - attack_self(src.loc) - src.add_fingerprint(usr) - return + temperature += (10 + 40*emagged) + else + temperature = target_temperature + update_icon() + + if (istype(loc, /mob/living/carbon)) + var /mob/living/carbon/M = loc + if (src == M.machine) + update_dat() + M << browse("Temperature Gun Configuration
    [dat]", "window=tempgun;size=510x102") - process() - switch(temperature) - if(0 to 100) charge_cost = 1000 - if(100 to 250) charge_cost = 500 - if(251 to 300) charge_cost = 100 - if(301 to 400) charge_cost = 500 - if(401 to 500) charge_cost = 1000 + if(power_supply) + power_supply.give(50) + update_icon() + return - if(current_temperature != temperature) - var/difference = abs(current_temperature - temperature) - if(difference >= 10) - if(current_temperature < temperature) - temperature -= 10 - else - temperature += 10 - else - temperature = current_temperature - return +/obj/item/weapon/gun/energy/temperature/proc/update_dat() + dat = "" + dat += "Current output temperature: " + if(temperature > 500) + dat += "[temperature] ([round(temperature-T0C)]°C)" + dat += " SEARING!" + else if(temperature > (T0C + 50)) + dat += "[temperature] ([round(temperature-T0C)]°C)" + else if(temperature > (T0C - 50)) + dat += "[temperature] ([round(temperature-T0C)]°C)" + else + dat += "[temperature] ([round(temperature-T0C)]°C)" + dat += "
    " + dat += "Target output temperature: " //might be string idiocy, but at least it's easy to read + dat += "- " + dat += "- " + dat += "- " + dat += "[target_temperature] " + dat += "+ " + dat += "+ " + dat += "+" + dat += "
    " + dat += "Power cost: " + dat += "[powercost]" + +/obj/item/weapon/gun/energy/temperature/proc/update_temperature() + switch(temperature) + if(501 to INFINITY) + item_state = "tempgun_8" + if(400 to 500) + item_state = "tempgun_7" + if(360 to 400) + item_state = "tempgun_6" + if(335 to 360) + item_state = "tempgun_5" + if(295 to 335) + item_state = "tempgun_4" + if(260 to 295) + item_state = "tempgun_3" + if(200 to 260) + item_state = "tempgun_2" + if(120 to 260) + item_state = "tempgun_1" + if(-INFINITY to 120) + item_state = "tempgun_0" + icon_state = item_state + +/obj/item/weapon/gun/energy/temperature/proc/update_charge() + var/charge = power_supply.charge + switch(charge) + if(900 to INFINITY) overlays += "900" + if(800 to 900) overlays += "800" + if(700 to 800) overlays += "700" + if(600 to 700) overlays += "600" + if(500 to 600) overlays += "500" + if(400 to 500) overlays += "400" + if(300 to 400) overlays += "300" + if(200 to 300) overlays += "200" + if(100 to 200) overlays += "100" + if(-INFINITY to 100) overlays += "0" + +/obj/item/weapon/gun/energy/temperature/proc/update_user() + if (istype(loc,/mob/living/carbon)) + var/mob/living/carbon/M = loc + M.update_inv_back() + M.update_inv_l_hand() + M.update_inv_r_hand() + +/obj/item/weapon/gun/energy/temperature/update_icon() + overlays = 0 + update_temperature() + update_user() + update_charge() \ No newline at end of file diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 3bdcbdce860..57c3ca2628c 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -4,10 +4,12 @@ icon = 'icons/obj/gun.dmi' icon_state = "staffofnothing" item_state = "staff" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' //not really a gun and some toys use these inhands + righthand_file = 'icons/mob/inhands/items_righthand.dmi' fire_sound = 'sound/weapons/emitter.ogg' flags = CONDUCT w_class = 5 - var/projectile_type = "/obj/item/projectile/magic" + var/projectile_type = /obj/item/projectile/magic var/max_charges = 6 var/charges = 0 var/recharge_rate = 4 diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 5fdeb481d5a..16fc552397d 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -14,7 +14,6 @@ obj/item/weapon/gun/magic/staff/animate projectile_type = "/obj/item/projectile/magic/animate" icon_state = "staffofanimation" item_state = "staffofanimation" - icon_override = 'icons/mob/in-hand/staff.dmi' obj/item/weapon/gun/magic/staff/healing name = "staff of healing" @@ -22,7 +21,6 @@ obj/item/weapon/gun/magic/staff/healing projectile_type = "/obj/item/projectile/magic/resurrection" icon_state = "staffofhealing" item_state = "staffofhealing" - icon_override = 'icons/mob/in-hand/staff.dmi' obj/item/weapon/gun/magic/staff/chaos name = "staff of chaos" @@ -30,7 +28,6 @@ obj/item/weapon/gun/magic/staff/chaos projectile_type = "/obj/item/projectile/magic" icon_state = "staffofchaos" item_state = "staffofchaos" - icon_override = 'icons/mob/in-hand/staff.dmi' max_charges = 10 recharge_rate = 2 @@ -49,7 +46,6 @@ obj/item/weapon/gun/magic/staff/door projectile_type = "/obj/item/projectile/magic/door" icon_state = "staffofdoor" item_state = "staffofdoor" - icon_override = 'icons/mob/in-hand/staff.dmi' max_charges = 10 recharge_rate = 2 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index f4c1142039c..8860c560021 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -1,25 +1,73 @@ -/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude - name = "prototype SMG" - desc = "A lightweight, prototype 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors." - icon_state = "saber" +/obj/item/weapon/gun/projectile/automatic w_class = 3.0 - origin_tech = "combat=4;materials=2" automatic = 1 - mag_type = "/obj/item/ammo_box/magazine/smgm9mm" var/alarmed = 0 + var/select = 1 can_suppress = 1 - fire_delay = 0 - isHandgun() - return 0 + burst_size = 3 + fire_delay = 2 + action_button_name = "Toggle Firemode" + +/obj/item/weapon/gun/projectile/automatic/isHandgun() + return 0 + +/obj/item/weapon/gun/projectile/automatic/proto + name = "\improper Nanotrasen Saber SMG" + desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors." + icon_state = "saber" + mag_type = "/obj/item/ammo_box/magazine/smgm9mm" + origin_tech = "combat=4;materials=2" /obj/item/weapon/gun/projectile/automatic/update_icon() ..() + overlays.Cut() + if(!select) + overlays += "[initial(icon_state)]semi" + if(select == 1) + overlays += "[initial(icon_state)]burst" icon_state = "[initial(icon_state)][magazine ? "-[magazine.max_ammo]" : ""][chambered ? "" : "-e"][silenced ? "-suppressed" : ""]" return /obj/item/weapon/gun/projectile/automatic/attackby(var/obj/item/A as obj, mob/user as mob, params) - if(..() && chambered) - alarmed = 0 + . = ..() + if(.) + return + if(istype(A, /obj/item/ammo_box/magazine)) + var/obj/item/ammo_box/magazine/AM = A + if(istype(AM, text2path(mag_type))) + if(magazine) + user << "You perform a tactical reload on \the [src], replacing the magazine." + magazine.forceMove(get_turf(src.loc)) + magazine.update_icon() + magazine = null + else + user << "You insert the magazine into \the [src]." + user.remove_from_mob(AM) + magazine = AM + magazine.forceMove(src) + chamber_round() + A.update_icon() + update_icon() + return 1 + +/obj/item/weapon/gun/projectile/automatic/ui_action_click() + burst_select() + +/obj/item/weapon/gun/projectile/automatic/verb/burst_select() + var/mob/living/carbon/human/user = usr + select = !select + if(!select) + burst_size = 1 + fire_delay = 0 + user << "You switch to semi-automatic." + else + burst_size = initial(burst_size) + fire_delay = initial(fire_delay) + user << "You switch to [burst_size] round burst." + + playsound(user, 'sound/weapons/empty.ogg', 100, 1) + update_icon() + return /obj/item/weapon/gun/projectile/automatic/proc/empty_alarm() if(!chambered && !get_ammo() && !alarmed) @@ -29,13 +77,15 @@ return /obj/item/weapon/gun/projectile/automatic/c20r - name = "syndicate SMG" - desc = "A lightweight, bullpup .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp." + name = "\improper C-20r SMG" + desc = "A two-round burst .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp." icon_state = "c20r" item_state = "c20r" origin_tech = "combat=5;materials=2;syndicate=8" mag_type = "/obj/item/ammo_box/magazine/smgm45" fire_sound = 'sound/weapons/Gunshot_smg.ogg' + fire_delay = 2 + burst_size = 2 /obj/item/weapon/gun/projectile/automatic/c20r/New() ..() @@ -52,9 +102,16 @@ icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][silenced ? "-suppressed" : ""]" return - +/obj/item/weapon/gun/projectile/automatic/mini_uzi + name = "\improper 'Type U3' Uzi" + desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds." + icon_state = "mini-uzi" + origin_tech = "combat=5;materials=2;syndicate=8" + mag_type = "/obj/item/ammo_box/magazine/uzim9mm" + burst_size = 2 + /obj/item/weapon/gun/projectile/automatic/l6_saw - name = "syndicate LMG" + name = "\improper L6 SAW LMG" desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation." icon_state = "l6closed100" item_state = "l6closedmag" @@ -66,19 +123,17 @@ var/cover_open = 0 can_suppress = 0 - - - + burst_size = 5 + fire_delay = 3 + /obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) cover_open = !cover_open user << "You [cover_open ? "open" : "close"] [src]'s cover." update_icon() - /obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() icon_state = "l6[cover_open ? "open" : "closed"][magazine ? round(magazine.ammo_count() * 2, 25) : "-empty"]" - /obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays if(cover_open) user << "[src]'s cover is open! Close it before firing!" @@ -86,7 +141,6 @@ ..() update_icon() - /obj/item/weapon/gun/projectile/automatic/l6_saw/attack_hand(mob/user as mob) if(loc != user) ..() @@ -109,113 +163,77 @@ return ..() - -/obj/item/weapon/gun/projectile/automatic/bulldog - name = "syndicate shotgun" - desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines." - icon_state = "bulldog" - item_state = "bulldog" - icon_override = 'icons/mob/in-hand/guns.dmi' - w_class = 3.0 - origin_tech = "combat=5;materials=4;syndicate=6" - mag_type = "/obj/item/ammo_box/magazine/m12g" - fire_sound = 'sound/weapons/Gunshot4.ogg' - can_suppress = 0 - -/obj/item/weapon/gun/projectile/automatic/bulldog/New() - ..() - update_icon() - return - -/obj/item/weapon/gun/projectile/automatic/bulldog/proc/update_magazine() - if(magazine) - src.overlays = 0 - overlays += "[magazine.icon_state]" - return - -/obj/item/weapon/gun/projectile/automatic/bulldog/update_icon() - src.overlays = 0 - update_magazine() - icon_state = "bulldog[chambered ? "" : "-e"]" - return - -/obj/item/weapon/gun/projectile/automatic/bulldog/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) - ..() - empty_alarm() - return - - -/obj/item/weapon/gun/projectile/automatic/c90gl - name = "syndicate assault rifle" - desc = "A bullpup and compact 5.45x39 assault rifle with a unique toploading design, designated 'C-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off." - icon_state = "c90gl" - item_state = "c90gl" - icon_override = 'icons/mob/in-hand/guns.dmi' +/obj/item/weapon/gun/projectile/automatic/m90 + name = "\improper M-90gl Carbine" + desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off." + icon_state = "m90" + item_state = "m90" origin_tech = "combat=5;materials=2;syndicate=8" - mag_type = "/obj/item/ammo_box/magazine/m545" + mag_type = "/obj/item/ammo_box/magazine/m556" fire_sound = 'sound/weapons/Gunshot_smg.ogg' action_button_name = "Toggle Grenade Launcher" can_suppress = 0 - var/select = 1 //1 for boolets, 0 for explosions. var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel + burst_size = 3 + fire_delay = 2 -/obj/item/weapon/gun/projectile/automatic/c90gl/New() +/obj/item/weapon/gun/projectile/automatic/m90/New() ..() underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src) update_icon() return -/obj/item/weapon/gun/projectile/automatic/c90gl/afterattack(var/atom/target, var/mob/living/user, flag, params) - if(select) +/obj/item/weapon/gun/projectile/automatic/m90/afterattack(var/atom/target, var/mob/living/user, flag, params) + if(select == 2) + underbarrel.afterattack(target, user, flag, params) + else ..() empty_alarm() return + +/obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user, params) + if(istype(A, /obj/item/ammo_casing)) + if(istype(A, text2path(underbarrel.magazine.ammo_type))) + underbarrel.attack_self() + underbarrel.attackby(A, user, params) else - underbarrel.afterattack(target, user, flag, params) - -/obj/item/weapon/gun/projectile/automatic/c90gl/attackby(var/obj/item/A, mob/user, params) - if(select) ..() - else - underbarrel.attackby(A, user, params) -/obj/item/weapon/gun/projectile/automatic/c90gl/attack_self(var/mob/living/user) - if(select) - ..() - else - underbarrel.attack_self(user) - - - -/obj/item/weapon/gun/projectile/automatic/c90gl/update_icon() +/obj/item/weapon/gun/projectile/automatic/m90/update_icon() ..() overlays.Cut() - if(select) - overlays += "c90prim" - else - overlays += "c90gren" - icon_state = "c90gl[magazine ? "-[Ceiling(get_ammo(0)/6)*6]" : ""][chambered ? "" : "-e"]" + switch(select) + if(0) + overlays += "[initial(icon_state)]semi" + if(1) + overlays += "[initial(icon_state)]burst" + if(2) + overlays += "[initial(icon_state)]gren" + icon_state = "[initial(icon_state)][magazine ? "" : "-e"]" return -/obj/item/weapon/gun/projectile/automatic/c90gl/proc/underbarrel_swap() +/obj/item/weapon/gun/projectile/automatic/m90/burst_select() var/mob/living/carbon/human/user = usr - if(select) - select = 0 - user << "You switch to grenades." - else - select = 1 - user << "You switch to bullets." - + switch(select) + if(0) + select = 1 + burst_size = initial(burst_size) + fire_delay = initial(fire_delay) + user << "You switch to [burst_size] round burst." + if(1) + select = 2 + user << "You switch to grenades." + if(2) + select = 0 + burst_size = 1 + fire_delay = 0 + user << "You switch to semi-auto." + playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() return -/obj/item/weapon/gun/projectile/automatic/c90gl/ui_action_click() - underbarrel_swap() - - - /obj/item/weapon/gun/projectile/automatic/tommygun - name = "tommy gun" + name = "\improper Thompson SMG" desc = "A genuine 'Chicago Typewriter'." icon_state = "tommygun" item_state = "tommygun" @@ -223,4 +241,20 @@ origin_tech = "combat=5;materials=1;syndicate=2" mag_type = "/obj/item/ammo_box/magazine/tommygunm45" fire_sound = 'sound/weapons/Gunshot_smg.ogg' - can_suppress = 0 \ No newline at end of file + can_suppress = 0 + fire_delay = 1 + burst_size = 4 + +/obj/item/weapon/gun/projectile/automatic/ar + name = "ARG" + desc = "A robust assault rile used by Nanotrasen fighting forces." + icon_state = "arg" + item_state = "arg" + slot_flags = 0 + origin_tech = "combat=5;materials=1" + mag_type = "/obj/item/ammo_box/magazine/m556" + fire_sound = 'sound/weapons/Gunshot_smg.ogg' + can_suppress = 0 + burst_size = 3 + fire_delay = 1 + \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index fee2e2fef71..a494fde8051 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -3,14 +3,17 @@ /obj/item/weapon/gun/projectile/automatic/gyropistol - name = "gyrojet pistol" + name = "\improper Gyrojet rocket pistol" desc = "A prototype pistol designed to fire self propelled rockets." icon_state = "gyropistol" fire_sound = 'sound/effects/Explosion1.ogg' origin_tech = "combat=3" mag_type = "/obj/item/ammo_box/magazine/m75" - isHandgun() - return 1 + burst_size = 1 + fire_delay = 0 + +/obj/item/weapon/gun/projectile/automatic/gyropistol/isHandgun() + return 1 /obj/item/weapon/gun/projectile/automatic/gyropistol/New() ..() @@ -36,6 +39,7 @@ icon_state = "dshotgun-sawn" item_state = "gun" mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher" + fire_sound = 'sound/weapons/grenadelaunch.ogg' w_class = 3 /obj/item/weapon/gun/projectile/revolver/grenadelauncher/attackby(var/obj/item/A, mob/user, params) @@ -48,7 +52,6 @@ name = "multi grenade launcher" icon_state = "bulldog" item_state = "bulldog" - icon_override = 'icons/mob/in-hand/guns.dmi' mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher/multi" /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 108e6977e11..c5ab2fa7c73 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -1,56 +1,50 @@ /obj/item/weapon/gun/projectile/automatic/pistol - name = "syndicate pistol" + name = "\improper FK-69 pistol" desc = "A small, easily concealable 10mm handgun. Has a threaded barrel for suppressors." icon_state = "pistol" w_class = 2 origin_tech = "combat=2;materials=2;syndicate=2" mag_type = "/obj/item/ammo_box/magazine/m10mm" can_suppress = 1 - isHandgun() - return 1 + burst_size = 1 + fire_delay = 0 + action_button_name = null + +/obj/item/weapon/gun/projectile/automatic/pistol/isHandgun() + return 1 /obj/item/weapon/gun/projectile/automatic/pistol/update_icon() ..() icon_state = "[initial(icon_state)][chambered ? "" : "-e"][silenced ? "-suppressed" : ""]" return -/obj/item/weapon/gun/projectile/automatic/m2411 - name = "M2411" +/obj/item/weapon/gun/projectile/automatic/pistol/m2411 + name = "\improper M2411 pistol" desc = "John Browning's classic updated for the modern day. Uses .45 rounds." icon_state = "m2411" w_class = 3.0 origin_tech = "combat=3;materials=2" mag_type = "/obj/item/ammo_box/magazine/m45" - isHandgun() - return 1 + can_suppress = 0 - -/obj/item/weapon/gun/projectile/automatic/m2411/update_icon() - ..() - icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" - return - -/obj/item/weapon/gun/projectile/automatic/deagle - name = "desert eagle" +/obj/item/weapon/gun/projectile/automatic/pistol/deagle + name = "\improper Desert Eagle pistol" desc = "A robust .50 AE handgun." icon_state = "deagle" force = 14.0 mag_type = "/obj/item/ammo_box/magazine/m50" - isHandgun() - return 1 + can_suppress = 0 -/obj/item/weapon/gun/projectile/automatic/deagle/update_icon() +/obj/item/weapon/gun/projectile/automatic/pistol/deagle/update_icon() ..() icon_state = "[initial(icon_state)][magazine ? "" : "-e"]" -/obj/item/weapon/gun/projectile/automatic/deagle/gold +/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold desc = "A gold plated desert eagle folded over a million times by superior martian gunsmiths. Uses .50 AE ammo." icon_state = "deagleg" item_state = "deagleg" - - -/obj/item/weapon/gun/projectile/automatic/deagle/camo +/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo desc = "A Deagle brand Deagle for operators operating operationally. Uses .50 AE ammo." icon_state = "deaglecamo" item_state = "deagleg" \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 23ac5bb06f4..713ebbf9dce 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -1,6 +1,6 @@ /obj/item/weapon/gun/projectile/revolver + name = "\improper .357 revolver" desc = "A suspicious revolver. Uses .357 ammo." - name = "revolver" icon_state = "revolver" mag_type = "/obj/item/ammo_box/magazine/internal/cylinder" @@ -65,6 +65,7 @@ user << "[get_ammo(0,0)] of those are live rounds." /obj/item/weapon/gun/projectile/revolver/detective + name = "\improper .38 Mars Special" desc = "A cheap Martian knock-off of a classic law enforcement firearm. Uses .38-special rounds." name = "revolver" icon_state = "detective" @@ -154,8 +155,8 @@ /obj/item/weapon/gun/projectile/revolver/mateba - name = "autorevolver" - desc = "A retro high-powered mateba autorevolver typically used by officers of the New Russia military. Uses .357 ammo." //>10mm hole >.357 + name = "\improper Unica 6 auto-revolver" + desc = "A retro high-powered autorevolver typically used by officers of the New Russia military. Uses .357 ammo." //>10mm hole >.357 icon_state = "mateba" origin_tech = "combat=2;materials=2" @@ -163,7 +164,7 @@ // You can spin the chamber to randomize the position of the bullet. /obj/item/weapon/gun/projectile/revolver/russian - name = "Russian Revolver" + name = "\improper Russian Revolver" desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism that spins the chamber before each trigger pull." origin_tech = "combat=2;materials=2" mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/rus357" diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index b5cac89db89..fe85f7d3101 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -104,11 +104,10 @@ /////////////////////// /obj/item/weapon/gun/projectile/shotgun/boltaction - name = "bolt action rifle" + name = "\improper Mosin Nagant rifle" desc = "This piece of junk looks like something that could have been used 700 years ago." icon_state = "moistnugget" item_state = "moistnugget" - icon_override = 'icons/mob/in-hand/guns.dmi' slot_flags = 0 //no SLOT_BACK sprite, alas mag_type = "/obj/item/ammo_box/magazine/internal/boltaction" var/bolt_open = 0 @@ -238,3 +237,39 @@ return else sawn_state = SAWN_INTACT + +/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog + name = "\improper MLG-12 'Bulldog' Shotgun" + desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines." + icon_state = "bulldog" + item_state = "bulldog" + w_class = 3.0 + origin_tech = "combat=5;materials=4;syndicate=6" + mag_type = "/obj/item/ammo_box/magazine/m12g" + fire_sound = 'sound/weapons/Gunshot4.ogg' + can_suppress = 0 + burst_size = 1 + fire_delay = 0 + action_button_name = null + +/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New() + ..() + update_icon() + return + +/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/proc/update_magazine() + if(magazine) + overlays.Cut() + overlays += "[magazine.icon_state]" + return + +/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/update_icon() + overlays.Cut() + update_magazine() + icon_state = "bulldog[chambered ? "" : "-e"]" + return + +/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) + ..() + empty_alarm() + return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8542729e3d1..aff5fbfd167 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -88,6 +88,9 @@ var/mob/living/L = target return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, agony, blocked, stamina, jitter) + proc/OnFired() //if assigned, allows for code when the projectile gets fired + return 1 + proc/check_fire(var/mob/living/target as mob, var/mob/living/user as mob) //Checks if you can hit them or not. if(!istype(target) || !istype(user)) return 0 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index b263e03afeb..962ed6725a3 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -44,17 +44,59 @@ /obj/item/projectile/temp name = "freeze beam" - icon_state = "ice_2" + icon_state = "temp_4" damage = 0 damage_type = BURN nodamage = 1 flag = "energy" var/temperature = 300 + var/obj/item/weapon/gun/energy/temperature/T = null + + OnFired() + T = shot_from + temperature = T.temperature + switch(temperature) + if(501 to INFINITY) + name = "searing beam" //if emagged + icon_state = "temp_8" + if(400 to 500) + name = "burning beam" //temp at which mobs start taking HEAT_DAMAGE_LEVEL_2 + icon_state = "temp_7" + if(360 to 400) + name = "hot beam" //temp at which mobs start taking HEAT_DAMAGE_LEVEL_1 + icon_state = "temp_6" + if(335 to 360) + name = "warm beam" //temp at which players get notified of their high body temp + icon_state = "temp_5" + if(295 to 335) + name = "ambient beam" + icon_state = "temp_4" + if(260 to 295) + name = "cool beam" //temp at which players get notified of their low body temp + icon_state = "temp_3" + if(200 to 260) + name = "cold beam" //temp at which mobs start taking COLD_DAMAGE_LEVEL_1 + icon_state = "temp_2" + if(120 to 260) + name = "ice beam" //temp at which mobs start taking COLD_DAMAGE_LEVEL_2 + icon_state = "temp_1" + if(-INFINITY to 120) + name = "freeze beam" //temp at which mobs start taking COLD_DAMAGE_LEVEL_3 + icon_state = "temp_0" + else + name = "temperature beam"//failsafe + icon_state = "temp_4" + on_hit(var/atom/target, var/blocked = 0)//These two could likely check temp protection on the mob if(istype(target, /mob/living)) - var/mob/M = target + var/mob/living/M = target M.bodytemperature = temperature + if(temperature > 500)//emagged + M.adjust_fire_stacks(0.5) + M.on_fire = 1 + M.update_icon = 1 + playsound(M.loc, 'sound/effects/bamf.ogg', 50, 0) return 1 /obj/item/projectile/meteor diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 29a67ffe492..c5d2ba86fbf 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -628,6 +628,7 @@ atom/proc/create_reagents(var/max_vol) reagents.my_atom = src /datum/reagents/Destroy() + ..() processing_objects.Remove(src) for(var/datum/reagent/R in reagent_list) qdel(R) @@ -635,4 +636,4 @@ atom/proc/create_reagents(var/max_vol) reagent_list = null if(my_atom && my_atom.reagents == src) my_atom.reagents = null - return ..() \ No newline at end of file + return QDEL_HINT_QUEUE \ No newline at end of file diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm index 49fbb1aa6c4..16c41141815 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/reagents/grenade_launcher.dm @@ -69,7 +69,6 @@ /obj/item/weapon/gun/grenadelauncher/piecannon name = "pie cannon" icon = 'icons/obj/gun.dmi' - icon_override = 'icons/mob/in-hand/guns.dmi' icon_state = "piecannon1" item_state = "piecannon1" w_class = 4.0 diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm index a1d8b033672..9d38b1ad599 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm @@ -214,11 +214,12 @@ on_reaction(var/datum/reagents/holder) for(var/mob/O in viewers(get_turf(holder.my_atom), null)) O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 140 - M << "\blue You feel a chill!" + spawn(50) + if(holder && holder.my_atom) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) + M.bodytemperature -= 140 + M << "\blue You feel a chill!" //Orange slimecasp @@ -242,10 +243,11 @@ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") for(var/mob/O in viewers(get_turf(holder.my_atom), null)) O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) + spawn(50) + if(holder && holder.my_atom) + var/turf/simulated/T = get_turf(holder.my_atom) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) //Yellow slimeoverload @@ -387,8 +389,9 @@ on_reaction(var/datum/reagents/holder) for(var/mob/O in viewers(get_turf(holder.my_atom), null)) O.show_message(text("\red The slime extract begins to vibrate violently !"), 1) - sleep(50) - explosion(get_turf(holder.my_atom), 1 ,3, 6) + spawn(50) + if(holder && holder.my_atom) + explosion(get_turf(holder.my_atom), 1 ,3, 6) //Light Pink slimepotion2 name = "Slime Potion 2" diff --git a/code/modules/reagents/oldchem/reagents/_reagent_base.dm b/code/modules/reagents/oldchem/reagents/_reagent_base.dm index 2b2a94ee149..782f25d36cc 100644 --- a/code/modules/reagents/oldchem/reagents/_reagent_base.dm +++ b/code/modules/reagents/oldchem/reagents/_reagent_base.dm @@ -78,5 +78,6 @@ return /datum/reagent/Destroy() + ..() holder = null - return ..() \ No newline at end of file + return QDEL_HINT_QUEUE \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 53e8beafc78..eb932e8488f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -8,7 +8,6 @@ icon = 'icons/obj/syringe.dmi' item_state = "hypo" icon_state = "hypo" - icon_override = 'icons/mob/in-hand/tools.dmi' amount_per_transfer_from_this = 5 volume = 30 possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 3482547f113..bacf0fdf538 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -112,19 +112,19 @@ category = list("Weapons") /datum/design/smg - name = "Prototype Submachine Gun" + name = "Nanotrasen Saber SMG" desc = "A prototype weapon made using lightweight materials on a traditional frame, designed to fire standard 9mm rounds." id = "smg" req_tech = list("combat" = 4, "materials" = 3) build_type = PROTOLATHE materials = list(MAT_METAL = 8000, MAT_SILVER = 2000, MAT_DIAMOND = 1000) - build_path = /obj/item/weapon/gun/projectile/automatic + build_path = /obj/item/weapon/gun/projectile/automatic/proto locked = 1 category = list("Weapons") /datum/design/mag_smg - name = "Prototype Submachine Gun Magazine (9mm)" - desc = "A 20-round magazine for the prototype submachine gun." + name = "Saber Submachine Gun Magazine (9mm)" + desc = "A 20-round magazine for the Saber submachine gun." id = "mag_smg" req_tech = list("combat" = 4, "materials" = 3) build_type = PROTOLATHE @@ -165,13 +165,12 @@ /datum/design/temp_gun name = "Temperature Gun" - desc = "A gun that shoots temperature bullet energy things to change temperature."//Change it if you want + desc = "A gun that changes the body temperature of its targets." id = "temp_gun" req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2) build_type = PROTOLATHE materials = list(MAT_METAL = 5000, MAT_GLASS = 500, MAT_SILVER = 3000) build_path = /obj/item/weapon/gun/energy/temperature - locked = 1 category = list("Weapons") /datum/design/suppressor @@ -190,7 +189,7 @@ id = "techshotshell" req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 4, "magnets" = 3) build_type = PROTOLATHE - materials = list(MAT_METAL = 1000, MAT_GLASS = 200, MAT_SILVER = 300) + materials = list(MAT_METAL = 1000, MAT_GLASS = 200) build_path = /obj/item/ammo_casing/shotgun/techshell category = list("Weapons") diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 26e8c26f508..d94b0af256f 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi new file mode 100644 index 00000000000..fac217e71fa Binary files /dev/null and b/icons/mob/body_accessory.dmi differ diff --git a/icons/mob/in-hand/README.md b/icons/mob/in-hand/README.md deleted file mode 100644 index b18cc841711..00000000000 --- a/icons/mob/in-hand/README.md +++ /dev/null @@ -1,43 +0,0 @@ -In-Hand DMI Compile System -========================== - -A shitty hack by N3X15 - -WHY THE FUCK? -------------- - -BYOND 499 limited the number of icon states that can be -added to a DMI to 512 states. Why? Who fucking knows. -Magically, DM can't edit them but the server doesn't -care how big they are, so it's probably a shitty hack -so they don't have to change the array's index type. - -Whatever the case, we ran into this wall. You cannot edit -items_lefthand and items_righthand with BYOND anymore. We -filed a bug report: http://www.byond.com/forum/?post=1507331 - -They closed it with "Not a Bug". - -So, here we are. The only way to edit DMIs that big -is with third-party tools like OpenBYOND. - -How to Compile --------------- - -Simply dump your DMIs into the appropriate folder and run -compile.py from within this folder. It'll build the DMIs -and jam everything into a single meta-DMI for you. - -Simple. - -Adding More Output Targets --------------------------- - -If you've run into the problem mentioned above with another -DMI, have no fear: Just edit compile.py and add the new -output target to the ToBuild dict as shown in the comments. - -License -------- - -MIT \ No newline at end of file diff --git a/icons/mob/in-hand/changeling.dmi b/icons/mob/in-hand/changeling.dmi deleted file mode 100644 index ab9e0857312..00000000000 Binary files a/icons/mob/in-hand/changeling.dmi and /dev/null differ diff --git a/icons/mob/in-hand/clothes.dmi b/icons/mob/in-hand/clothes.dmi deleted file mode 100644 index 0be1a13ed83..00000000000 Binary files a/icons/mob/in-hand/clothes.dmi and /dev/null differ diff --git a/icons/mob/in-hand/duffelbag.dmi b/icons/mob/in-hand/duffelbag.dmi deleted file mode 100644 index 736febaeba6..00000000000 Binary files a/icons/mob/in-hand/duffelbag.dmi and /dev/null differ diff --git a/icons/mob/in-hand/guns.dmi b/icons/mob/in-hand/guns.dmi deleted file mode 100644 index 7165bf43719..00000000000 Binary files a/icons/mob/in-hand/guns.dmi and /dev/null differ diff --git a/icons/mob/in-hand/in-hand_sync_report.txt b/icons/mob/in-hand/in-hand_sync_report.txt deleted file mode 100644 index eaa6be1eccd..00000000000 --- a/icons/mob/in-hand/in-hand_sync_report.txt +++ /dev/null @@ -1,1123 +0,0 @@ -# DMITool Difference Report: Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\ambassdor_left.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\ambassdor_left.dmi - + kidanspear ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\cable_stuff.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\cable_stuff.dmi - + cuff_cyan - + cuff_orange - + cuff_pink - + cuff_white ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\flags_left.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\flags_left.dmi - + atmosflag - + atmosflag_fire - + cargoflag - + cargoflag_fire - + cargoflag_old - + clownflag - + clownflag_fire - + cultflag - + cultflag_fire - + dionaflag - + dionaflag_fire - + fire - + greyflag - + greyflag_fire - + greysflag - + greysflag_fire - + humanflag - + humanflag_fire - + ianflag - + ianflag_fire - + kidanflag - + kidanflag_fire - + machineflag - + machineflag_fire - + medflag - + medflag_fire - + mimeflag - + mimeflag_fire - + ninjaflag - + ninjaflag_fire - + ntflag - + ntflag_fire - + ponyflag - + ponyflag_fire - + rndflag - + rndflag_fire - + secflag - + secflag_fire - + secflag_old - + skrellflag - + skrellflag_fire - + slimeflag - + slimeflag_fire - + syndiflag - + syndiflag_fire - + tajflag - + tajflag_fire - + unathiflag - + unathiflag_fire - + voxflag - + voxflag_fire - + wizflag - + wizflag_fire ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\guns.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\guns.dmi - + scythe0 ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\paradise_items_lefthand.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\paradise_items_lefthand.dmi - + DONGS - + altair_locket - + an_tank - + analyzer - + armor - + armor_reflec - + assembly - + atmos_hardsuit - + atmos_helm - + atmos_suit - + atoxinbottle - + autoinjector - + axe0 - + axe1 - + b_mask - + b_shoes - + b_shoesold - + b_suit - + ba_suit - + backpack - + balloon - + balloon-empty - + basketball - + baton - + baton_on - + beachball - + beaker - + bedsheet - + beer - + bgloves - + bible - + bike_horn - + bio_hood - + bio_orange - + bio_suit - + bl_shoes - + bl_shoesold - + bl_suit - + blackskirt - + blade - + blindfold - + blueprints - + bombvest - + brain2 - + brick - + briefcase - + broken_beer - + broom - + browncane - + brutepack - + bucket - + buckler - + bucklerOLD - + buildpipe - + burger - + butch - + butcher_knife - + c20r - + c_tube - + cakehat0 - + cakehat1 - + candy - + cane_nt - + cane_nt_active - + canister - + caphat - + capspacehelmet - + capspacesuit - + captainpack - + card-id - + cardborg - + cardborg_h - + carton - + caution - + ce_hardsuit - + ce_helm - + cell - + centcom - + centhat - + cespace_helmet - + cespace_suit - + chain - + chainmail - + chef - + chefhat - + chickensuit - + chips - + cigoff - + cigon - + cigpacket - + classic_baton - + claymore - + cleaner - + clipboard - + clown - + clown_hat - + clown_shoes - + clownflag - + clownhelmet - + clownpack - + coffee - + coil - + coil-wire - + coil_blue - + coil_red - + cola - + contliquid - + contsolid - + contvapour - + coolant-c - + crossbow - + crossbow-solid - + crowbar - + crowbar_red - + cueball - + cultblade - + culthood - + cultpack - + cultrobes - + cutlass0 - + cutlass1 - + cutters - + cutters_yellow - + daederic - + deagleg - + death_commando_mask - + death_commando_suit - + deathnettle - + det - + det_hat - + det_suit - + dg_suit - + dnainjector - + donut1 - + donut2 - + dpickaxe - + dr_gibb - + dropper - + dualsaber0 - + dualsaber1 - + dualsaberblue1 - + dualsabergreen1 - + dualsaberpurple1 - + dualsaberred1 - + earmuffs - + egg - + egg1 - + egg2 - + egg3 - + egg4 - + egg5 - + eleanorstone - + electronic - + electropack - + emergency - + emergency_double - + emergency_engi - + emp - + energy_drink - + energykill - + energykill0 - + energykill100 - + energykill25 - + energykill50 - + energykill75 - + energystun - + energystun0 - + energystun100 - + energystun25 - + energystun50 - + energystun75 - + eng_hardsuit - + eng_helm - + engi_suit - + engiepack - + engspace_helmet - + engspace_suit - + eshield0 - + eshield1 - + faggot - + fire_extinguisher - + fire_suit - + fireaxe0 - + fireaxe1 - + firefighter - + firstaid - + firstaid-advanced - + firstaid-ointment - + firstaid-toxin - + flamethrower_0 - + flamethrower_1 - + flare - + flashbang - + flashlight - + foamcrossbow - + focus - + fork - + fr_jacket - + g_suit - + galoshes - + gas_alt - + gas_mask - + gift - + giftbag - + glasses - + gold_id - + gpickaxe - + greatcoat - + greenbandana - + gun - + gy_suit - + handcuff - + harpoon - + hatchet - + headset - + healthanalyzer - + helm-command - + helm-orange - + helmet - + hoe - + holidaypriest - + ice_tea_can - + imperium_monk - + implantcase - + ithaqua - + jackboots - + jackhammer - + janitor - + jensencoat - + jensensuit - + jetpack - + jetpack-black - + jetpack-void - + johnny - + johnny_coat - + judge - + katana - + kilt - + kingyellow - + knife - + kobskull - + konaahirano - + koran - + l6closedmag - + l6closednomag - + l6openmag - + l6opennomag - + labcoat - + lamp - + lampgreen - + laser - + latexballon - + launcher - + lawyer_black - + lawyer_blue - + lawyer_red - + lb_suit - + lemon-lime - + lgloves - + lipstick - + lipstickopen - + m_mask - + magboots - + medibottle - + medical_hardsuit - + medical_helm - + medicalpack - + melted - + miniFE - + mining_hardsuit - + mining_helm - + mister - + mop - + mousetrap - + multitool - + muzzle - + nazi1 - + necronomicon - + nettle - + newspaper - + nothing - + ntflag - + nucgun - + nucgun0 - + nucgun100 - + nucgun25 - + nucgun50 - + nucgun75 - + nullrod - + nun - + nursesuit - + o_shoes - + o_shoes1 - + o_suit - + ointment - + overalls - + owl - + owl_mask - + oxygen - + oxygen-c - + oxygen_f - + oxygen_fr - + p_suit - + paintcan - + paper - + pen - + pickaxe - + pie - + pill - + plantbgone - + plasma - + plasma-c - + plasticbag - + plasticx - + pneumatic - + pneumatic-tank - + ppickaxe - + prod - + psyche - + pulse - + pulse0 - + pulse100 - + pulse25 - + pulse50 - + pulse75 - + purple_can - + pwig - + quarrel - + r_feet - + r_hands - + r_head - + r_shoes - + r_suit - + rack_parts - + rad_suit - + radio - + rainbow - + razor - + rcd - + rcdammo - + rejuvbottle - + restock_unit - + rev_headballoon - + revballoon - + rig_helm - + rig_suit - + riot - + riotgun - + ro_suit - + rods - + rolling_pin - + roman_shield - + rubberducky - + s-ninja_hood - + s-ninja_mask - + s-ninja_suit - + s_helmet - + s_mask - + s_suit - + santa - + santahat - + saw3 - + scalpel - + scientology - + scrapbook - + scratch - + screwdriver - + screwdriver_blue - + screwdriver_brown - + screwdriver_cyan - + screwdriver_green - + screwdriver_purple - + screwdriver_yellow - + scythe0 - + sec-case - + sec_hardsuit - + sec_helm - + secsoft - + securitypack - + shard-glass - + sheet-card - + sheet-glass - + sheet-metal - + sheet-rglass - + shotgun - + shovel - + signaler - + silver_id - + sl_suit - + sodawater - + sord - + space-up - + space_helmet_syndicate - + space_mountain_wind - + space_suit_syndicate - + spaceclown_items - + spacemime_items - + spade - + spearglass0 - + spearglass1 - + speargun - + spickaxe - + spoon - + spraycan - + staff - + staffofchange - + staffofhealing - + stamp - + starkist - + stick - + stool - + straight_jacket - + suit-command - + suit-orange - + sunglasses - + swat_gl - + swat_hel - + swat_sh - + swat_suit - + sword0 - + swordblue - + swordchain - + swordgreen - + swordpurple - + swordred - + syndballoon - + syndicate-black - + syndicate-black-blue - + syndicate-black-green - + syndicate-black-red - + syndicate-green - + syndicate-green-dark - + syndicate-helm-black - + syndicate-helm-black-blue - + syndicate-helm-black-green - + syndicate-helm-black-red - + syndicate-helm-green - + syndicate-helm-green-dark - + syndie_hardsuit - + syndie_helm - + syringe_0 - + syringe_1 - + syringe_10 - + syringe_15 - + syringe_5 - + syringe_kit - + syringegun - + table_parts - + taser - + taser0 - + taser100 - + taser25 - + taser50 - + taser75 - + tdgreen - + tdhelm - + tdred - + template - + that - + thirteen_loko - + tile - + tonic - + toolbox_blue - + toolbox_red - + toolbox_syndi - + toolbox_yellow - + toxinbottle - + toysword0 - + toysword1 - + trashbag - + ty_necklace - + unathiknife - + upickaxe - + vhammer - + vhelmet - + vialblue - + vialgreen - + videocam - + violin - + vox-helmet-engineer - + vox-helmet-medical - + vox-helmet-normal - + vox-helmet-science - + vox-helmet-security - + vox-helmet-specops - + vox-pressure-engineer - + vox-pressure-medical - + vox-pressure-normal - + vox-pressure-science - + vox-pressure-security - + vox-pressure-specops - + w_shoes - + w_suit - + waiter - + warden - + wcoat - + welder - + welder1 - + welding - + welding-g - + weldingoff - + wiz_hardsuit - + wiz_helm - + wizhat - + wizrobe - + wizshoe - + wrap_paper - + wrench - + xenos_helm - + xenos_suit - + y_suit - + ygloves - + zippo - + zippoon ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\rpd.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\rpd.dmi - + rpd ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\swords_axes.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\swords_axes.dmi - + axe0 - + axe1 - - dualsaber0 - - dualsaber1 - - fireaxe0 - - fireaxe1 - - katana - - scythe0 - - unathiknife ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\vox_civvie.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\vox_civvie.dmi - + vox-pressure-security ---- Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\left\zz_old_items_lefthand.dmi -+++ Z:\Git\Space Station 13\Baystation12\icons\mob\in-hand\right\zz_old_items_lefthand.dmi - + DONGS - + Gibtonite ore - + altair_locket - + an_tank - + analyzer - + armor - + armor_reflec - + assembly - + atmos_gold_hardsuit - + atmos_gold_helm - + atmos_hardsuit - + atmos_helm - + atmos_suit - + atoxinbottle - + autoinjector - + axe0 - + axe1 - + b_mask - + b_shoes - + b_shoesold - + b_suit - + ba_suit - + backpack - + balloon - + balloon-empty - + banana_peel - + basketball - + baton - + beachball - + beaker - + bedsheet - + beer - + bgloves - + bible - + bike_horn - + bio_hood - + bio_orange - + bio_suit - + bl_shoes - + bl_shoesold - + bl_suit - + blackskirt - + blade - + blindfold - + blueprints - + bombvest - + brain2 - + brick - + briefcase - + broken_beer - + broom - + browncane - + brutepack - + bucket - + buckler - + bucklerOLD - + buildpipe - + burger - + butch - + butcher_knife - + c20r - + c_tube - + cakehat0 - + cakehat1 - + candy - + canister - + caphat - + capspacehelmet - + capspacesuit - + captainpack - + card-id - + cardborg - + cardborg_h - + carton - + caution - + ce_hardsuit - + ce_helm - + cell - + centcom - + centhat - + cespace_helmet - + cespace_suit - + chain - + chainmail - + chef - + chefhat - + chickensuit - + chips - + cigoff - + cigon - + cigpacket - + classic_baton - + claymore - + cleaner - + clipboard - + clown - + clown_hat - + clown_shoes - + clownpack - + coffee - + coil - + coil_blue - + coil_cyan - + coil_green - + coil_orange - + coil_pink - + coil_red - + coil_white - + coil_yellow - + cola - + contliquid - + contsolid - + contvapour - + coolant-c - + crossbow - + crossbow-solid - + crowbar - + crowbar_red - + cueball - + cuff_blue - + cuff_cyan - + cuff_green - + cuff_orange - + cuff_pink - + cuff_red - + cuff_white - + cuff_yellow - + cultblade - + culthood - + cultpack - + cultrobes - + cutlass0 - + cutlass1 - + cutters - + cutters_yellow - + daederic - + deagleg - + death_commando_mask - + death_commando_suit - + deathnettle - + det - + det_hat - + det_suit - + dg_suit - + dnainjector - + donut1 - + donut2 - + dpickaxe - + dr_gibb - + dropper - + dualsaber0 - + dualsaber1 - + dualsaberblue1 - + dualsabergreen1 - + dualsaberpurple1 - + dualsaberrainbow1 - + dualsaberred1 - + earmuffs - + egg - + egg1 - + egg2 - + egg3 - + egg4 - + egg5 - + electronic - + electropack - + emergency - + emergency_double - + emergency_engi - + emp - + energy_drink - + energykill - + energykill0 - + energykill100 - + energykill25 - + energykill50 - + energykill75 - + energystun - + energystun0 - + energystun100 - + energystun25 - + energystun50 - + energystun75 - + eng_hardsuit - + eng_helm - + engi_suit - + engiepack - + engspace_helmet - + engspace_suit - + eshield0 - + eshield1 - + faggot - + fire_extinguisher - + fire_suit - + fireaxe0 - + fireaxe1 - + firefighter - + firstaid - + firstaid-advanced - + firstaid-ointment - + firstaid-toxin - + flamethrower_0 - + flamethrower_1 - + flare - + flashlight - + foamcrossbow - + focus - + fr_jacket - + g_suit - + galoshes - + gas_alt - + gas_mask - + gift - + giftbag - + glasses - + gold_id - + gpickaxe - + greatcoat - + greenbandana - + gun - + gy_suit - + handcuff - + harpoon - + hatchet - + headset - + healthanalyzer - + helm-command - + helm-orange - + helmet - + hfrequency0 - + hfrequency1 - + hoe - + holidaypriest - + ice_tea_can - + imperium_monk - + implantcase - + ithaqua - + jackboots - + jackhammer - + janitor - + jensencoat - + jensensuit - + jetpack - + jetpack-black - + jetpack-void - + johnny - + johnny_coat - + judge - + katana - + kilt - + kineticgun - + kingyellow - + knife - + kobskull - + koran - + l6closedmag - + l6closednomag - + l6openmag - + l6opennomag - + labcoat - + lamp - + lampgreen - + laser - + latexballon - + lawyer_black - + lawyer_blue - + lawyer_red - + lb_suit - + lemon-lime - + lgloves - + lipstick - + lipstickopen - + m_mask - + magboots - + medibottle - + medical_hardsuit - + medical_helm - + medicalpack - + melted - + miniFE - + mining_hardsuit - + mining_helm - + mop - + mousetrap - + multitool - + muzzle - + nazi1 - + necronomicon - + nettle - + newspaper - + nothing - + nucgun - + nucgun0 - + nucgun100 - + nucgun25 - + nucgun50 - + nucgun75 - + nullrod - + nun - + nursesuit - + o_shoes - + o_shoes1 - + o_suit - + ointment - + overalls - + owl - + owl_mask - + oxygen - + oxygen-c - + oxygen_f - + oxygen_fr - + p_suit - + paintcan - + paper - + pen - + pickaxe - + pie - + pill - + pizzabox1 - + plantbgone - + plasma - + plasma-c - + plasticbag - + plasticx - + pneumatic - + pneumatic-tank - + ppickaxe - + prod - + psyche - + pulse - + pulse0 - + pulse100 - + pulse25 - + pulse50 - + pulse75 - + purple_can - + pwig - + quarrel - + r_feet - + r_hands - + r_head - + r_shoes - + r_suit - + rack_parts - + rad_suit - + radio - + rainbow - + rcd - + rcdammo - + rejuvbottle - + rev_headballoon - + revballoon - + rig_helm - + rig_suit - + riot - + riotgun - + ro_suit - + rods - + rolling_pin - + roman_shield - + rpd - + rubberducky - + s-ninja_mask - + s-ninja_suit - + s_helmet - + s_mask - + s_suit - + santa - + santahat - + saw3 - + scalpel - + scientology - + scrapbook - + scratch - + screwdriver - + screwdriver_blue - + screwdriver_brown - + screwdriver_cyan - + screwdriver_green - + screwdriver_purple - + screwdriver_yellow - + scythe0 - + sec-case - + sec_hardsuit - + sec_helm - + secsoft - + securitypack - + shard-glass - + sheet-card - + sheet-glass - + sheet-metal - + sheet-rglass - + shotgun - + shovel - + signaler - + silver_id - + sl_suit - + sodawater - + sord - + space-up - + space_helmet_syndicate - + space_mountain_wind - + space_suit_syndicate - + spade - + spearglass0 - + spearglass1 - + speargun - + spickaxe - + spoon - + spraycan - + staff - + staffofchange - + stamp - + starkist - + stick - + stool - + straight_jacket - + suit-command - + suit-orange - + sunflower - + sunglasses - + swat_gl - + swat_hel - + swat_sh - + swat_suit - + sword0 - + swordblue - + swordchain - + swordgreen - + swordpurple - + swordrainbow - + swordred - + syndballoon - + syndicate-black - + syndicate-black-blue - + syndicate-black-green - + syndicate-black-red - + syndicate-green - + syndicate-green-dark - + syndicate-helm-black - + syndicate-helm-black-blue - + syndicate-helm-black-green - + syndicate-helm-black-red - + syndicate-helm-green - + syndicate-helm-green-dark - + syndie_hardsuit - + syndie_helm - + syringe_0 - + syringe_1 - + syringe_10 - + syringe_15 - + syringe_5 - + syringe_kit - + syringegun - + table_parts - + taser - + taser0 - + taser100 - + taser25 - + taser50 - + taser75 - + tdgreen - + tdhelm - + tdred - + template - + that - + thirteen_loko - + tile - + tonic - + toolbox_blue - + toolbox_red - + toolbox_syndi - + toolbox_yellow - + toxinbottle - + toysword0 - + toysword1 - + trashbag - + ty_necklace - + unathiknife - + upickaxe - + vhammer - + vhelmet - + vialblue - + vialgreen - + violin - + vox-helmet-engineer - + vox-helmet-medical - + vox-helmet-normal - + vox-helmet-science - + vox-helmet-security - + vox-helmet-specops - + vox-pressure-engineer - + vox-pressure-medical - + vox-pressure-normal - + vox-pressure-science - + vox-pressure-security - + vox-pressure-specops - + w_shoes - + w_suit - + waiter - + warden - + wcoat - + welder - + welder1 - + welding - + welding-g - + weldingoff - + wiz_hardsuit - + wiz_helm - + wizhat - + wizrobe - + wizshoe - + wrap_paper - + wrench - + xenos_helm - + xenos_suit - + y_suit - + ygloves - + zippo - + zippoon \ No newline at end of file diff --git a/icons/mob/in-hand/left/ambassdor_left.dmi b/icons/mob/in-hand/left/ambassdor_left.dmi deleted file mode 100644 index c22038170dd..00000000000 Binary files a/icons/mob/in-hand/left/ambassdor_left.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/cable_stuff.dmi b/icons/mob/in-hand/left/cable_stuff.dmi deleted file mode 100644 index 9740e45aef6..00000000000 Binary files a/icons/mob/in-hand/left/cable_stuff.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/clownwiz.dmi b/icons/mob/in-hand/left/clownwiz.dmi deleted file mode 100644 index 7bfb9c487d0..00000000000 Binary files a/icons/mob/in-hand/left/clownwiz.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/flags_left.dmi b/icons/mob/in-hand/left/flags_left.dmi deleted file mode 100644 index 5e52befdc7b..00000000000 Binary files a/icons/mob/in-hand/left/flags_left.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/guns.dmi b/icons/mob/in-hand/left/guns.dmi deleted file mode 100644 index 59f5941fbd6..00000000000 Binary files a/icons/mob/in-hand/left/guns.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/paradise_items_lefthand.dmi b/icons/mob/in-hand/left/paradise_items_lefthand.dmi deleted file mode 100644 index fd773f32b77..00000000000 Binary files a/icons/mob/in-hand/left/paradise_items_lefthand.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/plasmen.dmi b/icons/mob/in-hand/left/plasmen.dmi deleted file mode 100644 index 865f9c8bb69..00000000000 Binary files a/icons/mob/in-hand/left/plasmen.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/rpd.dmi b/icons/mob/in-hand/left/rpd.dmi deleted file mode 100644 index 52a669782f7..00000000000 Binary files a/icons/mob/in-hand/left/rpd.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/sheets.dmi b/icons/mob/in-hand/left/sheets.dmi deleted file mode 100644 index 2438bcecfbb..00000000000 Binary files a/icons/mob/in-hand/left/sheets.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/swords_axes.dmi b/icons/mob/in-hand/left/swords_axes.dmi deleted file mode 100644 index 87e689a4129..00000000000 Binary files a/icons/mob/in-hand/left/swords_axes.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/vox_civvie.dmi b/icons/mob/in-hand/left/vox_civvie.dmi deleted file mode 100644 index 92bd09cb949..00000000000 Binary files a/icons/mob/in-hand/left/vox_civvie.dmi and /dev/null differ diff --git a/icons/mob/in-hand/left/zz_old_items_lefthand.dmi b/icons/mob/in-hand/left/zz_old_items_lefthand.dmi deleted file mode 100644 index e6e6cf33f76..00000000000 Binary files a/icons/mob/in-hand/left/zz_old_items_lefthand.dmi and /dev/null differ diff --git a/icons/mob/in-hand/medkits.dmi b/icons/mob/in-hand/medkits.dmi deleted file mode 100644 index 548bb79cf42..00000000000 Binary files a/icons/mob/in-hand/medkits.dmi and /dev/null differ diff --git a/icons/mob/in-hand/paiheld.dmi b/icons/mob/in-hand/paiheld.dmi deleted file mode 100644 index fe50e96da35..00000000000 Binary files a/icons/mob/in-hand/paiheld.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/ambassador_right.dmi b/icons/mob/in-hand/right/ambassador_right.dmi deleted file mode 100644 index c22038170dd..00000000000 Binary files a/icons/mob/in-hand/right/ambassador_right.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/cable_stuff.dmi b/icons/mob/in-hand/right/cable_stuff.dmi deleted file mode 100644 index 61e7d8d99f1..00000000000 Binary files a/icons/mob/in-hand/right/cable_stuff.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/clownwiz.dmi b/icons/mob/in-hand/right/clownwiz.dmi deleted file mode 100644 index f9dcdf15497..00000000000 Binary files a/icons/mob/in-hand/right/clownwiz.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/flags_right.dmi b/icons/mob/in-hand/right/flags_right.dmi deleted file mode 100644 index 5b99e9aa0a5..00000000000 Binary files a/icons/mob/in-hand/right/flags_right.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/guns.dmi b/icons/mob/in-hand/right/guns.dmi deleted file mode 100644 index 53867b4e48a..00000000000 Binary files a/icons/mob/in-hand/right/guns.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/paradise_items_righthand.dmi b/icons/mob/in-hand/right/paradise_items_righthand.dmi deleted file mode 100644 index b02f6804054..00000000000 Binary files a/icons/mob/in-hand/right/paradise_items_righthand.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/plasmen.dmi b/icons/mob/in-hand/right/plasmen.dmi deleted file mode 100644 index b24d95d5cf4..00000000000 Binary files a/icons/mob/in-hand/right/plasmen.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/sheets.dmi b/icons/mob/in-hand/right/sheets.dmi deleted file mode 100644 index bf5955d7f8b..00000000000 Binary files a/icons/mob/in-hand/right/sheets.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/swords_axes.dmi b/icons/mob/in-hand/right/swords_axes.dmi deleted file mode 100644 index dcdf81c1f3e..00000000000 Binary files a/icons/mob/in-hand/right/swords_axes.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/vox_civvie.dmi b/icons/mob/in-hand/right/vox_civvie.dmi deleted file mode 100644 index efbe096f3be..00000000000 Binary files a/icons/mob/in-hand/right/vox_civvie.dmi and /dev/null differ diff --git a/icons/mob/in-hand/right/zz_old_items_righthand.dmi b/icons/mob/in-hand/right/zz_old_items_righthand.dmi deleted file mode 100644 index 30b01b63d4a..00000000000 Binary files a/icons/mob/in-hand/right/zz_old_items_righthand.dmi and /dev/null differ diff --git a/icons/mob/in-hand/spells.dmi b/icons/mob/in-hand/spells.dmi deleted file mode 100644 index dae92759cc6..00000000000 Binary files a/icons/mob/in-hand/spells.dmi and /dev/null differ diff --git a/icons/mob/in-hand/ss13_makeinhands.py b/icons/mob/in-hand/ss13_makeinhands.py deleted file mode 100644 index 84d62088588..00000000000 --- a/icons/mob/in-hand/ss13_makeinhands.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python -''' -Run within icons/mob/in-hand. - -Usage: - $ cd icons/mob/in-hands - $ python ss13_makeinhands.py - -ss13_makeinhands.py - Generates a large DMI from several smaller DMIs. - Specifically used for making icons/mob/items_(left|right)hand.dmi - -Copyright 2013 Rob "N3X15" Nelson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -''' -import os, sys, logging - -ToBuild = { -# ' file to build': 'directory to pull from/', - '../items_lefthand.dmi': 'left/', - '../items_righthand.dmi': 'right/' -} - -# Tell Python where to find BYONDTools. -# Assuming we're in icons/mob/in-hand -sys.path.append('../../../tools/BYONDTools') # For byond -sys.path.append('../../../tools/BYONDTools/scripts') # For dmi - -from byond.DMI import DMI -from dmi import compare_all - -def buildDMI(directory, output): - dmi = DMI(output) - logging.info('Creating {0}...'.format(output)) - for root, _, files in os.walk(directory): - for filename in files: - if filename.endswith('.dmi') and not filename.endswith('.new.dmi'): - filepath = os.path.join(root, filename) - logging.info('Adding {0}...'.format(filename, output)) - subdmi = DMI(filepath) - subdmi.loadAll() - if subdmi.icon_height != 32 or subdmi.icon_width != 32: - logging.warn('Skipping {0} - Invalid icon size.'.format(filepath)) - changes = 0 - for state_name in subdmi.states: - if state_name in dmi.states: - logging.warn('Skipping state {0}:{1} - State exists.'.format(filepath, subdmi.states[state_name].displayName())) - continue - dmi.states[state_name] = subdmi.states[state_name] - changes += 1 - logging.info('Added {0} states.'.format(changes)) - # save - logging.info('Saving {0} states to {1}...'.format(len(dmi.states), output)) - dmi.save(output) - -if __name__ == '__main__': - logging.basicConfig( - format='%(asctime)s [%(levelname)-8s]: %(message)s', - datefmt='%m/%d/%Y %I:%M:%S %p', - level=logging.INFO # , - # filename='logs/main.log', - # filemode='w' - ) - # Cheating, but useful for checking for unsync'd stuff - compare_all('left/', 'right/', 'in-hand_sync_report.txt', None, newfile_theirs=False, newfile_mine=False, check_changed=False) - for output, input_dir in ToBuild.items(): - buildDMI(input_dir, output) diff --git a/icons/mob/in-hand/staff.dmi b/icons/mob/in-hand/staff.dmi deleted file mode 100644 index a3e70edfb04..00000000000 Binary files a/icons/mob/in-hand/staff.dmi and /dev/null differ diff --git a/icons/mob/in-hand/swords.dmi b/icons/mob/in-hand/swords.dmi deleted file mode 100644 index 041632b0d06..00000000000 Binary files a/icons/mob/in-hand/swords.dmi and /dev/null differ diff --git a/icons/mob/in-hand/tools.dmi b/icons/mob/in-hand/tools.dmi deleted file mode 100644 index 81f3aa57f46..00000000000 Binary files a/icons/mob/in-hand/tools.dmi and /dev/null differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi new file mode 100644 index 00000000000..6240b158977 Binary files /dev/null and b/icons/mob/inhands/clothing_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi new file mode 100644 index 00000000000..e47cb6b7e29 Binary files /dev/null and b/icons/mob/inhands/clothing_righthand.dmi differ diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi new file mode 100644 index 00000000000..f3209d8c047 Binary files /dev/null and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi new file mode 100644 index 00000000000..25ac8d3c072 Binary files /dev/null and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi new file mode 100644 index 00000000000..2e0181bab59 Binary files /dev/null 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 new file mode 100644 index 00000000000..aa1bb8522af Binary files /dev/null and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi deleted file mode 100644 index 20568f14f62..00000000000 Binary files a/icons/mob/items_lefthand.dmi and /dev/null differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi deleted file mode 100644 index ce11d1d1b02..00000000000 Binary files a/icons/mob/items_righthand.dmi and /dev/null differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index bdc4de8da2b..7aa0bd96a1b 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 7d3c63af612..b74fd8ffb13 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/vox.dmi b/icons/mob/vox.dmi index 7fb96c61826..0cf31d449f2 100644 Binary files a/icons/mob/vox.dmi and b/icons/mob/vox.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 8a7c4b5d8bb..5f1b810bff1 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 42b7407d87f..8db68ca02cf 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index bcaca6e730c..3469a6e7e92 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index b4c71af21d6..1d696cf70e7 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/gun_temperature.dmi b/icons/obj/gun_temperature.dmi new file mode 100644 index 00000000000..56ab9b6b5fd Binary files /dev/null and b/icons/obj/gun_temperature.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 819ce7883e4..09ae246998e 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index ec57d8bb6df..be1a0a4c875 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 4cf08668bee..48402cf070a 100644 Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 15427f2a183..430f54c44d9 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/paradise.dme b/paradise.dme index 4493f3debb7..46e066f4f22 100644 --- a/paradise.dme +++ b/paradise.dme @@ -953,6 +953,7 @@ #include "code\modules\alarm\alarm.dm" #include "code\modules\alarm\alarm_handler.dm" #include "code\modules\alarm\atmosphere_alarm.dm" +#include "code\modules\alarm\burglar_alarm.dm" #include "code\modules\alarm\camera_alarm.dm" #include "code\modules\alarm\fire_alarm.dm" #include "code\modules\alarm\motion_alarm.dm" @@ -1279,6 +1280,7 @@ #include "code\modules\mob\dead\observer\observer.dm" #include "code\modules\mob\dead\observer\say.dm" #include "code\modules\mob\dead\observer\spells.dm" +#include "code\modules\mob\living\autohiss.dm" #include "code\modules\mob\living\bloodcrawl.dm" #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\default_language.dm" @@ -1335,6 +1337,7 @@ #include "code\modules\mob\living\carbon\brain\posibrain.dm" #include "code\modules\mob\living\carbon\brain\say.dm" #include "code\modules\mob\living\carbon\human\appearance.dm" +#include "code\modules\mob\living\carbon\human\body_accessories.dm" #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\emote.dm" #include "code\modules\mob\living\carbon\human\examine.dm" @@ -1424,6 +1427,7 @@ #include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_items.dm" #include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm" +#include "code\modules\mob\living\silicon\robot\drone\drone_say.dm" #include "code\modules\mob\living\simple_animal\bees.dm" #include "code\modules\mob\living\simple_animal\borer.dm" #include "code\modules\mob\living\simple_animal\constructs.dm" @@ -1471,6 +1475,7 @@ #include "code\modules\mob\living\simple_animal\hostile\tree.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\drone.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\pet.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\undead.dm" #include "code\modules\mob\living\simple_animal\revenant\revenant.dm" diff --git a/sound/arcade/Boom.ogg b/sound/arcade/Boom.ogg new file mode 100644 index 00000000000..8adfb2bc430 Binary files /dev/null and b/sound/arcade/Boom.ogg differ diff --git a/sound/arcade/Heal.ogg b/sound/arcade/Heal.ogg new file mode 100644 index 00000000000..26f47195c65 Binary files /dev/null and b/sound/arcade/Heal.ogg differ diff --git a/sound/arcade/Hit.ogg b/sound/arcade/Hit.ogg new file mode 100644 index 00000000000..0bf18679a65 Binary files /dev/null and b/sound/arcade/Hit.ogg differ diff --git a/sound/arcade/Lose.ogg b/sound/arcade/Lose.ogg new file mode 100644 index 00000000000..dd2145737cd Binary files /dev/null and b/sound/arcade/Lose.ogg differ diff --git a/sound/arcade/Mana.ogg b/sound/arcade/Mana.ogg new file mode 100644 index 00000000000..7f26ae53fe7 Binary files /dev/null and b/sound/arcade/Mana.ogg differ diff --git a/sound/arcade/Steal.ogg b/sound/arcade/Steal.ogg new file mode 100644 index 00000000000..9c7b3be2a5a Binary files /dev/null and b/sound/arcade/Steal.ogg differ diff --git a/sound/arcade/Win.ogg b/sound/arcade/Win.ogg new file mode 100644 index 00000000000..27fb9725f20 Binary files /dev/null and b/sound/arcade/Win.ogg differ