diff --git a/CommunityMapTool/CommunityMapTool.csproj b/CommunityMapTool/CommunityMapTool.csproj index 014d31f..f3ded33 100644 --- a/CommunityMapTool/CommunityMapTool.csproj +++ b/CommunityMapTool/CommunityMapTool.csproj @@ -46,6 +46,10 @@ lib\BezierCurves.dll False + + lib\DV.Common.dll + False + lib\DV.OriginShiftInfo.dll False @@ -54,6 +58,10 @@ lib\DV.RailTrack.dll False + + lib\DV.UserManagement.dll + False + lib\DV.Utils.dll False diff --git a/CommunityMapTool/Info.json b/CommunityMapTool/Info.json index cea93fe..f381987 100644 --- a/CommunityMapTool/Info.json +++ b/CommunityMapTool/Info.json @@ -2,7 +2,7 @@ "Id":"CommunityMapTool", "DisplayName":"Derail Valley Community Map Tool", "Author":"PyroNicampt", - "Version":"1.2.0", + "Version":"1.3.0", "ManagerVersion":"0.31.1.0", "EntryMethod":"CommunityMapTool.Main.Load" } \ No newline at end of file diff --git a/CommunityMapTool/Main.cs b/CommunityMapTool/Main.cs index f28899e..b3be55a 100644 --- a/CommunityMapTool/Main.cs +++ b/CommunityMapTool/Main.cs @@ -6,12 +6,16 @@ using UnityEngine; using UnityModManagerNet; using DV.LocoRestoration; using DV.OriginShift; +using DV.Shops; +using DV.Utils; +using DV.UserManagement; namespace CommunityMapTool { [EnableReloading] static class Main { private static string trackOutputPath = "map_dump.json"; private static string demonstratorOutputPath = "demo_dump.json"; + private static string shopOutputPath = "shop_dump.json"; private static string statusText = ""; static bool Load(UnityModManager.ModEntry modEntry) { modEntry.OnUpdate = OnUpdate; @@ -32,6 +36,7 @@ namespace CommunityMapTool { GUILayout.Label($"WorldMover offset: {OriginShift.currentMove}"); if(GUILayout.Button("Dump All Tracks")) DumpAllTracks(); if(GUILayout.Button("Dump Demonstrator Spawnpoints")) DemonstratorDump(); + if(GUILayout.Button("Dump Shop Inventories")) DumpShopItems(); if(GUILayout.Button("Copy Position To Clipboard")) ClipboardPlayerPosition(); if(statusText != "") GUILayout.Label(statusText); } @@ -101,29 +106,58 @@ namespace CommunityMapTool { File.WriteAllText(trackOutputPath, "[" + string.Join(",", records.ToArray()) + "\n]"); statusText = $"Dumped to {trackOutputPath}"; } + static void DumpShopItems() { + GlobalShopController shopController = UnityEngine.Object.FindObjectOfType(); + if(shopController == null) { + statusText = "Could not find GlobalShopController"; + return; + } + if(SingletonBehaviour.Instance.CurrentUser.CurrentSession.GameMode != "Career") { + statusText = "Cannot dump shop prices in sandbox"; + return; + } + List records = new List(); + foreach(ShopItemData shopItem in shopController.shopItemsData) { + string[] soldAtShops = new string[shopItem.soldOnlyAt.Count]; + for(int i = 0; i < soldAtShops.Length; i++) { + soldAtShops[i] = "\"" + shopItem.soldOnlyAt[i].name.Replace("[ItemShop] ","").Replace(" (Shop)","") + "\""; + } + records.Add(jsonKVPToString(new string[] { + "name", $"\"{shopItem.item.LocalizedName}\"", + "price", $"{shopItem.basePrice}", + "count", $"{shopItem.allowedToHaveAmount}", + "soldOnlyAt", soldAtShops.Length > 0 ? $"[\n\t\t{string.Join(",\n\t\t", soldAtShops)}\n\t]" : "[]" + })); + } + File.WriteAllText(shopOutputPath, "[" + string.Join(",", records.ToArray()) + "\n]"); + statusText = $"Dumped to {shopOutputPath}"; + } static void DemonstratorDump() { List records = new List(); foreach(LocoRestorationSpawnPoint spawnPoint in UnityEngine.Object.FindObjectsOfType()) { - StringBuilder sb = new StringBuilder(); - sb.Append("\n{"); - string[] jsonKVP = new[] { + records.Add(jsonKVPToString(new string[] { "name", $"\"{spawnPoint.name}\"", "type", $"\"demonstratorSpawn\"", "position", $"{{\"x\":{spawnPoint.transform.position.x - OriginShift.currentMove.x},\"y\":{spawnPoint.transform.position.y - OriginShift.currentMove.y},\"z\":{spawnPoint.transform.position.z - OriginShift.currentMove.z}}}" - }; - for(int i = 0; i < jsonKVP.Length; i++) { - if(i % 2 == 0) sb.Append($"\n\t\"{jsonKVP[i]}\":"); - else{ - sb.Append($"{jsonKVP[i]}"); - if(i != jsonKVP.Length - 1) sb.Append(','); - } - } - sb.Append("\n}"); - records.Add(sb.ToString()); + })); } File.WriteAllText(demonstratorOutputPath, "[" + string.Join(",", records.ToArray()) + "\n]"); statusText = $"Dumped to {demonstratorOutputPath}"; } + + static string jsonKVPToString(string[] jsonKVP) { + StringBuilder sb = new StringBuilder(); + sb.Append("\n{"); + for(int i = 0; i < jsonKVP.Length; i++) { + if(i % 2 == 0) sb.Append($"\n\t\"{jsonKVP[i]}\":"); + else { + sb.Append($"{jsonKVP[i]}"); + if(i != jsonKVP.Length - 1) sb.Append(','); + } + } + sb.Append("\n}"); + return sb.ToString(); + } } } diff --git a/CommunityMapTool/Properties/AssemblyInfo.cs b/CommunityMapTool/Properties/AssemblyInfo.cs index 536e912..fe94649 100644 --- a/CommunityMapTool/Properties/AssemblyInfo.cs +++ b/CommunityMapTool/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.0.0")] -[assembly: AssemblyFileVersion("1.1.0.0")] +[assembly: AssemblyVersion("1.3.0.0")] +[assembly: AssemblyFileVersion("1.3.0.0")] diff --git a/CommunityMapTool/build_guide.md b/CommunityMapTool/build_guide.md index ef2bbf7..373708e 100644 --- a/CommunityMapTool/build_guide.md +++ b/CommunityMapTool/build_guide.md @@ -3,8 +3,10 @@ Assuming Visual Studio Community: 1. Add the following to the `lib` folder from `[steam common dir]/Derail Valley/DerailValley_Data/Managed/UnityModManager`: - `Assembly-CSharp.dll` - `BezierCurves.dll` +- `DV.Common.dll` - `DV.OriginShiftInfo.dll` - `DV.RailTrack.dll` +- `DV.UserManagement.dll` - `DV.Utils.dll` - `UnityEngine.dll` - `UnityEngine.UI.dll` diff --git a/index.js b/index.js index 230c8c8..820b0f5 100644 --- a/index.js +++ b/index.js @@ -20,6 +20,7 @@ const zoomLevelDisplay = document.getElementById('zoomLevelDisplay'); let isNavigating = false; document.addEventListener('DOMContentLoaded', async () => { + await loadShopData('shop_items.json'); await loadTrackData('trackdata_dv.json'); await loadPoiData('poi_dv.json'); MapData.sortMarkers(); @@ -246,6 +247,14 @@ async function loadPoiData(file){ } } +async function loadShopData(file) { + let shopData = await (await fetch(new Request(file))).json(); + for(let item of shopData){ + MapData.addShopItem(item); + } + MapData.sortShops(); +} + let railTrack = {}; let curve = {}; diff --git a/js/mapdata.js b/js/mapdata.js index f58f27c..8452f58 100644 --- a/js/mapdata.js +++ b/js/mapdata.js @@ -15,6 +15,10 @@ let uniqueTrackNames = {}; export let testPoint = {x:0,y:0}; +export let Shops = { + Common:[] +} + export let matrix = { initialize: () => { matrix.minX = Infinity; @@ -112,6 +116,14 @@ export function sortMarkers(){ }); } +export function sortShops(){ + for(let shop in Shops){ + Shops[shop].sort((a,b) => { + return a.name.localeCompare(b.name); + }); + } +} + export function filterToTrack(trackName, trackNum = 0){ if(typeof(trackName) == 'string'){ for(let railTrack of railTracks){ @@ -247,7 +259,16 @@ export function addPoi(poiData, level = 0){ newPoi.tooltip = `

${poiData.name}

`; break; case 'shop': - newPoi.tooltip = `

Shop

${poiData.stock ? '
'+poiData.stock.sort().join('\n') : ''}`; + newPoi.tooltip = '

Shop


'; + if(poiData.shopId){ + for(let item of Shops[poiData.shopId]){ + newPoi.tooltip += `
${item.name}${item.count > 1 ? ` (x${item.count})` : ''} - $${item.price}
`; + } + for(let item of Shops.Common){ + newPoi.tooltip += `
${item.name}${item.count > 1 ? ` (x${item.count})` : ''} - $${item.price}
`; + } + } + newPoi.tooltip += '
'; break; case 'water': newPoi.tooltip = '

Water Tower

'; @@ -284,6 +305,35 @@ export function addPoi(poiData, level = 0){ } } +export function addShopItem(itemData){ + let newItem = { + name: itemData.name, + price: itemData.price, + count: itemData.count, + }; + if(itemData.soldOnlyAt.length == 0){ + for(let item of Shops.Common){ + if(item.name == newItem.name && item.price == newItem.price){ + item.count += newItem.count; + return; + } + } + Shops.Common.push(newItem); + }else{ + for(let shop of itemData.soldOnlyAt){ + if(!Shops[shop]) Shops[shop] = []; + + for(let item of Shops[shop]){ + if(item.name == newItem.name && item.price == newItem.price){ + item.count += newItem.count; + return; + } + } + Shops[shop].push(newItem); + } + } +} + export function generateTrackSignage(){ let yardMarkers = {}; for(const railTrack of railTracks){ diff --git a/poi_dv.json b/poi_dv.json index b9f0d4a..e676c35 100644 --- a/poi_dv.json +++ b/poi_dv.json @@ -136,39 +136,7 @@ }, { "type":"shop", - "stock":[ - "Boombox", - "Red Beacon", - "Plastic Crate", - "Cassette A7", - "Cassette P6", - "Cassette P9", - "Red Light Bar", - "File Box", - "Purple Flag Marker", - "Reginald's Garage Key", - "Cassette P10", - "Cassette P5", - "Cassette P7", - "Handheld Game Console", - "Wooden Crate", - "Cassette A1", - "Cassette P2", - "Yellow Flag Marker", - "Green Flag Marker", - "Orange Flag Marker", - "Cyan Flag Marker", - "Cassette P4", - "Green Light Bar", - "Cassette P1", - "Blue Flag Marker", - "Cassette P8", - "White Flag Marker", - "Red Flag Marker", - "Cassette A2", - "Blue Beacon", - "Cassette P3" - ], + "shopId":"CitySouthWest", "position":{"x":1911.48,"y":122.26,"z":5788.65} } ] @@ -198,13 +166,7 @@ }, { "type":"shop", - "stock":[ - "Cassette A12", - "Cassette A15", - "Cassette A6", - "Cassette A3", - "Old Bob's Garage Key" - ], + "shopId":"FoodFactory", "position":{"x":9528.669,"y":119.3432,"z":13419.99} } ] @@ -289,30 +251,7 @@ }, { "type":"shop", - "stock":[ - "Shelf", - "Rotary Controller", - "Analog Controller", - "Cassette A16", - "Crimping Tool", - "Blue Light Bar", - "Brake Cylinder LED Bar", - "Electric Hand Drill", - "Digital Speedometer", - "Golden Shovel", - "Infrared Thermometer", - "Button Controller", - "Filler Gun", - "Sun Visor", - "Cassette A10", - "Expert Shovel", - "Digital Clock", - "Alternating Controller", - "White Light Bar", - "Soldering Gun", - "Clinometer", - "Cassette A8" - ], + "shopId":"GoodsFactory", "position":{"x":13035.07,"y":140.1661,"z":11158.79} } ] @@ -351,20 +290,7 @@ }, { "type":"shop", - "stock":[ - "Plastic Crate", - "Steve's Garage Key", - "Wooden Crate", - "Red Beacon", - "Steam Locomotive Checklist", - "File Box", - "Cassette A11", - "Purple Light Bar", - "Cassette A4", - "Pocketwatch", - "Blue Beacon", - "Cyan Light Bar" - ], + "shopId":"Harbor", "position":{"x":13423.26,"y":113.1099,"z":3611.852} } ] @@ -475,30 +401,7 @@ }, { "type":"shop", - "stock":[ - "Amber Beacon", - "Headlight", - "Button Controller", - "Automatic Train Stop", - "Analog Controller", - "Cassette A13", - "Rotary Controller", - "Locomotive Remote", - "Alternating Controller", - "Olaf's Garage Key", - "Demonstrator Paint Can", - "Yellow Light Bar", - "Wireless MU Controller", - "Anti-Wheelslip Computer", - "Overheat Protection", - "Cassette A14", - "Orange Light Bar", - "Cassette A9", - "Distance Tracker", - "Amp Limiter", - "Switch Setter", - "Cassette A5" - ], + "shopId":"MachineFactory", "position":{"x":2236.745,"y":159.266,"z":10834.23} } ] diff --git a/shop_items.json b/shop_items.json new file mode 100644 index 0000000..c149c42 --- /dev/null +++ b/shop_items.json @@ -0,0 +1,1019 @@ +[ +{ + "name":"Shovel", + "price":750, + "count":4, + "soldOnlyAt":[] +}, +{ + "name":"Lighter", + "price":350, + "count":12, + "soldOnlyAt":[] +}, +{ + "name":"Locomotive Remote Controller", + "price":35000, + "count":1, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Old Bob's Garage Key", + "price":17000, + "count":1, + "soldOnlyAt":[ + "FoodFactory" + ] +}, +{ + "name":"Pocketwatch", + "price":3500, + "count":2, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Golden shovel", + "price":7000, + "count":1, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Reginald's Garage Key", + "price":4000, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Expert shovel", + "price":2500, + "count":1, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Boombox", + "price":5000, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette A1", + "price":300, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette A2", + "price":300, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette A3", + "price":300, + "count":1, + "soldOnlyAt":[ + "FoodFactory" + ] +}, +{ + "name":"Cassette A4", + "price":300, + "count":1, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Cassette A5", + "price":300, + "count":1, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Cassette A6", + "price":300, + "count":1, + "soldOnlyAt":[ + "FoodFactory" + ] +}, +{ + "name":"Cassette A7", + "price":300, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette A8", + "price":300, + "count":1, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Cassette A9", + "price":300, + "count":1, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Cassette A10", + "price":300, + "count":1, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Cassette A11", + "price":300, + "count":1, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Cassette A12", + "price":300, + "count":1, + "soldOnlyAt":[ + "FoodFactory" + ] +}, +{ + "name":"Cassette A13", + "price":300, + "count":1, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Cassette A14", + "price":300, + "count":1, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Cassette A15", + "price":300, + "count":1, + "soldOnlyAt":[ + "FoodFactory" + ] +}, +{ + "name":"Cassette A16", + "price":300, + "count":1, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Cassette P1", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P2", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P3", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P4", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P5", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P6", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P7", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P8", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P9", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cassette P10", + "price":100, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Lantern", + "price":1500, + "count":8, + "soldOnlyAt":[] +}, +{ + "name":"Flashlight", + "price":7000, + "count":4, + "soldOnlyAt":[] +}, +{ + "name":"EOT Lantern", + "price":750, + "count":3, + "soldOnlyAt":[] +}, +{ + "name":"Steve's Garage Key", + "price":7000, + "count":1, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Handheld Game Console", + "price":1800, + "count":1, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Oiler", + "price":400, + "count":3, + "soldOnlyAt":[] +}, +{ + "name":"Electric Hand Drill", + "price":9000, + "count":3, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Soldering Gun", + "price":5000, + "count":3, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Crimping Tool", + "price":3000, + "count":3, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Filler Gun", + "price":600, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Hammer", + "price":300, + "count":10, + "soldOnlyAt":[] +}, +{ + "name":"Duct Tape", + "price":180, + "count":10, + "soldOnlyAt":[] +}, +{ + "name":"Soldering Wire Reel", + "price":200, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Distance Tracker", + "price":12000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Anti-Wheelslip Computer", + "price":28000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Automatic Train Stop", + "price":4000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Amp Limiter", + "price":18000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Wireless MU Controller", + "price":24000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Clinometer", + "price":7500, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Infrared Thermometer", + "price":3500, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Digital Speedometer", + "price":5000, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Digital Clock", + "price":3500, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Shelf", + "price":400, + "count":20, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Steam Locomotive Checklist", + "price":400, + "count":10, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Olaf's Garage Key", + "price":18000, + "count":1, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Button Controller", + "price":400, + "count":20, + "soldOnlyAt":[ + "MachineFactory", + "GoodsFactory" + ] +}, +{ + "name":"Rotary Controller", + "price":400, + "count":20, + "soldOnlyAt":[ + "MachineFactory", + "GoodsFactory" + ] +}, +{ + "name":"Analog Controller", + "price":400, + "count":20, + "soldOnlyAt":[ + "GoodsFactory", + "MachineFactory" + ] +}, +{ + "name":"Mount Slanted Medium", + "price":100, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Upright Small", + "price":100, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Upright Small - Long Base", + "price":150, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Upright Small Wide", + "price":200, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Strip Medium", + "price":100, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Strip Small", + "price":75, + "count":30, + "soldOnlyAt":[] +}, +{ + "name":"Mount Plate Medium", + "price":100, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Strip Long - Small Base", + "price":300, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Strip Long", + "price":250, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Swivel Light", + "price":5000, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Headlight", + "price":4000, + "count":30, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Brake Cylinder LED Bar", + "price":6000, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Hanger", + "price":400, + "count":10, + "soldOnlyAt":[] +}, +{ + "name":"Sticky Tape", + "price":300, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Sun Visor", + "price":1900, + "count":20, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Blue Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Cyan Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Green Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Orange Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Purple Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Red Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"White Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Yellow Flag Marker", + "price":300, + "count":6, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Blue Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Cyan Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Green Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Orange Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Purple Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Red Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"White Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "GoodsFactory" + ] +}, +{ + "name":"Yellow Light Bar", + "price":3000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"DVRT Paint Can", + "price":15000, + "count":10, + "soldOnlyAt":[] +}, +{ + "name":"Demonstrator Paint Can", + "price":30000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Sand Can", + "price":200, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Wooden Crate", + "price":70, + "count":10, + "soldOnlyAt":[ + "Harbor", + "CitySouthWest" + ] +}, +{ + "name":"Plastic Crate", + "price":100, + "count":10, + "soldOnlyAt":[ + "Harbor", + "CitySouthWest" + ] +}, +{ + "name":"File Box", + "price":50, + "count":10, + "soldOnlyAt":[ + "Harbor", + "CitySouthWest" + ] +}, +{ + "name":"Amber Beacon", + "price":2000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Red Beacon", + "price":2500, + "count":10, + "soldOnlyAt":[ + "Harbor", + "CitySouthWest" + ] +}, +{ + "name":"Blue Beacon", + "price":2500, + "count":10, + "soldOnlyAt":[ + "Harbor", + "CitySouthWest" + ] +}, +{ + "name":"Mount Upright Large", + "price":250, + "count":20, + "soldOnlyAt":[] +}, +{ + "name":"Mount Plate Large", + "price":250, + "count":60, + "soldOnlyAt":[] +}, +{ + "name":"Mount Stand Large", + "price":1000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Overheating Protection", + "price":20000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Switch Setter", + "price":3500, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Alternating Controller", + "price":650, + "count":20, + "soldOnlyAt":[ + "MachineFactory", + "GoodsFactory" + ] +}, +{ + "name":"Briefcase", + "price":3000, + "count":10, + "soldOnlyAt":[ + "CitySouthWest", + "Harbor" + ] +}, +{ + "name":"Crate", + "price":7500, + "count":10, + "soldOnlyAt":[ + "FoodFactory" + ] +}, +{ + "name":"Folder", + "price":50, + "count":10, + "soldOnlyAt":[] +}, +{ + "name":"Folder", + "price":100, + "count":5, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Folder", + "price":100, + "count":5, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Folder", + "price":100, + "count":5, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Registrator", + "price":300, + "count":10, + "soldOnlyAt":[ + "CitySouthWest" + ] +}, +{ + "name":"Toolbox", + "price":3500, + "count":10, + "soldOnlyAt":[ + "MachineFactory", + "GoodsFactory" + ] +}, +{ + "name":"Taillight", + "price":1000, + "count":30, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Defect Detector", + "price":8000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Shovel Mount", + "price":500, + "count":20, + "soldOnlyAt":[ + "GoodsFactory", + "FoodFactory" + ] +}, +{ + "name":"High-tech Headlight Right", + "price":12000, + "count":20, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"High-tech Headlight Left", + "price":12000, + "count":20, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"High-tech Taillight Right", + "price":4000, + "count":20, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"High-tech Taillight Left", + "price":4000, + "count":20, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Remote Signal Booster", + "price":18000, + "count":2, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Battery Charger", + "price":15000, + "count":4, + "soldOnlyAt":[ + "MachineFactory", + "GoodsFactory" + ] +}, +{ + "name":"Nameplate", + "price":6000, + "count":20, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Brake Checklist", + "price":400, + "count":10, + "soldOnlyAt":[ + "Harbor" + ] +}, +{ + "name":"Proximity Sensor", + "price":8500, + "count":20, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Proximity Reader", + "price":12000, + "count":10, + "soldOnlyAt":[ + "MachineFactory" + ] +}, +{ + "name":"Label Maker", + "price":6000, + "count":3, + "soldOnlyAt":[ + "FoodFactory" + ] +}, +{ + "name":"Universal Control Stand", + "price":30000, + "count":4, + "soldOnlyAt":[ + "MachineFactory" + ] +} +] \ No newline at end of file diff --git a/style.css b/style.css index 86d1f98..d765e83 100644 --- a/style.css +++ b/style.css @@ -32,6 +32,15 @@ a:visited{ color: #e79830; } +.quiet{ + opacity: 0.7; +} + +.smol{ + font-size: 11px; + color: #fff; +} + .panel{ border: 2px solid #b3b3b396; background: linear-gradient(120deg, #2c3f58, #191e2e);