├── html ├── assets │ ├── img │ │ ├── favicon.png │ │ ├── hideout.png │ │ ├── marker.png │ │ ├── buildarea.jpg │ │ ├── camp_large.jpg │ │ ├── labyrinth.jpg │ │ ├── poi_road.png │ │ ├── scrapcity.jpg │ │ ├── warehouse2.jpg │ │ ├── warehouse4.pdn │ │ ├── warehouse4.png │ │ ├── crashed_ship.jpg │ │ ├── lake_generic.jpg │ │ ├── packing_veg.jpg │ │ ├── silodistrict.jpg │ │ ├── tiles │ │ │ ├── 10105.jpg │ │ │ ├── 10106.jpg │ │ │ ├── 10107.jpg │ │ │ ├── 10108.jpg │ │ │ ├── 111502.jpg │ │ │ ├── 11501.jpg │ │ │ ├── 11502.jpg │ │ │ ├── 11503.jpg │ │ │ ├── 11504.jpg │ │ │ ├── 11505.jpg │ │ │ ├── 11506.jpg │ │ │ ├── 11507.jpg │ │ │ ├── 11601.jpg │ │ │ ├── 11701.jpg │ │ │ ├── 11702.jpg │ │ │ ├── 11703.jpg │ │ │ ├── 11704.jpg │ │ │ ├── 11801.jpg │ │ │ ├── 11802.jpg │ │ │ ├── 11803.jpg │ │ │ ├── 11804.jpg │ │ │ ├── 11805.jpg │ │ │ ├── 11806.jpg │ │ │ ├── 11807.jpg │ │ │ ├── 11808.jpg │ │ │ ├── 11809.jpg │ │ │ ├── 11901.jpg │ │ │ ├── 11902.jpg │ │ │ ├── 11903.jpg │ │ │ ├── 20101.jpg │ │ │ ├── 20102.jpg │ │ │ ├── 20103.jpg │ │ │ ├── 20104.jpg │ │ │ ├── 20105.jpg │ │ │ ├── 20106.jpg │ │ │ ├── 20107.jpg │ │ │ ├── 20301.jpg │ │ │ ├── 20302.jpg │ │ │ ├── 20303.jpg │ │ │ ├── 20304.jpg │ │ │ ├── 20305.jpg │ │ │ ├── 20306.jpg │ │ │ ├── 20307.jpg │ │ │ ├── 30101.jpg │ │ │ ├── 30102.jpg │ │ │ ├── 40101.jpg │ │ │ ├── 40201.jpg │ │ │ ├── 40202.jpg │ │ │ ├── 40203.jpg │ │ │ ├── 50201.jpg │ │ │ ├── 50301.jpg │ │ │ ├── 50402.jpg │ │ │ ├── 60101.jpg │ │ │ ├── 60102.jpg │ │ │ ├── 60103.jpg │ │ │ ├── 60201.jpg │ │ │ ├── 60301.jpg │ │ │ ├── 60302.jpg │ │ │ ├── 60303.jpg │ │ │ ├── 60304.jpg │ │ │ ├── 80103.jpg │ │ │ ├── 1000001.jpg │ │ │ ├── 1000002.jpg │ │ │ ├── 1000003.jpg │ │ │ ├── 1000004.jpg │ │ │ ├── 1000005.jpg │ │ │ ├── 1000006.jpg │ │ │ ├── 1000007.jpg │ │ │ ├── 1000008.jpg │ │ │ ├── 1000009.jpg │ │ │ ├── 1000010.jpg │ │ │ ├── 1000011.jpg │ │ │ ├── 1000012.jpg │ │ │ ├── 1000013.jpg │ │ │ ├── 1000014.jpg │ │ │ ├── 1000015.jpg │ │ │ ├── 1000016.jpg │ │ │ ├── 1000017.jpg │ │ │ ├── 1000018.jpg │ │ │ ├── 1000019.jpg │ │ │ ├── 1000020.jpg │ │ │ ├── 1000021.jpg │ │ │ ├── 1000022.jpg │ │ │ ├── 1000023.jpg │ │ │ ├── 1000024.jpg │ │ │ ├── 1000025.jpg │ │ │ ├── 1000026.jpg │ │ │ ├── 1000027.jpg │ │ │ ├── 1000028.jpg │ │ │ ├── 1000029.jpg │ │ │ ├── 1000101.jpg │ │ │ ├── 1000102.jpg │ │ │ ├── 1000103.jpg │ │ │ ├── 1000104.jpg │ │ │ ├── 1000105.jpg │ │ │ ├── 1000106.jpg │ │ │ ├── 1000107.jpg │ │ │ ├── 1000201.jpg │ │ │ ├── 1000202.jpg │ │ │ ├── 1000301.jpg │ │ │ ├── 1000501.jpg │ │ │ ├── 1000502.jpg │ │ │ ├── 1000503.jpg │ │ │ ├── 1000504.jpg │ │ │ ├── 1000505.jpg │ │ │ ├── 1000506.jpg │ │ │ ├── 1000507.jpg │ │ │ ├── 1000508.jpg │ │ │ ├── 1000509.jpg │ │ │ ├── 1000601.jpg │ │ │ ├── 1000602.jpg │ │ │ ├── 1000701.jpg │ │ │ ├── 1000901.jpg │ │ │ ├── 1000902.jpg │ │ │ ├── 1001001.jpg │ │ │ ├── 1001002.jpg │ │ │ ├── 1001101.jpg │ │ │ ├── 1001301.jpg │ │ │ ├── 1001401.jpg │ │ │ ├── 1001501.jpg │ │ │ ├── 1001701.jpg │ │ │ ├── 1001702.jpg │ │ │ ├── 1002101.jpg │ │ │ ├── 1002102.jpg │ │ │ ├── 1002103.jpg │ │ │ ├── 1002201.jpg │ │ │ ├── 1002301.jpg │ │ │ ├── 1002501.jpg │ │ │ ├── 1002502.jpg │ │ │ ├── 1002503.jpg │ │ │ ├── 1002601.jpg │ │ │ ├── 1002602.jpg │ │ │ ├── 1002701.jpg │ │ │ ├── 1002901.jpg │ │ │ ├── 1003001.jpg │ │ │ ├── 1003101.jpg │ │ │ ├── 1003501.jpg │ │ │ ├── 1003701.jpg │ │ │ ├── 1004101.jpg │ │ │ ├── 1004102.jpg │ │ │ ├── 1004201.jpg │ │ │ ├── 1004301.jpg │ │ │ ├── 1004701.jpg │ │ │ ├── 1005301.jpg │ │ │ ├── 1005501.jpg │ │ │ ├── 1005701.jpg │ │ │ ├── 1005801.jpg │ │ │ ├── 1005901.jpg │ │ │ ├── 1006101.jpg │ │ │ ├── 1006201.jpg │ │ │ ├── 1006301.jpg │ │ │ ├── 1025601.jpg │ │ │ ├── 1076801.jpg │ │ │ ├── 1076802.jpg │ │ │ ├── 1076803.jpg │ │ │ ├── 1076804.jpg │ │ │ ├── 1076805.jpg │ │ │ ├── 1076806.jpg │ │ │ ├── 1076807.jpg │ │ │ ├── 1076808.jpg │ │ │ ├── 1076809.jpg │ │ │ ├── 1076810.jpg │ │ │ ├── 1076811.jpg │ │ │ ├── 1076812.jpg │ │ │ ├── 1076813.jpg │ │ │ ├── 1076814.jpg │ │ │ ├── 1076814.pdn │ │ │ ├── 1076901.jpg │ │ │ ├── 1077201.jpg │ │ │ ├── 1077301.jpg │ │ │ ├── 1078401.jpg │ │ │ ├── 1078801.jpg │ │ │ ├── 1078901.jpg │ │ │ ├── 1083201.jpg │ │ │ ├── 1083301.jpg │ │ │ ├── 1083701.jpg │ │ │ ├── 1084801.jpg │ │ │ ├── 1084901.jpg │ │ │ ├── 1128001.jpg │ │ │ ├── 1128002.jpg │ │ │ ├── 1128003.jpg │ │ │ ├── 1128004.jpg │ │ │ ├── 1128005.jpg │ │ │ ├── 1128006.jpg │ │ │ ├── 1128007.jpg │ │ │ ├── 1128008.jpg │ │ │ ├── 1128009.jpg │ │ │ ├── 1128010.jpg │ │ │ ├── 1128011.jpg │ │ │ ├── 1128012.jpg │ │ │ ├── 1128013.jpg │ │ │ ├── 1128014.jpg │ │ │ ├── 1128015.jpg │ │ │ ├── 1128016.jpg │ │ │ ├── 1128101.jpg │ │ │ ├── 1128401.jpg │ │ │ ├── 1128402.jpg │ │ │ ├── 1128501.jpg │ │ │ ├── 1130001.jpg │ │ │ ├── 1130101.jpg │ │ │ ├── 1134901.jpg │ │ │ ├── 1179201.jpg │ │ │ ├── 1384001.jpg │ │ │ ├── 1384002.jpg │ │ │ ├── 2000101.jpg │ │ │ ├── 2000102.jpg │ │ │ ├── 2000103.jpg │ │ │ ├── 2000104.jpg │ │ │ ├── 2000105.jpg │ │ │ ├── 2000301.jpg │ │ │ ├── 2000302.jpg │ │ │ ├── 2000303.jpg │ │ │ ├── 2000304.jpg │ │ │ ├── 2000305.jpg │ │ │ ├── 2000501.jpg │ │ │ ├── 2000701.jpg │ │ │ ├── 2001501.jpg │ │ │ ├── 2001502.jpg │ │ │ ├── 2001503.jpg │ │ │ ├── 3000101.jpg │ │ │ ├── 3000301.jpg │ │ │ ├── 3000302.jpg │ │ │ ├── 3000501.jpg │ │ │ ├── 3000701.jpg │ │ │ ├── 3001501.jpg │ │ │ ├── 3001502.jpg │ │ │ ├── 3001503.jpg │ │ │ ├── 3001504.jpg │ │ │ ├── 3001505.jpg │ │ │ ├── 3001506.jpg │ │ │ ├── 4000101.jpg │ │ │ ├── 4000301.jpg │ │ │ ├── 4000501.jpg │ │ │ ├── 4000701.jpg │ │ │ ├── 4001501.jpg │ │ │ ├── 4001502.jpg │ │ │ ├── 4001503.jpg │ │ │ ├── 4001504.jpg │ │ │ ├── 4001505.jpg │ │ │ ├── 4001506.jpg │ │ │ ├── 4001507.jpg │ │ │ ├── 5000101.jpg │ │ │ ├── 5000102.jpg │ │ │ ├── 5000103.jpg │ │ │ ├── 5000301.jpg │ │ │ ├── 5000302.jpg │ │ │ ├── 5000303.jpg │ │ │ ├── 5000501.jpg │ │ │ ├── 5000701.jpg │ │ │ ├── 5000702.jpg │ │ │ ├── 5000703.jpg │ │ │ ├── 5001501.jpg │ │ │ ├── 5001502.jpg │ │ │ ├── 6000101.jpg │ │ │ ├── 6000102.jpg │ │ │ ├── 6000103.jpg │ │ │ ├── 6000104.jpg │ │ │ ├── 6000105.jpg │ │ │ ├── 6000301.jpg │ │ │ ├── 6000302.jpg │ │ │ ├── 6000303.jpg │ │ │ ├── 6000304.jpg │ │ │ ├── 6000305.jpg │ │ │ ├── 6000501.jpg │ │ │ ├── 6000701.jpg │ │ │ ├── 6001501.jpg │ │ │ ├── 6001502.jpg │ │ │ ├── 8000101.jpg │ │ │ ├── 8000102.jpg │ │ │ ├── 8000103.jpg │ │ │ ├── 8000104.jpg │ │ │ ├── 8000105.jpg │ │ │ ├── 8000106.jpg │ │ │ ├── 8000107.jpg │ │ │ ├── 8000108.jpg │ │ │ ├── 8000109.jpg │ │ │ ├── 8000110.jpg │ │ │ ├── 8000111.jpg │ │ │ ├── 8000301.jpg │ │ │ ├── 8000302.jpg │ │ │ ├── 8000303.jpg │ │ │ ├── 8000304.jpg │ │ │ ├── 8000305.jpg │ │ │ ├── 8000306.jpg │ │ │ ├── 8000307.jpg │ │ │ ├── 8000308.jpg │ │ │ ├── 8000309.jpg │ │ │ ├── 8000310.jpg │ │ │ ├── 8000311.jpg │ │ │ ├── 8000312.jpg │ │ │ ├── 8000313.jpg │ │ │ ├── 8000314.jpg │ │ │ ├── 8000501.jpg │ │ │ ├── 8000701.jpg │ │ │ ├── 8000702.jpg │ │ │ ├── 8000703.jpg │ │ │ ├── 8000704.jpg │ │ │ ├── 8000705.jpg │ │ │ ├── 8000706.jpg │ │ │ └── 11504 - Copy.jpg │ │ ├── meadow_generic.jpg │ │ ├── packing_fruit.jpg │ │ ├── ruin_medium_3.jpg │ │ ├── ruin_medium_4.jpg │ │ ├── capsule_scrapyard.jpg │ │ ├── chemlake_medium_1.jpg │ │ ├── chemlake_medium_2.jpg │ │ ├── chemlake_medium_3.jpg │ │ ├── mechanic_station.png │ │ ├── start_crashsite1.jpg │ │ ├── start_crashsite2.jpg │ │ ├── start_crashsite3.jpg │ │ ├── underwater_med_3.jpg │ │ ├── underwater_med_4.jpg │ │ ├── warehouse3_large.pdn │ │ ├── warehouse3_large.png │ │ ├── warehouse_2_large.PNG │ │ ├── forest_ruin_medium_1.jpg │ │ ├── forest_ruin_medium_2.jpg │ │ ├── start_crashsite_-36_-40.jpg │ │ ├── start_crashsite_-36_-41.jpg │ │ ├── start_crashsite_-37_-39.jpg │ │ ├── start_crashsite_-37_-40.jpg │ │ └── burntforest_farmbot_scrapyard.jpg │ ├── json │ │ └── cells.json │ ├── style.css │ └── js │ │ ├── cellparser.js │ │ └── sm_overview_map.js ├── package.json ├── index.js ├── index.html ├── libs │ └── leaflet-hash.js └── package-lock.json ├── .gitignore ├── tile_database.lua ├── Readme.md ├── missingimages.js └── SurvivalGame.lua /html/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/favicon.png -------------------------------------------------------------------------------- /html/assets/img/hideout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/hideout.png -------------------------------------------------------------------------------- /html/assets/img/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/marker.png -------------------------------------------------------------------------------- /html/assets/img/buildarea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/buildarea.jpg -------------------------------------------------------------------------------- /html/assets/img/camp_large.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/camp_large.jpg -------------------------------------------------------------------------------- /html/assets/img/labyrinth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/labyrinth.jpg -------------------------------------------------------------------------------- /html/assets/img/poi_road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/poi_road.png -------------------------------------------------------------------------------- /html/assets/img/scrapcity.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/scrapcity.jpg -------------------------------------------------------------------------------- /html/assets/img/warehouse2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/warehouse2.jpg -------------------------------------------------------------------------------- /html/assets/img/warehouse4.pdn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/warehouse4.pdn -------------------------------------------------------------------------------- /html/assets/img/warehouse4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/warehouse4.png -------------------------------------------------------------------------------- /html/assets/img/crashed_ship.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/crashed_ship.jpg -------------------------------------------------------------------------------- /html/assets/img/lake_generic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/lake_generic.jpg -------------------------------------------------------------------------------- /html/assets/img/packing_veg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/packing_veg.jpg -------------------------------------------------------------------------------- /html/assets/img/silodistrict.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/silodistrict.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/10105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/10105.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/10106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/10106.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/10107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/10107.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/10108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/10108.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/111502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/111502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11503.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11503.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11504.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11504.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11505.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11505.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11506.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11506.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11507.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11507.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11601.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11601.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11702.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11702.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11703.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11703.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11704.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11704.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11801.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11801.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11802.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11802.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11803.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11803.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11804.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11804.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11805.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11805.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11806.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11806.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11807.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11807.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11808.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11808.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11809.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11809.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11902.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11902.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11903.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11903.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20104.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20105.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20106.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20107.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20302.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20303.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20304.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20305.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20306.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20306.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/20307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/20307.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/30101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/30101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/30102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/30102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/40101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/40101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/40201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/40201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/40202.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/40202.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/40203.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/40203.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/50201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/50201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/50301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/50301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/50402.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/50402.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60302.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60303.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/60304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/60304.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/80103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/80103.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | html/node_modules 2 | html/img/* 3 | scale.txt 4 | testmakemap.ahk 5 | g_celldata.json 6 | g_celldata0.json 7 | -------------------------------------------------------------------------------- /html/assets/img/meadow_generic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/meadow_generic.jpg -------------------------------------------------------------------------------- /html/assets/img/packing_fruit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/packing_fruit.jpg -------------------------------------------------------------------------------- /html/assets/img/ruin_medium_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/ruin_medium_3.jpg -------------------------------------------------------------------------------- /html/assets/img/ruin_medium_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/ruin_medium_4.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000001.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000002.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000003.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000004.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000005.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000006.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000007.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000008.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000009.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000010.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000011.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000011.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000012.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000013.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000014.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000015.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000016.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000017.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000018.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000018.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000019.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000019.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000020.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000020.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000021.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000021.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000022.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000022.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000023.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000023.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000024.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000025.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000025.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000026.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000026.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000027.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000027.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000028.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000028.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000029.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000029.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000104.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000105.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000106.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000107.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000202.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000202.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000503.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000503.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000504.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000504.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000505.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000505.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000506.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000506.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000507.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000507.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000508.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000508.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000509.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000509.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000601.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000601.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000602.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000602.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1000902.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1000902.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001001.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001002.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001401.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001401.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1001702.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1001702.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002503.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002503.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002601.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002601.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002602.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002602.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1002901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1002901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1003001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1003001.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1003101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1003101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1003501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1003501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1003701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1003701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1004101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1004101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1004102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1004102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1004201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1004201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1004301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1004301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1004701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1004701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1005301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1005301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1005501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1005501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1005701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1005701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1005801.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1005801.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1005901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1005901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1006101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1006101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1006201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1006201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1006301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1006301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1025601.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1025601.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076801.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076801.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076802.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076802.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076803.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076803.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076804.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076804.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076805.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076805.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076806.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076806.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076807.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076807.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076808.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076808.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076809.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076809.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076810.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076810.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076811.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076811.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076812.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076812.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076813.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076813.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076814.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076814.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1076814.pdn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076814.pdn -------------------------------------------------------------------------------- /html/assets/img/tiles/1076901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1076901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1077201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1077201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1077301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1077301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1078401.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1078401.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1078801.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1078801.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1078901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1078901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1083201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1083201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1083301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1083301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1083701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1083701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1084801.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1084801.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1084901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1084901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128001.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128002.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128003.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128004.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128004.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128005.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128006.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128006.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128007.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128007.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128008.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128009.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128009.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128010.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128011.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128011.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128012.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128012.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128013.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128014.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128015.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128016.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128401.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128401.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128402.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128402.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1128501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1128501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1130001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1130001.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1130101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1130101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1134901.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1134901.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1179201.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1179201.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1384001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1384001.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/1384002.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/1384002.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000104.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000105.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000302.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000303.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000304.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000305.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2000701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2000701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2001501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2001501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2001502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2001502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/2001503.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/2001503.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3000101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3000101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3000301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3000301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3000302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3000302.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3000501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3000501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3000701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3000701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3001501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3001501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3001502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3001502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3001503.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3001503.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3001504.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3001504.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3001505.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3001505.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/3001506.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/3001506.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4000101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4000101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4000301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4000301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4000501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4000501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4000701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4000701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4001501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4001501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4001502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4001502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4001503.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4001503.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4001504.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4001504.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4001505.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4001505.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4001506.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4001506.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/4001507.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/4001507.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000302.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000303.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000702.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000702.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5000703.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5000703.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5001501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5001501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/5001502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/5001502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000104.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000105.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000302.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000303.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000304.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000305.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6000701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6000701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6001501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6001501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/6001502.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/6001502.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000101.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000101.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000102.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000102.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000103.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000103.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000104.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000104.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000105.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000105.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000106.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000106.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000107.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000108.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000108.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000109.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000109.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000110.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000110.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000111.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000111.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000301.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000301.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000302.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000302.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000303.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000304.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000305.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000306.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000306.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000307.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000308.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000308.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000309.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000309.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000310.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000310.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000311.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000311.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000312.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000312.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000313.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000313.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000314.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000314.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000501.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000501.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000701.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000701.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000702.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000702.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000703.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000703.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000704.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000704.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000705.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000705.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/8000706.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/8000706.jpg -------------------------------------------------------------------------------- /html/assets/img/capsule_scrapyard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/capsule_scrapyard.jpg -------------------------------------------------------------------------------- /html/assets/img/chemlake_medium_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/chemlake_medium_1.jpg -------------------------------------------------------------------------------- /html/assets/img/chemlake_medium_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/chemlake_medium_2.jpg -------------------------------------------------------------------------------- /html/assets/img/chemlake_medium_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/chemlake_medium_3.jpg -------------------------------------------------------------------------------- /html/assets/img/mechanic_station.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/mechanic_station.png -------------------------------------------------------------------------------- /html/assets/img/start_crashsite1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/start_crashsite1.jpg -------------------------------------------------------------------------------- /html/assets/img/start_crashsite2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/start_crashsite2.jpg -------------------------------------------------------------------------------- /html/assets/img/start_crashsite3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/start_crashsite3.jpg -------------------------------------------------------------------------------- /html/assets/img/underwater_med_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/underwater_med_3.jpg -------------------------------------------------------------------------------- /html/assets/img/underwater_med_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/underwater_med_4.jpg -------------------------------------------------------------------------------- /html/assets/img/warehouse3_large.pdn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/warehouse3_large.pdn -------------------------------------------------------------------------------- /html/assets/img/warehouse3_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/warehouse3_large.png -------------------------------------------------------------------------------- /html/assets/img/warehouse_2_large.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/warehouse_2_large.PNG -------------------------------------------------------------------------------- /html/assets/img/forest_ruin_medium_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/forest_ruin_medium_1.jpg -------------------------------------------------------------------------------- /html/assets/img/forest_ruin_medium_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/forest_ruin_medium_2.jpg -------------------------------------------------------------------------------- /html/assets/img/tiles/11504 - Copy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/tiles/11504 - Copy.jpg -------------------------------------------------------------------------------- /html/assets/img/start_crashsite_-36_-40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/start_crashsite_-36_-40.jpg -------------------------------------------------------------------------------- /html/assets/img/start_crashsite_-36_-41.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/start_crashsite_-36_-41.jpg -------------------------------------------------------------------------------- /html/assets/img/start_crashsite_-37_-39.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/start_crashsite_-37_-39.jpg -------------------------------------------------------------------------------- /html/assets/img/start_crashsite_-37_-40.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/start_crashsite_-37_-40.jpg -------------------------------------------------------------------------------- /html/assets/img/burntforest_farmbot_scrapyard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the1killer/sm_overview/HEAD/html/assets/img/burntforest_farmbot_scrapyard.jpg -------------------------------------------------------------------------------- /html/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scrapmechanicmap", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.html", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "supervisor index.js" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/the1killer/scrapmechanicmap.git" 13 | }, 14 | "author": "The-Killer", 15 | "license": "MIT", 16 | "bugs": { 17 | "url": "https://github.com/the1killer/scrapmechanicmap/issues" 18 | }, 19 | "homepage": "https://github.com/the1killer/scrapmechanicmap#readme", 20 | "dependencies": { 21 | "leaflet-hash": "^0.2.1" 22 | }, 23 | "devDependencies": { 24 | "express": "^4.17.1" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /html/assets/json/cells.json: -------------------------------------------------------------------------------- 1 | 2 | [ 3 | 4 | { 5 | "bounds" : 6 | { 7 | "xMax" : 71.0, 8 | "xMin" : -72.0, 9 | "yMax" : 55.0, 10 | "yMin" : -56.0 11 | }, 12 | "flags" : 32768.0, 13 | "rotation" : 3.0, 14 | "seed" : 667978921.0, 15 | "tileid" : 8001510.0, 16 | "x" : -72.0, 17 | "y" : -56.0 18 | }, 19 | { 20 | "flags" : 69632.0, 21 | "rotation" : 2.0, 22 | "tileid" : 10901.0, 23 | "x" : -28.0, 24 | "y" : -27.0 25 | }, 26 | 27 | { 28 | "flags" : 69632.0, 29 | "rotation" : 2.0, 30 | "tileid" : 10901.0, 31 | "x" : -27.0, 32 | "y" : -27.0 33 | }, 34 | { 35 | "flags" : 70912.0, 36 | "rotation" : 2.0, 37 | "tileid" : 10901.0, 38 | "x" : -28.0, 39 | "y" : -26.0 40 | }, 41 | 42 | { 43 | "flags" : 70912.0, 44 | "rotation" : 2.0, 45 | "tileid" : 10901.0, 46 | "x" : -27.0, 47 | "y" : -26.0 48 | } 49 | ] 50 | -------------------------------------------------------------------------------- /html/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const path = require('path'); 3 | 4 | 5 | const app = express(); 6 | const port = 8080; 7 | 8 | app.use('/assets',express.static('assets')); //host static assets 9 | app.use('/img',express.static('img')); //host map imgs 10 | app.use('/libs',express.static('libs')); //host static assets 11 | 12 | app.get('/', (req, res) => { 13 | // res.send('Hello World!') 14 | res.sendFile(path.join(__dirname,"index.html")); 15 | }); 16 | 17 | app.get('/map.html', (req, res) => { 18 | // res.send('Hello World!') 19 | res.sendFile(path.join(__dirname,"map.html")); 20 | }); 21 | 22 | // app.get('/systems.json', (req, res) => { 23 | // res.sendFile(path.join(__dirname,"systems.json")); 24 | // }); 25 | 26 | // app.get('/style.css', (req, res) => { 27 | // res.sendFile(path.join(__dirname,"style.css")); 28 | // }); 29 | 30 | // app.get('/bodybg.png', (req, res) => { 31 | // res.sendFile(path.join(__dirname,"bodybg.png")); 32 | // }); 33 | 34 | // app.get('/timers.js', (req, res) => { 35 | // res.sendFile(path.join(__dirname,"timers.js")); 36 | // }); 37 | 38 | app.listen(port, () => { 39 | console.log(`Example app listening on port ${port}!`) 40 | }); -------------------------------------------------------------------------------- /html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | Map Statistics 21 | 24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /html/assets/style.css: -------------------------------------------------------------------------------- 1 | html, body, #map { 2 | width:100%; 3 | height:100%; 4 | margin:0; 5 | padding:0; 6 | background-color: #B0B0B0; 7 | font-family: 'Roboto', sans-serif; 8 | } 9 | .cell { 10 | font-size: 0.4em; 11 | word-break: break-all; 12 | } 13 | .innercell { 14 | padding: 0.4em; 15 | } 16 | .meadow { 17 | background-color: #00E85D; 18 | } 19 | .lake { 20 | background-color: #00BAF2; 21 | } 22 | .autumnforest { 23 | background-color: #F2BB07; 24 | } 25 | .autumnforest { 26 | background-color: #F2BB07; 27 | } 28 | .forest { 29 | background-color: #00BC1B; 30 | } 31 | .burntforest { 32 | background-color: #9E8A5C; 33 | } 34 | .mountain { 35 | background-color: #8DBFAC; 36 | } 37 | .desert { 38 | background-color: #FFDE93; 39 | } 40 | .field { 41 | background-color: #A4E07E; 42 | } 43 | .gridLayer { 44 | z-index: 10 !important; 45 | } 46 | .none { 47 | background-color: #00FF8F; 48 | } 49 | .road-N { 50 | position: absolute; 51 | top: 0; 52 | left: 45%; 53 | height: 50%; 54 | width: 2em; 55 | background-color: #999; 56 | text-align: center; 57 | display: flex; 58 | align-items: center; 59 | } 60 | .road-S { 61 | position: absolute; 62 | bottom: 0; 63 | left: 45%; 64 | height: 50%; 65 | width: 2em; 66 | background-color: #999; 67 | text-align: center; 68 | display: flex; 69 | align-items: center; 70 | } 71 | .road-E { 72 | position: absolute; 73 | right: 0; 74 | bottom: 45%; 75 | width: 50%; 76 | height: 2em; 77 | background-color: #999; 78 | text-align: center; 79 | } 80 | .road-W { 81 | position: absolute; 82 | left: 0; 83 | bottom: 45%; 84 | width: 50%; 85 | height: 2em; 86 | background-color: #999; 87 | text-align: center; 88 | } 89 | .roadLine { 90 | position: absolute; 91 | } 92 | .road-W .roadLine, .road-E .roadLine { 93 | top: 49%; 94 | width: 100%; 95 | height: 1px; 96 | border-top: 0.5px dashed yellow; 97 | } 98 | .road-N .roadLine, .road-S .roadLine { 99 | left: 49%; 100 | height: 100%; 101 | width: 1px; 102 | border-left: 0.5px dashed yellow; 103 | } 104 | 105 | .rotLabel { 106 | position: absolute; 107 | bottom: 0; 108 | } 109 | .rot-1 { 110 | transform: rotate(270deg); 111 | } 112 | .rot-2 { 113 | transform: rotate(180deg); 114 | } 115 | .rot-3 { 116 | transform: rotate(90deg); 117 | } 118 | 119 | .tileid { 120 | position: absolute; 121 | bottom: 0; 122 | right: 3; 123 | } 124 | .tileimg { 125 | position: absolute; 126 | top: 0; 127 | left: 0; 128 | bottom: 0; 129 | right: 0; 130 | width: 100%; 131 | height: 100%; 132 | /* opacity: 0.85; */ 133 | } 134 | 135 | #stats { 136 | position: fixed; 137 | right: 10; 138 | top: 30; 139 | z-index: 1000; 140 | background: #FCFCFC; 141 | border-radius: 5px; 142 | padding: 10px; 143 | max-height: 60%; 144 | } 145 | .scroll-y { 146 | overflow-y: scroll; 147 | } 148 | #stats-content { 149 | font-size: 0.8em; 150 | padding-top: 10px; 151 | } 152 | .collapsed { 153 | display: none; 154 | } 155 | .stat-title { 156 | padding-top: 10px; 157 | } 158 | .toggle { 159 | float: right; 160 | font-size: 0.9em; 161 | max-width: 80hw; 162 | } 163 | #stats-content td { 164 | font-size: 0.8em; 165 | font-family: 'Roboto', sans-serif; 166 | } 167 | .poilabel { 168 | font-size: 0.75em; 169 | } -------------------------------------------------------------------------------- /tile_database.lua: -------------------------------------------------------------------------------- 1 | 2 | ---------------------------------------------------------------------------------------------------- 3 | -- Tile database 4 | ---------------------------------------------------------------------------------------------------- 5 | 6 | local f_idToTilePath = {} 7 | local legacyIds = {} -- Added by Arkanorian for use in 0.6.0 8 | local f_legacyIdUpgradeList = {} 9 | 10 | ---------------------------------------------------------------------------------------------------- 11 | 12 | function UpgradeCellData( cellData ) 13 | 14 | sm.log.info( "UpgradeCellData - version: "..tostring( cellData.version or 1 ) ) 15 | local upgraded = false 16 | -- 1 to 2 17 | if ( cellData.version or 1 ) < 2 then 18 | cellData.xOffset = cellData.tileOffsetX -- rename offset x table 19 | cellData.tileOffsetX = nil 20 | 21 | cellData.yOffset = cellData.tileOffsetY -- rename offset y table 22 | cellData.tileOffsetY = nil 23 | 24 | if cellData.uid == nil then 25 | cellData.uid = {} -- add uid table 26 | end 27 | 28 | for cellY = cellData.bounds.yMin, cellData.bounds.yMax do 29 | if cellData.uid[cellY] == nil then 30 | cellData.uid[cellY] = {} -- add uid table 31 | end 32 | 33 | for cellX = cellData.bounds.xMin, cellData.bounds.xMax do 34 | if cellData.uid[cellY][cellX] == nil then 35 | cellData.uid[cellY][cellX] = {} -- add uid table 36 | end 37 | local id = cellData.tileId[cellY][cellX] 38 | local uid = GetLegacyUpgrade( id ) 39 | if not sm.uuid.isNil( uid ) then 40 | cellData.uid[cellY][cellX] = uid -- (int) tileId -> (uuid) uid 41 | else 42 | cellData.uid[cellY][cellX] = sm.uuid.getNil() 43 | end 44 | end 45 | end 46 | cellData.version = 2 47 | upgraded = true 48 | end 49 | if upgraded then sm.log.info( " - Upgraded to version "..tostring( cellData.version ) ) else sm.log.info( " - No upgrade needed" ) end 50 | return upgraded 51 | end 52 | 53 | ---------------------------------------------------------------------------------------------------- 54 | 55 | function GetPath( uid ) 56 | if not f_idToTilePath[tostring( uid )] then 57 | return nil 58 | end 59 | return f_idToTilePath[tostring( uid )].path 60 | end 61 | 62 | function GetSize( uid ) 63 | if not f_idToTilePath[tostring( uid )] then 64 | return nil 65 | end 66 | return f_idToTilePath[tostring( uid )].size 67 | end 68 | 69 | function GetTerrainType( uid ) 70 | if not f_idToTilePath[tostring( uid )] then 71 | return nil 72 | end 73 | return f_idToTilePath[tostring( uid )].terrainType 74 | end 75 | 76 | function GetPoiType( uid ) 77 | if not f_idToTilePath[tostring( uid )] then 78 | return nil 79 | end 80 | return f_idToTilePath[tostring( uid )].poiType 81 | end 82 | 83 | -- Added by Arkanorian for use in 0.6.0 84 | function GetLegacyID( uid ) 85 | if not legacyIds[tostring( uid )] then 86 | return nil 87 | end 88 | return legacyIds[tostring( uid )] 89 | end 90 | ---------------------------------------------------------------------------------------------------- 91 | 92 | function AddTile( legacyId, path, terrainType, poiType ) 93 | terrainType = terrainType or 1 94 | 95 | local uid = sm.terrainTile.getTileUuid( path ) 96 | local size = sm.terrainTile.getSize( path ) 97 | 98 | if f_idToTilePath[tostring( uid )] == nil then 99 | f_idToTilePath[tostring( uid )] = { path = path, size = size, terrainType = terrainType, poiType = poiType } 100 | end 101 | if legacyId then 102 | AddLegacyUpgrade( legacyId, uid ) 103 | legacyIds[tostring( uid )] = legacyId -- Added by Arkanorian for use in 0.6.0 104 | end 105 | return uid 106 | end 107 | 108 | ---------------------------------------------------------------------------------------------------- 109 | 110 | function AddLegacyUpgrade( legacyId, uid ) 111 | f_legacyIdUpgradeList[legacyId] = uid 112 | end 113 | 114 | function GetLegacyUpgrade( legacyId ) 115 | return f_legacyIdUpgradeList[legacyId] 116 | end 117 | 118 | ---------------------------------------------------------------------------------------------------- 119 | -------------------------------------------------------------------------------- /html/libs/leaflet-hash.js: -------------------------------------------------------------------------------- 1 | (function(window) { 2 | var HAS_HASHCHANGE = (function() { 3 | var doc_mode = window.documentMode; 4 | return ('onhashchange' in window) && 5 | (doc_mode === undefined || doc_mode > 7); 6 | })(); 7 | 8 | L.Hash = function(map) { 9 | this.onHashChange = L.Util.bind(this.onHashChange, this); 10 | 11 | if (map) { 12 | this.init(map); 13 | } 14 | }; 15 | 16 | L.Hash.parseHash = function(hash) { 17 | if(hash.indexOf('#') === 0) { 18 | hash = hash.substr(1); 19 | } 20 | var args = hash.split("/"); 21 | if (args.length == 3) { 22 | var zoom = parseInt(args[0], 10), 23 | lat = parseFloat(args[1]), 24 | lon = parseFloat(args[2]); 25 | if (isNaN(zoom) || isNaN(lat) || isNaN(lon)) { 26 | return false; 27 | } else { 28 | return { 29 | center: new L.LatLng(lat, lon), 30 | zoom: zoom 31 | }; 32 | } 33 | } else { 34 | return false; 35 | } 36 | }; 37 | 38 | L.Hash.formatHash = function(map) { 39 | var center = map.getCenter(), 40 | zoom = map.getZoom(), 41 | precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)); 42 | 43 | return "#" + [zoom, 44 | center.lat.toFixed(precision), 45 | center.lng.toFixed(precision) 46 | ].join("/"); 47 | }, 48 | 49 | L.Hash.prototype = { 50 | map: null, 51 | lastHash: null, 52 | 53 | parseHash: L.Hash.parseHash, 54 | formatHash: L.Hash.formatHash, 55 | 56 | init: function(map) { 57 | this.map = map; 58 | 59 | // reset the hash 60 | this.lastHash = null; 61 | this.onHashChange(); 62 | 63 | if (!this.isListening) { 64 | this.startListening(); 65 | } 66 | }, 67 | 68 | removeFrom: function(map) { 69 | if (this.changeTimeout) { 70 | clearTimeout(this.changeTimeout); 71 | } 72 | 73 | if (this.isListening) { 74 | this.stopListening(); 75 | } 76 | 77 | this.map = null; 78 | }, 79 | 80 | onMapMove: function() { 81 | // bail if we're moving the map (updating from a hash), 82 | // or if the map is not yet loaded 83 | 84 | if (this.movingMap || !this.map._loaded) { 85 | return false; 86 | } 87 | 88 | var hash = this.formatHash(this.map); 89 | if (this.lastHash != hash) { 90 | location.replace(hash); 91 | this.lastHash = hash; 92 | } 93 | }, 94 | 95 | movingMap: false, 96 | update: function() { 97 | var hash = location.hash; 98 | if (hash === this.lastHash) { 99 | return; 100 | } 101 | var parsed = this.parseHash(hash); 102 | if (parsed) { 103 | this.movingMap = true; 104 | 105 | this.map.setView(parsed.center, parsed.zoom); 106 | 107 | this.movingMap = false; 108 | } else { 109 | this.onMapMove(this.map); 110 | } 111 | }, 112 | 113 | // defer hash change updates every 100ms 114 | changeDefer: 100, 115 | changeTimeout: null, 116 | onHashChange: function() { 117 | // throttle calls to update() so that they only happen every 118 | // `changeDefer` ms 119 | if (!this.changeTimeout) { 120 | var that = this; 121 | this.changeTimeout = setTimeout(function() { 122 | that.update(); 123 | that.changeTimeout = null; 124 | }, this.changeDefer); 125 | } 126 | }, 127 | 128 | isListening: false, 129 | hashChangeInterval: null, 130 | startListening: function() { 131 | this.map.on("moveend", this.onMapMove, this); 132 | 133 | if (HAS_HASHCHANGE) { 134 | L.DomEvent.addListener(window, "hashchange", this.onHashChange); 135 | } else { 136 | clearInterval(this.hashChangeInterval); 137 | this.hashChangeInterval = setInterval(this.onHashChange, 50); 138 | } 139 | this.isListening = true; 140 | }, 141 | 142 | stopListening: function() { 143 | this.map.off("moveend", this.onMapMove, this); 144 | 145 | if (HAS_HASHCHANGE) { 146 | L.DomEvent.removeListener(window, "hashchange", this.onHashChange); 147 | } else { 148 | clearInterval(this.hashChangeInterval); 149 | } 150 | this.isListening = false; 151 | } 152 | }; 153 | L.hash = function(map) { 154 | return new L.Hash(map); 155 | }; 156 | L.Map.prototype.addHash = function() { 157 | this._hash = L.hash(this); 158 | }; 159 | L.Map.prototype.removeHash = function() { 160 | this._hash.removeFrom(); 161 | }; 162 | })(window); 163 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 0.6.6 Update Broke JSON 4 | Scrap Mechanic's Nov 0.6.6 update broke the JSON export to file method, for a workaround see the github issue with [workaround]. I have emailed the developers about the issue but with the holidays will probably be a while for a response. 5 | 6 | # Introduction 7 | This quickly outputs the world data of your scrap mechanic save game to a json file for display via leafletJS from pre-screenshotted tiles. Not quite as beautiful as my [older screenshot method], but SOOOOOoooooo much quicker. This method is somewhat future proof as well. New tiles will still be displayed just blank, but updates should only require a new download of the missing tiles images. 8 | 9 | # Example 10 | https://the1killer.github.io/scrapmechanictilemap/ 11 | 12 | # INSTRUCTIONS 13 | 14 | !!!! BACKUP YOUR SAVE, not responsible for any issues !!!! 15 | 16 | 1. **Really backup your save!** 17 | 1. Download this repoistory, green "Code" button on the top right, or [Download Link] 18 | 1. Open `terrain_overworld.lua` from the downloaded files. 19 | 1. Copy lines 132-157, `local cells` *...to...* `cells = nil end` 20 | 1. Open `terrain_overworld.lua` in your game files, e.x. C:\Program Files (x86)\Steam\steamapps\common\Scrap Mechanic\Survival\Scripts\terrain\terrain_overworld.lua 21 | 1. Paste the lines into the game's terrain_overworld.lua, approx **line 130**, after `CreateCellTileStorageKeys()` within the `Load()` Function. 22 | 1. Replace `tile_database.lua` in your game files with the one from the downloaded files. E.x. C:\Program Files (x86)\Steam\steamapps\common\Scrap Mechanic\Survival\Scripts\terrain\overworld\tile_database.lua 23 | 1. Load your save game. 24 | 1. Copy **cells.json** from your game files C:\Program Files (x86)\Steam\steamapps\common\Scrap Mechanic\Survival\ to the **html\assets\json directory** in the downloads. 25 | 1. **If hosting on a webserver** 26 | 1. Copy all the files under **html/** to your webserver and open index.html and good to go. 27 | 1. **If viewing locally** 28 | 1. Open **cells.json**, select all text (ctrl-a), copy all text 29 | 1. Paste text into https://codebeautify.org/jsonminifier and click "minify/compress" then copy the resulting text on the right 30 | 1. Open **html/index.html**, on line 26 `SMOverviewMap.init();` add two back ticks( ` ) inside the parentheses 31 | 1. Paste the text from Part 2 inbetween the backticks. becomes `SMOverviewMap.init(`\``[[{......`\``);` 32 | 1. Open **html/index.html** to view your map 33 | 1. If you wish, remove or comment (--) the added lines in terrain_overworld.lua to improve game loading times 34 | 35 | 36 | ## Some things to note 37 | - Terrain height not really shown. 38 | - Game updates will remove the lua changes, requiring you to re-add them 39 | - How to setup your own free [GitHub website] 40 | - I think there could be some missing road/cliff tiles as there are many possibilties on how they mesh with eachother. Create an issue with your map seed and I can try to capture them. 41 | 42 | 43 | # Changelog 44 | - v1.0.0 45 | - Initial Release 46 | 47 | # Donation 48 | If you love this project and want to see more features give the developer a cup of coffee! 49 | 50 | [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=7JF52HNLJNHFE&item_name=SM+Overview+Donations¤cy_code=USD) 51 | 52 | 53 | # Tutorial Video 54 | Thanks to LionHeartBlue Gaming to making a tutorial video. Most people will need **Option 2** listed above and in the video. 55 |
56 | Remember to enclose the JSON with back ticks **\`**. 57 |
58 |
59 | [![Tutorial Video](https://img.youtube.com/vi/OXBzApCRwJA/sddefault.jpg))](https://www.youtube.com/watch?v=OXBzApCRwJA)) 60 | 61 | 62 |
63 |
64 |
65 |
66 |
67 | Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. 68 | 69 | Scrap Mechanic is property of Axolot Games AB, I have no affiliation with them. 70 | 71 | [//]: # (Links) 72 | [AutoHotKey]: https://www.autohotkey.com/ 73 | [GitHub website]: https://pages.github.com/ 74 | [Download Link]: https://github.com/the1killer/sm_overview/archive/main.zip 75 | [older screenshot method]: https://github.com/the1killer/sm_overview_ahk 76 | [Donate]: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=7JF52HNLJNHFE&item_name=SM+Overview+Donations¤cy_code=USD 77 | [workaround]: https://github.com/the1killer/sm_overview/issues/17#issuecomment-1849092063 78 | -------------------------------------------------------------------------------- /html/assets/js/cellparser.js: -------------------------------------------------------------------------------- 1 | let SMCellParser; 2 | SMCellParser = (function() { 3 | 4 | const parse = function(json) { 5 | var cells = new Array(); 6 | var x=0,y=0; 7 | json.forEach((cell) => { 8 | // var cellX = coord.cx,cellY = coord.cy; 9 | // var x = coord.x,y = coord.y; 10 | // var cell = {}; 11 | // cell.x = cellX; 12 | // cell.y = cellY; 13 | // cell.xidx = x; 14 | // cell.yidx = y; 15 | 16 | // if(y%10 == 0) { 17 | // console.log(cellX,cellY,x,y); 18 | // } 19 | 20 | // var xLookup = cellX; 21 | // var yLookup = cellY; 22 | var xLookup = cell.x; 23 | var yLookup = cell.y; 24 | // if(xLookup < 0) { 25 | // xLookup = x; 26 | // // xLookup = spanX - xLookup; 27 | // } 28 | // if(yLookup < 0) { 29 | // yLookup = y; 30 | // // yLookup = spanY - yLookup; 31 | // } 32 | 33 | try { 34 | // cell.tileId = json.tileId[yLookup][xLookup]; 35 | let pt = getPoiType(cell.tileid); 36 | if(pt) { 37 | cell.poiType = pt; 38 | } 39 | } catch (err) { 40 | console.log(err) 41 | // console.log("tileId not found for "+x+","+y); 42 | } 43 | // try { 44 | // cell.cellDebug = json.cellDebug[yLookup][xLookup]; 45 | // } catch (err) { 46 | // // console.log("cellDebug not found for "+x+","+y); 47 | // } 48 | try { 49 | // cell.flags = json.flags[yLookup][xLookup]; 50 | var ctype = getCellType(cell.flags) 51 | cell.type = TypeTags[ctype]; 52 | // if cellX >= -46 and cellX < -46 + 20 and cellY >= -46 and cellY < -46 + 16 then 53 | // tags[#tags + 1] = "STARTAREA" 54 | // end 55 | } catch (err) { 56 | // console.log("flags not found for "+x+","+y); 57 | // console.log(err); 58 | // exit(); 59 | } 60 | // try { 61 | // cell.rotation = json.rotation[yLookup][xLookup]; 62 | // } catch (err) { 63 | // // console.log("rotation not found for "+x+","+y); 64 | // } 65 | // try { 66 | // cell.elevation = json.elevation[yLookup][xLookup]; 67 | // } catch (err) { 68 | // // console.log("elevation not found for "+x+","+y); 69 | // } 70 | // try { 71 | // cell.cornerDebug = json.cornerDebug[yLookup][xLookup]; 72 | // } catch (err) { 73 | // // console.log("cornerDebug not found for "+x+","+y); 74 | // } 75 | // try { 76 | // cell.tileOffsetX = json.tileOffsetX[yLookup][xLookup]; 77 | // } catch (err) { 78 | // // console.log("tileOffsetX not found for "+x+","+y); 79 | // } 80 | // try { 81 | // cell.tileOffsetY = json.tileOffsetY[yLookup][xLookup]; 82 | // } catch (err) { 83 | // // console.log("tileOffsetY not found for "+x+","+y); 84 | // } 85 | try { 86 | cell.roads = getCellRoads(cell.flags) 87 | } catch (err) { 88 | console.log(err) 89 | } 90 | 91 | // console.log("x:"+cellX+", y:"+cellY) 92 | // console.log(cell); 93 | cells.push(cell); 94 | // console.log("push"); 95 | // x+=1; 96 | // break; 97 | // y+=1; 98 | // } 99 | // }) 100 | // y=0 101 | // x+=1; 102 | 103 | // x=0; 104 | // y+=1; 105 | // break; 106 | // } 107 | }) 108 | 109 | console.log("cell count: "+cells.length); 110 | 111 | return cells; 112 | } 113 | 114 | function getCellType( flags ) { 115 | // if insideCellBounds( cellX, cellY ) then 116 | return (flags & MASK_TERRAINTYPE) >> SHIFT_TERRAINTYPE 117 | // end 118 | // return 0 119 | } 120 | 121 | function getPoiType( id ) { 122 | var poiType = Math.floor( id / 100 ) 123 | if (poiType < 10000) { 124 | return POIS[poiType] 125 | } 126 | return null 127 | } 128 | 129 | function getCellRoads(flags) { 130 | let roadflags = flags & MASK_ROADS; 131 | let roads = ""; 132 | if(roadflags & FLAG_ROAD_N) { 133 | roads += "N" 134 | } 135 | if(roadflags & FLAG_ROAD_S) { 136 | roads += "S" 137 | } 138 | if(roadflags & FLAG_ROAD_E) { 139 | roads += "E" 140 | } 141 | if(roadflags & FLAG_ROAD_W) { 142 | roads += "W" 143 | } 144 | if (roads != "") { 145 | return roads; 146 | } 147 | } 148 | 149 | // //////////////////////////////////////////////////////////////////////////////// 150 | // // Cell type constants 151 | // //////////////////////////////////////////////////////////////////////////////// 152 | 153 | const TYPE_MEADOW = 1 154 | const TYPE_FOREST = 2 155 | const TYPE_DESERT = 3 //TODO: Ravine. A desert cliff type of thing. 156 | const TYPE_FIELD = 4 157 | const TYPE_BURNTFOREST = 5 158 | const TYPE_AUTUMNFOREST = 6 159 | const TYPE_MOUNTAIN = 7 160 | const TYPE_LAKE = 8 161 | 162 | const DEBUG_R = 243 163 | const DEBUG_G = 244 164 | const DEBUG_B = 245 165 | const DEBUG_C = 246 166 | const DEBUG_M = 247 167 | const DEBUG_Y = 248 168 | const DEBUG_BLACK = 249 169 | const DEBUG_ORANGE = 250 170 | const DEBUG_PINK = 251 171 | const DEBUG_LIME = 252 172 | const DEBUG_SPING = 253 173 | const DEBUG_PURPLE = 254 174 | const DEBUG_LAKE = 255 175 | 176 | var TypeTags = ["NONE", "MEADOW", "FOREST", "DESERT", "FIELD", "BURNTFOREST", "AUTUMNFOREST", "MOUNTAIN", "LAKE"] 177 | 178 | // //////////////////////////////////////////////////////////////////////////////////////////////////// 179 | // // Constants 180 | // //////////////////////////////////////////////////////////////////////////////////////////////////// 181 | 182 | const CELL_SIZE = 64 183 | 184 | const MASK_CLIFF = 0x00ff 185 | const MASK_ROADS = 0x0f00 186 | const MASK_ROADCLIFF = 0x0fff 187 | const MASK_TERRAINTYPE = 0xf000 188 | const MASK_FLAT = 0x10000 189 | 190 | const FLAG_ROAD_E = 0x0100 191 | const FLAG_ROAD_N = 0x0200 192 | const FLAG_ROAD_W = 0x0400 193 | const FLAG_ROAD_S = 0x0800 194 | 195 | const MASK_ROADS_SN = FLAG_ROAD_S|FLAG_ROAD_N 196 | const MASK_ROADS_WE = FLAG_ROAD_W|FLAG_ROAD_E 197 | 198 | const SHIFT_TERRAINTYPE = 12 199 | 200 | //////////////////////////////////////////////////////////////////////////////// 201 | 202 | 203 | //////////////////////////////////////////////////////////////////////////////// 204 | 205 | // No type = MEADOW 206 | // No size = SMALL 207 | 208 | // Unique (MEADOW) 209 | var POIS = {}; 210 | POIS[101] = "POI_CRASHSITE_AREA" //predefined area 211 | POIS[102] = "POI_HIDEOUT_XL" 212 | POIS[103] = "POI_SILODISTRICT_XL" 213 | POIS[104] = "POI_RUINCITY_XL" //roads 214 | POIS[105] = "POI_CRASHEDSHIP_LARGE" 215 | POIS[106] = "POI_CAMP_LARGE" 216 | POIS[107] = "POI_CAPSULESCRAPYARD_MEDIUM" 217 | POIS[108] = "POI_LABYRINTH_MEDIUM" 218 | 219 | // Special (MEADOW) 220 | POIS[109] = "POI_MECHANICSTATION_MEDIUM" // roads 221 | POIS[110] = "POI_PACKINGSTATIONVEG_MEDIUM" // roads 222 | POIS[111] = "POI_PACKINGSTATIONFRUIT_MEDIUM" // roads 223 | 224 | // Large Random 225 | POIS[112] = "POI_WAREHOUSE2_LARGE" // 2 floors, roads 226 | POIS[113] = "POI_WAREHOUSE3_LARGE" // 3 floors, roads 227 | POIS[114] = "POI_WAREHOUSE4_LARGE" // 4 floors, roads 228 | POIS[501] = "POI_BURNTFOREST_FARMBOTSCRAPYARD_LARGE" // burnt forest center 229 | 230 | 231 | // Small Random 232 | POIS[115] = "POI_ROAD" // meadow with roads 233 | 234 | POIS[116] = "POI_CAMP" 235 | POIS[117] = "POI_RUIN" 236 | POIS[118] = "POI_RANDOM" 237 | 238 | POIS[201] = "POI_FOREST_CAMP" 239 | POIS[202] = "POI_FOREST_RUIN" 240 | POIS[203] = "POI_FOREST_RANDOM" 241 | 242 | POIS[301] = "POI_DESERT_RANDOM" 243 | 244 | POIS[119] = "POI_FARMINGPATCH" // meadow adjacent to field 245 | POIS[401] = "POI_FIELD_RUIN" 246 | POIS[402] = "POI_FIELD_RANDOM" 247 | 248 | POIS[502] = "POI_BURNTFOREST_CAMP" 249 | POIS[503] = "POI_BURNTFOREST_RUIN" 250 | POIS[504] = "POI_BURNTFOREST_RANDOM" 251 | 252 | POIS[601] = "POI_AUTUMNFOREST_CAMP" 253 | POIS[602] = "POI_AUTUMNFOREST_RUIN" 254 | POIS[603] = "POI_AUTUMNFOREST_RANDOM" 255 | 256 | POIS[801] = "POI_LAKE_RANDOM" 257 | 258 | // Medium Random 259 | POIS[120] = "POI_RUIN_MEDIUM" 260 | POIS[121] = "POI_CHEMLAKE_MEDIUM" 261 | POIS[122] = "POI_BUILDAREA_MEDIUM" 262 | 263 | POIS[204] = "POI_FOREST_RUIN_MEDIUM" 264 | 265 | POIS[802] = "POI_LAKE_UNDERWATER_MEDIUM" 266 | 267 | 268 | POIS[1] = "POI_RANDOM_PLACEHOLDER" 269 | POIS[99] = "POI_TEST" 270 | 271 | 272 | 273 | return { 274 | parse 275 | } 276 | })(); -------------------------------------------------------------------------------- /missingimages.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | let path = './html/'; 4 | let filename = path+"assets/json/cells.json"; 5 | 6 | let SMCellParser; 7 | SMCellParser = (function() { 8 | 9 | const parse = function() { 10 | let filedata = fs.readFileSync(filename); 11 | let json = JSON.parse(filedata); 12 | var cells = new Array(); 13 | var x=0,y=0; 14 | json.forEach((cell) => { 15 | try { 16 | let pt = getPoiType(cell.tileid); 17 | if(pt) { 18 | cell.poiType = pt; 19 | } 20 | } catch (err) { 21 | console.log(err) 22 | // console.log("tileId not found for "+x+","+y); 23 | } 24 | try { 25 | var ctype = getCellType(cell.flags) 26 | cell.type = TypeTags[ctype]; 27 | } catch (err) { 28 | // console.log("flags not found for "+x+","+y); 29 | // console.log(err); 30 | // exit(); 31 | } 32 | try { 33 | var roads = getCellRoads(cell.flags) 34 | if(roads != undefined) { 35 | cell.roads = roads; 36 | } 37 | } catch (err) { 38 | console.log(err) 39 | } 40 | cells.push(cell); 41 | }) 42 | 43 | cells.forEach((cell)=>{ 44 | var turl = getTileURL(cell.tileid,cell.x,cell.y); 45 | var purl = getPoiUrl(cell.poiType,cell.tileid,cell.x,cell.y); 46 | if(cell.type != 'LAKE' && (turl == undefined && purl == undefined) && cell.poiType != "POI_CRASHSITE_AREA") { 47 | console.warn(`Missing image at ${cell.x},${cell.y} for id ${cell.tileid} ${cell.type} ${cell.poiType || ''}`) 48 | } 49 | }); 50 | 51 | console.log("cell count: "+cells.length); 52 | 53 | // return cells; 54 | } 55 | 56 | function getCellType( flags ) { 57 | // if insideCellBounds( cellX, cellY ) then 58 | return (flags & MASK_TERRAINTYPE) >> SHIFT_TERRAINTYPE 59 | // end 60 | // return 0 61 | } 62 | 63 | function getPoiType( id ) { 64 | var poiType = Math.floor( id / 100 ) 65 | if (poiType < 10000) { 66 | return POIS[poiType] 67 | } 68 | return null 69 | } 70 | 71 | function getCellRoads(flags) { 72 | let roadflags = flags & MASK_ROADS; 73 | let roads = ""; 74 | if(roadflags & FLAG_ROAD_N) { 75 | roads += "N" 76 | } 77 | if(roadflags & FLAG_ROAD_S) { 78 | roads += "S" 79 | } 80 | if(roadflags & FLAG_ROAD_E) { 81 | roads += "E" 82 | } 83 | if(roadflags & FLAG_ROAD_W) { 84 | roads += "W" 85 | } 86 | if (roads != "") { 87 | return roads; 88 | } 89 | } 90 | 91 | // //////////////////////////////////////////////////////////////////////////////// 92 | // // Cell type constants 93 | // //////////////////////////////////////////////////////////////////////////////// 94 | 95 | const TYPE_MEADOW = 1 96 | const TYPE_FOREST = 2 97 | const TYPE_DESERT = 3 //TODO: Ravine. A desert cliff type of thing. 98 | const TYPE_FIELD = 4 99 | const TYPE_BURNTFOREST = 5 100 | const TYPE_AUTUMNFOREST = 6 101 | const TYPE_MOUNTAIN = 7 102 | const TYPE_LAKE = 8 103 | 104 | const DEBUG_R = 243 105 | const DEBUG_G = 244 106 | const DEBUG_B = 245 107 | const DEBUG_C = 246 108 | const DEBUG_M = 247 109 | const DEBUG_Y = 248 110 | const DEBUG_BLACK = 249 111 | const DEBUG_ORANGE = 250 112 | const DEBUG_PINK = 251 113 | const DEBUG_LIME = 252 114 | const DEBUG_SPING = 253 115 | const DEBUG_PURPLE = 254 116 | const DEBUG_LAKE = 255 117 | 118 | var TypeTags = ["NONE", "MEADOW", "FOREST", "DESERT", "FIELD", "BURNTFOREST", "AUTUMNFOREST", "MOUNTAIN", "LAKE"] 119 | 120 | // //////////////////////////////////////////////////////////////////////////////////////////////////// 121 | // // Constants 122 | // //////////////////////////////////////////////////////////////////////////////////////////////////// 123 | 124 | const CELL_SIZE = 64 125 | 126 | const MASK_CLIFF = 0x00ff 127 | const MASK_ROADS = 0x0f00 128 | const MASK_ROADCLIFF = 0x0fff 129 | const MASK_TERRAINTYPE = 0xf000 130 | const MASK_FLAT = 0x10000 131 | 132 | const FLAG_ROAD_E = 0x0100 133 | const FLAG_ROAD_N = 0x0200 134 | const FLAG_ROAD_W = 0x0400 135 | const FLAG_ROAD_S = 0x0800 136 | 137 | const MASK_ROADS_SN = FLAG_ROAD_S|FLAG_ROAD_N 138 | const MASK_ROADS_WE = FLAG_ROAD_W|FLAG_ROAD_E 139 | 140 | const SHIFT_TERRAINTYPE = 12 141 | 142 | //////////////////////////////////////////////////////////////////////////////// 143 | 144 | 145 | //////////////////////////////////////////////////////////////////////////////// 146 | 147 | // No type = MEADOW 148 | // No size = SMALL 149 | 150 | // Unique (MEADOW) 151 | var POIS = {}; 152 | POIS[101] = "POI_CRASHSITE_AREA" //predefined area 153 | POIS[102] = "POI_HIDEOUT_XL" 154 | POIS[103] = "POI_SILODISTRICT_XL" 155 | POIS[104] = "POI_RUINCITY_XL" //roads 156 | POIS[105] = "POI_CRASHEDSHIP_LARGE" 157 | POIS[106] = "POI_CAMP_LARGE" 158 | POIS[107] = "POI_CAPSULESCRAPYARD_MEDIUM" 159 | POIS[108] = "POI_LABYRINTH_MEDIUM" 160 | 161 | // Special (MEADOW) 162 | POIS[109] = "POI_MECHANICSTATION_MEDIUM" // roads 163 | POIS[110] = "POI_PACKINGSTATIONVEG_MEDIUM" // roads 164 | POIS[111] = "POI_PACKINGSTATIONFRUIT_MEDIUM" // roads 165 | 166 | // Large Random 167 | POIS[112] = "POI_WAREHOUSE2_LARGE" // 2 floors, roads 168 | POIS[113] = "POI_WAREHOUSE3_LARGE" // 3 floors, roads 169 | POIS[114] = "POI_WAREHOUSE4_LARGE" // 4 floors, roads 170 | POIS[501] = "POI_BURNTFOREST_FARMBOTSCRAPYARD_LARGE" // burnt forest center 171 | 172 | 173 | // Small Random 174 | POIS[115] = "POI_ROAD" // meadow with roads 175 | 176 | POIS[116] = "POI_CAMP" 177 | POIS[117] = "POI_RUIN" 178 | POIS[118] = "POI_RANDOM" 179 | 180 | POIS[201] = "POI_FOREST_CAMP" 181 | POIS[202] = "POI_FOREST_RUIN" 182 | POIS[203] = "POI_FOREST_RANDOM" 183 | 184 | POIS[301] = "POI_DESERT_RANDOM" 185 | 186 | POIS[119] = "POI_FARMINGPATCH" // meadow adjacent to field 187 | POIS[401] = "POI_FIELD_RUIN" 188 | POIS[402] = "POI_FIELD_RANDOM" 189 | 190 | POIS[502] = "POI_BURNTFOREST_CAMP" 191 | POIS[503] = "POI_BURNTFOREST_RUIN" 192 | POIS[504] = "POI_BURNTFOREST_RANDOM" 193 | 194 | POIS[601] = "POI_AUTUMNFOREST_CAMP" 195 | POIS[602] = "POI_AUTUMNFOREST_RUIN" 196 | POIS[603] = "POI_AUTUMNFOREST_RANDOM" 197 | 198 | POIS[801] = "POI_LAKE_RANDOM" 199 | 200 | // Medium Random 201 | POIS[120] = "POI_RUIN_MEDIUM" 202 | POIS[121] = "POI_CHEMLAKE_MEDIUM" 203 | POIS[122] = "POI_BUILDAREA_MEDIUM" 204 | 205 | POIS[204] = "POI_FOREST_RUIN_MEDIUM" 206 | 207 | POIS[802] = "POI_LAKE_UNDERWATER_MEDIUM" 208 | 209 | 210 | POIS[1] = "POI_RANDOM_PLACEHOLDER" 211 | POIS[99] = "POI_TEST" 212 | 213 | 214 | function getTileURL(tileid,x,y) { 215 | var tiles = [ 216 | 10105,10106,10107,10108, 217 | 11501,11502,11503,11504,11505,11506,11507, 218 | 11601, 219 | 11701,11702,11703,11704, 220 | 11801,11802,11803,11804,11805,11806,11807,11808,11809, 221 | 11901,11902,11903, 222 | 20101,20102,20103,20104,20105,20106,20107, 223 | 20301,20302,20303,20304,20305,20306,20307, 224 | 30101,30102, 225 | 40101,40201,40202,40203, 226 | 50201, 227 | 50301, 228 | 50402, 229 | 60101,60102,60103, 230 | 60201, 231 | 60301,60302,60303,60304, 232 | 80103, 233 | 1000001,1000002,1000003,1000004,1000005,1000006,1000007,1000008,1000009,1000010,1000011,1000012,1000013,1000014,1000015,1000016,1000017,1000018,1000019,1000020,1000021,1000022,1000023,1000024,1000025,1000026,1000027,1000028,1000029, 234 | 1000101,1000102,1000103,1000105,1000106,1000107,1000104,1000201,1000202,1000301, 235 | 1000501,1000502,1000503,1000504,1000505,1000506,1000507,1000508,1000509, 236 | 1000601,1000602, 237 | 1000701, 238 | 1000901,1000902, 239 | 1001001,1001002,1001101,1001301,1001401,1001501,1001701,1001702,1002101,1002102,1002103,1002201,1002301,1002501,1002502,1002503,1002601,1002602,1002701,1002901, 240 | 1003001,1003101,1003501,1003701,1004701,1005301,1005501,1005701,1005801,1005901,1006101,1006201,1006301, 241 | 1004101,1004102,1004201,1004301, 242 | 1025601,1128402, 243 | 1076801,1076802,1076803,1076804,1076805,1076806,1076807,1076808,1076809,1076810,1076811,1076812,1076813,1076814, 244 | 1076901, 245 | 1077201,1077301,1078401,1078801,1078901, 246 | 1083201,1083701,1084801,1084901, 247 | 1128001,1128002,1128003,1128004,1128005,1128006,1128007,1128008,1128009,1128010,1128011,1128012,1128013,1128014,1128015,1128016,1128501, 248 | 1128101,1128401,1130001,1130101,1134901,1179201,1083301, 249 | 1384001,1384002, 250 | 2000101,2000102,2000103,2000104,2000105,2000301,2000302,2000303,2000304,2000305,2000501,2000701,2001501,2001502,2001503, 251 | 3000101,3000301,3000302,3000701,3000501,3001501,3001502,3001503,3001504,3001505,3001506, 252 | 4000101,4000301,4000501,4000701,4001501,4001502,4001503,4001504,4001505,4001506,4001507, 253 | 5000101,5000102,5000103,5000301,5000302,5000303,5000501,5000701,5000702,5000703,5001501,5001502, 254 | 6000101,6000102,6000103,6000104,6000105, 255 | 6000301,6000302,6000303,6000304,6000305, 256 | 6000501, 257 | 6000701, 258 | 6001501,6001502, 259 | 8000101,8000102,8000103,8000104,8000105,8000106,8000107,8000108,8000109,8000110,8000111, 260 | 8000301,8000302,8000303,8000304,8000305,8000306,8000307,8000308,8000309,8000310,8000311,8000312,8000313,8000314, 261 | 8000501, 262 | 8000701,8000702,8000703,8000704,8000705,8000706 263 | ]; 264 | if(tiles.includes(tileid)) { 265 | return `./assets/img/tiles/${tileid}.jpg` 266 | } 267 | // if(tileid > 8000000) { 268 | // return './assets/img/lake_generic.jpg' 269 | // } 270 | if(x == -37 && y == -39) { 271 | return './assets/img/start_crashsite_-37_-39.jpg'; 272 | } else if(x == -37 && y == -39) { 273 | return './assets/img/start_crashsite_-37_-39.jpg'; 274 | } else if(x == -37 && y == -40) { 275 | return './assets/img/start_crashsite_-37_-40.jpg'; 276 | } else if(x == -36 && y == -40) { 277 | return './assets/img/start_crashsite_-36_-40.jpg'; 278 | } else if(x == -36 && y == -41) { 279 | return './assets/img/start_crashsite_-36_-41.jpg'; 280 | } 281 | } 282 | 283 | var POI_SIZES = { 284 | // "POI_ROAD":1, 285 | "POI_CRASHSITE_AREA":2, 286 | "POI_MECHANICSTATION_MEDIUM":2, 287 | "POI_LABYRINTH_MEDIUM":2, 288 | "POI_CHEMLAKE_MEDIUM":2, 289 | "POI_RUIN_MEDIUM":2, 290 | "POI_FOREST_RUIN_MEDIUM":2, 291 | "POI_CAPSULESCRAPYARD_MEDIUM":2, 292 | "POI_PACKINGSTATIONVEG_MEDIUM": 2, 293 | "POI_PACKINGSTATIONFRUIT_MEDIUM": 2, 294 | "POI_LAKE_UNDERWATER_MEDIUM": 2, 295 | "POI_CAMP_LARGE":4, 296 | "POI_CRASHEDSHIP_LARGE":4, 297 | "POI_BURNTFOREST_FARMBOTSCRAPYARD_LARGE":4, 298 | "POI_WAREHOUSE2_LARGE":4, 299 | "POI_WAREHOUSE3_LARGE":4, 300 | "POI_WAREHOUSE4_LARGE":4, 301 | "POI_HIDEOUT_XL":8, 302 | "POI_RUINCITY_XL": 8, 303 | "POI_SILODISTRICT_XL": 8 304 | }; 305 | 306 | function getPoiUrl(poiType,tileid,x,y) { 307 | switch(poiType) { 308 | case 'POI_MECHANICSTATION_MEDIUM': 309 | return './assets/img/mechanic_station.png' 310 | break; 311 | case 'POI_HIDEOUT_XL': 312 | return './assets/img/hideout.png' 313 | break; 314 | case 'POI_CAMP_LARGE': 315 | return './assets/img/camp_large.jpg' 316 | break; 317 | case 'POI_WAREHOUSE4_LARGE': 318 | return './assets/img/warehouse4.png' 319 | break; 320 | case 'POI_WAREHOUSE3_LARGE': 321 | return './assets/img/warehouse3_large.png' 322 | break; 323 | case 'POI_WAREHOUSE2_LARGE': 324 | return './assets/img/warehouse2.jpg' 325 | break; 326 | case 'POI_SILODISTRICT_XL': 327 | return './assets/img/silodistrict.jpg' 328 | break; 329 | case 'POI_RUINCITY_XL': 330 | return './assets/img/scrapcity.jpg' 331 | break; 332 | case 'POI_PACKINGSTATIONVEG_MEDIUM': 333 | return './assets/img/packing_veg.jpg' 334 | break; 335 | case 'POI_PACKINGSTATIONFRUIT_MEDIUM': 336 | return './assets/img/packing_fruit.jpg' 337 | break; 338 | case 'POI_CHEMLAKE_MEDIUM': 339 | if(tileid == 12103) { 340 | return './assets/img/chemlake_medium_3.jpg' 341 | } else if(tileid == 12102) { 342 | return './assets/img/chemlake_medium_2.jpg' 343 | } 344 | return './assets/img/chemlake_medium_1.jpg' 345 | break; 346 | case 'POI_RUIN_MEDIUM': 347 | if(tileid == 12003) { 348 | return './assets/img/ruin_medium_3.jpg' 349 | } 350 | return './assets/img/ruin_medium_4.jpg' 351 | break; 352 | case 'POI_FOREST_RUIN_MEDIUM': 353 | if(tileid == 20402) { 354 | return './assets/img/forest_ruin_medium_2.jpg' 355 | } 356 | return './assets/img/forest_ruin_medium_1.jpg' 357 | break; 358 | case 'POI_LAKE_UNDERWATER_MEDIUM': 359 | if(tileid == 80203) { 360 | return './assets/img/underwater_med_3.jpg' 361 | } else 362 | if(tileid == 80204 || tileid == 80202) { 363 | return './assets/img/underwater_med_4.jpg' 364 | } 365 | // return './assets/img/underwater_med_3.jpg' 366 | break; 367 | case 'POI_CRASHSITE_AREA': 368 | if(tileid == 10103) { 369 | return './assets/img/start_crashsite3.jpg' 370 | } else if(tileid == 10102) { 371 | return './assets/img/start_crashsite2.jpg' 372 | } else if (tileid == 10101 && x == -38 && y == -42) { 373 | return './assets/img/start_crashsite1.jpg' 374 | } 375 | break; 376 | case 'POI_CAPSULESCRAPYARD_MEDIUM': 377 | return './assets/img/capsule_scrapyard.jpg' 378 | break; 379 | case 'POI_BURNTFOREST_FARMBOTSCRAPYARD_LARGE': 380 | return './assets/img/burntforest_farmbot_scrapyard.jpg' 381 | break; 382 | case 'POI_CRASHEDSHIP_LARGE': 383 | return './assets/img/crashed_ship.jpg' 384 | break; 385 | case 'POI_LABYRINTH_MEDIUM': 386 | return './assets/img/labyrinth.jpg' 387 | break; 388 | case 'POI_BUILDAREA_MEDIUM': 389 | return './assets/img/buildarea.jpg' 390 | break; 391 | } 392 | } 393 | 394 | 395 | return { 396 | parse 397 | } 398 | })(); 399 | 400 | SMCellParser.parse(); -------------------------------------------------------------------------------- /html/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scrapmechanicmap", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "dev": true, 12 | "requires": { 13 | "mime-types": "2.1.27", 14 | "negotiator": "0.6.2" 15 | } 16 | }, 17 | "array-flatten": { 18 | "version": "1.1.1", 19 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 20 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", 21 | "dev": true 22 | }, 23 | "body-parser": { 24 | "version": "1.19.0", 25 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 26 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 27 | "dev": true, 28 | "requires": { 29 | "bytes": "3.1.0", 30 | "content-type": "1.0.4", 31 | "debug": "2.6.9", 32 | "depd": "1.1.2", 33 | "http-errors": "1.7.2", 34 | "iconv-lite": "0.4.24", 35 | "on-finished": "2.3.0", 36 | "qs": "6.7.0", 37 | "raw-body": "2.4.0", 38 | "type-is": "1.6.18" 39 | } 40 | }, 41 | "bytes": { 42 | "version": "3.1.0", 43 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 44 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", 45 | "dev": true 46 | }, 47 | "content-disposition": { 48 | "version": "0.5.3", 49 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 50 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 51 | "dev": true, 52 | "requires": { 53 | "safe-buffer": "5.1.2" 54 | } 55 | }, 56 | "content-type": { 57 | "version": "1.0.4", 58 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 59 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 60 | "dev": true 61 | }, 62 | "cookie": { 63 | "version": "0.4.0", 64 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 65 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", 66 | "dev": true 67 | }, 68 | "cookie-signature": { 69 | "version": "1.0.6", 70 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 71 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", 72 | "dev": true 73 | }, 74 | "debug": { 75 | "version": "2.6.9", 76 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 77 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 78 | "dev": true, 79 | "requires": { 80 | "ms": "2.0.0" 81 | } 82 | }, 83 | "depd": { 84 | "version": "1.1.2", 85 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 86 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", 87 | "dev": true 88 | }, 89 | "destroy": { 90 | "version": "1.0.4", 91 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 92 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", 93 | "dev": true 94 | }, 95 | "ee-first": { 96 | "version": "1.1.1", 97 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 98 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", 99 | "dev": true 100 | }, 101 | "encodeurl": { 102 | "version": "1.0.2", 103 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 104 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", 105 | "dev": true 106 | }, 107 | "escape-html": { 108 | "version": "1.0.3", 109 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 110 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", 111 | "dev": true 112 | }, 113 | "etag": { 114 | "version": "1.8.1", 115 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 116 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", 117 | "dev": true 118 | }, 119 | "express": { 120 | "version": "4.17.1", 121 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 122 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 123 | "dev": true, 124 | "requires": { 125 | "accepts": "1.3.7", 126 | "array-flatten": "1.1.1", 127 | "body-parser": "1.19.0", 128 | "content-disposition": "0.5.3", 129 | "content-type": "1.0.4", 130 | "cookie": "0.4.0", 131 | "cookie-signature": "1.0.6", 132 | "debug": "2.6.9", 133 | "depd": "1.1.2", 134 | "encodeurl": "1.0.2", 135 | "escape-html": "1.0.3", 136 | "etag": "1.8.1", 137 | "finalhandler": "1.1.2", 138 | "fresh": "0.5.2", 139 | "merge-descriptors": "1.0.1", 140 | "methods": "1.1.2", 141 | "on-finished": "2.3.0", 142 | "parseurl": "1.3.3", 143 | "path-to-regexp": "0.1.7", 144 | "proxy-addr": "2.0.6", 145 | "qs": "6.7.0", 146 | "range-parser": "1.2.1", 147 | "safe-buffer": "5.1.2", 148 | "send": "0.17.1", 149 | "serve-static": "1.14.1", 150 | "setprototypeof": "1.1.1", 151 | "statuses": "1.5.0", 152 | "type-is": "1.6.18", 153 | "utils-merge": "1.0.1", 154 | "vary": "1.1.2" 155 | } 156 | }, 157 | "finalhandler": { 158 | "version": "1.1.2", 159 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 160 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 161 | "dev": true, 162 | "requires": { 163 | "debug": "2.6.9", 164 | "encodeurl": "1.0.2", 165 | "escape-html": "1.0.3", 166 | "on-finished": "2.3.0", 167 | "parseurl": "1.3.3", 168 | "statuses": "1.5.0", 169 | "unpipe": "1.0.0" 170 | } 171 | }, 172 | "forwarded": { 173 | "version": "0.1.2", 174 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 175 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 176 | "dev": true 177 | }, 178 | "fresh": { 179 | "version": "0.5.2", 180 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 181 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", 182 | "dev": true 183 | }, 184 | "http-errors": { 185 | "version": "1.7.2", 186 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 187 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 188 | "dev": true, 189 | "requires": { 190 | "depd": "1.1.2", 191 | "inherits": "2.0.3", 192 | "setprototypeof": "1.1.1", 193 | "statuses": "1.5.0", 194 | "toidentifier": "1.0.0" 195 | } 196 | }, 197 | "iconv-lite": { 198 | "version": "0.4.24", 199 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 200 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 201 | "dev": true, 202 | "requires": { 203 | "safer-buffer": "2.1.2" 204 | } 205 | }, 206 | "inherits": { 207 | "version": "2.0.3", 208 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 209 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 210 | "dev": true 211 | }, 212 | "ipaddr.js": { 213 | "version": "1.9.1", 214 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 215 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 216 | "dev": true 217 | }, 218 | "leaflet-hash": { 219 | "version": "0.2.1", 220 | "resolved": "https://registry.npmjs.org/leaflet-hash/-/leaflet-hash-0.2.1.tgz", 221 | "integrity": "sha1-w2xxg0fFJDAztXy0uuomEZ2CxwE=" 222 | }, 223 | "media-typer": { 224 | "version": "0.3.0", 225 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 226 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 227 | "dev": true 228 | }, 229 | "merge-descriptors": { 230 | "version": "1.0.1", 231 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 232 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", 233 | "dev": true 234 | }, 235 | "methods": { 236 | "version": "1.1.2", 237 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 238 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", 239 | "dev": true 240 | }, 241 | "mime": { 242 | "version": "1.6.0", 243 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 244 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 245 | "dev": true 246 | }, 247 | "mime-db": { 248 | "version": "1.44.0", 249 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 250 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", 251 | "dev": true 252 | }, 253 | "mime-types": { 254 | "version": "2.1.27", 255 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 256 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 257 | "dev": true, 258 | "requires": { 259 | "mime-db": "1.44.0" 260 | } 261 | }, 262 | "ms": { 263 | "version": "2.0.0", 264 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 265 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 266 | "dev": true 267 | }, 268 | "negotiator": { 269 | "version": "0.6.2", 270 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 271 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", 272 | "dev": true 273 | }, 274 | "on-finished": { 275 | "version": "2.3.0", 276 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 277 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 278 | "dev": true, 279 | "requires": { 280 | "ee-first": "1.1.1" 281 | } 282 | }, 283 | "parseurl": { 284 | "version": "1.3.3", 285 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 286 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 287 | "dev": true 288 | }, 289 | "path-to-regexp": { 290 | "version": "0.1.7", 291 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 292 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", 293 | "dev": true 294 | }, 295 | "proxy-addr": { 296 | "version": "2.0.6", 297 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 298 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 299 | "dev": true, 300 | "requires": { 301 | "forwarded": "0.1.2", 302 | "ipaddr.js": "1.9.1" 303 | } 304 | }, 305 | "qs": { 306 | "version": "6.7.0", 307 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 308 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", 309 | "dev": true 310 | }, 311 | "range-parser": { 312 | "version": "1.2.1", 313 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 314 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 315 | "dev": true 316 | }, 317 | "raw-body": { 318 | "version": "2.4.0", 319 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 320 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 321 | "dev": true, 322 | "requires": { 323 | "bytes": "3.1.0", 324 | "http-errors": "1.7.2", 325 | "iconv-lite": "0.4.24", 326 | "unpipe": "1.0.0" 327 | } 328 | }, 329 | "safe-buffer": { 330 | "version": "5.1.2", 331 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 332 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 333 | "dev": true 334 | }, 335 | "safer-buffer": { 336 | "version": "2.1.2", 337 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 338 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 339 | "dev": true 340 | }, 341 | "send": { 342 | "version": "0.17.1", 343 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 344 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 345 | "dev": true, 346 | "requires": { 347 | "debug": "2.6.9", 348 | "depd": "1.1.2", 349 | "destroy": "1.0.4", 350 | "encodeurl": "1.0.2", 351 | "escape-html": "1.0.3", 352 | "etag": "1.8.1", 353 | "fresh": "0.5.2", 354 | "http-errors": "1.7.2", 355 | "mime": "1.6.0", 356 | "ms": "2.1.1", 357 | "on-finished": "2.3.0", 358 | "range-parser": "1.2.1", 359 | "statuses": "1.5.0" 360 | }, 361 | "dependencies": { 362 | "ms": { 363 | "version": "2.1.1", 364 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 365 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 366 | "dev": true 367 | } 368 | } 369 | }, 370 | "serve-static": { 371 | "version": "1.14.1", 372 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 373 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 374 | "dev": true, 375 | "requires": { 376 | "encodeurl": "1.0.2", 377 | "escape-html": "1.0.3", 378 | "parseurl": "1.3.3", 379 | "send": "0.17.1" 380 | } 381 | }, 382 | "setprototypeof": { 383 | "version": "1.1.1", 384 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 385 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", 386 | "dev": true 387 | }, 388 | "statuses": { 389 | "version": "1.5.0", 390 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 391 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", 392 | "dev": true 393 | }, 394 | "toidentifier": { 395 | "version": "1.0.0", 396 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 397 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", 398 | "dev": true 399 | }, 400 | "type-is": { 401 | "version": "1.6.18", 402 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 403 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 404 | "dev": true, 405 | "requires": { 406 | "media-typer": "0.3.0", 407 | "mime-types": "2.1.27" 408 | } 409 | }, 410 | "unpipe": { 411 | "version": "1.0.0", 412 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 413 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", 414 | "dev": true 415 | }, 416 | "utils-merge": { 417 | "version": "1.0.1", 418 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 419 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", 420 | "dev": true 421 | }, 422 | "vary": { 423 | "version": "1.1.2", 424 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 425 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", 426 | "dev": true 427 | } 428 | } 429 | } 430 | -------------------------------------------------------------------------------- /html/assets/js/sm_overview_map.js: -------------------------------------------------------------------------------- 1 | // 2 | // SM Overview Map 3 | // v1.0.0 4 | // 5 | let SMOverviewMap; 6 | SMOverviewMap = (function() { 7 | var celljson = ""; 8 | var celldata = []; 9 | var cells = {}; 10 | var map; 11 | var clickmarker; 12 | 13 | var minZoom = 0 14 | var maxZoom = 5 15 | var gridSize = 64 16 | 17 | // A quick extension to allow image layer rotation. 18 | L.RotateImageLayer = L.ImageOverlay.extend({ 19 | options: {rotation: 0}, 20 | _animateZoom: function(e){ 21 | L.ImageOverlay.prototype._animateZoom.call(this, e); 22 | var img = this._image; 23 | img.style[L.DomUtil.TRANSFORM] += ' rotate(' + this.options.rotation + 'deg)'; 24 | }, 25 | _reset: function(){ 26 | L.ImageOverlay.prototype._reset.call(this); 27 | var img = this._image; 28 | img.style[L.DomUtil.TRANSFORM] += ' rotate(' + this.options.rotation + 'deg)'; 29 | } 30 | }); 31 | L.rotateImageLayer = function(url, bounds, options) { 32 | return new L.RotateImageLayer(url, bounds, options); 33 | }; 34 | 35 | L.TileLayer.OffsetTileLayer = L.TileLayer.extend({ 36 | _getTilePos: function (coords) { 37 | var pos = L.TileLayer.prototype._getTilePos.call(this, coords); 38 | if(coords.z <= 1) { 39 | return pos.subtract([200, 420]); 40 | } else if(coords.z == 2){ 41 | return pos.subtract([1200, 1400]); 42 | } else { 43 | return pos; 44 | } 45 | } 46 | }); 47 | 48 | var markerIcon = L.icon({ 49 | iconUrl: './assets/img/marker.png', 50 | shadowUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png', 51 | // iconSize: [38,84], 52 | iconSize: [20,44], 53 | iconAnchor: [9,44], 54 | popupAnchor: [0,-50] 55 | }) 56 | 57 | L.tileLayer.offsetTileLayer = function(opts) { 58 | return new L.TileLayer.OffsetTileLayer(opts); 59 | }; 60 | 61 | // var tileLayer = L.tileLayer.offsetTileLayer('./img/{x},{y}.jpg', { 62 | // noWrap: true, 63 | // maxNativeZoom: 1, 64 | // minNativeZoom: 1, 65 | // tileSize:250, 66 | // className: "imgTileLayer" 67 | // // tileSize: 1000 68 | // }).addTo(map) 69 | 70 | let loadFile = async function(file, callback) { 71 | $.getJSON(file, function() { 72 | }).done(function(d) { 73 | if(typeof callback === 'function') { 74 | callback(d); 75 | } else { 76 | return d; 77 | } 78 | }).fail(function(d, e, f) { 79 | console.warn(file + " had a problem loading. Sorry!"); 80 | console.warn(d, e, f); 81 | }).always(function() { 82 | }); 83 | }; 84 | let xy = function(x, y) { 85 | let n = L.latLng; 86 | return L.Util.isArray(x) ? n(x[1], x[0]) : n(y, x) 87 | } 88 | 89 | let loadCells = function(json) { 90 | celljson = json; 91 | celldata = SMCellParser.parse(json) 92 | 93 | // var lakeTypes = {} 94 | var poiCoords = []; 95 | // var cells = {}; 96 | var stats = ""; 97 | var typeCounts = []; 98 | var poiCounts = []; 99 | celldata.forEach((cell) => { 100 | if(cells[cell.x] == undefined) { 101 | cells[cell.x] = {}; 102 | } 103 | cells[cell.x][cell.y] = cell; 104 | if(cell.poiType) { 105 | poiCoords.push([cell.x,cell.y]); 106 | } 107 | if(typeCounts[cell.type] == undefined) { 108 | typeCounts[cell.type] = 0; 109 | } 110 | typeCounts[cell.type] += 1; 111 | // if(cell.type == 'LAKE') { 112 | // var id = cell.tileid; 113 | // if(lakeTypes[id] == undefined) { 114 | // lakeTypes[id] = 1; 115 | // } else { 116 | // lakeTypes[id] = lakeTypes[id] + 1; 117 | // } 118 | // } 119 | }) 120 | stats += `Map Seed: ${celldata[0].seed}
` 121 | stats += `
Cell Types:
` 122 | 123 | var sortedKeys = Object.keys(typeCounts).sort(function(a,b) { 124 | return ( typeCounts[a] > typeCounts[b] ) ? -1 : 1; 125 | }) 126 | sortedKeys.forEach((t) => { 127 | var name = t; 128 | if(name == "NONE") {name = "NONE (Road/Cliff)"} 129 | stats += `` 130 | }) 131 | stats += "
${name}:${typeCounts[t]} (${Math.floor((typeCounts[t] / celldata.length) * 100)}%)
" 132 | // console.log(JSON.stringify(lakeTypes)) 133 | 134 | var poisSum = 0; 135 | poiCoords.forEach((coord) => { 136 | let x=coord[0],y=coord[1]; 137 | let cell = cells[x][y]; 138 | if(cell.poiType && cell.foundPoi == undefined) { 139 | if(poiCounts[cell.poiType] == undefined) { 140 | poiCounts[cell.poiType] = 0; 141 | } 142 | // if(cell.poiType != "POI_CRASHSITE_AREA") { 143 | poiCounts[cell.poiType] += 1; 144 | poisSum += 1; 145 | // } 146 | 147 | let size = POI_SIZES[cell.poiType] 148 | if(size != undefined) { 149 | // console.log(`found ${cell.poiType} at ${x},${y} with size ${size} with tile id ${cell.tileid}`) 150 | let mod = (gridSize / 2) 151 | let startx = mod * x; 152 | let starty = ( mod * y ) - mod; 153 | let endx = startx + ((size) * mod) 154 | let endy = starty + ((size) * mod) 155 | let poiUrl = getPoiUrl(cell.poiType,cell.tileid,x,y); 156 | if(!poiUrl) { 157 | if(cell.type != "LAKE" && cell.poiType != "POI_CRASHSITE_AREA") { 158 | console.log(`Missing POI Image at ${x},${y} for id ${cell.tileid} ${cell.poiType}`) 159 | } 160 | } 161 | if(poiUrl != undefined) { 162 | let rotation=0; 163 | switch(cell.rotation) { 164 | case 0: 165 | rotation=0; 166 | break; 167 | case 1: 168 | rotation=270; 169 | // startx += mod * size 170 | starty -= mod * size 171 | // endx += mod * size 172 | endy -= mod * size 173 | break; 174 | case 2: 175 | rotation=180; 176 | startx += mod * size 177 | starty -= mod * size 178 | endx += mod * size 179 | endy -= mod * size 180 | break; 181 | case 3: 182 | rotation=90; 183 | startx += mod * size 184 | // starty += mod * size 185 | endx += mod * size 186 | // endy += mod * size 187 | break; 188 | } 189 | let poiBounds = [xy(startx, starty), xy(endx, endy)]; 190 | L.rotateImageLayer(poiUrl, poiBounds, {/*opacity: 0.85,*/ pane:'poiPane',rotation:rotation}).addTo(map).bringToFront(); 191 | } 192 | //Mark all cells for this POI so we dont process them further 193 | for(var ix=0;ix poiCounts[b] ) ? -1 : 1; 212 | }) 213 | 214 | stats += `
POI Types:
` 215 | sortedKeys.forEach((t) => { 216 | stats += `` 217 | }) 218 | stats += "
${t}:${poiCounts[t]} (${Math.floor((poiCounts[t] / poisSum) * 100)}%)


" 219 | 220 | document.getElementById("stats-content").innerHTML = stats; 221 | document.getElementById("stats-toggle").addEventListener('click',function(event){ 222 | var content = document.getElementById("stats-content") 223 | if(content.classList.contains('collapsed')) { 224 | content.classList.remove("collapsed") 225 | document.getElementById("stats").classList.add("scroll-y") 226 | } else { 227 | content.classList.add("collapsed") 228 | document.getElementById("stats").classList.remove("scroll-y") 229 | } 230 | event.preventDefault(); 231 | }) 232 | 233 | L.GridLayer.DebugCoords = L.GridLayer.extend({ 234 | createTile: function (coords) { 235 | var x = coords.x; 236 | var y = coords.y; 237 | var tile = document.createElement('div'); 238 | tile.classList.add("cell") 239 | var inner = document.createElement('div'); 240 | inner.classList.add("innercell") 241 | // inner.innerHTML = [x, y * -1].join(', '); 242 | tile.appendChild(inner); 243 | 244 | //temp while matching grid to img 245 | // x -= 3; 246 | // y -= 6; 247 | 248 | // tile.innerHTML = [x, y].join(', '); 249 | var div = document.createElement('div'); 250 | inner.appendChild(div) 251 | try { 252 | var cell = cells[x][y * -1]; 253 | // var cell = cells[x][y]; 254 | // inner.innerHTML += "
"+[cell.xidx, cell.yidx].join(', ')+""; 255 | // div.innerHTML = cell.type; 256 | tile.classList.add(cell.type.toLowerCase()) 257 | if(cell.poiType && cell.type == 'LAKE') { 258 | div.innerHTML += "
"+cell.poiType+"" 259 | // div.innerHTML += "
"+cell.tileid+"
" 260 | } 261 | // div.innerHTML += "
R:"+cell.rotation+"
" 262 | // div.innerHTML += "
"+cell.tileid+"
" 263 | 264 | var turl = getTileURL(cell.tileid,cell.x,cell.y); 265 | if(!turl) { 266 | if(cell.type != "LAKE" && POI_SIZES[cell.poiType] == undefined) { 267 | console.log(`Missing tile at ${x},${y*-1} for id ${cell.tileid} ${cell.type}`) 268 | } 269 | if(cell.poiurlfound == true) { 270 | tile.classList.remove(cell.type.toLowerCase()) 271 | } 272 | } 273 | if(turl) { 274 | tile.classList.remove(cell.type.toLowerCase()) 275 | var img = document.createElement('img'); 276 | img.src = turl 277 | img.classList.add('tileimg') 278 | inner.appendChild(img); 279 | if(cell.rotation != 0) { 280 | img.classList.add('rot-' + cell.rotation) 281 | } 282 | } else 283 | if(cell.roads.length > 0) { 284 | var split = cell.roads.split(''); 285 | split.forEach((dir) => { 286 | var road = document.createElement('div'); 287 | road.classList.add("road-"+dir) 288 | // road.innerHTML = dir; 289 | inner.appendChild(road) 290 | var roadlines = document.createElement('div'); 291 | roadlines.classList.add("roadline"); 292 | road.appendChild(roadlines); 293 | }) 294 | tile.classList.remove("none"); 295 | tile.classList.add("meadow") 296 | } 297 | } catch(error) { 298 | // console.log(error) 299 | } 300 | // tile.style.outline = '1px solid black'; 301 | return tile; 302 | } 303 | }); 304 | 305 | L.gridLayer.debugCoords = function(opts) { 306 | return new L.GridLayer.DebugCoords(opts); 307 | }; 308 | 309 | var myGridLayer = L.gridLayer.debugCoords({ 310 | noWrap: true, 311 | maxNativeZoom: 1, 312 | minNativeZoom: 1, 313 | tileSize: gridSize, 314 | // opacity: 0.75, 315 | keepBuffer: 1, 316 | // bounds: [[-72,-55],[-71,55]], 317 | className: "gridLayer" 318 | }) 319 | map.addLayer( myGridLayer); 320 | 321 | // L.control.layers({"Grid": myGridLayer}, {"Img":tileLayer}).addTo(map); 322 | }; 323 | 324 | let init = function(inputjson) { 325 | // create the map 326 | map = L.map("map", { 327 | crs: L.CRS.Simple, 328 | minZoom: minZoom, 329 | maxZoom: maxZoom, 330 | zoomSnap: 0.5, 331 | zoomDelta: 0.5, 332 | wheelPxPerZoomLevel: 120 333 | }) 334 | map.attributionControl.addAttribution("sm_overview By The1Killer") 335 | 336 | map.createPane('poiPane').style.zIndex = 300; 337 | 338 | try { 339 | var hash = new L.Hash(map); 340 | if(window.location.hash == null || window.location.hash == "") { 341 | map.setView([-848,-858],1); 342 | } 343 | } catch (error) { 344 | map.setView([-848,-858],1); 345 | } 346 | 347 | if(inputjson) { 348 | loadCells(JSON.parse(inputjson)); 349 | } else { 350 | loadFile("./assets/json/cells.json",loadCells); 351 | } 352 | 353 | map.on('click', function(e) { 354 | // console.log(JSON.stringify(e)); 355 | // console.log(getTileURL(e.latlng.lat, e.latlng.lng, map.getZoom())); 356 | let xscalar = 2; 357 | let yscalar = 2; 358 | let x = Math.floor(e.latlng.lng * xscalar); 359 | let y = Math.floor(e.latlng.lat * yscalar) + 64; 360 | 361 | console.log("lnglat: ", Math.floor(e.latlng.lng),Math.floor(e.latlng.lat)); 362 | console.log("scaled ll: ", x,y); 363 | if(clickmarker) { 364 | clickmarker.remove(); 365 | } 366 | clickmarker = L.marker([e.latlng.lat, e.latlng.lng], {icon: markerIcon}).addTo(map); 367 | // clickmarker = L.marker([e.latlng.lat, e.latlng.lng]).addTo(map); 368 | clickmarker.bindPopup(contentForMarker(x,y)) 369 | clickmarker.openPopup(); 370 | // console.log("layer point:", Math.floor(e.layerPoint.x),Math.floor(e.layerPoint.y)); 371 | }); 372 | } 373 | 374 | function contentForMarker(x,y) { 375 | let cellX = Math.floor( x / 64) 376 | let cellY = Math.floor( y / 64) 377 | let cell = cells[cellX][cellY]; 378 | var ctype = cell.type 379 | if(ctype == "NONE") { 380 | ctype = "NONE (Road/Cliff)" 381 | } 382 | let poi = cell.poiType; 383 | var content = `Coords: ${x},${y}
384 | Cell: ${cellX},${cellY}
385 | Type: ${ctype}
386 | TileID: ${cell.tileid}
387 | Rotation: ${cell.rotation}` 388 | if(poi) { 389 | content += `
POI: ${poi}` 390 | } 391 | 392 | return content; 393 | } 394 | 395 | // // .toRad() fix 396 | // // from: http://stackoverflow.com/q/5260423/1418878 397 | // if (typeof(Number.prototype.toRad) === "undefined") { 398 | // Number.prototype.toRad = function() { 399 | // return this * Math.PI / 180; 400 | // } 401 | // } 402 | 403 | // function getTileURL(lat, lon, zoom) { 404 | // var xtile = parseInt(Math.floor( (lon + 180) / 360 * (1< 8000000) { 549 | // return './assets/img/lake_generic.jpg' 550 | // } 551 | if(x == -37 && y == -39) { 552 | return './assets/img/start_crashsite_-37_-39.jpg'; 553 | } else if(x == -37 && y == -39) { 554 | return './assets/img/start_crashsite_-37_-39.jpg'; 555 | } else if(x == -37 && y == -40) { 556 | return './assets/img/start_crashsite_-37_-40.jpg'; 557 | } else if(x == -36 && y == -40) { 558 | return './assets/img/start_crashsite_-36_-40.jpg'; 559 | } else if(x == -36 && y == -41) { 560 | return './assets/img/start_crashsite_-36_-41.jpg'; 561 | } 562 | } 563 | 564 | var POI_SIZES = { 565 | // "POI_ROAD":1, 566 | "POI_CRASHSITE_AREA":2, 567 | "POI_BUILDAREA_MEDIUM":2, 568 | "POI_MECHANICSTATION_MEDIUM":2, 569 | "POI_LABYRINTH_MEDIUM":2, 570 | "POI_CHEMLAKE_MEDIUM":2, 571 | "POI_RUIN_MEDIUM":2, 572 | "POI_FOREST_RUIN_MEDIUM":2, 573 | "POI_CAPSULESCRAPYARD_MEDIUM":2, 574 | "POI_PACKINGSTATIONVEG_MEDIUM": 2, 575 | "POI_PACKINGSTATIONFRUIT_MEDIUM": 2, 576 | "POI_LAKE_UNDERWATER_MEDIUM": 2, 577 | "POI_CAMP_LARGE":4, 578 | "POI_CRASHEDSHIP_LARGE":4, 579 | "POI_BURNTFOREST_FARMBOTSCRAPYARD_LARGE":4, 580 | "POI_WAREHOUSE2_LARGE":4, 581 | "POI_WAREHOUSE3_LARGE":4, 582 | "POI_WAREHOUSE4_LARGE":4, 583 | "POI_HIDEOUT_XL":8, 584 | "POI_RUINCITY_XL": 8, 585 | "POI_SILODISTRICT_XL": 8 586 | }; 587 | 588 | function getMap(){ return map;} 589 | 590 | function getClickMarker(){ return clickmarker;} 591 | 592 | return { 593 | init, 594 | getMap, 595 | getClickMarker 596 | } 597 | })(); -------------------------------------------------------------------------------- /SurvivalGame.lua: -------------------------------------------------------------------------------- 1 | dofile( "$SURVIVAL_DATA/Scripts/game/survival_shapes.lua" ) 2 | dofile( "$SURVIVAL_DATA/Scripts/game/survival_harvestable.lua" ) 3 | dofile( "$SURVIVAL_DATA/Scripts/game/survival_constants.lua" ) 4 | dofile( "$SURVIVAL_DATA/Scripts/game/managers/ElevatorManager.lua" ) 5 | dofile( "$SURVIVAL_DATA/Scripts/game/managers/RespawnManager.lua" ) 6 | dofile( "$SURVIVAL_DATA/Scripts/game/managers/BeaconManager.lua" ) 7 | dofile( "$SURVIVAL_DATA/Scripts/game/managers/UnitManager.lua" ) 8 | dofile( "$SURVIVAL_DATA/Scripts/game/managers/QuestManager.lua" ) 9 | dofile( "$SURVIVAL_DATA/Scripts/game/util/Timer.lua" ) 10 | 11 | dofile( "$SURVIVAL_DATA/Scripts/game/survival_units.lua" ) 12 | 13 | SurvivalGame = class( nil ) 14 | SurvivalGame.enableLimitedInventory = true 15 | SurvivalGame.enableRestrictions = true 16 | SurvivalGame.enableFuelConsumption = true 17 | SurvivalGame.enableAmmoConsumption = true 18 | SurvivalGame.enableUpgradeCost = true 19 | 20 | local SyncInterval = 400 -- 400 ticks | 10 seconds 21 | 22 | 23 | function SurvivalGame.server_onCreate( self ) 24 | print( "SurvivalGame.server_onCreate" ) 25 | self.sv = {} 26 | self.sv.saved = self.storage:load() 27 | print( "Saved:", self.sv.saved ) 28 | if self.sv.saved == nil then 29 | self.sv.saved = {} 30 | self.sv.saved.data = self.data 31 | printf( "Seed: %.0f", self.sv.saved.data.seed ) 32 | self.sv.saved.overworld = sm.world.createWorld( "$SURVIVAL_DATA/Scripts/game/worlds/Overworld.lua", "Overworld", { dev = self.sv.saved.data.dev }, self.sv.saved.data.seed ) 33 | self.storage:save( self.sv.saved ) 34 | end 35 | self.data = nil 36 | 37 | print( self.sv.saved.data ) 38 | if self.sv.saved.data and self.sv.saved.data.dev then 39 | g_godMode = true 40 | g_survivalDev = true 41 | end 42 | 43 | g_survivalDev = true 44 | 45 | self:loadCraftingRecipes() 46 | 47 | g_elevatorManager = ElevatorManager() 48 | g_elevatorManager:sv_onCreate() 49 | 50 | g_respawnManager = RespawnManager() 51 | g_respawnManager:sv_onCreate( self.sv.saved.overworld ) 52 | 53 | g_beaconManager = BeaconManager() 54 | g_beaconManager:sv_onCreate() 55 | 56 | g_unitManager = UnitManager() 57 | g_unitManager:sv_onCreate( self.sv.saved.overworld ) 58 | 59 | g_questManager = QuestManager() 60 | g_questManager:sv_onCreate( self ) 61 | g_questManager:sv_activateQuest( quest_use_terminal ) 62 | 63 | if g_survivalDev then 64 | g_questManager:sv_completeQuest( quest_pickup_logbook ) 65 | end 66 | 67 | -- Game script managed global warehouse table 68 | self.warehouses = sm.storage.load( STORAGE_CHANNEL_WAREHOUSES ) 69 | if self.warehouses then 70 | print( "Loaded warehouses:" ) 71 | print( self.warehouses ) 72 | else 73 | self.warehouses = {} 74 | self:sv_e_saveWarehouses() 75 | end 76 | g_warehouses = self.warehouses 77 | 78 | 79 | self.sv.time = sm.storage.load( STORAGE_CHANNEL_TIME ) 80 | if self.sv.time then 81 | print( "Loaded timeData:" ) 82 | print( self.sv.time ) 83 | else 84 | self.sv.time = {} 85 | self.sv.time.timeOfDay = 6 / 24 -- 06:00 86 | self.sv.time.timeProgress = true 87 | sm.storage.save( STORAGE_CHANNEL_TIME, self.sv.time ) 88 | end 89 | self:sv_updateClientData() 90 | 91 | self.sv.syncTimer = Timer() 92 | self.sv.syncTimer:start( 0 ) 93 | end 94 | 95 | function SurvivalGame.server_onRefresh( self ) 96 | g_craftingRecipes = nil 97 | g_refineryRecipes = nil 98 | self:loadCraftingRecipes() 99 | end 100 | 101 | function SurvivalGame.client_onCreate( self ) 102 | if true then 103 | sm.game.bindChatCommand( "/ammo", { { "int", "quantity", true } }, "cl_onChatCommand", "Give ammo (default 50)" ) 104 | sm.game.bindChatCommand( "/spudgun", {}, "cl_onChatCommand", "Give the spudgun" ) 105 | sm.game.bindChatCommand( "/gatling", {}, "cl_onChatCommand", "Give the potato gatling gun" ) 106 | sm.game.bindChatCommand( "/shotgun", {}, "cl_onChatCommand", "Give the fries shotgun" ) 107 | sm.game.bindChatCommand( "/sunshake", {}, "cl_onChatCommand", "Give 1 sunshake" ) 108 | sm.game.bindChatCommand( "/baguette", {}, "cl_onChatCommand", "Give 1 revival baguette" ) 109 | sm.game.bindChatCommand( "/keycard", {}, "cl_onChatCommand", "Give 1 keycard" ) 110 | sm.game.bindChatCommand( "/powercore", {}, "cl_onChatCommand", "Give 1 powercore" ) 111 | sm.game.bindChatCommand( "/components", { { "int", "quantity", true } }, "cl_onChatCommand", "Give components (default 10)" ) 112 | sm.game.bindChatCommand( "/glowsticks", { { "int", "quantity", true } }, "cl_onChatCommand", "Give components (default 10)" ) 113 | sm.game.bindChatCommand( "/tumble", { { "bool", "enable", true } }, "cl_onChatCommand", "Set tumble state" ) 114 | sm.game.bindChatCommand( "/god", {}, "cl_onChatCommand", "Mechanic characters will take no damage" ) 115 | sm.game.bindChatCommand( "/respawn", {}, "cl_onChatCommand", "Respawn at last bed (or at the crash site)" ) 116 | sm.game.bindChatCommand( "/encrypt", {}, "cl_onChatCommand", "Restrict interactions in all warehouses" ) 117 | sm.game.bindChatCommand( "/decrypt", {}, "cl_onChatCommand", "Unrestrict interactions in all warehouses" ) 118 | sm.game.bindChatCommand( "/limited", {}, "cl_onChatCommand", "Use the limited inventory" ) 119 | sm.game.bindChatCommand( "/unlimited", {}, "cl_onChatCommand", "Use the unlimited inventory" ) 120 | sm.game.bindChatCommand( "/ambush", { { "number", "magnitude", true }, { "int", "wave", true } }, "cl_onChatCommand", "Starts a 'random' encounter" ) 121 | sm.game.bindChatCommand( "/recreate", {}, "cl_onChatCommand", "Recreate world" ) 122 | sm.game.bindChatCommand( "/timeofday", { { "number", "timeOfDay", true } }, "cl_onChatCommand", "Sets the time of the day as a fraction (0.5=mid day)" ) 123 | sm.game.bindChatCommand( "/timeprogress", { { "bool", "enabled", true } }, "cl_onChatCommand", "Enables or disables time progress" ) 124 | sm.game.bindChatCommand( "/day", {}, "cl_onChatCommand", "Disable time progression and set time to daytime" ) 125 | sm.game.bindChatCommand( "/spawn", { { "string", "unitName", true } }, "cl_onChatCommand", "Spawn a unit: 'woc', 'tapebot', 'totebot', 'haybot'" ) 126 | sm.game.bindChatCommand( "/harvestable", { { "string", "harvestableName", true } }, "cl_onChatCommand", "Create a harvestable: 'tree', 'stone'" ) 127 | sm.game.bindChatCommand( "/cleardebug", {}, "cl_onChatCommand", "Clear debug draw objects" ) 128 | sm.game.bindChatCommand( "/export", { { "string", "name", false } }, "cl_onChatCommand", "Exports blueprint $SURVIVAL_DATA/LocalBlueprints/.blueprint" ) 129 | sm.game.bindChatCommand( "/import", { { "string", "name", false } }, "cl_onChatCommand", "Imports blueprint $SURVIVAL_DATA/LocalBlueprints/.blueprint" ) 130 | sm.game.bindChatCommand( "/starterkit", {}, "cl_onChatCommand", "Spawn a starter kit" ) 131 | sm.game.bindChatCommand( "/mechanicstartkit", {}, "cl_onChatCommand", "Spawn a starter kit for starting at mechanic station" ) 132 | sm.game.bindChatCommand( "/pipekit", {}, "cl_onChatCommand", "Spawn a pipe kit" ) 133 | sm.game.bindChatCommand( "/foodkit", {}, "cl_onChatCommand", "Spawn a food kit" ) 134 | sm.game.bindChatCommand( "/seedkit", {}, "cl_onChatCommand", "Spawn a seed kit" ) 135 | sm.game.bindChatCommand( "/die", {}, "cl_onChatCommand", "Kill the player" ) 136 | sm.game.bindChatCommand( "/sethp", { { "number", "hp", false } }, "cl_onChatCommand", "Set player hp value" ) 137 | sm.game.bindChatCommand( "/setwater", { { "number", "water", false } }, "cl_onChatCommand", "Set player water value" ) 138 | sm.game.bindChatCommand( "/setfood", { { "number", "food", false } }, "cl_onChatCommand", "Set player food value" ) 139 | sm.game.bindChatCommand( "/aggroall", {}, "cl_onChatCommand", "All hostile units will be made aware of the player's position" ) 140 | sm.game.bindChatCommand( "/goto", { { "string", "name", false } }, "cl_onChatCommand", "Teleport to predefined position" ) 141 | sm.game.bindChatCommand( "/raid", { { "int", "level", false }, { "int", "wave", true }, { "number", "hours", true } }, "cl_onChatCommand", "Start a level raid at player position at wave in hours." ) 142 | sm.game.bindChatCommand( "/stopraid", {}, "cl_onChatCommand", "Cancel all incoming raids" ) 143 | sm.game.bindChatCommand( "/disableraids", { { "bool", "enabled", false } }, "cl_onChatCommand", "Disable raids if true" ) 144 | sm.game.bindChatCommand( "/camera", {}, "cl_onChatCommand", "Spawn a SplineCamera tool" ) 145 | 146 | sm.game.bindChatCommand( "/printglobals", {}, "cl_onChatCommand", "Print all global lua variables" ) 147 | sm.game.bindChatCommand( "/clearpathnodes", {}, "cl_onChatCommand", "Clear all path nodes in overworld" ) 148 | sm.game.bindChatCommand( "/enablepathpotatoes", { { "bool", "enable", true } }, "cl_onChatCommand", "Creates path nodes at potato hits in overworld and links to previous node" ) 149 | 150 | sm.game.bindChatCommand( "/activatequest", { { "string", "uuid", true } }, "cl_onChatCommand", "Activate quest" ) 151 | sm.game.bindChatCommand( "/completequest", { { "string", "uuid", true } }, "cl_onChatCommand", "Complete quest" ) 152 | 153 | --custom 154 | sm.game.bindChatCommand( "/cell", { { "string", "x,y,z", false } }, "cl_onChatCommand", "Teleport to numerical cell position" ) 155 | sm.game.bindChatCommand( "/tp", { { "string", "x,y,z", false } }, "cl_onChatCommand", "Teleport to numerical position" ) 156 | sm.game.bindChatCommand( "/dir", { }, "cl_onChatCommand", "Tell you direction vector you are looking at." ) 157 | end 158 | 159 | self.cl = {} 160 | self.cl.time = {} 161 | self.cl.time.timeOfDay = 0.0 162 | self.cl.time.timeProgress = true 163 | 164 | self:loadCraftingRecipes() 165 | 166 | if g_respawnManager == nil then 167 | assert( not sm.isHost ) 168 | g_respawnManager = RespawnManager() 169 | end 170 | g_respawnManager:cl_onCreate() 171 | 172 | if g_beaconManager == nil then 173 | assert( not sm.isHost ) 174 | g_beaconManager = BeaconManager() 175 | end 176 | g_beaconManager:cl_onCreate() 177 | 178 | if g_unitManager == nil then 179 | assert( not sm.isHost ) 180 | g_unitManager = UnitManager() 181 | end 182 | g_unitManager:cl_onCreate() 183 | 184 | if g_questManager == nil then 185 | assert( not sm.isHost ) 186 | g_questManager = QuestManager() 187 | end 188 | g_questManager:cl_onCreate() 189 | 190 | -- Music effect 191 | g_survivalMusic = sm.effect.createEffect( "SurvivalMusic" ) 192 | assert(g_survivalMusic) 193 | 194 | -- Survival HUD 195 | g_survivalHud = sm.gui.createSurvivalHudGui() 196 | assert(g_survivalHud) 197 | end 198 | 199 | function SurvivalGame.client_onClientDataUpdate( self, clientData ) 200 | self.cl.time = clientData.time 201 | end 202 | 203 | function SurvivalGame.cl_n_questMsg( self, params ) 204 | g_questManager:cl_handleMsg( params ) 205 | end 206 | 207 | function SurvivalGame.loadCraftingRecipes( self ) 208 | -- Preload all crafting recipes 209 | if not g_craftingRecipes then 210 | local recipePaths = { 211 | workbench = "$SURVIVAL_DATA/CraftingRecipes/workbench.json", 212 | dispenser = "$SURVIVAL_DATA/CraftingRecipes/dispenser.json", 213 | cookbot = "$SURVIVAL_DATA/CraftingRecipes/cookbot.json", 214 | craftbot = "$SURVIVAL_DATA/CraftingRecipes/craftbot.json", 215 | dressbot = "$SURVIVAL_DATA/CraftingRecipes/dressbot.json" 216 | } 217 | g_craftingRecipes = {} 218 | for name, path in pairs( recipePaths ) do 219 | local json = sm.json.open( path ) 220 | local recipes = {} 221 | local recipesByIndex = {} 222 | for idx, recipe in ipairs( json ) do 223 | 224 | recipe.craftTime = math.ceil( recipe.craftTime * 40 ) -- Seconds to ticks 225 | for _,ingredient in ipairs( recipe.ingredientList ) do 226 | ingredient.itemId = sm.uuid.new( ingredient.itemId ) -- Prepare uuid 227 | end 228 | 229 | recipes[recipe.itemId] = recipe 230 | recipesByIndex[idx] = recipe 231 | 232 | end 233 | -- NOTE(daniel): Wardrobe is using 'recipes' by uuid, crafter is using 'recipesByIndex' 234 | g_craftingRecipes[name] = { path = path, recipes = recipes, recipesByIndex = recipesByIndex } 235 | end 236 | end 237 | 238 | -- Preload refinery recipes 239 | if not g_refineryRecipes then 240 | g_refineryRecipes = sm.json.open( "$SURVIVAL_DATA/CraftingRecipes/refinery.json" ) 241 | for _,recipe in pairs( g_refineryRecipes ) do 242 | recipe.itemId = sm.uuid.new( recipe.itemId ) -- Prepare uuid 243 | end 244 | end 245 | end 246 | 247 | function SurvivalGame.server_onFixedUpdate( self, timeStep ) 248 | -- Update time 249 | local prevTime = self.sv.time.timeOfDay 250 | if self.sv.time.timeProgress then 251 | self.sv.time.timeOfDay = self.sv.time.timeOfDay + timeStep / DAYCYCLE_TIME 252 | end 253 | local newDay = self.sv.time.timeOfDay >= 1.0 254 | if newDay then 255 | self.sv.time.timeOfDay = math.fmod( self.sv.time.timeOfDay, 1 ) 256 | end 257 | 258 | if self.sv.time.timeOfDay >= DAYCYCLE_DAWN and prevTime < DAYCYCLE_DAWN then 259 | g_unitManager:sv_initNewDay() 260 | end 261 | 262 | -- Ambush 263 | --if not g_survivalDev then 264 | -- for _,ambush in ipairs( AMBUSHES ) do 265 | -- if self.sv.time.timeOfDay >= ambush.time and ( prevTime < ambush.time or newDay ) then 266 | -- self:sv_ambush( { magnitude = ambush.magnitude, wave = ambush.wave } ) 267 | -- end 268 | -- end 269 | --end 270 | 271 | -- Client and save sync 272 | self.sv.syncTimer:tick() 273 | if self.sv.syncTimer:done() then 274 | self.sv.syncTimer:start( SyncInterval ) 275 | sm.storage.save( STORAGE_CHANNEL_TIME, self.sv.time ) 276 | self:sv_updateClientData() 277 | end 278 | 279 | g_elevatorManager:sv_onFixedUpdate() 280 | g_unitManager:sv_onFixedUpdate() 281 | g_questManager:sv_onFixedUpdate() 282 | end 283 | 284 | function SurvivalGame.sv_updateClientData( self ) 285 | self.network:setClientData( { time = self.sv.time } ) 286 | end 287 | 288 | function SurvivalGame.client_onUpdate( self, dt ) 289 | -- Update time 290 | if self.cl.time.timeProgress then 291 | self.cl.time.timeOfDay = math.fmod( self.cl.time.timeOfDay + dt / DAYCYCLE_TIME, 1.0 ) 292 | end 293 | sm.game.setTimeOfDay( self.cl.time.timeOfDay ) 294 | 295 | -- Update lighting values 296 | local index = 1 297 | while index < #DAYCYCLE_LIGHTING_TIMES and self.cl.time.timeOfDay >= DAYCYCLE_LIGHTING_TIMES[index + 1] do 298 | index = index + 1 299 | end 300 | assert( index <= #DAYCYCLE_LIGHTING_TIMES ) 301 | 302 | local light = 0.0 303 | if index < #DAYCYCLE_LIGHTING_TIMES then 304 | local p = ( self.cl.time.timeOfDay - DAYCYCLE_LIGHTING_TIMES[index] ) / ( DAYCYCLE_LIGHTING_TIMES[index + 1] - DAYCYCLE_LIGHTING_TIMES[index] ) 305 | light = sm.util.lerp( DAYCYCLE_LIGHTING_VALUES[index], DAYCYCLE_LIGHTING_VALUES[index + 1], p ) 306 | else 307 | light = DAYCYCLE_LIGHTING_VALUES[index] 308 | end 309 | sm.render.setOutdoorLighting( light ) 310 | end 311 | 312 | function SurvivalGame.client_showMessage( self, params ) 313 | sm.gui.chatMessage( params ) 314 | end 315 | 316 | function SurvivalGame.cl_onChatCommand( self, params ) 317 | if params[1] == "/ammo" then 318 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = obj_plantables_potato, quantity = ( params[2] or 50 ) } ) 319 | elseif params[1] == "/spudgun" then 320 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = tool_spudgun, quantity = 1 } ) 321 | elseif params[1] == "/gatling" then 322 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = tool_gatling, quantity = 1 } ) 323 | elseif params[1] == "/shotgun" then 324 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = tool_shotgun, quantity = 1 } ) 325 | elseif params[1] == "/sunshake" then 326 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = obj_consumable_sunshake, quantity = 1 } ) 327 | elseif params[1] == "/baguette" then 328 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = obj_consumable_longsandwich, quantity = 1 } ) 329 | elseif params[1] == "/keycard" then 330 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = obj_survivalobject_keycard, quantity = 1 } ) 331 | elseif params[1] == "/camera" then 332 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = sm.uuid.new( "5bbe87d3-d60a-48b5-9ca9-0086c80ebf7f" ), quantity = 1 } ) 333 | elseif params[1] == "/powercore" then 334 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = obj_survivalobject_powercore, quantity = 1 } ) 335 | elseif params[1] == "/components" then 336 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = obj_consumable_component, quantity = ( params[2] or 10 ) } ) 337 | elseif params[1] == "/glowsticks" then 338 | self.network:sendToServer( "sv_giveItem", { player = sm.localPlayer.getPlayer(), item = obj_consumable_glowstick, quantity = ( params[2] or 10 ) } ) 339 | elseif params[1] == "/god" then 340 | self.network:sendToServer( "sv_switchGodMode" ) 341 | elseif params[1] == "/encrypt" then 342 | self.network:sendToServer( "sv_enableRestrictions", true ) 343 | elseif params[1] == "/decrypt" then 344 | self.network:sendToServer( "sv_enableRestrictions", false ) 345 | elseif params[1] == "/unlimited" then 346 | self.network:sendToServer( "sv_setLimitedInventory", false ) 347 | elseif params[1] == "/limited" then 348 | self.network:sendToServer( "sv_setLimitedInventory", true ) 349 | elseif params[1] == "/ambush" then 350 | self.network:sendToServer( "sv_ambush", { magnitude = params[2] or 1, wave = params[3] } ) 351 | elseif params[1] == "/recreate" then 352 | self.network:sendToServer( "sv_recreateWorld", sm.localPlayer.getPlayer() ) 353 | elseif params[1] == "/timeofday" then 354 | self.network:sendToServer( "sv_setTimeOfDay", params[2] ) 355 | elseif params[1] == "/timeprogress" then 356 | self.network:sendToServer( "sv_setTimeProgress", params[2] ) 357 | elseif params[1] == "/day" then 358 | self.network:sendToServer( "sv_setTimeOfDay", 0.5 ) 359 | self.network:sendToServer( "sv_setTimeProgress", false ) 360 | elseif params[1] == "/die" then 361 | self.network:sendToServer( "sv_killPlayer", { player = sm.localPlayer.getPlayer() }) 362 | elseif params[1] == "/spawn" then 363 | local rayCastValid, rayCastResult = sm.localPlayer.getRaycast( 100 ) 364 | if rayCastValid then 365 | local spawnParams = { 366 | uuid = sm.uuid.new( "00000000-0000-0000-0000-000000000000" ), 367 | world = sm.localPlayer.getPlayer().character:getWorld(), 368 | position = rayCastResult.pointWorld, 369 | yaw = 0.0 370 | } 371 | if params[2] == "woc" then 372 | spawnParams.uuid = unit_woc 373 | elseif params[2] == "tapebot" or params[2] == "tb" then 374 | spawnParams.uuid = unit_tapebot 375 | elseif params[2] == "redtapebot" or params[2] == "rtb" then 376 | spawnParams.uuid = unit_tapebot_red 377 | elseif params[2] == "totebot" or params[2] == "green" or params[2] == "t" then 378 | spawnParams.uuid = unit_totebot_green 379 | elseif params[2] == "haybot" or params[2] == "h" then 380 | spawnParams.uuid = unit_haybot 381 | elseif params[2] == "worm" then 382 | spawnParams.uuid = unit_worm 383 | elseif params[2] == "farmbot" or params[2] == "f" then 384 | spawnParams.uuid = unit_farmbot 385 | elseif params[2] then 386 | spawnParams.uuid = sm.uuid.new( params[2] ) 387 | end 388 | self.network:sendToServer( "sv_spawnUnit", spawnParams ) 389 | end 390 | elseif params[1] == "/harvestable" then 391 | local character = sm.localPlayer.getPlayer().character 392 | if character then 393 | local harvestableUuid = sm.uuid.new( "00000000-0000-0000-0000-000000000000" ) 394 | if params[2] == "tree" then 395 | harvestableUuid = sm.uuid.new( "c4ea19d3-2469-4059-9f13-3ddb4f7e0b79" ) 396 | elseif params[2] == "stone" then 397 | harvestableUuid = sm.uuid.new( "0d3362ae-4cb3-42ae-8a08-d3f9ed79e274" ) 398 | elseif params[2] == "soil" then 399 | harvestableUuid = hvs_soil 400 | elseif params[2] == "fencelong" then 401 | harvestableUuid = sm.uuid.new( "c0f19413-6d8e-4b20-819a-949553242259" ) 402 | elseif params[2] == "fenceshort" then 403 | harvestableUuid = sm.uuid.new( "144b5e79-483e-4da6-86ab-c575d0fdcd11" ) 404 | elseif params[2] == "fencecorner" then 405 | harvestableUuid = sm.uuid.new( "ead875db-59d0-45f5-861e-b3075e1f8434" ) 406 | elseif params[2] == "beehive" then 407 | harvestableUuid = hvs_farmables_beehive 408 | elseif params[2] == "cotton" then 409 | harvestableUuid = hvs_farmables_cottonplant 410 | elseif params[2] then 411 | harvestableUuid = sm.uuid.new( params[2] ) 412 | end 413 | local spawnParams = { world = character:getWorld(), uuid = harvestableUuid, position = character.worldPosition, quat = sm.vec3.getRotation( sm.vec3.new( 0, 1, 0 ), sm.vec3.new( 0, 0, 1 ) ) } 414 | self.network:sendToServer( "sv_spawnHarvestable", spawnParams ) 415 | end 416 | elseif params[1] == "/cleardebug" then 417 | sm.debugDraw.clear() 418 | elseif params[1] == "/export" then 419 | local rayCastValid, rayCastResult = sm.localPlayer.getRaycast( 100 ) 420 | if rayCastValid and rayCastResult.type == "body" then 421 | local importParams = { 422 | name = params[2], 423 | body = rayCastResult:getBody() 424 | } 425 | self.network:sendToServer( "sv_exportCreation", importParams ) 426 | end 427 | elseif params[1] == "/import" then 428 | local rayCastValid, rayCastResult = sm.localPlayer.getRaycast( 100 ) 429 | if rayCastValid then 430 | local importParams = { 431 | world = sm.localPlayer.getPlayer().character:getWorld(), 432 | name = params[2], 433 | position = rayCastResult.pointWorld 434 | } 435 | self.network:sendToServer( "sv_importCreation", importParams ) 436 | end 437 | else 438 | self.network:sendToServer( "sv_onChatCommand", params ) 439 | end 440 | end 441 | 442 | function SurvivalGame.sv_giveItem( self, params ) 443 | sm.container.beginTransaction() 444 | sm.container.collect( params.player:getInventory(), params.item, params.quantity, false ) 445 | sm.container.endTransaction() 446 | end 447 | 448 | function SurvivalGame.sv_switchGodMode( self ) 449 | g_godMode = not g_godMode 450 | self.network:sendToClients( "client_showMessage", "GODMODE: " .. ( g_godMode and "On" or "Off" ) ) 451 | end 452 | 453 | function SurvivalGame.sv_enableRestrictions( self, state ) 454 | sm.game.enableRestrictions( state ) 455 | self.network:sendToClients( "client_showMessage", ( state and "Restricted" or "Unrestricted" ) ) 456 | end 457 | 458 | function SurvivalGame.sv_setLimitedInventory( self, state ) 459 | sm.game.setLimitedInventory( state ) 460 | self.network:sendToClients( "client_showMessage", ( state and "Limited inventory" or "Unlimited inventory" ) ) 461 | end 462 | 463 | function SurvivalGame.sv_ambush( self, params ) 464 | if sm.exists( self.sv.saved.overworld ) then 465 | sm.event.sendToWorld( self.sv.saved.overworld, "sv_ambush", params ) 466 | end 467 | end 468 | 469 | function SurvivalGame.sv_recreateWorld( self, player ) 470 | local character = player:getCharacter() 471 | if character:getWorld() == self.sv.saved.overworld then 472 | self.sv.saved.overworld:destroy() 473 | self.sv.saved.overworld = sm.world.createWorld( "$SURVIVAL_DATA/Scripts/game/worlds/Overworld.lua", "Overworld", { dev = g_survivalDev }, self.sv.saved.data.seed ) 474 | self.storage:save( self.sv.saved ) 475 | 476 | local params = { pos = character:getWorldPosition(), dir = character:getDirection() } 477 | self.sv.saved.overworld:loadCell( math.floor( params.pos.x/64 ), math.floor( params.pos.y/64 ), player, "sv_recreatePlayerCharacter", params ) 478 | 479 | self.network:sendToClients( "client_showMessage", "Recreating world" ) 480 | else 481 | self.network:sendToClients( "client_showMessage", "Recreate world only allowed for overworld" ) 482 | end 483 | end 484 | 485 | function SurvivalGame.sv_setTimeOfDay( self, timeOfDay ) 486 | if timeOfDay then 487 | self.sv.time.timeOfDay = timeOfDay 488 | self.sv.syncTimer.count = self.sv.syncTimer.ticks -- Force sync 489 | end 490 | self.network:sendToClients( "client_showMessage", ( "Time of day set to "..self.sv.time.timeOfDay ) ) 491 | end 492 | 493 | function SurvivalGame.sv_setTimeProgress( self, timeProgress ) 494 | if timeProgress ~= nil then 495 | self.sv.time.timeProgress = timeProgress 496 | self.sv.syncTimer.count = self.sv.syncTimer.ticks -- Force sync 497 | end 498 | self.network:sendToClients( "client_showMessage", ( "Time scale set to "..( self.sv.time.timeProgress and "on" or "off ") ) ) 499 | end 500 | 501 | function SurvivalGame.sv_killPlayer( self, params ) 502 | params.damage = 9999 503 | sm.event.sendToPlayer( params.player, "sv_e_receiveDamage", params ) 504 | end 505 | 506 | function SurvivalGame.sv_spawnUnit( self, params ) 507 | sm.event.sendToWorld( params.world, "sv_e_spawnUnit", params ) 508 | end 509 | 510 | function SurvivalGame.sv_spawnHarvestable( self, params ) 511 | sm.event.sendToWorld( params.world, "sv_spawnHarvestable", params ) 512 | end 513 | 514 | function SurvivalGame.sv_exportCreation( self, params ) 515 | local obj = sm.json.parseJsonString( sm.creation.exportToString( params.body ) ) 516 | sm.json.save( obj, "$SURVIVAL_DATA/LocalBlueprints/"..params.name..".blueprint" ) 517 | end 518 | 519 | function SurvivalGame.sv_importCreation( self, params ) 520 | sm.creation.importFromFile( params.world, "$SURVIVAL_DATA/LocalBlueprints/"..params.name..".blueprint", params.position ) 521 | end 522 | 523 | function SurvivalGame.sv_onChatCommand( self, params, player ) 524 | if params[1] == "/tumble" then 525 | if params[2] ~= nil then 526 | player.character:setTumbling( params[2] ) 527 | end 528 | if player.character:isTumbling() then 529 | self.network:sendToClients( "client_showMessage", "Player is tumbling" ) 530 | else 531 | self.network:sendToClients( "client_showMessage", "Player is not tumbling" ) 532 | end 533 | 534 | elseif params[1] == "/sethp" then 535 | sm.event.sendToPlayer( player, "sv_e_debug", { hp = params[2] } ) 536 | 537 | elseif params[1] == "/setwater" then 538 | sm.event.sendToPlayer( player, "sv_e_debug", { water = params[2] } ) 539 | 540 | elseif params[1] == "/setfood" then 541 | sm.event.sendToPlayer( player, "sv_e_debug", { food = params[2] } ) 542 | 543 | elseif params[1] == "/goto" then 544 | local pos 545 | if params[2] == "here" then 546 | pos = player.character:getWorldPosition() 547 | elseif params[2] == "start" then 548 | pos = START_AREA_SPAWN_POINT 549 | elseif params[2] == "hideout" then 550 | pos = sm.vec3.new( 32, -1248, 100 ) 551 | else 552 | self.network:sendToClient( player, "client_showMessage", "Unknown place" ) 553 | end 554 | if pos then 555 | local cellX, cellY = math.floor( pos.x/64 ), math.floor( pos.y/64 ) 556 | self.sv.saved.overworld:loadCell( cellX, cellY, player, "sv_recreatePlayerCharacter", { pos = pos, dir = player.character:getDirection() } ) 557 | end 558 | 559 | elseif params[1] == "/respawn" then 560 | sm.event.sendToPlayer( player, "sv_e_respawn" ) 561 | 562 | elseif params[1] == "/printglobals" then 563 | print( "Globals:" ) 564 | for k,_ in pairs(_G) do 565 | print( k ) 566 | end 567 | 568 | elseif params[1] == "/activatequest" then 569 | local uuid = params[2] 570 | if uuid then 571 | g_questManager:sv_activateQuest( uuid ) 572 | else 573 | g_questManager:sv_activateAllQuests() 574 | end 575 | elseif params[1] == "/completequest" then 576 | local uuid = params[2] 577 | if uuid then 578 | g_questManager:sv_completeQuest( uuid ) 579 | else 580 | g_questManager:sv_completeAllQuests() 581 | end 582 | elseif params[1] == "/cell" then 583 | local pos 584 | if params[2] == "here" then 585 | pos = player.character:getWorldPosition() 586 | local cellX, cellY = math.floor( pos.x/64 ), math.floor( pos.y/64 ) 587 | print("x:"..cellX.." y:"..cellY) 588 | self.network:sendToClient( player, "client_showMessage", "x:"..cellX.." y:"..cellY.." z:"..math.floor(pos.z) ) 589 | --self.network:sendToClient( player, "client_showMessage", "looking x:"..dir.x.." y:"..dir.y.." z:"..dir.z ) 590 | return 591 | else 592 | if params[2] ~= nil then 593 | local cellX,cellY,z = params[2]:match("([^,]+),([^,]+),([^,]+)") 594 | local x = cellX * 64 595 | local y = cellY * 64 596 | x = x + 32 597 | y = y + 32 598 | pos = sm.vec3.new( tonumber(x),tonumber(y),tonumber(z) ) 599 | else 600 | self.network:sendToClient( player, "client_showMessage", "Usage: /tp x,y,z or /tp here to see current coords" ) 601 | end 602 | end 603 | if pos then 604 | local cellX, cellY = math.floor( pos.x/64 ), math.floor( pos.y/64 ) 605 | print("x:"..cellX.." y:"..cellY) 606 | local dir = player.character:getDirection() 607 | dir.x = 0 608 | dir.y = 1 609 | dir.z = -1 610 | self.sv.saved.overworld:loadCell( cellX, cellY, player, "sv_recreatePlayerCharacter", { pos = pos, dir = dir } ) 611 | 612 | end 613 | elseif params[1] == "/tp" then 614 | local pos 615 | if params[2] == "here" then 616 | pos = player.character:getWorldPosition() 617 | local dir = player.character:getDirection() 618 | self.network:sendToClient( player, "client_showMessage", "x:"..math.floor(pos.x).." y:"..math.floor(pos.y).." z:"..math.floor(pos.z) ) 619 | --self.network:sendToClient( player, "client_showMessage", "looking x:"..dir.x.." y:"..dir.y.." z:"..dir.z ) 620 | return 621 | elseif params[2] == "cell" then 622 | pos = player.character:getWorldPosition() 623 | local cellX, cellY = math.floor( pos.x/64 ), math.floor( pos.y/64 ) 624 | self.network:sendToClient( player, "client_showMessage", "x:"..cellX.." y:"..cellY ) 625 | --self.network:sendToClient( player, "client_showMessage", "looking x:"..dir.x.." y:"..dir.y.." z:"..dir.z ) 626 | return 627 | else 628 | if params[2] ~= nil then 629 | local x,y,z = params[2]:match("([^,]+),([^,]+),([^,]+)") 630 | pos = sm.vec3.new( tonumber(x),tonumber(y),tonumber(z) ) 631 | else 632 | self.network:sendToClient( player, "client_showMessage", "Usage: /tp x,y,z or /tp here to see current coords" ) 633 | end 634 | end 635 | if pos then 636 | local cellX, cellY = math.floor( pos.x/64 ), math.floor( pos.y/64 ) 637 | print("x:"..cellX.." y:"..cellY) 638 | local dir = player.character:getDirection() 639 | dir.x = 0 640 | dir.y = 1 641 | dir.z = -1 642 | self.sv.saved.overworld:loadCell( cellX, cellY, player, "sv_recreatePlayerCharacter", { pos = pos, dir = dir } ) 643 | end 644 | elseif params[1] == "/clearpathnodes" 645 | or params[1] == "/enablepathpotatoes" 646 | or params[1] == "/starterkit" 647 | or params[1] == "/mechanicstartkit" 648 | or params[1] == "/pipekit" 649 | or params[1] == "/foodkit" 650 | or params[1] == "/seedkit" 651 | or params[1] == "/aggroall" 652 | or params[1] == "/raid" 653 | or params[1] == "/stopraid" 654 | or params[1] == "/disableraids" 655 | then 656 | params.player = player 657 | sm.event.sendToWorld( player.character:getWorld(), "sv_e_onChatCommand", params ) 658 | end 659 | end 660 | 661 | function SurvivalGame.server_onPlayerJoined( self, player, newPlayer ) 662 | print( player.name, "joined the game" ) 663 | 664 | if newPlayer then --Player is first time joiners 665 | local inventory = player:getInventory() 666 | 667 | sm.container.beginTransaction() 668 | 669 | if g_survivalDev then 670 | --Hotbar 671 | sm.container.setItem( inventory, 0, tool_sledgehammer, 1 ) 672 | sm.container.setItem( inventory, 1, tool_spudgun, 1 ) 673 | sm.container.setItem( inventory, 7, obj_plantables_potato, 50 ) 674 | sm.container.setItem( inventory, 8, tool_lift, 1 ) 675 | sm.container.setItem( inventory, 9, tool_connect, 1 ) 676 | 677 | --Actual inventory 678 | sm.container.setItem( inventory, 10, tool_paint, 1 ) 679 | sm.container.setItem( inventory, 11, tool_weld, 1 ) 680 | else 681 | sm.container.setItem( inventory, 0, tool_sledgehammer, 1 ) 682 | sm.container.setItem( inventory, 1, tool_lift, 1 ) 683 | end 684 | 685 | sm.container.endTransaction() 686 | 687 | local spawnPoint = START_AREA_SPAWN_POINT 688 | if g_survivalDev then 689 | spawnPoint = SURVIVAL_DEV_SPAWN_POINT 690 | end 691 | if not sm.exists( self.sv.saved.overworld ) then 692 | sm.world.loadWorld( self.sv.saved.overworld ) 693 | end 694 | self.sv.saved.overworld:loadCell( math.floor( spawnPoint.x/64 ), math.floor( spawnPoint.y/64 ), player, "sv_createNewPlayer" ) 695 | else 696 | local inventory = player:getInventory() 697 | 698 | local sledgehammerCount = sm.container.totalQuantity( inventory, tool_sledgehammer ) 699 | if sledgehammerCount == 0 then 700 | sm.container.beginTransaction() 701 | sm.container.collect( inventory, tool_sledgehammer, 1 ) 702 | sm.container.endTransaction() 703 | elseif sledgehammerCount > 1 then 704 | sm.container.beginTransaction() 705 | sm.container.spend( inventory, tool_sledgehammer, sledgehammerCount - 1 ) 706 | sm.container.endTransaction() 707 | end 708 | 709 | local liftCount = sm.container.totalQuantity( inventory, tool_lift ) 710 | if liftCount == 0 then 711 | sm.container.beginTransaction() 712 | sm.container.collect( inventory, tool_lift, 1 ) 713 | sm.container.endTransaction() 714 | elseif liftCount > 1 then 715 | sm.container.beginTransaction() 716 | sm.container.spend( inventory, tool_lift, liftCount - 1 ) 717 | sm.container.endTransaction() 718 | end 719 | end 720 | g_unitManager:sv_onPlayerJoined( player ) 721 | g_questManager:sv_onPlayerJoined( player ) 722 | end 723 | 724 | function SurvivalGame.server_onPlayerLeft( self, player ) 725 | print( player.name, "left the game" ) 726 | g_elevatorManager:sv_onPlayerLeft( player ) 727 | end 728 | 729 | function SurvivalGame.sv_e_saveWarehouses( self ) 730 | sm.storage.save( STORAGE_CHANNEL_WAREHOUSES, self.warehouses ) 731 | print( "Saved warehouses:" ) 732 | print( self.warehouses ) 733 | end 734 | 735 | function SurvivalGame.sv_e_requestWarehouseRestrictions( self, params ) 736 | -- Send the warehouse restrictions to the world that asked 737 | print("SurvivalGame.sv_e_requestWarehouseRestrictions") 738 | 739 | -- Warehouse get 740 | local warehouse = nil 741 | if params.warehouseIndex then 742 | warehouse = self.warehouses[params.warehouseIndex] 743 | end 744 | if warehouse then 745 | sm.event.sendToWorld( params.world, "server_updateRestrictions", warehouse.restrictions ) 746 | end 747 | end 748 | 749 | function SurvivalGame.sv_e_setWarehouseRestrictions( self, params ) 750 | -- Set the restrictions for this warehouse and propagate the restrictions to all floors 751 | 752 | -- Warehouse get 753 | local warehouse = nil 754 | if params.warehouseIndex then 755 | warehouse = self.warehouses[params.warehouseIndex] 756 | end 757 | 758 | if warehouse then 759 | for _, newRestrictionSetting in pairs( params.restrictions ) do 760 | if warehouse.restrictions[newRestrictionSetting.name] then 761 | warehouse.restrictions[newRestrictionSetting.name].state = newRestrictionSetting.state 762 | else 763 | warehouse.restrictions[newRestrictionSetting.name] = newRestrictionSetting 764 | end 765 | end 766 | self.warehouses[params.warehouseIndex] = warehouse 767 | self:sv_e_saveWarehouses() 768 | 769 | for i, world in ipairs( warehouse.worlds ) do 770 | if sm.exists( world ) then 771 | sm.event.sendToWorld( world, "server_updateRestrictions", warehouse.restrictions ) 772 | end 773 | end 774 | end 775 | end 776 | 777 | function SurvivalGame.sv_e_createElevatorDestination( self, params ) 778 | print( "SurvivalGame.sv_e_createElevatorDestination" ) 779 | print( params ) 780 | 781 | -- Warehouse get or create 782 | local warehouse 783 | if params.warehouseIndex then 784 | warehouse = self.warehouses[params.warehouseIndex] 785 | else 786 | assert( params.name == "ELEVATOR_ENTRANCE" ) 787 | warehouse = {} 788 | warehouse.world = params.portal:getWorldA() 789 | warehouse.worlds = {} 790 | warehouse.exits = params.exits 791 | warehouse.maxLevels = params.maxLevels 792 | warehouse.index = #self.warehouses + 1 793 | warehouse.restrictions = { erasable = { name = "erasable", state = false }, connectable = { name = "connectable", state = false } } 794 | self.warehouses[#self.warehouses + 1] = warehouse 795 | self:sv_e_saveWarehouses() 796 | end 797 | 798 | 799 | -- Level up 800 | local level 801 | if params.level then 802 | if params.name == "ELEVATOR_UP" then 803 | level = params.level + 1 804 | elseif params.name == "ELEVATOR_DOWN" then 805 | level = params.level - 1 806 | elseif params.name == "ELEVATOR_EXIT" then 807 | if #warehouse.exits > 0 then 808 | for _,cell in ipairs( warehouse.exits ) do 809 | if not sm.exists( warehouse.world ) then 810 | sm.world.loadWorld( warehouse.world ) 811 | end 812 | local name = params.name.." "..cell.x..","..cell.y 813 | sm.portal.addWorldPortalHook( warehouse.world, name, params.portal ) 814 | print( "Added portal hook '"..name.."' in world "..warehouse.world.id ) 815 | 816 | g_elevatorManager:sv_loadBForPlayersInElevator( params.portal, warehouse.world, cell.x, cell.y ) 817 | end 818 | else 819 | sm.log.error( "No exit hint found, this elevator is going nowhere!" ) 820 | end 821 | return 822 | else 823 | assert( false ) 824 | end 825 | else 826 | if params.name == "ELEVATOR_EXIT" then 827 | level = warehouse.maxLevels 828 | elseif params.name == "ELEVATOR_ENTRANCE" then 829 | level = 1 830 | else 831 | end 832 | end 833 | 834 | -- Create warehouse world 835 | local worldData = {} 836 | worldData.level = level 837 | worldData.warehouseIndex = warehouse.index 838 | worldData.maxLevels = warehouse.maxLevels 839 | local world = sm.world.createWorld( "$SURVIVAL_DATA/Scripts/game/worlds/WarehouseWorld.lua", "WarehouseWorld", worldData ) 840 | print( "Created WarehouseWorld "..world.id ) 841 | 842 | -- Use the same restrictions for the new floor as the other floors 843 | warehouse.worlds[#warehouse.worlds+1] = world 844 | if warehouse.restrictions then 845 | sm.event.sendToWorld( world, "server_updateRestrictions", warehouse.restrictions ) 846 | end 847 | -- Elevator portal hook 848 | local name 849 | if params.name == "ELEVATOR_UP" then 850 | name = "ELEVATOR_DOWN" 851 | elseif params.name == "ELEVATOR_DOWN" then 852 | name = "ELEVATOR_UP" 853 | else 854 | name = params.name 855 | end 856 | sm.portal.addWorldPortalHook( world, name, params.portal ) 857 | print( "Added portal hook '"..name.."' in world "..world.id ) 858 | 859 | g_elevatorManager:sv_loadBForPlayersInElevator( params.portal, world, 0, 0 ) 860 | end 861 | 862 | function SurvivalGame.sv_e_elevatorEvent( self, params ) 863 | print( "SurvivalGame.sv_e_elevatorEvent" ) 864 | print( params ) 865 | g_elevatorManager[params.fn]( g_elevatorManager, params ) 866 | end 867 | 868 | function SurvivalGame.sv_createNewPlayer( self, world, x, y, player ) 869 | local params = { player = player, x = x, y = y } 870 | sm.event.sendToWorld( self.sv.saved.overworld, "sv_spawnNewCharacter", params ) 871 | end 872 | 873 | function SurvivalGame.sv_recreatePlayerCharacter( self, world, x, y, player, params ) 874 | local yaw = math.atan2( params.dir.y, params.dir.x ) - math.pi/2 875 | local pitch = math.asin( params.dir.z ) 876 | local newCharacter = sm.character.createCharacter( player, self.sv.saved.overworld, params.pos, yaw, pitch ) 877 | player:setCharacter( newCharacter ) 878 | print( "Recreate character in new world" ) 879 | print( params ) 880 | end 881 | 882 | function SurvivalGame.sv_e_respawn( self, params ) 883 | if params.player.character and sm.exists( params.player.character ) then 884 | g_respawnManager:sv_requestRespawnCharacter( params.player ) 885 | else 886 | local spawnPoint = START_AREA_SPAWN_POINT 887 | if g_survivalDev then 888 | spawnPoint = SURVIVAL_DEV_SPAWN_POINT 889 | end 890 | if not sm.exists( self.saved.overworld ) then 891 | sm.world.loadWorld( self.saved.overworld ) 892 | end 893 | self.saved.overworld:loadCell( math.floor( spawnPoint.x/64 ), math.floor( spawnPoint.y/64 ), params.player, "sv_createNewPlayer" ) 894 | end 895 | end 896 | 897 | function SurvivalGame.sv_loadedRespawnCell( self, world, x, y, player ) 898 | g_respawnManager:sv_respawnCharacter( player, world ) 899 | end 900 | 901 | function SurvivalGame.sv_e_onSpawnPlayerCharacter( self, player ) 902 | if player.character and sm.exists( player.character ) then 903 | g_respawnManager:sv_onSpawnCharacter( player ) 904 | g_beaconManager:sv_onSpawnCharacter( player ) 905 | else 906 | sm.log.warning("SurvivalGame.sv_e_onSpawnPlayerCharacter for a character that doesn't exist") 907 | end 908 | end 909 | 910 | function SurvivalGame.sv_e_markBag( self, params ) 911 | if sm.exists( params.world ) then 912 | sm.event.sendToWorld( params.world, "sv_e_markBag", params ) 913 | else 914 | sm.log.warning("SurvivalGame.sv_e_markBag in a world that doesn't exist") 915 | end 916 | end 917 | 918 | function SurvivalGame.sv_e_unmarkBag( self, params ) 919 | if sm.exists( params.world ) then 920 | sm.event.sendToWorld( params.world, "sv_e_unmarkBag", params ) 921 | else 922 | sm.log.warning("SurvivalGame.sv_e_unmarkBag in a world that doesn't exist") 923 | end 924 | end 925 | 926 | -- Beacons 927 | function SurvivalGame.sv_e_createBeacon( self, params ) 928 | if sm.exists( params.beacon.world ) then 929 | sm.event.sendToWorld( params.beacon.world, "sv_e_createBeacon", params ) 930 | else 931 | sm.log.warning( "SurvivalGame.sv_e_createBeacon in a world that doesn't exist" ) 932 | end 933 | end 934 | 935 | function SurvivalGame.sv_e_destroyBeacon( self, params ) 936 | if sm.exists( params.beacon.world ) then 937 | sm.event.sendToWorld( params.beacon.world, "sv_e_destroyBeacon", params ) 938 | else 939 | sm.log.warning( "SurvivalGame.sv_e_destroyBeacon in a world that doesn't exist" ) 940 | end 941 | end 942 | 943 | function SurvivalGame.sv_e_unloadBeacon( self, params ) 944 | if sm.exists( params.beacon.world ) then 945 | sm.event.sendToWorld( params.beacon.world, "sv_e_unloadBeacon", params ) 946 | else 947 | sm.log.warning( "SurvivalGame.sv_e_unloadBeacon in a world that doesn't exist" ) 948 | end 949 | end --------------------------------------------------------------------------------